[Libreoffice-commits] core.git: Branch 'distro/suse/suse-4.0' - 5 commits - oox/inc oox/source sw/inc sw/source

Miklos Vajna vmiklos at suse.cz
Tue Apr 2 01:27:26 PDT 2013


 oox/inc/oox/vml/vmlshape.hxx      |   15 ++++++---------
 oox/source/vml/vmlshape.cxx       |   23 ++++++++++++++++++-----
 sw/inc/fldbas.hxx                 |    2 ++
 sw/source/core/fields/fldbas.cxx  |   15 +++++++++++++++
 sw/source/core/layout/trvlfrm.cxx |   19 ++++++++++++++++++-
 sw/source/core/text/itrcrsr.cxx   |    4 +++-
 sw/source/core/text/itrform2.cxx  |   18 ++++++++++++++++++
 sw/source/ui/docvw/edtwin.cxx     |    7 ++++++-
 sw/source/ui/wrtsh/wrtsh2.cxx     |    2 ++
 9 files changed, 88 insertions(+), 17 deletions(-)

New commits:
commit ad19ec1d08aed974e193978eb3e647a2bcf06767
Author: Miklos Vajna <vmiklos at suse.cz>
Date:   Wed Jan 30 16:43:35 2013 +0100

    n#792778 oox: implement import of v:line inside v:group
    
    The problem was that in ShapeBase::convertAndInsert(), the rectangle
    calculated for a line was zero, that's why it wasn't imported. Fix this
    by overriding the get*Rectangle() methods in LineShape, instead of doing
    so with implConvertAndInsert().
    
    (cherry picked from commit 7877638814de86202d33b5653a0f91d63341e98c)
    
    Conflicts:
    	oox/source/vml/vmlshape.cxx
    
    Change-Id: Ie4bb2f7964b438cb56e4f5ee7a4ebe9f8f8eb734

diff --git a/oox/inc/oox/vml/vmlshape.hxx b/oox/inc/oox/vml/vmlshape.hxx
index 2f4ab6f..bd7ced4 100644
--- a/oox/inc/oox/vml/vmlshape.hxx
+++ b/oox/inc/oox/vml/vmlshape.hxx
@@ -127,12 +127,10 @@ protected:
     ::com::sun::star::awt::Rectangle getCoordSystem() const;
     /** Returns the absolute shape rectangle according to the passed anchor. */
     ::com::sun::star::awt::Rectangle getRectangle( const ShapeParentAnchor* pParentAnchor ) const;
-
-private:
     /** Returns the absolute shape rectangle. */
-    ::com::sun::star::awt::Rectangle getAbsRectangle() const;
+    virtual ::com::sun::star::awt::Rectangle getAbsRectangle() const;
     /** Returns the rectangle relative to the parent coordinate system. */
-    ::com::sun::star::awt::Rectangle getRelRectangle() const;
+    virtual ::com::sun::star::awt::Rectangle getRelRectangle() const;
 
 protected:
     Drawing&            mrDrawing;          ///< The VML drawing page that contains this shape.
@@ -340,11 +338,10 @@ public:
     explicit            LineShape( Drawing& rDrawing );
 
 protected:
-    /** Creates the corresponding XShape and inserts it into the passed container. */
-    virtual ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape >
-                        implConvertAndInsert(
-                            const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShapes >& rxShapes,
-                            const ::com::sun::star::awt::Rectangle& rShapeRect ) const;
+    /** Returns the absolute shape rectangle. */
+    virtual ::com::sun::star::awt::Rectangle getAbsRectangle() const;
+    /** Returns the rectangle relative to the parent coordinate system. */
+    virtual ::com::sun::star::awt::Rectangle getRelRectangle() const;
 };
 
 /** Bezier shape object that supports to, from, control1 and control2
diff --git a/oox/source/vml/vmlshape.cxx b/oox/source/vml/vmlshape.cxx
index 1b0caf9..6dfa35a 100644
--- a/oox/source/vml/vmlshape.cxx
+++ b/oox/source/vml/vmlshape.cxx
@@ -295,7 +295,6 @@ Reference< XShape > ShapeBase::convertAndInsert( const Reference< XShapes >& rxS
             according to some imported shape client data (e.g. Excel cell anchor). */
         Rectangle aShapeRect = calcShapeRectangle( pParentAnchor );
 
-        // convert the shape, if the calculated rectangle is not empty
         if( ((aShapeRect.Width > 0) || (aShapeRect.Height > 0)) && rxShapes.is() )
         {
             xShape = implConvertAndInsert( rxShapes, aShapeRect );
@@ -318,6 +317,8 @@ Reference< XShape > ShapeBase::convertAndInsert( const Reference< XShapes >& rxS
                 mrDrawing.notifyXShapeInserted( xShape, aShapeRect, *this, bGroupChild );
             }
         }
+        else
+            SAL_WARN("oox", "not converting shape, as calculated rectangle is empty");
     }
     return xShape;
 }
@@ -610,10 +611,10 @@ LineShape::LineShape(Drawing& rDrawing)
 {
 }
 
-Reference<XShape> LineShape::implConvertAndInsert(const Reference<XShapes>& rxShapes, const Rectangle& rShapeRect) const
+awt::Rectangle LineShape::getAbsRectangle() const
 {
     const GraphicHelper& rGraphicHelper = mrDrawing.getFilter().getGraphicHelper();
-    Rectangle aShapeRect(rShapeRect);
+    awt::Rectangle aShapeRect;
     sal_Int32 nIndex = 0;
 
     aShapeRect.X = ConversionHelper::decodeMeasureToHmm(rGraphicHelper, maShapeModel.maFrom.getToken(0, ',', nIndex), 0, true, true);
@@ -621,8 +622,20 @@ Reference<XShape> LineShape::implConvertAndInsert(const Reference<XShapes>& rxSh
     nIndex = 0;
     aShapeRect.Width = ConversionHelper::decodeMeasureToHmm(rGraphicHelper, maShapeModel.maTo.getToken(0, ',', nIndex), 0, true, true) - aShapeRect.X;
     aShapeRect.Height = ConversionHelper::decodeMeasureToHmm(rGraphicHelper, maShapeModel.maTo.getToken(0, ',', nIndex), 0, false, true) - aShapeRect.Y;
+    return aShapeRect;
+}
 
-    return SimpleShape::implConvertAndInsert(rxShapes, aShapeRect);
+awt::Rectangle LineShape::getRelRectangle() const
+{
+    awt::Rectangle aShapeRect;
+    sal_Int32 nIndex = 0;
+
+    aShapeRect.X = maShapeModel.maFrom.getToken(0, ',', nIndex).toInt32();
+    aShapeRect.Y = maShapeModel.maFrom.getToken(0, ',', nIndex).toInt32();
+    nIndex = 0;
+    aShapeRect.Width = maShapeModel.maTo.getToken(0, ',', nIndex).toInt32() - aShapeRect.X;
+    aShapeRect.Height = maShapeModel.maTo.getToken(0, ',', nIndex).toInt32() - aShapeRect.Y;
+    return aShapeRect;
 }
 
 // ============================================================================
@@ -860,9 +873,9 @@ Reference< XShape > GroupShape::implConvertAndInsert( const Reference< XShapes >
         xGroupShape = mrDrawing.createAndInsertXShape( CREATE_OUSTRING( "com.sun.star.drawing.GroupShape" ), rxShapes, rShapeRect );
         Reference< XShapes > xChildShapes( xGroupShape, UNO_QUERY_THROW );
         mxChildren->convertAndInsert( xChildShapes, &aParentAnchor );
-        // no child shape has been created - delete the group shape
         if( !xChildShapes->hasElements() )
         {
+            SAL_WARN("oox", "no child shape has been created - deleting the group shape");
             rxShapes->remove( xGroupShape );
             xGroupShape.clear();
         }
commit cbb2863456cc71c44c8df70a4c4743537b0b0af9
Author: Miklos Vajna <vmiklos at suse.cz>
Date:   Tue Mar 5 16:25:57 2013 +0100

    bnc#793998 SwTxtFormatter::FormatLine: fix missing repaints
    
    The incorrect SwLineLayout width caused a missing repaint when a
    character is inserted after the tab in the bugdoc, see the already
    existing sw/qa/extras/ooxmlimport/data/n793998.docx.
    
    Change-Id: I685203eeb2ed4236758d65132069cd894ece488c
    (cherry picked from commit 5dc729cae00e6ea35f5dde13eba89434be2d7dc5)

diff --git a/sw/source/core/text/itrform2.cxx b/sw/source/core/text/itrform2.cxx
index b36aa42..60c17da 100644
--- a/sw/source/core/text/itrform2.cxx
+++ b/sw/source/core/text/itrform2.cxx
@@ -1595,6 +1595,24 @@ xub_StrLen SwTxtFormatter::FormatLine( const xub_StrLen nStartPos )
         }
     }
 
+    // In case of compat mode, it's possible that a tab portion is wider after
+    // formatting than before. If this is the case, we also have to make sure
+    // the SwLineLayout is wider as well.
+    if (GetInfo().GetTxtFrm()->GetTxtNode()->getIDocumentSettingAccess()->get(IDocumentSettingAccess::TAB_OVER_MARGIN))
+    {
+        sal_uInt16 nSum = 0;
+        SwLinePortion* pPor = pCurr->GetFirstPortion();
+
+        while (pPor)
+        {
+            nSum += pPor->Width();
+            pPor = pPor->GetPortion();
+        }
+
+        if (nSum > pCurr->Width())
+            pCurr->Width(nSum);
+    }
+
     // calculate optimal repaint rectangle
     if ( bOptimizeRepaint )
     {
commit 029ee0a0cb935283f0f0a997674944f1ea87c9f0
Author: Miklos Vajna <vmiklos at suse.cz>
Date:   Mon Feb 25 15:00:08 2013 +0100

    n#793998 SwTxtCursor::GetCharRect: respect TabOverMargin compat mode
    
    Change-Id: I47280399bd9e0757365db8f4f1930efd0a340424
    (cherry picked from commit 5e992f88d9f78a062bd78ea8907fa247f1f49b5f)

diff --git a/sw/source/core/text/itrcrsr.cxx b/sw/source/core/text/itrcrsr.cxx
index 3127ae8..3fe4ce6 100644
--- a/sw/source/core/text/itrcrsr.cxx
+++ b/sw/source/core/text/itrcrsr.cxx
@@ -1209,7 +1209,9 @@ sal_Bool SwTxtCursor::GetCharRect( SwRect* pOrig, const xub_StrLen nOfst,
         pCMS->p2Lines->aPortion.Pos().Y() += aCharPos.Y();
     }
 
-    if( pOrig->Left() > nTmpRight )
+    const bool bTabOverMargin = GetTxtFrm()->GetTxtNode()->getIDocumentSettingAccess()->get(IDocumentSettingAccess::TAB_OVER_MARGIN);
+    // Make sure the cursor respects the right margin, unless in compat mode, where the tab size has priority over the margin size.
+    if( pOrig->Left() > nTmpRight && !bTabOverMargin)
         pOrig->Pos().X() = nTmpRight;
 
     if( nMax )
commit 88d46b9198a42956c521080f2aa7f3acf73cde06
Author: Miklos Vajna <vmiklos at suse.cz>
Date:   Tue Feb 26 11:48:22 2013 +0100

    n#802888 SwEditWin: let fields have priority over header/footer flys
    
    http://people.freedesktop.org/~vmiklos/2013/watermark-field-click.odt is
    a reproducer, double-click was catched by the fly frame from the header,
    so the field edit dialog didn't appear.
    
    Change-Id: Ibd3ea382085fa4cbdc1af73d4be1e5c053a81eaa
    (cherry picked from commit 61f467c8974d6b6face41e7027d75ae4ddb6fdb2)
    
    Conflicts:
    	sw/source/ui/docvw/edtwin.cxx

diff --git a/sw/source/ui/docvw/edtwin.cxx b/sw/source/ui/docvw/edtwin.cxx
index 27853a8..1529566 100644
--- a/sw/source/ui/docvw/edtwin.cxx
+++ b/sw/source/ui/docvw/edtwin.cxx
@@ -2774,6 +2774,12 @@ void SwEditWin::MouseButtonDown(const MouseEvent& _rMEvt)
     bool bOverFly = false;
     bool bPageAnchored = false;
     bool bOverHeaderFooterFly = IsOverHeaderFooterFly( aDocPos, eControl, bOverFly, bPageAnchored );
+
+    sal_Bool bIsDocReadOnly = rView.GetDocShell()->IsReadOnly();
+    if (bOverHeaderFooterFly && (!bIsDocReadOnly && rSh.GetCurFld()))
+        // We have a field here, that should have priority over header/footer fly.
+        bOverHeaderFooterFly = false;
+
     int nNbFlyClicks = 1;
     // !bOverHeaderFooterFly doesn't mean we have a frame to select
     if ( !bPageAnchored && ( ( rSh.IsHeaderFooterEdit( ) && !bOverHeaderFooterFly && bOverFly ) ||
@@ -2870,7 +2876,6 @@ void SwEditWin::MouseButtonDown(const MouseEvent& _rMEvt)
     // work but in practice ...
     rView.SelectShellForDrop();
 
-    sal_Bool bIsDocReadOnly = rView.GetDocShell()->IsReadOnly();
     sal_Bool bCallBase = sal_True;
 
     if( pQuickHlpData->m_bIsDisplayed )
commit a53e649884bb94dd99e9c930b583d8235add6363
Author: Miklos Vajna <vmiklos at suse.cz>
Date:   Tue Mar 19 13:41:19 2013 +0100

    bnc#802888 SwPageFrm: let macro fields have priority over background objects
    
    The intention is to get similar behavior as
    61f467c8974d6b6face41e7027d75ae4ddb6fdb2, except this applies to single
    clicks, while that one affected only double-click.
    
    Change-Id: Idddc26aa8cd064f89fb4f99b3ad7a5430ac455bc
    (cherry picked from commits a996678ed30804e16103e1cfdc439c8546e5d3b0 and
    e76e2c4ce76457e518b007b970e1b0c2742f8d6e)

diff --git a/sw/inc/fldbas.hxx b/sw/inc/fldbas.hxx
index c8e9fd7..55834ff 100644
--- a/sw/inc/fldbas.hxx
+++ b/sw/inc/fldbas.hxx
@@ -343,6 +343,8 @@ public:
     void                SetAutomaticLanguage(sal_Bool bSet){bIsAutomaticLanguage = bSet;}
 
     virtual String      GetDescription() const;
+    /// Is this field clickable?
+    bool IsClickable() const;
 };
 
 inline SwFieldType* SwField::GetTyp() const
diff --git a/sw/source/core/fields/fldbas.cxx b/sw/source/core/fields/fldbas.cxx
index a28d6ee..1c9e2b9 100644
--- a/sw/source/core/fields/fldbas.cxx
+++ b/sw/source/core/fields/fldbas.cxx
@@ -761,6 +761,21 @@ String SwField::GetDescription() const
     return SW_RES(STR_FIELD);
 }
 
+bool SwField::IsClickable() const
+{
+    switch (Which())
+    {
+        case RES_JUMPEDITFLD:
+        case RES_MACROFLD:
+        case RES_GETREFFLD:
+        case RES_INPUTFLD:
+        case RES_SETEXPFLD:
+        case RES_DROPDOWN:
+            return true;
+    }
+    return false;
+}
+
 sal_uInt16 SwFldTypes::GetPos(const SwFieldType* pFieldType) const
 {
     const_iterator it = std::find(begin(), end(), pFieldType);
diff --git a/sw/source/core/layout/trvlfrm.cxx b/sw/source/core/layout/trvlfrm.cxx
index 443af12..517cb84 100644
--- a/sw/source/core/layout/trvlfrm.cxx
+++ b/sw/source/core/layout/trvlfrm.cxx
@@ -50,6 +50,9 @@
 #include <dcontact.hxx>
 // OD 2004-05-24 #i28701#
 #include <sortedobjs.hxx>
+#include <txatbase.hxx>
+#include <fmtfld.hxx>
+#include <fldbas.hxx>
 
 // FLT_MAX
 #include <cfloat>
@@ -290,10 +293,24 @@ sal_Bool SwPageFrm::GetCrsrOfst( SwPosition *pPos, Point &rPoint,
                 bValidTextDistance = true;
             }
 
+            bool bConsiderBackground = true;
+            // If the text position is a clickable field, then that should have priority.
+            if (pTextNd->IsTxtNode())
+            {
+                SwTxtNode* pTxtNd = pTextNd->GetTxtNode();
+                SwTxtAttr* pTxtAttr = pTxtNd->GetTxtAttrForCharAt(aTextPos.nContent.GetIndex(), RES_TXTATR_FIELD);
+                if (pTxtAttr)
+                {
+                    const SwField* pField = pTxtAttr->GetFld().GetFld();
+                    if (pField->IsClickable())
+                        bConsiderBackground = false;
+                }
+            }
+
             double nBackDistance = 0;
             bool bValidBackDistance = false;
             SwCntntNode* pBackNd = aBackPos.nNode.GetNode( ).GetCntntNode( );
-            if ( pBackNd )
+            if ( pBackNd && bConsiderBackground)
             {
                 // FIXME There are still cases were we don't have the proper node here.
                 SwCntntFrm* pBackFrm = pBackNd->getLayoutFrm( getRootFrm( ) );
diff --git a/sw/source/ui/wrtsh/wrtsh2.cxx b/sw/source/ui/wrtsh/wrtsh2.cxx
index 86fe158..3dcdffa 100644
--- a/sw/source/ui/wrtsh/wrtsh2.cxx
+++ b/sw/source/ui/wrtsh/wrtsh2.cxx
@@ -315,6 +315,8 @@ void SwWrtShell::ClickToField( const SwField& rFld )
     case RES_DROPDOWN :
         StartDropDownFldDlg( (SwField*)&rFld, sal_False );
     break;
+    default:
+        SAL_WARN_IF(rFld.IsClickable(), "sw", "unhandled clickable field!");
     }
 
     bIsInClickToEdit = sal_False;


More information about the Libreoffice-commits mailing list