summaryrefslogtreecommitdiff
path: root/sc
diff options
context:
space:
mode:
authorKohei Yoshida <kohei.yoshida@gmail.com>2012-12-06 00:32:22 -0500
committerKohei Yoshida <kohei.yoshida@gmail.com>2012-12-06 09:09:40 -0500
commit28daebdf085844b8e611a90ece376ac3b19b8b9b (patch)
tree2c22e55e1ee1cec82d67a78fc3381737682695d6 /sc
parent7c1ed71c22f120279c07bb3aa60b1022ed4391d1 (diff)
Avoid activating window pane when launching popup window.
Else, activating another window pane where the cursor is not would cause the pivot table field popup to immediately get dismissed after launch because ClickExtern() gets called from ActivatePart(). For example, imagine a field popup button is on C2, the cell cursor is on E5, and the window is frozen between rows 2 and 3. Clicking the popup button in C2 would launch it for a brief second and dismiss it immediately afterward. Conceptually, launching a popup in another pane shouldn't activate that pane anyway. So it makes sense not to activate it for that scenario. Change-Id: Ib970cb898fb9c79d254411e2519cfce74c60b72f
Diffstat (limited to 'sc')
-rw-r--r--sc/source/ui/inc/gridwin.hxx4
-rw-r--r--sc/source/ui/view/gridwin.cxx39
2 files changed, 26 insertions, 17 deletions
diff --git a/sc/source/ui/inc/gridwin.hxx b/sc/source/ui/inc/gridwin.hxx
index 8a64de9f4ebb..4f84d438b00c 100644
--- a/sc/source/ui/inc/gridwin.hxx
+++ b/sc/source/ui/inc/gridwin.hxx
@@ -115,6 +115,8 @@ private:
boost::scoped_ptr<Rectangle> mpAutoFillRect;
+ struct MouseEventState;
+
/**
* Stores current visible column and row ranges, used to avoid expensive
* operations on objects that are outside visible area.
@@ -250,7 +252,7 @@ private:
sal_Int8 DropTransferObj( ScTransferObj* pTransObj, SCCOL nDestPosX, SCROW nDestPosY,
const Point& rLogicPos, sal_Int8 nDndAction );
- void HandleMouseButtonDown( const MouseEvent& rMEvt );
+ void HandleMouseButtonDown( const MouseEvent& rMEvt, MouseEventState& rState );
bool DrawMouseButtonDown(const MouseEvent& rMEvt);
bool DrawMouseButtonUp(const MouseEvent& rMEvt);
diff --git a/sc/source/ui/view/gridwin.cxx b/sc/source/ui/view/gridwin.cxx
index 64555e68c2bb..e7f82b8c9085 100644
--- a/sc/source/ui/view/gridwin.cxx
+++ b/sc/source/ui/view/gridwin.cxx
@@ -167,6 +167,13 @@ extern SfxViewShell* pScActiveViewShell; // global.cxx
extern sal_uInt16 nScClickMouseModifier; // global.cxx
extern sal_uInt16 nScFillModeMouseModifier; // global.cxx
+struct ScGridWindow::MouseEventState
+{
+ bool mbActivatePart;
+
+ MouseEventState() : mbActivatePart(false) {}
+};
+
#define SC_FILTERLISTBOX_LINES 12
// ============================================================================
@@ -1734,7 +1741,10 @@ void ScGridWindow::MouseButtonDown( const MouseEvent& rMEvt )
{
nNestedButtonState = SC_NESTEDBUTTON_DOWN;
- HandleMouseButtonDown( rMEvt );
+ MouseEventState aState;
+ HandleMouseButtonDown(rMEvt, aState);
+ if (aState.mbActivatePart)
+ pViewData->GetView()->ActivatePart(eWhich);
if ( nNestedButtonState == SC_NESTEDBUTTON_UP )
{
@@ -1751,7 +1761,7 @@ void ScGridWindow::MouseButtonDown( const MouseEvent& rMEvt )
nNestedButtonState = SC_NESTEDBUTTON_NONE;
}
-void ScGridWindow::HandleMouseButtonDown( const MouseEvent& rMEvt )
+void ScGridWindow::HandleMouseButtonDown( const MouseEvent& rMEvt, MouseEventState& rState )
{
// We have to check if a context menu is shown and we have an UI
// active inplace client. In that case we have to ignore the event.
@@ -1835,12 +1845,9 @@ void ScGridWindow::HandleMouseButtonDown( const MouseEvent& rMEvt )
if (!bDouble)
nMouseStatus = SC_GM_NONE;
- if (!bFormulaMode)
- {
- if ( pViewData->GetActivePart() != eWhich )
- pViewData->GetView()->ActivatePart( eWhich );
- }
- else
+ rState.mbActivatePart = !bFormulaMode; // Don't activate when in formula mode.
+
+ if (bFormulaMode)
{
ScViewSelectionEngine* pSelEng = pViewData->GetView()->GetSelEngine();
pSelEng->SetWindow(this);
@@ -1896,9 +1903,7 @@ void ScGridWindow::HandleMouseButtonDown( const MouseEvent& rMEvt )
{
bRFMouse = true; // die anderen Variablen sind oben initialisiert
- if ( pViewData->GetActivePart() != eWhich )
- pViewData->GetView()->ActivatePart( eWhich ); //! schon oben immer ???
-
+ rState.mbActivatePart = true; // always activate ?
StartTracking();
return;
}
@@ -1909,7 +1914,7 @@ void ScGridWindow::HandleMouseButtonDown( const MouseEvent& rMEvt )
if ( bDouble )
pViewData->GetView()->FillCrossDblClick();
else
- pScMod->InputEnterHandler(); // Autofill etc.
+ pScMod->InputEnterHandler(); // Autofill etc.
}
if ( !bCrossPointer )
@@ -1944,10 +1949,7 @@ void ScGridWindow::HandleMouseButtonDown( const MouseEvent& rMEvt )
SCTAB nTab = pViewData->GetTabNo();
ScDocument* pDoc = pViewData->GetDocument();
-
- //
- // AutoFilter buttons
- //
+ // Auto filter / pivot table / data select popup. This shouldn't activate the part.
if ( !bDouble && !bFormulaMode && rMEvt.IsLeft() )
{
@@ -1956,11 +1958,15 @@ void ScGridWindow::HandleMouseButtonDown( const MouseEvent& rMEvt )
if (pAttr->HasAutoFilter())
{
if (DoAutoFilterButton(nPosX, nPosY, rMEvt))
+ {
+ rState.mbActivatePart = false;
return;
+ }
}
if (pAttr->HasButton())
{
DoPushButton( nPosX, nPosY, rMEvt ); // setzt evtl. bPivotMouse / bDPMouse
+ rState.mbActivatePart = false;
return;
}
@@ -1975,6 +1981,7 @@ void ScGridWindow::HandleMouseButtonDown( const MouseEvent& rMEvt )
nMouseStatus = SC_GM_FILTER; // not set in DoAutoFilterMenue for bDataSelect
CaptureMouse();
+ rState.mbActivatePart = false;
return;
}
}