[Libreoffice-commits] .: Branch 'libreoffice-3-6' - 2 commits - sw/source
Libreoffice Gerrit user
logerrit at kemper.freedesktop.org
Thu Sep 6 03:16:24 PDT 2012
sw/source/core/crsr/crsrsh.cxx | 11 +++++
sw/source/ui/docvw/HeaderFooterWin.cxx | 11 -----
sw/source/ui/docvw/edtwin.cxx | 72 ++++++++++++++++++++++++---------
sw/source/ui/inc/HeaderFooterWin.hxx | 1
sw/source/ui/inc/edtwin.hxx | 1
sw/source/ui/wrtsh/wrtsh1.cxx | 6 +-
6 files changed, 68 insertions(+), 34 deletions(-)
New commits:
commit 3632b3a01fa8ad5f111658ff5cea555db58637fd
Author: Cédric Bosdonnat <cedric.bosdonnat at free.fr>
Date: Mon Aug 27 18:12:00 2012 +0200
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 at suse.cz>
Signed-off-by: Michael Stahl <mstahl at redhat.com>
Signed-off-by: Rainer Bielefeld <LibreOffice at bielefeldundbuss.de>
Signed-off-by: Roman Eisele <bugs at eikota.de>
diff --git a/sw/source/core/crsr/crsrsh.cxx b/sw/source/core/crsr/crsrsh.cxx
index dfd80d9..ca62c55 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 a6b09dd..dd58e44 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 11a6446..67af3ae 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();
commit 1dcb0eeb018f9ed54bce6dbbe262bf80fbd2ae93
Author: Cédric Bosdonnat <cedric.bosdonnat at free.fr>
Date: Thu Aug 23 09:45:10 2012 +0200
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 at suse.cz>
Signed-off-by: Michael Stahl <mstahl at redhat.com>
Signed-off-by: Rainer Bielefeld <LibreOffice at bielefeldundbuss.de>
Signed-off-by: Roman Eisele <bugs at eikota.de>
diff --git a/sw/source/ui/docvw/HeaderFooterWin.cxx b/sw/source/ui/docvw/HeaderFooterWin.cxx
index f35f603..cd09e65 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 fffe6c3..a6b09dd 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 d6c250d..04a0a81 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 ac78de9..11a6446 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 efd9930..0350940 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
More information about the Libreoffice-commits
mailing list