1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
|
unit CocoaWSDatePicker;
{$mode objfpc}{$H+}
{$modeswitch objectivec1}
interface
uses
CocoaAll,
Classes, SysUtils, Controls, Calendar,
WSCalendar, CocoaWSCommon, CocoaDatePicker,
LCLtype, LclProc, LMessages, LCLMessageGlue,
CocoaUtils, CocoaPrivate;
const
singleDateMode = 0;
rangeDateMode = 1;
NSDatePickerStyle_Stepper = 0;
NSDatePickerStyle_ClockCal = 1;
NSDatePickerStyle_Edit = 2;
NSHourMinuteDatePickerElementFlag = $000c;
NSHourMinuteSecondDatePickerElementFlag = $000e;
NSTimeZoneDatePickerElementFlag = $0010;
NSYearMonthDatePickerElementFlag = $00c0;
NSYearMonthDayDatePickerElementFlag = $00e0;
NSEraDatePickerElementFlag = $0100;
type
TCocoaWSCustomCalendar = class(TWSCustomCalendar)
published
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;
end;
implementation
function AnsiStrToNSStr(value : AnsiString): NSString;
begin
Result:= NSStringUtf8(String(value));
end;
function NSStrToAnsiStr(value: NSString): AnsiString;
begin
Result:= AnsiString(NSStringToString(value));
end;
function AllocDatePicker(const ATarget: TWinControl; const AParams: TCreateParams): TCocoaDatePicker;
var
ns : NSString;
nsc: NSString;
c : NSCalendar;
flags : NSDatePickerElementFlags;
mode : NSDatePickerMode;
begin
Result:= TCocoaDatePicker.alloc.lclInitWithCreateParams(AParams);
if Assigned(Result) then
begin
flags:= NSYearMonthDayDatePickerElementFlag;
Result.setDatePickerElements(flags);
Result.setTimeZone(NSTimeZone.localTimeZone);
Result.setDateValue(DateTimeToNSDate(Now));
Result.setDatePickerStyle(NSDatePickerStyle_Stepper);
mode:= singleDateMode;
Result.setDatePickerMode(mode);
c := NSCalendar.alloc.initWithCalendarIdentifier(NSString.string_);
Result.setCalendar(c);
TCocoaDatePicker(Result).callback:= TLCLCommonCallback.Create(Result, ATarget);
Result.setBezeled(True);
//Result.setBordered(True);
end;
end;
class function TCocoaWSCustomCalendar.CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): TLCLIntfHandle;
var
dp: TCocoaDatePicker;
Params: TCreateParams;
begin
dp:= AllocDatePicker(AWinControl, AParams);
dp.autoResize := true;
dp.retainAspectRatio := true;
if Assigned(dp) then
begin
NSDatePickerCell(TLCLIntfHandle(dp)).setDatePickerStyle(NSDatePickerStyle_ClockCal);
end;
Result:= TLCLIntfHandle(dp);
end;
class function TCocoaWSCustomCalendar.GetDateTime(const ACalendar: TCustomCalendar): TDateTime;
begin
Result:= NSDateToDateTime(NSDatePickerCell(ACalendar.Handle).dateValue);
end;
class procedure TCocoaWSCustomCalendar.SetDateTime(const ACalendar: TCustomCalendar; const ADateTime: TDateTime);
begin
NSDatePickerCell(ACalendar.Handle).setDateValue(DateTimeToNSDate(ADateTime));
end;
class function TCocoaWSCustomCalendar.HitTest(const ACalendar: TCustomCalendar; const APoint: TPoint): TCalendarPart;
begin
// need to validate this decision...
//Debugln('TCocoaWSCustomCalendar.HitTest Mouse Y : ' + IntToStr(APoint.y));
if APoint.y >= 40 then
Result:= cpDate
else
Result:= cpTitle;
end;
end.
|