diff options
author | Cédric Bosdonnat <cedric.bosdonnat.ooo@free.fr> | 2011-09-12 16:31:02 +0200 |
---|---|---|
committer | Cédric Bosdonnat <cedric.bosdonnat.ooo@free.fr> | 2011-09-12 18:09:36 +0200 |
commit | 3d294102638b15dc04ee2bb0100e6f1921d69e1d (patch) | |
tree | 2381015de1f8ab8a9fe9d5d9f5a9780dae12a4b5 /sw/source | |
parent | 8cc839dc6ac3239bc4a3738cfb6078a8bf92ea72 (diff) |
Header/Footer: added a timer to show the separator
When leaving the mouse over a header or footer area for 2 seconds, the
separator is shown. This feature enables adding headers and footers
easily without knowing anything about page styles.
The separators are hidden back after 2 seconds outside the header or
footer area.
Diffstat (limited to 'sw/source')
-rw-r--r-- | sw/source/core/inc/pagefrm.hxx | 2 | ||||
-rw-r--r-- | sw/source/core/layout/pagechg.cxx | 27 | ||||
-rwxr-xr-x | sw/source/core/layout/paintfrm.cxx | 4 | ||||
-rw-r--r-- | sw/source/core/view/viewsh.cxx | 1 | ||||
-rw-r--r-- | sw/source/core/view/vnew.cxx | 1 | ||||
-rw-r--r-- | sw/source/ui/docvw/edtwin.cxx | 40 | ||||
-rw-r--r-- | sw/source/ui/inc/edtwin.hxx | 8 |
7 files changed, 78 insertions, 5 deletions
diff --git a/sw/source/core/inc/pagefrm.hxx b/sw/source/core/inc/pagefrm.hxx index d45d4beeb518..e2e7ef5a6e45 100644 --- a/sw/source/core/inc/pagefrm.hxx +++ b/sw/source/core/inc/pagefrm.hxx @@ -374,6 +374,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; + // 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 263facb9c8c2..e028d277a2b6 100644 --- a/sw/source/core/layout/pagechg.cxx +++ b/sw/source/core/layout/pagechg.cxx @@ -2451,4 +2451,31 @@ const SwPageFrm& SwPageFrm::GetFormatPage() const return *pRet; } +bool SwPageFrm::IsOverHeaderFooterArea( const Point& rPt ) const +{ + long nUpperLimit = 0; + long nLowerLimit = 0; + const SwFrm* pFrm = Lower(); + while ( pFrm ) + { + if ( pFrm->IsBodyFrm() ) + { + nUpperLimit = pFrm->Frm().Top(); + nLowerLimit = pFrm->Frm().Bottom(); + } + else if ( pFrm->IsFtnContFrm() ) + nLowerLimit = pFrm->Frm().Bottom(); + + pFrm = pFrm->GetNext(); + } + + SwRect aHeaderArea( Frm().TopLeft(), + Size( Frm().Width(), nUpperLimit - Frm().Top() ) ); + + SwRect aFooterArea( Point( Frm().Left(), nLowerLimit ), + Size( Frm().Width(), Frm().Bottom() - nLowerLimit ) ); + + return aHeaderArea.IsInside( rPt ) || aFooterArea.IsInside( rPt ); +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/core/layout/paintfrm.cxx b/sw/source/core/layout/paintfrm.cxx index e868cba5ddf9..f384bcca827b 100755 --- a/sw/source/core/layout/paintfrm.cxx +++ b/sw/source/core/layout/paintfrm.cxx @@ -3333,7 +3333,7 @@ void SwPageFrm::PaintBreak( ) const // header/footer marker // * Non-printing characters are shown, as this is more consistent // with other formatting marks - if ( !pGlobalShell->IsHeaderFooterEdit() && + if ( !pGlobalShell->IsShowHeaderFooterSeparator() && pGlobalShell->GetViewOptions()->IsShowHiddenChar( ) ) { SwRect aRect( pCnt->Prt() ); @@ -3404,7 +3404,7 @@ void SwPageFrm::PaintDecorators( ) const if ( !pGlobalShell->GetViewOptions()->IsPrinting() && !pGlobalShell->GetViewOptions()->IsPDFExport() && !pGlobalShell->IsPreView() && - pGlobalShell->IsHeaderFooterEdit( ) ) + pGlobalShell->IsShowHeaderFooterSeparator( ) ) { drawinglayer::processor2d::BaseProcessor2D* pProcessor = CreateProcessor2D(); diff --git a/sw/source/core/view/viewsh.cxx b/sw/source/core/view/viewsh.cxx index 912a327e6d06..c831abbfeaee 100644 --- a/sw/source/core/view/viewsh.cxx +++ b/sw/source/core/view/viewsh.cxx @@ -98,6 +98,7 @@ using namespace ::com::sun::star; void ViewShell::ToggleHeaderFooterEdit( ) { bHeaderFooterEdit = !bHeaderFooterEdit; + SetShowHeaderFooterSeparator( bHeaderFooterEdit ); // Repaint everything to update the colors of the selected area Paint( VisArea().SVRect() ); } diff --git a/sw/source/core/view/vnew.cxx b/sw/source/core/view/vnew.cxx index 3bc3012ca4b5..5b4708e7125c 100644 --- a/sw/source/core/view/vnew.cxx +++ b/sw/source/core/view/vnew.cxx @@ -153,6 +153,7 @@ ViewShell::ViewShell( SwDoc& rDocument, Window *pWindow, mpTmpRef( 0 ), pOpt( 0 ), pAccOptions( new SwAccessibilityOptions ), + bShowHeaderFooterSeparator( sal_False ), bHeaderFooterEdit( sal_False ), mpTargetPaintWindow(0), mpBufferedOut(0), diff --git a/sw/source/ui/docvw/edtwin.cxx b/sw/source/ui/docvw/edtwin.cxx index 034b0631ec5b..e7aa37db3dab 100644 --- a/sw/source/ui/docvw/edtwin.cxx +++ b/sw/source/ui/docvw/edtwin.cxx @@ -3410,6 +3410,10 @@ 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 @@ -3775,10 +3779,10 @@ void SwEditWin::MouseMove(const MouseEvent& _rMEvt) case 0: { if ( pApplyTempl ) - { + { UpdatePointer(aDocPt, 0); // maybe a frame has to be marked here - break; - } + break; + } // change ui if mouse is over SwPostItField // TODO: do the same thing for redlines SW_REDLINE SwRect aFldRect; @@ -3796,6 +3800,21 @@ 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 ) + { + bool bOverHeadFoot = pPageFrm->IsOverHeaderFooterArea( aDocPt ); + if ( bOverHeadFoot ) + aOverHeaderFooterTimer.Start(); + else + { + aOverHeaderFooterTimer.Stop(); + if ( !rSh.IsHeaderFooterEdit() && rSh.IsShowHeaderFooterSeparator() ) + aOverHeaderFooterTimer.Start(); + } + } } case KEY_SHIFT: case KEY_MOD2: @@ -4555,6 +4574,9 @@ SwEditWin::SwEditWin(Window *pParent, SwView &rMyView): aKeyInputFlushTimer.SetTimeout( 200 ); aKeyInputFlushTimer.SetTimeoutHdl(LINK(this, SwEditWin, KeyInputFlushHandler)); + aOverHeaderFooterTimer.SetTimeout( 2000 ); + aOverHeaderFooterTimer.SetTimeoutHdl(LINK(this, SwEditWin, OverHeaderFooterHandler)); + // TemplatePointer for colors should be resetted without // selection after single click aTemplateTimer.SetTimeout(400); @@ -5376,6 +5398,18 @@ IMPL_LINK( SwEditWin, KeyInputTimerHandler, Timer *, EMPTYARG ) return 0; } +IMPL_LINK( SwEditWin, OverHeaderFooterHandler, Timer *, EMPTYARG ) +{ + if ( !GetView().GetWrtShell().IsHeaderFooterEdit() ) + { + // Toggle the Header/Footer separator + sal_Bool bShown = GetView().GetWrtShell().IsShowHeaderFooterSeparator( ); + GetView().GetWrtShell().SetShowHeaderFooterSeparator( !bShown ); + Invalidate(); + } + return 0; +} + void SwEditWin::_InitStaticData() { pQuickHlpData = new QuickHelpData(); diff --git a/sw/source/ui/inc/edtwin.hxx b/sw/source/ui/inc/edtwin.hxx index 6468f5122a79..f85b2f11b2bc 100644 --- a/sw/source/ui/inc/edtwin.hxx +++ b/sw/source/ui/inc/edtwin.hxx @@ -102,6 +102,11 @@ 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; @@ -196,6 +201,9 @@ 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* ); |