[Libreoffice-commits] core.git: 2 commits - sfx2/inc sfx2/source

Cédric Bosdonnat cedric.bosdonnat at free.fr
Fri Mar 22 05:30:41 PDT 2013


 sfx2/inc/sfx2/thumbnailview.hxx          |   13 -
 sfx2/source/control/thumbnailview.cxx    |  218 +++++++++++++++++--------------
 sfx2/source/control/thumbnailviewacc.cxx |    2 
 3 files changed, 127 insertions(+), 106 deletions(-)

New commits:
commit ee819bdd2dab5756cc3bad74f24e50bd7409f308
Author: Cédric Bosdonnat <cedric.bosdonnat at free.fr>
Date:   Fri Mar 22 11:43:11 2013 +0100

    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
    
    Change-Id: I5ba67583c835bcc00b075071411c0d6590a07f9a

diff --git a/sfx2/inc/sfx2/thumbnailview.hxx b/sfx2/inc/sfx2/thumbnailview.hxx
index 282e3c4b..5058144 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 ea66ecc..b73b908 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 );
commit bfd1bcb204ed3ca35df1455a346a0ee7254a1191
Author: Cédric Bosdonnat <cedric.bosdonnat at free.fr>
Date:   Thu Mar 21 11:49:01 2013 +0100

    Template Manager: removed some dead selection code
    
    Change-Id: Ib5ebcd928e77a115f4f62a50724656c33ae13c61

diff --git a/sfx2/inc/sfx2/thumbnailview.hxx b/sfx2/inc/sfx2/thumbnailview.hxx
index a299e7b..282e3c4b 100644
--- a/sfx2/inc/sfx2/thumbnailview.hxx
+++ b/sfx2/inc/sfx2/thumbnailview.hxx
@@ -202,10 +202,7 @@ public:
 
     void SelectItem( sal_uInt16 nItemId );
 
-    sal_uInt16 GetSelectItemId() const { return mnSelItemId; }
-
-    bool IsItemSelected( sal_uInt16 nItemId ) const
-        { return nItemId == mnSelItemId; }
+    bool IsItemSelected( sal_uInt16 nItemId ) const;
 
     /**
      *
@@ -254,8 +251,6 @@ protected:
 
     virtual void DataChanged( const DataChangedEvent& rDCEvt );
 
-    virtual bool StartDrag( const CommandEvent& rCEvt, Region& rRegion );
-
     virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > CreateAccessible();
 
 protected:
@@ -306,7 +301,6 @@ protected:
     long mnVisLines;
     long mnLines;
     sal_uInt16 mnScrBarOffset;
-    sal_uInt16 mnSelItemId;
     sal_uInt16 mnHighItemId;
     sal_uInt16 mnCols;
     sal_uInt16 mnFirstLine;
diff --git a/sfx2/source/control/thumbnailview.cxx b/sfx2/source/control/thumbnailview.cxx
index 3695068..ea66ecc 100644
--- a/sfx2/source/control/thumbnailview.cxx
+++ b/sfx2/source/control/thumbnailview.cxx
@@ -92,7 +92,6 @@ void ThumbnailView::ImplInit()
     mnLines             = 0;
     mnFirstLine         = 0;
     mnScrBarOffset = 1;
-    mnSelItemId         = 0;
     mnHighItemId        = 0;
     mnCols              = 0;
     mnSpacing           = 0;
@@ -586,11 +585,7 @@ void ThumbnailView::GetFocus()
 
     if ( nSelected == -1 && mItemList.size( ) > 0 )
     {
-        mItemList[0]->setSelection(true);
-        maItemStateHdl.Call(mItemList[0]);
-
-        if (IsReallyVisible() && IsUpdateMode())
-            Invalidate();
+        SelectItem( 1 );
     }
 
     // Tell the accessible object that we got the focus.
@@ -707,10 +702,9 @@ void ThumbnailView::RemoveItem( sal_uInt16 nItemId )
     }
 
     // reset variables
-    if ( (mnHighItemId == nItemId) || (mnSelItemId == nItemId) )
+    if ( (mnHighItemId == nItemId) )
     {
         mnHighItemId    = 0;
-        mnSelItemId     = 0;
     }
 
     CalculateItemPositions();
@@ -726,7 +720,6 @@ void ThumbnailView::Clear()
     // reset variables
     mnFirstLine     = 0;
     mnHighItemId    = 0;
-    mnSelItemId     = 0;
 
     CalculateItemPositions();
 
@@ -774,19 +767,18 @@ void ThumbnailView::setItemDimensions(long itemWidth, long thumbnailHeight, long
 
 void ThumbnailView::SelectItem( sal_uInt16 nItemId )
 {
-    size_t nItemPos = 0;
+    size_t nItemPos = GetItemPos( nItemId );
+    if ( nItemPos == THUMBNAILVIEW_ITEM_NOTFOUND )
+        return;
 
-    if ( nItemId )
+    ThumbnailViewItem* pItem = mItemList[nItemPos];
+    if (!pItem->isSelected())
     {
-        nItemPos = GetItemPos( nItemId );
-        if ( nItemPos == THUMBNAILVIEW_ITEM_NOTFOUND )
-            return;
-    }
+        mItemList[nItemPos]->setSelection(true);
+        maItemStateHdl.Call(mItemList[nItemPos]);
 
-    if ( mnSelItemId != nItemId)
-    {
-        sal_uInt16 nOldItem = mnSelItemId ? mnSelItemId : 1;
-        mnSelItemId = nItemId;
+        if (IsReallyVisible() && IsUpdateMode())
+            Invalidate();
 
         bool bNewOut = IsReallyVisible() && IsUpdateMode();
 
@@ -812,44 +804,8 @@ void ThumbnailView::SelectItem( sal_uInt16 nItemId )
 
         if( ImplHasAccessibleListeners() )
         {
-            // focus event (deselect)
-            if( nOldItem )
-            {
-                const size_t nPos = GetItemPos( nItemId );
-
-                if( nPos != THUMBNAILVIEW_ITEM_NOTFOUND )
-                {
-                    ThumbnailViewAcc* pItemAcc = ThumbnailViewAcc::getImplementation(
-                        mItemList[nPos]->GetAccessible( mbIsTransientChildrenDisabled ) );
-
-                    if( pItemAcc )
-                    {
-                        ::com::sun::star::uno::Any aOldAny, aNewAny;
-                        if( !mbIsTransientChildrenDisabled )
-                        {
-                            aOldAny <<= ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >(
-                                static_cast< ::cppu::OWeakObject* >( pItemAcc ));
-                            ImplFireAccessibleEvent (::com::sun::star::accessibility::AccessibleEventId::ACTIVE_DESCENDANT_CHANGED, aOldAny, aNewAny );
-                        }
-                        else
-                        {
-                            aOldAny <<= ::com::sun::star::accessibility::AccessibleStateType::FOCUSED;
-                            pItemAcc->FireAccessibleEvent( ::com::sun::star::accessibility::AccessibleEventId::STATE_CHANGED, aOldAny, aNewAny );
-                        }
-                    }
-                }
-            }
-
             // focus event (select)
-            const size_t nPos = GetItemPos( mnSelItemId );
-
-            ThumbnailViewItem* pItem = NULL;
-            if( nPos != THUMBNAILVIEW_ITEM_NOTFOUND )
-                pItem = mItemList[nPos];
-
-            ThumbnailViewAcc* pItemAcc = NULL;
-            if (pItem != NULL)
-                pItemAcc = ThumbnailViewAcc::getImplementation( pItem->GetAccessible( mbIsTransientChildrenDisabled ) );
+            ThumbnailViewAcc* pItemAcc = ThumbnailViewAcc::getImplementation( pItem->GetAccessible( mbIsTransientChildrenDisabled ) );
 
             if( pItemAcc )
             {
@@ -874,6 +830,16 @@ void ThumbnailView::SelectItem( sal_uInt16 nItemId )
     }
 }
 
+bool ThumbnailView::IsItemSelected( sal_uInt16 nItemId ) const
+{
+    size_t nItemPos = GetItemPos( nItemId );
+    if ( nItemPos == THUMBNAILVIEW_ITEM_NOTFOUND )
+        return false;
+
+    ThumbnailViewItem* pItem = mItemList[nItemPos];
+    return pItem->isSelected();
+}
+
 void ThumbnailView::deselectItems()
 {
     for (size_t i = 0, n = mItemList.size(); i < n; ++i)
@@ -910,42 +876,6 @@ void ThumbnailView::SetColor( const Color& rColor )
         Invalidate();
 }
 
-bool ThumbnailView::StartDrag( const CommandEvent& rCEvt, Region& rRegion )
-{
-    if ( rCEvt.GetCommand() != COMMAND_STARTDRAG )
-        return false;
-
-    // if necessary abort an existing action
-
-    // Check out if the clicked on page is selected. If this is not the
-    // case set it as the current item. We only check mouse actions since
-    // drag-and-drop can also be triggered by the keyboard
-    sal_uInt16 nSelId;
-    if ( rCEvt.IsMouseEvent() )
-        nSelId = GetItemId( rCEvt.GetMousePosPixel() );
-    else
-        nSelId = mnSelItemId;
-
-    // don't activate dragging if no item was clicked on
-    if ( !nSelId )
-        return false;
-
-    // Check out if the page was selected. If not set as current page and
-    // call select.
-    if ( nSelId != mnSelItemId )
-    {
-        SelectItem( nSelId );
-        Update();
-    }
-
-    Region aRegion;
-
-    // assign region
-    rRegion = aRegion;
-
-    return true;
-}
-
 void ThumbnailView::filterItems (const boost::function<bool (const ThumbnailViewItem*) > &func)
 {
     mnFirstLine = 0;        // start at the top of the list instead of the current position
diff --git a/sfx2/source/control/thumbnailviewacc.cxx b/sfx2/source/control/thumbnailviewacc.cxx
index ee741d3..24ae46d2 100644
--- a/sfx2/source/control/thumbnailviewacc.cxx
+++ b/sfx2/source/control/thumbnailviewacc.cxx
@@ -767,7 +767,7 @@ uno::Reference< accessibility::XAccessibleStateSet > SAL_CALL ThumbnailViewItemA
         //      pStateSet->AddState( accessibility::AccessibleStateType::FOCUSABLE );
 
         // SELECTED
-        if( mpParent->mrParent.GetSelectItemId() == mpParent->mnId )
+        if( mpParent->isSelected() )
         {
             pStateSet->AddState( accessibility::AccessibleStateType::SELECTED );
             //              pStateSet->AddState( accessibility::AccessibleStateType::FOCUSED );


More information about the Libreoffice-commits mailing list