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: */
|