[PATCH libreoffice-4-0] fix selection change event firing

Noel Power (via Code Review) gerrit at gerrit.libreoffice.org
Fri Apr 5 01:48:03 PDT 2013


Hi,

I have submitted a patch for review:

    https://gerrit.libreoffice.org/3210

To pull it, you can do:

    git pull ssh://gerrit.libreoffice.org:29418/core refs/changes/10/3210/1

fix selection change event firing

Change-Id: I64e8b684dd5462e1a742ba47b5480951b4e3a4c4
---
M sc/inc/viewuno.hxx
M sc/source/ui/unoobj/viewuno.cxx
M vbahelper/source/msforms/vbacontrol.cxx
3 files changed, 51 insertions(+), 4 deletions(-)



diff --git a/sc/inc/viewuno.hxx b/sc/inc/viewuno.hxx
index da2f96c..6411979 100644
--- a/sc/inc/viewuno.hxx
+++ b/sc/inc/viewuno.hxx
@@ -205,7 +205,8 @@
     void                    EndMouseListening();
     void                    StartActivationListening();
     void                    EndActivationListening();
-
+    bool                    mbLeftMousePressed;
+    bool                    mbPendingSelectionChanged;
     ScTabViewObj(); // disabled
 public:
                             ScTabViewObj(ScTabViewShell* pViewSh);
diff --git a/sc/source/ui/unoobj/viewuno.cxx b/sc/source/ui/unoobj/viewuno.cxx
index b9f9541..b54a4ce 100644
--- a/sc/source/ui/unoobj/viewuno.cxx
+++ b/sc/source/ui/unoobj/viewuno.cxx
@@ -463,7 +463,9 @@
     aMouseClickHandlers( 0 ),
     aActivationListeners( 0 ),
     nPreviousTab( 0 ),
-    bDrawSelModeSet(false)
+    bDrawSelModeSet(false),
+    mbLeftMousePressed(false    ),
+    mbPendingSelectionChanged(false)
 {
     if (pViewSh)
         nPreviousTab = pViewSh->GetViewData()->GetTabNo();
@@ -1184,13 +1186,17 @@
     SCTAB nTab = pViewData->GetTabNo();
     return
         pDoc->HasSheetEventScript( nTab, SC_SHEETEVENT_RIGHTCLICK, true ) ||
-        pDoc->HasSheetEventScript( nTab, SC_SHEETEVENT_DOUBLECLICK, true );
+        pDoc->HasSheetEventScript( nTab, SC_SHEETEVENT_DOUBLECLICK, true ) ||
+        pDoc->HasSheetEventScript( nTab, SC_SHEETEVENT_SELECT, true );
+
 }
 
 sal_Bool ScTabViewObj::MousePressed( const awt::MouseEvent& e )
                                     throw (::uno::RuntimeException)
 {
     sal_Bool bReturn(false);
+    if ( e.Buttons == ::com::sun::star::awt::MouseButton::LEFT )
+        mbLeftMousePressed = true;
 
     uno::Reference< uno::XInterface > xTarget = GetClickedObject(Point(e.X, e.Y));
     if (!aMouseClickHandlers.empty() && xTarget.is())
@@ -1281,6 +1287,26 @@
 sal_Bool ScTabViewObj::MouseReleased( const awt::MouseEvent& e )
                                     throw (uno::RuntimeException)
 {
+    if ( e.Buttons == ::com::sun::star::awt::MouseButton::LEFT )
+    {
+        try
+        {
+            mbPendingSelectionChanged = false;
+            ScTabViewShell* pViewSh = GetViewShell();
+            ScViewData* pViewData = pViewSh->GetViewData();
+            ScDocShell* pDocSh = pViewData->GetDocShell();
+            ScDocument* pDoc = pDocSh->GetDocument();
+            uno::Reference< script::vba::XVBAEventProcessor > xVbaEvents( pDoc->GetVbaEventProcessor(), uno::UNO_SET_THROW );
+            uno::Sequence< uno::Any > aArgs( 1 );
+            aArgs[ 0 ] <<= getSelection();
+            xVbaEvents->processVbaEvent( ScSheetEvents::GetVbaSheetEventId( SC_SHEETEVENT_SELECT ), aArgs );
+        }
+        catch( uno::Exception& )
+        {
+        }
+        mbLeftMousePressed = false;
+    }
+
     sal_Bool bReturn(false);
 
     if (!aMouseClickHandlers.empty())
@@ -1746,7 +1772,24 @@
             /*ErrCode eRet =*/ pDocSh->CallXScript( *pScript, aParams, aRet, aOutArgsIndex, aOutArgs );
         }
     }
-    // Removed Sun/Oracle code intentionally, it doesn't work properly ( selection should be fired after mouse release )
+    if ( !mbLeftMousePressed ) // selection still in progress
+    {
+        mbPendingSelectionChanged = false;
+        try
+        {
+            uno::Reference< script::vba::XVBAEventProcessor > xVbaEvents( pDoc->GetVbaEventProcessor(), uno::UNO_SET_THROW );
+            uno::Sequence< uno::Any > aArgs( 1 );
+            aArgs[ 0 ] <<= getSelection();
+            xVbaEvents->processVbaEvent( ScSheetEvents::GetVbaSheetEventId( SC_SHEETEVENT_SELECT ), aArgs );
+        }
+        catch( uno::Exception& )
+        {
+        }
+    }
+    else
+    {
+        mbPendingSelectionChanged = true;
+    }
 }
 
 
diff --git a/vbahelper/source/msforms/vbacontrol.cxx b/vbahelper/source/msforms/vbacontrol.cxx
index e9be040..b788368 100644
--- a/vbahelper/source/msforms/vbacontrol.cxx
+++ b/vbahelper/source/msforms/vbacontrol.cxx
@@ -192,11 +192,14 @@
 sal_Bool SAL_CALL ScVbaControl::getVisible() throw (uno::RuntimeException)
 {
     sal_Bool bVisible( sal_True );
+    m_xProps->getPropertyValue ( "EnableVisible" ) >>= bVisible;
     uno::Reference< drawing::XControlShape > xControlShape( m_xControl, uno::UNO_QUERY );
     if ( xControlShape.is() )
     {
+        bool bEnableVisible = bVisible;
         uno::Reference< beans::XPropertySet > xProps( m_xControl, uno::UNO_QUERY_THROW );
         xProps->getPropertyValue ( "Visible" ) >>= bVisible;
+        bVisible = bVisible && bEnableVisible;
     }
     else
         m_xProps->getPropertyValue ( "EnableVisible" ) >>= bVisible;

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I64e8b684dd5462e1a742ba47b5480951b4e3a4c4
Gerrit-PatchSet: 1
Gerrit-Project: core
Gerrit-Branch: libreoffice-4-0
Gerrit-Owner: Noel Power <noel.power at suse.com>



More information about the LibreOffice mailing list