mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-07-17 09:56:10 +02:00
188 lines
4.7 KiB
ObjectPascal
188 lines
4.7 KiB
ObjectPascal
unit CocoaDatePicker;
|
|
|
|
{$mode objfpc}{$H+}
|
|
{$modeswitch objectivec1}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils,
|
|
CocoaAll, CocoaUtils, CocoaPrivate, cocoa_extra;
|
|
|
|
|
|
type
|
|
{ TCocoaDatePicker }
|
|
|
|
TCocoaDatePicker = objcclass(NSDatePicker)
|
|
public
|
|
callback: ICommonCallback;
|
|
dateClicked: boolean;
|
|
autoResize: boolean;
|
|
retainAspectRatio: boolean;
|
|
|
|
function lclGetCallback: ICommonCallback; override;
|
|
procedure lclClearCallback; override;
|
|
|
|
procedure mouseDown(event: NSEvent); override;
|
|
procedure mouseUp(event: NSEvent); override;
|
|
procedure mouseMoved(event: NSEvent); override;
|
|
procedure mouseDragged(event: NSEvent); override;
|
|
procedure rightMouseDown(event: NSEvent); override;
|
|
procedure rightMouseUp(event: NSEvent); override;
|
|
procedure rightMouseDragged(event: NSEvent); override;
|
|
procedure otherMouseDown(event: NSEvent); override;
|
|
procedure otherMouseUp(event: NSEvent); override;
|
|
procedure otherMouseDragged(event: NSEvent); override;
|
|
procedure scrollWheel(event: NSEvent); override;
|
|
|
|
function acceptsFirstResponder: LCLObjCBoolean; override;
|
|
|
|
procedure setFrame(aframe: NSRect); override;
|
|
end;
|
|
|
|
implementation
|
|
|
|
procedure TCocoaDatePicker.mouseDown(event: NSEvent);
|
|
Var
|
|
oldDate, newDate: TDateTime;
|
|
begin
|
|
if assigned(callback) then
|
|
begin
|
|
// Save Date BEFORE mouse click/down event
|
|
oldDate:= NSDateToDateTime(Self.dateValue);
|
|
|
|
if not callback.MouseUpDownEvent(event) then
|
|
begin
|
|
// Without this, Cocoa will not update our NSDatePicker date...
|
|
inherited mouseDown(event);
|
|
|
|
// After mouse event, has our date changed
|
|
newDate:= NSDateToDateTime(Self.dateValue);
|
|
dateClicked:= (oldDate <> newDate);
|
|
if dateClicked and Assigned(callback) then
|
|
callback.SendOnChange;
|
|
|
|
// This also calls OnClick....
|
|
if Assigned(callback) then
|
|
callback.MouseUpDownEvent(event, true);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TCocoaDatePicker.mouseMoved(event: NSEvent);
|
|
begin
|
|
if not callback.MouseMove(event) then
|
|
inherited mouseMoved(event);
|
|
end;
|
|
|
|
|
|
function TCocoaDatePicker.acceptsFirstResponder: LCLObjCBoolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
function TCocoaDatePicker.lclGetCallback: ICommonCallback;
|
|
begin
|
|
Result := callback;
|
|
end;
|
|
|
|
procedure TCocoaDatePicker.lclClearCallback;
|
|
begin
|
|
callback := nil;
|
|
end;
|
|
|
|
procedure TCocoaDatePicker.setFrame(aframe: NSRect);
|
|
var
|
|
fsz : NSSize;
|
|
sz : NSSize;
|
|
rt : double;
|
|
wr : double;
|
|
hr : double;
|
|
begin
|
|
inherited setFrame(aframe);
|
|
if not autoResize then Exit;
|
|
|
|
if Self.respondsToSelector(objcselector('fittingSize')) then
|
|
fsz:=fittingSize
|
|
else
|
|
begin
|
|
// hardcoded size of a Calendar for MacOSX 10.6
|
|
// as can be seen in Interface Builder
|
|
fsz.width := 139;
|
|
fsz.height := 148;
|
|
end;
|
|
|
|
if (fsz.width=0) or (fsz.height=0) then Exit;
|
|
sz:=frame.size;
|
|
// resize even if too small already
|
|
|
|
if retainAspectRatio and (fsz.height>0) and (fsz.width>0)then
|
|
begin
|
|
rt:=fsz.width/fsz.height;
|
|
wr:=sz.width / fsz.width;
|
|
hr:=sz.height / fsz.height;
|
|
if wr > hr then
|
|
fsz.width:=fsz.width * sz.width / (sz.height*rt)
|
|
else
|
|
fsz.height:=fsz.height * sz.height / (sz.width / rt);
|
|
end;
|
|
setBoundsSize(fsz);
|
|
end;
|
|
|
|
procedure TCocoaDatePicker.mouseUp(event: NSEvent);
|
|
begin
|
|
if not Assigned(callback) or not callback.MouseUpDownEvent(event) then
|
|
inherited mouseUp(event);
|
|
end;
|
|
|
|
procedure TCocoaDatePicker.rightMouseDown(event: NSEvent);
|
|
begin
|
|
if not Assigned(callback) or not callback.MouseUpDownEvent(event) then
|
|
inherited rightMouseDown(event);
|
|
end;
|
|
|
|
procedure TCocoaDatePicker.rightMouseUp(event: NSEvent);
|
|
begin
|
|
if not Assigned(callback) or not callback.MouseUpDownEvent(event) then
|
|
inherited rightMouseUp(event);
|
|
end;
|
|
|
|
procedure TCocoaDatePicker.rightMouseDragged(event: NSEvent);
|
|
begin
|
|
if not Assigned(callback) or not callback.MouseMove(event) then
|
|
inherited rightMouseDragged(event);
|
|
end;
|
|
|
|
procedure TCocoaDatePicker.mouseDragged(event: NSEvent);
|
|
begin
|
|
if not Assigned(callback) or not callback.MouseMove(event) then
|
|
inherited mouseDragged(event);
|
|
end;
|
|
|
|
procedure TCocoaDatePicker.otherMouseDown(event: NSEvent);
|
|
begin
|
|
if not Assigned(callback) or not callback.MouseUpDownEvent(event) then
|
|
inherited otherMouseDown(event);
|
|
end;
|
|
|
|
procedure TCocoaDatePicker.otherMouseUp(event: NSEvent);
|
|
begin
|
|
if not Assigned(callback) or not callback.MouseUpDownEvent(event) then
|
|
inherited otherMouseUp(event);
|
|
end;
|
|
|
|
procedure TCocoaDatePicker.otherMouseDragged(event: NSEvent);
|
|
begin
|
|
if not Assigned(callback) or not callback.MouseMove(event) then
|
|
inherited otherMouseDragged(event);
|
|
end;
|
|
|
|
procedure TCocoaDatePicker.scrollWheel(event: NSEvent);
|
|
begin
|
|
if not Assigned(callback) or not callback.scrollWheel(event) then
|
|
inherited scrollWheel(event);
|
|
end;
|
|
|
|
end.
|
|
|