[Libreoffice-commits] .: Branch 'libreoffice-3-5' - 8 commits - sw/inc sw/source
Petr Mladek
pmladek at kemper.freedesktop.org
Tue Jan 10 02:25:42 PST 2012
sw/inc/crsrsh.hxx | 1
sw/inc/viewsh.hxx | 21 +++-
sw/source/core/crsr/crsrsh.cxx | 23 +++-
sw/source/core/inc/pagefrm.hxx | 5 -
sw/source/core/layout/pagechg.cxx | 22 +++-
sw/source/core/layout/paintfrm.cxx | 47 +++++----
sw/source/core/view/viewsh.cxx | 21 +++-
sw/source/core/view/vnew.cxx | 9 +
sw/source/ui/docvw/FrameControlsManager.cxx | 9 +
sw/source/ui/docvw/HeaderFooterWin.cxx | 19 +++-
sw/source/ui/docvw/PageBreakWin.cxx | 132 +++++++++++-----------------
sw/source/ui/docvw/edtwin.cxx | 121 +++++++++++++------------
sw/source/ui/inc/FrameControl.hxx | 4
sw/source/ui/inc/FrameControlsManager.hxx | 11 --
sw/source/ui/inc/HeaderFooterWin.hxx | 3
sw/source/ui/inc/PageBreakWin.hxx | 7 +
sw/source/ui/inc/edtwin.hxx | 14 +-
sw/source/ui/inc/wrtsh.hxx | 2
sw/source/ui/wrtsh/wrtsh1.cxx | 6 -
19 files changed, 267 insertions(+), 210 deletions(-)
New commits:
commit 6e3d9d601cf7a9f20a93eb8fc9abf5d8464eec28
Author: Cédric Bosdonnat <cedric.bosdonnat at free.fr>
Date: Thu Jan 5 11:34:49 2012 +0100
Page Break: center the tab on the mouse and remove click on the line
diff --git a/sw/source/ui/docvw/PageBreakWin.cxx b/sw/source/ui/docvw/PageBreakWin.cxx
index b16e51f..f954b6e 100644
--- a/sw/source/ui/docvw/PageBreakWin.cxx
+++ b/sw/source/ui/docvw/PageBreakWin.cxx
@@ -125,7 +125,6 @@ namespace
m_pWin( pWin ) {};
virtual void MouseMove( const MouseEvent& rMEvt );
- virtual void MouseButtonDown( const MouseEvent& rMEvt );
};
void SwBreakDashedLine::MouseMove( const MouseEvent& rMEvt )
@@ -148,16 +147,6 @@ namespace
m_pWin->UpdatePosition( pPtr );
}
}
-
- void SwBreakDashedLine::MouseButtonDown( const MouseEvent& rMEvt )
- {
- sal_uInt16 nItemId = m_pWin->GetPopupMenu()->Execute( this, rMEvt.GetPosPixel() );
- if ( nItemId )
- {
- m_pWin->SetCurItemId( nItemId );
- m_pWin->Select();
- }
- }
}
SwPageBreakWin::SwPageBreakWin( SwEditWin* pEditWin, const SwPageFrm* pPageFrm ) :
@@ -452,14 +441,10 @@ void SwPageBreakWin::UpdatePosition( const Point* pEvtPt )
if ( m_pMousePt )
{
- nBtnLeft = nLineLeft + m_pMousePt->X();
+ nBtnLeft = nLineLeft + m_pMousePt->X() - aBtnSize.getWidth() / 2;
- if ( Application::GetSettings().GetLayoutRTL() )
- {
- nBtnLeft -= aBtnSize.getWidth();
- if ( nBtnLeft < nLineLeft )
- nBtnLeft = nLineLeft;
- }
+ if ( nBtnLeft < nLineLeft )
+ nBtnLeft = nLineLeft;
else if ( ( nBtnLeft + aBtnSize.getWidth() ) > nLineRight )
nBtnLeft = nLineRight - aBtnSize.getWidth();
}
commit c17724737cc54fbecb32c510c437c4fda045d94b
Author: Cédric Bosdonnat <cedric.bosdonnat at free.fr>
Date: Wed Jan 4 21:54:05 2012 +0100
Page Break: fixed position of tab in RTL and added dirty hack for freezes
diff --git a/sw/source/ui/docvw/PageBreakWin.cxx b/sw/source/ui/docvw/PageBreakWin.cxx
index aa1085c..b16e51f 100644
--- a/sw/source/ui/docvw/PageBreakWin.cxx
+++ b/sw/source/ui/docvw/PageBreakWin.cxx
@@ -142,8 +142,11 @@ namespace
m_pWin->Fade( true );
}
- Point* pPtr = new Point( rMEvt.GetPosPixel() );
- m_pWin->UpdatePosition( pPtr );
+ if ( !rMEvt.IsSynthetic() )
+ {
+ Point* pPtr = new Point( rMEvt.GetPosPixel() );
+ m_pWin->UpdatePosition( pPtr );
+ }
}
void SwBreakDashedLine::MouseButtonDown( const MouseEvent& rMEvt )
@@ -450,7 +453,14 @@ void SwPageBreakWin::UpdatePosition( const Point* pEvtPt )
if ( m_pMousePt )
{
nBtnLeft = nLineLeft + m_pMousePt->X();
- if ( ( nBtnLeft + aBtnSize.getWidth() ) > nLineRight )
+
+ if ( Application::GetSettings().GetLayoutRTL() )
+ {
+ nBtnLeft -= aBtnSize.getWidth();
+ if ( nBtnLeft < nLineLeft )
+ nBtnLeft = nLineLeft;
+ }
+ else if ( ( nBtnLeft + aBtnSize.getWidth() ) > nLineRight )
nBtnLeft = nLineRight - aBtnSize.getWidth();
}
commit a0347a9b94e2dc4ee1906341aa187d6a9f7749af
Author: Cédric Bosdonnat <cedric.bosdonnat.ooo at free.fr>
Date: Wed Jan 4 09:33:44 2012 +0100
Page Break: show the page break right under the mouse
diff --git a/sw/source/ui/docvw/PageBreakWin.cxx b/sw/source/ui/docvw/PageBreakWin.cxx
index 94b314c..aa1085c 100644
--- a/sw/source/ui/docvw/PageBreakWin.cxx
+++ b/sw/source/ui/docvw/PageBreakWin.cxx
@@ -68,59 +68,22 @@ using namespace drawinglayer::primitive2d;
namespace
{
- static B2DPolygon lcl_CreatePolygon( B2DRectangle aBounds, bool bMirror )
+ static B2DPolygon lcl_CreatePolygon( B2DRectangle aBounds )
{
B2DPolygon aRetval;
const double nRadius = 1;
const double nKappa((M_SQRT2 - 1.0) * 4.0 / 3.0);
- // Create the top left corner
- {
- B2DPoint aTLCorner = aBounds.getMinimum();
- B2DPoint aStart( 0.0, nRadius );
- B2DPoint aEnd( nRadius, 0.0 );
- aRetval.append( aStart );
- aRetval.appendBezierSegment(
- interpolate( aStart, aTLCorner, nKappa ),
- interpolate( aEnd, aTLCorner, nKappa ),
- aEnd );
- }
-
- // Create the top right angle
- {
- B2DPoint aTMCorner( aBounds.getWidth() - ARROW_WIDTH, 0.0 );
- B2DPoint aStart = aTMCorner + B2DVector( - nRadius, 0.0 );
- B2DVector aEndVect( double( ARROW_WIDTH ), aBounds.getHeight() / 2.0 );
- aEndVect.setLength( nRadius );
- B2DPoint aEnd = aTMCorner + aEndVect;
- aRetval.append( aStart );
- aRetval.appendBezierSegment(
- interpolate( aStart, aTMCorner, nKappa ),
- interpolate( aEnd, aTMCorner, nKappa ),
- aEnd );
- }
-
- // Create the right corner
+ // Create the top right corner
{
- B2DPoint aMRCorner( aBounds.getWidth(), aBounds.getHeight() / 2.0 );
- B2DVector aStartVect( double( - ARROW_WIDTH ), - aBounds.getHeight() / 2.0 );
- aStartVect.setLength( nRadius );
- B2DPoint aStart = aMRCorner + aStartVect;
- B2DVector aEndVect( double( - ARROW_WIDTH ), aBounds.getHeight() / 2.0 );
- aEndVect.setLength( nRadius );
- B2DPoint aEnd = aMRCorner + aEndVect;
- aRetval.append( aStart );
- aRetval.appendBezierSegment(
- interpolate( aStart, aMRCorner, nKappa ),
- interpolate( aEnd, aMRCorner, nKappa ),
- aEnd );
+ B2DPoint aTMCorner( aBounds.getWidth(), 0.0 );
+ aRetval.append( aTMCorner );
}
- // Create the bottom right angle
+ // Create the bottom right corner
{
- B2DPoint aBMCorner( aBounds.getWidth() - ARROW_WIDTH, aBounds.getHeight() );
- B2DVector aStartVect( double( ARROW_WIDTH ), - aBounds.getHeight() / 2.0 );
- aStartVect.setLength( nRadius );
+ B2DPoint aBMCorner( aBounds.getWidth(), aBounds.getHeight() );
+ B2DVector aStartVect( 0.0, - nRadius );
B2DPoint aStart = aBMCorner + aStartVect;
B2DPoint aEnd = aBMCorner + B2DVector( - nRadius, 0.0 );
aRetval.append( aStart );
@@ -142,13 +105,10 @@ namespace
aEnd );
}
- aRetval.setClosed( true );
-
- if ( bMirror )
+ // Create the top left corner
{
- B2DHomMatrix bRotMatrix = createRotateAroundPoint(
- aBounds.getCenterX(), aBounds.getCenterY(), M_PI );
- aRetval.transform( bRotMatrix );
+ B2DPoint aTLCorner = aBounds.getMinimum();
+ aRetval.append( aTLCorner );
}
return aRetval;
@@ -178,7 +138,12 @@ namespace
m_pWin->Fade( false );
}
else if ( !m_pWin->IsVisible() )
+ {
m_pWin->Fade( true );
+ }
+
+ Point* pPtr = new Point( rMEvt.GetPosPixel() );
+ m_pWin->UpdatePosition( pPtr );
}
void SwBreakDashedLine::MouseButtonDown( const MouseEvent& rMEvt )
@@ -199,7 +164,8 @@ SwPageBreakWin::SwPageBreakWin( SwEditWin* pEditWin, const SwPageFrm* pPageFrm )
m_pLine( NULL ),
m_bIsAppearing( false ),
m_nFadeRate( 100 ),
- m_bDestroyed( false )
+ m_bDestroyed( false ),
+ m_pMousePt( NULL )
{
// Use pixels for the rest of the drawing
SetMapMode( MapMode ( MAP_PIXEL ) );
@@ -223,6 +189,7 @@ SwPageBreakWin::~SwPageBreakWin( )
delete m_pPopupMenu;
delete m_pLine;
+ delete m_pMousePt;
}
void SwPageBreakWin::Paint( const Rectangle& )
@@ -254,7 +221,7 @@ void SwPageBreakWin::Paint( const Rectangle& )
B2DRectangle aBRect( double( aRect.Left() ), double( aRect.Top( ) ),
double( aRect.Right() ), double( aRect.Bottom( ) ) );
bool bMirror = ( bShowOnRight && !bRtl ) || ( !bShowOnRight && bRtl );
- B2DPolygon aPolygon = lcl_CreatePolygon( aBRect, bMirror );
+ B2DPolygon aPolygon = lcl_CreatePolygon( aBRect );
// Create the polygon primitives
aSeq[0] = Primitive2DReference( new PolyPolygonColorPrimitive2D(
@@ -400,7 +367,7 @@ void SwPageBreakWin::MouseMove( const MouseEvent& rMEvt )
if ( rMEvt.IsLeaveWindow() )
{
// don't fade if we just move to the 'line', or the popup menu is open
- Point aEventPos( GetPosPixel() + rMEvt.GetPosPixel() );
+ Point aEventPos( rMEvt.GetPosPixel() + rMEvt.GetPosPixel() );
if ( !Contains( aEventPos ) && !PopupMenu::IsInExecute() )
Fade( false );
}
@@ -432,8 +399,16 @@ bool SwPageBreakWin::ShowOnRight( )
return bOnRight;
}
-void SwPageBreakWin::UpdatePosition( )
+void SwPageBreakWin::UpdatePosition( const Point* pEvtPt )
{
+ if ( pEvtPt != NULL )
+ {
+ if ( pEvtPt == m_pMousePt )
+ return;
+ delete m_pMousePt;
+ m_pMousePt = pEvtPt;
+ }
+
const SwPageFrm* pPageFrm = GetPageFrame();
const SwFrm* pPrevPage = pPageFrm->GetPrev();
while ( pPrevPage && ( pPrevPage->Frm().Top( ) == pPageFrm->Frm().Top( ) ) )
@@ -470,18 +445,17 @@ void SwPageBreakWin::UpdatePosition( )
long nLineLeft = std::max( nPgLeft, aVisArea.Left() );
long nLineRight = std::min( nPgRight, aVisArea.Right() );
- long nBtnLeft = nPgLeft;
+ long nBtnLeft = nLineLeft;
- if ( ShowOnRight( ) )
+ if ( m_pMousePt )
{
- long nRight = std::min( nPgRight + aBtnSize.getWidth() - ARROW_WIDTH / 2, aVisArea.Right() );
- nBtnLeft = nRight - aBtnSize.getWidth();
+ nBtnLeft = nLineLeft + m_pMousePt->X();
+ if ( ( nBtnLeft + aBtnSize.getWidth() ) > nLineRight )
+ nBtnLeft = nLineRight - aBtnSize.getWidth();
}
- else
- nBtnLeft = std::max( nPgLeft - aBtnSize.Width() + ARROW_WIDTH / 2, aVisArea.Left() );
// Set the button position
- Point aBtnPos( nBtnLeft, nYLineOffset - aBtnSize.Height() / 2 );
+ Point aBtnPos( nBtnLeft, nYLineOffset + 1 );
SetPosSizePixel( aBtnPos, aBtnSize );
// Set the line position
diff --git a/sw/source/ui/inc/PageBreakWin.hxx b/sw/source/ui/inc/PageBreakWin.hxx
index e1967f3..bd4eb64 100644
--- a/sw/source/ui/inc/PageBreakWin.hxx
+++ b/sw/source/ui/inc/PageBreakWin.hxx
@@ -48,6 +48,8 @@ class SwPageBreakWin : public MenuButton, public SwFrameControl
Timer m_aFadeTimer;
bool m_bDestroyed;
+ const Point* m_pMousePt;
+
public:
SwPageBreakWin( SwEditWin* pEditWin, const SwPageFrm* pPageFrm );
~SwPageBreakWin( );
@@ -57,7 +59,7 @@ public:
virtual void MouseMove( const MouseEvent& rMEvt );
virtual void Activate( );
- void UpdatePosition( );
+ void UpdatePosition( const Point* pEvtPt = NULL );
virtual void ShowAll( bool bShow );
virtual bool Contains( const Point &rDocPt ) const;
commit 5fb10a076a9192f8f37f6936231b742bae9ca44a
Author: Cédric Bosdonnat <cedric.bosdonnat at free.fr>
Date: Mon Jan 2 10:58:12 2012 +0100
Page Breaks: avoid flickering of the tab by drawing it over the line
diff --git a/sw/source/ui/docvw/PageBreakWin.cxx b/sw/source/ui/docvw/PageBreakWin.cxx
index 3848208..94b314c 100644
--- a/sw/source/ui/docvw/PageBreakWin.cxx
+++ b/sw/source/ui/docvw/PageBreakWin.cxx
@@ -476,15 +476,9 @@ void SwPageBreakWin::UpdatePosition( )
{
long nRight = std::min( nPgRight + aBtnSize.getWidth() - ARROW_WIDTH / 2, aVisArea.Right() );
nBtnLeft = nRight - aBtnSize.getWidth();
- if ( IsVisible() )
- nLineRight = nBtnLeft;
}
else
- {
nBtnLeft = std::max( nPgLeft - aBtnSize.Width() + ARROW_WIDTH / 2, aVisArea.Left() );
- if ( IsVisible() )
- nLineLeft = nBtnLeft + aBtnSize.Width();
- }
// Set the button position
Point aBtnPos( nBtnLeft, nYLineOffset - aBtnSize.Height() / 2 );
commit 0aff79354dc368e0c0a16070943b63c1ca91259d
Author: Cédric Bosdonnat <cedric.bosdonnat.ooo at free.fr>
Date: Thu Jan 5 16:59:22 2012 +0100
Header/Footer: fix some bad indicators updates due to wrong call order
diff --git a/sw/source/core/crsr/crsrsh.cxx b/sw/source/core/crsr/crsrsh.cxx
index 049a867..36fe86d 100644
--- a/sw/source/core/crsr/crsrsh.cxx
+++ b/sw/source/core/crsr/crsrsh.cxx
@@ -1315,22 +1315,22 @@ void SwCrsrShell::UpdateCrsr( sal_uInt16 eFlags, sal_Bool bIdleEnd )
return; // wenn nicht, dann kein Update !!
}
- if ( IsInHeaderFooter() != IsHeaderFooterEdit() )
- ToggleHeaderFooterEdit();
sal_Bool bInHeader= sal_True;
if ( IsInHeaderFooter( &bInHeader ) )
{
- if ( IsShowHeaderFooterSeparator( Header ) && !bInHeader )
+ if ( !bInHeader )
{
SetShowHeaderFooterSeparator( Footer, true );
SetShowHeaderFooterSeparator( Header, false );
}
- else if ( IsShowHeaderFooterSeparator( Footer ) && bInHeader )
+ else
{
SetShowHeaderFooterSeparator( Header, true );
SetShowHeaderFooterSeparator( Footer, false );
}
}
+ if ( IsInHeaderFooter() != IsHeaderFooterEdit() )
+ ToggleHeaderFooterEdit();
// #i27301#
commit d3ea6fe7473049f421c1f72cde4bbd5c4c6348a9
Author: Cédric Bosdonnat <cedric.bosdonnat.ooo at free.fr>
Date: Wed Jan 4 20:42:17 2012 +0100
Header/Footer: switch cursor between header and footer using the cursor
This fixes commit cce76e658af88813e17dea4f04388a29d7e582df.
diff --git a/sw/source/core/crsr/crsrsh.cxx b/sw/source/core/crsr/crsrsh.cxx
index 0d1efa3..049a867 100644
--- a/sw/source/core/crsr/crsrsh.cxx
+++ b/sw/source/core/crsr/crsrsh.cxx
@@ -1317,6 +1317,21 @@ void SwCrsrShell::UpdateCrsr( sal_uInt16 eFlags, sal_Bool bIdleEnd )
if ( IsInHeaderFooter() != IsHeaderFooterEdit() )
ToggleHeaderFooterEdit();
+ sal_Bool bInHeader= sal_True;
+ if ( IsInHeaderFooter( &bInHeader ) )
+ {
+ if ( IsShowHeaderFooterSeparator( Header ) && !bInHeader )
+ {
+ SetShowHeaderFooterSeparator( Footer, true );
+ SetShowHeaderFooterSeparator( Header, false );
+ }
+ else if ( IsShowHeaderFooterSeparator( Footer ) && bInHeader )
+ {
+ SetShowHeaderFooterSeparator( Header, true );
+ SetShowHeaderFooterSeparator( Footer, false );
+ }
+ }
+
// #i27301#
SwNotifyAccAboutInvalidTextSelections aInvalidateTextSelections( *this );
commit cdd2364f23f92a3f63a551aa883b99cadf0bcf28
Author: Jan Holesovsky <kendy at suse.cz>
Date: Thu Dec 29 13:42:43 2011 +0100
Header/Footer: When editing, show only the appropriate conrol.
Instead of showing both the header and footer controls, show only the
footer-related if in footer, or header-related if in header.
Signed-off-by: Stefan Knorr (Astron) <heinzlesspam at googlemail.com>
Signed-off-by: Cor Nouws <oolst at nouenoff.nl>
Signed-off-by: Michael Meeks <michael.meeks at suse.com>
diff --git a/sw/inc/viewsh.hxx b/sw/inc/viewsh.hxx
index fd4a3d6..85b17a4 100644
--- a/sw/inc/viewsh.hxx
+++ b/sw/inc/viewsh.hxx
@@ -92,6 +92,12 @@ namespace vcl
class OldStylePrintAdaptor;
}
+enum FrameControlType
+{
+ PageBreak,
+ Header,
+ Footer
+};
// Define for flags needed in ctor or layers below.
// Currently the PreView flag is needed for DrawPage.
@@ -156,9 +162,10 @@ class SW_DLLPUBLIC ViewShell : public Ring
sal_Bool bEnableSmooth :1; // Disable SmoothScroll, e.g. for drag
// of scrollbars.
sal_Bool bEndActionByVirDev:1; // Paints from EndAction always via virtual device
- bool bShowHeaderFooterSeparator:1;
- bool bHeaderFooterEdit:1;
// (e.g. when browsing).
+ bool bShowHeaderSeparator:1; //< Flag to say that we are showing the header control
+ bool bShowFooterSeparator:1; //< Flag to say that we are showing the footer control
+ bool bHeaderFooterEdit:1; //< Flag to say that we are editing header or footer (according to the bShow(Header|Footer)Separator above)
// boolean, indicating that class in in constructor.
bool mbInConstructor:1;
@@ -565,10 +572,12 @@ public:
const SwPostItMgr* GetPostItMgr() const { return (const_cast<ViewShell*>(this))->GetPostItMgr(); }
SwPostItMgr* GetPostItMgr();
- void ToggleHeaderFooterEdit( );
+ /// Acts both for headers / footers, depending on the bShow(Header|Footer)Separator flags
+ void ToggleHeaderFooterEdit();
+ /// Acts both for headers / footers, depending on the bShow(Header|Footer)Separator flags
bool IsHeaderFooterEdit() const { return bHeaderFooterEdit; }
- bool IsShowHeaderFooterSeparator() { return bShowHeaderFooterSeparator; }
- virtual void SetShowHeaderFooterSeparator( bool bShow ) { bShowHeaderFooterSeparator = bShow; }
+ bool IsShowHeaderFooterSeparator( FrameControlType eControl ) { return (eControl == Header)? bShowHeaderSeparator: bShowFooterSeparator; }
+ virtual void SetShowHeaderFooterSeparator( FrameControlType eControl, bool bShow ) { if ( eControl == Header ) bShowHeaderSeparator = bShow; else bShowFooterSeparator = bShow; }
};
//---- class CurrShell manages global ShellPointer -------------------
diff --git a/sw/source/core/crsr/crsrsh.cxx b/sw/source/core/crsr/crsrsh.cxx
index bb55f6b..0d1efa3 100644
--- a/sw/source/core/crsr/crsrsh.cxx
+++ b/sw/source/core/crsr/crsrsh.cxx
@@ -1316,7 +1316,7 @@ void SwCrsrShell::UpdateCrsr( sal_uInt16 eFlags, sal_Bool bIdleEnd )
}
if ( IsInHeaderFooter() != IsHeaderFooterEdit() )
- ToggleHeaderFooterEdit( );
+ ToggleHeaderFooterEdit();
// #i27301#
SwNotifyAccAboutInvalidTextSelections aInvalidateTextSelections( *this );
diff --git a/sw/source/core/inc/pagefrm.hxx b/sw/source/core/inc/pagefrm.hxx
index 1e16a98..779c4cd 100644
--- a/sw/source/core/inc/pagefrm.hxx
+++ b/sw/source/core/inc/pagefrm.hxx
@@ -28,7 +28,7 @@
#ifndef _PAGEFRM_HXX
#define _PAGEFRM_HXX
-
+#include <viewsh.hxx>
#include <svl/svarray.hxx>
#include "ftnboss.hxx"
@@ -359,7 +359,8 @@ public:
// in case this is am empty page, this function returns the 'reference' page
const SwPageFrm& GetFormatPage() const;
- bool IsOverHeaderFooterArea( const Point& rPt ) const;
+ /// If in header or footer area, it also indicates the exact area in rControl.
+ bool IsOverHeaderFooterArea( const Point& rPt, FrameControlType &rControl ) const;
// return font used to paint the "empty page" string
static const Font& GetEmptyPageFont();
diff --git a/sw/source/core/layout/pagechg.cxx b/sw/source/core/layout/pagechg.cxx
index 7e1c34f..79d7d1b 100644
--- a/sw/source/core/layout/pagechg.cxx
+++ b/sw/source/core/layout/pagechg.cxx
@@ -2449,7 +2449,7 @@ const SwPageFrm& SwPageFrm::GetFormatPage() const
return *pRet;
}
-bool SwPageFrm::IsOverHeaderFooterArea( const Point& rPt ) const
+bool SwPageFrm::IsOverHeaderFooterArea( const Point& rPt, FrameControlType &rControl ) const
{
long nUpperLimit = 0;
long nLowerLimit = 0;
@@ -2470,10 +2470,24 @@ bool SwPageFrm::IsOverHeaderFooterArea( const Point& rPt ) const
SwRect aHeaderArea( Frm().TopLeft(),
Size( Frm().Width(), nUpperLimit - Frm().Top() ) );
- SwRect aFooterArea( Point( Frm().Left(), nLowerLimit ),
- Size( Frm().Width(), Frm().Bottom() - nLowerLimit ) );
+ if ( aHeaderArea.IsInside( rPt ) )
+ {
+ rControl = Header;
+ return true;
+ }
+ else
+ {
+ SwRect aFooterArea( Point( Frm().Left(), nLowerLimit ),
+ Size( Frm().Width(), Frm().Bottom() - nLowerLimit ) );
+
+ if ( aFooterArea.IsInside( rPt ) )
+ {
+ rControl = Footer;
+ return true;
+ }
+ }
- return aHeaderArea.IsInside( rPt ) || aFooterArea.IsInside( rPt );
+ return false;
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/layout/paintfrm.cxx b/sw/source/core/layout/paintfrm.cxx
index 55a2b71..074a54a 100755
--- a/sw/source/core/layout/paintfrm.cxx
+++ b/sw/source/core/layout/paintfrm.cxx
@@ -3377,7 +3377,8 @@ void SwColumnFrm::PaintBreak( ) const
// header/footer marker
// * Non-printing characters are shown, as this is more consistent
// with other formatting marks
- if ( !pGlobalShell->IsShowHeaderFooterSeparator() &&
+ if ( !pGlobalShell->IsShowHeaderFooterSeparator( Header ) &&
+ !pGlobalShell->IsShowHeaderFooterSeparator( Footer ) &&
pGlobalShell->GetViewOptions( )->IsLineBreak( ) )
{
SwRect aRect( pCnt->Prt() );
@@ -3469,36 +3470,42 @@ void SwPageFrm::PaintDecorators( ) const
if ( pGlobalShell->GetOut()->GetOutDevType() != OUTDEV_PRINTER &&
!pGlobalShell->GetViewOptions()->IsPDFExport() &&
!pGlobalShell->IsPreView() &&
- pGlobalShell->IsShowHeaderFooterSeparator( ) )
+ ( pGlobalShell->IsShowHeaderFooterSeparator( Header ) ||
+ pGlobalShell->IsShowHeaderFooterSeparator( Footer ) ) )
{
bool bRtl = Application::GetSettings().GetLayoutRTL();
-
- // Header
- const SwFrm* pHeaderFrm = Lower();
- if ( !pHeaderFrm->IsHeaderFrm() )
- pHeaderFrm = NULL;
-
const SwRect& rVisArea = pGlobalShell->VisArea();
long nXOff = std::min( aBodyRect.Right(), rVisArea.Right() );
if ( bRtl )
nXOff = std::max( aBodyRect.Left(), rVisArea.Left() );
- long nHeaderYOff = aBodyRect.Top();
- Point nOutputOff = rEditWin.LogicToPixel( Point( nXOff, nHeaderYOff ) );
- rEditWin.GetFrameControlsManager().SetHeaderFooterControl( this, true, nOutputOff );
+ // Header
+ if ( pGlobalShell->IsShowHeaderFooterSeparator( Header ) )
+ {
+ const SwFrm* pHeaderFrm = Lower();
+ if ( !pHeaderFrm->IsHeaderFrm() )
+ pHeaderFrm = NULL;
+
+ long nHeaderYOff = aBodyRect.Top();
+ Point nOutputOff = rEditWin.LogicToPixel( Point( nXOff, nHeaderYOff ) );
+ rEditWin.GetFrameControlsManager().SetHeaderFooterControl( this, Header, nOutputOff );
+ }
// Footer
- const SwFrm* pFtnContFrm = Lower();
- while ( pFtnContFrm )
+ if ( pGlobalShell->IsShowHeaderFooterSeparator( Footer ) )
{
- if ( pFtnContFrm->IsFtnContFrm() )
- aBodyRect.AddBottom( pFtnContFrm->Frm().Bottom() - aBodyRect.Bottom() );
- pFtnContFrm = pFtnContFrm->GetNext();
- }
+ const SwFrm* pFtnContFrm = Lower();
+ while ( pFtnContFrm )
+ {
+ if ( pFtnContFrm->IsFtnContFrm() )
+ aBodyRect.AddBottom( pFtnContFrm->Frm().Bottom() - aBodyRect.Bottom() );
+ pFtnContFrm = pFtnContFrm->GetNext();
+ }
- long nFooterYOff = aBodyRect.Bottom();
- nOutputOff = rEditWin.LogicToPixel( Point( nXOff, nFooterYOff ) );
- rEditWin.GetFrameControlsManager().SetHeaderFooterControl( this, false, nOutputOff );
+ long nFooterYOff = aBodyRect.Bottom();
+ Point nOutputOff = rEditWin.LogicToPixel( Point( nXOff, nFooterYOff ) );
+ rEditWin.GetFrameControlsManager().SetHeaderFooterControl( this, Footer, nOutputOff );
+ }
}
}
}
diff --git a/sw/source/core/view/viewsh.cxx b/sw/source/core/view/viewsh.cxx
index 9e3bb9b..0413382 100644
--- a/sw/source/core/view/viewsh.cxx
+++ b/sw/source/core/view/viewsh.cxx
@@ -97,10 +97,20 @@ using namespace ::com::sun::star;
void ViewShell::ToggleHeaderFooterEdit()
{
bHeaderFooterEdit = !bHeaderFooterEdit;
- if ( bHeaderFooterEdit != IsShowHeaderFooterSeparator() )
- SetShowHeaderFooterSeparator( bHeaderFooterEdit );
+ if ( !bHeaderFooterEdit )
+ {
+ SetShowHeaderFooterSeparator( Header, false );
+ SetShowHeaderFooterSeparator( Footer, false );
+ }
+
+ // Avoid corner case
+ if ( !IsShowHeaderFooterSeparator( Header ) &&
+ !IsShowHeaderFooterSeparator( Footer ) )
+ {
+ bHeaderFooterEdit = false;
+ }
- // Repaint everything to update the colors of the selected area
+ // Repaint everything
GetWin()->Invalidate();
}
diff --git a/sw/source/core/view/vnew.cxx b/sw/source/core/view/vnew.cxx
index 647e649..1234c4d 100644
--- a/sw/source/core/view/vnew.cxx
+++ b/sw/source/core/view/vnew.cxx
@@ -151,8 +151,9 @@ ViewShell::ViewShell( SwDoc& rDocument, Window *pWindow,
mpTmpRef( 0 ),
pOpt( 0 ),
pAccOptions( new SwAccessibilityOptions ),
- bShowHeaderFooterSeparator( sal_False ),
- bHeaderFooterEdit( sal_False ),
+ bShowHeaderSeparator( false ),
+ bShowFooterSeparator( false ),
+ bHeaderFooterEdit( false ),
mpTargetPaintWindow(0),
mpBufferedOut(0),
pDoc( &rDocument ),
@@ -219,7 +220,9 @@ ViewShell::ViewShell( ViewShell& rShell, Window *pWindow,
mpTmpRef( 0 ),
pOpt( 0 ),
pAccOptions( new SwAccessibilityOptions ),
- bHeaderFooterEdit( sal_False ),
+ bShowHeaderSeparator( false ),
+ bShowFooterSeparator( false ),
+ bHeaderFooterEdit( false ),
mpTargetPaintWindow(0),
mpBufferedOut(0),
pDoc( rShell.GetDoc() ),
diff --git a/sw/source/ui/docvw/FrameControlsManager.cxx b/sw/source/ui/docvw/FrameControlsManager.cxx
index b59610a..5c00b58 100644
--- a/sw/source/ui/docvw/FrameControlsManager.cxx
+++ b/sw/source/ui/docvw/FrameControlsManager.cxx
@@ -157,11 +157,13 @@ void SwFrameControlsManager::SetReadonlyControls( bool bReadonly )
}
}
-void SwFrameControlsManager::SetHeaderFooterControl( const SwPageFrm* pPageFrm, bool bHeader, Point aOffset )
+void SwFrameControlsManager::SetHeaderFooterControl( const SwPageFrm* pPageFrm, FrameControlType eType, Point aOffset )
{
+ OSL_ASSERT( eType == Header || eType == Footer );
+
// Check if we already have the control
SwFrameControlPtr pControl;
- FrameControlType eType = bHeader? Header: Footer;
+ const bool bHeader = ( eType == Header );
vector< SwFrameControlPtr >& aControls = m_aControls[eType];
diff --git a/sw/source/ui/docvw/edtwin.cxx b/sw/source/ui/docvw/edtwin.cxx
index ad50654..66b8fad 100644
--- a/sw/source/ui/docvw/edtwin.cxx
+++ b/sw/source/ui/docvw/edtwin.cxx
@@ -3810,9 +3810,12 @@ void SwEditWin::MouseMove(const MouseEvent& _rMEvt)
// Are we moving from or to header / footer area?
if ( !rSh.IsHeaderFooterEdit() )
{
- bool bIsInHF = IsInHeaderFooter( aDocPt );
- if ( rSh.IsShowHeaderFooterSeparator() != bIsInHF )
- ShowHeaderFooterSeparator( bIsInHF );
+ FrameControlType eControl;
+ bool bIsInHF = IsInHeaderFooter( aDocPt, eControl );
+ if ( !bIsInHF )
+ ShowHeaderFooterSeparator( false, false );
+ else
+ ShowHeaderFooterSeparator( eControl == Header, eControl == Footer );
}
}
// no break;
@@ -5649,37 +5652,51 @@ void SwEditWin::ShowAutoTextCorrectQuickHelp(
pQuickHlpData->Start( rSh, rWord.Len() );
}
-void SwEditWin::ShowHeaderFooterSeparator( bool bShow )
+void SwEditWin::ShowHeaderFooterSeparator( bool bShowHeader, bool bShowFooter )
{
SwWrtShell& rSh = rView.GetWrtShell();
- if ( rSh.IsShowHeaderFooterSeparator() != bShow )
+ if ( ( rSh.IsShowHeaderFooterSeparator( Header ) != bShowHeader ) ||
+ ( rSh.IsShowHeaderFooterSeparator( Footer ) != bShowFooter ) )
{
- rSh.SetShowHeaderFooterSeparator( bShow );
+ rSh.SetShowHeaderFooterSeparator( Header, bShowHeader );
+ rSh.SetShowHeaderFooterSeparator( Footer, bShowFooter );
Invalidate();
}
}
-bool SwEditWin::IsInHeaderFooter( const Point &rDocPt ) const
+bool SwEditWin::IsInHeaderFooter( const Point &rDocPt, FrameControlType &rControl ) const
{
SwWrtShell &rSh = rView.GetWrtShell();
const SwPageFrm* pPageFrm = rSh.GetLayout()->GetPageAtPos( rDocPt );
- if ( pPageFrm && pPageFrm->IsOverHeaderFooterArea( rDocPt ) )
+ if ( pPageFrm && pPageFrm->IsOverHeaderFooterArea( rDocPt, rControl ) )
return true;
- if ( rSh.IsShowHeaderFooterSeparator() )
+ if ( rSh.IsShowHeaderFooterSeparator( Header ) || rSh.IsShowHeaderFooterSeparator( Footer ) )
{
SwFrameControlsManager &rMgr = rSh.GetView().GetEditWin().GetFrameControlsManager();
Point aPoint( LogicToPixel( rDocPt ) );
- SwFrameControlPtr pControl = rMgr.GetControl( Header, pPageFrm );
- if ( pControl.get() && pControl->Contains( aPoint ) )
- return true;
+ if ( rSh.IsShowHeaderFooterSeparator( Header ) )
+ {
+ SwFrameControlPtr pControl = rMgr.GetControl( Header, pPageFrm );
+ if ( pControl.get() && pControl->Contains( aPoint ) )
+ {
+ rControl = Header;
+ return true;
+ }
+ }
- pControl = rMgr.GetControl( Footer, pPageFrm );
- if ( pControl.get() && pControl->Contains( aPoint ) )
- return true;
+ if ( rSh.IsShowHeaderFooterSeparator( Footer ) )
+ {
+ SwFrameControlPtr pControl = rMgr.GetControl( Footer, pPageFrm );
+ if ( pControl.get() && pControl->Contains( aPoint ) )
+ {
+ rControl = Footer;
+ return true;
+ }
+ }
}
return false;
diff --git a/sw/source/ui/inc/FrameControlsManager.hxx b/sw/source/ui/inc/FrameControlsManager.hxx
index 8d5c426..06e618c 100644
--- a/sw/source/ui/inc/FrameControlsManager.hxx
+++ b/sw/source/ui/inc/FrameControlsManager.hxx
@@ -28,6 +28,7 @@
#ifndef _FRAMECONTROLSMANAGER_HXX
#define _FRAMECONTROLSMANAGER_HXX
+#include <viewsh.hxx>
#include <FrameControl.hxx>
#include <boost/shared_ptr.hpp>
@@ -39,13 +40,6 @@
class SwPageFrm;
class SwEditWin;
-enum FrameControlType
-{
- PageBreak,
- Header,
- Footer
-};
-
typedef boost::shared_ptr< SwFrameControl > SwFrameControlPtr;
/** A container for the Header/Footer, or PageBreak controls.
@@ -72,7 +66,7 @@ class SwFrameControlsManager
void SetReadonlyControls( bool bReadonly );
// Helper methods
- void SetHeaderFooterControl( const SwPageFrm* pPageFrm, bool bHeader, Point aOffset );
+ void SetHeaderFooterControl( const SwPageFrm* pPageFrm, FrameControlType eType, Point aOffset );
void SetPageBreakControl( const SwPageFrm* pPageFrm );
};
diff --git a/sw/source/ui/inc/edtwin.hxx b/sw/source/ui/inc/edtwin.hxx
index ca87b89..1f03374 100644
--- a/sw/source/ui/inc/edtwin.hxx
+++ b/sw/source/ui/inc/edtwin.hxx
@@ -229,10 +229,10 @@ protected:
SvxAutoCorrect* pACorr, sal_Bool bFromIME = sal_False );
/// Shows or hides the header & footer separators; only if there is a change.
- void ShowHeaderFooterSeparator( bool bShow );
+ void ShowHeaderFooterSeparator( bool bShowHeader, bool bShowFooter );
/// Returns true if in header/footer area, or in the header/footer control.
- bool IsInHeaderFooter( const Point &rDocPt ) const;
+ bool IsInHeaderFooter( const Point &rDocPt, FrameControlType &rControl ) const;
public:
void UpdatePointer(const Point &, sal_uInt16 nButtons = 0);
diff --git a/sw/source/ui/inc/wrtsh.hxx b/sw/source/ui/inc/wrtsh.hxx
index 408da88..90e6296 100644
--- a/sw/source/ui/inc/wrtsh.hxx
+++ b/sw/source/ui/inc/wrtsh.hxx
@@ -491,7 +491,7 @@ typedef sal_Bool (SwWrtShell:: *FNSimpleMove)();
const SwRedline* GotoRedline( sal_uInt16 nArrPos, sal_Bool bSelect = sal_False);
void ChangeHeaderOrFooter(const String& rStyleName, sal_Bool bHeader, sal_Bool bOn, sal_Bool bShowWarning);
- virtual void SetShowHeaderFooterSeparator( bool bShow );
+ virtual void SetShowHeaderFooterSeparator( FrameControlType eControl, bool bShow );
private:
diff --git a/sw/source/ui/wrtsh/wrtsh1.cxx b/sw/source/ui/wrtsh/wrtsh1.cxx
index b67e433..d042c4d 100644
--- a/sw/source/ui/wrtsh/wrtsh1.cxx
+++ b/sw/source/ui/wrtsh/wrtsh1.cxx
@@ -1889,14 +1889,11 @@ void SwWrtShell::ChangeHeaderOrFooter(
EndAllAction();
}
-void SwWrtShell::SetShowHeaderFooterSeparator( bool bShow )
+void SwWrtShell::SetShowHeaderFooterSeparator( FrameControlType eControl, bool bShow )
{
- ViewShell::SetShowHeaderFooterSeparator( bShow );
+ ViewShell::SetShowHeaderFooterSeparator( eControl, bShow );
if ( !bShow )
- {
- GetView().GetEditWin().GetFrameControlsManager().HideControls( Header );
- GetView().GetEditWin().GetFrameControlsManager().HideControls( Footer );
- }
+ GetView().GetEditWin().GetFrameControlsManager().HideControls( eControl );
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit 77ec56689230606281c60b945f3d5edc1e97d7f7
Author: Jan Holesovsky <kendy at suse.cz>
Date: Wed Dec 28 20:01:57 2011 +0100
Header/Footer: Show / hide the control immediately.
- When the mouse pointer enters or leaves the headers / footers, show or hide
the header / footer control immediately. Waiting for that to appear is
annoying; and similarly for disappearing - one usually ended up clicking the
header / footer area to speed that up, and had a feeling of misbehaving.
- Few related re-paint improvements
Signed-off-by: Stefan Knorr (Astron) <heinzlesspam at googlemail.com>
Signed-off-by: Cor Nouws <oolst at nouenoff.nl>
Signed-off-by: Michael Meeks <michael.meeks at suse.com>
diff --git a/sw/inc/crsrsh.hxx b/sw/inc/crsrsh.hxx
index 18f1fde..b21e07d 100644
--- a/sw/inc/crsrsh.hxx
+++ b/sw/inc/crsrsh.hxx
@@ -495,6 +495,7 @@ public:
void SetReadOnlyAvailable( sal_Bool bFlag );
sal_Bool IsOverReadOnlyPos( const Point& rPt ) const;
+ /// Is the rPt point in the header or footer area?
sal_Bool IsOverHeaderFooterPos( const Point& rPt ) const;
// Methods for aFlyMacroLnk.
diff --git a/sw/inc/viewsh.hxx b/sw/inc/viewsh.hxx
index 241fb17..fd4a3d6 100644
--- a/sw/inc/viewsh.hxx
+++ b/sw/inc/viewsh.hxx
@@ -156,8 +156,8 @@ class SW_DLLPUBLIC ViewShell : public Ring
sal_Bool bEnableSmooth :1; // Disable SmoothScroll, e.g. for drag
// of scrollbars.
sal_Bool bEndActionByVirDev:1; // Paints from EndAction always via virtual device
- sal_Bool bShowHeaderFooterSeparator;
- sal_Bool bHeaderFooterEdit;
+ bool bShowHeaderFooterSeparator:1;
+ bool bHeaderFooterEdit:1;
// (e.g. when browsing).
// boolean, indicating that class in in constructor.
@@ -566,9 +566,9 @@ public:
SwPostItMgr* GetPostItMgr();
void ToggleHeaderFooterEdit( );
- sal_Bool IsHeaderFooterEdit( ) const { return bHeaderFooterEdit; }
- sal_Bool IsShowHeaderFooterSeparator( ) { return bShowHeaderFooterSeparator; }
- virtual void SetShowHeaderFooterSeparator( sal_Bool bShow ) { bShowHeaderFooterSeparator = bShow; }
+ bool IsHeaderFooterEdit() const { return bHeaderFooterEdit; }
+ bool IsShowHeaderFooterSeparator() { return bShowHeaderFooterSeparator; }
+ virtual void SetShowHeaderFooterSeparator( bool bShow ) { bShowHeaderFooterSeparator = bShow; }
};
//---- class CurrShell manages global ShellPointer -------------------
diff --git a/sw/source/core/crsr/crsrsh.cxx b/sw/source/core/crsr/crsrsh.cxx
index 5617665..bb55f6b 100644
--- a/sw/source/core/crsr/crsrsh.cxx
+++ b/sw/source/core/crsr/crsrsh.cxx
@@ -674,7 +674,7 @@ int SwCrsrShell::SetCrsr( const Point &rLPt, sal_Bool bOnlyText, bool bBlock )
// Toggle the Header/Footer mode if needed
bool bInHeaderFooter = pFrm && ( pFrm->IsHeaderFrm() || pFrm->IsFooterFrm() );
- if ( bInHeaderFooter ^ (bool) IsHeaderFooterEdit() )
+ if ( bInHeaderFooter != IsHeaderFooterEdit() )
ToggleHeaderFooterEdit();
if( pBlockCrsr && bBlock )
@@ -1315,9 +1315,7 @@ void SwCrsrShell::UpdateCrsr( sal_uInt16 eFlags, sal_Bool bIdleEnd )
return; // wenn nicht, dann kein Update !!
}
- bool bInHeaderFooter = IsInHeaderFooter( );
- if ( ( bInHeaderFooter && !IsHeaderFooterEdit( ) ) ||
- ( !bInHeaderFooter && IsHeaderFooterEdit( ) ) )
+ if ( IsInHeaderFooter() != IsHeaderFooterEdit() )
ToggleHeaderFooterEdit( );
// #i27301#
diff --git a/sw/source/core/view/viewsh.cxx b/sw/source/core/view/viewsh.cxx
index 41f1443..9e3bb9b 100644
--- a/sw/source/core/view/viewsh.cxx
+++ b/sw/source/core/view/viewsh.cxx
@@ -94,11 +94,14 @@ TYPEINIT0(ViewShell);
using namespace ::com::sun::star;
-void ViewShell::ToggleHeaderFooterEdit( ) {
+void ViewShell::ToggleHeaderFooterEdit()
+{
bHeaderFooterEdit = !bHeaderFooterEdit;
- SetShowHeaderFooterSeparator( bHeaderFooterEdit );
+ if ( bHeaderFooterEdit != IsShowHeaderFooterSeparator() )
+ SetShowHeaderFooterSeparator( bHeaderFooterEdit );
+
// Repaint everything to update the colors of the selected area
- Paint( VisArea().SVRect() );
+ GetWin()->Invalidate();
}
//////////////////////////////////////////////////////////////////////////////
diff --git a/sw/source/ui/docvw/FrameControlsManager.cxx b/sw/source/ui/docvw/FrameControlsManager.cxx
index 40e461d..b59610a 100644
--- a/sw/source/ui/docvw/FrameControlsManager.cxx
+++ b/sw/source/ui/docvw/FrameControlsManager.cxx
@@ -161,8 +161,9 @@ void SwFrameControlsManager::SetHeaderFooterControl( const SwPageFrm* pPageFrm,
{
// Check if we already have the control
SwFrameControlPtr pControl;
+ FrameControlType eType = bHeader? Header: Footer;
- vector< SwFrameControlPtr >& aControls = m_aControls[HeaderFooter];
+ vector< SwFrameControlPtr >& aControls = m_aControls[eType];
vector< SwFrameControlPtr >::iterator pIt = aControls.begin();
while ( pIt != aControls.end() && !pControl.get() )
@@ -179,7 +180,7 @@ void SwFrameControlsManager::SetHeaderFooterControl( const SwPageFrm* pPageFrm,
SwFrameControlPtr pNewControl( new SwHeaderFooterWin( m_pEditWin, pPageFrm, bHeader ) );
const SwViewOption* pViewOpt = m_pEditWin->GetView().GetWrtShell().GetViewOptions();
pNewControl->SetReadonly( pViewOpt->IsReadonly() );
- AddControl( HeaderFooter, pNewControl );
+ AddControl( eType, pNewControl );
pControl.swap( pNewControl );
}
diff --git a/sw/source/ui/docvw/HeaderFooterWin.cxx b/sw/source/ui/docvw/HeaderFooterWin.cxx
index 180b975..ff7d50e 100644
--- a/sw/source/ui/docvw/HeaderFooterWin.cxx
+++ b/sw/source/ui/docvw/HeaderFooterWin.cxx
@@ -78,7 +78,7 @@ using namespace drawinglayer::primitive2d;
namespace
{
- basegfx::BColor lcl_GetFillColor( basegfx::BColor aLineColor )
+ static basegfx::BColor lcl_GetFillColor( basegfx::BColor aLineColor )
{
basegfx::BColor aHslLine = basegfx::tools::rgb2hsl( aLineColor );
double nLuminance = aHslLine.getZ() * 2.5;
@@ -90,7 +90,7 @@ namespace
return basegfx::tools::hsl2rgb( aHslLine );
}
- basegfx::BColor lcl_GetLighterGradientColor( basegfx::BColor aDarkColor )
+ static basegfx::BColor lcl_GetLighterGradientColor( basegfx::BColor aDarkColor )
{
basegfx::BColor aHslDark = basegfx::tools::rgb2hsl( aDarkColor );
double nLuminance = aHslDark.getZ() * 255 + 20;
@@ -98,7 +98,7 @@ namespace
return basegfx::tools::hsl2rgb( aHslDark );
}
- B2DPolygon lcl_GetPolygon( const Rectangle& rRect, bool bHeader )
+ static B2DPolygon lcl_GetPolygon( const Rectangle& rRect, bool bHeader )
{
const double nRadius = 3;
const double nKappa((M_SQRT2 - 1.0) * 4.0 / 3.0);
@@ -249,6 +249,19 @@ void SwHeaderFooterWin::ShowAll( bool bShow )
}
}
+bool SwHeaderFooterWin::Contains( const Point &rDocPt ) const
+{
+ Rectangle aRect( GetPosPixel(), GetSizePixel() );
+ if ( aRect.IsInside( rDocPt ) )
+ return true;
+
+ Rectangle aLineRect( m_pLine->GetPosPixel(), m_pLine->GetSizePixel() );
+ if ( aLineRect.IsInside( rDocPt ) )
+ return true;
+
+ return false;
+}
+
void SwHeaderFooterWin::Paint( const Rectangle& )
{
const Rectangle aRect( Rectangle( Point( 0, 0 ), PixelToLogic( GetSizePixel() ) ) );
diff --git a/sw/source/ui/docvw/PageBreakWin.cxx b/sw/source/ui/docvw/PageBreakWin.cxx
index 4799320..3848208 100644
--- a/sw/source/ui/docvw/PageBreakWin.cxx
+++ b/sw/source/ui/docvw/PageBreakWin.cxx
@@ -173,9 +173,8 @@ namespace
if ( rMEvt.IsLeaveWindow() )
{
// don't fade if we just move to the 'button'
- Rectangle aRect( m_pWin->GetPosPixel(), m_pWin->GetSizePixel() );
Point aEventPos( GetPosPixel() + rMEvt.GetPosPixel() );
- if ( !aRect.IsInside( aEventPos ) )
+ if ( !m_pWin->Contains( aEventPos ) )
m_pWin->Fade( false );
}
else if ( !m_pWin->IsVisible() )
@@ -401,9 +400,8 @@ void SwPageBreakWin::MouseMove( const MouseEvent& rMEvt )
if ( rMEvt.IsLeaveWindow() )
{
// don't fade if we just move to the 'line', or the popup menu is open
- Rectangle aRect( m_pLine->GetPosPixel(), m_pLine->GetSizePixel() );
Point aEventPos( GetPosPixel() + rMEvt.GetPosPixel() );
- if ( !aRect.IsInside( aEventPos ) && !PopupMenu::IsInExecute() )
+ if ( !Contains( aEventPos ) && !PopupMenu::IsInExecute() )
Fade( false );
}
else if ( !IsVisible() )
@@ -503,6 +501,19 @@ void SwPageBreakWin::ShowAll( bool bShow )
m_pLine->Show( bShow );
}
+bool SwPageBreakWin::Contains( const Point &rDocPt ) const
+{
+ Rectangle aRect( GetPosPixel(), GetSizePixel() );
+ if ( aRect.IsInside( rDocPt ) )
+ return true;
+
+ Rectangle aLineRect( m_pLine->GetPosPixel(), m_pLine->GetSizePixel() );
+ if ( aLineRect.IsInside( rDocPt ) )
+ return true;
+
+ return false;
+}
+
const SwPageFrm* SwPageBreakWin::GetPageFrame( )
{
return static_cast< const SwPageFrm * >( GetFrame( ) );
diff --git a/sw/source/ui/docvw/edtwin.cxx b/sw/source/ui/docvw/edtwin.cxx
index 51fa548..ad50654 100644
--- a/sw/source/ui/docvw/edtwin.cxx
+++ b/sw/source/ui/docvw/edtwin.cxx
@@ -188,17 +188,17 @@ DBG_NAME(edithdl)
namespace
{
- bool lcl_CheckHeaderFooterClick( SwWrtShell& rSh, const Point aDocPos, sal_uInt16 nClicks )
+ static bool lcl_CheckHeaderFooterClick( SwWrtShell& rSh, const Point &rDocPos, sal_uInt16 nClicks )
{
bool bRet = false;
- sal_Bool bOverHdrFtr = rSh.IsOverHeaderFooterPos( aDocPos );
+ sal_Bool bOverHdrFtr = rSh.IsOverHeaderFooterPos( rDocPos );
if ( ( rSh.IsHeaderFooterEdit( ) && !bOverHdrFtr ) ||
( !rSh.IsHeaderFooterEdit() && bOverHdrFtr ) )
{
bRet = true;
// Check if there we are in a FlyFrm
- Point aPt( aDocPos );
+ Point aPt( rDocPos );
SwPaM aPam( *rSh.GetCurrentShellCursor().GetPoint() );
rSh.GetLayout()->GetCrsrOfst( aPam.GetPoint(), aPt );
@@ -209,7 +209,7 @@ namespace
if ( nClicks == nNbClicks )
{
- rSh.SwCrsrShell::SetCrsr( aDocPos );
+ rSh.SwCrsrShell::SetCrsr( rDocPos );
bRet = false;
}
}
@@ -1289,13 +1289,6 @@ void SwEditWin::KeyInput(const KeyEvent &rKEvt)
{
SwWrtShell &rSh = rView.GetWrtShell();
- // Hide the header/footer separator if not editing a header of footer
- if ( rSh.IsShowHeaderFooterSeparator( ) && !rSh.IsHeaderFooterEdit() )
- {
- rSh.SetShowHeaderFooterSeparator( sal_False );
- aOverHeaderFooterTimer.Stop();
- }
-
if( rKEvt.GetKeyCode().GetCode() == KEY_ESCAPE &&
pApplyTempl && pApplyTempl->pFormatClipboard )
{
@@ -2626,23 +2619,6 @@ void SwEditWin::MouseButtonDown(const MouseEvent& _rMEvt)
{
SwWrtShell &rSh = rView.GetWrtShell();
- // Hide the header/footer separator if not editing a header of footer
- if ( rSh.IsShowHeaderFooterSeparator( ) && !rSh.IsHeaderFooterEdit() )
- {
- const Point aDocPt( PixelToLogic( _rMEvt.GetPosPixel() ) );
- const SwPageFrm* pPageFrm = rSh.GetLayout()->GetPageAtPos( aDocPt );
- if ( pPageFrm )
- {
- bool bOverHeadFoot = pPageFrm->IsOverHeaderFooterArea( aDocPt );
-
- if ( !bOverHeadFoot )
- {
- rSh.SetShowHeaderFooterSeparator( sal_False );
- aOverHeaderFooterTimer.Stop();
- }
- }
- }
-
// We have to check if a context menu is shown and we have an UI
// active inplace client. In that case we have to ignore the mouse
// button down event. Otherwise we would crash (context menu has been
@@ -3438,10 +3414,6 @@ void SwEditWin::MouseMove(const MouseEvent& _rMEvt)
{
MouseEvent rMEvt(_rMEvt);
- // Mouse went out of the edit window: don't show the header/footer marker
- if ( rMEvt.IsLeaveWindow() )
- aOverHeaderFooterTimer.Stop();
-
//ignore key modifiers for format paintbrush
{
sal_Bool bExecFormatPaintbrush = pApplyTempl && pApplyTempl->pFormatClipboard
@@ -3834,23 +3806,16 @@ void SwEditWin::MouseMove(const MouseEvent& _rMEvt)
}
else
rView.GetPostItMgr()->SetShadowState(0,false);
- // no break;
- // Are we over a header or footer area?
- const SwPageFrm* pPageFrm = rSh.GetLayout()->GetPageAtPos( aDocPt );
- if ( pPageFrm )
+ // Are we moving from or to header / footer area?
+ if ( !rSh.IsHeaderFooterEdit() )
{
- bool bOverHeadFoot = pPageFrm->IsOverHeaderFooterArea( aDocPt );
- if ( bOverHeadFoot )
- aOverHeaderFooterTimer.Start();
- else
- {
- aOverHeaderFooterTimer.Stop();
- if ( !rSh.IsHeaderFooterEdit() && rSh.IsShowHeaderFooterSeparator() )
- aOverHeaderFooterTimer.Start();
- }
+ bool bIsInHF = IsInHeaderFooter( aDocPt );
+ if ( rSh.IsShowHeaderFooterSeparator() != bIsInHF )
+ ShowHeaderFooterSeparator( bIsInHF );
}
}
+ // no break;
case KEY_SHIFT:
case KEY_MOD2:
case KEY_MOD1:
@@ -4610,9 +4575,6 @@ SwEditWin::SwEditWin(Window *pParent, SwView &rMyView):
aKeyInputFlushTimer.SetTimeout( 200 );
aKeyInputFlushTimer.SetTimeoutHdl(LINK(this, SwEditWin, KeyInputFlushHandler));
- aOverHeaderFooterTimer.SetTimeout( 1000 );
- aOverHeaderFooterTimer.SetTimeoutHdl(LINK(this, SwEditWin, OverHeaderFooterHandler));
-
// TemplatePointer for colors should be resetted without
// selection after single click
aTemplateTimer.SetTimeout(400);
@@ -5433,18 +5395,6 @@ IMPL_LINK( SwEditWin, KeyInputTimerHandler, Timer *, EMPTYARG )
return 0;
}
-IMPL_LINK( SwEditWin, OverHeaderFooterHandler, Timer *, EMPTYARG )
-{
- if ( !GetView().GetWrtShell().IsHeaderFooterEdit() && IsMouseOver() )
- {
- // Toggle the Header/Footer separator
- sal_Bool bShown = GetView().GetWrtShell().IsShowHeaderFooterSeparator( );
- GetView().GetWrtShell().SetShowHeaderFooterSeparator( !bShown );
- Invalidate();
- }
- return 0;
-}
-
void SwEditWin::_InitStaticData()
{
pQuickHlpData = new QuickHelpData();
@@ -5699,6 +5649,42 @@ void SwEditWin::ShowAutoTextCorrectQuickHelp(
pQuickHlpData->Start( rSh, rWord.Len() );
}
+void SwEditWin::ShowHeaderFooterSeparator( bool bShow )
+{
+ SwWrtShell& rSh = rView.GetWrtShell();
+
+ if ( rSh.IsShowHeaderFooterSeparator() != bShow )
+ {
+ rSh.SetShowHeaderFooterSeparator( bShow );
+ Invalidate();
+ }
+}
+
+bool SwEditWin::IsInHeaderFooter( const Point &rDocPt ) const
+{
+ SwWrtShell &rSh = rView.GetWrtShell();
+ const SwPageFrm* pPageFrm = rSh.GetLayout()->GetPageAtPos( rDocPt );
+
+ if ( pPageFrm && pPageFrm->IsOverHeaderFooterArea( rDocPt ) )
+ return true;
+
+ if ( rSh.IsShowHeaderFooterSeparator() )
+ {
+ SwFrameControlsManager &rMgr = rSh.GetView().GetEditWin().GetFrameControlsManager();
+ Point aPoint( LogicToPixel( rDocPt ) );
+
+ SwFrameControlPtr pControl = rMgr.GetControl( Header, pPageFrm );
+ if ( pControl.get() && pControl->Contains( aPoint ) )
+ return true;
+
+ pControl = rMgr.GetControl( Footer, pPageFrm );
+ if ( pControl.get() && pControl->Contains( aPoint ) )
+ return true;
+ }
+
+ return false;
+}
+
void SwEditWin::SetUseInputLanguage( sal_Bool bNew )
{
if ( bNew || bUseInputLanguage )
diff --git a/sw/source/ui/inc/FrameControl.hxx b/sw/source/ui/inc/FrameControl.hxx
index 4e52918..cf887a9 100644
--- a/sw/source/ui/inc/FrameControl.hxx
+++ b/sw/source/ui/inc/FrameControl.hxx
@@ -30,6 +30,7 @@
class SwEditWin;
class SwFrm;
+struct Point;
/** Class representing a control linked to a SwFrm.
*/
@@ -61,6 +62,9 @@ public:
virtual void SetReadonly( bool bReadonly ) = 0;
virtual void ShowAll( bool bShow ) = 0;
+
+ /// Returns true if the point is inside the control.
+ virtual bool Contains( const Point &rDocPt ) const = 0;
};
#endif
diff --git a/sw/source/ui/inc/FrameControlsManager.hxx b/sw/source/ui/inc/FrameControlsManager.hxx
index c9e0aed..8d5c426 100644
--- a/sw/source/ui/inc/FrameControlsManager.hxx
+++ b/sw/source/ui/inc/FrameControlsManager.hxx
@@ -42,11 +42,14 @@ class SwEditWin;
enum FrameControlType
{
PageBreak,
- HeaderFooter
+ Header,
+ Footer
};
typedef boost::shared_ptr< SwFrameControl > SwFrameControlPtr;
+/** A container for the Header/Footer, or PageBreak controls.
+*/
class SwFrameControlsManager
{
private:
diff --git a/sw/source/ui/inc/HeaderFooterWin.hxx b/sw/source/ui/inc/HeaderFooterWin.hxx
index 247678e..c895b53 100644
--- a/sw/source/ui/inc/HeaderFooterWin.hxx
+++ b/sw/source/ui/inc/HeaderFooterWin.hxx
@@ -58,7 +58,8 @@ public:
virtual void MouseButtonDown( const MouseEvent& rMEvt );
virtual void Select( );
- void ShowAll( bool bShow );
+ virtual void ShowAll( bool bShow );
+ virtual bool Contains( const Point &rDocPt ) const;
bool IsHeader() { return m_bIsHeader; };
bool IsEmptyHeaderFooter( );
diff --git a/sw/source/ui/inc/PageBreakWin.hxx b/sw/source/ui/inc/PageBreakWin.hxx
index fa2631c..e1967f3 100644
--- a/sw/source/ui/inc/PageBreakWin.hxx
+++ b/sw/source/ui/inc/PageBreakWin.hxx
@@ -59,7 +59,8 @@ public:
void UpdatePosition( );
- void ShowAll( bool bShow );
+ virtual void ShowAll( bool bShow );
+ virtual bool Contains( const Point &rDocPt ) const;
const SwPageFrm* GetPageFrame( );
diff --git a/sw/source/ui/inc/edtwin.hxx b/sw/source/ui/inc/edtwin.hxx
index 8cdcb1b..ca87b89 100644
--- a/sw/source/ui/inc/edtwin.hxx
+++ b/sw/source/ui/inc/edtwin.hxx
@@ -100,11 +100,6 @@ friend void PageNumNotify( ViewShell* pVwSh,
Timer aKeyInputTimer;
// timer for ANY-KeyInut question without a following KeyInputEvent
Timer aKeyInputFlushTimer;
- /*
- * timer for showing the Header/Footer separators when the mouse
- * stays over a header or footer area for several seconds.
- */
- Timer aOverHeaderFooterTimer;
String aInBuffer;
LanguageType eBufferLanguage;
@@ -199,9 +194,6 @@ friend void PageNumNotify( ViewShell* pVwSh,
// timer for overlapping KeyInputs (e.g. for tables)
DECL_LINK( KeyInputTimerHandler, Timer * );
- // timer for hovering header/footer areas
- DECL_LINK( OverHeaderFooterHandler, Timer * );
-
// timer for ApplyTemplates via mouse (in disguise Drag&Drop)
DECL_LINK( TemplateTimerHdl, Timer* );
@@ -235,6 +227,12 @@ protected:
void ShowAutoTextCorrectQuickHelp( const String& rWord, SvxAutoCorrCfg* pACfg,
SvxAutoCorrect* pACorr, sal_Bool bFromIME = sal_False );
+
+ /// Shows or hides the header & footer separators; only if there is a change.
+ void ShowHeaderFooterSeparator( bool bShow );
+
+ /// Returns true if in header/footer area, or in the header/footer control.
+ bool IsInHeaderFooter( const Point &rDocPt ) const;
public:
void UpdatePointer(const Point &, sal_uInt16 nButtons = 0);
diff --git a/sw/source/ui/inc/wrtsh.hxx b/sw/source/ui/inc/wrtsh.hxx
index 879ccbe..408da88 100644
--- a/sw/source/ui/inc/wrtsh.hxx
+++ b/sw/source/ui/inc/wrtsh.hxx
@@ -491,7 +491,7 @@ typedef sal_Bool (SwWrtShell:: *FNSimpleMove)();
const SwRedline* GotoRedline( sal_uInt16 nArrPos, sal_Bool bSelect = sal_False);
void ChangeHeaderOrFooter(const String& rStyleName, sal_Bool bHeader, sal_Bool bOn, sal_Bool bShowWarning);
- virtual void SetShowHeaderFooterSeparator( sal_Bool bShow );
+ virtual void SetShowHeaderFooterSeparator( bool bShow );
private:
diff --git a/sw/source/ui/wrtsh/wrtsh1.cxx b/sw/source/ui/wrtsh/wrtsh1.cxx
index 9dcda67..b67e433 100644
--- a/sw/source/ui/wrtsh/wrtsh1.cxx
+++ b/sw/source/ui/wrtsh/wrtsh1.cxx
@@ -1889,11 +1889,14 @@ void SwWrtShell::ChangeHeaderOrFooter(
EndAllAction();
}
-void SwWrtShell::SetShowHeaderFooterSeparator( sal_Bool bShow )
+void SwWrtShell::SetShowHeaderFooterSeparator( bool bShow )
{
ViewShell::SetShowHeaderFooterSeparator( bShow );
if ( !bShow )
- GetView().GetEditWin().GetFrameControlsManager().HideControls( HeaderFooter );
+ {
+ GetView().GetEditWin().GetFrameControlsManager().HideControls( Header );
+ GetView().GetEditWin().GetFrameControlsManager().HideControls( Footer );
+ }
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
More information about the Libreoffice-commits
mailing list