LCOV - code coverage report
Current view: top level - sw/source/uibase/docvw - HeaderFooterWin.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 1 270 0.4 %
Date: 2015-06-13 12:38:46 Functions: 2 21 9.5 %
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(const basegfx::BColor& rLineColor)
      64             :     {
      65           0 :         basegfx::BColor aHslLine = basegfx::tools::rgb2hsl(rLineColor);
      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(const basegfx::BColor& rDarkColor)
      76             :     {
      77           0 :         basegfx::BColor aHslDark = basegfx::tools::rgb2hsl(rDarkColor);
      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             :     //FIXME RenderContext
     139             : 
     140             :     // Get the font and configure it
     141           0 :     vcl::Font aFont = Application::GetSettings().GetStyleSettings().GetToolFont();
     142           0 :     SetZoomedPointFont(*this, aFont);
     143             : 
     144             :     // Create the line control
     145           0 :     m_pLine = VclPtr<SwDashedLine>::Create(GetEditWin(), &SwViewOption::GetHeaderFooterMarkColor);
     146           0 :     m_pLine->SetZOrder(this, ZOrderFlags::Before);
     147             : 
     148             :     // Create and set the PopupMenu
     149           0 :     m_pPopupMenu = new PopupMenu(SW_RES(MN_HEADERFOOTER_BUTTON));
     150             : 
     151             :     // Rewrite the menu entries' text
     152           0 :     if (m_bIsHeader)
     153             :     {
     154           0 :         m_pPopupMenu->SetItemText(FN_HEADERFOOTER_EDIT, SW_RESSTR(STR_FORMAT_HEADER));
     155           0 :         m_pPopupMenu->SetItemText(FN_HEADERFOOTER_DELETE, SW_RESSTR(STR_DELETE_HEADER));
     156             :     }
     157             :     else
     158             :     {
     159           0 :         m_pPopupMenu->SetItemText(FN_HEADERFOOTER_EDIT, SW_RESSTR(STR_FORMAT_FOOTER));
     160           0 :         m_pPopupMenu->SetItemText(FN_HEADERFOOTER_DELETE, SW_RESSTR(STR_DELETE_FOOTER));
     161             :     }
     162             : 
     163           0 :     SetPopupMenu(m_pPopupMenu);
     164             : 
     165           0 :     m_aFadeTimer.SetTimeout(50);
     166           0 :     m_aFadeTimer.SetTimeoutHdl(LINK(this, SwHeaderFooterWin, FadeHandler));
     167           0 : }
     168             : 
     169           0 : SwHeaderFooterWin::~SwHeaderFooterWin( )
     170             : {
     171           0 :     disposeOnce();
     172           0 : }
     173             : 
     174           0 : void SwHeaderFooterWin::dispose()
     175             : {
     176           0 :     delete m_pPopupMenu;
     177           0 :     m_pLine.disposeAndClear();
     178           0 :     MenuButton::dispose();
     179           0 : }
     180             : 
     181           0 : const SwPageFrm* SwHeaderFooterWin::GetPageFrame( )
     182             : {
     183           0 :     return static_cast< const SwPageFrm * >( GetFrame( ) );
     184             : }
     185             : 
     186           0 : void SwHeaderFooterWin::SetOffset(Point aOffset, long nXLineStart, long nXLineEnd)
     187             : {
     188             :     // Compute the text to show
     189           0 :     const SwPageDesc* pDesc = GetPageFrame()->GetPageDesc();
     190           0 :     bool bIsFirst = !pDesc->IsFirstShared() && GetPageFrame()->OnFirstPage();
     191           0 :     bool bIsLeft  = !pDesc->IsHeaderShared() && !GetPageFrame()->OnRightPage();
     192           0 :     bool bIsRight = !pDesc->IsHeaderShared() && GetPageFrame()->OnRightPage();
     193           0 :     m_sLabel = SW_RESSTR(STR_HEADER_TITLE);
     194           0 :     if (!m_bIsHeader)
     195           0 :         m_sLabel = bIsFirst ? SW_RESSTR(STR_FIRST_FOOTER_TITLE)
     196             :             : bIsLeft  ? SW_RESSTR(STR_LEFT_FOOTER_TITLE)
     197             :             : bIsRight ? SW_RESSTR(STR_RIGHT_FOOTER_TITLE)
     198           0 :             : SW_RESSTR(STR_FOOTER_TITLE );
     199             :     else
     200           0 :         m_sLabel = bIsFirst ? SW_RESSTR(STR_FIRST_HEADER_TITLE)
     201             :             : bIsLeft  ? SW_RESSTR(STR_LEFT_HEADER_TITLE)
     202             :             : bIsRight ? SW_RESSTR(STR_RIGHT_HEADER_TITLE)
     203           0 :             : SW_RESSTR(STR_HEADER_TITLE);
     204             : 
     205           0 :     sal_Int32 nPos = m_sLabel.lastIndexOf("%1");
     206           0 :     m_sLabel = m_sLabel.replaceAt(nPos, 2, pDesc->GetName());
     207             : 
     208             :     // Compute the text size and get the box position & size from it
     209           0 :     Rectangle aTextRect;
     210           0 :     GetTextBoundRect(aTextRect, OUString(m_sLabel));
     211           0 :     Rectangle aTextPxRect = LogicToPixel(aTextRect);
     212           0 :     FontMetric aFontMetric = GetFontMetric(GetFont());
     213           0 :     Size aBoxSize (aTextPxRect.GetWidth() + BUTTON_WIDTH + TEXT_PADDING * 2,
     214           0 :                    aFontMetric.GetLineHeight() + TEXT_PADDING  * 2 );
     215             : 
     216           0 :     long nYFooterOff = 0;
     217           0 :     if (!m_bIsHeader)
     218           0 :         nYFooterOff = aBoxSize.Height();
     219             : 
     220           0 :     Point aBoxPos(aOffset.X() - aBoxSize.Width() - BOX_DISTANCE,
     221           0 :                   aOffset.Y() - nYFooterOff);
     222             : 
     223           0 :     if (AllSettings::GetLayoutRTL())
     224             :     {
     225           0 :         aBoxPos.setX( aOffset.X() + BOX_DISTANCE );
     226             :     }
     227             : 
     228             :     // Set the position & Size of the window
     229           0 :     SetPosSizePixel(aBoxPos, aBoxSize);
     230             : 
     231           0 :     double nYLinePos = aBoxPos.Y();
     232           0 :     if (!m_bIsHeader)
     233           0 :         nYLinePos += aBoxSize.Height();
     234           0 :     Point aLinePos(nXLineStart, nYLinePos);
     235           0 :     Size aLineSize(nXLineEnd - nXLineStart, 1);
     236           0 :     m_pLine->SetPosSizePixel(aLinePos, aLineSize);
     237           0 : }
     238             : 
     239           0 : void SwHeaderFooterWin::ShowAll(bool bShow)
     240             : {
     241           0 :     if (!PopupMenu::IsInExecute())
     242             :     {
     243           0 :         m_bIsAppearing = bShow;
     244             : 
     245           0 :         if (m_aFadeTimer.IsActive())
     246           0 :             m_aFadeTimer.Stop();
     247           0 :         m_aFadeTimer.Start();
     248             :     }
     249           0 : }
     250             : 
     251           0 : bool SwHeaderFooterWin::Contains( const Point &rDocPt ) const
     252             : {
     253           0 :     Rectangle aRect(GetPosPixel(), GetSizePixel());
     254           0 :     if (aRect.IsInside(rDocPt))
     255           0 :         return true;
     256             : 
     257           0 :     Rectangle aLineRect(m_pLine->GetPosPixel(), m_pLine->GetSizePixel());
     258           0 :     if (aLineRect.IsInside(rDocPt))
     259           0 :         return true;
     260             : 
     261           0 :     return false;
     262             : }
     263             : 
     264           0 : void SwHeaderFooterWin::Paint(vcl::RenderContext& rRenderContext, const Rectangle&)
     265             : {
     266             :     // Use pixels for the rest of the drawing
     267           0 :     SetMapMode(MapMode(MAP_PIXEL));
     268             : 
     269           0 :     const Rectangle aRect(Rectangle(Point(0, 0), rRenderContext.PixelToLogic(GetSizePixel())));
     270           0 :     drawinglayer::primitive2d::Primitive2DSequence aSeq(3);
     271             : 
     272           0 :     B2DPolygon aPolygon = lcl_GetPolygon(aRect, m_bIsHeader);
     273             : 
     274             :     // Colors
     275           0 :     basegfx::BColor aLineColor = SwViewOption::GetHeaderFooterMarkColor().getBColor();
     276           0 :     basegfx::BColor aFillColor = lcl_GetFillColor(aLineColor);
     277           0 :     basegfx::BColor aLighterColor = lcl_GetLighterGradientColor(aFillColor);
     278             : 
     279           0 :     const StyleSettings& rSettings = Application::GetSettings().GetStyleSettings();
     280           0 :     if (rSettings.GetHighContrastMode())
     281             :     {
     282           0 :         aFillColor = rSettings.GetDialogColor().getBColor();
     283           0 :         aLineColor = rSettings.GetDialogTextColor().getBColor();
     284             : 
     285           0 :         aSeq[0] = drawinglayer::primitive2d::Primitive2DReference(
     286           0 :                     new drawinglayer::primitive2d::PolyPolygonColorPrimitive2D(B2DPolyPolygon(aPolygon), aFillColor));
     287             :     }
     288             :     else
     289             :     {
     290           0 :         B2DRectangle aGradientRect(aRect.Left(), aRect.Top(), aRect.Right(), aRect.Bottom());
     291           0 :         double nAngle = M_PI;
     292           0 :         if (m_bIsHeader)
     293           0 :             nAngle = 0;
     294           0 :         FillGradientAttribute aFillAttrs(GRADIENTSTYLE_LINEAR, 0.0, 0.0, 0.0, nAngle, aLighterColor, aFillColor, 10);
     295           0 :         aSeq[0] = drawinglayer::primitive2d::Primitive2DReference(
     296           0 :                     new drawinglayer::primitive2d::FillGradientPrimitive2D(aGradientRect, aFillAttrs));
     297             :     }
     298             : 
     299             :     // Create the border lines primitive
     300           0 :     aSeq[1] = drawinglayer::primitive2d::Primitive2DReference(
     301           0 :                 new drawinglayer::primitive2d::PolygonHairlinePrimitive2D(aPolygon, aLineColor));
     302             : 
     303             :     // Create the text primitive
     304           0 :     B2DVector aFontSize;
     305           0 :     FontAttribute aFontAttr = drawinglayer::primitive2d::getFontAttributeFromVclFont(aFontSize, rRenderContext.GetFont(), false, false);
     306             : 
     307           0 :     FontMetric aFontMetric = rRenderContext.GetFontMetric(rRenderContext.GetFont());
     308           0 :     double nTextOffsetY = aFontMetric.GetAscent() + TEXT_PADDING;
     309           0 :     Point aTextPos(TEXT_PADDING, nTextOffsetY);
     310             : 
     311             :     basegfx::B2DHomMatrix aTextMatrix(createScaleTranslateB2DHomMatrix(
     312             :                                             aFontSize.getX(), aFontSize.getY(),
     313           0 :                                             double(aTextPos.X()), double(aTextPos.Y())));
     314             : 
     315           0 :     aSeq[2] = drawinglayer::primitive2d::Primitive2DReference(
     316             :                     new drawinglayer::primitive2d::TextSimplePortionPrimitive2D(
     317           0 :                         aTextMatrix, OUString(m_sLabel), 0, m_sLabel.getLength(),
     318           0 :                         std::vector<double>(), aFontAttr, css::lang::Locale(), aLineColor));
     319             : 
     320             :     // Create the 'plus' or 'arrow' primitive
     321           0 :     B2DRectangle aSignArea(B2DPoint(aRect.Right() - BUTTON_WIDTH, 0.0),
     322           0 :                            B2DSize(aRect.Right(), aRect.getHeight()));
     323             : 
     324           0 :     B2DPolygon aSign;
     325           0 :     if (IsEmptyHeaderFooter())
     326             :     {
     327             :         // Create the + polygon
     328           0 :         double nLeft = aSignArea.getMinX() + TEXT_PADDING;
     329           0 :         double nRight = aSignArea.getMaxX() - TEXT_PADDING;
     330           0 :         double nHalfW = ( nRight - nLeft ) / 2.0;
     331             : 
     332           0 :         double nTop = aSignArea.getCenterY() - nHalfW;
     333           0 :         double nBottom = aSignArea.getCenterY() + nHalfW;
     334             : 
     335           0 :         aSign.append(B2DPoint(nLeft, aSignArea.getCenterY() - 1.0));
     336           0 :         aSign.append(B2DPoint(aSignArea.getCenterX() - 1.0, aSignArea.getCenterY() - 1.0));
     337           0 :         aSign.append(B2DPoint(aSignArea.getCenterX() - 1.0, nTop));
     338           0 :         aSign.append(B2DPoint(aSignArea.getCenterX() + 1.0, nTop));
     339           0 :         aSign.append(B2DPoint(aSignArea.getCenterX() + 1.0, aSignArea.getCenterY() - 1.0));
     340           0 :         aSign.append(B2DPoint(nRight, aSignArea.getCenterY() - 1.0));
     341           0 :         aSign.append(B2DPoint(nRight, aSignArea.getCenterY() + 1.0));
     342           0 :         aSign.append(B2DPoint(aSignArea.getCenterX() + 1.0, aSignArea.getCenterY() + 1.0));
     343           0 :         aSign.append(B2DPoint(aSignArea.getCenterX() + 1.0, nBottom));
     344           0 :         aSign.append(B2DPoint(aSignArea.getCenterX() - 1.0, nBottom));
     345           0 :         aSign.append(B2DPoint(aSignArea.getCenterX() - 1.0, aSignArea.getCenterY() + 1.0));
     346           0 :         aSign.append(B2DPoint(nLeft, aSignArea.getCenterY() + 1.0));
     347           0 :         aSign.setClosed(true);
     348             :     }
     349             :     else
     350             :     {
     351             :         // Create the v polygon
     352           0 :         B2DPoint aLeft(aSignArea.getMinX() + TEXT_PADDING, aSignArea.getCenterY());
     353           0 :         B2DPoint aRight(aSignArea.getMaxX() - TEXT_PADDING, aSignArea.getCenterY());
     354           0 :         B2DPoint aBottom((aLeft.getX() + aRight.getX()) / 2.0, aLeft.getY() + 4.0);
     355           0 :         aSign.append(aLeft);
     356           0 :         aSign.append(aRight);
     357           0 :         aSign.append(aBottom);
     358           0 :         aSign.setClosed(true);
     359             :     }
     360             : 
     361           0 :     BColor aSignColor = Color(COL_BLACK).getBColor();
     362           0 :     if (Application::GetSettings().GetStyleSettings().GetHighContrastMode())
     363           0 :         aSignColor = Color(COL_WHITE).getBColor();
     364             : 
     365           0 :     aSeq.realloc(aSeq.getLength() + 1);
     366           0 :     aSeq[aSeq.getLength() - 1] = drawinglayer::primitive2d::Primitive2DReference(
     367             :                                     new drawinglayer::primitive2d::PolyPolygonColorPrimitive2D(
     368           0 :                                         B2DPolyPolygon(aSign), aSignColor));
     369             : 
     370             :     // Create the processor and process the primitives
     371           0 :     const drawinglayer::geometry::ViewInformation2D aNewViewInfos;
     372             :     boost::scoped_ptr<drawinglayer::processor2d::BaseProcessor2D> pProcessor(
     373           0 :         drawinglayer::processor2d::createBaseProcessor2DFromOutputDevice(rRenderContext, aNewViewInfos));
     374             : 
     375             :     // TODO Ghost it all if needed
     376           0 :     drawinglayer::primitive2d::Primitive2DSequence aGhostedSeq(1);
     377           0 :     double nFadeRate = double(m_nFadeRate) / 100.0;
     378             : 
     379             :     const basegfx::BColorModifierSharedPtr aBColorModifier(
     380             :         new basegfx::BColorModifier_interpolate(Color(COL_WHITE).getBColor(),
     381           0 :                                                 1.0 - nFadeRate));
     382             : 
     383           0 :     aGhostedSeq[0] = drawinglayer::primitive2d::Primitive2DReference(
     384           0 :                         new drawinglayer::primitive2d::ModifiedColorPrimitive2D(aSeq, aBColorModifier));
     385             : 
     386           0 :     pProcessor->process(aGhostedSeq);
     387           0 : }
     388             : 
     389           0 : bool SwHeaderFooterWin::IsEmptyHeaderFooter( )
     390             : {
     391           0 :     bool bResult = true;
     392             : 
     393             :     // Actually check it
     394           0 :     const SwPageDesc* pDesc = GetPageFrame()->GetPageDesc();
     395             : 
     396           0 :     bool const bFirst(GetPageFrame()->OnFirstPage());
     397           0 :     const SwFrameFormat *const pFormat = (GetPageFrame()->OnRightPage())
     398           0 :         ? pDesc->GetRightFormat(bFirst)
     399           0 :         : pDesc->GetLeftFormat(bFirst);
     400             : 
     401           0 :     if ( pFormat )
     402             :     {
     403           0 :         if ( m_bIsHeader )
     404           0 :             bResult = !pFormat->GetHeader().IsActive();
     405             :         else
     406           0 :             bResult = !pFormat->GetFooter().IsActive();
     407             :     }
     408             : 
     409           0 :     return bResult;
     410             : }
     411             : 
     412           0 : void SwHeaderFooterWin::ExecuteCommand( sal_uInt16 nSlot )
     413             : {
     414           0 :     SwView& rView = GetEditWin()->GetView();
     415           0 :     SwWrtShell& rSh = rView.GetWrtShell();
     416             : 
     417           0 :     const OUString& rStyleName = GetPageFrame()->GetPageDesc()->GetName();
     418           0 :     switch ( nSlot )
     419             :     {
     420             :         case FN_HEADERFOOTER_EDIT:
     421             :         {
     422           0 :             OString sPageId = m_bIsHeader ? OString("header") : OString("footer");
     423           0 :             rView.GetDocShell()->FormatPage(rStyleName, sPageId, rSh);
     424             :         }
     425           0 :         break;
     426             :         case FN_HEADERFOOTER_BORDERBACK:
     427             :             {
     428           0 :                 const SwPageDesc* pDesc = GetPageFrame()->GetPageDesc();
     429           0 :                 const SwFrameFormat& rMaster = pDesc->GetMaster();
     430           0 :                 SwFrameFormat* pHFFormat = const_cast< SwFrameFormat* >( rMaster.GetFooter().GetFooterFormat() );
     431           0 :                 if ( m_bIsHeader )
     432           0 :                     pHFFormat = const_cast< SwFrameFormat* >( rMaster.GetHeader().GetHeaderFormat() );
     433             : 
     434           0 :                 SfxItemPool* pPool = pHFFormat->GetAttrSet().GetPool();
     435             :                 SfxItemSet aSet( *pPool,
     436             :                        RES_BACKGROUND, RES_BACKGROUND,
     437             :                        RES_BOX, RES_BOX,
     438             :                        SID_ATTR_BORDER_INNER, SID_ATTR_BORDER_INNER,
     439           0 :                        RES_SHADOW, RES_SHADOW, 0 );
     440             : 
     441           0 :             aSet.Put( pHFFormat->GetAttrSet() );
     442             : 
     443             :             // Create a box info item... needed by the dialog
     444           0 :             SvxBoxInfoItem aBoxInfo( SID_ATTR_BORDER_INNER );
     445             :             const SfxPoolItem *pBoxInfo;
     446           0 :             if ( SfxItemState::SET == pHFFormat->GetAttrSet().GetItemState( SID_ATTR_BORDER_INNER,
     447           0 :                                                     true, &pBoxInfo) )
     448           0 :                 aBoxInfo = *static_cast<const SvxBoxInfoItem*>(pBoxInfo);
     449             : 
     450           0 :             aBoxInfo.SetTable( false );
     451           0 :             aBoxInfo.SetDist( true);
     452           0 :             aBoxInfo.SetMinDist( false );
     453           0 :             aBoxInfo.SetDefDist( MIN_BORDER_DIST );
     454           0 :             aBoxInfo.SetValid( SvxBoxInfoItemValidFlags::DISABLE );
     455           0 :             aSet.Put( aBoxInfo );
     456             : 
     457           0 :             if ( svx::ShowBorderBackgroundDlg( this, &aSet, true ) )
     458             :             {
     459             :                 const SfxPoolItem* pItem;
     460           0 :                 if ( SfxItemState::SET == aSet.GetItemState( RES_BACKGROUND, false, &pItem ) ) {
     461           0 :                     pHFFormat->SetFormatAttr( *pItem );
     462           0 :                     rView.GetDocShell()->SetModified(true);
     463             :                 }
     464             : 
     465           0 :                 if ( SfxItemState::SET == aSet.GetItemState( RES_BOX, false, &pItem ) ) {
     466           0 :                     pHFFormat->SetFormatAttr( *pItem );
     467           0 :                     rView.GetDocShell()->SetModified(true);
     468             :                 }
     469             : 
     470           0 :                 if ( SfxItemState::SET == aSet.GetItemState( RES_SHADOW, false, &pItem ) ) {
     471           0 :                     pHFFormat->SetFormatAttr( *pItem );
     472           0 :                     rView.GetDocShell()->SetModified(true);
     473             :                 }
     474           0 :             }
     475             :         }
     476           0 :         break;
     477             :         case FN_HEADERFOOTER_DELETE:
     478             :         {
     479           0 :             rSh.ChangeHeaderOrFooter( rStyleName, m_bIsHeader, false, true );
     480             :         }
     481           0 :         break;
     482             :         default:
     483           0 :             break;
     484           0 :     }
     485           0 : }
     486             : 
     487           0 : void SwHeaderFooterWin::SetReadonly( bool bReadonly )
     488             : {
     489           0 :     ShowAll( !bReadonly );
     490           0 : }
     491             : 
     492           0 : void SwHeaderFooterWin::MouseButtonDown( const MouseEvent& rMEvt )
     493             : {
     494           0 :     if (IsEmptyHeaderFooter())
     495             :     {
     496           0 :         SwView& rView = GetEditWin()->GetView();
     497           0 :         SwWrtShell& rSh = rView.GetWrtShell();
     498             : 
     499           0 :         const OUString& rStyleName = GetPageFrame()->GetPageDesc()->GetName();
     500           0 :         rSh.ChangeHeaderOrFooter( rStyleName, m_bIsHeader, true, false );
     501             :     }
     502             :     else
     503           0 :         MenuButton::MouseButtonDown( rMEvt );
     504           0 : }
     505             : 
     506           0 : void SwHeaderFooterWin::Select()
     507             : {
     508           0 :     ExecuteCommand(GetCurItemId());
     509           0 : }
     510             : 
     511           0 : IMPL_LINK_NOARG_TYPED(SwHeaderFooterWin, FadeHandler, Timer *, void)
     512             : {
     513           0 :     if (m_bIsAppearing && m_nFadeRate > 0)
     514           0 :         m_nFadeRate -= 25;
     515           0 :     else if (!m_bIsAppearing && m_nFadeRate < 100)
     516           0 :         m_nFadeRate += 25;
     517             : 
     518           0 :     if (m_nFadeRate != 100 && !IsVisible())
     519             :     {
     520           0 :         Show(true);
     521           0 :         m_pLine->Show(true);
     522             :     }
     523           0 :     else if (m_nFadeRate == 100 && IsVisible())
     524             :     {
     525           0 :         Show(false);
     526           0 :         m_pLine->Show(false);
     527             :     }
     528             :     else
     529           0 :         Invalidate();
     530             : 
     531           0 :     if (IsVisible() && m_nFadeRate > 0 && m_nFadeRate < 100)
     532           0 :         m_aFadeTimer.Start();
     533         177 : }
     534             : 
     535             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11