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 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
|
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
TLCLDatePickerCallback = class(TLCLCommonCallback, IDatePickerCallback)
public
procedure MouseBtnUp; virtual;
end;
TLCLDatePickerCallBackClass = class of TLCLDatePickerCallBack;
TCocoaWSCustomCalendar = class(TWSCustomCalendar)
private
class procedure SetMouseTracking(winHandle: THandle; const AParams: TCreateParams);
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;
procedure TLCLDatePickerCallback.MouseBtnUp;
begin
if not Owner.lclIsEnabled() then Exit;
SendSimpleMessage(Target, LM_LBUTTONUP);
end;
function AllocDatePicker(const ATarget: TWinControl; const AParams: TCreateParams): TCocoaDatePicker;
var
ns : NSString;
tz : NSTimeZone;
nsc: NSString;
c : NSCalendar;
flags : NSDatePickerElementFlags;
mode : NSDatePickerMode;
begin
Result:= TCocoaDatePicker.alloc.lclInitWithCreateParams(AParams);
if Assigned(Result) then
begin
flags:= NSYearMonthDayDatePickerElementFlag;
Result.setDatePickerElements(flags);
ns:= AnsiStrToNSStr('GMT+00:00');
tz:= NSTimeZone.alloc.initWithName(ns);
Result.setTimeZone(tz);
Result.setDateValue(DateTimeToNSDate(Now));
Result.setDatePickerStyle(NSDatePickerStyle_Stepper);
mode:= singleDateMode;
Result.setDatePickerMode(mode);
nsc:= AnsiStrToNSStr(''); // NSCalendarIdentifierISO8601 NSCalendarIdentifierGregorian
c := NSCalendar.alloc.initWithCalendarIdentifier(nsc);
Result.setCalendar(c);
TCocoaDatePicker(Result).callback:= TLCLDatePickerCallBackClass.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;
sz: NSSize;
rt: double;
fsz: NSSize;
w: double;
begin
dp:= AllocDatePicker(AWinControl, AParams);
dp.autoResize := true;
dp.retainAspectRatio := true;
if Assigned(dp) then
begin
NSDatePickerCell(TLCLIntfHandle(dp)).setDatePickerStyle(NSDatePickerStyle_ClockCal);
// Must have Top/Left @ Zero...
Params:= AParams;
Params.X:= 0;
Params.Y:= 0;
// This should be called when OnMouseMove is assigned...
SetMouseTracking(TLCLIntfHandle(dp), Params);
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;
class procedure TCocoaWSCustomCalendar.SetMouseTracking(winHandle: THandle; const AParams: TCreateParams);
var
ta : NSTrackingArea;
r : NSRect;
opt : NSTrackingAreaOptions;
begin
r.origin.x := AParams.X;
r.origin.y := AParams.Y;
r.size.height:= AParams.Height;
r.size.width := AParams.Width;
opt:= NSTrackingMouseEnteredAndExited + NSTrackingMouseMoved + NSTrackingActiveAlways;
ta:= NSTrackingArea.alloc.initWithRect_options_owner_userInfo(r, opt, id(winHandle), nil);
TCocoaDatePicker(winHandle).addTrackingArea(ta);
end;
end.
|