summaryrefslogtreecommitdiff
path: root/sfx2
diff options
context:
space:
mode:
authorCédric Bosdonnat <cedric.bosdonnat@free.fr>2013-03-22 11:43:11 +0100
committerFridrich Strba <fridrich@documentfoundation.org>2013-03-22 17:10:02 +0000
commit43bbcfc7a1625aa79b69c443c492f0969b31baad (patch)
tree0a2034094e7024afbf49c85110adb017ee34b572 /sfx2
parente2ce03c2eaf1bdf6a3b736052be8e2ed8ef8c6ca (diff)
fdo#61390: simple keybard support in TemplateManager
Adds support for the UP, DOWN, LEFT, RIGHT and RETURN keys in the thumbnails view but doesn't handle the modifiers yet. There are still some problems with the focus and key input outside the top level (cherry picked from commit ee819bdd2dab5756cc3bad74f24e50bd7409f308) Conflicts: sfx2/source/control/thumbnailview.cxx Change-Id: I5ba67583c835bcc00b075071411c0d6590a07f9a Reviewed-on: https://gerrit.libreoffice.org/2912 Reviewed-by: Fridrich Strba <fridrich@documentfoundation.org> Tested-by: Fridrich Strba <fridrich@documentfoundation.org>
Diffstat (limited to 'sfx2')
-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 efc5e78d527c..95e6b53679c5 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;
void deselectItem (const sal_uInt16 nItemId);
@@ -239,6 +241,8 @@ public:
protected:
+ virtual void KeyInput( const KeyEvent& rKEvt );
+
virtual void MouseButtonDown( const MouseEvent& rMEvt );
virtual void MouseButtonUp( const MouseEvent& rMEvt );
@@ -272,8 +276,6 @@ protected:
using Control::ImplInitSettings;
using Window::ImplInit;
- void calculateColumnsRows ();
-
void CalculateItemPositions ();
SFX2_DLLPRIVATE void ImplInit();
@@ -294,6 +296,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 63ba1894f64b..f78a308275ee 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();
@@ -298,6 +300,7 @@ void ThumbnailView::CalculateItemPositions ()
if (maFilterFunc(pItem))
{
+ mFilteredItemList.push_back(pItem);
if ((nCurCount >= nFirstItem) && (nCurCount < nLastItem))
{
if( !pItem->isVisible())
@@ -490,6 +493,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() )
@@ -500,12 +570,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);
@@ -851,6 +926,25 @@ void ThumbnailView::deselectItem(const 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 );