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