update dev300-m57
[ooovba.git] / svtools / inc / calendar.hxx
blob830b275f59c0d132c272b0cb49b0accb4552375d
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: calendar.hxx,v $
10 * $Revision: 1.9 $
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 _CALENDAR_HXX
32 #define _CALENDAR_HXX
34 #include "svtools/svtdllapi.h"
35 #include <unotools/calendarwrapper.hxx>
36 #ifndef _COM_SUN_STAR_I18N_WEEKDAYS_HPP
37 #include <com/sun/star/i18n/Weekdays.hpp>
38 #endif
40 #ifndef _CTRL_HXX
41 #include <vcl/ctrl.hxx>
42 #endif
43 #include <vcl/timer.hxx>
44 #ifndef _FIELD_HXX
45 #include <vcl/field.hxx>
46 #endif
48 class Table;
49 class MouseEvent;
50 class TrackingEvent;
51 class KeyEvent;
52 class HelpEvent;
53 class DataChangedEvent;
54 class FloatingWindow;
55 class PushButton;
56 struct ImplDateInfo;
57 class ImplDateTable;
58 class ImplCFieldFloatWin;
60 /*************************************************************************
62 Beschreibung
63 ============
65 class Calendar
67 Diese Klasse erlaubt die Auswahl eines Datum. Der Datumsbereich der
68 angezeigt wird, ist der, der durch die Klasse Date vorgegeben ist.
69 Es werden soviele Monate angezeigt, wie die Ausgabeflaeche des
70 Controls vorgibt. Der Anwender kann zwischen den Monaten ueber ein
71 ContextMenu (Bei Click auf den Monatstitel) oder durch 2 ScrollButtons
72 zwischen den Monaten wechseln.
74 --------------------------------------------------------------------------
76 WinBits
78 WB_BORDER Um das Fenster wird ein Border gezeichnet.
79 WB_TABSTOP Tastatursteuerung ist moeglich. Der Focus wird
80 sich geholt, wenn mit der Maus in das
81 Control geklickt wird.
82 WB_QUICKHELPSHOWSDATEINFO DateInfo auch bei QuickInfo als BalloonHelp zeigen
83 WB_BOLDTEXT Formatiert wird nach fetten Texten und
84 DIB_BOLD wird bei AddDateInfo() ausgewertet
85 WB_FRAMEINFO Formatiert wird so, das Frame-Info angezeigt
86 werden kann und die FrameColor bei AddDateInfo()
87 ausgewertet wird
88 WB_RANGESELECT Es koennen mehrere Tage selektiert werden, die
89 jedoch alle zusammenhaengend sein muessen
90 WB_MULTISELECT Es koennen mehrere Tage selektiert werden
91 WB_WEEKNUMBER Es werden die Wochentage mit angezeigt
93 --------------------------------------------------------------------------
95 Mit SetCurDate() / GetCurDate() wird das ausgewaehlte Datum gesetzt und
96 abgefragt. Wenn der Anwnder ein Datum selektiert hat, wird Select()
97 gerufen. Bei einem Doppelklick auf ein Datum wird DoubleClick() gerufen.
99 --------------------------------------------------------------------------
101 Mit CalcWindowSizePixel() kann die Groesse des Fensters in Pixel fuer
102 die Darstellung einer bestimmte Anzahl von Monaten berechnet werden.
104 --------------------------------------------------------------------------
106 Mit SetSaturdayColor() kann eine spezielle Farbe fuer Sonnabende gesetzt
107 werden und mit SetSundayColor() eine fuer Sonntage. Mit AddDateInfo()
108 koennen Tage speziell gekennzeichnet werden. Dabei kann man einem
109 einzelnen Datum eine andere Farbe geben (zum Beispiel fuer Feiertage)
110 oder diese Umranden (zum Beispiel fuer Termine). Wenn beim Datum
111 kein Jahr angegeben wird, wird der Tag in jedem Jahr benutzt. Mit
112 AddDateInfo() kann auch jedem Datum ein Text mitgegeben werden, der
113 dann angezeigt wird, wenn Balloon-Hilfe an ist. Um nicht alle Jahre
114 mit entsprechenden Daten zu versorgen, wird der RequestDateInfo()-
115 Handler gerufen, wenn ein neues Jahr angezeigt wird. Es kann dann
116 im Handler mit GetRequestYear() das Jahr abgefragt werden.
118 --------------------------------------------------------------------------
120 Um ein ContextMenu zu einem Datum anzuzeigen, muss man den Command-Handler
121 ueberlagern. Mit GetDate() kann zur Mouse-Position das Datum ermittelt
122 werden. Bei Tastaturausloesung sollte das aktuelle Datum genommen werden.
123 Wenn ein ContextMenu angezeigt wird, darf der Handler der Basisklasse nicht
124 gerufen werden.
126 --------------------------------------------------------------------------
128 Bei Mehrfachselektion WB_RANGESELECT oder WB_MULTISELECT kann mit
129 SelectDate()/SelectDateRange() Datumsbereiche selektiert/deselektiert
130 werden. SelectDateRange() gilt inkl. EndDatum. Mit SetNoSelection() kann
131 alles deselektiert werden. SetCurDate() selektiert bei Mehrfachselektion
132 jedoch nicht das Datum mit, sondern gibt nur das Focus-Rechteck vor.
134 Den selektierten Bereich kann man mit GetSelectDateCount()/GetSelectDate()
135 abgefragt werden oder der Status von einem Datum kann mit IsDateSelected()
136 abgefragt werden.
138 Waehrend der Anwender am selektieren ist, wird der SelectionChanging()-
139 Handler gerufen. In diesem kann der selektierte Bereich angepasst werden,
140 wenn man beispielsweise den Bereich eingrenzen oder erweitern will. Der
141 Bereich wird mit SelectDate()/SelectDateRange() umgesetzt und mit
142 GetSelectDateCount()/GetSelectDate() abgefragt. Wenn man wissen moechte,
143 in welche Richtung selektiert wird, kann dies ueber IsSelectLeft()
144 abgefragt werden. TRUE bedeutet eine Selektion nach links oder oben,
145 FALSE eine Selektion nach rechts oder unten.
147 --------------------------------------------------------------------------
149 Wenn sich der Date-Range-Bereich anpasst und man dort die Selektion
150 uebernehmen will, sollte dies nur gemacht werden, wenn
151 IsScrollDateRangeChanged() TRUE zurueckliefert. Denn diese Methode liefert
152 TRUE zurueck, wenn der Bereich durch Betaetigung von den Scroll-Buttons
153 ausgeloest wurde. Bei FALSE wurde dies durch Resize(), Methoden-Aufrufen
154 oder durch Beendigung einer Selektion ausgeloest.
156 *************************************************************************/
158 // ------------------
159 // - Calendar-Types -
160 // ------------------
162 #define WB_QUICKHELPSHOWSDATEINFO ((WinBits)0x00004000)
163 #define WB_BOLDTEXT ((WinBits)0x00008000)
164 #define WB_FRAMEINFO ((WinBits)0x00010000)
165 #define WB_WEEKNUMBER ((WinBits)0x00020000)
166 // Muss mit den WinBits beim TabBar uebereinstimmen oder mal
167 // nach \vcl\inc\wintypes.hxx verlagert werden
168 #ifndef WB_RANGESELECT
169 #define WB_RANGESELECT ((WinBits)0x00200000)
170 #endif
171 #ifndef WB_MULTISELECT
172 #define WB_MULTISELECT ((WinBits)0x00400000)
173 #endif
175 #define DIB_BOLD ((USHORT)0x0001)
177 // ------------
178 // - Calendar -
179 // ------------
181 class SVT_DLLPUBLIC Calendar : public Control
183 private:
184 ImplDateTable* mpDateTable;
185 Table* mpSelectTable;
186 Table* mpOldSelectTable;
187 Table* mpRestoreSelectTable;
188 XubString* mpDayText[31];
189 XubString maDayText;
190 XubString maWeekText;
191 CalendarWrapper maCalendarWrapper;
192 Rectangle maPrevRect;
193 Rectangle maNextRect;
194 String maDayOfWeekText;
195 sal_Int32 mnDayOfWeekAry[7];
196 Date maOldFormatFirstDate;
197 Date maOldFormatLastDate;
198 Date maFirstDate;
199 Date maOldFirstDate;
200 Date maCurDate;
201 Date maOldCurDate;
202 Date maAnchorDate;
203 Date maDropDate;
204 Color maSelColor;
205 Color maOtherColor;
206 Color* mpStandardColor;
207 Color* mpSaturdayColor;
208 Color* mpSundayColor;
209 ULONG mnDayCount;
210 long mnDaysOffX;
211 long mnWeekDayOffY;
212 long mnDaysOffY;
213 long mnMonthHeight;
214 long mnMonthWidth;
215 long mnMonthPerLine;
216 long mnLines;
217 long mnDayWidth;
218 long mnDayHeight;
219 long mnWeekWidth;
220 long mnDummy2;
221 long mnDummy3;
222 long mnDummy4;
223 WinBits mnWinStyle;
224 USHORT mnFirstYear;
225 USHORT mnLastYear;
226 USHORT mnRequestYear;
227 BOOL mbCalc:1,
228 mbFormat:1,
229 mbDrag:1,
230 mbSelection:1,
231 mbMultiSelection:1,
232 mbWeekSel:1,
233 mbUnSel:1,
234 mbMenuDown:1,
235 mbSpinDown:1,
236 mbPrevIn:1,
237 mbNextIn:1,
238 mbDirect:1,
239 mbInSelChange:1,
240 mbTravelSelect:1,
241 mbScrollDateRange:1,
242 mbSelLeft:1,
243 mbAllSel:1,
244 mbDropPos:1;
245 Link maSelectionChangingHdl;
246 Link maDateRangeChangedHdl;
247 Link maRequestDateInfoHdl;
248 Link maDoubleClickHdl;
249 Link maSelectHdl;
250 Timer maDragScrollTimer;
251 USHORT mnDragScrollHitTest;
253 #ifdef _SV_CALENDAR_CXX
254 using Window::ImplInit;
255 SVT_DLLPRIVATE void ImplInit( WinBits nWinStyle );
256 SVT_DLLPRIVATE void ImplInitSettings();
257 SVT_DLLPRIVATE void ImplGetWeekFont( Font& rFont ) const;
258 SVT_DLLPRIVATE void ImplFormat();
259 using Window::ImplHitTest;
260 SVT_DLLPRIVATE USHORT ImplHitTest( const Point& rPos, Date& rDate ) const;
261 SVT_DLLPRIVATE void ImplDrawSpin( BOOL bDrawPrev = TRUE, BOOL bDrawNext = TRUE );
262 SVT_DLLPRIVATE void ImplDrawDate( long nX, long nY,
263 USHORT nDay, USHORT nMonth, USHORT nYear,
264 DayOfWeek eDayOfWeek,
265 BOOL bBack = TRUE, BOOL bOther = FALSE,
266 ULONG nToday = 0 );
267 SVT_DLLPRIVATE void ImplDraw( BOOL bPaint = FALSE );
268 SVT_DLLPRIVATE void ImplUpdateDate( const Date& rDate );
269 SVT_DLLPRIVATE void ImplUpdateSelection( Table* pOld );
270 SVT_DLLPRIVATE void ImplMouseSelect( const Date& rDate, USHORT nHitTest,
271 BOOL bMove, BOOL bExpand, BOOL bExtended );
272 SVT_DLLPRIVATE void ImplUpdate( BOOL bCalcNew = FALSE );
273 using Window::ImplScroll;
274 SVT_DLLPRIVATE void ImplScroll( BOOL bPrev );
275 SVT_DLLPRIVATE void ImplInvertDropPos();
276 SVT_DLLPRIVATE void ImplShowMenu( const Point& rPos, const Date& rDate );
277 SVT_DLLPRIVATE void ImplTracking( const Point& rPos, BOOL bRepeat );
278 SVT_DLLPRIVATE void ImplEndTracking( BOOL bCancel );
279 SVT_DLLPRIVATE DayOfWeek ImplGetWeekStart() const;
280 #endif
282 protected:
283 BOOL ShowDropPos( const Point& rPos, Date& rDate );
284 void HideDropPos();
286 DECL_STATIC_LINK( Calendar, ScrollHdl, Timer *);
288 public:
289 Calendar( Window* pParent, WinBits nWinStyle = 0 );
290 Calendar( Window* pParent, const ResId& rResId );
291 ~Calendar();
293 virtual void MouseButtonDown( const MouseEvent& rMEvt );
294 virtual void MouseButtonUp( const MouseEvent& rMEvt );
295 virtual void MouseMove( const MouseEvent& rMEvt );
296 virtual void Tracking( const TrackingEvent& rMEvt );
297 virtual void KeyInput( const KeyEvent& rKEvt );
298 virtual void Paint( const Rectangle& rRect );
299 virtual void Resize();
300 virtual void GetFocus();
301 virtual void LoseFocus();
302 virtual void RequestHelp( const HelpEvent& rHEvt );
303 virtual void Command( const CommandEvent& rCEvt );
304 virtual void StateChanged( StateChangedType nStateChange );
305 virtual void DataChanged( const DataChangedEvent& rDCEvt );
307 virtual void SelectionChanging();
308 virtual void DateRangeChanged();
309 virtual void RequestDateInfo();
310 virtual void DoubleClick();
311 virtual void Select();
313 const CalendarWrapper& GetCalendarWrapper() const { return maCalendarWrapper; }
315 /// Set one of ::com::sun::star::i18n::Weekdays.
316 void SetWeekStart( sal_Int16 nDay );
318 /// Set how many days of a week must reside in the first week of a year.
319 void SetMinimumNumberOfDaysInWeek( sal_Int16 nDays );
321 void SelectDate( const Date& rDate, BOOL bSelect = TRUE );
322 void SelectDateRange( const Date& rStartDate, const Date& rEndDate,
323 BOOL bSelect = TRUE );
324 void SetNoSelection();
325 BOOL IsDateSelected( const Date& rDate ) const;
326 ULONG GetSelectDateCount() const;
327 Date GetSelectDate( ULONG nIndex = 0 ) const;
328 void EnableCallEverySelect( BOOL bEvery = TRUE ) { mbAllSel = bEvery; }
329 BOOL IsCallEverySelectEnabled() const { return mbAllSel; }
331 USHORT GetRequestYear() const { return mnRequestYear; }
332 void SetCurDate( const Date& rNewDate );
333 Date GetCurDate() const { return maCurDate; }
334 void SetFirstDate( const Date& rNewFirstDate );
335 Date GetFirstDate() const { return maFirstDate; }
336 Date GetLastDate() const { return GetFirstDate() + mnDayCount; }
337 ULONG GetDayCount() const { return mnDayCount; }
338 Date GetFirstMonth() const;
339 Date GetLastMonth() const;
340 USHORT GetMonthCount() const;
341 BOOL GetDate( const Point& rPos, Date& rDate ) const;
342 Rectangle GetDateRect( const Date& rDate ) const;
343 BOOL GetDropDate( Date& rDate ) const;
345 long GetCurMonthPerLine() const { return mnMonthPerLine; }
346 long GetCurLines() const { return mnLines; }
348 void SetStandardColor( const Color& rColor );
349 const Color& GetStandardColor() const;
350 void SetSaturdayColor( const Color& rColor );
351 const Color& GetSaturdayColor() const;
352 void SetSundayColor( const Color& rColor );
353 const Color& GetSundayColor() const;
355 void AddDateInfo( const Date& rDate, const XubString& rText,
356 const Color* pTextColor = NULL,
357 const Color* pFrameColor = NULL,
358 USHORT nFlags = 0 );
359 void RemoveDateInfo( const Date& rDate );
360 void ClearDateInfo();
361 XubString GetDateInfoText( const Date& rDate );
363 void StartSelection();
364 void EndSelection();
366 BOOL IsTravelSelect() const { return mbTravelSelect; }
367 BOOL IsScrollDateRangeChanged() const { return mbScrollDateRange; }
368 BOOL IsSelectLeft() const { return mbSelLeft; }
370 Size CalcWindowSizePixel( long nCalcMonthPerLine = 1,
371 long nCalcLines = 1 ) const;
373 void SetSelectionChangingHdl( const Link& rLink ) { maSelectionChangingHdl = rLink; }
374 const Link& GetSelectionChangingHdl() const { return maSelectionChangingHdl; }
375 void SetDateRangeChangedHdl( const Link& rLink ) { maDateRangeChangedHdl = rLink; }
376 const Link& GetDateRangeChangedHdl() const { return maDateRangeChangedHdl; }
377 void SetRequestDateInfoHdl( const Link& rLink ) { maRequestDateInfoHdl = rLink; }
378 const Link& GetRequestDateInfoHdl() const { return maRequestDateInfoHdl; }
379 void SetDoubleClickHdl( const Link& rLink ) { maDoubleClickHdl = rLink; }
380 const Link& GetDoubleClickHdl() const { return maDoubleClickHdl; }
381 void SetSelectHdl( const Link& rLink ) { maSelectHdl = rLink; }
382 const Link& GetSelectHdl() const { return maSelectHdl; }
385 inline const Color& Calendar::GetStandardColor() const
387 if ( mpStandardColor )
388 return *mpStandardColor;
389 else
390 return GetFont().GetColor();
393 inline const Color& Calendar::GetSaturdayColor() const
395 if ( mpSaturdayColor )
396 return *mpSaturdayColor;
397 else
398 return GetFont().GetColor();
401 inline const Color& Calendar::GetSundayColor() const
403 if ( mpSundayColor )
404 return *mpSundayColor;
405 else
406 return GetFont().GetColor();
409 /*************************************************************************
411 Beschreibung
412 ============
414 class CalendarField
416 Bei dieser Klasse handelt es sich um ein DateField, wo ueber einen
417 DropDown-Button ueber das Calendar-Control ein Datum ausgewaehlt werden
418 kann.
420 --------------------------------------------------------------------------
422 WinBits
424 Siehe DateField
426 Die Vorgaben fuer das CalendarControl koennen ueber SetCalendarStyle()
427 gesetzt werden.
429 --------------------------------------------------------------------------
431 Mit EnableToday()/EnableNone() kann ein Today-Button und ein None-Button
432 enabled werden.
434 --------------------------------------------------------------------------
436 Wenn mit SetCalendarStyle() WB_RANGESELECT gesetzt wird, koennen im
437 Calendar auch mehrere Tage selektiert werden. Da immer nur das Start-Datum
438 in das Feld uebernommen wird, sollte dann im Select-Handler mit
439 GetCalendar() der Calendar abgefragt werden und an dem mit
440 GetSelectDateCount()/GetSelectDate() der selektierte Bereich abgefragt
441 werden, um beispielsweise diese dann in ein weiteres Feld zu uebernehmen.
443 --------------------------------------------------------------------------
445 Wenn ein abgeleiteter Calendar verwendet werden soll, kann am
446 CalendarField die Methode CreateCalendar() ueberlagert werden und
447 dort ein eigener Calendar erzeugt werden.
449 *************************************************************************/
451 // -----------------
452 // - CalendarField -
453 // -----------------
455 class SVT_DLLPUBLIC CalendarField : public DateField
457 private:
458 ImplCFieldFloatWin* mpFloatWin;
459 Calendar* mpCalendar;
460 WinBits mnCalendarStyle;
461 PushButton* mpTodayBtn;
462 PushButton* mpNoneBtn;
463 Date maDefaultDate;
464 BOOL mbToday;
465 BOOL mbNone;
466 Link maSelectHdl;
468 #ifdef _SV_CALENDAR_CXX
469 DECL_DLLPRIVATE_LINK( ImplSelectHdl, Calendar* );
470 DECL_DLLPRIVATE_LINK( ImplClickHdl, PushButton* );
471 DECL_DLLPRIVATE_LINK( ImplPopupModeEndHdl, FloatingWindow* );
472 #endif
474 public:
475 CalendarField( Window* pParent, WinBits nWinStyle );
476 CalendarField( Window* pParent, const ResId& rResId );
477 ~CalendarField();
479 virtual void Select();
481 virtual BOOL ShowDropDown( BOOL bShow );
482 virtual Calendar* CreateCalendar( Window* pParent );
483 Calendar* GetCalendar();
485 void SetDefaultDate( const Date& rDate ) { maDefaultDate = rDate; }
486 Date GetDefaultDate() const { return maDefaultDate; }
488 void EnableToday( BOOL bToday = TRUE ) { mbToday = bToday; }
489 BOOL IsTodayEnabled() const { return mbToday; }
490 void EnableNone( BOOL bNone = TRUE ) { mbNone = bNone; }
491 BOOL IsNoneEnabled() const { return mbNone; }
493 void SetCalendarStyle( WinBits nStyle ) { mnCalendarStyle = nStyle; }
494 WinBits GetCalendarStyle() const { return mnCalendarStyle; }
496 void SetSelectHdl( const Link& rLink ) { maSelectHdl = rLink; }
497 const Link& GetSelectHdl() const { return maSelectHdl; }
499 protected:
500 virtual void StateChanged( StateChangedType nStateChange );
503 #endif // _CALENDAR_HXX