[Libreoffice-commits] core.git: 2 commits - sw/inc sw/qa sw/source

Miklos Vajna vmiklos at collabora.co.uk
Tue Jun 24 09:54:08 PDT 2014


 dev/null                                     |binary
 sw/inc/hintids.hxx                           |   66 +++++++++++++--------------
 sw/inc/textboxhelper.hxx                     |    2 
 sw/qa/extras/uiwriter/data/shape-textbox.odt |binary
 sw/qa/extras/uiwriter/uiwriter.cxx           |   24 +++++++++
 sw/source/core/doc/textboxhelper.cxx         |   15 ++++++
 sw/source/core/frmedt/feshview.cxx           |   17 ++++++
 sw/source/uibase/docvw/edtwin.cxx            |   19 ++++++-
 8 files changed, 107 insertions(+), 36 deletions(-)

New commits:
commit de00dd0a4e9c10e283f5b8093ac1771545cbe243
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Tue Jun 24 17:51:05 2014 +0200

    sw: update hintid comments to match reality
    
    Change-Id: I9c7f620e08865531c70b1c4e655ed9f0aed9d319

diff --git a/sw/inc/hintids.hxx b/sw/inc/hintids.hxx
index e0a6685..4a0840d 100644
--- a/sw/inc/hintids.hxx
+++ b/sw/inc/hintids.hxx
@@ -230,49 +230,49 @@ RES_FRMATR_BEGIN = RES_PARATR_LIST_END,
     RES_AUTO_STYLE,                                 // 125
     RES_FRMATR_STYLE_NAME,                          // 126
     RES_FRMATR_CONDITIONAL_STYLE_NAME,              // 127
-    RES_FRMATR_GRABBAG,                             // 130
-    RES_TEXT_VERT_ADJUST,                           // 131
+    RES_FRMATR_GRABBAG,                             // 128
+    RES_TEXT_VERT_ADJUST,                           // 129
 RES_FRMATR_END
 };
 
 enum RES_GRFATR
 {
 RES_GRFATR_BEGIN = RES_FRMATR_END,
-    RES_GRFATR_MIRRORGRF = RES_GRFATR_BEGIN,        // 132
-    RES_GRFATR_CROPGRF,                             // 133
-
-    RES_GRFATR_ROTATION,                            // 134
-    RES_GRFATR_LUMINANCE,                           // 135
-    RES_GRFATR_CONTRAST,                            // 136
-    RES_GRFATR_CHANNELR,                            // 137
-    RES_GRFATR_CHANNELG,                            // 138
-    RES_GRFATR_CHANNELB,                            // 139
-    RES_GRFATR_GAMMA,                               // 140
-    RES_GRFATR_INVERT,                              // 141
-    RES_GRFATR_TRANSPARENCY,                        // 142
-    RES_GRFATR_DRAWMODE,                            // 143
-
-    RES_GRFATR_DUMMY1,                              // 144
-    RES_GRFATR_DUMMY2,                              // 145
-    RES_GRFATR_DUMMY3,                              // 146
-    RES_GRFATR_DUMMY4,                              // 147
-    RES_GRFATR_DUMMY5,                              // 148
+    RES_GRFATR_MIRRORGRF = RES_GRFATR_BEGIN,        // 130
+    RES_GRFATR_CROPGRF,                             // 131
+
+    RES_GRFATR_ROTATION,                            // 132
+    RES_GRFATR_LUMINANCE,                           // 133
+    RES_GRFATR_CONTRAST,                            // 134
+    RES_GRFATR_CHANNELR,                            // 135
+    RES_GRFATR_CHANNELG,                            // 136
+    RES_GRFATR_CHANNELB,                            // 137
+    RES_GRFATR_GAMMA,                               // 138
+    RES_GRFATR_INVERT,                              // 139
+    RES_GRFATR_TRANSPARENCY,                        // 140
+    RES_GRFATR_DRAWMODE,                            // 141
+
+    RES_GRFATR_DUMMY1,                              // 142
+    RES_GRFATR_DUMMY2,                              // 143
+    RES_GRFATR_DUMMY3,                              // 144
+    RES_GRFATR_DUMMY4,                              // 145
+    RES_GRFATR_DUMMY5,                              // 146
 RES_GRFATR_END
 };
 
 enum RES_BOXATR
 {
 RES_BOXATR_BEGIN = RES_GRFATR_END,
-    RES_BOXATR_FORMAT = RES_BOXATR_BEGIN,           // 149
-    RES_BOXATR_FORMULA,                             // 150
-    RES_BOXATR_VALUE,                               // 151
+    RES_BOXATR_FORMAT = RES_BOXATR_BEGIN,           // 147
+    RES_BOXATR_FORMULA,                             // 148
+    RES_BOXATR_VALUE,                               // 149
 RES_BOXATR_END
 };
 
 enum RES_UNKNOWNATR
 {
 RES_UNKNOWNATR_BEGIN = RES_BOXATR_END,
-    RES_UNKNOWNATR_CONTAINER = RES_UNKNOWNATR_BEGIN,// 152
+    RES_UNKNOWNATR_CONTAINER = RES_UNKNOWNATR_BEGIN,// 150
 RES_UNKNOWNATR_END
 };
 
@@ -280,13 +280,13 @@ RES_UNKNOWNATR_END
 enum RES_FMT
 {
 RES_FMT_BEGIN = RES_UNKNOWNATR_END,
-    RES_CHRFMT = RES_FMT_BEGIN,                     // 144
-    RES_FRMFMT,                                     // 145
-    RES_FLYFRMFMT,                                  // 146
-    RES_TXTFMTCOLL,                                 // 147
-    RES_GRFFMTCOLL,                                 // 148
-    RES_DRAWFRMFMT,                                 // 149
-    RES_CONDTXTFMTCOLL,                             // 150
+    RES_CHRFMT = RES_FMT_BEGIN,                     // 151
+    RES_FRMFMT,                                     // 152
+    RES_FLYFRMFMT,                                  // 153
+    RES_TXTFMTCOLL,                                 // 154
+    RES_GRFFMTCOLL,                                 // 155
+    RES_DRAWFRMFMT,                                 // 156
+    RES_CONDTXTFMTCOLL,                             // 157
 RES_FMT_END
 };
 
@@ -294,7 +294,7 @@ RES_FMT_END
 enum RES_MSG
 {
 RES_MSG_BEGIN = RES_FMT_END,
-    RES_OBJECTDYING = RES_MSG_BEGIN,                // 151
+    RES_OBJECTDYING = RES_MSG_BEGIN,                // 158
     RES_FMT_CHG,
     RES_ATTRSET_CHG,
     RES_FRM_SIZECHG,
commit 7596e26fd259ce5445212949403e7cd32303b2bd
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Tue Jun 24 17:11:25 2014 +0200

    Add SwTextBoxHelper::findShapes
    
    It builds a textbox -> shape map, so methods interested to pick the
    shape instead of a shape's textbox can call it and act accordingly if
    their textbox is in the map.
    
    Change-Id: I0f30d64a284eb461f462ed6c0a36c88271153f04

diff --git a/sw/inc/textboxhelper.hxx b/sw/inc/textboxhelper.hxx
index c7ba2f4..8b48564 100644
--- a/sw/inc/textboxhelper.hxx
+++ b/sw/inc/textboxhelper.hxx
@@ -69,6 +69,8 @@ public:
 
     /// Look up TextFrames in a document, which are in fact TextBoxes.
     static std::list<SwFrmFmt*> findTextBoxes(const SwDoc* pDoc);
+    /// Build a textbox -> shape format map.
+    static std::map<SwFrmFmt*, SwFrmFmt*> findShapes(const SwDoc* pDoc);
     /// Count number of shapes in the document, excluding TextBoxes.
     static sal_Int32 getCount(SdrPage* pPage, std::list<SwFrmFmt*>& rTextBoxes);
     /// Get a shape by index, excluding TextBoxes.
diff --git a/sw/qa/extras/uiwriter/data/shape-textbox-delete.odt b/sw/qa/extras/uiwriter/data/shape-textbox.odt
similarity index 100%
rename from sw/qa/extras/uiwriter/data/shape-textbox-delete.odt
rename to sw/qa/extras/uiwriter/data/shape-textbox.odt
diff --git a/sw/qa/extras/uiwriter/uiwriter.cxx b/sw/qa/extras/uiwriter/uiwriter.cxx
index 2bf8d5a..9ec5a76 100644
--- a/sw/qa/extras/uiwriter/uiwriter.cxx
+++ b/sw/qa/extras/uiwriter/uiwriter.cxx
@@ -17,8 +17,10 @@
 #include <redline.hxx>
 #include <section.hxx>
 #include <fmtclds.hxx>
+#include <dcontact.hxx>
 
 #include <svx/svdpage.hxx>
+#include <svx/svdview.hxx>
 
 #include "UndoManager.hxx"
 
@@ -39,6 +41,7 @@ public:
     void testFdo75110();
     void testFdo75898();
     void testFdo74981();
+    void testShapeTextboxSelect();
     void testShapeTextboxDelete();
     void testCp1000071();
 
@@ -52,6 +55,7 @@ public:
     CPPUNIT_TEST(testFdo75110);
     CPPUNIT_TEST(testFdo75898);
     CPPUNIT_TEST(testFdo74981);
+    CPPUNIT_TEST(testShapeTextboxSelect);
     CPPUNIT_TEST(testShapeTextboxDelete);
     CPPUNIT_TEST(testCp1000071);
     CPPUNIT_TEST_SUITE_END();
@@ -282,9 +286,27 @@ void SwUiWriterTest::testFdo74981()
     CPPUNIT_ASSERT(!pTxtNode->HasHints());
 }
 
+void SwUiWriterTest::testShapeTextboxSelect()
+{
+    SwDoc* pDoc = createDoc("shape-textbox.odt");
+    SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
+    SdrPage* pPage = pDoc->getIDocumentDrawModelAccess().GetDrawModel()->GetPage(0);
+    SdrObject* pObject = pPage->GetObj(1);
+    SwDrawContact* pTextBox = static_cast<SwDrawContact*>(pObject->GetUserCall());
+    // First, make sure that pTextBox is a fly frame (textbox of a shape).
+    CPPUNIT_ASSERT_EQUAL(RES_FLYFRMFMT, static_cast<RES_FMT>(pTextBox->GetFmt()->Which()));
+
+    // Then select it.
+    pWrtShell->SelectObj(Point(), 0, pObject);
+    const SdrMarkList& rMarkList = pWrtShell->GetDrawView()->GetMarkedObjectList();
+    SwDrawContact* pShape = static_cast<SwDrawContact*>(rMarkList.GetMark(0)->GetMarkedSdrObj()->GetUserCall());
+    // And finally make sure the shape got selected, not just the textbox itself.
+    CPPUNIT_ASSERT_EQUAL(RES_DRAWFRMFMT, static_cast<RES_FMT>(pShape->GetFmt()->Which()));
+}
+
 void SwUiWriterTest::testShapeTextboxDelete()
 {
-    SwDoc* pDoc = createDoc("shape-textbox-delete.odt");
+    SwDoc* pDoc = createDoc("shape-textbox.odt");
     SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
     SdrPage* pPage = pDoc->getIDocumentDrawModelAccess().GetDrawModel()->GetPage(0);
     SdrObject* pObject = pPage->GetObj(0);
diff --git a/sw/source/core/doc/textboxhelper.cxx b/sw/source/core/doc/textboxhelper.cxx
index 8e6bfd5..90d2b54 100644
--- a/sw/source/core/doc/textboxhelper.cxx
+++ b/sw/source/core/doc/textboxhelper.cxx
@@ -126,6 +126,21 @@ std::list<SwFrmFmt*> SwTextBoxHelper::findTextBoxes(const SwDoc* pDoc)
     return aRet;
 }
 
+std::map<SwFrmFmt*, SwFrmFmt*> SwTextBoxHelper::findShapes(const SwDoc* pDoc)
+{
+    std::map<SwFrmFmt*, SwFrmFmt*> aRet;
+
+    const SwFrmFmts& rSpzFrmFmts = *pDoc->GetSpzFrmFmts();
+    for (SwFrmFmts::const_iterator it = rSpzFrmFmts.begin(); it != rSpzFrmFmts.end(); ++it)
+    {
+        SwFrmFmt* pTextBox = findTextBox(*it);
+        if (pTextBox)
+            aRet[pTextBox] = *it;
+    }
+
+    return aRet;
+}
+
 /// If the passed SdrObject is in fact a TextFrame, that is used as a TextBox.
 bool lcl_isTextBox(SdrObject* pSdrObject, std::list<SwFrmFmt*>& rTextBoxes)
 {
diff --git a/sw/source/core/frmedt/feshview.cxx b/sw/source/core/frmedt/feshview.cxx
index e1655e8..6ff58cc 100644
--- a/sw/source/core/frmedt/feshview.cxx
+++ b/sw/source/core/frmedt/feshview.cxx
@@ -40,6 +40,7 @@
 #include <DocumentSettingManager.hxx>
 #include <cmdid.h>
 #include <drawdoc.hxx>
+#include <textboxhelper.hxx>
 #include <poolfmt.hrc>
 #include <frmfmt.hxx>
 #include <frmatr.hxx>
@@ -220,6 +221,22 @@ bool SwFEShell::SelectObj( const Point& rPt, sal_uInt8 nFlag, SdrObject *pObj )
         }
     }
 
+    // If the fly frame is a textbox of a shape, then select the shape instead.
+    std::map<SwFrmFmt*, SwFrmFmt*> aTextBoxShapes = SwTextBoxHelper::findShapes(mpDoc);
+    for (sal_uInt16 i = 0; i < rMrkList.GetMarkCount(); ++i)
+    {
+        SdrObject* pObject = rMrkList.GetMark(i)->GetMarkedSdrObj();
+        SwDrawContact* pDrawContact = static_cast<SwDrawContact*>(GetUserCall(pObject));
+        SwFrmFmt* pFmt = pDrawContact->GetFmt();
+        if (aTextBoxShapes.find(pFmt) != aTextBoxShapes.end())
+        {
+            SdrObject* pShape = aTextBoxShapes[pFmt]->FindSdrObject();
+            pDView->UnmarkAll();
+            pDView->MarkObj(pShape, Imp()->GetPageView(), bAddSelect, bEnterGroup);
+            break;
+        }
+    }
+
     if ( bRet )
     {
         ::lcl_GrabCursor(this, pOldSelFly);
diff --git a/sw/source/uibase/docvw/edtwin.cxx b/sw/source/uibase/docvw/edtwin.cxx
index e1fda39..6887cd0 100644
--- a/sw/source/uibase/docvw/edtwin.cxx
+++ b/sw/source/uibase/docvw/edtwin.cxx
@@ -76,6 +76,8 @@
 #include <wrtsh.hxx>
 #include <IDocumentSettingAccess.hxx>
 #include <IDocumentDrawModelAccess.hxx>
+#include <textboxhelper.hxx>
+#include <dcontact.hxx>
 #include <fldbas.hxx>
 #include <swmodule.hxx>
 #include <docsh.hxx>
@@ -4241,8 +4243,21 @@ void SwEditWin::MouseButtonUp(const MouseEvent& rMEvt)
             SdrPageView* pPV;
             if (pSdrView->PickObj(aDocPos, pSdrView->getHitTolLog(), pObj, pPV, SDRSEARCH_ALSOONMASTER ))
             {
-                pSdrView->UnmarkAllObj();
-                pSdrView->MarkObj(pObj,pPV,false,false);
+                std::map<SwFrmFmt*, SwFrmFmt*> aTextBoxShapes = SwTextBoxHelper::findShapes(rSh.GetDoc());
+                SwDrawContact* pDrawContact = static_cast<SwDrawContact*>(GetUserCall(pObj));
+                SwFrmFmt* pFmt = pDrawContact->GetFmt();
+                if (aTextBoxShapes.find(pFmt) == aTextBoxShapes.end())
+                {
+                    pSdrView->UnmarkAllObj();
+                    pSdrView->MarkObj(pObj,pPV,false,false);
+                }
+                else
+                {
+                    // If the fly frame is a textbox of a shape, then select the shape instead.
+                    SdrObject* pShape = aTextBoxShapes[pFmt]->FindSdrObject();
+                    pSdrView->UnmarkAllObj();
+                    pSdrView->MarkObj(pShape, pPV, false, false);
+                }
             }
         }
         ReleaseMouse();


More information about the Libreoffice-commits mailing list