carbon: added GetDate/SetDate for carbon calendar

git-svn-id: trunk@21818 -
This commit is contained in:
dmitry 2009-09-22 13:24:16 +00:00
parent 4209ed3b45
commit 3f589dad6a
3 changed files with 84 additions and 23 deletions

View File

@ -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.

View File

@ -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<inData.daysInMonth) then
@ -827,7 +824,7 @@ begin
Result := GetEventParameter( inEvent, kEventParamControlDataBufferSize, typeLongInteger, nil, sizeof( sz ), nil, @sz );
if Result <> 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;

View File

@ -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
////////////////////////////////////////////////////