LCOV - code coverage report
Current view: top level - libreoffice/svx/source/table - viewcontactoftableobj.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 5 277 1.8 %
Date: 2012-12-27 Functions: 3 35 8.6 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : 
      21             : #include "viewcontactoftableobj.hxx"
      22             : #include <svx/svdotable.hxx>
      23             : #include <com/sun/star/table/XTable.hpp>
      24             : #include <basegfx/polygon/b2dpolygontools.hxx>
      25             : #include <basegfx/polygon/b2dpolygon.hxx>
      26             : #include <drawinglayer/primitive2d/polygonprimitive2d.hxx>
      27             : #include <svx/sdr/primitive2d/sdrattributecreator.hxx>
      28             : #include <drawinglayer/primitive2d/groupprimitive2d.hxx>
      29             : #include <svx/sdr/primitive2d/sdrdecompositiontools.hxx>
      30             : #include <basegfx/matrix/b2dhommatrix.hxx>
      31             : #include <svx/sdr/attribute/sdrtextattribute.hxx>
      32             : #include <svx/sdr/primitive2d/svx_primitivetypes2d.hxx>
      33             : #include <editeng/borderline.hxx>
      34             : #include <drawinglayer/primitive2d/borderlineprimitive2d.hxx>
      35             : #include <svx/sdr/attribute/sdrfilltextattribute.hxx>
      36             : #include <drawinglayer/attribute/sdrlineattribute.hxx>
      37             : #include <drawinglayer/attribute/sdrshadowattribute.hxx>
      38             : #include <drawinglayer/primitive2d/sdrdecompositiontools2d.hxx>
      39             : #include <basegfx/matrix/b2dhommatrixtools.hxx>
      40             : 
      41             : #include "cell.hxx"
      42             : #include "tablelayouter.hxx"
      43             : 
      44             : //////////////////////////////////////////////////////////////////////////////
      45             : 
      46             : using editeng::SvxBorderLine;
      47             : using namespace com::sun::star;
      48             : 
      49             : //////////////////////////////////////////////////////////////////////////////
      50             : 
      51             : namespace drawinglayer
      52             : {
      53             :     namespace primitive2d
      54             :     {
      55           0 :         class SdrCellPrimitive2D : public BufferedDecompositionPrimitive2D
      56             :         {
      57             :         private:
      58             :             basegfx::B2DHomMatrix                       maTransform;
      59             :             attribute::SdrFillTextAttribute             maSdrFTAttribute;
      60             : 
      61             :         protected:
      62             :             // local decomposition.
      63             :             virtual Primitive2DSequence create2DDecomposition(const geometry::ViewInformation2D& aViewInformation) const;
      64             : 
      65             :         public:
      66           0 :             SdrCellPrimitive2D(
      67             :                 const basegfx::B2DHomMatrix& rTransform,
      68             :                 const attribute::SdrFillTextAttribute& rSdrFTAttribute)
      69             :             :   BufferedDecompositionPrimitive2D(),
      70             :                 maTransform(rTransform),
      71           0 :                 maSdrFTAttribute(rSdrFTAttribute)
      72             :             {
      73           0 :             }
      74             : 
      75             :             // data access
      76           0 :             const basegfx::B2DHomMatrix& getTransform() const { return maTransform; }
      77           0 :             const attribute::SdrFillTextAttribute& getSdrFTAttribute() const { return maSdrFTAttribute; }
      78             : 
      79             :             // compare operator
      80             :             virtual bool operator==(const BasePrimitive2D& rPrimitive) const;
      81             : 
      82             :             // provide unique ID
      83             :             DeclPrimitrive2DIDBlock()
      84             :         };
      85             : 
      86           0 :         Primitive2DSequence SdrCellPrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& /*aViewInformation*/) const
      87             :         {
      88             :             // prepare unit polygon
      89           0 :             Primitive2DSequence aRetval;
      90           0 :             const basegfx::B2DPolyPolygon aUnitPolyPolygon(basegfx::tools::createUnitPolygon());
      91             : 
      92             :             // add fill
      93           0 :             if(!getSdrFTAttribute().getFill().isDefault())
      94             :             {
      95             :                 appendPrimitive2DReferenceToPrimitive2DSequence(aRetval,
      96             :                     createPolyPolygonFillPrimitive(
      97             :                         aUnitPolyPolygon,
      98           0 :                         getTransform(),
      99           0 :                         getSdrFTAttribute().getFill(),
     100           0 :                         getSdrFTAttribute().getFillFloatTransGradient()));
     101             :             }
     102             :             else
     103             :             {
     104             :                 // if no fill create one for HitTest and BoundRect fallback
     105             :                 appendPrimitive2DReferenceToPrimitive2DSequence(aRetval,
     106             :                     createHiddenGeometryPrimitives2D(
     107             :                         true,
     108             :                         aUnitPolyPolygon,
     109           0 :                         getTransform()));
     110             :             }
     111             : 
     112             :             // add text
     113           0 :             if(!getSdrFTAttribute().getText().isDefault())
     114             :             {
     115             :                 appendPrimitive2DReferenceToPrimitive2DSequence(aRetval,
     116             :                     createTextPrimitive(
     117             :                         aUnitPolyPolygon,
     118           0 :                         getTransform(),
     119           0 :                         getSdrFTAttribute().getText(),
     120             :                         attribute::SdrLineAttribute(),
     121             :                         true,
     122             :                         false,
     123           0 :                         false));
     124             :             }
     125             : 
     126           0 :             return aRetval;
     127             :         }
     128             : 
     129           0 :         bool SdrCellPrimitive2D::operator==(const BasePrimitive2D& rPrimitive) const
     130             :         {
     131           0 :             if(BufferedDecompositionPrimitive2D::operator==(rPrimitive))
     132             :             {
     133           0 :                 const SdrCellPrimitive2D& rCompare = (SdrCellPrimitive2D&)rPrimitive;
     134             : 
     135           0 :                 return (getTransform() == rCompare.getTransform()
     136           0 :                     && getSdrFTAttribute() == rCompare.getSdrFTAttribute());
     137             :             }
     138             : 
     139           0 :             return false;
     140             :         }
     141             : 
     142             :         // provide unique ID
     143           0 :         ImplPrimitrive2DIDBlock(SdrCellPrimitive2D, PRIMITIVE2D_ID_SDRCELLPRIMITIVE2D)
     144             : 
     145             :     } // end of namespace primitive2d
     146             : } // end of namespace drawinglayer
     147             : 
     148             : //////////////////////////////////////////////////////////////////////////////
     149             : 
     150             : namespace drawinglayer
     151             : {
     152             :     namespace primitive2d
     153             :     {
     154           0 :         class SdrBorderlinePrimitive2D : public BufferedDecompositionPrimitive2D
     155             :         {
     156             :         private:
     157             :             basegfx::B2DHomMatrix                       maTransform;
     158             :             SvxBorderLine                               maLeftLine;
     159             :             SvxBorderLine                               maBottomLine;
     160             :             SvxBorderLine                               maRightLine;
     161             :             SvxBorderLine                               maTopLine;
     162             : 
     163             :             // Neighbor cells' borders
     164             :             SvxBorderLine                               maLeftFromTLine;
     165             :             SvxBorderLine                               maLeftFromBLine;
     166             :             SvxBorderLine                               maRightFromTLine;
     167             :             SvxBorderLine                               maRightFromBLine;
     168             :             SvxBorderLine                               maTopFromLLine;
     169             :             SvxBorderLine                               maTopFromRLine;
     170             :             SvxBorderLine                               maBottomFromLLine;
     171             :             SvxBorderLine                               maBottomFromRLine;
     172             : 
     173             :             // bitfield
     174             :             unsigned                                    mbLeftIsOutside : 1;
     175             :             unsigned                                    mbBottomIsOutside : 1;
     176             :             unsigned                                    mbRightIsOutside : 1;
     177             :             unsigned                                    mbTopIsOutside : 1;
     178             :             unsigned                                    mbInTwips : 1;
     179             : 
     180             :         protected:
     181             :             // local decomposition.
     182             :             virtual Primitive2DSequence create2DDecomposition(const geometry::ViewInformation2D& aViewInformation) const;
     183             : 
     184             :         public:
     185           0 :             SdrBorderlinePrimitive2D(
     186             :                 const basegfx::B2DHomMatrix& rTransform,
     187             :                 const SvxBorderLine& rLeftLine,
     188             :                 const SvxBorderLine& rBottomLine,
     189             :                 const SvxBorderLine& rRightLine,
     190             :                 const SvxBorderLine& rTopLine,
     191             :                 const SvxBorderLine& rLeftFromTLine,
     192             :                 const SvxBorderLine& rLeftFromBLine,
     193             :                 const SvxBorderLine& rRightFromTLine,
     194             :                 const SvxBorderLine& rRightFromBLine,
     195             :                 const SvxBorderLine& rTopFromLLine,
     196             :                 const SvxBorderLine& rTopFromRLine,
     197             :                 const SvxBorderLine& rBottomFromLLine,
     198             :                 const SvxBorderLine& rBottomFromRLine,
     199             :                 bool bLeftIsOutside,
     200             :                 bool bBottomIsOutside,
     201             :                 bool bRightIsOutside,
     202             :                 bool bTopIsOutside,
     203             :                 bool bInTwips)
     204             :             :   BufferedDecompositionPrimitive2D(),
     205             :                 maTransform(rTransform),
     206             :                 maLeftLine(rLeftLine),
     207             :                 maBottomLine(rBottomLine),
     208             :                 maRightLine(rRightLine),
     209             :                 maTopLine(rTopLine),
     210             :                 maLeftFromTLine(rLeftFromTLine),
     211             :                 maLeftFromBLine(rLeftFromBLine),
     212             :                 maRightFromTLine(rRightFromTLine),
     213             :                 maRightFromBLine(rRightFromBLine),
     214             :                 maTopFromLLine(rTopFromLLine),
     215             :                 maTopFromRLine(rTopFromRLine),
     216             :                 maBottomFromLLine(rBottomFromLLine),
     217             :                 maBottomFromRLine(rBottomFromRLine),
     218             :                 mbLeftIsOutside(bLeftIsOutside),
     219             :                 mbBottomIsOutside(bBottomIsOutside),
     220             :                 mbRightIsOutside(bRightIsOutside),
     221             :                 mbTopIsOutside(bTopIsOutside),
     222           0 :                 mbInTwips(bInTwips)
     223             :             {
     224           0 :             }
     225             : 
     226             :             // data access
     227           0 :             const basegfx::B2DHomMatrix& getTransform() const { return maTransform; }
     228           0 :             const SvxBorderLine& getLeftLine() const { return maLeftLine; }
     229           0 :             const SvxBorderLine& getBottomLine() const { return maBottomLine; }
     230           0 :             const SvxBorderLine& getRightLine() const { return maRightLine; }
     231           0 :             const SvxBorderLine& getTopLine() const { return maTopLine; }
     232           0 :             bool getLeftIsOutside() const { return mbLeftIsOutside; }
     233           0 :             bool getBottomIsOutside() const { return mbBottomIsOutside; }
     234           0 :             bool getRightIsOutside() const { return mbRightIsOutside; }
     235           0 :             bool getTopIsOutside() const { return mbTopIsOutside; }
     236           0 :             bool getInTwips() const { return mbInTwips; }
     237             : 
     238             :             // compare operator
     239             :             virtual bool operator==(const BasePrimitive2D& rPrimitive) const;
     240             : 
     241             :             // provide unique ID
     242             :             DeclPrimitrive2DIDBlock()
     243             :         };
     244             : 
     245           0 :         sal_uInt16 getBorderLineOutWidth(const SvxBorderLine& rLineA)
     246             :         {
     247           0 :             return (1 == rLineA.GetOutWidth() ? 0 : rLineA.GetOutWidth());
     248             :         }
     249             : 
     250           0 :         sal_uInt16 getBorderLineDistance(const SvxBorderLine& rLineA)
     251             :         {
     252           0 :             return (1 == rLineA.GetDistance() ? 0 : rLineA.GetDistance());
     253             :         }
     254             : 
     255           0 :         sal_uInt16 getBorderLineInWidth(const SvxBorderLine& rLineA)
     256             :         {
     257           0 :             return (1 == rLineA.GetInWidth() ? 0 : rLineA.GetInWidth());
     258             :         }
     259             : 
     260           0 :         sal_uInt16 getBorderLineWidth(const SvxBorderLine& rLineA)
     261             :         {
     262           0 :             return getBorderLineOutWidth(rLineA) + getBorderLineDistance(rLineA) + getBorderLineInWidth(rLineA);
     263             :         }
     264             : 
     265           0 :         double getExtend(const SvxBorderLine& rLineSide, const SvxBorderLine& rLineOpposite)
     266             :         {
     267           0 :             double nExtend = 0.0;
     268           0 :             if(!rLineSide.isEmpty())
     269             :             {
     270             :                 // reduce to inner edge of associated matching line
     271           0 :                 nExtend = -((getBorderLineWidth(rLineSide) / 2.0));
     272             :             }
     273             :             else
     274             :             {
     275           0 :                 nExtend = ((getBorderLineWidth(rLineOpposite) / 2.0));
     276             :             }
     277             : 
     278           0 :             return nExtend;
     279             :         }
     280             : 
     281           0 :         double getChangedValue(sal_uInt16 nValue, bool bChangeToMM)
     282             :         {
     283           0 :             if(1 == nValue)
     284           0 :                 return 1.0;
     285             : 
     286           0 :             if(bChangeToMM)
     287           0 :                 return nValue * (127.0 / 72.0);
     288             : 
     289           0 :             return (double)nValue;
     290             :         }
     291             : 
     292           0 :         Primitive2DSequence SdrBorderlinePrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& /*aViewInformation*/) const
     293             :         {
     294           0 :             Primitive2DSequence xRetval(4);
     295           0 :             sal_uInt32 nInsert(0);
     296           0 :             const double fTwipsToMM(getInTwips() ? (127.0 / 72.0) : 1.0);
     297             : 
     298           0 :             if(!getLeftLine().isEmpty())
     299             :             {
     300             :                 // create left line from top to bottom
     301           0 :                 const basegfx::B2DPoint aStart(getTransform() * basegfx::B2DPoint(0.0, 0.0));
     302           0 :                 const basegfx::B2DPoint aEnd(getTransform() * basegfx::B2DPoint(0.0, 1.0));
     303             : 
     304           0 :                 if(!aStart.equal(aEnd))
     305             :                 {
     306           0 :                     const double fExtendIS(getExtend(getTopLine(), maTopFromLLine));
     307           0 :                     const double fExtendIE(getExtend(getBottomLine(), maBottomFromLLine));
     308           0 :                     const double fExtendOS(getExtend(maTopFromLLine, getTopLine()));
     309           0 :                     const double fExtendOE(getExtend(maBottomFromLLine, getBottomLine()));
     310             : 
     311           0 :                     xRetval[nInsert++] = Primitive2DReference(new BorderLinePrimitive2D(
     312             :                         aStart,
     313             :                         aEnd,
     314           0 :                         getChangedValue(getLeftLine().GetOutWidth(), getInTwips()),
     315           0 :                         getChangedValue(getLeftLine().GetDistance(), getInTwips()),
     316           0 :                         getChangedValue(getLeftLine().GetInWidth(), getInTwips()),
     317             :                         fExtendIS * fTwipsToMM,
     318             :                         fExtendIE * fTwipsToMM,
     319             :                         fExtendOS * fTwipsToMM,
     320             :                         fExtendOE * fTwipsToMM,
     321           0 :                         getLeftLine().GetColorOut(true).getBColor(),
     322           0 :                         getLeftLine().GetColorIn(true).getBColor(),
     323           0 :                         getLeftLine().GetColorGap().getBColor(),
     324           0 :                         getLeftLine().HasGapColor(),
     325           0 :                         getLeftLine().GetBorderLineStyle()));
     326           0 :                 }
     327             :             }
     328             : 
     329           0 :             if(!getBottomLine().isEmpty() && getBottomIsOutside())
     330             :             {
     331             :                 // create bottom line from left to right
     332           0 :                 const basegfx::B2DPoint aStart(getTransform() * basegfx::B2DPoint(0.0, 1.0));
     333           0 :                 const basegfx::B2DPoint aEnd(getTransform() * basegfx::B2DPoint(1.0, 1.0));
     334             : 
     335           0 :                 if(!aStart.equal(aEnd))
     336             :                 {
     337           0 :                     const double fExtendIS(getExtend(getLeftLine(), maLeftFromBLine ));
     338           0 :                     const double fExtendIE(getExtend(getRightLine(), maRightFromBLine));
     339           0 :                     const double fExtendOS(getExtend(maLeftFromBLine, getLeftLine()));
     340           0 :                     const double fExtendOE(getExtend(maRightFromBLine, getRightLine()));
     341             : 
     342           0 :                     xRetval[nInsert++] = Primitive2DReference(new BorderLinePrimitive2D(
     343             :                         aStart,
     344             :                         aEnd,
     345           0 :                         getChangedValue(getBottomLine().GetOutWidth(), getInTwips()),
     346           0 :                         getChangedValue(getBottomLine().GetDistance(), getInTwips()),
     347           0 :                         getChangedValue(getBottomLine().GetInWidth(), getInTwips()),
     348             :                         fExtendIS * fTwipsToMM,
     349             :                         fExtendIE * fTwipsToMM,
     350             :                         fExtendOS * fTwipsToMM,
     351             :                         fExtendOE * fTwipsToMM,
     352           0 :                         getBottomLine().GetColorOut(false).getBColor(),
     353           0 :                         getBottomLine().GetColorIn(false).getBColor(),
     354           0 :                         getBottomLine().GetColorGap().getBColor(),
     355           0 :                         getBottomLine().HasGapColor(),
     356           0 :                         getBottomLine().GetBorderLineStyle()));
     357           0 :                 }
     358             :             }
     359             : 
     360           0 :             if(!getRightLine().isEmpty() && getRightIsOutside())
     361             :             {
     362             :                 // create right line from top to bottom
     363           0 :                 const basegfx::B2DPoint aStart(getTransform() * basegfx::B2DPoint(1.0, 0.0));
     364           0 :                 const basegfx::B2DPoint aEnd(getTransform() * basegfx::B2DPoint(1.0, 1.0));
     365             : 
     366           0 :                 if(!aStart.equal(aEnd))
     367             :                 {
     368           0 :                     const double fExtendIS(getExtend(getTopLine(), maTopFromRLine));
     369           0 :                     const double fExtendIE(getExtend(getBottomLine(), maBottomFromRLine));
     370           0 :                     const double fExtendOS(getExtend(maTopFromRLine, getTopLine()));
     371           0 :                     const double fExtendOE(getExtend(maBottomFromRLine, getBottomLine()));
     372             : 
     373           0 :                     xRetval[nInsert++] = Primitive2DReference(new BorderLinePrimitive2D(
     374             :                         aStart,
     375             :                         aEnd,
     376           0 :                         getChangedValue(getRightLine().GetOutWidth(), getInTwips()),
     377           0 :                         getChangedValue(getRightLine().GetDistance(), getInTwips()),
     378           0 :                         getChangedValue(getRightLine().GetInWidth(), getInTwips()),
     379             :                         fExtendOS * fTwipsToMM,
     380             :                         fExtendOE * fTwipsToMM,
     381             :                         fExtendIS * fTwipsToMM,
     382             :                         fExtendIE * fTwipsToMM,
     383           0 :                         getRightLine().GetColorOut(true).getBColor(),
     384           0 :                         getRightLine().GetColorIn(true).getBColor(),
     385           0 :                         getRightLine().GetColorGap().getBColor(),
     386           0 :                         getRightLine().HasGapColor(),
     387           0 :                         getRightLine().GetBorderLineStyle()));
     388           0 :                 }
     389             :             }
     390             : 
     391           0 :             if(!getTopLine().isEmpty())
     392             :             {
     393             :                 // create top line from left to right
     394           0 :                 const basegfx::B2DPoint aStart(getTransform() * basegfx::B2DPoint(0.0, 0.0));
     395           0 :                 const basegfx::B2DPoint aEnd(getTransform() * basegfx::B2DPoint(1.0, 0.0));
     396             : 
     397           0 :                 if(!aStart.equal(aEnd))
     398             :                 {
     399           0 :                     const double fExtendIS(getExtend(getLeftLine(), maLeftFromTLine));
     400           0 :                     const double fExtendIE(getExtend(getRightLine(), maRightFromTLine));
     401           0 :                     const double fExtendOS(getExtend(maLeftFromTLine, getLeftLine()));
     402           0 :                     const double fExtendOE(getExtend(maRightFromTLine, getRightLine()));
     403             : 
     404           0 :                     xRetval[nInsert++] = Primitive2DReference(new BorderLinePrimitive2D(
     405             :                         aStart,
     406             :                         aEnd,
     407           0 :                         getChangedValue(getTopLine().GetOutWidth(), getInTwips()),
     408           0 :                         getChangedValue(getTopLine().GetDistance(), getInTwips()),
     409           0 :                         getChangedValue(getTopLine().GetInWidth(), getInTwips()),
     410             :                         fExtendOS * fTwipsToMM,
     411             :                         fExtendOE * fTwipsToMM,
     412             :                         fExtendIS * fTwipsToMM,
     413             :                         fExtendIE * fTwipsToMM,
     414           0 :                         getTopLine().GetColorOut(false).getBColor(),
     415           0 :                         getTopLine().GetColorIn(false).getBColor(),
     416           0 :                         getTopLine().GetColorGap().getBColor(),
     417           0 :                         getTopLine().HasGapColor(),
     418           0 :                         getTopLine().GetBorderLineStyle()));
     419           0 :                 }
     420             :             }
     421             : 
     422           0 :             xRetval.realloc(nInsert);
     423           0 :             return xRetval;
     424             :         }
     425             : 
     426           0 :         bool SdrBorderlinePrimitive2D::operator==(const BasePrimitive2D& rPrimitive) const
     427             :         {
     428           0 :             if(BufferedDecompositionPrimitive2D::operator==(rPrimitive))
     429             :             {
     430           0 :                 const SdrBorderlinePrimitive2D& rCompare = (SdrBorderlinePrimitive2D&)rPrimitive;
     431             : 
     432           0 :                 return (getTransform() == rCompare.getTransform()
     433           0 :                     && getLeftLine() == rCompare.getLeftLine()
     434           0 :                     && getBottomLine() == rCompare.getBottomLine()
     435           0 :                     && getRightLine() == rCompare.getRightLine()
     436           0 :                     && getTopLine() == rCompare.getTopLine()
     437           0 :                     && maLeftFromTLine == rCompare.maLeftFromTLine
     438           0 :                     && maLeftFromBLine == rCompare.maLeftFromBLine
     439           0 :                     && maRightFromTLine == rCompare.maRightFromTLine
     440           0 :                     && maRightFromBLine == rCompare.maRightFromBLine
     441           0 :                     && maTopFromLLine == rCompare.maTopFromLLine
     442           0 :                     && maTopFromRLine == rCompare.maTopFromRLine
     443           0 :                     && maBottomFromLLine == rCompare.maBottomFromLLine
     444           0 :                     && maBottomFromRLine == rCompare.maBottomFromRLine
     445           0 :                     && getLeftIsOutside() == rCompare.getLeftIsOutside()
     446           0 :                     && getBottomIsOutside() == rCompare.getBottomIsOutside()
     447           0 :                     && getRightIsOutside() == rCompare.getRightIsOutside()
     448           0 :                     && getTopIsOutside() == rCompare.getTopIsOutside()
     449           0 :                     && getInTwips() == rCompare.getInTwips());
     450             :             }
     451             : 
     452           0 :             return false;
     453             :         }
     454             : 
     455             :         // provide unique ID
     456           0 :         ImplPrimitrive2DIDBlock(SdrBorderlinePrimitive2D, PRIMITIVE2D_ID_SDRBORDERLINEPRIMITIVE2D)
     457             : 
     458             :     } // end of namespace primitive2d
     459             : } // end of namespace drawinglayer
     460             : 
     461             : //////////////////////////////////////////////////////////////////////////////
     462             : 
     463             : namespace sdr
     464             : {
     465             :     namespace contact
     466             :     {
     467           0 :         void impGetLine(SvxBorderLine& aLine, const sdr::table::TableLayouter& rLayouter, sal_Int32 nX, sal_Int32 nY, bool bHorizontal, sal_Int32 nColCount, sal_Int32 nRowCount, bool bIsRTL)
     468             :         {
     469           0 :             if(nX >= 0 && nX <= nColCount && nY >= 0 && nY <= nRowCount)
     470             :             {
     471           0 :                 const SvxBorderLine* pLine = rLayouter.getBorderLine(nX, nY, bHorizontal);
     472             : 
     473           0 :                 if(pLine)
     474             :                 {
     475             :                     // copy line content
     476           0 :                     aLine = *pLine;
     477             : 
     478             :                     // check for mirroring. This shall always be done when it is
     479             :                     // not a top- or rightmost line
     480           0 :                     bool bMirror(aLine.isDouble());
     481             : 
     482           0 :                     if(bMirror)
     483             :                     {
     484           0 :                         if(bHorizontal)
     485             :                         {
     486             :                             // mirror all bottom lines
     487           0 :                             bMirror = (0 != nY);
     488             :                         }
     489             :                         else
     490             :                         {
     491             :                             // mirror all left lines
     492           0 :                             bMirror = (bIsRTL ? 0 != nX : nX != nColCount);
     493             :                         }
     494             :                     }
     495             : 
     496           0 :                     if(bMirror)
     497             :                     {
     498           0 :                         aLine.SetMirrorWidths( );
     499             :                     }
     500             : 
     501           0 :                     return;
     502             :                 }
     503             :             }
     504             : 
     505             :             // no success, copy empty line
     506           0 :             const SvxBorderLine aEmptyLine;
     507           0 :             aLine = aEmptyLine;
     508             :         }
     509             : 
     510           0 :         drawinglayer::primitive2d::Primitive2DSequence ViewContactOfTableObj::createViewIndependentPrimitive2DSequence() const
     511             :         {
     512           0 :             const sdr::table::SdrTableObj& rTableObj = GetTableObj();
     513           0 :             const uno::Reference< com::sun::star::table::XTable > xTable = rTableObj.getTable();
     514             : 
     515           0 :             if(xTable.is())
     516             :             {
     517             :                 // create primitive representation for table
     518           0 :                 drawinglayer::primitive2d::Primitive2DSequence xRetval;
     519           0 :                 const sal_Int32 nRowCount(xTable->getRowCount());
     520           0 :                 const sal_Int32 nColCount(xTable->getColumnCount());
     521           0 :                 const sal_Int32 nAllCount(nRowCount * nColCount);
     522             : 
     523           0 :                 if(nAllCount)
     524             :                 {
     525           0 :                     const sdr::table::TableLayouter& rTableLayouter = rTableObj.getTableLayouter();
     526           0 :                     const bool bIsRTL(com::sun::star::text::WritingMode_RL_TB == rTableObj.GetWritingMode());
     527           0 :                     sdr::table::CellPos aCellPos;
     528           0 :                     sdr::table::CellRef xCurrentCell;
     529           0 :                     basegfx::B2IRectangle aCellArea;
     530             : 
     531             :                     // create range using the model data directly. This is in SdrTextObj::aRect which i will access using
     532             :                     // GetGeoRect() to not trigger any calculations. It's the unrotated geometry.
     533           0 :                     const Rectangle& rObjectRectangle(rTableObj.GetGeoRect());
     534           0 :                     const basegfx::B2DRange aObjectRange(rObjectRectangle.Left(), rObjectRectangle.Top(), rObjectRectangle.Right(), rObjectRectangle.Bottom());
     535             : 
     536             :                     // for each cell we need potentially a cell primitive and a border primitive
     537             :                     // (e.g. single cell). Prepare sequences and input counters
     538           0 :                     drawinglayer::primitive2d::Primitive2DSequence xCellSequence(nAllCount);
     539           0 :                     drawinglayer::primitive2d::Primitive2DSequence xBorderSequence(nAllCount);
     540           0 :                     sal_uInt32 nCellInsert(0);
     541           0 :                     sal_uInt32 nBorderInsert(0);
     542             : 
     543             :                     // variables for border lines
     544           0 :                     SvxBorderLine aLeftLine;
     545           0 :                     SvxBorderLine aBottomLine;
     546           0 :                     SvxBorderLine aRightLine;
     547           0 :                     SvxBorderLine aTopLine;
     548             : 
     549           0 :                     SvxBorderLine aLeftFromTLine;
     550           0 :                     SvxBorderLine aLeftFromBLine;
     551           0 :                     SvxBorderLine aRightFromTLine;
     552           0 :                     SvxBorderLine aRightFromBLine;
     553           0 :                     SvxBorderLine aTopFromLLine;
     554           0 :                     SvxBorderLine aTopFromRLine;
     555           0 :                     SvxBorderLine aBottomFromLLine;
     556           0 :                     SvxBorderLine aBottomFromRLine;
     557             : 
     558             :                     // create single primitives per cell
     559           0 :                     for(aCellPos.mnRow = 0; aCellPos.mnRow < nRowCount; aCellPos.mnRow++)
     560             :                     {
     561           0 :                         for(aCellPos.mnCol = 0; aCellPos.mnCol < nColCount; aCellPos.mnCol++)
     562             :                         {
     563           0 :                             xCurrentCell.set(dynamic_cast< sdr::table::Cell* >(xTable->getCellByPosition(aCellPos.mnCol, aCellPos.mnRow).get()));
     564             : 
     565           0 :                             if(xCurrentCell.is() && !xCurrentCell->isMerged())
     566             :                             {
     567           0 :                                 if(rTableLayouter.getCellArea(aCellPos, aCellArea))
     568             :                                 {
     569             :                                     // create cell transformation matrix
     570           0 :                                     basegfx::B2DHomMatrix aCellMatrix;
     571           0 :                                     aCellMatrix.set(0, 0, (double)aCellArea.getWidth());
     572           0 :                                     aCellMatrix.set(1, 1, (double)aCellArea.getHeight());
     573           0 :                                     aCellMatrix.set(0, 2, (double)aCellArea.getMinX() + aObjectRange.getMinX());
     574           0 :                                     aCellMatrix.set(1, 2, (double)aCellArea.getMinY() + aObjectRange.getMinY());
     575             : 
     576             :                                     // handle cell fillings and text
     577           0 :                                     const SfxItemSet& rCellItemSet = xCurrentCell->GetItemSet();
     578           0 :                                     const sal_uInt32 nTextIndex(nColCount * aCellPos.mnRow + aCellPos.mnCol);
     579           0 :                                     const SdrText* pSdrText = rTableObj.getText(nTextIndex);
     580           0 :                                     drawinglayer::attribute::SdrFillTextAttribute aAttribute;
     581             : 
     582           0 :                                     if(pSdrText)
     583             :                                     {
     584             :                                         // #i101508# take cell's local text frame distances into account
     585           0 :                                         const sal_Int32 nLeft(xCurrentCell->GetTextLeftDistance());
     586           0 :                                         const sal_Int32 nRight(xCurrentCell->GetTextRightDistance());
     587           0 :                                         const sal_Int32 nUpper(xCurrentCell->GetTextUpperDistance());
     588           0 :                                         const sal_Int32 nLower(xCurrentCell->GetTextLowerDistance());
     589             : 
     590             :                                         aAttribute = drawinglayer::primitive2d::createNewSdrFillTextAttribute(
     591             :                                             rCellItemSet,
     592             :                                             pSdrText,
     593             :                                             &nLeft,
     594             :                                             &nUpper,
     595             :                                             &nRight,
     596           0 :                                             &nLower);
     597             :                                     }
     598             :                                     else
     599             :                                     {
     600             :                                         aAttribute = drawinglayer::primitive2d::createNewSdrFillTextAttribute(
     601             :                                             rCellItemSet,
     602           0 :                                             pSdrText);
     603             :                                     }
     604             : 
     605             :                                     // always create cell primitives for BoundRect and HitTest
     606             :                                     {
     607             :                                         const drawinglayer::primitive2d::Primitive2DReference xCellReference(
     608             :                                             new drawinglayer::primitive2d::SdrCellPrimitive2D(
     609           0 :                                                 aCellMatrix, aAttribute));
     610           0 :                                         xCellSequence[nCellInsert++] = xCellReference;
     611             :                                     }
     612             : 
     613             :                                     // handle cell borders
     614           0 :                                     const sal_Int32 nX(bIsRTL ? nColCount - aCellPos.mnCol : aCellPos.mnCol);
     615           0 :                                     const sal_Int32 nY(aCellPos.mnRow);
     616             : 
     617             :                                     // get access values for X,Y at the cell's end
     618           0 :                                     const sal_Int32 nXSpan(xCurrentCell->getColumnSpan());
     619           0 :                                     const sal_Int32 nYSpan(xCurrentCell->getRowSpan());
     620           0 :                                     const sal_Int32 nXRight(bIsRTL ? nX - nXSpan : nX + nXSpan);
     621           0 :                                     const sal_Int32 nYBottom(nY + nYSpan);
     622             : 
     623             :                                     // get basic lines
     624           0 :                                     impGetLine(aLeftLine, rTableLayouter, nX, nY, false, nColCount, nRowCount, bIsRTL);
     625           0 :                                     impGetLine(aBottomLine, rTableLayouter, nX, nYBottom, true, nColCount, nRowCount, bIsRTL);
     626           0 :                                     impGetLine(aRightLine, rTableLayouter, nXRight, nY, false, nColCount, nRowCount, bIsRTL);
     627           0 :                                     impGetLine(aTopLine, rTableLayouter, nX, nY, true, nColCount, nRowCount, bIsRTL);
     628             : 
     629             :                                     // get the neighbor cells' borders
     630           0 :                                     impGetLine(aLeftFromTLine, rTableLayouter, nX, nY - 1, false, nColCount, nRowCount, bIsRTL);
     631           0 :                                     impGetLine(aLeftFromBLine, rTableLayouter, nX, nYBottom + 1, false, nColCount, nRowCount, bIsRTL);
     632           0 :                                     impGetLine(aRightFromTLine, rTableLayouter, nXRight, nY - 1, false, nColCount, nRowCount, bIsRTL);
     633           0 :                                     impGetLine(aRightFromBLine, rTableLayouter, nXRight, nYBottom + 1, false, nColCount, nRowCount, bIsRTL);
     634           0 :                                     impGetLine(aTopFromLLine, rTableLayouter, nX - 1, nY, true, nColCount, nRowCount, bIsRTL);
     635           0 :                                     impGetLine(aTopFromRLine, rTableLayouter, nXRight + 1, nY, true, nColCount, nRowCount, bIsRTL);
     636           0 :                                     impGetLine(aBottomFromLLine, rTableLayouter, nX - 1, nYBottom, true, nColCount, nRowCount, bIsRTL);
     637           0 :                                     impGetLine(aBottomFromRLine, rTableLayouter, nXRight + 1, nYBottom, true, nColCount, nRowCount, bIsRTL);
     638             : 
     639             :                                     // create the primtive containing all data for one cell with borders
     640           0 :                                     xBorderSequence[nBorderInsert++] = drawinglayer::primitive2d::Primitive2DReference(
     641             :                                         new drawinglayer::primitive2d::SdrBorderlinePrimitive2D(
     642             :                                             aCellMatrix,
     643             :                                             aLeftLine,
     644             :                                             aBottomLine,
     645             :                                             aRightLine,
     646             :                                             aTopLine,
     647             :                                             aLeftFromTLine,
     648             :                                             aLeftFromBLine,
     649             :                                             aRightFromTLine,
     650             :                                             aRightFromBLine,
     651             :                                             aTopFromLLine,
     652             :                                             aTopFromRLine,
     653             :                                             aBottomFromLLine,
     654             :                                             aBottomFromRLine,
     655             :                                             bIsRTL ? nX == nColCount : 0 == nX,
     656             :                                             nRowCount == nYBottom,
     657             :                                             bIsRTL ? 0 == nXRight : nXRight == nColCount,
     658             :                                             0 == nY,
     659           0 :                                             true));
     660             :                                 }
     661             :                             }
     662             :                         }
     663             :                     }
     664             : 
     665             :                     // no empty references; reallocate sequences by used count
     666           0 :                     xCellSequence.realloc(nCellInsert);
     667           0 :                     xBorderSequence.realloc(nBorderInsert);
     668             : 
     669             :                     // append to target. We want fillings and text first
     670           0 :                     xRetval = xCellSequence;
     671           0 :                     drawinglayer::primitive2d::appendPrimitive2DSequenceToPrimitive2DSequence(xRetval, xBorderSequence);
     672             :                 }
     673             : 
     674           0 :                 if(xRetval.hasElements())
     675             :                 {
     676             :                     // check and create evtl. shadow for created content
     677           0 :                        const SfxItemSet& rObjectItemSet = rTableObj.GetMergedItemSet();
     678             :                     const drawinglayer::attribute::SdrShadowAttribute aNewShadowAttribute(
     679           0 :                         drawinglayer::primitive2d::createNewSdrShadowAttribute(rObjectItemSet));
     680             : 
     681           0 :                     if(!aNewShadowAttribute.isDefault())
     682             :                     {
     683           0 :                         xRetval = drawinglayer::primitive2d::createEmbeddedShadowPrimitive(xRetval, aNewShadowAttribute);
     684           0 :                     }
     685             :                 }
     686             : 
     687           0 :                 return xRetval;
     688             :             }
     689             :             else
     690             :             {
     691             :                 // take unrotated snap rect (direct model data) for position and size
     692           0 :                 const Rectangle& rRectangle = rTableObj.GetGeoRect();
     693             :                 const basegfx::B2DRange aObjectRange(
     694           0 :                     rRectangle.Left(), rRectangle.Top(),
     695           0 :                     rRectangle.Right(), rRectangle.Bottom());
     696             : 
     697             :                 // create object matrix
     698           0 :                 const GeoStat& rGeoStat(rTableObj.GetGeoStat());
     699           0 :                 const double fShearX(rGeoStat.nShearWink ? tan((36000 - rGeoStat.nShearWink) * F_PI18000) : 0.0);
     700           0 :                 const double fRotate(rGeoStat.nDrehWink ? (36000 - rGeoStat.nDrehWink) * F_PI18000 : 0.0);
     701             :                 const basegfx::B2DHomMatrix aObjectMatrix(basegfx::tools::createScaleShearXRotateTranslateB2DHomMatrix(
     702             :                     aObjectRange.getWidth(), aObjectRange.getHeight(), fShearX, fRotate,
     703           0 :                     aObjectRange.getMinX(), aObjectRange.getMinY()));
     704             : 
     705             :                 // credate an invisible outline for the cases where no visible content exists
     706             :                 const drawinglayer::primitive2d::Primitive2DReference xReference(
     707             :                     drawinglayer::primitive2d::createHiddenGeometryPrimitives2D(
     708             :                         false,
     709           0 :                         aObjectMatrix));
     710             : 
     711           0 :                 return drawinglayer::primitive2d::Primitive2DSequence(&xReference, 1);
     712           0 :             }
     713             :         }
     714             : 
     715          35 :         ViewContactOfTableObj::ViewContactOfTableObj(::sdr::table::SdrTableObj& rTableObj)
     716          35 :         :   ViewContactOfSdrObj(rTableObj)
     717             :         {
     718          35 :         }
     719             : 
     720          70 :         ViewContactOfTableObj::~ViewContactOfTableObj()
     721             :         {
     722          70 :         }
     723             :     } // end of namespace contact
     724             : } // end of namespace sdr
     725             : 
     726             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10