[PATCH libreoffice-4-0] fdo#61390: simple keybard support in TemplateManager

Bosdonnat Cedric (via Code Review) gerrit at gerrit.libreoffice.org
Fri Mar 22 09:17:26 PDT 2013


Hi,

I have submitted a patch for review:

    https://gerrit.libreoffice.org/2912

To pull it, you can do:

    git pull ssh://gerrit.libreoffice.org:29418/core refs/changes/12/2912/1

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
---
M sfx2/inc/sfx2/thumbnailview.hxx
M sfx2/source/control/thumbnailview.cxx
2 files changed, 104 insertions(+), 7 deletions(-)



diff --git a/sfx2/inc/sfx2/thumbnailview.hxx b/sfx2/inc/sfx2/thumbnailview.hxx
index efc5e78..95e6b53 100644
--- a/sfx2/inc/sfx2/thumbnailview.hxx
+++ b/sfx2/inc/sfx2/thumbnailview.hxx
@@ -202,6 +202,8 @@
 
     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 @@
 
 protected:
 
+    virtual void KeyInput( const KeyEvent& rKEvt );
+
     virtual void MouseButtonDown( const MouseEvent& rMEvt );
 
     virtual void MouseButtonUp( const MouseEvent& rMEvt );
@@ -272,8 +276,6 @@
     using Control::ImplInitSettings;
     using Window::ImplInit;
 
-    void calculateColumnsRows ();
-
     void CalculateItemPositions ();
 
     SFX2_DLLPRIVATE void         ImplInit();
@@ -294,6 +296,7 @@
 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 63ba189..f78a308 100644
--- a/sfx2/source/control/thumbnailview.cxx
+++ b/sfx2/source/control/thumbnailview.cxx
@@ -214,6 +214,8 @@
     WinBits     nStyle = GetStyle();
     ScrollBar*  pDelScrBar = NULL;
 
+    mFilteredItemList.clear();
+
     // consider the scrolling
     if ( nStyle & WB_VSCROLL )
         ImplInitScrollBar();
@@ -298,6 +300,7 @@
 
         if (maFilterFunc(pItem))
         {
+            mFilteredItemList.push_back(pItem);
             if ((nCurCount >= nFirstItem) && (nCurCount < nLastItem))
             {
                 if( !pItem->isVisible())
@@ -490,6 +493,73 @@
     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 @@
         {
             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( 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 );

-- 
To view, visit https://gerrit.libreoffice.org/2912
To unsubscribe, visit https://gerrit.libreoffice.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I5ba67583c835bcc00b075071411c0d6590a07f9a
Gerrit-PatchSet: 1
Gerrit-Project: core
Gerrit-Branch: libreoffice-4-0
Gerrit-Owner: Bosdonnat Cedric <cedric.bosdonnat at free.fr>



More information about the LibreOffice mailing list