[Libreoffice-commits] core.git: 2 commits - framework/source officecfg/registry sc/inc sc/sdi sc/source sc/uiconfig sc/UIConfig_scalc.mk

Maxim Monastirsky momonasmon at gmail.com
Wed Feb 17 11:03:12 UTC 2016


 framework/source/uielement/popuptoolbarcontroller.cxx             |   13 -
 officecfg/registry/data/org/openoffice/Office/UI/CalcCommands.xcu |   16 +
 officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu   |   28 ++
 sc/UIConfig_scalc.mk                                              |    1 
 sc/inc/sc.hrc                                                     |    2 
 sc/sdi/scalc.sdi                                                  |   33 ++
 sc/sdi/tabvwsh.sdi                                                |    2 
 sc/source/ui/inc/tabview.hxx                                      |    4 
 sc/source/ui/view/tabview.cxx                                     |  114 ++++++----
 sc/source/ui/view/tabvwsh3.cxx                                    |   10 
 sc/uiconfig/scalc/menubar/menubar.xml                             |    2 
 sc/uiconfig/scalc/popupmenu/freezepanes.xml                       |   13 +
 12 files changed, 191 insertions(+), 47 deletions(-)

New commits:
commit c3a2fa08763fb38e9325e609420db2f70e428cf0
Author: Maxim Monastirsky <momonasmon at gmail.com>
Date:   Wed Feb 17 11:52:17 2016 +0200

    tdf#91013 Convert freezepanes menu to xml
    
    Change-Id: Iedab5e5be5358f7716a2b33de3f0db582a401155

diff --git a/framework/Library_fwk.mk b/framework/Library_fwk.mk
index f9aed1f..0c78fc4 100644
--- a/framework/Library_fwk.mk
+++ b/framework/Library_fwk.mk
@@ -144,7 +144,6 @@ $(eval $(call gb_Library_add_exception_objects,fwk,\
     framework/source/uielement/popuptoolbarcontroller \
     framework/source/uielement/progressbarwrapper \
     framework/source/uielement/recentfilesmenucontroller \
-    framework/source/uielement/freezepanesmenucontroller \
     framework/source/uielement/resourcemenucontroller \
     framework/source/uielement/saveasmenucontroller \
     framework/source/uielement/spinfieldtoolbarcontroller \
diff --git a/framework/source/uielement/freezepanesmenucontroller.cxx b/framework/source/uielement/freezepanesmenucontroller.cxx
deleted file mode 100644
index 9d4cd1b..0000000
--- a/framework/source/uielement/freezepanesmenucontroller.cxx
+++ /dev/null
@@ -1,104 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- *   Licensed to the Apache Software Foundation (ASF) under one or more
- *   contributor license agreements. See the NOTICE file distributed
- *   with this work for additional information regarding copyright
- *   ownership. The ASF licenses this file to you under the Apache
- *   License, Version 2.0 (the "License"); you may not use this file
- *   except in compliance with the License. You may obtain a copy of
- *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
- */
-
-#include <cppuhelper/supportsservice.hxx>
-#include <svtools/popupmenucontrollerbase.hxx>
-#include <vcl/menu.hxx>
-#include <vcl/svapp.hxx>
-
-using namespace css;
-using namespace com::sun::star::uno;
-using namespace com::sun::star::frame;
-
-namespace {
-
-class FreezePanesMenuController :  public svt::PopupMenuControllerBase
-{
-public:
-    explicit FreezePanesMenuController( const uno::Reference< uno::XComponentContext >& xContext );
-    virtual ~FreezePanesMenuController();
-
-    // XServiceInfo
-    virtual OUString SAL_CALL getImplementationName()
-        throw (css::uno::RuntimeException, std::exception) override
-    {
-        return OUString("com.sun.star.comp.framework.FreezePanesMenuController");
-    }
-
-    virtual sal_Bool SAL_CALL supportsService(OUString const & ServiceName)
-        throw (css::uno::RuntimeException, std::exception) override
-    {
-        return cppu::supportsService(this, ServiceName);
-    }
-
-    virtual css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames()
-        throw (css::uno::RuntimeException, std::exception) override
-    {
-        css::uno::Sequence< OUString > aSeq { "com.sun.star.frame.PopupMenuController" };
-        return aSeq;
-    }
-
-    // XStatusListener
-    virtual void SAL_CALL statusChanged( const frame::FeatureStateEvent& Event ) throw ( uno::RuntimeException, std::exception ) override;
-
-private:
-    virtual void impl_setPopupMenu() override;
-};
-
-FreezePanesMenuController::FreezePanesMenuController( const uno::Reference< uno::XComponentContext >& xContext ) :
-    svt::PopupMenuControllerBase( xContext )
-{
-}
-
-FreezePanesMenuController::~FreezePanesMenuController()
-{
-}
-
-void FreezePanesMenuController::impl_setPopupMenu()
-{
-    VCLXMenu* pPopupMenu    = VCLXMenu::GetImplementation( m_xPopupMenu );
-    Menu*     pVCLPopupMenu = nullptr;
-
-    SolarMutexGuard aSolarMutexGuard;
-
-    if ( pPopupMenu )
-        pVCLPopupMenu = pPopupMenu->GetMenu();
-
-    if ( pVCLPopupMenu )
-    {
-        pVCLPopupMenu->InsertItem( ".uno:FreezePanesFirstColumn", m_xFrame );
-        pVCLPopupMenu->InsertItem( ".uno:FreezePanesFirstRow", m_xFrame );
-    }
-}
-
-// XStatusListener
-void SAL_CALL FreezePanesMenuController::statusChanged( const FeatureStateEvent& /*Event*/ ) throw ( RuntimeException, std::exception )
-{
-}
-
-extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface * SAL_CALL
-com_sun_star_comp_framework_FreezePanesMenuController_get_implementation(
-    css::uno::XComponentContext *context,
-    css::uno::Sequence<css::uno::Any> const &)
-{
-    return cppu::acquire(new FreezePanesMenuController(context));
-}
-
-}
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/framework/util/fwk.component b/framework/util/fwk.component
index f6ae482..f14fbe4 100644
--- a/framework/util/fwk.component
+++ b/framework/util/fwk.component
@@ -121,10 +121,6 @@
       constructor="com_sun_star_comp_framework_SaveAsMenuController_get_implementation">
     <service name="com.sun.star.frame.PopupMenuController"/>
   </implementation>
-  <implementation name="com.sun.star.comp.framework.FreezePanesMenuController"
-      constructor="com_sun_star_comp_framework_FreezePanesMenuController_get_implementation">
-    <service name="com.sun.star.frame.PopupMenuController"/>
-  </implementation>
   <implementation name="com.sun.star.comp.framework.StatusBarControllerFactory"
       constructor="com_sun_star_comp_framework_StatusBarControllerFactory_get_implementation">
     <service name="com.sun.star.frame.StatusbarControllerFactory"/>
diff --git a/officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu b/officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu
index b994e80..267177e 100644
--- a/officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu
+++ b/officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu
@@ -310,10 +310,13 @@
           <value>.uno:FreezePanesMenu</value>
         </prop>
         <prop oor:name="Module">
-          <value/>
+          <value>com.sun.star.sheet.SpreadsheetDocument</value>
         </prop>
         <prop oor:name="Controller">
-          <value>com.sun.star.comp.framework.FreezePanesMenuController</value>
+          <value>com.sun.star.comp.framework.ResourceMenuController</value>
+        </prop>
+        <prop oor:name="Value">
+          <value>freezepanes</value>
         </prop>
       </node>
     </node>
@@ -1070,7 +1073,7 @@
           <value>.uno:FreezePanes</value>
         </prop>
         <prop oor:name="Module">
-          <value/>
+          <value>com.sun.star.sheet.SpreadsheetDocument</value>
         </prop>
         <prop oor:name="Controller">
           <value>com.sun.star.comp.framework.GenericPopupToolbarController</value>
diff --git a/sc/UIConfig_scalc.mk b/sc/UIConfig_scalc.mk
index 968323b..4d92e3c 100644
--- a/sc/UIConfig_scalc.mk
+++ b/sc/UIConfig_scalc.mk
@@ -29,6 +29,7 @@ $(eval $(call gb_UIConfig_add_popupmenufiles,modules/scalc,\
 	sc/uiconfig/scalc/popupmenu/draw \
 	sc/uiconfig/scalc/popupmenu/drawtext \
 	sc/uiconfig/scalc/popupmenu/form \
+	sc/uiconfig/scalc/popupmenu/freezepanes \
 	sc/uiconfig/scalc/popupmenu/graphic \
 	sc/uiconfig/scalc/popupmenu/media \
 	sc/uiconfig/scalc/popupmenu/oleobject \
diff --git a/sc/uiconfig/scalc/popupmenu/freezepanes.xml b/sc/uiconfig/scalc/popupmenu/freezepanes.xml
new file mode 100644
index 0000000..cc6d314
--- /dev/null
+++ b/sc/uiconfig/scalc/popupmenu/freezepanes.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+  <menu:menuitem menu:id=".uno:FreezePanesFirstColumn"/>
+  <menu:menuitem menu:id=".uno:FreezePanesFirstRow"/>
+</menu:menupopup>
commit a009ba2b8ed7ead021ecc3356a477a08e72d2191
Author: Gulsah Kose <gulsah.1004 at gmail.com>
Date:   Tue Jan 19 16:32:18 2016 +0200

    tdf#91013 Add new uno commands to freeze one row and column.
    
    Added freezepanesfirstcolumn and freezepanesfirstrow commands.
    FreezePanes button became a split button that includes this two new
    uno commands. And this new commands added to menu.
    
    Change-Id: Ic6958067cc98b3df50bcd06a1eac220bd9a61473
    Reviewed-on: https://gerrit.libreoffice.org/21604
    Signed-off-by: Gulsah Kose <gulsah.1004 at gmail.com>

diff --git a/framework/Library_fwk.mk b/framework/Library_fwk.mk
index 0c78fc4..f9aed1f 100644
--- a/framework/Library_fwk.mk
+++ b/framework/Library_fwk.mk
@@ -144,6 +144,7 @@ $(eval $(call gb_Library_add_exception_objects,fwk,\
     framework/source/uielement/popuptoolbarcontroller \
     framework/source/uielement/progressbarwrapper \
     framework/source/uielement/recentfilesmenucontroller \
+    framework/source/uielement/freezepanesmenucontroller \
     framework/source/uielement/resourcemenucontroller \
     framework/source/uielement/saveasmenucontroller \
     framework/source/uielement/spinfieldtoolbarcontroller \
diff --git a/framework/source/uielement/freezepanesmenucontroller.cxx b/framework/source/uielement/freezepanesmenucontroller.cxx
new file mode 100644
index 0000000..9d4cd1b
--- /dev/null
+++ b/framework/source/uielement/freezepanesmenucontroller.cxx
@@ -0,0 +1,104 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ *   Licensed to the Apache Software Foundation (ASF) under one or more
+ *   contributor license agreements. See the NOTICE file distributed
+ *   with this work for additional information regarding copyright
+ *   ownership. The ASF licenses this file to you under the Apache
+ *   License, Version 2.0 (the "License"); you may not use this file
+ *   except in compliance with the License. You may obtain a copy of
+ *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include <cppuhelper/supportsservice.hxx>
+#include <svtools/popupmenucontrollerbase.hxx>
+#include <vcl/menu.hxx>
+#include <vcl/svapp.hxx>
+
+using namespace css;
+using namespace com::sun::star::uno;
+using namespace com::sun::star::frame;
+
+namespace {
+
+class FreezePanesMenuController :  public svt::PopupMenuControllerBase
+{
+public:
+    explicit FreezePanesMenuController( const uno::Reference< uno::XComponentContext >& xContext );
+    virtual ~FreezePanesMenuController();
+
+    // XServiceInfo
+    virtual OUString SAL_CALL getImplementationName()
+        throw (css::uno::RuntimeException, std::exception) override
+    {
+        return OUString("com.sun.star.comp.framework.FreezePanesMenuController");
+    }
+
+    virtual sal_Bool SAL_CALL supportsService(OUString const & ServiceName)
+        throw (css::uno::RuntimeException, std::exception) override
+    {
+        return cppu::supportsService(this, ServiceName);
+    }
+
+    virtual css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames()
+        throw (css::uno::RuntimeException, std::exception) override
+    {
+        css::uno::Sequence< OUString > aSeq { "com.sun.star.frame.PopupMenuController" };
+        return aSeq;
+    }
+
+    // XStatusListener
+    virtual void SAL_CALL statusChanged( const frame::FeatureStateEvent& Event ) throw ( uno::RuntimeException, std::exception ) override;
+
+private:
+    virtual void impl_setPopupMenu() override;
+};
+
+FreezePanesMenuController::FreezePanesMenuController( const uno::Reference< uno::XComponentContext >& xContext ) :
+    svt::PopupMenuControllerBase( xContext )
+{
+}
+
+FreezePanesMenuController::~FreezePanesMenuController()
+{
+}
+
+void FreezePanesMenuController::impl_setPopupMenu()
+{
+    VCLXMenu* pPopupMenu    = VCLXMenu::GetImplementation( m_xPopupMenu );
+    Menu*     pVCLPopupMenu = nullptr;
+
+    SolarMutexGuard aSolarMutexGuard;
+
+    if ( pPopupMenu )
+        pVCLPopupMenu = pPopupMenu->GetMenu();
+
+    if ( pVCLPopupMenu )
+    {
+        pVCLPopupMenu->InsertItem( ".uno:FreezePanesFirstColumn", m_xFrame );
+        pVCLPopupMenu->InsertItem( ".uno:FreezePanesFirstRow", m_xFrame );
+    }
+}
+
+// XStatusListener
+void SAL_CALL FreezePanesMenuController::statusChanged( const FeatureStateEvent& /*Event*/ ) throw ( RuntimeException, std::exception )
+{
+}
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface * SAL_CALL
+com_sun_star_comp_framework_FreezePanesMenuController_get_implementation(
+    css::uno::XComponentContext *context,
+    css::uno::Sequence<css::uno::Any> const &)
+{
+    return cppu::acquire(new FreezePanesMenuController(context));
+}
+
+}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/framework/source/uielement/popuptoolbarcontroller.cxx b/framework/source/uielement/popuptoolbarcontroller.cxx
index 8296dac..28f7aff 100644
--- a/framework/source/uielement/popuptoolbarcontroller.cxx
+++ b/framework/source/uielement/popuptoolbarcontroller.cxx
@@ -169,10 +169,15 @@ throw ( css::uno::Exception, css::uno::RuntimeException, std::exception )
 void SAL_CALL PopupMenuToolbarController::statusChanged( const css::frame::FeatureStateEvent& rEvent )
     throw ( css::uno::RuntimeException, std::exception )
 {
-    // TODO move to base class
-
-    svt::ToolboxController::statusChanged( rEvent );
-    enable( rEvent.IsEnabled );
+    ToolBox* pToolBox = nullptr;
+    sal_uInt16 nItemId = 0;
+    if ( getToolboxId( nItemId, &pToolBox ) )
+    {
+        pToolBox->EnableItem( nItemId, rEvent.IsEnabled );
+        bool bValue;
+        if ( rEvent.State >>= bValue )
+            pToolBox->CheckItem( nItemId, bValue );
+    }
 }
 
 css::uno::Reference< css::awt::XWindow > SAL_CALL
diff --git a/framework/util/fwk.component b/framework/util/fwk.component
index f14fbe4..f6ae482 100644
--- a/framework/util/fwk.component
+++ b/framework/util/fwk.component
@@ -121,6 +121,10 @@
       constructor="com_sun_star_comp_framework_SaveAsMenuController_get_implementation">
     <service name="com.sun.star.frame.PopupMenuController"/>
   </implementation>
+  <implementation name="com.sun.star.comp.framework.FreezePanesMenuController"
+      constructor="com_sun_star_comp_framework_FreezePanesMenuController_get_implementation">
+    <service name="com.sun.star.frame.PopupMenuController"/>
+  </implementation>
   <implementation name="com.sun.star.comp.framework.StatusBarControllerFactory"
       constructor="com_sun_star_comp_framework_StatusBarControllerFactory_get_implementation">
     <service name="com.sun.star.frame.StatusbarControllerFactory"/>
diff --git a/officecfg/registry/data/org/openoffice/Office/UI/CalcCommands.xcu b/officecfg/registry/data/org/openoffice/Office/UI/CalcCommands.xcu
index 8f4d911..df6cfe1 100644
--- a/officecfg/registry/data/org/openoffice/Office/UI/CalcCommands.xcu
+++ b/officecfg/registry/data/org/openoffice/Office/UI/CalcCommands.xcu
@@ -73,6 +73,22 @@
           <value>1</value>
         </prop>
       </node>
+      <node oor:name=".uno:FreezePanesFirstColumn" oor:op="replace">
+        <prop oor:name="Label" oor:type="xs:string">
+          <value xml:lang="en-US">Freeze First Column</value>
+        </prop>
+        <prop oor:name="Properties" oor:type="xs:int">
+          <value>1</value>
+        </prop>
+      </node>
+      <node oor:name=".uno:FreezePanesFirstRow" oor:op="replace">
+        <prop oor:name="Label" oor:type="xs:string">
+          <value xml:lang="en-US">Freeze First Row</value>
+        </prop>
+        <prop oor:name="Properties" oor:type="xs:int">
+          <value>1</value>
+        </prop>
+      </node>
       <node oor:name=".uno:ShowErrors" oor:op="replace">
         <prop oor:name="Label" oor:type="xs:string">
           <value xml:lang="en-US">Trace ~Error</value>
diff --git a/officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu b/officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu
index 4df10e2..b994e80 100644
--- a/officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu
+++ b/officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu
@@ -305,6 +305,17 @@
           <value>conditional</value>
         </prop>
       </node>
+      <node oor:name="c26" oor:op="replace">
+        <prop oor:name="Command">
+          <value>.uno:FreezePanesMenu</value>
+        </prop>
+        <prop oor:name="Module">
+          <value/>
+        </prop>
+        <prop oor:name="Controller">
+          <value>com.sun.star.comp.framework.FreezePanesMenuController</value>
+        </prop>
+      </node>
     </node>
     <node oor:name="ToolBar">
       <node oor:name="ZoomToolBox" oor:op="replace">
@@ -1054,6 +1065,20 @@
           <value>com.sun.star.comp.framework.SaveToolbarController</value>
         </prop>
       </node>
+      <node oor:name="FreezePanesToolbarController" oor:op="replace">
+        <prop oor:name="Command">
+          <value>.uno:FreezePanes</value>
+        </prop>
+        <prop oor:name="Module">
+          <value/>
+        </prop>
+        <prop oor:name="Controller">
+          <value>com.sun.star.comp.framework.GenericPopupToolbarController</value>
+        </prop>
+        <prop oor:name="Value">
+          <value>.uno:FreezePanesMenu</value>
+        </prop>
+      </node>
       <node oor:name="org.apache.openoffice.comp.framework.NewToolbarController" oor:op="replace">
         <prop oor:name="Command">
           <value>.uno:AddDirect</value>
diff --git a/sc/inc/sc.hrc b/sc/inc/sc.hrc
index 52e34ce..8395c23 100644
--- a/sc/inc/sc.hrc
+++ b/sc/inc/sc.hrc
@@ -275,6 +275,8 @@
 #define SID_ZTEST_DIALOG                    (SC_MESSAGE_START + 81)
 #define SID_CHI_SQUARE_TEST_DIALOG          (SC_MESSAGE_START + 82)
 #define SID_SEARCH_RESULTS_DIALOG           (SC_MESSAGE_START + 83)
+#define SID_WINDOW_FIX_ROW                  (SC_MESSAGE_START + 84)
+#define SID_WINDOW_FIX_COL                  (SC_MESSAGE_START + 85)
 
 // functions
 
diff --git a/sc/sdi/scalc.sdi b/sc/sdi/scalc.sdi
index 7193916..853bc79 100644
--- a/sc/sdi/scalc.sdi
+++ b/sc/sdi/scalc.sdi
@@ -2080,6 +2080,39 @@ SfxVoidItem FreezePanes SID_WINDOW_FIX
     GroupId = GID_VIEW;
 ]
 
+SfxVoidItem FreezePanesFirstColumn SID_WINDOW_FIX_COL
+()
+[
+    AutoUpdate = FALSE,
+    FastCall = FALSE,
+    ReadOnlyDoc = TRUE,
+    Toggle = FALSE,
+    Container = FALSE,
+    RecordAbsolute = FALSE,
+    RecordPerSet;
+
+    AccelConfig = TRUE,
+    MenuConfig = TRUE,
+    ToolBoxConfig = TRUE,
+    GroupId = GID_VIEW;
+]
+
+SfxVoidItem FreezePanesFirstRow SID_WINDOW_FIX_ROW
+()
+[
+    AutoUpdate = FALSE,
+    FastCall = FALSE,
+    ReadOnlyDoc = TRUE,
+    Toggle = FALSE,
+    Container = FALSE,
+    RecordAbsolute = FALSE,
+    RecordPerSet;
+
+    AccelConfig = TRUE,
+    MenuConfig = TRUE,
+    ToolBoxConfig = TRUE,
+    GroupId = GID_VIEW;
+]
 
 SfxVoidItem FunctionBox FID_FUNCTION_BOX
 
diff --git a/sc/sdi/tabvwsh.sdi b/sc/sdi/tabvwsh.sdi
index e2becfb..3a25e81 100644
--- a/sc/sdi/tabvwsh.sdi
+++ b/sc/sdi/tabvwsh.sdi
@@ -131,6 +131,8 @@ interface TableEditView
         SID_CURRENTDOC      [ ExecMethod = Execute; StateMethod = GetState; ]
     SID_WINDOW_SPLIT    [ ExecMethod = Execute; StateMethod = GetState; ]
     SID_WINDOW_FIX      [ ExecMethod = Execute; StateMethod = GetState; ]
+    SID_WINDOW_FIX_ROW  [ ExecMethod = Execute; ]
+    SID_WINDOW_FIX_COL  [ ExecMethod = Execute; ]
     SID_SAVEDOC
     [
         ExecMethod = ExecuteSave ;
diff --git a/sc/source/ui/inc/tabview.hxx b/sc/source/ui/inc/tabview.hxx
index 23b97ed..5e7d9c7 100644
--- a/sc/source/ui/inc/tabview.hxx
+++ b/sc/source/ui/inc/tabview.hxx
@@ -229,6 +229,8 @@ public:
                     ScTabView( vcl::Window* pParent, ScDocShell& rDocSh, ScTabViewShell* pViewShell );
                     ~ScTabView();
 
+    enum SplitMethod { SC_SPLIT_METHOD_FIRST_COL, SC_SPLIT_METHOD_FIRST_ROW, SC_SPLIT_METHOD_CURSOR };
+
     void            MakeDrawLayer();
 
     void            HideListBox();
@@ -494,7 +496,7 @@ public:
 
     Point           GetMousePosPixel();
 
-    void            FreezeSplitters( bool bFreeze );
+    void            FreezeSplitters( bool bFreeze, SplitMethod eSplitMethod = SC_SPLIT_METHOD_CURSOR );
     void            RemoveSplit();
     void            SplitAtCursor();
     void            SplitAtPixel( const Point& rPixel, bool bHor, bool bVer );
diff --git a/sc/source/ui/view/tabview.cxx b/sc/source/ui/view/tabview.cxx
index 9895bb7..7918516 100644
--- a/sc/source/ui/view/tabview.cxx
+++ b/sc/source/ui/view/tabview.cxx
@@ -1931,7 +1931,7 @@ Point ScTabView::GetMousePosPixel()
     return aPos;
 }
 
-void ScTabView::FreezeSplitters( bool bFreeze )
+void ScTabView::FreezeSplitters( bool bFreeze, SplitMethod eSplitMetod)
 {
     ScSplitMode eOldH = aViewData.GetHSplitMode();
     ScSplitMode eOldV = aViewData.GetVSplitMode();
@@ -1949,19 +1949,20 @@ void ScTabView::FreezeSplitters( bool bFreeze )
         aViewData.GetDocShell()->SetDocumentModified();
 
         Point aSplit;
-        SCsCOL nPosX;
-        SCsROW nPosY;
-        if (eOldH != SC_SPLIT_NONE || eOldV != SC_SPLIT_NONE)
+        SCsCOL nPosX = 1;
+        SCsROW nPosY = 1;
+        if (eOldV != SC_SPLIT_NONE || eOldH != SC_SPLIT_NONE)
         {
-            if (eOldH != SC_SPLIT_NONE)
+            if ( eOldV != SC_SPLIT_NONE && (eSplitMetod == SC_SPLIT_METHOD_FIRST_ROW || eSplitMetod == SC_SPLIT_METHOD_CURSOR))
+                aSplit.Y() = aViewData.GetVSplitPos() - aWinStart.Y();
+
+            if ( eOldH != SC_SPLIT_NONE && (eSplitMetod == SC_SPLIT_METHOD_FIRST_COL || eSplitMetod == SC_SPLIT_METHOD_CURSOR))
             {
                 long nSplitPos = aViewData.GetHSplitPos();
                 if ( bLayoutRTL )
                     nSplitPos = pFrameWin->GetOutputSizePixel().Width() - nSplitPos - 1;
                 aSplit.X() = nSplitPos - aWinStart.X();
             }
-            if (eOldV != SC_SPLIT_NONE)
-                aSplit.Y() = aViewData.GetVSplitPos() - aWinStart.Y();
 
             aViewData.GetPosFromPixel( aSplit.X(), aSplit.Y(), ePos, nPosX, nPosY );
             bool bLeft;
@@ -1974,51 +1975,80 @@ void ScTabView::FreezeSplitters( bool bFreeze )
         }
         else
         {
-            nPosX = static_cast<SCsCOL>( aViewData.GetCurX());
-            nPosY = static_cast<SCsROW>( aViewData.GetCurY());
+            switch(eSplitMetod)
+            {
+                case SC_SPLIT_METHOD_FIRST_ROW:
+                {
+                    nPosX = 0;
+                    nPosY = 1;
+                }
+                break;
+                case SC_SPLIT_METHOD_FIRST_COL:
+                {
+                    nPosX = 1;
+                    nPosY = 0;
+                }
+                break;
+                case SC_SPLIT_METHOD_CURSOR:
+                {
+                    nPosX = static_cast<SCsCOL>( aViewData.GetCurX());
+                    nPosY = static_cast<SCsROW>( aViewData.GetCurY());
+                }
+                break;
+            }
         }
 
-        SCCOL nLeftPos = aViewData.GetPosX(SC_SPLIT_LEFT);
         SCROW nTopPos = aViewData.GetPosY(SC_SPLIT_BOTTOM);
-        SCCOL nRightPos = static_cast<SCCOL>(nPosX);
         SCROW nBottomPos = static_cast<SCROW>(nPosY);
-        if (eOldH != SC_SPLIT_NONE)
-            if (aViewData.GetPosX(SC_SPLIT_RIGHT) > nRightPos)
-                nRightPos = aViewData.GetPosX(SC_SPLIT_RIGHT);
-        if (eOldV != SC_SPLIT_NONE)
+        SCCOL nLeftPos = aViewData.GetPosX(SC_SPLIT_LEFT);
+        SCCOL nRightPos = static_cast<SCCOL>(nPosX);
+
+        if (eSplitMetod == SC_SPLIT_METHOD_FIRST_ROW || eSplitMetod == SC_SPLIT_METHOD_CURSOR)
         {
-            nTopPos = aViewData.GetPosY(SC_SPLIT_TOP);
-            if (aViewData.GetPosY(SC_SPLIT_BOTTOM) > nBottomPos)
-                nBottomPos = aViewData.GetPosY(SC_SPLIT_BOTTOM);
+             if (eOldV != SC_SPLIT_NONE)
+             {
+                 nTopPos = aViewData.GetPosY(SC_SPLIT_TOP);
+                 if (aViewData.GetPosY(SC_SPLIT_BOTTOM) > nBottomPos)
+                     nBottomPos = aViewData.GetPosY(SC_SPLIT_BOTTOM);
+             }
+             aSplit = aViewData.GetScrPos( static_cast<SCCOL>(nPosX), static_cast<SCROW>(nPosY), ePos, true );
+             if (aSplit.Y() > 0)
+             {
+                 aViewData.SetVSplitMode( SC_SPLIT_FIX );
+                 aViewData.SetVSplitPos( aSplit.Y() + aWinStart.Y() );
+                 aViewData.SetFixPosY( nPosY );
+
+                 aViewData.SetPosY(SC_SPLIT_TOP, nTopPos);
+                 aViewData.SetPosY(SC_SPLIT_BOTTOM, nBottomPos);
+             }
+             else
+                 aViewData.SetVSplitMode( SC_SPLIT_NONE );
         }
 
-        aSplit = aViewData.GetScrPos( static_cast<SCCOL>(nPosX), static_cast<SCROW>(nPosY), ePos, true );
-        if (nPosX > aViewData.GetPosX(SC_SPLIT_LEFT))       // (aSplit.X() > 0) doesn't work for RTL
+        if (eSplitMetod == SC_SPLIT_METHOD_FIRST_COL || eSplitMetod == SC_SPLIT_METHOD_CURSOR)
         {
-            long nSplitPos = aSplit.X() + aWinStart.X();
-            if ( bLayoutRTL )
-                nSplitPos = pFrameWin->GetOutputSizePixel().Width() - nSplitPos - 1;
-
-            aViewData.SetHSplitMode( SC_SPLIT_FIX );
-            aViewData.SetHSplitPos( nSplitPos );
-            aViewData.SetFixPosX( nPosX );
+            if (eOldH != SC_SPLIT_NONE)
+            {
+                if (aViewData.GetPosX(SC_SPLIT_RIGHT) > nRightPos)
+                    nRightPos = aViewData.GetPosX(SC_SPLIT_RIGHT);
+            }
+            aSplit = aViewData.GetScrPos( static_cast<SCCOL>(nPosX), static_cast<SCROW>(nPosY), ePos, true );
+            if (nPosX > aViewData.GetPosX(SC_SPLIT_LEFT))       // (aSplit.X() > 0) doesn't work for RTL
+            {
+                long nSplitPos = aSplit.X() + aWinStart.X();
+                if ( bLayoutRTL )
+                    nSplitPos = pFrameWin->GetOutputSizePixel().Width() - nSplitPos - 1;
 
-            aViewData.SetPosX(SC_SPLIT_LEFT, nLeftPos);
-            aViewData.SetPosX(SC_SPLIT_RIGHT, nRightPos);
-        }
-        else
-            aViewData.SetHSplitMode( SC_SPLIT_NONE );
-        if (aSplit.Y() > 0)
-        {
-            aViewData.SetVSplitMode( SC_SPLIT_FIX );
-            aViewData.SetVSplitPos( aSplit.Y() + aWinStart.Y() );
-            aViewData.SetFixPosY( nPosY );
+                aViewData.SetHSplitMode( SC_SPLIT_FIX );
+                aViewData.SetHSplitPos( nSplitPos );
+                aViewData.SetFixPosX( nPosX );
 
-            aViewData.SetPosY(SC_SPLIT_TOP, nTopPos);
-            aViewData.SetPosY(SC_SPLIT_BOTTOM, nBottomPos);
+                aViewData.SetPosX(SC_SPLIT_LEFT, nLeftPos);
+                aViewData.SetPosX(SC_SPLIT_RIGHT, nRightPos);
+            }
+            else
+                aViewData.SetHSplitMode( SC_SPLIT_NONE );
         }
-        else
-            aViewData.SetVSplitMode( SC_SPLIT_NONE );
     }
     else                        // unfreeze
     {
@@ -2104,6 +2134,8 @@ void ScTabView::InvalidateSplit()
     SfxBindings& rBindings = aViewData.GetBindings();
     rBindings.Invalidate( SID_WINDOW_SPLIT );
     rBindings.Invalidate( SID_WINDOW_FIX );
+    rBindings.Invalidate( SID_WINDOW_FIX_COL );
+    rBindings.Invalidate( SID_WINDOW_FIX_ROW );
 
     pHSplitter->SetFixed( aViewData.GetHSplitMode() == SC_SPLIT_FIX );
     pVSplitter->SetFixed( aViewData.GetVSplitMode() == SC_SPLIT_FIX );
diff --git a/sc/source/ui/view/tabvwsh3.cxx b/sc/source/ui/view/tabvwsh3.cxx
index 606755a..4ea02a9 100644
--- a/sc/source/ui/view/tabvwsh3.cxx
+++ b/sc/source/ui/view/tabvwsh3.cxx
@@ -896,13 +896,21 @@ void ScTabViewShell::Execute( SfxRequest& rReq )
             break;
 
         case SID_WINDOW_FIX:
+        case SID_WINDOW_FIX_COL:
+        case SID_WINDOW_FIX_ROW:
             {
+                SplitMethod eSplitMethod = SC_SPLIT_METHOD_CURSOR;
+                if (nSlot == SID_WINDOW_FIX_COL)
+                    eSplitMethod = SC_SPLIT_METHOD_FIRST_COL;
+                else if (nSlot == SID_WINDOW_FIX_ROW)
+                    eSplitMethod = SC_SPLIT_METHOD_FIRST_ROW;
+
                 ScSplitMode eHSplit = GetViewData().GetHSplitMode();
                 ScSplitMode eVSplit = GetViewData().GetVSplitMode();
                 if ( eHSplit == SC_SPLIT_FIX || eVSplit == SC_SPLIT_FIX )           // remove
                     RemoveSplit();
                 else
-                    FreezeSplitters( true );        // create or fixate
+                    FreezeSplitters( true, eSplitMethod);        // create or fixate
                 rReq.Done();
 
                 InvalidateSplit();
diff --git a/sc/uiconfig/scalc/menubar/menubar.xml b/sc/uiconfig/scalc/menubar/menubar.xml
index 0a71016..0759278 100644
--- a/sc/uiconfig/scalc/menubar/menubar.xml
+++ b/sc/uiconfig/scalc/menubar/menubar.xml
@@ -120,6 +120,8 @@
             <menu:menuitem menu:id=".uno:ViewValueHighlighting"/>
             <menu:menuseparator/>
             <menu:menuitem menu:id=".uno:FreezePanes"/>
+            <menu:menuitem menu:id=".uno:FreezePanesFirstColumn"/>
+            <menu:menuitem menu:id=".uno:FreezePanesFirstRow"/>
             <menu:menuitem menu:id=".uno:SplitWindow"/>
             <menu:menuseparator/>
             <menu:menuitem menu:id=".uno:Sidebar"/>


More information about the Libreoffice-commits mailing list