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