[Libreoffice-commits] .: 4 commits - sw/Library_sw.mk sw/source

Cédric Bosdonnat cbosdo at kemper.freedesktop.org
Wed Sep 21 08:45:09 PDT 2011


 sw/Library_sw.mk                            |    1 
 sw/source/core/inc/layfrm.hxx               |    2 
 sw/source/core/layout/pagechg.cxx           |    2 
 sw/source/core/layout/paintfrm.cxx          |   25 ++--
 sw/source/ui/docvw/FrameControlsManager.cxx |  155 ++++++++++++++++++++++++++++
 sw/source/ui/docvw/HeaderFooterWin.cxx      |   26 ++--
 sw/source/ui/docvw/edtwin.cxx               |   70 ------------
 sw/source/ui/inc/FrameControl.hxx           |   55 +++++++++
 sw/source/ui/inc/FrameControlsManager.hxx   |   72 +++++++++++++
 sw/source/ui/inc/HeaderFooterWin.hxx        |    7 -
 sw/source/ui/inc/edtwin.hxx                 |   13 --
 sw/source/ui/wrtsh/wrtsh1.cxx               |    4 
 12 files changed, 325 insertions(+), 107 deletions(-)

New commits:
commit e19f926ba247b4b84c4efa368cf19c312f5f51e7
Author: Cédric Bosdonnat <cedric.bosdonnat.ooo at free.fr>
Date:   Wed Sep 21 17:40:40 2011 +0200

    Header/Footer: refactored the SwEditWin to extend it to page breaks

diff --git a/sw/Library_sw.mk b/sw/Library_sw.mk
index 709b4b5..f1e7d5c 100644
--- a/sw/Library_sw.mk
+++ b/sw/Library_sw.mk
@@ -584,6 +584,7 @@ $(eval $(call gb_Library_add_exception_objects,sw,\
     sw/source/ui/docvw/AnnotationMenuButton \
     sw/source/ui/docvw/AnnotationWin \
     sw/source/ui/docvw/DashedLine \
+	sw/source/ui/docvw/FrameControlsManager \
     sw/source/ui/docvw/PostItMgr \
     sw/source/ui/docvw/ShadowOverlayObject \
     sw/source/ui/docvw/SidebarTxtControl \
diff --git a/sw/source/core/layout/pagechg.cxx b/sw/source/core/layout/pagechg.cxx
index e028d27..5f2637d 100644
--- a/sw/source/core/layout/pagechg.cxx
+++ b/sw/source/core/layout/pagechg.cxx
@@ -286,7 +286,7 @@ SwPageFrm::~SwPageFrm()
     if ( pWrtSh )
     {
         SwEditWin& rEditWin = pWrtSh->GetView().GetEditWin();
-        rEditWin.RemoveHeaderFooterControls( this );
+        rEditWin.GetFrameControlsManager( ).RemoveControls( this );
     }
 
     //FlyContainer entleeren, delete der Flys uebernimmt der Anchor
diff --git a/sw/source/core/layout/paintfrm.cxx b/sw/source/core/layout/paintfrm.cxx
index 5a1621a..9301167 100755
--- a/sw/source/core/layout/paintfrm.cxx
+++ b/sw/source/core/layout/paintfrm.cxx
@@ -3512,7 +3512,7 @@ void SwPageFrm::PaintDecorators( ) const
 
                 long nHeaderYOff = aBodyRect.Top();
                 Point nOutputOff = rEditWin.LogicToPixel( Point( nXOff, nHeaderYOff ) );
-                rEditWin.SetHeaderFooterControl( this, true, nOutputOff );
+                rEditWin.GetFrameControlsManager().SetHeaderFooterControl( this, true, nOutputOff );
 
                 // Footer
                 const SwFrm* pFtnContFrm = Lower();
@@ -3525,7 +3525,7 @@ void SwPageFrm::PaintDecorators( ) const
 
                 long nFooterYOff = aBodyRect.Bottom();
                 nOutputOff = rEditWin.LogicToPixel( Point( nXOff, nFooterYOff ) );
-                rEditWin.SetHeaderFooterControl( this, false, nOutputOff );
+                rEditWin.GetFrameControlsManager().SetHeaderFooterControl( this, false, nOutputOff );
             }
         }
     }
diff --git a/sw/source/ui/docvw/FrameControlsManager.cxx b/sw/source/ui/docvw/FrameControlsManager.cxx
new file mode 100644
index 0000000..69b9c98
--- /dev/null
+++ b/sw/source/ui/docvw/FrameControlsManager.cxx
@@ -0,0 +1,155 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * Version: MPL 1.1 / GPLv3+ / LGPLv3+
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License or as specified alternatively below. You may obtain a copy of
+ * the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * Major Contributor(s):
+ * [ Copyright (C) 2011 SUSE <cbosdonnat at suse.com> (initial developer) ]
+ *
+ * All Rights Reserved.
+ *
+ * For minor contributions see the git repository.
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 3 or later (the "GPLv3+"), or
+ * the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"),
+ * in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable
+ * instead of those above.
+ */
+
+#include <edtwin.hxx>
+#include <FrameControlsManager.hxx>
+#include <HeaderFooterWin.hxx>
+#include <pagefrm.hxx>
+#include <viewopt.hxx>
+#include <view.hxx>
+#include <wrtsh.hxx>
+
+using namespace std;
+
+namespace
+{
+    class FramePredicate
+    {
+        const SwFrm* m_pToMatch;
+
+        public:
+            FramePredicate( const SwFrm* pFrm ) : m_pToMatch( pFrm ) { };
+
+            virtual bool operator()( SwFrameControlPtr pToCheck )
+                { return m_pToMatch == pToCheck->GetFrame(); };
+    };
+}
+
+SwFrameControlsManager::SwFrameControlsManager( SwEditWin* pEditWin ) :
+    m_pEditWin( pEditWin )
+{
+}
+
+SwFrameControlsManager::~SwFrameControlsManager()
+{
+    map< FrameControlType, vector< SwFrameControlPtr > >::iterator pIt = m_aControls.begin();
+
+    while ( pIt != m_aControls.end() )
+    {
+        pIt->second.clear( );
+        ++pIt;
+    }
+    m_aControls.clear();
+}
+
+std::vector< SwFrameControlPtr > SwFrameControlsManager::GetControls( FrameControlType eType )
+{
+    return m_aControls[eType];
+}
+
+void SwFrameControlsManager::AddControl( FrameControlType eType, SwFrameControlPtr pControl )
+{
+    m_aControls[eType].push_back( pControl );
+}
+
+void SwFrameControlsManager::RemoveControls( const SwFrm* pFrm )
+{
+    map< FrameControlType, vector< SwFrameControlPtr > >::iterator pIt = m_aControls.begin();
+
+    while ( pIt != m_aControls.end() )
+    {
+        vector< SwFrameControlPtr > aVect = pIt->second;
+        aVect.erase( remove_if( aVect.begin(),
+                                aVect.end(),
+                                FramePredicate( pFrm ) ), aVect.end() );
+        ++pIt;
+    }
+}
+
+
+void SwFrameControlsManager::HideControls( FrameControlType eType )
+{
+    vector< SwFrameControlPtr >::iterator pIt = m_aControls[eType].begin();
+    while ( pIt != m_aControls[eType].end() )
+    {
+        ( *pIt )->ShowAll( false );
+        pIt++;
+    }
+}
+
+void SwFrameControlsManager::SetReadonlyControls( bool bReadonly )
+{
+    map< FrameControlType, vector< SwFrameControlPtr > >::iterator pIt = m_aControls.begin();
+
+    while ( pIt != m_aControls.end() )
+    {
+        vector< SwFrameControlPtr >::iterator pVectIt = pIt->second.begin();
+        while ( pVectIt != pIt->second.end() )
+        {
+            ( *pVectIt )->SetReadonly( bReadonly );
+            ++pVectIt;
+        }
+        ++pIt;
+    }
+}
+
+void SwFrameControlsManager::SetHeaderFooterControl( const SwPageFrm* pPageFrm, bool bHeader, Point aOffset )
+{
+    // Check if we already have the control
+    SwFrameControlPtr pControl;
+
+    vector< SwFrameControlPtr > aControls = m_aControls[HeaderFooter];
+
+    vector< SwFrameControlPtr >::iterator pIt = aControls.begin();
+    while ( pIt != aControls.end() && !pControl.get() )
+    {
+        SwHeaderFooterWin* pToTest = dynamic_cast< SwHeaderFooterWin* >( pIt->get() );
+        if ( pToTest->GetPageFrame( ) == pPageFrm &&
+             pToTest->IsHeader( ) == bHeader )
+            pControl = *pIt;
+        pIt++;
+    }
+
+    if ( !pControl.get() )
+    {
+        pControl = SwFrameControlPtr( new SwHeaderFooterWin( m_pEditWin, pPageFrm, bHeader ) );
+        const SwViewOption* pViewOpt = m_pEditWin->GetView().GetWrtShell().GetViewOptions();
+        pControl->SetReadonly( pViewOpt->IsReadonly() );
+        AddControl( HeaderFooter, pControl );
+    }
+
+    Rectangle aPageRect = m_pEditWin->LogicToPixel( pPageFrm->Frm().SVRect() );
+
+    SwHeaderFooterWin* pHFWin = dynamic_cast< SwHeaderFooterWin* >( pControl.get() );
+    pHFWin->SetOffset( aOffset, aPageRect.Left(), aPageRect.Right() );
+
+    if ( !pHFWin->IsVisible() )
+        pControl->ShowAll( true );
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/ui/docvw/edtwin.cxx b/sw/source/ui/docvw/edtwin.cxx
index e985981..cac5277 100644
--- a/sw/source/ui/docvw/edtwin.cxx
+++ b/sw/source/ui/docvw/edtwin.cxx
@@ -214,17 +214,6 @@ namespace
         }
         return bRet;
     }
-
-    class PageFramePredicate
-    {
-        const SwPageFrm* m_pToMatch;
-
-        public:
-            PageFramePredicate( const SwPageFrm* pPageFrm ) : m_pToMatch( pPageFrm ) { };
-
-            virtual bool operator()( boost::shared_ptr< SwHeaderFooterWin > pToCheck )
-                { return m_pToMatch == pToCheck->GetPageFrame(); };
-    };
 }
 
 class SwAnchorMarker
@@ -4580,7 +4569,8 @@ SwEditWin::SwEditWin(Window *pParent, SwView &rMyView):
     bLockInput(sal_False),
     bObjectSelect( sal_False ),
     nKS_NUMDOWN_Count(0),
-    nKS_NUMINDENTINC_Count(0)
+    nKS_NUMINDENTINC_Count(0),
+    m_aFrameControlsManager( this )
 {
     SetHelpId(HID_EDIT_WIN);
     EnableChildTransparentMode();
@@ -4623,7 +4613,6 @@ SwEditWin::SwEditWin(Window *pParent, SwView &rMyView):
 
 SwEditWin::~SwEditWin()
 {
-    aHeadFootControls.clear();
     aKeyInputTimer.Stop();
     delete pShadCrsr;
     delete pRowColumnSelectionStart;
@@ -5758,61 +5747,4 @@ Selection SwEditWin::GetSurroundingTextSelection() const
     }
 }
 
-void SwEditWin::SetHeaderFooterControl( const SwPageFrm* pPageFrm, bool bHeader, Point aOffset )
-{
-    // Check if we already have the control
-    boost::shared_ptr< SwHeaderFooterWin > pControl;
-    std::vector< boost::shared_ptr< SwHeaderFooterWin > >::iterator pIt = aHeadFootControls.begin();
-    while ( pIt != aHeadFootControls.end() && !pControl.get() )
-    {
-        if ( ( *pIt )->GetPageFrame( ) == pPageFrm &&
-             ( *pIt )->IsHeader( ) == bHeader )
-            pControl = *pIt;
-        ++pIt;
-    }
-
-    if ( !pControl.get() )
-    {
-        boost::shared_ptr< SwHeaderFooterWin > pNewControl( new SwHeaderFooterWin( this, pPageFrm, bHeader ) );
-        const SwViewOption* pViewOpt = GetView().GetWrtShell().GetViewOptions();
-        pNewControl->SetReadonly( pViewOpt->IsReadonly() );
-        pControl.swap( pNewControl );
-        aHeadFootControls.push_back( pControl );
-    }
-
-    Rectangle aPageRect = LogicToPixel( pPageFrm->Frm().SVRect() );
-
-    pControl->SetOffset( aOffset, aPageRect.Left(), aPageRect.Right() );
-
-    if ( !pControl->IsVisible() )
-        pControl->ShowAll( true );
-}
-
-void SwEditWin::RemoveHeaderFooterControls( const SwPageFrm* pPageFrm )
-{
-    aHeadFootControls.erase( remove_if( aHeadFootControls.begin(),
-                                        aHeadFootControls.end(),
-                                        PageFramePredicate( pPageFrm ) ), aHeadFootControls.end() );
-}
-
-void SwEditWin::HideHeaderFooterControls( )
-{
-    std::vector< boost::shared_ptr< SwHeaderFooterWin > >::iterator pIt = aHeadFootControls.begin();
-    while ( pIt != aHeadFootControls.end() )
-    {
-        ( *pIt )->ShowAll( false );
-        ++pIt;
-    }
-}
-
-void SwEditWin::SetReadonlyHeaderFooterControls( bool bReadonly )
-{
-    std::vector< boost::shared_ptr< SwHeaderFooterWin > >::iterator pIt = aHeadFootControls.begin();
-    while ( pIt != aHeadFootControls.end() )
-    {
-        ( *pIt )->SetReadonly( bReadonly );
-        ++pIt;
-    }
-}
-
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/ui/inc/FrameControl.hxx b/sw/source/ui/inc/FrameControl.hxx
index 01bbb6b..0be643d 100644
--- a/sw/source/ui/inc/FrameControl.hxx
+++ b/sw/source/ui/inc/FrameControl.hxx
@@ -28,8 +28,8 @@
 #ifndef _FRAMECONTROL_HXX
 #define _FRAMECONTROL_HXX
 
-#include <edtwin.hxx>
-#include <frame.hxx>
+class SwEditWin;
+class SwFrm;
 
 /** Class representing a control linked to a SwFrm.
   */
diff --git a/sw/source/ui/inc/FrameControlsManager.hxx b/sw/source/ui/inc/FrameControlsManager.hxx
new file mode 100644
index 0000000..a37305b
--- /dev/null
+++ b/sw/source/ui/inc/FrameControlsManager.hxx
@@ -0,0 +1,72 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * Version: MPL 1.1 / GPLv3+ / LGPLv3+
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License or as specified alternatively below. You may obtain a copy of
+ * the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * Major Contributor(s):
+ * [ Copyright (C) 2011 SUSE <cbosdonnat at suse.com> (initial developer) ]
+ *
+ * All Rights Reserved.
+ *
+ * For minor contributions see the git repository.
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 3 or later (the "GPLv3+"), or
+ * the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"),
+ * in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable
+ * instead of those above.
+ */
+#ifndef _FRAMECONTROLSMANAGER_HXX
+#define _FRAMECONTROLSMANAGER_HXX
+
+#include <FrameControl.hxx>
+
+#include <boost/shared_ptr.hpp>
+#include <tools/gen.hxx>
+
+#include <map>
+#include <vector>
+
+class SwPageFrm;
+class SwEditWin;
+
+enum FrameControlType
+{
+    PageBreak,
+    HeaderFooter
+};
+
+typedef boost::shared_ptr< SwFrameControl > SwFrameControlPtr;
+
+class SwFrameControlsManager
+{
+    private:
+        SwEditWin* m_pEditWin;
+        std::map< FrameControlType, std::vector< SwFrameControlPtr > > m_aControls;
+
+    public:
+        SwFrameControlsManager( SwEditWin* pEditWin );
+        ~SwFrameControlsManager( );
+
+        std::vector< SwFrameControlPtr > GetControls( FrameControlType eType );
+        void AddControl( FrameControlType eType, SwFrameControlPtr pControl );
+        void RemoveControls( const SwFrm* pFrm );
+        void HideControls( FrameControlType eType );
+        void SetReadonlyControls( bool bReadonly );
+
+        // Helper methods
+        void SetHeaderFooterControl( const SwPageFrm* pPageFrm, bool bHeader, Point aOffset );
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/ui/inc/edtwin.hxx b/sw/source/ui/inc/edtwin.hxx
index f85b2f1..8cdcb1b 100644
--- a/sw/source/ui/inc/edtwin.hxx
+++ b/sw/source/ui/inc/edtwin.hxx
@@ -28,6 +28,8 @@
 #ifndef _EDTWIN_HXX
 #define _EDTWIN_HXX
 
+#include <FrameControlsManager.hxx>
+
 #include <svx/svdobj.hxx>
 #include <tools/link.hxx>
 #include <vcl/timer.hxx>
@@ -38,8 +40,6 @@
 #define _SVSTDARR_STRINGSISORTDTOR
 #include <svl/svstdarr.hxx>
 
-#include <boost/shared_ptr.hpp>
-
 class   SwWrtShell;
 class   SwView;
 class   SwRect;
@@ -54,8 +54,6 @@ class   SwPaM;
 struct  SwApplyTemplate;
 struct  QuickHelpData;
 class   SdrDropMarkerOverlay;
-class   SwHeaderFooterWin;
-class   SwPageFrm;
 
 /*--------------------------------------------------------------------
     Description:    input window
@@ -162,7 +160,7 @@ friend void     PageNumNotify(  ViewShell* pVwSh,
     sal_uInt16          nKS_NUMDOWN_Count; // #i23725#
     sal_uInt16          nKS_NUMINDENTINC_Count;
 
-    std::vector< boost::shared_ptr<SwHeaderFooterWin> > aHeadFootControls;
+    SwFrameControlsManager m_aFrameControlsManager;
 
     void            LeaveArea(const Point &);
     void            JustifyAreaTimer();
@@ -320,10 +318,7 @@ public:
     void        SetUseInputLanguage( sal_Bool bNew );
     sal_Bool    IsUseInputLanguage() const { return bUseInputLanguage; }
 
-    void SetHeaderFooterControl( const SwPageFrm* pPageFrm, bool bHeader, Point aOffset );
-    void RemoveHeaderFooterControls( const SwPageFrm* pPageFrm );
-    void HideHeaderFooterControls( );
-    void SetReadonlyHeaderFooterControls( bool bReadonly );
+    SwFrameControlsManager& GetFrameControlsManager() { return m_aFrameControlsManager; }
 
     SwEditWin(Window *pParent, SwView &);
     virtual ~SwEditWin();
diff --git a/sw/source/ui/wrtsh/wrtsh1.cxx b/sw/source/ui/wrtsh/wrtsh1.cxx
index ec54dc2..c5f873d 100644
--- a/sw/source/ui/wrtsh/wrtsh1.cxx
+++ b/sw/source/ui/wrtsh/wrtsh1.cxx
@@ -1816,7 +1816,7 @@ void SwWrtShell::ApplyViewOptions( const SwViewOption &rOpt )
 
 void SwWrtShell::SetReadonlyOption(sal_Bool bSet)
 {
-    GetView().GetEditWin().SetReadonlyHeaderFooterControls( bSet );
+    GetView().GetEditWin().GetFrameControlsManager().SetReadonlyControls( bSet );
     ViewShell::SetReadonlyOption( bSet );
 }
 
@@ -1894,7 +1894,7 @@ void SwWrtShell::SetShowHeaderFooterSeparator( sal_Bool bShow )
 {
     ViewShell::SetShowHeaderFooterSeparator( bShow );
     if ( !bShow )
-        GetView().GetEditWin().HideHeaderFooterControls( );
+        GetView().GetEditWin().GetFrameControlsManager().HideControls( HeaderFooter );
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit 1ca08ac546c24f12644e387418d88dba7c1c4236
Author: Cédric Bosdonnat <cedric.bosdonnat.ooo at free.fr>
Date:   Wed Sep 21 14:29:30 2011 +0200

    Header/Footer: Extracted a few common things to a SwFrameControl class

diff --git a/sw/source/ui/docvw/HeaderFooterWin.cxx b/sw/source/ui/docvw/HeaderFooterWin.cxx
index f1eb77a..f3bb00a 100644
--- a/sw/source/ui/docvw/HeaderFooterWin.cxx
+++ b/sw/source/ui/docvw/HeaderFooterWin.cxx
@@ -139,18 +139,13 @@ namespace
 
 SwHeaderFooterWin::SwHeaderFooterWin( SwEditWin* pEditWin, const SwPageFrm* pPageFrm, bool bHeader ) :
     MenuButton( pEditWin, WB_DIALOGCONTROL  ),
-    m_pEditWin( pEditWin ),
+    SwFrameControl( pEditWin, pPageFrm ),
     m_sLabel( ),
-    m_pPageFrm( pPageFrm ),
     m_bIsHeader( bHeader ),
     m_bReadonly( false ),
     m_pPopupMenu( NULL ),
     m_pLine( NULL )
 {
-    // Define the readonly member
-    const SwViewOption* pViewOpt = m_pEditWin->GetView().GetWrtShell().GetViewOptions();
-    m_bReadonly = pViewOpt->IsReadonly();
-
     // Get the font and configure it
     Font aFont = GetSettings().GetStyleSettings().GetToolFont();
     SetZoomedPointFont( aFont );
@@ -163,11 +158,11 @@ SwHeaderFooterWin::SwHeaderFooterWin( SwEditWin* pEditWin, const SwPageFrm* pPag
     if ( !m_bIsHeader )
         m_sLabel = ResId::toString( SW_RES( STR_FOOTER_TITLE ) );
     sal_Int32 nPos = m_sLabel.lastIndexOf( rtl::OUString::createFromAscii( "%1" ) );
-    m_sLabel = m_sLabel.replaceAt( nPos, 2, m_pPageFrm->GetPageDesc()->GetName() );
+    m_sLabel = m_sLabel.replaceAt( nPos, 2, GetPageFrame()->GetPageDesc()->GetName() );
 
     // Create the line control
     basegfx::BColor aColor = SwViewOption::GetHeaderFooterMarkColor().getBColor();
-    m_pLine = new SwDashedLine( m_pEditWin, aColor );
+    m_pLine = new SwDashedLine( GetEditWin(), aColor );
 
     // Create and set the PopupMenu
     m_pPopupMenu = new PopupMenu( SW_RES( MN_HEADERFOOTER_BUTTON ) );
@@ -193,6 +188,11 @@ SwHeaderFooterWin::~SwHeaderFooterWin( )
     delete m_pLine;
 }
 
+const SwPageFrm* SwHeaderFooterWin::GetPageFrame( )
+{
+    return static_cast< const SwPageFrm * >( GetFrame( ) );
+}
+
 void SwHeaderFooterWin::SetOffset( Point aOffset, long nXLineStart, long nXLineEnd )
 {
     // Compute the text size and get the box position & size from it
@@ -278,10 +278,10 @@ bool SwHeaderFooterWin::IsEmptyHeaderFooter( )
     bool bResult = true;
 
     // Actually check it
-    const SwPageDesc* pDesc = m_pPageFrm->GetPageDesc();
+    const SwPageDesc* pDesc = GetPageFrame()->GetPageDesc();
 
     const SwFrmFmt* pFmt = pDesc->GetLeftFmt();
-    if ( m_pPageFrm->OnRightPage() )
+    if ( GetPageFrame()->OnRightPage() )
          pFmt = pDesc->GetRightFmt();
 
     if ( pFmt )
@@ -297,7 +297,7 @@ bool SwHeaderFooterWin::IsEmptyHeaderFooter( )
 
 void SwHeaderFooterWin::ExecuteCommand( sal_uInt16 nSlot )
 {
-    SwView& rView = m_pEditWin->GetView();
+    SwView& rView = GetEditWin()->GetView();
     SwWrtShell& rSh = rView.GetWrtShell();
 
     const String& rStyleName = GetPageFrame()->GetPageDesc()->GetName();
@@ -316,7 +316,7 @@ void SwHeaderFooterWin::ExecuteCommand( sal_uInt16 nSlot )
             break;
         case FN_HEADERFOOTER_BORDERBACK:
             {
-                const SwPageDesc* pDesc = m_pPageFrm->GetPageDesc();
+                const SwPageDesc* pDesc = GetPageFrame()->GetPageDesc();
                 const SwFrmFmt& rMaster = pDesc->GetMaster();
                 SwFrmFmt* pHFFmt = const_cast< SwFrmFmt* >( rMaster.GetFooter().GetFooterFmt() );
                 if ( m_bIsHeader )
@@ -380,7 +380,7 @@ void SwHeaderFooterWin::MouseButtonDown( const MouseEvent& rMEvt )
 {
     if ( IsEmptyHeaderFooter( ) )
     {
-        SwView& rView = m_pEditWin->GetView();
+        SwView& rView = GetEditWin()->GetView();
         SwWrtShell& rSh = rView.GetWrtShell();
 
         const String& rStyleName = GetPageFrame()->GetPageDesc()->GetName();
diff --git a/sw/source/ui/docvw/edtwin.cxx b/sw/source/ui/docvw/edtwin.cxx
index 3c29c27..e985981 100644
--- a/sw/source/ui/docvw/edtwin.cxx
+++ b/sw/source/ui/docvw/edtwin.cxx
@@ -5774,6 +5774,8 @@ void SwEditWin::SetHeaderFooterControl( const SwPageFrm* pPageFrm, bool bHeader,
     if ( !pControl.get() )
     {
         boost::shared_ptr< SwHeaderFooterWin > pNewControl( new SwHeaderFooterWin( this, pPageFrm, bHeader ) );
+        const SwViewOption* pViewOpt = GetView().GetWrtShell().GetViewOptions();
+        pNewControl->SetReadonly( pViewOpt->IsReadonly() );
         pControl.swap( pNewControl );
         aHeadFootControls.push_back( pControl );
     }
diff --git a/sw/source/ui/inc/FrameControl.hxx b/sw/source/ui/inc/FrameControl.hxx
new file mode 100644
index 0000000..01bbb6b
--- /dev/null
+++ b/sw/source/ui/inc/FrameControl.hxx
@@ -0,0 +1,55 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * Version: MPL 1.1 / GPLv3+ / LGPLv3+
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License or as specified alternatively below. You may obtain a copy of
+ * the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * Major Contributor(s):
+ * [ Copyright (C) 2011 SUSE <cbosdonnat at suse.com> (initial developer) ]
+ *
+ * All Rights Reserved.
+ *
+ * For minor contributions see the git repository.
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 3 or later (the "GPLv3+"), or
+ * the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"),
+ * in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable
+ * instead of those above.
+ */
+#ifndef _FRAMECONTROL_HXX
+#define _FRAMECONTROL_HXX
+
+#include <edtwin.hxx>
+#include <frame.hxx>
+
+/** Class representing a control linked to a SwFrm.
+  */
+class SwFrameControl
+{
+    SwEditWin*            m_pEditWin;
+    const SwFrm*          m_pFrm;
+
+public:
+    SwFrameControl( SwEditWin* pEditWin, const SwFrm* pFrm ) :
+        m_pEditWin( pEditWin ), m_pFrm( pFrm ) {};
+    ~SwFrameControl( ) {};
+
+    const SwFrm* GetFrame( ) { return m_pFrm; }
+    SwEditWin*   GetEditWin( ) { return m_pEditWin; }
+
+    virtual void SetReadonly( bool bReadonly ) = 0;
+    virtual void ShowAll( bool bShow ) = 0;
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/ui/inc/HeaderFooterWin.hxx b/sw/source/ui/inc/HeaderFooterWin.hxx
index c59211d..bbb93b2 100644
--- a/sw/source/ui/inc/HeaderFooterWin.hxx
+++ b/sw/source/ui/inc/HeaderFooterWin.hxx
@@ -28,6 +28,7 @@
 #ifndef _HEADERFOOTERWINDOW_HXX
 #define _HEADERFOOTERWINDOW_HXX
 
+#include <FrameControl.hxx>
 #include <pagedesc.hxx>
 
 #include <vcl/menubtn.hxx>
@@ -37,11 +38,9 @@
     This control is showing the header / footer style name and provides
     a few useful actions to the user.
   */
-class SwHeaderFooterWin : public MenuButton
+class SwHeaderFooterWin : public MenuButton, public SwFrameControl
 {
-    SwEditWin*            m_pEditWin;
     rtl::OUString         m_sLabel;
-    const SwPageFrm*      m_pPageFrm;
     bool                  m_bIsHeader;
     bool                  m_bReadonly;
     PopupMenu*            m_pPopupMenu;
@@ -61,7 +60,7 @@ public:
 
     bool IsHeader() { return m_bIsHeader; };
     bool IsEmptyHeaderFooter( );
-    const SwPageFrm* GetPageFrame( ) { return m_pPageFrm; };
+    const SwPageFrm* GetPageFrame( );
 
     void ExecuteCommand(sal_uInt16 nSlot);
 
commit aaa34f74a639b8cf54d27d52b292f4d0ed0f1231
Author: Cédric Bosdonnat <cedric.bosdonnat.ooo at free.fr>
Date:   Wed Sep 21 10:02:58 2011 +0200

    Page Break: Fix the line position in side-by-side pages display

diff --git a/sw/source/core/layout/paintfrm.cxx b/sw/source/core/layout/paintfrm.cxx
index a03701f..5a1621a 100755
--- a/sw/source/core/layout/paintfrm.cxx
+++ b/sw/source/core/layout/paintfrm.cxx
@@ -3338,9 +3338,7 @@ void SwPageFrm::PaintBreak( ) const
             if ( pCnt && pCnt->IsPageBreak( sal_True ) )
             {
                 const SwPageFrm* pPageFrm = FindPageFrm();
-                const SwPageFrm* pPrevPageFrm = static_cast< const SwPageFrm* >( pPageFrm->GetPrev() );
-
-                double nYLineOffset = double( pPageFrm->Frm().Top() + pPrevPageFrm->Frm().Bottom() ) / 2.0;
+                double nYLineOffset = double( pPageFrm->GetBoundRect().Top() + pPageFrm->Frm().Top() ) / 2.0;
                 SwRect aRect = pPageFrm->GetBoundRect();
 
                 basegfx::BColor aColor = SwViewOption::GetPageBreakColor().getBColor();
commit 7a6ae7ff20a0b26a083c13649712635758797c15
Author: Cédric Bosdonnat <cedric.bosdonnat.ooo at free.fr>
Date:   Wed Sep 21 09:51:51 2011 +0200

    Page Break: decouple it from the text bounding lines painting

diff --git a/sw/source/core/inc/layfrm.hxx b/sw/source/core/inc/layfrm.hxx
index 5300ba8..4d5d3e8 100644
--- a/sw/source/core/inc/layfrm.hxx
+++ b/sw/source/core/inc/layfrm.hxx
@@ -170,7 +170,7 @@ public:
     const SwFrm* GetLastLower() const;
     inline SwFrm* GetLastLower();
 
-    virtual void PaintBreak() const{ };
+    virtual void PaintBreak() const;
 };
 
 //Um doppelte Implementierung zu sparen wird hier ein bischen gecasted
diff --git a/sw/source/core/layout/paintfrm.cxx b/sw/source/core/layout/paintfrm.cxx
index f3db985..a03701f 100755
--- a/sw/source/core/layout/paintfrm.cxx
+++ b/sw/source/core/layout/paintfrm.cxx
@@ -3006,6 +3006,7 @@ SwRootFrm::Paint(SwRect const& rRect, SwPrintData const*const pPrintData) const
             }
 
             pPage->PaintDecorators( );
+            pPage->PaintBreak();
         }
         else if ( bBookMode && pSh->GetWin() && !pSh->GetDoc()->GetDocShell()->IsInPlaceActive() )
         {
@@ -3385,6 +3386,7 @@ void SwPageFrm::PaintBreak( ) const
                 ProcessPrimitives( aSeq );
             }
         }
+        SwLayoutFrm::PaintBreak( );
     }
 }
 
@@ -3474,6 +3476,17 @@ void SwColumnFrm::PaintBreak( ) const
     }
 }
 
+void SwLayoutFrm::PaintBreak( ) const
+{
+    const SwFrm* pFrm = Lower();
+    while ( pFrm )
+    {
+        if ( pFrm->IsLayoutFrm() )
+            static_cast< const SwLayoutFrm*>( pFrm )->PaintBreak( );
+        pFrm = pFrm->GetNext();
+    }
+}
+
 void SwPageFrm::PaintDecorators( ) const
 {
     SwWrtShell* pWrtSh = dynamic_cast< SwWrtShell* >( pGlobalShell );
@@ -6377,8 +6390,6 @@ void SwPageFrm::PaintSubsidiaryLines( const SwPageFrm *,
 
         ProcessPrimitives( lcl_CreatePageAreaDelimiterPrimitives( aArea ) );
     }
-
-    PaintBreak();
 }
 
 void SwColumnFrm::PaintSubsidiaryLines( const SwPageFrm *,
@@ -6415,8 +6426,6 @@ void SwColumnFrm::PaintSubsidiaryLines( const SwPageFrm *,
     ::SwAlignRect( aArea, pGlobalShell );
 
     ProcessPrimitives( lcl_CreateColumnAreaDelimiterPrimitives( aArea ) );
-
-    PaintBreak();
 }
 
 void SwSectionFrm::PaintSubsidiaryLines( const SwPageFrm * pPage,


More information about the Libreoffice-commits mailing list