summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sfx2/inc/sfx2/thumbnailview.hxx7
-rw-r--r--sfx2/source/control/thumbnailview.cxx104
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 );