LCOV - code coverage report
Current view: top level - sw/source/uibase/docvw - HeaderFooterWin.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 1 267 0.4 %
Date: 2014-11-03 Functions: 2 20 10.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  */
       9             : 
      10             : #include <app.hrc>
      11             : #include <docvw.hrc>
      12             : #include <globals.hrc>
      13             : #include <popup.hrc>
      14             : #include <svtools/svtools.hrc>
      15             : 
      16             : #include <cmdid.h>
      17             : #include <DashedLine.hxx>
      18             : #include <docsh.hxx>
      19             : #include <edtwin.hxx>
      20             : #include <fmthdft.hxx>
      21             : #include <HeaderFooterWin.hxx>
      22             : #include <pagedesc.hxx>
      23             : #include <pagefrm.hxx>
      24             : #include <SwRewriter.hxx>
      25             : #include <view.hxx>
      26             : #include <viewopt.hxx>
      27             : #include <wrtsh.hxx>
      28             : 
      29             : #include <basegfx/color/bcolortools.hxx>
      30             : #include <basegfx/matrix/b2dhommatrixtools.hxx>
      31             : #include <basegfx/polygon/b2dpolygon.hxx>
      32             : #include <basegfx/range/b2drectangle.hxx>
      33             : #include <basegfx/vector/b2dsize.hxx>
      34             : #include <drawinglayer/attribute/fillgradientattribute.hxx>
      35             : #include <drawinglayer/attribute/fontattribute.hxx>
      36             : #include <drawinglayer/primitive2d/fillgradientprimitive2d.hxx>
      37             : #include <drawinglayer/primitive2d/modifiedcolorprimitive2d.hxx>
      38             : #include <drawinglayer/primitive2d/polygonprimitive2d.hxx>
      39             : #include <drawinglayer/primitive2d/polypolygonprimitive2d.hxx>
      40             : #include <drawinglayer/primitive2d/textlayoutdevice.hxx>
      41             : #include <drawinglayer/primitive2d/textprimitive2d.hxx>
      42             : #include <editeng/boxitem.hxx>
      43             : #include <svtools/svtresid.hxx>
      44             : #include <svx/hdft.hxx>
      45             : #include <drawinglayer/processor2d/processorfromoutputdevice.hxx>
      46             : #include <vcl/decoview.hxx>
      47             : #include <vcl/gradient.hxx>
      48             : #include <vcl/menubtn.hxx>
      49             : #include <vcl/svapp.hxx>
      50             : #include <vcl/settings.hxx>
      51             : #include <boost/scoped_ptr.hpp>
      52             : 
      53             : #define TEXT_PADDING 5
      54             : #define BOX_DISTANCE 10
      55             : #define BUTTON_WIDTH 18
      56             : 
      57             : using namespace basegfx;
      58             : using namespace basegfx::tools;
      59             : using namespace drawinglayer::attribute;
      60             : 
      61             : namespace
      62             : {
      63           0 :     static basegfx::BColor lcl_GetFillColor( basegfx::BColor aLineColor )
      64             :     {
      65           0 :         basegfx::BColor aHslLine = basegfx::tools::rgb2hsl( aLineColor );
      66           0 :         double nLuminance = aHslLine.getZ() * 2.5;
      67           0 :         if ( nLuminance == 0 )
      68           0 :             nLuminance = 0.5;
      69           0 :         else if ( nLuminance >= 1.0 )
      70           0 :             nLuminance = aHslLine.getZ() * 0.4;
      71           0 :         aHslLine.setZ( nLuminance );
      72           0 :         return basegfx::tools::hsl2rgb( aHslLine );
      73             :     }
      74             : 
      75           0 :     static basegfx::BColor lcl_GetLighterGradientColor( basegfx::BColor aDarkColor )
      76             :     {
      77           0 :         basegfx::BColor aHslDark = basegfx::tools::rgb2hsl( aDarkColor );
      78           0 :         double nLuminance = aHslDark.getZ() * 255 + 20;
      79           0 :         aHslDark.setZ( nLuminance / 255.0 );
      80           0 :         return basegfx::tools::hsl2rgb( aHslDark );
      81             :     }
      82             : 
      83           0 :     static B2DPolygon lcl_GetPolygon( const Rectangle& rRect, bool bHeader )
      84             :     {
      85           0 :         const double nRadius = 3;
      86           0 :         const double nKappa((M_SQRT2 - 1.0) * 4.0 / 3.0);
      87             : 
      88           0 :         B2DPolygon aPolygon;
      89           0 :         aPolygon.append( B2DPoint( rRect.Left(), rRect.Top() ) );
      90             : 
      91             :         {
      92           0 :             B2DPoint aCorner( rRect.Left(), rRect.Bottom() );
      93           0 :             B2DPoint aStart( rRect.Left(), rRect.Bottom() - nRadius );
      94           0 :             B2DPoint aEnd( rRect.Left() + nRadius, rRect.Bottom() );
      95           0 :             aPolygon.append( aStart );
      96             :             aPolygon.appendBezierSegment(
      97             :                     interpolate( aStart, aCorner, nKappa ),
      98             :                     interpolate( aEnd, aCorner, nKappa ),
      99           0 :                     aEnd );
     100             :         }
     101             : 
     102             :         {
     103           0 :             B2DPoint aCorner( rRect.Right(), rRect.Bottom() );
     104           0 :             B2DPoint aStart( rRect.Right() - nRadius, rRect.Bottom() );
     105           0 :             B2DPoint aEnd( rRect.Right(), rRect.Bottom() - nRadius );
     106           0 :             aPolygon.append( aStart );
     107             :             aPolygon.appendBezierSegment(
     108             :                     interpolate( aStart, aCorner, nKappa ),
     109             :                     interpolate( aEnd, aCorner, nKappa ),
     110           0 :                     aEnd );
     111             :         }
     112             : 
     113           0 :         aPolygon.append( B2DPoint( rRect.Right(), rRect.Top() ) );
     114             : 
     115           0 :         if ( !bHeader )
     116             :         {
     117           0 :             B2DRectangle aBRect( rRect.Left(), rRect.Top(), rRect.Right(), rRect.Bottom() );
     118             :             B2DHomMatrix aRotation = createRotateAroundPoint(
     119           0 :                    aBRect.getCenterX(), aBRect.getCenterY(), M_PI );
     120           0 :             aPolygon.transform( aRotation );
     121             :         }
     122             : 
     123           0 :         return aPolygon;
     124             :     }
     125             : }
     126             : 
     127           0 : SwHeaderFooterWin::SwHeaderFooterWin( SwEditWin* pEditWin, const SwPageFrm* pPageFrm, bool bHeader ) :
     128             :     MenuButton( pEditWin, WB_DIALOGCONTROL ),
     129             :     SwFrameControl( pEditWin, pPageFrm ),
     130             :     m_sLabel( ),
     131             :     m_bIsHeader( bHeader ),
     132             :     m_pPopupMenu( NULL ),
     133             :     m_pLine( NULL ),
     134             :     m_bIsAppearing( false ),
     135             :     m_nFadeRate( 100 ),
     136           0 :     m_aFadeTimer( )
     137             : {
     138             :     // Get the font and configure it
     139           0 :     vcl::Font aFont = GetSettings().GetStyleSettings().GetToolFont();
     140           0 :     SetZoomedPointFont( aFont );
     141             : 
     142             :     // Use pixels for the rest of the drawing
     143           0 :     SetMapMode( MapMode ( MAP_PIXEL ) );
     144             : 
     145             :     // Create the line control
     146           0 :     m_pLine = new SwDashedLine( GetEditWin(), &SwViewOption::GetHeaderFooterMarkColor );
     147           0 :     m_pLine->SetZOrder( this, WINDOW_ZORDER_BEFOR );
     148             : 
     149             :     // Create and set the PopupMenu
     150           0 :     m_pPopupMenu = new PopupMenu( SW_RES( MN_HEADERFOOTER_BUTTON ) );
     151             : 
     152             :     // Rewrite the menu entries' text
     153           0 :     if ( m_bIsHeader )
     154             :     {
     155           0 :         m_pPopupMenu->SetItemText( FN_HEADERFOOTER_EDIT, SW_RESSTR( STR_FORMAT_HEADER ) );
     156           0 :         m_pPopupMenu->SetItemText( FN_HEADERFOOTER_DELETE, SW_RESSTR( STR_DELETE_HEADER ) );
     157             :     }
     158             :     else
     159             :     {
     160           0 :         m_pPopupMenu->SetItemText( FN_HEADERFOOTER_EDIT, SW_RESSTR( STR_FORMAT_FOOTER ) );
     161           0 :         m_pPopupMenu->SetItemText( FN_HEADERFOOTER_DELETE, SW_RESSTR( STR_DELETE_FOOTER ) );
     162             :     }
     163             : 
     164           0 :     SetPopupMenu( m_pPopupMenu );
     165             : 
     166           0 :     m_aFadeTimer.SetTimeout( 50 );
     167           0 :     m_aFadeTimer.SetTimeoutHdl( LINK( this, SwHeaderFooterWin, FadeHandler ) );
     168           0 : }
     169             : 
     170           0 : SwHeaderFooterWin::~SwHeaderFooterWin( )
     171             : {
     172           0 :     delete m_pPopupMenu;
     173           0 :     delete m_pLine;
     174           0 : }
     175             : 
     176           0 : const SwPageFrm* SwHeaderFooterWin::GetPageFrame( )
     177             : {
     178           0 :     return static_cast< const SwPageFrm * >( GetFrame( ) );
     179             : }
     180             : 
     181           0 : void SwHeaderFooterWin::SetOffset( Point aOffset, long nXLineStart, long nXLineEnd )
     182             : {
     183             :     // Compute the text to show
     184           0 :     const SwPageDesc* pDesc = GetPageFrame()->GetPageDesc();
     185           0 :     bool bIsFirst = !pDesc->IsFirstShared() && GetPageFrame()->OnFirstPage();
     186           0 :     bool bIsLeft  = !pDesc->IsHeaderShared() && !GetPageFrame()->OnRightPage();
     187           0 :     bool bIsRight = !pDesc->IsHeaderShared() && GetPageFrame()->OnRightPage();
     188           0 :     m_sLabel = SW_RESSTR( STR_HEADER_TITLE );
     189           0 :     if ( !m_bIsHeader )
     190           0 :         m_sLabel = bIsFirst ? SW_RESSTR( STR_FIRST_FOOTER_TITLE )
     191             :             : bIsLeft  ? SW_RESSTR( STR_LEFT_FOOTER_TITLE )
     192             :             : bIsRight ? SW_RESSTR( STR_RIGHT_FOOTER_TITLE )
     193           0 :             : SW_RESSTR( STR_FOOTER_TITLE );
     194             :     else
     195           0 :         m_sLabel = bIsFirst ? SW_RESSTR( STR_FIRST_HEADER_TITLE )
     196             :             : bIsLeft  ? SW_RESSTR( STR_LEFT_HEADER_TITLE )
     197             :             : bIsRight ? SW_RESSTR( STR_RIGHT_HEADER_TITLE )
     198           0 :             : SW_RESSTR( STR_HEADER_TITLE );
     199             : 
     200           0 :     sal_Int32 nPos = m_sLabel.lastIndexOf( "%1" );
     201           0 :     m_sLabel = m_sLabel.replaceAt( nPos, 2, pDesc->GetName() );
     202             : 
     203             :     // Compute the text size and get the box position & size from it
     204           0 :     Rectangle aTextRect;
     205           0 :     GetTextBoundRect( aTextRect, OUString( m_sLabel ) );
     206           0 :     Rectangle aTextPxRect = LogicToPixel( aTextRect );
     207           0 :     FontMetric aFontMetric = GetFontMetric( GetFont() );
     208           0 :     Size  aBoxSize ( aTextPxRect.GetWidth() + BUTTON_WIDTH + TEXT_PADDING * 2,
     209           0 :                      aFontMetric.GetLineHeight() + TEXT_PADDING  * 2 );
     210             : 
     211           0 :     long nYFooterOff = 0;
     212           0 :     if ( !m_bIsHeader )
     213           0 :         nYFooterOff = aBoxSize.Height();
     214             : 
     215           0 :     Point aBoxPos( aOffset.X() - aBoxSize.Width() - BOX_DISTANCE,
     216           0 :                    aOffset.Y() - nYFooterOff );
     217             : 
     218           0 :     if ( Application::GetSettings().GetLayoutRTL() )
     219             :     {
     220           0 :         aBoxPos.setX( aOffset.X() + BOX_DISTANCE );
     221             :     }
     222             : 
     223             :     // Set the position & Size of the window
     224           0 :     SetPosSizePixel( aBoxPos, aBoxSize );
     225             : 
     226           0 :     double nYLinePos = aBoxPos.Y();
     227           0 :     if ( !m_bIsHeader )
     228           0 :         nYLinePos += aBoxSize.Height();
     229           0 :     Point aLinePos( nXLineStart, nYLinePos );
     230           0 :     Size aLineSize( nXLineEnd - nXLineStart, 1 );
     231           0 :     m_pLine->SetPosSizePixel( aLinePos, aLineSize );
     232           0 : }
     233             : 
     234           0 : void SwHeaderFooterWin::ShowAll( bool bShow )
     235             : {
     236           0 :     if ( !PopupMenu::IsInExecute() )
     237             :     {
     238           0 :         m_bIsAppearing = bShow;
     239             : 
     240           0 :         if ( m_aFadeTimer.IsActive( ) )
     241           0 :             m_aFadeTimer.Stop();
     242           0 :         m_aFadeTimer.Start( );
     243             :     }
     244           0 : }
     245             : 
     246           0 : bool SwHeaderFooterWin::Contains( const Point &rDocPt ) const
     247             : {
     248           0 :     Rectangle aRect( GetPosPixel(), GetSizePixel() );
     249           0 :     if ( aRect.IsInside( rDocPt ) )
     250           0 :         return true;
     251             : 
     252           0 :     Rectangle aLineRect( m_pLine->GetPosPixel(), m_pLine->GetSizePixel() );
     253           0 :     if ( aLineRect.IsInside( rDocPt ) )
     254           0 :         return true;
     255             : 
     256           0 :     return false;
     257             : }
     258             : 
     259           0 : void SwHeaderFooterWin::Paint( const Rectangle& )
     260             : {
     261           0 :     const Rectangle aRect( Rectangle( Point( 0, 0 ), PixelToLogic( GetSizePixel() ) ) );
     262           0 :     drawinglayer::primitive2d::Primitive2DSequence aSeq( 3 );
     263             : 
     264           0 :     B2DPolygon aPolygon = lcl_GetPolygon( aRect, m_bIsHeader );
     265             : 
     266             :     // Colors
     267           0 :     basegfx::BColor aLineColor = SwViewOption::GetHeaderFooterMarkColor().getBColor();
     268           0 :     basegfx::BColor aFillColor = lcl_GetFillColor( aLineColor );
     269           0 :     basegfx::BColor aLighterColor = lcl_GetLighterGradientColor( aFillColor );
     270             : 
     271           0 :     const StyleSettings& rSettings = Application::GetSettings().GetStyleSettings();
     272           0 :     if ( rSettings.GetHighContrastMode() )
     273             :     {
     274           0 :         aFillColor = rSettings.GetDialogColor( ).getBColor();
     275           0 :         aLineColor = rSettings.GetDialogTextColor( ).getBColor();
     276             : 
     277           0 :         aSeq[0] = drawinglayer::primitive2d::Primitive2DReference( new drawinglayer::primitive2d::PolyPolygonColorPrimitive2D(
     278           0 :                 B2DPolyPolygon( aPolygon ), aFillColor ) );
     279             :     }
     280             :     else
     281             :     {
     282           0 :         B2DRectangle aGradientRect( aRect.Left(), aRect.Top(), aRect.Right(), aRect.Bottom() );
     283           0 :         double nAngle = M_PI;
     284           0 :         if ( m_bIsHeader )
     285           0 :             nAngle = 0;
     286             :         FillGradientAttribute aFillAttrs( GRADIENTSTYLE_LINEAR, 0.0, 0.0, 0.0, nAngle,
     287           0 :                 aLighterColor, aFillColor, 10 );
     288           0 :         aSeq[0] = drawinglayer::primitive2d::Primitive2DReference( new drawinglayer::primitive2d::FillGradientPrimitive2D(
     289           0 :                 aGradientRect, aFillAttrs ) );
     290             :     }
     291             : 
     292             :     // Create the border lines primitive
     293           0 :     aSeq[1] = drawinglayer::primitive2d::Primitive2DReference( new drawinglayer::primitive2d::PolygonHairlinePrimitive2D(
     294           0 :             aPolygon, aLineColor ) );
     295             : 
     296             :     // Create the text primitive
     297           0 :     B2DVector aFontSize;
     298             :     FontAttribute aFontAttr = drawinglayer::primitive2d::getFontAttributeFromVclFont(
     299           0 :            aFontSize, GetFont(), false, false );
     300             : 
     301           0 :     FontMetric aFontMetric = GetFontMetric( GetFont() );
     302           0 :     double nTextOffsetY = aFontMetric.GetAscent() + TEXT_PADDING;
     303           0 :     Point aTextPos( TEXT_PADDING, nTextOffsetY );
     304             : 
     305             :     basegfx::B2DHomMatrix aTextMatrix( createScaleTranslateB2DHomMatrix(
     306             :                 aFontSize.getX(), aFontSize.getY(),
     307           0 :                 double( aTextPos.X() ), double( aTextPos.Y() ) ) );
     308             : 
     309           0 :     aSeq[2] = drawinglayer::primitive2d::Primitive2DReference( new drawinglayer::primitive2d::TextSimplePortionPrimitive2D(
     310             :                 aTextMatrix,
     311           0 :                 OUString( m_sLabel ), 0, m_sLabel.getLength(),
     312             :                 std::vector< double >( ),
     313             :                 aFontAttr,
     314             :                 com::sun::star::lang::Locale(),
     315           0 :                 aLineColor ) );
     316             : 
     317             :     // Create the 'plus' or 'arrow' primitive
     318           0 :     B2DRectangle aSignArea( B2DPoint( aRect.Right() - BUTTON_WIDTH, 0.0 ),
     319           0 :                             B2DSize( aRect.Right(), aRect.getHeight() ) );
     320             : 
     321           0 :     B2DPolygon aSign;
     322           0 :     if ( IsEmptyHeaderFooter( ) )
     323             :     {
     324             :         // Create the + polygon
     325           0 :         double nLeft = aSignArea.getMinX() + TEXT_PADDING;
     326           0 :         double nRight = aSignArea.getMaxX() - TEXT_PADDING;
     327           0 :         double nHalfW = ( nRight - nLeft ) / 2.0;
     328             : 
     329           0 :         double nTop = aSignArea.getCenterY() - nHalfW;
     330           0 :         double nBottom = aSignArea.getCenterY() + nHalfW;
     331             : 
     332           0 :         aSign.append( B2DPoint( nLeft, aSignArea.getCenterY() - 1.0 ) );
     333           0 :         aSign.append( B2DPoint( aSignArea.getCenterX() - 1.0, aSignArea.getCenterY() - 1.0 ) );
     334           0 :         aSign.append( B2DPoint( aSignArea.getCenterX() - 1.0, nTop ) );
     335           0 :         aSign.append( B2DPoint( aSignArea.getCenterX() + 1.0, nTop ) );
     336           0 :         aSign.append( B2DPoint( aSignArea.getCenterX() + 1.0, aSignArea.getCenterY() - 1.0 ) );
     337           0 :         aSign.append( B2DPoint( nRight, aSignArea.getCenterY() - 1.0 ) );
     338           0 :         aSign.append( B2DPoint( nRight, aSignArea.getCenterY() + 1.0 ) );
     339           0 :         aSign.append( B2DPoint( aSignArea.getCenterX() + 1.0, aSignArea.getCenterY() + 1.0 ) );
     340           0 :         aSign.append( B2DPoint( aSignArea.getCenterX() + 1.0, nBottom ) );
     341           0 :         aSign.append( B2DPoint( aSignArea.getCenterX() - 1.0, nBottom ) );
     342           0 :         aSign.append( B2DPoint( aSignArea.getCenterX() - 1.0, aSignArea.getCenterY() + 1.0  ) );
     343           0 :         aSign.append( B2DPoint( nLeft, aSignArea.getCenterY() + 1.0  ) );
     344           0 :         aSign.setClosed( true );
     345             :     }
     346             :     else
     347             :     {
     348             :         // Create the v polygon
     349           0 :         B2DPoint aLeft( aSignArea.getMinX() + TEXT_PADDING, aSignArea.getCenterY() );
     350           0 :         B2DPoint aRight( aSignArea.getMaxX() - TEXT_PADDING, aSignArea.getCenterY() );
     351           0 :         B2DPoint aBottom( ( aLeft.getX() + aRight.getX() ) / 2.0, aLeft.getY() + 4.0 );
     352           0 :         aSign.append( aLeft );
     353           0 :         aSign.append( aRight );
     354           0 :         aSign.append( aBottom );
     355           0 :         aSign.setClosed( true );
     356             :     }
     357             : 
     358           0 :     BColor aSignColor = Color( COL_BLACK ).getBColor( );
     359           0 :     if ( Application::GetSettings().GetStyleSettings().GetHighContrastMode() )
     360           0 :         aSignColor = Color( COL_WHITE ).getBColor( );
     361             : 
     362           0 :     aSeq.realloc( aSeq.getLength() + 1 );
     363           0 :     aSeq[ aSeq.getLength() - 1 ] = drawinglayer::primitive2d::Primitive2DReference( new drawinglayer::primitive2d::PolyPolygonColorPrimitive2D(
     364           0 :             B2DPolyPolygon( aSign ), aSignColor ) );
     365             : 
     366             :     // Create the processor and process the primitives
     367           0 :     const drawinglayer::geometry::ViewInformation2D aNewViewInfos;
     368             :     boost::scoped_ptr<drawinglayer::processor2d::BaseProcessor2D> pProcessor(
     369             :         drawinglayer::processor2d::createBaseProcessor2DFromOutputDevice(
     370           0 :                     *this, aNewViewInfos ));
     371             : 
     372             :     // TODO Ghost it all if needed
     373           0 :     drawinglayer::primitive2d::Primitive2DSequence aGhostedSeq( 1 );
     374           0 :     double nFadeRate = double( m_nFadeRate ) / 100.0;
     375             :     const basegfx::BColorModifierSharedPtr aBColorModifier(
     376             :         new basegfx::BColorModifier_interpolate(
     377             :             Color( COL_WHITE ).getBColor(),
     378           0 :             1.0 - nFadeRate));
     379           0 :     aGhostedSeq[0] = drawinglayer::primitive2d::Primitive2DReference( new drawinglayer::primitive2d::ModifiedColorPrimitive2D(
     380           0 :                 aSeq, aBColorModifier ) );
     381             : 
     382           0 :     pProcessor->process( aGhostedSeq );
     383           0 : }
     384             : 
     385           0 : bool SwHeaderFooterWin::IsEmptyHeaderFooter( )
     386             : {
     387           0 :     bool bResult = true;
     388             : 
     389             :     // Actually check it
     390           0 :     const SwPageDesc* pDesc = GetPageFrame()->GetPageDesc();
     391             : 
     392           0 :     bool const bFirst(GetPageFrame()->OnFirstPage());
     393           0 :     const SwFrmFmt *const pFmt = (GetPageFrame()->OnRightPage())
     394           0 :         ? pDesc->GetRightFmt(bFirst)
     395           0 :         : pDesc->GetLeftFmt(bFirst);
     396             : 
     397           0 :     if ( pFmt )
     398             :     {
     399           0 :         if ( m_bIsHeader )
     400           0 :             bResult = !pFmt->GetHeader().IsActive();
     401             :         else
     402           0 :             bResult = !pFmt->GetFooter().IsActive();
     403             :     }
     404             : 
     405           0 :     return bResult;
     406             : }
     407             : 
     408           0 : void SwHeaderFooterWin::ExecuteCommand( sal_uInt16 nSlot )
     409             : {
     410           0 :     SwView& rView = GetEditWin()->GetView();
     411           0 :     SwWrtShell& rSh = rView.GetWrtShell();
     412             : 
     413           0 :     const OUString& rStyleName = GetPageFrame()->GetPageDesc()->GetName();
     414           0 :     switch ( nSlot )
     415             :     {
     416             :         case FN_HEADERFOOTER_EDIT:
     417             :             {
     418           0 :                 OString sPageId = m_bIsHeader ? OString("header") : OString("footer");
     419           0 :                 rView.GetDocShell()->FormatPage(rStyleName, sPageId, rSh);
     420             :             }
     421           0 :             break;
     422             :         case FN_HEADERFOOTER_BORDERBACK:
     423             :             {
     424           0 :                 const SwPageDesc* pDesc = GetPageFrame()->GetPageDesc();
     425           0 :                 const SwFrmFmt& rMaster = pDesc->GetMaster();
     426           0 :                 SwFrmFmt* pHFFmt = const_cast< SwFrmFmt* >( rMaster.GetFooter().GetFooterFmt() );
     427           0 :                 if ( m_bIsHeader )
     428           0 :                     pHFFmt = const_cast< SwFrmFmt* >( rMaster.GetHeader().GetHeaderFmt() );
     429             : 
     430           0 :                 SfxItemPool* pPool = pHFFmt->GetAttrSet().GetPool();
     431             :                 SfxItemSet aSet( *pPool,
     432             :                        RES_BACKGROUND, RES_BACKGROUND,
     433             :                        RES_BOX, RES_BOX,
     434             :                        SID_ATTR_BORDER_INNER, SID_ATTR_BORDER_INNER,
     435           0 :                        RES_SHADOW, RES_SHADOW, 0 );
     436             : 
     437           0 :                 aSet.Put( pHFFmt->GetAttrSet() );
     438             : 
     439             :                 // Create a box info item... needed by the dialog
     440           0 :                 SvxBoxInfoItem aBoxInfo( SID_ATTR_BORDER_INNER );
     441             :                 const SfxPoolItem *pBoxInfo;
     442           0 :                 if ( SfxItemState::SET == pHFFmt->GetAttrSet().GetItemState( SID_ATTR_BORDER_INNER,
     443           0 :                                                         true, &pBoxInfo) )
     444           0 :                     aBoxInfo = *(SvxBoxInfoItem*)pBoxInfo;
     445             : 
     446           0 :                 aBoxInfo.SetTable( false );
     447           0 :                 aBoxInfo.SetDist( true);
     448           0 :                 aBoxInfo.SetMinDist( false );
     449           0 :                 aBoxInfo.SetDefDist( MIN_BORDER_DIST );
     450           0 :                 aBoxInfo.SetValid( VALID_DISABLE );
     451           0 :                 aSet.Put( aBoxInfo );
     452             : 
     453           0 :                 if ( svx::ShowBorderBackgroundDlg( this, &aSet, true ) )
     454             :                 {
     455             :                     const SfxPoolItem* pItem;
     456           0 :                     if ( SfxItemState::SET == aSet.GetItemState( RES_BACKGROUND, false, &pItem ) ) {
     457           0 :                         pHFFmt->SetFmtAttr( *pItem );
     458           0 :                         rView.GetDocShell()->SetModified(true);
     459             :                     }
     460             : 
     461           0 :                     if ( SfxItemState::SET == aSet.GetItemState( RES_BOX, false, &pItem ) ) {
     462           0 :                         pHFFmt->SetFmtAttr( *pItem );
     463           0 :                         rView.GetDocShell()->SetModified(true);
     464             :                     }
     465             : 
     466           0 :                     if ( SfxItemState::SET == aSet.GetItemState( RES_SHADOW, false, &pItem ) ) {
     467           0 :                         pHFFmt->SetFmtAttr( *pItem );
     468           0 :                         rView.GetDocShell()->SetModified(true);
     469             :                     }
     470           0 :                 }
     471             :             }
     472           0 :             break;
     473             :         case FN_HEADERFOOTER_DELETE:
     474             :             {
     475           0 :                 rSh.ChangeHeaderOrFooter( rStyleName, m_bIsHeader, false, true );
     476             :             }
     477           0 :             break;
     478             :         default:
     479           0 :             break;
     480           0 :     }
     481           0 : }
     482             : 
     483           0 : void SwHeaderFooterWin::SetReadonly( bool bReadonly )
     484             : {
     485           0 :     ShowAll( !bReadonly );
     486           0 : }
     487             : 
     488           0 : void SwHeaderFooterWin::MouseButtonDown( const MouseEvent& rMEvt )
     489             : {
     490           0 :     if ( IsEmptyHeaderFooter( ) )
     491             :     {
     492           0 :         SwView& rView = GetEditWin()->GetView();
     493           0 :         SwWrtShell& rSh = rView.GetWrtShell();
     494             : 
     495           0 :         const OUString& rStyleName = GetPageFrame()->GetPageDesc()->GetName();
     496           0 :         rSh.ChangeHeaderOrFooter( rStyleName, m_bIsHeader, true, false );
     497             :     }
     498             :     else
     499           0 :         MenuButton::MouseButtonDown( rMEvt );
     500           0 : }
     501             : 
     502           0 : void SwHeaderFooterWin::Select( )
     503             : {
     504           0 :     ExecuteCommand( GetCurItemId() );
     505           0 : }
     506             : 
     507           0 : IMPL_LINK_NOARG(SwHeaderFooterWin, FadeHandler)
     508             : {
     509           0 :     if ( m_bIsAppearing && m_nFadeRate > 0 )
     510           0 :         m_nFadeRate -= 25;
     511           0 :     else if ( !m_bIsAppearing && m_nFadeRate < 100 )
     512           0 :         m_nFadeRate += 25;
     513             : 
     514           0 :     if ( m_nFadeRate != 100 && !IsVisible() )
     515             :     {
     516           0 :         Show( true );
     517           0 :         m_pLine->Show( true );
     518             :     }
     519           0 :     else if ( m_nFadeRate == 100 && IsVisible( ) )
     520             :     {
     521           0 :         Show( false );
     522           0 :         m_pLine->Show( false );
     523             :     }
     524             :     else
     525           0 :         Invalidate();
     526             : 
     527           0 :     if ( IsVisible( ) && m_nFadeRate > 0 && m_nFadeRate < 100 )
     528           0 :         m_aFadeTimer.Start();
     529             : 
     530           0 :     return 0;
     531         270 : }
     532             : 
     533             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10