summaryrefslogtreecommitdiff
path: root/sw
diff options
context:
space:
mode:
authorC├ędric Bosdonnat <cedric.bosdonnat@free.fr>2012-08-27 18:12:00 +0200
committerPetr Mladek <pmladek@suse.cz>2012-09-06 12:14:59 +0200
commit3632b3a01fa8ad5f111658ff5cea555db58637fd (patch)
tree148b722f3836d0fea5397da7ec6246006ea874bc /sw
parent1dcb0eeb018f9ed54bce6dbbe262bf80fbd2ae93 (diff)
Headers/Footers: don't create temporary parts of document (perf problems)
Clicking on an empty header/footer only displays the separator as creating empty header/footer could cause important layout recomputing on long documents. Change-Id: I800c5dd27744772833dee0da4269e7591bd0a10b 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/core/crsr/crsrsh.cxx11
-rw-r--r--sw/source/ui/docvw/edtwin.cxx75
-rw-r--r--sw/source/ui/inc/edtwin.hxx2
3 files changed, 33 insertions, 55 deletions
diff --git a/sw/source/core/crsr/crsrsh.cxx b/sw/source/core/crsr/crsrsh.cxx
index dfd80d97e6db..ca62c557e9f5 100644
--- a/sw/source/core/crsr/crsrsh.cxx
+++ b/sw/source/core/crsr/crsrsh.cxx
@@ -690,6 +690,17 @@ int SwCrsrShell::SetCrsr( const Point &rLPt, sal_Bool bOnlyText, bool bBlock )
bool bInHeaderFooter = pFrm && ( pFrm->IsHeaderFrm() || pFrm->IsFooterFrm() );
if ( bInHeaderFooter != IsHeaderFooterEdit() )
ToggleHeaderFooterEdit();
+ else
+ {
+ // Make sure we have the proper Header/Footer separators shown
+ // as these may be changed if clicking on an empty Header/Footer
+ SetShowHeaderFooterSeparator( Header, pFrm != NULL && pFrm->IsHeaderFrm( ) );
+ SetShowHeaderFooterSeparator( Footer, pFrm != NULL && pFrm->IsFooterFrm( ) );
+
+ // Repaint everything
+ GetWin()->Invalidate();
+ }
+
if( pBlockCrsr && bBlock )
{
diff --git a/sw/source/ui/docvw/edtwin.cxx b/sw/source/ui/docvw/edtwin.cxx
index a6b09dd13395..dd58e446730d 100644
--- a/sw/source/ui/docvw/edtwin.cxx
+++ b/sw/source/ui/docvw/edtwin.cxx
@@ -1316,13 +1316,6 @@ 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,10 +1323,6 @@ 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
@@ -2679,26 +2668,10 @@ 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( ) )
+ FrameControlType eControl;
+ if ( IsInHeaderFooter( aDocPos, eControl ) )
{
- // Create empty header/footer under the cursor and switch to it
const SwPageFrm* pPageFrm = rSh.GetLayout()->GetPageAtPos( aDocPos );
// Is it active?
@@ -2719,10 +2692,25 @@ void SwEditWin::MouseButtonDown(const MouseEvent& _rMEvt)
if ( !bActive )
{
- const String& rStyleName = pPageFrm->GetPageDesc()->GetName();
- rSh.ChangeHeaderOrFooter( rStyleName, eControl == Header, true, false );
- m_sTmpHFPageStyle = rStyleName;
- m_bTmpHFIsHeader = eControl == Header;
+ SwPaM aPam( *rSh.GetCurrentShellCursor().GetPoint() );
+ bool bWasInHeader = aPam.GetPoint( )->nNode.GetNode( ).FindHeaderStartNode( ) != NULL;
+ bool bWasInFooter = aPam.GetPoint( )->nNode.GetNode( ).FindFooterStartNode( ) != NULL;
+
+ // Is the cursor in a part like similar to the one we clicked on? For example,
+ // if the cursor is in a header and we click on an empty header... don't change anything to
+ // keep consistent behaviour due to header edit mode (and the same for the footer as well).
+ //
+ // Otherwise, we hide the header/footer control if a separator is shown, and vice versa.
+ if ( !( bWasInHeader && eControl == Header ) &&
+ !( bWasInFooter && eControl == Footer ) )
+ {
+ rSh.SetShowHeaderFooterSeparator( eControl, !rSh.IsShowHeaderFooterSeparator( eControl ) );
+ }
+
+ // Repaint everything
+ Invalidate();
+
+ return;
}
}
@@ -4619,9 +4607,7 @@ SwEditWin::SwEditWin(Window *pParent, SwView &rMyView):
bObjectSelect( sal_False ),
nKS_NUMDOWN_Count(0),
nKS_NUMINDENTINC_Count(0),
- m_aFrameControlsManager( this ),
- m_sTmpHFPageStyle( ),
- m_bTmpHFIsHeader( false )
+ m_aFrameControlsManager( this )
{
SetHelpId(HID_EDIT_WIN);
EnableChildTransparentMode();
@@ -4803,23 +4789,6 @@ void SwEditWin::Command( const CommandEvent& rCEvt )
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;
diff --git a/sw/source/ui/inc/edtwin.hxx b/sw/source/ui/inc/edtwin.hxx
index 11a64462472e..67af3ae3c0ee 100644
--- a/sw/source/ui/inc/edtwin.hxx
+++ b/sw/source/ui/inc/edtwin.hxx
@@ -154,8 +154,6 @@ friend void PageNumNotify( ViewShell* pVwSh,
sal_uInt16 nKS_NUMINDENTINC_Count;
SwFrameControlsManager m_aFrameControlsManager;
- rtl::OUString m_sTmpHFPageStyle;
- bool m_bTmpHFIsHeader;
void LeaveArea(const Point &);
void JustifyAreaTimer();