Update ooo320-m1
[ooovba.git] / svtools / inc / ruler.hxx
blob8ff4c77604e9d44b08093e2c2a3518737c396c7c
1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: ruler.hxx,v $
10 * $Revision: 1.13 $
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 ************************************************************************/
31 #ifndef _RULER_HXX
32 #define _RULER_HXX
34 #include "svtools/svtdllapi.h"
35 #include <tools/link.hxx>
36 #include <vcl/window.hxx>
37 #ifndef _VIRDEV_HXX
38 #include <vcl/virdev.hxx>
39 #endif
40 #include <vcl/field.hxx>
42 class MouseEvent;
43 class TrackingEvent;
44 class DataChangedEvent;
46 /*************************************************************************
48 Beschreibung
49 ============
51 class Ruler
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 --------------------------------------------------------------------------
59 WinBits
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
78 eingestellt werden.
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() );
109 - PagePos
111 Point aPagePos = aEditWin.LogicToPixel( aEditWin.GetPagePos() );
112 aHRuler.SetPagePos( aPagePos().X() );
114 - Alle anderen Werte
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:
125 FUNIT_MM
126 FUNIT_CM (Default)
127 FUNIT_M
128 FUNIT_KM
129 FUNIT_INCH
130 FUNIT_FOOT
131 FUNIT_MILE
132 FUNIT_POINT
133 FUNIT_PICA
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
173 werden kann.
174 RULER_BORDER_VARIABLE
175 Nicht alle Spaltenabstande sind gleich
176 RULER_BORDER_TABLE
177 Tabellenrahmen. Wenn dieser Style gesetzt
178 wird, muss die Spaltenbreite 0 sein.
179 RULER_BORDER_SNAP
180 Hilfslinie / Fanglinie. Wenn dieser Style
181 gesetzt wird, muss die Spaltenbreite 0 sein.
182 RULER_BORDER_MARGIN
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)
214 RULER_TAB_LEFT
215 RULER_TAB_CENTER
216 RULER_TAB_RIGHT
217 RULER_TAB_DECIMAL
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.
259 - StartDrag()
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.
265 - EndDrag()
266 Wird gerufen, wenn das Draggen beendet wird.
268 - Drag()
269 Wird gerufen, wenn gedragt wird.
271 - Click()
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.
279 - DoubleClick()
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.
289 - GetDragType()
290 Liefert zurueck, was gedragt wird:
291 RULER_TYPE_MARGIN1
292 RULER_TYPE_MARGIN2
293 RULER_TYPE_BORDER
294 RULER_TYPE_INDENT
295 RULER_TYPE_TAB
297 - GetDragPos()
298 Liefert die Pixel-Position bezogen auf den eingestellten Null-Offset
299 zurueck, wohin der Anwender die Maus bewegt hat.
301 - GetDragAryPos()
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
307 Lineal gezogen wird.
309 - GetDragSize()
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
316 - IsDragDelete()
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
320 loeschen will.
322 - IsDragCanceled()
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
334 vergleichen.
336 - GetDragScroll()
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.
351 - GetDragModifier()
352 Liefert die Modifier-Tasten zurueck, die beim Starten des Drag-
353 Vorgangs gedrueckt waren. Siehe MouseEvent.
355 - GetClickPos()
356 Liefert die Pixel-Position bezogen auf den eingestellten Null-Offset
357 zurueck, wo der Anwender die Maus gedrueckt hat.
359 - GetClickType()
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())
369 - GetClickAryPos()
370 Liefert den Index im Array zurueck, wenn ein Border, Indent oder ein
371 Tab per DoubleClick betaetigt wird.
373 - GetType()
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
391 Drag-Steuerung:
393 - IsDrag()
394 Liefert TRUE zurueck, wenn sich das Lineal im Drag-Vorgang befindet.
396 - CancelDrag()
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:
403 - StartDocDrag()
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.
421 - GetDocType()
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
429 eine Richtung):
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.
438 - ExtraDown()
439 Dieser Handler wird gerufen, wenn im Extra-Feld die Maus
440 gedrueckt wird.
442 - SetExtraType()
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)
453 - GetExtraClick()
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.
458 - GetExtraModifier()
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
502 erreichen.
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
513 RULER_TYPE_MARGIN1
514 RULER_TYPE_MARGIN2
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
520 - RULER_TYPE_BORDER
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.
524 - RULER_TYPE_INDENT
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.
528 - RULER_TYPE_TAB
529 Es sollte ein TabDialog angezeigt werden, wo der Tab selektiert
530 sein sollte, der ueber GetClickAryPos() abgefragt werden kann.
532 *************************************************************************/
534 // -----------
535 // - WinBits -
536 // -----------
538 #define WB_EXTRAFIELD ((WinBits)0x00004000)
539 #define WB_RIGHT_ALIGNED ((WinBits)0x00008000)
540 #define WB_STDRULER WB_HORZ
542 // ---------------
543 // - Ruler-Types -
544 // ---------------
546 struct ImplRulerHitTest;
548 // --------------
549 // - Ruler-Type -
550 // --------------
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
576 // ---------------
577 // - RulerMargin -
578 // ---------------
580 #define RULER_MARGIN_SIZEABLE ((USHORT)0x0001)
582 // ---------------
583 // - RulerBorder -
584 // ---------------
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)
593 struct RulerBorder
595 long nPos;
596 long nWidth;
597 USHORT nStyle;
598 //minimum/maximum position, supported for table borders/rows
599 long nMinPos;
600 long nMaxPos;
603 // ---------------
604 // - RulerIndent -
605 // ---------------
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)
612 struct RulerIndent
614 long nPos;
615 USHORT nStyle;
618 // ------------
619 // - RulerTab -
620 // ------------
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)
630 struct RulerTab
632 long nPos;
633 USHORT nStyle;
636 #define RULER_TAB_WIDTH 7
637 #define RULER_TAB_HEIGHT 6
639 // -------------
640 // - RulerLine -
641 // -------------
643 struct RulerLine
645 long nPos;
646 USHORT nStyle;
649 // --------------
650 // - RulerArrow -
651 // --------------
653 struct RulerArrow
655 long nPos;
656 long nWidth;
657 long nLogWidth;
658 USHORT nStyle;
661 class ImplRulerData;
662 // ---------
663 // - Ruler -
664 // ---------
666 class SVT_DLLPUBLIC Ruler : public Window
668 private:
669 VirtualDevice maVirDev;
670 MapMode maMapMode;
671 long mnBorderOff;
672 long mnWinOff;
673 long mnWinWidth;
674 long mnWidth;
675 long mnHeight;
676 long mnVirOff;
677 long mnVirWidth;
678 long mnVirHeight;
679 long mnBorderWidth;
680 long mnStartDragPos;
681 long mnDragPos;
682 ULONG mnUpdateEvtId;
683 ImplRulerData* mpSaveData;
684 ImplRulerData* mpData;
685 ImplRulerData* mpDragData;
686 Rectangle maExtraRect;
687 WinBits mnWinStyle;
688 USHORT mnUnitIndex;
689 USHORT mnDragAryPos;
690 USHORT mnDragSize;
691 USHORT mnDragScroll;
692 USHORT mnDragModifier;
693 USHORT mnExtraStyle;
694 USHORT mnExtraClicks;
695 USHORT mnExtraModifier;
696 // Amelia
697 long mnCharWidth;
698 long mnLineHeight;
700 RulerExtra meExtraType;
701 RulerType meDragType;
702 MapUnit meSourceUnit;
703 FieldUnit meUnit;
704 Fraction maZoom;
705 BOOL mbCalc;
706 BOOL mbFormat;
707 BOOL mbDrag;
708 BOOL mbDragDelete;
709 BOOL mbDragCanceled;
710 BOOL mbAutoWinWidth;
711 BOOL mbActive;
712 BYTE mnUpdateFlags;
713 Link maStartDragHdl;
714 Link maDragHdl;
715 Link maEndDragHdl;
716 Link maClickHdl;
717 Link maDoubleClickHdl;
718 Link maExtraDownHdl;
720 #ifdef _SV_RULER_CXX
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* );
752 #endif
754 // Forbidden and not implemented.
755 Ruler (const Ruler &);
756 Ruler & operator= (const Ruler &);
758 public:
759 Ruler( Window* pParent, WinBits nWinStyle = WB_STDRULER );
760 virtual ~Ruler();
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();
771 virtual void Drag();
772 virtual void EndDrag();
773 virtual void Click();
774 virtual void DoubleClick();
775 virtual void ExtraDown();
777 void Activate();
778 void Deactivate();
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; }
819 void CancelDrag();
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 ; }
883 void DrawTicks();
886 #endif // _RULER_HXX