diff options
Diffstat (limited to 'sfx2')
-rw-r--r-- | sfx2/inc/sfx2/thumbnailview.hxx | 7 | ||||
-rw-r--r-- | sfx2/source/control/thumbnailview.cxx | 104 |
2 files changed, 104 insertions, 7 deletions
diff --git a/sfx2/inc/sfx2/thumbnailview.hxx b/sfx2/inc/sfx2/thumbnailview.hxx index 282e3c4b039e..5058144d2b8e 100644 --- a/sfx2/inc/sfx2/thumbnailview.hxx +++ b/sfx2/inc/sfx2/thumbnailview.hxx @@ -202,6 +202,8 @@ public: void SelectItem( sal_uInt16 nItemId ); + void DeselectItem( sal_uInt16 nItemId ); + bool IsItemSelected( sal_uInt16 nItemId ) const; /** @@ -235,6 +237,8 @@ public: protected: + virtual void KeyInput( const KeyEvent& rKEvt ); + virtual void MouseButtonDown( const MouseEvent& rMEvt ); virtual void MouseButtonUp( const MouseEvent& rMEvt ); @@ -268,8 +272,6 @@ protected: using Control::ImplInitSettings; using Window::ImplInit; - void calculateColumnsRows (); - void CalculateItemPositions (); SFX2_DLLPRIVATE void ImplInit(); @@ -290,6 +292,7 @@ protected: protected: ValueItemList mItemList; + ValueItemList mFilteredItemList; ///< Cache to store the filtered items ScrollBar* mpScrBar; Rectangle maItemListRect; long mnHeaderHeight; diff --git a/sfx2/source/control/thumbnailview.cxx b/sfx2/source/control/thumbnailview.cxx index ea66ecc42e2b..b73b9084cf0d 100644 --- a/sfx2/source/control/thumbnailview.cxx +++ b/sfx2/source/control/thumbnailview.cxx @@ -214,6 +214,8 @@ void ThumbnailView::CalculateItemPositions () WinBits nStyle = GetStyle(); ScrollBar* pDelScrBar = NULL; + mFilteredItemList.clear(); + // consider the scrolling if ( nStyle & WB_VSCROLL ) ImplInitScrollBar(); @@ -295,6 +297,7 @@ void ThumbnailView::CalculateItemPositions () if (maFilterFunc(pItem)) { + mFilteredItemList.push_back(pItem); if ((nCurCount >= nFirstItem) && (nCurCount < nLastItem)) { if( !pItem->isVisible()) @@ -487,6 +490,73 @@ IMPL_LINK (ThumbnailView, OnItemSelected, ThumbnailViewItem*, pItem) return 0; } +void ThumbnailView::KeyInput( const KeyEvent& rKEvt ) +{ + // Get the last selected item in the list + size_t nLastPos = 0; + bool bFoundLast = false; + for ( long i = mFilteredItemList.size() - 1; !bFoundLast && i >= 0; --i ) + { + ThumbnailViewItem* pItem = mFilteredItemList[i]; + if ( pItem->isSelected() ) + { + nLastPos = i; + bFoundLast = true; + } + } + + KeyCode aKeyCode = rKEvt.GetKeyCode(); + ThumbnailViewItem* pNext = NULL; + switch ( aKeyCode.GetCode() ) + { + case KEY_RIGHT: + { + size_t nNextPos = nLastPos; + if ( bFoundLast && nLastPos < mFilteredItemList.size( ) - 1 ) + nNextPos = nLastPos + 1; + pNext = mFilteredItemList[nNextPos]; + } + break; + case KEY_LEFT: + { + size_t nNextPos = nLastPos; + if ( nLastPos > 0 ) + nNextPos = nLastPos - 1; + pNext = mFilteredItemList[nNextPos]; + } + break; + case KEY_DOWN: + { + size_t nNextPos = nLastPos; + if ( bFoundLast && nLastPos < mFilteredItemList.size( ) - mnCols ) + nNextPos = nLastPos + mnCols; + pNext = mFilteredItemList[nNextPos]; + } + break; + case KEY_UP: + { + size_t nNextPos = nLastPos; + if ( nLastPos >= mnCols ) + nNextPos = nLastPos - mnCols; + pNext = mFilteredItemList[nNextPos]; + } + break; + case KEY_RETURN: + { + if ( bFoundLast ) + OnItemDblClicked( mFilteredItemList[nLastPos] ); + } + default: + Control::KeyInput( rKEvt ); + } + + if ( pNext && pNext->isVisible() ) + { + deselectItems(); + SelectItem(pNext->mnId); + } +} + void ThumbnailView::MouseButtonDown( const MouseEvent& rMEvt ) { if ( rMEvt.IsLeft() ) @@ -497,12 +567,17 @@ void ThumbnailView::MouseButtonDown( const MouseEvent& rMEvt ) { if ( rMEvt.GetClicks() == 1 ) { - if (!pItem->isSelected() && !rMEvt.IsMod1()) - deselectItems( ); - pItem->setSelection(true); + if (pItem->isSelected() && rMEvt.IsMod1()) + DeselectItem( pItem->mnId ); + else + { + if (!pItem->isSelected() && !rMEvt.IsMod1()) + deselectItems( ); + SelectItem( pItem->mnId ); - bool bClickOnTitle = pItem->getTextArea().IsInside(rMEvt.GetPosPixel()); - pItem->setEditTitle(bClickOnTitle); + bool bClickOnTitle = pItem->getTextArea().IsInside(rMEvt.GetPosPixel()); + pItem->setEditTitle(bClickOnTitle); + } if (!pItem->isHighlighted()) DrawItem(pItem); @@ -830,6 +905,25 @@ void ThumbnailView::SelectItem( sal_uInt16 nItemId ) } } +void ThumbnailView::DeselectItem( sal_uInt16 nItemId ) +{ + size_t nItemPos = GetItemPos( nItemId ); + if ( nItemPos == THUMBNAILVIEW_ITEM_NOTFOUND ) + return; + + ThumbnailViewItem* pItem = mItemList[nItemPos]; + if (pItem->isSelected()) + { + mItemList[nItemPos]->setSelection(false); + maItemStateHdl.Call(mItemList[nItemPos]); + + if (IsReallyVisible() && IsUpdateMode()) + Invalidate(); + + // TODO Trigger event in accessible object? + } +} + bool ThumbnailView::IsItemSelected( sal_uInt16 nItemId ) const { size_t nItemPos = GetItemPos( nItemId ); |