summaryrefslogtreecommitdiff
path: root/sw
diff options
context:
space:
mode:
authorC├ędric Bosdonnat <cedric.bosdonnat@free.fr>2012-08-23 09:45:10 +0200
committerPetr Mladek <pmladek@suse.cz>2012-09-06 12:11:15 +0200
commit1dcb0eeb018f9ed54bce6dbbe262bf80fbd2ae93 (patch)
tree66265b1604242f8809d56a5c197a4c6720439896 /sw
parentd5e8a98795b5961825d714d420965abc8dd6ad44 (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 Signed-off-by: Petr Mladek <pmladek@suse.cz> Signed-off-by: Michael Stahl <mstahl@redhat.com> Signed-off-by: Rainer Bielefeld <LibreOffice@bielefeldundbuss.de> Signed-off-by: Roman Eisele <bugs@eikota.de>
Diffstat (limited to 'sw')
-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 f35f6031eeeb..cd09e65110ce 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();
@@ -516,14 +513,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 fffe6c3a7cba..a6b09dd13395 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>
@@ -1315,6 +1316,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
@@ -1322,6 +1330,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
@@ -2667,9 +2679,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 );
@@ -3819,17 +3879,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:
@@ -4570,7 +4619,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();
@@ -4748,8 +4799,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;
@@ -4765,14 +4836,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 d6c250df6f47..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 ac78de99a8f2..11a64462472e 100644
--- a/sw/source/ui/inc/edtwin.hxx
+++ b/sw/source/ui/inc/edtwin.hxx
@@ -150,11 +150,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 efd9930b78f0..035094035501 100644
--- a/sw/source/ui/wrtsh/wrtsh1.cxx
+++ b/sw/source/ui/wrtsh/wrtsh1.cxx
@@ -1839,9 +1839,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