summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCédric Bosdonnat <cedric.bosdonnat.ooo@free.fr>2011-09-20 15:22:02 +0200
committerCédric Bosdonnat <cedric.bosdonnat.ooo@free.fr>2011-09-20 17:01:19 +0200
commit589f754e7c2fa6d62fb8a8b566757c9cf5bea893 (patch)
tree8bed5616e930a193679bf8dd90d9c74477d91223
parentfbb48a21a8c2f4ba00f96544fafc8eb8e908aa10 (diff)
Header/Footer: move the separator line painting to a Window control
This avoids drawing control things on the document OutputDevice and helps keeping them properly refreshed without refreshing the whole document layout.
-rw-r--r--sw/Library_sw.mk1
-rwxr-xr-xsw/source/core/layout/paintfrm.cxx22
-rw-r--r--sw/source/ui/docvw/DashedLine.cxx116
-rw-r--r--sw/source/ui/docvw/HeaderFooterWin.cxx24
-rw-r--r--sw/source/ui/docvw/edtwin.cxx9
-rw-r--r--sw/source/ui/inc/DashedLine.hxx49
-rw-r--r--sw/source/ui/inc/HeaderFooterWin.hxx5
7 files changed, 198 insertions, 28 deletions
diff --git a/sw/Library_sw.mk b/sw/Library_sw.mk
index 35b2b032b418..709b4b5929a8 100644
--- a/sw/Library_sw.mk
+++ b/sw/Library_sw.mk
@@ -583,6 +583,7 @@ $(eval $(call gb_Library_add_exception_objects,sw,\
sw/source/ui/docvw/AnchorOverlayObject \
sw/source/ui/docvw/AnnotationMenuButton \
sw/source/ui/docvw/AnnotationWin \
+ sw/source/ui/docvw/DashedLine \
sw/source/ui/docvw/PostItMgr \
sw/source/ui/docvw/ShadowOverlayObject \
sw/source/ui/docvw/SidebarTxtControl \
diff --git a/sw/source/core/layout/paintfrm.cxx b/sw/source/core/layout/paintfrm.cxx
index 4fd60c3d86ec..c443aceffc94 100755
--- a/sw/source/core/layout/paintfrm.cxx
+++ b/sw/source/core/layout/paintfrm.cxx
@@ -3321,18 +3321,6 @@ drawinglayer::primitive2d::Primitive2DSequence lcl_CreateDashedIndicatorPrimitiv
return aSeq;
}
-drawinglayer::primitive2d::Primitive2DSequence lcl_CreateHeaderFooterSeparatorPrimitives(
- const SwPageFrm* pPageFrm, double nLineY )
-{
- // Adjust the Y-coordinate of the line to the header/footer box
- basegfx::B2DPoint aLeft ( pPageFrm->Frm().Left(), nLineY );
- basegfx::B2DPoint aRight( pPageFrm->Frm().Right(), nLineY );
-
- basegfx::BColor aLineColor = SwViewOption::GetHeaderFooterMarkColor().getBColor();
-
- return lcl_CreateDashedIndicatorPrimitive( aLeft, aRight, aLineColor );
-}
-
void SwPageFrm::PaintBreak( ) const
{
if ( !pGlobalShell->GetViewOptions()->IsPrinting() &&
@@ -3503,8 +3491,6 @@ void SwPageFrm::PaintDecorators( ) const
!pGlobalShell->IsPreView() &&
pGlobalShell->IsShowHeaderFooterSeparator( ) )
{
- drawinglayer::processor2d::BaseProcessor2D* pProcessor = CreateProcessor2D();
-
// Header
const SwFrm* pHeaderFrm = Lower();
if ( !pHeaderFrm->IsHeaderFrm() )
@@ -3517,9 +3503,6 @@ void SwPageFrm::PaintDecorators( ) const
Point nOutputOff = rEditWin.LogicToPixel( Point( nXOff, nHeaderYOff ) );
rEditWin.SetHeaderFooterControl( this, true, nOutputOff );
- pProcessor->process( lcl_CreateHeaderFooterSeparatorPrimitives(
- this, double( nHeaderYOff ) ) );
-
// Footer
const SwFrm* pFtnContFrm = Lower();
while ( pFtnContFrm->GetNext() )
@@ -3532,11 +3515,6 @@ void SwPageFrm::PaintDecorators( ) const
long nFooterYOff = aBodyRect.Bottom();
nOutputOff = rEditWin.LogicToPixel( Point( nXOff, nFooterYOff ) );
rEditWin.SetHeaderFooterControl( this, false, nOutputOff );
-
- pProcessor->process( lcl_CreateHeaderFooterSeparatorPrimitives(
- this, double( nFooterYOff ) ) );
-
- delete pProcessor;
}
}
}
diff --git a/sw/source/ui/docvw/DashedLine.cxx b/sw/source/ui/docvw/DashedLine.cxx
new file mode 100644
index 000000000000..a4a09daf1715
--- /dev/null
+++ b/sw/source/ui/docvw/DashedLine.cxx
@@ -0,0 +1,116 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * Version: MPL 1.1 / GPLv3+ / LGPLv3+
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License or as specified alternatively below. You may obtain a copy of
+ * the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * Major Contributor(s):
+ * [ Copyright (C) 2011 SUSE <cbosdonnat@suse.com> (initial developer) ]
+ *
+ * All Rights Reserved.
+ *
+ * For minor contributions see the git repository.
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 3 or later (the "GPLv3+"), or
+ * the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"),
+ * in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable
+ * instead of those above.
+ */
+
+#include <DashedLine.hxx>
+
+#include <basegfx/color/bcolortools.hxx>
+#include <basegfx/polygon/b2dpolygon.hxx>
+#include <drawinglayer/primitive2d/polygonprimitive2d.hxx>
+#include <drawinglayer/primitive2d/polypolygonprimitive2d.hxx>
+#include <drawinglayer/processor2d/baseprocessor2d.hxx>
+#include <svx/sdr/contact/objectcontacttools.hxx>
+#include <vcl/svapp.hxx>
+
+SwDashedLine::SwDashedLine( Window* pParent, const basegfx::BColor& rColor ) :
+ FixedLine( pParent, WB_DIALOGCONTROL | WB_HORZ ),
+ m_aColor( rColor )
+{
+}
+
+SwDashedLine::~SwDashedLine( )
+{
+}
+
+void SwDashedLine::Paint( const Rectangle& )
+{
+ const drawinglayer::geometry::ViewInformation2D aNewViewInfos;
+ drawinglayer::processor2d::BaseProcessor2D * pProcessor =
+ sdr::contact::createBaseProcessor2DFromOutputDevice(
+ *this, aNewViewInfos );
+
+ // Compute the start and end points
+ const Rectangle aRect( Rectangle( Point( 0, 0 ), PixelToLogic( GetSizePixel() ) ) );
+ double nHalfWidth = double( aRect.Top() + aRect.Bottom() ) / 2.0;
+
+ basegfx::B2DPoint aStart( double( aRect.Left() ), nHalfWidth );
+ basegfx::B2DPoint aEnd( double( aRect.Right() ), nHalfWidth );
+
+ basegfx::B2DPolygon aPolygon;
+ aPolygon.append( aStart );
+ aPolygon.append( aEnd );
+
+ drawinglayer::primitive2d::Primitive2DSequence aSeq( 1 );
+
+ const StyleSettings& rSettings = Application::GetSettings().GetStyleSettings();
+
+ std::vector< double > aStrokePattern;
+ basegfx::BColor aColor = m_aColor;
+ if ( rSettings.GetHighContrastMode( ) )
+ {
+ // Only a solid line in high contrast mode
+ aColor = rSettings.GetDialogTextColor().getBColor();
+ }
+ else
+ {
+ // Get a color for the contrast
+ basegfx::BColor aHslLine = basegfx::tools::rgb2hsl( aColor );
+ double nLuminance = aHslLine.getZ() * 2.5;
+ if ( nLuminance == 0 )
+ nLuminance = 0.5;
+ else if ( nLuminance >= 1.0 )
+ nLuminance = aHslLine.getZ() * 0.4;
+ aHslLine.setZ( nLuminance );
+ const basegfx::BColor aOtherColor = basegfx::tools::hsl2rgb( aHslLine );
+
+ // Compute the plain line
+ drawinglayer::primitive2d::PolygonHairlinePrimitive2D * pPlainLine =
+ new drawinglayer::primitive2d::PolygonHairlinePrimitive2D(
+ aPolygon, aOtherColor );
+
+ aSeq[0] = drawinglayer::primitive2d::Primitive2DReference( pPlainLine );
+ // Dashed line in twips
+ aStrokePattern.push_back( 3 );
+ aStrokePattern.push_back( 3 );
+
+ aSeq.realloc( 2 );
+ }
+
+ // Compute the dashed line primitive
+ drawinglayer::primitive2d::PolyPolygonStrokePrimitive2D * pLine =
+ new drawinglayer::primitive2d::PolyPolygonStrokePrimitive2D (
+ basegfx::B2DPolyPolygon( aPolygon ),
+ drawinglayer::attribute::LineAttribute( m_aColor ),
+ drawinglayer::attribute::StrokeAttribute( aStrokePattern ) );
+
+ aSeq[ aSeq.getLength() - 1 ] = drawinglayer::primitive2d::Primitive2DReference( pLine );
+
+ pProcessor->process( aSeq );
+ delete pProcessor;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/ui/docvw/HeaderFooterWin.cxx b/sw/source/ui/docvw/HeaderFooterWin.cxx
index a7066398a602..f1eb77a430d4 100644
--- a/sw/source/ui/docvw/HeaderFooterWin.cxx
+++ b/sw/source/ui/docvw/HeaderFooterWin.cxx
@@ -33,6 +33,7 @@
#include <svtools/svtools.hrc>
#include <cmdid.h>
+#include <DashedLine.hxx>
#include <docsh.hxx>
#include <edtwin.hxx>
#include <fmthdft.hxx>
@@ -143,7 +144,8 @@ SwHeaderFooterWin::SwHeaderFooterWin( SwEditWin* pEditWin, const SwPageFrm* pPag
m_pPageFrm( pPageFrm ),
m_bIsHeader( bHeader ),
m_bReadonly( false ),
- m_pPopupMenu( NULL )
+ m_pPopupMenu( NULL ),
+ m_pLine( NULL )
{
// Define the readonly member
const SwViewOption* pViewOpt = m_pEditWin->GetView().GetWrtShell().GetViewOptions();
@@ -163,6 +165,10 @@ SwHeaderFooterWin::SwHeaderFooterWin( SwEditWin* pEditWin, const SwPageFrm* pPag
sal_Int32 nPos = m_sLabel.lastIndexOf( rtl::OUString::createFromAscii( "%1" ) );
m_sLabel = m_sLabel.replaceAt( nPos, 2, m_pPageFrm->GetPageDesc()->GetName() );
+ // Create the line control
+ basegfx::BColor aColor = SwViewOption::GetHeaderFooterMarkColor().getBColor();
+ m_pLine = new SwDashedLine( m_pEditWin, aColor );
+
// Create and set the PopupMenu
m_pPopupMenu = new PopupMenu( SW_RES( MN_HEADERFOOTER_BUTTON ) );
@@ -184,9 +190,10 @@ SwHeaderFooterWin::SwHeaderFooterWin( SwEditWin* pEditWin, const SwPageFrm* pPag
SwHeaderFooterWin::~SwHeaderFooterWin( )
{
delete m_pPopupMenu;
+ delete m_pLine;
}
-void SwHeaderFooterWin::SetOffset( Point aOffset )
+void SwHeaderFooterWin::SetOffset( Point aOffset, long nXLineStart, long nXLineEnd )
{
// Compute the text size and get the box position & size from it
Rectangle aTextRect;
@@ -205,6 +212,19 @@ void SwHeaderFooterWin::SetOffset( Point aOffset )
// Set the position & Size of the window
SetPosSizePixel( aBoxPos, aBoxSize );
+
+ double nYLinePos = aBoxPos.Y();
+ if ( !m_bIsHeader )
+ nYLinePos += aBoxSize.Height();
+ Point aLinePos( nXLineStart, nYLinePos );
+ Size aLineSize( nXLineEnd - nXLineStart, 1 );
+ m_pLine->SetPosSizePixel( aLinePos, aLineSize );
+}
+
+void SwHeaderFooterWin::ShowAll( bool bShow )
+{
+ Show( bShow );
+ m_pLine->Show( bShow );
}
void SwHeaderFooterWin::Paint( const Rectangle& )
diff --git a/sw/source/ui/docvw/edtwin.cxx b/sw/source/ui/docvw/edtwin.cxx
index f2e2e894b331..3c29c27ea370 100644
--- a/sw/source/ui/docvw/edtwin.cxx
+++ b/sw/source/ui/docvw/edtwin.cxx
@@ -5777,10 +5777,13 @@ void SwEditWin::SetHeaderFooterControl( const SwPageFrm* pPageFrm, bool bHeader,
pControl.swap( pNewControl );
aHeadFootControls.push_back( pControl );
}
- pControl->SetOffset( aOffset );
+
+ Rectangle aPageRect = LogicToPixel( pPageFrm->Frm().SVRect() );
+
+ pControl->SetOffset( aOffset, aPageRect.Left(), aPageRect.Right() );
if ( !pControl->IsVisible() )
- pControl->Show( );
+ pControl->ShowAll( true );
}
void SwEditWin::RemoveHeaderFooterControls( const SwPageFrm* pPageFrm )
@@ -5795,7 +5798,7 @@ void SwEditWin::HideHeaderFooterControls( )
std::vector< boost::shared_ptr< SwHeaderFooterWin > >::iterator pIt = aHeadFootControls.begin();
while ( pIt != aHeadFootControls.end() )
{
- ( *pIt )->Hide();
+ ( *pIt )->ShowAll( false );
++pIt;
}
}
diff --git a/sw/source/ui/inc/DashedLine.hxx b/sw/source/ui/inc/DashedLine.hxx
new file mode 100644
index 000000000000..671024a3666a
--- /dev/null
+++ b/sw/source/ui/inc/DashedLine.hxx
@@ -0,0 +1,49 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * Version: MPL 1.1 / GPLv3+ / LGPLv3+
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License or as specified alternatively below. You may obtain a copy of
+ * the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * Major Contributor(s):
+ * [ Copyright (C) 2011 SUSE <cbosdonnat@suse.com> (initial developer) ]
+ *
+ * All Rights Reserved.
+ *
+ * For minor contributions see the git repository.
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 3 or later (the "GPLv3+"), or
+ * the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"),
+ * in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable
+ * instead of those above.
+ */
+#ifndef _DASHEDLINE_HXX
+#define _DASHEDLINE_HXX
+
+#include <basegfx/color/bcolor.hxx>
+#include <vcl/fixed.hxx>
+
+/** Class for displaying a dashed line in the Writer GUI.
+ */
+class SwDashedLine : public FixedLine
+{
+ basegfx::BColor m_aColor;
+
+public:
+ SwDashedLine( Window* pParent, const basegfx::BColor& rColor );
+ ~SwDashedLine( );
+
+ virtual void Paint( const Rectangle& rRect );
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/ui/inc/HeaderFooterWin.hxx b/sw/source/ui/inc/HeaderFooterWin.hxx
index 50af8fd4acf4..c59211da6558 100644
--- a/sw/source/ui/inc/HeaderFooterWin.hxx
+++ b/sw/source/ui/inc/HeaderFooterWin.hxx
@@ -45,17 +45,20 @@ class SwHeaderFooterWin : public MenuButton
bool m_bIsHeader;
bool m_bReadonly;
PopupMenu* m_pPopupMenu;
+ Window* m_pLine;
public:
SwHeaderFooterWin( SwEditWin* pEditWin, const SwPageFrm* pPageFrm, bool bHeader );
~SwHeaderFooterWin( );
- void SetOffset( Point aOffset );
+ void SetOffset( Point aOffset, long nXLineStart, long nXLineEnd );
virtual void Paint( const Rectangle& rRect );
virtual void MouseButtonDown( const MouseEvent& rMEvt );
virtual void Select( );
+ void ShowAll( bool bShow );
+
bool IsHeader() { return m_bIsHeader; };
bool IsEmptyHeaderFooter( );
const SwPageFrm* GetPageFrame( ) { return m_pPageFrm; };