File: cocoawsdatepicker.pas

package info (click to toggle)
lazarus 2.0.0%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 214,460 kB
  • sloc: pascal: 1,862,622; xml: 265,709; cpp: 56,595; sh: 3,008; java: 609; makefile: 535; perl: 297; sql: 222; ansic: 137
file content (170 lines) | stat: -rwxr-xr-x 5,046 bytes parent folder | download
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.