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 <string.h>
21 : #include <tools/debug.hxx>
22 : #include <vcl/svapp.hxx>
23 : #include <tools/poly.hxx>
24 : #include <vcl/i18nhelp.hxx>
25 : #include <vcl/settings.hxx>
26 :
27 : #include <svtools/ruler.hxx>
28 : #include <svtools/svtresid.hxx>
29 : #include <svtools/svtools.hrc>
30 : #include <svtools/colorcfg.hxx>
31 :
32 : #include <boost/scoped_array.hpp>
33 : #include <vector>
34 :
35 : using namespace std;
36 : using namespace ::com::sun::star;
37 : using namespace ::com::sun::star::uno;
38 : using namespace ::com::sun::star::lang;
39 : using namespace ::com::sun::star::accessibility;
40 :
41 : #define RULER_OFF 3
42 : #define RULER_RESIZE_OFF 4
43 : #define RULER_MIN_SIZE 3
44 :
45 : #define RULER_VAR_SIZE 8
46 :
47 : #define RULER_UPDATE_LINES 0x01
48 :
49 : #define RULER_CLIP 150
50 :
51 : #define RULER_UNIT_MM 0
52 : #define RULER_UNIT_CM 1
53 : #define RULER_UNIT_M 2
54 : #define RULER_UNIT_KM 3
55 : #define RULER_UNIT_INCH 4
56 : #define RULER_UNIT_FOOT 5
57 : #define RULER_UNIT_MILE 6
58 : #define RULER_UNIT_POINT 7
59 : #define RULER_UNIT_PICA 8
60 : #define RULER_UNIT_CHAR 9
61 : #define RULER_UNIT_LINE 10
62 : #define RULER_UNIT_COUNT 11
63 :
64 : class ImplRulerData
65 : {
66 : friend class Ruler;
67 :
68 : private:
69 : vector<RulerLine> pLines;
70 : vector<RulerBorder> pBorders;
71 : vector<RulerIndent> pIndents;
72 : vector<RulerTab> pTabs;
73 :
74 : long nNullVirOff;
75 : long nRulVirOff;
76 : long nRulWidth;
77 : long nPageOff;
78 : long nPageWidth;
79 : long nNullOff;
80 : long nMargin1;
81 : long nMargin2;
82 : long nLeftFrameMargin;
83 : long nRightFrameMargin;
84 : sal_uInt16 nMargin1Style;
85 : sal_uInt16 nMargin2Style;
86 : bool bAutoPageWidth;
87 : bool bTextRTL;
88 :
89 : public:
90 : ImplRulerData();
91 : ~ImplRulerData();
92 :
93 : ImplRulerData& operator=( const ImplRulerData& rData );
94 : };
95 :
96 11388 : ImplRulerData::ImplRulerData() :
97 : nNullVirOff (0),
98 : nRulVirOff (0),
99 : nRulWidth (0),
100 : nPageOff (0),
101 : nPageWidth (0),
102 : nNullOff (0),
103 : nMargin1 (0),
104 : nMargin2 (0),
105 : nLeftFrameMargin (0),
106 : nRightFrameMargin (0),
107 : nMargin1Style (0),
108 : nMargin2Style (0),
109 : bAutoPageWidth (true), // Page width == EditWin width
110 11388 : bTextRTL (false)
111 : {
112 11388 : }
113 :
114 11372 : ImplRulerData::~ImplRulerData()
115 11372 : {}
116 :
117 0 : ImplRulerData& ImplRulerData::operator=( const ImplRulerData& rData )
118 : {
119 0 : if( this == &rData )
120 0 : return *this;
121 :
122 0 : nNullVirOff = rData.nNullVirOff;
123 0 : nRulVirOff = rData.nRulVirOff;
124 0 : nRulWidth = rData.nRulWidth;
125 0 : nPageOff = rData.nPageOff;
126 0 : nPageWidth = rData.nPageWidth;
127 0 : nNullOff = rData.nNullOff;
128 0 : nMargin1 = rData.nMargin1;
129 0 : nMargin2 = rData.nMargin2;
130 0 : nLeftFrameMargin = rData.nLeftFrameMargin;
131 0 : nRightFrameMargin = rData.nRightFrameMargin;
132 0 : nMargin1Style = rData.nMargin1Style;
133 0 : nMargin2Style = rData.nMargin2Style;
134 0 : bAutoPageWidth = rData.bAutoPageWidth;
135 0 : bTextRTL = rData.bTextRTL;
136 :
137 0 : if ( !rData.pLines.empty() )
138 : {
139 0 : pLines.resize(rData.pLines.size());
140 0 : std::copy(rData.pLines.begin(), rData.pLines.end(), pLines.begin());
141 : }
142 : else
143 : {
144 0 : pLines.clear();
145 : }
146 :
147 0 : if ( !rData.pBorders.empty() )
148 : {
149 0 : pBorders.resize(rData.pBorders.size());
150 0 : std::copy(rData.pBorders.begin(), rData.pBorders.end(), pBorders.begin());
151 : }
152 : else
153 : {
154 0 : pBorders.clear();
155 : }
156 :
157 0 : if ( !rData.pIndents.empty() )
158 : {
159 0 : pIndents.resize(rData.pIndents.size());
160 0 : std::copy(rData.pIndents.begin(), rData.pIndents.end(), pIndents.begin());
161 : }
162 : else
163 : {
164 0 : pIndents.clear();
165 : }
166 :
167 0 : if ( !rData.pTabs.empty() )
168 : {
169 0 : pTabs.resize(rData.pTabs.size());
170 0 : std::copy(rData.pTabs.begin(), rData.pTabs.end(), pTabs.begin());
171 : }
172 : else
173 : {
174 0 : pTabs.clear();
175 : }
176 :
177 0 : return *this;
178 : }
179 :
180 : static const RulerUnitData aImplRulerUnitTab[RULER_UNIT_COUNT] =
181 : {
182 : { MAP_100TH_MM, 100, 25.0, 25.0, 50.0, 100.0, 100, 3, " mm" }, // MM
183 : { MAP_100TH_MM, 1000, 100.0, 500.0, 1000.0, 1000.0, 1000, 3, " cm" }, // CM
184 : { MAP_MM, 1000, 10.0, 250.0, 500.0, 1000.0, 10000, 4, " m" }, // M
185 : { MAP_CM, 100000, 12500.0, 25000.0, 50000.0, 100000.0, 100000, 6, " km" }, // KM
186 : { MAP_1000TH_INCH, 1000, 62.5, 125.0, 500.0, 1000.0, 25400, 3, "\"" }, // INCH
187 : { MAP_100TH_INCH, 1200, 120.0, 120.0, 600.0, 1200.0, 30480, 3, "'" }, // FOOT
188 : { MAP_10TH_INCH, 633600, 63360.0, 63360.0, 316800.0, 633600.0, 1609344, 4, " miles" }, // MILE
189 : { MAP_POINT, 1, 12.0, 12.0, 12.0, 36.0, 353, 2, " pt" }, // POINT
190 : { MAP_100TH_MM, 423, 423.0, 423.0, 423.0, 846.0, 423, 3, " pi" }, // PICA
191 : { MAP_100TH_MM, 371, 371.0, 371.0, 371.0, 743.0, 371, 3, " ch" }, // CHAR
192 : { MAP_100TH_MM, 551, 551.0, 551.0, 551.0, 1102.0, 551, 3, " li" } // LINE
193 : };
194 :
195 : static RulerTabData ruler_tab =
196 : {
197 : 0, // DPIScaleFactor to be set
198 : 7, // ruler_tab_width
199 : 6, // ruler_tab_height
200 : 2, // ruler_tab_height2
201 : 2, // ruler_tab_width2
202 : 8, // ruler_tab_cwidth
203 : 4, // ruler_tab_cwidth2
204 : 4, // ruler_tab_cwidth3
205 : 2, // ruler_tab_cwidth4
206 : 4, // ruler_tab_dheight
207 : 1, // ruler_tab_dheight2
208 : 5, // ruler_tab_dwidth
209 : 3, // ruler_tab_dwidth2
210 : 3, // ruler_tab_dwidth3
211 : 1, // ruler_tab_dwidth4
212 : 5 // ruler_tab_textoff
213 : };
214 :
215 5694 : void Ruler::ImplInit( WinBits nWinBits )
216 : {
217 : // Default WinBits setzen
218 5694 : if ( !(nWinBits & WB_VERT) )
219 : {
220 2847 : nWinBits |= WB_HORZ;
221 :
222 : // --- RTL --- no UI mirroring for horizontal rulers, because
223 : // the document is also not mirrored
224 2847 : EnableRTL( false );
225 : }
226 :
227 : // Initialize variables
228 5694 : mnWinStyle = nWinBits; // Window-Style
229 5694 : mnBorderOff = 0; // Border-Offset
230 5694 : mnWinOff = 0; // EditWinOffset
231 5694 : mnWinWidth = 0; // EditWinWidth
232 5694 : mnWidth = 0; // Window width
233 5694 : mnHeight = 0; // Window height
234 5694 : mnVirOff = 0; // Offset of VirtualDevice from top-left corner
235 5694 : mnVirWidth = 0; // width or height from VirtualDevice
236 5694 : mnVirHeight = 0; // height of width from VirtualDevice
237 5694 : mnDragPos = 0; // Drag-Position (Null point)
238 5694 : mnUpdateEvtId = 0; // Update event was not sent yet
239 5694 : mnDragAryPos = 0; // Drag-Array-Index
240 5694 : mnDragSize = 0; // Did size change at dragging
241 5694 : mnDragModifier = 0; // Modifier key at dragging
242 5694 : mnExtraStyle = 0; // Style of Extra field
243 5694 : mnExtraClicks = 0; // No. of clicks for Extra field
244 5694 : mnExtraModifier = 0; // Modifier key at click in extra field
245 5694 : mnCharWidth = 371;
246 5694 : mnLineHeight = 551;
247 5694 : mbCalc = true; // Should recalculate page width
248 5694 : mbFormat = true; // Should redraw
249 5694 : mbDrag = false; // Currently at dragging
250 5694 : mbDragDelete = false; // Has mouse left the dragging area
251 5694 : mbDragCanceled = false; // Dragging cancelled?
252 5694 : mbAutoWinWidth = true; // EditWinWidth == RulerWidth
253 5694 : mbActive = true; // Is ruler active
254 5694 : mnUpdateFlags = 0; // What needs to be updated
255 5694 : mpData = mpSaveData; // Pointer to normal data
256 5694 : meExtraType = RULER_EXTRA_DONTKNOW; // What is in extra field
257 5694 : meDragType = RULER_TYPE_DONTKNOW; // Which element is dragged
258 :
259 : // Initialize Units
260 5694 : mnUnitIndex = RULER_UNIT_CM;
261 5694 : meUnit = FUNIT_CM;
262 5694 : maZoom = Fraction( 1, 1 );
263 5694 : meSourceUnit = MAP_100TH_MM;
264 :
265 : // Recalculate border widths
266 5694 : if ( nWinBits & WB_BORDER )
267 5694 : mnBorderWidth = 1;
268 : else
269 0 : mnBorderWidth = 0;
270 :
271 : // Settings
272 5694 : ImplInitSettings( true, true, true );
273 :
274 : // Setup the default size
275 5694 : Rectangle aRect;
276 5694 : GetTextBoundRect( aRect, OUString( "0123456789" ) );
277 5694 : long nDefHeight = aRect.GetHeight() + RULER_OFF * 2 + ruler_tab.textoff * 2 + mnBorderWidth;
278 :
279 5694 : Size aDefSize;
280 5694 : if ( nWinBits & WB_HORZ )
281 2847 : aDefSize.Height() = nDefHeight;
282 : else
283 2847 : aDefSize.Width() = nDefHeight;
284 5694 : SetOutputSizePixel( aDefSize );
285 5694 : SetType(WINDOW_RULER);
286 5694 : pAccContext = NULL;
287 5694 : }
288 :
289 5694 : Ruler::Ruler( vcl::Window* pParent, WinBits nWinStyle ) :
290 : Window( pParent, nWinStyle & WB_3DLOOK ),
291 : maVirDev( VclPtr<VirtualDevice>::Create(*this) ),
292 : maMapMode( MAP_100TH_MM ),
293 5694 : mpSaveData(new ImplRulerData),
294 : mpData(NULL),
295 11388 : mpDragData(new ImplRulerData)
296 : {
297 : // Check to see if the ruler constructor has
298 : // already been called before otherwise
299 : // we end up with over-scaled elements
300 5694 : if (ruler_tab.DPIScaleFactor == 0)
301 : {
302 62 : ruler_tab.DPIScaleFactor = GetDPIScaleFactor();
303 62 : ruler_tab.width *= ruler_tab.DPIScaleFactor;
304 62 : ruler_tab.height *= ruler_tab.DPIScaleFactor;
305 62 : ruler_tab.height2 *= ruler_tab.DPIScaleFactor;
306 62 : ruler_tab.width2 *= ruler_tab.DPIScaleFactor;
307 62 : ruler_tab.cwidth *= ruler_tab.DPIScaleFactor;
308 62 : ruler_tab.cwidth2 *= ruler_tab.DPIScaleFactor;
309 62 : ruler_tab.cwidth3 *= ruler_tab.DPIScaleFactor;
310 62 : ruler_tab.cwidth4 *= ruler_tab.DPIScaleFactor;
311 62 : ruler_tab.dheight *= ruler_tab.DPIScaleFactor;
312 62 : ruler_tab.dheight2 *= ruler_tab.DPIScaleFactor;
313 62 : ruler_tab.dwidth *= ruler_tab.DPIScaleFactor;
314 62 : ruler_tab.dwidth2 *= ruler_tab.DPIScaleFactor;
315 62 : ruler_tab.dwidth3 *= ruler_tab.DPIScaleFactor;
316 62 : ruler_tab.dwidth4 *= ruler_tab.DPIScaleFactor;
317 62 : ruler_tab.textoff *= ruler_tab.DPIScaleFactor;
318 : }
319 :
320 :
321 5694 : ImplInit( nWinStyle );
322 5694 : }
323 :
324 11372 : Ruler::~Ruler()
325 : {
326 5686 : disposeOnce();
327 5686 : }
328 :
329 5686 : void Ruler::dispose()
330 : {
331 5686 : if ( mnUpdateEvtId )
332 0 : Application::RemoveUserEvent( mnUpdateEvtId );
333 5686 : delete mpSaveData;
334 5686 : mpSaveData = NULL;
335 5686 : delete mpDragData;
336 5686 : mpDragData = NULL;
337 5686 : if( pAccContext )
338 : {
339 5 : pAccContext->release();
340 5 : pAccContext = NULL;
341 : }
342 5686 : Window::dispose();
343 5686 : }
344 :
345 23045 : void Ruler::ImplVDrawLine(vcl::RenderContext& rRenderContext, long nX1, long nY1, long nX2, long nY2)
346 : {
347 23045 : if ( nX1 < -RULER_CLIP )
348 : {
349 42 : nX1 = -RULER_CLIP;
350 42 : if ( nX2 < -RULER_CLIP )
351 0 : return;
352 : }
353 23045 : long nClip = mnVirWidth + RULER_CLIP;
354 23045 : if ( nX2 > nClip )
355 : {
356 124 : nX2 = nClip;
357 124 : if ( nX1 > nClip )
358 40 : return;
359 : }
360 :
361 23005 : if ( mnWinStyle & WB_HORZ )
362 22556 : rRenderContext.DrawLine( Point( nX1, nY1 ), Point( nX2, nY2 ) );
363 : else
364 449 : rRenderContext.DrawLine( Point( nY1, nX1 ), Point( nY2, nX2 ) );
365 : }
366 :
367 745703 : void Ruler::ImplVDrawRect(vcl::RenderContext& rRenderContext, long nX1, long nY1, long nX2, long nY2)
368 : {
369 745703 : if ( nX1 < -RULER_CLIP )
370 : {
371 42 : nX1 = -RULER_CLIP;
372 42 : if ( nX2 < -RULER_CLIP )
373 0 : return;
374 : }
375 745703 : long nClip = mnVirWidth + RULER_CLIP;
376 745703 : if ( nX2 > nClip )
377 : {
378 819 : nX2 = nClip;
379 819 : if ( nX1 > nClip )
380 769 : return;
381 : }
382 :
383 744934 : if ( mnWinStyle & WB_HORZ )
384 738924 : rRenderContext.DrawRect(Rectangle(nX1, nY1, nX2, nY2));
385 : else
386 6010 : rRenderContext.DrawRect(Rectangle(nY1, nX1, nY2, nX2));
387 : }
388 :
389 158232 : void Ruler::ImplVDrawText(vcl::RenderContext& rRenderContext, long nX, long nY, const OUString& rText, long nMin, long nMax)
390 : {
391 158232 : Rectangle aRect;
392 158232 : rRenderContext.GetTextBoundRect(aRect, rText);
393 :
394 158232 : long nShiftX = ( aRect.GetWidth() / 2 ) + aRect.Left();
395 158232 : long nShiftY = ( aRect.GetHeight() / 2 ) + aRect.Top();
396 :
397 158232 : if ( (nX > -RULER_CLIP) && (nX < mnVirWidth + RULER_CLIP) && ( nX < nMax - nShiftX ) && ( nX > nMin + nShiftX ) )
398 : {
399 78880 : if ( mnWinStyle & WB_HORZ )
400 77108 : rRenderContext.DrawText(Point(nX - nShiftX, nY - nShiftY), rText);
401 : else
402 1772 : rRenderContext.DrawText(Point(nY - nShiftX, nX - nShiftY), rText);
403 : }
404 158232 : }
405 :
406 10872 : void Ruler::ImplInvertLines(vcl::RenderContext& rRenderContext, bool bErase)
407 : {
408 : // Position lines
409 10872 : if (!mpData->pLines.empty() && mbActive && !mbDrag && !mbFormat && !(mnUpdateFlags & RULER_UPDATE_LINES) )
410 : {
411 0 : long nNullWinOff = mpData->nNullVirOff + mnVirOff;
412 0 : long nRulX1 = mpData->nRulVirOff + mnVirOff;
413 0 : long nRulX2 = nRulX1 + mpData->nRulWidth;
414 0 : long nY = (RULER_OFF * 2) + mnVirHeight - 1;
415 :
416 : // Calculate rectangle
417 0 : Rectangle aRect;
418 0 : if (mnWinStyle & WB_HORZ)
419 0 : aRect.Bottom() = nY;
420 : else
421 0 : aRect.Right() = nY;
422 :
423 : // Draw lines
424 0 : for (size_t i = 0; i < mpData->pLines.size(); i++)
425 : {
426 0 : const long n = mpData->pLines[i].nPos + nNullWinOff;
427 0 : if ((n >= nRulX1) && (n < nRulX2))
428 : {
429 0 : if (mnWinStyle & WB_HORZ )
430 : {
431 0 : aRect.Left() = n;
432 0 : aRect.Right() = n;
433 : }
434 : else
435 : {
436 0 : aRect.Top() = n;
437 0 : aRect.Bottom() = n;
438 : }
439 0 : if (bErase)
440 : {
441 0 : Rectangle aTempRect = aRect;
442 :
443 0 : if (mnWinStyle & WB_HORZ)
444 0 : aTempRect.Bottom() = RULER_OFF - 1;
445 : else
446 0 : aTempRect.Right() = RULER_OFF - 1;
447 :
448 0 : rRenderContext.Erase(aTempRect);
449 :
450 0 : if (mnWinStyle & WB_HORZ)
451 : {
452 0 : aTempRect.Bottom() = aRect.Bottom();
453 0 : aTempRect.Top() = aTempRect.Bottom() - RULER_OFF + 1;
454 : }
455 : else
456 : {
457 0 : aTempRect.Right() = aRect.Right();
458 0 : aTempRect.Left() = aTempRect.Right() - RULER_OFF + 1;
459 : }
460 0 : rRenderContext.Erase(aTempRect);
461 : }
462 0 : Invert(aRect);
463 : }
464 : }
465 0 : mnUpdateFlags = 0;
466 : }
467 10872 : }
468 :
469 10751 : void Ruler::ImplDrawTicks(vcl::RenderContext& rRenderContext, long nMin, long nMax, long nStart, long nTop, long nBottom)
470 : {
471 10751 : double nCenter = nTop + ((nBottom - nTop) / 2);
472 :
473 10751 : long nTickLength3 = (nBottom - nTop) * 0.5;
474 10751 : long nTickLength2 = nTickLength3 * 0.66;
475 10751 : long nTickLength1 = nTickLength2 * 0.66;
476 :
477 10751 : long nScale = ruler_tab.DPIScaleFactor;
478 10751 : long DPIOffset = nScale - 1;
479 :
480 10751 : double nTick4 = aImplRulerUnitTab[mnUnitIndex].nTick4;
481 10751 : double nTick2 = 0;
482 10751 : double nTickCount = aImplRulerUnitTab[mnUnitIndex].nTick1 / nScale;
483 10751 : double nTickUnit = 0;
484 : long nTickWidth;
485 10751 : bool bNoTicks = false;
486 :
487 10751 : double nAcceptanceDelta = 0.0001;
488 :
489 10751 : Size aPixSize = rRenderContext.LogicToPixel(Size(nTick4, nTick4), maMapMode);
490 :
491 10751 : if (mnUnitIndex == RULER_UNIT_CHAR)
492 : {
493 0 : if (mnCharWidth == 0)
494 0 : mnCharWidth = 371;
495 0 : nTick4 = mnCharWidth * 2;
496 0 : nTick2 = mnCharWidth;
497 0 : nTickCount = mnCharWidth;
498 0 : nTickUnit = mnCharWidth;
499 : }
500 10751 : else if (mnUnitIndex == RULER_UNIT_LINE)
501 : {
502 0 : if (mnLineHeight == 0)
503 0 : mnLineHeight = 551;
504 0 : nTick4 = mnLineHeight * 2;
505 0 : nTick2 = mnLineHeight;
506 0 : nTickUnit = mnLineHeight;
507 0 : nTickCount = mnLineHeight;
508 : }
509 :
510 10751 : if (mnWinStyle & WB_HORZ)
511 : {
512 10633 : nTickWidth = aPixSize.Width();
513 : }
514 : else
515 : {
516 118 : vcl::Font aFont = rRenderContext.GetFont();
517 118 : if (mnWinStyle & WB_RIGHT_ALIGNED)
518 1 : aFont.SetOrientation(2700);
519 : else
520 117 : aFont.SetOrientation(900);
521 118 : rRenderContext.SetFont(aFont);
522 118 : nTickWidth = aPixSize.Height();
523 : }
524 :
525 10751 : long nMaxWidth = rRenderContext.PixelToLogic(Size(mpData->nPageWidth, 0), maMapMode).Width();
526 10751 : if (nMaxWidth < 0)
527 0 : nMaxWidth = -nMaxWidth;
528 :
529 10751 : if ((mnUnitIndex == RULER_UNIT_CHAR) || (mnUnitIndex == RULER_UNIT_LINE))
530 0 : nMaxWidth /= nTickUnit;
531 : else
532 10751 : nMaxWidth /= aImplRulerUnitTab[mnUnitIndex].nTickUnit;
533 :
534 10751 : OUString aNumString = OUString::number(nMaxWidth);
535 10751 : long nTxtWidth = rRenderContext.GetTextWidth( aNumString );
536 10751 : const long nTextOff = 4;
537 :
538 : // Determine the number divider for ruler drawn numbers - means which numbers
539 : // should be shown on the ruler and which should be skipped because the ruler
540 : // is not big enough to draw them
541 10751 : if (nTickWidth < nTxtWidth + nTextOff)
542 : {
543 : // Calculate the scale of the ruler
544 6 : long nMulti = 1;
545 6 : long nOrgTick4 = nTick4;
546 :
547 26 : while (nTickWidth < nTxtWidth + nTextOff)
548 : {
549 14 : long nOldMulti = nMulti;
550 14 : if (nTickWidth == 0)
551 0 : nMulti *= 10;
552 14 : else if (nMulti < 10)
553 14 : nMulti++;
554 0 : else if (nMulti < 100)
555 0 : nMulti += 10;
556 0 : else if (nMulti < 1000)
557 0 : nMulti += 100;
558 : else
559 0 : nMulti += 1000;
560 :
561 : // Overflow - in this case don't draw ticks and exit
562 14 : if (nMulti < nOldMulti)
563 : {
564 0 : bNoTicks = true;
565 0 : break;
566 : }
567 :
568 14 : nTick4 = nOrgTick4 * nMulti;
569 14 : aPixSize = rRenderContext.LogicToPixel(Size(nTick4, nTick4), maMapMode);
570 14 : if (mnWinStyle & WB_HORZ)
571 8 : nTickWidth = aPixSize.Width();
572 : else
573 6 : nTickWidth = aPixSize.Height();
574 : }
575 6 : nTickCount = nTick4;
576 : }
577 : else
578 : {
579 10745 : rRenderContext.SetLineColor(rRenderContext.GetSettings().GetStyleSettings().GetShadowColor());
580 : }
581 :
582 10751 : if (!bNoTicks)
583 : {
584 10751 : long n = 0;
585 10751 : double nTick = 0.0;
586 10751 : double nTick3 = 0;
587 :
588 10751 : if ((mnUnitIndex != RULER_UNIT_CHAR) && (mnUnitIndex != RULER_UNIT_LINE))
589 : {
590 10751 : nTick2 = aImplRulerUnitTab[mnUnitIndex].nTick2;
591 10751 : nTick3 = aImplRulerUnitTab[mnUnitIndex].nTick3;
592 : }
593 :
594 10751 : Size nTickGapSize;
595 :
596 10751 : nTickGapSize = rRenderContext.LogicToPixel(Size(nTickCount, nTickCount), maMapMode);
597 10751 : long nTickGap1 = mnWinStyle & WB_HORZ ? nTickGapSize.Width() : nTickGapSize.Height();
598 10751 : nTickGapSize = rRenderContext.LogicToPixel(Size(nTick2, nTick2), maMapMode);
599 10751 : long nTickGap2 = mnWinStyle & WB_HORZ ? nTickGapSize.Width() : nTickGapSize.Height();
600 10751 : nTickGapSize = rRenderContext.LogicToPixel(Size(nTick3, nTick3), maMapMode);
601 10751 : long nTickGap3 = mnWinStyle & WB_HORZ ? nTickGapSize.Width() : nTickGapSize.Height();
602 :
603 1393022 : while (((nStart - n) >= nMin) || ((nStart + n) <= nMax))
604 : {
605 : // Null point
606 1371520 : if (nTick == 0.0)
607 : {
608 10751 : if (nStart > nMin)
609 : {
610 : // 0 is only painted when Margin1 is not equal to zero
611 375 : if ((mpData->nMargin1Style & RULER_STYLE_INVISIBLE) || (mpData->nMargin1 != 0))
612 : {
613 4 : aNumString = "0";
614 4 : ImplVDrawText(rRenderContext, nStart, nCenter, aNumString);
615 : }
616 : }
617 : }
618 : else
619 : {
620 1360769 : aPixSize = rRenderContext.LogicToPixel(Size(nTick, nTick), maMapMode);
621 :
622 1360769 : if (mnWinStyle & WB_HORZ)
623 1331716 : n = aPixSize.Width();
624 : else
625 29053 : n = aPixSize.Height();
626 :
627 : // Tick4 - Output (Text)
628 1360769 : double aStep = (nTick / nTick4);
629 1360769 : double aRest = std::abs(aStep - std::floor(aStep));
630 :
631 1360769 : if (aRest < nAcceptanceDelta)
632 : {
633 79114 : if ((mnUnitIndex == RULER_UNIT_CHAR) || (mnUnitIndex == RULER_UNIT_LINE))
634 0 : aNumString = OUString::number(nTick / nTickUnit);
635 : else
636 79114 : aNumString = OUString::number(nTick / aImplRulerUnitTab[mnUnitIndex].nTickUnit);
637 :
638 79114 : long nHorizontalLocation = nStart + n;
639 79114 : ImplVDrawText(rRenderContext, nHorizontalLocation, nCenter, aNumString, nMin, nMax);
640 :
641 79114 : if (nMin < nHorizontalLocation && nHorizontalLocation < nMax)
642 : {
643 79086 : ImplVDrawRect(rRenderContext, nHorizontalLocation, nBottom, nHorizontalLocation + DPIOffset, nBottom - 1 * nScale);
644 79086 : ImplVDrawRect(rRenderContext, nHorizontalLocation, nTop, nHorizontalLocation + DPIOffset, nTop + 1 * nScale);
645 : }
646 :
647 79114 : nHorizontalLocation = nStart - n;
648 79114 : ImplVDrawText(rRenderContext, nHorizontalLocation, nCenter, aNumString, nMin, nMax);
649 :
650 79114 : if (nMin < nHorizontalLocation && nHorizontalLocation < nMax)
651 : {
652 : ImplVDrawRect(rRenderContext, nHorizontalLocation, nBottom,
653 111 : nHorizontalLocation + DPIOffset, nBottom - 1 * nScale);
654 : ImplVDrawRect(rRenderContext, nHorizontalLocation, nTop,
655 111 : nHorizontalLocation + DPIOffset, nTop + 1 * nScale);
656 : }
657 : }
658 : // Tick/Tick2 - Output (Strokes)
659 : else
660 : {
661 1281655 : long nTickLength = nTickLength1;
662 :
663 1281655 : aStep = (nTick / nTick2);
664 1281655 : aRest = std::abs(aStep - std::floor(aStep));
665 1281655 : if (aRest < nAcceptanceDelta)
666 596606 : nTickLength = nTickLength2;
667 :
668 1281655 : aStep = (nTick / nTick3);
669 1281655 : aRest = std::abs(aStep - std::floor(aStep));
670 1281655 : if (aRest < nAcceptanceDelta )
671 87293 : nTickLength = nTickLength3;
672 :
673 1281655 : if ((nTickLength == nTickLength1 && nTickGap1 > 6) ||
674 509313 : (nTickLength == nTickLength2 && nTickGap2 > 6) ||
675 87293 : (nTickLength == nTickLength3 && nTickGap3 > 6))
676 : {
677 576494 : long nT1 = nCenter - (nTickLength / 2.0);
678 576494 : long nT2 = nT1 + nTickLength - 1;
679 : long nT;
680 :
681 576494 : nT = nStart + n;
682 :
683 576494 : if (nT < nMax)
684 574017 : ImplVDrawRect(rRenderContext, nT, nT1, nT + DPIOffset, nT2);
685 576494 : nT = nStart - n;
686 576494 : if (nT > nMin)
687 1791 : ImplVDrawRect(rRenderContext, nT, nT1, nT + DPIOffset, nT2);
688 : }
689 : }
690 : }
691 1371520 : nTick += nTickCount;
692 : }
693 10751 : }
694 10751 : }
695 :
696 2 : void Ruler::ImplDrawBorders(vcl::RenderContext& rRenderContext, long nMin, long nMax, long nVirTop, long nVirBottom)
697 : {
698 2 : const StyleSettings& rStyleSettings = rRenderContext.GetSettings().GetStyleSettings();
699 : long n;
700 : long n1;
701 : long n2;
702 : long nTemp1;
703 : long nTemp2;
704 : sal_uInt32 i;
705 :
706 4 : for (i = 0; i < mpData->pBorders.size(); i++)
707 : {
708 2 : if (mpData->pBorders[i].nStyle & RULER_STYLE_INVISIBLE)
709 0 : continue;
710 :
711 2 : n1 = mpData->pBorders[i].nPos + mpData->nNullVirOff;
712 2 : n2 = n1 + mpData->pBorders[i].nWidth;
713 :
714 2 : if (((n1 >= nMin) && (n1 <= nMax)) || ((n2 >= nMin) && (n2 <= nMax)))
715 : {
716 2 : if ((n2 - n1) > 3)
717 : {
718 0 : rRenderContext.SetLineColor();
719 0 : rRenderContext.SetFillColor(rStyleSettings.GetFaceColor());
720 0 : ImplVDrawRect(rRenderContext, n1, nVirTop, n2, nVirBottom);
721 :
722 0 : rRenderContext.SetLineColor(rStyleSettings.GetLightColor());
723 0 : ImplVDrawLine(rRenderContext, n1 + 1, nVirTop, n1 + 1, nVirBottom);
724 0 : ImplVDrawLine(rRenderContext, n1, nVirTop, n2, nVirTop);
725 :
726 0 : rRenderContext.SetLineColor(rStyleSettings.GetShadowColor());
727 0 : ImplVDrawLine(rRenderContext, n1, nVirTop, n1, nVirBottom);
728 0 : ImplVDrawLine(rRenderContext, n1, nVirBottom, n2, nVirBottom);
729 0 : ImplVDrawLine(rRenderContext, n2 - 1, nVirTop, n2 - 1, nVirBottom);
730 :
731 0 : rRenderContext.SetLineColor(rStyleSettings.GetDarkShadowColor());
732 0 : ImplVDrawLine(rRenderContext, n2, nVirTop, n2, nVirBottom);
733 :
734 0 : if (mpData->pBorders[i].nStyle & RULER_BORDER_VARIABLE)
735 : {
736 0 : if (n2 - n1 > RULER_VAR_SIZE + 4)
737 : {
738 0 : nTemp1 = n1 + (((n2 - n1 + 1) - RULER_VAR_SIZE) / 2);
739 0 : nTemp2 = nVirTop + (((nVirBottom - nVirTop + 1) - RULER_VAR_SIZE) / 2);
740 0 : long nTemp3 = nTemp1 + RULER_VAR_SIZE - 1;
741 0 : long nTemp4 = nTemp2 + RULER_VAR_SIZE - 1;
742 0 : long nTempY = nTemp2;
743 :
744 0 : rRenderContext.SetLineColor(rStyleSettings.GetLightColor());
745 0 : while (nTempY <= nTemp4)
746 : {
747 0 : ImplVDrawLine(rRenderContext, nTemp1, nTempY, nTemp3, nTempY);
748 0 : nTempY += 2;
749 : }
750 :
751 0 : nTempY = nTemp2 + 1;
752 0 : rRenderContext.SetLineColor(rStyleSettings.GetShadowColor());
753 0 : while (nTempY <= nTemp4)
754 : {
755 0 : ImplVDrawLine(rRenderContext, nTemp1, nTempY, nTemp3, nTempY);
756 0 : nTempY += 2;
757 : }
758 : }
759 : }
760 :
761 0 : if (mpData->pBorders[i].nStyle & RULER_BORDER_SIZEABLE)
762 : {
763 0 : if (n2 - n1 > RULER_VAR_SIZE + 10)
764 : {
765 0 : rRenderContext.SetLineColor(rStyleSettings.GetShadowColor());
766 0 : ImplVDrawLine(rRenderContext, n1 + 4, nVirTop + 3, n1 + 4, nVirBottom - 3);
767 0 : ImplVDrawLine(rRenderContext, n2 - 5, nVirTop + 3, n2 - 5, nVirBottom - 3);
768 0 : rRenderContext.SetLineColor(rStyleSettings.GetLightColor());
769 0 : ImplVDrawLine(rRenderContext, n1 + 5, nVirTop + 3, n1 + 5, nVirBottom - 3);
770 0 : ImplVDrawLine(rRenderContext, n2 - 4, nVirTop + 3, n2 - 4, nVirBottom - 3);
771 : }
772 : }
773 : }
774 : else
775 : {
776 2 : n = n1 + ((n2 - n1) / 2);
777 2 : rRenderContext.SetLineColor(rStyleSettings.GetShadowColor());
778 :
779 2 : if (mpData->pBorders[i].nStyle & RULER_BORDER_SNAP)
780 0 : ImplVDrawLine(rRenderContext, n, nVirTop, n, nVirBottom);
781 2 : else if (mpData->pBorders[i].nStyle & RULER_BORDER_MARGIN)
782 0 : ImplVDrawLine(rRenderContext, n, nVirTop, n, nVirBottom);
783 : else
784 : {
785 2 : ImplVDrawLine(rRenderContext, n - 1, nVirTop, n - 1, nVirBottom);
786 2 : ImplVDrawLine(rRenderContext, n + 1, nVirTop, n + 1, nVirBottom);
787 2 : rRenderContext.SetLineColor();
788 2 : rRenderContext.SetFillColor(rStyleSettings.GetWindowColor());
789 2 : ImplVDrawRect(rRenderContext, n, nVirTop, n, nVirBottom);
790 : }
791 : }
792 : }
793 : }
794 2 : }
795 :
796 957 : void Ruler::ImplDrawIndent(vcl::RenderContext& rRenderContext, const Polygon& rPoly, sal_uInt16 nStyle, bool bIsHit)
797 : {
798 957 : const StyleSettings& rStyleSettings = rRenderContext.GetSettings().GetStyleSettings();
799 :
800 957 : if (nStyle & RULER_STYLE_INVISIBLE)
801 957 : return;
802 :
803 957 : rRenderContext.SetLineColor(rStyleSettings.GetDarkShadowColor());
804 957 : rRenderContext.SetFillColor(bIsHit ? rStyleSettings.GetDarkShadowColor() : rStyleSettings.GetWorkspaceColor());
805 957 : rRenderContext.DrawPolygon(rPoly);
806 : }
807 :
808 323 : void Ruler::ImplDrawIndents(vcl::RenderContext& rRenderContext, long nMin, long nMax, long nVirTop, long nVirBottom)
809 : {
810 : sal_uInt32 j;
811 : long n;
812 323 : long nIndentHeight = (mnVirHeight / 2) - 1;
813 323 : long nIndentWidth2 = nIndentHeight-3;
814 :
815 323 : Polygon aPoly(5);
816 :
817 1292 : for (j = 0; j < mpData->pIndents.size(); j++)
818 : {
819 969 : if (mpData->pIndents[j].nStyle & RULER_STYLE_INVISIBLE)
820 0 : continue;
821 :
822 969 : sal_uInt16 nStyle = mpData->pIndents[j].nStyle;
823 969 : sal_uInt16 nIndentStyle = nStyle & RULER_INDENT_STYLE;
824 :
825 969 : n = mpData->pIndents[j].nPos+mpData->nNullVirOff;
826 :
827 969 : if ((n >= nMin) && (n <= nMax))
828 : {
829 957 : if (nIndentStyle == RULER_INDENT_BORDER)
830 : {
831 0 : const StyleSettings& rStyleSettings = rRenderContext.GetSettings().GetStyleSettings();
832 0 : rRenderContext.SetLineColor(rStyleSettings.GetShadowColor());
833 0 : ImplVDrawLine(rRenderContext, n, nVirTop + 1, n, nVirBottom - 1);
834 : }
835 957 : else if (nIndentStyle == RULER_INDENT_BOTTOM)
836 : {
837 640 : aPoly.SetPoint(Point(n + 0, nVirBottom - nIndentHeight), 0);
838 640 : aPoly.SetPoint(Point(n - nIndentWidth2, nVirBottom - 3), 1);
839 640 : aPoly.SetPoint(Point(n - nIndentWidth2, nVirBottom), 2);
840 640 : aPoly.SetPoint(Point(n + nIndentWidth2, nVirBottom), 3);
841 640 : aPoly.SetPoint(Point(n + nIndentWidth2, nVirBottom - 3), 4);
842 : }
843 : else
844 : {
845 317 : aPoly.SetPoint(Point(n + 0, nVirTop + nIndentHeight), 0);
846 317 : aPoly.SetPoint(Point(n - nIndentWidth2, nVirTop + 3), 1);
847 317 : aPoly.SetPoint(Point(n - nIndentWidth2, nVirTop), 2);
848 317 : aPoly.SetPoint(Point(n + nIndentWidth2, nVirTop), 3);
849 317 : aPoly.SetPoint(Point(n + nIndentWidth2, nVirTop + 3), 4);
850 : }
851 :
852 957 : if (0 == (mnWinStyle & WB_HORZ))
853 : {
854 0 : Point aTmp;
855 0 : for (sal_uInt16 i = 0; i < 5; i++)
856 : {
857 0 : aTmp = aPoly[i];
858 0 : Point aSet(nVirBottom - aTmp.Y(), aTmp.X());
859 0 : aPoly[i] = aSet;
860 : }
861 : }
862 957 : if (RULER_INDENT_BORDER != nIndentStyle)
863 : {
864 957 : bool bIsHit = false;
865 957 : if(mxCurrentHitTest.get() != NULL && mxCurrentHitTest->eType == RULER_TYPE_INDENT)
866 : {
867 0 : bIsHit = mxCurrentHitTest->nAryPos == j;
868 : }
869 957 : else if(mbDrag && meDragType == RULER_TYPE_INDENT)
870 : {
871 0 : bIsHit = mnDragAryPos == j;
872 : }
873 957 : ImplDrawIndent(rRenderContext, aPoly, nStyle, bIsHit);
874 : }
875 : }
876 323 : }
877 323 : }
878 :
879 10567 : static void ImplCenterTabPos(Point& rPos, sal_uInt16 nTabStyle)
880 : {
881 10567 : bool bRTL = 0 != (nTabStyle & RULER_TAB_RTL);
882 10567 : nTabStyle &= RULER_TAB_STYLE;
883 10567 : rPos.Y() += ruler_tab.height/2;
884 :
885 10567 : if ( (!bRTL && nTabStyle == RULER_TAB_LEFT) ||
886 0 : ( bRTL && nTabStyle == RULER_TAB_RIGHT) )
887 : {
888 10567 : rPos.X() -= ruler_tab.width / 2;
889 : }
890 0 : else if ( (!bRTL && nTabStyle == RULER_TAB_RIGHT) ||
891 0 : ( bRTL && nTabStyle == RULER_TAB_LEFT) )
892 : {
893 0 : rPos.X() += ruler_tab.width / 2;
894 : }
895 10567 : }
896 :
897 0 : static void lcl_RotateRect_Impl(Rectangle& rRect, const long nReference, bool bRightAligned)
898 : {
899 0 : if (!rRect.IsEmpty())
900 : {
901 0 : Rectangle aTmp(rRect);
902 0 : rRect.Top() = aTmp.Left();
903 0 : rRect.Bottom() = aTmp.Right();
904 0 : rRect.Left() = aTmp.Top();
905 0 : rRect.Right() = aTmp.Bottom();
906 :
907 0 : if (bRightAligned)
908 : {
909 0 : long nRef = 2 * nReference;
910 0 : rRect.Left() = nRef - rRect.Left();
911 0 : rRect.Right() = nRef - rRect.Right();
912 : }
913 : }
914 0 : }
915 :
916 14211 : static void ImplDrawRulerTab(vcl::RenderContext& rRenderContext, const Point& rPos,
917 : sal_uInt16 nStyle, WinBits nWinBits)
918 : {
919 14211 : if (nStyle & RULER_STYLE_INVISIBLE)
920 14211 : return;
921 :
922 14211 : sal_uInt16 nTabStyle = nStyle & RULER_TAB_STYLE;
923 14211 : bool bRTL = 0 != (nStyle & RULER_TAB_RTL);
924 :
925 : // Scale by the screen DPI scaling factor
926 : // However when doing this some of the rectangles
927 : // drawn become asymmetric due to the +1 offsets
928 14211 : sal_uInt16 DPIOffset = rRenderContext.GetDPIScaleFactor() - 1;
929 :
930 14211 : Rectangle aRect1;
931 14211 : Rectangle aRect2;
932 14211 : Rectangle aRect3;
933 :
934 14211 : aRect3.SetEmpty();
935 :
936 14211 : if (nTabStyle == RULER_TAB_DEFAULT)
937 : {
938 3644 : aRect1.Left() = rPos.X() - ruler_tab.dwidth2 + 1;
939 3644 : aRect1.Top() = rPos.Y() - ruler_tab.dheight2 + 1;
940 3644 : aRect1.Right() = rPos.X() - ruler_tab.dwidth2 + ruler_tab.dwidth + DPIOffset;
941 3644 : aRect1.Bottom() = rPos.Y();
942 :
943 3644 : aRect2.Left() = rPos.X() - ruler_tab.dwidth2 + ruler_tab.dwidth3;
944 3644 : aRect2.Top() = rPos.Y() - ruler_tab.dheight + 1;
945 3644 : aRect2.Right() = rPos.X() - ruler_tab.dwidth2 + ruler_tab.dwidth3 + ruler_tab.dwidth4 - 1;
946 3644 : aRect2.Bottom() = rPos.Y();
947 :
948 : }
949 10567 : else if ((!bRTL && nTabStyle == RULER_TAB_LEFT) || (bRTL && nTabStyle == RULER_TAB_RIGHT))
950 : {
951 10567 : aRect1.Left() = rPos.X();
952 10567 : aRect1.Top() = rPos.Y() - ruler_tab.height2 + 1;
953 10567 : aRect1.Right() = rPos.X() + ruler_tab.width - 1;
954 10567 : aRect1.Bottom() = rPos.Y();
955 :
956 10567 : aRect2.Left() = rPos.X();
957 10567 : aRect2.Top() = rPos.Y() - ruler_tab.height + 1;
958 10567 : aRect2.Right() = rPos.X() + ruler_tab.width2 - 1;
959 10567 : aRect2.Bottom() = rPos.Y();
960 : }
961 0 : else if ((!bRTL && nTabStyle == RULER_TAB_RIGHT) || (bRTL && nTabStyle == RULER_TAB_LEFT))
962 : {
963 0 : aRect1.Left() = rPos.X() - ruler_tab.width + 1;
964 0 : aRect1.Top() = rPos.Y() - ruler_tab.height2 + 1;
965 0 : aRect1.Right() = rPos.X();
966 0 : aRect1.Bottom() = rPos.Y();
967 :
968 0 : aRect2.Left() = rPos.X() - ruler_tab.width2 + 1;
969 0 : aRect2.Top() = rPos.Y() - ruler_tab.height + 1;
970 0 : aRect2.Right() = rPos.X();
971 0 : aRect2.Bottom() = rPos.Y();
972 : }
973 : else
974 : {
975 0 : aRect1.Left() = rPos.X() - ruler_tab.cwidth2 + 1;
976 0 : aRect1.Top() = rPos.Y() - ruler_tab.height2 + 1;
977 0 : aRect1.Right() = rPos.X() - ruler_tab.cwidth2 + ruler_tab.cwidth + DPIOffset;
978 0 : aRect1.Bottom() = rPos.Y();
979 :
980 0 : aRect2.Left() = rPos.X() - ruler_tab.cwidth2 + ruler_tab.cwidth3;
981 0 : aRect2.Top() = rPos.Y() - ruler_tab.height + 1;
982 0 : aRect2.Right() = rPos.X() - ruler_tab.cwidth2 + ruler_tab.cwidth3 + ruler_tab.cwidth4 - 1;
983 0 : aRect2.Bottom() = rPos.Y();
984 :
985 0 : if (nTabStyle == RULER_TAB_DECIMAL)
986 : {
987 0 : aRect3.Left() = rPos.X() - ruler_tab.cwidth2 + ruler_tab.cwidth - 1;
988 0 : aRect3.Top() = rPos.Y() - ruler_tab.height + 1 + 1 - DPIOffset;
989 0 : aRect3.Right() = rPos.X() - ruler_tab.cwidth2 + ruler_tab.cwidth + DPIOffset;
990 0 : aRect3.Bottom() = rPos.Y() - ruler_tab.height + 1 + 2;
991 : }
992 : }
993 14211 : if (0 == (nWinBits & WB_HORZ))
994 : {
995 0 : bool bRightAligned = 0 != (nWinBits & WB_RIGHT_ALIGNED);
996 0 : lcl_RotateRect_Impl(aRect1, rPos.Y(), bRightAligned);
997 0 : lcl_RotateRect_Impl(aRect2, rPos.Y(), bRightAligned);
998 0 : lcl_RotateRect_Impl(aRect3, rPos.Y(), bRightAligned);
999 : }
1000 14211 : rRenderContext.DrawRect(aRect1);
1001 14211 : rRenderContext.DrawRect(aRect2);
1002 :
1003 14211 : if (!aRect3.IsEmpty())
1004 0 : rRenderContext.DrawRect(aRect3);
1005 : }
1006 :
1007 14211 : void Ruler::ImplDrawTab(vcl::RenderContext& rRenderContext, const Point& rPos, sal_uInt16 nStyle)
1008 : {
1009 14211 : if (nStyle & RULER_STYLE_INVISIBLE)
1010 14211 : return;
1011 :
1012 14211 : rRenderContext.SetLineColor();
1013 :
1014 14211 : if (nStyle & RULER_STYLE_DONTKNOW)
1015 0 : rRenderContext.SetFillColor(rRenderContext.GetSettings().GetStyleSettings().GetFaceColor());
1016 : else
1017 14211 : rRenderContext.SetFillColor(rRenderContext.GetSettings().GetStyleSettings().GetDarkShadowColor());
1018 :
1019 14211 : if (mpData->bTextRTL)
1020 0 : nStyle |= RULER_TAB_RTL;
1021 :
1022 14211 : ImplDrawRulerTab(rRenderContext, rPos, nStyle, GetStyle());
1023 : }
1024 :
1025 282 : void Ruler::ImplDrawTabs(vcl::RenderContext& rRenderContext, long nMin, long nMax, long nVirTop, long nVirBottom)
1026 : {
1027 3928 : for (size_t i = 0; i < mpData->pTabs.size(); i++)
1028 : {
1029 3646 : if (mpData->pTabs[i].nStyle & RULER_STYLE_INVISIBLE)
1030 0 : continue;
1031 :
1032 : long aPosition;
1033 3646 : aPosition = mpData->pTabs[i].nPos;
1034 3646 : aPosition += +mpData->nNullVirOff;
1035 3646 : long nTopBottom = (GetStyle() & WB_RIGHT_ALIGNED) ? nVirTop : nVirBottom;
1036 3646 : if (nMin <= aPosition && aPosition <= nMax)
1037 3644 : ImplDrawTab(rRenderContext, Point( aPosition, nTopBottom ), mpData->pTabs[i].nStyle);
1038 : }
1039 282 : }
1040 :
1041 33252 : static int adjustSize(int nOrig)
1042 : {
1043 33252 : if (nOrig <= 0)
1044 16626 : return 0;
1045 :
1046 : // make sure we return an odd number, that looks better in the ruler
1047 16626 : return ( (3*nOrig) / 8) * 2 + 1;
1048 : }
1049 :
1050 10872 : void Ruler::ApplySettings(vcl::RenderContext& rRenderContext)
1051 : {
1052 10872 : const StyleSettings& rStyleSettings = rRenderContext.GetSettings().GetStyleSettings();
1053 :
1054 10872 : vcl::Font aFont = rStyleSettings.GetToolFont();
1055 : // make the font a bit smaller than default
1056 10872 : Size aSize(adjustSize(aFont.GetSize().Width()), adjustSize(aFont.GetSize().Height()));
1057 10872 : aFont.SetSize(aSize);
1058 :
1059 10872 : ApplyControlFont(rRenderContext, aFont);
1060 :
1061 10872 : ApplyControlForeground(*this, rStyleSettings.GetDarkShadowColor());
1062 10872 : SetTextFillColor();
1063 :
1064 10872 : Color aColor;
1065 21744 : svtools::ColorConfig aColorConfig;
1066 10872 : aColor = Color(aColorConfig.GetColorValue(svtools::APPBACKGROUND).nColor);
1067 21744 : ApplyControlBackground(rRenderContext, aColor);
1068 10872 : }
1069 :
1070 5754 : void Ruler::ImplInitSettings(bool bFont, bool bForeground, bool bBackground)
1071 : {
1072 5754 : const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
1073 :
1074 5754 : if (bFont)
1075 : {
1076 5754 : vcl::Font aFont = rStyleSettings.GetToolFont();
1077 : // make the font a bit smaller than default
1078 5754 : Size aSize(adjustSize(aFont.GetSize().Width()), adjustSize(aFont.GetSize().Height()));
1079 5754 : aFont.SetSize(aSize);
1080 :
1081 5754 : ApplyControlFont(*this, aFont);
1082 : }
1083 :
1084 5754 : if (bForeground || bFont)
1085 : {
1086 5754 : ApplyControlForeground(*this, rStyleSettings.GetDarkShadowColor());
1087 5754 : SetTextFillColor();
1088 : }
1089 :
1090 5754 : if (bBackground)
1091 : {
1092 5754 : Color aColor;
1093 5754 : svtools::ColorConfig aColorConfig;
1094 5754 : aColor = Color(aColorConfig.GetColorValue(svtools::APPBACKGROUND).nColor);
1095 5754 : ApplyControlBackground(*this, aColor);
1096 : }
1097 :
1098 5754 : maVirDev->SetSettings( GetSettings() );
1099 5754 : maVirDev->SetBackground( GetBackground() );
1100 5754 : vcl::Font aFont = GetFont();
1101 :
1102 5754 : if (mnWinStyle & WB_VERT)
1103 2877 : aFont.SetOrientation(900);
1104 :
1105 5754 : maVirDev->SetFont(aFont);
1106 5754 : maVirDev->SetTextColor(GetTextColor());
1107 5754 : maVirDev->SetTextFillColor(GetTextFillColor());
1108 5754 : }
1109 :
1110 10742 : void Ruler::ImplCalc()
1111 : {
1112 : // calculate offset
1113 10742 : mpData->nRulVirOff = mnWinOff + mpData->nPageOff;
1114 10742 : if ( mpData->nRulVirOff > mnVirOff )
1115 75 : mpData->nRulVirOff -= mnVirOff;
1116 : else
1117 10667 : mpData->nRulVirOff = 0;
1118 10742 : long nRulWinOff = mpData->nRulVirOff+mnVirOff;
1119 :
1120 : // calculate non-visual part of the page
1121 : long nNotVisPageWidth;
1122 10742 : if ( mpData->nPageOff < 0 )
1123 : {
1124 89 : nNotVisPageWidth = -(mpData->nPageOff);
1125 89 : if ( nRulWinOff < mnWinOff )
1126 43 : nNotVisPageWidth -= mnWinOff-nRulWinOff;
1127 : }
1128 : else
1129 10653 : nNotVisPageWidth = 0;
1130 :
1131 : // calculate width
1132 10742 : if ( mnWinStyle & WB_HORZ )
1133 : {
1134 10627 : if ( mbAutoWinWidth )
1135 10627 : mnWinWidth = mnWidth - mnVirOff;
1136 10627 : if ( mpData->bAutoPageWidth )
1137 10307 : mpData->nPageWidth = mnWinWidth;
1138 10627 : mpData->nRulWidth = std::min( mnWinWidth, mpData->nPageWidth-nNotVisPageWidth );
1139 10627 : if ( nRulWinOff+mpData->nRulWidth > mnWidth )
1140 71 : mpData->nRulWidth = mnWidth-nRulWinOff;
1141 : }
1142 : else
1143 : {
1144 115 : if ( mbAutoWinWidth )
1145 115 : mnWinWidth = mnHeight - mnVirOff;
1146 115 : if ( mpData->bAutoPageWidth )
1147 67 : mpData->nPageWidth = mnWinWidth;
1148 115 : mpData->nRulWidth = std::min( mnWinWidth, mpData->nPageWidth-nNotVisPageWidth );
1149 115 : if ( nRulWinOff+mpData->nRulWidth > mnHeight )
1150 0 : mpData->nRulWidth = mnHeight-nRulWinOff;
1151 : }
1152 :
1153 10742 : mbCalc = false;
1154 10742 : }
1155 :
1156 10751 : void Ruler::ImplFormat(vcl::RenderContext& rRenderContext)
1157 : {
1158 : // if already formatted, don't do it again
1159 10751 : if (!mbFormat)
1160 0 : return;
1161 :
1162 : // don't do anything if the window still has no size
1163 10751 : if (!mnVirWidth)
1164 0 : return;
1165 :
1166 10751 : const StyleSettings& rStyleSettings = rRenderContext.GetSettings().GetStyleSettings();
1167 : long nP1; // pixel position of Page1
1168 : long nP2; // pixel position of Page2
1169 : long nM1; // pixel position of Margin1
1170 : long nM2; // pixel position of Margin2
1171 : long nVirTop; // top/left corner
1172 : long nVirBottom; // bottom/right corner
1173 : long nVirLeft; // left/top corner
1174 : long nVirRight; // right/bottom corner
1175 : long nNullVirOff; // for faster calculation
1176 :
1177 : // calculate values
1178 10751 : if (mbCalc)
1179 10742 : ImplCalc();
1180 :
1181 10751 : mpData->nNullVirOff = mnWinOff + mpData->nPageOff + mpData->nNullOff - mnVirOff;
1182 :
1183 10751 : nNullVirOff = mpData->nNullVirOff;
1184 10751 : nVirLeft = mpData->nRulVirOff;
1185 10751 : nVirRight = nVirLeft + mpData->nRulWidth - 1;
1186 10751 : nVirTop = 0;
1187 10751 : nVirBottom = mnVirHeight - 1;
1188 :
1189 10751 : if (!IsReallyVisible())
1190 0 : return;
1191 :
1192 10751 : Size aVirDevSize;
1193 :
1194 : // initialize VirtualDevice
1195 10751 : if (mnWinStyle & WB_HORZ)
1196 : {
1197 10633 : aVirDevSize.Width() = mnVirWidth;
1198 10633 : aVirDevSize.Height() = mnVirHeight;
1199 : }
1200 : else
1201 : {
1202 118 : aVirDevSize.Height() = mnVirWidth;
1203 118 : aVirDevSize.Width() = mnVirHeight;
1204 : }
1205 10751 : if (aVirDevSize != maVirDev->GetOutputSizePixel())
1206 4790 : maVirDev->SetOutputSizePixel(aVirDevSize, true);
1207 : else
1208 5961 : maVirDev->Erase();
1209 :
1210 : // calculate margins
1211 10751 : if (!(mpData->nMargin1Style & RULER_STYLE_INVISIBLE))
1212 : {
1213 377 : nM1 = mpData->nMargin1 + nNullVirOff;
1214 377 : if (mpData->bAutoPageWidth)
1215 : {
1216 3 : nP1 = nVirLeft;
1217 3 : if (nM1 < nVirLeft)
1218 0 : nP1--;
1219 : }
1220 : else
1221 374 : nP1 = nNullVirOff - mpData->nNullOff;
1222 : }
1223 : else
1224 : {
1225 10374 : nM1 = nVirLeft-1;
1226 10374 : nP1 = nM1;
1227 : }
1228 10751 : if (!(mpData->nMargin2Style & RULER_STYLE_INVISIBLE))
1229 : {
1230 377 : nM2 = mpData->nMargin2 + nNullVirOff;
1231 377 : if (mpData->bAutoPageWidth)
1232 : {
1233 3 : nP2 = nVirRight;
1234 3 : if (nM2 > nVirRight)
1235 0 : nP2++;
1236 : }
1237 : else
1238 374 : nP2 = nNullVirOff - mpData->nNullOff + mpData->nPageWidth;
1239 377 : if (nM2 > nP2)
1240 0 : nM2 = nP2;
1241 : }
1242 : else
1243 : {
1244 10374 : nM2 = nVirRight+1;
1245 10374 : nP2 = nM2;
1246 : }
1247 :
1248 : // top/bottom border
1249 10751 : maVirDev->SetLineColor(rStyleSettings.GetShadowColor());
1250 10751 : ImplVDrawLine(*maVirDev.get(), nVirLeft, nVirTop + 1, nM1, nVirTop + 1); //top left line
1251 10751 : ImplVDrawLine(*maVirDev.get(), nM2, nVirTop + 1, nP2 - 1, nVirTop + 1); //top right line
1252 :
1253 10751 : nVirTop++;
1254 10751 : nVirBottom--;
1255 :
1256 : // draw margin1, margin2 and in-between
1257 10751 : maVirDev->SetLineColor();
1258 10751 : maVirDev->SetFillColor(rStyleSettings.GetDialogColor());
1259 10751 : if (nM1 > nVirLeft)
1260 371 : ImplVDrawRect(*maVirDev.get(), nP1, nVirTop + 1, nM1, nVirBottom); //left gray rectangle
1261 10751 : if (nM2 < nP2)
1262 377 : ImplVDrawRect(*maVirDev.get(), nM2, nVirTop + 1, nP2, nVirBottom); //right gray rectangle
1263 10751 : if (nM2 - nM1 > 0)
1264 : {
1265 10751 : maVirDev->SetFillColor(rStyleSettings.GetWindowColor());
1266 10751 : ImplVDrawRect(*maVirDev.get(), nM1 + 1, nVirTop, nM2 - 1, nVirBottom); //center rectangle
1267 : }
1268 10751 : maVirDev->SetLineColor(rStyleSettings.GetShadowColor());
1269 10751 : if (nM1 > nVirLeft)
1270 : {
1271 371 : ImplVDrawLine(*maVirDev.get(), nM1, nVirTop + 1, nM1, nVirBottom); //right line of the left rectangle
1272 371 : ImplVDrawLine(*maVirDev.get(), nP1, nVirBottom, nM1, nVirBottom); //bottom line of the left rectangle
1273 371 : if (nP1 >= nVirLeft)
1274 : {
1275 15 : ImplVDrawLine(*maVirDev.get(), nP1, nVirTop + 1, nP1, nVirBottom); //left line of the left rectangle
1276 15 : ImplVDrawLine(*maVirDev.get(), nP1, nVirBottom, nP1 + 1, nVirBottom); //?
1277 : }
1278 : }
1279 10751 : if (nM2 < nP2)
1280 : {
1281 377 : ImplVDrawLine(*maVirDev.get(), nM2, nVirBottom, nP2 - 1, nVirBottom); //bottom line of the right rectangle
1282 377 : ImplVDrawLine(*maVirDev.get(), nM2, nVirTop + 1, nM2, nVirBottom); //left line of the right rectangle
1283 377 : if (nP2 <= nVirRight + 1)
1284 13 : ImplVDrawLine(*maVirDev.get(), nP2 - 1, nVirTop + 1, nP2 - 1, nVirBottom); //right line of the right rectangle
1285 : }
1286 :
1287 10751 : long nMin = nVirLeft;
1288 10751 : long nMax = nP2;
1289 10751 : long nStart = 0;
1290 :
1291 10751 : if (mpData->bTextRTL)
1292 0 : nStart = mpData->nRightFrameMargin + nNullVirOff;
1293 : else
1294 10751 : nStart = mpData->nLeftFrameMargin + nNullVirOff;
1295 :
1296 10751 : if (nP1 > nVirLeft)
1297 0 : nMin++;
1298 :
1299 10751 : if (nP2 < nVirRight)
1300 6 : nMax--;
1301 :
1302 : // Draw captions
1303 10751 : ImplDrawTicks(*maVirDev.get(), nMin, nMax, nStart, nVirTop, nVirBottom);
1304 :
1305 : // Draw borders
1306 10751 : if (!mpData->pBorders.empty())
1307 2 : ImplDrawBorders(*maVirDev.get(), nVirLeft, nP2, nVirTop, nVirBottom);
1308 :
1309 : // Draw indents
1310 10751 : if (!mpData->pIndents.empty())
1311 323 : ImplDrawIndents(*maVirDev.get(), nVirLeft, nP2, nVirTop - 1, nVirBottom + 1);
1312 :
1313 : // Tabs
1314 10751 : if (!mpData->pTabs.empty())
1315 282 : ImplDrawTabs(*maVirDev.get(), nVirLeft, nP2, nVirTop-1, nVirBottom + 1);
1316 :
1317 10751 : mbFormat = false;
1318 : }
1319 :
1320 24561 : void Ruler::ImplInitExtraField( bool bUpdate )
1321 : {
1322 24561 : Size aWinSize = GetOutputSizePixel();
1323 :
1324 : // extra field evaluate
1325 24561 : if ( mnWinStyle & WB_EXTRAFIELD )
1326 : {
1327 23501 : maExtraRect.Left() = RULER_OFF;
1328 23501 : maExtraRect.Top() = RULER_OFF;
1329 23501 : maExtraRect.Right() = RULER_OFF + mnVirHeight - 1;
1330 23501 : maExtraRect.Bottom() = RULER_OFF + mnVirHeight - 1;
1331 23501 : if(mpData->bTextRTL)
1332 : {
1333 0 : if(mnWinStyle & WB_HORZ)
1334 0 : maExtraRect.Move(aWinSize.Width() - maExtraRect.GetWidth() - maExtraRect.Left(), 0);
1335 : else
1336 0 : maExtraRect.Move(0, aWinSize.Height() - maExtraRect.GetHeight() - maExtraRect.Top());
1337 0 : mnVirOff = 0;
1338 : }
1339 : else
1340 23501 : mnVirOff = maExtraRect.Right()+1;
1341 :
1342 : }
1343 : else
1344 : {
1345 1060 : maExtraRect.SetEmpty();
1346 1060 : mnVirOff = 0;
1347 : }
1348 :
1349 : // mnVirWidth depends on mnVirOff
1350 54626 : if ( (mnVirWidth > RULER_MIN_SIZE) ||
1351 14400 : ((aWinSize.Width() > RULER_MIN_SIZE) && (aWinSize.Height() > RULER_MIN_SIZE)) )
1352 : {
1353 21442 : if ( mnWinStyle & WB_HORZ )
1354 7357 : mnVirWidth = aWinSize.Width()-mnVirOff;
1355 : else
1356 14085 : mnVirWidth = aWinSize.Height()-mnVirOff;
1357 :
1358 21442 : if ( mnVirWidth < RULER_MIN_SIZE )
1359 0 : mnVirWidth = 0;
1360 : }
1361 :
1362 24561 : if ( bUpdate )
1363 : {
1364 376 : mbCalc = true;
1365 376 : mbFormat = true;
1366 376 : Invalidate();
1367 : }
1368 24561 : }
1369 :
1370 10872 : void Ruler::ImplDraw(vcl::RenderContext& rRenderContext)
1371 : {
1372 10872 : if (mbFormat)
1373 : {
1374 10751 : ImplFormat(rRenderContext);
1375 : }
1376 :
1377 10872 : if (IsReallyVisible())
1378 : {
1379 : // output the ruler to the virtual device
1380 10872 : Point aOffPos;
1381 10872 : Size aVirDevSize = maVirDev->GetOutputSizePixel();
1382 :
1383 10872 : if (mnWinStyle & WB_HORZ)
1384 : {
1385 10710 : aOffPos.X() = mnVirOff;
1386 10710 : if (mpData->bTextRTL)
1387 0 : aVirDevSize.Width() -= maExtraRect.GetWidth();
1388 :
1389 10710 : aOffPos.Y() = RULER_OFF;
1390 : }
1391 : else
1392 : {
1393 162 : aOffPos.X() = RULER_OFF;
1394 162 : aOffPos.Y() = mnVirOff;
1395 : }
1396 10872 : rRenderContext.DrawOutDev(aOffPos, aVirDevSize, Point(), aVirDevSize, *maVirDev.get());
1397 :
1398 : // redraw positionlines
1399 10872 : ImplInvertLines(rRenderContext, true);
1400 : }
1401 10872 : }
1402 :
1403 10702 : void Ruler::ImplDrawExtra(vcl::RenderContext& rRenderContext, bool bPaint)
1404 : {
1405 10702 : const StyleSettings& rStyleSettings = rRenderContext.GetSettings().GetStyleSettings();
1406 10702 : Rectangle aRect = maExtraRect;
1407 10702 : bool bEraseRect = false;
1408 :
1409 10702 : aRect.Left() += 2;
1410 10702 : aRect.Top() += 2;
1411 10702 : aRect.Right() -= 2;
1412 10702 : aRect.Bottom() -= 2;
1413 :
1414 10702 : if (!bPaint && !(mnExtraStyle & RULER_STYLE_HIGHLIGHT))
1415 : {
1416 0 : rRenderContext.SetFillColor(rStyleSettings.GetWorkspaceColor());
1417 0 : bEraseRect = true;
1418 : }
1419 : else
1420 : {
1421 10702 : if (mnExtraStyle & RULER_STYLE_HIGHLIGHT)
1422 : {
1423 0 : rRenderContext.SetFillColor(rStyleSettings.GetCheckedColor());
1424 0 : bEraseRect = true;
1425 : }
1426 : }
1427 :
1428 10702 : if (bEraseRect)
1429 : {
1430 0 : rRenderContext.SetLineColor();
1431 0 : rRenderContext.DrawRect(aRect);
1432 : }
1433 :
1434 : // output content
1435 10702 : if (meExtraType == RULER_EXTRA_NULLOFFSET)
1436 : {
1437 135 : rRenderContext.SetLineColor(rStyleSettings.GetButtonTextColor());
1438 270 : rRenderContext.DrawLine(Point(aRect.Left() + 1, aRect.Top() + 4),
1439 405 : Point(aRect.Right() - 1, aRect.Top() + 4));
1440 270 : rRenderContext.DrawLine(Point(aRect.Left() + 4, aRect.Top() + 1),
1441 405 : Point(aRect.Left() + 4, aRect.Bottom() - 1));
1442 : }
1443 10567 : else if (meExtraType == RULER_EXTRA_TAB)
1444 : {
1445 10567 : sal_uInt16 nTabStyle = mnExtraStyle & RULER_TAB_STYLE;
1446 10567 : if (mpData->bTextRTL)
1447 0 : nTabStyle |= RULER_TAB_RTL;
1448 10567 : Point aCenter = aRect.Center();
1449 10567 : Point aDraw(aCenter);
1450 10567 : ImplCenterTabPos(aDraw, nTabStyle);
1451 10567 : WinBits nWinBits = GetStyle();
1452 10567 : if (0 == (nWinBits & WB_HORZ))
1453 : {
1454 0 : if ((nWinBits & WB_RIGHT_ALIGNED) != 0)
1455 0 : aDraw.Y() = 2 * aCenter.Y() - aDraw.Y();
1456 :
1457 0 : if (mpData->bTextRTL)
1458 : {
1459 0 : long nTemp = aDraw.X();
1460 0 : aDraw.X() = aDraw.Y();
1461 0 : aDraw.Y() = nTemp;
1462 : }
1463 : }
1464 10567 : ImplDrawTab(rRenderContext, aDraw, nTabStyle);
1465 : }
1466 10702 : }
1467 :
1468 50677 : void Ruler::ImplUpdate( bool bMustCalc )
1469 : {
1470 : // clear lines in this place so they aren't considered at recalculation
1471 50677 : if (!mbFormat)
1472 10073 : Invalidate(InvalidateFlags::NoErase);
1473 :
1474 : // set flags
1475 50677 : if (bMustCalc)
1476 28940 : mbCalc = true;
1477 50677 : mbFormat = true;
1478 :
1479 : // abort if we are dragging as drag-handler will update the ruler after drag is finished
1480 50677 : if (mbDrag)
1481 50677 : return;
1482 :
1483 : // otherwise trigger update
1484 50677 : if (IsReallyVisible() && IsUpdateMode())
1485 : {
1486 17518 : Invalidate(InvalidateFlags::NoErase);
1487 : }
1488 : }
1489 :
1490 0 : bool Ruler::ImplHitTest( const Point& rPos, RulerSelection* pHitTest,
1491 : bool bRequireStyle, sal_uInt16 nRequiredStyle ) const
1492 : {
1493 : sal_Int32 i;
1494 : sal_uInt16 nStyle;
1495 : long nHitBottom;
1496 : long nX;
1497 : long nY;
1498 : long n1;
1499 :
1500 0 : if ( !mbActive )
1501 0 : return false;
1502 :
1503 : // determine positions
1504 0 : bool bIsHori = 0 != (mnWinStyle & WB_HORZ);
1505 0 : if ( bIsHori )
1506 : {
1507 0 : nX = rPos.X();
1508 0 : nY = rPos.Y();
1509 : }
1510 : else
1511 : {
1512 0 : nX = rPos.Y();
1513 0 : nY = rPos.X();
1514 : }
1515 0 : nHitBottom = mnVirHeight + (RULER_OFF * 2);
1516 :
1517 : // #i32608#
1518 0 : pHitTest->nAryPos = 0;
1519 0 : pHitTest->mnDragSize = 0;
1520 0 : pHitTest->bSize = false;
1521 0 : pHitTest->bSizeBar = false;
1522 :
1523 : // so that leftover tabs and indents are taken into account
1524 : long nXExtraOff;
1525 0 : if ( !mpData->pTabs.empty() || !mpData->pIndents.empty() )
1526 0 : nXExtraOff = (mnVirHeight / 2) - 4;
1527 : else
1528 0 : nXExtraOff = 0;
1529 :
1530 : // test if outside
1531 0 : nX -= mnVirOff;
1532 0 : long nXTemp = nX;
1533 0 : if ( (nX < mpData->nRulVirOff - nXExtraOff) ||
1534 0 : (nX > mpData->nRulVirOff + mpData->nRulWidth + nXExtraOff) ||
1535 0 : (nY < 0) ||
1536 : (nY > nHitBottom) )
1537 : {
1538 0 : pHitTest->nPos = 0;
1539 0 : pHitTest->eType = RULER_TYPE_OUTSIDE;
1540 0 : return false;
1541 : }
1542 :
1543 0 : nX -= mpData->nNullVirOff;
1544 0 : pHitTest->nPos = nX;
1545 0 : pHitTest->eType = RULER_TYPE_DONTKNOW;
1546 :
1547 : // first test the tabs
1548 0 : Rectangle aRect;
1549 0 : if ( !mpData->pTabs.empty() )
1550 : {
1551 0 : aRect.Bottom() = nHitBottom;
1552 0 : aRect.Top() = aRect.Bottom() - ruler_tab.height - RULER_OFF;
1553 :
1554 0 : for ( i = mpData->pTabs.size() - 1; i >= 0; i-- )
1555 : {
1556 0 : nStyle = mpData->pTabs[i].nStyle;
1557 0 : if ( !(nStyle & RULER_STYLE_INVISIBLE) )
1558 : {
1559 0 : nStyle &= RULER_TAB_STYLE;
1560 :
1561 : // default tabs are only shown (no action)
1562 0 : if ( nStyle != RULER_TAB_DEFAULT )
1563 : {
1564 0 : n1 = mpData->pTabs[i].nPos;
1565 :
1566 0 : if ( nStyle == RULER_TAB_LEFT )
1567 : {
1568 0 : aRect.Left() = n1;
1569 0 : aRect.Right() = n1 + ruler_tab.width - 1;
1570 : }
1571 0 : else if ( nStyle == RULER_TAB_RIGHT )
1572 : {
1573 0 : aRect.Right() = n1;
1574 0 : aRect.Left() = n1 - ruler_tab.width - 1;
1575 : }
1576 : else
1577 : {
1578 0 : aRect.Left() = n1 - ruler_tab.cwidth2 + 1;
1579 0 : aRect.Right() = n1 - ruler_tab.cwidth2 + ruler_tab.cwidth;
1580 : }
1581 :
1582 0 : if ( aRect.IsInside( Point( nX, nY ) ) )
1583 : {
1584 0 : pHitTest->eType = RULER_TYPE_TAB;
1585 0 : pHitTest->nAryPos = i;
1586 0 : return true;
1587 : }
1588 : }
1589 : }
1590 : }
1591 : }
1592 :
1593 : // Indents
1594 0 : if ( !mpData->pIndents.empty() )
1595 : {
1596 0 : long nIndentHeight = (mnVirHeight / 2) - 1;
1597 0 : long nIndentWidth2 = nIndentHeight - 3;
1598 :
1599 0 : for ( i = mpData->pIndents.size(); i; i-- )
1600 : {
1601 0 : nStyle = mpData->pIndents[i-1].nStyle;
1602 0 : if ( (! bRequireStyle || nStyle == nRequiredStyle) &&
1603 0 : !(nStyle & RULER_STYLE_INVISIBLE) )
1604 : {
1605 0 : nStyle &= RULER_INDENT_STYLE;
1606 0 : n1 = mpData->pIndents[i-1].nPos;
1607 :
1608 0 : if ( (nStyle == RULER_INDENT_BOTTOM) != !bIsHori )
1609 : {
1610 0 : aRect.Left() = n1-nIndentWidth2;
1611 0 : aRect.Right() = n1+nIndentWidth2;
1612 0 : aRect.Top() = nHitBottom-nIndentHeight-RULER_OFF+1;
1613 0 : aRect.Bottom() = nHitBottom;
1614 : }
1615 : else
1616 : {
1617 0 : aRect.Left() = n1-nIndentWidth2;
1618 0 : aRect.Right() = n1+nIndentWidth2;
1619 0 : aRect.Top() = 0;
1620 0 : aRect.Bottom() = nIndentHeight+RULER_OFF-1;
1621 : }
1622 :
1623 0 : if ( aRect.IsInside( Point( nX, nY ) ) )
1624 : {
1625 0 : pHitTest->eType = RULER_TYPE_INDENT;
1626 0 : pHitTest->nAryPos = i-1;
1627 0 : return true;
1628 : }
1629 : }
1630 : }
1631 : }
1632 :
1633 : // everything left and right is outside and don't take this into account
1634 0 : if ( (nXTemp < mpData->nRulVirOff) || (nXTemp > mpData->nRulVirOff+mpData->nRulWidth) )
1635 : {
1636 0 : pHitTest->nPos = 0;
1637 0 : pHitTest->eType = RULER_TYPE_OUTSIDE;
1638 0 : return false;
1639 : }
1640 :
1641 : // test the borders
1642 0 : int nBorderTolerance = 1;
1643 0 : if(pHitTest->bExpandTest)
1644 : {
1645 0 : nBorderTolerance++;
1646 : }
1647 :
1648 0 : for ( i = mpData->pBorders.size(); i; i-- )
1649 : {
1650 0 : n1 = mpData->pBorders[i-1].nPos;
1651 0 : long n2 = n1 + mpData->pBorders[i-1].nWidth;
1652 :
1653 : // borders have at least 3 pixel padding
1654 0 : if ( !mpData->pBorders[i-1].nWidth )
1655 : {
1656 0 : n1 -= nBorderTolerance;
1657 0 : n2 += nBorderTolerance;
1658 :
1659 : }
1660 :
1661 0 : if ( (nX >= n1) && (nX <= n2) )
1662 : {
1663 0 : nStyle = mpData->pBorders[i-1].nStyle;
1664 0 : if ( !(nStyle & RULER_STYLE_INVISIBLE) )
1665 : {
1666 0 : pHitTest->eType = RULER_TYPE_BORDER;
1667 0 : pHitTest->nAryPos = i-1;
1668 :
1669 0 : if ( !(nStyle & RULER_BORDER_SIZEABLE) )
1670 : {
1671 0 : if ( nStyle & RULER_BORDER_MOVEABLE )
1672 : {
1673 0 : pHitTest->bSizeBar = true;
1674 0 : pHitTest->mnDragSize = RULER_DRAGSIZE_MOVE;
1675 : }
1676 : }
1677 : else
1678 : {
1679 0 : long nMOff = RULER_MOUSE_BORDERWIDTH;
1680 0 : while ( nMOff*2 >= (n2-n1-RULER_MOUSE_BORDERMOVE) )
1681 : {
1682 0 : if ( nMOff < 2 )
1683 : {
1684 0 : nMOff = 0;
1685 0 : break;
1686 : }
1687 : else
1688 0 : nMOff--;
1689 : }
1690 :
1691 0 : if ( nX <= n1+nMOff )
1692 : {
1693 0 : pHitTest->bSize = true;
1694 0 : pHitTest->mnDragSize = RULER_DRAGSIZE_1;
1695 : }
1696 0 : else if ( nX >= n2-nMOff )
1697 : {
1698 0 : pHitTest->bSize = true;
1699 0 : pHitTest->mnDragSize = RULER_DRAGSIZE_2;
1700 : }
1701 : else
1702 : {
1703 0 : if ( nStyle & RULER_BORDER_MOVEABLE )
1704 : {
1705 0 : pHitTest->bSizeBar = true;
1706 0 : pHitTest->mnDragSize = RULER_DRAGSIZE_MOVE;
1707 : }
1708 : }
1709 : }
1710 :
1711 0 : return true;
1712 : }
1713 : }
1714 : }
1715 :
1716 : // Margins
1717 0 : int nMarginTolerance = pHitTest->bExpandTest ? nBorderTolerance : RULER_MOUSE_MARGINWIDTH;
1718 :
1719 0 : if ( (mpData->nMargin1Style & (RULER_MARGIN_SIZEABLE | RULER_STYLE_INVISIBLE)) == RULER_MARGIN_SIZEABLE )
1720 : {
1721 0 : n1 = mpData->nMargin1;
1722 0 : if ( (nX >= n1 - nMarginTolerance) && (nX <= n1 + nMarginTolerance) )
1723 : {
1724 0 : pHitTest->eType = RULER_TYPE_MARGIN1;
1725 0 : pHitTest->bSize = true;
1726 0 : return true;
1727 : }
1728 : }
1729 0 : if ( (mpData->nMargin2Style & (RULER_MARGIN_SIZEABLE | RULER_STYLE_INVISIBLE)) == RULER_MARGIN_SIZEABLE )
1730 : {
1731 0 : n1 = mpData->nMargin2;
1732 0 : if ( (nX >= n1 - nMarginTolerance) && (nX <= n1 + nMarginTolerance) )
1733 : {
1734 0 : pHitTest->eType = RULER_TYPE_MARGIN2;
1735 0 : pHitTest->bSize = true;
1736 0 : return true;
1737 : }
1738 : }
1739 :
1740 : // test tabs again
1741 0 : if ( !mpData->pTabs.empty() )
1742 : {
1743 0 : aRect.Top() = RULER_OFF;
1744 0 : aRect.Bottom() = nHitBottom;
1745 :
1746 0 : for ( i = mpData->pTabs.size() - 1; i >= 0; i-- )
1747 : {
1748 0 : nStyle = mpData->pTabs[i].nStyle;
1749 0 : if ( !(nStyle & RULER_STYLE_INVISIBLE) )
1750 : {
1751 0 : nStyle &= RULER_TAB_STYLE;
1752 :
1753 : // default tabs are only shown (no action)
1754 0 : if ( nStyle != RULER_TAB_DEFAULT )
1755 : {
1756 0 : n1 = mpData->pTabs[i].nPos;
1757 :
1758 0 : if ( nStyle == RULER_TAB_LEFT )
1759 : {
1760 0 : aRect.Left() = n1;
1761 0 : aRect.Right() = n1 + ruler_tab.width - 1;
1762 : }
1763 0 : else if ( nStyle == RULER_TAB_RIGHT )
1764 : {
1765 0 : aRect.Right() = n1;
1766 0 : aRect.Left() = n1 - ruler_tab.width - 1;
1767 : }
1768 : else
1769 : {
1770 0 : aRect.Left() = n1 - ruler_tab.cwidth2 + 1;
1771 0 : aRect.Right() = n1 - ruler_tab.cwidth2 + ruler_tab.cwidth;
1772 : }
1773 :
1774 0 : aRect.Left()--;
1775 0 : aRect.Right()++;
1776 :
1777 0 : if ( aRect.IsInside( Point( nX, nY ) ) )
1778 : {
1779 0 : pHitTest->eType = RULER_TYPE_TAB;
1780 0 : pHitTest->nAryPos = i;
1781 0 : return true;
1782 : }
1783 : }
1784 : }
1785 : }
1786 : }
1787 :
1788 0 : return false;
1789 : }
1790 :
1791 0 : bool Ruler::ImplDocHitTest( const Point& rPos, RulerType eDragType,
1792 : RulerSelection* pHitTest ) const
1793 : {
1794 0 : Point aPos = rPos;
1795 0 : bool bRequiredStyle = false;
1796 0 : sal_uInt16 nRequiredStyle = 0;
1797 :
1798 0 : if (eDragType == RULER_TYPE_INDENT)
1799 : {
1800 0 : bRequiredStyle = true;
1801 0 : nRequiredStyle = RULER_INDENT_BOTTOM;
1802 : }
1803 :
1804 0 : if ( mnWinStyle & WB_HORZ )
1805 0 : aPos.X() += mnWinOff;
1806 : else
1807 0 : aPos.Y() += mnWinOff;
1808 :
1809 0 : if ( (eDragType == RULER_TYPE_INDENT) || (eDragType == RULER_TYPE_DONTKNOW) )
1810 : {
1811 0 : if ( mnWinStyle & WB_HORZ )
1812 0 : aPos.Y() = RULER_OFF + 1;
1813 : else
1814 0 : aPos.X() = RULER_OFF + 1;
1815 :
1816 0 : if ( ImplHitTest( aPos, pHitTest, bRequiredStyle, nRequiredStyle ) )
1817 : {
1818 0 : if ( (pHitTest->eType == eDragType) || (eDragType == RULER_TYPE_DONTKNOW) )
1819 0 : return true;
1820 : }
1821 : }
1822 :
1823 0 : if ( (eDragType == RULER_TYPE_INDENT) ||
1824 0 : (eDragType == RULER_TYPE_TAB) ||
1825 : (eDragType == RULER_TYPE_DONTKNOW) )
1826 : {
1827 0 : if ( mnWinStyle & WB_HORZ )
1828 0 : aPos.Y() = mnHeight - RULER_OFF - 1;
1829 : else
1830 0 : aPos.X() = mnWidth - RULER_OFF - 1;
1831 :
1832 0 : if ( ImplHitTest( aPos, pHitTest, bRequiredStyle, nRequiredStyle ) )
1833 : {
1834 0 : if ( (pHitTest->eType == eDragType) || (eDragType == RULER_TYPE_DONTKNOW) )
1835 0 : return true;
1836 : }
1837 : }
1838 :
1839 0 : if ( (eDragType == RULER_TYPE_MARGIN1) || (eDragType == RULER_TYPE_MARGIN2) ||
1840 0 : (eDragType == RULER_TYPE_BORDER) || (eDragType == RULER_TYPE_DONTKNOW) )
1841 : {
1842 0 : if ( mnWinStyle & WB_HORZ )
1843 0 : aPos.Y() = RULER_OFF + (mnVirHeight / 2);
1844 : else
1845 0 : aPos.X() = RULER_OFF + (mnVirHeight / 2);
1846 :
1847 0 : if ( ImplHitTest( aPos, pHitTest ) )
1848 : {
1849 0 : if ( (pHitTest->eType == eDragType) || (eDragType == RULER_TYPE_DONTKNOW) )
1850 0 : return true;
1851 : }
1852 : }
1853 :
1854 0 : pHitTest->eType = RULER_TYPE_DONTKNOW;
1855 :
1856 0 : return false;
1857 : }
1858 :
1859 0 : bool Ruler::ImplStartDrag( RulerSelection* pHitTest, sal_uInt16 nModifier )
1860 : {
1861 : // don't trigger drag if a border that was clicked can not be changed
1862 0 : if ( (pHitTest->eType == RULER_TYPE_BORDER) &&
1863 0 : !pHitTest->bSize && !pHitTest->bSizeBar )
1864 0 : return false;
1865 :
1866 : // Set drag data
1867 0 : meDragType = pHitTest->eType;
1868 0 : mnDragPos = pHitTest->nPos;
1869 0 : mnDragAryPos = pHitTest->nAryPos;
1870 0 : mnDragSize = pHitTest->mnDragSize;
1871 0 : mnDragModifier = nModifier;
1872 0 : *mpDragData = *mpSaveData;
1873 0 : mpData = mpDragData;
1874 :
1875 : // call handler
1876 0 : if (StartDrag())
1877 : {
1878 : // if the handler allows dragging, initialize dragging
1879 0 : mbDrag = true;
1880 0 : mnStartDragPos = mnDragPos;
1881 0 : StartTracking();
1882 0 : Invalidate(InvalidateFlags::NoErase);
1883 0 : return true;
1884 : }
1885 : else
1886 : {
1887 : // otherwise reset the data
1888 0 : meDragType = RULER_TYPE_DONTKNOW;
1889 0 : mnDragPos = 0;
1890 0 : mnDragAryPos = 0;
1891 0 : mnDragSize = 0;
1892 0 : mnDragModifier = 0;
1893 0 : mpData = mpSaveData;
1894 : }
1895 :
1896 0 : return false;
1897 : }
1898 :
1899 0 : void Ruler::ImplDrag( const Point& rPos )
1900 : {
1901 : long nX;
1902 : long nY;
1903 : long nOutHeight;
1904 :
1905 0 : if ( mnWinStyle & WB_HORZ )
1906 : {
1907 0 : nX = rPos.X();
1908 0 : nY = rPos.Y();
1909 0 : nOutHeight = mnHeight;
1910 : }
1911 : else
1912 : {
1913 0 : nX = rPos.Y();
1914 0 : nY = rPos.X();
1915 0 : nOutHeight = mnWidth;
1916 : }
1917 :
1918 : // calculate and fit X
1919 0 : nX -= mnVirOff;
1920 0 : if ( nX < mpData->nRulVirOff )
1921 : {
1922 0 : nX = mpData->nRulVirOff;
1923 : }
1924 0 : else if ( nX > mpData->nRulVirOff+mpData->nRulWidth )
1925 : {
1926 0 : nX = mpData->nRulVirOff+mpData->nRulWidth;
1927 : }
1928 0 : nX -= mpData->nNullVirOff;
1929 :
1930 : // if upper or left from ruler, then consider old values
1931 0 : mbDragDelete = false;
1932 0 : if ( nY < 0 )
1933 : {
1934 0 : if ( !mbDragCanceled )
1935 : {
1936 : // reset the data
1937 0 : mbDragCanceled = true;
1938 0 : ImplRulerData aTempData;
1939 0 : aTempData = *mpDragData;
1940 0 : *mpDragData = *mpSaveData;
1941 0 : mbCalc = true;
1942 0 : mbFormat = true;
1943 :
1944 : // call handler
1945 0 : mnDragPos = mnStartDragPos;
1946 0 : Drag();
1947 :
1948 : // and redraw
1949 0 : Invalidate(InvalidateFlags::NoErase);
1950 :
1951 : // reset the data as before cancel
1952 0 : *mpDragData = aTempData;
1953 : }
1954 : }
1955 : else
1956 : {
1957 0 : mbDragCanceled = false;
1958 :
1959 : // +2, so the tabs are not cleared too quickly
1960 0 : if ( nY > nOutHeight + 2 )
1961 0 : mbDragDelete = true;
1962 :
1963 0 : mnDragPos = nX;
1964 :
1965 : // call handler
1966 0 : Drag();
1967 :
1968 : // redraw
1969 0 : if (mbFormat)
1970 0 : Invalidate(InvalidateFlags::NoErase);
1971 : }
1972 0 : }
1973 :
1974 0 : void Ruler::ImplEndDrag()
1975 : {
1976 : // get values
1977 0 : if ( mbDragCanceled )
1978 0 : *mpDragData = *mpSaveData;
1979 : else
1980 0 : *mpSaveData = *mpDragData;
1981 :
1982 0 : mpData = mpSaveData;
1983 0 : mbDrag = false;
1984 :
1985 : // call handler
1986 0 : EndDrag();
1987 :
1988 : // reset drag values
1989 0 : meDragType = RULER_TYPE_DONTKNOW;
1990 0 : mnDragPos = 0;
1991 0 : mnDragAryPos = 0;
1992 0 : mnDragSize = 0;
1993 0 : mbDragCanceled = false;
1994 0 : mbDragDelete = false;
1995 0 : mnDragModifier = 0;
1996 0 : mnStartDragPos = 0;
1997 :
1998 : // redraw
1999 0 : Invalidate(InvalidateFlags::NoErase);
2000 0 : }
2001 :
2002 0 : void Ruler::MouseButtonDown( const MouseEvent& rMEvt )
2003 : {
2004 0 : if ( rMEvt.IsLeft() && !IsTracking() )
2005 : {
2006 0 : Point aMousePos = rMEvt.GetPosPixel();
2007 0 : sal_uInt16 nMouseClicks = rMEvt.GetClicks();
2008 0 : sal_uInt16 nMouseModifier = rMEvt.GetModifier();
2009 :
2010 : // update ruler
2011 0 : if ( mbFormat )
2012 : {
2013 0 : Invalidate(InvalidateFlags::NoErase);
2014 : }
2015 :
2016 0 : if ( maExtraRect.IsInside( aMousePos ) )
2017 : {
2018 0 : mnExtraClicks = nMouseClicks;
2019 0 : mnExtraModifier = nMouseModifier;
2020 0 : ExtraDown();
2021 0 : mnExtraClicks = 0;
2022 0 : mnExtraModifier = 0;
2023 : }
2024 : else
2025 : {
2026 0 : boost::scoped_ptr<RulerSelection> pHitTest(new RulerSelection);
2027 0 : bool bHitTestResult = ImplHitTest(aMousePos, pHitTest.get());
2028 :
2029 0 : if ( nMouseClicks == 1 )
2030 : {
2031 0 : if ( bHitTestResult )
2032 : {
2033 0 : ImplStartDrag( pHitTest.get(), nMouseModifier );
2034 : }
2035 : else
2036 : {
2037 : // calculate position inside of ruler area
2038 0 : if ( pHitTest->eType == RULER_TYPE_DONTKNOW )
2039 : {
2040 0 : mnDragPos = pHitTest->nPos;
2041 0 : Click();
2042 0 : mnDragPos = 0;
2043 :
2044 : // call HitTest again as a click, for example, could set a new tab
2045 0 : if ( ImplHitTest(aMousePos, pHitTest.get()) )
2046 0 : ImplStartDrag(pHitTest.get(), nMouseModifier);
2047 : }
2048 : }
2049 : }
2050 : else
2051 : {
2052 0 : if (bHitTestResult)
2053 : {
2054 0 : mnDragPos = pHitTest->nPos;
2055 0 : mnDragAryPos = pHitTest->nAryPos;
2056 : }
2057 0 : meDragType = pHitTest->eType;
2058 :
2059 0 : DoubleClick();
2060 :
2061 0 : meDragType = RULER_TYPE_DONTKNOW;
2062 0 : mnDragPos = 0;
2063 0 : mnDragAryPos = 0;
2064 0 : }
2065 : }
2066 : }
2067 0 : }
2068 :
2069 0 : void Ruler::MouseMove( const MouseEvent& rMEvt )
2070 : {
2071 0 : PointerStyle ePtrStyle = PointerStyle::Arrow;
2072 :
2073 0 : mxPreviousHitTest.swap(mxCurrentHitTest);
2074 :
2075 0 : mxCurrentHitTest.reset(new RulerSelection);
2076 :
2077 0 : maHoverSelection.eType = RULER_TYPE_DONTKNOW;
2078 :
2079 0 : if (ImplHitTest( rMEvt.GetPosPixel(), mxCurrentHitTest.get() ))
2080 : {
2081 0 : maHoverSelection = *mxCurrentHitTest.get();
2082 :
2083 0 : if (mxCurrentHitTest->bSize)
2084 : {
2085 0 : if (mnWinStyle & WB_HORZ)
2086 : {
2087 0 : if (mxCurrentHitTest->mnDragSize == RULER_DRAGSIZE_1)
2088 0 : ePtrStyle = PointerStyle::TabSelectW;
2089 0 : else if (mxCurrentHitTest->mnDragSize == RULER_DRAGSIZE_2)
2090 0 : ePtrStyle = PointerStyle::TabSelectE;
2091 : else
2092 0 : ePtrStyle = PointerStyle::ESize;
2093 : }
2094 : else
2095 : {
2096 0 : if (mxCurrentHitTest->mnDragSize == RULER_DRAGSIZE_1)
2097 0 : ePtrStyle = PointerStyle::WindowNSize;
2098 0 : else if (mxCurrentHitTest->mnDragSize == RULER_DRAGSIZE_2)
2099 0 : ePtrStyle = PointerStyle::WindowSSize;
2100 : else
2101 0 : ePtrStyle = PointerStyle::SSize;
2102 : }
2103 : }
2104 0 : else if (mxCurrentHitTest->bSizeBar)
2105 : {
2106 0 : if (mnWinStyle & WB_HORZ)
2107 0 : ePtrStyle = PointerStyle::HSizeBar;
2108 : else
2109 0 : ePtrStyle = PointerStyle::VSizeBar;
2110 : }
2111 : }
2112 :
2113 0 : if (mxPreviousHitTest.get() != NULL && mxPreviousHitTest->eType != mxCurrentHitTest->eType)
2114 : {
2115 0 : mbFormat = true;
2116 : }
2117 :
2118 0 : SetPointer( Pointer(ePtrStyle) );
2119 :
2120 0 : if (mbFormat)
2121 : {
2122 0 : Invalidate(InvalidateFlags::NoErase);
2123 : }
2124 0 : }
2125 :
2126 0 : void Ruler::Tracking( const TrackingEvent& rTEvt )
2127 : {
2128 0 : if ( rTEvt.IsTrackingEnded() )
2129 : {
2130 : // reset the old state at cancel
2131 0 : if ( rTEvt.IsTrackingCanceled() )
2132 : {
2133 0 : mbDragCanceled = true;
2134 0 : mbFormat = true;
2135 : }
2136 :
2137 0 : ImplEndDrag();
2138 : }
2139 : else
2140 0 : ImplDrag( rTEvt.GetMouseEvent().GetPosPixel() );
2141 0 : }
2142 :
2143 10872 : void Ruler::Paint(vcl::RenderContext& rRenderContext, const Rectangle&)
2144 : {
2145 10872 : ImplDraw(rRenderContext);
2146 :
2147 : // consider extra field
2148 10872 : if (mnWinStyle & WB_EXTRAFIELD)
2149 10702 : ImplDrawExtra(rRenderContext, true);
2150 10872 : }
2151 :
2152 24185 : void Ruler::Resize()
2153 : {
2154 24185 : Size aWinSize = GetOutputSizePixel();
2155 :
2156 : long nNewHeight;
2157 24185 : if ( mnWinStyle & WB_HORZ )
2158 : {
2159 10202 : if ( aWinSize.Height() != mnHeight )
2160 2847 : nNewHeight = aWinSize.Height();
2161 : else
2162 7355 : nNewHeight = 0;
2163 : }
2164 : else
2165 : {
2166 13983 : if ( aWinSize.Width() != mnWidth )
2167 2752 : nNewHeight = aWinSize.Width();
2168 : else
2169 11231 : nNewHeight = 0;
2170 : }
2171 :
2172 24185 : mbFormat = true;
2173 :
2174 : // clear lines
2175 24185 : bool bVisible = IsReallyVisible();
2176 24185 : if ( bVisible && !mpData->pLines.empty() )
2177 : {
2178 0 : mnUpdateFlags |= RULER_UPDATE_LINES;
2179 0 : Invalidate(InvalidateFlags::NoErase);
2180 : }
2181 :
2182 : // recalculate some values if the height/width changes
2183 : // extra field should always be updated
2184 24185 : ImplInitExtraField( mpData->bTextRTL );
2185 24185 : if ( nNewHeight )
2186 : {
2187 5599 : mbCalc = true;
2188 5599 : mnVirHeight = nNewHeight - mnBorderWidth - ( RULER_OFF * 2 );
2189 : }
2190 : else
2191 : {
2192 18586 : if ( mpData->bAutoPageWidth )
2193 18206 : ImplUpdate( true );
2194 380 : else if ( mbAutoWinWidth )
2195 380 : mbCalc = true;
2196 : }
2197 :
2198 : // clear part of the border
2199 24185 : if ( bVisible )
2200 : {
2201 4431 : if ( nNewHeight )
2202 0 : Invalidate(InvalidateFlags::NoErase);
2203 4431 : else if ( mpData->bAutoPageWidth )
2204 : {
2205 : // only at AutoPageWidth muss we redraw
2206 4426 : Rectangle aRect;
2207 :
2208 4426 : if ( mnWinStyle & WB_HORZ )
2209 : {
2210 4425 : if ( mnWidth < aWinSize.Width() )
2211 36 : aRect.Left() = mnWidth - RULER_RESIZE_OFF;
2212 : else
2213 4389 : aRect.Left() = aWinSize.Width() - RULER_RESIZE_OFF;
2214 4425 : aRect.Right() = aRect.Left() + RULER_RESIZE_OFF;
2215 4425 : aRect.Top() = RULER_OFF;
2216 4425 : aRect.Bottom() = RULER_OFF + mnVirHeight;
2217 : }
2218 : else
2219 : {
2220 1 : if ( mnHeight < aWinSize.Height() )
2221 0 : aRect.Top() = mnHeight-RULER_RESIZE_OFF;
2222 : else
2223 1 : aRect.Top() = aWinSize.Height()-RULER_RESIZE_OFF;
2224 1 : aRect.Bottom() = aRect.Top() + RULER_RESIZE_OFF;
2225 1 : aRect.Left() = RULER_OFF;
2226 1 : aRect.Right() = RULER_OFF + mnVirHeight;
2227 : }
2228 :
2229 4426 : Invalidate(aRect, InvalidateFlags::NoErase);
2230 : }
2231 : }
2232 :
2233 24185 : mnWidth = aWinSize.Width();
2234 24185 : mnHeight = aWinSize.Height();
2235 24185 : }
2236 :
2237 11206 : void Ruler::StateChanged( StateChangedType nType )
2238 : {
2239 11206 : Window::StateChanged( nType );
2240 :
2241 11206 : if ( nType == StateChangedType::InitShow )
2242 2846 : Invalidate();
2243 8360 : else if ( nType == StateChangedType::UpdateMode )
2244 : {
2245 0 : if ( IsReallyVisible() && IsUpdateMode() )
2246 0 : Invalidate();
2247 : }
2248 8360 : else if ( (nType == StateChangedType::Zoom) ||
2249 : (nType == StateChangedType::ControlFont) )
2250 : {
2251 0 : ImplInitSettings( true, false, false );
2252 0 : Invalidate();
2253 : }
2254 8360 : else if ( nType == StateChangedType::ControlForeground )
2255 : {
2256 0 : ImplInitSettings( false, true, false );
2257 0 : Invalidate();
2258 : }
2259 8360 : else if ( nType == StateChangedType::ControlBackground )
2260 : {
2261 0 : ImplInitSettings( false, false, true );
2262 0 : Invalidate();
2263 : }
2264 11206 : }
2265 :
2266 66 : void Ruler::DataChanged( const DataChangedEvent& rDCEvt )
2267 : {
2268 66 : Window::DataChanged( rDCEvt );
2269 :
2270 264 : if ( (rDCEvt.GetType() == DataChangedEventType::FONTS) ||
2271 132 : (rDCEvt.GetType() == DataChangedEventType::DISPLAY) ||
2272 324 : (rDCEvt.GetType() == DataChangedEventType::FONTSUBSTITUTION) ||
2273 198 : ((rDCEvt.GetType() == DataChangedEventType::SETTINGS) &&
2274 264 : (rDCEvt.GetFlags() & AllSettingsFlags::STYLE)) )
2275 : {
2276 60 : mbFormat = true;
2277 60 : ImplInitSettings( true, true, true );
2278 60 : Invalidate();
2279 : }
2280 66 : }
2281 :
2282 0 : bool Ruler::StartDrag()
2283 : {
2284 0 : if ( maStartDragHdl.IsSet() )
2285 0 : return maStartDragHdl.Call( this );
2286 : else
2287 0 : return false;
2288 : }
2289 :
2290 0 : void Ruler::Drag()
2291 : {
2292 0 : maDragHdl.Call( this );
2293 0 : }
2294 :
2295 0 : void Ruler::EndDrag()
2296 : {
2297 0 : maEndDragHdl.Call( this );
2298 0 : }
2299 :
2300 0 : void Ruler::Click()
2301 : {
2302 0 : maClickHdl.Call( this );
2303 0 : }
2304 :
2305 0 : void Ruler::DoubleClick()
2306 : {
2307 0 : maDoubleClickHdl.Call( this );
2308 0 : }
2309 :
2310 0 : void Ruler::ExtraDown()
2311 : {
2312 0 : maExtraDownHdl.Call( this );
2313 0 : }
2314 :
2315 11432 : void Ruler::Activate()
2316 : {
2317 11432 : mbActive = true;
2318 :
2319 : // update positionlies - draw is delayed
2320 11432 : mnUpdateFlags |= RULER_UPDATE_LINES;
2321 11432 : Invalidate(InvalidateFlags::NoErase);
2322 11432 : }
2323 :
2324 8824 : void Ruler::Deactivate()
2325 : {
2326 : // clear positionlines
2327 8824 : Invalidate(InvalidateFlags::NoErase);
2328 :
2329 8824 : mbActive = false;
2330 8824 : }
2331 :
2332 0 : bool Ruler::StartDocDrag( const MouseEvent& rMEvt, RulerType eDragType )
2333 : {
2334 0 : if ( !mbDrag )
2335 : {
2336 0 : Point aMousePos = rMEvt.GetPosPixel();
2337 0 : sal_uInt16 nMouseClicks = rMEvt.GetClicks();
2338 0 : sal_uInt16 nMouseModifier = rMEvt.GetModifier();
2339 0 : RulerSelection aHitTest;
2340 :
2341 0 : if(eDragType != RULER_TYPE_DONTKNOW)
2342 0 : aHitTest.bExpandTest = true;
2343 :
2344 : // update ruler
2345 0 : if ( mbFormat )
2346 : {
2347 0 : Invalidate(InvalidateFlags::NoErase);
2348 : }
2349 :
2350 0 : if ( nMouseClicks == 1 )
2351 : {
2352 0 : if ( ImplDocHitTest( aMousePos, eDragType, &aHitTest ) )
2353 : {
2354 0 : Pointer aPtr;
2355 :
2356 0 : if ( aHitTest.bSize )
2357 : {
2358 0 : if ( mnWinStyle & WB_HORZ )
2359 0 : aPtr = Pointer( PointerStyle::ESize );
2360 : else
2361 0 : aPtr = Pointer( PointerStyle::SSize );
2362 : }
2363 0 : else if ( aHitTest.bSizeBar )
2364 : {
2365 0 : if ( mnWinStyle & WB_HORZ )
2366 0 : aPtr = Pointer( PointerStyle::HSizeBar );
2367 : else
2368 0 : aPtr = Pointer( PointerStyle::VSizeBar );
2369 : }
2370 0 : SetPointer( aPtr );
2371 0 : return ImplStartDrag( &aHitTest, nMouseModifier );
2372 : }
2373 : }
2374 0 : else if ( nMouseClicks == 2 )
2375 : {
2376 0 : if ( ImplDocHitTest( aMousePos, eDragType, &aHitTest ) )
2377 : {
2378 0 : mnDragPos = aHitTest.nPos;
2379 0 : mnDragAryPos = aHitTest.nAryPos;
2380 : }
2381 0 : eDragType = aHitTest.eType;
2382 :
2383 0 : DoubleClick();
2384 :
2385 0 : eDragType = RULER_TYPE_DONTKNOW;
2386 0 : mnDragPos = 0;
2387 0 : mnDragAryPos = 0;
2388 :
2389 0 : return true;
2390 : }
2391 : }
2392 :
2393 0 : return false;
2394 : }
2395 :
2396 0 : void Ruler::CancelDrag()
2397 : {
2398 0 : if ( mbDrag )
2399 : {
2400 0 : ImplDrag( Point( -1, -1 ) );
2401 0 : ImplEndDrag();
2402 : }
2403 0 : }
2404 :
2405 0 : RulerType Ruler::GetType( const Point& rPos, sal_uInt16* pAryPos )
2406 : {
2407 0 : RulerSelection aHitTest;
2408 :
2409 : // update ruler
2410 0 : if ( IsReallyVisible() && mbFormat )
2411 : {
2412 0 : Invalidate(InvalidateFlags::NoErase);
2413 : }
2414 :
2415 0 : (void)ImplHitTest(rPos, &aHitTest);
2416 :
2417 : // return values
2418 0 : if ( pAryPos )
2419 0 : *pAryPos = aHitTest.nAryPos;
2420 0 : return aHitTest.eType;
2421 : }
2422 :
2423 174 : void Ruler::SetWinPos( long nNewOff, long nNewWidth )
2424 : {
2425 : // should widths be automatically calculated
2426 174 : if ( !nNewWidth )
2427 174 : mbAutoWinWidth = true;
2428 : else
2429 0 : mbAutoWinWidth = false;
2430 :
2431 174 : mnWinOff = nNewOff;
2432 174 : mnWinWidth = nNewWidth;
2433 174 : ImplUpdate( true );
2434 174 : }
2435 :
2436 56889 : void Ruler::SetPagePos( long nNewOff, long nNewWidth )
2437 : {
2438 : // should we do anything?
2439 56889 : if ( (mpData->nPageOff == nNewOff) && (mpData->nPageWidth == nNewWidth) )
2440 103218 : return;
2441 :
2442 : // should widths be automatically calculated
2443 10560 : if ( !nNewWidth )
2444 9786 : mpData->bAutoPageWidth = true;
2445 : else
2446 774 : mpData->bAutoPageWidth = false;
2447 :
2448 10560 : mpData->nPageOff = nNewOff;
2449 10560 : mpData->nPageWidth = nNewWidth;
2450 10560 : ImplUpdate( true );
2451 : }
2452 :
2453 343 : void Ruler::SetBorderPos( long nOff )
2454 : {
2455 343 : if ( mnWinStyle & WB_BORDER )
2456 : {
2457 343 : if ( mnBorderOff != nOff )
2458 : {
2459 88 : mnBorderOff = nOff;
2460 :
2461 88 : if ( IsReallyVisible() && IsUpdateMode() )
2462 0 : Invalidate(InvalidateFlags::NoErase);
2463 : }
2464 : }
2465 343 : }
2466 :
2467 5694 : void Ruler::SetUnit( FieldUnit eNewUnit )
2468 : {
2469 5694 : if ( meUnit != eNewUnit )
2470 : {
2471 5688 : meUnit = eNewUnit;
2472 5688 : switch ( meUnit )
2473 : {
2474 : case FUNIT_MM:
2475 0 : mnUnitIndex = RULER_UNIT_MM;
2476 0 : break;
2477 : case FUNIT_CM:
2478 0 : mnUnitIndex = RULER_UNIT_CM;
2479 0 : break;
2480 : case FUNIT_M:
2481 0 : mnUnitIndex = RULER_UNIT_M;
2482 0 : break;
2483 : case FUNIT_KM:
2484 0 : mnUnitIndex = RULER_UNIT_KM;
2485 0 : break;
2486 : case FUNIT_INCH:
2487 5688 : mnUnitIndex = RULER_UNIT_INCH;
2488 5688 : break;
2489 : case FUNIT_FOOT:
2490 0 : mnUnitIndex = RULER_UNIT_FOOT;
2491 0 : break;
2492 : case FUNIT_MILE:
2493 0 : mnUnitIndex = RULER_UNIT_MILE;
2494 0 : break;
2495 : case FUNIT_POINT:
2496 0 : mnUnitIndex = RULER_UNIT_POINT;
2497 0 : break;
2498 : case FUNIT_PICA:
2499 0 : mnUnitIndex = RULER_UNIT_PICA;
2500 0 : break;
2501 : case FUNIT_CHAR:
2502 0 : mnUnitIndex = RULER_UNIT_CHAR;
2503 0 : break;
2504 : case FUNIT_LINE:
2505 0 : mnUnitIndex = RULER_UNIT_LINE;
2506 0 : break;
2507 : default:
2508 : SAL_WARN( "svtools.control", "Ruler::SetUnit() - Wrong Unit" );
2509 0 : break;
2510 : }
2511 :
2512 5688 : maMapMode.SetMapUnit( aImplRulerUnitTab[mnUnitIndex].eMapUnit );
2513 5688 : ImplUpdate();
2514 : }
2515 5694 : }
2516 :
2517 8010 : void Ruler::SetZoom( const Fraction& rNewZoom )
2518 : {
2519 : DBG_ASSERT( rNewZoom.GetNumerator(), "Ruler::SetZoom() with scale 0 is not allowed" );
2520 :
2521 8010 : if ( maZoom != rNewZoom )
2522 : {
2523 2072 : maZoom = rNewZoom;
2524 2072 : maMapMode.SetScaleX( maZoom );
2525 2072 : maMapMode.SetScaleY( maZoom );
2526 2072 : ImplUpdate();
2527 : }
2528 8010 : }
2529 :
2530 5694 : void Ruler::SetExtraType( RulerExtra eNewExtraType, sal_uInt16 nStyle )
2531 : {
2532 5694 : if ( mnWinStyle & WB_EXTRAFIELD )
2533 : {
2534 5694 : meExtraType = eNewExtraType;
2535 5694 : mnExtraStyle = nStyle;
2536 5694 : if (IsReallyVisible() && IsUpdateMode())
2537 0 : Invalidate(InvalidateFlags::NoErase);
2538 : }
2539 5694 : }
2540 :
2541 1244 : void Ruler::SetNullOffset( long nPos )
2542 : {
2543 1244 : if ( mpData->nNullOff != nPos )
2544 : {
2545 660 : mpData->nNullOff = nPos;
2546 660 : ImplUpdate();
2547 : }
2548 1244 : }
2549 :
2550 570 : void Ruler::SetLeftFrameMargin( long nPos )
2551 : {
2552 570 : if ( (mpData->nLeftFrameMargin != nPos) )
2553 : {
2554 0 : mpData->nLeftFrameMargin = nPos;
2555 0 : ImplUpdate();
2556 : }
2557 570 : }
2558 :
2559 570 : void Ruler::SetRightFrameMargin( long nPos )
2560 : {
2561 570 : if ( (mpData->nRightFrameMargin != nPos) )
2562 : {
2563 326 : mpData->nRightFrameMargin = nPos;
2564 326 : ImplUpdate();
2565 : }
2566 570 : }
2567 :
2568 57549 : void Ruler::SetMargin1( long nPos, sal_uInt16 nMarginStyle )
2569 : {
2570 57549 : if ( (mpData->nMargin1 != nPos) || (mpData->nMargin1Style != nMarginStyle) )
2571 : {
2572 6170 : mpData->nMargin1 = nPos;
2573 6170 : mpData->nMargin1Style = nMarginStyle;
2574 6170 : ImplUpdate();
2575 : }
2576 57549 : }
2577 :
2578 57549 : void Ruler::SetMargin2( long nPos, sal_uInt16 nMarginStyle )
2579 : {
2580 : DBG_ASSERT( (nPos >= mpData->nMargin1) ||
2581 : (mpData->nMargin1Style & RULER_STYLE_INVISIBLE) ||
2582 : (mpData->nMargin2Style & RULER_STYLE_INVISIBLE),
2583 : "Ruler::SetMargin2() - Margin2 < Margin1" );
2584 :
2585 57549 : if ( (mpData->nMargin2 != nPos) || (mpData->nMargin2Style != nMarginStyle) )
2586 : {
2587 6205 : mpData->nMargin2 = nPos;
2588 6205 : mpData->nMargin2Style = nMarginStyle;
2589 6205 : ImplUpdate();
2590 : }
2591 57549 : }
2592 :
2593 0 : void Ruler::SetLines( sal_uInt32 aLineArraySize, const RulerLine* pLineArray )
2594 : {
2595 : // To determine if what has changed
2596 0 : if ( mpData->pLines.size() == aLineArraySize )
2597 : {
2598 0 : sal_uInt32 i = aLineArraySize;
2599 0 : vector<RulerLine>::const_iterator aItr1 = mpData->pLines.begin();
2600 0 : const RulerLine* pAry2 = pLineArray;
2601 0 : while ( i )
2602 : {
2603 0 : if ( (aItr1->nPos != pAry2->nPos) ||
2604 0 : (aItr1->nStyle != pAry2->nStyle) )
2605 0 : break;
2606 0 : ++aItr1;
2607 0 : ++pAry2;
2608 0 : i--;
2609 : }
2610 0 : if ( !i )
2611 0 : return;
2612 : }
2613 :
2614 : // New values and new share issue
2615 : bool bMustUpdate;
2616 0 : if ( IsReallyVisible() && IsUpdateMode() )
2617 0 : bMustUpdate = true;
2618 : else
2619 0 : bMustUpdate = false;
2620 :
2621 : // Delete old lines
2622 0 : if ( bMustUpdate )
2623 0 : Invalidate(InvalidateFlags::NoErase);
2624 :
2625 : // New data set
2626 0 : if ( !aLineArraySize || !pLineArray )
2627 : {
2628 0 : if ( mpData->pLines.empty() )
2629 0 : return;
2630 0 : mpData->pLines.clear();
2631 : }
2632 : else
2633 : {
2634 0 : if ( mpData->pLines.size() != aLineArraySize )
2635 : {
2636 0 : mpData->pLines.resize(aLineArraySize);
2637 : }
2638 :
2639 : std::copy( pLineArray,
2640 : pLineArray + aLineArraySize,
2641 0 : mpData->pLines.begin() );
2642 :
2643 0 : if ( bMustUpdate )
2644 0 : Invalidate(InvalidateFlags::NoErase);
2645 : }
2646 : }
2647 :
2648 56889 : void Ruler::SetBorders( sal_uInt32 aBorderArraySize, const RulerBorder* pBorderArray )
2649 : {
2650 56889 : if ( !aBorderArraySize || !pBorderArray )
2651 : {
2652 56885 : if ( mpData->pBorders.empty() )
2653 56885 : return;
2654 0 : mpData->pBorders.clear();
2655 : }
2656 : else
2657 : {
2658 4 : if ( mpData->pBorders.size() != aBorderArraySize )
2659 : {
2660 2 : mpData->pBorders.resize(aBorderArraySize);
2661 : }
2662 : else
2663 : {
2664 2 : sal_uInt32 i = aBorderArraySize;
2665 2 : const RulerBorder* pAry1 = &mpData->pBorders[0];
2666 2 : const RulerBorder* pAry2 = pBorderArray;
2667 6 : while ( i )
2668 : {
2669 4 : if ( (pAry1->nPos != pAry2->nPos) ||
2670 4 : (pAry1->nWidth != pAry2->nWidth) ||
2671 2 : (pAry1->nStyle != pAry2->nStyle) )
2672 : break;
2673 2 : pAry1++;
2674 2 : pAry2++;
2675 2 : i--;
2676 : }
2677 2 : if ( !i )
2678 2 : return;
2679 : }
2680 : std::copy( pBorderArray,
2681 : pBorderArray + aBorderArraySize,
2682 2 : mpData->pBorders.begin() );
2683 : }
2684 :
2685 2 : ImplUpdate();
2686 : }
2687 :
2688 56316 : void Ruler::SetIndents( sal_uInt32 aIndentArraySize, const RulerIndent* pIndentArray )
2689 : {
2690 :
2691 56316 : if ( !aIndentArraySize || !pIndentArray )
2692 : {
2693 55746 : if ( mpData->pIndents.empty() )
2694 55746 : return;
2695 0 : mpData->pIndents.clear();
2696 : }
2697 : else
2698 : {
2699 570 : if ( mpData->pIndents.size() != aIndentArraySize )
2700 : {
2701 308 : mpData->pIndents.resize(aIndentArraySize);
2702 : }
2703 : else
2704 : {
2705 262 : sal_uInt32 i = aIndentArraySize;
2706 262 : const RulerIndent* pAry1 = &mpData->pIndents[0];
2707 262 : const RulerIndent* pAry2 = pIndentArray;
2708 1293 : while ( i )
2709 : {
2710 1555 : if ( (pAry1->nPos != pAry2->nPos) ||
2711 769 : (pAry1->nStyle != pAry2->nStyle) )
2712 : break;
2713 769 : pAry1++;
2714 769 : pAry2++;
2715 769 : i--;
2716 : }
2717 262 : if ( !i )
2718 245 : return;
2719 : }
2720 :
2721 : std::copy( pIndentArray,
2722 : pIndentArray + aIndentArraySize,
2723 325 : mpData->pIndents.begin() );
2724 : }
2725 :
2726 325 : ImplUpdate();
2727 : }
2728 :
2729 57486 : void Ruler::SetTabs( sal_uInt32 aTabArraySize, const RulerTab* pTabArray )
2730 : {
2731 57486 : if ( aTabArraySize == 0 || pTabArray == NULL )
2732 : {
2733 56719 : if ( mpData->pTabs.empty() )
2734 56719 : return;
2735 0 : mpData->pTabs.clear();
2736 : }
2737 : else
2738 : {
2739 767 : if ( mpData->pTabs.size() != aTabArraySize )
2740 : {
2741 278 : mpData->pTabs.resize(aTabArraySize);
2742 : }
2743 : else
2744 : {
2745 489 : sal_uInt32 i = aTabArraySize;
2746 489 : vector<RulerTab>::iterator aTabIterator = mpData->pTabs.begin();
2747 489 : const RulerTab* pInputArray = pTabArray;
2748 7316 : while ( i )
2749 : {
2750 6349 : RulerTab& aCurrent = *aTabIterator;
2751 12687 : if ( aCurrent.nPos != pInputArray->nPos ||
2752 6338 : aCurrent.nStyle != pInputArray->nStyle )
2753 : {
2754 : break;
2755 : }
2756 6338 : ++aTabIterator;
2757 6338 : pInputArray++;
2758 6338 : i--;
2759 : }
2760 489 : if ( !i )
2761 478 : return;
2762 : }
2763 289 : std::copy(pTabArray, pTabArray + aTabArraySize, mpData->pTabs.begin());
2764 : }
2765 :
2766 289 : ImplUpdate();
2767 : }
2768 :
2769 19075 : void Ruler::SetStyle( WinBits nStyle )
2770 : {
2771 19075 : if ( mnWinStyle != nStyle )
2772 : {
2773 376 : mnWinStyle = nStyle;
2774 376 : ImplInitExtraField( true );
2775 : }
2776 19075 : }
2777 :
2778 0 : void Ruler::DrawTab(vcl::RenderContext& rRenderContext, const Color &rFillColor, const Point& rPos, sal_uInt16 nStyle)
2779 : {
2780 0 : Point aPos(rPos);
2781 0 : sal_uInt16 nTabStyle = nStyle & (RULER_TAB_STYLE | RULER_TAB_RTL);
2782 :
2783 0 : rRenderContext.Push(PushFlags::LINECOLOR | PushFlags::FILLCOLOR);
2784 0 : rRenderContext.SetLineColor();
2785 0 : rRenderContext.SetFillColor(rFillColor);
2786 0 : ImplCenterTabPos(aPos, nTabStyle);
2787 0 : ImplDrawRulerTab(rRenderContext, aPos, nTabStyle, nStyle);
2788 0 : rRenderContext.Pop();
2789 0 : }
2790 :
2791 311 : void Ruler::SetTextRTL(bool bRTL)
2792 : {
2793 311 : if(mpData->bTextRTL != (bool) bRTL)
2794 : {
2795 0 : mpData->bTextRTL = bRTL;
2796 0 : if ( IsReallyVisible() && IsUpdateMode() )
2797 0 : ImplInitExtraField( true );
2798 : }
2799 :
2800 311 : }
2801 :
2802 55915 : long Ruler::GetPageOffset() const
2803 : {
2804 55915 : return mpData->nPageOff;
2805 : }
2806 :
2807 0 : long Ruler::GetNullOffset() const
2808 : {
2809 0 : return mpData->nNullOff;
2810 : }
2811 :
2812 0 : long Ruler::GetMargin1() const
2813 : {
2814 0 : return mpData->nMargin1;
2815 : }
2816 :
2817 0 : long Ruler::GetMargin2() const
2818 : {
2819 0 : return mpData->nMargin2;
2820 : }
2821 :
2822 :
2823 55915 : bool Ruler::GetTextRTL()
2824 : {
2825 55915 : return mpData->bTextRTL;
2826 : }
2827 :
2828 0 : RulerUnitData Ruler::GetCurrentRulerUnit() const
2829 : {
2830 0 : return aImplRulerUnitTab[mnUnitIndex];
2831 : }
2832 :
2833 0 : void Ruler::DrawTicks()
2834 : {
2835 0 : mbFormat = true;
2836 0 : Invalidate(InvalidateFlags::NoErase);
2837 0 : }
2838 :
2839 5 : uno::Reference< XAccessible > Ruler::CreateAccessible()
2840 : {
2841 5 : vcl::Window* pParent = GetAccessibleParentWindow();
2842 : OSL_ENSURE( pParent, "-SvxRuler::CreateAccessible(): No Parent!" );
2843 5 : uno::Reference< XAccessible > xAccParent = pParent->GetAccessible();
2844 5 : if( xAccParent.is() )
2845 : {
2846 : // MT: Fixed compiler issue because the address from a temporary object was used.
2847 : // BUT: Should it really be a Pointer, instead of const&???
2848 5 : OUString aStr;
2849 5 : if ( mnWinStyle & WB_HORZ )
2850 : {
2851 5 : aStr = SvtResId(STR_SVT_ACC_RULER_HORZ_NAME);
2852 : }
2853 : else
2854 : {
2855 0 : aStr = SvtResId(STR_SVT_ACC_RULER_VERT_NAME);
2856 : }
2857 5 : pAccContext = new SvtRulerAccessible( xAccParent, *this, aStr );
2858 5 : pAccContext->acquire();
2859 5 : this->SetAccessible(pAccContext);
2860 5 : return pAccContext;
2861 : }
2862 : else
2863 0 : return uno::Reference< XAccessible >();
2864 798 : }
2865 :
2866 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|