From 3f589dad6a1455ed9cb001bc1274fd16d73872c4 Mon Sep 17 00:00:00 2001 From: dmitry Date: Tue, 22 Sep 2009 13:24:16 +0000 Subject: [PATCH] carbon: added GetDate/SetDate for carbon calendar git-svn-id: trunk@21818 - --- lcl/interfaces/carbon/carboncalendar.pas | 29 ++++++++++++ lcl/interfaces/carbon/carboncalendarview.pas | 32 +++++++------- lcl/interfaces/carbon/carbonwscalendar.pp | 46 ++++++++++++++++---- 3 files changed, 84 insertions(+), 23 deletions(-) diff --git a/lcl/interfaces/carbon/carboncalendar.pas b/lcl/interfaces/carbon/carboncalendar.pas index 17b5f6a374..4001bebea4 100644 --- a/lcl/interfaces/carbon/carboncalendar.pas +++ b/lcl/interfaces/carbon/carboncalendar.pas @@ -23,6 +23,8 @@ unit CarbonCalendar; interface uses + // System + MacOSAll, // FCL Classes, SysUtils, // LCL @@ -37,6 +39,10 @@ type TCarbonCalendar = class(TCarbonControl) protected procedure CreateWidget(const AParams: TCreateParams); override; + procedure SetDateTime(const aDate: TDateTime); + function GetDateTime: TDateTime; + public + property DateTime: TDateTime read GetDateTime write SetDateTime; end; implementation @@ -49,6 +55,29 @@ begin Self, 'CreateWidget', 'CalendarViewCreate') then RaiseCreateWidgetError(LCLObject); end; +procedure TCarbonCalendar.SetDateTime(const aDate: TDateTime); +var + date : CFGregorianDate; + y, m, d : Word; +begin + DecodeDate(aDate, y,m,d); + FillChar(date, sizeof(date), 0); + date.day := d; + date.month := m; + date.year := y; + CalendarSetDate(Widget, date); +end; + +function TCarbonCalendar.GetDateTime: TDateTime; +var + date : CFGregorianDate; +begin + CalendarGetDate(Widget, date); + with date do + writeln(date.year,' / ',date.month, ' / ',date.day); + Result := EncodeDate(date.year, date.month, date.day); +end; + end. diff --git a/lcl/interfaces/carbon/carboncalendarview.pas b/lcl/interfaces/carbon/carboncalendarview.pas index 22436e8636..aa388c8674 100644 --- a/lcl/interfaces/carbon/carboncalendarview.pas +++ b/lcl/interfaces/carbon/carboncalendarview.pas @@ -54,12 +54,12 @@ function CalendarSetDate(Calendar: ControlRef; const Date: CFGregorianDate): Boo // ----------------------------------------------------------------------------- // const - kControlCalendarTitleRatioTag = 'tRat'; // float - kControlCalendarDayNameRatioTag = 'nRat'; // float - kControlCalendarDayRatioTag = 'dRat'; // float - kControlCalendarDateTag = 'Date'; // CFGregorianDate -- on Set, day, hour, etc are ignored - kControlCalendarDrawProcTag = 'Draw'; // CalendarDrawUPP - kControlCalendarLabelProcTag = 'Labl'; // CalendarDrawUPP + kControlCalendarTitleRatioTag = {$IFDEF FPC_LITTLE_ENDIAN}$74615274{$else}$74526174{$endif}; //tRat float + kControlCalendarDayNameRatioTag = {$IFDEF FPC_LITTLE_ENDIAN}$7461526E{$else}$6E526174{$endif}; //nRat float + kControlCalendarDayRatioTag = {$IFDEF FPC_LITTLE_ENDIAN}$74615264{$else}$64526174{$endif}; //dRat float + kControlCalendarDateTag = {$IFDEF FPC_LITTLE_ENDIAN}$65746144{$else}$44617465{$endif}; //Date CFGregorianDate -- on Set, day, hour, etc are ignored + kControlCalendarDrawProcTag = {$IFDEF FPC_LITTLE_ENDIAN}$77617244{$else}$44726177{$endif}; //Draw CalendarDrawUPP + kControlCalendarLabelProcTag = {$IFDEF FPC_LITTLE_ENDIAN}$6C62614C{$else}$4C61626C{$endif}; //Labl CalendarDrawUPP // ----------------------------------------------------------------------------- // CalendarView Draw/LabelProc callback data and prototypes @@ -713,10 +713,6 @@ end; // ----------------------------------------------------------------------------- // -type - FourCharStr = string[4]; - FourCharStrPtr = ^FourCharStr; - function CalendarViewGetData(inEvent : EventRef; const inData: CalendarViewData): OSStatus; var part : ControlPartCode; @@ -737,7 +733,7 @@ begin Result := GetEventParameter( inEvent, kEventParamControlDataBufferSize, typeLongInteger, nil, sizeof( Size ), nil, @sz ); if Result <> noErr then Exit; - case FourCharStrPtr(@tag)^ of + case tag of kControlCalendarTitleRatioTag: begin if sz = sizeof( single ) then @@ -767,6 +763,7 @@ begin kControlCalendarDateTag: begin + writeln('getting the date!'); if sz = sizeof( CFGregorianDate ) then begin CFGregorianDatePtr(ptr)^ := inData.date; if (inData.selDay>0) and (inData.selDay noErr then Exit; - case FourCharStrPtr(@tag)^ of + case tag of kControlCalendarTitleRatioTag: if sz = sizeof( single ) then inData.titleRowRatio := PSingle(ptr)^ @@ -1066,14 +1063,19 @@ function CalendarGetDate(Calendar: ControlRef; var Date: CFGregorianDate): Boole begin Result := isValidCalendarControl(Calendar); if not Result then Exit; - Result := GetControlData(Calendar, kControlEntireControl, LongWord(kControlCalendarDateTag), sizeof(Date), @Date, nil) = noErr; + Result := GetControlData(Calendar, kControlEntireControl, + kControlCalendarDateTag, sizeof(Date), @Date, nil) = noErr; end; function CalendarSetDate(Calendar: ControlRef; const Date: CFGregorianDate): Boolean; begin Result := isValidCalendarControl(Calendar); - if not Result then Exit; - Result := SetControlData(Calendar, kControlEntireControl, LongWord(kControlCalendarDateTag), sizeof(Date), @Date) = noErr; + if not Result then begin + writeln('not calendar!'); + Exit; + end; + writeln('calendar!'); + Result := SetControlData(Calendar, kControlEntireControl, kControlCalendarDateTag, sizeof(Date), @Date) = noErr; end; diff --git a/lcl/interfaces/carbon/carbonwscalendar.pp b/lcl/interfaces/carbon/carbonwscalendar.pp index abac366896..730969bfb2 100644 --- a/lcl/interfaces/carbon/carbonwscalendar.pp +++ b/lcl/interfaces/carbon/carbonwscalendar.pp @@ -26,17 +26,18 @@ unit CarbonWSCalendar; interface -uses //////////////////////////////////////////////////// -// I M P O R T A N T +// I M P O R T A N T //////////////////////////////////////////////////// // To get as little as posible circles, // uncomment only when needed for registration //////////////////////////////////////////////////// -// Calendar, -//////////////////////////////////////////////////// - Controls, LCLType, - WSCalendar, WSLCLClasses, CarbonCalendar; + +uses + Types, + LCLType, Controls, Calendar, + WSCalendar, WSLCLClasses, + CarbonDef, CarbonCalendar; type @@ -44,8 +45,12 @@ type TCarbonWSCustomCalendar = class(TWSCustomCalendar) published - class function CreateHandle(const AWinControl: TWinControl; - const AParams: TCreateParams): TLCLIntfHandle; override; + class function CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): TLCLIntfHandle; override; + class function GetDateTime(const ACalendar: TCustomCalendar): TDateTime; override; + class procedure SetDateTime(const ACalendar: TCustomCalendar; const ADateTime: TDateTime); override; + class function HitTest(const ACalendar: TCustomCalendar; const APoint: TPoint): TCalendarPart; override; + class procedure SetDisplaySettings(const ACalendar: TCustomCalendar; + const ADisplaySettings: TDisplaySettings); override; end; @@ -59,6 +64,31 @@ begin Result := TLCLIntfHandle(TCarbonCalendar.Create(AWinControl, AParams)); end; +class function TCarbonWSCustomCalendar.GetDateTime(const ACalendar: TCustomCalendar): TDateTime; +begin + if not CheckHandle(ACalendar, Self, 'GetDateTime') then Exit; + Result := TCarbonCalendar(ACalendar.Handle).DateTime; +end; + +class procedure TCarbonWSCustomCalendar.SetDateTime(const ACalendar: TCustomCalendar; const ADateTime: TDateTime); +begin + if not CheckHandle(ACalendar, Self, 'SetDateTime') then Exit; + TCarbonCalendar(ACalendar.Handle).DateTime := ADateTime; +end; + +class function TCarbonWSCustomCalendar.HitTest( + const ACalendar: TCustomCalendar; const APoint: TPoint): TCalendarPart; +begin + //TODO + Result:=inherited HitTest(ACalendar, APoint); +end; + +class procedure TCarbonWSCustomCalendar.SetDisplaySettings( + const ACalendar: TCustomCalendar; const ADisplaySettings: TDisplaySettings); +begin + //TODO: +end; + initialization ////////////////////////////////////////////////////