[Libreoffice-commits] .: sw/source

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Thu Aug 23 00:49:43 PDT 2012


 sw/source/ui/docvw/HeaderFooterWin.cxx |   11 ---
 sw/source/ui/docvw/edtwin.cxx          |  105 +++++++++++++++++++++++++++------
 sw/source/ui/inc/HeaderFooterWin.hxx   |    1 
 sw/source/ui/inc/edtwin.hxx            |    3 
 sw/source/ui/wrtsh/wrtsh1.cxx          |    6 -
 5 files changed, 91 insertions(+), 35 deletions(-)

New commits:
commit 3d7927152169474c3c73ac36d5d79008fe6bab3e
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

diff --git a/sw/source/ui/docvw/HeaderFooterWin.cxx b/sw/source/ui/docvw/HeaderFooterWin.cxx
index 23b2892..9e4bc27 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 e3b3933..bf24d48 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 966074e..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 83f8a9e..04f9c2e 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 ff843d6..723cb4c 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


More information about the Libreoffice-commits mailing list