summaryrefslogtreecommitdiff
path: root/svtools
diff options
context:
space:
mode:
authorMatteo Casalin <matteo.casalin@gmx.com>2012-02-26 22:47:10 +0100
committerMatteo Casalin <matteo.casalin@gmx.com>2012-03-03 09:49:35 +0100
commit0809906906d7941ceb9ae170a41c482fdd1e6bfa (patch)
tree6f271cb24b74ad074655c30c1818e87da51ba69a /svtools
parent8d4ab7fd776f8709dab9786951a560c9c59c3ba7 (diff)
ValueSet: reduce memory footprint by dynamically evaluating rectangles
Diffstat (limited to 'svtools')
-rw-r--r--svtools/inc/svtools/valueset.hxx8
-rw-r--r--svtools/source/control/valueacc.cxx5
-rw-r--r--svtools/source/control/valueimp.hxx6
-rw-r--r--svtools/source/control/valueset.cxx253
4 files changed, 168 insertions, 104 deletions
diff --git a/svtools/inc/svtools/valueset.hxx b/svtools/inc/svtools/valueset.hxx
index 7e0b7db0f6d2..22271da5369b 100644
--- a/svtools/inc/svtools/valueset.hxx
+++ b/svtools/inc/svtools/valueset.hxx
@@ -217,6 +217,10 @@ private:
ValueItemList mItemList;
ValueSetItem* mpNoneItem;
ScrollBar* mpScrBar;
+ Rectangle maNoneItemRect;
+ Rectangle maItemListRect;
+ long mnItemWidth;
+ long mnItemHeight;
long mnTextOffset;
long mnVisLines;
long mnLines;
@@ -241,6 +245,7 @@ private:
bool mbScroll : 1;
bool mbFullMode : 1;
bool mbIsTransientChildrenDisabled : 1;
+ bool mbHasVisibleItems : 1;
Color maColor;
Link maDoubleClickHdl;
Link maSelectHdl;
@@ -255,7 +260,7 @@ private:
SVT_DLLPRIVATE void ImplInitSettings( bool bFont, bool bForeground, bool bBackground );
SVT_DLLPRIVATE void ImplInitScrollBar();
SVT_DLLPRIVATE void ImplDeleteItems();
- SVT_DLLPRIVATE void ImplFormatItem( ValueSetItem* pItem );
+ SVT_DLLPRIVATE void ImplFormatItem( ValueSetItem* pItem, Rectangle aRect );
SVT_DLLPRIVATE void ImplDrawItemText( const XubString& rStr );
SVT_DLLPRIVATE void ImplDrawSelect( sal_uInt16 nItemId, const bool bFocus, const bool bDrawSel );
SVT_DLLPRIVATE void ImplDrawSelect();
@@ -270,6 +275,7 @@ private:
SVT_DLLPRIVATE sal_uInt16 ImplGetVisibleItemCount() const;
SVT_DLLPRIVATE ValueSetItem* ImplGetVisibleItem( sal_uInt16 nVisiblePos );
SVT_DLLPRIVATE void ImplInsertItem( ValueSetItem *const pItem, const size_t nPos );
+ SVT_DLLPRIVATE Rectangle ImplGetItemRect( size_t nPos ) const;
SVT_DLLPRIVATE void ImplFireAccessibleEvent( short nEventId, const ::com::sun::star::uno::Any& rOldValue, const ::com::sun::star::uno::Any& rNewValue );
SVT_DLLPRIVATE bool ImplHasAccessibleListeners();
SVT_DLLPRIVATE void ImplTracking( const Point& rPos, bool bRepeat );
diff --git a/svtools/source/control/valueacc.cxx b/svtools/source/control/valueacc.cxx
index 7c73a8ce043e..22680c4234e7 100644
--- a/svtools/source/control/valueacc.cxx
+++ b/svtools/source/control/valueacc.cxx
@@ -1108,7 +1108,7 @@ awt::Rectangle SAL_CALL ValueItemAcc::getBounds()
if( mpParent )
{
- Rectangle aRect( mpParent->maRect );
+ Rectangle aRect( mpParent->mrParent.GetItemRect(mpParent->mnId) );
Point aOrigin;
Rectangle aParentRect( aOrigin, mpParent->mrParent.GetOutputSizePixel() );
@@ -1147,7 +1147,8 @@ awt::Point SAL_CALL ValueItemAcc::getLocationOnScreen()
if( mpParent )
{
- const Point aScreenPos( mpParent->mrParent.OutputToAbsoluteScreenPixel( mpParent->maRect.TopLeft() ) );
+ const Point aPos = mpParent->mrParent.GetItemRect(mpParent->mnId).TopLeft();
+ const Point aScreenPos( mpParent->mrParent.OutputToAbsoluteScreenPixel( aPos ) );
aRet.X = aScreenPos.X();
aRet.Y = aScreenPos.Y();
diff --git a/svtools/source/control/valueimp.hxx b/svtools/source/control/valueimp.hxx
index f7cd13ff050a..0dfd1f076d9b 100644
--- a/svtools/source/control/valueimp.hxx
+++ b/svtools/source/control/valueimp.hxx
@@ -70,13 +70,13 @@ class ValueSet;
struct ValueSetItem
{
ValueSet& mrParent;
- sal_uInt16 mnId;
- ValueSetItemType meType;
+ sal_uInt16 mnId;
+ sal_uInt8 meType;
+ bool mbVisible;
Image maImage;
Color maColor;
XubString maText;
void* mpData;
- Rectangle maRect;
::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible >* mpxAcc;
ValueSetItem( ValueSet& rParent );
diff --git a/svtools/source/control/valueset.cxx b/svtools/source/control/valueset.cxx
index 7f7721581d68..9db8f934f03c 100644
--- a/svtools/source/control/valueset.cxx
+++ b/svtools/source/control/valueset.cxx
@@ -66,6 +66,8 @@ void ValueSet::ImplInit()
{
mpNoneItem = NULL;
mpScrBar = NULL;
+ mnItemWidth = 0;
+ mnItemHeight = 0;
mnTextOffset = 0;
mnVisLines = 0;
mnLines = 0;
@@ -89,6 +91,7 @@ void ValueSet::ImplInit()
mbDoubleSel = false;
mbScroll = false;
mbFullMode = true;
+ mbHasVisibleItems = false;
// #106446#, #106601# force mirroring of virtual device
maVirDev.EnableRTL( GetParent()->IsRTLEnabled() );
@@ -137,10 +140,12 @@ ValueSet::~ValueSet()
void ValueSet::ImplDeleteItems()
{
- for ( size_t i = 0, n = mItemList.size(); i < n; ++i )
+ const size_t n = mItemList.size();
+
+ for ( size_t i = 0; i < n; ++i )
{
ValueSetItem *const pItem = mItemList[i];
- if( !pItem->maRect.IsEmpty() && ImplHasAccessibleListeners() )
+ if ( pItem->mbVisible && ImplHasAccessibleListeners() )
{
::com::sun::star::uno::Any aOldAny, aNewAny;
@@ -217,9 +222,8 @@ void ValueSet::ImplInitScrollBar()
// -----------------------------------------------------------------------
-void ValueSet::ImplFormatItem( ValueSetItem* pItem )
+void ValueSet::ImplFormatItem( ValueSetItem* pItem, Rectangle aRect )
{
- Rectangle aRect = pItem->maRect;
WinBits nStyle = GetStyle();
if ( nStyle & WB_ITEMBORDER )
{
@@ -457,28 +461,26 @@ void ValueSet::Format()
}
// calculate item size
- long nColSpace = (mnCols-1)*mnSpacing;
- long nLineSpace = ((mnVisLines-1)*mnSpacing)+nNoneSpace;
- long nItemWidth;
- long nItemHeight;
+ const long nColSpace = (mnCols-1)*mnSpacing;
+ const long nLineSpace = ((mnVisLines-1)*mnSpacing)+nNoneSpace;
if ( mnUserItemWidth && !mnUserCols )
{
- nItemWidth = mnUserItemWidth;
- if ( nItemWidth > aWinSize.Width()-nScrBarWidth-nColSpace )
- nItemWidth = aWinSize.Width()-nScrBarWidth-nColSpace;
+ mnItemWidth = mnUserItemWidth;
+ if ( mnItemWidth > aWinSize.Width()-nScrBarWidth-nColSpace )
+ mnItemWidth = aWinSize.Width()-nScrBarWidth-nColSpace;
}
else
- nItemWidth = (aWinSize.Width()-nScrBarWidth-nColSpace) / mnCols;
+ mnItemWidth = (aWinSize.Width()-nScrBarWidth-nColSpace) / mnCols;
if ( mnUserItemHeight && !mnUserVisLines )
{
- nItemHeight = mnUserItemHeight;
- if ( nItemHeight > nCalcHeight-nNoneSpace )
- nItemHeight = nCalcHeight-nNoneSpace;
+ mnItemHeight = mnUserItemHeight;
+ if ( mnItemHeight > nCalcHeight-nNoneSpace )
+ mnItemHeight = nCalcHeight-nNoneSpace;
}
else
{
nCalcHeight -= nLineSpace;
- nItemHeight = nCalcHeight / mnVisLines;
+ mnItemHeight = nCalcHeight / mnVisLines;
}
// Init VirDev
@@ -487,23 +489,24 @@ void ValueSet::Format()
maVirDev.SetOutputSizePixel( aWinSize, sal_True );
// nothing is changed in case of too small items
- long nMinHeight = 2;
- if ( nStyle & WB_ITEMBORDER )
- nMinHeight = 4;
- if ( (nItemWidth <= 0) || (nItemHeight <= nMinHeight) || !nItemCount )
+ if ( (mnItemWidth <= 0) ||
+ (mnItemHeight <= (( nStyle & WB_ITEMBORDER ) ? 4 : 2)) ||
+ !nItemCount )
{
+ mbHasVisibleItems = false;
+
if ( nStyle & WB_NONEFIELD )
{
if ( mpNoneItem )
{
- mpNoneItem->maRect.SetEmpty();
+ mpNoneItem->mbVisible = false;
mpNoneItem->maText = GetText();
}
}
for ( size_t i = 0; i < nItemCount; i++ )
{
- mItemList[i]->maRect.SetEmpty();
+ mItemList[i]->mbVisible = false;
}
if ( mpScrBar )
@@ -511,6 +514,8 @@ void ValueSet::Format()
}
else
{
+ mbHasVisibleItems = true;
+
// determine Frame-Style
if ( nStyle & WB_DOUBLEBORDER )
mnFrameStyle = FRAME_DRAW_DOUBLEIN;
@@ -532,7 +537,7 @@ void ValueSet::Format()
// draw the selection with double width if the items are bigger
if ( (nStyle & WB_DOUBLEBORDER) &&
- ((nItemWidth >= 25) && (nItemHeight >= 20)) )
+ ((mnItemWidth >= 25) && (mnItemHeight >= 20)) )
mbDoubleSel = true;
else
mbDoubleSel = false;
@@ -542,8 +547,8 @@ void ValueSet::Format()
long nStartY;
if ( mbFullMode )
{
- long nAllItemWidth = (nItemWidth*mnCols)+nColSpace;
- long nAllItemHeight = (nItemHeight*mnVisLines)+nNoneHeight+nLineSpace;
+ long nAllItemWidth = (mnItemWidth*mnCols)+nColSpace;
+ long nAllItemHeight = (mnItemHeight*mnVisLines)+nNoneHeight+nLineSpace;
nStartX = (aWinSize.Width()-nScrBarWidth-nAllItemWidth)/2;
nStartY = (aWinSize.Height()-nAllItemHeight)/2;
}
@@ -566,12 +571,13 @@ void ValueSet::Format()
mpNoneItem->mnId = 0;
mpNoneItem->meType = VALUESETITEM_NONE;
- mpNoneItem->maRect.Left() = x;
- mpNoneItem->maRect.Top() = y;
- mpNoneItem->maRect.Right() = mpNoneItem->maRect.Left()+aWinSize.Width()-x-1;
- mpNoneItem->maRect.Bottom() = y+nNoneHeight-1;
+ mpNoneItem->mbVisible = true;
+ maNoneItemRect.Left() = x;
+ maNoneItemRect.Top() = y;
+ maNoneItemRect.Right() = maNoneItemRect.Left()+aWinSize.Width()-x-1;
+ maNoneItemRect.Bottom() = y+nNoneHeight-1;
- ImplFormatItem( mpNoneItem );
+ ImplFormatItem( mpNoneItem, maNoneItemRect );
y += nNoneHeight+nNoneSpace;
}
@@ -580,13 +586,19 @@ void ValueSet::Format()
sal_uLong nFirstItem = mnFirstLine * mnCols;
sal_uLong nLastItem = nFirstItem + (mnVisLines * mnCols);
+ maItemListRect.Left() = x;
+ maItemListRect.Top() = y;
+ maItemListRect.Right() = x + mnCols*(mnItemWidth+mnSpacing) - mnSpacing - 1;
+ maItemListRect.Bottom() = y + mnVisLines*(mnItemHeight+mnSpacing) - mnSpacing - 1;
+
if ( !mbFullMode )
{
// If want also draw parts of items in the last line,
// then we add one more line if parts of these line are
// visible
- if ( y+(mnVisLines*(nItemHeight+mnSpacing)) < aWinSize.Height() )
+ if ( y+(mnVisLines*(mnItemHeight+mnSpacing)) < aWinSize.Height() )
nLastItem += mnCols;
+ maItemListRect.Bottom() = aWinSize.Height() - y;
}
for ( size_t i = 0; i < nItemCount; i++ )
{
@@ -594,14 +606,7 @@ void ValueSet::Format()
if ( (i >= nFirstItem) && (i < nLastItem) )
{
- const bool bWasEmpty = pItem->maRect.IsEmpty();
-
- pItem->maRect.Left() = x;
- pItem->maRect.Top() = y;
- pItem->maRect.Right() = pItem->maRect.Left()+nItemWidth-1;
- pItem->maRect.Bottom() = pItem->maRect.Top()+nItemHeight-1;
-
- if( bWasEmpty && ImplHasAccessibleListeners() )
+ if( !pItem->mbVisible && ImplHasAccessibleListeners() )
{
::com::sun::star::uno::Any aOldAny, aNewAny;
@@ -609,19 +614,20 @@ void ValueSet::Format()
ImplFireAccessibleEvent( ::com::sun::star::accessibility::AccessibleEventId::CHILD, aOldAny, aNewAny );
}
- ImplFormatItem( pItem );
+ pItem->mbVisible = true;
+ ImplFormatItem( pItem, Rectangle( Point(x,y), Size(mnItemWidth, mnItemHeight) ) );
if ( !((i+1) % mnCols) )
{
x = nStartX;
- y += nItemHeight+mnSpacing;
+ y += mnItemHeight+mnSpacing;
}
else
- x += nItemWidth+mnSpacing;
+ x += mnItemWidth+mnSpacing;
}
else
{
- if( !pItem->maRect.IsEmpty() && ImplHasAccessibleListeners() )
+ if( pItem->mbVisible && ImplHasAccessibleListeners() )
{
::com::sun::star::uno::Any aOldAny, aNewAny;
@@ -629,7 +635,7 @@ void ValueSet::Format()
ImplFireAccessibleEvent( ::com::sun::star::accessibility::AccessibleEventId::CHILD, aOldAny, aNewAny );
}
- pItem->maRect.SetEmpty();
+ pItem->mbVisible = false;
}
}
@@ -642,7 +648,7 @@ void ValueSet::Format()
if ( nStyle & WB_NONEFIELD )
{
aPos.Y() = nStartY+nNoneHeight+1;
- aSize.Height() = ((nItemHeight+mnSpacing)*mnVisLines)-2-mnSpacing;
+ aSize.Height() = ((mnItemHeight+mnSpacing)*mnVisLines)-2-mnSpacing;
}
mpScrBar->SetPosSizePixel( aPos, aSize );
mpScrBar->SetRangeMax( mnLines );
@@ -720,24 +726,31 @@ void ValueSet::ImplDrawSelect()
void ValueSet::ImplDrawSelect( sal_uInt16 nItemId, const bool bFocus, const bool bDrawSel )
{
ValueSetItem* pItem;
+ Rectangle aRect;
if ( nItemId )
{
- pItem = mItemList[ GetItemPos( nItemId ) ];
+ const size_t nPos = GetItemPos( nItemId );
+ pItem = mItemList[ nPos ];
+ aRect = ImplGetItemRect( nPos );
}
else if ( mpNoneItem )
{
pItem = mpNoneItem;
+ aRect = maNoneItemRect;
+ }
+ else if ( bFocus && (pItem = ImplGetFirstItem()) )
+ {
+ aRect = ImplGetItemRect( 0 );
}
- else if ( !bFocus || !(pItem = ImplGetFirstItem()) )
+ else
{
return;
}
- if ( !pItem->maRect.IsEmpty() )
+ if ( pItem->mbVisible )
{
// draw selection
const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
- Rectangle aRect = pItem->maRect;
Control::SetFillColor();
Color aDoubleColor( rStyleSettings.GetHighlightColor() );
@@ -875,22 +888,28 @@ void ValueSet::ImplHideSelect( sal_uInt16 nItemId )
{
Rectangle aRect;
- size_t nItemPos = GetItemPos( nItemId );
+ const size_t nItemPos = GetItemPos( nItemId );
if ( nItemPos != VALUESET_ITEM_NOTFOUND )
- aRect = mItemList[nItemPos]->maRect;
- else
{
- if ( mpNoneItem )
- aRect = mpNoneItem->maRect;
+ if ( !mItemList[nItemPos]->mbVisible )
+ {
+ return;
+ }
+ aRect = ImplGetItemRect(nItemPos);
}
-
- if ( !aRect.IsEmpty() )
+ else
{
- HideFocus();
- Point aPos = aRect.TopLeft();
- Size aSize = aRect.GetSize();
- DrawOutDev( aPos, aSize, aPos, aSize, maVirDev );
+ if ( !mpNoneItem )
+ {
+ return;
+ }
+ aRect = maNoneItemRect;
}
+
+ HideFocus();
+ const Point aPos = aRect.TopLeft();
+ const Size aSize = aRect.GetSize();
+ DrawOutDev( aPos, aSize, aPos, aSize, maVirDev );
}
// -----------------------------------------------------------------------
@@ -988,21 +1007,21 @@ bool ValueSet::ImplScroll( const Point& rPos )
long nScrollOffset;
sal_uInt16 nOldLine = mnFirstLine;
- const Rectangle& rTopRect = mItemList[ mnFirstLine*mnCols ]->maRect;
- if ( rTopRect.GetHeight() <= 16 )
+ const Rectangle aTopRect = ImplGetItemRect( mnFirstLine*mnCols );
+ if ( aTopRect.GetHeight() <= 16 )
nScrollOffset = SCROLL_OFFSET/2;
else
nScrollOffset = SCROLL_OFFSET;
if ( (mnFirstLine > 0) && (rPos.Y() >= 0) )
{
- long nTopPos = rTopRect.Top();
+ long nTopPos = aTopRect.Top();
if ( (rPos.Y() >= nTopPos) && (rPos.Y() <= nTopPos+nScrollOffset) )
mnFirstLine--;
}
if ( (mnFirstLine == nOldLine) &&
(mnFirstLine < (sal_uInt16)(mnLines-mnVisLines)) && (rPos.Y() < aOutSize.Height()) )
{
- const long nBottomPos = mItemList[ (mnFirstLine+mnVisLines-1)*mnCols ]->maRect.Bottom();
+ const long nBottomPos = ImplGetItemRect((mnFirstLine+mnVisLines-1)*mnCols).Bottom();
if ( (rPos.Y() >= nBottomPos-nScrollOffset) && (rPos.Y() <= nBottomPos) )
mnFirstLine++;
}
@@ -1021,23 +1040,34 @@ bool ValueSet::ImplScroll( const Point& rPos )
size_t ValueSet::ImplGetItem( const Point& rPos, bool bMove ) const
{
- if ( mpNoneItem && mpNoneItem->maRect.IsInside( rPos ) )
+ if ( !mbHasVisibleItems )
{
- return VALUESET_ITEM_NONEITEM;
+ return VALUESET_ITEM_NOTFOUND;
}
- const Rectangle aWinRect( Point(), maVirDev.GetOutputSizePixel() );
+ if ( mpNoneItem && maNoneItemRect.IsInside( rPos ) )
+ {
+ return VALUESET_ITEM_NONEITEM;
+ }
- if ( aWinRect.IsInside( rPos ) )
+ if ( maItemListRect.IsInside( rPos ) )
{
- // The point is inside the ValueSet window,
+ const int xc = rPos.X()-maItemListRect.Left();
+ const int yc = rPos.Y()-maItemListRect.Top();
+ // The point is inside the area of item list,
// let's find the containing item.
- const size_t nItemCount = mItemList.size();
- for ( size_t i = 0; i < nItemCount; ++i )
+ const int col = xc/(mnItemWidth+mnSpacing);
+ const int x = xc%(mnItemWidth+mnSpacing);
+ const int row = yc/(mnItemHeight+mnSpacing);
+ const int y = yc%(mnItemHeight+mnSpacing);
+
+ if (x<mnItemWidth && y<mnItemHeight)
{
- if ( mItemList[i]->maRect.IsInside( rPos ) )
+ // the point is inside item rect and not inside spacing
+ const size_t item = (mnFirstLine+row)*mnCols+col;
+ if (item < mItemList.size())
{
- return i;
+ return item;
}
}
@@ -1074,10 +1104,11 @@ ValueSetItem* ValueSet::ImplGetFirstItem()
sal_uInt16 ValueSet::ImplGetVisibleItemCount() const
{
sal_uInt16 nRet = 0;
+ const size_t nItemCount = mItemList.size();
- for( size_t n = 0, nItemCount = mItemList.size(); n < nItemCount; ++n )
+ for ( size_t n = 0; n < nItemCount; ++n )
{
- if( !mItemList[n]->maRect.IsEmpty() )
+ if ( mItemList[n]->mbVisible )
++nRet;
}
@@ -1088,18 +1119,17 @@ sal_uInt16 ValueSet::ImplGetVisibleItemCount() const
ValueSetItem* ValueSet::ImplGetVisibleItem( sal_uInt16 nVisiblePos )
{
- ValueSetItem* pRet = NULL;
- sal_uInt16 nFoundPos = 0;
+ const size_t nItemCount = mItemList.size();
- for( sal_Int32 n = 0, nItemCount = mItemList.size(); ( n < nItemCount ) && !pRet; n++ )
+ for ( size_t n = 0; n < nItemCount; ++n )
{
- ValueSetItem* pItem = mItemList[n];
+ ValueSetItem *const pItem = mItemList[n];
- if( !pItem->maRect.IsEmpty() && ( nVisiblePos == nFoundPos++ ) )
- pRet = pItem;
+ if ( pItem->mbVisible && !nVisiblePos-- )
+ return pItem;
}
- return pRet;
+ return NULL;
}
// -----------------------------------------------------------------------
@@ -1554,15 +1584,14 @@ void ValueSet::RequestHelp( const HelpEvent& rHEvt )
size_t nItemPos = ImplGetItem( aPos );
if ( nItemPos != VALUESET_ITEM_NOTFOUND )
{
- ValueSetItem* pItem = ImplGetItem( nItemPos );
- Rectangle aItemRect = pItem->maRect;
+ Rectangle aItemRect = ImplGetItemRect( nItemPos );
Point aPt = OutputToScreenPixel( aItemRect.TopLeft() );
aItemRect.Left() = aPt.X();
aItemRect.Top() = aPt.Y();
aPt = OutputToScreenPixel( aItemRect.BottomRight() );
aItemRect.Right() = aPt.X();
aItemRect.Bottom() = aPt.Y();
- Help::ShowQuickHelp( this, aItemRect, GetItemText( pItem->mnId ) );
+ Help::ShowQuickHelp( this, aItemRect, GetItemText( ImplGetItem( nItemPos )->mnId ) );
return;
}
}
@@ -1590,8 +1619,8 @@ void ValueSet::StateChanged( StateChangedType nType )
{
if ( mpNoneItem && !mbFormat && IsReallyVisible() && IsUpdateMode() )
{
- ImplFormatItem( mpNoneItem );
- Invalidate( mpNoneItem->maRect );
+ ImplFormatItem( mpNoneItem, maNoneItemRect );
+ Invalidate( maNoneItemRect );
}
}
else if ( (nType == STATE_CHANGE_ZOOM) ||
@@ -1737,6 +1766,31 @@ void ValueSet::ImplInsertItem( ValueSetItem *const pItem, const size_t nPos )
// -----------------------------------------------------------------------
+Rectangle ValueSet::ImplGetItemRect( size_t nPos ) const
+{
+ const size_t nVisibleBegin = static_cast<size_t>(mnFirstLine)*mnCols;
+ const size_t nMaxVisible = static_cast<size_t>(mnVisLines)*mnCols;
+ size_t nVisibleEnd = nVisibleBegin+nMaxVisible;
+ if ( nVisibleEnd>mItemList.size() )
+ {
+ nVisibleEnd = mItemList.size();
+ }
+
+ if ( nPos<nVisibleBegin || nPos>=nVisibleEnd )
+ return Rectangle();
+
+ nPos -= nVisibleBegin;
+
+ const size_t row = nPos/mnCols;
+ const size_t col = nPos%mnCols;
+ const long x = maItemListRect.Left()+col*(mnItemWidth+mnSpacing);
+ const long y = maItemListRect.Top()+row*(mnItemHeight+mnSpacing);
+
+ return Rectangle( Point(x, y), Size(mnItemWidth, mnItemHeight) );
+}
+
+// -----------------------------------------------------------------------
+
void ValueSet::RemoveItem( sal_uInt16 nItemId )
{
size_t nPos = GetItemPos( nItemId );
@@ -1824,12 +1878,12 @@ sal_uInt16 ValueSet::GetItemId( const Point& rPos ) const
Rectangle ValueSet::GetItemRect( sal_uInt16 nItemId ) const
{
- size_t nPos = GetItemPos( nItemId );
+ const size_t nPos = GetItemPos( nItemId );
- if ( nPos != VALUESET_ITEM_NOTFOUND )
- return mItemList[nPos]->maRect;
- else
- return Rectangle();
+ if ( nPos!=VALUESET_ITEM_NOTFOUND && mItemList[nPos]->mbVisible )
+ return ImplGetItemRect( nPos );
+
+ return Rectangle();
}
// -----------------------------------------------------------------------
@@ -2039,8 +2093,9 @@ void ValueSet::SetItemImage( sal_uInt16 nItemId, const Image& rImage )
if ( !mbFormat && IsReallyVisible() && IsUpdateMode() )
{
- ImplFormatItem( pItem );
- Invalidate( pItem->maRect );
+ const Rectangle aRect = ImplGetItemRect(nPos);
+ ImplFormatItem( pItem, aRect );
+ Invalidate( aRect );
}
else
mbFormat = true;
@@ -2073,8 +2128,9 @@ void ValueSet::SetItemColor( sal_uInt16 nItemId, const Color& rColor )
if ( !mbFormat && IsReallyVisible() && IsUpdateMode() )
{
- ImplFormatItem( pItem );
- Invalidate( pItem->maRect );
+ const Rectangle aRect = ImplGetItemRect(nPos);
+ ImplFormatItem( pItem, aRect );
+ Invalidate( aRect );
}
else
mbFormat = true;
@@ -2108,8 +2164,9 @@ void ValueSet::SetItemData( sal_uInt16 nItemId, void* pData )
{
if ( !mbFormat && IsReallyVisible() && IsUpdateMode() )
{
- ImplFormatItem( pItem );
- Invalidate( pItem->maRect );
+ const Rectangle aRect = ImplGetItemRect(nPos);
+ ImplFormatItem( pItem, aRect );
+ Invalidate( aRect );
}
else
mbFormat = true;