diff options
Diffstat (limited to 'sfx2/source/control')
-rw-r--r-- | sfx2/source/control/thumbnailview.cxx | 104 |
1 files changed, 99 insertions, 5 deletions
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 ); |