bump product version to 4.2.0.1
[LibreOffice.git] / include / svtools / ruler.hxx
bloba6ae1e5a19fc48e8eb7aae518111c530b9ba159f
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 _RULER_HXX
21 #define _RULER_HXX
23 #include <svtools/svtdllapi.h>
24 #include <tools/link.hxx>
25 #include <vcl/window.hxx>
26 #include <vcl/virdev.hxx>
27 #include <vcl/field.hxx>
29 #include <boost/scoped_ptr.hpp>
31 class MouseEvent;
32 class TrackingEvent;
33 class DataChangedEvent;
35 /*************************************************************************
37 Description
38 ============
40 class Ruler
42 This class is used for displaying a ruler, but it can also be used
43 for setting or moving tabs and margins.
45 --------------------------------------------------------------------------
47 WinBits
49 WB_HORZ ruler is displayed horizontally
50 WB_VERT ruler is displayed vertically
51 WB_3DLOOK 3D look
52 WB_BORDER border at the bottom/right margin
53 WB_EXTRAFIELD Field in the upper left corner for
54 displaying and selecting tabs, origin of coordinates, ...
55 WB_RIGHT_ALIGNED Marks the vertical ruler as right aligned
57 --------------------------------------------------------------------------
59 All ruler parameters are set in pixel units. This way double conversions
60 and rounding errors are avoided and the ruler displays the margins
61 at their actual position in the document. Because of this, the application can,
62 for example in tables, do its own roundings and the positions on the ruler will
63 still match those in the document. However, for the ruler to know how the
64 document is displayed on the screen, some additional values have to be configured
66 SetWinPos() sets the offset of the ruler's edit window. In doing so,
67 the width of the window can also be configured. If there is a 0 among the
68 values passed to the function, the position/width is automatically set to
69 the width of the ruler.
71 SetPagePos() sets the offset of the page relative to the edit window and the
72 width of the page. If there is a 0 among the values passed to the function,
73 the position/width is automatically set as if the page filled the whole edit window.
75 SetBorderPos() sets the offset of the border. The position is relative to
76 the upper/left margin of the window. This is needed when there are a horizontal
77 and a vertical ruler visible at the same time. Example:
78 aHRuler.SetBorderPos( aVRuler.GetSizePixel().Width()-1 );
80 SetNullOffset() sets the origin relative to the page.
82 All the other values (margins, indentation, tabs, ...) refer to the origin,
83 which is set with SetNullOffset().
85 The values are computed as described below:
87 - WinPos (if both windows have the same parent)
89 Point aHRulerPos = aHRuler.GetPosPixel();
90 Point aEditWinPos = aEditWin.GetPosPixel();
91 aHRuler.SetWinPos( aEditWinPos().X() - aHRulerPos.X() );
93 - PagePos
95 Point aPagePos = aEditWin.LogicToPixel( aEditWin.GetPagePos() );
96 aHRuler.SetPagePos( aPagePos().X() );
98 - All other values
100 Add the logical values, recompute as position and subtract the
101 previously saved pixel positions (of PagePos and Null Offset).
103 --------------------------------------------------------------------------
105 SetUnit() and SetZoom() configure which unit is used to display
106 the values on the ruler. The following units are accepted:
108 FUNIT_MM
109 FUNIT_CM (Default)
110 FUNIT_M
111 FUNIT_KM
112 FUNIT_INCH
113 FUNIT_FOOT
114 FUNIT_MILE
115 FUNIT_POINT
116 FUNIT_PICA
118 --------------------------------------------------------------------------
120 SetMargin1() sets the upper/left margin and SetMargin2() sets the
121 bottom/right margin. If these methods are called without arguments,
122 no margins are displayed. Otherwise, the following arguments can be passed:
124 long nPos - offset in pixels relative to the origin
125 sal_uInt16 nStyle - bit style:
126 RULER_MARGIN_SIZEABLE
127 margin size can be changed
129 The following bits can be set in addition
130 to these styles:
131 RULER_STYLE_INVISIBLE
134 SetBorders() sets an array of margins. To do this, an array of type RulerBorder
135 has to be passed. In the array, the following values have to be initialized:
137 long nPos - offset in pixels relative to the origin
138 long nWidth - column spacing in pixels (can also be 0, for example,
139 for table columns)
140 sal_uInt16 nStyle - bit style:
141 RULER_BORDER_SIZEABLE
142 Column spacing can be changed. This flag should
143 only be set if the size of the spacing is changed,
144 not that of a cell.
145 RULER_BORDER_MOVEABLE
146 Column spacing/border can be moved. Whenever
147 table borders are to be moved, this flag should
148 be set instead of SIZEABLE (SIZEABLE indicates
149 that the size of a spacing, not that of a single
150 cell can be changed).
151 RULER_BORDER_VARIABLE
152 Not all of the column spacings are equal
153 RULER_BORDER_TABLE
154 Table border. Whenever this style is set, the column
155 width must be 0.
156 RULER_BORDER_SNAP
157 Auxiliary line. Whenever this style is set, the
158 column width must be 0.
159 RULER_BORDER_MARGIN
160 Margin. Whenever this style is set, the column
161 width must be 0.
163 The following bits can be set in addition
164 to these styles:
165 RULER_STYLE_INVISIBLE
167 SetIndents() sets an array of indents. This method may only be used for horizontal
168 rulers. A Ruler Indent must be passed as an argument, with the following values
169 initialized:
171 long nPos - offset relative to the origin in pixels
172 sal_uInt16 nStyle - bit style:
173 RULER_INDENT_TOP (indent of the first line)
174 RULER_INDENT_BOTTOM (left/right indent)
175 RULER_INDENT_BORDER (Vertical line that shows the border distance)
176 The following bits can be set in addition
177 to these styles:
178 RULER_STYLE_DONTKNOW (for old position or for
179 ambiguity)
180 RULER_STYLE_INVISIBLE
182 SetTabs() sets an array of tabs. This method may only be used for horizontal rulers.
183 An array of type RulerTab must be passed as an argument, with the following values
184 initialized:
186 long nPos - offset relative to the origin in pixels
187 sal_uInt16 nStyle - bit style:
188 RULER_TAB_DEFAULT (can't be selected)
189 RULER_TAB_LEFT
190 RULER_TAB_CENTER
191 RULER_TAB_RIGHT
192 RULER_TAB_DECIMAL
193 The following bits can be set in addition
194 to these styles:
195 RULER_STYLE_DONTKNOW (for old position of for
196 ambiguity)
197 RULER_STYLE_INVISIBLE
199 SetLines() displays position lines in the ruler. An array of type RulerLine must be passed, with
200 the following values initialized:
202 long nPos - offset relative to the origin in pixels
203 sal_uInt16 nStyle - bit style (has to be 0 currently)
205 --------------------------------------------------------------------------
207 If the user should also be able to change the margins tabs, borders, ...
208 in the ruler, a bit more effort is necessary. In this case, the StartDrag(),
209 Drag() and EndDrag() methods have to be overridden. For the StartDrag() method
210 it is possible to prevent dragging by returning FALSE. In the drag handler,
211 the drag position must be queried and the values must be moved to the new
212 position. This is done by calling the particular Set methods. While in the
213 drag handler, the values are just cached and only afterward the ruler is redrawn.
214 All the handlers can also be set as links with the particular Set..Hdl() methods.
216 - StartDrag()
217 Is called when dragging is started. If FALSE is returned, the dragging.
218 won't be executed. If TRUE is returned, the dragging will be permitted.
219 If the handler isn't overridden, FALSE will be returned.
221 - EndDrag()
222 Is called at the end of dragging.
224 - Drag()
225 Is called when dragging takes place.
227 - Click()
228 This handler is called when no element has been clicked on.
229 The position can be queried with GetClickPos(). This way it is possible
230 to, for example, ser tabs in the ruler. After calling the click handler,
231 the drag, if any, is immediately triggered. This makes it possible to
232 set a new tab in the click handler and then immediately move it.
234 - DoubleClick()
235 This handler is called when a double-click has been performed outside
236 the special panel. The methods GetClickType(), GetClickAryPos() and
237 GetClickPos() can be used to query what has been clicked on.
238 This way you can, for example, show the tab dialog when a double-click
239 is performed on a tab.
241 In the drag handler it is possible to query what has been dragged and where
242 it has been dragged. There are the following query methods:
244 - GetDragType()
245 Returns what has been dragged.
246 RULER_TYPE_MARGIN1
247 RULER_TYPE_MARGIN2
248 RULER_TYPE_BORDER
249 RULER_TYPE_INDENT
250 RULER_TYPE_TAB
252 - GetDragPos()
253 Returns the pixel position to which the user has moved the mouse
254 relative to the set zero-offset.
256 - GetDragAryPos()
257 Liefert den Index im Array zurueck, wenn ein Border, Indent oder ein
258 Tab gedragt wird. Achtung: Es wird die Array-Position waehrend des
259 gesammten Drag-Vorgangs von dem Item im Array was vor dem Drag gesetzt
260 war zurueckgeben. Dadurch ist es zum Beispiel auch moeglich, einen
261 Tab nicht mehr anzuzeigen, wenn die Maus nach unten/rechts aus dem
262 Lineal gezogen wird.
264 - GetDragSize()
265 Wenn Borders gedragt werden, kann hierueber abgefragt werden, ob
266 die Groesse bzw. welche Seite oder die Position geaendert werden soll.
267 RULER_DRAGSIZE_MOVE oder 0 - Move
268 RULER_DRAGSIZE_1 - Linke/obere Kante
269 RULER_DRAGSIZE_2 - Rechte/untere Kante
271 - IsDragDelete()
272 Mit dieser Methode kann abgefragt werden, ob beim Draggen die
273 Maus unten/rechts aus dem Fenster gezogen wurde. Damit kann
274 zum Beispiel festgestellt werden, ob der Benutzer einen Tab
275 loeschen will.
277 - IsDragCanceled()
278 Mit dieser Methode kann im EndDrag-Handler abgefragt werden,
279 ob die Aktion abgebrochen wurde, indem der Anwender die
280 Maus oben/links vom Fenster losgelassen hat oder ESC gedrueckt
281 hat. In diesem Fall werden die Werte nicht uebernommen. Wird
282 waehrend des Draggings die Maus oben/links aus dem Fenster
283 gezogen, werden automatisch die alten Werte dargestellt, ohne das
284 der Drag-Handler gerufen wird.
285 Falls der Benutzer jedoch den Wert auf die alte Position
286 zurueckgeschoben hat, liefert die Methode trotzdem sal_False. Falls
287 dies vermieden werden soll, muss sich die Applikation im StartDrag-
288 Handler den alten Wert merken und im EndDrag-Handler den Wert
289 vergleichen.
291 - GetDragScroll()
292 Mit dieser Methode kann abgefragt werden, ob gescrollt werden
293 soll. Es wird einer der folgenden Werte zurueckgegeben:
294 RULER_SCROLL_NO - Drag-Position befindet sich
295 an keinem Rand und somit
296 muss nicht gescrollt werden.
297 RULER_SCROLL_1 - Drag-Position befindet sich
298 am linken/oberen Rand und
299 somit sollte das Programm evt.
300 ein Srcoll ausloesen.
301 RULER_SCROLL_2 - Drag-Position befindet sich
302 am rechten/unteren Rand und
303 somit sollte das Programm evt.
304 ein Srcoll ausloesen.
306 - GetDragModifier()
307 Liefert die Modifier-Tasten zurueck, die beim Starten des Drag-
308 Vorgangs gedrueckt waren. Siehe MouseEvent.
310 - GetClickPos()
311 Liefert die Pixel-Position bezogen auf den eingestellten Null-Offset
312 zurueck, wo der Anwender die Maus gedrueckt hat.
314 - GetClickType()
315 Liefert zurueck, was per DoubleClick betaetigt wird:
316 RULER_TYPE_DONTKNOW (kein Element im Linealbereich)
317 RULER_TYPE_OUTSIDE (ausserhalb des Linealbereichs)
318 RULER_TYPE_MARGIN1 (nur Margin1-Kante)
319 RULER_TYPE_MARGIN2 (nur Margin2-Kante)
320 RULER_TYPE_BORDER (Border: GetClickAryPos())
321 RULER_TYPE_INDENT (Einzug: GetClickAryPos())
322 RULER_TYPE_TAB (Tab: GetClickAryPos())
324 - GetClickAryPos()
325 Liefert den Index im Array zurueck, wenn ein Border, Indent oder ein
326 Tab per DoubleClick betaetigt wird.
328 - GetType()
329 Mit dieser Methode kann man einen HitTest durchfuehren, um
330 gegebenenfalls ueber das Abfangen des MouseButtonDown-Handlers
331 auch ueber die rechte Maustaste etwas auf ein Item anzuwenden. Als
332 Paramter ueber gibt man die Fensterposition und gegebenenfalls
333 einen Pointer auf einen sal_uInt16, um die Array-Position eines
334 Tabs, Indent oder Borders mitzubekommen. Als Type werden folgende
335 Werte zurueckgegeben:
336 RULER_TYPE_DONTKNOW (kein Element im Linealbereich)
337 RULER_TYPE_OUTSIDE (ausserhalb des Linealbereichs)
338 RULER_TYPE_MARGIN1 (nur Margin1-Kante)
339 RULER_TYPE_MARGIN2 (nur Margin2-Kante)
340 RULER_TYPE_BORDER (Border: GetClickAryPos())
341 RULER_TYPE_INDENT (Einzug: GetClickAryPos())
342 RULER_TYPE_TAB (Tab: GetClickAryPos())
344 Wenn der Drag-Vorgang abgebrochen werden soll, kann der Drag-Vorgang
345 mit CancelDrag() abgebrochen werden. Folgende Methoden gibt es fuer die
346 Drag-Steuerung:
348 - IsDrag()
349 Liefert sal_True zurueck, wenn sich das Lineal im Drag-Vorgang befindet.
351 - CancelDrag()
352 Bricht den Drag-Vorgang ab, falls einer durchgefuehrt wird. Dabei
353 werden die alten Werte wieder hergestellt und der Drag und der
354 EndDrag-Handler gerufen.
356 Um vom Dokument ein Drag auszuloesen, gibt es folgende Methoden:
358 - StartDocDrag()
359 Dieser Methode werden der MouseEvent vom Dokumentfenster und
360 was gedragt werden soll uebergeben. Wenn als DragType
361 RULER_TYPE_DONTKNOW uebergeben wird, bestimmt das Lineal, was
362 verschoben werden soll. Bei den anderen, wird der Drag nur dann
363 gestartet, wenn auch an der uebergebenen Position ein entsprechendes
364 Element gefunden wurde. Dies ist zun Beispiel dann notwendig, wenn
365 zum Beispiel Einzuege und Spalten an der gleichen X-Position liegen.
366 Der Rueckgabewert gibt an, ob der Drag ausgeloest wurde. Wenn ein
367 Drag ausgeloest wird, uebernimmt das Lineal die normale Drag-Steuerung
368 und verhaelt sich dann so, wie als wenn direkt in das Lineal geklickt
369 wurde. So captured das Lineal die Mouse und uebernimmt auch die
370 Steuerung des Cancel (ueber Tastatur, oder wenn die Mouse ueber
371 oder links vom Lineal ruasgeschoben wird). Auch alle Handler werden
372 gerufen (inkl. des StartDrag-Handlers). Wenn ein MouseEvent mit
373 Click-Count 2 uebergeben wird auch der DoubleClick-Handler
374 entsprechend gerufen.
376 --------------------------------------------------------------------------
378 Fuer das Extra-Feld kann der Inhalt bestimmt werden und es gibt Handler,
379 womit man bestimmte Aktionen abfangen kann.
381 - ExtraDown()
382 Dieser Handler wird gerufen, wenn im Extra-Feld die Maus
383 gedrueckt wird.
385 - SetExtraType()
386 Mit dieser Methode kann festgelegt werden, was im ExtraFeld
387 dargestellt werden soll.
388 - ExtraType Was im Extrafeld dargestellt werden soll
389 RULER_EXTRA_DONTKNOW (Nichts)
390 RULER_EXTRA_NULLOFFSET (Koordinaaten-Kreuz)
391 RULER_EXTRA_TAB (Tab)
392 - sal_uInt16 nStyle Bitfeld als Style:
393 RULER_STYLE_HIGHLIGHT (selektiert)
394 RULER_TAB_... (ein Tab-Style)
396 - GetExtraClick()
397 Liefert die Anzahl der Mausclicks zurueck. Dadurch ist es zum
398 Beispiel auch moeglich, auch durch einen DoubleClick im Extrafeld
399 eine Aktion auszuloesen.
401 - GetExtraModifier()
402 Liefert die Modifier-Tasten zurueck, die beim Klicken in das Extra-
403 Feld gedrueckt waren. Siehe MouseEvent.
405 --------------------------------------------------------------------------
407 Weitere Hilfsfunktionen:
409 - static Ruler::DrawTab()
410 Mit dieser Methode kann ein Tab auf einem OutputDevice ausgegeben
411 werden. Dadurch ist es moeglich, auch in Dialogen die Tabs so
412 anzuzeigen, wie Sie im Lineal gemalt werden.
414 Diese Methode gibt den Tab zentriert an der uebergebenen Position
415 aus. Die Groesse der Tabs kann ueber die Defines RULER_TAB_WIDTH und
416 RULER_TAB_HEIGHT bestimmt werden.
418 --------------------------------------------------------------------------
420 Tips zur Benutzung des Lineals:
422 - Bei dem Lineal muss weder im Drag-Modus noch sonst das Setzen der Werte
423 in SetUpdateMode() geklammert werden. Denn das Lineal sorgt von sich
424 aus dafuer, das wenn mehrere Werte gesetzt werden, diese automatisch
425 zusammengefast werden und flackerfrei ausgegeben werden.
427 - Initial sollten beim Lineal zuerst die Groessen, Positionen und Werte
428 gesetzt werden, bevor es angezeigt wird. Dies ist deshalb wichtig, da
429 ansonsten viele Werte unnoetig berechnet werden.
431 - Wenn das Dokumentfenster, in dem sich das Lineal befindet aktiv bzw.
432 deaktiv wird, sollten die Methoden Activate() und Deactivate() vom
433 Lineal gerufen werden. Denn je nach Einstellungen und System wird die
434 Anzeige entsprechend umgeschaltet.
436 - Zum Beispiel sollte beim Drag von Tabs und Einzuegen nach Moeglichkeit die
437 alten Positionen noch mit angezeigt werden. Dazu sollte zusaetzlich beim
438 Setzen der Tabs und Einzuege als erstes im Array die alten Positionen
439 eingetragen werden und mit dem Style RULER_STYLE_DONTKNOW verknuepft
440 werden. Danach sollte im Array die restlichen Werte eingetragen werden.
442 - Bei mehreren markierten Absaetzen und Tabellen-Zellen, sollten die Tabs
443 und Einzuege in grau von der ersten Zelle, bzw. vom ersten Absatz
444 angezeigt werden. Dies kann man auch ueber den Style RULER_STYLE_DONTKNOW
445 erreichen.
447 - Die Bemassungspfeile sollten immer dann angezeigt, wenn beim Drag die
448 Alt-Taste (WW-Like) gedrueckt wird. Vielleicht sollte diese Einstellung
449 auch immer vornehmbar sein und vielleicht beim Drag immer die
450 Bemassungspfeile dargestellt werden. Bei allen Einstellung sollten die
451 Werte immer auf ein vielfaches eines Wertes gerundet werden, da die
452 Bildschirmausloesung sehr ungenau ist.
454 - DoppelKlicks sollten folgendermassen behandelt werden (GetClickType()):
455 - RULER_TYPE_DONTKNOW
456 RULER_TYPE_MARGIN1
457 RULER_TYPE_MARGIN2
458 Wenn die Bedingunden GetClickPos() <= GetMargin1() oder
459 GetClickPos() >= GetMargin2() oder der Type gleich
460 RULER_TYPE_MARGIN1 oder RULER_TYPE_MARGIN2 ist, sollte
461 ein SeitenDialog angezeigt werden, wo der Focus auf dem
462 entsprechenden Rand steht
463 - RULER_TYPE_BORDER
464 Es sollte ein Spalten- oder Tabellen-Dialog angezeigt werden,
465 wo der Focus auf der entsprechenden Spalte steht, die mit
466 GetClickAryPos() abgefragt werden kann.
467 - RULER_TYPE_INDENT
468 Es sollte der Dialog angezeigt werden, wo die Einzuege eingestellt
469 werden koennen. Dabei sollte der Focus auf dem Einzug stehen, der
470 mit GetClickAryPos() ermittelt werden kann.
471 - RULER_TYPE_TAB
472 Es sollte ein TabDialog angezeigt werden, wo der Tab selektiert
473 sein sollte, der ueber GetClickAryPos() abgefragt werden kann.
475 *************************************************************************/
477 // - WinBits -
479 #define WB_EXTRAFIELD ((WinBits)0x00004000)
480 #define WB_RIGHT_ALIGNED ((WinBits)0x00008000)
481 #define WB_STDRULER WB_HORZ
483 // - Ruler-Type -
485 enum RulerType { RULER_TYPE_DONTKNOW, RULER_TYPE_OUTSIDE,
486 RULER_TYPE_MARGIN1, RULER_TYPE_MARGIN2,
487 RULER_TYPE_BORDER, RULER_TYPE_INDENT, RULER_TYPE_TAB };
489 enum RulerExtra { RULER_EXTRA_DONTKNOW,
490 RULER_EXTRA_NULLOFFSET, RULER_EXTRA_TAB };
492 #define RULER_STYLE_HIGHLIGHT ((sal_uInt16)0x8000)
493 #define RULER_STYLE_DONTKNOW ((sal_uInt16)0x4000)
494 #define RULER_STYLE_INVISIBLE ((sal_uInt16)0x2000)
496 #define RULER_DRAGSIZE_MOVE 0
497 #define RULER_DRAGSIZE_1 1
498 #define RULER_DRAGSIZE_2 2
500 #define RULER_MOUSE_BORDERMOVE 5
501 #define RULER_MOUSE_BORDERWIDTH 5
502 #define RULER_MOUSE_MARGINWIDTH 3
504 #define RULER_SCROLL_NO 0
505 #define RULER_SCROLL_1 1
506 #define RULER_SCROLL_2 2
508 // - RulerMargin -
510 #define RULER_MARGIN_SIZEABLE ((sal_uInt16)0x0001)
512 // - RulerBorder -
514 #define RULER_BORDER_SIZEABLE ((sal_uInt16)0x0001)
515 #define RULER_BORDER_MOVEABLE ((sal_uInt16)0x0002)
516 #define RULER_BORDER_VARIABLE ((sal_uInt16)0x0004)
517 #define RULER_BORDER_TABLE ((sal_uInt16)0x0008)
518 #define RULER_BORDER_SNAP ((sal_uInt16)0x0010)
519 #define RULER_BORDER_MARGIN ((sal_uInt16)0x0020)
521 struct RulerBorder
523 long nPos;
524 long nWidth;
525 sal_uInt16 nStyle;
526 long nMinPos; //minimum/maximum position, supported for table borders/rows
527 long nMaxPos;
530 // - RulerIndent -
532 #define RULER_INDENT_TOP ((sal_uInt16)0x0000)
533 #define RULER_INDENT_BOTTOM ((sal_uInt16)0x0001)
534 #define RULER_INDENT_BORDER ((sal_uInt16)0x0002)
535 #define RULER_INDENT_STYLE ((sal_uInt16)0x000F)
537 struct RulerIndent
539 long nPos;
540 sal_uInt16 nStyle;
543 // - RulerTab -
545 #define RULER_TAB_LEFT ((sal_uInt16)0x0000)
546 #define RULER_TAB_RIGHT ((sal_uInt16)0x0001)
547 #define RULER_TAB_CENTER ((sal_uInt16)0x0002)
548 #define RULER_TAB_DECIMAL ((sal_uInt16)0x0003)
549 #define RULER_TAB_DEFAULT ((sal_uInt16)0x0004)
550 #define RULER_TAB_STYLE ((sal_uInt16)0x000F)
551 #define RULER_TAB_RTL ((sal_uInt16)0x0010)
553 struct RulerTab
555 long nPos;
556 sal_uInt16 nStyle;
559 #define RULER_TAB_WIDTH 7
560 #define RULER_TAB_HEIGHT 6
562 // - RulerLine -
564 struct RulerLine
566 long nPos;
567 sal_uInt16 nStyle;
570 struct RulerSelection
572 long nPos;
573 RulerType eType;
574 sal_uInt16 nAryPos;
575 sal_uInt16 mnDragSize;
576 bool bSize;
577 bool bSizeBar;
578 bool bExpandTest;
580 RulerSelection() :
581 bExpandTest( false )
585 struct RulerUnitData
587 MapUnit eMapUnit; // MAP_UNIT for calculaion
588 long nTickUnit; // Unit divider
589 double nTick1; // Minimal step
590 double nTick2; // Tick quarter unit
591 double nTick3; // Tick half unit
592 double nTick4; // Tick whole unit
593 long n100THMM; // 100mm Unit divider
594 sal_uInt16 nUnitDigits; // Number of digits
595 sal_Char aUnitStr[8]; // Unit string
598 // - Ruler -
600 class ImplRulerData;
602 class SVT_DLLPUBLIC Ruler : public Window
604 private:
605 VirtualDevice maVirDev;
606 MapMode maMapMode;
607 long mnBorderOff;
608 long mnWinOff;
609 long mnWinWidth;
610 long mnWidth;
611 long mnHeight;
612 long mnVirOff;
613 long mnVirWidth;
614 long mnVirHeight;
615 long mnBorderWidth;
616 long mnStartDragPos;
617 long mnDragPos;
618 sal_uLong mnUpdateEvtId;
619 ImplRulerData* mpSaveData;
620 ImplRulerData* mpData;
621 ImplRulerData* mpDragData;
622 Rectangle maExtraRect;
623 WinBits mnWinStyle;
624 sal_uInt16 mnUnitIndex;
625 sal_uInt16 mnDragAryPos;
626 sal_uInt16 mnDragSize;
627 sal_uInt16 mnDragScroll;
628 sal_uInt16 mnDragModifier;
629 sal_uInt16 mnExtraStyle;
630 sal_uInt16 mnExtraClicks;
631 sal_uInt16 mnExtraModifier;
632 long mnCharWidth;
633 long mnLineHeight;
635 RulerExtra meExtraType;
636 RulerType meDragType;
637 MapUnit meSourceUnit;
638 FieldUnit meUnit;
639 Fraction maZoom;
640 sal_Bool mbCalc;
641 sal_Bool mbFormat;
642 sal_Bool mbDrag;
643 sal_Bool mbDragDelete;
644 sal_Bool mbDragCanceled;
645 sal_Bool mbAutoWinWidth;
646 sal_Bool mbActive;
647 sal_uInt8 mnUpdateFlags;
649 RulerSelection maHoverSelection;
651 Link maStartDragHdl;
652 Link maDragHdl;
653 Link maEndDragHdl;
654 Link maClickHdl;
655 Link maDoubleClickHdl;
656 Link maExtraDownHdl;
658 boost::scoped_ptr<RulerSelection> mpCurrentHitTest;
659 boost::scoped_ptr<RulerSelection> mpPreviousHitTest;
661 SVT_DLLPRIVATE void ImplVDrawLine( long nX1, long nY1, long nX2, long nY2 );
662 SVT_DLLPRIVATE void ImplVDrawRect( long nX1, long nY1, long nX2, long nY2 );
663 SVT_DLLPRIVATE void ImplVDrawText( long nX, long nY, const OUString& rText, long nMin = LONG_MIN, long nMax = LONG_MAX );
665 SVT_DLLPRIVATE void ImplDrawTicks( long nMin, long nMax, long nStart, long nVirTop, long nVirBottom );
666 SVT_DLLPRIVATE void ImplDrawBorders( long nMin, long nMax, long nVirTop, long nVirBottom );
667 SVT_DLLPRIVATE void ImplDrawIndent( const Polygon& rPoly, sal_uInt16 nStyle, bool bIsHit = false );
668 SVT_DLLPRIVATE void ImplDrawIndents( long nMin, long nMax, long nVirTop, long nVirBottom );
669 SVT_DLLPRIVATE void ImplDrawTab( OutputDevice* pDevice, const Point& rPos, sal_uInt16 nStyle );
670 SVT_DLLPRIVATE void ImplDrawTabs( long nMin, long nMax, long nVirTop, long nVirBottom );
672 using Window::ImplInit;
673 SVT_DLLPRIVATE void ImplInit( WinBits nWinBits );
674 SVT_DLLPRIVATE void ImplInitSettings( sal_Bool bFont, sal_Bool bForeground, sal_Bool bBackground );
675 SVT_DLLPRIVATE void ImplCalc();
676 SVT_DLLPRIVATE void ImplFormat();
677 SVT_DLLPRIVATE void ImplInitExtraField( sal_Bool bUpdate );
678 SVT_DLLPRIVATE void ImplInvertLines( sal_Bool bErase = sal_False );
679 SVT_DLLPRIVATE void ImplDraw();
680 SVT_DLLPRIVATE void ImplDrawExtra( sal_Bool bPaint = sal_False );
681 SVT_DLLPRIVATE void ImplUpdate( sal_Bool bMustCalc = sal_False );
683 using Window::ImplHitTest;
684 SVT_DLLPRIVATE sal_Bool ImplHitTest( const Point& rPosition,
685 RulerSelection* pHitTest,
686 sal_Bool bRequiredStyle = sal_False,
687 sal_uInt16 nRequiredStyle = 0 ) const;
688 SVT_DLLPRIVATE sal_Bool ImplDocHitTest( const Point& rPos, RulerType eDragType, RulerSelection* pHitTest ) const;
689 SVT_DLLPRIVATE sal_Bool ImplStartDrag( RulerSelection* pHitTest, sal_uInt16 nModifier );
690 SVT_DLLPRIVATE void ImplDrag( const Point& rPos );
691 SVT_DLLPRIVATE void ImplEndDrag();
693 DECL_DLLPRIVATE_LINK( ImplUpdateHdl, void* );
695 // Forbidden and not implemented.
696 Ruler (const Ruler &);
697 Ruler& operator= (const Ruler &);
699 protected:
700 long GetRulerVirHeight() const;
701 MapMode GetCurrentMapMode() const { return maMapMode; }
702 RulerUnitData GetCurrentRulerUnit() const;
704 public:
705 Ruler( Window* pParent, WinBits nWinStyle = WB_STDRULER );
706 virtual ~Ruler();
708 virtual void MouseButtonDown( const MouseEvent& rMEvt );
709 virtual void MouseMove( const MouseEvent& rMEvt );
710 virtual void Tracking( const TrackingEvent& rTEvt );
711 virtual void Paint( const Rectangle& rRect );
712 virtual void Resize();
713 virtual void StateChanged( StateChangedType nStateChange );
714 virtual void DataChanged( const DataChangedEvent& rDCEvt );
716 virtual long StartDrag();
717 virtual void Drag();
718 virtual void EndDrag();
719 virtual void Click();
720 virtual void DoubleClick();
721 virtual void ExtraDown();
723 void Activate();
724 void Deactivate();
725 sal_Bool IsActive() const { return mbActive; }
727 void SetWinPos( long nOff = 0, long nWidth = 0 );
728 long GetWinOffset() const { return mnWinOff; }
729 long GetWinWidth() const { return mnWinWidth; }
730 void SetPagePos( long nOff = 0, long nWidth = 0 );
731 long GetPageOffset() const;
732 long GetPageWidth() const;
733 void SetBorderPos( long nOff = 0 );
734 long GetBorderOffset() const { return mnBorderOff; }
735 Rectangle GetExtraRect() const { return maExtraRect; }
737 void SetUnit( FieldUnit eNewUnit );
738 FieldUnit GetUnit() const { return meUnit; }
739 void SetZoom( const Fraction& rNewZoom );
740 Fraction GetZoom() const { return maZoom; }
742 void SetSourceUnit( MapUnit eNewUnit ) { meSourceUnit = eNewUnit; }
743 MapUnit GetSourceUnit() const { return meSourceUnit; }
745 void SetExtraType( RulerExtra eNewExtraType, sal_uInt16 nStyle = 0 );
746 RulerExtra GetExtraType() const { return meExtraType; }
747 sal_uInt16 GetExtraStyle() const { return mnExtraStyle; }
748 sal_uInt16 GetExtraClicks() const { return mnExtraClicks; }
749 sal_uInt16 GetExtraModifier() const { return mnExtraModifier; }
751 sal_Bool StartDocDrag( const MouseEvent& rMEvt,
752 RulerType eDragType = RULER_TYPE_DONTKNOW );
753 RulerType GetDragType() const { return meDragType; }
754 long GetDragPos() const { return mnDragPos; }
755 sal_uInt16 GetDragAryPos() const { return mnDragAryPos; }
756 sal_uInt16 GetDragSize() const { return mnDragSize; }
757 sal_Bool IsDragDelete() const { return mbDragDelete; }
758 sal_Bool IsDragCanceled() const { return mbDragCanceled; }
759 sal_uInt16 GetDragScroll() const { return mnDragScroll; }
760 sal_uInt16 GetDragModifier() const { return mnDragModifier; }
761 sal_Bool IsDrag() const { return mbDrag; }
762 void CancelDrag();
763 long GetClickPos() const { return mnDragPos; }
764 RulerType GetClickType() const { return meDragType; }
765 sal_uInt16 GetClickAryPos() const { return mnDragAryPos; }
767 RulerSelection GetHoverSelection() const { return maHoverSelection; }
769 using Window::GetType;
770 RulerType GetType( const Point& rPos, sal_uInt16* pAryPos = NULL );
772 void SetNullOffset( long nPos );
773 long GetNullOffset() const;
774 void SetMargin1() { SetMargin1( 0, RULER_STYLE_INVISIBLE ); }
775 void SetMargin1( long nPos, sal_uInt16 nMarginStyle = RULER_MARGIN_SIZEABLE );
776 long GetMargin1() const;
777 void SetMargin2() { SetMargin2( 0, RULER_STYLE_INVISIBLE ); }
778 void SetMargin2( long nPos, sal_uInt16 nMarginStyle = RULER_MARGIN_SIZEABLE );
779 long GetMargin2() const;
781 void SetLeftFrameMargin( long nPos );
782 void SetRightFrameMargin( long nPos );
783 void SetLines( sal_uInt32 n = 0, const RulerLine* pLineAry = NULL );
784 void SetBorders( sal_uInt32 n = 0, const RulerBorder* pBrdAry = NULL );
785 void SetIndents( sal_uInt32 n = 0, const RulerIndent* pIndentAry = NULL );
787 void SetTabs( sal_uInt32 n = 0, const RulerTab* pTabAry = NULL );
788 sal_uInt32 GetTabCount() const;
789 const RulerTab* GetTabs() const;
791 static void DrawTab( OutputDevice* pDevice, const Color &rFillColor,
792 const Point& rPos, sal_uInt16 nStyle );
794 void SetStyle( WinBits nStyle );
795 WinBits GetStyle() const { return mnWinStyle; }
797 void SetStartDragHdl( const Link& rLink ) { maStartDragHdl = rLink; }
798 const Link& GetStartDragHdl() const { return maStartDragHdl; }
799 void SetDragHdl( const Link& rLink ) { maDragHdl = rLink; }
800 const Link& GetDragHdl() const { return maDragHdl; }
801 void SetEndDragHdl( const Link& rLink ) { maEndDragHdl = rLink; }
802 const Link& GetEndDragHdl() const { return maEndDragHdl; }
803 void SetClickHdl( const Link& rLink ) { maClickHdl = rLink; }
804 const Link& GetClickHdl() const { return maClickHdl; }
805 void SetDoubleClickHdl( const Link& rLink ) { maDoubleClickHdl = rLink; }
806 const Link& GetDoubleClickHdl() const { return maDoubleClickHdl; }
807 void SetExtraDownHdl( const Link& rLink ) { maExtraDownHdl = rLink; }
808 const Link& GetExtraDownHdl() const { return maExtraDownHdl; }
810 void SetTextRTL(sal_Bool bRTL);
811 bool GetTextRTL();
812 void SetCharWidth( long nWidth ) { mnCharWidth = nWidth ; }
813 void SetLineHeight( long nHeight ) { mnLineHeight = nHeight ; }
815 void DrawTicks();
818 #endif // _RULER_HXX
820 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */