1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: ruler.hxx,v $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
34 #include "svtools/svtdllapi.h"
35 #include <tools/link.hxx>
36 #include <vcl/window.hxx>
38 #include <vcl/virdev.hxx>
40 #include <vcl/field.hxx>
44 class DataChangedEvent
;
46 /*************************************************************************
53 Diese Klasse dient zur Anzeige eines Lineals. Dabei kann diese Klasse nicht
54 nur als Anzeige-Control verwendet werden, sondern auch als aktives Control
55 zum Setzen/Verschieben von Tabulatoren und Raendern.
57 --------------------------------------------------------------------------
61 WB_HORZ Lineal wird horizontal dargestellt
62 WB_VERT Lineal wird vertikal dargestellt
63 WB_3DLOOK 3D-Darstellung
64 WB_BORDER Border am unteren/rechten Rand
65 WB_EXTRAFIELD Feld in der linken/oberen Ecke zur Anzeige und
66 Auswahl von Tabs, Null-Punkt, ...
67 WB_RIGHT_ALIGNED Marks the vertical ruler as right aligned
69 --------------------------------------------------------------------------
71 Beim Lineal werden alle Werte als Pixel-Werte eingestellt. Dadurch werden
72 doppelte Umrechnungen und Rundungsfehler vermieden und die Raender werden
73 im Lineal auch an der Position angezeigt, den Sie auch im Dokument haben.
74 Dadurch kann die Applikation zum Beispiel bei Tabellendarstellung auch
75 eigene Rundungen vornehmen und die Positionen im Lineal passen trotzdem noch
76 zu denen im Dokument. Damit aber das Lineal weiss, wie das Dokument auf dem
77 Bildschirm dargestellt wird, muessen noch ein paar zusaetzliche Werte
80 Mit SetWinPos() wird der Offset des Edit-Fenster zum Lineal eingestellt.
81 Dabei kann auch die Breite des Fensters eingestellt werden. Wenn bei den
82 Werten 0 uebergeben wird, wird die Position/Breite vom Fenster automatisch
83 so breit gesetzt, wie das Lineal breit ist.
85 Mit SetPagePos() wird der Offset der Seite zum Edit-Fenster eingestellt und
86 die Breite der Seite eingestellt. Wenn bei den Werten 0 uebergeben wird,
87 wird die Position/Breite automatisch so gesetzt, als ob die Seite das ganze
88 Editfenster ausfuellen wuerde.
90 Mit SetBorderPos() kann der Offset eingestellt werden, ab dem der
91 Border ausgegeben wird. Die Position bezieht sich auf die linke bzw. obere
92 Fensterkante. Dies wird gebraucht, wenn ein horizontales und vertikales
93 Lineal gleichzeitig sichtbar sind. Beispiel:
94 aHRuler.SetBorderPos( aVRuler.GetSizePixel().Width()-1 );
96 Mit SetNullOffset() wird der Null-Punkt bezogen auf die Seite gesetzt.
98 Alle anderen Werte (Raender, Einzug, Tabs, ...) beziehen sich auf den 0 Punkt,
99 der mit SetNullOffset() eingestellt wird.
101 Die Werte werden zum Beispiel folgendermassen berechnet:
103 - WinPos (wenn beide Fenster den gleichen Parent haben)
105 Point aHRulerPos = aHRuler.GetPosPixel();
106 Point aEditWinPos = aEditWin.GetPosPixel();
107 aHRuler.SetWinPos( aEditWinPos().X() - aHRulerPos.X() );
111 Point aPagePos = aEditWin.LogicToPixel( aEditWin.GetPagePos() );
112 aHRuler.SetPagePos( aPagePos().X() );
116 Die logischen Werte zusammenaddieren, als Position umrechnen und
117 die vorher gemerkten Pixel-Positionen (von PagePos und NullOffset)
118 entsprechend abziehen.
120 --------------------------------------------------------------------------
122 Mit SetUnit() und SetZoom() wird eingestellt, in welcher Einheit das Lineal
123 die Werte anzeigt. Folgende Einheiten werden akzeptiert:
135 --------------------------------------------------------------------------
137 Mit SetMargin1() kann der linke/obere Rand und mit SetMargin2() kann
138 der rechte/untere Rand gesetzt werden. Falls diese Methoden ohne Parameter
139 aufgerufen werden, werden keine Raender angezeigt. Wenn SetMargin1() bzw.
140 SetMargin2() mit Parametern aufgerufen werden, kann bei diesen
141 folgendes angegeben werden:
143 long nPos - Offset zum NullPunkt in Pixel
144 USHORT nStyle - Bit-Style:
145 RULER_MARGIN_SIZEABLE
146 Rand kann in der Groesse veraendert werden.
148 Zu diesen Style's koennen folgende Style-
149 Bits dazugeodert werden:
150 RULER_STYLE_INVISIBLE (fuer nicht sichtbar)
153 Mit SetBorders() kann ein Array von Raendern gesetzt werden. Dabei muss
154 ein Array vom Typ RulerBorder uebergeben werden, wobei folgende Werte
155 initialisiert werden muessen:
157 long nPos - Offset zum NullPunkt in Pixel
158 long nWidth - Breite des Spaltenabstands in Pixel (kann zum
159 Beispiel fuer Tabellenspalten auch 0 sein)
160 USHORT nStyle - Bit-Style:
161 RULER_BORDER_SIZEABLE
162 Spaltenabstand kann in der Groesse veraendert
163 werden. Dieses Flag sollte nur gesetzt werden,
164 wenn ein Abstand in der Groesse geaendert wird
165 und nicht die Groesse einer Zelle.
166 RULER_BORDER_MOVEABLE
167 Spaltenabstand/Begrenzung kann verschoben
168 werden. Wenn Tabellenbegrenzungen verschoben
169 werden, sollte dieses Flag gesetzt werden und
170 nicht Sizeable. Denn Sizeable gibt an, das
171 ein Abstand vergroessert werden kann und nicht
172 eine einzelne Zelle in der Groesse geaendert
174 RULER_BORDER_VARIABLE
175 Nicht alle Spaltenabstande sind gleich
177 Tabellenrahmen. Wenn dieser Style gesetzt
178 wird, muss die Spaltenbreite 0 sein.
180 Hilfslinie / Fanglinie. Wenn dieser Style
181 gesetzt wird, muss die Spaltenbreite 0 sein.
183 Margin. Wenn dieser Style gesetzt wird,
184 muss die Spaltenbreite 0 sein.
186 Zu diesen Style's koennen folgende Style-
187 Bits dazugeodert werden:
188 RULER_STYLE_INVISIBLE (fuer nicht sichtbar)
190 Mit SetIndents() kann ein Array von Indents gesetzt werden. Diese Methode darf
191 nur angewendet werden, wenn es sich um ein horizontales Lineal handelt. Als
192 Parameter muss ein Array vom Typ RulerIndent uebergeben werden, wobei folgende
193 Werte initialisiert werden muessen:
195 long nPos - Offset zum NullPunkt in Pixel
196 USHORT nStyle - Bit-Style:
197 RULER_INDENT_TOP (Erstzeileneinzug)
198 RULER_INDENT_BOTTOM (Linker/Rechter Einzug)
199 RULER_INDENT_BORDER (Verical line that shows the border distance)
200 Zu diesen Style's koennen folgende Style-
201 Bits dazugeodert werden:
202 RULER_STYLE_DONTKNOW (fuer alte Position oder
203 fuer Uneindeutigkeit)
204 RULER_STYLE_INVISIBLE (fuer nicht sichtbar)
206 Mit SetTabs() kann ein Array von Tabs gesetzt werden. Diese Methode darf nur
207 angewendet werden, wenn es sich um ein horizontales Lineal handelt. Als
208 Parameter muss ein Array vom Typ RulerTab uebergeben werden, wobei folgende
209 Werte initialisiert werden muessen:
211 long nPos - Offset zum NullPunkt in Pixel
212 USHORT nStyle - Bit-Style:
213 RULER_TAB_DEFAULT (kann nicht selektiert werden)
218 Zu diesen Style's koennen folgende Style-
219 Bits dazugeodert werden:
220 RULER_STYLE_DONTKNOW (fuer alte Position oder
221 fuer Uneindeutigkeit)
222 RULER_STYLE_INVISIBLE (fuer nicht sichtbar)
224 Mit SetLines() koennen Positionslinien im Lineal angezeigt werden. Dabei
225 muss ein Array vom Typ RulerLine uebergeben werden, wobei folgende Werte
226 initialisiert werden muessen:
228 long nPos - Offset zum NullPunkt in Pixel
229 USHORT nStyle - Bit-Style (muss zur Zeit immer 0 sein)
231 Mit SetArrows() koennen Bemassungspfeile im Lineal angezeigt werden. Wenn
232 Bemassungspfeile gesetzt werden, werden im Lineal auch keine Unterteilungen
233 mehr angezeigt. Deshalb sollten die Bemassungspfeile immer ueber die ganze
234 Linealbreite gesetzt werden. Dabei muss ein Array vom Typ RulerArrow
235 uebergeben werden, wobei folgende Werte initialisiert werden muessen:
237 long nPos - Offset zum NullPunkt in Pixel
238 long nWidth - Breite des Pfeils
239 long nLogWidth - Breite des Pfeils in logischer Einheit
240 USHORT nStyle - Bit-Style (muss zur Zeit immer 0 sein)
242 Mit SetSourceUnit() wird die Einheit eingestellt, in welcher die logischen
243 Werte vorliegen, die bei SetArrows() uebergeben werden. Dabei werden nur die
244 Einheiten MAP_TWIP und MAP_100TH_MM (default) akzeptiert.
246 --------------------------------------------------------------------------
248 Wenn auch vom Benutzer die Raender, Tabs, Border, ... ueber das Lineal
249 geaendert werden koennen, muss etwas mehr Aufwand getrieben werden. Dazu
250 muessen die Methoden StartDrag(), Drag() und EndDrag() ueberlagert werden.
251 Bei der Methode StartDrag() besteht die Moeglichkeit durch das zurueckgeben
252 von FALSE das Draggen zu verhindern. Im Drag-Handler muss die Drag-Position
253 abgefragt werden und die Werte muessen an die neue Position verschoben werden.
254 Dazu ruft man einfach die einzelnen Set-Methoden auf. Solange man sich
255 im Drag-Handler befindet, werden sich die Werte nur gemerkt und erst
256 danach das Lineal neu ausgegeben. Alle Handler koennen auch als Links ueber
257 entsprechende Set..Hdl()-Methoden gesetzt werden.
260 Wird gerufen, wenn das Draggen gestartet wird. Wenn FALSE
261 zurueckgegeben wird, wird das Draggen nicht ausgefuehrt. Bei TRUE
262 wird das Draggen zugelassen. Wenn der Handler nicht ueberlagert
263 wird, wird FALSE zurueckgegeben.
266 Wird gerufen, wenn das Draggen beendet wird.
269 Wird gerufen, wenn gedragt wird.
272 Dieser Handler wird gerufen, wenn kein Element angeklickt wurde.
273 Die Position kann mit GetClickPos() abgefragt werden. Dadurch
274 kann man zum Beispiel Tabs in das Lineal setzen. Nach Aufruf des
275 Click-Handlers wird gegebenenfalls das Drag sofort ausgeloest. Dadurch
276 ist es moeglich, einen neuen Tab im Click-Handler zu setzen und
277 danach gleich zu verschieben.
280 Dieser Handler wird gerufen, wenn ein DoubleClick ausserhalb des
281 Extrafeldes gemacht wurde. Was angeklickt wurde, kann mit
282 GetClickType(), GetClickAryPos() und GetClickPos() abgefragt werden.
283 Somit kann man zum Beispiel den Tab-Dialog anzeigen, wenn ein
284 Tab mit einem DoubleClick betaetigt wurde.
286 Im Drag-Handler kann man abfragen, was und wohin gedragt wurde. Dazu gibt
287 es folgende Abfrage-Methoden.
290 Liefert zurueck, was gedragt wird:
298 Liefert die Pixel-Position bezogen auf den eingestellten Null-Offset
299 zurueck, wohin der Anwender die Maus bewegt hat.
302 Liefert den Index im Array zurueck, wenn ein Border, Indent oder ein
303 Tab gedragt wird. Achtung: Es wird die Array-Position waehrend des
304 gesammten Drag-Vorgangs von dem Item im Array was vor dem Drag gesetzt
305 war zurueckgeben. Dadurch ist es zum Beispiel auch moeglich, einen
306 Tab nicht mehr anzuzeigen, wenn die Maus nach unten/rechts aus dem
310 Wenn Borders gedragt werden, kann hierueber abgefragt werden, ob
311 die Groesse bzw. welche Seite oder die Position geaendert werden soll.
312 RULER_DRAGSIZE_MOVE oder 0 - Move
313 RULER_DRAGSIZE_1 - Linke/obere Kante
314 RULER_DRAGSIZE_2 - Rechte/untere Kante
317 Mit dieser Methode kann abgefragt werden, ob beim Draggen die
318 Maus unten/rechts aus dem Fenster gezogen wurde. Damit kann
319 zum Beispiel festgestellt werden, ob der Benutzer einen Tab
323 Mit dieser Methode kann im EndDrag-Handler abgefragt werden,
324 ob die Aktion abgebrochen wurde, indem der Anwender die
325 Maus oben/links vom Fenster losgelassen hat oder ESC gedrueckt
326 hat. In diesem Fall werden die Werte nicht uebernommen. Wird
327 waehrend des Draggings die Maus oben/links aus dem Fenster
328 gezogen, werden automatisch die alten Werte dargestellt, ohne das
329 der Drag-Handler gerufen wird.
330 Falls der Benutzer jedoch den Wert auf die alte Position
331 zurueckgeschoben hat, liefert die Methode trotzdem FALSE. Falls
332 dies vermieden werden soll, muss sich die Applikation im StartDrag-
333 Handler den alten Wert merken und im EndDrag-Handler den Wert
337 Mit dieser Methode kann abgefragt werden, ob gescrollt werden
338 soll. Es wird einer der folgenden Werte zurueckgegeben:
339 RULER_SCROLL_NO - Drag-Position befindet sich
340 an keinem Rand und somit
341 muss nicht gescrollt werden.
342 RULER_SCROLL_1 - Drag-Position befindet sich
343 am linken/oberen Rand und
344 somit sollte das Programm evt.
345 ein Srcoll ausloesen.
346 RULER_SCROLL_2 - Drag-Position befindet sich
347 am rechten/unteren Rand und
348 somit sollte das Programm evt.
349 ein Srcoll ausloesen.
352 Liefert die Modifier-Tasten zurueck, die beim Starten des Drag-
353 Vorgangs gedrueckt waren. Siehe MouseEvent.
356 Liefert die Pixel-Position bezogen auf den eingestellten Null-Offset
357 zurueck, wo der Anwender die Maus gedrueckt hat.
360 Liefert zurueck, was per DoubleClick betaetigt wird:
361 RULER_TYPE_DONTKNOW (kein Element im Linealbereich)
362 RULER_TYPE_OUTSIDE (ausserhalb des Linealbereichs)
363 RULER_TYPE_MARGIN1 (nur Margin1-Kante)
364 RULER_TYPE_MARGIN2 (nur Margin2-Kante)
365 RULER_TYPE_BORDER (Border: GetClickAryPos())
366 RULER_TYPE_INDENT (Einzug: GetClickAryPos())
367 RULER_TYPE_TAB (Tab: GetClickAryPos())
370 Liefert den Index im Array zurueck, wenn ein Border, Indent oder ein
371 Tab per DoubleClick betaetigt wird.
374 Mit dieser Methode kann man einen HitTest durchfuehren, um
375 gegebenenfalls ueber das Abfangen des MouseButtonDown-Handlers
376 auch ueber die rechte Maustaste etwas auf ein Item anzuwenden. Als
377 Paramter ueber gibt man die Fensterposition und gegebenenfalls
378 einen Pointer auf einen USHORT, um die Array-Position eines
379 Tabs, Indent oder Borders mitzubekommen. Als Type werden folgende
380 Werte zurueckgegeben:
381 RULER_TYPE_DONTKNOW (kein Element im Linealbereich)
382 RULER_TYPE_OUTSIDE (ausserhalb des Linealbereichs)
383 RULER_TYPE_MARGIN1 (nur Margin1-Kante)
384 RULER_TYPE_MARGIN2 (nur Margin2-Kante)
385 RULER_TYPE_BORDER (Border: GetClickAryPos())
386 RULER_TYPE_INDENT (Einzug: GetClickAryPos())
387 RULER_TYPE_TAB (Tab: GetClickAryPos())
389 Wenn der Drag-Vorgang abgebrochen werden soll, kann der Drag-Vorgang
390 mit CancelDrag() abgebrochen werden. Folgende Methoden gibt es fuer die
394 Liefert TRUE zurueck, wenn sich das Lineal im Drag-Vorgang befindet.
397 Bricht den Drag-Vorgang ab, falls einer durchgefuehrt wird. Dabei
398 werden die alten Werte wieder hergestellt und der Drag und der
399 EndDrag-Handler gerufen.
401 Um vom Dokument ein Drag auszuloesen, gibt es folgende Methoden:
404 Dieser Methode werden der MouseEvent vom Dokumentfenster und
405 was gedragt werden soll uebergeben. Wenn als DragType
406 RULER_TYPE_DONTKNOW uebergeben wird, bestimmt das Lineal, was
407 verschoben werden soll. Bei den anderen, wird der Drag nur dann
408 gestartet, wenn auch an der uebergebenen Position ein entsprechendes
409 Element gefunden wurde. Dies ist zun Beispiel dann notwendig, wenn
410 zum Beispiel Einzuege und Spalten an der gleichen X-Position liegen.
411 Der Rueckgabewert gibt an, ob der Drag ausgeloest wurde. Wenn ein
412 Drag ausgeloest wird, uebernimmt das Lineal die normale Drag-Steuerung
413 und verhaelt sich dann so, wie als wenn direkt in das Lineal geklickt
414 wurde. So captured das Lineal die Mouse und uebernimmt auch die
415 Steuerung des Cancel (ueber Tastatur, oder wenn die Mouse ueber
416 oder links vom Lineal ruasgeschoben wird). Auch alle Handler werden
417 gerufen (inkl. des StartDrag-Handlers). Wenn ein MouseEvent mit
418 Click-Count 2 uebergeben wird auch der DoubleClick-Handler
419 entsprechend gerufen.
422 Dieser Methode wird die Position vom Dokumentfenster uebergeben und
423 testet, was sich unter der Position befindet. Dabei kann wie bei
424 StartDocDrag() der entsprechende Test auf ein bestimmtes Element
425 eingeschraenkt werden. Im Gegensatz zu GetType() liefert diese
426 Methode immer DontKnow zurueck, falls kein Element getroffen wurde.
427 Falls man den HitTest selber durchfuehren moechte, kann man
428 folgende Defines fuer die Toleranz benutzen (Werte gelten fuer
430 RULER_MOUSE_TABLEWIDTH - fuer Tabellenspalten
431 RULER_MOUSE_MARGINWIDTH - fuer Margins
433 --------------------------------------------------------------------------
435 Fuer das Extra-Feld kann der Inhalt bestimmt werden und es gibt Handler,
436 womit man bestimmte Aktionen abfangen kann.
439 Dieser Handler wird gerufen, wenn im Extra-Feld die Maus
443 Mit dieser Methode kann festgelegt werden, was im ExtraFeld
444 dargestellt werden soll.
445 - ExtraType Was im Extrafeld dargestellt werden soll
446 RULER_EXTRA_DONTKNOW (Nichts)
447 RULER_EXTRA_NULLOFFSET (Koordinaaten-Kreuz)
448 RULER_EXTRA_TAB (Tab)
449 - USHORT nStyle Bitfeld als Style:
450 RULER_STYLE_HIGHLIGHT (selektiert)
451 RULER_TAB_... (ein Tab-Style)
454 Liefert die Anzahl der Mausclicks zurueck. Dadurch ist es zum
455 Beispiel auch moeglich, auch durch einen DoubleClick im Extrafeld
456 eine Aktion auszuloesen.
459 Liefert die Modifier-Tasten zurueck, die beim Klicken in das Extra-
460 Feld gedrueckt waren. Siehe MouseEvent.
462 --------------------------------------------------------------------------
464 Weitere Hilfsfunktionen:
466 - static Ruler::DrawTab()
467 Mit dieser Methode kann ein Tab auf einem OutputDevice ausgegeben
468 werden. Dadurch ist es moeglich, auch in Dialogen die Tabs so
469 anzuzeigen, wie Sie im Lineal gemalt werden.
471 Diese Methode gibt den Tab zentriert an der uebergebenen Position
472 aus. Die Groesse der Tabs kann ueber die Defines RULER_TAB_WIDTH und
473 RULER_TAB_HEIGHT bestimmt werden.
475 --------------------------------------------------------------------------
477 Tips zur Benutzung des Lineals:
479 - Bei dem Lineal muss weder im Drag-Modus noch sonst das Setzen der Werte
480 in SetUpdateMode() geklammert werden. Denn das Lineal sorgt von sich
481 aus dafuer, das wenn mehrere Werte gesetzt werden, diese automatisch
482 zusammengefast werden und flackerfrei ausgegeben werden.
484 - Initial sollten beim Lineal zuerst die Groessen, Positionen und Werte
485 gesetzt werden, bevor es angezeigt wird. Dies ist deshalb wichtig, da
486 ansonsten viele Werte unnoetig berechnet werden.
488 - Wenn das Dokumentfenster, in dem sich das Lineal befindet aktiv bzw.
489 deaktiv wird, sollten die Methoden Activate() und Deactivate() vom
490 Lineal gerufen werden. Denn je nach Einstellungen und System wird die
491 Anzeige entsprechend umgeschaltet.
493 - Zum Beispiel sollte beim Drag von Tabs und Einzuegen nach Moeglichkeit die
494 alten Positionen noch mit angezeigt werden. Dazu sollte zusaetzlich beim
495 Setzen der Tabs und Einzuege als erstes im Array die alten Positionen
496 eingetragen werden und mit dem Style RULER_STYLE_DONTKNOW verknuepft
497 werden. Danach sollte im Array die restlichen Werte eingetragen werden.
499 - Bei mehreren markierten Absaetzen und Tabellen-Zellen, sollten die Tabs
500 und Einzuege in grau von der ersten Zelle, bzw. vom ersten Absatz
501 angezeigt werden. Dies kann man auch ueber den Style RULER_STYLE_DONTKNOW
504 - Die Bemassungspfeile sollten immer dann angezeigt, wenn beim Drag die
505 Alt-Taste (WW-Like) gedrueckt wird. Vielleicht sollte diese Einstellung
506 auch immer vornehmbar sein und vielleicht beim Drag immer die
507 Bemassungspfeile dargestellt werden. Bei allen Einstellung sollten die
508 Werte immer auf ein vielfaches eines Wertes gerundet werden, da die
509 Bildschirmausloesung sehr ungenau ist.
511 - DoppelKlicks sollten folgendermassen behandelt werden (GetClickType()):
512 - RULER_TYPE_DONTKNOW
515 Wenn die Bedingunden GetClickPos() <= GetMargin1() oder
516 GetClickPos() >= GetMargin2() oder der Type gleich
517 RULER_TYPE_MARGIN1 oder RULER_TYPE_MARGIN2 ist, sollte
518 ein SeitenDialog angezeigt werden, wo der Focus auf dem
519 entsprechenden Rand steht
521 Es sollte ein Spalten- oder Tabellen-Dialog angezeigt werden,
522 wo der Focus auf der entsprechenden Spalte steht, die mit
523 GetClickAryPos() abgefragt werden kann.
525 Es sollte der Dialog angezeigt werden, wo die Einzuege eingestellt
526 werden koennen. Dabei sollte der Focus auf dem Einzug stehen, der
527 mit GetClickAryPos() ermittelt werden kann.
529 Es sollte ein TabDialog angezeigt werden, wo der Tab selektiert
530 sein sollte, der ueber GetClickAryPos() abgefragt werden kann.
532 *************************************************************************/
538 #define WB_EXTRAFIELD ((WinBits)0x00004000)
539 #define WB_RIGHT_ALIGNED ((WinBits)0x00008000)
540 #define WB_STDRULER WB_HORZ
546 struct ImplRulerHitTest
;
552 enum RulerType
{ RULER_TYPE_DONTKNOW
, RULER_TYPE_OUTSIDE
,
553 RULER_TYPE_MARGIN1
, RULER_TYPE_MARGIN2
,
554 RULER_TYPE_BORDER
, RULER_TYPE_INDENT
, RULER_TYPE_TAB
};
556 enum RulerExtra
{ RULER_EXTRA_DONTKNOW
,
557 RULER_EXTRA_NULLOFFSET
, RULER_EXTRA_TAB
};
559 #define RULER_STYLE_HIGHLIGHT ((USHORT)0x8000)
560 #define RULER_STYLE_DONTKNOW ((USHORT)0x4000)
561 #define RULER_STYLE_INVISIBLE ((USHORT)0x2000)
563 #define RULER_DRAGSIZE_MOVE 0
564 #define RULER_DRAGSIZE_1 1
565 #define RULER_DRAGSIZE_2 2
567 #define RULER_MOUSE_BORDERMOVE 5
568 #define RULER_MOUSE_BORDERWIDTH 5
569 #define RULER_MOUSE_TABLEWIDTH 1
570 #define RULER_MOUSE_MARGINWIDTH 3
572 #define RULER_SCROLL_NO 0
573 #define RULER_SCROLL_1 1
574 #define RULER_SCROLL_2 2
580 #define RULER_MARGIN_SIZEABLE ((USHORT)0x0001)
586 #define RULER_BORDER_SIZEABLE ((USHORT)0x0001)
587 #define RULER_BORDER_MOVEABLE ((USHORT)0x0002)
588 #define RULER_BORDER_VARIABLE ((USHORT)0x0004)
589 #define RULER_BORDER_TABLE ((USHORT)0x0008)
590 #define RULER_BORDER_SNAP ((USHORT)0x0010)
591 #define RULER_BORDER_MARGIN ((USHORT)0x0020)
598 //minimum/maximum position, supported for table borders/rows
607 #define RULER_INDENT_TOP ((USHORT)0x0000)
608 #define RULER_INDENT_BOTTOM ((USHORT)0x0001)
609 #define RULER_INDENT_BORDER ((USHORT)0x0002)
610 #define RULER_INDENT_STYLE ((USHORT)0x000F)
622 #define RULER_TAB_LEFT ((USHORT)0x0000)
623 #define RULER_TAB_RIGHT ((USHORT)0x0001)
624 #define RULER_TAB_DECIMAL ((USHORT)0x0002)
625 #define RULER_TAB_CENTER ((USHORT)0x0003)
626 #define RULER_TAB_DEFAULT ((USHORT)0x0004)
627 #define RULER_TAB_STYLE ((USHORT)0x000F)
628 #define RULER_TAB_RTL ((USHORT)0x0010)
636 #define RULER_TAB_WIDTH 7
637 #define RULER_TAB_HEIGHT 6
666 class SVT_DLLPUBLIC Ruler
: public Window
669 VirtualDevice maVirDev
;
683 ImplRulerData
* mpSaveData
;
684 ImplRulerData
* mpData
;
685 ImplRulerData
* mpDragData
;
686 Rectangle maExtraRect
;
692 USHORT mnDragModifier
;
694 USHORT mnExtraClicks
;
695 USHORT mnExtraModifier
;
700 RulerExtra meExtraType
;
701 RulerType meDragType
;
702 MapUnit meSourceUnit
;
717 Link maDoubleClickHdl
;
721 SVT_DLLPRIVATE
void ImplVDrawLine( long nX1
, long nY1
, long nX2
, long nY2
);
722 SVT_DLLPRIVATE
void ImplVDrawRect( long nX1
, long nY1
, long nX2
, long nY2
);
723 SVT_DLLPRIVATE
void ImplVDrawText( long nX
, long nY
, const String
& rText
);
725 SVT_DLLPRIVATE
void ImplDrawTicks( long nMin
, long nMax
, long nStart
, long nCenter
);
726 SVT_DLLPRIVATE
void ImplDrawArrows( long nCenter
);
727 SVT_DLLPRIVATE
void ImplDrawBorders( long nMin
, long nMax
, long nVirTop
, long nVirBottom
);
728 SVT_DLLPRIVATE
void ImplDrawIndent( const Polygon
& rPoly
, USHORT nStyle
);
729 SVT_DLLPRIVATE
void ImplDrawIndents( long nMin
, long nMax
, long nVirTop
, long nVirBottom
);
730 SVT_DLLPRIVATE
void ImplDrawTab( OutputDevice
* pDevice
, const Point
& rPos
, USHORT nStyle
);
731 SVT_DLLPRIVATE
void ImplDrawTabs( long nMin
, long nMax
, long nVirTop
, long nVirBottom
);
732 using Window::ImplInit
;
733 SVT_DLLPRIVATE
void ImplInit( WinBits nWinBits
);
734 SVT_DLLPRIVATE
void ImplInitSettings( BOOL bFont
, BOOL bForeground
, BOOL bBackground
);
735 SVT_DLLPRIVATE
void ImplCalc();
736 SVT_DLLPRIVATE
void ImplFormat();
737 SVT_DLLPRIVATE
void ImplInitExtraField( BOOL bUpdate
);
738 SVT_DLLPRIVATE
void ImplInvertLines( BOOL bErase
= FALSE
);
739 SVT_DLLPRIVATE
void ImplDraw();
740 SVT_DLLPRIVATE
void ImplDrawExtra( BOOL bPaint
= FALSE
);
741 SVT_DLLPRIVATE
void ImplUpdate( BOOL bMustCalc
= FALSE
);
742 using Window::ImplHitTest
;
743 SVT_DLLPRIVATE BOOL
ImplHitTest( const Point
& rPos
,
744 ImplRulerHitTest
* pHitTest
,
745 BOOL bRequiredStyle
= FALSE
,
746 USHORT nRequiredStyle
= 0 ) const;
747 SVT_DLLPRIVATE BOOL
ImplDocHitTest( const Point
& rPos
, RulerType eDragType
, ImplRulerHitTest
* pHitTest
) const;
748 SVT_DLLPRIVATE BOOL
ImplStartDrag( ImplRulerHitTest
* pHitTest
, USHORT nModifier
);
749 SVT_DLLPRIVATE
void ImplDrag( const Point
& rPos
);
750 SVT_DLLPRIVATE
void ImplEndDrag();
751 DECL_DLLPRIVATE_LINK( ImplUpdateHdl
, void* );
754 // Forbidden and not implemented.
755 Ruler (const Ruler
&);
756 Ruler
& operator= (const Ruler
&);
759 Ruler( Window
* pParent
, WinBits nWinStyle
= WB_STDRULER
);
762 virtual void MouseButtonDown( const MouseEvent
& rMEvt
);
763 virtual void MouseMove( const MouseEvent
& rMEvt
);
764 virtual void Tracking( const TrackingEvent
& rTEvt
);
765 virtual void Paint( const Rectangle
& rRect
);
766 virtual void Resize();
767 virtual void StateChanged( StateChangedType nStateChange
);
768 virtual void DataChanged( const DataChangedEvent
& rDCEvt
);
770 virtual long StartDrag();
772 virtual void EndDrag();
773 virtual void Click();
774 virtual void DoubleClick();
775 virtual void ExtraDown();
779 BOOL
IsActive() const { return mbActive
; }
781 void SetWinPos( long nOff
= 0, long nWidth
= 0 );
782 long GetWinOffset() const { return mnWinOff
; }
783 long GetWinWidth() const { return mnWinWidth
; }
784 void SetPagePos( long nOff
= 0, long nWidth
= 0 );
785 long GetPageOffset() const;
786 long GetPageWidth() const;
787 void SetBorderPos( long nOff
= 0 );
788 long GetBorderOffset() const { return mnBorderOff
; }
789 Rectangle
GetExtraRect() const { return maExtraRect
; }
791 void SetUnit( FieldUnit eNewUnit
);
792 FieldUnit
GetUnit() const { return meUnit
; }
793 void SetZoom( const Fraction
& rNewZoom
);
794 Fraction
GetZoom() const { return maZoom
; }
796 void SetSourceUnit( MapUnit eNewUnit
) { meSourceUnit
= eNewUnit
; }
797 MapUnit
GetSourceUnit() const { return meSourceUnit
; }
799 void SetExtraType( RulerExtra eNewExtraType
, USHORT nStyle
= 0 );
800 RulerExtra
GetExtraType() const { return meExtraType
; }
801 USHORT
GetExtraStyle() const { return mnExtraStyle
; }
802 USHORT
GetExtraClicks() const { return mnExtraClicks
; }
803 USHORT
GetExtraModifier() const { return mnExtraModifier
; }
805 BOOL
StartDocDrag( const MouseEvent
& rMEvt
,
806 RulerType eDragType
= RULER_TYPE_DONTKNOW
);
807 RulerType
GetDocType( const Point
& rPos
,
808 RulerType eDragType
= RULER_TYPE_DONTKNOW
,
809 USHORT
* pAryPos
= NULL
) const;
810 RulerType
GetDragType() const { return meDragType
; }
811 long GetDragPos() const { return mnDragPos
; }
812 USHORT
GetDragAryPos() const { return mnDragAryPos
; }
813 USHORT
GetDragSize() const { return mnDragSize
; }
814 BOOL
IsDragDelete() const { return mbDragDelete
; }
815 BOOL
IsDragCanceled() const { return mbDragCanceled
; }
816 USHORT
GetDragScroll() const { return mnDragScroll
; }
817 USHORT
GetDragModifier() const { return mnDragModifier
; }
818 BOOL
IsDrag() const { return mbDrag
; }
820 long GetClickPos() const { return mnDragPos
; }
821 RulerType
GetClickType() const { return meDragType
; }
822 USHORT
GetClickAryPos() const { return mnDragAryPos
; }
823 using Window::GetType
;
824 RulerType
GetType( const Point
& rPos
,
825 USHORT
* pAryPos
= NULL
) const;
827 void SetNullOffset( long nPos
);
828 long GetNullOffset() const;
829 void SetMargin1() { SetMargin1( 0, RULER_STYLE_INVISIBLE
); }
830 void SetMargin1( long nPos
, USHORT nMarginStyle
= RULER_MARGIN_SIZEABLE
);
831 long GetMargin1() const;
832 USHORT
GetMargin1Style() const;
833 void SetMargin2() { SetMargin2( 0, RULER_STYLE_INVISIBLE
); }
834 void SetMargin2( long nPos
, USHORT nMarginStyle
= RULER_MARGIN_SIZEABLE
);
835 long GetMargin2() const;
836 USHORT
GetMargin2Style() const;
838 void SetLines( USHORT n
= 0, const RulerLine
* pLineAry
= NULL
);
839 USHORT
GetLineCount() const;
840 const RulerLine
* GetLines() const;
842 void SetArrows( USHORT n
= 0, const RulerArrow
* pArrowAry
= NULL
);
843 USHORT
GetArrowCount() const;
844 const RulerArrow
* GetArrows() const;
846 void SetBorders( USHORT n
= 0, const RulerBorder
* pBrdAry
= NULL
);
847 USHORT
GetBorderCount() const;
848 const RulerBorder
* GetBorders() const;
850 void SetIndents( USHORT n
= 0, const RulerIndent
* pIndentAry
= NULL
);
851 USHORT
GetIndentCount() const;
852 const RulerIndent
* GetIndents() const;
854 void SetTabs( USHORT n
= 0, const RulerTab
* pTabAry
= NULL
);
855 USHORT
GetTabCount() const;
856 const RulerTab
* GetTabs() const;
858 static void DrawTab( OutputDevice
* pDevice
,
859 const Point
& rPos
, USHORT nStyle
);
861 void SetStyle( WinBits nStyle
);
862 WinBits
GetStyle() const { return mnWinStyle
; }
864 void SetStartDragHdl( const Link
& rLink
) { maStartDragHdl
= rLink
; }
865 const Link
& GetStartDragHdl() const { return maStartDragHdl
; }
866 void SetDragHdl( const Link
& rLink
) { maDragHdl
= rLink
; }
867 const Link
& GetDragHdl() const { return maDragHdl
; }
868 void SetEndDragHdl( const Link
& rLink
) { maEndDragHdl
= rLink
; }
869 const Link
& GetEndDragHdl() const { return maEndDragHdl
; }
870 void SetClickHdl( const Link
& rLink
) { maClickHdl
= rLink
; }
871 const Link
& GetClickHdl() const { return maClickHdl
; }
872 void SetDoubleClickHdl( const Link
& rLink
) { maDoubleClickHdl
= rLink
; }
873 const Link
& GetDoubleClickHdl() const { return maDoubleClickHdl
; }
874 void SetExtraDownHdl( const Link
& rLink
) { maExtraDownHdl
= rLink
; }
875 const Link
& GetExtraDownHdl() const { return maExtraDownHdl
; }
877 //set text direction right-to-left
878 void SetTextRTL(BOOL bRTL
);
880 void SetCharWidth( long nWidth
) { mnCharWidth
= nWidth
; }
881 void SetLineHeight( long nHeight
) { mnLineHeight
= nHeight
; }