[Libreoffice-commits] .: Branch 'feature/cmclayout' - vcl/inc vcl/qa vcl/source

Caolán McNamara caolan at kemper.freedesktop.org
Wed Mar 28 06:57:13 PDT 2012


 vcl/inc/vcl/window.hxx         |    2 
 vcl/qa/cppunit/builder/demo.ui |  116 ++++++++++++++++++++---------------------
 vcl/source/window/builder.cxx  |   21 +++++++
 vcl/source/window/window.cxx   |   32 +++++++++++
 4 files changed, 113 insertions(+), 58 deletions(-)

New commits:
commit 43b1a06faf7bde3e04be95f6e6c35bd3926da52e
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Wed Mar 28 14:10:13 2012 +0100

    allow reordering widget according to packing::position

diff --git a/vcl/inc/vcl/window.hxx b/vcl/inc/vcl/window.hxx
index d6028b7..625e9f5 100644
--- a/vcl/inc/vcl/window.hxx
+++ b/vcl/inc/vcl/window.hxx
@@ -1098,6 +1098,8 @@ public:
         return nValue;
     }
 
+    void reorderWithinParent(sal_uInt16 nNewPosition);
+
     //-------------------------------------
     //  Native Widget Rendering functions
     //-------------------------------------
diff --git a/vcl/qa/cppunit/builder/demo.ui b/vcl/qa/cppunit/builder/demo.ui
index 786ad76..044a45e 100644
--- a/vcl/qa/cppunit/builder/demo.ui
+++ b/vcl/qa/cppunit/builder/demo.ui
@@ -49,64 +49,6 @@
             <property name="position">0</property>
           </packing>
         </child>
-        <child>
-          <object class="GtkBox" id="box2">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <child>
-              <object class="GtkButton" id="button3">
-                <property name="label" translatable="yes">button</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="use_action_appearance">False</property>
-              </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">True</property>
-                <property name="position">0</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkRadioButton" id="radiobutton1">
-                <property name="label" translatable="yes">radiobutton</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">False</property>
-                <property name="use_action_appearance">False</property>
-                <property name="xalign">0</property>
-                <property name="active">True</property>
-                <property name="draw_indicator">True</property>
-              </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">True</property>
-                <property name="position">1</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkCheckButton" id="checkbutton1">
-                <property name="label" translatable="yes">checkbutton</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">False</property>
-                <property name="use_action_appearance">False</property>
-                <property name="xalign">0</property>
-                <property name="draw_indicator">True</property>
-              </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">True</property>
-                <property name="position">2</property>
-              </packing>
-            </child>
-          </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="fill">True</property>
-            <property name="position">0</property>
-          </packing>
-        </child>
         <child internal-child="action_area">
           <object class="GtkButtonBox" id="dialog-action_area1">
             <property name="can_focus">False</property>
@@ -210,6 +152,64 @@
             <property name="position">1</property>
           </packing>
         </child>
+        <child>
+          <object class="GtkBox" id="box2">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <child>
+              <object class="GtkButton" id="button3">
+                <property name="label" translatable="yes">button</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_action_appearance">False</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkRadioButton" id="radiobutton1">
+                <property name="label" translatable="yes">radiobutton</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">False</property>
+                <property name="use_action_appearance">False</property>
+                <property name="xalign">0</property>
+                <property name="active">True</property>
+                <property name="draw_indicator">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkCheckButton" id="checkbutton1">
+                <property name="label" translatable="yes">checkbutton</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">False</property>
+                <property name="use_action_appearance">False</property>
+                <property name="xalign">0</property>
+                <property name="draw_indicator">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">2</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">2</property>
+          </packing>
+        </child>
       </object>
     </child>
     <action-widgets>
diff --git a/vcl/source/window/builder.cxx b/vcl/source/window/builder.cxx
index cbfc274..bf66d05 100644
--- a/vcl/source/window/builder.cxx
+++ b/vcl/source/window/builder.cxx
@@ -206,6 +206,23 @@ void VclBuilder::handleChild(Window *pParent, xmlreader::XmlReader &reader)
             if (name.equals(RTL_CONSTASCII_STRINGPARAM("object")))
             {
                 pCurrentChild = handleObject(pParent, reader);
+
+                if (pCurrentChild)
+                {
+                    rtl::OString sPosition(RTL_CONSTASCII_STRINGPARAM("position"));
+                    std::vector<Window*> aChilds;
+                    for (Window* pChild = pCurrentChild->GetWindow(WINDOW_FIRSTCHILD); pChild;
+                        pChild = pChild->GetWindow(WINDOW_NEXT))
+                    {
+                        aChilds.push_back(pChild);
+                    }
+
+                    for (size_t i = 0; i < aChilds.size(); ++i)
+                    {
+                        sal_uInt16 nPosition = aChilds[i]->getWidgetProperty<sal_uInt16>(sPosition);
+                        aChilds[i]->reorderWithinParent(nPosition);
+                    }
+                }
             }
             else if (name.equals(RTL_CONSTASCII_STRINGPARAM("packing")))
             {
@@ -345,6 +362,10 @@ void VclBuilder::applyPackingProperty(Window *pCurrent,
                 bool bTrue = (sValue[0] == 't' || sValue[0] == 'T' || sValue[0] == '1');
                 pCurrent->setChildProperty(sKey, bTrue);
             }
+            else if (sKey.equalsL(RTL_CONSTASCII_STRINGPARAM("position")))
+            {
+                pCurrent->setChildProperty(sKey, static_cast<sal_uInt16>(sValue.toInt32()));
+            }
             else
                 fprintf(stderr, "unknown packing %s\n", sKey.getStr());
         }
diff --git a/vcl/source/window/window.cxx b/vcl/source/window/window.cxx
index 407cc18..bf251be 100644
--- a/vcl/source/window/window.cxx
+++ b/vcl/source/window/window.cxx
@@ -1128,6 +1128,38 @@ void Window::ImplRemoveWindow( sal_Bool bRemoveFrameData )
     }
 }
 
+void Window::reorderWithinParent(sal_uInt16 nNewPosition)
+{
+    sal_uInt16 nChildCount = 0;
+    Window *pSource = mpWindowImpl->mpParent->mpWindowImpl->mpFirstChild;
+    while (pSource)
+    {
+        if (nChildCount == nNewPosition)
+            break;
+        pSource = pSource->mpWindowImpl->mpNext;
+        nChildCount++;
+    }
+
+    if (pSource == this) //already at the right place
+        return;
+
+    ImplRemoveWindow(false);
+
+    if (pSource)
+    {
+        mpWindowImpl->mpNext = pSource;
+        mpWindowImpl->mpPrev = pSource->mpWindowImpl->mpPrev;
+        pSource->mpWindowImpl->mpPrev = this;
+    }
+    else
+        mpWindowImpl->mpParent->mpWindowImpl->mpLastChild = this;
+
+    if (mpWindowImpl->mpPrev)
+        mpWindowImpl->mpPrev->mpWindowImpl->mpNext = this;
+    else
+        mpWindowImpl->mpParent->mpWindowImpl->mpFirstChild = this;
+}
+
 // -----------------------------------------------------------------------
 
 void Window::ImplCallResize()


More information about the Libreoffice-commits mailing list