Branch libreoffice-5-0-4
[LibreOffice.git] / include / svtools / ruler.hxx
blob27b1380af08fe7986b3f8bf3a80d31cf0cd75cd8
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This file is part of the LibreOffice project.
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/.
9 * This file incorporates work covered by the following license notice:
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 .
20 #ifndef INCLUDED_SVTOOLS_RULER_HXX
21 #define INCLUDED_SVTOOLS_RULER_HXX
23 #include <svtools/svtdllapi.h>
24 #include <tools/link.hxx>
25 #include <tools/fract.hxx>
26 #include <vcl/window.hxx>
27 #include <vcl/virdev.hxx>
28 #include <vcl/field.hxx>
30 #include <svtools/accessibleruler.hxx>
32 class MouseEvent;
33 class TrackingEvent;
34 class DataChangedEvent;
36 /*************************************************************************
38 Description
39 ============
41 class Ruler
43 This class is used for displaying a ruler, but it can also be used
44 for setting or moving tabs and margins.
46 --------------------------------------------------------------------------
48 WinBits
50 WB_HORZ ruler is displayed horizontally
51 WB_VERT ruler is displayed vertically
52 WB_3DLOOK 3D look
53 WB_BORDER border at the bottom/right margin
54 WB_EXTRAFIELD Field in the upper left corner for
55 displaying and selecting tabs, origin of coordinates, ...
56 WB_RIGHT_ALIGNED Marks the vertical ruler as right aligned
58 --------------------------------------------------------------------------
60 All ruler parameters are set in pixel units. This way double conversions
61 and rounding errors are avoided and the ruler displays the margins
62 at their actual position in the document. Because of this, the application can,
63 for example in tables, do its own roundings and the positions on the ruler will
64 still match those in the document. However, for the ruler to know how the
65 document is displayed on the screen, some additional values have to be configured
67 SetWinPos() sets the offset of the ruler's edit window. In doing so,
68 the width of the window can also be configured. If there is a 0 among the
69 values passed to the function, the position/width is automatically set to
70 the width of the ruler.
72 SetPagePos() sets the offset of the page relative to the edit window and the
73 width of the page. If there is a 0 among the values passed to the function,
74 the position/width is automatically set as if the page filled the whole edit window.
76 SetBorderPos() sets the offset of the border. The position is relative to
77 the upper/left margin of the window. This is needed when there are a horizontal
78 and a vertical ruler visible at the same time. Example:
79 aHRuler.SetBorderPos( aVRuler.GetSizePixel().Width()-1 );
81 SetNullOffset() sets the origin relative to the page.
83 All the other values (margins, indentation, tabs, ...) refer to the origin,
84 which is set with SetNullOffset().
86 The values are computed as described below:
88 - WinPos (if both windows have the same parent)
90 Point aHRulerPos = aHRuler.GetPosPixel();
91 Point aEditWinPos = aEditWin.GetPosPixel();
92 aHRuler.SetWinPos( aEditWinPos().X() - aHRulerPos.X() );
94 - PagePos
96 Point aPagePos = aEditWin.LogicToPixel( aEditWin.GetPagePos() );
97 aHRuler.SetPagePos( aPagePos().X() );
99 - All other values
101 Add the logical values, recompute as position and subtract the
102 previously saved pixel positions (of PagePos and Null Offset).
104 --------------------------------------------------------------------------
106 SetUnit() and SetZoom() configure which unit is used to display
107 the values on the ruler. The following units are accepted:
109 FUNIT_MM
110 FUNIT_CM (Default)
111 FUNIT_M
112 FUNIT_KM
113 FUNIT_INCH
114 FUNIT_FOOT
115 FUNIT_MILE
116 FUNIT_POINT
117 FUNIT_PICA
119 --------------------------------------------------------------------------
121 SetMargin1() sets the upper/left margin and SetMargin2() sets the
122 bottom/right margin. If these methods are called without arguments,
123 no margins are displayed. Otherwise, the following arguments can be passed:
125 long nPos - offset in pixels relative to the origin
126 sal_uInt16 nStyle - bit style:
127 RULER_MARGIN_SIZEABLE
128 margin size can be changed
130 The following bits can be set in addition
131 to these styles:
132 RULER_STYLE_INVISIBLE
135 SetBorders() sets an array of margins. To do this, an array of type RulerBorder
136 has to be passed. In the array, the following values have to be initialized:
138 long nPos - offset in pixels relative to the origin
139 long nWidth - column spacing in pixels (can also be 0, for example,
140 for table columns)
141 sal_uInt16 nStyle - bit style:
142 RULER_BORDER_SIZEABLE
143 Column spacing can be changed. This flag should
144 only be set if the size of the spacing is changed,
145 not that of a cell.
146 RULER_BORDER_MOVEABLE
147 Column spacing/border can be moved. Whenever
148 table borders are to be moved, this flag should
149 be set instead of SIZEABLE (SIZEABLE indicates
150 that the size of a spacing, not that of a single
151 cell can be changed).
152 RULER_BORDER_VARIABLE
153 Not all of the column spacings are equal
154 RULER_BORDER_TABLE
155 Table border. Whenever this style is set, the column
156 width must be 0.
157 RULER_BORDER_SNAP
158 Auxiliary line. Whenever this style is set, the
159 column width must be 0.
160 RULER_BORDER_MARGIN
161 Margin. Whenever this style is set, the column
162 width must be 0.
164 The following bits can be set in addition
165 to these styles:
166 RULER_STYLE_INVISIBLE
168 SetIndents() sets an array of indents. This method may only be used for horizontal
169 rulers. A Ruler Indent must be passed as an argument, with the following values
170 initialized:
172 long nPos - offset relative to the origin in pixels
173 sal_uInt16 nStyle - bit style:
174 RULER_INDENT_TOP (indent of the first line)
175 RULER_INDENT_BOTTOM (left/right indent)
176 RULER_INDENT_BORDER (Vertical line that shows the border distance)
177 The following bits can be set in addition
178 to these styles:
179 RULER_STYLE_DONTKNOW (for old position or for
180 ambiguity)
181 RULER_STYLE_INVISIBLE
183 SetTabs() sets an array of tabs. This method may only be used for horizontal rulers.
184 An array of type RulerTab must be passed as an argument, with the following values
185 initialized:
187 long nPos - offset relative to the origin in pixels
188 sal_uInt16 nStyle - bit style:
189 RULER_TAB_DEFAULT (can't be selected)
190 RULER_TAB_LEFT
191 RULER_TAB_CENTER
192 RULER_TAB_RIGHT
193 RULER_TAB_DECIMAL
194 The following bits can be set in addition
195 to these styles:
196 RULER_STYLE_DONTKNOW (for old position of for
197 ambiguity)
198 RULER_STYLE_INVISIBLE
200 SetLines() displays position lines in the ruler. An array of type RulerLine must be passed, with
201 the following values initialized:
203 long nPos - offset relative to the origin in pixels
204 sal_uInt16 nStyle - bit style (has to be 0 currently)
206 --------------------------------------------------------------------------
208 If the user should also be able to change the margins tabs, borders, ...
209 in the ruler, a bit more effort is necessary. In this case, the StartDrag(),
210 Drag() and EndDrag() methods have to be overridden. For the StartDrag() method
211 it is possible to prevent dragging by returning FALSE. In the drag handler,
212 the drag position must be queried and the values must be moved to the new
213 position. This is done by calling the particular Set methods. While in the
214 drag handler, the values are just cached and only afterward the ruler is redrawn.
215 All the handlers can also be set as links with the particular Set..Hdl() methods.
217 - StartDrag()
218 Is called when dragging is started. If FALSE is returned, the dragging.
219 won't be executed. If TRUE is returned, the dragging will be permitted.
220 If the handler isn't overridden, FALSE will be returned.
222 - EndDrag()
223 Is called at the end of dragging.
225 - Drag()
226 Is called when dragging takes place.
228 - Click()
229 This handler is called when no element has been clicked on.
230 The position can be queried with GetClickPos(). This way it is possible
231 to, for example, ser tabs in the ruler. After calling the click handler,
232 the drag, if any, is immediately triggered. This makes it possible to
233 set a new tab in the click handler and then immediately move it.
235 - DoubleClick()
236 This handler is called when a double-click has been performed outside
237 the special panel. The methods GetClickType(), GetClickAryPos() and
238 GetClickPos() can be used to query what has been clicked on.
239 This way you can, for example, show the tab dialog when a double-click
240 is performed on a tab.
242 In the drag handler it is possible to query what has been dragged and where
243 it has been dragged. There are the following query methods:
245 - GetDragType()
246 Returns what has been dragged.
247 RULER_TYPE_MARGIN1
248 RULER_TYPE_MARGIN2
249 RULER_TYPE_BORDER
250 RULER_TYPE_INDENT
251 RULER_TYPE_TAB
253 - GetDragPos()
254 Returns the pixel position to which the user has moved the mouse
255 relative to the set zero-offset.
257 - GetDragAryPos()
258 Returns the index in the array if a border, an indent or a tab
259 is being dragged. Attention: During a drag process, the array position
260 of the item that has been set before the drag is returned.
261 Therefore, it is for example also possible, to no longer show a tab
262 if the mouse is dragged out of the ruler in bottom/right direction.
264 - GetDragSize()
265 If Borders are dragged, this can be used to query whether the size
266 resp. which side or the position should be changed.
267 RULER_DRAGSIZE_MOVE oder 0 - Move
268 RULER_DRAGSIZE_1 - left/upper border
269 RULER_DRAGSIZE_2 - right/bottom border
271 - IsDragDelete()
272 This method can be used to query whether the mouse has been
273 moved out of the window at the bottom/right while dragging.
274 By this, it can for example be determined whether the user
275 wants to delete a tab.
277 - IsDragCanceled()
278 Using this Handler, it can be queried in the EndDrag handler
279 whether the action was canceled by the user releasing the
280 mouse at the top/left of the window or by pressing ESC.
281 In this case, the values are not applied. If during the
282 dragging, the mouse is dragged out of the window at the
283 top/left, the old values are displayed automatically without
284 the Drag handler being called.
285 But if the user has moved the value to the old position, the
286 method returns 'false' nevertheless.
287 If this should be avoided, the application must remember the
288 old value in the StartDrag handler and compare the value in the
289 EndDrag handler.
291 - GetDragModifier()
292 Returns the modifier keys that were pressed when the Drag process
293 was started. See MouseEvent.
295 - GetClickPos()
296 Returns the pixel position at which the user has pressed the mouse
297 with respect to the configured null-offset.
299 - GetClickType()
300 Returns what is applied by double click:
301 RULER_TYPE_DONTKNOW (no element in the ruler area)
302 RULER_TYPE_OUTSIDE (outside of the ruler area)
303 RULER_TYPE_MARGIN1 (only Margin1 border)
304 RULER_TYPE_MARGIN2 (only Margin2 border)
305 RULER_TYPE_BORDER (Border: GetClickAryPos())
306 RULER_TYPE_INDENT (indent: GetClickAryPos())
307 RULER_TYPE_TAB (Tab: GetClickAryPos())
309 - GetClickAryPos()
310 Returns the index in the array if a Border, an Indent or a Tab
311 is applied via DoubleClick.
313 - GetType()
314 This method can be used to carry out a HitTest,
315 in order to possibly also apply sth to an Item using the right
316 mouse button by catching the MouseButtonDown handler. As
317 parameters, the window position and possibly a pointer to a
318 sal_uInt16 are passed, in order to determine the array position
319 of a Tab, an Indent, or a Border. The following values are
320 returned as type:
321 RULER_TYPE_DONTKNOW (no element in the ruler area)
322 RULER_TYPE_OUTSIDE (outside of the ruler area)
323 RULER_TYPE_MARGIN1 (only Margin1 border)
324 RULER_TYPE_MARGIN2 (only Margin2 border)
325 RULER_TYPE_BORDER (Border: GetClickAryPos())
326 RULER_TYPE_INDENT (indent: GetClickAryPos())
327 RULER_TYPE_TAB (Tab: GetClickAryPos())
329 If the drag process should be canceled, this can be done using CancelDrag().
330 There are the following methods for controlling the Drag:
332 - IsDrag()
333 Returns 'true' if the ruler is in a drag process.
335 - CancelDrag()
336 Cancels the drag process, if one is being carried out. During this,
337 the old values are restored and the Drag and the EndDrag handlers
338 are called.
340 In order to trigger a Drag from the document, there are the following
341 methods:
343 - StartDocDrag()
344 This method is passed the MouseEvent of the document window
345 and what should be dragged. If RULER_TYPE_DONTKNOW is passed
346 as DragType, the ruler decides what should be dragged. In case
347 of the other types, the Drag is only started if a respective
348 element was found at the given position.
349 This is for example necessary if indents and columns are located
350 at the same X position.
351 The return value indicates whether the Drag has been triggered.
352 If a Drag is triggered, the ruler takes over the normal drag
353 control and behaves as if the ruler had been clicked directly.
354 Thus, the ruler captures the mouse and also takes over control
355 of the Cancel (via keyboard, or if the mouse is moved outside
356 of the ruler above it or left of it). All handlers are called,
357 too (including the StartDrag handler). If a MouseEvent with
358 ClickCount 2 is passed, the DoubleClick handler is also called,
359 respectively.
361 --------------------------------------------------------------------------
363 For the extra field, the content can be determined and there are handlers
364 that can be used to handle specific actions.
366 - ExtraDown()
367 This handler is called when the mouse is pressed in the extra field.
369 - SetExtraType()
370 With this method, it can be defined what should be displayed in
371 the extra field.
372 - ExtraType what should be displayed in the extra field
373 RULER_EXTRA_DONTKNOW (nothing)
374 RULER_EXTRA_NULLOFFSET (coordinate axes)
375 RULER_EXTRA_TAB (Tab)
376 - sal_uInt16 nStyle bit field as style:
377 RULER_STYLE_HIGHLIGHT (selected)
378 RULER_TAB_... (a Tab style)
380 - GetExtraClick()
381 Returns the number of mouse clicks. By this, it is for example
382 also possible to trigger an action by a DoubleClick in the
383 extra field.
385 - GetExtraModifier()
386 Returns the modifier keys that were pressed when the extra field
387 was clicked. See MouseEvent.
389 --------------------------------------------------------------------------
391 Further helper functions:
393 - static Ruler::DrawTab()
394 With this method, a Tab can be output on an OutputDevice.
395 By this, it is also possible to show the Tabs in dialogs like
396 they are drawn in the ruler.
398 This method outputs the Tab centred at the given position. The size
399 of the tabs can be defined by the defines RULER_TAB_WIDTH and
400 RULER_TAB_HEIGHT.
402 --------------------------------------------------------------------------
404 Tips for the use of the ruler:
406 - For the ruler, neither in the Drag mode nor elsewhere, the setting
407 of the values must be bracketed in SetUpdateMode(). The ruler itself
408 takes care that, if multiple values are set, they are automatically
409 grouped together and output flicker-free.
411 - Initially, the sizes, positions and values should be set first for the
412 ruler, before it is displayed. This is important because otherwise
413 many values are calculated unnecessarily.
415 - When the document window, in which the ruler resides, becomes active
416 resp. unactive, the methods Activate() and Deactivate() should be
417 called by the ruler. That is so because the display is switched according
418 to the settings and the system.
420 - For example, while dragging Tabs and Indents, the old positions should
421 also be shown if possible. For that, while setting the Tabs and Indents,
422 the old positions should be inserted first into the array in addition
423 and be linked with the style RULER_STYLE_DONTKNOW. After that, the
424 remaining values should be set in the array.
426 - In case of multiple selected paragraphs and table cells, the Tabs and
427 Indents should be displayed in grey in front of the first cell resp.
428 the first paragraph. This can also be achieved by the style
429 RULER_STYLE_DONTKNOW.
431 - The measuring arrow should always be shown when the Alt key (WW-Like)
432 is pressed during the drag. Maybe, this setting should be configurable
433 always and possibly the measuring arrows always be shown while
434 dragging. For all settings, the values should always be rounded to the
435 multiple of one value because the screen resolution is very unprecise.
437 - DoubleClicks should be handled in the following way (GetClickType()):
438 - RULER_TYPE_DONTKNOW
439 RULER_TYPE_MARGIN1
440 RULER_TYPE_MARGIN2
441 If the conditions GetClickPos() <= GetMargin1() or
442 GetClickPos() >= GetMargin2() are met or the type is equal to
443 RULER_TYPE_MARGIN1 or RULER_TYPE_MARGIN2, a side dialog should
444 be displayed in which the focus is at the respective border.
445 - RULER_TYPE_BORDER
446 A column or table dialog should be shown in which the focus
447 is at the respective column that can be queried using
448 GetClickAryPos().
449 - RULER_TYPE_INDENT
450 The dialog, in which the indents can be configured, should be
451 shown. In this, the focus should be on the indent which can
452 be queried using GetClickAryPos().
453 - RULER_TYPE_TAB
454 A TabDialog should be displayed in which the Tab, that can be
455 queried using GetClickAryPos(), should be selected.
457 *************************************************************************/
459 // - WinBits -
461 #define WB_EXTRAFIELD ((WinBits)0x00004000)
462 #define WB_RIGHT_ALIGNED ((WinBits)0x00008000)
463 #define WB_STDRULER WB_HORZ
465 // - Ruler-Type -
467 enum RulerType { RULER_TYPE_DONTKNOW, RULER_TYPE_OUTSIDE,
468 RULER_TYPE_MARGIN1, RULER_TYPE_MARGIN2,
469 RULER_TYPE_BORDER, RULER_TYPE_INDENT, RULER_TYPE_TAB };
471 enum RulerExtra { RULER_EXTRA_DONTKNOW,
472 RULER_EXTRA_NULLOFFSET, RULER_EXTRA_TAB };
474 #define RULER_STYLE_HIGHLIGHT ((sal_uInt16)0x8000)
475 #define RULER_STYLE_DONTKNOW ((sal_uInt16)0x4000)
476 #define RULER_STYLE_INVISIBLE ((sal_uInt16)0x2000)
478 #define RULER_DRAGSIZE_MOVE 0
479 #define RULER_DRAGSIZE_1 1
480 #define RULER_DRAGSIZE_2 2
482 #define RULER_MOUSE_BORDERMOVE 5
483 #define RULER_MOUSE_BORDERWIDTH 5
484 #define RULER_MOUSE_MARGINWIDTH 3
486 // - RulerMargin -
488 #define RULER_MARGIN_SIZEABLE ((sal_uInt16)0x0001)
490 // - RulerBorder -
492 #define RULER_BORDER_SIZEABLE ((sal_uInt16)0x0001)
493 #define RULER_BORDER_MOVEABLE ((sal_uInt16)0x0002)
494 #define RULER_BORDER_VARIABLE ((sal_uInt16)0x0004)
495 #define RULER_BORDER_TABLE ((sal_uInt16)0x0008)
496 #define RULER_BORDER_SNAP ((sal_uInt16)0x0010)
497 #define RULER_BORDER_MARGIN ((sal_uInt16)0x0020)
499 struct RulerBorder
501 long nPos;
502 long nWidth;
503 sal_uInt16 nStyle;
504 long nMinPos; //minimum/maximum position, supported for table borders/rows
505 long nMaxPos;
508 // - RulerIndent -
510 #define RULER_INDENT_TOP ((sal_uInt16)0x0000)
511 #define RULER_INDENT_BOTTOM ((sal_uInt16)0x0001)
512 #define RULER_INDENT_BORDER ((sal_uInt16)0x0002)
513 #define RULER_INDENT_STYLE ((sal_uInt16)0x000F)
515 struct RulerIndent
517 long nPos;
518 sal_uInt16 nStyle;
521 // - RulerTab -
523 #define RULER_TAB_LEFT ((sal_uInt16)0x0000)
524 #define RULER_TAB_RIGHT ((sal_uInt16)0x0001)
525 #define RULER_TAB_CENTER ((sal_uInt16)0x0002)
526 #define RULER_TAB_DECIMAL ((sal_uInt16)0x0003)
527 #define RULER_TAB_DEFAULT ((sal_uInt16)0x0004)
528 #define RULER_TAB_STYLE ((sal_uInt16)0x000F)
529 #define RULER_TAB_RTL ((sal_uInt16)0x0010)
531 struct RulerTab
533 long nPos;
534 sal_uInt16 nStyle;
539 // - RulerLine -
541 struct RulerLine
543 long nPos;
544 sal_uInt16 nStyle;
547 struct RulerSelection
549 long nPos;
550 RulerType eType;
551 sal_uInt16 nAryPos;
552 sal_uInt16 mnDragSize;
553 bool bSize;
554 bool bSizeBar;
555 bool bExpandTest;
557 RulerSelection()
558 : nPos(0)
559 , eType(RULER_TYPE_DONTKNOW)
560 , nAryPos(0)
561 , mnDragSize(0)
562 , bSize(false)
563 , bSizeBar(false)
564 , bExpandTest( false )
568 struct RulerUnitData
570 MapUnit eMapUnit; // MAP_UNIT for calculaion
571 long nTickUnit; // Unit divider
572 double nTick1; // Minimal step
573 double nTick2; // Tick quarter unit
574 double nTick3; // Tick half unit
575 double nTick4; // Tick whole unit
576 long n100THMM; // 100mm Unit divider
577 sal_uInt16 nUnitDigits; // Number of digits
578 sal_Char aUnitStr[8]; // Unit string
581 // Data for drawing ruler tabstops
582 struct RulerTabData
584 sal_uInt16 DPIScaleFactor;
585 sal_uInt16 width;
586 sal_uInt16 height;
587 sal_uInt16 height2;
588 sal_uInt16 width2;
589 sal_uInt16 cwidth;
590 sal_uInt16 cwidth2;
591 sal_uInt16 cwidth3;
592 sal_uInt16 cwidth4;
593 sal_uInt16 dheight;
594 sal_uInt16 dheight2;
595 sal_uInt16 dwidth;
596 sal_uInt16 dwidth2;
597 sal_uInt16 dwidth3;
598 sal_uInt16 dwidth4;
599 sal_uInt16 textoff;
602 // - Ruler -
604 class ImplRulerData;
606 class SVT_DLLPUBLIC Ruler : public vcl::Window
608 private:
609 ScopedVclPtr<VirtualDevice> maVirDev;
610 MapMode maMapMode;
611 long mnBorderOff;
612 long mnWinOff;
613 long mnWinWidth;
614 long mnWidth;
615 long mnHeight;
616 long mnVirOff;
617 long mnVirWidth;
618 long mnVirHeight;
619 long mnBorderWidth;
620 long mnStartDragPos;
621 long mnDragPos;
622 ImplSVEvent * mnUpdateEvtId;
623 ImplRulerData* mpSaveData;
624 ImplRulerData* mpData;
625 ImplRulerData* mpDragData;
626 Rectangle maExtraRect;
627 WinBits mnWinStyle;
628 sal_uInt16 mnUnitIndex;
629 sal_uInt16 mnDragAryPos;
630 sal_uInt16 mnDragSize;
631 sal_uInt16 mnDragModifier;
632 sal_uInt16 mnExtraStyle;
633 sal_uInt16 mnExtraClicks;
634 sal_uInt16 mnExtraModifier;
635 long mnCharWidth;
636 long mnLineHeight;
638 RulerExtra meExtraType;
639 RulerType meDragType;
640 MapUnit meSourceUnit;
641 FieldUnit meUnit;
642 Fraction maZoom;
643 bool mbCalc;
644 bool mbFormat;
645 bool mbDrag;
646 bool mbDragDelete;
647 bool mbDragCanceled;
648 bool mbAutoWinWidth;
649 bool mbActive;
650 sal_uInt8 mnUpdateFlags;
652 RulerSelection maHoverSelection;
654 Link<> maStartDragHdl;
655 Link<> maDragHdl;
656 Link<> maEndDragHdl;
657 Link<> maClickHdl;
658 Link<> maDoubleClickHdl;
659 Link<> maExtraDownHdl;
661 std::unique_ptr<RulerSelection> mxCurrentHitTest;
662 std::unique_ptr<RulerSelection> mxPreviousHitTest;
664 SvtRulerAccessible* pAccContext;
666 SVT_DLLPRIVATE void ImplVDrawLine(vcl::RenderContext& rRenderContext, long nX1, long nY1, long nX2, long nY2 );
667 SVT_DLLPRIVATE void ImplVDrawRect(vcl::RenderContext& rRenderContext, long nX1, long nY1, long nX2, long nY2 );
668 SVT_DLLPRIVATE void ImplVDrawText(vcl::RenderContext& rRenderContext, long nX, long nY, const OUString& rText,
669 long nMin = LONG_MIN, long nMax = LONG_MAX );
671 SVT_DLLPRIVATE void ImplDrawTicks(vcl::RenderContext& rRenderContext,
672 long nMin, long nMax, long nStart, long nVirTop, long nVirBottom);
673 SVT_DLLPRIVATE void ImplDrawBorders(vcl::RenderContext& rRenderContext,
674 long nMin, long nMax, long nVirTop, long nVirBottom);
675 SVT_DLLPRIVATE void ImplDrawIndent(vcl::RenderContext& rRenderContext,
676 const Polygon& rPoly, sal_uInt16 nStyle, bool bIsHit = false);
677 SVT_DLLPRIVATE void ImplDrawIndents(vcl::RenderContext& rRenderContext,
678 long nMin, long nMax, long nVirTop, long nVirBottom);
679 SVT_DLLPRIVATE void ImplDrawTab(vcl::RenderContext& rRenderContext, const Point& rPos, sal_uInt16 nStyle);
680 SVT_DLLPRIVATE void ImplDrawTabs(vcl::RenderContext& rRenderContext,
681 long nMin, long nMax, long nVirTop, long nVirBottom);
683 using Window::ImplInit;
684 SVT_DLLPRIVATE void ImplInit( WinBits nWinBits );
685 SVT_DLLPRIVATE void ImplInitSettings( bool bFont, bool bForeground, bool bBackground );
686 SVT_DLLPRIVATE void ImplCalc();
687 SVT_DLLPRIVATE void ImplFormat(vcl::RenderContext& rRenderContext);
688 SVT_DLLPRIVATE void ImplInitExtraField( bool bUpdate );
689 SVT_DLLPRIVATE void ImplInvertLines(vcl::RenderContext& rRenderContext, bool bErase = false);
690 SVT_DLLPRIVATE void ImplDraw(vcl::RenderContext& rRenderContext);
691 SVT_DLLPRIVATE void ImplDrawExtra(vcl::RenderContext& rRenderContext, bool bPaint = false);
692 SVT_DLLPRIVATE void ImplUpdate( bool bMustCalc = false );
694 virtual void ApplySettings(vcl::RenderContext& rRenderContext) SAL_OVERRIDE;
696 using Window::ImplHitTest;
697 SVT_DLLPRIVATE bool ImplHitTest( const Point& rPosition,
698 RulerSelection* pHitTest,
699 bool bRequiredStyle = false,
700 sal_uInt16 nRequiredStyle = 0 ) const;
701 SVT_DLLPRIVATE bool ImplDocHitTest( const Point& rPos, RulerType eDragType, RulerSelection* pHitTest ) const;
702 SVT_DLLPRIVATE bool ImplStartDrag( RulerSelection* pHitTest, sal_uInt16 nModifier );
703 SVT_DLLPRIVATE void ImplDrag( const Point& rPos );
704 SVT_DLLPRIVATE void ImplEndDrag();
706 Ruler (const Ruler &) SAL_DELETED_FUNCTION;
707 Ruler& operator= (const Ruler &) SAL_DELETED_FUNCTION;
709 protected:
710 long GetRulerVirHeight() const { return mnVirHeight;}
711 MapMode GetCurrentMapMode() const { return maMapMode; }
712 RulerUnitData GetCurrentRulerUnit() const;
714 public:
715 Ruler( vcl::Window* pParent, WinBits nWinStyle = WB_STDRULER );
716 virtual ~Ruler();
717 virtual void dispose() SAL_OVERRIDE;
719 virtual void MouseButtonDown( const MouseEvent& rMEvt ) SAL_OVERRIDE;
720 virtual void MouseMove( const MouseEvent& rMEvt ) SAL_OVERRIDE;
721 virtual void Tracking( const TrackingEvent& rTEvt ) SAL_OVERRIDE;
722 virtual void Paint(vcl::RenderContext& rRenderContext, const Rectangle& rRect) SAL_OVERRIDE;
723 virtual void Resize() SAL_OVERRIDE;
724 virtual void StateChanged( StateChangedType nStateChange ) SAL_OVERRIDE;
725 virtual void DataChanged( const DataChangedEvent& rDCEvt ) SAL_OVERRIDE;
727 virtual bool StartDrag();
728 virtual void Drag();
729 virtual void EndDrag();
730 virtual void Click();
731 void DoubleClick();
732 virtual void ExtraDown();
734 void Activate() SAL_OVERRIDE;
735 void Deactivate() SAL_OVERRIDE;
736 bool IsActive() const { return mbActive; }
738 void SetWinPos( long nOff = 0, long nWidth = 0 );
739 long GetWinOffset() const { return mnWinOff; }
740 long GetWinWidth() const { return mnWinWidth; }
741 void SetPagePos( long nOff = 0, long nWidth = 0 );
742 long GetPageOffset() const;
743 void SetBorderPos( long nOff = 0 );
744 long GetBorderOffset() const { return mnBorderOff; }
745 Rectangle GetExtraRect() const { return maExtraRect; }
747 void SetUnit( FieldUnit eNewUnit );
748 FieldUnit GetUnit() const { return meUnit; }
749 void SetZoom( const Fraction& rNewZoom );
750 Fraction GetZoom() const { return maZoom; }
752 void SetSourceUnit( MapUnit eNewUnit ) { meSourceUnit = eNewUnit; }
753 MapUnit GetSourceUnit() const { return meSourceUnit; }
755 void SetExtraType( RulerExtra eNewExtraType, sal_uInt16 nStyle = 0 );
756 RulerExtra GetExtraType() const { return meExtraType; }
757 sal_uInt16 GetExtraStyle() const { return mnExtraStyle; }
758 sal_uInt16 GetExtraClicks() const { return mnExtraClicks; }
759 sal_uInt16 GetExtraModifier() const { return mnExtraModifier; }
761 bool StartDocDrag( const MouseEvent& rMEvt,
762 RulerType eDragType = RULER_TYPE_DONTKNOW );
763 RulerType GetDragType() const { return meDragType; }
764 long GetDragPos() const { return mnDragPos; }
765 sal_uInt16 GetDragAryPos() const { return mnDragAryPos; }
766 sal_uInt16 GetDragSize() const { return mnDragSize; }
767 bool IsDragDelete() const { return mbDragDelete; }
768 bool IsDragCanceled() const { return mbDragCanceled; }
769 sal_uInt16 GetDragModifier() const { return mnDragModifier; }
770 bool IsDrag() const { return mbDrag; }
771 void CancelDrag();
772 long GetClickPos() const { return mnDragPos; }
773 RulerType GetClickType() const { return meDragType; }
774 sal_uInt16 GetClickAryPos() const { return mnDragAryPos; }
776 RulerSelection GetHoverSelection() const { return maHoverSelection; }
778 using Window::GetType;
779 RulerType GetType( const Point& rPos, sal_uInt16* pAryPos = NULL );
781 void SetNullOffset( long nPos );
782 long GetNullOffset() const;
783 void SetMargin1() { SetMargin1( 0, RULER_STYLE_INVISIBLE ); }
784 void SetMargin1( long nPos, sal_uInt16 nMarginStyle = RULER_MARGIN_SIZEABLE );
785 long GetMargin1() const;
786 void SetMargin2() { SetMargin2( 0, RULER_STYLE_INVISIBLE ); }
787 void SetMargin2( long nPos, sal_uInt16 nMarginStyle = RULER_MARGIN_SIZEABLE );
788 long GetMargin2() const;
790 void SetLeftFrameMargin( long nPos );
791 void SetRightFrameMargin( long nPos );
792 void SetLines( sal_uInt32 n = 0, const RulerLine* pLineAry = NULL );
793 void SetBorders( sal_uInt32 n = 0, const RulerBorder* pBrdAry = NULL );
794 void SetIndents( sal_uInt32 n = 0, const RulerIndent* pIndentAry = NULL );
796 void SetTabs( sal_uInt32 n = 0, const RulerTab* pTabAry = NULL );
797 sal_uInt32 GetTabCount() const;
798 const RulerTab* GetTabs() const;
800 static void DrawTab(vcl::RenderContext& rRenderContext, const Color &rFillColor,
801 const Point& rPos, sal_uInt16 nStyle);
803 void SetStyle( WinBits nStyle );
804 WinBits GetStyle() const { return mnWinStyle; }
806 void SetStartDragHdl( const Link<>& rLink ) { maStartDragHdl = rLink; }
807 const Link<>& GetStartDragHdl() const { return maStartDragHdl; }
808 void SetDragHdl( const Link<>& rLink ) { maDragHdl = rLink; }
809 const Link<>& GetDragHdl() const { return maDragHdl; }
810 void SetEndDragHdl( const Link<>& rLink ) { maEndDragHdl = rLink; }
811 const Link<>& GetEndDragHdl() const { return maEndDragHdl; }
812 void SetClickHdl( const Link<>& rLink ) { maClickHdl = rLink; }
813 const Link<>& GetClickHdl() const { return maClickHdl; }
814 void SetDoubleClickHdl( const Link<>& rLink ) { maDoubleClickHdl = rLink; }
815 const Link<>& GetDoubleClickHdl() const { return maDoubleClickHdl; }
816 void SetExtraDownHdl( const Link<>& rLink ) { maExtraDownHdl = rLink; }
817 const Link<>& GetExtraDownHdl() const { return maExtraDownHdl; }
819 void SetTextRTL(bool bRTL);
820 bool GetTextRTL();
821 void SetCharWidth( long nWidth ) { mnCharWidth = nWidth ; }
822 void SetLineHeight( long nHeight ) { mnLineHeight = nHeight ; }
824 void DrawTicks();
826 virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > CreateAccessible() SAL_OVERRIDE;
829 #endif // INCLUDED_SVTOOLS_RULER_HXX
831 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */