From b839964d8e545651638da59586e3153ebadadc25 Mon Sep 17 00:00:00 2001 From: sekelsenmat Date: Fri, 7 Mar 2008 11:33:19 +0000 Subject: [PATCH] Improves the statusitem example. git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@372 8e941d3f-bd1b-0410-a28a-d453659cc2b4 --- .../pascocoa/examples/statusitem/actions.pas | 76 ++++++++++++ .../examples/statusitem/statusitem.lpi | 114 +++++++++++++----- .../examples/statusitem/statusitem.pas | 49 ++------ .../pascocoa/foundation/NSAutoreleasePool.inc | 9 -- bindings/pascocoa/foundation/NSObject.inc | 4 +- 5 files changed, 173 insertions(+), 79 deletions(-) create mode 100644 bindings/pascocoa/examples/statusitem/actions.pas diff --git a/bindings/pascocoa/examples/statusitem/actions.pas b/bindings/pascocoa/examples/statusitem/actions.pas new file mode 100644 index 000000000..4861cd49e --- /dev/null +++ b/bindings/pascocoa/examples/statusitem/actions.pas @@ -0,0 +1,76 @@ +{ + actions.pas + + This example project is released under public domain + + AUTHORS: Felipe Monteiro de Carvalho +} +unit actions; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, foundation, objc, appkit, FPCMacOSAll; + +type + + { TMyActionList } + + TMyActionList = class(NSObject) + public + { Extra binding functions } + constructor Create; override; + procedure AddMethods; + { Fields } + bar: NSStatusBar; + item: NSStatusItem; + end; + +{ Objective-c Methods } +procedure doShowStatusitem(param1: objc.id; param2: SEL; param3: objc.id); cdecl; + +var + actionList: TMyActionList; + +implementation + +{ TMyActionList } + +procedure TMyActionList.AddMethods; +var + method_list: Pobjc_method_list; +begin + { Adds methods to the class } + + method_list := GetMem(SizeOf(objc_method_list)); { We can't free this until the last instance is freed } + + method_list^.method_count := 1; + method_list^.method_list[0].method_name := sel_registerName('doShowStatusitem:'); + { The first parameter is the result (v = void), + followed by self and _cmd (@ = id and : = SEL), + and on the end "sender" (@ = id) } + method_list^.method_list[0].method_types := 'v@:@'; + method_list^.method_list[0].method_imp := IMP(@doShowStatusitem); + class_addMethods(ClassId, method_list); +end; + +constructor TMyActionList.Create; +begin + inherited Create; + + AddMethods(); + + bar := NSStatusBar.systemStatusBar(); +end; + +{ Objective-c Methods } + +procedure doShowStatusitem(param1: objc.id; param2: SEL; param3: objc.id); cdecl; +begin + actionList.item := actionList.bar.statusItemWithLength(NSSquareStatusItemLength); +end; + +end. + diff --git a/bindings/pascocoa/examples/statusitem/statusitem.lpi b/bindings/pascocoa/examples/statusitem/statusitem.lpi index a2b5f7de6..a5ae09980 100644 --- a/bindings/pascocoa/examples/statusitem/statusitem.lpi +++ b/bindings/pascocoa/examples/statusitem/statusitem.lpi @@ -7,7 +7,7 @@ - + @@ -26,15 +26,15 @@ - + - - + + - + @@ -60,7 +60,7 @@ - + @@ -124,8 +124,10 @@ - + + + @@ -158,16 +160,16 @@ - - + + - - - + + + @@ -216,24 +218,24 @@ - - - - + + + + - - - + + + - - + + @@ -248,20 +250,78 @@ + + + + + + + + + + - + - + - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bindings/pascocoa/examples/statusitem/statusitem.pas b/bindings/pascocoa/examples/statusitem/statusitem.pas index 354adf715..f597f54b7 100644 --- a/bindings/pascocoa/examples/statusitem/statusitem.pas +++ b/bindings/pascocoa/examples/statusitem/statusitem.pas @@ -16,7 +16,7 @@ program statusitem; {$mode delphi} uses - objc, ctypes, FPCMacOSAll, AppKit, Foundation; + objc, ctypes, FPCMacOSAll, AppKit, Foundation, actions; const Str_Window_Title = 'StatusItem example project'; @@ -27,45 +27,10 @@ var MainWindow: NSWindow; MainWindowView: NSView; MyButton: NSButton; - bar: NSStatusBar; - item: NSStatusItem; { strings } CFTitle, CFButtonText: CFStringRef; { sizes } MainWindowRect, ButtonRect: NSRect; - -type - TMyWindow = class(NSWindow) - public - { Extra binding functions } - function getClass: objc.id; override; - end; - -procedure doShowStatusitem(param1: objc.id; param2: SEL; param3: objc.id); cdecl; -begin - item := bar.statusItemWithLength(NSSquareStatusItemLength); -end; - -function TMyWindow.getClass: objc.id; -var - method_list: Pobjc_method_list; -begin - Result := objc_getClass(Str_NSWindow); - - { Adds methods to the class } - - method_list := GetMem(SizeOf(objc_method_list)); { We can't free this until the last instance is freed } - - method_list.method_count := 1; - method_list.method_list[0].method_name := sel_registerName('doShowStatusitem:'); - { The first parameter is the result (v = void), - followed by self and _cmd (@ = id and : = SEL), - and on the end "sender" (@ = id) } - method_list.method_list[0].method_types := 'v@:@'; - method_list.method_list[0].method_imp := IMP(@doShowStatusitem); - class_addMethods(Result, method_list); -end; - begin { Creates the AutoreleasePool } pool := NSAutoreleasePool.Create; @@ -80,7 +45,7 @@ begin MainWindowRect.size.width := 300.0; MainWindowRect.size.height := 500.0; - MainWindow := TMyWindow.initWithContentRect(MainWindowRect, + MainWindow := NSWindow.initWithContentRect(MainWindowRect, NSTitledWindowMask or NSClosableWindowMask or NSMiniaturizableWindowMask or NSResizableWindowMask, NSBackingStoreBuffered, NO); MainWindowView := NSView.CreateWithHandle(MainWindow.contentView); @@ -88,6 +53,10 @@ begin CFTitle := CFStringCreateWithPascalString(nil, Str_Window_Title, kCFStringEncodingUTF8); MainWindow.setTitle(CFTitle); + { Initializes the action responding object } + + actionList := TMyActionList.Create(); + { Puts some buttons on the window } CFButtonText := CFStringCreateWithPascalString(nil, Str_Show_Button, kCFStringEncodingUTF8); @@ -99,13 +68,9 @@ begin MyButton.setStringValue(CFButtonText); MyButton.setBezelStyle(NSRoundedBezelStyle); MyButton.setAction(sel_registerName('doShowStatusitem:')); - MyButton.setTarget(MainWindow.Handle); + MyButton.setTarget(actionList.Handle); MainWindowView.addSubview(MyButton); - { Initializes the StatusBar object } - - bar := NSStatusBar.systemStatusBar(); - { Enters main message loop } MainWindow.orderFrontRegardless; diff --git a/bindings/pascocoa/foundation/NSAutoreleasePool.inc b/bindings/pascocoa/foundation/NSAutoreleasePool.inc index b385439e6..6607bd7c6 100644 --- a/bindings/pascocoa/foundation/NSAutoreleasePool.inc +++ b/bindings/pascocoa/foundation/NSAutoreleasePool.inc @@ -21,7 +21,6 @@ const NSAutoreleasePool = class(NSObject) public - constructor Create; override; { Extra binding functions } function getClass: objc.id; override; public @@ -45,13 +44,5 @@ begin Result := objc_getClass(Str_NSAutoreleasePool); end; -constructor NSAutoreleasePool.Create; -begin - { NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; } - ClassId := getClass(); - allocbuf := objc_msgSend(ClassId, sel_registerName(PChar(Str_alloc)), []); - Handle := objc_msgSend(allocbuf, sel_registerName(PChar(Str_init)), []); -end; - {$endif} diff --git a/bindings/pascocoa/foundation/NSObject.inc b/bindings/pascocoa/foundation/NSObject.inc index 9eff76f94..eb8783b27 100644 --- a/bindings/pascocoa/foundation/NSObject.inc +++ b/bindings/pascocoa/foundation/NSObject.inc @@ -161,7 +161,9 @@ FOUNDATION_EXPORT unsigned NSExtraRefCount(id object);} constructor NSObject.Create; begin - + ClassId := getClass(); + allocbuf := objc_msgSend(ClassId, sel_registerName(PChar(Str_alloc)), []); + Handle := objc_msgSend(allocbuf, sel_registerName(PChar(Str_init)), []); end; constructor NSObject.CreateWithHandle(aHandle: objc.id);