e711137
From 745aa711cc21660121508dde895dc726d3499df6 Mon Sep 17 00:00:00 2001
c575310
From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolanm@redhat.com>
c575310
Date: Thu, 25 Jun 2015 10:33:06 +0100
c575310
Subject: [PATCH] implement equalize width and height for impress/draw
c575310
c575310
Equalize width/height adjusts width/height of selected objects to the
c575310
width/height of the last selected object.
c575310
c575310
Change-Id: I7c222a6591112cb674322d310ebd87f04a9198bd
c575310
---
c575310
 include/svx/svdedtv.hxx                            |  5 +++
c575310
 include/svx/svdstr.hrc                             |  4 +-
c575310
 include/svx/svxids.hrc                             |  2 +
c575310
 .../org/openoffice/Office/UI/GenericCommands.xcu   | 10 +++++
c575310
 sd/sdi/_drvwsh.sdi                                 | 10 +++++
c575310
 sd/source/ui/view/drviews2.cxx                     | 13 ++++++
c575310
 sd/source/ui/view/drviewsj.cxx                     | 16 ++++++--
c575310
 sd/uiconfig/sdraw/menubar/menubar.xml              |  3 ++
c575310
 svx/inc/globlmn_tmpl.hrc                           | 20 +++++++++
c575310
 svx/sdi/svx.sdi                                    | 47 ++++++++++++++++++++++
c575310
 svx/source/svdraw/svdedtv2.cxx                     | 38 +++++++++++++++++
c575310
 svx/source/svdraw/svdstr.src                       |  8 ++++
c575310
 12 files changed, 171 insertions(+), 5 deletions(-)
c575310
c575310
diff --git a/include/svx/svdedtv.hxx b/include/svx/svdedtv.hxx
e711137
index e29a065..66b43b2 100644
c575310
--- a/include/svx/svdedtv.hxx
c575310
+++ b/include/svx/svdedtv.hxx
e711137
@@ -268,6 +268,11 @@ public:
c575310
     // for distribution dialog function
c575310
     void DistributeMarkedObjects();
c575310
 
c575310
+    // for setting either the width or height of all selected
c575310
+    // objects to the width/height of the last selected object
c575310
+    // of the selection
c575310
+    void EqualizeMarkedObjects(bool bWidth);
c575310
+
e711137
     // Markierte Polypolygonobjekte in Polygone zerlegen
e711137
     // Gruppenobjekte werden durchsucht und zerlegt, wenn es sich bei allen
e711137
     // Memberobjekten um PathObjs handelt.
c575310
diff --git a/include/svx/svdstr.hrc b/include/svx/svdstr.hrc
c575310
index 90ef697..36e8719 100644
c575310
--- a/include/svx/svdstr.hrc
c575310
+++ b/include/svx/svdstr.hrc
c575310
@@ -241,7 +241,9 @@
c575310
 #define STR_EditMergeSubstractPoly   (STR_EditBegin  + 55)
c575310
 #define STR_EditMergeIntersectPoly   (STR_EditBegin  + 56)
c575310
 #define STR_DistributeMarkedObjects  (STR_EditBegin  + 57)
c575310
-#define STR_EditEnd                  (STR_DistributeMarkedObjects)
c575310
+#define STR_EqualizeWidthMarkedObjects  (STR_EditBegin  + 58)
c575310
+#define STR_EqualizeHeightMarkedObjects (STR_EditBegin  + 59)
c575310
+#define STR_EditEnd                  (STR_EqualizeHeightMarkedObjects)
c575310
 
c575310
 #define STR_ExchangeBegin            (STR_EditEnd+1)
c575310
 #define STR_ExchangePaste            (STR_ExchangeBegin +0)
c575310
diff --git a/include/svx/svxids.hrc b/include/svx/svxids.hrc
e711137
index 23a9df5..4389148 100644
c575310
--- a/include/svx/svxids.hrc
c575310
+++ b/include/svx/svxids.hrc
c575310
@@ -113,6 +113,8 @@
c575310
 #define SID_POLY_INTERSECT                  (SID_SFX_START + 681)
c575310
 #define SID_POLY_FORMEN                     (SID_SFX_START + 682)
c575310
 #define SID_DISTRIBUTE_DLG                  (SID_SFX_START + 683)
c575310
+#define SID_EQUALIZEWIDTH                   (SID_SFX_START + 684)
c575310
+#define SID_EQUALIZEHEIGHT                  (SID_SFX_START + 685)
c575310
 
c575310
 // Basic IDE-Id's
c575310
 
c575310
diff --git a/officecfg/registry/data/org/openoffice/Office/UI/GenericCommands.xcu b/officecfg/registry/data/org/openoffice/Office/UI/GenericCommands.xcu
e711137
index 79553f4..0696cbe 100644
c575310
--- a/officecfg/registry/data/org/openoffice/Office/UI/GenericCommands.xcu
c575310
+++ b/officecfg/registry/data/org/openoffice/Office/UI/GenericCommands.xcu
e711137
@@ -3345,6 +3345,16 @@
c575310
           <value xml:lang="en-US">~Subtract</value>
c575310
         </prop>
c575310
       </node>
c575310
+      <node oor:name=".uno:EqualizeWidth" oor:op="replace">
c575310
+        <prop oor:name="Label" oor:type="xs:string">
c575310
+          <value xml:lang="en-US">Equalize ~Width</value>
c575310
+        </prop>
c575310
+      </node>
c575310
+      <node oor:name=".uno:EqualizeHeight" oor:op="replace">
c575310
+        <prop oor:name="Label" oor:type="xs:string">
c575310
+          <value xml:lang="en-US">Equalize ~Height</value>
c575310
+        </prop>
c575310
+      </node>
c575310
       <node oor:name=".uno:SuperScript" oor:op="replace">
c575310
         <prop oor:name="Label" oor:type="xs:string">
c575310
           <value xml:lang="en-US">Superscript</value>
c575310
diff --git a/sd/sdi/_drvwsh.sdi b/sd/sdi/_drvwsh.sdi
e711137
index 38953ca..018360b 100644
c575310
--- a/sd/sdi/_drvwsh.sdi
c575310
+++ b/sd/sdi/_drvwsh.sdi
c575310
@@ -507,6 +507,16 @@ interface DrawView
c575310
         ExecMethod = FuTemporary ;
c575310
         StateMethod = GetMenuState ;
c575310
     ]
c575310
+    SID_EQUALIZEWIDTH // ole : no, status : ?
c575310
+    [
c575310
+        ExecMethod = FuTemporary ;
c575310
+        StateMethod = GetMenuState ;
c575310
+    ]
c575310
+    SID_EQUALIZEHEIGHT // ole : no, status : ?
c575310
+    [
c575310
+        ExecMethod = FuTemporary ;
c575310
+        StateMethod = GetMenuState ;
c575310
+    ]
c575310
     SID_CONNECT // ole : no, status : ?
c575310
     [
c575310
         ExecMethod = FuTemporary ;
c575310
diff --git a/sd/source/ui/view/drviews2.cxx b/sd/source/ui/view/drviews2.cxx
e711137
index 7a3655a..9e66801 100644
c575310
--- a/sd/source/ui/view/drviews2.cxx
c575310
+++ b/sd/source/ui/view/drviews2.cxx
e711137
@@ -2273,6 +2273,19 @@ void DrawViewShell::FuTemporary(SfxRequest& rReq)
c575310
         }
c575310
         break;
c575310
 
c575310
+        case SID_EQUALIZEWIDTH:
c575310
+        case SID_EQUALIZEHEIGHT:
c575310
+        {
c575310
+            // End text edit to avoid conflicts
c575310
+            if(mpDrawView->IsTextEdit())
c575310
+                mpDrawView->SdrEndTextEdit();
c575310
+
c575310
+            mpDrawView->EqualizeMarkedObjects(nSId == SID_EQUALIZEWIDTH);
c575310
+            Cancel();
c575310
+            rReq.Done ();
c575310
+        }
c575310
+        break;
c575310
+
c575310
         case SID_DISMANTLE:  // BASIC
c575310
         {
c575310
             if ( mpDrawView->IsDismantlePossible(false) )
c575310
diff --git a/sd/source/ui/view/drviewsj.cxx b/sd/source/ui/view/drviewsj.cxx
c575310
index 857601f..10a3f5a 100644
c575310
--- a/sd/source/ui/view/drviewsj.cxx
c575310
+++ b/sd/source/ui/view/drviewsj.cxx
c575310
@@ -284,13 +284,15 @@ void DrawViewShell::GetMenuStateSel( SfxItemSet &rSet )
c575310
             rSet.Put(SfxBoolItem(SID_OUTLINE_TEXT_AUTOFIT, bSet));
c575310
         }
c575310
 
c575310
-        rSet.DisableItem( SID_GROUP );
c575310
-        rSet.DisableItem( SID_COMBINE );
c575310
+        rSet.DisableItem(SID_GROUP);
c575310
+        rSet.DisableItem(SID_COMBINE);
c575310
         rSet.DisableItem(SID_DISTRIBUTE_DLG);
c575310
         rSet.DisableItem(SID_POLY_MERGE);
c575310
         rSet.DisableItem(SID_POLY_SUBSTRACT);
c575310
         rSet.DisableItem(SID_POLY_INTERSECT);
c575310
-        rSet.DisableItem( SID_CONNECT );
c575310
+        rSet.DisableItem(SID_EQUALIZEWIDTH);
c575310
+        rSet.DisableItem(SID_EQUALIZEHEIGHT);
c575310
+        rSet.DisableItem(SID_CONNECT);
c575310
     }
c575310
     // multi-selection
c575310
     else if( nMarkCount > 1 )
c575310
@@ -377,6 +379,8 @@ void DrawViewShell::GetMenuStateSel( SfxItemSet &rSet )
c575310
                 rSet.DisableItem(SID_POLY_MERGE);
c575310
                 rSet.DisableItem(SID_POLY_SUBSTRACT);
c575310
                 rSet.DisableItem(SID_POLY_INTERSECT);
c575310
+                rSet.DisableItem(SID_EQUALIZEWIDTH);
c575310
+                rSet.DisableItem(SID_EQUALIZEHEIGHT);
c575310
             }
c575310
 
c575310
             if (b3dObj                                        ||
c575310
@@ -438,10 +442,12 @@ void DrawViewShell::GetMenuStateSel( SfxItemSet &rSet )
c575310
         }
c575310
         if ( !mpDrawView->IsCombinePossible(false) )
c575310
         {
c575310
-            rSet.DisableItem( SID_COMBINE );
c575310
+            rSet.DisableItem(SID_COMBINE);
c575310
             rSet.DisableItem(SID_POLY_MERGE);
c575310
             rSet.DisableItem(SID_POLY_SUBSTRACT);
c575310
             rSet.DisableItem(SID_POLY_INTERSECT);
c575310
+            rSet.DisableItem(SID_EQUALIZEWIDTH);
c575310
+            rSet.DisableItem(SID_EQUALIZEHEIGHT);
c575310
         }
c575310
         if ( !mpDrawView->IsCombinePossible(true) )
c575310
         {
c575310
@@ -501,6 +507,8 @@ void DrawViewShell::GetMenuStateSel( SfxItemSet &rSet )
c575310
         rSet.DisableItem(SID_POLY_MERGE);
c575310
         rSet.DisableItem(SID_POLY_SUBSTRACT);
c575310
         rSet.DisableItem(SID_POLY_INTERSECT);
c575310
+        rSet.DisableItem(SID_EQUALIZEWIDTH);
c575310
+        rSet.DisableItem(SID_EQUALIZEHEIGHT);
c575310
         rSet.DisableItem( SID_CONNECT );
c575310
         rSet.DisableItem( SID_ANIMATION_EFFECTS );
c575310
         rSet.DisableItem( SID_MODIFY_FIELD );
c575310
diff --git a/sd/uiconfig/sdraw/menubar/menubar.xml b/sd/uiconfig/sdraw/menubar/menubar.xml
c575310
index f12287b..bc8cfee 100644
c575310
--- a/sd/uiconfig/sdraw/menubar/menubar.xml
c575310
+++ b/sd/uiconfig/sdraw/menubar/menubar.xml
c575310
@@ -346,6 +346,9 @@
c575310
           <menu:menuitem menu:id=".uno:Merge"/>
c575310
           <menu:menuitem menu:id=".uno:Substract"/>
c575310
           <menu:menuitem menu:id=".uno:Intersect"/>
c575310
+          <menu:menuseparator/>
c575310
+          <menu:menuitem menu:id=".uno:EqualizeWidth"/>
c575310
+          <menu:menuitem menu:id=".uno:EqualizeHeight"/>
c575310
         </menu:menupopup>
c575310
       </menu:menu>
c575310
       <menu:menuseparator/>
c575310
diff --git a/svx/inc/globlmn_tmpl.hrc b/svx/inc/globlmn_tmpl.hrc
e711137
index b53f23a..1493f60 100644
c575310
--- a/svx/inc/globlmn_tmpl.hrc
c575310
+++ b/svx/inc/globlmn_tmpl.hrc
e711137
@@ -301,6 +301,20 @@
c575310
         Command = ".uno:Intersect" ; \
c575310
         Text [ en-US ] = "I~ntersect" ; \
c575310
             };
c575310
+#define ITEM_EQUALIZEWIDTH \
c575310
+    MenuItem\
c575310
+    {\
c575310
+        Identifier = SID_EQUALIZEWIDTH ; \
c575310
+        Command = ".uno:EqualizeWidth" ; \
c575310
+        Text [ en-US ] = "Equalize ~Width" ; \
c575310
+            };
c575310
+#define ITEM_EQUALIZEHEIGHT \
c575310
+    MenuItem\
c575310
+    {\
c575310
+        Identifier = SID_EQUALIZEHEIGHT ; \
c575310
+        Command = ".uno:EqualizeHeight" ; \
c575310
+        Text [ en-US ] = "Equalize ~Height" ; \
c575310
+            };
c575310
 
c575310
 #define MNSUB_FORMEN \
c575310
     MenuItem \
e711137
@@ -315,6 +329,12 @@
c575310
                 ITEM_POLY_MERGE \
c575310
                 ITEM_POLY_SUBSTRACT \
c575310
                 ITEM_POLY_INTERSECT \
c575310
+                MenuItem \
c575310
+                { \
c575310
+                    Separator = TRUE; \
c575310
+                }; \
c575310
+                ITEM_EQUALIZEWIDTH \
c575310
+                ITEM_EQUALIZEHEIGHT \
c575310
             };\
c575310
         };\
c575310
     };
c575310
diff --git a/svx/sdi/svx.sdi b/svx/sdi/svx.sdi
e711137
index 565ee34..30375eb 100644
c575310
--- a/svx/sdi/svx.sdi
c575310
+++ b/svx/sdi/svx.sdi
e711137
@@ -11025,6 +11025,53 @@ SfxVoidItem Substract SID_POLY_SUBSTRACT
c575310
     GroupId = GID_MODIFY;
c575310
 ]
c575310
 
c575310
+SfxVoidItem EqualizeWidth SID_EQUALIZEWIDTH
c575310
+()
c575310
+[
c575310
+    /* flags: */
c575310
+    AutoUpdate = FALSE,
c575310
+    Cachable = Cachable,
c575310
+    FastCall = FALSE,
c575310
+    HasCoreId = FALSE,
c575310
+    HasDialog = FALSE,
c575310
+    ReadOnlyDoc = FALSE,
c575310
+    Toggle = FALSE,
c575310
+    Container = FALSE,
c575310
+    RecordAbsolute = FALSE,
c575310
+    RecordPerSet;
c575310
+    Synchron;
c575310
+
c575310
+    /* config: */
c575310
+    AccelConfig = TRUE,
c575310
+    MenuConfig = TRUE,
c575310
+    StatusBarConfig = FALSE,
c575310
+    ToolBoxConfig = TRUE,
c575310
+    GroupId = GID_MODIFY;
c575310
+]
c575310
+
c575310
+SfxVoidItem EqualizeHeight SID_EQUALIZEHEIGHT
c575310
+()
c575310
+[
c575310
+    /* flags: */
c575310
+    AutoUpdate = FALSE,
c575310
+    Cachable = Cachable,
c575310
+    FastCall = FALSE,
c575310
+    HasCoreId = FALSE,
c575310
+    HasDialog = FALSE,
c575310
+    ReadOnlyDoc = FALSE,
c575310
+    Toggle = FALSE,
c575310
+    Container = FALSE,
c575310
+    RecordAbsolute = FALSE,
c575310
+    RecordPerSet;
c575310
+    Synchron;
c575310
+
c575310
+    /* config: */
c575310
+    AccelConfig = TRUE,
c575310
+    MenuConfig = TRUE,
c575310
+    StatusBarConfig = FALSE,
c575310
+    ToolBoxConfig = TRUE,
c575310
+    GroupId = GID_MODIFY;
c575310
+]
c575310
 
c575310
 SfxBoolItem SuperScript SID_SET_SUPER_SCRIPT
c575310
 
c575310
diff --git a/svx/source/svdraw/svdedtv2.cxx b/svx/source/svdraw/svdedtv2.cxx
e711137
index 93eadf8..568066c 100644
c575310
--- a/svx/source/svdraw/svdedtv2.cxx
c575310
+++ b/svx/source/svdraw/svdedtv2.cxx
c575310
@@ -1173,6 +1173,44 @@ void SdrEditView::MergeMarkedObjects(SdrMergeMode eMode)
c575310
     }
c575310
 }
c575310
 
c575310
+void SdrEditView::EqualizeMarkedObjects(bool bWidth)
c575310
+{
c575310
+    const SdrMarkList& rMarkList = GetMarkedObjectList();
c575310
+    size_t nMarked = rMarkList.GetMarkCount();
c575310
+
c575310
+    if (nMarked < 2)
c575310
+        return;
c575310
+
c575310
+    SdrObject* pLastSelectedObj = rMarkList.GetMark(nMarked-1)->GetMarkedSdrObj();
c575310
+    Size aLastRectSize(pLastSelectedObj->GetLogicRect().GetSize());
c575310
+
c575310
+    const bool bUndo = IsUndoEnabled();
c575310
+
c575310
+    if (bUndo)
c575310
+        BegUndo();
c575310
+
c575310
+    for (size_t a = 0; a < nMarked-1; ++a)
c575310
+    {
c575310
+        SdrMark* pM = rMarkList.GetMark(a);
c575310
+        SdrObject* pObj = pM->GetMarkedSdrObj();
c575310
+        Rectangle aLogicRect(pObj->GetLogicRect());
c575310
+        Size aLogicRectSize(aLogicRect.GetSize());
c575310
+        if (bWidth)
c575310
+            aLogicRectSize.Width() = aLastRectSize.Width();
c575310
+        else
c575310
+            aLogicRectSize.Height() = aLastRectSize.Height();
c575310
+        aLogicRect.SetSize(aLogicRectSize);
c575310
+        pObj->SetLogicRect(aLogicRect);
c575310
+    }
c575310
+
c575310
+    SetUndoComment(
c575310
+        ImpGetResStr(bWidth ? STR_EqualizeWidthMarkedObjects : STR_EqualizeHeightMarkedObjects),
c575310
+        rMarkList.GetMarkDescription());
c575310
+
c575310
+    if (bUndo)
c575310
+        EndUndo();
c575310
+}
c575310
+
c575310
 void SdrEditView::CombineMarkedObjects(bool bNoPolyPoly)
c575310
 {
c575310
     // #105899# Start of Combine-Undo put to front, else ConvertMarkedToPolyObj would
c575310
diff --git a/svx/source/svdraw/svdstr.src b/svx/source/svdraw/svdstr.src
c575310
index 364749a..6dc4420 100644
c575310
--- a/svx/source/svdraw/svdstr.src
c575310
+++ b/svx/source/svdraw/svdstr.src
c575310
@@ -823,6 +823,14 @@ String STR_DistributeMarkedObjects
c575310
 {
c575310
     Text [ en-US ] = "Distribute selected objects";
c575310
 };
c575310
+String STR_EqualizeWidthMarkedObjects
c575310
+{
c575310
+    Text [ en-US ] = "Equalize Width %1";
c575310
+};
c575310
+String STR_EqualizeHeightMarkedObjects
c575310
+{
c575310
+    Text [ en-US ] = "Equalize Height %1";
c575310
+};
c575310
 String STR_EditCombine_OnePoly
c575310
 {
c575310
     Text [ en-US ] = "Combine %1" ;
c575310
-- 
c575310
2.4.0
c575310