[ooo-build-commit] .: drawinglayer/inc drawinglayer/source editeng/inc editeng/source svx/inc svx/source xmloff/source

Cédric Bosdonnat cbosdo at kemper.freedesktop.org
Wed Oct 6 15:01:37 PDT 2010


 drawinglayer/inc/drawinglayer/primitive2d/borderlineprimitive2d.hxx |    7 
 drawinglayer/source/primitive2d/borderlineprimitive2d.cxx           |   35 +-
 editeng/inc/editeng/borderline.hxx                                  |   14 
 editeng/inc/editeng/boxitem.hxx                                     |    4 
 editeng/inc/editeng/memberids.hrc                                   |    2 
 editeng/source/items/frmitems.cxx                                   |   19 -
 editeng/source/rtf/rtfitem.cxx                                      |    9 
 svx/inc/svx/framelink.hxx                                           |   25 -
 svx/inc/svx/frmsel.hxx                                              |    7 
 svx/source/dialog/framelink.cxx                                     |  163 +++-------
 svx/source/dialog/frmsel.cxx                                        |   39 +-
 svx/source/table/cell.cxx                                           |    1 
 svx/source/table/viewcontactoftableobj.cxx                          |   12 
 svx/source/tbxctrls/tbcontrl.cxx                                    |   30 +
 xmloff/source/style/PageMasterExportPropMapper.cxx                  |   11 
 xmloff/source/style/PageMasterImportPropMapper.cxx                  |   14 
 xmloff/source/style/bordrhdl.cxx                                    |   54 ++-
 xmloff/source/text/txtexppr.cxx                                     |   16 
 xmloff/source/text/txtimppr.cxx                                     |   10 
 19 files changed, 283 insertions(+), 189 deletions(-)

New commits:
commit 60d09ae471ba117e2eb773398a883df1d023daa4
Author: Cédric Bosdonnat <cedricbosdo at openoffice.org>
Date:   Wed Oct 6 23:54:04 2010 +0200

    fate#307731, fate#307730: Adds dotted and dashed border lines

diff --git a/drawinglayer/inc/drawinglayer/primitive2d/borderlineprimitive2d.hxx b/drawinglayer/inc/drawinglayer/primitive2d/borderlineprimitive2d.hxx
index 07a1f8b..8a13430 100644
--- a/drawinglayer/inc/drawinglayer/primitive2d/borderlineprimitive2d.hxx
+++ b/drawinglayer/inc/drawinglayer/primitive2d/borderlineprimitive2d.hxx
@@ -66,6 +66,7 @@ namespace drawinglayer
 
             /// the line color
             basegfx::BColor									maRGBColor;
+            short                                           mnStyle;
 
             /// bitfield
             /// flags to influence inside/outside creation
@@ -131,7 +132,8 @@ namespace drawinglayer
                 double fExtendOuterEnd,
                 bool bCreateInside,
                 bool bCreateOutside,
-                const basegfx::BColor& rRGBColor);
+                const basegfx::BColor& rRGBColor,
+                const short nStyle );
 
             /// data read access
             const basegfx::B2DPoint& getStart() const { return maStart; }
@@ -145,7 +147,8 @@ namespace drawinglayer
             double getExtendOuterEnd() const { return mfExtendOuterEnd; }
             bool getCreateInside() const { return mbCreateInside; }
             bool getCreateOutside() const { return mbCreateOutside; }
-            const basegfx::BColor& getRGBColor() const { return maRGBColor; }
+            const basegfx::BColor& getRGBColor () const { return maRGBColor; }
+            short getStyle () const { return mnStyle; }
 
             /// compare operator
             virtual bool operator==(const BasePrimitive2D& rPrimitive) const;
diff --git a/drawinglayer/source/primitive2d/borderlineprimitive2d.cxx b/drawinglayer/source/primitive2d/borderlineprimitive2d.cxx
index 088f9bb..5dafced 100644
--- a/drawinglayer/source/primitive2d/borderlineprimitive2d.cxx
+++ b/drawinglayer/source/primitive2d/borderlineprimitive2d.cxx
@@ -33,6 +33,7 @@
 #include <basegfx/polygon/b2dpolygon.hxx>
 #include <drawinglayer/primitive2d/polygonprimitive2d.hxx>
 #include <drawinglayer/primitive2d/polypolygonprimitive2d.hxx>
+#include <svtools/borderhelper.hxx>
 #include <numeric>
 
 //////////////////////////////////////////////////////////////////////////////
@@ -157,14 +158,29 @@ namespace drawinglayer
                             // create filled polygon primitive
                             const basegfx::B2DVector aLineWidthOffset((getCorrectedLeftWidth() * 0.5) * aPerpendicular);
                             
-                            aPolygon.append(aTmpStart + aLineWidthOffset);
-                            aPolygon.append(aTmpEnd + aLineWidthOffset);
-                            aPolygon.append(aTmpEnd - aLineWidthOffset);
-                            aPolygon.append(aTmpStart - aLineWidthOffset);
-                            aPolygon.setClosed(true);
+                            aPolygon.append( aTmpStart );
+                            aPolygon.append( aTmpEnd );
+
+                            basegfx::B2DPolyPolygon aDashed = svtools::ApplyLineDashing(
+                                   aPolygon, getStyle(), MAP_100TH_MM );
+                            for (sal_uInt32 i = 0; i < aDashed.count(); i++ )
+                            {
+                                basegfx::B2DPolygon aDash = aDashed.getB2DPolygon( i );
+                                basegfx::B2DPoint aDashStart = aDash.getB2DPoint( 0 );
+                                basegfx::B2DPoint aDashEnd = aDash.getB2DPoint( aDash.count() - 1 );
+
+                                basegfx::B2DPolygon aDashPolygon;
+                                aDashPolygon.append( aDashStart + aLineWidthOffset );
+                                aDashPolygon.append( aDashEnd + aLineWidthOffset );
+                                aDashPolygon.append( aDashEnd - aLineWidthOffset );
+                                aDashPolygon.append( aDashStart - aLineWidthOffset );
+                                aDashPolygon.setClosed( true );
+
+                                aDashed.setB2DPolygon( i, aDashPolygon );
+                            }
 
                             xRetval[0] = Primitive2DReference(new PolyPolygonColorPrimitive2D(
-                                basegfx::B2DPolyPolygon(aPolygon), getRGBColor()));
+                                    basegfx::B2DPolyPolygon( aDashed ), getRGBColor()));
                         }
                     }
                 }
@@ -185,7 +201,8 @@ namespace drawinglayer
             double fExtendOuterEnd,
             bool bCreateInside,
             bool bCreateOutside,
-            const basegfx::BColor& rRGBColor)
+            const basegfx::BColor& rRGBColor,
+            const short nStyle)
         :	BufferedDecompositionPrimitive2D(),
             maStart(rStart),
             maEnd(rEnd),
@@ -197,6 +214,7 @@ namespace drawinglayer
             mfExtendOuterStart(fExtendOuterStart),
             mfExtendOuterEnd(fExtendOuterEnd),
             maRGBColor(rRGBColor),
+            mnStyle(nStyle),
             mbCreateInside(bCreateInside),
             mbCreateOutside(bCreateOutside)
         {
@@ -219,7 +237,8 @@ namespace drawinglayer
                     && getExtendOuterEnd() == rCompare.getExtendOuterEnd()
                     && getCreateInside() == rCompare.getCreateInside()
                     && getCreateOutside() == rCompare.getCreateOutside()
-                    && getRGBColor() == rCompare.getRGBColor());
+                    && getRGBColor() == rCompare.getRGBColor()
+                    && getStyle() == rCompare.getStyle());
             }
 
             return false;
diff --git a/editeng/inc/editeng/borderline.hxx b/editeng/inc/editeng/borderline.hxx
index 78d173b..88458fa 100644
--- a/editeng/inc/editeng/borderline.hxx
+++ b/editeng/inc/editeng/borderline.hxx
@@ -90,6 +90,13 @@
 
 // ============================================================================
 
+enum SvxBorderStyle
+{
+    SOLID,
+    DOTTED,
+    DASHED
+};
+
 class EDITENG_DLLPUBLIC SvxBorderLine
 {
 protected:
@@ -97,9 +104,11 @@ protected:
     USHORT nOutWidth;
     USHORT nInWidth;
     USHORT nDistance;
+    SvxBorderStyle   m_nStyle;
 
 public:
-    SvxBorderLine( const Color *pCol = 0, USHORT nOut = 0, USHORT nIn = 0, USHORT nDist = 0 );
+    SvxBorderLine( const Color *pCol = 0, USHORT nOut = 0, USHORT nIn = 0, USHORT nDist = 0,
+           SvxBorderStyle nStyle = SOLID );
     SvxBorderLine( const SvxBorderLine& r );
 
     SvxBorderLine& operator=( const SvxBorderLine& r );
@@ -109,10 +118,13 @@ public:
     USHORT 			GetInWidth() const { return nInWidth; }
     USHORT 			GetDistance() const { return nDistance; }
 
+    SvxBorderStyle  GetStyle() const { return m_nStyle; }
+
     void 			SetColor( const Color &rColor ) { aColor = rColor; }
     void			SetOutWidth( USHORT nNew ) { nOutWidth = nNew; }
     void			SetInWidth( USHORT nNew ) { nInWidth = nNew;  }
     void			SetDistance( USHORT nNew ) { nDistance = nNew; }
+    void            SetStyle( SvxBorderStyle nNew ) { m_nStyle = nNew; }
     void			ScaleMetrics( long nMult, long nDiv );
 
     BOOL			operator==( const SvxBorderLine &rCmp ) const;
diff --git a/editeng/inc/editeng/boxitem.hxx b/editeng/inc/editeng/boxitem.hxx
index f1ddc6d..0ea363d 100644
--- a/editeng/inc/editeng/boxitem.hxx
+++ b/editeng/inc/editeng/boxitem.hxx
@@ -30,7 +30,7 @@
 #include <svl/poolitem.hxx>
 #include <editeng/borderline.hxx>
 #include <editeng/editengdllapi.h>
-#include <com/sun/star/table/BorderLine.hpp>
+#include <com/sun/star/table/BorderLine2.hpp>
 
 namespace rtl { class OUString; }
 
@@ -106,7 +106,7 @@ public:
         //JP 09.06.99: bIgnoreLine = TRUE -> Distance auch returnen, wenn
         //							keine Line gesetzt ist
     USHORT 	CalcLineSpace( USHORT nLine, BOOL bIgnoreLine = FALSE ) const;
-    static com::sun::star::table::BorderLine SvxLineToLine( const SvxBorderLine* pLine, sal_Bool bConvert );
+    static com::sun::star::table::BorderLine2 SvxLineToLine( const SvxBorderLine* pLine, sal_Bool bConvert );
     static sal_Bool LineToSvxLine(const ::com::sun::star::table::BorderLine& rLine, SvxBorderLine& rSvxLine, sal_Bool bConvert);
 };
 
diff --git a/editeng/inc/editeng/memberids.hrc b/editeng/inc/editeng/memberids.hrc
index e9cb0b5..0a4ac48 100644
--- a/editeng/inc/editeng/memberids.hrc
+++ b/editeng/inc/editeng/memberids.hrc
@@ -41,6 +41,8 @@
 #define MID_OUTER_WIDTH         0x41
 #define MID_INNER_WIDTH         0x35
 #define MID_LINESPACE           0x3b
+#define MID_LINE_STYLE          0x90
+
 
 //NameOrIndex
 #define MID_NAME				16
diff --git a/editeng/source/items/frmitems.cxx b/editeng/source/items/frmitems.cxx
index 800bf90..2cb6829 100644
--- a/editeng/source/items/frmitems.cxx
+++ b/editeng/source/items/frmitems.cxx
@@ -40,6 +40,7 @@
 #include <com/sun/star/table/TableOrientation.hpp>
 #include <com/sun/star/util/SortField.hpp>
 #include <com/sun/star/util/SortFieldType.hpp>
+#include <com/sun/star/table/BorderLine2.hpp>
 #include <com/sun/star/table/CellOrientation.hpp>
 #include <com/sun/star/table/CellAddress.hpp>
 #include <com/sun/star/style/PageStyleLayout.hpp>
@@ -1565,10 +1566,12 @@ void SvxShadowItem::SetEnumValue( sal_uInt16 nVal )
 
 // class SvxBorderLine  --------------------------------------------------
 
-SvxBorderLine::SvxBorderLine( const Color *pCol, sal_uInt16 nOut, sal_uInt16 nIn, sal_uInt16 nDist )
+SvxBorderLine::SvxBorderLine( const Color *pCol, sal_uInt16 nOut, sal_uInt16 nIn, sal_uInt16 nDist,
+       SvxBorderStyle nStyle )
 : nOutWidth( nOut )
 , nInWidth ( nIn )
 , nDistance( nDist )
+, m_nStyle( nStyle )
 {
     if ( pCol )
         aColor = *pCol;
@@ -1589,6 +1592,7 @@ SvxBorderLine& SvxBorderLine::operator=( const SvxBorderLine& r )
     nOutWidth = r.nOutWidth;
     nInWidth = r.nInWidth;
     nDistance = r.nDistance;
+    m_nStyle = r.m_nStyle;
     return *this;
 }
 
@@ -1608,7 +1612,8 @@ sal_Bool SvxBorderLine::operator==( const SvxBorderLine& rCmp ) const
     return ( ( aColor    == rCmp.GetColor() ) 	 &&
              ( nInWidth  == rCmp.GetInWidth() )  &&
              ( nOutWidth == rCmp.GetOutWidth() ) &&
-             ( nDistance == rCmp.GetDistance() ) );
+             ( nDistance == rCmp.GetDistance() ) &&
+             ( m_nStyle == rCmp.GetStyle() ) );
 }
 
 // -----------------------------------------------------------------------
@@ -1825,15 +1830,16 @@ int SvxBoxItem::operator==( const SfxPoolItem& rAttr ) const
 }
 
 // -----------------------------------------------------------------------
-table::BorderLine SvxBoxItem::SvxLineToLine(const SvxBorderLine* pLine, sal_Bool bConvert)
+table::BorderLine2 SvxBoxItem::SvxLineToLine(const SvxBorderLine* pLine, sal_Bool bConvert)
 {
-    table::BorderLine aLine;
+    table::BorderLine2 aLine;
     if(pLine)
     {
         aLine.Color			 = pLine->GetColor().GetColor() ;
         aLine.InnerLineWidth = sal_uInt16( bConvert ? TWIP_TO_MM100_UNSIGNED(pLine->GetInWidth() ): pLine->GetInWidth() );
         aLine.OuterLineWidth = sal_uInt16( bConvert ? TWIP_TO_MM100_UNSIGNED(pLine->GetOutWidth()): pLine->GetOutWidth() );
         aLine.LineDistance   = sal_uInt16( bConvert ? TWIP_TO_MM100_UNSIGNED(pLine->GetDistance()): pLine->GetDistance() );
+        aLine.LineStyle      = pLine->GetStyle( );
     }
     else
         aLine.Color			 = aLine.InnerLineWidth = aLine.OuterLineWidth = aLine.LineDistance	 = 0;
@@ -1843,7 +1849,7 @@ table::BorderLine SvxBoxItem::SvxLineToLine(const SvxBorderLine* pLine, sal_Bool
 bool SvxBoxItem::QueryValue( uno::Any& rVal, BYTE nMemberId  ) const
 {
     sal_Bool bConvert = 0!=(nMemberId&CONVERT_TWIPS);
-    table::BorderLine aRetLine;
+    table::BorderLine2 aRetLine;
     sal_uInt16 nDist = 0;
     sal_Bool bDistMember = sal_False;
     nMemberId &= ~CONVERT_TWIPS;
@@ -2780,7 +2786,7 @@ void SvxBoxInfoItem::ResetFlags()
 bool SvxBoxInfoItem::QueryValue( uno::Any& rVal, BYTE nMemberId  ) const
 {
     sal_Bool bConvert = 0!=(nMemberId&CONVERT_TWIPS);
-    table::BorderLine aRetLine;
+    table::BorderLine2 aRetLine;
     sal_Int16 nVal=0;
     sal_Bool bIntMember = sal_False;
     nMemberId &= ~CONVERT_TWIPS;
@@ -3321,6 +3327,7 @@ bool SvxLineItem::PutValue( const uno::Any& rVal, BYTE nMemId )
             case MID_OUTER_WIDTH:   pLine->SetOutWidth((USHORT)nVal);   break;
             case MID_INNER_WIDTH:   pLine->SetInWidth((USHORT)nVal);   break;
             case MID_DISTANCE:      pLine->SetDistance((USHORT)nVal);   break;
+            case MID_LINE_STYLE:    pLine->SetStyle((SvxBorderStyle)nVal); break;
             default:
                 DBG_ERROR( "Wrong MemberId" );
                 return sal_False;
diff --git a/editeng/source/rtf/rtfitem.cxx b/editeng/source/rtf/rtfitem.cxx
index ce2adc3..4334b0f 100644
--- a/editeng/source/rtf/rtfitem.cxx
+++ b/editeng/source/rtf/rtfitem.cxx
@@ -1627,10 +1627,15 @@ case RTF_BRDRBAR:			break;
             }
             goto SETBORDERLINE;
 
-        case RTF_BRDRS:
         case RTF_BRDRDOT:
-        case RTF_BRDRHAIR:
+            aBrd.SetStyle( DOTTED );
+            break;
         case RTF_BRDRDASH:
+            aBrd.SetStyle( DASHED );
+            break;
+        case RTF_BRDRS:
+        case RTF_BRDRHAIR:
+            aBrd.SetStyle( SOLID );
 SETBORDERLINE:
             SetBorderLine( nBorderTyp, aAttr, aBrd );
             break;
diff --git a/svx/inc/svx/framelink.hxx b/svx/inc/svx/framelink.hxx
index 660fd17..747b6eb 100644
--- a/svx/inc/svx/framelink.hxx
+++ b/svx/inc/svx/framelink.hxx
@@ -33,9 +33,10 @@
 #include <tools/gen.hxx>
 #include <tools/color.hxx>
 #include "svx/svxdllapi.h"
+#include <vcl/outdev.hxx>
+#include <editeng/borderline.hxx>
 
 class OutputDevice;
-class SvxBorderLine;
 
 namespace svx {
 namespace frame {
@@ -112,20 +113,20 @@ class SVX_DLLPUBLIC Style
 {
 public:
     /** Constructs an invisible frame style. */
-    inline explicit     Style() : meRefMode( REFMODE_CENTERED ), mnPrim( 0 ), mnDist( 0 ), mnSecn( 0 ), mbDotted( false ) {}
+    inline explicit     Style() : meRefMode( REFMODE_CENTERED ), mnPrim( 0 ), mnDist( 0 ), mnSecn( 0 ), mnDashing( SOLID ) {}
     /** Constructs a frame style with passed line widths. */
     inline explicit     Style( sal_uInt16 nP, sal_uInt16 nD, sal_uInt16 nS ) :
-                            meRefMode( REFMODE_CENTERED ), mbDotted( false )
+                            meRefMode( REFMODE_CENTERED ), mnDashing( SOLID )
                             { Set( nP, nD, nS ); }
     /** Constructs a frame style with passed color and line widths. */
-    inline explicit     Style( const Color& rColor, sal_uInt16 nP, sal_uInt16 nD, sal_uInt16 nS ) :
-                            meRefMode( REFMODE_CENTERED ), mbDotted( false )
+    inline explicit     Style( const Color& rColor, sal_uInt16 nP, sal_uInt16 nD, sal_uInt16 nS, SvxBorderStyle nDashing = SOLID ) :
+                            meRefMode( REFMODE_CENTERED ), mnDashing( nDashing )
                             { Set( rColor, nP, nD, nS ); }
     /** Constructs a frame style from the passed SvxBorderLine struct. */
-    inline explicit     Style( const SvxBorderLine& rBorder, double fScale = 1.0, sal_uInt16 nMaxWidth = SAL_MAX_UINT16, bool /*bUseDots*/ = false ) :
+    inline explicit     Style( const SvxBorderLine& rBorder, double fScale = 1.0, sal_uInt16 nMaxWidth = SAL_MAX_UINT16 ) :
                             meRefMode( REFMODE_CENTERED ) { Set( rBorder, fScale, nMaxWidth ); }
     /** Constructs a frame style from the passed SvxBorderLine struct. Clears the style, if pBorder is 0. */
-    inline explicit     Style( const SvxBorderLine* pBorder, double fScale = 1.0, sal_uInt16 nMaxWidth = SAL_MAX_UINT16, bool /*bUseDots*/ = false ) :
+    inline explicit     Style( const SvxBorderLine* pBorder, double fScale = 1.0, sal_uInt16 nMaxWidth = SAL_MAX_UINT16 ) :
                             meRefMode( REFMODE_CENTERED ) { Set( pBorder, fScale, nMaxWidth ); }
 
     inline RefMode      GetRefMode() const { return meRefMode; }
@@ -133,7 +134,7 @@ public:
     inline sal_uInt16   Prim() const { return mnPrim; }
     inline sal_uInt16   Dist() const { return mnDist; }
     inline sal_uInt16   Secn() const { return mnSecn; }
-    inline bool         Dotted() const { return mbDotted; }
+    inline SvxBorderStyle Dashing() const { return mnDashing; }
 
     /** Returns the total width of this frame style. */
     inline sal_uInt16   GetWidth() const { return mnPrim + mnDist + mnSecn; }
@@ -146,16 +147,16 @@ public:
     /** Sets the frame style to the passed line widths. */
     void                Set( const Color& rColor, sal_uInt16 nP, sal_uInt16 nD, sal_uInt16 nS );
     /** Sets the frame style to the passed SvxBorderLine struct. */
-    void                Set( const SvxBorderLine& rBorder, double fScale = 1.0, sal_uInt16 nMaxWidth = SAL_MAX_UINT16, bool /*bUseDots*/ = false );
+    void                Set( const SvxBorderLine& rBorder, double fScale = 1.0, sal_uInt16 nMaxWidth = SAL_MAX_UINT16 );
     /** Sets the frame style to the passed SvxBorderLine struct. Clears the style, if pBorder is 0. */
-    void                Set( const SvxBorderLine* pBorder, double fScale = 1.0, sal_uInt16 nMaxWidth = SAL_MAX_UINT16, bool /*bUseDots*/ = false );
+    void                Set( const SvxBorderLine* pBorder, double fScale = 1.0, sal_uInt16 nMaxWidth = SAL_MAX_UINT16 );
 
     /** Sets a new reference point handling mode, does not modify other settings. */
     inline void         SetRefMode( RefMode eRefMode ) { meRefMode = eRefMode; }
     /** Sets a new color, does not modify other settings. */
     inline void         SetColor( const Color& rColor ) { maColor = rColor; }
     /** Sets whether to use dotted style for single hair lines. */
-    inline void         SetDotted( bool bDotted ) { mbDotted = bDotted; }
+    inline void         SetDashing( SvxBorderStyle nDashing ) { mnDashing = nDashing; }
 
     /** Scales the style by the specified scaling factor. Ensures that visible lines keep visible. */
     Style&              ScaleSelf( double fScale, sal_uInt16 nMaxWidth = SAL_MAX_UINT16 );
@@ -173,7 +174,7 @@ private:
     sal_uInt16          mnPrim;     /// Width of primary (single, left, or top) line.
     sal_uInt16          mnDist;     /// Distance between primary and secondary line.
     sal_uInt16          mnSecn;     /// Width of secondary (right or bottom) line.
-    bool                mbDotted;   /// true = Draw dotted lines; false = Draw solid lines.
+    SvxBorderStyle      mnDashing;
 };
 
 bool operator==( const Style& rL, const Style& rR );
diff --git a/svx/inc/svx/frmsel.hxx b/svx/inc/svx/frmsel.hxx
index 22100d3..2706640 100644
--- a/svx/inc/svx/frmsel.hxx
+++ b/svx/inc/svx/frmsel.hxx
@@ -32,6 +32,7 @@
 #include <tools/color.hxx>
 #include <vcl/ctrl.hxx>
 #include <vcl/bitmap.hxx>
+#include <editeng/borderline.hxx>
 #include <svx/framebordertype.hxx>
 #include "svx/svxdllapi.h"
 
@@ -128,7 +129,8 @@ public:
     /** Returns true, if all visible frame borders have equal widths.
         @descr  Ignores hidden and "don't care" frame borders. On success,
         returns the widths in the passed parameters. */
-    bool                GetVisibleWidth( USHORT& rnPrim, USHORT& rnDist, USHORT& rnSec ) const;
+    bool                GetVisibleWidth( USHORT& rnPrim, USHORT& rnDist, USHORT& rnSec,
+                                         SvxBorderStyle& rnStyle ) const;
     /** Returns true, if all visible frame borders have equal color.
         @descr  Ignores hidden and "don't care" frame borders. On success,
         returns the color in the passed parameter. */
@@ -159,7 +161,8 @@ public:
     void                SelectAllVisibleBorders( bool bSelect = true );
 
     /** Sets the passed line widths to all selected frame borders (in twips). */
-    void                SetStyleToSelection( USHORT nPrim, USHORT nDist, USHORT nSec );
+    void                SetStyleToSelection( USHORT nPrim, USHORT nDist, USHORT nSec,
+                                             SvxBorderStyle nStyle );
     /** Sets the passed color to all selected frame borders. */
     void                SetColorToSelection( const Color& rColor );
 
diff --git a/svx/source/dialog/framelink.cxx b/svx/source/dialog/framelink.cxx
index 06fc478..13c7a4f 100644
--- a/svx/source/dialog/framelink.cxx
+++ b/svx/source/dialog/framelink.cxx
@@ -32,6 +32,7 @@
 #include <math.h>
 #include <vcl/outdev.hxx>
 #include <editeng/borderline.hxx>
+#include <svtools/borderhelper.hxx>
 
 // ----------------------------------------------------------------------------
 
@@ -48,6 +49,9 @@
 
 #if SVX_FRAME_USE_LINEINFO
 #include <vcl/lineinfo.hxx>
+#else
+#include <basegfx/polygon/b2dpolygon.hxx>
+#include <basegfx/polygon/b2dpolygontools.hxx>
 #endif
 
 namespace svx {
@@ -755,7 +759,7 @@ inline Polygon lclCreatePolygon( const PointVec& rPoints )
 Polygon lclCreatePolygon( const Point& rP1, const Point& rP2, const Point& rP3, const Point& rP4 )
 {
     PointVec aPoints;
-    aPoints.reserve( 4 );
+    aPoints.reserve( 2 );
     aPoints.push_back( rP1 );
     aPoints.push_back( rP2 );
     aPoints.push_back( rP3 );
@@ -776,12 +780,6 @@ Polygon lclCreatePolygon( const Point& rP1, const Point& rP2, const Point& rP3,
     return lclCreatePolygon( aPoints );
 }
 
-/** Returns a polygon constructed from the two passed line positions. */
-inline Polygon lclCreatePolygon( const LinePoints& rPoints1, const LinePoints& rPoints2 )
-{
-    return lclCreatePolygon( rPoints1.maBeg, rPoints1.maEnd, rPoints2.maEnd, rPoints2.maBeg );
-}
-
 /** Sets the color of the passed frame style to the output device.
 
     Sets the line color and fill color in the output device.
@@ -803,73 +801,6 @@ void lclSetColorToOutDev( OutputDevice& rDev, const Style& rStyle, const Color*
 }
 
 // ----------------------------------------------------------------------------
-// Generic drawing functions.
-
-/** Draws a thin (1 pixel wide) line, optionally dotted, into the passed output device. */
-void lclDrawThinLine( OutputDevice& rDev, const Point& rBeg, const Point& rEnd, bool bDotted )
-{
-#if SVX_FRAME_USE_LINEINFO
-    if( bDotted && (rBeg != rEnd) )
-    {
-// using LineInfo for dotted lines looks ugly and does not work well for diagonal lines
-        LineInfo aLineInfo( LINE_DASH, 1 );
-        aLineInfo.SetDotCount( 1 );
-        aLineInfo.SetDotLen( 1 );
-        aLineInfo.SetDistance( 3 );
-        rDev.DrawLine( rBeg, rEnd, aLineInfo );
-    }
-#else
-    Point aBeg( rDev.LogicToPixel( rBeg ) );
-    Point aEnd( rDev.LogicToPixel( rEnd ) );
-    if( bDotted && (aBeg != aEnd) )
-    {
-        bool bHor = Abs( aEnd.X() - aBeg.X() ) > Abs( aEnd.Y() - aBeg.Y() );
-        const Point& rBegPos( bHor ? ((aBeg.X() < aEnd.X()) ? aBeg : aEnd) : ((aBeg.Y() < aEnd.Y()) ? aBeg : aEnd ) );
-        const Point& rEndPos( (rBegPos == aBeg) ? aEnd : aBeg );
-
-        long nAlongBeg = bHor ? rBegPos.X() : rBegPos.Y();
-        long nAcrssBeg = bHor ? rBegPos.Y() : rBegPos.X();
-        long nAlongSize = (bHor ? rEndPos.X() : rEndPos.Y()) - nAlongBeg;
-        long nAcrssSize = (bHor ? rEndPos.Y() : rEndPos.X()) - nAcrssBeg;
-        double fGradient = static_cast< double >( nAcrssSize ) / nAlongSize;
-
-        PointVec aPoints;
-        aPoints.reserve( (nAlongSize + 1) / 2 );
-        for( long nAlongIdx = 0; nAlongIdx <= nAlongSize; nAlongIdx += 2 )
-        {
-            long nAl = nAlongBeg + nAlongIdx;
-            long nAc = nAcrssBeg + lclD2L( fGradient * nAlongIdx );
-            aPoints.push_back( Point( bHor ? nAl : nAc, bHor ? nAc : nAl ) );
-        }
-
-        rDev.Push( PUSH_MAPMODE );
-        rDev.SetMapMode( MAP_PIXEL );
-        rDev.DrawPixel( lclCreatePolygon( aPoints ) );
-        rDev.Pop(); // map mode
-    }
-#endif
-    else
-        rDev.DrawLine( rBeg, rEnd );
-}
-
-/** Draws a thin (1 pixel wide) line, optionally dotted, into the passed output device. */
-inline void lclDrawThinLine( OutputDevice& rDev, const LinePoints& rPoints, bool bDotted )
-{
-    lclDrawThinLine( rDev, rPoints.maBeg, rPoints.maEnd, bDotted );
-}
-
-/** Draws a polygon with four points into the passed output device. */
-inline void lclDrawPolygon( OutputDevice& rDev, const Point& rP1, const Point& rP2, const Point& rP3, const Point& rP4 )
-{
-    rDev.DrawPolygon( lclCreatePolygon( rP1, rP2, rP3, rP4 ) );
-}
-
-/** Draws a polygon specified by two borders into the passed output device. */
-inline void lclDrawPolygon( OutputDevice& rDev, const LinePoints& rPoints1, const LinePoints& rPoints2 )
-{
-    rDev.DrawPolygon( lclCreatePolygon( rPoints1, rPoints2 ) );
-}
-
 // ============================================================================
 // Drawing of horizontal frame borders.
 
@@ -882,16 +813,18 @@ void lclDrawHorLine(
         OutputDevice& rDev,
         const Point& rLPos, const LineEndResult& rLRes,
         const Point& rRPos, const LineEndResult& rRRes,
-        long nTOffs, long nBOffs, bool bDotted )
+        long nTOffs, long nBOffs, SvxBorderStyle nDashing )
 {
     LinePoints aTPoints( rLPos + lclToMapUnit( rLRes.mnOffs1, nTOffs ), rRPos + lclToMapUnit( rRRes.mnOffs1, nTOffs ) );
-    if( nTOffs == nBOffs )
-        lclDrawThinLine( rDev, aTPoints, bDotted );
-    else
-    {
-        LinePoints aBPoints( rLPos + lclToMapUnit( rLRes.mnOffs2, nBOffs ), rRPos + lclToMapUnit( rRRes.mnOffs2, nBOffs ) );
-        lclDrawPolygon( rDev, aTPoints, aBPoints );
-    }
+    LinePoints aBPoints( rLPos + lclToMapUnit( rLRes.mnOffs2, nBOffs ), rRPos + lclToMapUnit( rRRes.mnOffs2, nBOffs ) );
+
+    sal_uInt32 nWidth = lclToMapUnit( abs( nTOffs ) ) + lclToMapUnit( abs( nBOffs ) );
+    if ( ( nTOffs >= 0 && nBOffs >= 0 ) || ( nTOffs <= 0 && nBOffs <= 0 ) )
+        nWidth = abs( lclToMapUnit( nTOffs ) - lclToMapUnit( nBOffs ) ) + 1;
+    Point rLMid = ( aTPoints.maBeg + aBPoints.maBeg ) / 2;
+    Point rRMid = ( aTPoints.maEnd + aBPoints.maEnd ) / 2;
+
+    ::svtools::DrawLine( rDev, rLMid, rRMid, nWidth, nDashing );
 }
 
 /** Draws a horizontal frame border into the passed output device.
@@ -917,10 +850,10 @@ void lclDrawHorFrameBorder(
     {
         lclSetColorToOutDev( rDev, rBorder, pForceColor );
         lclDrawHorLine( rDev, rLPos, rResult.maBeg.maPrim, rRPos, rResult.maEnd.maPrim,
-            lclGetBeg( rBorder ), lclGetPrimEnd( rBorder ), rBorder.Dotted() );
+            lclGetBeg( rBorder ), lclGetPrimEnd( rBorder ), rBorder.Dashing() );
         if( rBorder.Secn() )
             lclDrawHorLine( rDev, rLPos, rResult.maBeg.maSecn, rRPos, rResult.maEnd.maSecn,
-                lclGetSecnBeg( rBorder ), lclGetEnd( rBorder ), rBorder.Dotted() );
+                lclGetSecnBeg( rBorder ), lclGetEnd( rBorder ), rBorder.Dashing() );
         rDev.Pop(); // colors
     }
 }
@@ -937,16 +870,18 @@ void lclDrawVerLine(
         OutputDevice& rDev,
         const Point& rTPos, const LineEndResult& rTRes,
         const Point& rBPos, const LineEndResult& rBRes,
-        long nLOffs, long nROffs, bool bDotted )
+        long nLOffs, long nROffs, SvxBorderStyle nDashing )
 {
     LinePoints aLPoints( rTPos + lclToMapUnit( nLOffs, rTRes.mnOffs1 ), rBPos + lclToMapUnit( nLOffs, rBRes.mnOffs1 ) );
-    if( nLOffs == nROffs )
-        lclDrawThinLine( rDev, aLPoints, bDotted );
-    else
-    {
-        LinePoints aRPoints( rTPos + lclToMapUnit( nROffs, rTRes.mnOffs2 ), rBPos + lclToMapUnit( nROffs, rBRes.mnOffs2 ) );
-        lclDrawPolygon( rDev, aLPoints, aRPoints );
-    }
+    LinePoints aRPoints( rTPos + lclToMapUnit( nROffs, rTRes.mnOffs2 ), rBPos + lclToMapUnit( nROffs, rBRes.mnOffs2 ) );
+
+    sal_uInt32 nWidth = lclToMapUnit( abs( nLOffs ) ) + lclToMapUnit( abs( nROffs ) );
+    if ( ( nLOffs >= 0 && nROffs >= 0 ) || ( nLOffs <= 0 && nROffs <= 0 ) )
+        nWidth = abs( lclToMapUnit( nLOffs ) - lclToMapUnit( nROffs ) ) + 1;
+    Point rTMid = ( aLPoints.maBeg + aRPoints.maBeg ) / 2;
+    Point rBMid = ( aLPoints.maEnd + aRPoints.maEnd ) / 2;
+
+    ::svtools::DrawLine( rDev, rTMid, rBMid, nWidth, nDashing );
 }
 
 /** Draws a vertical frame border into the passed output device.
@@ -972,10 +907,10 @@ void lclDrawVerFrameBorder(
     {
         lclSetColorToOutDev( rDev, rBorder, pForceColor );
         lclDrawVerLine( rDev, rTPos, rResult.maBeg.maPrim, rBPos, rResult.maEnd.maPrim,
-            lclGetBeg( rBorder ), lclGetPrimEnd( rBorder ), rBorder.Dotted() );
+            lclGetBeg( rBorder ), lclGetPrimEnd( rBorder ), rBorder.Dashing() );
         if( rBorder.Secn() )
             lclDrawVerLine( rDev, rTPos, rResult.maBeg.maSecn, rBPos, rResult.maEnd.maSecn,
-                lclGetSecnBeg( rBorder ), lclGetEnd( rBorder ), rBorder.Dotted() );
+                lclGetSecnBeg( rBorder ), lclGetEnd( rBorder ), rBorder.Dashing() );
         rDev.Pop(); // colors
     }
 }
@@ -1108,14 +1043,19 @@ void lclPushCrossingClipRegion( OutputDevice& rDev, const Rectangle& rRect, bool
  */
 void lclDrawDiagLine(
         OutputDevice& rDev, const Rectangle& rRect, bool bTLBR,
-        const DiagLineResult& rResult, long nDiagOffs1, long nDiagOffs2, bool bDotted )
+        const DiagLineResult& rResult, long nDiagOffs1, long nDiagOffs2, SvxBorderStyle nDashing )
 {
     lclPushDiagClipRect( rDev, rRect, rResult );
     LinePoints aLPoints( lclGetDiagLineEnds( rRect, bTLBR, nDiagOffs1 ) );
-    if( nDiagOffs1 == nDiagOffs2 )
-        lclDrawThinLine( rDev, aLPoints, bDotted );
-    else
-        lclDrawPolygon( rDev, aLPoints, lclGetDiagLineEnds( rRect, bTLBR, nDiagOffs2 ) );
+    LinePoints aL2Points( lclGetDiagLineEnds( rRect, bTLBR, nDiagOffs2 ) );
+    Point aSMid( ( aLPoints.maBeg + aL2Points.maBeg ) / 2 );
+    Point aEMid( ( aLPoints.maEnd + aL2Points.maEnd ) / 2 );
+
+    sal_uInt32 nWidth = lclToMapUnit( abs( nDiagOffs1 ) ) + lclToMapUnit( abs( nDiagOffs2 ) );
+    if ( ( nDiagOffs1 <= 0 && nDiagOffs2 <= 0 ) || ( nDiagOffs1 >=0 && nDiagOffs2 >=0 ) )
+        nWidth = lclToMapUnit( abs( nDiagOffs1 - nDiagOffs2 ) );
+
+    svtools::DrawLine( rDev, aSMid, aEMid, nWidth, nDashing );
     rDev.Pop(); // clipping region
 }
 
@@ -1147,9 +1087,9 @@ void lclDrawDiagFrameBorder(
         lclPushCrossingClipRegion( rDev, rRect, bTLBR, rCrossStyle );
 
     lclSetColorToOutDev( rDev, rBorder, pForceColor );
-    lclDrawDiagLine( rDev, rRect, bTLBR, rResult.maPrim, lclGetBeg( rBorder ), lclGetPrimEnd( rBorder ), rBorder.Dotted() );
+    lclDrawDiagLine( rDev, rRect, bTLBR, rResult.maPrim, lclGetBeg( rBorder ), lclGetPrimEnd( rBorder ), rBorder.Dashing() );
     if( rBorder.Secn() )
-        lclDrawDiagLine( rDev, rRect, bTLBR, rResult.maSecn, lclGetSecnBeg( rBorder ), lclGetEnd( rBorder ), rBorder.Dotted() );
+        lclDrawDiagLine( rDev, rRect, bTLBR, rResult.maSecn, lclGetSecnBeg( rBorder ), lclGetEnd( rBorder ), rBorder.Dashing() );
     rDev.Pop(); // colors
 
     if( bClip )
@@ -1226,7 +1166,7 @@ void Style::Set( const Color& rColor, sal_uInt16 nP, sal_uInt16 nD, sal_uInt16 n
     Set( nP, nD, nS );
 }
 
-void Style::Set( const SvxBorderLine& rBorder, double fScale, sal_uInt16 nMaxWidth, bool bUseDots )
+void Style::Set( const SvxBorderLine& rBorder, double fScale, sal_uInt16 nMaxWidth )
 {
     maColor = rBorder.GetColor();
 
@@ -1237,12 +1177,12 @@ void Style::Set( const SvxBorderLine& rBorder, double fScale, sal_uInt16 nMaxWid
     if( !nSecn )    // no or single frame border
     {
         Set( SCALEVALUE( nPrim ), 0, 0 );
-        mbDotted = bUseDots && (0 < nPrim) && (nPrim < 10);
+        mnDashing = rBorder.GetStyle();
     }
     else
     {
         Set( SCALEVALUE( nPrim ), SCALEVALUE( nDist ), SCALEVALUE( nSecn ) );
-        mbDotted = false;
+        mnDashing = SOLID;
         // Enlarge the style if distance is too small due to rounding losses.
         sal_uInt16 nPixWidth = SCALEVALUE( nPrim + nDist + nSecn );
         if( nPixWidth > GetWidth() )
@@ -1275,14 +1215,14 @@ void Style::Set( const SvxBorderLine& rBorder, double fScale, sal_uInt16 nMaxWid
     }
 }
 
-void Style::Set( const SvxBorderLine* pBorder, double fScale, sal_uInt16 nMaxWidth, bool bUseDots )
+void Style::Set( const SvxBorderLine* pBorder, double fScale, sal_uInt16 nMaxWidth )
 {
     if( pBorder )
-        Set( *pBorder, fScale, nMaxWidth, bUseDots );
+        Set( *pBorder, fScale, nMaxWidth );
     else
     {
         Clear();
-        mbDotted = false;
+        mnDashing = SOLID;
     }
 }
 
@@ -1314,7 +1254,8 @@ Style Style::Mirror() const
 bool operator==( const Style& rL, const Style& rR )
 {
     return (rL.Prim() == rR.Prim()) && (rL.Dist() == rR.Dist()) && (rL.Secn() == rR.Secn()) &&
-        (rL.GetColor() == rR.GetColor()) && (rL.GetRefMode() == rR.GetRefMode()) && (rL.Dotted() == rR.Dotted());
+        (rL.GetColor() == rR.GetColor()) && (rL.GetRefMode() == rR.GetRefMode()) &&
+        (rL.Dashing() == rR.Dashing());
 }
 
 bool operator<( const Style& rL, const Style& rR )
@@ -1331,7 +1272,7 @@ bool operator<( const Style& rL, const Style& rR )
     if( (rL.Secn() && rR.Secn()) && (rL.Dist() != rR.Dist()) ) return rL.Dist() > rR.Dist();
 
     // both lines single and 1 unit thick, only one is dotted -> rL<rR, if rL is dotted
-    if( (nLW == 1) && (rL.Dotted() != rR.Dotted()) ) return rL.Dotted();
+    if( (nLW == 1) && (rL.Dashing() != rR.Dashing()) ) return rL.Dashing();
 
     // seem to be equal
     return false;
@@ -1498,10 +1439,10 @@ void DrawVerFrameBorderSlanted( OutputDevice& rDev,
 
             lclSetColorToOutDev( rDev, aScaled, pForceColor );
             lclDrawVerLine( rDev, rTPos, aRes, rBPos, aRes,
-                lclGetBeg( aScaled ), lclGetPrimEnd( aScaled ), aScaled.Dotted() );
+                lclGetBeg( aScaled ), lclGetPrimEnd( aScaled ), aScaled.Dashing() );
             if( aScaled.Secn() )
                 lclDrawVerLine( rDev, rTPos, aRes, rBPos, aRes,
-                    lclGetSecnBeg( aScaled ), lclGetEnd( aScaled ), aScaled.Dotted() );
+                    lclGetSecnBeg( aScaled ), lclGetEnd( aScaled ), aScaled.Dashing() );
             rDev.Pop(); // colors
         }
     }
diff --git a/svx/source/dialog/frmsel.cxx b/svx/source/dialog/frmsel.cxx
index 0e4b1b2..e8879a2 100644
--- a/svx/source/dialog/frmsel.cxx
+++ b/svx/source/dialog/frmsel.cxx
@@ -153,7 +153,7 @@ void FrameBorder::SetCoreStyle( const SvxBorderLine* pStyle )
         maCoreStyle = SvxBorderLine();
 
     // from twips to points
-    maUIStyle.Set( maCoreStyle, 0.05, FRAMESEL_GEOM_WIDTH, true );
+    maUIStyle.Set( maCoreStyle, 0.05, FRAMESEL_GEOM_WIDTH );
     meState = maUIStyle.Prim() ? FRAMESTATE_SHOW : FRAMESTATE_HIDE;
 }
 
@@ -633,11 +633,31 @@ void FrameSelectorImpl::DrawAllFrameBorders()
     // Copy all frame border styles to the helper array
     maArray.SetColumnStyleLeft( 0, maLeft.GetUIStyle() );
     if( mbVer ) maArray.SetColumnStyleLeft( 1, maVer.GetUIStyle() );
-    maArray.SetColumnStyleRight( mbVer ? 1 : 0, maRight.GetUIStyle() );
+
+    // Invert the style for the right line
+    const frame::Style rRightStyle = maRight.GetUIStyle( );
+    frame::Style rInvertedRight( rRightStyle.GetColor(),
+            rRightStyle.Secn(), rRightStyle.Dist(), rRightStyle.Prim( ),
+            rRightStyle.Dashing( ) );
+    maArray.SetColumnStyleRight( mbVer ? 1 : 0, rInvertedRight );
 
     maArray.SetRowStyleTop( 0, maTop.GetUIStyle() );
-    if( mbHor ) maArray.SetRowStyleTop( 1, maHor.GetUIStyle() );
-    maArray.SetRowStyleBottom( mbHor ? 1 : 0, maBottom.GetUIStyle() );
+    if( mbHor )
+    {
+        // Invert the style for the hor line to match the real borders
+        const frame::Style rHorStyle = maHor.GetUIStyle();
+        frame::Style rInvertedHor( rHorStyle.GetColor(),
+            rHorStyle.Secn(), rHorStyle.Dist(), rHorStyle.Prim( ),
+            rHorStyle.Dashing() );
+        maArray.SetRowStyleTop( 1, rInvertedHor );
+    }
+
+    // Invert the style for the bottom line
+    const frame::Style rBottomStyle = maBottom.GetUIStyle( );
+    frame::Style rInvertedBottom( rBottomStyle.GetColor(),
+            rBottomStyle.Secn(), rBottomStyle.Dist(), rBottomStyle.Prim( ),
+            rBottomStyle.Dashing() );
+    maArray.SetRowStyleBottom( mbHor ? 1 : 0, rInvertedBottom );
 
     for( size_t nCol = 0; nCol < maArray.GetColCount(); ++nCol )
         for( size_t nRow = 0; nRow < maArray.GetRowCount(); ++nRow )
@@ -858,7 +878,8 @@ void FrameSelector::HideAllBorders()
         mxImpl->SetBorderState( **aIt, FRAMESTATE_HIDE );
 }
 
-bool FrameSelector::GetVisibleWidth( USHORT& rnPrim, USHORT& rnDist, USHORT& rnSecn ) const
+bool FrameSelector::GetVisibleWidth( USHORT& rnPrim, USHORT& rnDist, USHORT& rnSecn,
+                        SvxBorderStyle& rnStyle ) const
 {
     VisFrameBorderCIter aIt( mxImpl->maEnabBorders );
     if( !aIt.Is() )
@@ -870,13 +891,15 @@ bool FrameSelector::GetVisibleWidth( USHORT& rnPrim, USHORT& rnDist, USHORT& rnS
         bFound =
             (rStyle.GetOutWidth() == (*aIt)->GetCoreStyle().GetOutWidth()) &&
             (rStyle.GetDistance() == (*aIt)->GetCoreStyle().GetDistance()) &&
-            (rStyle.GetInWidth()  == (*aIt)->GetCoreStyle().GetInWidth());
+            (rStyle.GetInWidth()  == (*aIt)->GetCoreStyle().GetInWidth()) &&
+            (rStyle.GetStyle() == (*aIt)->GetCoreStyle().GetStyle());
 
     if( bFound )
     {
         rnPrim = rStyle.GetOutWidth();
         rnDist = rStyle.GetDistance();
         rnSecn = rStyle.GetInWidth();
+        rnStyle = rStyle.GetStyle();
     }
     return bFound;
 }
@@ -937,11 +960,13 @@ void FrameSelector::SelectAllVisibleBorders( bool bSelect )
         mxImpl->SelectBorder( **aIt, bSelect );
 }
 
-void FrameSelector::SetStyleToSelection( USHORT nPrim, USHORT nDist, USHORT nSecn )
+void FrameSelector::SetStyleToSelection( USHORT nPrim, USHORT nDist, USHORT nSecn,
+        SvxBorderStyle nStyle )
 {
     mxImpl->maCurrStyle.SetOutWidth( nPrim );
     mxImpl->maCurrStyle.SetDistance( nDist );
     mxImpl->maCurrStyle.SetInWidth( nSecn );
+    mxImpl->maCurrStyle.SetStyle( nStyle );
     for( SelFrameBorderIter aIt( mxImpl->maEnabBorders ); aIt.Is(); ++aIt )
         mxImpl->SetBorderState( **aIt, FRAMESTATE_SHOW );
 }
diff --git a/svx/source/table/cell.cxx b/svx/source/table/cell.cxx
index 3d75c03..97fd27e 100644
--- a/svx/source/table/cell.cxx
+++ b/svx/source/table/cell.cxx
@@ -32,6 +32,7 @@
 #include <com/sun/star/style/XStyle.hpp>
 #include <com/sun/star/text/WritingMode.hpp>
 #include <com/sun/star/table/TableBorder.hpp>
+#include <com/sun/star/table/BorderLine2.hpp>
 
 #include <cppuhelper/typeprovider.hxx>
 #include <svl/style.hxx>
diff --git a/svx/source/table/viewcontactoftableobj.cxx b/svx/source/table/viewcontactoftableobj.cxx
index 5f0af00..482d1ef 100644
--- a/svx/source/table/viewcontactoftableobj.cxx
+++ b/svx/source/table/viewcontactoftableobj.cxx
@@ -332,7 +332,8 @@ namespace drawinglayer
                         fExtendOE * fTwipsToMM,
                         true,
                         getLeftIsOutside(),
-                        getLeftLine().GetColor().getBColor()));
+                        getLeftLine().GetColor().getBColor(),
+                        getLeftLine().GetStyle()));
                 }
             }
 
@@ -374,7 +375,8 @@ namespace drawinglayer
                         fExtendOE * fTwipsToMM,
                         true,
                         getBottomIsOutside(),
-                        getBottomLine().GetColor().getBColor()));
+                        getBottomLine().GetColor().getBColor(),
+                        getBottomLine().GetStyle()));
                 }
             }
 
@@ -416,7 +418,8 @@ namespace drawinglayer
                         fExtendIE * fTwipsToMM,
                         getRightIsOutside(),
                         true,
-                        getRightLine().GetColor().getBColor()));
+                        getRightLine().GetColor().getBColor(),
+                        getRightLine().GetStyle()));
                 }
             }
 
@@ -458,7 +461,8 @@ namespace drawinglayer
                         fExtendIE * fTwipsToMM,
                         getTopIsOutside(),
                         true,
-                        getTopLine().GetColor().getBColor()));
+                        getTopLine().GetColor().getBColor(),
+                        getTopLine().GetStyle()));
                 }
             }
 
diff --git a/svx/source/tbxctrls/tbcontrl.cxx b/svx/source/tbxctrls/tbcontrl.cxx
index 01d02a6..694fa9e 100644
--- a/svx/source/tbxctrls/tbcontrl.cxx
+++ b/svx/source/tbxctrls/tbcontrl.cxx
@@ -41,6 +41,7 @@
 #include <svtools/ctrlbox.hxx>
 #include <svl/style.hxx>
 #include <svtools/ctrltool.hxx>
+#include <svtools/borderhelper.hxx>
 #include <svl/stritem.hxx>
 #include <unotools/pathoptions.hxx>
 #include <sfx2/tplpitem.hxx>
@@ -88,6 +89,7 @@
 #include "colorwindow.hxx"
 #include <memory>
 
+#include <svx/framelink.hxx>
 #include <svx/tbxcolorupdate.hxx>
 #include <editeng/eerdll.hxx>
 #include <editeng/editrids.hrc>
@@ -1522,6 +1524,21 @@ void SvxLineWindow_Impl::MakeLineBitmap( USHORT nNo, Bitmap& rBmp, const Size& r
             aVirDev.DrawRect( aRect );
             nLineWidth = (USHORT) (DEF_DOUBLE_LINE6_OUT+DEF_DOUBLE_LINE6_IN+DEF_DOUBLE_LINE6_DIST)/20;
             break;
+        case 17: // Dotted line
+            aRect.Top() 	= 6;
+            aRect.Bottom()	= 6;
+            aVirDev.SetLineColor( rLineCol );
+            aVirDev.SetFillColor();
+            svtools::DrawLine( aVirDev, aRect.LeftCenter(), aRect.RightCenter(), 1, DOTTED );
+            break;
+
+        case 18: // Dashed line
+            aRect.Top() 	= 6;
+            aRect.Bottom()	= 6;
+            aVirDev.SetLineColor( rLineCol );
+            aVirDev.SetFillColor();
+            svtools::DrawLine( aVirDev, aRect.LeftCenter(), aRect.RightCenter(), 1, DASHED );
+            break;
 
         default:
             break;
@@ -1542,6 +1559,7 @@ IMPL_LINK( SvxLineWindow_Impl, SelectHdl, void *, EMPTYARG )
     USHORT			n1 = 0,
                     n2 = 0,
                     n3 = 0;
+    SvxBorderStyle  nStyle = SOLID;
     BOOL			bSetLine = TRUE;
 
     switch ( aLineSet.GetSelectItemId() )
@@ -1585,6 +1603,14 @@ IMPL_LINK( SvxLineWindow_Impl, SelectHdl, void *, EMPTYARG )
         case 16: n1 = DEF_DOUBLE_LINE6_OUT;
                  n2 = DEF_DOUBLE_LINE6_IN;
                  n3 = DEF_DOUBLE_LINE6_DIST;	 break;
+        case 17:
+                 n1 = DEF_LINE_WIDTH_5;
+                 nStyle = DOTTED;
+                 break;
+        case 18:
+                 n1 = DEF_LINE_WIDTH_5;
+                 nStyle = DASHED;
+                 break;
         case  0:
         default:
             bSetLine = FALSE;
@@ -1592,7 +1618,7 @@ IMPL_LINK( SvxLineWindow_Impl, SelectHdl, void *, EMPTYARG )
     }
     if ( bSetLine )
     {
-        SvxBorderLine aTmp( NULL, n1, n2, n3 );
+        SvxBorderLine aTmp( NULL, n1, n2, n3, nStyle );
         aLineItem.SetLine( &aTmp );
     }
     else
@@ -1676,7 +1702,7 @@ void SvxLineWindow_Impl::CreateBitmaps( void )
     ::Color					aBackCol( rStyleSettings.GetWindowColor() );
     aLineSet.Clear();
 
-    for( USHORT i = 1 ; i < 17 ; ++i )
+    for( USHORT i = 1 ; i < 19 ; ++i )
     {
         MakeLineBitmap( i, aBmp, aBmpSize, aStr, aLineCol, aBackCol );
         aLineSet.InsertItem( i, aBmp, aStr );
diff --git a/xmloff/source/style/PageMasterExportPropMapper.cxx b/xmloff/source/style/PageMasterExportPropMapper.cxx
index c73d697..32973e2 100644
--- a/xmloff/source/style/PageMasterExportPropMapper.cxx
+++ b/xmloff/source/style/PageMasterExportPropMapper.cxx
@@ -30,7 +30,7 @@
 #include "PageMasterExportPropMapper.hxx"
 #include <xmloff/xmltoken.hxx>
 #include <comphelper/types.hxx>
-#include <com/sun/star/table/BorderLine.hpp>
+#include <com/sun/star/table/BorderLine2.hpp>
 #include <xmloff/PageMasterStyleMap.hxx>
 #include <tools/debug.hxx>
 #include <rtl/ustrbuf.hxx>
@@ -52,10 +52,11 @@ inline sal_Bool lcl_HasSameLineWidth( const table::BorderLine& rLine1, const tab
             (rLine1.LineDistance == rLine2.LineDistance);
 }
 
-inline sal_Bool operator==( const table::BorderLine& rLine1, const table::BorderLine& rLine2 )
+inline sal_Bool operator==( const table::BorderLine2& rLine1, const table::BorderLine2& rLine2 )
 {
     return	(rLine1.Color == rLine2.Color) &&
-            lcl_HasSameLineWidth( rLine1, rLine2 );
+            lcl_HasSameLineWidth( rLine1, rLine2 ) &&
+            ( rLine1.LineStyle == rLine2.LineStyle );
 }
 
 inline void lcl_RemoveState( XMLPropertyState* pState )
@@ -131,7 +132,7 @@ void XMLPropertyStateBuffer::ContextFilter( ::std::vector< XMLPropertyState >& )
     {
         if( pPMBorderTop && pPMBorderBottom && pPMBorderLeft && pPMBorderRight )
         {
-            table::BorderLine aLineTop, aLineBottom, aLineLeft, aLineRight;
+            table::BorderLine2 aLineTop, aLineBottom, aLineLeft, aLineRight;
 
             pPMBorderTop->maValue >>= aLineTop;
             pPMBorderBottom->maValue >>= aLineBottom;
@@ -156,7 +157,7 @@ void XMLPropertyStateBuffer::ContextFilter( ::std::vector< XMLPropertyState >& )
     {
         if( pPMBorderWidthTop && pPMBorderWidthBottom && pPMBorderWidthLeft && pPMBorderWidthRight )
         {
-            table::BorderLine aLineTop, aLineBottom, aLineLeft, aLineRight;
+            table::BorderLine2 aLineTop, aLineBottom, aLineLeft, aLineRight;
 
             pPMBorderWidthTop->maValue >>= aLineTop;
             pPMBorderWidthBottom->maValue >>= aLineBottom;
diff --git a/xmloff/source/style/PageMasterImportPropMapper.cxx b/xmloff/source/style/PageMasterImportPropMapper.cxx
index 48c6563..7b67bed 100644
--- a/xmloff/source/style/PageMasterImportPropMapper.cxx
+++ b/xmloff/source/style/PageMasterImportPropMapper.cxx
@@ -33,7 +33,7 @@
 #include "PageMasterPropMapper.hxx"
 #include <xmloff/PageMasterStyleMap.hxx>
 #include <xmloff/maptype.hxx>
-#include <com/sun/star/table/BorderLine.hpp>
+#include <com/sun/star/table/BorderLine2.hpp>
 #include <com/sun/star/container/XNameContainer.hpp>
 #include <xmloff/xmlimp.hxx>
 
@@ -204,11 +204,11 @@ void PageMasterImportPropertyMapper::finished(::std::vector< XMLPropertyState >&
             pBorderWidths[i]->mnIndex = -1;
         if( pBorders[i] )
         {
-            table::BorderLine aBorderLine;
+            table::BorderLine2 aBorderLine;
             pBorders[i]->maValue >>= aBorderLine;
              if( pBorderWidths[i] )
             {
-                table::BorderLine aBorderLineWidth;
+                table::BorderLine2 aBorderLineWidth;
                 pBorderWidths[i]->maValue >>= aBorderLineWidth;
                 aBorderLine.OuterLineWidth = aBorderLineWidth.OuterLineWidth;
                 aBorderLine.InnerLineWidth = aBorderLineWidth.InnerLineWidth;
@@ -226,11 +226,11 @@ void PageMasterImportPropertyMapper::finished(::std::vector< XMLPropertyState >&
             pHeaderBorderWidths[i]->mnIndex = -1;
         if( pHeaderBorders[i] )
         {
-            table::BorderLine aBorderLine;
+            table::BorderLine2 aBorderLine;
             pHeaderBorders[i]->maValue >>= aBorderLine;
              if( pHeaderBorderWidths[i] )
             {
-                table::BorderLine aBorderLineWidth;
+                table::BorderLine2 aBorderLineWidth;
                 pHeaderBorderWidths[i]->maValue >>= aBorderLineWidth;
                 aBorderLine.OuterLineWidth = aBorderLineWidth.OuterLineWidth;
                 aBorderLine.InnerLineWidth = aBorderLineWidth.InnerLineWidth;
@@ -248,11 +248,11 @@ void PageMasterImportPropertyMapper::finished(::std::vector< XMLPropertyState >&
             pFooterBorderWidths[i]->mnIndex = -1;
         if( pFooterBorders[i] )
         {
-            table::BorderLine aBorderLine;
+            table::BorderLine2 aBorderLine;
             pFooterBorders[i]->maValue >>= aBorderLine;
              if( pFooterBorderWidths[i] )
             {
-                table::BorderLine aBorderLineWidth;
+                table::BorderLine2 aBorderLineWidth;
                 pFooterBorderWidths[i]->maValue >>= aBorderLineWidth;
                 aBorderLine.OuterLineWidth = aBorderLineWidth.OuterLineWidth;
                 aBorderLine.InnerLineWidth = aBorderLineWidth.InnerLineWidth;
diff --git a/xmloff/source/style/bordrhdl.cxx b/xmloff/source/style/bordrhdl.cxx
index df58f82..decb450 100644
--- a/xmloff/source/style/bordrhdl.cxx
+++ b/xmloff/source/style/bordrhdl.cxx
@@ -34,7 +34,7 @@
 #include <xmloff/xmluconv.hxx>
 #include <rtl/ustrbuf.hxx>
 #include <com/sun/star/uno/Any.hxx>
-#include <com/sun/star/table/BorderLine.hpp>
+#include <com/sun/star/table/BorderLine2.hpp>
 
 using ::rtl::OUString;
 using ::rtl::OUStringBuffer;
@@ -42,6 +42,10 @@ using ::rtl::OUStringBuffer;
 using namespace ::com::sun::star;
 using namespace ::xmloff::token;
 
+const sal_Int16 API_LINE_SOLID   = 0;
+const sal_Int16 API_LINE_DOTTED  = 1;
+const sal_Int16 API_LINE_DASHED  = 2;
+
 // copied from svx/boxitem.hxx
 #define DEF_LINE_WIDTH_0        1
 #define DEF_LINE_WIDTH_1        35
@@ -101,6 +105,8 @@ using namespace ::xmloff::token;
 #define SVX_XML_BORDER_STYLE_NONE 0
 #define SVX_XML_BORDER_STYLE_SOLID 1
 #define SVX_XML_BORDER_STYLE_DOUBLE 2
+#define SVX_XML_BORDER_STYLE_DASHED 3
+#define SVX_XML_BORDER_STYLE_DOTTED 4
 
 #define SVX_XML_BORDER_WIDTH_THIN 0
 #define SVX_XML_BORDER_WIDTH_MIDDLE 1
@@ -112,8 +118,8 @@ SvXMLEnumMapEntry pXML_BorderStyles[] =
     { XML_HIDDEN, 				SVX_XML_BORDER_STYLE_NONE	},
     { XML_SOLID, 				SVX_XML_BORDER_STYLE_SOLID	},
     { XML_DOUBLE,				SVX_XML_BORDER_STYLE_DOUBLE	},
-    { XML_DOTTED, 				SVX_XML_BORDER_STYLE_SOLID  },
-    { XML_DASHED, 				SVX_XML_BORDER_STYLE_SOLID	},
+    { XML_DOTTED, 				SVX_XML_BORDER_STYLE_DOTTED },
+    { XML_DASHED, 				SVX_XML_BORDER_STYLE_DASHED	},
     { XML_GROOVE, 				SVX_XML_BORDER_STYLE_SOLID	},
     { XML_RIDGE,  				SVX_XML_BORDER_STYLE_SOLID  },
     { XML_INSET,  				SVX_XML_BORDER_STYLE_SOLID  },
@@ -171,6 +177,23 @@ static sal_uInt16 __READONLY_DATA aDBorderWidths[] =
     DBORDER_ENTRY( 5 )
 };
 
+void lcl_frmitems_setXMLBorderStyle( table::BorderLine2 & rBorderLine, sal_uInt16 nStyle )
+{
+    sal_Int16 eStyle = API_LINE_SOLID;
+    switch ( nStyle )
+    {
+        case SVX_XML_BORDER_STYLE_DOTTED:
+            eStyle = API_LINE_DOTTED;
+            break;
+        case SVX_XML_BORDER_STYLE_DASHED:
+            eStyle = API_LINE_DASHED;
+            break;
+        default:
+            break;
+    }
+    rBorderLine.LineStyle = eStyle;
+}
+
 void lcl_frmitems_setXMLBorderWidth( table::BorderLine &rBorderLine,
                                      sal_uInt16 nWidth, sal_Bool bDouble )
 {
@@ -273,7 +296,7 @@ sal_Bool XMLBorderWidthHdl::importXML( const OUString& rStrImpValue, uno::Any& r
     sal_uInt16 nWidth = i < nSize ? 0 : nOutWidth + nInWidth + nDistance;
 #endif
 
-    table::BorderLine aBorderLine;
+    table::BorderLine2 aBorderLine;
     if(!(rValue >>= aBorderLine))
         aBorderLine.Color = 0;
 
@@ -289,7 +312,7 @@ sal_Bool XMLBorderWidthHdl::exportXML( OUString& rStrExpValue, const uno::Any& r
 { 
     OUStringBuffer aOut;
 
-    table::BorderLine aBorderLine;
+    table::BorderLine2 aBorderLine;
     if(!(rValue >>= aBorderLine))
         return sal_False;
 
@@ -368,7 +391,7 @@ sal_Bool XMLBorderHdl::importXML( const OUString& rStrImpValue, uno::Any& rValue
     if( !bHasStyle || (SVX_XML_BORDER_STYLE_NONE != nStyle && !bHasWidth) )
         return sal_False;
 
-    table::BorderLine aBorderLine;
+    table::BorderLine2 aBorderLine;
     if(!(rValue >>= aBorderLine))
     {
         aBorderLine.Color = 0;
@@ -400,11 +423,13 @@ sal_Bool XMLBorderHdl::importXML( const OUString& rStrImpValue, uno::Any& rValue
         else
         {
             lcl_frmitems_setXMLBorderWidth( aBorderLine, nWidth, bDouble );
+            lcl_frmitems_setXMLBorderStyle( aBorderLine, nStyle );
         }
     }
     else
     {
         lcl_frmitems_setXMLBorderWidth( aBorderLine, 0, bDouble );
+        lcl_frmitems_setXMLBorderStyle( aBorderLine, nStyle );
     }
 
     // set color
@@ -419,7 +444,7 @@ sal_Bool XMLBorderHdl::exportXML( OUString& rStrExpValue, const uno::Any& rValue
 { 
     OUStringBuffer aOut;
 
-    table::BorderLine aBorderLine;
+    table::BorderLine2 aBorderLine;
     if(!(rValue >>= aBorderLine))
         return sal_False;
 
@@ -441,7 +466,20 @@ sal_Bool XMLBorderHdl::exportXML( OUString& rStrExpValue, const uno::Any& rValue
 
         aOut.append( sal_Unicode( ' ' ) );
 
-        aOut.append( GetXMLToken((0 == nDistance) ? XML_SOLID : XML_DOUBLE) );
+        XMLTokenEnum eStyleToken = XML_SOLID;
+        switch ( aBorderLine.LineStyle )
+        {
+            case API_LINE_DASHED:
+                eStyleToken = XML_DASHED;
+                break;
+            case API_LINE_DOTTED:
+                eStyleToken = XML_DOTTED;
+                break;
+            case API_LINE_SOLID:
+            default:
+                eStyleToken = XML_SOLID;
+        }
+        aOut.append( GetXMLToken((0 == nDistance) ? eStyleToken : XML_DOUBLE) );
 
         aOut.append( sal_Unicode( ' ' ) );
 
diff --git a/xmloff/source/text/txtexppr.cxx b/xmloff/source/text/txtexppr.cxx
index d148d78..7555ca1 100644
--- a/xmloff/source/text/txtexppr.cxx
+++ b/xmloff/source/text/txtexppr.cxx
@@ -29,7 +29,7 @@
 #include "precompiled_xmloff.hxx"
 #include <tools/debug.hxx>
 #include <xmloff/txtprmap.hxx>
-#include <com/sun/star/table/BorderLine.hpp>
+#include <com/sun/star/table/BorderLine2.hpp>
 #include <com/sun/star/text/SizeType.hpp>
 #include <com/sun/star/text/WrapTextMode.hpp>
 #include <com/sun/star/text/TextContentAnchorType.hpp>
@@ -692,7 +692,7 @@ void XMLTextExportPropertySetMapper::ContextFilter(
     {
         if( pLeftBorderWidthState && pRightBorderWidthState && pTopBorderWidthState && pBottomBorderWidthState )
         {
-            table::BorderLine aLeft, aRight, aTop, aBottom;
+            table::BorderLine2 aLeft, aRight, aTop, aBottom;
 
             pLeftBorderWidthState->maValue >>= aLeft;
             pRightBorderWidthState->maValue >>= aRight;
@@ -700,10 +700,13 @@ void XMLTextExportPropertySetMapper::ContextFilter(
             pBottomBorderWidthState->maValue >>= aBottom;
             if( aLeft.Color == aRight.Color && aLeft.InnerLineWidth == aRight.InnerLineWidth &&
                 aLeft.OuterLineWidth == aRight.OuterLineWidth && aLeft.LineDistance == aRight.LineDistance &&
+                aLeft.LineStyle == aRight.LineStyle &&
                 aLeft.Color == aTop.Color && aLeft.InnerLineWidth == aTop.InnerLineWidth &&
                 aLeft.OuterLineWidth == aTop.OuterLineWidth && aLeft.LineDistance == aTop.LineDistance &&
+                aLeft.LineStyle == aTop.LineStyle &&
                 aLeft.Color == aBottom.Color && aLeft.InnerLineWidth == aBottom.InnerLineWidth &&
-                aLeft.OuterLineWidth == aBottom.OuterLineWidth && aLeft.LineDistance == aBottom.LineDistance )
+                aLeft.OuterLineWidth == aBottom.OuterLineWidth && aLeft.LineDistance == aBottom.LineDistance &&
+                aLeft.LineStyle == aBottom.LineStyle )
             {
                 pLeftBorderWidthState->mnIndex = -1;
                 pLeftBorderWidthState->maValue.clear();
@@ -765,7 +768,7 @@ void XMLTextExportPropertySetMapper::ContextFilter(
     {
         if( pLeftBorderState && pRightBorderState && pTopBorderState && pBottomBorderState )
         {
-            table::BorderLine aLeft, aRight, aTop, aBottom;
+            table::BorderLine2 aLeft, aRight, aTop, aBottom;
 
             pLeftBorderState->maValue >>= aLeft;
             pRightBorderState->maValue >>= aRight;
@@ -773,10 +776,13 @@ void XMLTextExportPropertySetMapper::ContextFilter(
             pBottomBorderState->maValue >>= aBottom;
             if( aLeft.Color == aRight.Color && aLeft.InnerLineWidth == aRight.InnerLineWidth &&
                 aLeft.OuterLineWidth == aRight.OuterLineWidth && aLeft.LineDistance == aRight.LineDistance &&
+                aLeft.LineStyle == aRight.LineStyle &&
                 aLeft.Color == aTop.Color && aLeft.InnerLineWidth == aTop.InnerLineWidth &&
                 aLeft.OuterLineWidth == aTop.OuterLineWidth && aLeft.LineDistance == aTop.LineDistance &&
+                aLeft.LineStyle == aTop.LineStyle  &&
                 aLeft.Color == aBottom.Color && aLeft.InnerLineWidth == aBottom.InnerLineWidth &&
-                aLeft.OuterLineWidth == aBottom.OuterLineWidth && aLeft.LineDistance == aBottom.LineDistance )
+                aLeft.OuterLineWidth == aBottom.OuterLineWidth && aLeft.LineDistance == aBottom.LineDistance &&
+                aLeft.LineStyle == aBottom.LineStyle )
             {
                 pLeftBorderState->mnIndex = -1;
                 pLeftBorderState->maValue.clear();
diff --git a/xmloff/source/text/txtimppr.cxx b/xmloff/source/text/txtimppr.cxx
index 1b8f10c..5c82a84 100644
--- a/xmloff/source/text/txtimppr.cxx
+++ b/xmloff/source/text/txtimppr.cxx
@@ -30,7 +30,7 @@
 #include <tools/debug.hxx>
 #include <com/sun/star/awt/FontFamily.hpp>
 #include <com/sun/star/awt/FontPitch.hpp>
-#include <com/sun/star/table/BorderLine.hpp>
+#include <com/sun/star/table/BorderLine2.hpp>
 #include <com/sun/star/text/VertOrientation.hpp>
 #include <com/sun/star/text/SizeType.hpp>
 #include <tools/string.hxx>
@@ -438,12 +438,12 @@ void XMLTextImportPropertyMapper::finished(
         sal_Bool bHasBorder = sal_False;
         if( pBorders[i] )
         {
-            table::BorderLine aBorderLine;
+            table::BorderLine2 aBorderLine;
             pBorders[i]->maValue >>= aBorderLine;
 
              if( pBorderWidths[i] )
             {
-                table::BorderLine aBorderLineWidth;
+                table::BorderLine2 aBorderLineWidth;
                 pBorderWidths[i]->maValue >>= aBorderLineWidth;
                 aBorderLine.OuterLineWidth = aBorderLineWidth.OuterLineWidth;
                 aBorderLine.InnerLineWidth = aBorderLineWidth.InnerLineWidth;
@@ -492,10 +492,10 @@ void XMLTextImportPropertyMapper::finished(
 #else
         if( pBorders[i] && pBorderWidths[i] )
         {
-            table::BorderLine aBorderLine;
+            table::BorderLine2 aBorderLine;
             pBorders[i]->maValue >>= aBorderLine;
 
-            table::BorderLine aBorderLineWidth;
+            table::BorderLine2 aBorderLineWidth;
             pBorderWidths[i]->maValue >>= aBorderLineWidth;
 
             aBorderLine.OuterLineWidth = aBorderLineWidth.OuterLineWidth;


More information about the ooo-build-commit mailing list