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 123 124 125 126 127 128 129 130 131 132 133 134
|
unit CocoaWSDatePicker;
{$mode objfpc}{$H+}
{$modeswitch objectivec1}
interface
uses
CocoaAll,
Classes, SysUtils, Controls, Calendar,
LCLtype, LclProc, WSCalendar,
CocoaInt, CocoaWSCommon, CocoaDatePicker, 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): TLCLHandle; 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);
c.release;
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): TLCLHandle;
var
dp: TCocoaDatePicker;
Params: TCreateParams;
form: TWinControl;
begin
dp:= AllocDatePicker(AWinControl, AParams);
dp.autoResize := true;
dp.retainAspectRatio := true;
if Assigned(dp) then
begin
NSDatePickerCell(TLCLHandle(dp)).setDatePickerStyle(NSDatePickerStyle_ClockCal);
end;
if CocoaWidgetSet.isModalSession then begin
form:= TWinControl(AWinControl.GetTopParent);
if form.HandleAllocated then begin
CocoaWidgetSet.CurModalForm.addChildWindow_ordered(
NSView(form.handle).window, NSWindowAbove );
end;
end;
Result:= TLCLHandle(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
if TCocoaDatePicker(ACalendar.Handle).dateClicked then
exit(cpDate);
// 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.
|