// Safe color for later use.
m_nBackgroundColor = Color(ColorTransparency, nColor);
// Repaint control
impl_paint ( 0, 0, impl_getGraphicsPeer() );
}
// XProgressBar
void SAL_CALL ProgressBar::setValue ( sal_Int32 nValue )
{ // This method is defined for follow things: // 1) Values >= _nMinRange // 2) Values <= _nMaxRange
// Ready for multithreading
MutexGuard aGuard (m_aMutex);
// save impossible cases // This method is only defined for valid values
DBG_ASSERT ( (( nValue >= m_nMinRange ) && ( nValue <= m_nMaxRange )), "ProgressBar::setValue()\nNot valid value.\n" );
// If new value not valid ... do nothing in release version! if (
( nValue >= m_nMinRange ) &&
( nValue <= m_nMaxRange )
)
{ // New value is ok => save this
m_nValue = nValue;
void SAL_CALL ProgressBar::setRange ( sal_Int32 nMin, sal_Int32 nMax )
{ // This method is defined for follow things: // 1) All values of sal_Int32 // 2) Min < Max // 3) Min > Max
// save impossible cases // This method is only defined for valid values // If you ignore this, the release version will produce an error "division by zero" in "ProgressBar::setValue()"!
DBG_ASSERT ( ( nMin != nMax ) , "ProgressBar::setRange()\nValues for MIN and MAX are the same. This is not allowed!\n" );
// Ready for multithreading
MutexGuard aGuard (m_aMutex);
// control the values for min and max if ( nMin < nMax )
{ // Take correct Min and Max
m_nMinRange = nMin;
m_nMaxRange = nMax;
} else
{ // Change Min and Max automatically
m_nMinRange = nMax;
m_nMaxRange = nMin;
}
// assure that m_nValue is within the range if (m_nMinRange >= m_nValue || m_nValue >= m_nMaxRange)
m_nValue = m_nMinRange;
impl_recalcRange ();
// Do not repaint the control at this place!!! // An old "m_nValue" is set and can not be correct for this new range. // Next call of "ProgressBar::setValue()" do this.
}
void SAL_CALL ProgressBar::setPosSize (
sal_Int32 nX,
sal_Int32 nY,
sal_Int32 nWidth,
sal_Int32 nHeight,
sal_Int16 nFlags
)
{ // Take old size BEFORE you set the new values at baseclass! // You will control changes. At the other way, the values are the same!
Rectangle aBasePosSize = getPosSize ();
BaseControl::setPosSize (nX, nY, nWidth, nHeight, nFlags);
// Do only, if size has changed. if (
( nWidth != aBasePosSize.Width ) ||
( nHeight != aBasePosSize.Height )
)
{
impl_recalcRange ( );
impl_paint ( 0, 0, impl_getGraphicsPeer () );
}
}
// XControl
sal_Bool SAL_CALL ProgressBar::setModel( const Reference< XControlModel >& /*xModel*/ )
{ // A model is not possible for this control. returnfalse;
}
// XControl
Reference< XControlModel > SAL_CALL ProgressBar::getModel()
{ // A model is not possible for this control. return Reference< XControlModel >();
}
// This paint method is not buffered !! // Every request paint the completely control. ( but only, if peer exist ) if ( !rGraphics.is () ) return;
MutexGuard aGuard (m_aMutex);
// Clear background // (same color for line and fill)
rGraphics->setFillColor ( sal_Int32(m_nBackgroundColor) );
rGraphics->setLineColor ( sal_Int32(m_nBackgroundColor) );
rGraphics->drawRect ( nX, nY, impl_getWidth(), impl_getHeight() );
// same color for line and fill for blocks
rGraphics->setFillColor ( sal_Int32(m_nForegroundColor) );
rGraphics->setLineColor ( sal_Int32(m_nForegroundColor) );
sal_Int32 nBlockStart = 0; // = left site of new block
sal_Int32 nBlockCount = m_nBlockValue!=0.00 ? static_cast<sal_Int32>((m_nValue-m_nMinRange)/m_nBlockValue) : 0; // = number of next block
// Draw horizontal progressbar // decision in "recalcRange()" if (m_bHorizontal)
{ // Step to left side of window
nBlockStart = nX;
for ( sal_Int32 i=1; i<=nBlockCount; ++i )
{ // step free field
nBlockStart += PROGRESSBAR_FREESPACE; // paint block
rGraphics->drawRect (nBlockStart, nY+PROGRESSBAR_FREESPACE, m_aBlockSize.Width, m_aBlockSize.Height); // step next free field
nBlockStart += m_aBlockSize.Width;
}
} // draw vertical progressbar // decision in "recalcRange()" else
{ // step to bottom side of window
nBlockStart = nY+impl_getHeight();
nBlockStart -= m_aBlockSize.Height;
for ( sal_Int32 i=1; i<=nBlockCount; ++i )
{ // step free field
nBlockStart -= PROGRESSBAR_FREESPACE; // paint block
rGraphics->drawRect (nX+PROGRESSBAR_FREESPACE, nBlockStart, m_aBlockSize.Width, m_aBlockSize.Height); // step next free field
nBlockStart -= m_aBlockSize.Height;
}
}
// Paint shadow border around the progressbar
rGraphics->setLineColor ( PROGRESSBAR_LINECOLOR_SHADOW );
rGraphics->drawLine ( nX, nY, impl_getWidth(), nY );
rGraphics->drawLine ( nX, nY, nX , impl_getHeight() );
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.