diff options
Diffstat (limited to 'sw/source/core/layout/paintfrm.cxx')
-rw-r--r-- | sw/source/core/layout/paintfrm.cxx | 107 |
1 files changed, 79 insertions, 28 deletions
diff --git a/sw/source/core/layout/paintfrm.cxx b/sw/source/core/layout/paintfrm.cxx index 3dc8937ae156..49feb6d8541c 100644 --- a/sw/source/core/layout/paintfrm.cxx +++ b/sw/source/core/layout/paintfrm.cxx @@ -109,6 +109,9 @@ #define COL_NOTES_SIDEPANE_SCROLLAREA RGB_COLORDATA(230,230,220) #include <vcl/svapp.hxx> +#include <svtools/borderhelper.hxx> + + using namespace ::com::sun::star; #define GETOBJSHELL() ((SfxObjectShell*)rSh.GetDoc()->GetDocShell()) @@ -150,15 +153,17 @@ using namespace ::com::sun::star; class SwLineRect : public SwRect { const Color *pColor; + SvxBorderStyle nStyle; const SwTabFrm *pTab; BYTE nSubColor; //Hilfslinien einfaerben BOOL bPainted; //schon gepaintet? BYTE nLock; //Um die Linien zum Hell-Layer abzugrenzen. public: - SwLineRect( const SwRect &rRect, const Color *pCol, + SwLineRect( const SwRect &rRect, const Color *pCol, const SvxBorderStyle nStyle, const SwTabFrm *pT , const BYTE nSCol ); const Color *GetColor() const { return pColor;} + SvxBorderStyle GetStyle() const { return nStyle; } const SwTabFrm *GetTab() const { return pTab; } void SetPainted() { bPainted = TRUE; } void Lock( BOOL bLock ) { if ( bLock ) @@ -180,7 +185,7 @@ class SwLineRects : public SwLRects USHORT nLastCount; //unuetze Durchlaeufe im PaintLines verhindern. public: SwLineRects() : nLastCount( 0 ) {} - void AddLineRect( const SwRect& rRect, const Color *pColor, + void AddLineRect( const SwRect& rRect, const Color *pColor, const SvxBorderStyle nStyle, const SwTabFrm *pTab, const BYTE nSCol ); void ConnectEdges( OutputDevice *pOut ); void PaintLines ( OutputDevice *pOut ); @@ -411,10 +416,11 @@ SwSavePaintStatics::~SwSavePaintStatics() SV_IMPL_VARARR( SwLRects, SwLineRect ); -SwLineRect::SwLineRect( const SwRect &rRect, const Color *pCol, +SwLineRect::SwLineRect( const SwRect &rRect, const Color *pCol, const SvxBorderStyle nStyl, const SwTabFrm *pT, const BYTE nSCol ) : SwRect( rRect ), pColor( pCol ), + nStyle( nStyl ), pTab( pT ), nSubColor( nSCol ), bPainted( FALSE ), @@ -459,7 +465,7 @@ BOOL SwLineRect::MakeUnion( const SwRect &rRect ) return FALSE; } -void SwLineRects::AddLineRect( const SwRect &rRect, const Color *pCol, +void SwLineRects::AddLineRect( const SwRect &rRect, const Color *pCol, const SvxBorderStyle nStyle, const SwTabFrm *pTab, const BYTE nSCol ) { //Rueckwaerts durch, weil Linien die zusammengefasst werden koennen i.d.R. @@ -478,7 +484,7 @@ void SwLineRects::AddLineRect( const SwRect &rRect, const Color *pCol, return; } } - Insert( SwLineRect( rRect, pCol, pTab, nSCol ), Count() ); + Insert( SwLineRect( rRect, pCol, nStyle, pTab, nSCol ), Count() ); } void SwLineRects::ConnectEdges( OutputDevice *pOut ) @@ -585,7 +591,7 @@ void SwLineRects::ConnectEdges( OutputDevice *pOut ) if ( !rL1.IsInside( aIns ) ) continue; const USHORT nTmpFree = Free(); - Insert( SwLineRect( aIns, rL1.GetColor(), + Insert( SwLineRect( aIns, rL1.GetColor(), SOLID, rL1.GetTab(), SUBCOL_TAB ), Count() ); if ( !nTmpFree ) { @@ -626,7 +632,7 @@ void SwLineRects::ConnectEdges( OutputDevice *pOut ) if ( !rL1.IsInside( aIns ) ) continue; const USHORT nTmpFree = Free(); - Insert( SwLineRect( aIns, rL1.GetColor(), + Insert( SwLineRect( aIns, rL1.GetColor(), SOLID, rL1.GetTab(), SUBCOL_TAB ), Count() ); if ( !nTmpFree ) { @@ -656,7 +662,7 @@ inline void SwSubsRects::Ins( const SwRect &rRect, const BYTE nSCol ) //Linien die kuerzer als die breiteste Linienbreite sind werden //nicht aufgenommen. if ( rRect.Height() > DEF_LINE_WIDTH_4 || rRect.Width() > DEF_LINE_WIDTH_4 ) - Insert( SwLineRect( rRect, 0, 0, nSCol ), Count()); + Insert( SwLineRect( rRect, 0, SOLID, 0, nSCol ), Count()); } void SwSubsRects::RemoveSuperfluousSubsidiaryLines( const SwLineRects &rRects ) @@ -712,7 +718,7 @@ void SwSubsRects::RemoveSuperfluousSubsidiaryLines( const SwLineRects &rRects ) { SwRect aNewSubsRect( aSubsLineRect ); aNewSubsRect.Bottom( nTmp ); - Insert( SwLineRect( aNewSubsRect, 0, 0, + Insert( SwLineRect( aNewSubsRect, 0, aSubsLineRect.GetStyle(), 0, aSubsLineRect.GetSubColor() ), Count()); } nTmp = rLine.Bottom()+nPixelSzH+1; @@ -720,7 +726,7 @@ void SwSubsRects::RemoveSuperfluousSubsidiaryLines( const SwLineRects &rRects ) { SwRect aNewSubsRect( aSubsLineRect ); aNewSubsRect.Top( nTmp ); - Insert( SwLineRect( aNewSubsRect, 0, 0, + Insert( SwLineRect( aNewSubsRect, 0, aSubsLineRect.GetStyle(), 0, aSubsLineRect.GetSubColor() ), Count()); } Remove( i, 1 ); @@ -738,7 +744,7 @@ void SwSubsRects::RemoveSuperfluousSubsidiaryLines( const SwLineRects &rRects ) { SwRect aNewSubsRect( aSubsLineRect ); aNewSubsRect.Right( nTmp ); - Insert( SwLineRect( aNewSubsRect, 0, 0, + Insert( SwLineRect( aNewSubsRect, 0, aSubsLineRect.GetStyle(), 0, aSubsLineRect.GetSubColor() ), Count()); } nTmp = rLine.Right()+nPixelSzW+1; @@ -746,7 +752,7 @@ void SwSubsRects::RemoveSuperfluousSubsidiaryLines( const SwLineRects &rRects ) { SwRect aNewSubsRect( aSubsLineRect ); aNewSubsRect.Left( nTmp ); - Insert( SwLineRect( aNewSubsRect, 0, 0, + Insert( SwLineRect( aNewSubsRect, 0, aSubsLineRect.GetStyle(), 0, aSubsLineRect.GetSubColor() ), Count()); } Remove( i, 1 ); @@ -765,6 +771,44 @@ void SwLineRects::LockLines( BOOL bLock ) operator[](i).Lock( bLock ); } +void lcl_DrawDashedRect( OutputDevice * pOut, SwLineRect & rLRect ) +{ + double nHalfLWidth = rLRect.Height( ); + if ( nHalfLWidth > 1 ) + { + nHalfLWidth = nHalfLWidth / 2; + } + else + { + nHalfLWidth = 1; + } + + long startX = rLRect.Left( ); + long startY = rLRect.Top( ) + nHalfLWidth; + long endX = rLRect.Left( ) + rLRect.Width( ); + long endY = rLRect.Top( ) + nHalfLWidth; + + if ( rLRect.Height( ) > rLRect.Width( ) ) + { + nHalfLWidth = rLRect.Width( ); + if ( nHalfLWidth > 1 ) + { + nHalfLWidth = nHalfLWidth / 2; + } + else + { + nHalfLWidth = 1; + } + startX = rLRect.Left( ) + nHalfLWidth; + startY = rLRect.Top( ); + endX = rLRect.Left( ) + nHalfLWidth; + endY = rLRect.Top( ) + rLRect.Height( ); + } + + svtools::DrawLine( *pOut, Point( startX, startY ), Point( endX, endY ), + sal_uInt32( nHalfLWidth * 2 ), rLRect.GetStyle( ) ); +} + void SwLineRects::PaintLines( OutputDevice *pOut ) { //Painten der Umrandungen. Leider muessen wir zweimal durch. @@ -778,6 +822,7 @@ void SwLineRects::PaintLines( OutputDevice *pOut ) // OD 2004-04-23 #116347# pOut->Push( PUSH_FILLCOLOR|PUSH_LINECOLOR ); + pOut->SetFillColor(); pOut->SetLineColor(); ConnectEdges( pOut ); const Color *pLast = 0; @@ -836,11 +881,12 @@ void SwLineRects::PaintLines( OutputDevice *pOut ) Application::GetSettings().GetStyleSettings().GetHighContrastMode() ) pOut->SetDrawMode( 0 ); - pOut->SetFillColor( *pLast ); + pOut->SetLineColor( *pLast ); pOut->SetDrawMode( nOldDrawMode ); } + if( !rLRect.IsEmpty() ) - pOut->DrawRect( rLRect.SVRect() ); + lcl_DrawDashedRect( pOut, rLRect ); rLRect.SetPainted(); } else @@ -874,7 +920,7 @@ void SwLineRects::PaintLines( OutputDevice *pOut ) pOut->SetDrawMode( nOldDrawMode ); } if( !rLRect.IsEmpty() ) - pOut->DrawRect( rLRect.SVRect() ); + lcl_DrawDashedRect( pOut, rLRect ); rLRect.SetPainted(); } nLastCount = nMinCount; @@ -3982,7 +4028,8 @@ void SwFrm::PaintShadow( const SwRect& rRect, SwRect& rOutRect, void SwFrm::PaintBorderLine( const SwRect& rRect, const SwRect& rOutRect, const SwPageFrm *pPage, - const Color *pColor ) const + const Color *pColor, + const SvxBorderStyle nStyle ) const { if ( !rOutRect.IsOver( rRect ) ) return; @@ -4005,10 +4052,10 @@ void SwFrm::PaintBorderLine( const SwRect& rRect, SwRegionRects aRegion( aOut, 4, 1 ); ::lcl_SubtractFlys( this, pPage, aOut, aRegion ); for ( USHORT i = 0; i < aRegion.Count(); ++i ) - pLines->AddLineRect( aRegion[i], pColor, pTab, nSubCol ); + pLines->AddLineRect( aRegion[i], pColor, nStyle, pTab, nSubCol ); } else - pLines->AddLineRect( aOut, pColor, pTab, nSubCol ); + pLines->AddLineRect( aOut, pColor, nStyle, pTab, nSubCol ); } /************************************************************************* @@ -4299,7 +4346,8 @@ void lcl_PaintLeftRightLine( const sal_Bool _bLeft, (aPaintRect.*_rRectFn->fnAddRight)( 1 ); } } - _rFrm.PaintBorderLine( _rRect, aPaintRect, &_rPage, &pLeftRightBorder->GetColor() ); + _rFrm.PaintBorderLine( _rRect, aPaintRect, &_rPage, &pLeftRightBorder->GetColor(), + pLeftRightBorder->GetStyle( ) ); } if ( pLeftRightBorder->GetInWidth() ) @@ -4339,7 +4387,8 @@ void lcl_PaintLeftRightLine( const sal_Bool _bLeft, (aPaintRect.*_rRectFn->fnAddRight)( 1 ); } } - _rFrm.PaintBorderLine( _rRect, aPaintRect, &_rPage, &pLeftRightBorder->GetColor() ); + _rFrm.PaintBorderLine( _rRect, aPaintRect, &_rPage, &pLeftRightBorder->GetColor(), + SOLID ); } } } @@ -4403,7 +4452,8 @@ void lcl_PaintTopBottomLine( const sal_Bool _bTop, (aPaintRect.*_rRectFn->fnAddBottom)( 1 ); } } - _rFrm.PaintBorderLine( _rRect, aPaintRect, &_rPage, &pTopBottomBorder->GetColor() ); + _rFrm.PaintBorderLine( _rRect, aPaintRect, &_rPage, &pTopBottomBorder->GetColor(), + pTopBottomBorder->GetStyle( ) ); } if ( pTopBottomBorder->GetInWidth() ) @@ -4442,7 +4492,8 @@ void lcl_PaintTopBottomLine( const sal_Bool _bTop, (aPaintRect.*_rRectFn->fnAddBottom)( 1 ); } } - _rFrm.PaintBorderLine( _rRect, aPaintRect, &_rPage, &pTopBottomBorder->GetColor() ); + _rFrm.PaintBorderLine( _rRect, aPaintRect, &_rPage, &pTopBottomBorder->GetColor(), + SOLID ); } } } @@ -4922,7 +4973,7 @@ void SwLayoutFrm::PaintColLines( const SwRect &rRect, const SwFmtCol &rFmtCol, (aLineRect.*fnRect->fnSetPosX) ( (pCol->Frm().*fnGetX)() - nPenHalf ); if ( aRect.IsOver( aLineRect ) ) - PaintBorderLine( aRect, aLineRect , pPage, &rFmtCol.GetLineColor()); + PaintBorderLine( aRect, aLineRect , pPage, &rFmtCol.GetLineColor() ); pCol = pCol->GetNext(); } } @@ -6070,7 +6121,7 @@ void MA_FASTCALL lcl_RefreshLine( const SwLayoutFrm *pLay, SwRect aRect( aP1, aP2 ); // OD 18.11.2002 #99672# - use parameter <_pSubsLines> instead of // global variable <pSubsLines>. - _pSubsLines->AddLineRect( aRect, 0, 0, nSubColor ); + _pSubsLines->AddLineRect( aRect, 0, SOLID, 0, nSubColor ); } aP1 = aP2; aP1.*pDirPt += 1; @@ -6209,13 +6260,13 @@ void SwLayoutFrm::PaintSubsidiaryLines( const SwPageFrm *pPage, if ( aOriginal.Left() == aOut.Left() ) { const SwRect aRect( aOut.Pos(), aLB ); - pUsedSubsLines->AddLineRect( aRect, 0, 0, nSubColor ); + pUsedSubsLines->AddLineRect( aRect, 0, SOLID, 0, nSubColor ); } // OD 14.11.2002 #104821# - in vertical layout set page/column break at right if ( aOriginal.Right() == nRight ) { const SwRect aRect( aRT, aRB ); - pUsedSubsLines->AddLineRect( aRect, 0, 0, + pUsedSubsLines->AddLineRect( aRect, 0, SOLID, 0, (bBreak && bVert) ? SUBCOL_BREAK : nSubColor ); } } @@ -6226,13 +6277,13 @@ void SwLayoutFrm::PaintSubsidiaryLines( const SwPageFrm *pPage, { // OD 14.11.2002 #104821# - in horizontal layout set page/column break at top const SwRect aRect( aOut.Pos(), aRT ); - pUsedSubsLines->AddLineRect( aRect, 0, 0, + pUsedSubsLines->AddLineRect( aRect, 0, SOLID, 0, (bBreak && !bVert) ? SUBCOL_BREAK : nSubColor ); } if ( aOriginal.Bottom() == nBottom ) { const SwRect aRect( aLB, aRB ); - pUsedSubsLines->AddLineRect( aRect, 0, 0, nSubColor ); + pUsedSubsLines->AddLineRect( aRect, 0, SOLID, 0, nSubColor ); } } } |