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 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include "cmdid.h"
21 : #include "hintids.hxx"
22 : #include <algorithm>
23 : #include <svl/eitem.hxx>
24 : #include <editeng/lrspitem.hxx>
25 : #include <editeng/ulspitem.hxx>
26 : #include <editeng/sizeitem.hxx>
27 : #include <svx/pageitem.hxx>
28 : #include <editeng/brushitem.hxx>
29 : #include <editeng/frmdiritem.hxx>
30 : #include <vcl/bitmap.hxx>
31 : #include <vcl/builder.hxx>
32 : #include <vcl/graph.hxx>
33 : #include <vcl/settings.hxx>
34 : #include <tgrditem.hxx>
35 : #include <viewopt.hxx>
36 : #include "colex.hxx"
37 : #include "colmgr.hxx"
38 :
39 : //UUUU
40 : #include <svx/unobrushitemhelper.hxx>
41 :
42 : // Taking the updated values from the set
43 0 : void SwPageExample::UpdateExample( const SfxItemSet& rSet )
44 : {
45 0 : SfxItemPool* pPool = rSet.GetPool();
46 0 : sal_uInt16 nWhich = pPool->GetWhich( SID_ATTR_PAGE );
47 0 : if ( rSet.GetItemState( nWhich, false ) == SfxItemState::SET )
48 : {
49 : // alignment
50 0 : const SvxPageItem* pPage = (const SvxPageItem*)&rSet.Get( nWhich );
51 :
52 0 : if ( pPage )
53 0 : SetUsage( pPage->GetPageUsage() );
54 : }
55 :
56 0 : nWhich = pPool->GetWhich( SID_ATTR_PAGE_SIZE );
57 :
58 0 : if ( rSet.GetItemState( nWhich, false ) == SfxItemState::SET )
59 : {
60 : // orientation and size from PageItem
61 0 : const SvxSizeItem& rSize = (const SvxSizeItem&)rSet.Get( nWhich );
62 0 : SetSize( rSize.GetSize() );
63 : }
64 0 : nWhich = RES_LR_SPACE;
65 0 : if ( rSet.GetItemState( nWhich, false ) == SfxItemState::SET )
66 : {
67 : // set left and right border
68 0 : const SvxLRSpaceItem& rLRSpace = (const SvxLRSpaceItem&)rSet.Get( nWhich );
69 :
70 0 : SetLeft( rLRSpace.GetLeft() );
71 0 : SetRight( rLRSpace.GetRight() );
72 : }
73 : else
74 : {
75 0 : SetLeft( 0 );
76 0 : SetRight( 0 );
77 : }
78 :
79 0 : nWhich = RES_UL_SPACE;
80 :
81 0 : if ( rSet.GetItemState( nWhich, false ) == SfxItemState::SET )
82 : {
83 : // set upper and lower border
84 0 : const SvxULSpaceItem& rULSpace = (const SvxULSpaceItem&)rSet.Get( nWhich );
85 :
86 0 : SetTop( rULSpace.GetUpper() );
87 0 : SetBottom( rULSpace.GetLower() );
88 : }
89 : else
90 : {
91 0 : SetTop( 0 );
92 0 : SetBottom( 0 );
93 : }
94 :
95 : // evaluate header-attributes
96 : const SfxPoolItem* pItem;
97 0 : if( SfxItemState::SET == rSet.GetItemState( pPool->GetWhich( SID_ATTR_PAGE_HEADERSET),
98 0 : false, &pItem ) )
99 : {
100 0 : const SfxItemSet& rHeaderSet = ((SvxSetItem*)pItem)->GetItemSet();
101 : const SfxBoolItem& rHeaderOn =
102 0 : (const SfxBoolItem&)rHeaderSet.Get( pPool->GetWhich( SID_ATTR_PAGE_ON ) );
103 :
104 0 : if ( rHeaderOn.GetValue() )
105 : {
106 : const SvxSizeItem& rSize =
107 0 : (const SvxSizeItem&)rHeaderSet.Get(pPool->GetWhich(SID_ATTR_PAGE_SIZE));
108 :
109 : const SvxULSpaceItem& rUL = (const SvxULSpaceItem&)rHeaderSet.Get(
110 0 : pPool->GetWhich(SID_ATTR_ULSPACE));
111 : const SvxLRSpaceItem& rLR = (const SvxLRSpaceItem&)rHeaderSet.Get(
112 0 : pPool->GetWhich(SID_ATTR_LRSPACE));
113 :
114 0 : SetHdHeight( rSize.GetSize().Height() - rUL.GetLower());
115 0 : SetHdDist( rUL.GetLower() );
116 0 : SetHdLeft( rLR.GetLeft() );
117 0 : SetHdRight( rLR.GetRight() );
118 0 : SetHeader( true );
119 :
120 0 : if(SfxItemState::SET == rHeaderSet.GetItemState(RES_BACKGROUND))
121 : {
122 : //UUUU create FillAttributes from SvxBrushItem //SetHdColor(rItem.GetColor());
123 0 : const SvxBrushItem& rItem = static_cast< const SvxBrushItem& >(rHeaderSet.Get(RES_BACKGROUND));
124 0 : SfxItemSet aTempSet(*rHeaderSet.GetPool(), XATTR_FILL_FIRST, XATTR_FILL_LAST);
125 :
126 0 : setSvxBrushItemAsFillAttributesToTargetSet(rItem, aTempSet);
127 : setHeaderFillAttributes(
128 : drawinglayer::attribute::SdrAllFillAttributesHelperPtr(
129 : new drawinglayer::attribute::SdrAllFillAttributesHelper(
130 0 : aTempSet)));
131 : }
132 :
133 0 : if ( rHeaderSet.GetItemState( RES_BOX ) == SfxItemState::SET )
134 : {
135 : const SvxBoxItem& rItem =
136 0 : (const SvxBoxItem&)rHeaderSet.Get( RES_BOX );
137 0 : SetHdBorder( rItem );
138 : }
139 : }
140 : else
141 0 : SetHeader( false );
142 : }
143 :
144 0 : if( SfxItemState::SET == rSet.GetItemState( pPool->GetWhich( SID_ATTR_PAGE_FOOTERSET),
145 0 : false, &pItem ) )
146 : {
147 0 : const SfxItemSet& rFooterSet = ((SvxSetItem*)pItem)->GetItemSet();
148 : const SfxBoolItem& rFooterOn =
149 0 : (const SfxBoolItem&)rFooterSet.Get( SID_ATTR_PAGE_ON );
150 :
151 0 : if ( rFooterOn.GetValue() )
152 : {
153 : const SvxSizeItem& rSize =
154 0 : (const SvxSizeItem&)rFooterSet.Get( pPool->GetWhich( SID_ATTR_PAGE_SIZE ) );
155 :
156 : const SvxULSpaceItem& rUL = (const SvxULSpaceItem&)rFooterSet.Get(
157 0 : pPool->GetWhich( SID_ATTR_ULSPACE ) );
158 : const SvxLRSpaceItem& rLR = (const SvxLRSpaceItem&)rFooterSet.Get(
159 0 : pPool->GetWhich( SID_ATTR_LRSPACE ) );
160 :
161 0 : SetFtHeight( rSize.GetSize().Height() - rUL.GetUpper());
162 0 : SetFtDist( rUL.GetUpper() );
163 0 : SetFtLeft( rLR.GetLeft() );
164 0 : SetFtRight( rLR.GetRight() );
165 0 : SetFooter( true );
166 :
167 0 : if( rFooterSet.GetItemState( RES_BACKGROUND ) == SfxItemState::SET )
168 : {
169 : //UUUU create FillAttributes from SvxBrushItem //SetFtColor(rItem.GetColor());
170 0 : const SvxBrushItem& rItem = static_cast< const SvxBrushItem& >(rFooterSet.Get(RES_BACKGROUND));
171 0 : SfxItemSet aTempSet(*rFooterSet.GetPool(), XATTR_FILL_FIRST, XATTR_FILL_LAST);
172 :
173 0 : setSvxBrushItemAsFillAttributesToTargetSet(rItem, aTempSet);
174 : setFooterFillAttributes(
175 : drawinglayer::attribute::SdrAllFillAttributesHelperPtr(
176 : new drawinglayer::attribute::SdrAllFillAttributesHelper(
177 0 : aTempSet)));
178 : }
179 :
180 0 : if( rFooterSet.GetItemState( RES_BOX ) == SfxItemState::SET )
181 : {
182 : const SvxBoxItem& rItem =
183 0 : (const SvxBoxItem&)rFooterSet.Get( RES_BOX );
184 0 : SetFtBorder( rItem );
185 : }
186 : }
187 : else
188 0 : SetFooter( false );
189 : }
190 :
191 0 : if(SfxItemState::SET == rSet.GetItemState(RES_BACKGROUND, false, &pItem))
192 : {
193 : //UUUU create FillAttributes from SvxBrushItem
194 0 : const SvxBrushItem& rItem = static_cast< const SvxBrushItem& >(*pItem);
195 0 : SfxItemSet aTempSet(*rSet.GetPool(), XATTR_FILL_FIRST, XATTR_FILL_LAST);
196 :
197 0 : setSvxBrushItemAsFillAttributesToTargetSet(rItem, aTempSet);
198 : setPageFillAttributes(
199 : drawinglayer::attribute::SdrAllFillAttributesHelperPtr(
200 : new drawinglayer::attribute::SdrAllFillAttributesHelper(
201 0 : aTempSet)));
202 : }
203 :
204 0 : Invalidate();
205 0 : }
206 :
207 0 : void SwColExample::DrawPage( const Point& rOrg,
208 : const bool bSecond,
209 : const bool bEnabled )
210 : {
211 0 : SwPageExample::DrawPage( rOrg, bSecond, bEnabled );
212 : sal_uInt16 nColumnCount;
213 0 : if( pColMgr && 0 != (nColumnCount = pColMgr->GetCount()))
214 : {
215 0 : long nL = GetLeft();
216 0 : long nR = GetRight();
217 :
218 0 : if ( GetUsage() == SVX_PAGE_MIRROR && !bSecond )
219 : {
220 : // rotate for mirrored
221 0 : nL = GetRight();
222 0 : nR = GetLeft();
223 : }
224 :
225 0 : SetFillColor( Color( COL_LIGHTGRAY ) );
226 0 : Rectangle aRect;
227 0 : aRect.Right() = rOrg.X() + GetSize().Width() - nR;
228 0 : aRect.Left() = rOrg.X() + nL;
229 0 : aRect.Top() = rOrg.Y() + GetTop()
230 0 : + GetHdHeight() + GetHdDist();
231 0 : aRect.Bottom()= rOrg.Y() + GetSize().Height() - GetBottom()
232 0 : - GetFtHeight() - GetFtDist();
233 0 : DrawRect(aRect);
234 :
235 : //UUUU
236 0 : const Rectangle aDefineRect(aRect);
237 :
238 : //UUUU
239 0 : const drawinglayer::attribute::SdrAllFillAttributesHelperPtr& rFillAttributes = getPageFillAttributes();
240 :
241 0 : if(!rFillAttributes.get() || !rFillAttributes->isUsed())
242 : {
243 : //UUUU If there is no fill, use fallback color
244 0 : const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
245 0 : const Color& rFieldColor = rStyleSettings.GetFieldColor();
246 :
247 : setPageFillAttributes(
248 : drawinglayer::attribute::SdrAllFillAttributesHelperPtr(
249 : new drawinglayer::attribute::SdrAllFillAttributesHelper(
250 0 : rFieldColor)));
251 : }
252 :
253 : // #97495# make sure that the automatic column width's are always equal
254 0 : bool bAutoWidth = pColMgr->IsAutoWidth();
255 0 : sal_Int32 nAutoColWidth = 0;
256 0 : if(bAutoWidth)
257 : {
258 0 : sal_Int32 nColumnWidthSum = 0;
259 : sal_uInt16 i;
260 0 : for(i = 0; i < nColumnCount; ++i)
261 0 : nColumnWidthSum += pColMgr->GetColWidth( i );
262 0 : nAutoColWidth = nColumnWidthSum / nColumnCount;
263 : }
264 :
265 : sal_uInt16 i;
266 0 : for( i = 0; i < nColumnCount; i++)
267 : {
268 0 : if(!bAutoWidth)
269 0 : nAutoColWidth = pColMgr->GetColWidth( i );
270 0 : aRect.Right() = aRect.Left() + nAutoColWidth;
271 :
272 : //UUUU use primitive draw command
273 0 : drawFillAttributes(getPageFillAttributes(), aRect, aDefineRect);
274 :
275 0 : if(i < nColumnCount - 1)
276 0 : aRect.Left() = aRect.Right() + pColMgr->GetGutterWidth(i);
277 : }
278 0 : if(pColMgr->HasLine())
279 : {
280 0 : Point aUp( rOrg.X() + nL, rOrg.Y() + GetTop() );
281 0 : Point aDown( rOrg.X() + nL, rOrg.Y() + GetSize().Height()
282 0 : - GetBottom() - GetFtHeight() - GetFtDist() );
283 :
284 0 : if( pColMgr->GetLineHeightPercent() != 100 )
285 : {
286 0 : long nLength = aDown.Y() - aUp.Y();
287 0 : nLength -= nLength * pColMgr->GetLineHeightPercent() / 100;
288 0 : switch(pColMgr->GetAdjust())
289 : {
290 0 : case COLADJ_BOTTOM: aUp.Y() += nLength; break;
291 0 : case COLADJ_TOP: aDown.Y() -= nLength; break;
292 : case COLADJ_CENTER:
293 0 : aUp.Y() += nLength / 2;
294 0 : aDown.Y() -= nLength / 2;
295 0 : break;
296 : default:; // prevent warning
297 : }
298 : }
299 :
300 : int nDist;
301 0 : for( i = 0; i < nColumnCount - 1; i++)
302 : {
303 0 : int nGutter = pColMgr->GetGutterWidth(i);
304 0 : nDist = pColMgr->GetColWidth( i ) + nGutter;
305 : nDist -= (i == 0) ?
306 : nGutter/2 :
307 0 : 0;
308 0 : aUp.X() += nDist;
309 0 : aDown.X() += nDist;
310 0 : DrawLine( aUp, aDown );
311 :
312 : }
313 : }
314 : }
315 0 : }
316 :
317 0 : extern "C" SAL_DLLPUBLIC_EXPORT vcl::Window* SAL_CALL makeSwColExample(vcl::Window *pParent, VclBuilder::stringmap &)
318 : {
319 0 : return new SwColExample(pParent);
320 : }
321 :
322 0 : SwColumnOnlyExample::SwColumnOnlyExample(vcl::Window* pParent)
323 : : Window(pParent)
324 0 : , m_aFrmSize(1,1)
325 : {
326 0 : SetMapMode( MapMode( MAP_TWIP ) );
327 0 : m_aWinSize = GetOptimalSize();
328 0 : m_aWinSize.Height() -= 4;
329 0 : m_aWinSize.Width() -= 4;
330 :
331 0 : m_aWinSize = PixelToLogic( m_aWinSize );
332 :
333 0 : SetBorderStyle( WindowBorderStyle::MONO );
334 :
335 0 : m_aFrmSize = SvxPaperInfo::GetPaperSize(PAPER_A4);// DIN A4
336 0 : ::FitToActualSize(m_aCols, (sal_uInt16)m_aFrmSize.Width());
337 :
338 0 : long nHeight = m_aFrmSize.Height();
339 0 : Fraction aScale( m_aWinSize.Height(), nHeight );
340 0 : MapMode aMapMode( GetMapMode() );
341 0 : aMapMode.SetScaleX( aScale );
342 0 : aMapMode.SetScaleY( aScale );
343 0 : SetMapMode( aMapMode );
344 0 : }
345 :
346 0 : extern "C" SAL_DLLPUBLIC_EXPORT vcl::Window* SAL_CALL makeSwColumnOnlyExample(vcl::Window *pParent, VclBuilder::stringmap &)
347 : {
348 0 : return new SwColumnOnlyExample(pParent);
349 : }
350 :
351 0 : void SwColumnOnlyExample::Paint( const Rectangle& /*rRect*/ )
352 : {
353 0 : const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
354 0 : const Color& rFieldColor = rStyleSettings.GetFieldColor();
355 0 : const Color& rDlgColor = rStyleSettings.GetDialogColor();
356 0 : const Color& rFieldTextColor = SwViewOption::GetFontColor();
357 0 : Color aGrayColor(COL_LIGHTGRAY);
358 0 : if(rFieldColor == aGrayColor)
359 0 : aGrayColor.Invert();
360 :
361 0 : Size aLogSize(PixelToLogic(GetOutputSizePixel()));
362 0 : Rectangle aCompleteRect(Point(0,0), aLogSize);
363 0 : SetLineColor(rDlgColor);
364 0 : SetFillColor(rDlgColor);
365 0 : DrawRect(aCompleteRect);
366 :
367 0 : SetLineColor( rFieldTextColor );
368 0 : Point aTL( (aLogSize.Width() - m_aFrmSize.Width()) / 2,
369 0 : (aLogSize.Height() - m_aFrmSize.Height()) / 2);
370 0 : Rectangle aRect(aTL, m_aFrmSize);
371 :
372 : //draw a shadow rectangle
373 0 : SetFillColor( Color(COL_GRAY) );
374 0 : Rectangle aShadowRect(aRect);
375 0 : aShadowRect.Move(aTL.Y(), aTL.Y());
376 0 : DrawRect(aShadowRect);
377 :
378 0 : SetFillColor( rFieldColor );
379 0 : DrawRect(aRect);
380 :
381 0 : SetFillColor( aGrayColor );
382 :
383 : //column separator?
384 0 : long nLength = aLogSize.Height() - 2 * aTL.Y();
385 0 : Point aUp( aTL );
386 0 : Point aDown( aTL.X(), nLength );
387 0 : bool bLines = false;
388 0 : if(m_aCols.GetLineAdj() != COLADJ_NONE)
389 : {
390 0 : bLines = true;
391 :
392 0 : sal_uInt16 nPercent = m_aCols.GetLineHeight();
393 0 : if( nPercent != 100 )
394 : {
395 0 : nLength -= nLength * nPercent / 100;
396 0 : switch(m_aCols.GetLineAdj())
397 : {
398 0 : case COLADJ_BOTTOM: aUp.Y() += nLength; break;
399 0 : case COLADJ_TOP: aDown.Y() -= nLength; break;
400 : case COLADJ_CENTER:
401 0 : aUp.Y() += nLength / 2;
402 0 : aDown.Y() -= nLength / 2;
403 0 : break;
404 : default:; //prevent warning
405 : }
406 : }
407 :
408 : }
409 0 : const SwColumns& rCols = m_aCols.GetColumns();
410 0 : sal_uInt16 nColCount = rCols.size();
411 0 : if( nColCount )
412 : {
413 0 : DrawRect(aRect);
414 0 : SetFillColor( rFieldColor );
415 0 : Rectangle aFrmRect(aTL, m_aFrmSize);
416 0 : long nSum = aTL.X();
417 0 : for(sal_uInt16 i = 0; i < nColCount; i++)
418 : {
419 0 : const SwColumn* pCol = &rCols[i];
420 0 : aFrmRect.Left() = nSum + pCol->GetLeft();//nSum + pCol->GetLeft() + aTL.X();
421 0 : nSum += pCol->GetWishWidth();
422 0 : aFrmRect.Right() = nSum - pCol->GetRight();
423 0 : DrawRect(aFrmRect);
424 : }
425 0 : if(bLines )
426 : {
427 0 : nSum = aTL.X();
428 0 : for(sal_uInt16 i = 0; i < nColCount - 1; i++)
429 : {
430 0 : nSum += rCols[i].GetWishWidth();
431 0 : aUp.X() = nSum;
432 0 : aDown.X() = nSum;
433 0 : DrawLine(aUp, aDown);
434 : }
435 : }
436 : }
437 0 : }
438 :
439 0 : void SwColumnOnlyExample::SetColumns(const SwFmtCol& rCol)
440 : {
441 0 : m_aCols = rCol;
442 0 : sal_uInt16 nWishSum = m_aCols.GetWishWidth();
443 0 : long nFrmWidth = m_aFrmSize.Width();
444 0 : SwColumns& rCols = m_aCols.GetColumns();
445 0 : sal_uInt16 nColCount = rCols.size();
446 :
447 0 : for(sal_uInt16 i = 0; i < nColCount; i++)
448 : {
449 0 : SwColumn* pCol = &rCols[i];
450 0 : long nWish = pCol->GetWishWidth();
451 0 : nWish *= nFrmWidth;
452 0 : nWish /= nWishSum;
453 0 : pCol->SetWishWidth((sal_uInt16)nWish);
454 0 : long nLeft = pCol->GetLeft();
455 0 : nLeft *= nFrmWidth;
456 0 : nLeft /= nWishSum;
457 0 : pCol->SetLeft((sal_uInt16)nLeft);
458 0 : long nRight = pCol->GetRight();
459 0 : nRight *= nFrmWidth;
460 0 : nRight /= nWishSum;
461 0 : pCol->SetRight((sal_uInt16)nRight);
462 : }
463 : // #97495# make sure that the automatic column width's are always equal
464 0 : if(nColCount && m_aCols.IsOrtho())
465 : {
466 0 : sal_Int32 nColumnWidthSum = 0;
467 : sal_uInt16 i;
468 0 : for(i = 0; i < nColCount; ++i)
469 : {
470 0 : SwColumn* pCol = &rCols[i];
471 0 : nColumnWidthSum += pCol->GetWishWidth();
472 0 : nColumnWidthSum -= (pCol->GetRight() + pCol->GetLeft());
473 : }
474 0 : nColumnWidthSum /= nColCount;
475 0 : for(i = 0; i < nColCount; ++i)
476 : {
477 0 : SwColumn* pCol = &rCols[i];
478 0 : pCol->SetWishWidth( static_cast< sal_uInt16 >(nColumnWidthSum + pCol->GetRight() + pCol->GetLeft()));
479 : }
480 : }
481 0 : }
482 :
483 0 : Size SwColumnOnlyExample::GetOptimalSize() const
484 : {
485 0 : return LogicToPixel(Size(75, 46), MapMode(MAP_APPFONT));
486 : }
487 :
488 0 : SwPageGridExample::~SwPageGridExample()
489 : {
490 0 : delete pGridItem;
491 0 : }
492 :
493 0 : void SwPageGridExample::DrawPage( const Point& rOrg,
494 : const bool bSecond,
495 : const bool bEnabled )
496 : {
497 0 : SwPageExample::DrawPage(rOrg, bSecond, bEnabled);
498 0 : if(pGridItem && pGridItem->GetGridType())
499 : {
500 : //paint the grid now
501 0 : Color aLineColor = pGridItem->GetColor();
502 0 : if(aLineColor.GetColor() == COL_AUTO)
503 : {
504 0 : aLineColor = GetFillColor();
505 0 : aLineColor.Invert();
506 : }
507 0 : SetLineColor(aLineColor);
508 0 : long nL = GetLeft();
509 0 : long nR = GetRight();
510 :
511 0 : if ( GetUsage() == SVX_PAGE_MIRROR && !bSecond )
512 : {
513 : // rotate for mirrored
514 0 : nL = GetRight();
515 0 : nR = GetLeft();
516 : }
517 :
518 0 : Rectangle aRect;
519 0 : aRect.Right() = rOrg.X() + GetSize().Width() - nR;
520 0 : aRect.Left() = rOrg.X() + nL;
521 0 : aRect.Top() = rOrg.Y() + GetTop()
522 0 : + GetHdHeight() + GetHdDist();
523 0 : aRect.Bottom()= rOrg.Y() + GetSize().Height() - GetBottom()
524 0 : - GetFtHeight() - GetFtDist();
525 :
526 : //increase the values to get a 'viewable' preview
527 0 : sal_Int32 nBaseHeight = pGridItem->GetBaseHeight() * 3;
528 0 : sal_Int32 nRubyHeight = pGridItem->GetRubyHeight() * 3;
529 :
530 : //detect height of rectangles
531 : Rectangle aRubyRect(aRect.TopLeft(),
532 : m_bVertical ?
533 : Size(nRubyHeight, aRect.GetHeight()) :
534 0 : Size(aRect.GetWidth(), nRubyHeight));
535 : Rectangle aCharRect(aRect.TopLeft(),
536 : m_bVertical ?
537 : Size(nBaseHeight, aRect.GetHeight()) :
538 0 : Size(aRect.GetWidth(), nBaseHeight));
539 :
540 0 : sal_Int32 nLineHeight = nBaseHeight + nRubyHeight;
541 :
542 : //detect count of rectangles
543 0 : sal_Int32 nLines = (m_bVertical ? aRect.GetWidth(): aRect.GetHeight()) / nLineHeight;
544 0 : if(nLines > pGridItem->GetLines())
545 0 : nLines = pGridItem->GetLines();
546 :
547 : // determine start position
548 0 : if(m_bVertical)
549 : {
550 0 : sal_Int16 nXStart = static_cast< sal_Int16 >(aRect.GetWidth() / 2 - nLineHeight * nLines /2);
551 0 : aRubyRect.Move(nXStart, 0);
552 0 : aCharRect.Move(nXStart, 0);
553 : }
554 : else
555 : {
556 0 : sal_Int16 nYStart = static_cast< sal_Int16 >(aRect.GetHeight() / 2 - nLineHeight * nLines /2);
557 0 : aRubyRect.Move(0, nYStart);
558 0 : aCharRect.Move(0, nYStart);
559 : }
560 :
561 0 : if(pGridItem->IsRubyTextBelow())
562 0 : m_bVertical ? aRubyRect.Move(nBaseHeight, 0) : aRubyRect.Move(0, nBaseHeight);
563 : else
564 0 : m_bVertical ? aCharRect.Move(nRubyHeight, 0) : aCharRect.Move(0, nRubyHeight);
565 :
566 : //vertical lines
567 0 : bool bBothLines = pGridItem->GetGridType() == GRID_LINES_CHARS;
568 0 : SetFillColor( Color( COL_TRANSPARENT ) );
569 0 : sal_Int32 nXMove = m_bVertical ? nLineHeight : 0;
570 0 : sal_Int32 nYMove = m_bVertical ? 0 : nLineHeight;
571 0 : for(sal_Int32 nLine = 0; nLine < nLines; nLine++)
572 : {
573 0 : DrawRect(aRubyRect);
574 0 : DrawRect(aCharRect);
575 0 : if(bBothLines)
576 : {
577 0 : Point aStart = aCharRect.TopLeft();
578 0 : Point aEnd = m_bVertical ? aCharRect.TopRight() : aCharRect.BottomLeft();
579 0 : while(m_bVertical ? aStart.Y() < aRect.Bottom(): aStart.X() < aRect.Right())
580 : {
581 0 : DrawLine(aStart, aEnd);
582 0 : if(m_bVertical)
583 0 : aStart.Y() = aEnd.Y() += nBaseHeight;
584 : else
585 0 : aStart.X() = aEnd.X() += nBaseHeight;
586 : }
587 : }
588 0 : aRubyRect.Move(nXMove, nYMove);
589 0 : aCharRect.Move(nXMove, nYMove);
590 : }
591 : }
592 0 : }
593 :
594 0 : void SwPageGridExample::UpdateExample( const SfxItemSet& rSet )
595 : {
596 0 : DELETEZ(pGridItem);
597 : //get the grid information
598 0 : if(SfxItemState::DEFAULT <= rSet.GetItemState(RES_TEXTGRID, true))
599 0 : pGridItem = (SwTextGridItem*)((const SwTextGridItem&)rSet.Get(RES_TEXTGRID)).Clone();
600 0 : if( SfxItemState::DEFAULT <= rSet.GetItemState( RES_FRAMEDIR, true ))
601 : {
602 : const SvxFrameDirectionItem& rDirItem =
603 0 : (const SvxFrameDirectionItem&)rSet.Get(RES_FRAMEDIR);
604 0 : m_bVertical = rDirItem.GetValue() == FRMDIR_VERT_TOP_RIGHT||
605 0 : rDirItem.GetValue() == FRMDIR_VERT_TOP_LEFT;
606 : }
607 0 : SwPageExample::UpdateExample(rSet);
608 0 : }
609 :
610 0 : extern "C" SAL_DLLPUBLIC_EXPORT vcl::Window* SAL_CALL makeSwPageGridExample(vcl::Window *pParent, VclBuilder::stringmap &)
611 : {
612 0 : return new SwPageGridExample(pParent);
613 270 : }
614 :
615 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|