xref: /AOO41X/main/svtools/source/control/calendar.cxx (revision 79aad27f7f29270c03e208e3d687e8e3850af11d)
1*5900e8ecSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*5900e8ecSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*5900e8ecSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*5900e8ecSAndrew Rist  * distributed with this work for additional information
6*5900e8ecSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*5900e8ecSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*5900e8ecSAndrew Rist  * "License"); you may not use this file except in compliance
9*5900e8ecSAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11*5900e8ecSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13*5900e8ecSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*5900e8ecSAndrew Rist  * software distributed under the License is distributed on an
15*5900e8ecSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*5900e8ecSAndrew Rist  * KIND, either express or implied.  See the License for the
17*5900e8ecSAndrew Rist  * specific language governing permissions and limitations
18*5900e8ecSAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20*5900e8ecSAndrew Rist  *************************************************************/
21*5900e8ecSAndrew Rist 
22*5900e8ecSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_svtools.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include <vcl/svapp.hxx>
28cdf0e10cSrcweir #include <tools/table.hxx>
29cdf0e10cSrcweir #include <vcl/help.hxx>
30cdf0e10cSrcweir #include <vcl/menu.hxx>
31cdf0e10cSrcweir #include <vcl/decoview.hxx>
32cdf0e10cSrcweir #include <vcl/floatwin.hxx>
33cdf0e10cSrcweir #include <vcl/button.hxx>
34cdf0e10cSrcweir #include <vcl/fixed.hxx>
35cdf0e10cSrcweir #include <unotools/calendarwrapper.hxx>
36cdf0e10cSrcweir #include <unotools/localedatawrapper.hxx>
37cdf0e10cSrcweir #include <com/sun/star/i18n/Weekdays.hpp>
38cdf0e10cSrcweir #include <com/sun/star/i18n/CalendarDisplayIndex.hpp>
39cdf0e10cSrcweir #include <com/sun/star/i18n/CalendarFieldIndex.hpp>
40cdf0e10cSrcweir 
41cdf0e10cSrcweir #define _SV_CALENDAR_CXX
42cdf0e10cSrcweir #include <svtools/svtools.hrc>
43cdf0e10cSrcweir #include <svtools/svtdata.hxx>
44cdf0e10cSrcweir #include <svtools/calendar.hxx>
45cdf0e10cSrcweir 
46cdf0e10cSrcweir // =======================================================================
47cdf0e10cSrcweir 
48cdf0e10cSrcweir #define DAY_OFFX						4
49cdf0e10cSrcweir #define DAY_OFFY						2
50cdf0e10cSrcweir #define MONTH_BORDERX					4
51cdf0e10cSrcweir #define MONTH_OFFY						3
52cdf0e10cSrcweir #define WEEKNUMBER_OFFX 				4
53cdf0e10cSrcweir #define WEEKDAY_OFFY					3
54cdf0e10cSrcweir #define TITLE_OFFY						3
55cdf0e10cSrcweir #define TITLE_BORDERY					2
56cdf0e10cSrcweir #define SPIN_OFFX						4
57cdf0e10cSrcweir #define SPIN_OFFY						TITLE_BORDERY
58cdf0e10cSrcweir 
59cdf0e10cSrcweir #define WEEKNUMBER_HEIGHT				85
60cdf0e10cSrcweir 
61cdf0e10cSrcweir #define CALENDAR_HITTEST_DAY			((sal_uInt16)0x0001)
62cdf0e10cSrcweir #define CALENDAR_HITTEST_WEEK			((sal_uInt16)0x0002)
63cdf0e10cSrcweir #define CALENDAR_HITTEST_MONTHTITLE 	((sal_uInt16)0x0004)
64cdf0e10cSrcweir #define CALENDAR_HITTEST_PREV			((sal_uInt16)0x0008)
65cdf0e10cSrcweir #define CALENDAR_HITTEST_NEXT			((sal_uInt16)0x0010)
66cdf0e10cSrcweir #define CALENDAR_HITTEST_OUTSIDE		((sal_uInt16)0x1000)
67cdf0e10cSrcweir 
68cdf0e10cSrcweir #define MENU_YEAR_COUNT 				3
69cdf0e10cSrcweir 
70cdf0e10cSrcweir #define TABLE_DATE_SELECTED 			((void*)0x00000001)
71cdf0e10cSrcweir 
72cdf0e10cSrcweir using namespace ::com::sun::star;
73cdf0e10cSrcweir 
74cdf0e10cSrcweir // =======================================================================
75cdf0e10cSrcweir 
76cdf0e10cSrcweir struct ImplDateInfo
77cdf0e10cSrcweir {
78cdf0e10cSrcweir 	XubString	maText;
79cdf0e10cSrcweir 	Color*		mpTextColor;
80cdf0e10cSrcweir 	Color*		mpFrameColor;
81cdf0e10cSrcweir 	sal_uInt16		mnFlags;
82cdf0e10cSrcweir 
ImplDateInfoImplDateInfo83cdf0e10cSrcweir 				ImplDateInfo( const XubString& rText ) :
84cdf0e10cSrcweir 					maText( rText )
85cdf0e10cSrcweir 				{ mpTextColor = mpFrameColor = NULL; mnFlags = 0; }
~ImplDateInfoImplDateInfo86cdf0e10cSrcweir 				~ImplDateInfo() { delete mpTextColor; delete mpFrameColor; }
87cdf0e10cSrcweir };
88cdf0e10cSrcweir 
DECLARE_TABLE(ImplDateTable,ImplDateInfo *)89cdf0e10cSrcweir DECLARE_TABLE( ImplDateTable, ImplDateInfo* )
90cdf0e10cSrcweir 
91cdf0e10cSrcweir // =======================================================================
92cdf0e10cSrcweir 
93cdf0e10cSrcweir static void ImplCalendarSelectDate( Table* pTable, const Date& rDate, sal_Bool bSelect )
94cdf0e10cSrcweir {
95cdf0e10cSrcweir 	if ( bSelect )
96cdf0e10cSrcweir 		pTable->Insert( rDate.GetDate(), TABLE_DATE_SELECTED );
97cdf0e10cSrcweir 	else
98cdf0e10cSrcweir 		pTable->Remove( rDate.GetDate() );
99cdf0e10cSrcweir }
100cdf0e10cSrcweir 
101cdf0e10cSrcweir // -----------------------------------------------------------------------
102cdf0e10cSrcweir 
ImplCalendarSelectDateRange(Table * pTable,const Date & rStartDate,const Date & rEndDate,sal_Bool bSelect)103cdf0e10cSrcweir static void ImplCalendarSelectDateRange( Table* pTable,
104cdf0e10cSrcweir 										 const Date& rStartDate,
105cdf0e10cSrcweir 										 const Date& rEndDate,
106cdf0e10cSrcweir 										 sal_Bool bSelect )
107cdf0e10cSrcweir {
108cdf0e10cSrcweir 	Date aStartDate = rStartDate;
109cdf0e10cSrcweir 	Date aEndDate = rEndDate;
110cdf0e10cSrcweir 	if ( aStartDate > aEndDate )
111cdf0e10cSrcweir 	{
112cdf0e10cSrcweir 		Date aTempDate = aStartDate;
113cdf0e10cSrcweir 		aStartDate = aEndDate;
114cdf0e10cSrcweir 		aEndDate = aTempDate;
115cdf0e10cSrcweir 	}
116cdf0e10cSrcweir 
117cdf0e10cSrcweir 	if ( bSelect )
118cdf0e10cSrcweir 	{
119cdf0e10cSrcweir 		while ( aStartDate <= aEndDate )
120cdf0e10cSrcweir 		{
121cdf0e10cSrcweir 			pTable->Insert( aStartDate.GetDate(), TABLE_DATE_SELECTED );
122cdf0e10cSrcweir 			aStartDate++;
123cdf0e10cSrcweir 		}
124cdf0e10cSrcweir 	}
125cdf0e10cSrcweir 	else
126cdf0e10cSrcweir 	{
127cdf0e10cSrcweir 		void* p = pTable->First();
128cdf0e10cSrcweir 		while ( p )
129cdf0e10cSrcweir 		{
130cdf0e10cSrcweir 			Date aDate( pTable->GetCurKey() );
131cdf0e10cSrcweir 			if ( aDate > aEndDate )
132cdf0e10cSrcweir 				break;
133cdf0e10cSrcweir 
134cdf0e10cSrcweir 			if ( aDate >= aStartDate )
135cdf0e10cSrcweir 				pTable->Remove( aDate.GetDate() );
136cdf0e10cSrcweir 			else
137cdf0e10cSrcweir 				p = pTable->Next();
138cdf0e10cSrcweir 		}
139cdf0e10cSrcweir 	}
140cdf0e10cSrcweir }
141cdf0e10cSrcweir 
142cdf0e10cSrcweir // -----------------------------------------------------------------------
143cdf0e10cSrcweir 
ImplCalendarUnSelectDateRange(Table * pTable,Table * pOldTable,const Date & rStartDate,const Date & rEndDate)144cdf0e10cSrcweir static void ImplCalendarUnSelectDateRange( Table* pTable,
145cdf0e10cSrcweir 										   Table* pOldTable,
146cdf0e10cSrcweir 										   const Date& rStartDate,
147cdf0e10cSrcweir 										   const Date& rEndDate )
148cdf0e10cSrcweir {
149cdf0e10cSrcweir 	Date aStartDate = rStartDate;
150cdf0e10cSrcweir 	Date aEndDate = rEndDate;
151cdf0e10cSrcweir 	if ( aStartDate > aEndDate )
152cdf0e10cSrcweir 	{
153cdf0e10cSrcweir 		Date aTempDate = aStartDate;
154cdf0e10cSrcweir 		aStartDate = aEndDate;
155cdf0e10cSrcweir 		aEndDate = aTempDate;
156cdf0e10cSrcweir 	}
157cdf0e10cSrcweir 
158cdf0e10cSrcweir 	void* p = pTable->First();
159cdf0e10cSrcweir 	while ( p )
160cdf0e10cSrcweir 	{
161cdf0e10cSrcweir 		Date aDate( pTable->GetCurKey() );
162cdf0e10cSrcweir 		if ( aDate > aEndDate )
163cdf0e10cSrcweir 			break;
164cdf0e10cSrcweir 
165cdf0e10cSrcweir 		if ( aDate >= aStartDate )
166cdf0e10cSrcweir 			pTable->Remove( aDate.GetDate() );
167cdf0e10cSrcweir 		else
168cdf0e10cSrcweir 			p = pTable->Next();
169cdf0e10cSrcweir 	}
170cdf0e10cSrcweir 
171cdf0e10cSrcweir 	p = pOldTable->First();
172cdf0e10cSrcweir 	while ( p )
173cdf0e10cSrcweir 	{
174cdf0e10cSrcweir 		Date aDate( pOldTable->GetCurKey() );
175cdf0e10cSrcweir 		if ( aDate > aEndDate )
176cdf0e10cSrcweir 			break;
177cdf0e10cSrcweir 		if ( aDate >= aStartDate )
178cdf0e10cSrcweir 			pTable->Insert( aDate.GetDate(), TABLE_DATE_SELECTED );
179cdf0e10cSrcweir 
180cdf0e10cSrcweir 		p = pOldTable->Next();
181cdf0e10cSrcweir 	}
182cdf0e10cSrcweir }
183cdf0e10cSrcweir 
184cdf0e10cSrcweir // -----------------------------------------------------------------------
185cdf0e10cSrcweir 
ImplCalendarClearSelectDate(Table * pTable)186cdf0e10cSrcweir inline void ImplCalendarClearSelectDate( Table* pTable )
187cdf0e10cSrcweir {
188cdf0e10cSrcweir 	pTable->Clear();
189cdf0e10cSrcweir }
190cdf0e10cSrcweir 
191cdf0e10cSrcweir // =======================================================================
192cdf0e10cSrcweir 
ImplInit(WinBits nWinStyle)193cdf0e10cSrcweir void Calendar::ImplInit( WinBits nWinStyle )
194cdf0e10cSrcweir {
195cdf0e10cSrcweir 	mpDateTable 			= NULL;
196cdf0e10cSrcweir 	mpSelectTable			= new Table;
197cdf0e10cSrcweir 	mpOldSelectTable		= NULL;
198cdf0e10cSrcweir 	mpRestoreSelectTable	= NULL;
199cdf0e10cSrcweir 	mpStandardColor 		= NULL;
200cdf0e10cSrcweir 	mpSaturdayColor 		= NULL;
201cdf0e10cSrcweir 	mpSundayColor			= NULL;
202cdf0e10cSrcweir 	mnDayCount				= 0;
203cdf0e10cSrcweir 	mnWinStyle				= nWinStyle;
204cdf0e10cSrcweir 	mnFirstYear 			= 0;
205cdf0e10cSrcweir 	mnLastYear				= 0;
206cdf0e10cSrcweir 	mnRequestYear			= 0;
207cdf0e10cSrcweir 	mbCalc					= sal_True;
208cdf0e10cSrcweir 	mbFormat				= sal_True;
209cdf0e10cSrcweir 	mbDrag					= sal_False;
210cdf0e10cSrcweir 	mbSelection 			= sal_False;
211cdf0e10cSrcweir 	mbMultiSelection		= sal_False;
212cdf0e10cSrcweir 	mbWeekSel				= sal_False;
213cdf0e10cSrcweir 	mbUnSel 				= sal_False;
214cdf0e10cSrcweir 	mbMenuDown				= sal_False;
215cdf0e10cSrcweir 	mbSpinDown				= sal_False;
216cdf0e10cSrcweir 	mbPrevIn				= sal_False;
217cdf0e10cSrcweir 	mbNextIn				= sal_False;
218cdf0e10cSrcweir 	mbDirect				= sal_False;
219cdf0e10cSrcweir 	mbInSelChange			= sal_False;
220cdf0e10cSrcweir 	mbTravelSelect			= sal_False;
221cdf0e10cSrcweir 	mbScrollDateRange		= sal_False;
222cdf0e10cSrcweir 	mbSelLeft				= sal_False;
223cdf0e10cSrcweir 	mbAllSel				= sal_False;
224cdf0e10cSrcweir 	mbDropPos				= sal_False;
225cdf0e10cSrcweir 
226cdf0e10cSrcweir     ::rtl::OUString aGregorian( RTL_CONSTASCII_USTRINGPARAM( "gregorian"));
227cdf0e10cSrcweir     maCalendarWrapper.loadCalendar( aGregorian,
228cdf0e10cSrcweir             Application::GetAppLocaleDataWrapper().getLocale());
229cdf0e10cSrcweir     if (maCalendarWrapper.getUniqueID() != aGregorian)
230cdf0e10cSrcweir     {
231cdf0e10cSrcweir #ifdef DBG_UTIL
232cdf0e10cSrcweir         ByteString aMsg( "Calendar::ImplInit: No ``gregorian'' calendar available for locale ``");
233cdf0e10cSrcweir         lang::Locale aLoc( Application::GetAppLocaleDataWrapper().getLocale());
234cdf0e10cSrcweir         aMsg += ByteString( String( aLoc.Language), RTL_TEXTENCODING_UTF8);
235cdf0e10cSrcweir         aMsg += '-';
236cdf0e10cSrcweir         aMsg += ByteString( String( aLoc.Country), RTL_TEXTENCODING_UTF8);
237cdf0e10cSrcweir         aMsg += "'' and other calendars aren't supported. Using en-US fallback.";
238cdf0e10cSrcweir         DBG_ERRORFILE( aMsg.GetBuffer());
239cdf0e10cSrcweir #endif
240cdf0e10cSrcweir         /* If we ever wanted to support other calendars than Gregorian a lot of
241cdf0e10cSrcweir          * rewrite would be necessary to internally replace use of class Date
242cdf0e10cSrcweir          * with proper class CalendarWrapper methods, get rid of fixed 12
243cdf0e10cSrcweir          * months, fixed 7 days, ... */
244cdf0e10cSrcweir         maCalendarWrapper.loadCalendar( aGregorian, lang::Locale(
245cdf0e10cSrcweir                     ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "en")),
246cdf0e10cSrcweir                     ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "US")),
247cdf0e10cSrcweir                     ::rtl::OUString()));
248cdf0e10cSrcweir     }
249cdf0e10cSrcweir 
250cdf0e10cSrcweir 	SetFirstDate( maCurDate );
251cdf0e10cSrcweir 	ImplCalendarSelectDate( mpSelectTable, maCurDate, sal_True );
252cdf0e10cSrcweir 
253cdf0e10cSrcweir 	// Sonstige Strings erzeugen
254cdf0e10cSrcweir 	maDayText = XubString( SvtResId( STR_SVT_CALENDAR_DAY ) );
255cdf0e10cSrcweir 	maWeekText = XubString( SvtResId( STR_SVT_CALENDAR_WEEK ) );
256cdf0e10cSrcweir 
257cdf0e10cSrcweir 	// Tagestexte anlegen
258cdf0e10cSrcweir 	for ( sal_uInt16 i = 0; i < 31; i++ )
259cdf0e10cSrcweir 		mpDayText[i] = new UniString( UniString::CreateFromInt32( i+1 ) );
260cdf0e10cSrcweir 
261cdf0e10cSrcweir 	maDragScrollTimer.SetTimeoutHdl( STATIC_LINK( this, Calendar, ScrollHdl ) );
262cdf0e10cSrcweir 	maDragScrollTimer.SetTimeout( GetSettings().GetMouseSettings().GetScrollRepeat() );
263cdf0e10cSrcweir 	mnDragScrollHitTest = 0;
264cdf0e10cSrcweir 
265cdf0e10cSrcweir 	ImplInitSettings();
266cdf0e10cSrcweir }
267cdf0e10cSrcweir 
268cdf0e10cSrcweir // -----------------------------------------------------------------------
269cdf0e10cSrcweir 
ImplInitSettings()270cdf0e10cSrcweir void Calendar::ImplInitSettings()
271cdf0e10cSrcweir {
272cdf0e10cSrcweir 	const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
273cdf0e10cSrcweir 	maSelColor = rStyleSettings.GetHighlightTextColor();
274cdf0e10cSrcweir 	SetPointFont( rStyleSettings.GetToolFont() );
275cdf0e10cSrcweir 	SetTextColor( rStyleSettings.GetFieldTextColor() );
276cdf0e10cSrcweir 	SetBackground( Wallpaper( rStyleSettings.GetFieldColor() ) );
277cdf0e10cSrcweir }
278cdf0e10cSrcweir 
279cdf0e10cSrcweir // -----------------------------------------------------------------------
280cdf0e10cSrcweir 
Calendar(Window * pParent,WinBits nWinStyle)281cdf0e10cSrcweir Calendar::Calendar( Window* pParent, WinBits nWinStyle ) :
282cdf0e10cSrcweir 	Control( pParent, nWinStyle & (WB_TABSTOP | WB_GROUP | WB_BORDER | WB_3DLOOK | WB_RANGESELECT | WB_MULTISELECT) ),
283cdf0e10cSrcweir 	maCalendarWrapper( Application::GetAppLocaleDataWrapper().getServiceFactory() ),
284cdf0e10cSrcweir 	maOldFormatFirstDate( 0, 0, 1900 ),
285cdf0e10cSrcweir 	maOldFormatLastDate( 0, 0, 1900 ),
286cdf0e10cSrcweir 	maFirstDate( 0, 0, 1900 ),
287cdf0e10cSrcweir 	maOldFirstDate( 0, 0, 1900 ),
288cdf0e10cSrcweir 	maOldCurDate( 0, 0, 1900 ),
289cdf0e10cSrcweir 	maAnchorDate( maCurDate ),
290cdf0e10cSrcweir 	maDropDate( 0, 0, 1900 )
291cdf0e10cSrcweir {
292cdf0e10cSrcweir 	ImplInit( nWinStyle );
293cdf0e10cSrcweir }
294cdf0e10cSrcweir 
295cdf0e10cSrcweir // -----------------------------------------------------------------------
296cdf0e10cSrcweir 
Calendar(Window * pParent,const ResId & rResId)297cdf0e10cSrcweir Calendar::Calendar( Window* pParent, const ResId& rResId ) :
298cdf0e10cSrcweir 	Control( pParent, rResId ),
299cdf0e10cSrcweir 	maCalendarWrapper( Application::GetAppLocaleDataWrapper().getServiceFactory() ),
300cdf0e10cSrcweir 	maOldFormatFirstDate( 0, 0, 1900 ),
301cdf0e10cSrcweir 	maOldFormatLastDate( 0, 0, 1900 ),
302cdf0e10cSrcweir 	maFirstDate( 0, 0, 1900 ),
303cdf0e10cSrcweir 	maOldFirstDate( 0, 0, 1900 ),
304cdf0e10cSrcweir 	maOldCurDate( 0, 0, 1900 ),
305cdf0e10cSrcweir 	maAnchorDate( maCurDate ),
306cdf0e10cSrcweir 	maDropDate( 0, 0, 1900 )
307cdf0e10cSrcweir {
308cdf0e10cSrcweir 	ImplInit( rResId.GetWinBits() );
309cdf0e10cSrcweir }
310cdf0e10cSrcweir 
311cdf0e10cSrcweir // -----------------------------------------------------------------------
312cdf0e10cSrcweir 
~Calendar()313cdf0e10cSrcweir Calendar::~Calendar()
314cdf0e10cSrcweir {
315cdf0e10cSrcweir 	delete mpStandardColor;
316cdf0e10cSrcweir 	delete mpSaturdayColor;
317cdf0e10cSrcweir 	delete mpSundayColor;
318cdf0e10cSrcweir 
319cdf0e10cSrcweir 	if ( mpDateTable )
320cdf0e10cSrcweir 	{
321cdf0e10cSrcweir 		ImplDateInfo* pDateInfo = mpDateTable->First();
322cdf0e10cSrcweir 		while ( pDateInfo )
323cdf0e10cSrcweir 		{
324cdf0e10cSrcweir 			delete pDateInfo;
325cdf0e10cSrcweir 			pDateInfo = mpDateTable->Next();
326cdf0e10cSrcweir 		}
327cdf0e10cSrcweir 
328cdf0e10cSrcweir 		delete mpDateTable;
329cdf0e10cSrcweir 	}
330cdf0e10cSrcweir 
331cdf0e10cSrcweir 	delete mpSelectTable;
332cdf0e10cSrcweir 	if ( mpOldSelectTable )
333cdf0e10cSrcweir 		delete mpOldSelectTable;
334cdf0e10cSrcweir 	if ( mpRestoreSelectTable )
335cdf0e10cSrcweir 		delete mpRestoreSelectTable;
336cdf0e10cSrcweir 
337cdf0e10cSrcweir 	for ( sal_uInt16 i = 0; i < 31; i++ )
338cdf0e10cSrcweir 		delete mpDayText[i];
339cdf0e10cSrcweir }
340cdf0e10cSrcweir 
341cdf0e10cSrcweir // -----------------------------------------------------------------------
342cdf0e10cSrcweir 
SetMinimumNumberOfDaysInWeek(sal_Int16 nDays)343cdf0e10cSrcweir void Calendar::SetMinimumNumberOfDaysInWeek( sal_Int16 nDays )
344cdf0e10cSrcweir {
345cdf0e10cSrcweir     ImplUpdate( sal_True );
346cdf0e10cSrcweir     maCalendarWrapper.setMinimumNumberOfDaysForFirstWeek( nDays);
347cdf0e10cSrcweir }
348cdf0e10cSrcweir 
349cdf0e10cSrcweir // -----------------------------------------------------------------------
350cdf0e10cSrcweir 
SetWeekStart(sal_Int16 nDay)351cdf0e10cSrcweir void Calendar::SetWeekStart( sal_Int16 nDay )
352cdf0e10cSrcweir {
353cdf0e10cSrcweir     ImplUpdate( sal_True );
354cdf0e10cSrcweir     switch (nDay)
355cdf0e10cSrcweir     {
356cdf0e10cSrcweir         case i18n::Weekdays::SUNDAY :
357cdf0e10cSrcweir         case i18n::Weekdays::MONDAY :
358cdf0e10cSrcweir         case i18n::Weekdays::TUESDAY :
359cdf0e10cSrcweir         case i18n::Weekdays::WEDNESDAY :
360cdf0e10cSrcweir         case i18n::Weekdays::THURSDAY :
361cdf0e10cSrcweir         case i18n::Weekdays::FRIDAY :
362cdf0e10cSrcweir         case i18n::Weekdays::SATURDAY :
363cdf0e10cSrcweir             ;   // nothing
364cdf0e10cSrcweir         default:
365cdf0e10cSrcweir             DBG_ERRORFILE("Calendar::SetWeekStart: unknown value for setFirstDayOfWeek() of a Gregorian calendar");
366cdf0e10cSrcweir             nDay = i18n::Weekdays::SUNDAY;
367cdf0e10cSrcweir     }
368cdf0e10cSrcweir     maCalendarWrapper.setFirstDayOfWeek( nDay);
369cdf0e10cSrcweir }
370cdf0e10cSrcweir 
371cdf0e10cSrcweir // -----------------------------------------------------------------------
372cdf0e10cSrcweir 
ImplGetWeekStart() const373cdf0e10cSrcweir DayOfWeek Calendar::ImplGetWeekStart() const
374cdf0e10cSrcweir {
375cdf0e10cSrcweir     // Map i18n::Weekdays to Date DayOfWeek
376cdf0e10cSrcweir     DayOfWeek eDay;
377cdf0e10cSrcweir     sal_Int16 nDay = maCalendarWrapper.getFirstDayOfWeek();
378cdf0e10cSrcweir     switch (nDay)
379cdf0e10cSrcweir     {
380cdf0e10cSrcweir         case i18n::Weekdays::SUNDAY :
381cdf0e10cSrcweir             eDay = SUNDAY;
382cdf0e10cSrcweir             break;
383cdf0e10cSrcweir         case i18n::Weekdays::MONDAY :
384cdf0e10cSrcweir             eDay = MONDAY;
385cdf0e10cSrcweir             break;
386cdf0e10cSrcweir         case i18n::Weekdays::TUESDAY :
387cdf0e10cSrcweir             eDay = TUESDAY;
388cdf0e10cSrcweir             break;
389cdf0e10cSrcweir         case i18n::Weekdays::WEDNESDAY :
390cdf0e10cSrcweir             eDay = WEDNESDAY;
391cdf0e10cSrcweir             break;
392cdf0e10cSrcweir         case i18n::Weekdays::THURSDAY :
393cdf0e10cSrcweir             eDay = THURSDAY;
394cdf0e10cSrcweir             break;
395cdf0e10cSrcweir         case i18n::Weekdays::FRIDAY :
396cdf0e10cSrcweir             eDay = FRIDAY;
397cdf0e10cSrcweir             break;
398cdf0e10cSrcweir         case i18n::Weekdays::SATURDAY :
399cdf0e10cSrcweir             eDay = SATURDAY;
400cdf0e10cSrcweir             break;
401cdf0e10cSrcweir         default:
402cdf0e10cSrcweir             DBG_ERRORFILE("Calendar::ImplGetWeekStart: broken i18n Gregorian calendar (getFirstDayOfWeek())");
403cdf0e10cSrcweir             eDay = SUNDAY;
404cdf0e10cSrcweir     }
405cdf0e10cSrcweir     return eDay;
406cdf0e10cSrcweir }
407cdf0e10cSrcweir 
408cdf0e10cSrcweir // -----------------------------------------------------------------------
409cdf0e10cSrcweir 
ImplGetWeekFont(Font & rFont) const410cdf0e10cSrcweir void Calendar::ImplGetWeekFont( Font& rFont ) const
411cdf0e10cSrcweir {
412cdf0e10cSrcweir 	// Wochennummer geben wir in WEEKNUMBER_HEIGHT%-Fonthoehe aus
413cdf0e10cSrcweir 	Size aFontSize = rFont.GetSize();
414cdf0e10cSrcweir 	aFontSize.Height() *= WEEKNUMBER_HEIGHT;
415cdf0e10cSrcweir 	aFontSize.Height() /= 100;
416cdf0e10cSrcweir 	rFont.SetSize( aFontSize );
417cdf0e10cSrcweir 	rFont.SetWeight( WEIGHT_NORMAL );
418cdf0e10cSrcweir }
419cdf0e10cSrcweir 
420cdf0e10cSrcweir // -----------------------------------------------------------------------
421cdf0e10cSrcweir 
ImplFormat()422cdf0e10cSrcweir void Calendar::ImplFormat()
423cdf0e10cSrcweir {
424cdf0e10cSrcweir 	if ( !mbFormat )
425cdf0e10cSrcweir 		return;
426cdf0e10cSrcweir 
427cdf0e10cSrcweir 	if ( mbCalc )
428cdf0e10cSrcweir 	{
429cdf0e10cSrcweir 		Size aOutSize = GetOutputSizePixel();
430cdf0e10cSrcweir 
431cdf0e10cSrcweir 		if ( (aOutSize.Width() <= 1) || (aOutSize.Height() <= 1) )
432cdf0e10cSrcweir 			return;
433cdf0e10cSrcweir 
434cdf0e10cSrcweir 		XubString a99Text( XubString( RTL_CONSTASCII_USTRINGPARAM( "99" ) ) );
435cdf0e10cSrcweir 
436cdf0e10cSrcweir 		Font aOldFont = GetFont();
437cdf0e10cSrcweir 
438cdf0e10cSrcweir 		// Wochenanzeige beruecksichtigen
439cdf0e10cSrcweir 		if ( mnWinStyle & WB_WEEKNUMBER )
440cdf0e10cSrcweir 		{
441cdf0e10cSrcweir 			Font aTempFont = aOldFont;
442cdf0e10cSrcweir 			ImplGetWeekFont( aTempFont );
443cdf0e10cSrcweir 			SetFont( aTempFont );
444cdf0e10cSrcweir 			mnWeekWidth = GetTextWidth( a99Text )+WEEKNUMBER_OFFX;
445cdf0e10cSrcweir 			SetFont( aOldFont );
446cdf0e10cSrcweir 		}
447cdf0e10cSrcweir 		else
448cdf0e10cSrcweir 			mnWeekWidth = 0;
449cdf0e10cSrcweir 
450cdf0e10cSrcweir 		if ( mnWinStyle & WB_BOLDTEXT )
451cdf0e10cSrcweir 		{
452cdf0e10cSrcweir 			Font aFont = aOldFont;
453cdf0e10cSrcweir 			if ( aFont.GetWeight() < WEIGHT_BOLD )
454cdf0e10cSrcweir 				aFont.SetWeight( WEIGHT_BOLD );
455cdf0e10cSrcweir 			else
456cdf0e10cSrcweir 				aFont.SetWeight( WEIGHT_NORMAL );
457cdf0e10cSrcweir 			SetFont( aFont );
458cdf0e10cSrcweir 		}
459cdf0e10cSrcweir 
460cdf0e10cSrcweir 		long n99TextWidth = GetTextWidth( a99Text );
461cdf0e10cSrcweir 		long nTextHeight = GetTextHeight();
462cdf0e10cSrcweir 
463cdf0e10cSrcweir 		// Breiten und X-Positionen berechnen
464cdf0e10cSrcweir 		mnDayWidth		= n99TextWidth+DAY_OFFX;
465cdf0e10cSrcweir 		mnMonthWidth	= mnDayWidth*7;
466cdf0e10cSrcweir 		mnMonthWidth   += mnWeekWidth;
467cdf0e10cSrcweir 		mnMonthWidth   += MONTH_BORDERX*2;
468cdf0e10cSrcweir 		mnMonthPerLine	= aOutSize.Width() / mnMonthWidth;
469cdf0e10cSrcweir 		if ( !mnMonthPerLine )
470cdf0e10cSrcweir 			mnMonthPerLine = 1;
471cdf0e10cSrcweir 		long nOver		= ((aOutSize.Width()-(mnMonthPerLine*mnMonthWidth)) / mnMonthPerLine);
472cdf0e10cSrcweir 		mnMonthWidth   += nOver;
473cdf0e10cSrcweir 		mnDaysOffX		= MONTH_BORDERX;
474cdf0e10cSrcweir 		mnDaysOffX	   += nOver/2;
475cdf0e10cSrcweir 		mnDaysOffX	   += mnWeekWidth;
476cdf0e10cSrcweir 
477cdf0e10cSrcweir 		// Hoehen und Y-Positionen berechnen
478cdf0e10cSrcweir 		mnDayHeight 	= nTextHeight + DAY_OFFY;
479cdf0e10cSrcweir 		mnWeekDayOffY	= nTextHeight + TITLE_OFFY + (TITLE_BORDERY*2);
480cdf0e10cSrcweir 		mnDaysOffY		= mnWeekDayOffY + nTextHeight + WEEKDAY_OFFY;
481cdf0e10cSrcweir 		mnMonthHeight	= (mnDayHeight*6) + mnDaysOffY;
482cdf0e10cSrcweir 		mnMonthHeight  += MONTH_OFFY;
483cdf0e10cSrcweir 		mnLines 		= aOutSize.Height() / mnMonthHeight;
484cdf0e10cSrcweir 		if ( !mnLines )
485cdf0e10cSrcweir 			mnLines = 1;
486cdf0e10cSrcweir 		mnMonthHeight  += (aOutSize.Height()-(mnLines*mnMonthHeight)) / mnLines;
487cdf0e10cSrcweir 
488cdf0e10cSrcweir 		// Spinfelder berechnen
489cdf0e10cSrcweir 		long nSpinSize		= nTextHeight+TITLE_BORDERY-SPIN_OFFY;
490cdf0e10cSrcweir 		maPrevRect.Left()	= SPIN_OFFX;
491cdf0e10cSrcweir 		maPrevRect.Top()	= SPIN_OFFY;
492cdf0e10cSrcweir 		maPrevRect.Right()	= maPrevRect.Left()+nSpinSize;
493cdf0e10cSrcweir 		maPrevRect.Bottom() = maPrevRect.Top()+nSpinSize;
494cdf0e10cSrcweir 		maNextRect.Left()	= aOutSize.Width()-SPIN_OFFX-nSpinSize-1;
495cdf0e10cSrcweir 		maNextRect.Top()	= SPIN_OFFY;
496cdf0e10cSrcweir 		maNextRect.Right()	= maNextRect.Left()+nSpinSize;
497cdf0e10cSrcweir 		maNextRect.Bottom() = maNextRect.Top()+nSpinSize;
498cdf0e10cSrcweir 
499cdf0e10cSrcweir 		if ( mnWinStyle & WB_BOLDTEXT )
500cdf0e10cSrcweir 			SetFont( aOldFont );
501cdf0e10cSrcweir 
502cdf0e10cSrcweir 		// Calculate DayOfWeekText (gets displayed in a narrow font)
503cdf0e10cSrcweir 		maDayOfWeekText.Erase();
504cdf0e10cSrcweir 		long nStartOffX = 0;
505cdf0e10cSrcweir 		sal_Int16 nDay = maCalendarWrapper.getFirstDayOfWeek();
506cdf0e10cSrcweir 		for ( sal_Int16 nDayOfWeek = 0; nDayOfWeek < 7; nDayOfWeek++ )
507cdf0e10cSrcweir 		{
508cdf0e10cSrcweir             // Use first character of full name, since the abbreviated name may
509cdf0e10cSrcweir             // be roman digits or similar in some locales. Proper
510cdf0e10cSrcweir             // implementation would need narrow one letter month names defined
511cdf0e10cSrcweir             // in locale data.
512cdf0e10cSrcweir             String aDayOfWeek( maCalendarWrapper.getDisplayName(
513cdf0e10cSrcweir                         i18n::CalendarDisplayIndex::DAY, nDay, 1).GetChar(0));
514cdf0e10cSrcweir 			long nOffX = (mnDayWidth-GetTextWidth( aDayOfWeek ))/2;
515cdf0e10cSrcweir 			if ( mnWinStyle & WB_BOLDTEXT )
516cdf0e10cSrcweir 				nOffX++;
517cdf0e10cSrcweir 			if ( !nDayOfWeek )
518cdf0e10cSrcweir 				nStartOffX = nOffX;
519cdf0e10cSrcweir 			else
520cdf0e10cSrcweir 				nOffX -= nStartOffX;
521cdf0e10cSrcweir 			nOffX += nDayOfWeek * mnDayWidth;
522cdf0e10cSrcweir 			mnDayOfWeekAry[nDayOfWeek] = nOffX;
523cdf0e10cSrcweir 			maDayOfWeekText += aDayOfWeek;
524cdf0e10cSrcweir 			nDay++;
525cdf0e10cSrcweir 			nDay %= 7;
526cdf0e10cSrcweir 		}
527cdf0e10cSrcweir 
528cdf0e10cSrcweir 		mbCalc = sal_False;
529cdf0e10cSrcweir 	}
530cdf0e10cSrcweir 
531cdf0e10cSrcweir 	// Anzahl Tage berechnen
532cdf0e10cSrcweir 
533cdf0e10cSrcweir     DayOfWeek eStartDay = ImplGetWeekStart();
534cdf0e10cSrcweir 
535cdf0e10cSrcweir 	sal_uInt16 nWeekDay;
536cdf0e10cSrcweir 	Date aTempDate = GetFirstMonth();
537cdf0e10cSrcweir 	maFirstDate = aTempDate;
538cdf0e10cSrcweir 	nWeekDay = (sal_uInt16)aTempDate.GetDayOfWeek();
539cdf0e10cSrcweir 	nWeekDay = (nWeekDay+(7-(sal_uInt16)eStartDay)) % 7;
540cdf0e10cSrcweir 	maFirstDate -= (sal_uLong)nWeekDay;
541cdf0e10cSrcweir 	mnDayCount = nWeekDay;
542cdf0e10cSrcweir 	sal_uInt16 nDaysInMonth;
543cdf0e10cSrcweir 	sal_uInt16 nMonthCount = (sal_uInt16)(mnMonthPerLine*mnLines);
544cdf0e10cSrcweir 	for ( sal_uInt16 i = 0; i < nMonthCount; i++ )
545cdf0e10cSrcweir 	{
546cdf0e10cSrcweir 		nDaysInMonth = aTempDate.GetDaysInMonth();
547cdf0e10cSrcweir 		mnDayCount += nDaysInMonth;
548cdf0e10cSrcweir 		aTempDate += nDaysInMonth;
549cdf0e10cSrcweir 	}
550cdf0e10cSrcweir 	Date aTempDate2 = aTempDate;
551cdf0e10cSrcweir 	aTempDate2--;
552cdf0e10cSrcweir 	nDaysInMonth = aTempDate2.GetDaysInMonth();
553cdf0e10cSrcweir 	aTempDate2 -= nDaysInMonth-1;
554cdf0e10cSrcweir 	nWeekDay = (sal_uInt16)aTempDate2.GetDayOfWeek();
555cdf0e10cSrcweir 	nWeekDay = (nWeekDay+(7-(sal_uInt16)eStartDay)) % 7;
556cdf0e10cSrcweir 	mnDayCount += 42-nDaysInMonth-nWeekDay;
557cdf0e10cSrcweir 
558cdf0e10cSrcweir 	// Farben festlegen
559cdf0e10cSrcweir 	maOtherColor = Color( COL_LIGHTGRAY );
560cdf0e10cSrcweir 	if ( maOtherColor.IsRGBEqual( GetBackground().GetColor() ) )
561cdf0e10cSrcweir 		maOtherColor.SetColor( COL_GRAY );
562cdf0e10cSrcweir 
563cdf0e10cSrcweir 	Date aLastDate = GetLastDate();
564cdf0e10cSrcweir 	if ( (maOldFormatLastDate != aLastDate) ||
565cdf0e10cSrcweir 		 (maOldFormatFirstDate != maFirstDate) )
566cdf0e10cSrcweir 	{
567cdf0e10cSrcweir 		maOldFormatFirstDate = maFirstDate;
568cdf0e10cSrcweir 		maOldFormatLastDate  = aLastDate;
569cdf0e10cSrcweir 		DateRangeChanged();
570cdf0e10cSrcweir 	}
571cdf0e10cSrcweir 
572cdf0e10cSrcweir 	// DateInfo besorgen
573cdf0e10cSrcweir 	sal_uInt16 nNewFirstYear = maFirstDate.GetYear();
574cdf0e10cSrcweir 	sal_uInt16 nNewLastYear = GetLastDate().GetYear();
575cdf0e10cSrcweir 	if ( mnFirstYear )
576cdf0e10cSrcweir 	{
577cdf0e10cSrcweir 		if ( nNewFirstYear < mnFirstYear )
578cdf0e10cSrcweir 		{
579cdf0e10cSrcweir 			for ( mnRequestYear = nNewFirstYear; mnRequestYear < mnFirstYear; mnRequestYear++ )
580cdf0e10cSrcweir 				RequestDateInfo();
581cdf0e10cSrcweir 			mnFirstYear = nNewFirstYear;
582cdf0e10cSrcweir 		}
583cdf0e10cSrcweir 		if ( nNewLastYear > mnLastYear )
584cdf0e10cSrcweir 		{
585cdf0e10cSrcweir 			for ( mnRequestYear = mnLastYear; mnRequestYear < nNewLastYear; mnRequestYear++ )
586cdf0e10cSrcweir 				RequestDateInfo();
587cdf0e10cSrcweir 			mnLastYear = nNewLastYear;
588cdf0e10cSrcweir 		}
589cdf0e10cSrcweir 	}
590cdf0e10cSrcweir 	else
591cdf0e10cSrcweir 	{
592cdf0e10cSrcweir 		for ( mnRequestYear = nNewFirstYear; mnRequestYear < nNewLastYear; mnRequestYear++ )
593cdf0e10cSrcweir 			RequestDateInfo();
594cdf0e10cSrcweir 		mnFirstYear = nNewFirstYear;
595cdf0e10cSrcweir 		mnLastYear = nNewLastYear;
596cdf0e10cSrcweir 	}
597cdf0e10cSrcweir 	mnRequestYear = 0;
598cdf0e10cSrcweir 
599cdf0e10cSrcweir 	mbFormat = sal_False;
600cdf0e10cSrcweir }
601cdf0e10cSrcweir 
602cdf0e10cSrcweir // -----------------------------------------------------------------------
603cdf0e10cSrcweir 
ImplHitTest(const Point & rPos,Date & rDate) const604cdf0e10cSrcweir sal_uInt16 Calendar::ImplHitTest( const Point& rPos, Date& rDate ) const
605cdf0e10cSrcweir {
606cdf0e10cSrcweir 	if ( mbFormat )
607cdf0e10cSrcweir 		return 0;
608cdf0e10cSrcweir 
609cdf0e10cSrcweir 	if ( maPrevRect.IsInside( rPos ) )
610cdf0e10cSrcweir 		return CALENDAR_HITTEST_PREV;
611cdf0e10cSrcweir 	else if ( maNextRect.IsInside( rPos ) )
612cdf0e10cSrcweir 		return CALENDAR_HITTEST_NEXT;
613cdf0e10cSrcweir 
614cdf0e10cSrcweir 	long		nX;
615cdf0e10cSrcweir 	long		nY;
616cdf0e10cSrcweir 	long		nOffX;
617cdf0e10cSrcweir 	long		nYMonth;
618cdf0e10cSrcweir 	sal_uInt16		nDay;
619cdf0e10cSrcweir 	DayOfWeek	eStartDay = ImplGetWeekStart();
620cdf0e10cSrcweir 
621cdf0e10cSrcweir 	rDate = GetFirstMonth();
622cdf0e10cSrcweir 	nY = 0;
623cdf0e10cSrcweir 	for ( long i = 0; i < mnLines; i++ )
624cdf0e10cSrcweir 	{
625cdf0e10cSrcweir 		if ( rPos.Y() < nY )
626cdf0e10cSrcweir 			return 0;
627cdf0e10cSrcweir 
628cdf0e10cSrcweir 		nX = 0;
629cdf0e10cSrcweir 		nYMonth = nY+mnMonthHeight;
630cdf0e10cSrcweir 		for ( long j = 0; j < mnMonthPerLine; j++ )
631cdf0e10cSrcweir 		{
632cdf0e10cSrcweir 			if ( (rPos.X() < nX) && (rPos.Y() < nYMonth) )
633cdf0e10cSrcweir 				return 0;
634cdf0e10cSrcweir 
635cdf0e10cSrcweir 			sal_uInt16 nDaysInMonth = rDate.GetDaysInMonth();
636cdf0e10cSrcweir 
637cdf0e10cSrcweir 			// Entsprechender Monat gefunden
638cdf0e10cSrcweir 			if ( (rPos.X() > nX) && (rPos.Y() < nYMonth) &&
639cdf0e10cSrcweir 				 (rPos.X() < nX+mnMonthWidth) )
640cdf0e10cSrcweir 			{
641cdf0e10cSrcweir 				if ( rPos.Y() < (nY+(TITLE_BORDERY*2)+mnDayHeight))
642cdf0e10cSrcweir 					return CALENDAR_HITTEST_MONTHTITLE;
643cdf0e10cSrcweir 				else
644cdf0e10cSrcweir 				{
645cdf0e10cSrcweir 					long nDayX = nX+mnDaysOffX;
646cdf0e10cSrcweir 					long nDayY = nY+mnDaysOffY;
647cdf0e10cSrcweir 					if ( rPos.Y() < nDayY )
648cdf0e10cSrcweir 						return 0;
649cdf0e10cSrcweir 					sal_uInt16 nDayIndex = (sal_uInt16)rDate.GetDayOfWeek();
650cdf0e10cSrcweir 					nDayIndex = (nDayIndex+(7-(sal_uInt16)eStartDay)) % 7;
651cdf0e10cSrcweir 					if ( (i == 0) && (j == 0) )
652cdf0e10cSrcweir 					{
653cdf0e10cSrcweir 						Date aTempDate = rDate;
654cdf0e10cSrcweir 						aTempDate -= nDayIndex;
655cdf0e10cSrcweir 						for ( nDay = 0; nDay < nDayIndex; nDay++ )
656cdf0e10cSrcweir 						{
657cdf0e10cSrcweir 							nOffX = nDayX + (nDay*mnDayWidth);
658cdf0e10cSrcweir 							if ( (rPos.Y() >= nDayY) && (rPos.Y() < nDayY+mnDayHeight) &&
659cdf0e10cSrcweir 								 (rPos.X() >= nOffX) && (rPos.X() < nOffX+mnDayWidth) )
660cdf0e10cSrcweir 							{
661cdf0e10cSrcweir 								rDate = aTempDate;
662cdf0e10cSrcweir 								rDate += nDay;
663cdf0e10cSrcweir 								return CALENDAR_HITTEST_DAY;
664cdf0e10cSrcweir 							}
665cdf0e10cSrcweir 						}
666cdf0e10cSrcweir 					}
667cdf0e10cSrcweir 					for ( nDay = 1; nDay <= nDaysInMonth; nDay++ )
668cdf0e10cSrcweir 					{
669cdf0e10cSrcweir 						if ( rPos.Y() < nDayY )
670cdf0e10cSrcweir 						{
671cdf0e10cSrcweir 							rDate += nDayIndex;
672cdf0e10cSrcweir 							return 0;
673cdf0e10cSrcweir 						}
674cdf0e10cSrcweir 						nOffX = nDayX + (nDayIndex*mnDayWidth);
675cdf0e10cSrcweir 						if ( (rPos.Y() >= nDayY) && (rPos.Y() < nDayY+mnDayHeight) &&
676cdf0e10cSrcweir 							 (rPos.X() >= nOffX) && (rPos.X() < nOffX+mnDayWidth) )
677cdf0e10cSrcweir 						{
678cdf0e10cSrcweir 							rDate += nDay-1;
679cdf0e10cSrcweir 							return CALENDAR_HITTEST_DAY;
680cdf0e10cSrcweir 						}
681cdf0e10cSrcweir 						if ( nDayIndex == 6 )
682cdf0e10cSrcweir 						{
683cdf0e10cSrcweir 							nDayIndex = 0;
684cdf0e10cSrcweir 							nDayY += mnDayHeight;
685cdf0e10cSrcweir 						}
686cdf0e10cSrcweir 						else
687cdf0e10cSrcweir 							nDayIndex++;
688cdf0e10cSrcweir 					}
689cdf0e10cSrcweir 					if ( (i == mnLines-1) && (j == mnMonthPerLine-1) )
690cdf0e10cSrcweir 					{
691cdf0e10cSrcweir 						sal_uInt16 nWeekDay = (sal_uInt16)rDate.GetDayOfWeek();
692cdf0e10cSrcweir 						nWeekDay = (nWeekDay+(7-(sal_uInt16)eStartDay)) % 7;
693cdf0e10cSrcweir 						sal_uInt16 nDayCount = 42-nDaysInMonth-nWeekDay;
694cdf0e10cSrcweir 						Date aTempDate = rDate;
695cdf0e10cSrcweir 						aTempDate += nDaysInMonth;
696cdf0e10cSrcweir 						for ( nDay = 1; nDay <= nDayCount; nDay++ )
697cdf0e10cSrcweir 						{
698cdf0e10cSrcweir 							if ( rPos.Y() < nDayY )
699cdf0e10cSrcweir 							{
700cdf0e10cSrcweir 								rDate += nDayIndex;
701cdf0e10cSrcweir 								return 0;
702cdf0e10cSrcweir 							}
703cdf0e10cSrcweir 							nOffX = nDayX + (nDayIndex*mnDayWidth);
704cdf0e10cSrcweir 							if ( (rPos.Y() >= nDayY) && (rPos.Y() < nDayY+mnDayHeight) &&
705cdf0e10cSrcweir 								 (rPos.X() >= nOffX) && (rPos.X() < nOffX+mnDayWidth) )
706cdf0e10cSrcweir 							{
707cdf0e10cSrcweir 								rDate = aTempDate;
708cdf0e10cSrcweir 								rDate += nDay-1;
709cdf0e10cSrcweir 								return CALENDAR_HITTEST_DAY;
710cdf0e10cSrcweir 							}
711cdf0e10cSrcweir 							if ( nDayIndex == 6 )
712cdf0e10cSrcweir 							{
713cdf0e10cSrcweir 								nDayIndex = 0;
714cdf0e10cSrcweir 								nDayY += mnDayHeight;
715cdf0e10cSrcweir 							}
716cdf0e10cSrcweir 							else
717cdf0e10cSrcweir 								nDayIndex++;
718cdf0e10cSrcweir 						}
719cdf0e10cSrcweir 					}
720cdf0e10cSrcweir 				}
721cdf0e10cSrcweir 			}
722cdf0e10cSrcweir 
723cdf0e10cSrcweir 			rDate += nDaysInMonth;
724cdf0e10cSrcweir 			nX += mnMonthWidth;
725cdf0e10cSrcweir 		}
726cdf0e10cSrcweir 
727cdf0e10cSrcweir 		nY += mnMonthHeight;
728cdf0e10cSrcweir 	}
729cdf0e10cSrcweir 
730cdf0e10cSrcweir 	return 0;
731cdf0e10cSrcweir }
732cdf0e10cSrcweir 
733cdf0e10cSrcweir // -----------------------------------------------------------------------
734cdf0e10cSrcweir 
ImplDrawSpinArrow(OutputDevice * pDev,const Rectangle & rRect,sal_Bool bPrev)735cdf0e10cSrcweir static void ImplDrawSpinArrow( OutputDevice* pDev, const Rectangle& rRect,
736cdf0e10cSrcweir 							   sal_Bool bPrev )
737cdf0e10cSrcweir {
738cdf0e10cSrcweir 	long	i;
739cdf0e10cSrcweir 	long	n;
740cdf0e10cSrcweir 	long	nLines;
741cdf0e10cSrcweir 	long	nHeight = rRect.GetHeight();
742cdf0e10cSrcweir 	long	nWidth = rRect.GetWidth();
743cdf0e10cSrcweir 	if ( nWidth < nHeight )
744cdf0e10cSrcweir 		n = nWidth;
745cdf0e10cSrcweir 	else
746cdf0e10cSrcweir 		n = nHeight;
747cdf0e10cSrcweir 	if ( !(n & 0x01) )
748cdf0e10cSrcweir 		n--;
749cdf0e10cSrcweir 	nLines = n/2;
750cdf0e10cSrcweir 
751cdf0e10cSrcweir 	Rectangle aRect( Point( rRect.Left()+(nWidth/2)-(nLines/2),
752cdf0e10cSrcweir 							rRect.Top()+(nHeight/2) ),
753cdf0e10cSrcweir 					 Size( 1, 1 ) );
754cdf0e10cSrcweir 	if ( !bPrev )
755cdf0e10cSrcweir 	{
756cdf0e10cSrcweir 		aRect.Left()  += nLines;
757cdf0e10cSrcweir 		aRect.Right() += nLines;
758cdf0e10cSrcweir 	}
759cdf0e10cSrcweir 
760cdf0e10cSrcweir 	pDev->DrawRect( aRect );
761cdf0e10cSrcweir 	for ( i = 0; i < nLines; i++ )
762cdf0e10cSrcweir 	{
763cdf0e10cSrcweir 		if ( bPrev )
764cdf0e10cSrcweir 		{
765cdf0e10cSrcweir 			aRect.Left()++;
766cdf0e10cSrcweir 			aRect.Right()++;
767cdf0e10cSrcweir 		}
768cdf0e10cSrcweir 		else
769cdf0e10cSrcweir 		{
770cdf0e10cSrcweir 			aRect.Left()--;
771cdf0e10cSrcweir 			aRect.Right()--;
772cdf0e10cSrcweir 		}
773cdf0e10cSrcweir 		aRect.Top()--;
774cdf0e10cSrcweir 		aRect.Bottom()++;
775cdf0e10cSrcweir 		pDev->DrawRect( aRect );
776cdf0e10cSrcweir 	}
777cdf0e10cSrcweir }
778cdf0e10cSrcweir 
779cdf0e10cSrcweir // -----------------------------------------------------------------------
780cdf0e10cSrcweir 
ImplDrawSpin(sal_Bool bDrawPrev,sal_Bool bDrawNext)781cdf0e10cSrcweir void Calendar::ImplDrawSpin( sal_Bool bDrawPrev, sal_Bool bDrawNext )
782cdf0e10cSrcweir {
783cdf0e10cSrcweir 	if ( !bDrawPrev && !bDrawNext )
784cdf0e10cSrcweir 		return;
785cdf0e10cSrcweir 
786cdf0e10cSrcweir 	SetLineColor();
787cdf0e10cSrcweir 	SetFillColor( GetSettings().GetStyleSettings().GetButtonTextColor() );
788cdf0e10cSrcweir 	if ( bDrawPrev )
789cdf0e10cSrcweir 	{
790cdf0e10cSrcweir 		Rectangle aOutRect = maPrevRect;
791cdf0e10cSrcweir 		aOutRect.Left()   += 3;
792cdf0e10cSrcweir 		aOutRect.Top()	  += 3;
793cdf0e10cSrcweir 		aOutRect.Right()  -= 3;
794cdf0e10cSrcweir 		aOutRect.Bottom() -= 3;
795cdf0e10cSrcweir 		ImplDrawSpinArrow( this, aOutRect, sal_True );
796cdf0e10cSrcweir 	}
797cdf0e10cSrcweir 	if ( bDrawNext )
798cdf0e10cSrcweir 	{
799cdf0e10cSrcweir 		Rectangle aOutRect = maNextRect;
800cdf0e10cSrcweir 		aOutRect.Left()   += 3;
801cdf0e10cSrcweir 		aOutRect.Top()	  += 3;
802cdf0e10cSrcweir 		aOutRect.Right()  -= 3;
803cdf0e10cSrcweir 		aOutRect.Bottom() -= 3;
804cdf0e10cSrcweir 		ImplDrawSpinArrow( this, aOutRect, sal_False );
805cdf0e10cSrcweir 	}
806cdf0e10cSrcweir }
807cdf0e10cSrcweir 
808cdf0e10cSrcweir // -----------------------------------------------------------------------
809cdf0e10cSrcweir 
ImplDrawDate(long nX,long nY,sal_uInt16 nDay,sal_uInt16 nMonth,sal_uInt16 nYear,DayOfWeek eDayOfWeek,sal_Bool bBack,sal_Bool bOther,sal_uLong nToday)810cdf0e10cSrcweir void Calendar::ImplDrawDate( long nX, long nY,
811cdf0e10cSrcweir 							 sal_uInt16 nDay, sal_uInt16 nMonth, sal_uInt16 nYear,
812cdf0e10cSrcweir 							 DayOfWeek eDayOfWeek,
813cdf0e10cSrcweir 							 sal_Bool bBack, sal_Bool bOther, sal_uLong nToday )
814cdf0e10cSrcweir {
815cdf0e10cSrcweir 	ImplDateInfo*	pDateInfo;
816cdf0e10cSrcweir 	Color*			pTextColor = NULL;
817cdf0e10cSrcweir 	const String&	rDay = *(mpDayText[nDay-1]);
818cdf0e10cSrcweir 	Rectangle		aDateRect( nX, nY, nX+mnDayWidth-1, nY+mnDayHeight-1 );
819cdf0e10cSrcweir 
820cdf0e10cSrcweir 	sal_Bool bSel = sal_False;
821cdf0e10cSrcweir 	sal_Bool bFocus = sal_False;
822cdf0e10cSrcweir 	// Aktueller Tag
823cdf0e10cSrcweir 	if ( (nDay	 == maCurDate.GetDay()) &&
824cdf0e10cSrcweir 		 (nMonth == maCurDate.GetMonth()) &&
825cdf0e10cSrcweir 		 (nYear  == maCurDate.GetYear()) )
826cdf0e10cSrcweir 		bFocus = sal_True;
827cdf0e10cSrcweir 	if ( mpSelectTable )
828cdf0e10cSrcweir 	{
829cdf0e10cSrcweir 		if ( mpSelectTable->IsKeyValid( Date( nDay, nMonth, nYear ).GetDate() ) )
830cdf0e10cSrcweir 			bSel = sal_True;
831cdf0e10cSrcweir 	}
832cdf0e10cSrcweir 
833cdf0e10cSrcweir 	// Dateinfo ermitteln
834cdf0e10cSrcweir 	if ( mpDateTable )
835cdf0e10cSrcweir 	{
836cdf0e10cSrcweir 		pDateInfo = mpDateTable->Get( Date( nDay, nMonth, nYear ).GetDate() );
837cdf0e10cSrcweir 		if ( !pDateInfo )
838cdf0e10cSrcweir 			pDateInfo = mpDateTable->Get( Date( nDay, nMonth, 0 ).GetDate() );
839cdf0e10cSrcweir 	}
840cdf0e10cSrcweir 	else
841cdf0e10cSrcweir 		pDateInfo = NULL;
842cdf0e10cSrcweir 
843cdf0e10cSrcweir 	// Textfarbe ermitteln
844cdf0e10cSrcweir 	if ( bSel )
845cdf0e10cSrcweir 		pTextColor = &maSelColor;
846cdf0e10cSrcweir 	else if ( bOther )
847cdf0e10cSrcweir 		pTextColor = &maOtherColor;
848cdf0e10cSrcweir 	else
849cdf0e10cSrcweir 	{
850cdf0e10cSrcweir 		if ( pDateInfo && pDateInfo->mpTextColor )
851cdf0e10cSrcweir 			pTextColor = pDateInfo->mpTextColor;
852cdf0e10cSrcweir 		else
853cdf0e10cSrcweir 		{
854cdf0e10cSrcweir 			if ( eDayOfWeek == SATURDAY )
855cdf0e10cSrcweir 				pTextColor = mpSaturdayColor;
856cdf0e10cSrcweir 			else if ( eDayOfWeek == SUNDAY )
857cdf0e10cSrcweir 				pTextColor = mpSundayColor;
858cdf0e10cSrcweir 			if ( !pTextColor )
859cdf0e10cSrcweir 				pTextColor = mpStandardColor;
860cdf0e10cSrcweir 		}
861cdf0e10cSrcweir 	}
862cdf0e10cSrcweir 
863cdf0e10cSrcweir 	if ( bFocus )
864cdf0e10cSrcweir 		HideFocus();
865cdf0e10cSrcweir 
866cdf0e10cSrcweir 	// Font ermitteln
867cdf0e10cSrcweir 	Font aOldFont = GetFont();
868cdf0e10cSrcweir 	sal_Bool bBoldFont = sal_False;
869cdf0e10cSrcweir 	if ( (mnWinStyle & WB_BOLDTEXT) &&
870cdf0e10cSrcweir 		 pDateInfo && (pDateInfo->mnFlags & DIB_BOLD) )
871cdf0e10cSrcweir 	{
872cdf0e10cSrcweir 		bBoldFont = sal_True;
873cdf0e10cSrcweir 		Font aFont = aOldFont;
874cdf0e10cSrcweir 		if ( aFont.GetWeight() < WEIGHT_BOLD )
875cdf0e10cSrcweir 			aFont.SetWeight( WEIGHT_BOLD );
876cdf0e10cSrcweir 		else
877cdf0e10cSrcweir 			aFont.SetWeight( WEIGHT_NORMAL );
878cdf0e10cSrcweir 		SetFont( aFont );
879cdf0e10cSrcweir 	}
880cdf0e10cSrcweir 
881cdf0e10cSrcweir 	// Hintergrund ausgeben
882cdf0e10cSrcweir 	const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
883cdf0e10cSrcweir 	if ( bSel || bBack )
884cdf0e10cSrcweir 	{
885cdf0e10cSrcweir 		if ( bSel )
886cdf0e10cSrcweir 		{
887cdf0e10cSrcweir 			SetLineColor();
888cdf0e10cSrcweir 			SetFillColor( rStyleSettings.GetHighlightColor() );
889cdf0e10cSrcweir 			DrawRect( aDateRect );
890cdf0e10cSrcweir 		}
891cdf0e10cSrcweir 		else
892cdf0e10cSrcweir 			Erase( aDateRect );
893cdf0e10cSrcweir 	}
894cdf0e10cSrcweir 
895cdf0e10cSrcweir 	// Text ausgeben
896cdf0e10cSrcweir 	long nTextX = nX+(mnDayWidth-GetTextWidth( rDay ))-(DAY_OFFX/2);
897cdf0e10cSrcweir 	long nTextY = nY+(mnDayHeight-GetTextHeight())/2;
898cdf0e10cSrcweir 	if ( pTextColor )
899cdf0e10cSrcweir 	{
900cdf0e10cSrcweir 		Color aOldColor = GetTextColor();
901cdf0e10cSrcweir 		SetTextColor( *pTextColor );
902cdf0e10cSrcweir 		DrawText( Point( nTextX, nTextY ), rDay );
903cdf0e10cSrcweir 		SetTextColor( aOldColor );
904cdf0e10cSrcweir 	}
905cdf0e10cSrcweir 	else
906cdf0e10cSrcweir 		DrawText( Point( nTextX, nTextY ), rDay );
907cdf0e10cSrcweir 
908cdf0e10cSrcweir 	// Heute
909cdf0e10cSrcweir 	Date aTodayDate( maCurDate );
910cdf0e10cSrcweir 	if ( nToday )
911cdf0e10cSrcweir 		aTodayDate.SetDate( nToday );
912cdf0e10cSrcweir 	else
913cdf0e10cSrcweir 		aTodayDate = Date();
914cdf0e10cSrcweir 	if ( (nDay	 == aTodayDate.GetDay()) &&
915cdf0e10cSrcweir 		 (nMonth == aTodayDate.GetMonth()) &&
916cdf0e10cSrcweir 		 (nYear  == aTodayDate.GetYear()) )
917cdf0e10cSrcweir 	{
918cdf0e10cSrcweir 		SetLineColor( rStyleSettings.GetWindowTextColor() );
919cdf0e10cSrcweir 		SetFillColor();
920cdf0e10cSrcweir 		DrawRect( aDateRect );
921cdf0e10cSrcweir 	}
922cdf0e10cSrcweir 
923cdf0e10cSrcweir 	// Evt. DateInfo ausgeben
924cdf0e10cSrcweir 	if ( (mnWinStyle & WB_FRAMEINFO) && pDateInfo && pDateInfo->mpFrameColor )
925cdf0e10cSrcweir 	{
926cdf0e10cSrcweir 		SetLineColor( *(pDateInfo->mpFrameColor) );
927cdf0e10cSrcweir 		SetFillColor();
928cdf0e10cSrcweir 		Rectangle aFrameRect( aDateRect );
929cdf0e10cSrcweir 		aFrameRect.Left()++;
930cdf0e10cSrcweir 		aFrameRect.Top()++;
931cdf0e10cSrcweir 		long nFrameWidth = aFrameRect.GetWidth();
932cdf0e10cSrcweir 		long nFrameHeight = aFrameRect.GetHeight();
933cdf0e10cSrcweir 		long nFrameOff;
934cdf0e10cSrcweir 		if ( nFrameWidth < nFrameHeight )
935cdf0e10cSrcweir 		{
936cdf0e10cSrcweir 			nFrameOff = nFrameHeight-nFrameWidth;
937cdf0e10cSrcweir 			aFrameRect.Top() += nFrameOff/2;
938cdf0e10cSrcweir 			nFrameOff %= 2;
939cdf0e10cSrcweir 			aFrameRect.Bottom() -= nFrameOff;
940cdf0e10cSrcweir 		}
941cdf0e10cSrcweir 		else if ( nFrameWidth > nFrameHeight )
942cdf0e10cSrcweir 		{
943cdf0e10cSrcweir 			nFrameOff = nFrameWidth-nFrameHeight;
944cdf0e10cSrcweir 			aFrameRect.Left() += nFrameOff/2;
945cdf0e10cSrcweir 			nFrameOff %= 2;
946cdf0e10cSrcweir 			aFrameRect.Right() -= nFrameOff;
947cdf0e10cSrcweir 		}
948cdf0e10cSrcweir 		DrawEllipse( aFrameRect );
949cdf0e10cSrcweir 	}
950cdf0e10cSrcweir 
951cdf0e10cSrcweir 	// Evt. noch FocusRect
952cdf0e10cSrcweir 	if ( bFocus && HasFocus() )
953cdf0e10cSrcweir 		ShowFocus( aDateRect );
954cdf0e10cSrcweir 
955cdf0e10cSrcweir 	if( mbDropPos && maDropDate == Date( nDay, nMonth, nYear ) )
956cdf0e10cSrcweir 		ImplInvertDropPos();
957cdf0e10cSrcweir 
958cdf0e10cSrcweir 	if ( bBoldFont )
959cdf0e10cSrcweir 		SetFont( aOldFont );
960cdf0e10cSrcweir }
961cdf0e10cSrcweir 
962cdf0e10cSrcweir // -----------------------------------------------------------------------
963cdf0e10cSrcweir 
ImplDraw(sal_Bool bPaint)964cdf0e10cSrcweir void Calendar::ImplDraw( sal_Bool bPaint )
965cdf0e10cSrcweir {
966cdf0e10cSrcweir 	ImplFormat();
967cdf0e10cSrcweir 
968cdf0e10cSrcweir 	const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
969cdf0e10cSrcweir 	Size		aOutSize = GetOutputSizePixel();
970cdf0e10cSrcweir 	long		i;
971cdf0e10cSrcweir 	long		j;
972cdf0e10cSrcweir 	long		nX;
973cdf0e10cSrcweir 	long		nY;
974cdf0e10cSrcweir 	long		nDeltaX;
975cdf0e10cSrcweir 	long		nDeltaY;
976cdf0e10cSrcweir 	long		nDayX;
977cdf0e10cSrcweir 	long		nDayY;
978cdf0e10cSrcweir 	sal_uLong		nToday = Date().GetDate();
979cdf0e10cSrcweir 	sal_uInt16		nDay;
980cdf0e10cSrcweir 	sal_uInt16		nMonth;
981cdf0e10cSrcweir 	sal_uInt16		nYear;
982cdf0e10cSrcweir 	Date		aDate = GetFirstMonth();
983cdf0e10cSrcweir 	DayOfWeek	eStartDay = ImplGetWeekStart();
984cdf0e10cSrcweir 
985cdf0e10cSrcweir 	HideFocus();
986cdf0e10cSrcweir 
987cdf0e10cSrcweir 	nY = 0;
988cdf0e10cSrcweir 	for ( i = 0; i < mnLines; i++ )
989cdf0e10cSrcweir 	{
990cdf0e10cSrcweir 		// Titleleiste ausgeben
991cdf0e10cSrcweir 		SetLineColor();
992cdf0e10cSrcweir 		SetFillColor( rStyleSettings.GetFaceColor() );
993cdf0e10cSrcweir 		Rectangle aTitleRect( 0, nY, aOutSize.Width()-1, nY+mnDayHeight-DAY_OFFY+TITLE_BORDERY*2 );
994cdf0e10cSrcweir 		if ( !bPaint )
995cdf0e10cSrcweir 		{
996cdf0e10cSrcweir 			Rectangle aTempRect( 1, aTitleRect.Top()+TITLE_BORDERY,
997cdf0e10cSrcweir 								 aOutSize.Width()-2,
998cdf0e10cSrcweir 								 aTitleRect.Bottom()-TITLE_BORDERY );
999cdf0e10cSrcweir 			if ( !i )
1000cdf0e10cSrcweir 			{
1001cdf0e10cSrcweir 				aTempRect.Left()  = maPrevRect.Right()+1;
1002cdf0e10cSrcweir 				aTempRect.Right() = maNextRect.Left()-1;
1003cdf0e10cSrcweir 			}
1004cdf0e10cSrcweir 			DrawRect( aTempRect );
1005cdf0e10cSrcweir 		}
1006cdf0e10cSrcweir 		else
1007cdf0e10cSrcweir 		{
1008cdf0e10cSrcweir 			DrawRect( aTitleRect );
1009cdf0e10cSrcweir 			Point aTopLeft1( aTitleRect.Left(), aTitleRect.Top() );
1010cdf0e10cSrcweir 			Point aTopLeft2( aTitleRect.Left(), aTitleRect.Top()+1 );
1011cdf0e10cSrcweir 			Point aBottomRight1( aTitleRect.Right(), aTitleRect.Bottom() );
1012cdf0e10cSrcweir 			Point aBottomRight2( aTitleRect.Right(), aTitleRect.Bottom()-1 );
1013cdf0e10cSrcweir 			SetLineColor( rStyleSettings.GetDarkShadowColor() );
1014cdf0e10cSrcweir 			DrawLine( aTopLeft1, Point( aBottomRight1.X(), aTopLeft1.Y() ) );
1015cdf0e10cSrcweir 			SetLineColor( rStyleSettings.GetLightColor() );
1016cdf0e10cSrcweir 			DrawLine( aTopLeft2, Point( aBottomRight2.X(), aTopLeft2.Y() ) );
1017cdf0e10cSrcweir 			DrawLine( aTopLeft2, Point( aTopLeft2.X(), aBottomRight2.Y() ) );
1018cdf0e10cSrcweir 			SetLineColor( rStyleSettings.GetShadowColor() );
1019cdf0e10cSrcweir 			DrawLine( Point( aTopLeft2.X(), aBottomRight2.Y() ), aBottomRight2 );
1020cdf0e10cSrcweir 			DrawLine( Point( aBottomRight2.X(), aTopLeft2.Y() ), aBottomRight2 );
1021cdf0e10cSrcweir 			SetLineColor( rStyleSettings.GetDarkShadowColor() );
1022cdf0e10cSrcweir 			DrawLine( Point( aTopLeft1.X(), aBottomRight1.Y() ), aBottomRight1 );
1023cdf0e10cSrcweir 		}
1024cdf0e10cSrcweir 		Point aSepPos1( 0, aTitleRect.Top()+TITLE_BORDERY );
1025cdf0e10cSrcweir 		Point aSepPos2( 0, aTitleRect.Bottom()-TITLE_BORDERY );
1026cdf0e10cSrcweir 		for ( j = 0; j < mnMonthPerLine-1; j++ )
1027cdf0e10cSrcweir 		{
1028cdf0e10cSrcweir 			aSepPos1.X() += mnMonthWidth-1;
1029cdf0e10cSrcweir 			aSepPos2.X() = aSepPos1.X();
1030cdf0e10cSrcweir 			SetLineColor( rStyleSettings.GetShadowColor() );
1031cdf0e10cSrcweir 			DrawLine( aSepPos1, aSepPos2 );
1032cdf0e10cSrcweir 			aSepPos1.X()++;
1033cdf0e10cSrcweir 			aSepPos2.X() = aSepPos1.X();
1034cdf0e10cSrcweir 			SetLineColor( rStyleSettings.GetLightColor() );
1035cdf0e10cSrcweir 			DrawLine( aSepPos1, aSepPos2 );
1036cdf0e10cSrcweir 		}
1037cdf0e10cSrcweir 
1038cdf0e10cSrcweir 		nX = 0;
1039cdf0e10cSrcweir 		for ( j = 0; j < mnMonthPerLine; j++ )
1040cdf0e10cSrcweir 		{
1041cdf0e10cSrcweir 			nMonth	= aDate.GetMonth();
1042cdf0e10cSrcweir 			nYear	= aDate.GetYear();
1043cdf0e10cSrcweir 
1044cdf0e10cSrcweir 			// Monat in der Titleleiste ausgeben
1045cdf0e10cSrcweir 			nDeltaX = nX;
1046cdf0e10cSrcweir 			nDeltaY = nY+TITLE_BORDERY;
1047cdf0e10cSrcweir             String aMonthText( maCalendarWrapper.getDisplayName(
1048cdf0e10cSrcweir                         i18n::CalendarDisplayIndex::MONTH, nMonth-1, 1));
1049cdf0e10cSrcweir 			aMonthText += ' ';
1050cdf0e10cSrcweir 			aMonthText += String::CreateFromInt64( nYear );
1051cdf0e10cSrcweir 			long nMonthTextWidth = GetTextWidth( aMonthText );
1052cdf0e10cSrcweir 			long nMonthOffX1 = 0;
1053cdf0e10cSrcweir 			long nMonthOffX2 = 0;
1054cdf0e10cSrcweir 			if ( i == 0 )
1055cdf0e10cSrcweir 			{
1056cdf0e10cSrcweir 				if ( j == 0 )
1057cdf0e10cSrcweir 					nMonthOffX1 = maPrevRect.Right()+1;
1058cdf0e10cSrcweir 				if ( j == mnMonthPerLine-1 )
1059cdf0e10cSrcweir 					nMonthOffX2 = aOutSize.Width()-maNextRect.Left()+1;
1060cdf0e10cSrcweir 			}
1061cdf0e10cSrcweir 			long nMaxMonthWidth = mnMonthWidth-nMonthOffX1-nMonthOffX2-4;
1062cdf0e10cSrcweir 			if ( nMonthTextWidth > nMaxMonthWidth )
1063cdf0e10cSrcweir 			{
1064cdf0e10cSrcweir 				// Abbreviated month name.
1065cdf0e10cSrcweir                 aMonthText  = maCalendarWrapper.getDisplayName(
1066cdf0e10cSrcweir                         i18n::CalendarDisplayIndex::MONTH, nMonth-1, 0);
1067cdf0e10cSrcweir 				aMonthText += ' ';
1068cdf0e10cSrcweir 				aMonthText += String::CreateFromInt64( nYear );
1069cdf0e10cSrcweir 				nMonthTextWidth = GetTextWidth( aMonthText );
1070cdf0e10cSrcweir 			}
1071cdf0e10cSrcweir 			long nTempOff = (mnMonthWidth-nMonthTextWidth+1)/2;
1072cdf0e10cSrcweir 			if ( nTempOff < nMonthOffX1 )
1073cdf0e10cSrcweir 				nDeltaX += nMonthOffX1+1;
1074cdf0e10cSrcweir 			else
1075cdf0e10cSrcweir 			{
1076cdf0e10cSrcweir 				if ( nTempOff+nMonthTextWidth > mnMonthWidth-nMonthOffX2 )
1077cdf0e10cSrcweir 					nDeltaX += mnMonthWidth-nMonthOffX2-nMonthTextWidth;
1078cdf0e10cSrcweir 				else
1079cdf0e10cSrcweir 					nDeltaX += nTempOff;
1080cdf0e10cSrcweir 			}
1081cdf0e10cSrcweir 			SetTextColor( rStyleSettings.GetButtonTextColor() );
1082cdf0e10cSrcweir 			DrawText( Point( nDeltaX, nDeltaY ), aMonthText );
1083cdf0e10cSrcweir 			SetTextColor( rStyleSettings.GetWindowTextColor() );
1084cdf0e10cSrcweir 
1085cdf0e10cSrcweir 			// Weekleiste ausgeben
1086cdf0e10cSrcweir 			if ( bPaint )
1087cdf0e10cSrcweir 			{
1088cdf0e10cSrcweir 				nDayX = nX+mnDaysOffX;
1089cdf0e10cSrcweir 				nDayY = nY+mnWeekDayOffY;
1090cdf0e10cSrcweir 				nDeltaY = nDayY + mnDayHeight;
1091cdf0e10cSrcweir 				SetLineColor( rStyleSettings.GetWindowTextColor() );
1092cdf0e10cSrcweir 				Point aStartPos( nDayX, nDeltaY );
1093cdf0e10cSrcweir 				if ( mnWinStyle & WB_WEEKNUMBER )
1094cdf0e10cSrcweir 					aStartPos.X() -= WEEKNUMBER_OFFX-2;
1095cdf0e10cSrcweir 				DrawLine( aStartPos, Point( nDayX+(7*mnDayWidth), nDeltaY ) );
1096cdf0e10cSrcweir 				DrawTextArray( Point( nDayX+mnDayOfWeekAry[0], nDayY ), maDayOfWeekText, &(mnDayOfWeekAry[1]) );
1097cdf0e10cSrcweir 			}
1098cdf0e10cSrcweir 
1099cdf0e10cSrcweir 			// Week-Numbers ausgeben
1100cdf0e10cSrcweir 			if ( mnWinStyle & WB_WEEKNUMBER )
1101cdf0e10cSrcweir 			{
1102cdf0e10cSrcweir 				nDayX = nX+mnDaysOffX;
1103cdf0e10cSrcweir 				nDayY = nY+mnWeekDayOffY;
1104cdf0e10cSrcweir 				nDeltaY = nDayY + mnDayHeight;
1105cdf0e10cSrcweir 				long nMonthHeight = mnDayHeight*6;
1106cdf0e10cSrcweir 				if ( bPaint )
1107cdf0e10cSrcweir 					DrawLine( Point( nDayX-WEEKNUMBER_OFFX+2, nDeltaY ), Point( nDayX-WEEKNUMBER_OFFX+2, nDeltaY+nMonthHeight ) );
1108cdf0e10cSrcweir 				else
1109cdf0e10cSrcweir 					Erase( Rectangle( nDayX-mnWeekWidth-WEEKNUMBER_OFFX, nDeltaY, nDayX-WEEKNUMBER_OFFX-1, nDeltaY+nMonthHeight ) );
1110cdf0e10cSrcweir 
1111cdf0e10cSrcweir 				Font aOldFont = GetFont();
1112cdf0e10cSrcweir 				Font aTempFont = aOldFont;
1113cdf0e10cSrcweir 				ImplGetWeekFont( aTempFont );
1114cdf0e10cSrcweir 				SetFont( aTempFont );
1115cdf0e10cSrcweir 				nDayX -= mnWeekWidth;
1116cdf0e10cSrcweir 				nDayY = nY+mnDaysOffY;
1117cdf0e10cSrcweir                 maCalendarWrapper.setGregorianDateTime( aDate);
1118cdf0e10cSrcweir 				for ( sal_uInt16 nWeekCount = 0; nWeekCount < 6; nWeekCount++ )
1119cdf0e10cSrcweir 				{
1120cdf0e10cSrcweir                     sal_Int16 nWeek = maCalendarWrapper.getValue( i18n::CalendarFieldIndex::WEEK_OF_YEAR);
1121cdf0e10cSrcweir 					String	aWeekText( String::CreateFromInt32( nWeek));
1122cdf0e10cSrcweir 					long	nOffX = (mnWeekWidth-WEEKNUMBER_OFFX)-GetTextWidth( aWeekText );
1123cdf0e10cSrcweir 					long	nOffY = (mnDayHeight-GetTextHeight())/2;
1124cdf0e10cSrcweir 					DrawText( Point( nDayX+nOffX, nDayY+nOffY ), aWeekText );
1125cdf0e10cSrcweir 					nDayY += mnDayHeight;
1126cdf0e10cSrcweir                     maCalendarWrapper.addValue( i18n::CalendarFieldIndex::DAY_OF_MONTH, 7);
1127cdf0e10cSrcweir 				}
1128cdf0e10cSrcweir 				SetFont( aOldFont );
1129cdf0e10cSrcweir 			}
1130cdf0e10cSrcweir 
1131cdf0e10cSrcweir 			// Tage ausgeben
1132cdf0e10cSrcweir 			sal_uInt16 nDaysInMonth = aDate.GetDaysInMonth();
1133cdf0e10cSrcweir 			nDayX = nX+mnDaysOffX;
1134cdf0e10cSrcweir 			nDayY = nY+mnDaysOffY;
1135cdf0e10cSrcweir 			if ( !bPaint )
1136cdf0e10cSrcweir 			{
1137cdf0e10cSrcweir 				Rectangle aClearRect( nDayX, nDayY,
1138cdf0e10cSrcweir 									  nDayX+(7*mnDayWidth)-1, nDayY+(6*mnDayHeight)-1 );
1139cdf0e10cSrcweir 				Erase( aClearRect );
1140cdf0e10cSrcweir 			}
1141cdf0e10cSrcweir 			sal_uInt16 nDayIndex = (sal_uInt16)aDate.GetDayOfWeek();
1142cdf0e10cSrcweir 			nDayIndex = (nDayIndex+(7-(sal_uInt16)eStartDay)) % 7;
1143cdf0e10cSrcweir 			if ( (i == 0) && (j == 0) )
1144cdf0e10cSrcweir 			{
1145cdf0e10cSrcweir 				Date aTempDate = aDate;
1146cdf0e10cSrcweir 				aTempDate -= nDayIndex;
1147cdf0e10cSrcweir 				for ( nDay = 0; nDay < nDayIndex; nDay++ )
1148cdf0e10cSrcweir 				{
1149cdf0e10cSrcweir 					nDeltaX = nDayX + (nDay*mnDayWidth);
1150cdf0e10cSrcweir 					ImplDrawDate( nDeltaX, nDayY, nDay+aTempDate.GetDay(),
1151cdf0e10cSrcweir 								  aTempDate.GetMonth(), aTempDate.GetYear(),
1152cdf0e10cSrcweir 								  (DayOfWeek)((nDay+(sal_uInt16)eStartDay)%7), sal_False, sal_True, nToday );
1153cdf0e10cSrcweir 				}
1154cdf0e10cSrcweir 			}
1155cdf0e10cSrcweir 			for ( nDay = 1; nDay <= nDaysInMonth; nDay++ )
1156cdf0e10cSrcweir 			{
1157cdf0e10cSrcweir 				nDeltaX = nDayX + (nDayIndex*mnDayWidth);
1158cdf0e10cSrcweir 				ImplDrawDate( nDeltaX, nDayY, nDay, nMonth, nYear,
1159cdf0e10cSrcweir 							  (DayOfWeek)((nDayIndex+(sal_uInt16)eStartDay)%7),
1160cdf0e10cSrcweir 							  sal_False, sal_False, nToday );
1161cdf0e10cSrcweir 				if ( nDayIndex == 6 )
1162cdf0e10cSrcweir 				{
1163cdf0e10cSrcweir 					nDayIndex = 0;
1164cdf0e10cSrcweir 					nDayY += mnDayHeight;
1165cdf0e10cSrcweir 				}
1166cdf0e10cSrcweir 				else
1167cdf0e10cSrcweir 					nDayIndex++;
1168cdf0e10cSrcweir 			}
1169cdf0e10cSrcweir 			if ( (i == mnLines-1) && (j == mnMonthPerLine-1) )
1170cdf0e10cSrcweir 			{
1171cdf0e10cSrcweir 				sal_uInt16 nWeekDay = (sal_uInt16)aDate.GetDayOfWeek();
1172cdf0e10cSrcweir 				nWeekDay = (nWeekDay+(7-(sal_uInt16)eStartDay)) % 7;
1173cdf0e10cSrcweir 				sal_uInt16 nDayCount = 42-nDaysInMonth-nWeekDay;
1174cdf0e10cSrcweir 				Date aTempDate = aDate;
1175cdf0e10cSrcweir 				aTempDate += nDaysInMonth;
1176cdf0e10cSrcweir 				for ( nDay = 1; nDay <= nDayCount; nDay++ )
1177cdf0e10cSrcweir 				{
1178cdf0e10cSrcweir 					nDeltaX = nDayX + (nDayIndex*mnDayWidth);
1179cdf0e10cSrcweir 					ImplDrawDate( nDeltaX, nDayY, nDay,
1180cdf0e10cSrcweir 								  aTempDate.GetMonth(), aTempDate.GetYear(),
1181cdf0e10cSrcweir 								  (DayOfWeek)((nDayIndex+(sal_uInt16)eStartDay)%7),
1182cdf0e10cSrcweir 								  sal_False, sal_True, nToday );
1183cdf0e10cSrcweir 					if ( nDayIndex == 6 )
1184cdf0e10cSrcweir 					{
1185cdf0e10cSrcweir 						nDayIndex = 0;
1186cdf0e10cSrcweir 						nDayY += mnDayHeight;
1187cdf0e10cSrcweir 					}
1188cdf0e10cSrcweir 					else
1189cdf0e10cSrcweir 						nDayIndex++;
1190cdf0e10cSrcweir 				}
1191cdf0e10cSrcweir 			}
1192cdf0e10cSrcweir 
1193cdf0e10cSrcweir 			aDate += nDaysInMonth;
1194cdf0e10cSrcweir 			nX += mnMonthWidth;
1195cdf0e10cSrcweir 		}
1196cdf0e10cSrcweir 
1197cdf0e10cSrcweir 		nY += mnMonthHeight;
1198cdf0e10cSrcweir 	}
1199cdf0e10cSrcweir 
1200cdf0e10cSrcweir 	// Spin-Buttons zeichnen
1201cdf0e10cSrcweir 	if ( bPaint )
1202cdf0e10cSrcweir 		ImplDrawSpin();
1203cdf0e10cSrcweir }
1204cdf0e10cSrcweir 
1205cdf0e10cSrcweir // -----------------------------------------------------------------------
1206cdf0e10cSrcweir 
ImplUpdateDate(const Date & rDate)1207cdf0e10cSrcweir void Calendar::ImplUpdateDate( const Date& rDate )
1208cdf0e10cSrcweir {
1209cdf0e10cSrcweir 	if ( IsReallyVisible() && IsUpdateMode() )
1210cdf0e10cSrcweir 	{
1211cdf0e10cSrcweir 		Rectangle aDateRect( GetDateRect( rDate ) );
1212cdf0e10cSrcweir 		if ( !aDateRect.IsEmpty() )
1213cdf0e10cSrcweir 		{
1214cdf0e10cSrcweir 			sal_Bool bOther = (rDate < GetFirstMonth()) || (rDate > GetLastMonth());
1215cdf0e10cSrcweir 			ImplDrawDate( aDateRect.Left(), aDateRect.Top(),
1216cdf0e10cSrcweir 						  rDate.GetDay(), rDate.GetMonth(), rDate.GetYear(),
1217cdf0e10cSrcweir 						  rDate.GetDayOfWeek(), sal_True, bOther );
1218cdf0e10cSrcweir 		}
1219cdf0e10cSrcweir 	}
1220cdf0e10cSrcweir }
1221cdf0e10cSrcweir 
1222cdf0e10cSrcweir // -----------------------------------------------------------------------
1223cdf0e10cSrcweir 
ImplUpdateSelection(Table * pOld)1224cdf0e10cSrcweir void Calendar::ImplUpdateSelection( Table* pOld )
1225cdf0e10cSrcweir {
1226cdf0e10cSrcweir 	Table*	pNew = mpSelectTable;
1227cdf0e10cSrcweir 	void*	p;
1228cdf0e10cSrcweir 	sal_uLong	nKey;
1229cdf0e10cSrcweir 
1230cdf0e10cSrcweir 	p = pOld->First();
1231cdf0e10cSrcweir 	while ( p )
1232cdf0e10cSrcweir 	{
1233cdf0e10cSrcweir 		nKey = pOld->GetCurKey();
1234cdf0e10cSrcweir 		if ( !pNew->Get( nKey ) )
1235cdf0e10cSrcweir 		{
1236cdf0e10cSrcweir 			Date aTempDate( nKey );
1237cdf0e10cSrcweir 			ImplUpdateDate( aTempDate );
1238cdf0e10cSrcweir 		}
1239cdf0e10cSrcweir 
1240cdf0e10cSrcweir 		p = pOld->Next();
1241cdf0e10cSrcweir 	}
1242cdf0e10cSrcweir 
1243cdf0e10cSrcweir 	p = pNew->First();
1244cdf0e10cSrcweir 	while ( p )
1245cdf0e10cSrcweir 	{
1246cdf0e10cSrcweir 		nKey = pNew->GetCurKey();
1247cdf0e10cSrcweir 		if ( !pOld->Get( nKey ) )
1248cdf0e10cSrcweir 		{
1249cdf0e10cSrcweir 			Date aTempDate( nKey );
1250cdf0e10cSrcweir 			ImplUpdateDate( aTempDate );
1251cdf0e10cSrcweir 		}
1252cdf0e10cSrcweir 
1253cdf0e10cSrcweir 		p = pNew->Next();
1254cdf0e10cSrcweir 	}
1255cdf0e10cSrcweir }
1256cdf0e10cSrcweir 
1257cdf0e10cSrcweir // -----------------------------------------------------------------------
1258cdf0e10cSrcweir 
ImplMouseSelect(const Date & rDate,sal_uInt16 nHitTest,sal_Bool bMove,sal_Bool bExpand,sal_Bool bExtended)1259cdf0e10cSrcweir void Calendar::ImplMouseSelect( const Date& rDate, sal_uInt16 nHitTest,
1260cdf0e10cSrcweir 								sal_Bool bMove, sal_Bool bExpand, sal_Bool bExtended )
1261cdf0e10cSrcweir {
1262cdf0e10cSrcweir 	Table*	pOldSel = new Table( *mpSelectTable );
1263cdf0e10cSrcweir 	Date	aOldDate = maCurDate;
1264cdf0e10cSrcweir 	Date	aTempDate = rDate;
1265cdf0e10cSrcweir 
1266cdf0e10cSrcweir 	if ( !(nHitTest & CALENDAR_HITTEST_DAY) )
1267cdf0e10cSrcweir 		aTempDate--;
1268cdf0e10cSrcweir 
1269cdf0e10cSrcweir 	if ( mbMultiSelection )
1270cdf0e10cSrcweir 	{
1271cdf0e10cSrcweir 		maCurDate = aTempDate;
1272cdf0e10cSrcweir 		mbSelLeft = aTempDate < maAnchorDate;
1273cdf0e10cSrcweir 
1274cdf0e10cSrcweir 		if ( bMove )
1275cdf0e10cSrcweir 		{
1276cdf0e10cSrcweir 			if ( mbSelLeft )
1277cdf0e10cSrcweir 			{
1278cdf0e10cSrcweir 				ImplCalendarUnSelectDateRange( mpSelectTable, mpRestoreSelectTable, Date( 1, 1, 0 ), aTempDate );
1279cdf0e10cSrcweir 				ImplCalendarUnSelectDateRange( mpSelectTable, mpRestoreSelectTable, maAnchorDate, Date( 31, 12, 9999 ) );
1280cdf0e10cSrcweir 			}
1281cdf0e10cSrcweir 			else
1282cdf0e10cSrcweir 			{
1283cdf0e10cSrcweir 				ImplCalendarUnSelectDateRange( mpSelectTable, mpRestoreSelectTable, Date( 1, 1, 0 ), maAnchorDate );
1284cdf0e10cSrcweir 				ImplCalendarUnSelectDateRange( mpSelectTable, mpRestoreSelectTable, aTempDate, Date( 31, 12, 9999 ) );
1285cdf0e10cSrcweir 			}
1286cdf0e10cSrcweir 			ImplCalendarSelectDateRange( mpSelectTable, aTempDate, maAnchorDate, !mbUnSel );
1287cdf0e10cSrcweir 		}
1288cdf0e10cSrcweir 		else
1289cdf0e10cSrcweir 		{
1290cdf0e10cSrcweir 			if ( bExpand )
1291cdf0e10cSrcweir 			{
1292cdf0e10cSrcweir 				if ( !bExtended )
1293cdf0e10cSrcweir 				{
1294cdf0e10cSrcweir 					if ( mbSelLeft )
1295cdf0e10cSrcweir 					{
1296cdf0e10cSrcweir 						ImplCalendarSelectDateRange( mpSelectTable, Date( 1, 1, 0 ), aTempDate, sal_False );
1297cdf0e10cSrcweir 						ImplCalendarSelectDateRange( mpSelectTable, maAnchorDate, Date( 31, 12, 9999 ), sal_False );
1298cdf0e10cSrcweir 					}
1299cdf0e10cSrcweir 					else
1300cdf0e10cSrcweir 					{
1301cdf0e10cSrcweir 						ImplCalendarSelectDateRange( mpSelectTable, Date( 1, 1, 0 ), maAnchorDate, sal_False );
1302cdf0e10cSrcweir 						ImplCalendarSelectDateRange( mpSelectTable, aTempDate, Date( 31, 12, 9999 ), sal_False );
1303cdf0e10cSrcweir 					}
1304cdf0e10cSrcweir 				}
1305cdf0e10cSrcweir 				ImplCalendarSelectDateRange( mpSelectTable, aTempDate, maAnchorDate, sal_True );
1306cdf0e10cSrcweir 			}
1307cdf0e10cSrcweir 			else if ( bExtended && !(mnWinStyle & WB_RANGESELECT) )
1308cdf0e10cSrcweir 			{
1309cdf0e10cSrcweir 				maAnchorDate = aTempDate;
1310cdf0e10cSrcweir 				if ( IsDateSelected( aTempDate ) )
1311cdf0e10cSrcweir 				{
1312cdf0e10cSrcweir 					mbUnSel = sal_True;
1313cdf0e10cSrcweir 					ImplCalendarSelectDate( mpSelectTable, aTempDate, sal_False );
1314cdf0e10cSrcweir 				}
1315cdf0e10cSrcweir 				else
1316cdf0e10cSrcweir 				{
1317cdf0e10cSrcweir 					ImplCalendarSelectDate( mpSelectTable, aTempDate, sal_True );
1318cdf0e10cSrcweir 				}
1319cdf0e10cSrcweir 			}
1320cdf0e10cSrcweir 			else
1321cdf0e10cSrcweir 			{
1322cdf0e10cSrcweir 				maAnchorDate = aTempDate;
1323cdf0e10cSrcweir 				ImplCalendarClearSelectDate( mpSelectTable );
1324cdf0e10cSrcweir 				ImplCalendarSelectDate( mpSelectTable, aTempDate, sal_True );
1325cdf0e10cSrcweir 			}
1326cdf0e10cSrcweir 
1327cdf0e10cSrcweir 			mpRestoreSelectTable = new Table( *mpSelectTable );
1328cdf0e10cSrcweir 		}
1329cdf0e10cSrcweir 	}
1330cdf0e10cSrcweir 	else
1331cdf0e10cSrcweir 	{
1332cdf0e10cSrcweir 		if ( aTempDate < maCurDate )
1333cdf0e10cSrcweir 			mbSelLeft = sal_True;
1334cdf0e10cSrcweir 		else
1335cdf0e10cSrcweir 			mbSelLeft = sal_False;
1336cdf0e10cSrcweir 		if ( !(nHitTest & CALENDAR_HITTEST_DAY) )
1337cdf0e10cSrcweir 			aTempDate = maOldCurDate;
1338cdf0e10cSrcweir 		if ( !bMove )
1339cdf0e10cSrcweir 			maAnchorDate = aTempDate;
1340cdf0e10cSrcweir 		if ( aTempDate != maCurDate )
1341cdf0e10cSrcweir 		{
1342cdf0e10cSrcweir 			maCurDate = aTempDate;
1343cdf0e10cSrcweir 			ImplCalendarSelectDate( mpSelectTable, aOldDate, sal_False );
1344cdf0e10cSrcweir 			ImplCalendarSelectDate( mpSelectTable, maCurDate, sal_True );
1345cdf0e10cSrcweir 		}
1346cdf0e10cSrcweir 	}
1347cdf0e10cSrcweir 
1348cdf0e10cSrcweir 	sal_Bool bNewSel = *pOldSel != *mpSelectTable;
1349cdf0e10cSrcweir 	if ( (maCurDate != aOldDate) || bNewSel )
1350cdf0e10cSrcweir 	{
1351cdf0e10cSrcweir 		if ( bNewSel )
1352cdf0e10cSrcweir 		{
1353cdf0e10cSrcweir 			mbInSelChange = sal_True;
1354cdf0e10cSrcweir 			SelectionChanging();
1355cdf0e10cSrcweir 			mbInSelChange = sal_False;
1356cdf0e10cSrcweir 		}
1357cdf0e10cSrcweir 		HideFocus();
1358cdf0e10cSrcweir 		if ( bNewSel )
1359cdf0e10cSrcweir 			ImplUpdateSelection( pOldSel );
1360cdf0e10cSrcweir 		if ( !bNewSel || !pOldSel->Get( aOldDate.GetDate() ) )
1361cdf0e10cSrcweir 			ImplUpdateDate( aOldDate );
1362cdf0e10cSrcweir 		// Damit Focus-Rechteck auch wieder neu ausgegeben wird
1363cdf0e10cSrcweir 		if ( HasFocus() || !bNewSel || !mpSelectTable->Get( maCurDate.GetDate() ) )
1364cdf0e10cSrcweir 			ImplUpdateDate( maCurDate );
1365cdf0e10cSrcweir 	}
1366cdf0e10cSrcweir 	delete pOldSel;
1367cdf0e10cSrcweir }
1368cdf0e10cSrcweir 
1369cdf0e10cSrcweir // -----------------------------------------------------------------------
1370cdf0e10cSrcweir 
ImplUpdate(sal_Bool bCalcNew)1371cdf0e10cSrcweir void Calendar::ImplUpdate( sal_Bool bCalcNew )
1372cdf0e10cSrcweir {
1373cdf0e10cSrcweir 	if ( IsReallyVisible() && IsUpdateMode() )
1374cdf0e10cSrcweir 	{
1375cdf0e10cSrcweir 		if ( bCalcNew && !mbCalc )
1376cdf0e10cSrcweir 			Invalidate();
1377cdf0e10cSrcweir 		else if ( !mbFormat && !mbCalc )
1378cdf0e10cSrcweir 		{
1379cdf0e10cSrcweir 			if ( mbDirect )
1380cdf0e10cSrcweir 			{
1381cdf0e10cSrcweir 				mbFormat = sal_True;
1382cdf0e10cSrcweir 				ImplDraw( sal_False );
1383cdf0e10cSrcweir 				return;
1384cdf0e10cSrcweir 			}
1385cdf0e10cSrcweir 			else
1386cdf0e10cSrcweir 				Invalidate();
1387cdf0e10cSrcweir 		}
1388cdf0e10cSrcweir 	}
1389cdf0e10cSrcweir 
1390cdf0e10cSrcweir 	if ( bCalcNew )
1391cdf0e10cSrcweir 		mbCalc = sal_True;
1392cdf0e10cSrcweir 	mbFormat = sal_True;
1393cdf0e10cSrcweir }
1394cdf0e10cSrcweir 
1395cdf0e10cSrcweir // -----------------------------------------------------------------------
1396cdf0e10cSrcweir 
ImplInvertDropPos()1397cdf0e10cSrcweir void Calendar::ImplInvertDropPos()
1398cdf0e10cSrcweir {
1399cdf0e10cSrcweir 	Rectangle aRect = GetDateRect( maDropDate );//this is one Pixel to width and one to heigh
1400cdf0e10cSrcweir 	aRect.Bottom() = aRect.Top()+mnDayHeight-1;
1401cdf0e10cSrcweir 	aRect.Right() = aRect.Left()+mnDayWidth-1;
1402cdf0e10cSrcweir 	Invert( aRect );
1403cdf0e10cSrcweir }
1404cdf0e10cSrcweir 
1405cdf0e10cSrcweir // -----------------------------------------------------------------------
1406cdf0e10cSrcweir 
ImplScroll(sal_Bool bPrev)1407cdf0e10cSrcweir void Calendar::ImplScroll( sal_Bool bPrev )
1408cdf0e10cSrcweir {
1409cdf0e10cSrcweir 	Date aNewFirstMonth = GetFirstMonth();
1410cdf0e10cSrcweir 	if ( bPrev )
1411cdf0e10cSrcweir 	{
1412cdf0e10cSrcweir 		aNewFirstMonth--;
1413cdf0e10cSrcweir 		aNewFirstMonth -= aNewFirstMonth.GetDaysInMonth()-1;
1414cdf0e10cSrcweir 	}
1415cdf0e10cSrcweir 	else
1416cdf0e10cSrcweir 		aNewFirstMonth += aNewFirstMonth.GetDaysInMonth();
1417cdf0e10cSrcweir 	mbDirect = sal_True;
1418cdf0e10cSrcweir 	SetFirstDate( aNewFirstMonth );
1419cdf0e10cSrcweir 	mbDirect = sal_False;
1420cdf0e10cSrcweir }
1421cdf0e10cSrcweir 
1422cdf0e10cSrcweir // -----------------------------------------------------------------------
1423cdf0e10cSrcweir 
ImplShowMenu(const Point & rPos,const Date & rDate)1424cdf0e10cSrcweir void Calendar::ImplShowMenu( const Point& rPos, const Date& rDate )
1425cdf0e10cSrcweir {
1426cdf0e10cSrcweir 	EndSelection();
1427cdf0e10cSrcweir 
1428cdf0e10cSrcweir 	Date		aOldFirstDate = GetFirstMonth();
1429cdf0e10cSrcweir 	PopupMenu	aPopupMenu;
1430cdf0e10cSrcweir 	PopupMenu*	pYearPopupMenus[MENU_YEAR_COUNT];
1431cdf0e10cSrcweir 	sal_uInt16		nMonthOff;
1432cdf0e10cSrcweir 	sal_uInt16		nCurItemId;
1433cdf0e10cSrcweir 	sal_uInt16		nYear = rDate.GetYear()-1;
1434cdf0e10cSrcweir 	sal_uInt16		i;
1435cdf0e10cSrcweir 	sal_uInt16		j;
1436cdf0e10cSrcweir 	sal_uInt16		nYearIdCount = 1000;
1437cdf0e10cSrcweir 
1438cdf0e10cSrcweir 	nMonthOff = (rDate.GetYear()-aOldFirstDate.GetYear())*12;
1439cdf0e10cSrcweir 	if ( aOldFirstDate.GetMonth() < rDate.GetMonth() )
1440cdf0e10cSrcweir 		nMonthOff += rDate.GetMonth()-aOldFirstDate.GetMonth();
1441cdf0e10cSrcweir 	else
1442cdf0e10cSrcweir 		nMonthOff -= aOldFirstDate.GetMonth()-rDate.GetMonth();
1443cdf0e10cSrcweir 
1444cdf0e10cSrcweir 	// Menu aufbauen (Jahre mit verschiedenen Monaten aufnehmen)
1445cdf0e10cSrcweir 	for ( i = 0; i < MENU_YEAR_COUNT; i++ )
1446cdf0e10cSrcweir 	{
1447cdf0e10cSrcweir 		pYearPopupMenus[i] = new PopupMenu;
1448cdf0e10cSrcweir 		for ( j = 1; j <= 12; j++ )
1449cdf0e10cSrcweir             pYearPopupMenus[i]->InsertItem( nYearIdCount+j,
1450cdf0e10cSrcweir                     maCalendarWrapper.getDisplayName(
1451cdf0e10cSrcweir                         i18n::CalendarDisplayIndex::MONTH, j-1, 1));
1452cdf0e10cSrcweir 		aPopupMenu.InsertItem( 10+i, UniString::CreateFromInt32( nYear+i ) );
1453cdf0e10cSrcweir 		aPopupMenu.SetPopupMenu( 10+i, pYearPopupMenus[i] );
1454cdf0e10cSrcweir 		nYearIdCount += 1000;
1455cdf0e10cSrcweir 	}
1456cdf0e10cSrcweir 
1457cdf0e10cSrcweir 	mbMenuDown = sal_True;
1458cdf0e10cSrcweir 	nCurItemId = aPopupMenu.Execute( this, rPos );
1459cdf0e10cSrcweir 	mbMenuDown = sal_False;
1460cdf0e10cSrcweir 
1461cdf0e10cSrcweir 	// Menu zerstoeren
1462cdf0e10cSrcweir 	aPopupMenu.SetPopupMenu( 2, NULL );
1463cdf0e10cSrcweir 	for ( i = 0; i < MENU_YEAR_COUNT; i++ )
1464cdf0e10cSrcweir 	{
1465cdf0e10cSrcweir 		aPopupMenu.SetPopupMenu( 10+i, NULL );
1466cdf0e10cSrcweir 		delete pYearPopupMenus[i];
1467cdf0e10cSrcweir 	}
1468cdf0e10cSrcweir 
1469cdf0e10cSrcweir 	if ( nCurItemId )
1470cdf0e10cSrcweir 	{
1471cdf0e10cSrcweir 		sal_uInt16 nTempMonthOff = nMonthOff % 12;
1472cdf0e10cSrcweir 		sal_uInt16 nTempYearOff = nMonthOff / 12;
1473cdf0e10cSrcweir 		sal_uInt16 nNewMonth = nCurItemId % 1000;
1474cdf0e10cSrcweir 		sal_uInt16 nNewYear = nYear+((nCurItemId-1000)/1000);
1475cdf0e10cSrcweir 		if ( nTempMonthOff < nNewMonth )
1476cdf0e10cSrcweir 			nNewMonth = nNewMonth - nTempMonthOff;
1477cdf0e10cSrcweir 		else
1478cdf0e10cSrcweir 		{
1479cdf0e10cSrcweir 			nNewYear--;
1480cdf0e10cSrcweir 			nNewMonth = 12-(nTempMonthOff-nNewMonth);
1481cdf0e10cSrcweir 		}
1482cdf0e10cSrcweir 		nNewYear = nNewYear - nTempYearOff;
1483cdf0e10cSrcweir 		SetFirstDate( Date( 1, nNewMonth, nNewYear ) );
1484cdf0e10cSrcweir 	}
1485cdf0e10cSrcweir }
1486cdf0e10cSrcweir 
1487cdf0e10cSrcweir // -----------------------------------------------------------------------
1488cdf0e10cSrcweir 
ImplTracking(const Point & rPos,sal_Bool bRepeat)1489cdf0e10cSrcweir void Calendar::ImplTracking( const Point& rPos, sal_Bool bRepeat )
1490cdf0e10cSrcweir {
1491cdf0e10cSrcweir 	Date	aTempDate = maCurDate;
1492cdf0e10cSrcweir 	sal_uInt16	nHitTest = ImplHitTest( rPos, aTempDate );
1493cdf0e10cSrcweir 
1494cdf0e10cSrcweir 	if ( mbSpinDown )
1495cdf0e10cSrcweir 	{
1496cdf0e10cSrcweir 		mbPrevIn = (nHitTest & CALENDAR_HITTEST_PREV) != 0;
1497cdf0e10cSrcweir 		mbNextIn = (nHitTest & CALENDAR_HITTEST_NEXT) != 0;
1498cdf0e10cSrcweir 
1499cdf0e10cSrcweir 		if ( bRepeat && (mbPrevIn || mbNextIn) )
1500cdf0e10cSrcweir 		{
1501cdf0e10cSrcweir 			mbScrollDateRange = sal_True;
1502cdf0e10cSrcweir 			ImplScroll( mbPrevIn );
1503cdf0e10cSrcweir 			mbScrollDateRange = sal_False;
1504cdf0e10cSrcweir 		}
1505cdf0e10cSrcweir 	}
1506cdf0e10cSrcweir 	else
1507cdf0e10cSrcweir 		ImplMouseSelect( aTempDate, nHitTest, sal_True, sal_False, sal_False );
1508cdf0e10cSrcweir }
1509cdf0e10cSrcweir 
1510cdf0e10cSrcweir // -----------------------------------------------------------------------
1511cdf0e10cSrcweir 
ImplEndTracking(sal_Bool bCancel)1512cdf0e10cSrcweir void Calendar::ImplEndTracking( sal_Bool bCancel )
1513cdf0e10cSrcweir {
1514cdf0e10cSrcweir 	sal_Bool bSelection = mbSelection;
1515cdf0e10cSrcweir 	sal_Bool bSpinDown = mbSpinDown;
1516cdf0e10cSrcweir 
1517cdf0e10cSrcweir 	mbDrag				= sal_False;
1518cdf0e10cSrcweir 	mbSelection 		= sal_False;
1519cdf0e10cSrcweir 	mbMultiSelection	= sal_False;
1520cdf0e10cSrcweir 	mbUnSel 			= sal_False;
1521cdf0e10cSrcweir 	mbSpinDown			= sal_False;
1522cdf0e10cSrcweir 	mbPrevIn			= sal_False;
1523cdf0e10cSrcweir 	mbNextIn			= sal_False;
1524cdf0e10cSrcweir 
1525cdf0e10cSrcweir 	if ( bCancel )
1526cdf0e10cSrcweir 	{
1527cdf0e10cSrcweir 		if ( maOldFirstDate != maFirstDate )
1528cdf0e10cSrcweir 			SetFirstDate( maOldFirstDate );
1529cdf0e10cSrcweir 
1530cdf0e10cSrcweir 		if ( !bSpinDown )
1531cdf0e10cSrcweir 		{
1532cdf0e10cSrcweir 			Table*	pOldSel = new Table( *mpSelectTable );
1533cdf0e10cSrcweir 			Date	aOldDate = maCurDate;
1534cdf0e10cSrcweir 			maCurDate		= maOldCurDate;
1535cdf0e10cSrcweir 			*mpSelectTable	= *mpOldSelectTable;
1536cdf0e10cSrcweir 			HideFocus();
1537cdf0e10cSrcweir 			ImplUpdateSelection( pOldSel );
1538cdf0e10cSrcweir 			if ( !pOldSel->Get( aOldDate.GetDate() ) )
1539cdf0e10cSrcweir 				ImplUpdateDate( aOldDate );
1540cdf0e10cSrcweir 			// Damit Focus-Rechteck auch wieder neu ausgegeben wird
1541cdf0e10cSrcweir 			if ( HasFocus() || !mpSelectTable->Get( maCurDate.GetDate() ) )
1542cdf0e10cSrcweir 				ImplUpdateDate( maCurDate );
1543cdf0e10cSrcweir 			delete pOldSel;
1544cdf0e10cSrcweir 		}
1545cdf0e10cSrcweir 	}
1546cdf0e10cSrcweir 
1547cdf0e10cSrcweir 	if ( !bSpinDown )
1548cdf0e10cSrcweir 	{
1549cdf0e10cSrcweir 		if ( !bCancel )
1550cdf0e10cSrcweir 		{
1551cdf0e10cSrcweir 			// Feststellen, ob wir sichtbaren Bereich scrollen sollen
1552cdf0e10cSrcweir 			sal_uLong nSelCount = mpSelectTable->Count();
1553cdf0e10cSrcweir 			if ( nSelCount )
1554cdf0e10cSrcweir 			{
1555cdf0e10cSrcweir 				Date aFirstSelDate( mpSelectTable->GetObjectKey( 0 ) );
1556cdf0e10cSrcweir 				Date aLastSelDate( mpSelectTable->GetObjectKey( nSelCount-1 ) );
1557cdf0e10cSrcweir 				if ( aLastSelDate < GetFirstMonth() )
1558cdf0e10cSrcweir 					ImplScroll( sal_True );
1559cdf0e10cSrcweir 				else if ( GetLastMonth() < aFirstSelDate )
1560cdf0e10cSrcweir 					ImplScroll( sal_False );
1561cdf0e10cSrcweir 			}
1562cdf0e10cSrcweir 		}
1563cdf0e10cSrcweir 
1564cdf0e10cSrcweir 		if ( mbAllSel ||
1565cdf0e10cSrcweir 			 (!bCancel && ((maCurDate != maOldCurDate) || (*mpOldSelectTable != *mpSelectTable))) )
1566cdf0e10cSrcweir 			Select();
1567cdf0e10cSrcweir 
1568cdf0e10cSrcweir 		if ( !bSelection && (mnWinStyle & WB_TABSTOP) && !bCancel )
1569cdf0e10cSrcweir 			GrabFocus();
1570cdf0e10cSrcweir 
1571cdf0e10cSrcweir 		delete mpOldSelectTable;
1572cdf0e10cSrcweir 		mpOldSelectTable = NULL;
1573cdf0e10cSrcweir 		delete mpRestoreSelectTable;
1574cdf0e10cSrcweir 		mpRestoreSelectTable = NULL;
1575cdf0e10cSrcweir 	}
1576cdf0e10cSrcweir }
1577cdf0e10cSrcweir 
1578cdf0e10cSrcweir // -----------------------------------------------------------------------
1579cdf0e10cSrcweir 
IMPL_STATIC_LINK(Calendar,ScrollHdl,Timer *,EMPTYARG)1580cdf0e10cSrcweir IMPL_STATIC_LINK( Calendar, ScrollHdl, Timer*, EMPTYARG )
1581cdf0e10cSrcweir {
1582cdf0e10cSrcweir 	sal_Bool bPrevIn = (pThis->mnDragScrollHitTest & CALENDAR_HITTEST_PREV) != 0;
1583cdf0e10cSrcweir 	sal_Bool bNextIn = (pThis->mnDragScrollHitTest & CALENDAR_HITTEST_NEXT) != 0;
1584cdf0e10cSrcweir 	if( bNextIn || bPrevIn )
1585cdf0e10cSrcweir 	{
1586cdf0e10cSrcweir 		pThis->mbScrollDateRange = sal_True;
1587cdf0e10cSrcweir 		pThis->ImplScroll( bPrevIn );
1588cdf0e10cSrcweir 		pThis->mbScrollDateRange = sal_False;
1589cdf0e10cSrcweir 	}
1590cdf0e10cSrcweir 	return 0;
1591cdf0e10cSrcweir }
1592cdf0e10cSrcweir 
1593cdf0e10cSrcweir // -----------------------------------------------------------------------
1594cdf0e10cSrcweir 
MouseButtonDown(const MouseEvent & rMEvt)1595cdf0e10cSrcweir void Calendar::MouseButtonDown( const MouseEvent& rMEvt )
1596cdf0e10cSrcweir {
1597cdf0e10cSrcweir 	if ( rMEvt.IsLeft() && !mbMenuDown )
1598cdf0e10cSrcweir 	{
1599cdf0e10cSrcweir 		Date	aTempDate = maCurDate;
1600cdf0e10cSrcweir 		sal_uInt16	nHitTest = ImplHitTest( rMEvt.GetPosPixel(), aTempDate );
1601cdf0e10cSrcweir 		if ( nHitTest )
1602cdf0e10cSrcweir 		{
1603cdf0e10cSrcweir 			if ( nHitTest & CALENDAR_HITTEST_MONTHTITLE )
1604cdf0e10cSrcweir 				ImplShowMenu( rMEvt.GetPosPixel(), aTempDate );
1605cdf0e10cSrcweir 			else
1606cdf0e10cSrcweir 			{
1607cdf0e10cSrcweir 				maOldFirstDate = maFirstDate;
1608cdf0e10cSrcweir 
1609cdf0e10cSrcweir 				mbPrevIn = (nHitTest & CALENDAR_HITTEST_PREV) != 0;
1610cdf0e10cSrcweir 				mbNextIn = (nHitTest & CALENDAR_HITTEST_NEXT) != 0;
1611cdf0e10cSrcweir 				if ( mbPrevIn || mbNextIn )
1612cdf0e10cSrcweir 				{
1613cdf0e10cSrcweir 					mbSpinDown = sal_True;
1614cdf0e10cSrcweir 					mbScrollDateRange = sal_True;
1615cdf0e10cSrcweir 					ImplScroll( mbPrevIn );
1616cdf0e10cSrcweir 					mbScrollDateRange = sal_False;
1617cdf0e10cSrcweir 					// Hier muss BUTTONREPEAT stehen, also nicht wieder
1618cdf0e10cSrcweir 					// auf SCROLLREPEAT aendern, sondern mit TH abklaeren,
1619cdf0e10cSrcweir 					// warum es evtl. anders sein sollte (71775)
1620cdf0e10cSrcweir 					StartTracking( STARTTRACK_BUTTONREPEAT );
1621cdf0e10cSrcweir 				}
1622cdf0e10cSrcweir 				else
1623cdf0e10cSrcweir 				{
1624cdf0e10cSrcweir 					if ( (rMEvt.GetClicks() == 2) && (nHitTest & CALENDAR_HITTEST_DAY) )
1625cdf0e10cSrcweir 						DoubleClick();
1626cdf0e10cSrcweir 					else
1627cdf0e10cSrcweir 					{
1628cdf0e10cSrcweir 						if ( mpOldSelectTable )
1629cdf0e10cSrcweir 							delete mpOldSelectTable;
1630cdf0e10cSrcweir 						maOldCurDate = maCurDate;
1631cdf0e10cSrcweir 						mpOldSelectTable = new Table( *mpSelectTable );
1632cdf0e10cSrcweir 
1633cdf0e10cSrcweir 						if ( !mbSelection )
1634cdf0e10cSrcweir 						{
1635cdf0e10cSrcweir 							mbDrag = sal_True;
1636cdf0e10cSrcweir 							StartTracking();
1637cdf0e10cSrcweir 						}
1638cdf0e10cSrcweir 
1639cdf0e10cSrcweir 						mbMultiSelection = (mnWinStyle & (WB_MULTISELECT | WB_RANGESELECT)) != 0;
1640cdf0e10cSrcweir 						if ( (nHitTest & CALENDAR_HITTEST_DAY) && mbMultiSelection )
1641cdf0e10cSrcweir 							mbWeekSel = sal_True;
1642cdf0e10cSrcweir 						else
1643cdf0e10cSrcweir 							mbWeekSel = sal_False;
1644cdf0e10cSrcweir 						ImplMouseSelect( aTempDate, nHitTest, sal_False, rMEvt.IsShift(), rMEvt.IsMod1() );
1645cdf0e10cSrcweir 					}
1646cdf0e10cSrcweir 				}
1647cdf0e10cSrcweir 			}
1648cdf0e10cSrcweir 		}
1649cdf0e10cSrcweir 
1650cdf0e10cSrcweir 		return;
1651cdf0e10cSrcweir 	}
1652cdf0e10cSrcweir 
1653cdf0e10cSrcweir 	Control::MouseButtonDown( rMEvt );
1654cdf0e10cSrcweir }
1655cdf0e10cSrcweir 
1656cdf0e10cSrcweir // -----------------------------------------------------------------------
1657cdf0e10cSrcweir 
MouseButtonUp(const MouseEvent & rMEvt)1658cdf0e10cSrcweir void Calendar::MouseButtonUp( const MouseEvent& rMEvt )
1659cdf0e10cSrcweir {
1660cdf0e10cSrcweir 	if ( rMEvt.IsLeft() && mbSelection )
1661cdf0e10cSrcweir 		ImplEndTracking( sal_False );
1662cdf0e10cSrcweir 	else
1663cdf0e10cSrcweir 		Control::MouseButtonUp( rMEvt );
1664cdf0e10cSrcweir }
1665cdf0e10cSrcweir 
1666cdf0e10cSrcweir // -----------------------------------------------------------------------
1667cdf0e10cSrcweir 
MouseMove(const MouseEvent & rMEvt)1668cdf0e10cSrcweir void Calendar::MouseMove( const MouseEvent& rMEvt )
1669cdf0e10cSrcweir {
1670cdf0e10cSrcweir 	if ( mbSelection && rMEvt.GetButtons() )
1671cdf0e10cSrcweir 		ImplTracking( rMEvt.GetPosPixel(), sal_False );
1672cdf0e10cSrcweir 	else
1673cdf0e10cSrcweir 		Control::MouseMove( rMEvt );
1674cdf0e10cSrcweir }
1675cdf0e10cSrcweir 
1676cdf0e10cSrcweir // -----------------------------------------------------------------------
1677cdf0e10cSrcweir 
Tracking(const TrackingEvent & rTEvt)1678cdf0e10cSrcweir void Calendar::Tracking( const TrackingEvent& rTEvt )
1679cdf0e10cSrcweir {
1680cdf0e10cSrcweir 	Point aMousePos = rTEvt.GetMouseEvent().GetPosPixel();
1681cdf0e10cSrcweir 
1682cdf0e10cSrcweir 	if ( rTEvt.IsTrackingEnded() )
1683cdf0e10cSrcweir 		ImplEndTracking( rTEvt.IsTrackingCanceled() );
1684cdf0e10cSrcweir 	else
1685cdf0e10cSrcweir 		ImplTracking( aMousePos, rTEvt.IsTrackingRepeat() );
1686cdf0e10cSrcweir }
1687cdf0e10cSrcweir 
1688cdf0e10cSrcweir // -----------------------------------------------------------------------
1689cdf0e10cSrcweir 
KeyInput(const KeyEvent & rKEvt)1690cdf0e10cSrcweir void Calendar::KeyInput( const KeyEvent& rKEvt )
1691cdf0e10cSrcweir {
1692cdf0e10cSrcweir 	Date	aNewDate = maCurDate;
1693cdf0e10cSrcweir 	sal_Bool	bMultiSel = (mnWinStyle & (WB_RANGESELECT | WB_MULTISELECT)) != 0;
1694cdf0e10cSrcweir 	sal_Bool	bExpand = rKEvt.GetKeyCode().IsShift();
1695cdf0e10cSrcweir 	sal_Bool	bExtended = rKEvt.GetKeyCode().IsMod1();
1696cdf0e10cSrcweir 
1697cdf0e10cSrcweir 	switch ( rKEvt.GetKeyCode().GetCode() )
1698cdf0e10cSrcweir 	{
1699cdf0e10cSrcweir 		case KEY_HOME:
1700cdf0e10cSrcweir 			aNewDate.SetDay( 1 );
1701cdf0e10cSrcweir 			break;
1702cdf0e10cSrcweir 
1703cdf0e10cSrcweir 		case KEY_END:
1704cdf0e10cSrcweir 			aNewDate.SetDay( aNewDate.GetDaysInMonth() );
1705cdf0e10cSrcweir 			break;
1706cdf0e10cSrcweir 
1707cdf0e10cSrcweir 		case KEY_LEFT:
1708cdf0e10cSrcweir 			aNewDate--;
1709cdf0e10cSrcweir 			break;
1710cdf0e10cSrcweir 
1711cdf0e10cSrcweir 		case KEY_RIGHT:
1712cdf0e10cSrcweir 			aNewDate++;
1713cdf0e10cSrcweir 			break;
1714cdf0e10cSrcweir 
1715cdf0e10cSrcweir 		case KEY_UP:
1716cdf0e10cSrcweir 			aNewDate -= 7;
1717cdf0e10cSrcweir 			break;
1718cdf0e10cSrcweir 
1719cdf0e10cSrcweir 		case KEY_DOWN:
1720cdf0e10cSrcweir 			aNewDate += 7;
1721cdf0e10cSrcweir 			break;
1722cdf0e10cSrcweir 
1723cdf0e10cSrcweir 		case KEY_PAGEUP:
1724cdf0e10cSrcweir 			{
1725cdf0e10cSrcweir 			Date aTempDate = aNewDate;
1726cdf0e10cSrcweir 			aTempDate -= aNewDate.GetDay()+1;
1727cdf0e10cSrcweir 			aNewDate -= aTempDate.GetDaysInMonth();
1728cdf0e10cSrcweir 			}
1729cdf0e10cSrcweir 			break;
1730cdf0e10cSrcweir 
1731cdf0e10cSrcweir 		case KEY_PAGEDOWN:
1732cdf0e10cSrcweir 			aNewDate += aNewDate.GetDaysInMonth();
1733cdf0e10cSrcweir 			break;
1734cdf0e10cSrcweir 
1735cdf0e10cSrcweir 		case KEY_SPACE:
1736cdf0e10cSrcweir 			if ( bMultiSel && !(mnWinStyle & WB_RANGESELECT) )
1737cdf0e10cSrcweir 			{
1738cdf0e10cSrcweir 				if ( !bExpand )
1739cdf0e10cSrcweir 				{
1740cdf0e10cSrcweir 					sal_Bool bDateSel = IsDateSelected( maCurDate );
1741cdf0e10cSrcweir 					SelectDate( maCurDate, !bDateSel );
1742cdf0e10cSrcweir 					mbSelLeft = sal_False;
1743cdf0e10cSrcweir 					SelectionChanging();
1744cdf0e10cSrcweir 					mbTravelSelect = sal_True;
1745cdf0e10cSrcweir 					Select();
1746cdf0e10cSrcweir 					mbTravelSelect = sal_False;
1747cdf0e10cSrcweir 				}
1748cdf0e10cSrcweir 			}
1749cdf0e10cSrcweir 			else
1750cdf0e10cSrcweir 				Control::KeyInput( rKEvt );
1751cdf0e10cSrcweir 			break;
1752cdf0e10cSrcweir 
1753cdf0e10cSrcweir 		default:
1754cdf0e10cSrcweir 			Control::KeyInput( rKEvt );
1755cdf0e10cSrcweir 			break;
1756cdf0e10cSrcweir 	}
1757cdf0e10cSrcweir 
1758cdf0e10cSrcweir 	if ( aNewDate != maCurDate )
1759cdf0e10cSrcweir 	{
1760cdf0e10cSrcweir 		if ( bMultiSel && bExpand )
1761cdf0e10cSrcweir 		{
1762cdf0e10cSrcweir 			Table* pOldSel = new Table( *mpSelectTable );
1763cdf0e10cSrcweir 			Date aOldAnchorDate = maAnchorDate;
1764cdf0e10cSrcweir 			mbSelLeft = aNewDate < maAnchorDate;
1765cdf0e10cSrcweir 			if ( !bExtended )
1766cdf0e10cSrcweir 			{
1767cdf0e10cSrcweir 				if ( mbSelLeft )
1768cdf0e10cSrcweir 				{
1769cdf0e10cSrcweir 					ImplCalendarSelectDateRange( mpSelectTable, Date( 1, 1, 0 ), aNewDate, sal_False );
1770cdf0e10cSrcweir 					ImplCalendarSelectDateRange( mpSelectTable, maAnchorDate, Date( 31, 12, 9999 ), sal_False );
1771cdf0e10cSrcweir 				}
1772cdf0e10cSrcweir 				else
1773cdf0e10cSrcweir 				{
1774cdf0e10cSrcweir 					ImplCalendarSelectDateRange( mpSelectTable, Date( 1, 1, 0 ), maAnchorDate, sal_False );
1775cdf0e10cSrcweir 					ImplCalendarSelectDateRange( mpSelectTable, aNewDate, Date( 31, 12, 9999 ), sal_False );
1776cdf0e10cSrcweir 				}
1777cdf0e10cSrcweir 			}
1778cdf0e10cSrcweir 			ImplCalendarSelectDateRange( mpSelectTable, aNewDate, maAnchorDate, sal_True );
1779cdf0e10cSrcweir 			mbDirect = sal_True;
1780cdf0e10cSrcweir 			SetCurDate( aNewDate );
1781cdf0e10cSrcweir 			mbDirect = sal_False;
1782cdf0e10cSrcweir 			maAnchorDate = aOldAnchorDate;
1783cdf0e10cSrcweir 			mbInSelChange = sal_True;
1784cdf0e10cSrcweir 			SelectionChanging();
1785cdf0e10cSrcweir 			mbInSelChange = sal_False;
1786cdf0e10cSrcweir 			ImplUpdateSelection( pOldSel );
1787cdf0e10cSrcweir             delete pOldSel;
1788cdf0e10cSrcweir 		}
1789cdf0e10cSrcweir 		else
1790cdf0e10cSrcweir 		{
1791cdf0e10cSrcweir 			if ( mnWinStyle & WB_RANGESELECT )
1792cdf0e10cSrcweir 			{
1793cdf0e10cSrcweir 				SetNoSelection();
1794cdf0e10cSrcweir 				SelectDate( aNewDate, sal_True );
1795cdf0e10cSrcweir 			}
1796cdf0e10cSrcweir 			mbDirect = sal_True;
1797cdf0e10cSrcweir 			SetCurDate( aNewDate );
1798cdf0e10cSrcweir 			mbDirect = sal_False;
1799cdf0e10cSrcweir 		}
1800cdf0e10cSrcweir 		mbTravelSelect = sal_True;
1801cdf0e10cSrcweir 		Select();
1802cdf0e10cSrcweir 		mbTravelSelect = sal_False;
1803cdf0e10cSrcweir 	}
1804cdf0e10cSrcweir }
1805cdf0e10cSrcweir 
1806cdf0e10cSrcweir // -----------------------------------------------------------------------
1807cdf0e10cSrcweir 
Paint(const Rectangle &)1808cdf0e10cSrcweir void Calendar::Paint( const Rectangle& )
1809cdf0e10cSrcweir {
1810cdf0e10cSrcweir 	ImplDraw( sal_True );
1811cdf0e10cSrcweir }
1812cdf0e10cSrcweir 
1813cdf0e10cSrcweir // -----------------------------------------------------------------------
1814cdf0e10cSrcweir 
GetFocus()1815cdf0e10cSrcweir void Calendar::GetFocus()
1816cdf0e10cSrcweir {
1817cdf0e10cSrcweir 	ImplUpdateDate( maCurDate );
1818cdf0e10cSrcweir 	Control::GetFocus();
1819cdf0e10cSrcweir }
1820cdf0e10cSrcweir 
1821cdf0e10cSrcweir // -----------------------------------------------------------------------
1822cdf0e10cSrcweir 
LoseFocus()1823cdf0e10cSrcweir void Calendar::LoseFocus()
1824cdf0e10cSrcweir {
1825cdf0e10cSrcweir 	HideFocus();
1826cdf0e10cSrcweir 	Control::LoseFocus();
1827cdf0e10cSrcweir }
1828cdf0e10cSrcweir 
1829cdf0e10cSrcweir // -----------------------------------------------------------------------
1830cdf0e10cSrcweir 
Resize()1831cdf0e10cSrcweir void Calendar::Resize()
1832cdf0e10cSrcweir {
1833cdf0e10cSrcweir 	ImplUpdate( sal_True );
1834cdf0e10cSrcweir 	Control::Resize();
1835cdf0e10cSrcweir }
1836cdf0e10cSrcweir 
1837cdf0e10cSrcweir // -----------------------------------------------------------------------
1838cdf0e10cSrcweir 
RequestHelp(const HelpEvent & rHEvt)1839cdf0e10cSrcweir void Calendar::RequestHelp( const HelpEvent& rHEvt )
1840cdf0e10cSrcweir {
1841cdf0e10cSrcweir 	if ( rHEvt.GetMode() & (HELPMODE_QUICK | HELPMODE_BALLOON) )
1842cdf0e10cSrcweir 	{
1843cdf0e10cSrcweir 		Date aDate = maCurDate;
1844cdf0e10cSrcweir 		if ( GetDate( ScreenToOutputPixel( rHEvt.GetMousePosPixel() ), aDate ) )
1845cdf0e10cSrcweir 		{
1846cdf0e10cSrcweir 			Rectangle aDateRect = GetDateRect( aDate );
1847cdf0e10cSrcweir 			Point aPt = OutputToScreenPixel( aDateRect.TopLeft() );
1848cdf0e10cSrcweir 			aDateRect.Left()   = aPt.X();
1849cdf0e10cSrcweir 			aDateRect.Top()    = aPt.Y();
1850cdf0e10cSrcweir 			aPt = OutputToScreenPixel( aDateRect.BottomRight() );
1851cdf0e10cSrcweir 			aDateRect.Right()  = aPt.X();
1852cdf0e10cSrcweir 			aDateRect.Bottom() = aPt.Y();
1853cdf0e10cSrcweir 
1854cdf0e10cSrcweir 			if ( (rHEvt.GetMode() & HELPMODE_BALLOON) || (mnWinStyle & WB_QUICKHELPSHOWSDATEINFO) )
1855cdf0e10cSrcweir 			{
1856cdf0e10cSrcweir 				ImplDateInfo* pInfo;
1857cdf0e10cSrcweir 				if ( mpDateTable )
1858cdf0e10cSrcweir 				{
1859cdf0e10cSrcweir 					pInfo = mpDateTable->Get( aDate.GetDate() );
1860cdf0e10cSrcweir 					if ( !pInfo )
1861cdf0e10cSrcweir 						pInfo = mpDateTable->Get( Date( aDate.GetDay(), aDate.GetMonth(), 0 ).GetDate() );
1862cdf0e10cSrcweir 				}
1863cdf0e10cSrcweir 				else
1864cdf0e10cSrcweir 					pInfo = NULL;
1865cdf0e10cSrcweir 				if ( pInfo )
1866cdf0e10cSrcweir 				{
1867cdf0e10cSrcweir 					XubString aStr = pInfo->maText;
1868cdf0e10cSrcweir 					if ( aStr.Len() )
1869cdf0e10cSrcweir 					{
1870cdf0e10cSrcweir 						Help::ShowBalloon( this, rHEvt.GetMousePosPixel(), aDateRect, aStr );
1871cdf0e10cSrcweir 						return;
1872cdf0e10cSrcweir 					}
1873cdf0e10cSrcweir 				}
1874cdf0e10cSrcweir 			}
1875cdf0e10cSrcweir 
1876cdf0e10cSrcweir 			if ( rHEvt.GetMode() & HELPMODE_QUICK )
1877cdf0e10cSrcweir 			{
1878cdf0e10cSrcweir                 maCalendarWrapper.setGregorianDateTime( aDate);
1879cdf0e10cSrcweir                 sal_uInt16      nWeek = (sal_uInt16) maCalendarWrapper.getValue( i18n::CalendarFieldIndex::WEEK_OF_YEAR);
1880cdf0e10cSrcweir 				sal_uInt16		nMonth = aDate.GetMonth();
1881cdf0e10cSrcweir 				XubString	aStr( maDayText );
1882cdf0e10cSrcweir 				aStr.AppendAscii( ": " );
1883cdf0e10cSrcweir 				aStr.Append( XubString::CreateFromInt32( aDate.GetDayOfYear() ) );
1884cdf0e10cSrcweir 				aStr.AppendAscii( " / " );
1885cdf0e10cSrcweir 				aStr.Append( maWeekText );
1886cdf0e10cSrcweir 				aStr.AppendAscii( ": " );
1887cdf0e10cSrcweir 				aStr.Append( XubString::CreateFromInt32( nWeek ) );
1888cdf0e10cSrcweir 				// Evt. noch Jahr hinzufuegen, wenn es nicht das gleiche ist
1889cdf0e10cSrcweir 				if ( (nMonth == 12) && (nWeek == 1) )
1890cdf0e10cSrcweir 				{
1891cdf0e10cSrcweir 					aStr.AppendAscii( ",  " );
1892cdf0e10cSrcweir 					aStr.Append( XubString::CreateFromInt32( aDate.GetYear()+1 ) );
1893cdf0e10cSrcweir 				}
1894cdf0e10cSrcweir 				else if ( (nMonth == 1) && (nWeek > 50) )
1895cdf0e10cSrcweir 				{
1896cdf0e10cSrcweir 					aStr.AppendAscii( ", " );
1897cdf0e10cSrcweir 					aStr.Append( XubString::CreateFromInt32( aDate.GetYear()-1 ) );
1898cdf0e10cSrcweir 				}
1899cdf0e10cSrcweir 				Help::ShowQuickHelp( this, aDateRect, aStr );
1900cdf0e10cSrcweir 				return;
1901cdf0e10cSrcweir 			}
1902cdf0e10cSrcweir 		}
1903cdf0e10cSrcweir 	}
1904cdf0e10cSrcweir 
1905cdf0e10cSrcweir 	Control::RequestHelp( rHEvt );
1906cdf0e10cSrcweir }
1907cdf0e10cSrcweir 
1908cdf0e10cSrcweir // -----------------------------------------------------------------------
1909cdf0e10cSrcweir 
Command(const CommandEvent & rCEvt)1910cdf0e10cSrcweir void Calendar::Command( const CommandEvent& rCEvt )
1911cdf0e10cSrcweir {
1912cdf0e10cSrcweir 	if ( rCEvt.GetCommand() == COMMAND_CONTEXTMENU )
1913cdf0e10cSrcweir 	{
1914cdf0e10cSrcweir 		if ( !mbSelection && rCEvt.IsMouseEvent() )
1915cdf0e10cSrcweir 		{
1916cdf0e10cSrcweir 			Date	aTempDate = maCurDate;
1917cdf0e10cSrcweir 			sal_uInt16	nHitTest = ImplHitTest( rCEvt.GetMousePosPixel(), aTempDate );
1918cdf0e10cSrcweir 			if ( nHitTest & CALENDAR_HITTEST_MONTHTITLE )
1919cdf0e10cSrcweir 			{
1920cdf0e10cSrcweir 				ImplShowMenu( rCEvt.GetMousePosPixel(), aTempDate );
1921cdf0e10cSrcweir 				return;
1922cdf0e10cSrcweir 			}
1923cdf0e10cSrcweir 		}
1924cdf0e10cSrcweir 	}
1925cdf0e10cSrcweir 	else if ( rCEvt.GetCommand() == COMMAND_WHEEL )
1926cdf0e10cSrcweir 	{
1927cdf0e10cSrcweir 		const CommandWheelData* pData = rCEvt.GetWheelData();
1928cdf0e10cSrcweir 		if ( pData->GetMode() == COMMAND_WHEEL_SCROLL )
1929cdf0e10cSrcweir 		{
1930cdf0e10cSrcweir 			long nNotchDelta = pData->GetNotchDelta();
1931cdf0e10cSrcweir 			if ( nNotchDelta < 0 )
1932cdf0e10cSrcweir 			{
1933cdf0e10cSrcweir 				while ( nNotchDelta < 0 )
1934cdf0e10cSrcweir 				{
1935cdf0e10cSrcweir 					ImplScroll( sal_True );
1936cdf0e10cSrcweir 					nNotchDelta++;
1937cdf0e10cSrcweir 				}
1938cdf0e10cSrcweir 			}
1939cdf0e10cSrcweir 			else
1940cdf0e10cSrcweir 			{
1941cdf0e10cSrcweir 				while ( nNotchDelta > 0 )
1942cdf0e10cSrcweir 				{
1943cdf0e10cSrcweir 					ImplScroll( sal_False );
1944cdf0e10cSrcweir 					nNotchDelta--;
1945cdf0e10cSrcweir 				}
1946cdf0e10cSrcweir 			}
1947cdf0e10cSrcweir 
1948cdf0e10cSrcweir 			return;
1949cdf0e10cSrcweir 		}
1950cdf0e10cSrcweir 	}
1951cdf0e10cSrcweir 
1952cdf0e10cSrcweir 	Control::Command( rCEvt );
1953cdf0e10cSrcweir }
1954cdf0e10cSrcweir 
1955cdf0e10cSrcweir // -----------------------------------------------------------------------
1956cdf0e10cSrcweir 
StateChanged(StateChangedType nType)1957cdf0e10cSrcweir void Calendar::StateChanged( StateChangedType nType )
1958cdf0e10cSrcweir {
1959cdf0e10cSrcweir 	Control::StateChanged( nType );
1960cdf0e10cSrcweir 
1961cdf0e10cSrcweir 	if ( nType == STATE_CHANGE_INITSHOW )
1962cdf0e10cSrcweir 		ImplFormat();
1963cdf0e10cSrcweir }
1964cdf0e10cSrcweir 
1965cdf0e10cSrcweir // -----------------------------------------------------------------------
1966cdf0e10cSrcweir 
DataChanged(const DataChangedEvent & rDCEvt)1967cdf0e10cSrcweir void Calendar::DataChanged( const DataChangedEvent& rDCEvt )
1968cdf0e10cSrcweir {
1969cdf0e10cSrcweir 	Control::DataChanged( rDCEvt );
1970cdf0e10cSrcweir 
1971cdf0e10cSrcweir 	if ( (rDCEvt.GetType() == DATACHANGED_FONTS) ||
1972cdf0e10cSrcweir 		 (rDCEvt.GetType() == DATACHANGED_FONTSUBSTITUTION) ||
1973cdf0e10cSrcweir 		 ((rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
1974cdf0e10cSrcweir 		  (rDCEvt.GetFlags() & SETTINGS_STYLE)) )
1975cdf0e10cSrcweir 	{
1976cdf0e10cSrcweir 		ImplInitSettings();
1977cdf0e10cSrcweir 		Invalidate();
1978cdf0e10cSrcweir 	}
1979cdf0e10cSrcweir }
1980cdf0e10cSrcweir 
1981cdf0e10cSrcweir // -----------------------------------------------------------------------
1982cdf0e10cSrcweir 
SelectionChanging()1983cdf0e10cSrcweir void Calendar::SelectionChanging()
1984cdf0e10cSrcweir {
1985cdf0e10cSrcweir 	maSelectionChangingHdl.Call( this );
1986cdf0e10cSrcweir }
1987cdf0e10cSrcweir 
1988cdf0e10cSrcweir // -----------------------------------------------------------------------
1989cdf0e10cSrcweir 
DateRangeChanged()1990cdf0e10cSrcweir void Calendar::DateRangeChanged()
1991cdf0e10cSrcweir {
1992cdf0e10cSrcweir 	maDateRangeChangedHdl.Call( this );
1993cdf0e10cSrcweir }
1994cdf0e10cSrcweir 
1995cdf0e10cSrcweir // -----------------------------------------------------------------------
1996cdf0e10cSrcweir 
RequestDateInfo()1997cdf0e10cSrcweir void Calendar::RequestDateInfo()
1998cdf0e10cSrcweir {
1999cdf0e10cSrcweir 	maRequestDateInfoHdl.Call( this );
2000cdf0e10cSrcweir }
2001cdf0e10cSrcweir 
2002cdf0e10cSrcweir // -----------------------------------------------------------------------
2003cdf0e10cSrcweir 
DoubleClick()2004cdf0e10cSrcweir void Calendar::DoubleClick()
2005cdf0e10cSrcweir {
2006cdf0e10cSrcweir 	maDoubleClickHdl.Call( this );
2007cdf0e10cSrcweir }
2008cdf0e10cSrcweir 
2009cdf0e10cSrcweir // -----------------------------------------------------------------------
2010cdf0e10cSrcweir 
Select()2011cdf0e10cSrcweir void Calendar::Select()
2012cdf0e10cSrcweir {
2013cdf0e10cSrcweir 	maSelectHdl.Call( this );
2014cdf0e10cSrcweir }
2015cdf0e10cSrcweir 
2016cdf0e10cSrcweir // -----------------------------------------------------------------------
2017cdf0e10cSrcweir 
SelectDate(const Date & rDate,sal_Bool bSelect)2018cdf0e10cSrcweir void Calendar::SelectDate( const Date& rDate, sal_Bool bSelect )
2019cdf0e10cSrcweir {
2020cdf0e10cSrcweir 	if ( !rDate.IsValid() )
2021cdf0e10cSrcweir 		return;
2022cdf0e10cSrcweir 
2023cdf0e10cSrcweir 	Table* pOldSel;
2024cdf0e10cSrcweir 
2025cdf0e10cSrcweir 	if ( !mbInSelChange )
2026cdf0e10cSrcweir 		pOldSel = new Table( *mpSelectTable );
2027cdf0e10cSrcweir 	else
2028cdf0e10cSrcweir 		pOldSel = NULL;
2029cdf0e10cSrcweir 
2030cdf0e10cSrcweir 	ImplCalendarSelectDate( mpSelectTable, rDate, bSelect );
2031cdf0e10cSrcweir 
2032cdf0e10cSrcweir 	if ( pOldSel )
2033cdf0e10cSrcweir 	{
2034cdf0e10cSrcweir 		ImplUpdateSelection( pOldSel );
2035cdf0e10cSrcweir 		delete pOldSel;
2036cdf0e10cSrcweir 	}
2037cdf0e10cSrcweir }
2038cdf0e10cSrcweir 
2039cdf0e10cSrcweir // -----------------------------------------------------------------------
2040cdf0e10cSrcweir 
SelectDateRange(const Date & rStartDate,const Date & rEndDate,sal_Bool bSelect)2041cdf0e10cSrcweir void Calendar::SelectDateRange( const Date& rStartDate, const Date& rEndDate,
2042cdf0e10cSrcweir 								sal_Bool bSelect )
2043cdf0e10cSrcweir {
2044cdf0e10cSrcweir 	if ( !rStartDate.IsValid() || !rEndDate.IsValid() )
2045cdf0e10cSrcweir 		return;
2046cdf0e10cSrcweir 
2047cdf0e10cSrcweir 	Table* pOldSel;
2048cdf0e10cSrcweir 
2049cdf0e10cSrcweir 	if ( !mbInSelChange )
2050cdf0e10cSrcweir 		pOldSel = new Table( *mpSelectTable );
2051cdf0e10cSrcweir 	else
2052cdf0e10cSrcweir 		pOldSel = NULL;
2053cdf0e10cSrcweir 
2054cdf0e10cSrcweir 	ImplCalendarSelectDateRange( mpSelectTable, rStartDate, rEndDate, bSelect );
2055cdf0e10cSrcweir 
2056cdf0e10cSrcweir 	if ( pOldSel )
2057cdf0e10cSrcweir 	{
2058cdf0e10cSrcweir 		ImplUpdateSelection( pOldSel );
2059cdf0e10cSrcweir 		delete pOldSel;
2060cdf0e10cSrcweir 	}
2061cdf0e10cSrcweir }
2062cdf0e10cSrcweir 
2063cdf0e10cSrcweir // -----------------------------------------------------------------------
2064cdf0e10cSrcweir 
SetNoSelection()2065cdf0e10cSrcweir void Calendar::SetNoSelection()
2066cdf0e10cSrcweir {
2067cdf0e10cSrcweir 	Table* pOldSel;
2068cdf0e10cSrcweir 
2069cdf0e10cSrcweir 	if ( !mbInSelChange )
2070cdf0e10cSrcweir 		pOldSel = new Table( *mpSelectTable );
2071cdf0e10cSrcweir 	else
2072cdf0e10cSrcweir 		pOldSel = NULL;
2073cdf0e10cSrcweir 
2074cdf0e10cSrcweir 	ImplCalendarClearSelectDate( mpSelectTable );
2075cdf0e10cSrcweir 
2076cdf0e10cSrcweir 	if ( pOldSel )
2077cdf0e10cSrcweir 	{
2078cdf0e10cSrcweir 		ImplUpdateSelection( pOldSel );
2079cdf0e10cSrcweir 		delete pOldSel;
2080cdf0e10cSrcweir 	}
2081cdf0e10cSrcweir }
2082cdf0e10cSrcweir 
2083cdf0e10cSrcweir // -----------------------------------------------------------------------
2084cdf0e10cSrcweir 
IsDateSelected(const Date & rDate) const2085cdf0e10cSrcweir sal_Bool Calendar::IsDateSelected( const Date& rDate ) const
2086cdf0e10cSrcweir {
2087cdf0e10cSrcweir 	return mpSelectTable->IsKeyValid( rDate.GetDate() );
2088cdf0e10cSrcweir }
2089cdf0e10cSrcweir 
2090cdf0e10cSrcweir // -----------------------------------------------------------------------
2091cdf0e10cSrcweir 
GetSelectDateCount() const2092cdf0e10cSrcweir sal_uLong Calendar::GetSelectDateCount() const
2093cdf0e10cSrcweir {
2094cdf0e10cSrcweir 	return mpSelectTable->Count();
2095cdf0e10cSrcweir }
2096cdf0e10cSrcweir 
2097cdf0e10cSrcweir // -----------------------------------------------------------------------
2098cdf0e10cSrcweir 
GetSelectDate(sal_uLong nIndex) const2099cdf0e10cSrcweir Date Calendar::GetSelectDate( sal_uLong nIndex ) const
2100cdf0e10cSrcweir {
2101cdf0e10cSrcweir 	if ( nIndex < mpSelectTable->Count() )
2102cdf0e10cSrcweir 		return Date( mpSelectTable->GetObjectKey( nIndex ) );
2103cdf0e10cSrcweir 	else
2104cdf0e10cSrcweir 	{
2105cdf0e10cSrcweir 		Date aDate( 0, 0, 0 );
2106cdf0e10cSrcweir 		return aDate;
2107cdf0e10cSrcweir 	}
2108cdf0e10cSrcweir }
2109cdf0e10cSrcweir 
2110cdf0e10cSrcweir // -----------------------------------------------------------------------
2111cdf0e10cSrcweir 
SetCurDate(const Date & rNewDate)2112cdf0e10cSrcweir void Calendar::SetCurDate( const Date& rNewDate )
2113cdf0e10cSrcweir {
2114cdf0e10cSrcweir 	if ( !rNewDate.IsValid() )
2115cdf0e10cSrcweir 		return;
2116cdf0e10cSrcweir 
2117cdf0e10cSrcweir 	if ( maCurDate != rNewDate )
2118cdf0e10cSrcweir 	{
2119cdf0e10cSrcweir 		sal_Bool bUpdate	= IsVisible() && IsUpdateMode();
2120cdf0e10cSrcweir 		Date aOldDate	= maCurDate;
2121cdf0e10cSrcweir 		maCurDate		= rNewDate;
2122cdf0e10cSrcweir 		maAnchorDate	= maCurDate;
2123cdf0e10cSrcweir 
2124cdf0e10cSrcweir 		if ( !(mnWinStyle & (WB_RANGESELECT | WB_MULTISELECT)) )
2125cdf0e10cSrcweir 		{
2126cdf0e10cSrcweir 			ImplCalendarSelectDate( mpSelectTable, aOldDate, sal_False );
2127cdf0e10cSrcweir 			ImplCalendarSelectDate( mpSelectTable, maCurDate, sal_True );
2128cdf0e10cSrcweir 		}
2129cdf0e10cSrcweir 		else if ( !HasFocus() )
2130cdf0e10cSrcweir 			bUpdate = sal_False;
2131cdf0e10cSrcweir 
2132cdf0e10cSrcweir 		// Aktuelles Datum noch in den sichtbaren Bereich verschieben
2133cdf0e10cSrcweir 		if ( mbFormat || (maCurDate < GetFirstMonth()) )
2134cdf0e10cSrcweir 			SetFirstDate( maCurDate );
2135cdf0e10cSrcweir 		else if ( maCurDate > GetLastMonth() )
2136cdf0e10cSrcweir 		{
2137cdf0e10cSrcweir 			Date aTempDate = GetLastMonth();
2138cdf0e10cSrcweir 			long nDateOff = maCurDate-aTempDate;
2139cdf0e10cSrcweir 			if ( nDateOff < 365 )
2140cdf0e10cSrcweir 			{
2141cdf0e10cSrcweir 				Date aFirstDate = GetFirstMonth();
2142cdf0e10cSrcweir 				aFirstDate += aFirstDate.GetDaysInMonth();
2143cdf0e10cSrcweir 				aTempDate++;
2144cdf0e10cSrcweir 				while ( nDateOff > aTempDate.GetDaysInMonth() )
2145cdf0e10cSrcweir 				{
2146cdf0e10cSrcweir 					aFirstDate += aFirstDate.GetDaysInMonth();
2147cdf0e10cSrcweir 					long nDaysInMonth = aTempDate.GetDaysInMonth();
2148cdf0e10cSrcweir 					aTempDate += nDaysInMonth;
2149cdf0e10cSrcweir 					nDateOff -= nDaysInMonth;
2150cdf0e10cSrcweir 				}
2151cdf0e10cSrcweir 				SetFirstDate( aFirstDate );
2152cdf0e10cSrcweir 			}
2153cdf0e10cSrcweir 			else
2154cdf0e10cSrcweir 				SetFirstDate( maCurDate );
2155cdf0e10cSrcweir 		}
2156cdf0e10cSrcweir 		else
2157cdf0e10cSrcweir 		{
2158cdf0e10cSrcweir 			if ( bUpdate )
2159cdf0e10cSrcweir 			{
2160cdf0e10cSrcweir 				HideFocus();
2161cdf0e10cSrcweir 				ImplUpdateDate( aOldDate );
2162cdf0e10cSrcweir 				ImplUpdateDate( maCurDate );
2163cdf0e10cSrcweir 			}
2164cdf0e10cSrcweir 		}
2165cdf0e10cSrcweir 	}
2166cdf0e10cSrcweir }
2167cdf0e10cSrcweir 
2168cdf0e10cSrcweir // -----------------------------------------------------------------------
2169cdf0e10cSrcweir 
SetFirstDate(const Date & rNewFirstDate)2170cdf0e10cSrcweir void Calendar::SetFirstDate( const Date& rNewFirstDate )
2171cdf0e10cSrcweir {
2172cdf0e10cSrcweir 	if ( maFirstDate != rNewFirstDate )
2173cdf0e10cSrcweir 	{
2174cdf0e10cSrcweir 		maFirstDate = Date( 1, rNewFirstDate.GetMonth(), rNewFirstDate.GetYear() );
2175cdf0e10cSrcweir 		mbDropPos = sal_False;
2176cdf0e10cSrcweir 		ImplUpdate();
2177cdf0e10cSrcweir 	}
2178cdf0e10cSrcweir }
2179cdf0e10cSrcweir 
2180cdf0e10cSrcweir // -----------------------------------------------------------------------
2181cdf0e10cSrcweir 
GetFirstMonth() const2182cdf0e10cSrcweir Date Calendar::GetFirstMonth() const
2183cdf0e10cSrcweir {
2184cdf0e10cSrcweir 	if ( maFirstDate.GetDay() > 1 )
2185cdf0e10cSrcweir 	{
2186cdf0e10cSrcweir 		if ( maFirstDate.GetMonth() == 12 )
2187cdf0e10cSrcweir 			return Date( 1, 1, maFirstDate.GetYear()+1 );
2188cdf0e10cSrcweir 		else
2189cdf0e10cSrcweir 			return Date( 1, maFirstDate.GetMonth()+1, maFirstDate.GetYear() );
2190cdf0e10cSrcweir 	}
2191cdf0e10cSrcweir 	else
2192cdf0e10cSrcweir 		return maFirstDate;
2193cdf0e10cSrcweir }
2194cdf0e10cSrcweir 
2195cdf0e10cSrcweir // -----------------------------------------------------------------------
2196cdf0e10cSrcweir 
GetLastMonth() const2197cdf0e10cSrcweir Date Calendar::GetLastMonth() const
2198cdf0e10cSrcweir {
2199cdf0e10cSrcweir 	Date aDate = GetFirstMonth();
2200cdf0e10cSrcweir 	sal_uInt16 nMonthCount = GetMonthCount();
2201cdf0e10cSrcweir 	for ( sal_uInt16 i = 0; i < nMonthCount; i++ )
2202cdf0e10cSrcweir 		aDate += aDate.GetDaysInMonth();
2203cdf0e10cSrcweir 	aDate--;
2204cdf0e10cSrcweir 	return aDate;
2205cdf0e10cSrcweir }
2206cdf0e10cSrcweir 
2207cdf0e10cSrcweir // -----------------------------------------------------------------------
2208cdf0e10cSrcweir 
GetMonthCount() const2209cdf0e10cSrcweir sal_uInt16 Calendar::GetMonthCount() const
2210cdf0e10cSrcweir {
2211cdf0e10cSrcweir 	if ( mbFormat )
2212cdf0e10cSrcweir 		return 1;
2213cdf0e10cSrcweir 	else
2214cdf0e10cSrcweir 		return (sal_uInt16)(mnMonthPerLine*mnLines);
2215cdf0e10cSrcweir }
2216cdf0e10cSrcweir 
2217cdf0e10cSrcweir // -----------------------------------------------------------------------
2218cdf0e10cSrcweir 
GetDropDate(Date & rDate) const2219cdf0e10cSrcweir sal_Bool Calendar::GetDropDate( Date& rDate ) const
2220cdf0e10cSrcweir {
2221cdf0e10cSrcweir 	if( mbDropPos )
2222cdf0e10cSrcweir 	{
2223cdf0e10cSrcweir 		rDate = maDropDate;
2224cdf0e10cSrcweir 		return sal_True;
2225cdf0e10cSrcweir 	}
2226cdf0e10cSrcweir 	return sal_False;
2227cdf0e10cSrcweir }
2228cdf0e10cSrcweir 
2229cdf0e10cSrcweir // -----------------------------------------------------------------------
2230cdf0e10cSrcweir 
GetDate(const Point & rPos,Date & rDate) const2231cdf0e10cSrcweir sal_Bool Calendar::GetDate( const Point& rPos, Date& rDate ) const
2232cdf0e10cSrcweir {
2233cdf0e10cSrcweir 	Date	aDate = maCurDate;
2234cdf0e10cSrcweir 	sal_uInt16	nHitTest = ImplHitTest( rPos, aDate );
2235cdf0e10cSrcweir 	if ( nHitTest & CALENDAR_HITTEST_DAY )
2236cdf0e10cSrcweir 	{
2237cdf0e10cSrcweir 		rDate = aDate;
2238cdf0e10cSrcweir 		return sal_True;
2239cdf0e10cSrcweir 	}
2240cdf0e10cSrcweir 	else
2241cdf0e10cSrcweir 		return sal_False;
2242cdf0e10cSrcweir }
2243cdf0e10cSrcweir 
2244cdf0e10cSrcweir // -----------------------------------------------------------------------
2245cdf0e10cSrcweir 
GetDateRect(const Date & rDate) const2246cdf0e10cSrcweir Rectangle Calendar::GetDateRect( const Date& rDate ) const
2247cdf0e10cSrcweir {
2248cdf0e10cSrcweir 	Rectangle aRect;
2249cdf0e10cSrcweir 
2250cdf0e10cSrcweir 	if ( mbFormat || (rDate < maFirstDate) || (rDate > (maFirstDate+mnDayCount)) )
2251cdf0e10cSrcweir 		return aRect;
2252cdf0e10cSrcweir 
2253cdf0e10cSrcweir 	long	nX;
2254cdf0e10cSrcweir 	long	nY;
2255cdf0e10cSrcweir 	sal_uLong	nDaysOff;
2256cdf0e10cSrcweir 	sal_uInt16	nDayIndex;
2257cdf0e10cSrcweir 	Date	aDate = GetFirstMonth();
2258cdf0e10cSrcweir 
2259cdf0e10cSrcweir 	if ( rDate < aDate )
2260cdf0e10cSrcweir 	{
2261cdf0e10cSrcweir 		aRect = GetDateRect( aDate );
2262cdf0e10cSrcweir 		nDaysOff = aDate-rDate;
2263cdf0e10cSrcweir 		nX = (long)(nDaysOff*mnDayWidth);
2264cdf0e10cSrcweir 		aRect.Left() -= nX;
2265cdf0e10cSrcweir 		aRect.Right() -= nX;
2266cdf0e10cSrcweir 		return aRect;
2267cdf0e10cSrcweir 	}
2268cdf0e10cSrcweir 	else
2269cdf0e10cSrcweir 	{
2270cdf0e10cSrcweir 		Date aLastDate = GetLastMonth();
2271cdf0e10cSrcweir 		if ( rDate > aLastDate )
2272cdf0e10cSrcweir 		{
2273cdf0e10cSrcweir 			sal_uInt16 nWeekDay = (sal_uInt16)aLastDate.GetDayOfWeek();
2274cdf0e10cSrcweir 			nWeekDay = (nWeekDay+(7-(sal_uInt16)ImplGetWeekStart())) % 7;
2275cdf0e10cSrcweir 			aLastDate -= nWeekDay;
2276cdf0e10cSrcweir 			aRect = GetDateRect( aLastDate );
2277cdf0e10cSrcweir 			nDaysOff = rDate-aLastDate;
2278cdf0e10cSrcweir 			nDayIndex = 0;
2279cdf0e10cSrcweir 			for ( sal_uInt16 i = 0; i <= nDaysOff; i++ )
2280cdf0e10cSrcweir 			{
2281cdf0e10cSrcweir 				if ( aLastDate == rDate )
2282cdf0e10cSrcweir 				{
2283cdf0e10cSrcweir 					aRect.Left() += nDayIndex*mnDayWidth;
2284cdf0e10cSrcweir 					aRect.Right() = aRect.Left()+mnDayWidth;
2285cdf0e10cSrcweir 					return aRect;
2286cdf0e10cSrcweir 				}
2287cdf0e10cSrcweir 				if ( nDayIndex == 6 )
2288cdf0e10cSrcweir 				{
2289cdf0e10cSrcweir 					nDayIndex = 0;
2290cdf0e10cSrcweir 					aRect.Top() += mnDayHeight;
2291cdf0e10cSrcweir 					aRect.Bottom() += mnDayHeight;
2292cdf0e10cSrcweir 				}
2293cdf0e10cSrcweir 				else
2294cdf0e10cSrcweir 					nDayIndex++;
2295cdf0e10cSrcweir 				aLastDate++;
2296cdf0e10cSrcweir 			}
2297cdf0e10cSrcweir 		}
2298cdf0e10cSrcweir 	}
2299cdf0e10cSrcweir 
2300cdf0e10cSrcweir 	nY = 0;
2301cdf0e10cSrcweir 	for ( long i = 0; i < mnLines; i++ )
2302cdf0e10cSrcweir 	{
2303cdf0e10cSrcweir 		nX = 0;
2304cdf0e10cSrcweir 		for ( long j = 0; j < mnMonthPerLine; j++ )
2305cdf0e10cSrcweir 		{
2306cdf0e10cSrcweir 			sal_uInt16 nDaysInMonth = aDate.GetDaysInMonth();
2307cdf0e10cSrcweir 
2308cdf0e10cSrcweir 			// Monat gerufen
2309cdf0e10cSrcweir 			if ( (aDate.GetMonth() == rDate.GetMonth()) &&
2310cdf0e10cSrcweir 				 (aDate.GetYear() == rDate.GetYear()) )
2311cdf0e10cSrcweir 			{
2312cdf0e10cSrcweir 				long nDayX = nX+mnDaysOffX;
2313cdf0e10cSrcweir 				long nDayY = nY+mnDaysOffY;
2314cdf0e10cSrcweir 				nDayIndex = (sal_uInt16)aDate.GetDayOfWeek();
2315cdf0e10cSrcweir 				nDayIndex = (nDayIndex+(7-(sal_uInt16)ImplGetWeekStart())) % 7;
2316cdf0e10cSrcweir 				for ( sal_uInt16 nDay = 1; nDay <= nDaysInMonth; nDay++ )
2317cdf0e10cSrcweir 				{
2318cdf0e10cSrcweir 					if ( nDay == rDate.GetDay() )
2319cdf0e10cSrcweir 					{
2320cdf0e10cSrcweir 						aRect.Left()	= nDayX + (nDayIndex*mnDayWidth);
2321cdf0e10cSrcweir 						aRect.Top() 	= nDayY;
2322cdf0e10cSrcweir 						aRect.Right()	= aRect.Left()+mnDayWidth;
2323cdf0e10cSrcweir 						aRect.Bottom()	= aRect.Top()+mnDayHeight;
2324cdf0e10cSrcweir 						break;
2325cdf0e10cSrcweir 					}
2326cdf0e10cSrcweir 					if ( nDayIndex == 6 )
2327cdf0e10cSrcweir 					{
2328cdf0e10cSrcweir 						nDayIndex = 0;
2329cdf0e10cSrcweir 						nDayY += mnDayHeight;
2330cdf0e10cSrcweir 					}
2331cdf0e10cSrcweir 					else
2332cdf0e10cSrcweir 						nDayIndex++;
2333cdf0e10cSrcweir 				}
2334cdf0e10cSrcweir 			}
2335cdf0e10cSrcweir 
2336cdf0e10cSrcweir 			aDate += nDaysInMonth;
2337cdf0e10cSrcweir 			nX += mnMonthWidth;
2338cdf0e10cSrcweir 		}
2339cdf0e10cSrcweir 
2340cdf0e10cSrcweir 		nY += mnMonthHeight;
2341cdf0e10cSrcweir 	}
2342cdf0e10cSrcweir 
2343cdf0e10cSrcweir 	return aRect;
2344cdf0e10cSrcweir }
2345cdf0e10cSrcweir 
2346cdf0e10cSrcweir // -----------------------------------------------------------------------
2347cdf0e10cSrcweir 
SetStandardColor(const Color & rColor)2348cdf0e10cSrcweir void Calendar::SetStandardColor( const Color& rColor )
2349cdf0e10cSrcweir {
2350cdf0e10cSrcweir 	if ( mpStandardColor )
2351cdf0e10cSrcweir 		*mpStandardColor = rColor;
2352cdf0e10cSrcweir 	else
2353cdf0e10cSrcweir 		mpStandardColor = new Color( rColor );
2354cdf0e10cSrcweir 	ImplUpdate();
2355cdf0e10cSrcweir }
2356cdf0e10cSrcweir 
2357cdf0e10cSrcweir // -----------------------------------------------------------------------
2358cdf0e10cSrcweir 
SetSaturdayColor(const Color & rColor)2359cdf0e10cSrcweir void Calendar::SetSaturdayColor( const Color& rColor )
2360cdf0e10cSrcweir {
2361cdf0e10cSrcweir 	if ( mpSaturdayColor )
2362cdf0e10cSrcweir 		*mpSaturdayColor = rColor;
2363cdf0e10cSrcweir 	else
2364cdf0e10cSrcweir 		mpSaturdayColor = new Color( rColor );
2365cdf0e10cSrcweir 	ImplUpdate();
2366cdf0e10cSrcweir }
2367cdf0e10cSrcweir 
2368cdf0e10cSrcweir // -----------------------------------------------------------------------
2369cdf0e10cSrcweir 
SetSundayColor(const Color & rColor)2370cdf0e10cSrcweir void Calendar::SetSundayColor( const Color& rColor )
2371cdf0e10cSrcweir {
2372cdf0e10cSrcweir 	if ( mpSundayColor )
2373cdf0e10cSrcweir 		*mpSundayColor = rColor;
2374cdf0e10cSrcweir 	else
2375cdf0e10cSrcweir 		mpSundayColor = new Color( rColor );
2376cdf0e10cSrcweir 	ImplUpdate();
2377cdf0e10cSrcweir }
2378cdf0e10cSrcweir 
2379cdf0e10cSrcweir // -----------------------------------------------------------------------
2380cdf0e10cSrcweir 
AddDateInfo(const Date & rDate,const String & rText,const Color * pTextColor,const Color * pFrameColor,sal_uInt16 nFlags)2381cdf0e10cSrcweir void Calendar::AddDateInfo( const Date& rDate, const String& rText,
2382cdf0e10cSrcweir 							const Color* pTextColor, const Color* pFrameColor,
2383cdf0e10cSrcweir 							sal_uInt16 nFlags )
2384cdf0e10cSrcweir {
2385cdf0e10cSrcweir 	if ( !mpDateTable )
2386cdf0e10cSrcweir 		mpDateTable = new ImplDateTable( 256, 256 );
2387cdf0e10cSrcweir 
2388cdf0e10cSrcweir 	sal_Bool			bChanged = sal_False;
2389cdf0e10cSrcweir 	sal_uLong			nKey = rDate.GetDate();
2390cdf0e10cSrcweir 	ImplDateInfo*	pDateInfo = mpDateTable->Get( nKey );
2391cdf0e10cSrcweir 	if ( pDateInfo )
2392cdf0e10cSrcweir 		pDateInfo->maText = rText;
2393cdf0e10cSrcweir 	else
2394cdf0e10cSrcweir 	{
2395cdf0e10cSrcweir 		pDateInfo = new ImplDateInfo( rText );
2396cdf0e10cSrcweir 		mpDateTable->Insert( nKey, pDateInfo );
2397cdf0e10cSrcweir 	}
2398cdf0e10cSrcweir 	if ( pTextColor )
2399cdf0e10cSrcweir 	{
2400cdf0e10cSrcweir 		if ( pDateInfo->mpTextColor )
2401cdf0e10cSrcweir 		{
2402cdf0e10cSrcweir 			if ( *(pDateInfo->mpTextColor) != *pTextColor )
2403cdf0e10cSrcweir 			{
2404cdf0e10cSrcweir 				*(pDateInfo->mpTextColor) = *pTextColor;
2405cdf0e10cSrcweir 				bChanged = sal_True;
2406cdf0e10cSrcweir 			}
2407cdf0e10cSrcweir 		}
2408cdf0e10cSrcweir 		else
2409cdf0e10cSrcweir 		{
2410cdf0e10cSrcweir 			pDateInfo->mpTextColor = new Color( *pTextColor );
2411cdf0e10cSrcweir 			bChanged = sal_True;
2412cdf0e10cSrcweir 		}
2413cdf0e10cSrcweir 	}
2414cdf0e10cSrcweir 	else
2415cdf0e10cSrcweir 	{
2416cdf0e10cSrcweir 		if ( pDateInfo->mpTextColor )
2417cdf0e10cSrcweir 		{
2418cdf0e10cSrcweir 			delete pDateInfo->mpTextColor;
2419cdf0e10cSrcweir 			pDateInfo->mpTextColor = NULL;
2420cdf0e10cSrcweir 			bChanged = sal_True;
2421cdf0e10cSrcweir 		}
2422cdf0e10cSrcweir 	}
2423cdf0e10cSrcweir 	if ( pFrameColor )
2424cdf0e10cSrcweir 	{
2425cdf0e10cSrcweir 		if ( pDateInfo->mpFrameColor )
2426cdf0e10cSrcweir 		{
2427cdf0e10cSrcweir 			if ( *(pDateInfo->mpFrameColor) != *pFrameColor )
2428cdf0e10cSrcweir 			{
2429cdf0e10cSrcweir 				*(pDateInfo->mpFrameColor) = *pFrameColor;
2430cdf0e10cSrcweir 				bChanged = sal_True;
2431cdf0e10cSrcweir 			}
2432cdf0e10cSrcweir 		}
2433cdf0e10cSrcweir 		else
2434cdf0e10cSrcweir 		{
2435cdf0e10cSrcweir 			pDateInfo->mpFrameColor = new Color( *pFrameColor );
2436cdf0e10cSrcweir 			bChanged = sal_True;
2437cdf0e10cSrcweir 		}
2438cdf0e10cSrcweir 	}
2439cdf0e10cSrcweir 	else
2440cdf0e10cSrcweir 	{
2441cdf0e10cSrcweir 		if ( pDateInfo->mpFrameColor )
2442cdf0e10cSrcweir 		{
2443cdf0e10cSrcweir 			delete pDateInfo->mpFrameColor;
2444cdf0e10cSrcweir 			pDateInfo->mpFrameColor = NULL;
2445cdf0e10cSrcweir 			bChanged = sal_True;
2446cdf0e10cSrcweir 		}
2447cdf0e10cSrcweir 	}
2448cdf0e10cSrcweir 	if ( pDateInfo->mnFlags != nFlags )
2449cdf0e10cSrcweir 	{
2450cdf0e10cSrcweir 		pDateInfo->mnFlags = nFlags;
2451cdf0e10cSrcweir 		bChanged = sal_True;
2452cdf0e10cSrcweir 	}
2453cdf0e10cSrcweir 
2454cdf0e10cSrcweir 	if ( bChanged )
2455cdf0e10cSrcweir 		ImplUpdateDate( rDate );
2456cdf0e10cSrcweir }
2457cdf0e10cSrcweir 
2458cdf0e10cSrcweir // -----------------------------------------------------------------------
2459cdf0e10cSrcweir 
RemoveDateInfo(const Date & rDate)2460cdf0e10cSrcweir void Calendar::RemoveDateInfo( const Date& rDate )
2461cdf0e10cSrcweir {
2462cdf0e10cSrcweir 	if ( mpDateTable )
2463cdf0e10cSrcweir 	{
2464cdf0e10cSrcweir 		ImplDateInfo* pDateInfo = mpDateTable->Remove( rDate.GetDate() );
2465cdf0e10cSrcweir 		if ( pDateInfo )
2466cdf0e10cSrcweir 		{
2467cdf0e10cSrcweir 			delete pDateInfo;
2468cdf0e10cSrcweir 			ImplUpdateDate( rDate );
2469cdf0e10cSrcweir 		}
2470cdf0e10cSrcweir 	}
2471cdf0e10cSrcweir }
2472cdf0e10cSrcweir 
2473cdf0e10cSrcweir // -----------------------------------------------------------------------
2474cdf0e10cSrcweir 
ClearDateInfo()2475cdf0e10cSrcweir void Calendar::ClearDateInfo()
2476cdf0e10cSrcweir {
2477cdf0e10cSrcweir 	if ( mpDateTable )
2478cdf0e10cSrcweir 	{
2479cdf0e10cSrcweir 		ImplDateInfo* pDateInfo = mpDateTable->First();
2480cdf0e10cSrcweir 		while ( pDateInfo )
2481cdf0e10cSrcweir 		{
2482cdf0e10cSrcweir 			sal_uLong nKey = mpDateTable->GetCurKey();
2483cdf0e10cSrcweir 			mpDateTable->Remove( nKey );
2484cdf0e10cSrcweir 			Date aDate( nKey );
2485cdf0e10cSrcweir 			ImplUpdateDate( aDate );
2486cdf0e10cSrcweir 			delete pDateInfo;
2487cdf0e10cSrcweir 			pDateInfo = mpDateTable->First();
2488cdf0e10cSrcweir 		}
2489cdf0e10cSrcweir 		delete mpDateTable;
2490cdf0e10cSrcweir 		mpDateTable = NULL;
2491cdf0e10cSrcweir 	}
2492cdf0e10cSrcweir }
2493cdf0e10cSrcweir 
2494cdf0e10cSrcweir // -----------------------------------------------------------------------
2495cdf0e10cSrcweir 
GetDateInfoText(const Date & rDate)2496cdf0e10cSrcweir XubString Calendar::GetDateInfoText( const Date& rDate )
2497cdf0e10cSrcweir {
2498cdf0e10cSrcweir 	XubString aRet;
2499cdf0e10cSrcweir 	if ( mpDateTable )
2500cdf0e10cSrcweir 	{
2501cdf0e10cSrcweir 		sal_uLong			nKey = rDate.GetDate();
2502cdf0e10cSrcweir 		ImplDateInfo*	pDateInfo = mpDateTable->Get( nKey );
2503cdf0e10cSrcweir 		if ( pDateInfo )
2504cdf0e10cSrcweir 			aRet = pDateInfo->maText;
2505cdf0e10cSrcweir 	}
2506cdf0e10cSrcweir 	return aRet;
2507cdf0e10cSrcweir }
2508cdf0e10cSrcweir 
2509cdf0e10cSrcweir // -----------------------------------------------------------------------
2510cdf0e10cSrcweir 
ShowDropPos(const Point & rPos,Date & rDate)2511cdf0e10cSrcweir sal_Bool Calendar::ShowDropPos( const Point& rPos, Date& rDate )
2512cdf0e10cSrcweir {
2513cdf0e10cSrcweir 	Date	aTempDate = maCurDate;
2514cdf0e10cSrcweir 	mnDragScrollHitTest = ImplHitTest( rPos, aTempDate );
2515cdf0e10cSrcweir 
2516cdf0e10cSrcweir 	if ( mnDragScrollHitTest )
2517cdf0e10cSrcweir 	{
2518cdf0e10cSrcweir 		if ( mnDragScrollHitTest & (CALENDAR_HITTEST_PREV | CALENDAR_HITTEST_NEXT) )
2519cdf0e10cSrcweir 		{
2520cdf0e10cSrcweir 			if ( !maDragScrollTimer.IsActive() )
2521cdf0e10cSrcweir 				maDragScrollTimer.Start();
2522cdf0e10cSrcweir 		}
2523cdf0e10cSrcweir 		else
2524cdf0e10cSrcweir 		{
2525cdf0e10cSrcweir 			maDragScrollTimer.Stop();
2526cdf0e10cSrcweir 			if ( mnDragScrollHitTest & CALENDAR_HITTEST_DAY )
2527cdf0e10cSrcweir 			{
2528cdf0e10cSrcweir 				if ( !mbDropPos || (aTempDate != maDropDate) )
2529cdf0e10cSrcweir 				{
2530cdf0e10cSrcweir 					if( mbDropPos )
2531cdf0e10cSrcweir 						ImplInvertDropPos();
2532cdf0e10cSrcweir 					maDropDate = aTempDate;
2533cdf0e10cSrcweir 					mbDropPos = sal_True;
2534cdf0e10cSrcweir 					ImplInvertDropPos();
2535cdf0e10cSrcweir 				}
2536cdf0e10cSrcweir 
2537cdf0e10cSrcweir 				rDate = maDropDate;
2538cdf0e10cSrcweir 				return sal_True;
2539cdf0e10cSrcweir 			}
2540cdf0e10cSrcweir 		}
2541cdf0e10cSrcweir 	}
2542cdf0e10cSrcweir 	else
2543cdf0e10cSrcweir 		maDragScrollTimer.Stop();
2544cdf0e10cSrcweir 
2545cdf0e10cSrcweir 	HideDropPos();
2546cdf0e10cSrcweir 	return sal_False;
2547cdf0e10cSrcweir }
2548cdf0e10cSrcweir 
2549cdf0e10cSrcweir // -----------------------------------------------------------------------
2550cdf0e10cSrcweir 
HideDropPos()2551cdf0e10cSrcweir void Calendar::HideDropPos()
2552cdf0e10cSrcweir {
2553cdf0e10cSrcweir 	if ( mbDropPos )
2554cdf0e10cSrcweir 	{
2555cdf0e10cSrcweir 		ImplInvertDropPos();
2556cdf0e10cSrcweir 		mbDropPos = sal_False;
2557cdf0e10cSrcweir 	}
2558cdf0e10cSrcweir }
2559cdf0e10cSrcweir 
2560cdf0e10cSrcweir // -----------------------------------------------------------------------
2561cdf0e10cSrcweir 
StartSelection()2562cdf0e10cSrcweir void Calendar::StartSelection()
2563cdf0e10cSrcweir {
2564cdf0e10cSrcweir 	if ( mpOldSelectTable )
2565cdf0e10cSrcweir 		delete mpOldSelectTable;
2566cdf0e10cSrcweir 	maOldCurDate = maCurDate;
2567cdf0e10cSrcweir 	mpOldSelectTable = new Table( *mpSelectTable );
2568cdf0e10cSrcweir 
2569cdf0e10cSrcweir 	mbSelection = sal_True;
2570cdf0e10cSrcweir }
2571cdf0e10cSrcweir 
2572cdf0e10cSrcweir // -----------------------------------------------------------------------
2573cdf0e10cSrcweir 
EndSelection()2574cdf0e10cSrcweir void Calendar::EndSelection()
2575cdf0e10cSrcweir {
2576cdf0e10cSrcweir 	if ( mbDrag || mbSpinDown || mbSelection )
2577cdf0e10cSrcweir 	{
2578cdf0e10cSrcweir 		if ( !mbSelection )
2579cdf0e10cSrcweir 			ReleaseMouse();
2580cdf0e10cSrcweir 
2581cdf0e10cSrcweir 		mbDrag				= sal_False;
2582cdf0e10cSrcweir 		mbSelection 		= sal_False;
2583cdf0e10cSrcweir 		mbMultiSelection	= sal_False;
2584cdf0e10cSrcweir 		mbSpinDown			= sal_False;
2585cdf0e10cSrcweir 		mbPrevIn			= sal_False;
2586cdf0e10cSrcweir 		mbNextIn			= sal_False;
2587cdf0e10cSrcweir 	}
2588cdf0e10cSrcweir }
2589cdf0e10cSrcweir 
2590cdf0e10cSrcweir // -----------------------------------------------------------------------
2591cdf0e10cSrcweir 
CalcWindowSizePixel(long nCalcMonthPerLine,long nCalcLines) const2592cdf0e10cSrcweir Size Calendar::CalcWindowSizePixel( long nCalcMonthPerLine,
2593cdf0e10cSrcweir 									long nCalcLines ) const
2594cdf0e10cSrcweir {
2595cdf0e10cSrcweir 	XubString	a99Text( XubString( RTL_CONSTASCII_USTRINGPARAM( "99" ) ) );
2596cdf0e10cSrcweir 	Font		aOldFont = GetFont();
2597cdf0e10cSrcweir 
2598cdf0e10cSrcweir 	// Wochenanzeige beruecksichtigen
2599cdf0e10cSrcweir 	long nWeekWidth;
2600cdf0e10cSrcweir 	if ( mnWinStyle & WB_WEEKNUMBER )
2601cdf0e10cSrcweir 	{
2602cdf0e10cSrcweir 		Font aTempFont = aOldFont;
2603cdf0e10cSrcweir 		ImplGetWeekFont( aTempFont );
2604cdf0e10cSrcweir 		((Calendar*)this)->SetFont( aTempFont );
2605cdf0e10cSrcweir 		nWeekWidth = GetTextWidth( a99Text )+WEEKNUMBER_OFFX;
2606cdf0e10cSrcweir 		((Calendar*)this)->SetFont( aOldFont );
2607cdf0e10cSrcweir 	}
2608cdf0e10cSrcweir 	else
2609cdf0e10cSrcweir 		nWeekWidth = 0;
2610cdf0e10cSrcweir 
2611cdf0e10cSrcweir 	if ( mnWinStyle & WB_BOLDTEXT )
2612cdf0e10cSrcweir 	{
2613cdf0e10cSrcweir 		Font aFont = aOldFont;
2614cdf0e10cSrcweir 		if ( aFont.GetWeight() < WEIGHT_BOLD )
2615cdf0e10cSrcweir 			aFont.SetWeight( WEIGHT_BOLD );
2616cdf0e10cSrcweir 		else
2617cdf0e10cSrcweir 			aFont.SetWeight( WEIGHT_NORMAL );
2618cdf0e10cSrcweir 		((Calendar*)this)->SetFont( aFont );
2619cdf0e10cSrcweir 	}
2620cdf0e10cSrcweir 
2621cdf0e10cSrcweir 	Size	aSize;
2622cdf0e10cSrcweir 	long	n99TextWidth = GetTextWidth( a99Text );
2623cdf0e10cSrcweir 	long	nTextHeight = GetTextHeight();
2624cdf0e10cSrcweir 
2625cdf0e10cSrcweir 	if ( mnWinStyle & WB_BOLDTEXT )
2626cdf0e10cSrcweir 		((Calendar*)this)->SetFont( aOldFont );
2627cdf0e10cSrcweir 
2628cdf0e10cSrcweir 	aSize.Width()  += ((n99TextWidth+DAY_OFFX)*7) + nWeekWidth;
2629cdf0e10cSrcweir 	aSize.Width()  += MONTH_BORDERX*2;
2630cdf0e10cSrcweir 	aSize.Width()  *= nCalcMonthPerLine;
2631cdf0e10cSrcweir 
2632cdf0e10cSrcweir 	aSize.Height()	= nTextHeight + TITLE_OFFY + (TITLE_BORDERY*2);
2633cdf0e10cSrcweir 	aSize.Height() += nTextHeight + WEEKDAY_OFFY;
2634cdf0e10cSrcweir 	aSize.Height() += ((nTextHeight+DAY_OFFY)*6);
2635cdf0e10cSrcweir 	aSize.Height() += MONTH_OFFY;
2636cdf0e10cSrcweir 	aSize.Height() *= nCalcLines;
2637cdf0e10cSrcweir 
2638cdf0e10cSrcweir 	return aSize;
2639cdf0e10cSrcweir }
2640cdf0e10cSrcweir 
2641cdf0e10cSrcweir // =======================================================================
2642cdf0e10cSrcweir 
2643cdf0e10cSrcweir #define CALFIELD_EXTRA_BUTTON_WIDTH 		14
2644cdf0e10cSrcweir #define CALFIELD_EXTRA_BUTTON_HEIGHT		8
2645cdf0e10cSrcweir #define CALFIELD_SEP_X						6
2646cdf0e10cSrcweir #define CALFIELD_BORDERLINE_X				5
2647cdf0e10cSrcweir #define CALFIELD_BORDER_YTOP				4
2648cdf0e10cSrcweir #define CALFIELD_BORDER_Y					5
2649cdf0e10cSrcweir 
2650cdf0e10cSrcweir // =======================================================================
2651cdf0e10cSrcweir 
2652cdf0e10cSrcweir class ImplCFieldFloatWin : public FloatingWindow
2653cdf0e10cSrcweir {
2654cdf0e10cSrcweir private:
2655cdf0e10cSrcweir 	Calendar*		mpCalendar;
2656cdf0e10cSrcweir 	PushButton* 	mpTodayBtn;
2657cdf0e10cSrcweir 	PushButton* 	mpNoneBtn;
2658cdf0e10cSrcweir 	FixedLine*		mpFixedLine;
2659cdf0e10cSrcweir 
2660cdf0e10cSrcweir public:
2661cdf0e10cSrcweir 					ImplCFieldFloatWin( Window* pParent );
2662cdf0e10cSrcweir 					~ImplCFieldFloatWin();
2663cdf0e10cSrcweir 
SetCalendar(Calendar * pCalendar)2664cdf0e10cSrcweir 	void			SetCalendar( Calendar* pCalendar )
2665cdf0e10cSrcweir 						{ mpCalendar = pCalendar; }
2666cdf0e10cSrcweir 
2667cdf0e10cSrcweir 	PushButton* 	EnableTodayBtn( sal_Bool bEnable );
2668cdf0e10cSrcweir 	PushButton* 	EnableNoneBtn( sal_Bool bEnable );
2669cdf0e10cSrcweir 	void			ArrangeButtons();
2670cdf0e10cSrcweir 
2671cdf0e10cSrcweir 	long			Notify( NotifyEvent& rNEvt );
2672cdf0e10cSrcweir };
2673cdf0e10cSrcweir 
2674cdf0e10cSrcweir // -----------------------------------------------------------------------
2675cdf0e10cSrcweir 
ImplCFieldFloatWin(Window * pParent)2676cdf0e10cSrcweir ImplCFieldFloatWin::ImplCFieldFloatWin( Window* pParent ) :
2677cdf0e10cSrcweir 	FloatingWindow( pParent, WB_BORDER | WB_SYSTEMWINDOW | WB_NOSHADOW  )
2678cdf0e10cSrcweir {
2679cdf0e10cSrcweir 	mpCalendar	= NULL;
2680cdf0e10cSrcweir 	mpTodayBtn	= NULL;
2681cdf0e10cSrcweir 	mpNoneBtn	= NULL;
2682cdf0e10cSrcweir 	mpFixedLine = NULL;
2683cdf0e10cSrcweir }
2684cdf0e10cSrcweir 
2685cdf0e10cSrcweir // -----------------------------------------------------------------------
2686cdf0e10cSrcweir 
~ImplCFieldFloatWin()2687cdf0e10cSrcweir ImplCFieldFloatWin::~ImplCFieldFloatWin()
2688cdf0e10cSrcweir {
2689cdf0e10cSrcweir 	delete mpTodayBtn;
2690cdf0e10cSrcweir 	delete mpNoneBtn;
2691cdf0e10cSrcweir 	delete mpFixedLine;
2692cdf0e10cSrcweir }
2693cdf0e10cSrcweir 
2694cdf0e10cSrcweir // -----------------------------------------------------------------------
2695cdf0e10cSrcweir 
EnableTodayBtn(sal_Bool bEnable)2696cdf0e10cSrcweir PushButton* ImplCFieldFloatWin::EnableTodayBtn( sal_Bool bEnable )
2697cdf0e10cSrcweir {
2698cdf0e10cSrcweir 	if ( bEnable )
2699cdf0e10cSrcweir 	{
2700cdf0e10cSrcweir 		if ( !mpTodayBtn )
2701cdf0e10cSrcweir 		{
2702cdf0e10cSrcweir 			mpTodayBtn = new PushButton( this, WB_NOPOINTERFOCUS );
2703cdf0e10cSrcweir 			XubString aTodayText( SvtResId( STR_SVT_CALENDAR_TODAY ) );
2704cdf0e10cSrcweir 			mpTodayBtn->SetText( aTodayText );
2705cdf0e10cSrcweir 			Size aSize;
2706cdf0e10cSrcweir 			aSize.Width()	= mpTodayBtn->GetCtrlTextWidth( mpTodayBtn->GetText() );
2707cdf0e10cSrcweir 			aSize.Height()	= mpTodayBtn->GetTextHeight();
2708cdf0e10cSrcweir 			aSize.Width()  += CALFIELD_EXTRA_BUTTON_WIDTH;
2709cdf0e10cSrcweir 			aSize.Height() += CALFIELD_EXTRA_BUTTON_HEIGHT;
2710cdf0e10cSrcweir 			mpTodayBtn->SetSizePixel( aSize );
2711cdf0e10cSrcweir 			mpTodayBtn->Show();
2712cdf0e10cSrcweir 		}
2713cdf0e10cSrcweir 	}
2714cdf0e10cSrcweir 	else
2715cdf0e10cSrcweir 	{
2716cdf0e10cSrcweir 		if ( mpTodayBtn )
2717cdf0e10cSrcweir 		{
2718cdf0e10cSrcweir 			delete mpTodayBtn;
2719cdf0e10cSrcweir 			mpTodayBtn = NULL;
2720cdf0e10cSrcweir 		}
2721cdf0e10cSrcweir 	}
2722cdf0e10cSrcweir 
2723cdf0e10cSrcweir 	return mpTodayBtn;
2724cdf0e10cSrcweir }
2725cdf0e10cSrcweir 
2726cdf0e10cSrcweir // -----------------------------------------------------------------------
2727cdf0e10cSrcweir 
EnableNoneBtn(sal_Bool bEnable)2728cdf0e10cSrcweir PushButton* ImplCFieldFloatWin::EnableNoneBtn( sal_Bool bEnable )
2729cdf0e10cSrcweir {
2730cdf0e10cSrcweir 	if ( bEnable )
2731cdf0e10cSrcweir 	{
2732cdf0e10cSrcweir 		if ( !mpNoneBtn )
2733cdf0e10cSrcweir 		{
2734cdf0e10cSrcweir 			mpNoneBtn = new PushButton( this, WB_NOPOINTERFOCUS );
2735cdf0e10cSrcweir 			XubString aNoneText( SvtResId( STR_SVT_CALENDAR_NONE ) );
2736cdf0e10cSrcweir 			mpNoneBtn->SetText( aNoneText );
2737cdf0e10cSrcweir 			Size aSize;
2738cdf0e10cSrcweir 			aSize.Width()	= mpNoneBtn->GetCtrlTextWidth( mpNoneBtn->GetText() );
2739cdf0e10cSrcweir 			aSize.Height()	= mpNoneBtn->GetTextHeight();
2740cdf0e10cSrcweir 			aSize.Width()  += CALFIELD_EXTRA_BUTTON_WIDTH;
2741cdf0e10cSrcweir 			aSize.Height() += CALFIELD_EXTRA_BUTTON_HEIGHT;
2742cdf0e10cSrcweir 			mpNoneBtn->SetSizePixel( aSize );
2743cdf0e10cSrcweir 			mpNoneBtn->Show();
2744cdf0e10cSrcweir 		}
2745cdf0e10cSrcweir 	}
2746cdf0e10cSrcweir 	else
2747cdf0e10cSrcweir 	{
2748cdf0e10cSrcweir 		if ( mpNoneBtn )
2749cdf0e10cSrcweir 		{
2750cdf0e10cSrcweir 			delete mpNoneBtn;
2751cdf0e10cSrcweir 			mpNoneBtn = NULL;
2752cdf0e10cSrcweir 		}
2753cdf0e10cSrcweir 	}
2754cdf0e10cSrcweir 
2755cdf0e10cSrcweir 	return mpNoneBtn;
2756cdf0e10cSrcweir }
2757cdf0e10cSrcweir 
2758cdf0e10cSrcweir // -----------------------------------------------------------------------
2759cdf0e10cSrcweir 
ArrangeButtons()2760cdf0e10cSrcweir void ImplCFieldFloatWin::ArrangeButtons()
2761cdf0e10cSrcweir {
2762cdf0e10cSrcweir 	long nBtnHeight = 0;
2763cdf0e10cSrcweir 	long nBtnWidth	= 0;
2764cdf0e10cSrcweir 	Size aOutSize	= GetOutputSizePixel();
2765cdf0e10cSrcweir 	if ( mpTodayBtn && mpNoneBtn )
2766cdf0e10cSrcweir 	{
2767cdf0e10cSrcweir 		Size aTodayBtnSize = mpTodayBtn->GetSizePixel();
2768cdf0e10cSrcweir 		Size aNoneBtnSize  = mpNoneBtn->GetSizePixel();
2769cdf0e10cSrcweir 		if ( aTodayBtnSize.Width() < aNoneBtnSize.Width() )
2770cdf0e10cSrcweir 			aTodayBtnSize.Width() = aNoneBtnSize.Width();
2771cdf0e10cSrcweir 		else
2772cdf0e10cSrcweir 			aNoneBtnSize.Width() = aTodayBtnSize.Width();
2773cdf0e10cSrcweir 		if ( aTodayBtnSize.Height() < aNoneBtnSize.Height() )
2774cdf0e10cSrcweir 			aTodayBtnSize.Height() = aNoneBtnSize.Height();
2775cdf0e10cSrcweir 		else
2776cdf0e10cSrcweir 			aNoneBtnSize.Height() = aTodayBtnSize.Height();
2777cdf0e10cSrcweir 
2778cdf0e10cSrcweir 		nBtnWidth  = aTodayBtnSize.Width() + aNoneBtnSize.Width() + CALFIELD_SEP_X;
2779cdf0e10cSrcweir 		nBtnHeight = aTodayBtnSize.Height();
2780cdf0e10cSrcweir 		long nX = (aOutSize.Width()-nBtnWidth)/2;
2781cdf0e10cSrcweir 		long nY = aOutSize.Height()+CALFIELD_BORDER_Y+CALFIELD_BORDER_YTOP;
2782cdf0e10cSrcweir 		mpTodayBtn->SetPosSizePixel( Point( nX, nY ), aTodayBtnSize );
2783cdf0e10cSrcweir 		nX += aTodayBtnSize.Width() + CALFIELD_SEP_X;
2784cdf0e10cSrcweir 		mpNoneBtn->SetPosSizePixel( Point( nX, nY ), aNoneBtnSize );
2785cdf0e10cSrcweir 	}
2786cdf0e10cSrcweir 	else if ( mpTodayBtn )
2787cdf0e10cSrcweir 	{
2788cdf0e10cSrcweir 		Size aTodayBtnSize = mpTodayBtn->GetSizePixel();
2789cdf0e10cSrcweir 		nBtnWidth  = aTodayBtnSize.Width();
2790cdf0e10cSrcweir 		nBtnHeight = aTodayBtnSize.Height();
2791cdf0e10cSrcweir 		mpTodayBtn->SetPosPixel( Point( (aOutSize.Width()-nBtnWidth)/2, aOutSize.Height()+CALFIELD_BORDER_Y+CALFIELD_BORDER_YTOP ) );
2792cdf0e10cSrcweir 	}
2793cdf0e10cSrcweir 	else if ( mpNoneBtn )
2794cdf0e10cSrcweir 	{
2795cdf0e10cSrcweir 		Size aNoneBtnSize  = mpNoneBtn->GetSizePixel();
2796cdf0e10cSrcweir 		nBtnWidth  = aNoneBtnSize.Width();
2797cdf0e10cSrcweir 		nBtnHeight = aNoneBtnSize.Height();
2798cdf0e10cSrcweir 		mpNoneBtn->SetPosPixel( Point( (aOutSize.Width()-nBtnWidth)/2, aOutSize.Height()+CALFIELD_BORDER_Y+CALFIELD_BORDER_YTOP ) );
2799cdf0e10cSrcweir 	}
2800cdf0e10cSrcweir 
2801cdf0e10cSrcweir 	if ( nBtnHeight )
2802cdf0e10cSrcweir 	{
2803cdf0e10cSrcweir 		if ( !mpFixedLine )
2804cdf0e10cSrcweir 		{
2805cdf0e10cSrcweir 			mpFixedLine = new FixedLine( this );
2806cdf0e10cSrcweir 			mpFixedLine->Show();
2807cdf0e10cSrcweir 		}
2808cdf0e10cSrcweir 		long nLineWidth = aOutSize.Width()-(CALFIELD_BORDERLINE_X*2);
2809cdf0e10cSrcweir 		mpFixedLine->SetPosSizePixel( (aOutSize.Width()-nLineWidth)/2, aOutSize.Height()+((CALFIELD_BORDER_YTOP-2)/2),
2810cdf0e10cSrcweir 									  nLineWidth, 2, WINDOW_POSSIZE_POSSIZE );
2811cdf0e10cSrcweir 		aOutSize.Height() += nBtnHeight + (CALFIELD_BORDER_Y*2) + CALFIELD_BORDER_YTOP;
2812cdf0e10cSrcweir 		SetOutputSizePixel( aOutSize );
2813cdf0e10cSrcweir 	}
2814cdf0e10cSrcweir 	else
2815cdf0e10cSrcweir 	{
2816cdf0e10cSrcweir 		if ( mpFixedLine )
2817cdf0e10cSrcweir 		{
2818cdf0e10cSrcweir 			delete mpFixedLine;
2819cdf0e10cSrcweir 			mpFixedLine = NULL;
2820cdf0e10cSrcweir 		}
2821cdf0e10cSrcweir 	}
2822cdf0e10cSrcweir }
2823cdf0e10cSrcweir 
2824cdf0e10cSrcweir // -----------------------------------------------------------------------
2825cdf0e10cSrcweir 
Notify(NotifyEvent & rNEvt)2826cdf0e10cSrcweir long ImplCFieldFloatWin::Notify( NotifyEvent& rNEvt )
2827cdf0e10cSrcweir {
2828cdf0e10cSrcweir 	if ( rNEvt.GetType() == EVENT_KEYINPUT )
2829cdf0e10cSrcweir 	{
2830cdf0e10cSrcweir 		const KeyEvent* pKEvt = rNEvt.GetKeyEvent();
2831cdf0e10cSrcweir 		if ( pKEvt->GetKeyCode().GetCode() == KEY_RETURN )
2832cdf0e10cSrcweir 			mpCalendar->Select();
2833cdf0e10cSrcweir 	}
2834cdf0e10cSrcweir 
2835cdf0e10cSrcweir 	return FloatingWindow::Notify( rNEvt );
2836cdf0e10cSrcweir }
2837cdf0e10cSrcweir 
2838cdf0e10cSrcweir // =======================================================================
2839cdf0e10cSrcweir 
CalendarField(Window * pParent,WinBits nWinStyle)2840cdf0e10cSrcweir CalendarField::CalendarField( Window* pParent, WinBits nWinStyle ) :
2841cdf0e10cSrcweir 	DateField( pParent, nWinStyle ),
2842cdf0e10cSrcweir 	maDefaultDate( 0, 0, 0 )
2843cdf0e10cSrcweir {
2844cdf0e10cSrcweir 	mpFloatWin		= NULL;
2845cdf0e10cSrcweir 	mpCalendar		= NULL;
2846cdf0e10cSrcweir 	mnCalendarStyle = 0;
2847cdf0e10cSrcweir 	mbToday 		= sal_False;
2848cdf0e10cSrcweir 	mbNone			= sal_False;
2849cdf0e10cSrcweir }
2850cdf0e10cSrcweir 
2851cdf0e10cSrcweir // -----------------------------------------------------------------------
2852cdf0e10cSrcweir 
CalendarField(Window * pParent,const ResId & rResId)2853cdf0e10cSrcweir CalendarField::CalendarField( Window* pParent, const ResId& rResId ) :
2854cdf0e10cSrcweir 	DateField( pParent, rResId ),
2855cdf0e10cSrcweir 	maDefaultDate( 0, 0, 0 )
2856cdf0e10cSrcweir {
2857cdf0e10cSrcweir 	mpFloatWin		= NULL;
2858cdf0e10cSrcweir 	mpCalendar		= NULL;
2859cdf0e10cSrcweir 	mnCalendarStyle = 0;
2860cdf0e10cSrcweir 	mbToday 		= sal_False;
2861cdf0e10cSrcweir 	mbNone			= sal_False;
2862cdf0e10cSrcweir }
2863cdf0e10cSrcweir 
2864cdf0e10cSrcweir // -----------------------------------------------------------------------
2865cdf0e10cSrcweir 
~CalendarField()2866cdf0e10cSrcweir CalendarField::~CalendarField()
2867cdf0e10cSrcweir {
2868cdf0e10cSrcweir 	if ( mpFloatWin )
2869cdf0e10cSrcweir 	{
2870cdf0e10cSrcweir 		delete mpCalendar;
2871cdf0e10cSrcweir 		delete mpFloatWin;
2872cdf0e10cSrcweir 	}
2873cdf0e10cSrcweir }
2874cdf0e10cSrcweir 
2875cdf0e10cSrcweir // -----------------------------------------------------------------------
2876cdf0e10cSrcweir 
IMPL_LINK(CalendarField,ImplSelectHdl,Calendar *,pCalendar)2877cdf0e10cSrcweir IMPL_LINK( CalendarField, ImplSelectHdl, Calendar*, pCalendar )
2878cdf0e10cSrcweir {
2879cdf0e10cSrcweir 	if ( !pCalendar->IsTravelSelect() )
2880cdf0e10cSrcweir 	{
2881cdf0e10cSrcweir 		mpFloatWin->EndPopupMode();
2882cdf0e10cSrcweir 		EndDropDown();
2883cdf0e10cSrcweir 		GrabFocus();
2884cdf0e10cSrcweir 		Date aNewDate = mpCalendar->GetSelectDate( 0 );
2885cdf0e10cSrcweir 		if ( IsEmptyDate() || ( aNewDate != GetDate() ) )
2886cdf0e10cSrcweir 		{
2887cdf0e10cSrcweir 			SetDate( aNewDate );
2888cdf0e10cSrcweir 			SetModifyFlag();
2889cdf0e10cSrcweir 			Modify();
2890cdf0e10cSrcweir 		}
2891cdf0e10cSrcweir 		Select();
2892cdf0e10cSrcweir 	}
2893cdf0e10cSrcweir 	return 0;
2894cdf0e10cSrcweir }
2895cdf0e10cSrcweir 
2896cdf0e10cSrcweir // -----------------------------------------------------------------------
2897cdf0e10cSrcweir 
IMPL_LINK(CalendarField,ImplClickHdl,PushButton *,pBtn)2898cdf0e10cSrcweir IMPL_LINK( CalendarField, ImplClickHdl, PushButton*, pBtn )
2899cdf0e10cSrcweir {
2900cdf0e10cSrcweir 	mpFloatWin->EndPopupMode();
2901cdf0e10cSrcweir 	EndDropDown();
2902cdf0e10cSrcweir 	GrabFocus();
2903cdf0e10cSrcweir 
2904cdf0e10cSrcweir 	if ( pBtn == mpTodayBtn )
2905cdf0e10cSrcweir 	{
2906cdf0e10cSrcweir 		Date aToday;
2907cdf0e10cSrcweir 		if ( (aToday != GetDate()) || IsEmptyDate() )
2908cdf0e10cSrcweir 		{
2909cdf0e10cSrcweir 			SetDate( aToday );
2910cdf0e10cSrcweir 			SetModifyFlag();
2911cdf0e10cSrcweir 			Modify();
2912cdf0e10cSrcweir 		}
2913cdf0e10cSrcweir 	}
2914cdf0e10cSrcweir 	else if ( pBtn == mpNoneBtn )
2915cdf0e10cSrcweir 	{
2916cdf0e10cSrcweir 		if ( !IsEmptyDate() )
2917cdf0e10cSrcweir 		{
2918cdf0e10cSrcweir 			SetEmptyDate();
2919cdf0e10cSrcweir 			SetModifyFlag();
2920cdf0e10cSrcweir 			Modify();
2921cdf0e10cSrcweir 		}
2922cdf0e10cSrcweir 	}
2923cdf0e10cSrcweir 	Select();
2924cdf0e10cSrcweir 
2925cdf0e10cSrcweir 	return 0;
2926cdf0e10cSrcweir }
2927cdf0e10cSrcweir 
2928cdf0e10cSrcweir // -----------------------------------------------------------------------
2929cdf0e10cSrcweir 
IMPL_LINK(CalendarField,ImplPopupModeEndHdl,FloatingWindow *,EMPTYARG)2930cdf0e10cSrcweir IMPL_LINK( CalendarField, ImplPopupModeEndHdl, FloatingWindow*, EMPTYARG )
2931cdf0e10cSrcweir {
2932cdf0e10cSrcweir 	EndDropDown();
2933cdf0e10cSrcweir 	GrabFocus();
2934cdf0e10cSrcweir 	mpCalendar->EndSelection();
2935cdf0e10cSrcweir 	return 0;
2936cdf0e10cSrcweir }
2937cdf0e10cSrcweir 
2938cdf0e10cSrcweir // -----------------------------------------------------------------------
2939cdf0e10cSrcweir 
Select()2940cdf0e10cSrcweir void CalendarField::Select()
2941cdf0e10cSrcweir {
2942cdf0e10cSrcweir 	maSelectHdl.Call( this );
2943cdf0e10cSrcweir }
2944cdf0e10cSrcweir 
2945cdf0e10cSrcweir // -----------------------------------------------------------------------
2946cdf0e10cSrcweir 
ShowDropDown(sal_Bool bShow)2947cdf0e10cSrcweir sal_Bool CalendarField::ShowDropDown( sal_Bool bShow )
2948cdf0e10cSrcweir {
2949cdf0e10cSrcweir 	if ( bShow )
2950cdf0e10cSrcweir 	{
2951cdf0e10cSrcweir 		Calendar* pCalendar = GetCalendar();
2952cdf0e10cSrcweir 
2953cdf0e10cSrcweir 		Date aDate = GetDate();
2954cdf0e10cSrcweir 		if ( IsEmptyDate() || !aDate.IsValid() )
2955cdf0e10cSrcweir 		{
2956cdf0e10cSrcweir 			if ( maDefaultDate.IsValid() )
2957cdf0e10cSrcweir 				aDate = maDefaultDate;
2958cdf0e10cSrcweir 			else
2959cdf0e10cSrcweir 				aDate = Date();
2960cdf0e10cSrcweir 		}
2961cdf0e10cSrcweir 		if ( pCalendar->GetStyle() & (WB_RANGESELECT | WB_MULTISELECT) )
2962cdf0e10cSrcweir 		{
2963cdf0e10cSrcweir 			pCalendar->SetNoSelection();
2964cdf0e10cSrcweir 			pCalendar->SelectDate( aDate );
2965cdf0e10cSrcweir 		}
2966cdf0e10cSrcweir 		pCalendar->SetCurDate( aDate );
2967cdf0e10cSrcweir 		Point		aPos( GetParent()->OutputToScreenPixel( GetPosPixel() ) );
2968cdf0e10cSrcweir 		Rectangle	aRect( aPos, GetSizePixel() );
2969cdf0e10cSrcweir 		aRect.Bottom() -= 1;
2970cdf0e10cSrcweir 		mpCalendar->SetOutputSizePixel( mpCalendar->CalcWindowSizePixel() );
2971cdf0e10cSrcweir 		mpFloatWin->SetOutputSizePixel( mpCalendar->GetSizePixel() );
2972cdf0e10cSrcweir 		mpFloatWin->SetCalendar( mpCalendar );
2973cdf0e10cSrcweir 		mpTodayBtn = mpFloatWin->EnableTodayBtn( mbToday );
2974cdf0e10cSrcweir 		mpNoneBtn = mpFloatWin->EnableNoneBtn( mbNone );
2975cdf0e10cSrcweir 		if ( mpTodayBtn )
2976cdf0e10cSrcweir 			mpTodayBtn->SetClickHdl( LINK( this, CalendarField, ImplClickHdl ) );
2977cdf0e10cSrcweir 		if ( mpNoneBtn )
2978cdf0e10cSrcweir 			mpNoneBtn->SetClickHdl( LINK( this, CalendarField, ImplClickHdl ) );
2979cdf0e10cSrcweir 		mpFloatWin->ArrangeButtons();
2980cdf0e10cSrcweir 		mpCalendar->EnableCallEverySelect();
2981cdf0e10cSrcweir 		mpCalendar->StartSelection();
2982cdf0e10cSrcweir 		mpCalendar->GrabFocus();
2983cdf0e10cSrcweir 		mpCalendar->Show();
2984cdf0e10cSrcweir 		mpFloatWin->StartPopupMode( aRect, FLOATWIN_POPUPMODE_NOFOCUSCLOSE|FLOATWIN_POPUPMODE_DOWN );
2985cdf0e10cSrcweir 	}
2986cdf0e10cSrcweir 	else
2987cdf0e10cSrcweir 	{
2988cdf0e10cSrcweir 		mpFloatWin->EndPopupMode( FLOATWIN_POPUPMODEEND_CANCEL );
2989cdf0e10cSrcweir 		mpCalendar->EndSelection();
2990cdf0e10cSrcweir 		EndDropDown();
2991cdf0e10cSrcweir 	}
2992cdf0e10cSrcweir 	return sal_True;
2993cdf0e10cSrcweir }
2994cdf0e10cSrcweir 
2995cdf0e10cSrcweir // -----------------------------------------------------------------------
2996cdf0e10cSrcweir 
CreateCalendar(Window * pParent)2997cdf0e10cSrcweir Calendar* CalendarField::CreateCalendar( Window* pParent )
2998cdf0e10cSrcweir {
2999cdf0e10cSrcweir 	return new Calendar( pParent, mnCalendarStyle | WB_TABSTOP );
3000cdf0e10cSrcweir }
3001cdf0e10cSrcweir 
3002cdf0e10cSrcweir // -----------------------------------------------------------------------
3003cdf0e10cSrcweir 
GetCalendar()3004cdf0e10cSrcweir Calendar* CalendarField::GetCalendar()
3005cdf0e10cSrcweir {
3006cdf0e10cSrcweir 	if ( !mpFloatWin )
3007cdf0e10cSrcweir 	{
3008cdf0e10cSrcweir 		mpFloatWin = new ImplCFieldFloatWin( this );
3009cdf0e10cSrcweir 		mpFloatWin->SetPopupModeEndHdl( LINK( this, CalendarField, ImplPopupModeEndHdl ) );
3010cdf0e10cSrcweir 		mpCalendar = CreateCalendar( mpFloatWin );
3011cdf0e10cSrcweir 		mpCalendar->SetPosPixel( Point() );
3012cdf0e10cSrcweir 		mpCalendar->SetSelectHdl( LINK( this, CalendarField, ImplSelectHdl ) );
3013cdf0e10cSrcweir 	}
3014cdf0e10cSrcweir 
3015cdf0e10cSrcweir 	return mpCalendar;
3016cdf0e10cSrcweir }
3017cdf0e10cSrcweir 
3018cdf0e10cSrcweir // -----------------------------------------------------------------------
3019cdf0e10cSrcweir 
StateChanged(StateChangedType nStateChange)3020cdf0e10cSrcweir void CalendarField::StateChanged( StateChangedType nStateChange )
3021cdf0e10cSrcweir {
3022cdf0e10cSrcweir 	DateField::StateChanged( nStateChange );
3023cdf0e10cSrcweir 
3024cdf0e10cSrcweir 	if ( ( nStateChange == STATE_CHANGE_STYLE ) && GetSubEdit() )
3025cdf0e10cSrcweir 	{
3026cdf0e10cSrcweir         WinBits nAllAlignmentBits = ( WB_LEFT | WB_CENTER | WB_RIGHT | WB_TOP | WB_VCENTER | WB_BOTTOM );
3027cdf0e10cSrcweir         WinBits nMyAlignment = GetStyle() & nAllAlignmentBits;
3028cdf0e10cSrcweir         GetSubEdit()->SetStyle( ( GetSubEdit()->GetStyle() & ~nAllAlignmentBits ) | nMyAlignment );
3029cdf0e10cSrcweir 	}
3030cdf0e10cSrcweir }
3031cdf0e10cSrcweir 
3032