diff options
author | Cédric Bosdonnat <cedric.bosdonnat@free.fr> | 2012-08-23 09:45:10 +0200 |
---|---|---|
committer | Cédric Bosdonnat <cedric.bosdonnat@free.fr> | 2012-08-23 09:47:18 +0200 |
commit | 3d7927152169474c3c73ac36d5d79008fe6bab3e (patch) | |
tree | 57858ca43d6a69e5935c42ce769814adce31e7b3 | |
parent | b1932b7a182d99a52b8c2fb71d2d48a61ce47423 (diff) |
fdo#46141: Don't use a timer to show header/footer separators
Clicking on the header/footer area will show the separator. Clicking on
an empty header/footer area will add a temporary one that we try hard to
remove when clicking outside
Change-Id: I8f29f8fd80b2d808257636bf94ec4e2e46f6028e
-rw-r--r-- | sw/source/ui/docvw/HeaderFooterWin.cxx | 11 | ||||
-rw-r--r-- | sw/source/ui/docvw/edtwin.cxx | 105 | ||||
-rw-r--r-- | sw/source/ui/inc/HeaderFooterWin.hxx | 1 | ||||
-rw-r--r-- | sw/source/ui/inc/edtwin.hxx | 3 | ||||
-rw-r--r-- | sw/source/ui/wrtsh/wrtsh1.cxx | 6 |
5 files changed, 91 insertions, 35 deletions
diff --git a/sw/source/ui/docvw/HeaderFooterWin.cxx b/sw/source/ui/docvw/HeaderFooterWin.cxx index 23b2892bcef0..9e4bc273935b 100644 --- a/sw/source/ui/docvw/HeaderFooterWin.cxx +++ b/sw/source/ui/docvw/HeaderFooterWin.cxx @@ -152,7 +152,6 @@ SwHeaderFooterWin::SwHeaderFooterWin( SwEditWin* pEditWin, const SwPageFrm* pPag m_pLine( NULL ), m_bIsAppearing( false ), m_nFadeRate( 100 ), - m_nDelayAppearing( 0 ), m_aFadeTimer( ) { // Get the font and configure it @@ -243,8 +242,6 @@ void SwHeaderFooterWin::ShowAll( bool bShow ) if ( !PopupMenu::IsInExecute() ) { m_bIsAppearing = bShow; - if ( bShow ) - m_nDelayAppearing = 0; if ( m_aFadeTimer.IsActive( ) ) m_aFadeTimer.Stop(); @@ -515,14 +512,6 @@ void SwHeaderFooterWin::Select( ) IMPL_LINK_NOARG(SwHeaderFooterWin, FadeHandler) { - const int TICKS_BEFORE_WE_APPEAR = 10; - if ( m_bIsAppearing && m_nDelayAppearing < TICKS_BEFORE_WE_APPEAR ) - { - ++m_nDelayAppearing; - m_aFadeTimer.Start(); - return 0; - } - if ( m_bIsAppearing && m_nFadeRate > 0 ) m_nFadeRate -= 25; else if ( !m_bIsAppearing && m_nFadeRate < 100 ) diff --git a/sw/source/ui/docvw/edtwin.cxx b/sw/source/ui/docvw/edtwin.cxx index e3b3933d872d..bf24d4853aa5 100644 --- a/sw/source/ui/docvw/edtwin.cxx +++ b/sw/source/ui/docvw/edtwin.cxx @@ -93,6 +93,7 @@ #include <fmtornt.hxx> #include <fmtfsize.hxx> #include <fmtclds.hxx> +#include <fmthdft.hxx> #include <frmfmt.hxx> #include <modcfg.hxx> #include <fmtcol.hxx> @@ -1323,6 +1324,13 @@ void SwEditWin::KeyInput(const KeyEvent &rKEvt) rSh.IsHeaderFooterEdit( ) ) { bool bHeader = FRMTYPE_HEADER & rSh.GetFrmType(0,sal_False); + + // Remove the temporary header/footer + if ( !m_sTmpHFPageStyle.isEmpty() ) + { + rSh.ChangeHeaderOrFooter( m_sTmpHFPageStyle, m_bTmpHFIsHeader, false, false ); + } + if ( bHeader ) rSh.SttPg(); else @@ -1330,6 +1338,10 @@ void SwEditWin::KeyInput(const KeyEvent &rKEvt) rSh.ToggleHeaderFooterEdit(); } + // If we are inputing a key in a temporary header/footer, then make it definitive + if ( !m_sTmpHFPageStyle.isEmpty( ) ) + m_sTmpHFPageStyle = rtl::OUString( ); + SfxObjectShell *pObjSh = (SfxObjectShell*)rView.GetViewFrame()->GetObjectShell(); if ( bLockInput || (pObjSh && pObjSh->GetProgress()) ) // When the progress bar is active or a progress is @@ -2675,9 +2687,57 @@ void SwEditWin::MouseButtonDown(const MouseEvent& _rMEvt) const Point aDocPos( PixelToLogic( rMEvt.GetPosPixel() ) ); + FrameControlType eControl; + bool bIsInHF = IsInHeaderFooter( aDocPos, eControl ); + if ( !m_sTmpHFPageStyle.isEmpty( ) ) + { + // Are we clicking outside the temporary header/footer? if so remove it + rtl::OUString sStyleName = rSh.GetCurPageStyle( false ); + bool bMatchesTmpHF = sStyleName == m_sTmpHFPageStyle && + ( ( m_bTmpHFIsHeader && eControl == Header ) || + ( !m_bTmpHFIsHeader && eControl == Footer ) ); + + if ( ( !bIsInHF && rSh.IsHeaderFooterEdit( ) ) || !bMatchesTmpHF ) + rSh.ChangeHeaderOrFooter( m_sTmpHFPageStyle, m_bTmpHFIsHeader, false, false ); + + m_sTmpHFPageStyle = rtl::OUString( ); + } + + // Are we clicking on a blank header/footer area? + if ( bIsInHF && !rSh.IsHeaderFooterEdit( ) ) + { + // Create empty header/footer under the cursor and switch to it + const SwPageFrm* pPageFrm = rSh.GetLayout()->GetPageAtPos( aDocPos ); + + // Is it active? + bool bActive = true; + const SwPageDesc* pDesc = pPageFrm->GetPageDesc(); + + const SwFrmFmt* pFmt = pDesc->GetLeftFmt(); + if ( pPageFrm->OnRightPage() ) + pFmt = pDesc->GetRightFmt(); + + if ( pFmt ) + { + if ( eControl == Header ) + bActive = pFmt->GetHeader().IsActive(); + else + bActive = pFmt->GetFooter().IsActive(); + } + + if ( !bActive ) + { + const String& rStyleName = pPageFrm->GetPageDesc()->GetName(); + rSh.ChangeHeaderOrFooter( rStyleName, eControl == Header, true, false ); + m_sTmpHFPageStyle = rStyleName; + m_bTmpHFIsHeader = eControl == Header; + } + } + if ( lcl_CheckHeaderFooterClick( rSh, aDocPos, rMEvt.GetClicks() ) ) return; + if ( IsChainMode() ) { SetChainMode( sal_False ); @@ -3825,17 +3885,6 @@ void SwEditWin::MouseMove(const MouseEvent& _rMEvt) } else rView.GetPostItMgr()->SetShadowState(0,false); - - // Are we moving from or to header / footer area? - if ( !rSh.IsHeaderFooterEdit() ) - { - FrameControlType eControl; - bool bIsInHF = IsInHeaderFooter( aDocPt, eControl ); - if ( !bIsInHF ) - ShowHeaderFooterSeparator( false, false ); - else - ShowHeaderFooterSeparator( eControl == Header, eControl == Footer ); - } } // no break; case KEY_SHIFT: @@ -4579,7 +4628,9 @@ SwEditWin::SwEditWin(Window *pParent, SwView &rMyView): bObjectSelect( sal_False ), nKS_NUMDOWN_Count(0), nKS_NUMINDENTINC_Count(0), - m_aFrameControlsManager( this ) + m_aFrameControlsManager( this ), + m_sTmpHFPageStyle( ), + m_bTmpHFIsHeader( false ) { SetHelpId(HID_EDIT_WIN); EnableChildTransparentMode(); @@ -4757,8 +4808,28 @@ void SwEditWin::Command( const CommandEvent& rCEvt ) if (rView.GetPostItMgr()->IsHit(rCEvt.GetMousePosPixel())) return; - if (rCEvt.IsMouseEvent() && lcl_CheckHeaderFooterClick( rSh, - PixelToLogic( rCEvt.GetMousePosPixel() ), 1 ) ) + Point aDocPos( PixelToLogic( rCEvt.GetMousePosPixel() ) ); + if ( !rCEvt.IsMouseEvent() ) + aDocPos = rSh.GetCharRect().Center(); + + // Triggering a command remove temporary header/footer status + FrameControlType eControl; + bool bIsInHF = IsInHeaderFooter( aDocPos, eControl ); + if ( !m_sTmpHFPageStyle.isEmpty( ) ) + { + const rtl::OUString sStyleName = rSh.GetCurPageStyle( false ); + bool bMatchesTmpHF = sStyleName == m_sTmpHFPageStyle && + ( ( m_bTmpHFIsHeader && eControl == Header ) || + ( !m_bTmpHFIsHeader && eControl == Footer ) ); + + // Are we clicking outside the temporary header/footer? if so remove it + if ( ( !bIsInHF && rSh.IsHeaderFooterEdit( ) ) || !bMatchesTmpHF ) + rSh.ChangeHeaderOrFooter( m_sTmpHFPageStyle, m_bTmpHFIsHeader, false, false ); + + m_sTmpHFPageStyle = rtl::OUString( ); + } + + if (rCEvt.IsMouseEvent() && lcl_CheckHeaderFooterClick( rSh, aDocPos, 1 ) ) return; @@ -4774,14 +4845,10 @@ void SwEditWin::Command( const CommandEvent& rCEvt ) bNoInterrupt = sal_False; bMBPressed = sal_False; } - Point aDocPos( PixelToLogic( rCEvt.GetMousePosPixel() ) ); - if ( !rCEvt.IsMouseEvent() ) - aDocPos = rSh.GetCharRect().Center(); - else + if ( rCEvt.IsMouseEvent() ) { SelectMenuPosition(rSh, rCEvt.GetMousePosPixel()); rView.StopShellTimer(); - } const Point aPixPos = LogicToPixel( aDocPos ); diff --git a/sw/source/ui/inc/HeaderFooterWin.hxx b/sw/source/ui/inc/HeaderFooterWin.hxx index 966074ebe2f3..04a0a814cba8 100644 --- a/sw/source/ui/inc/HeaderFooterWin.hxx +++ b/sw/source/ui/inc/HeaderFooterWin.hxx @@ -45,7 +45,6 @@ class SwHeaderFooterWin : public MenuButton, public SwFrameControl Window* m_pLine; bool m_bIsAppearing; int m_nFadeRate; - int m_nDelayAppearing; ///< Before we show the control, let it transparent for a few timer ticks to avoid appearing with every mouse over. Timer m_aFadeTimer; public: diff --git a/sw/source/ui/inc/edtwin.hxx b/sw/source/ui/inc/edtwin.hxx index 83f8a9e01b12..04f9c2e2b35f 100644 --- a/sw/source/ui/inc/edtwin.hxx +++ b/sw/source/ui/inc/edtwin.hxx @@ -149,11 +149,12 @@ friend void PageNumNotify( ViewShell* pVwSh, bUseInputLanguage: 1, bObjectSelect : 1; - sal_uInt16 nKS_NUMDOWN_Count; // #i23725# sal_uInt16 nKS_NUMINDENTINC_Count; SwFrameControlsManager m_aFrameControlsManager; + rtl::OUString m_sTmpHFPageStyle; + bool m_bTmpHFIsHeader; void LeaveArea(const Point &); void JustifyAreaTimer(); diff --git a/sw/source/ui/wrtsh/wrtsh1.cxx b/sw/source/ui/wrtsh/wrtsh1.cxx index ff843d6c83f7..723cb4c062ce 100644 --- a/sw/source/ui/wrtsh/wrtsh1.cxx +++ b/sw/source/ui/wrtsh/wrtsh1.cxx @@ -1832,9 +1832,9 @@ void SwWrtShell::ChangeHeaderOrFooter( String sTmp(aDesc.GetName()); if( !rStyleName.Len() || rStyleName == sTmp ) { - if( (bShowWarning && !bOn && GetActiveView() && GetActiveView() == &GetView() && - (bHeader && aDesc.GetMaster().GetHeader().IsActive())) || - (!bHeader && aDesc.GetMaster().GetFooter().IsActive()) ) + if( bShowWarning && !bOn && GetActiveView() && GetActiveView() == &GetView() && + ( (bHeader && aDesc.GetMaster().GetHeader().IsActive()) || + (!bHeader && aDesc.GetMaster().GetFooter().IsActive()) ) ) { bShowWarning = sal_False; //Actions have to be closed while the dialog is showing |