summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCédric Bosdonnat <cedric.bosdonnat@free.fr>2012-08-23 09:45:10 +0200
committerCédric Bosdonnat <cedric.bosdonnat@free.fr>2012-08-23 09:47:18 +0200
commit3d7927152169474c3c73ac36d5d79008fe6bab3e (patch)
tree57858ca43d6a69e5935c42ce769814adce31e7b3
parentb1932b7a182d99a52b8c2fb71d2d48a61ce47423 (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.cxx11
-rw-r--r--sw/source/ui/docvw/edtwin.cxx105
-rw-r--r--sw/source/ui/inc/HeaderFooterWin.hxx1
-rw-r--r--sw/source/ui/inc/edtwin.hxx3
-rw-r--r--sw/source/ui/wrtsh/wrtsh1.cxx6
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