d563cc4
From bdd33fda337d37431e6bffb99fb90416884981c9 Mon Sep 17 00:00:00 2001
d563cc4
From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolanm@redhat.com>
d563cc4
Date: Thu, 25 Jun 2015 10:33:06 +0100
d563cc4
Subject: [PATCH] implement equalize width and height for impress/draw
d563cc4
d563cc4
Equalize width/height adjusts width/height of selected objects to the
d563cc4
width/height of the last selected object.
d563cc4
d563cc4
Change-Id: I7c222a6591112cb674322d310ebd87f04a9198bd
d563cc4
---
d563cc4
 include/svx/svdedtv.hxx                            |  5 +++
d563cc4
 include/svx/svdstr.hrc                             |  4 +-
d563cc4
 include/svx/svxids.hrc                             |  2 +
d563cc4
 .../org/openoffice/Office/UI/GenericCommands.xcu   | 10 +++++
d563cc4
 sd/sdi/_drvwsh.sdi                                 | 10 +++++
d563cc4
 sd/source/ui/view/drviews2.cxx                     | 13 ++++++
d563cc4
 sd/source/ui/view/drviewsj.cxx                     | 16 ++++++--
d563cc4
 sd/uiconfig/sdraw/menubar/menubar.xml              |  3 ++
d563cc4
 svx/inc/globlmn_tmpl.hrc                           | 20 +++++++++
d563cc4
 svx/sdi/svx.sdi                                    | 47 ++++++++++++++++++++++
d563cc4
 svx/source/svdraw/svdedtv2.cxx                     | 38 +++++++++++++++++
d563cc4
 svx/source/svdraw/svdstr.src                       |  8 ++++
d563cc4
 12 files changed, 171 insertions(+), 5 deletions(-)
d563cc4
d563cc4
diff --git a/include/svx/svdedtv.hxx b/include/svx/svdedtv.hxx
d563cc4
index cdc2308..b109e0c 100644
d563cc4
--- a/include/svx/svdedtv.hxx
d563cc4
+++ b/include/svx/svdedtv.hxx
d563cc4
@@ -272,6 +272,11 @@ public:
d563cc4
     // for distribution dialog function
d563cc4
     void DistributeMarkedObjects();
d563cc4
 
d563cc4
+    // for setting either the width or height of all selected
d563cc4
+    // objects to the width/height of the last selected object
d563cc4
+    // of the selection
d563cc4
+    void EqualizeMarkedObjects(bool bWidth);
d563cc4
+
d563cc4
     // Decompose marked polypolygon objects into polygons.
d563cc4
     // Grouped objects are searched and decomposed, if all member objects are PathObjs.
d563cc4
     // bMakeLines=TRUE:  all polygones are decomposed into single lines resp. bezier segments
d563cc4
diff --git a/include/svx/svdstr.hrc b/include/svx/svdstr.hrc
d563cc4
index 90ef697..36e8719 100644
d563cc4
--- a/include/svx/svdstr.hrc
d563cc4
+++ b/include/svx/svdstr.hrc
d563cc4
@@ -241,7 +241,9 @@
d563cc4
 #define STR_EditMergeSubstractPoly   (STR_EditBegin  + 55)
d563cc4
 #define STR_EditMergeIntersectPoly   (STR_EditBegin  + 56)
d563cc4
 #define STR_DistributeMarkedObjects  (STR_EditBegin  + 57)
d563cc4
-#define STR_EditEnd                  (STR_DistributeMarkedObjects)
d563cc4
+#define STR_EqualizeWidthMarkedObjects  (STR_EditBegin  + 58)
d563cc4
+#define STR_EqualizeHeightMarkedObjects (STR_EditBegin  + 59)
d563cc4
+#define STR_EditEnd                  (STR_EqualizeHeightMarkedObjects)
d563cc4
 
d563cc4
 #define STR_ExchangeBegin            (STR_EditEnd+1)
d563cc4
 #define STR_ExchangePaste            (STR_ExchangeBegin +0)
d563cc4
diff --git a/include/svx/svxids.hrc b/include/svx/svxids.hrc
d563cc4
index 5b8efbc..67ee3da 100644
d563cc4
--- a/include/svx/svxids.hrc
d563cc4
+++ b/include/svx/svxids.hrc
d563cc4
@@ -113,6 +113,8 @@
d563cc4
 #define SID_POLY_INTERSECT                  (SID_SFX_START + 681)
d563cc4
 #define SID_POLY_FORMEN                     (SID_SFX_START + 682)
d563cc4
 #define SID_DISTRIBUTE_DLG                  (SID_SFX_START + 683)
d563cc4
+#define SID_EQUALIZEWIDTH                   (SID_SFX_START + 684)
d563cc4
+#define SID_EQUALIZEHEIGHT                  (SID_SFX_START + 685)
d563cc4
 
d563cc4
 // Basic IDE-Id's
d563cc4
 
d563cc4
diff --git a/officecfg/registry/data/org/openoffice/Office/UI/GenericCommands.xcu b/officecfg/registry/data/org/openoffice/Office/UI/GenericCommands.xcu
d563cc4
index 1c679bd..d221d56 100644
d563cc4
--- a/officecfg/registry/data/org/openoffice/Office/UI/GenericCommands.xcu
d563cc4
+++ b/officecfg/registry/data/org/openoffice/Office/UI/GenericCommands.xcu
d563cc4
@@ -3472,6 +3472,16 @@
d563cc4
           <value xml:lang="en-US">~Subtract</value>
d563cc4
         </prop>
d563cc4
       </node>
d563cc4
+      <node oor:name=".uno:EqualizeWidth" oor:op="replace">
d563cc4
+        <prop oor:name="Label" oor:type="xs:string">
d563cc4
+          <value xml:lang="en-US">Equalize ~Width</value>
d563cc4
+        </prop>
d563cc4
+      </node>
d563cc4
+      <node oor:name=".uno:EqualizeHeight" oor:op="replace">
d563cc4
+        <prop oor:name="Label" oor:type="xs:string">
d563cc4
+          <value xml:lang="en-US">Equalize ~Height</value>
d563cc4
+        </prop>
d563cc4
+      </node>
d563cc4
       <node oor:name=".uno:SuperScript" oor:op="replace">
d563cc4
         <prop oor:name="Label" oor:type="xs:string">
d563cc4
           <value xml:lang="en-US">Superscript</value>
d563cc4
diff --git a/sd/sdi/_drvwsh.sdi b/sd/sdi/_drvwsh.sdi
d563cc4
index 0b5469bf..6b2f17c 100644
d563cc4
--- a/sd/sdi/_drvwsh.sdi
d563cc4
+++ b/sd/sdi/_drvwsh.sdi
d563cc4
@@ -507,6 +507,16 @@ interface DrawView
d563cc4
         ExecMethod = FuTemporary ;
d563cc4
         StateMethod = GetMenuState ;
d563cc4
     ]
d563cc4
+    SID_EQUALIZEWIDTH // ole : no, status : ?
d563cc4
+    [
d563cc4
+        ExecMethod = FuTemporary ;
d563cc4
+        StateMethod = GetMenuState ;
d563cc4
+    ]
d563cc4
+    SID_EQUALIZEHEIGHT // ole : no, status : ?
d563cc4
+    [
d563cc4
+        ExecMethod = FuTemporary ;
d563cc4
+        StateMethod = GetMenuState ;
d563cc4
+    ]
d563cc4
     SID_CONNECT // ole : no, status : ?
d563cc4
     [
d563cc4
         ExecMethod = FuTemporary ;
d563cc4
diff --git a/sd/source/ui/view/drviews2.cxx b/sd/source/ui/view/drviews2.cxx
d563cc4
index ffbb503..90c3d59 100644
d563cc4
--- a/sd/source/ui/view/drviews2.cxx
d563cc4
+++ b/sd/source/ui/view/drviews2.cxx
d563cc4
@@ -2272,6 +2272,19 @@ void DrawViewShell::FuTemporary(SfxRequest& rReq)
d563cc4
         }
d563cc4
         break;
d563cc4
 
d563cc4
+        case SID_EQUALIZEWIDTH:
d563cc4
+        case SID_EQUALIZEHEIGHT:
d563cc4
+        {
d563cc4
+            // End text edit to avoid conflicts
d563cc4
+            if(mpDrawView->IsTextEdit())
d563cc4
+                mpDrawView->SdrEndTextEdit();
d563cc4
+
d563cc4
+            mpDrawView->EqualizeMarkedObjects(nSId == SID_EQUALIZEWIDTH);
d563cc4
+            Cancel();
d563cc4
+            rReq.Done ();
d563cc4
+        }
d563cc4
+        break;
d563cc4
+
d563cc4
         case SID_DISMANTLE:  // BASIC
d563cc4
         {
d563cc4
             if ( mpDrawView->IsDismantlePossible(false) )
d563cc4
diff --git a/sd/source/ui/view/drviewsj.cxx b/sd/source/ui/view/drviewsj.cxx
d563cc4
index 857601f..10a3f5a 100644
d563cc4
--- a/sd/source/ui/view/drviewsj.cxx
d563cc4
+++ b/sd/source/ui/view/drviewsj.cxx
d563cc4
@@ -284,13 +284,15 @@ void DrawViewShell::GetMenuStateSel( SfxItemSet &rSet )
d563cc4
             rSet.Put(SfxBoolItem(SID_OUTLINE_TEXT_AUTOFIT, bSet));
d563cc4
         }
d563cc4
 
d563cc4
-        rSet.DisableItem( SID_GROUP );
d563cc4
-        rSet.DisableItem( SID_COMBINE );
d563cc4
+        rSet.DisableItem(SID_GROUP);
d563cc4
+        rSet.DisableItem(SID_COMBINE);
d563cc4
         rSet.DisableItem(SID_DISTRIBUTE_DLG);
d563cc4
         rSet.DisableItem(SID_POLY_MERGE);
d563cc4
         rSet.DisableItem(SID_POLY_SUBSTRACT);
d563cc4
         rSet.DisableItem(SID_POLY_INTERSECT);
d563cc4
-        rSet.DisableItem( SID_CONNECT );
d563cc4
+        rSet.DisableItem(SID_EQUALIZEWIDTH);
d563cc4
+        rSet.DisableItem(SID_EQUALIZEHEIGHT);
d563cc4
+        rSet.DisableItem(SID_CONNECT);
d563cc4
     }
d563cc4
     // multi-selection
d563cc4
     else if( nMarkCount > 1 )
d563cc4
@@ -377,6 +379,8 @@ void DrawViewShell::GetMenuStateSel( SfxItemSet &rSet )
d563cc4
                 rSet.DisableItem(SID_POLY_MERGE);
d563cc4
                 rSet.DisableItem(SID_POLY_SUBSTRACT);
d563cc4
                 rSet.DisableItem(SID_POLY_INTERSECT);
d563cc4
+                rSet.DisableItem(SID_EQUALIZEWIDTH);
d563cc4
+                rSet.DisableItem(SID_EQUALIZEHEIGHT);
d563cc4
             }
d563cc4
 
d563cc4
             if (b3dObj                                        ||
d563cc4
@@ -438,10 +442,12 @@ void DrawViewShell::GetMenuStateSel( SfxItemSet &rSet )
d563cc4
         }
d563cc4
         if ( !mpDrawView->IsCombinePossible(false) )
d563cc4
         {
d563cc4
-            rSet.DisableItem( SID_COMBINE );
d563cc4
+            rSet.DisableItem(SID_COMBINE);
d563cc4
             rSet.DisableItem(SID_POLY_MERGE);
d563cc4
             rSet.DisableItem(SID_POLY_SUBSTRACT);
d563cc4
             rSet.DisableItem(SID_POLY_INTERSECT);
d563cc4
+            rSet.DisableItem(SID_EQUALIZEWIDTH);
d563cc4
+            rSet.DisableItem(SID_EQUALIZEHEIGHT);
d563cc4
         }
d563cc4
         if ( !mpDrawView->IsCombinePossible(true) )
d563cc4
         {
d563cc4
@@ -501,6 +507,8 @@ void DrawViewShell::GetMenuStateSel( SfxItemSet &rSet )
d563cc4
         rSet.DisableItem(SID_POLY_MERGE);
d563cc4
         rSet.DisableItem(SID_POLY_SUBSTRACT);
d563cc4
         rSet.DisableItem(SID_POLY_INTERSECT);
d563cc4
+        rSet.DisableItem(SID_EQUALIZEWIDTH);
d563cc4
+        rSet.DisableItem(SID_EQUALIZEHEIGHT);
d563cc4
         rSet.DisableItem( SID_CONNECT );
d563cc4
         rSet.DisableItem( SID_ANIMATION_EFFECTS );
d563cc4
         rSet.DisableItem( SID_MODIFY_FIELD );
d563cc4
diff --git a/sd/uiconfig/sdraw/menubar/menubar.xml b/sd/uiconfig/sdraw/menubar/menubar.xml
d563cc4
index f12287b..bc8cfee 100644
d563cc4
--- a/sd/uiconfig/sdraw/menubar/menubar.xml
d563cc4
+++ b/sd/uiconfig/sdraw/menubar/menubar.xml
d563cc4
@@ -346,6 +346,9 @@
d563cc4
           <menu:menuitem menu:id=".uno:Merge"/>
d563cc4
           <menu:menuitem menu:id=".uno:Substract"/>
d563cc4
           <menu:menuitem menu:id=".uno:Intersect"/>
d563cc4
+          <menu:menuseparator/>
d563cc4
+          <menu:menuitem menu:id=".uno:EqualizeWidth"/>
d563cc4
+          <menu:menuitem menu:id=".uno:EqualizeHeight"/>
d563cc4
         </menu:menupopup>
d563cc4
       </menu:menu>
d563cc4
       <menu:menuseparator/>
d563cc4
diff --git a/svx/inc/globlmn_tmpl.hrc b/svx/inc/globlmn_tmpl.hrc
d563cc4
index 9d511c8..8d82489 100644
d563cc4
--- a/svx/inc/globlmn_tmpl.hrc
d563cc4
+++ b/svx/inc/globlmn_tmpl.hrc
d563cc4
@@ -306,6 +306,20 @@
d563cc4
         Command = ".uno:Intersect" ; \
d563cc4
         Text [ en-US ] = "I~ntersect" ; \
d563cc4
             };
d563cc4
+#define ITEM_EQUALIZEWIDTH \
d563cc4
+    MenuItem\
d563cc4
+    {\
d563cc4
+        Identifier = SID_EQUALIZEWIDTH ; \
d563cc4
+        Command = ".uno:EqualizeWidth" ; \
d563cc4
+        Text [ en-US ] = "Equalize ~Width" ; \
d563cc4
+            };
d563cc4
+#define ITEM_EQUALIZEHEIGHT \
d563cc4
+    MenuItem\
d563cc4
+    {\
d563cc4
+        Identifier = SID_EQUALIZEHEIGHT ; \
d563cc4
+        Command = ".uno:EqualizeHeight" ; \
d563cc4
+        Text [ en-US ] = "Equalize ~Height" ; \
d563cc4
+            };
d563cc4
 
d563cc4
 #define MNSUB_FORMEN \
d563cc4
     MenuItem \
d563cc4
@@ -320,6 +334,12 @@
d563cc4
                 ITEM_POLY_MERGE \
d563cc4
                 ITEM_POLY_SUBSTRACT \
d563cc4
                 ITEM_POLY_INTERSECT \
d563cc4
+                MenuItem \
d563cc4
+                { \
d563cc4
+                    Separator = TRUE; \
d563cc4
+                }; \
d563cc4
+                ITEM_EQUALIZEWIDTH \
d563cc4
+                ITEM_EQUALIZEHEIGHT \
d563cc4
             };\
d563cc4
         };\
d563cc4
     };
d563cc4
diff --git a/svx/sdi/svx.sdi b/svx/sdi/svx.sdi
d563cc4
index 941f3e8..b301c58 100644
d563cc4
--- a/svx/sdi/svx.sdi
d563cc4
+++ b/svx/sdi/svx.sdi
d563cc4
@@ -11100,6 +11100,53 @@ SfxVoidItem Substract SID_POLY_SUBSTRACT
d563cc4
     GroupId = GID_MODIFY;
d563cc4
 ]
d563cc4
 
d563cc4
+SfxVoidItem EqualizeWidth SID_EQUALIZEWIDTH
d563cc4
+()
d563cc4
+[
d563cc4
+    /* flags: */
d563cc4
+    AutoUpdate = FALSE,
d563cc4
+    Cachable = Cachable,
d563cc4
+    FastCall = FALSE,
d563cc4
+    HasCoreId = FALSE,
d563cc4
+    HasDialog = FALSE,
d563cc4
+    ReadOnlyDoc = FALSE,
d563cc4
+    Toggle = FALSE,
d563cc4
+    Container = FALSE,
d563cc4
+    RecordAbsolute = FALSE,
d563cc4
+    RecordPerSet;
d563cc4
+    Synchron;
d563cc4
+
d563cc4
+    /* config: */
d563cc4
+    AccelConfig = TRUE,
d563cc4
+    MenuConfig = TRUE,
d563cc4
+    StatusBarConfig = FALSE,
d563cc4
+    ToolBoxConfig = TRUE,
d563cc4
+    GroupId = GID_MODIFY;
d563cc4
+]
d563cc4
+
d563cc4
+SfxVoidItem EqualizeHeight SID_EQUALIZEHEIGHT
d563cc4
+()
d563cc4
+[
d563cc4
+    /* flags: */
d563cc4
+    AutoUpdate = FALSE,
d563cc4
+    Cachable = Cachable,
d563cc4
+    FastCall = FALSE,
d563cc4
+    HasCoreId = FALSE,
d563cc4
+    HasDialog = FALSE,
d563cc4
+    ReadOnlyDoc = FALSE,
d563cc4
+    Toggle = FALSE,
d563cc4
+    Container = FALSE,
d563cc4
+    RecordAbsolute = FALSE,
d563cc4
+    RecordPerSet;
d563cc4
+    Synchron;
d563cc4
+
d563cc4
+    /* config: */
d563cc4
+    AccelConfig = TRUE,
d563cc4
+    MenuConfig = TRUE,
d563cc4
+    StatusBarConfig = FALSE,
d563cc4
+    ToolBoxConfig = TRUE,
d563cc4
+    GroupId = GID_MODIFY;
d563cc4
+]
d563cc4
 
d563cc4
 SfxBoolItem SuperScript SID_SET_SUPER_SCRIPT
d563cc4
 
d563cc4
diff --git a/svx/source/svdraw/svdedtv2.cxx b/svx/source/svdraw/svdedtv2.cxx
d563cc4
index 0a60082..ad7dd3f 100644
d563cc4
--- a/svx/source/svdraw/svdedtv2.cxx
d563cc4
+++ b/svx/source/svdraw/svdedtv2.cxx
d563cc4
@@ -1173,6 +1173,44 @@ void SdrEditView::MergeMarkedObjects(SdrMergeMode eMode)
d563cc4
     }
d563cc4
 }
d563cc4
 
d563cc4
+void SdrEditView::EqualizeMarkedObjects(bool bWidth)
d563cc4
+{
d563cc4
+    const SdrMarkList& rMarkList = GetMarkedObjectList();
d563cc4
+    size_t nMarked = rMarkList.GetMarkCount();
d563cc4
+
d563cc4
+    if (nMarked < 2)
d563cc4
+        return;
d563cc4
+
d563cc4
+    SdrObject* pLastSelectedObj = rMarkList.GetMark(nMarked-1)->GetMarkedSdrObj();
d563cc4
+    Size aLastRectSize(pLastSelectedObj->GetLogicRect().GetSize());
d563cc4
+
d563cc4
+    const bool bUndo = IsUndoEnabled();
d563cc4
+
d563cc4
+    if (bUndo)
d563cc4
+        BegUndo();
d563cc4
+
d563cc4
+    for (size_t a = 0; a < nMarked-1; ++a)
d563cc4
+    {
d563cc4
+        SdrMark* pM = rMarkList.GetMark(a);
d563cc4
+        SdrObject* pObj = pM->GetMarkedSdrObj();
d563cc4
+        Rectangle aLogicRect(pObj->GetLogicRect());
d563cc4
+        Size aLogicRectSize(aLogicRect.GetSize());
d563cc4
+        if (bWidth)
d563cc4
+            aLogicRectSize.Width() = aLastRectSize.Width();
d563cc4
+        else
d563cc4
+            aLogicRectSize.Height() = aLastRectSize.Height();
d563cc4
+        aLogicRect.SetSize(aLogicRectSize);
d563cc4
+        pObj->SetLogicRect(aLogicRect);
d563cc4
+    }
d563cc4
+
d563cc4
+    SetUndoComment(
d563cc4
+        ImpGetResStr(bWidth ? STR_EqualizeWidthMarkedObjects : STR_EqualizeHeightMarkedObjects),
d563cc4
+        rMarkList.GetMarkDescription());
d563cc4
+
d563cc4
+    if (bUndo)
d563cc4
+        EndUndo();
d563cc4
+}
d563cc4
+
d563cc4
 void SdrEditView::CombineMarkedObjects(bool bNoPolyPoly)
d563cc4
 {
d563cc4
     // #105899# Start of Combine-Undo put to front, else ConvertMarkedToPolyObj would
d563cc4
diff --git a/svx/source/svdraw/svdstr.src b/svx/source/svdraw/svdstr.src
d563cc4
index 364749a..6dc4420 100644
d563cc4
--- a/svx/source/svdraw/svdstr.src
d563cc4
+++ b/svx/source/svdraw/svdstr.src
d563cc4
@@ -823,6 +823,14 @@ String STR_DistributeMarkedObjects
d563cc4
 {
d563cc4
     Text [ en-US ] = "Distribute selected objects";
d563cc4
 };
d563cc4
+String STR_EqualizeWidthMarkedObjects
d563cc4
+{
d563cc4
+    Text [ en-US ] = "Equalize Width %1";
d563cc4
+};
d563cc4
+String STR_EqualizeHeightMarkedObjects
d563cc4
+{
d563cc4
+    Text [ en-US ] = "Equalize Height %1";
d563cc4
+};
d563cc4
 String STR_EditCombine_OnePoly
d563cc4
 {
d563cc4
     Text [ en-US ] = "Combine %1" ;
d563cc4
-- 
d563cc4
2.4.0
d563cc4