summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarco Cecchetti <mrcekets@gmail.com>2014-11-05 20:15:32 +0100
committerAndras Timar <andras.timar@collabora.com>2014-11-05 21:40:04 +0100
commit613d312d771840225d75d2d61c66ffa614f66198 (patch)
tree2ea95f63fa77b33a46192543e76e0a9abe58c2a2
parent282bd32aac90f81520a4dd5cbb13053f6dbf6ed7 (diff)
fix bnc#624546 (fdo#83773) slide pane cut/copy/paste in outline view
Problem: When I'm in outline mode, if I select a slide in the left slide preview pane, ctrl-c, then select another slide I would like it after and hit ctrl-v; it refuses to cut/paste. Analysis: This issue is due to the fact that the outline view always grabs focus when activated and a view is activated whenever is pushed to the sfx shell stack even if it is not the new top-most active view shell (see `ViewShellManager`, `SfxViewShell`, `SfxDispacther`). Solution: Make the `OutlineViewShell` grabs focus only if it is the top-most active view shell. Rationale: When `OutlineViewShell::Activate` is invoked, instead of removing the focus grabbing action completely, we check if the `OutlineViewShell` instance is the the top-most view shell and perform the focus grabbing action only in such a case. This change required to have also the `DrawViewShell` grabbing focus on activation (only when it is the top-most view shell). In order to implement this solution I needed to add a new method (and data member) to the `ViewShellManager` class. I named it `GetTopViewShell`. This method returns a pointer to the top-most active view shell of the internal stack. The returned pointer is updated in the `UpdateShellStack` method, before the sfx shell stack is updated. For more details see : https://gist.github.com/mcecchetti/15b3ebc505d6582ea0db (cherry picked from commit 967a386bccb15b99915a1e878e42450fbe9a2d0e) Signed-off-by: Andras Timar <andras.timar@collabora.com> Conflicts: sd/source/ui/view/ViewShellManager.cxx Change-Id: I619a406864f50f0e62dee3fcb9ac5d46e3d48272
-rw-r--r--sd/source/ui/inc/ViewShellManager.hxx4
-rw-r--r--sd/source/ui/view/ViewShellManager.cxx24
-rw-r--r--sd/source/ui/view/drviews1.cxx9
-rw-r--r--sd/source/ui/view/outlview.cxx11
4 files changed, 42 insertions, 6 deletions
diff --git a/sd/source/ui/inc/ViewShellManager.hxx b/sd/source/ui/inc/ViewShellManager.hxx
index 18ac6ebfbfd6..926dbf880363 100644
--- a/sd/source/ui/inc/ViewShellManager.hxx
+++ b/sd/source/ui/inc/ViewShellManager.hxx
@@ -165,6 +165,10 @@ public:
*/
SfxShell* GetTopShell (void) const;
+ /** Return the top-most active view shell on the internal shell stack.
+ */
+ SfxShell* GetTopViewShell (void) const;
+
/** Use this class to safely lock updates of the view shell stack.
*/
class UpdateLock
diff --git a/sd/source/ui/view/ViewShellManager.cxx b/sd/source/ui/view/ViewShellManager.cxx
index bfb8ef893439..21c5aa5e417e 100644
--- a/sd/source/ui/view/ViewShellManager.cxx
+++ b/sd/source/ui/view/ViewShellManager.cxx
@@ -126,6 +126,7 @@ public:
void MoveToTop (const SfxShell& rParentShell);
SfxShell* GetShell (ShellId nId) const;
SfxShell* GetTopShell (void) const;
+ SfxShell* GetTopViewShell (void) const;
void Shutdown (void);
void InvalidateAllSubShells (const SfxShell* pParentShell);
@@ -203,6 +204,8 @@ private:
bool mbFormShellAboveParent;
SfxShell* mpTopShell;
+ SfxShell* mpTopViewShell;
+
void GatherActiveShells (ShellStack& rShellList);
@@ -386,8 +389,13 @@ SfxShell* ViewShellManager::GetTopShell (void) const
return NULL;
}
-
-
+SfxShell* ViewShellManager::GetTopViewShell (void) const
+{
+ if (mbValid)
+ return mpImpl->GetTopViewShell();
+ else
+ return NULL;
+}
void ViewShellManager::Shutdown (void)
{
@@ -431,7 +439,8 @@ ViewShellManager::Implementation::Implementation (
mpFormShell(NULL),
mpFormShellParent(NULL),
mbFormShellAboveParent(true),
- mpTopShell(NULL)
+ mpTopShell(NULL),
+ mpTopViewShell(NULL)
{
(void)rManager;
}
@@ -815,8 +824,10 @@ SfxShell* ViewShellManager::Implementation::GetTopShell (void) const
return mpTopShell;
}
-
-
+SfxShell* ViewShellManager::Implementation::GetTopViewShell (void) const
+{
+ return mpTopViewShell;
+}
void ViewShellManager::Implementation::LockUpdate (void)
{
@@ -867,6 +878,9 @@ void ViewShellManager::Implementation::UpdateShellStack (void)
// 1. Create the missing shells.
CreateShells();
+ // Update the pointer to the top-most active view shell.
+ mpTopViewShell = maActiveViewShells.begin()->mpShell;
+
// 2. Create the internal target stack.
ShellStack aTargetStack;
diff --git a/sd/source/ui/view/drviews1.cxx b/sd/source/ui/view/drviews1.cxx
index bffde5d6f88e..2c949bfcea57 100644
--- a/sd/source/ui/view/drviews1.cxx
+++ b/sd/source/ui/view/drviews1.cxx
@@ -91,6 +91,15 @@ namespace sd {
void DrawViewShell::Activate(sal_Bool bIsMDIActivate)
{
ViewShell::Activate(bIsMDIActivate);
+
+ // When the mode is switched to normal the main view shell grabs focus.
+ // This is done for getting cut/copy/paste commands on slides in the left
+ // pane (slide sorter view shell) to work properly.
+ SfxShell* pTopViewShell = this->GetViewShellBase().GetViewShellManager()->GetTopViewShell();
+ if (pTopViewShell && pTopViewShell == this)
+ {
+ this->GetActiveWindow()->GrabFocus();
+ }
}
void DrawViewShell::UIActivating( SfxInPlaceClient* pCli )
diff --git a/sd/source/ui/view/outlview.cxx b/sd/source/ui/view/outlview.cxx
index cd78739dfaac..f8f97bffc26c 100644
--- a/sd/source/ui/view/outlview.cxx
+++ b/sd/source/ui/view/outlview.cxx
@@ -65,6 +65,7 @@
#include "strings.hrc"
#include "EventMultiplexer.hxx"
#include "ViewShellBase.hxx"
+#include "ViewShellManager.hxx"
#include "undo/undoobjects.hxx"
#include "undo/undomanager.hxx"
#include "stlsheet.hxx"
@@ -208,7 +209,15 @@ OutlineView::~OutlineView()
void OutlineView::ConnectToApplication (void)
{
- mrOutlineViewShell.GetActiveWindow()->GrabFocus();
+ // When the mode is switched to outline the main view shell grabs focus.
+ // This is done for getting cut/copy/paste commands on slides in the left
+ // pane (slide sorter view shell) to work properly.
+ SfxShell* pTopViewShell = mrOutlineViewShell.GetViewShellBase().GetViewShellManager()->GetTopViewShell();
+ if (pTopViewShell && pTopViewShell == &mrOutlineViewShell)
+ {
+ mrOutlineViewShell.GetActiveWindow()->GrabFocus();
+ }
+
Application::AddEventListener(LINK(this, OutlineView, AppEventListenerHdl));
}