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: calendar.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 <unotools/calendarwrapper.hxx>
36 #ifndef _COM_SUN_STAR_I18N_WEEKDAYS_HPP
37 #include <com/sun/star/i18n/Weekdays.hpp>
41 #include <vcl/ctrl.hxx>
43 #include <vcl/timer.hxx>
45 #include <vcl/field.hxx>
53 class DataChangedEvent
;
58 class ImplCFieldFloatWin
;
60 /*************************************************************************
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 --------------------------------------------------------------------------
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()
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
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()
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)
171 #ifndef WB_MULTISELECT
172 #define WB_MULTISELECT ((WinBits)0x00400000)
175 #define DIB_BOLD ((USHORT)0x0001)
181 class SVT_DLLPUBLIC Calendar
: public Control
184 ImplDateTable
* mpDateTable
;
185 Table
* mpSelectTable
;
186 Table
* mpOldSelectTable
;
187 Table
* mpRestoreSelectTable
;
188 XubString
* mpDayText
[31];
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
;
206 Color
* mpStandardColor
;
207 Color
* mpSaturdayColor
;
208 Color
* mpSundayColor
;
226 USHORT mnRequestYear
;
245 Link maSelectionChangingHdl
;
246 Link maDateRangeChangedHdl
;
247 Link maRequestDateInfoHdl
;
248 Link maDoubleClickHdl
;
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
,
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;
283 BOOL
ShowDropPos( const Point
& rPos
, Date
& rDate
);
286 DECL_STATIC_LINK( Calendar
, ScrollHdl
, Timer
*);
289 Calendar( Window
* pParent
, WinBits nWinStyle
= 0 );
290 Calendar( Window
* pParent
, const ResId
& rResId
);
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
,
359 void RemoveDateInfo( const Date
& rDate
);
360 void ClearDateInfo();
361 XubString
GetDateInfoText( const Date
& rDate
);
363 void StartSelection();
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
;
390 return GetFont().GetColor();
393 inline const Color
& Calendar::GetSaturdayColor() const
395 if ( mpSaturdayColor
)
396 return *mpSaturdayColor
;
398 return GetFont().GetColor();
401 inline const Color
& Calendar::GetSundayColor() const
404 return *mpSundayColor
;
406 return GetFont().GetColor();
409 /*************************************************************************
416 Bei dieser Klasse handelt es sich um ein DateField, wo ueber einen
417 DropDown-Button ueber das Calendar-Control ein Datum ausgewaehlt werden
420 --------------------------------------------------------------------------
426 Die Vorgaben fuer das CalendarControl koennen ueber SetCalendarStyle()
429 --------------------------------------------------------------------------
431 Mit EnableToday()/EnableNone() kann ein Today-Button und ein None-Button
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 *************************************************************************/
455 class SVT_DLLPUBLIC CalendarField
: public DateField
458 ImplCFieldFloatWin
* mpFloatWin
;
459 Calendar
* mpCalendar
;
460 WinBits mnCalendarStyle
;
461 PushButton
* mpTodayBtn
;
462 PushButton
* mpNoneBtn
;
468 #ifdef _SV_CALENDAR_CXX
469 DECL_DLLPRIVATE_LINK( ImplSelectHdl
, Calendar
* );
470 DECL_DLLPRIVATE_LINK( ImplClickHdl
, PushButton
* );
471 DECL_DLLPRIVATE_LINK( ImplPopupModeEndHdl
, FloatingWindow
* );
475 CalendarField( Window
* pParent
, WinBits nWinStyle
);
476 CalendarField( Window
* pParent
, const ResId
& rResId
);
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
; }
500 virtual void StateChanged( StateChangedType nStateChange
);
503 #endif // _CALENDAR_HXX