From bad6d748acf97a48a9edb7652b7f8b84d5c5ef27 Mon Sep 17 00:00:00 2001 From: Naohide Sano Date: Sun, 13 Mar 2022 16:20:42 +0900 Subject: [PATCH 01/36] fix #5 --- rococoa-auto/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rococoa-auto/pom.xml b/rococoa-auto/pom.xml index 12d115c..b21b8a8 100644 --- a/rococoa-auto/pom.xml +++ b/rococoa-auto/pom.xml @@ -59,7 +59,7 @@ nativelibs4java NativeLibs4Java - http://nativelibs4java.sourceforge.net/maven + https://nativelibs4java.sourceforge.net/maven sonatype-oss-public From 2292e70b0490ea2017a29567d37dddd51c7eb419 Mon Sep 17 00:00:00 2001 From: Naohide Sano Date: Fri, 30 Sep 2022 12:50:45 +0900 Subject: [PATCH 02/36] [core-image] add core image related --- .../rococoa/cocoa/appkit/AppKitLibrary.java | 2 + .../cocoa/appkit/NSGraphicsContext.java | 30 + .../org/rococoa/cocoa/appkit/NSImage.java | 6 + .../org/rococoa/cocoa/appkit/NSOpenPanel.java | 8 +- .../main/java/org/rococoa/cocoa/NSWindow.java | 29 - .../rococoa/cocoa/appkit/NSActionCell.java | 42 + .../cocoa/{ => appkit}/NSApplication.java | 20 +- .../org/rococoa/cocoa/appkit/NSButton.java | 278 +++ .../rococoa/cocoa/appkit/NSButtonCell.java | 389 ++++ .../java/org/rococoa/cocoa/appkit/NSCell.java | 1045 ++++++++++ .../org/rococoa/cocoa/appkit/NSControl.java | 384 ++++ .../NSDistributedNotificationCenter.java | 4 +- .../cocoa/{ => appkit}/NSDockTile.java | 2 +- .../org/rococoa/cocoa/appkit/NSEvent.java | 663 +++++++ .../java/org/rococoa/cocoa/appkit/NSFont.java | 543 ++++++ .../appkit/NSInvocationOperation.java | 2 +- .../rococoa/cocoa/{ => appkit}/NSMenu.java | 2 +- .../org/rococoa/cocoa/appkit/NSMenuItem.java | 355 ++++ .../appkit/NSOperation.java | 2 +- .../appkit/NSOperationQueue.java | 4 +- .../org/rococoa/cocoa/appkit/NSPanel.java | 73 + .../org/rococoa/cocoa/appkit/NSResponder.java | 681 +++++++ .../org/rococoa/cocoa/appkit/NSScreen.java | 97 + .../appkit/NSSpeechDictionary.java | 4 +- .../appkit/NSSpeechSynthesizer.java | 4 +- .../java/org/rococoa/cocoa/appkit/NSText.java | 508 +++++ .../rococoa/cocoa/appkit/NSTextFieldCell.java | 117 ++ .../NSTitlebarAccessoryViewController.java | 45 + .../org/rococoa/cocoa/appkit/NSToolbar.java | 228 +++ .../rococoa/cocoa/appkit/NSToolbarItem.java | 245 +++ .../appkit/NSValidatedUserInterfaceItem.java | 37 + .../java/org/rococoa/cocoa/appkit/NSView.java | 1130 +++++++++++ .../{contrib => cocoa}/appkit/NSVoice.java | 20 +- .../org/rococoa/cocoa/appkit/NSWindow.java | 1716 +++++++++++++++++ .../rococoa/cocoa/coregraphics/CGImage.java | 105 + .../rococoa/cocoa/coregraphics/CGLibrary.java | 62 + .../rococoa/cocoa/coregraphics/CGPoint.java | 51 + .../rococoa/cocoa/coregraphics/CGRect.java | 51 + .../rococoa/cocoa/coregraphics/CGSize.java | 51 + .../org/rococoa/cocoa/coreimage/CIColor.java | 37 + .../rococoa/cocoa/coreimage/CIContext.java | 33 + .../org/rococoa/cocoa/coreimage/CIFilter.java | 49 + .../org/rococoa/cocoa/coreimage/CIImage.java | 35 + .../cocoa/foundation/CFAllocatorRef.java | 23 + .../rococoa/cocoa/foundation/CFStringRef.java | 31 + .../foundation/FoundationKitFunctions.java | 325 ++++ .../cocoa/foundation/NSAttributedString.java | 370 ++++ .../rococoa/cocoa/foundation/NSThread.java | 41 + .../contrib/dispatch/GCDExecutorService.java | 6 +- .../java/org/rococoa/contrib/growl/Growl.java | 4 +- .../cocoa/appkit/NSApplicationTest.java | 39 + .../appkit/NSOperationQueueTest.java | 5 +- .../appkit/NSSpeechSynthesizerTest.java | 67 +- .../appkit/NSVoiceTest.java | 5 +- .../cocoa/coregraphics/CGLibraryTest.java | 36 + .../cocoa/coreimage/TestCoreImage.java | 68 + .../src/test/resources/sample1.heic | Bin 0 -> 293608 bytes .../org/rococoa/cocoa/foundation/NSData.java | 6 +- .../rococoa/internal/FoundationLibrary.java | 14 +- 59 files changed, 10133 insertions(+), 96 deletions(-) create mode 100644 rococoa-cocoa/src/main/java/org/rococoa/cocoa/appkit/NSGraphicsContext.java delete mode 100644 rococoa-contrib/src/main/java/org/rococoa/cocoa/NSWindow.java create mode 100644 rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSActionCell.java rename rococoa-contrib/src/main/java/org/rococoa/cocoa/{ => appkit}/NSApplication.java (93%) create mode 100644 rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSButton.java create mode 100644 rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSButtonCell.java create mode 100644 rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSCell.java create mode 100644 rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSControl.java rename rococoa-contrib/src/main/java/org/rococoa/cocoa/{ => appkit}/NSDistributedNotificationCenter.java (95%) rename rococoa-contrib/src/main/java/org/rococoa/cocoa/{ => appkit}/NSDockTile.java (96%) create mode 100644 rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSEvent.java create mode 100644 rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSFont.java rename rococoa-contrib/src/main/java/org/rococoa/{contrib => cocoa}/appkit/NSInvocationOperation.java (97%) rename rococoa-contrib/src/main/java/org/rococoa/cocoa/{ => appkit}/NSMenu.java (96%) create mode 100644 rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSMenuItem.java rename rococoa-contrib/src/main/java/org/rococoa/{contrib => cocoa}/appkit/NSOperation.java (97%) rename rococoa-contrib/src/main/java/org/rococoa/{contrib => cocoa}/appkit/NSOperationQueue.java (95%) create mode 100644 rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSPanel.java create mode 100644 rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSResponder.java create mode 100644 rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSScreen.java rename rococoa-contrib/src/main/java/org/rococoa/{contrib => cocoa}/appkit/NSSpeechDictionary.java (98%) rename rococoa-contrib/src/main/java/org/rococoa/{contrib => cocoa}/appkit/NSSpeechSynthesizer.java (99%) create mode 100644 rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSText.java create mode 100644 rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSTextFieldCell.java create mode 100644 rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSTitlebarAccessoryViewController.java create mode 100644 rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSToolbar.java create mode 100644 rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSToolbarItem.java create mode 100644 rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSValidatedUserInterfaceItem.java create mode 100644 rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSView.java rename rococoa-contrib/src/main/java/org/rococoa/{contrib => cocoa}/appkit/NSVoice.java (92%) create mode 100644 rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSWindow.java create mode 100644 rococoa-contrib/src/main/java/org/rococoa/cocoa/coregraphics/CGImage.java create mode 100644 rococoa-contrib/src/main/java/org/rococoa/cocoa/coregraphics/CGLibrary.java create mode 100644 rococoa-contrib/src/main/java/org/rococoa/cocoa/coregraphics/CGPoint.java create mode 100644 rococoa-contrib/src/main/java/org/rococoa/cocoa/coregraphics/CGRect.java create mode 100644 rococoa-contrib/src/main/java/org/rococoa/cocoa/coregraphics/CGSize.java create mode 100644 rococoa-contrib/src/main/java/org/rococoa/cocoa/coreimage/CIColor.java create mode 100644 rococoa-contrib/src/main/java/org/rococoa/cocoa/coreimage/CIContext.java create mode 100644 rococoa-contrib/src/main/java/org/rococoa/cocoa/coreimage/CIFilter.java create mode 100644 rococoa-contrib/src/main/java/org/rococoa/cocoa/coreimage/CIImage.java create mode 100644 rococoa-contrib/src/main/java/org/rococoa/cocoa/foundation/CFAllocatorRef.java create mode 100644 rococoa-contrib/src/main/java/org/rococoa/cocoa/foundation/CFStringRef.java create mode 100644 rococoa-contrib/src/main/java/org/rococoa/cocoa/foundation/FoundationKitFunctions.java create mode 100644 rococoa-contrib/src/main/java/org/rococoa/cocoa/foundation/NSAttributedString.java create mode 100644 rococoa-contrib/src/main/java/org/rococoa/cocoa/foundation/NSThread.java create mode 100644 rococoa-contrib/src/test/java/org/rococoa/cocoa/appkit/NSApplicationTest.java rename rococoa-contrib/src/test/java/org/rococoa/{contrib => cocoa}/appkit/NSOperationQueueTest.java (97%) rename rococoa-contrib/src/test/java/org/rococoa/{contrib => cocoa}/appkit/NSSpeechSynthesizerTest.java (91%) rename rococoa-contrib/src/test/java/org/rococoa/{contrib => cocoa}/appkit/NSVoiceTest.java (94%) create mode 100644 rococoa-contrib/src/test/java/org/rococoa/cocoa/coregraphics/CGLibraryTest.java create mode 100644 rococoa-contrib/src/test/java/org/rococoa/cocoa/coreimage/TestCoreImage.java create mode 100644 rococoa-contrib/src/test/resources/sample1.heic diff --git a/rococoa-cocoa/src/main/java/org/rococoa/cocoa/appkit/AppKitLibrary.java b/rococoa-cocoa/src/main/java/org/rococoa/cocoa/appkit/AppKitLibrary.java index 60985c5..87c0442 100644 --- a/rococoa-cocoa/src/main/java/org/rococoa/cocoa/appkit/AppKitLibrary.java +++ b/rococoa-cocoa/src/main/java/org/rococoa/cocoa/appkit/AppKitLibrary.java @@ -36,4 +36,6 @@ public interface AppKitLibrary extends Library { "AppKit", AppKitLibrary.class, Collections.singletonMap(Library.OPTION_TYPE_MAPPER, new RococoaTypeMapper())); void NSRectFill (NSRect aRect); + + long/*NSEventMask*/ NSEventMaskFromType(int/*NSEventType*/ type); } diff --git a/rococoa-cocoa/src/main/java/org/rococoa/cocoa/appkit/NSGraphicsContext.java b/rococoa-cocoa/src/main/java/org/rococoa/cocoa/appkit/NSGraphicsContext.java new file mode 100644 index 0000000..55cafd4 --- /dev/null +++ b/rococoa-cocoa/src/main/java/org/rococoa/cocoa/appkit/NSGraphicsContext.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2022 by Naohide Sano, All rights reserved. + * + * Programmed by Naohide Sano + */ + +package org.rococoa.cocoa.appkit; + +import org.rococoa.ID; +import org.rococoa.ObjCClass; +import org.rococoa.Rococoa; +import org.rococoa.RunOnMainThread; +import org.rococoa.cocoa.foundation.NSArray; +import org.rococoa.cocoa.foundation.NSObject; +import org.rococoa.cocoa.foundation.NSString; + + +/** + * NSGraphicsContext. + * + * @author Naohide Sano (nsano) + * @version 0.00 2022-09-04 nsano initial version
+ */ +public abstract class NSGraphicsContext extends NSObject { + + public static final _Class CLASS = Rococoa.createClass("NSGraphicsContext", _Class.class); + + public interface _Class extends ObjCClass { + } +} diff --git a/rococoa-cocoa/src/main/java/org/rococoa/cocoa/appkit/NSImage.java b/rococoa-cocoa/src/main/java/org/rococoa/cocoa/appkit/NSImage.java index d3afa43..59f131c 100644 --- a/rococoa-cocoa/src/main/java/org/rococoa/cocoa/appkit/NSImage.java +++ b/rococoa-cocoa/src/main/java/org/rococoa/cocoa/appkit/NSImage.java @@ -19,6 +19,7 @@ package org.rococoa.cocoa.appkit; +import com.sun.jna.Pointer; import org.rococoa.ObjCClass; import org.rococoa.cocoa.CGFloat; import org.rococoa.cocoa.foundation.NSArray; @@ -498,4 +499,9 @@ public void drawInRect(NSRect rect, NSRect fromRect, int operation, double delta * native declaration : :177 */ public abstract void setTemplate(boolean isTemplate); + + public abstract Pointer/*CGImageRef*/ CGImageForProposedRect_context_hints( + NSRect proposedDestRect, + NSGraphicsContext referenceContext, + NSDictionary hints); } \ No newline at end of file diff --git a/rococoa-cocoa/src/main/java/org/rococoa/cocoa/appkit/NSOpenPanel.java b/rococoa-cocoa/src/main/java/org/rococoa/cocoa/appkit/NSOpenPanel.java index ff278d1..02ab2e1 100644 --- a/rococoa-cocoa/src/main/java/org/rococoa/cocoa/appkit/NSOpenPanel.java +++ b/rococoa-cocoa/src/main/java/org/rococoa/cocoa/appkit/NSOpenPanel.java @@ -32,15 +32,15 @@ public static final int NSOKButton = 1; public static final int NSCancelButton = 0; - public static final _Class CLASS = Rococoa.createClass("NSOpenPanel", _Class.class); //$NON-NLS-1$ + public static final _Class CLASS = Rococoa.createClass("NSOpenPanel", _Class.class); public @RunOnMainThread abstract class _Class extends NSObject._class_ { public abstract NSOpenPanel openPanel(); } - + public abstract int runModalForTypes(NSArray arrayOfTypeStrings); - + public abstract NSString filename(); public abstract NSArray filenames(); - + public abstract void setDelegate(ID ocProxy); } diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/NSWindow.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/NSWindow.java deleted file mode 100644 index 55e7f66..0000000 --- a/rococoa-contrib/src/main/java/org/rococoa/cocoa/NSWindow.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2007, 2008, 2009 Duncan McGregor - * - * This file is part of Rococoa, a library to allow Java to talk to Cocoa. - * - * Rococoa is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Rococoa is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Rococoa. If not, see . - */ - -package org.rococoa.cocoa; - -import org.rococoa.cocoa.foundation.NSObject; - -/** - * @author Paul Loy - */ -//TODO: flesh this out -public abstract class NSWindow extends NSObject { -} diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSActionCell.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSActionCell.java new file mode 100644 index 0000000..7a89c8e --- /dev/null +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSActionCell.java @@ -0,0 +1,42 @@ +package org.rococoa.cocoa.appkit; + +/* + * Copyright (c) 2002-2009 David Kocher. All rights reserved. + * + * http://cyberduck.ch/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * Bug fixes, suggestions and comments should be sent to: + * dkocher@cyberduck.ch + */ + +import org.rococoa.ObjCClass; + +/// native declaration : :10 +public abstract class NSActionCell extends NSCell { + + public interface _Class extends ObjCClass { + NSActionCell alloc(); + } + + /** + * Original signature : id target()
+ * native declaration : :30 + */ + public abstract org.rococoa.ID target(); + + /** + * Original signature : void setTarget(id)
+ * native declaration : :31 + */ + public abstract void setTarget(org.rococoa.ID anObject); +} \ No newline at end of file diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/NSApplication.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSApplication.java similarity index 93% rename from rococoa-contrib/src/main/java/org/rococoa/cocoa/NSApplication.java rename to rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSApplication.java index 2e6784f..2d68f79 100644 --- a/rococoa-contrib/src/main/java/org/rococoa/cocoa/NSApplication.java +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSApplication.java @@ -17,15 +17,19 @@ * along with Rococoa. If not, see . */ -package org.rococoa.cocoa; +package org.rococoa.cocoa.appkit; +import com.sun.jna.Callback; import org.rococoa.ID; import org.rococoa.ObjCClass; +import org.rococoa.ObjCObject; +import org.rococoa.ObjCObjectByReference; import org.rococoa.Rococoa; import org.rococoa.RunOnMainThread; -import org.rococoa.cocoa.appkit.NSImage; import org.rococoa.cocoa.foundation.NSInteger; import org.rococoa.cocoa.foundation.NSObject; +import org.rococoa.cocoa.foundation.NSPasteboard; + /** * NSApplication @@ -37,7 +41,7 @@ @RunOnMainThread public abstract class NSApplication extends NSObject { - private static final _Class CLASS = Rococoa.createClass("NSApplication", _Class.class); //$NON-NLS-1$ + private static final _Class CLASS = Rococoa.createClass("NSApplication", _Class.class); // NOTE: This class should not run on main thread (deadlocks?) private interface _Class extends ObjCClass { @@ -82,7 +86,15 @@ static public NSApplication sharedApplication() { public abstract void setDelegate(ID delegate); public abstract NSWindow mainWindow(); - + + abstract ServicesProviderCallback servicesProvider(); + + interface ServicesProviderCallback extends Callback { + void apply(NSPasteboard pboard, String userData, ObjCObjectByReference/*NSError*/ error); + } + + public abstract void setServicesProvider(ServicesProviderCallback callback); + /* typedef enum { NSCriticalRequest = 0, diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSButton.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSButton.java new file mode 100644 index 0000000..dc01459 --- /dev/null +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSButton.java @@ -0,0 +1,278 @@ +package org.rococoa.cocoa.appkit; + +import org.rococoa.ObjCClass; +import org.rococoa.cocoa.foundation.NSRect; +import org.rococoa.cocoa.foundation.NSUInteger; + +import org.rococoa.cocoa.foundation.NSAttributedString; + +/// native declaration : :15 +public abstract class NSButton extends NSControl { + private static final _Class CLASS = org.rococoa.Rococoa.createClass("NSButton", _Class.class); + + public static NSButton buttonWithFrame(NSRect frameRect) { + return CLASS.alloc().initWithFrame(frameRect); + } + + public static final int NSMomentaryLightButton = 0; // was NSMomentaryPushButton + public static final int NSMomentaryPushButtonButton = 1; + public static final int NSToggleButton = 2; + public static final int NSSwitchButton = 3; + public static final int NSRadioButton = 4; + public static final int NSMomentaryChangeButton = 5; + public static final int NSOnOffButton = 6; + public static final int NSMomentaryPushInButton = 7; // was NSMomentaryLight + + public static final int NSRoundedBezelStyle = 1; + public static final int NSRegularSquareBezelStyle = 2; + public static final int NSThickSquareBezelStyle = 3; + public static final int NSThickerSquareBezelStyle = 4; + public static final int NSDisclosureBezelStyle = 5; + public static final int NSShadowlessSquareBezelStyle = 6; + public static final int NSCircularBezelStyle = 7; + public static final int NSTexturedSquareBezelStyle = 8; + public static final int NSHelpButtonBezelStyle = 9; + public static final int NSSmallSquareBezelStyle = 10; + public static final int NSTexturedRoundedBezelStyle = 11; + public static final int NSRoundRectBezelStyle = 12; + public static final int NSRecessedBezelStyle = 13; + public static final int NSRoundedDisclosureBezelStyle = 14; + + public interface _Class extends ObjCClass { + NSButton alloc(); + } + + @Override + public abstract NSButton initWithFrame(NSRect frameRect); + + /** + * Original signature : NSString* title()
+ * native declaration : :17 + */ + public abstract String title(); + + /** + * Original signature : void setTitle(NSString*)
+ * native declaration : :18 + */ + public abstract void setTitle(String aString); + + /** + * Original signature : NSString* alternateTitle()
+ * native declaration : :19 + */ + public abstract String alternateTitle(); + + /** + * Original signature : void setAlternateTitle(NSString*)
+ * native declaration : :20 + */ + public abstract void setAlternateTitle(String aString); + + /** + * Original signature : NSImage* image()
+ * native declaration : :21 + */ + public abstract NSImage image(); + + /** + * Original signature : void setImage(NSImage*)
+ * native declaration : :22 + */ + public abstract void setImage(NSImage image); + + /** + * Original signature : NSImage* alternateImage()
+ * native declaration : :23 + */ + public abstract NSImage alternateImage(); + + /** + * Original signature : void setAlternateImage(NSImage*)
+ * native declaration : :24 + */ + public abstract void setAlternateImage(NSImage image); + + /** + * Original signature : imagePosition()
+ * native declaration : :25 + */ + public abstract com.sun.jna.Pointer imagePosition(); + + /** + * native declaration : :26
+ * Conversion Error : /// Original signature : void setImagePosition(null)
+ * - (void)setImagePosition:(null)aPosition; (Argument aPosition cannot be converted) + */ + public abstract void setImagePosition(int position); + + /** + * native declaration : :27
+ * Conversion Error : /// Original signature : void setButtonType(null)
+ * - (void)setButtonType:(null)aType; (Argument aType cannot be converted) + */ + public abstract void setButtonType(int type); + + /** + * Original signature : NSInteger state()
+ * native declaration : :28 + */ + public abstract int state(); + + /** + * Original signature : void setState(NSInteger)
+ * native declaration : :29 + */ + public abstract void setState(int value); + + /** + * Original signature : BOOL isBordered()
+ * native declaration : :30 + */ + public abstract boolean isBordered(); + + /** + * Original signature : void setBordered(BOOL)
+ * native declaration : :31 + */ + public abstract void setBordered(boolean flag); + + /** + * Original signature : BOOL isTransparent()
+ * native declaration : :32 + */ + public abstract boolean isTransparent(); + + /** + * Original signature : void setTransparent(BOOL)
+ * native declaration : :33 + */ + public abstract void setTransparent(boolean flag); + + /** + * Original signature : void setPeriodicDelay(float, float)
+ * native declaration : :34 + */ + public abstract void setPeriodicDelay_interval(float delay, float interval); + + /** + * Original signature : void getPeriodicDelay(float*, float*)
+ * native declaration : :35 + */ + public abstract void getPeriodicDelay_interval(java.nio.FloatBuffer delay, java.nio.FloatBuffer interval); + + /** + * Original signature : NSString* keyEquivalent()
+ * native declaration : :36 + */ + public abstract String keyEquivalent(); + + /** + * Original signature : void setKeyEquivalent(NSString*)
+ * native declaration : :37 + */ + public abstract void setKeyEquivalent(String charCode); + + /** + * Original signature : NSUInteger keyEquivalentModifierMask()
+ * native declaration : :38 + */ + public abstract NSUInteger keyEquivalentModifierMask(); + + /** + * Original signature : void setKeyEquivalentModifierMask(NSUInteger)
+ * native declaration : :39 + */ + public abstract void setKeyEquivalentModifierMask(NSUInteger mask); + + /** + * Original signature : void highlight(BOOL)
+ * native declaration : :40 + */ + public abstract void highlight(boolean flag); + + /** + * Original signature : void setTitleWithMnemonic(NSString*)
+ * from NSKeyboardUI native declaration : :46 + */ + public abstract void setTitleWithMnemonic(String stringWithAmpersand); + + /** + * Original signature : NSAttributedString* attributedTitle()
+ * from NSButtonAttributedStringMethods native declaration : :50 + */ + public abstract NSAttributedString attributedTitle(); + + /** + * Original signature : void setAttributedTitle(NSAttributedString*)
+ * from NSButtonAttributedStringMethods native declaration : :51 + */ + public abstract void setAttributedTitle(NSAttributedString aString); + + /** + * Original signature : NSAttributedString* attributedAlternateTitle()
+ * from NSButtonAttributedStringMethods native declaration : :52 + */ + public abstract NSAttributedString attributedAlternateTitle(); + + /** + * Original signature : void setAttributedAlternateTitle(NSAttributedString*)
+ * from NSButtonAttributedStringMethods native declaration : :53 + */ + public abstract void setAttributedAlternateTitle(NSAttributedString obj); + + /** + * from NSButtonBezelStyles native declaration : :57
+ * Conversion Error : /// Original signature : void setBezelStyle(null)
+ * - (void)setBezelStyle:(null)bezelStyle; (Argument bezelStyle cannot be converted) + */ + public abstract void setBezelStyle(int style); + + /** + * Original signature : bezelStyle()
+ * from NSButtonBezelStyles native declaration : :58 + */ + public abstract int bezelStyle(); + + /** + * Original signature : void setAllowsMixedState(BOOL)
+ * from NSButtonMixedState native declaration : :62 + */ + public abstract void setAllowsMixedState(boolean flag); + + /** + * Original signature : BOOL allowsMixedState()
+ * from NSButtonMixedState native declaration : :63 + */ + public abstract boolean allowsMixedState(); + + /** + * Original signature : void setNextState()
+ * from NSButtonMixedState native declaration : :64 + */ + public abstract void setNextState(); + + /** + * Original signature : void setShowsBorderOnlyWhileMouseInside(BOOL)
+ * from NSButtonBorder native declaration : :68 + */ + public abstract void setShowsBorderOnlyWhileMouseInside(boolean show); + + /** + * Original signature : BOOL showsBorderOnlyWhileMouseInside()
+ * from NSButtonBorder native declaration : :69 + */ + public abstract boolean showsBorderOnlyWhileMouseInside(); + + /** + * Original signature : void setSound(NSSound*)
+ * from NSButtonSoundExtensions native declaration : :73 + */ + public abstract void setSound(com.sun.jna.Pointer aSound); + + /** + * Original signature : NSSound* sound()
+ * from NSButtonSoundExtensions native declaration : :74 + */ + public abstract com.sun.jna.Pointer sound(); +} \ No newline at end of file diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSButtonCell.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSButtonCell.java new file mode 100644 index 0000000..ed1580b --- /dev/null +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSButtonCell.java @@ -0,0 +1,389 @@ +package org.rococoa.cocoa.appkit; + +import org.rococoa.ID; +import org.rococoa.ObjCClass; +import org.rococoa.cocoa.CGFloat; +import org.rococoa.cocoa.foundation.NSUInteger; + +import org.rococoa.cocoa.foundation.NSAttributedString; + +public abstract class NSButtonCell extends NSActionCell { + private static final _Class CLASS = org.rococoa.Rococoa.createClass("NSButtonCell", _Class.class); + + public static NSButtonCell buttonCell() { + return CLASS.alloc().init(); + } + + public interface _Class extends ObjCClass { + NSButtonCell alloc(); + } + + public abstract NSButtonCell init(); + + /** + * was NSMomentaryPushButton
+ * native declaration : :12 + */ + public static final int NSMomentaryLightButton = 0; + /// native declaration : :13 + public static final int NSPushOnPushOffButton = 1; + /// native declaration : :14 + public static final int NSToggleButton = 2; + /// native declaration : :15 + public static final int NSSwitchButton = 3; + /// native declaration : :16 + public static final int NSRadioButton = 4; + /// native declaration : :17 + public static final int NSMomentaryChangeButton = 5; + /// native declaration : :18 + public static final int NSOnOffButton = 6; + /** + * was NSMomentaryLight
+ * native declaration : :19 + */ + public static final int NSMomentaryPushInButton = 7; + /// native declaration : :24 + public static final int NSMomentaryPushButton = 0; + /// native declaration : :25 + public static final int NSMomentaryLight = 7; + /// native declaration : :32 + public static final int NSRoundedBezelStyle = 1; + /// native declaration : :33 + public static final int NSRegularSquareBezelStyle = 2; + /// native declaration : :34 + public static final int NSThickSquareBezelStyle = 3; + /// native declaration : :35 + public static final int NSThickerSquareBezelStyle = 4; + /// native declaration : :37 + public static final int NSDisclosureBezelStyle = 5; + /// native declaration : :39 + public static final int NSShadowlessSquareBezelStyle = 6; + /// native declaration : :40 + public static final int NSCircularBezelStyle = 7; + /// native declaration : :42 + public static final int NSTexturedSquareBezelStyle = 8; + /// native declaration : :43 + public static final int NSHelpButtonBezelStyle = 9; + /// native declaration : :46 + public static final int NSSmallSquareBezelStyle = 10; + /// native declaration : :47 + public static final int NSTexturedRoundedBezelStyle = 11; + /// native declaration : :48 + public static final int NSRoundRectBezelStyle = 12; + /// native declaration : :49 + public static final int NSRecessedBezelStyle = 13; + /// native declaration : :50 + public static final int NSRoundedDisclosureBezelStyle = 14; + /// native declaration : :55 + public static final int NSSmallIconButtonBezelStyle = 2; + /// native declaration : :200 + public static final int NSGradientNone = 0; + /// native declaration : :201 + public static final int NSGradientConcaveWeak = 1; + /// native declaration : :202 + public static final int NSGradientConcaveStrong = 2; + /// native declaration : :203 + public static final int NSGradientConvexWeak = 3; + /// native declaration : :204 + public static final int NSGradientConvexStrong = 4; + + /** + * Original signature : NSString* title()
+ * native declaration : :143 + */ + public abstract String title(); + + /** + * Original signature : void setTitle(NSString*)
+ * native declaration : :144 + */ + public abstract void setTitle(String aString); + + /** + * Original signature : NSString* alternateTitle()
+ * native declaration : :145 + */ + public abstract String alternateTitle(); + + /** + * Original signature : void setAlternateTitle(NSString*)
+ * native declaration : :146 + */ + public abstract void setAlternateTitle(String aString); + + /** + * Original signature : NSImage* alternateImage()
+ * native declaration : :148 + */ + public abstract NSImage alternateImage(); + + /** + * Original signature : void setAlternateImage(NSImage*)
+ * native declaration : :149 + */ + public abstract void setAlternateImage(NSImage image); + + /** + * Original signature : imagePosition()
+ * native declaration : :150 + */ + public abstract com.sun.jna.Pointer imagePosition(); + /** + * native declaration : :151
+ * Conversion Error : /// Original signature : void setImagePosition(null)
+ * - (void)setImagePosition:(null)aPosition; (Argument aPosition cannot be converted) + */ + /** + * Original signature : imageScaling()
+ * native declaration : :153 + */ + public abstract com.sun.jna.Pointer imageScaling(); + /** + * native declaration : :154
+ * Conversion Error : /// Original signature : void setImageScaling(null)
+ * - (void)setImageScaling:(null)scaling; (Argument scaling cannot be converted) + */ + /** + * Original signature : NSInteger highlightsBy()
+ * native declaration : :157 + */ + public abstract int highlightsBy(); + + /** + * Original signature : void setHighlightsBy(NSInteger)
+ * native declaration : :158 + */ + public abstract void setHighlightsBy(int aType); + + /** + * Original signature : NSInteger showsStateBy()
+ * native declaration : :159 + */ + public abstract int showsStateBy(); + + /** + * Original signature : void setShowsStateBy(NSInteger)
+ * native declaration : :160 + */ + public abstract void setShowsStateBy(int aType); + + /** + * Original signature : void setButtonType(NSButtonType)
+ * native declaration : :161 + */ + public abstract void setButtonType(int aType); + + /** + * Original signature : BOOL isTransparent()
+ * native declaration : :164 + */ + public abstract boolean isTransparent(); + + /** + * Original signature : void setTransparent(BOOL)
+ * native declaration : :165 + */ + public abstract void setTransparent(boolean flag); + + /** + * Original signature : void setPeriodicDelay(float, float)
+ * native declaration : :166 + */ + public abstract void setPeriodicDelay_interval(float delay, float interval); + + /** + * Original signature : void setKeyEquivalent(NSString*)
+ * native declaration : :169 + */ + public abstract void setKeyEquivalent(String aKeyEquivalent); + + /** + * Original signature : NSUInteger keyEquivalentModifierMask()
+ * native declaration : :170 + */ + public abstract int keyEquivalentModifierMask(); + + /** + * Original signature : void setKeyEquivalentModifierMask(NSUInteger)
+ * native declaration : :171 + */ + public abstract void setKeyEquivalentModifierMask(int mask); + + /** + * Original signature : NSFont* keyEquivalentFont()
+ * native declaration : :172 + */ + public abstract NSFont keyEquivalentFont(); + + /** + * Original signature : void setKeyEquivalentFont(NSFont*)
+ * native declaration : :173 + */ + public abstract void setKeyEquivalentFont(NSFont fontObj); + + /** + * Original signature : void setKeyEquivalentFont(NSString*, CGFloat)
+ * native declaration : :174 + */ + public abstract void setKeyEquivalentFont_size(String fontName, CGFloat fontSize); + + /** + * Original signature : void performClick(id)
+ * Significant NSCell override, actually clicks itself.
+ * native declaration : :175 + */ + public abstract void performClick(final ID sender); + /** + * native declaration : :178
+ * Conversion Error : /// Original signature : void drawImage(NSImage*, null, NSView*)
+ * - (void)drawImage:(NSImage*)image withFrame:(null)frame inView:(NSView*)controlView; (Argument frame cannot be converted) + */ + /** + * native declaration : :179
+ * Conversion Error : /// Original signature : drawTitle(NSAttributedString*, null, NSView*)
+ * - (null)drawTitle:(NSAttributedString*)title withFrame:(null)frame inView:(NSView*)controlView; (Argument frame cannot be converted) + */ + /** + * native declaration : :180
+ * Conversion Error : /// Original signature : void drawBezelWithFrame(null, NSView*)
+ * - (void)drawBezelWithFrame:(null)frame inView:(NSView*)controlView; (Argument frame cannot be converted) + */ + /** + * Original signature : void setTitleWithMnemonic(NSString*)
+ * from NSKeyboardUI native declaration : :185 + */ + public abstract void setTitleWithMnemonic(String stringWithAmpersand); + + /** + * Original signature : void setAlternateTitleWithMnemonic(NSString*)
+ * from NSKeyboardUI native declaration : :186 + */ + public abstract void setAlternateTitleWithMnemonic(String stringWithAmpersand); + + /** + * Original signature : void setAlternateMnemonicLocation(NSUInteger)
+ * from NSKeyboardUI native declaration : :187 + */ + public abstract void setAlternateMnemonicLocation(int location); + + /** + * Original signature : NSUInteger alternateMnemonicLocation()
+ * from NSKeyboardUI native declaration : :188 + */ + public abstract int alternateMnemonicLocation(); + + /** + * Original signature : NSString* alternateMnemonic()
+ * from NSKeyboardUI native declaration : :189 + */ + public abstract String alternateMnemonic(); + + /** + * Original signature : NSGradientType gradientType()
+ * from NSButtonCellExtensions native declaration : :209 + */ + public abstract int gradientType(); + + /** + * Original signature : void setGradientType(NSGradientType)
+ * from NSButtonCellExtensions native declaration : :210 + */ + public abstract void setGradientType(int type); + + /** + * Radio buttons and switches use (imageDimsWhenDisabled == NO) so only their text is dimmed.
+ * Original signature : void setImageDimsWhenDisabled(BOOL)
+ * from NSButtonCellExtensions native declaration : :214 + */ + public abstract void setImageDimsWhenDisabled(boolean flag); + + /** + * Original signature : BOOL imageDimsWhenDisabled()
+ * from NSButtonCellExtensions native declaration : :215 + */ + public abstract boolean imageDimsWhenDisabled(); + + /** + * Original signature : void setShowsBorderOnlyWhileMouseInside(BOOL)
+ * from NSButtonCellExtensions native declaration : :217 + */ + public abstract void setShowsBorderOnlyWhileMouseInside(boolean show); + + /** + * Original signature : BOOL showsBorderOnlyWhileMouseInside()
+ * from NSButtonCellExtensions native declaration : :218 + */ + public abstract boolean showsBorderOnlyWhileMouseInside(); + + /** + * Original signature : void mouseEntered(NSEvent*)
+ * from NSButtonCellExtensions native declaration : :220 + */ + public abstract void mouseEntered(NSEvent event); + + /** + * Original signature : void mouseExited(NSEvent*)
+ * from NSButtonCellExtensions native declaration : :221 + */ + public abstract void mouseExited(NSEvent event); + + /** + * Original signature : NSColor* backgroundColor()
+ * from NSButtonCellExtensions native declaration : :224 + */ + public abstract NSColor backgroundColor(); + + /** + * Original signature : void setBackgroundColor(NSColor*)
+ * from NSButtonCellExtensions native declaration : :225 + */ + public abstract void setBackgroundColor(NSColor color); + + /** + * Original signature : NSAttributedString* attributedTitle()
+ * from NSButtonCellAttributedStringMethods native declaration : :231 + */ + public abstract NSAttributedString attributedTitle(); + + /** + * Original signature : void setAttributedTitle(NSAttributedString*)
+ * from NSButtonCellAttributedStringMethods native declaration : :232 + */ + public abstract void setAttributedTitle(NSAttributedString obj); + + /** + * Original signature : NSAttributedString* attributedAlternateTitle()
+ * from NSButtonCellAttributedStringMethods native declaration : :233 + */ + public abstract NSAttributedString attributedAlternateTitle(); + + /** + * Original signature : void setAttributedAlternateTitle(NSAttributedString*)
+ * from NSButtonCellAttributedStringMethods native declaration : :234 + */ + public abstract void setAttributedAlternateTitle(String obj); + + /** + * Original signature : void setBezelStyle(NSBezelStyle)
+ * from NSButtonCellBezelStyles native declaration : :239 + */ + public abstract void setBezelStyle(NSUInteger bezelStyle); + + /** + * Original signature : NSBezelStyle bezelStyle()
+ * from NSButtonCellBezelStyles native declaration : :240 + */ + public abstract NSUInteger bezelStyle(); + + /** + * Original signature : void setSound(NSSound*)
+ * from NSButtonCellSoundExtensions native declaration : :245 + */ + public abstract void setSound(com.sun.jna.Pointer aSound); + + /** + * Original signature : NSSound* sound()
+ * from NSButtonCellSoundExtensions native declaration : :246 + */ + public abstract com.sun.jna.Pointer sound(); +} \ No newline at end of file diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSCell.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSCell.java new file mode 100644 index 0000000..ded140a --- /dev/null +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSCell.java @@ -0,0 +1,1045 @@ +package org.rococoa.cocoa.appkit; + +import org.rococoa.ID; +import org.rococoa.ObjCClass; +import org.rococoa.Selector; +import org.rococoa.cocoa.foundation.NSCopying; +import org.rococoa.cocoa.foundation.NSInteger; +import org.rococoa.cocoa.foundation.NSObject; +import org.rococoa.cocoa.foundation.NSSize; +import org.rococoa.cocoa.foundation.NSString; +import org.rococoa.cocoa.foundation.NSUInteger; +import org.rococoa.cocoa.foundation.NSAttributedString; + +public abstract class NSCell extends NSObject implements NSCopying { + + /// native declaration : :11 + public static final int NSAnyType = 0; + /// native declaration : :12 + public static final int NSIntType = 1; + /// native declaration : :13 + public static final int NSPositiveIntType = 2; + /// native declaration : :14 + public static final int NSFloatType = 3; + /// native declaration : :15 + public static final int NSPositiveFloatType = 4; + /// native declaration : :16 + public static final int NSDoubleType = 6; + /// native declaration : :17 + public static final int NSPositiveDoubleType = 7; + /// native declaration : :21 + public static final int NSNullCellType = 0; + /// native declaration : :22 + public static final int NSTextCellType = 1; + /// native declaration : :23 + public static final int NSImageCellType = 2; + /// native declaration : :28 + public static final int NSCellDisabled = 0; + /// native declaration : :29 + public static final int NSCellState = 1; + /// native declaration : :30 + public static final int NSPushInCell = 2; + /// native declaration : :31 + public static final int NSCellEditable = 3; + /// native declaration : :32 + public static final int NSChangeGrayCell = 4; + /// native declaration : :33 + public static final int NSCellHighlighted = 5; + /// native declaration : :34 + public static final int NSCellLightsByContents = 6; + /// native declaration : :35 + public static final int NSCellLightsByGray = 7; + /// native declaration : :36 + public static final int NSChangeBackgroundCell = 8; + /// native declaration : :37 + public static final int NSCellLightsByBackground = 9; + /// native declaration : :38 + public static final int NSCellIsBordered = 10; + /// native declaration : :39 + public static final int NSCellHasOverlappingImage = 11; + /// native declaration : :40 + public static final int NSCellHasImageHorizontal = 12; + /// native declaration : :41 + public static final int NSCellHasImageOnLeftOrBottom = 13; + /// native declaration : :42 + public static final int NSCellChangesContents = 14; + /// native declaration : :43 + public static final int NSCellIsInsetButton = 15; + /// native declaration : :44 + public static final int NSCellAllowsMixedState = 16; + /// native declaration : :49 + public static final int NSNoImage = 0; + /// native declaration : :50 + public static final int NSImageOnly = 1; + /// native declaration : :51 + public static final int NSImageLeft = 2; + /// native declaration : :52 + public static final int NSImageRight = 3; + /// native declaration : :53 + public static final int NSImageBelow = 4; + /// native declaration : :54 + public static final int NSImageAbove = 5; + /// native declaration : :55 + public static final int NSImageOverlaps = 6; + /** + * Deprecated. Use NSScaleProportionallyDown
+ * native declaration : :60 + */ + public static final int NSScaleProportionally = 0; + /** + * Deprecated. Use NSScaleAxesIndependently
+ * native declaration : :61 + */ + public static final int NSScaleToFit = 1; + /** + * Deprecated. Use NSImageScaleNone
+ * native declaration : :62 + */ + public static final int NSScaleNone = 2; + /** + * Scale image down if it is too large for destination. Preserve aspect ratio.
+ * native declaration : :67 + */ + public static final int NSImageScaleProportionallyDown = 0; + /** + * Scale each dimension to exactly fit destination. Do not preserve aspect ratio.
+ * native declaration : :68 + */ + public static final int NSImageScaleAxesIndependently = 1; + /** + * Do not scale.
+ * native declaration : :69 + */ + public static final int NSImageScaleNone = 2; + /** + * Scale image to maximum possible dimensions while (1) staying within destination area (2) preserving aspect ratio
+ * native declaration : :70 + */ + public static final int NSImageScaleProportionallyUpOrDown = 3; + /// native declaration : :76 + public static final int NSMixedState = -1; + /// native declaration : :77 + public static final int NSOffState = 0; + /// native declaration : :78 + public static final int NSOnState = 1; + /// native declaration : :85 + public static final int NSNoCellMask = 0; + /// native declaration : :86 + public static final int NSContentsCellMask = 1; + /// native declaration : :87 + public static final int NSPushInCellMask = 2; + /// native declaration : :88 + public static final int NSChangeGrayCellMask = 4; + /// native declaration : :89 + public static final int NSChangeBackgroundCellMask = 8; + /** + * system 'default'
+ * native declaration : :93 + */ + public static final int NSDefaultControlTint = 0; + /// native declaration : :95 + public static final int NSBlueControlTint = 1; + /// native declaration : :96 + public static final int NSGraphiteControlTint = 6; + /// native declaration : :98 + public static final int NSClearControlTint = 7; + /// native declaration : :103 + public static final int NSRegularControlSize = 0; + /// native declaration : :104 + public static final int NSSmallControlSize = 1; + /// native declaration : :106 + public static final int NSMiniControlSize = 2; + /** + * An empty area, or did not hit in the cell
+ * native declaration : :355 + */ + public static final int NSCellHitNone = 0; + /** + * A content area in the cell
+ * native declaration : :357 + */ + public static final int NSCellHitContentArea = 1 << 0; + /** + * An editable text area of the cell
+ * native declaration : :359 + */ + public static final int NSCellHitEditableTextArea = 1 << 1; + /** + * A trackable area in the cell
+ * native declaration : :361 + */ + public static final int NSCellHitTrackableArea = 1 << 2; + /** + * The background is a light color. Dark content contrasts well with this background.
+ * native declaration : :396 + */ + public static final int NSBackgroundStyleLight = 0; + /** + * The background is a dark color. Light content contrasts well with this background.
+ * native declaration : :397 + */ + public static final int NSBackgroundStyleDark = 1; + /** + * The background is intended to appear higher than the content drawn on it. Content might need to be inset.
+ * native declaration : :398 + */ + public static final int NSBackgroundStyleRaised = 2; + /** + * The background is intended to appear lower than the content drawn on it. Content might need to be embossed.
+ * native declaration : :399 + */ + public static final int NSBackgroundStyleLowered = 3; + + public interface _Class extends ObjCClass { + /** + * Original signature : BOOL prefersTrackingUntilMouseUp()
+ * native declaration : :175 + */ + boolean prefersTrackingUntilMouseUp(); + + /** + * Original signature : NSMenu* defaultMenu()
+ * native declaration : :280 + */ + NSMenu defaultMenu(); + + /** + * Original signature : defaultFocusRingType()
+ * from NSKeyboardUI native declaration : :323 + */ + com.sun.jna.Pointer defaultFocusRingType(); + + NSCell alloc(); + } + + /** + * Original signature : id initTextCell(NSString*)
+ * native declaration : :178 + */ + public abstract NSCell initTextCell(NSString aString); + + /** + * Original signature : id initImageCell(NSImage*)
+ * native declaration : :179 + */ + public abstract NSCell initImageCell(NSImage image); + + /** + * Original signature : NSView* controlView()
+ * native declaration : :181 + */ + public abstract NSView controlView(); + + /** + * Original signature : void setControlView(NSView*)
+ * native declaration : :183 + */ + public abstract void setControlView(NSView view); + + /** + * Original signature : NSCellType type()
+ * native declaration : :185 + */ + public abstract int type(); + + /** + * Original signature : void setType(NSCellType)
+ * native declaration : :186 + */ + public abstract void setType(int aType); + + /** + * Original signature : NSInteger state()
+ * native declaration : :187 + */ + public abstract int state(); + + /** + * Original signature : void setState(NSInteger)
+ * native declaration : :188 + */ + public abstract void setState(int value); + + /** + * Original signature : action()
+ * native declaration : :191 + */ + public abstract Selector action(); + + /** + * native declaration : :192
+ * Conversion Error : /// Original signature : void setAction(null)
+ * - (void)setAction:(null)aSelector; (Argument aSelector cannot be converted) + */ + public abstract void setAction(Selector action); + + /** + * Original signature : NSInteger tag()
+ * native declaration : :193 + */ + public abstract int tag(); + + /** + * Original signature : void setTag(NSInteger)
+ * native declaration : :194 + */ + public abstract void setTag(int anInt); + + /** + * Original signature : NSString* title()
+ * native declaration : :195 + */ + public abstract String title(); + + /** + * Original signature : void setTitle(NSString*)
+ * native declaration : :196 + */ + public abstract void setTitle(String aString); + + /** + * Original signature : BOOL isOpaque()
+ * native declaration : :197 + */ + public abstract boolean isOpaque(); + + /** + * Original signature : BOOL isEnabled()
+ * native declaration : :198 + */ + public abstract boolean isEnabled(); + + /** + * Original signature : void setEnabled(BOOL)
+ * native declaration : :199 + */ + public abstract void setEnabled(boolean flag); + + /** + * Original signature : NSInteger sendActionOn(NSInteger)
+ * native declaration : :200 + */ + public abstract int sendActionOn(int mask); + + /** + * Original signature : BOOL isContinuous()
+ * native declaration : :201 + */ + public abstract boolean isContinuous(); + + /** + * Original signature : void setContinuous(BOOL)
+ * native declaration : :202 + */ + public abstract void setContinuous(boolean flag); + + /** + * Original signature : BOOL isEditable()
+ * native declaration : :203 + */ + public abstract boolean isEditable(); + + /** + * Original signature : void setEditable(BOOL)
+ * native declaration : :204 + */ + public abstract void setEditable(boolean flag); + + /** + * Original signature : BOOL isSelectable()
+ * native declaration : :205 + */ + public abstract boolean isSelectable(); + + /** + * Original signature : void setSelectable(BOOL)
+ * native declaration : :206 + */ + public abstract void setSelectable(boolean flag); + + /** + * Original signature : BOOL isBordered()
+ * native declaration : :207 + */ + public abstract boolean isBordered(); + + /** + * Original signature : void setBordered(BOOL)
+ * native declaration : :208 + */ + public abstract void setBordered(boolean flag); + + /** + * Original signature : BOOL isBezeled()
+ * native declaration : :209 + */ + public abstract boolean isBezeled(); + + /** + * Original signature : void setBezeled(BOOL)
+ * native declaration : :210 + */ + public abstract void setBezeled(boolean flag); + + /** + * Original signature : BOOL isScrollable()
+ * native declaration : :211 + */ + public abstract boolean isScrollable(); + + /** + * Original signature : void setScrollable(BOOL)
+ * If YES, sets wraps to NO
+ * native declaration : :212 + */ + public abstract void setScrollable(boolean flag); + + /** + * Original signature : BOOL isHighlighted()
+ * native declaration : :213 + */ + public abstract boolean isHighlighted(); + + /** + * Original signature : void setHighlighted(BOOL)
+ * native declaration : :214 + */ + public abstract void setHighlighted(boolean flag); + + /** + * Original signature : alignment()
+ * native declaration : :215 + */ + public abstract com.sun.jna.Pointer alignment(); + + /** + * native declaration : :216
+ * Conversion Error : /// Original signature : void setAlignment(null)
+ * - (void)setAlignment:(null)mode; (Argument mode cannot be converted) + */ + public abstract void setAlignment(int mode); + + /** + * Original signature : BOOL wraps()
+ * native declaration : :217 + */ + public abstract boolean wraps(); + + /** + * Original signature : void setWraps(BOOL)
+ * If YES, sets scrollable to NO
+ * native declaration : :218 + */ + public abstract void setWraps(boolean flag); + + /** + * Original signature : NSFont* font()
+ * native declaration : :219 + */ + public abstract NSFont font(); + + /** + * Original signature : void setFont(NSFont*)
+ * native declaration : :220 + */ + public abstract void setFont(NSFont fontObj); + + /** + * Original signature : NSInteger entryType()
+ * native declaration : :221 + */ + public abstract int entryType(); + + /** + * Original signature : void setEntryType(NSInteger)
+ * native declaration : :222 + */ + public abstract void setEntryType(int aType); + + /** + * Original signature : BOOL isEntryAcceptable(NSString*)
+ * native declaration : :223 + */ + public abstract boolean isEntryAcceptable(String aString); + + /** + * Original signature : void setFloatingPointFormat(BOOL, NSUInteger, NSUInteger)
+ * native declaration : :224 + */ + public abstract void setFloatingPointFormat_left_right(boolean autoRange, int leftDigits, int rightDigits); + + /** + * Original signature : NSString* keyEquivalent()
+ * native declaration : :225 + */ + public abstract String keyEquivalent(); + + /** + * Original signature : void setFormatter(NSFormatter*)
+ * native declaration : :226 + */ + public abstract void setFormatter(com.sun.jna.Pointer newFormatter); + + /** + * Original signature : id formatter()
+ * native declaration : :227 + */ + public abstract org.rococoa.ID formatter(); + + /** + * Original signature : id objectValue()
+ * native declaration : :228 + */ + public abstract NSObject objectValue(); + + /** + * native declaration : :229
+ * Conversion Error : id + */ + public abstract void setObjectValue(NSObject value); + + /** + * Original signature : BOOL hasValidObjectValue()
+ * native declaration : :230 + */ + public abstract boolean hasValidObjectValue(); + + /** + * Original signature : NSString* stringValue()
+ * native declaration : :231 + */ + public abstract String stringValue(); + + /** + * Original signature : void setStringValue(NSString*)
+ * native declaration : :232 + */ + public abstract void setStringValue(String aString); + + /** + * Original signature : compare(id)
+ * native declaration : :233 + */ + public abstract com.sun.jna.Pointer compare(NSObject otherCell); + + /** + * Original signature : int intValue()
+ * native declaration : :234 + */ + public abstract int intValue(); + + /** + * Original signature : void setIntValue(int)
+ * native declaration : :235 + */ + public abstract void setIntValue(int anInt); + + /** + * Original signature : float floatValue()
+ * native declaration : :236 + */ + public abstract float floatValue(); + + /** + * Original signature : void setFloatValue(float)
+ * native declaration : :237 + */ + public abstract void setFloatValue(float aFloat); + + /** + * Original signature : double doubleValue()
+ * native declaration : :238 + */ + public abstract double doubleValue(); + + /** + * Original signature : void setDoubleValue(double)
+ * native declaration : :239 + */ + public abstract void setDoubleValue(double aDouble); + + /** + * Original signature : void takeIntValueFrom(id)
+ * native declaration : :240 + */ + public abstract void takeIntValueFrom(final ID sender); + + /** + * Original signature : void takeFloatValueFrom(id)
+ * native declaration : :241 + */ + public abstract void takeFloatValueFrom(final ID sender); + + /** + * Original signature : void takeDoubleValueFrom(id)
+ * native declaration : :242 + */ + public abstract void takeDoubleValueFrom(final ID sender); + + /** + * Original signature : void takeStringValueFrom(id)
+ * native declaration : :243 + */ + public abstract void takeStringValueFrom(final ID sender); + + /** + * Original signature : void takeObjectValueFrom(id)
+ * native declaration : :244 + */ + public abstract void takeObjectValueFrom(final ID sender); + + /** + * Original signature : NSImage* image()
+ * native declaration : :245 + */ + public abstract NSImage image(); + + /** + * Original signature : void setImage(NSImage*)
+ * native declaration : :246 + */ + public abstract void setImage(NSImage image); + + /** + * Original signature : void setControlTint(NSControlTint)
+ * native declaration : :247 + */ + public abstract void setControlTint(NSUInteger controlTint); + + /** + * Original signature : NSControlTint controlTint()
+ * native declaration : :248 + */ + public abstract NSUInteger controlTint(); + + /** + * Original signature : void setControlSize(NSControlSize)
+ * native declaration : :249 + */ + public abstract void setControlSize(int size); + + /** + * Original signature : NSControlSize controlSize()
+ * native declaration : :250 + */ + public abstract int controlSize(); + + /** + * Original signature : id representedObject()
+ * native declaration : :251 + */ + public abstract org.rococoa.ID representedObject(); + + /** + * Original signature : void setRepresentedObject(id)
+ * native declaration : :252 + */ + public abstract void setRepresentedObject(org.rococoa.ID anObject); + + /** + * Original signature : NSInteger cellAttribute(NSCellAttribute)
+ * native declaration : :253 + */ + public abstract int cellAttribute(int aParameter); + + /** + * Original signature : void setCellAttribute(NSCellAttribute, NSInteger)
+ * native declaration : :254 + */ + public abstract void setCellAttribute_to(int aParameter, int value); + /** + * native declaration : :255
+ * Conversion Error : /// Original signature : imageRectForBounds(null)
+ * - (null)imageRectForBounds:(null)theRect; (Argument theRect cannot be converted) + */ + /** + * native declaration : :256
+ * Conversion Error : /// Original signature : titleRectForBounds(null)
+ * - (null)titleRectForBounds:(null)theRect; (Argument theRect cannot be converted) + */ + /** + * native declaration : :257
+ * Conversion Error : /// Original signature : drawingRectForBounds(null)
+ * - (null)drawingRectForBounds:(null)theRect; (Argument theRect cannot be converted) + */ + /** + * Original signature : cellSize()
+ * native declaration : :258 + */ + public abstract NSSize cellSize(); + /** + * native declaration : :259
+ * Conversion Error : /// Original signature : cellSizeForBounds(null)
+ * - (null)cellSizeForBounds:(null)aRect; (Argument aRect cannot be converted) + */ + /** + * native declaration : :260
+ * Conversion Error : /// Original signature : NSColor* highlightColorWithFrame(null, NSView*)
+ * - (NSColor*)highlightColorWithFrame:(null)cellFrame inView:(NSView*)controlView; (Argument cellFrame cannot be converted) + */ + /** + * native declaration : :261
+ * Conversion Error : /// Original signature : void calcDrawInfo(null)
+ * - (void)calcDrawInfo:(null)aRect; (Argument aRect cannot be converted) + */ + /** + * Original signature : NSText* setUpFieldEditorAttributes(NSText*)
+ * native declaration : :262 + */ + public abstract NSText setUpFieldEditorAttributes(com.sun.jna.Pointer textObj); + /** + * native declaration : :263
+ * Conversion Error : /// Original signature : void drawInteriorWithFrame(null, NSView*)
+ * - (void)drawInteriorWithFrame:(null)cellFrame inView:(NSView*)controlView; (Argument cellFrame cannot be converted) + */ + /** + * native declaration : :264
+ * Conversion Error : /// Original signature : void drawWithFrame(null, NSView*)
+ * - (void)drawWithFrame:(null)cellFrame inView:(NSView*)controlView; (Argument cellFrame cannot be converted) + */ + /** + * native declaration : :265
+ * Conversion Error : /// Original signature : void highlight(BOOL, null, NSView*)
+ * - (void)highlight:(BOOL)flag withFrame:(null)cellFrame inView:(NSView*)controlView; (Argument cellFrame cannot be converted) + */ + /** + * Original signature : NSInteger mouseDownFlags()
+ * native declaration : :266 + */ + public abstract int mouseDownFlags(); + + /** + * Original signature : void getPeriodicDelay(float*, float*)
+ * native declaration : :267 + */ + public abstract void getPeriodicDelay_interval(java.nio.FloatBuffer delay, java.nio.FloatBuffer interval); + /** + * native declaration : :268
+ * Conversion Error : /// Original signature : BOOL startTrackingAt(null, NSView*)
+ * - (BOOL)startTrackingAt:(null)startPoint inView:(NSView*)controlView; (Argument startPoint cannot be converted) + */ + /** + * native declaration : :269
+ * Conversion Error : /// Original signature : BOOL continueTracking(null, null, NSView*)
+ * - (BOOL)continueTracking:(null)lastPoint at:(null)currentPoint inView:(NSView*)controlView; (Argument lastPoint cannot be converted) + */ + /** + * native declaration : :270
+ * Conversion Error : /// Original signature : void stopTracking(null, null, NSView*, BOOL)
+ * - (void)stopTracking:(null)lastPoint at:(null)stopPoint inView:(NSView*)controlView mouseIsUp:(BOOL)flag; (Argument lastPoint cannot be converted) + */ + /** + * native declaration : :271
+ * Conversion Error : /// Original signature : BOOL trackMouse(NSEvent*, null, NSView*, BOOL)
+ * - (BOOL)trackMouse:(NSEvent*)theEvent inRect:(null)cellFrame ofView:(NSView*)controlView untilMouseUp:(BOOL)flag; (Argument cellFrame cannot be converted) + */ + /** + * native declaration : :272
+ * Conversion Error : /// Original signature : void editWithFrame(null, NSView*, NSText*, id, NSEvent*)
+ * - (void)editWithFrame:(null)aRect inView:(NSView*)controlView editor:(NSText*)textObj delegate:(id)anObject event:(NSEvent*)theEvent; (Argument aRect cannot be converted) + */ + /** + * native declaration : :273
+ * Conversion Error : /// Original signature : void selectWithFrame(null, NSView*, NSText*, id, NSInteger, NSInteger)
+ * - (void)selectWithFrame:(null)aRect inView:(NSView*)controlView editor:(NSText*)textObj delegate:(id)anObject start:(NSInteger)selStart length:(NSInteger)selLength; (Argument aRect cannot be converted) + */ + /** + * Original signature : void endEditing(NSText*)
+ * native declaration : :274 + */ + public abstract void endEditing(NSText textObj); + /** + * native declaration : :275
+ * Conversion Error : /// Original signature : void resetCursorRect(null, NSView*)
+ * - (void)resetCursorRect:(null)cellFrame inView:(NSView*)controlView; (Argument cellFrame cannot be converted) + */ + /** + * Original signature : void setMenu(NSMenu*)
+ * native declaration : :277 + */ + public abstract void setMenu(NSMenu aMenu); + + /** + * Original signature : NSMenu* menu()
+ * native declaration : :278 + */ + public abstract NSMenu menu(); + /** + * native declaration : :279
+ * Conversion Error : /// Original signature : NSMenu* menuForEvent(NSEvent*, null, NSView*)
+ * - (NSMenu*)menuForEvent:(NSEvent*)event inRect:(null)cellFrame ofView:(NSView*)view; (Argument cellFrame cannot be converted) + */ + /** + * Original signature : void setSendsActionOnEndEditing(BOOL)
+ * native declaration : :282 + */ + public abstract void setSendsActionOnEndEditing(boolean flag); + + /** + * Original signature : BOOL sendsActionOnEndEditing()
+ * native declaration : :283 + */ + public abstract boolean sendsActionOnEndEditing(); + + /** + * Original signature : baseWritingDirection()
+ * native declaration : :286 + */ + public abstract int baseWritingDirection(); + /** + * native declaration : :287
+ * Conversion Error : /// Original signature : void setBaseWritingDirection(null)
+ * - (void)setBaseWritingDirection:(null)writingDirection; (Argument writingDirection cannot be converted) + */ + /** + * native declaration : :289
+ * Conversion Error : /// Original signature : void setLineBreakMode(null)
+ * - (void)setLineBreakMode:(null)mode; (Argument mode cannot be converted) + */ + /** + * Original signature : lineBreakMode()
+ * native declaration : :290 + */ + public abstract com.sun.jna.Pointer lineBreakMode(); + + /** + * Original signature : void setAllowsUndo(BOOL)
+ * native declaration : :292 + */ + public abstract void setAllowsUndo(boolean allowsUndo); + + /** + * Original signature : BOOL allowsUndo()
+ * native declaration : :293 + */ + public abstract boolean allowsUndo(); + + /** + * Original signature : NSInteger integerValue()
+ * native declaration : :297 + */ + public abstract NSInteger integerValue(); + + /** + * Original signature : void setIntegerValue(NSInteger)
+ * native declaration : :298 + */ + public abstract void setIntegerValue(NSInteger anInteger); + + /** + * Original signature : void takeIntegerValueFrom(id)
+ * native declaration : :299 + */ + public abstract void takeIntegerValueFrom(final ID sender); + + /** + * Truncates and adds the ellipsis character to the last visible line if the text doesn't fit into the cell bounds. The setting is ignored if -lineBreakMode is neither NSLineBreakByWordWrapping nor NSLineBreakByCharWrapping.
+ * Original signature : BOOL truncatesLastVisibleLine()
+ * native declaration : :304 + */ + public abstract boolean truncatesLastVisibleLine(); + + /** + * Original signature : void setTruncatesLastVisibleLine(BOOL)
+ * native declaration : :305 + */ + public abstract void setTruncatesLastVisibleLine(boolean flag); + + /** + * Original signature : void setRefusesFirstResponder(BOOL)
+ * from NSKeyboardUI native declaration : :309 + */ + public abstract void setRefusesFirstResponder(boolean flag); + + /** + * Original signature : BOOL refusesFirstResponder()
+ * from NSKeyboardUI native declaration : :310 + */ + public abstract boolean refusesFirstResponder(); + + /** + * Original signature : BOOL acceptsFirstResponder()
+ * from NSKeyboardUI native declaration : :311 + */ + public abstract boolean acceptsFirstResponder(); + + /** + * Original signature : void setShowsFirstResponder(BOOL)
+ * from NSKeyboardUI native declaration : :312 + */ + public abstract void setShowsFirstResponder(boolean showFR); + + /** + * Original signature : BOOL showsFirstResponder()
+ * from NSKeyboardUI native declaration : :313 + */ + public abstract boolean showsFirstResponder(); + + /** + * Original signature : void setMnemonicLocation(NSUInteger)
+ * from NSKeyboardUI native declaration : :314 + */ + public abstract void setMnemonicLocation(int location); + + /** + * Original signature : NSUInteger mnemonicLocation()
+ * from NSKeyboardUI native declaration : :315 + */ + public abstract int mnemonicLocation(); + + /** + * Original signature : NSString* mnemonic()
+ * from NSKeyboardUI native declaration : :316 + */ + public abstract String mnemonic(); + + /** + * Original signature : void setTitleWithMnemonic(NSString*)
+ * from NSKeyboardUI native declaration : :317 + */ + public abstract void setTitleWithMnemonic(String stringWithAmpersand); + + /** + * Original signature : void performClick(id)
+ * from NSKeyboardUI native declaration : :318 + */ + public abstract void performClick(final ID sender); + /** + * from NSKeyboardUI native declaration : :321
+ * Conversion Error : /// Original signature : void setFocusRingType(null)
+ * - (void)setFocusRingType:(null)focusRingType; (Argument focusRingType cannot be converted) + */ + /** + * Original signature : focusRingType()
+ * from NSKeyboardUI native declaration : :322 + */ + public abstract com.sun.jna.Pointer focusRingType(); + + /** + * Original signature : BOOL wantsNotificationForMarkedText()
+ * If the receiver returns YES, the field editor initiated by it posts text change notifications (i.e. NSTextDidChangeNotification) while editing marked text; otherwise, they are delayed until the marked text confirmation. The NSCell's implementation returns NO.
+ * from NSKeyboardUI native declaration : :326 + */ + public abstract boolean wantsNotificationForMarkedText(); + + /** + * Original signature : NSAttributedString* attributedStringValue()
+ * from NSCellAttributedStringMethods native declaration : :331 + */ + public abstract NSAttributedString attributedStringValue(); + + /** + * Original signature : void setAttributedStringValue(NSAttributedString*)
+ * from NSCellAttributedStringMethods native declaration : :332 + */ + public abstract void setAttributedStringValue(NSAttributedString obj); + + /** + * These methods determine whether the user can modify text attributes and import graphics in a rich cell. Note that whatever these flags are, cells can still contain attributed text if programmatically set.
+ * Original signature : BOOL allowsEditingTextAttributes()
+ * from NSCellAttributedStringMethods native declaration : :334 + */ + public abstract boolean allowsEditingTextAttributes(); + + /** + * Original signature : void setAllowsEditingTextAttributes(BOOL)
+ * If NO, also clears setImportsGraphics:
+ * from NSCellAttributedStringMethods native declaration : :335 + */ + public abstract void setAllowsEditingTextAttributes(boolean flag); + + /** + * Original signature : BOOL importsGraphics()
+ * from NSCellAttributedStringMethods native declaration : :336 + */ + public abstract boolean importsGraphics(); + + /** + * Original signature : void setImportsGraphics(BOOL)
+ * If YES, also sets setAllowsEditingTextAttributes:
+ * from NSCellAttributedStringMethods native declaration : :337 + */ + public abstract void setImportsGraphics(boolean flag); + + /** + * Original signature : void setAllowsMixedState(BOOL)
+ * allow button to have mixed state value
+ * from NSCellMixedState native declaration : :341 + */ + public abstract void setAllowsMixedState(boolean flag); + + /** + * Original signature : BOOL allowsMixedState()
+ * from NSCellMixedState native declaration : :342 + */ + public abstract boolean allowsMixedState(); + + /** + * Original signature : NSInteger nextState()
+ * get next state state in cycle
+ * from NSCellMixedState native declaration : :343 + */ + public abstract NSInteger nextState(); + + /** + * Original signature : void setNextState()
+ * toggle/cycle through states
+ * from NSCellMixedState native declaration : :344 + */ + public abstract void setNextState(); + /** + * from NSCellHitTest native declaration : :382
+ * Conversion Error : /**
+ * * Return hit testing information for the cell. Use a bit-wise mask to look for a specific value when calling the method. Generally, this should be overridden by custom NSCell subclasses to return the correct result. Currently, it is called by some multi-cell views, such as NSTableView.
+ * * By default, NSCell will look at the cell type and do the following:
+ * * NSImageCellType:
+ * * If the image exists, and the event point is in the image return NSCellHitContentArea, else NSCellHitNone.
+ * * NSTextCellType (also applies to NSTextFieldCell):
+ * * If there is text:
+ * * If the event point hits in the text, return NSCellHitContentArea. Additionally, if the cell is enabled return NSCellHitContentArea | NSCellHitEditableTextArea.
+ * * If there is not text:
+ * * Returns NSCellHitNone.
+ * * NSNullCellType (this is the default that applies to non text or image cells who don't override hitTestForEvent:):
+ * * Return NSCellHitContentArea by default.
+ * * If the cell not disabled, and it would track, return NSCellHitContentArea | NSCellHitTrackableArea.
+ * * Original signature : NSUInteger hitTestForEvent(NSEvent*, null, NSView*)
+ * * /
+ * - (NSUInteger)hitTestForEvent:(NSEvent*)event inRect:(null)cellFrame ofView:(NSView*)controlView; (Argument cellFrame cannot be converted) + */ + /** + * from NSCellExpansion native declaration : :388
+ * Conversion Error : /**
+ * * Allows the cell to return an expansion cell frame if cellFrame is too small for the entire contents in the view. When the mouse is hovered over the cell in certain controls, the full cell contents will be shown in a special floating tool tip view. If the frame is not too small, return an empty rect, and no expansion tool tip view will be shown. By default, NSCell returns NSZeroRect, while some subclasses (such as NSTextFieldCell) will return the proper frame when required.
+ * * Original signature : expansionFrameWithFrame(null, NSView*)
+ * * /
+ * - (null)expansionFrameWithFrame:(null)cellFrame inView:(NSView*)view; (Argument cellFrame cannot be converted) + */ + /** + * from NSCellExpansion native declaration : :392
+ * Conversion Error : /**
+ * * Allows the cell to perform custom expansion tool tip drawing. Note that the view may be different from the original view that the cell appeared in. By default, NSCell simply calls drawWithFrame:inView:.
+ * * Original signature : void drawWithExpansionFrame(null, NSView*)
+ * * /
+ * - (void)drawWithExpansionFrame:(null)cellFrame inView:(NSView*)view; (Argument cellFrame cannot be converted) + */ + /** + * Describes the surface the cell is drawn onto in -[NSCell drawWithFrame:inView:]. A control typically sets this before it asks the cell to draw. A cell may draw differently based on background characteristics. For example, a tableview drawing a cell in a selected row might call [cell setBackgroundStyle:NSBackgroundStyleDark]. A text cell might decide to render its text white as a result. A rating-style level indicator might draw its stars white instead of gray.
+ * Original signature : NSBackgroundStyle backgroundStyle()
+ * from NSCellBackgroundStyle native declaration : :407 + */ + public abstract NSUInteger backgroundStyle(); + + /** + * Original signature : void setBackgroundStyle(NSBackgroundStyle)
+ * from NSCellBackgroundStyle native declaration : :408 + */ + public abstract void setBackgroundStyle(NSUInteger style); + + /** + * Describes the surface drawn onto in -[NSCell drawInteriorWithFrame:inView:]. This is often the same as the backgroundStyle, but a button that draws a bezel would have a different interiorBackgroundStyle.
+ * This is both an override point and a useful method to call. A button that draws a custom bezel would override this to describe that surface. A cell that has custom interior drawing might query this method to help pick an image that looks good on the cell. Calling this method gives you some independence from changes in framework art style.
+ * Original signature : NSBackgroundStyle interiorBackgroundStyle()
+ * from NSCellBackgroundStyle native declaration : :415 + */ + public abstract NSUInteger interiorBackgroundStyle(); +} \ No newline at end of file diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSControl.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSControl.java new file mode 100644 index 0000000..4eeafcf --- /dev/null +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSControl.java @@ -0,0 +1,384 @@ +package org.rococoa.cocoa.appkit; + +import org.rococoa.ID; +import org.rococoa.Selector; +import org.rococoa.cocoa.foundation.NSFormatter; +import org.rococoa.cocoa.foundation.NSInteger; +import org.rococoa.cocoa.foundation.NSObject; +import org.rococoa.cocoa.foundation.NSRect; +import org.rococoa.cocoa.foundation.NSAttributedString; + +/// native declaration : :10 +public abstract class NSControl extends NSView { + + /** + * native declaration : :29
+ * Conversion Error : /// Original signature : id initWithFrame(null)
+ * - (id)initWithFrame:(null)frameRect; (Argument frameRect cannot be converted) + */ + public abstract NSControl initWithFrame(NSRect frameRect); + + /** + * Original signature : void sizeToFit()
+ * native declaration : :30 + */ + public abstract void sizeToFit(); + + /** + * Original signature : void calcSize()
+ * native declaration : :31 + */ + public abstract void calcSize(); + + /** + * Original signature : id cell()
+ * native declaration : :32 + */ + public abstract NSCell cell(); + + /** + * Original signature : void setCell(NSCell*)
+ * native declaration : :33 + */ + public abstract void setCell(NSTextFieldCell aCell); + + /** + * Original signature : id selectedCell()
+ * native declaration : :34 + */ + public abstract NSCell selectedCell(); + + /** + * Original signature : id target()
+ * native declaration : :35 + */ + public abstract org.rococoa.ID target(); + + /** + * Original signature : void setTarget(id)
+ * native declaration : :36 + */ + public abstract void setTarget(org.rococoa.ID anObject); + + /** + * Original signature : action()
+ * native declaration : :37 + */ + public abstract Selector action(); + + /** + * native declaration : :38
+ * Conversion Error : /// Original signature : void setAction(null)
+ * - (void)setAction:(null)aSelector; (Argument aSelector cannot be converted) + */ + public abstract void setAction(Selector action); + + /** + * Original signature : void setTag(NSInteger)
+ * native declaration : :40 + */ + public abstract void setTag(NSInteger anInt); + + /** + * Original signature : NSInteger selectedTag()
+ * native declaration : :41 + */ + public abstract NSInteger selectedTag(); + + /** + * Original signature : void setIgnoresMultiClick(BOOL)
+ * native declaration : :42 + */ + public abstract void setIgnoresMultiClick(boolean flag); + + /** + * Original signature : BOOL ignoresMultiClick()
+ * native declaration : :43 + */ + public abstract boolean ignoresMultiClick(); + + /** + * Original signature : NSInteger sendActionOn(NSInteger)
+ * native declaration : :44 + */ + public abstract int sendActionOn(int mask); + + /** + * Original signature : BOOL isContinuous()
+ * native declaration : :45 + */ + public abstract boolean isContinuous(); + + /** + * Original signature : void setContinuous(BOOL)
+ * native declaration : :46 + */ + public abstract void setContinuous(boolean flag); + + /** + * Original signature : BOOL isEnabled()
+ * native declaration : :47 + */ + public abstract boolean isEnabled(); + + /** + * Original signature : void setEnabled(BOOL)
+ * native declaration : :48 + */ + public abstract void setEnabled(boolean flag); + + /** + * Original signature : void setFloatingPointFormat(BOOL, NSUInteger, NSUInteger)
+ * native declaration : :49 + */ + public abstract void setFloatingPointFormat_left_right(boolean autoRange, int leftDigits, int rightDigits); + + /** + * Original signature : alignment()
+ * native declaration : :50 + */ + public abstract NSObject alignment(); + /** + * native declaration : :51
+ * Conversion Error : /// Original signature : void setAlignment(null)
+ * - (void)setAlignment:(null)mode; (Argument mode cannot be converted) + */ + /** + * Original signature : NSFont* font()
+ * native declaration : :52 + */ + public abstract NSFont font(); + + /** + * Original signature : void setFont(NSFont*)
+ * native declaration : :53 + */ + public abstract void setFont(NSFont fontObj); + + /** + * Original signature : void setFormatter(NSFormatter*)
+ * native declaration : :54 + */ + public abstract void setFormatter(NSFormatter newFormatter); + + /** + * Original signature : id formatter()
+ * native declaration : :55 + */ + public abstract NSObject formatter(); + /** + * native declaration : :56
+ * Conversion Error : id + */ + /** + * Original signature : void setStringValue(NSString*)
+ * native declaration : :57 + */ + public abstract void setStringValue(String aString); + + /** + * Original signature : void setIntValue(int)
+ * native declaration : :58 + */ + public abstract void setIntValue(int anInt); + + /** + * Original signature : void setFloatValue(float)
+ * native declaration : :59 + */ + public abstract void setFloatValue(float aFloat); + + /** + * Original signature : void setDoubleValue(double)
+ * native declaration : :60 + */ + public abstract void setDoubleValue(double aDouble); + + /** + * Original signature : id objectValue()
+ * native declaration : :61 + */ + public abstract NSObject objectValue(); + + /** + * Original signature : NSString* stringValue()
+ * native declaration : :62 + */ + public abstract String stringValue(); + + /** + * Original signature : int intValue()
+ * native declaration : :63 + */ + public abstract int intValue(); + + /** + * Original signature : float floatValue()
+ * native declaration : :64 + */ + public abstract float floatValue(); + + /** + * Original signature : double doubleValue()
+ * native declaration : :65 + */ + public abstract double doubleValue(); + + /** + * Original signature : void setNeedsDisplay()
+ * native declaration : :66 + */ + public abstract void setNeedsDisplay(); + + /** + * Original signature : void updateCell(NSCell*)
+ * native declaration : :67 + */ + public abstract void updateCell(NSCell aCell); + + /** + * Original signature : void updateCellInside(NSCell*)
+ * native declaration : :68 + */ + public abstract void updateCellInside(NSCell aCell); + + /** + * Original signature : void drawCellInside(NSCell*)
+ * native declaration : :69 + */ + public abstract void drawCellInside(NSCell aCell); + + /** + * Original signature : void drawCell(NSCell*)
+ * native declaration : :70 + */ + public abstract void drawCell(NSCell aCell); + + /** + * Original signature : void selectCell(NSCell*)
+ * native declaration : :71 + */ + public abstract void selectCell(NSCell aCell); + /** + * native declaration : :73
+ * Conversion Error : /// Original signature : BOOL sendAction(null, id)
+ * - (BOOL)sendAction:(null)theAction to:(id)theTarget; (Argument theAction cannot be converted) + */ + /** + * Original signature : void takeIntValueFrom(id)
+ * native declaration : :74 + */ + public abstract void takeIntValueFrom(final ID sender); + + /** + * Original signature : void takeFloatValueFrom(id)
+ * native declaration : :75 + */ + public abstract void takeFloatValueFrom(final ID sender); + + /** + * Original signature : void takeDoubleValueFrom(id)
+ * native declaration : :76 + */ + public abstract void takeDoubleValueFrom(final ID sender); + + /** + * Original signature : void takeStringValueFrom(id)
+ * native declaration : :77 + */ + public abstract void takeStringValueFrom(final ID sender); + + /** + * Original signature : void takeObjectValueFrom(id)
+ * native declaration : :78 + */ + public abstract void takeObjectValueFrom(final ID sender); + + /** + * Original signature : NSText* currentEditor()
+ * native declaration : :79 + */ + public abstract NSText currentEditor(); + + /** + * Original signature : BOOL abortEditing()
+ * native declaration : :80 + */ + public abstract boolean abortEditing(); + + /** + * Original signature : void validateEditing()
+ * native declaration : :81 + */ + public abstract void validateEditing(); + + /** + * Original signature : void mouseDown(NSEvent*)
+ * native declaration : :82 + */ + public abstract void mouseDown(NSEvent event); + + /** + * Original signature : baseWritingDirection()
+ * native declaration : :85 + */ + public abstract NSObject baseWritingDirection(); + /** + * native declaration : :86
+ * Conversion Error : /// Original signature : void setBaseWritingDirection(null)
+ * - (void)setBaseWritingDirection:(null)writingDirection; (Argument writingDirection cannot be converted) + */ + /** + * Original signature : NSInteger integerValue()
+ * native declaration : :90 + */ + public abstract int integerValue(); + + /** + * Original signature : void setIntegerValue(NSInteger)
+ * native declaration : :91 + */ + public abstract void setIntegerValue(int anInteger); + + /** + * Original signature : void takeIntegerValueFrom(id)
+ * native declaration : :92 + */ + public abstract void takeIntegerValueFrom(org.rococoa.ID sender); + + /** + * from NSKeyboardUI native declaration : :98
+ * Conversion Error : /// Original signature : void performClick(null)
+ * - (void)performClick:(null)sender; (Argument sender cannot be converted) + */ + public abstract void performClick(org.rococoa.ID sender); + + /** + * Original signature : void setRefusesFirstResponder(BOOL)
+ * from NSKeyboardUI native declaration : :99 + */ + public abstract void setRefusesFirstResponder(boolean flag); + + /** + * Original signature : BOOL refusesFirstResponder()
+ * from NSKeyboardUI native declaration : :100 + */ + public abstract boolean refusesFirstResponder(); + + /** + * Original signature : NSAttributedString* attributedStringValue()
+ * from NSControlAttributedStringMethods native declaration : :135 + */ + public abstract NSAttributedString attributedStringValue(); + + /** + * Original signature : void setAttributedStringValue(NSAttributedString*)
+ * from NSControlAttributedStringMethods native declaration : :136 + */ + public abstract void setAttributedStringValue(NSAttributedString obj); + + public static final String NSControlTextDidBeginEditingNotification = "NSControlTextDidBeginEditingNotification"; + public static final String NSControlTextDidEndEditingNotification = "NSControlTextDidEndEditingNotification"; + public static final String NSControlTextDidChangeNotification = "NSControlTextDidChangeNotification"; + +} \ No newline at end of file diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/NSDistributedNotificationCenter.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSDistributedNotificationCenter.java similarity index 95% rename from rococoa-contrib/src/main/java/org/rococoa/cocoa/NSDistributedNotificationCenter.java rename to rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSDistributedNotificationCenter.java index 62276d8..ab78888 100644 --- a/rococoa-contrib/src/main/java/org/rococoa/cocoa/NSDistributedNotificationCenter.java +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSDistributedNotificationCenter.java @@ -17,7 +17,7 @@ * along with Rococoa. If not, see . */ -package org.rococoa.cocoa; +package org.rococoa.cocoa.appkit; import org.rococoa.ObjCClass; import org.rococoa.Rococoa; @@ -32,7 +32,7 @@ * @version $Id: NSDistributedNotificationCenter.java,v 1.0 Mar 26, 2009 5:47:51 PM haraldk Exp$ */ public abstract class NSDistributedNotificationCenter extends NSObject { - public static final _Class CLASS = Rococoa.createClass("NSDistributedNotificationCenter", _Class.class); //$NON-NLS-1$ + public static final _Class CLASS = Rococoa.createClass("NSDistributedNotificationCenter", _Class.class); public interface _Class extends ObjCClass { NSDistributedNotificationCenter defaultCenter(); diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/NSDockTile.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSDockTile.java similarity index 96% rename from rococoa-contrib/src/main/java/org/rococoa/cocoa/NSDockTile.java rename to rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSDockTile.java index 45f9f77..2276bd8 100644 --- a/rococoa-contrib/src/main/java/org/rococoa/cocoa/NSDockTile.java +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSDockTile.java @@ -17,7 +17,7 @@ * along with Rococoa. If not, see . */ -package org.rococoa.cocoa; +package org.rococoa.cocoa.appkit; import org.rococoa.cocoa.foundation.NSObject; diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSEvent.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSEvent.java new file mode 100644 index 0000000..32e8215 --- /dev/null +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSEvent.java @@ -0,0 +1,663 @@ +package org.rococoa.cocoa.appkit; + +import com.sun.jna.Pointer; +import org.rococoa.ID; +import org.rococoa.ObjCClass; +import org.rococoa.Rococoa; +import org.rococoa.cocoa.CGFloat; +import org.rococoa.cocoa.foundation.NSArray; +import org.rococoa.cocoa.foundation.NSCopying; +import org.rococoa.cocoa.foundation.NSObject; +import org.rococoa.cocoa.foundation.NSPoint; + + +public abstract class NSEvent extends NSObject implements NSCopying { + + /// native declaration : :12 + public static final int NSLeftMouseDown = 1; + /// native declaration : :13 + public static final int NSLeftMouseUp = 2; + /// native declaration : :14 + public static final int NSRightMouseDown = 3; + /// native declaration : :15 + public static final int NSRightMouseUp = 4; + /// native declaration : :16 + public static final int NSMouseMoved = 5; + /// native declaration : :17 + public static final int NSLeftMouseDragged = 6; + /// native declaration : :18 + public static final int NSRightMouseDragged = 7; + /// native declaration : :19 + public static final int NSMouseEntered = 8; + /// native declaration : :20 + public static final int NSMouseExited = 9; + /// native declaration : :21 + public static final int NSKeyDown = 10; + /// native declaration : :22 + public static final int NSKeyUp = 11; + /// native declaration : :23 + public static final int NSFlagsChanged = 12; + /// native declaration : :24 + public static final int NSAppKitDefined = 13; + /// native declaration : :25 + public static final int NSSystemDefined = 14; + /// native declaration : :26 + public static final int NSApplicationDefined = 15; + /// native declaration : :27 + public static final int NSPeriodic = 16; + /// native declaration : :28 + public static final int NSCursorUpdate = 17; + /// native declaration : :29 + public static final int NSScrollWheel = 22; + /// native declaration : :31 + public static final int NSTabletPoint = 23; + /// native declaration : :32 + public static final int NSTabletProximity = 24; + /// native declaration : :34 + public static final int NSOtherMouseDown = 25; + /// native declaration : :35 + public static final int NSOtherMouseUp = 26; + /// native declaration : :36 + public static final int NSOtherMouseDragged = 27; + /// native declaration : :41 + public static final int NSLeftMouseDownMask = 1 << NSLeftMouseDown; + /// native declaration : :42 + public static final int NSLeftMouseUpMask = 1 << NSLeftMouseUp; + /// native declaration : :43 + public static final int NSRightMouseDownMask = 1 << NSRightMouseDown; + /// native declaration : :44 + public static final int NSRightMouseUpMask = 1 << NSRightMouseUp; + /// native declaration : :45 + public static final int NSMouseMovedMask = 1 << NSMouseMoved; + /// native declaration : :46 + public static final int NSLeftMouseDraggedMask = 1 << NSLeftMouseDragged; + /// native declaration : :47 + public static final int NSRightMouseDraggedMask = 1 << NSRightMouseDragged; + /// native declaration : :48 + public static final int NSMouseEnteredMask = 1 << NSMouseEntered; + /// native declaration : :49 + public static final int NSMouseExitedMask = 1 << NSMouseExited; + /// native declaration : :50 + public static final int NSKeyDownMask = 1 << NSKeyDown; + /// native declaration : :51 + public static final int NSKeyUpMask = 1 << NSKeyUp; + /// native declaration : :52 + public static final int NSFlagsChangedMask = 1 << NSFlagsChanged; + /// native declaration : :53 + public static final int NSAppKitDefinedMask = 1 << NSAppKitDefined; + /// native declaration : :54 + public static final int NSSystemDefinedMask = 1 << NSSystemDefined; + /// native declaration : :55 + public static final int NSApplicationDefinedMask = 1 << NSApplicationDefined; + /// native declaration : :56 + public static final int NSPeriodicMask = 1 << NSPeriodic; + /// native declaration : :57 + public static final int NSCursorUpdateMask = 1 << NSCursorUpdate; + /// native declaration : :58 + public static final int NSScrollWheelMask = 1 << NSScrollWheel; + /// native declaration : :60 + public static final int NSTabletPointMask = 1 << NSTabletPoint; + /// native declaration : :61 + public static final int NSTabletProximityMask = 1 << NSTabletProximity; + /// native declaration : :63 + public static final int NSOtherMouseDownMask = 1 << NSOtherMouseDown; + /// native declaration : :64 + public static final int NSOtherMouseUpMask = 1 << NSOtherMouseUp; + /// native declaration : :65 + public static final int NSOtherMouseDraggedMask = 1 << NSOtherMouseDragged; + /// Failed to infer type of NSUIntegerMax + /// Failed to infer type of NX_TABLET_POINTER_UNKNOWN + /// Failed to infer type of NX_TABLET_POINTER_PEN + /// Failed to infer type of NX_TABLET_POINTER_CURSOR + /// Failed to infer type of NX_TABLET_POINTER_ERASER + /// Failed to infer type of NX_TABLET_BUTTON_PENTIPMASK + /// Failed to infer type of NX_TABLET_BUTTON_PENLOWERSIDEMASK + /// Failed to infer type of NX_TABLET_BUTTON_PENUPPERSIDEMASK + /// native declaration : :313 + public static final int NSUpArrowFunctionKey = 63232; + /// native declaration : :314 + public static final int NSDownArrowFunctionKey = 63233; + /// native declaration : :315 + public static final int NSLeftArrowFunctionKey = 63234; + /// native declaration : :316 + public static final int NSRightArrowFunctionKey = 63235; + /// native declaration : :317 + public static final int NSF1FunctionKey = 63236; + /// native declaration : :318 + public static final int NSF2FunctionKey = 63237; + /// native declaration : :319 + public static final int NSF3FunctionKey = 63238; + /// native declaration : :320 + public static final int NSF4FunctionKey = 63239; + /// native declaration : :321 + public static final int NSF5FunctionKey = 63240; + /// native declaration : :322 + public static final int NSF6FunctionKey = 63241; + /// native declaration : :323 + public static final int NSF7FunctionKey = 63242; + /// native declaration : :324 + public static final int NSF8FunctionKey = 63243; + /// native declaration : :325 + public static final int NSF9FunctionKey = 63244; + /// native declaration : :326 + public static final int NSF10FunctionKey = 63245; + /// native declaration : :327 + public static final int NSF11FunctionKey = 63246; + /// native declaration : :328 + public static final int NSF12FunctionKey = 63247; + /// native declaration : :329 + public static final int NSF13FunctionKey = 63248; + /// native declaration : :330 + public static final int NSF14FunctionKey = 63249; + /// native declaration : :331 + public static final int NSF15FunctionKey = 63250; + /// native declaration : :332 + public static final int NSF16FunctionKey = 63251; + /// native declaration : :333 + public static final int NSF17FunctionKey = 63252; + /// native declaration : :334 + public static final int NSF18FunctionKey = 63253; + /// native declaration : :335 + public static final int NSF19FunctionKey = 63254; + /// native declaration : :336 + public static final int NSF20FunctionKey = 63255; + /// native declaration : :337 + public static final int NSF21FunctionKey = 63256; + /// native declaration : :338 + public static final int NSF22FunctionKey = 63257; + /// native declaration : :339 + public static final int NSF23FunctionKey = 63258; + /// native declaration : :340 + public static final int NSF24FunctionKey = 63259; + /// native declaration : :341 + public static final int NSF25FunctionKey = 63260; + /// native declaration : :342 + public static final int NSF26FunctionKey = 63261; + /// native declaration : :343 + public static final int NSF27FunctionKey = 63262; + /// native declaration : :344 + public static final int NSF28FunctionKey = 63263; + /// native declaration : :345 + public static final int NSF29FunctionKey = 63264; + /// native declaration : :346 + public static final int NSF30FunctionKey = 63265; + /// native declaration : :347 + public static final int NSF31FunctionKey = 63266; + /// native declaration : :348 + public static final int NSF32FunctionKey = 63267; + /// native declaration : :349 + public static final int NSF33FunctionKey = 63268; + /// native declaration : :350 + public static final int NSF34FunctionKey = 63269; + /// native declaration : :351 + public static final int NSF35FunctionKey = 63270; + /// native declaration : :352 + public static final int NSInsertFunctionKey = 63271; + /// native declaration : :353 + public static final int NSDeleteFunctionKey = 63272; + /// native declaration : :354 + public static final int NSHomeFunctionKey = 63273; + /// native declaration : :355 + public static final int NSBeginFunctionKey = 63274; + /// native declaration : :356 + public static final int NSEndFunctionKey = 63275; + /// native declaration : :357 + public static final int NSPageUpFunctionKey = 63276; + /// native declaration : :358 + public static final int NSPageDownFunctionKey = 63277; + /// native declaration : :359 + public static final int NSPrintScreenFunctionKey = 63278; + /// native declaration : :360 + public static final int NSScrollLockFunctionKey = 63279; + /// native declaration : :361 + public static final int NSPauseFunctionKey = 63280; + /// native declaration : :362 + public static final int NSSysReqFunctionKey = 63281; + /// native declaration : :363 + public static final int NSBreakFunctionKey = 63282; + /// native declaration : :364 + public static final int NSResetFunctionKey = 63283; + /// native declaration : :365 + public static final int NSStopFunctionKey = 63284; + /// native declaration : :366 + public static final int NSMenuFunctionKey = 63285; + /// native declaration : :367 + public static final int NSUserFunctionKey = 63286; + /// native declaration : :368 + public static final int NSSystemFunctionKey = 63287; + /// native declaration : :369 + public static final int NSPrintFunctionKey = 63288; + /// native declaration : :370 + public static final int NSClearLineFunctionKey = 63289; + /// native declaration : :371 + public static final int NSClearDisplayFunctionKey = 63290; + /// native declaration : :372 + public static final int NSInsertLineFunctionKey = 63291; + /// native declaration : :373 + public static final int NSDeleteLineFunctionKey = 63292; + /// native declaration : :374 + public static final int NSInsertCharFunctionKey = 63293; + /// native declaration : :375 + public static final int NSDeleteCharFunctionKey = 63294; + /// native declaration : :376 + public static final int NSPrevFunctionKey = 63295; + /// native declaration : :377 + public static final int NSNextFunctionKey = 63296; + /// native declaration : :378 + public static final int NSSelectFunctionKey = 63297; + /// native declaration : :379 + public static final int NSExecuteFunctionKey = 63298; + /// native declaration : :380 + public static final int NSUndoFunctionKey = 63299; + /// native declaration : :381 + public static final int NSRedoFunctionKey = 63300; + /// native declaration : :382 + public static final int NSFindFunctionKey = 63301; + /// native declaration : :383 + public static final int NSHelpFunctionKey = 63302; + /// native declaration : :384 + public static final int NSModeSwitchFunctionKey = 63303; + /// native declaration : :389 + public static final int NSWindowExposedEventType = 0; + /// native declaration : :390 + public static final int NSApplicationActivatedEventType = 1; + /// native declaration : :391 + public static final int NSApplicationDeactivatedEventType = 2; + /// native declaration : :392 + public static final int NSWindowMovedEventType = 4; + /// native declaration : :393 + public static final int NSScreenChangedEventType = 8; + /// native declaration : :394 + public static final int NSAWTEventType = 16; + /// native declaration : :398 + public static final int NSPowerOffEventType = 1; + + + public static final int NSAlphaShiftKeyMask = 1 << 16; + public static final int NSShiftKeyMask = 1 << 17; + public static final int NSControlKeyMask = 1 << 18; + public static final int NSAlternateKeyMask = 1 << 19; + public static final int NSCommandKeyMask = 1 << 20; + public static final int NSNumericPadKeyMask = 1 << 21; + public static final int NSHelpKeyMask = 1 << 22; + public static final int NSFunctionKeyMask = 1 << 23; + + public static _Class CLASS = Rococoa.createClass("NSEvent", _Class.class); + + public interface _Class extends ObjCClass { + /** + * +eventWithEventRef: returns an autoreleased NSEvent corresponding to the EventRef. The EventRef is retained by the NSEvent and will be released when the NSEvent is freed. If there is no NSEvent corresponding to the EventRef, +eventWithEventRef will return nil.
+ * Original signature : NSEvent* eventWithEventRef(const void*)
+ * EventRef
+ * native declaration : :232 + */ + NSEvent eventWithEventRef(Pointer eventRef); + + /** + * native declaration : :240
+ * Conversion Error : /**
+ * * +eventWithCGEvent: returns an autoreleased NSEvent corresponding to the CGEventRef. The CGEventRef is retained by the NSEvent and will be released when the NSEvent is freed. If there is no NSEvent corresponding to the CGEventRef, +eventWithEventRef will return nil.
+ * * Original signature : NSEvent* eventWithCGEvent(null)
+ * * /
+ * + (NSEvent*)eventWithCGEvent:(null)cgEvent; (Argument cgEvent cannot be converted) + */ + NSEvent eventWithCGEvent(Pointer eventRef); + + /** + * Enable or disable coalescing of mouse movement events, including mouse moved, mouse dragged, and tablet events. Coalescing is enabled by default.
+ * Original signature : void setMouseCoalescingEnabled(BOOL)
+ * native declaration : :244 + */ + void setMouseCoalescingEnabled(boolean flag); + + /** + * Original signature : BOOL isMouseCoalescingEnabled()
+ * native declaration : :245 + */ + boolean isMouseCoalescingEnabled(); + /** + * native declaration : :296
+ * Conversion Error : NSTimeInterval + */ + /** + * Original signature : void stopPeriodicEvents()
+ * native declaration : :297 + */ + void stopPeriodicEvents(); + /** + * native declaration : :300
+ * Conversion Error : NSPoint + */ + /** + * native declaration : :301
+ * Conversion Error : NSPoint + */ + /** + * native declaration : :302
+ * Conversion Error : NSPoint + */ + /** + * native declaration : :303
+ * Conversion Error : NSPoint + */ + /** + * native declaration : :306
+ * Conversion Error : NSPoint + */ + } + + /** + * these messages are valid for all events
+ * Original signature : NSEventType type()
+ * native declaration : :177 + */ + public abstract int type(); + + /** + * Original signature : NSUInteger modifierFlags()
+ * native declaration : :178 + */ + public abstract int modifierFlags(); + /** + * native declaration : :179
+ * Conversion Error : NSTimeInterval + */ + /** + * Original signature : NSWindow* window()
+ * native declaration : :180 + */ + public abstract NSWindow window(); + + /** + * Original signature : NSInteger windowNumber()
+ * native declaration : :181 + */ + public abstract int windowNumber(); + + /** + * Original signature : NSGraphicsContext* context()
+ * native declaration : :182 + */ + public abstract com.sun.jna.Pointer context(); + + /** + * these messages are valid for all mouse down/up/drag events
+ * Original signature : NSInteger clickCount()
+ * native declaration : :185 + */ + public abstract int clickCount(); + + /** + * Original signature : NSInteger buttonNumber()
+ * for NSOtherMouse events, but will return valid constants for NSLeftMouse and NSRightMouse
+ * native declaration : :186 + */ + public abstract int buttonNumber(); + + /** + * these messages are valid for all mouse down/up/drag and enter/exit events
+ * Original signature : NSInteger eventNumber()
+ * native declaration : :188 + */ + public abstract int eventNumber(); + + /** + * These messages are also valid for NSTabletPoint events on 10.4 or later
+ * Original signature : float pressure()
+ * native declaration : :192 + */ + public abstract float pressure(); + + /** + * native declaration : :193
+ * Conversion Error : NSPoint + */ + public abstract NSPoint locationInWindow(); + + /** + * these messages are valid for scroll wheel events and mouse move/drag events
+ * Original signature : CGFloat deltaX()
+ * native declaration : :196 + */ + public abstract CGFloat deltaX(); + + /** + * Original signature : CGFloat deltaY()
+ * native declaration : :197 + */ + public abstract CGFloat deltaY(); + + /** + * Original signature : CGFloat deltaZ()
+ * 0 for most scroll wheel and mouse events
+ * native declaration : :198 + */ + public abstract CGFloat deltaZ(); + + /** + * these messages are valid for keyup and keydown events
+ * Original signature : NSString* characters()
+ * native declaration : :201 + */ + public abstract String characters(); + + /** + * Original signature : NSString* charactersIgnoringModifiers()
+ * native declaration : :202 + */ + public abstract String charactersIgnoringModifiers(); + + /** + * the chars that would have been generated, regardless of modifier keys (except shift)
+ * Original signature : BOOL isARepeat()
+ * native declaration : :204 + */ + public abstract boolean isARepeat(); + + /** + * this message is valid for keyup, keydown and flagschanged events
+ * Original signature : unsigned short keyCode()
+ * device-independent key number
+ * native declaration : :206 + */ + public abstract short keyCode(); + + /** + * these messages are valid for enter and exit events
+ * Original signature : NSInteger trackingNumber()
+ * native declaration : :209 + */ + public abstract int trackingNumber(); + + /** + * Original signature : void* userData()
+ * native declaration : :210 + */ + public abstract NSObject userData(); + + /** + * -trackingArea returns the NSTrackingArea that generated this event. It is possible for there to be no trackingArea associated with the event in some cases where the event corresponds to a trackingRect installed with -[NSView addTrackingRect:owner:userData:assumeInside:], in which case nil is returned.
+ * Original signature : NSTrackingArea* trackingArea()
+ * native declaration : :213 + */ + public abstract com.sun.jna.Pointer trackingArea(); + + /** + * this message is also valid for mouse events on 10.4 or later
+ * Original signature : short subtype()
+ * native declaration : :218 + */ + public abstract short subtype(); + + /** + * these messages are valid for kit, system, and app-defined events
+ * Original signature : NSInteger data1()
+ * native declaration : :221 + */ + public abstract int data1(); + + /** + * Original signature : NSInteger data2()
+ * native declaration : :222 + */ + public abstract int data2(); + + /** + * -eventRef returns an EventRef corresponding to the NSEvent. The EventRef is retained by the NSEvent, so will be valid as long as the NSEvent is valid, and will be released when the NSEvent is freed. You can use RetainEvent to extend the lifetime of the EventRef, with a corresponding ReleaseEvent when you are done with it. If there is no EventRef corresponding to the NSEvent, -eventRef will return NULL.
+ * Original signature : const void* eventRef()
+ * native declaration : :229 + */ + public abstract NSEvent eventRef(); + + /** + * -CGEvent returns an autoreleased CGEventRef corresponding to the NSEvent. If there is no CGEventRef corresponding to the NSEvent, -CGEvent will return NULL.
+ * Original signature : CGEvent()
+ * native declaration : :236 + */ + public abstract com.sun.jna.Pointer CGEvent(); + + /** + * this message is valid for mouse events with subtype NSTabletPointEventSubtype or NSTabletProximityEventSubtype, and for NSTabletPoint and NSTabletProximity events
+ * Original signature : NSUInteger deviceID()
+ * native declaration : :251 + */ + public abstract int deviceID(); + + /** + * absolute x coordinate in tablet space at full tablet resolution
+ * Original signature : NSInteger absoluteX()
+ * native declaration : :255 + */ + public abstract int absoluteX(); + + /** + * absolute y coordinate in tablet space at full tablet resolution
+ * Original signature : NSInteger absoluteY()
+ * native declaration : :257 + */ + public abstract int absoluteY(); + + /** + * absolute z coordinate in tablet space at full tablet resolution
+ * Original signature : NSInteger absoluteZ()
+ * native declaration : :259 + */ + public abstract int absoluteZ(); + + /** + * mask indicating which buttons are pressed.
+ * Original signature : NSUInteger buttonMask()
+ * native declaration : :261 + */ + public abstract int buttonMask(); + /** + * native declaration : :263
+ * Conversion Error : NSPoint + */ + /** + * device rotation in degrees
+ * Original signature : float rotation()
+ * native declaration : :265 + */ + public abstract float rotation(); + + /** + * tangential pressure on the device; range is -1 to 1
+ * Original signature : float tangentialPressure()
+ * native declaration : :267 + */ + public abstract float tangentialPressure(); + + /** + * NSArray of 3 vendor defined shorts
+ * Original signature : vendorDefined()
+ * native declaration : :269 + */ + public abstract NSArray vendorDefined(); + + /** + * vendor defined, typically USB vendor ID
+ * Original signature : NSUInteger vendorID()
+ * native declaration : :273 + */ + public abstract int vendorID(); + + /** + * vendor defined tablet ID
+ * Original signature : NSUInteger tabletID()
+ * native declaration : :275 + */ + public abstract int tabletID(); + + /** + * index of the device on the tablet. Usually 0, except for tablets that support multiple concurrent devices
+ * Original signature : NSUInteger pointingDeviceID()
+ * native declaration : :277 + */ + public abstract int pointingDeviceID(); + + /** + * system assigned unique tablet ID
+ * Original signature : NSUInteger systemTabletID()
+ * native declaration : :279 + */ + public abstract int systemTabletID(); + + /** + * vendor defined pointing device type
+ * Original signature : NSUInteger vendorPointingDeviceType()
+ * native declaration : :281 + */ + public abstract int vendorPointingDeviceType(); + + /** + * vendor defined serial number of pointing device
+ * Original signature : NSUInteger pointingDeviceSerialNumber()
+ * native declaration : :283 + */ + public abstract int pointingDeviceSerialNumber(); + + /** + * vendor defined unique ID
+ * Original signature : unsigned long long uniqueID()
+ * native declaration : :285 + */ + public abstract long uniqueID(); + + /** + * mask representing capabilities of device
+ * Original signature : NSUInteger capabilityMask()
+ * native declaration : :287 + */ + public abstract int capabilityMask(); + + /** + * mask representing capabilities of device
+ * Original signature : NSPointingDeviceType pointingDeviceType()
+ * native declaration : :289 + */ + public abstract int pointingDeviceType(); + + /** + * YES - entering; NO - leaving
+ * Original signature : BOOL isEnteringProximity()
+ * native declaration : :291 + */ + public abstract boolean isEnteringProximity(); + + public abstract NSPoint mouseLocation(); + + public abstract int phase(); + + public static final int NSEventTypeGesture = 29; + public static final int NSEventTypeMagnify = 30; + public static final int NSEventTypeSwipe = 31; + public static final int NSEventTypeRotate = 18; + public static final int NSEventTypeScrollWheel = 22; + + public static final long NSEventMaskGesture = 1L << NSEventTypeGesture; + public static final long NSEventMaskMagnify = 1L << NSEventTypeMagnify; + public static final long NSEventMaskSwipe = 1L << NSEventTypeSwipe; + public static final long NSEventMaskRotate = 1L << NSEventTypeRotate; + public static final long NSEventMaskScrollWheel = 1L << NSEventTypeScrollWheel; +} \ No newline at end of file diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSFont.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSFont.java new file mode 100644 index 0000000..7c9a6fc --- /dev/null +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSFont.java @@ -0,0 +1,543 @@ +package org.rococoa.cocoa.appkit; + +import org.rococoa.Foundation; +import org.rococoa.ObjCClass; +import org.rococoa.Rococoa; +import org.rococoa.cocoa.CGFloat; +import org.rococoa.cocoa.foundation.NSArray; +import org.rococoa.cocoa.foundation.NSCopying; +import org.rococoa.cocoa.foundation.NSDictionary; +import org.rococoa.cocoa.foundation.NSObject; +import org.rococoa.cocoa.foundation.NSUInteger; + +/// native declaration : :45 +public abstract class NSFont extends NSObject implements NSCopying { + private static final _Class CLASS = org.rococoa.Rococoa.createClass("NSFont", _Class.class); + + public static final double NSFontWeightUltraLight = -0.80d; + public static final double NSFontWeightThin = -0.60d; + public static final double NSFontWeightLight = -0.40d; + public static final double NSFontWeightRegular = 0.00d; + public static final double NSFontWeightMedium = 0.23d; + public static final double NSFontWeightSemibold = 0.30d; + public static final double NSFontWeightBold = 0.40d; + public static final double NSFontWeightHeavy = 0.56d; + public static final double NSFontWeightBlack = 0.62d; + + /** + * User font settings
+ * Original signature : NSFont* userFontOfSize(CGFloat)
+ * Aqua Application font
+ * native declaration : :77 + */ + public static NSFont userFontOfSize(double fontSize) { + return CLASS.userFontOfSize(new CGFloat(fontSize)); + } + + /** + * Original signature : NSFont* userFixedPitchFontOfSize(CGFloat)
+ * Aqua fixed-pitch font
+ * native declaration : :78 + */ + public static NSFont userFixedPitchFontOfSize(double fontSize) { + return CLASS.userFixedPitchFontOfSize(new CGFloat(fontSize)); + } + + /** + * UI font settings
+ * Original signature : NSFont* systemFontOfSize(CGFloat)
+ * Aqua System font
+ * native declaration : :84 + */ + public static NSFont systemFontOfSize(double fontSize) { + return CLASS.systemFontOfSize(new CGFloat(fontSize)); + } + + /** + * Original signature : NSFont* boldSystemFontOfSize(CGFloat)
+ * Aqua System font (emphasized)
+ * native declaration : :85 + */ + public static NSFont boldSystemFontOfSize(double fontSize) { + return CLASS.boldSystemFontOfSize(new CGFloat(fontSize)); + } + + public static NSFont menuFontOfSize(double fontSize) { + return CLASS.menuFontOfSize(new CGFloat(fontSize)); + } + + public static NSFont monospacedDigitSystemFontOfSize(double fontSize) { + if(Rococoa.cast(CLASS, NSObject.class).respondsToSelector( + Foundation.selector("monospacedDigitSystemFontOfSize:weight:"))) { + return CLASS.monospacedDigitSystemFontOfSize_weight(new CGFloat(fontSize), new CGFloat(NSFontWeightRegular)); + } + return systemFontOfSize(fontSize); + } + + public static double smallSystemFontSize() { + return CLASS.smallSystemFontSize().doubleValue(); + } + + public static double systemFontSize() { + return CLASS.systemFontSize().doubleValue(); + } + + public static double labelFontSize() { + return CLASS.labelFontSize().doubleValue(); + } + + public interface _Class extends ObjCClass { + /** + * Factory ********
+ * Original signature : NSFont* fontWithName(NSString*, CGFloat)
+ * native declaration : :62 + */ + NSFont fontWithName_size(String fontName, CGFloat fontSize); + + /** + * Original signature : NSFont* fontWithName(NSString*, const CGFloat*)
+ * native declaration : :63 + */ + NSFont fontWithName_matrix(String fontName, CGFloat[] fontMatrix); + + /** + * Original signature : NSFont* fontWithName(NSString*, const CGFloat*)
+ * native declaration : :63 + */ + NSFont fontWithName_matrix(String fontName, CGFloat fontMatrix); + + /** + * Instantiates an NSFont object matching fontDescriptor. If fontSize is greater than 0.0, it has precedence over NSFontSizeAttribute in fontDescriptor.
+ * Original signature : NSFont* fontWithDescriptor(NSFontDescriptor*, CGFloat)
+ * native declaration : :67 + */ + NSFont fontWithDescriptor_size(com.sun.jna.Pointer fontDescriptor, CGFloat fontSize); + + /** + * Instantiates an NSFont object matching fontDescriptor. If textTransform is non-nil, it has precedence over NSFontMatrixAttribute in fontDescriptor.
+ * Original signature : NSFont* fontWithDescriptor(NSFontDescriptor*, NSAffineTransform*)
+ * native declaration : :71 + */ + NSFont fontWithDescriptor_textTransform(com.sun.jna.Pointer fontDescriptor, com.sun.jna.Pointer textTransform); + + /** + * User font settings
+ * Original signature : NSFont* userFontOfSize(CGFloat)
+ * Aqua Application font
+ * native declaration : :77 + */ + NSFont userFontOfSize(CGFloat fontSize); + + /** + * Original signature : NSFont* userFixedPitchFontOfSize(CGFloat)
+ * Aqua fixed-pitch font
+ * native declaration : :78 + */ + NSFont userFixedPitchFontOfSize(CGFloat fontSize); + + /** + * Original signature : void setUserFont(NSFont*)
+ * set preference for Application font.
+ * native declaration : :79 + */ + void setUserFont(NSFont aFont); + + /** + * Original signature : void setUserFixedPitchFont(NSFont*)
+ * set preference for fixed-pitch.
+ * native declaration : :80 + */ + void setUserFixedPitchFont(NSFont aFont); + + /** + * UI font settings
+ * Original signature : NSFont* systemFontOfSize(CGFloat)
+ * Aqua System font
+ * native declaration : :84 + */ + NSFont systemFontOfSize(CGFloat fontSize); + + /** + * Original signature : NSFont* boldSystemFontOfSize(CGFloat)
+ * Aqua System font (emphasized)
+ * native declaration : :85 + */ + NSFont boldSystemFontOfSize(CGFloat fontSize); + + NSFont monospacedDigitSystemFontOfSize_weight(CGFloat fontSize, CGFloat fontWeight); + + /** + * Original signature : NSFont* labelFontOfSize(CGFloat)
+ * Aqua label font
+ * native declaration : :86 + */ + NSFont labelFontOfSize(CGFloat fontSize); + + /** + * Original signature : NSFont* titleBarFontOfSize(CGFloat)
+ * native declaration : :88 + */ + NSFont titleBarFontOfSize(CGFloat fontSize); + + /** + * Original signature : NSFont* menuFontOfSize(CGFloat)
+ * native declaration : :89 + */ + NSFont menuFontOfSize(CGFloat fontSize); + + /** + * Original signature : NSFont* menuBarFontOfSize(CGFloat)
+ * native declaration : :91 + */ + NSFont menuBarFontOfSize(CGFloat fontSize); + + /** + * Original signature : NSFont* messageFontOfSize(CGFloat)
+ * native declaration : :93 + */ + NSFont messageFontOfSize(CGFloat fontSize); + + /** + * Original signature : NSFont* paletteFontOfSize(CGFloat)
+ * native declaration : :94 + */ + NSFont paletteFontOfSize(CGFloat fontSize); + + /** + * Original signature : NSFont* toolTipsFontOfSize(CGFloat)
+ * native declaration : :95 + */ + NSFont toolTipsFontOfSize(CGFloat fontSize); + + /** + * Original signature : NSFont* controlContentFontOfSize(CGFloat)
+ * native declaration : :96 + */ + NSFont controlContentFontOfSize(CGFloat fontSize); + + /** + * UI font size settings
+ * Original signature : CGFloat systemFontSize()
+ * size of the standard System font.
+ * native declaration : :100 + */ + CGFloat systemFontSize(); + + /** + * Original signature : CGFloat smallSystemFontSize()
+ * size of standard small System font.
+ * native declaration : :101 + */ + CGFloat smallSystemFontSize(); + + /** + * Original signature : CGFloat labelFontSize()
+ * size of the standard Label Font.
+ * native declaration : :102 + */ + CGFloat labelFontSize(); + /** + * native declaration : :105
+ * Conversion Error : /// Original signature : CGFloat systemFontSizeForControlSize(null)
+ * + (CGFloat)systemFontSizeForControlSize:(null)controlSize; (Argument controlSize cannot be converted) + */ + /** + * Original signature : void useFont(NSString*)
+ * This is now automatically handled by Quartz.
+ * from NSFontDeprecated native declaration : :211 + */ + void useFont(NSFont fontName); + + /** + * Original signature : NSArray* preferredFontNames()
+ * NSFontCascadeListAttribute offers more powerful font substitution management
+ * from NSFontDeprecated native declaration : :217 + */ + NSArray preferredFontNames(); + + /** + * Original signature : void setPreferredFontNames(NSArray*)
+ * from NSFontDeprecated native declaration : :218 + */ + void setPreferredFontNames(String fontNameArray); + } + + /** + * Core font attribute ********
+ * Original signature : NSString* fontName()
+ * native declaration : :109 + */ + public abstract String fontName(); + + /** + * Original signature : CGFloat pointSize()
+ * native declaration : :110 + */ + public abstract CGFloat pointSize(); + + /** + * Original signature : const CGFloat* matrix()
+ * native declaration : :111 + */ + public abstract com.sun.jna.ptr.FloatByReference matrix(); + + /** + * Original signature : NSString* familyName()
+ * native declaration : :112 + */ + public abstract String familyName(); + + /** + * Original signature : NSString* displayName()
+ * native declaration : :113 + */ + public abstract String displayName(); + + /** + * Original signature : NSFontDescriptor* fontDescriptor()
+ * native declaration : :115 + */ + public abstract com.sun.jna.Pointer fontDescriptor(); + + /** + * Original signature : NSAffineTransform* textTransform()
+ * native declaration : :118 + */ + public abstract com.sun.jna.Pointer textTransform(); + + /** + * Glyph coverage ********
+ * Original signature : NSUInteger numberOfGlyphs()
+ * native declaration : :122 + */ + public abstract NSUInteger numberOfGlyphs(); + + /** + * Original signature : mostCompatibleStringEncoding()
+ * native declaration : :123 + */ + public abstract com.sun.jna.Pointer mostCompatibleStringEncoding(); + + /** + * Original signature : NSGlyph glyphWithName(NSString*)
+ * native declaration : :124 + */ + public abstract int glyphWithName(String aName); + + /** + * Original signature : NSCharacterSet* coveredCharacterSet()
+ * native declaration : :126 + */ + public abstract com.sun.jna.Pointer coveredCharacterSet(); + + /** + * These methods return scaled numbers. If the font was created with a matrix, the matrix is applied automatically; otherwise the coordinates are multiplied by size.
+ * Original signature : boundingRectForFont()
+ * native declaration : :132 + */ + public abstract com.sun.jna.Pointer boundingRectForFont(); + + /** + * Original signature : maximumAdvancement()
+ * native declaration : :133 + */ + public abstract com.sun.jna.Pointer maximumAdvancement(); + + /** + * Original signature : CGFloat ascender()
+ * native declaration : :135 + */ + public abstract CGFloat ascender(); + + /** + * Original signature : CGFloat descender()
+ * native declaration : :136 + */ + public abstract CGFloat descender(); + + /** + * Original signature : CGFloat leading()
+ * native declaration : :138 + */ + public abstract CGFloat leading(); + + /** + * Original signature : CGFloat underlinePosition()
+ * native declaration : :141 + */ + public abstract CGFloat underlinePosition(); + + /** + * Original signature : CGFloat underlineThickness()
+ * native declaration : :142 + */ + public abstract CGFloat underlineThickness(); + + /** + * Original signature : CGFloat italicAngle()
+ * native declaration : :143 + */ + public abstract CGFloat italicAngle(); + + /** + * Original signature : CGFloat capHeight()
+ * native declaration : :144 + */ + public abstract CGFloat capHeight(); + + /** + * Original signature : CGFloat xHeight()
+ * native declaration : :145 + */ + public abstract CGFloat xHeight(); + + /** + * Original signature : BOOL isFixedPitch()
+ * native declaration : :146 + */ + public abstract boolean isFixedPitch(); + + /** + * Glyph metrics ********
+ * Original signature : boundingRectForGlyph(NSGlyph)
+ * native declaration : :149 + */ + public abstract com.sun.jna.Pointer boundingRectForGlyph(int aGlyph); + + /** + * Original signature : advancementForGlyph(NSGlyph)
+ * native declaration : :150 + */ + public abstract com.sun.jna.Pointer advancementForGlyph(int ag); + /** + * native declaration : :154
+ * Conversion Error : /// Original signature : void getBoundingRects(null, const NSGlyph*, NSUInteger)
+ * - (void)getBoundingRects:(null)bounds forGlyphs:(const NSGlyph*)glyphs count:(NSUInteger)glyphCount; (Argument bounds cannot be converted) + */ + /** + * native declaration : :155
+ * Conversion Error : /// Original signature : void getAdvancements(null, const NSGlyph*, NSUInteger)
+ * - (void)getAdvancements:(null)advancements forGlyphs:(const NSGlyph*)glyphs count:(NSUInteger)glyphCount; (Argument advancements cannot be converted) + */ + /** + * native declaration : :156
+ * Conversion Error : /// Original signature : void getAdvancements(null, const void*, NSUInteger)
+ * - (void)getAdvancements:(null)advancements forPackedGlyphs:(const void*)packedGlyphs length:(NSUInteger)length; // only supports NSNativeShortGlyphPacking
+ * (Argument advancements cannot be converted) + */ + /** + * NSGraphicsContext-related ********
+ * Original signature : void set()
+ * native declaration : :160 + */ + public abstract void set(); + + /** + * Original signature : void setInContext(NSGraphicsContext*)
+ * native declaration : :162 + */ + public abstract void setInContext(com.sun.jna.Pointer graphicsContext); + + /** + * Rendering mode ********
+ * Original signature : NSFont* printerFont()
+ * native declaration : :166 + */ + public abstract NSFont printerFont(); + + /** + * Original signature : NSFont* screenFont()
+ * Same as screenFontWithRenderingMode:NSFontDefaultRenderingMode
+ * native declaration : :167 + */ + public abstract NSFont screenFont(); + + /** + * Original signature : NSFont* screenFontWithRenderingMode(NSFontRenderingMode)
+ * native declaration : :169 + */ + public abstract NSFont screenFontWithRenderingMode(int renderingMode); + + /** + * Original signature : NSFontRenderingMode renderingMode()
+ * native declaration : :170 + */ + public abstract int renderingMode(); + + /** + * Original signature : CGFloat widthOfString(NSString*)
+ * This API never returns correct value. Use NSStringDrawing API instead.
+ * from NSFontDeprecated native declaration : :212 + */ + public abstract CGFloat widthOfString(com.sun.jna.Pointer string); + + /** + * Original signature : BOOL isBaseFont()
+ * from NSFontDeprecated native declaration : :213 + */ + public abstract boolean isBaseFont(); + + /** + * Original signature : NSDictionary* afmDictionary()
+ * from NSFontDeprecated native declaration : :214 + */ + public abstract NSDictionary afmDictionary(); + + /** + * Original signature : BOOL glyphIsEncoded(NSGlyph)
+ * Can be deduced by aGlyph < [NSFont numberOfGlyphs] since only NSNativeShortGlyphPacking is supported.
+ * from NSFontDeprecated native declaration : :215 + */ + public abstract boolean glyphIsEncoded(int aGlyph); + + /** + * Original signature : CGFloat defaultLineHeightForFont()
+ * Use -[NSLayoutManager defaultLineHeightForFont:] instead.
+ * from NSFontDeprecated native declaration : :216 + */ + public abstract CGFloat defaultLineHeightForFont(); + + /** + * Original signature : NSString* encodingScheme()
+ * from NSFontDeprecated native declaration : :219 + */ + public abstract String encodingScheme(); + + /** + * Original signature : NSMultibyteGlyphPacking glyphPacking()
+ * from NSFontDeprecated native declaration : :220 + */ + public abstract int glyphPacking(); + + /** + * The context-sensitive inter-glyph spacing is now performed at the typesetting stage.
+ * Original signature : positionOfGlyph(NSGlyph, NSGlyph, BOOL*)
+ * from NSFontDeprecated native declaration : :223 + */ + public abstract com.sun.jna.Pointer positionOfGlyph_precededByGlyph_isNominal(int curGlyph, int prevGlyph, boolean nominal); + /** + * from NSFontDeprecated native declaration : :224
+ * Conversion Error : /// Original signature : NSInteger positionsForCompositeSequence(NSGlyph*, NSInteger, null)
+ * - (NSInteger)positionsForCompositeSequence:(NSGlyph*)someGlyphs numberOfGlyphs:(NSInteger)numGlyphs pointArray:(null)points; (Argument points cannot be converted) + */ + /** + * Original signature : positionOfGlyph(NSGlyph, NSGlyph, BOOL*)
+ * from NSFontDeprecated native declaration : :225 + */ + public abstract com.sun.jna.Pointer positionOfGlyph_struckOverGlyph_metricsExist(int curGlyph, int prevGlyph, boolean exist); + /** + * from NSFontDeprecated native declaration : :226
+ * Conversion Error : /// Original signature : positionOfGlyph(NSGlyph, null, BOOL*)
+ * - (null)positionOfGlyph:(NSGlyph)aGlyph struckOverRect:(null)aRect metricsExist:(BOOL*)exist; (Argument aRect cannot be converted) + */ + /** + * from NSFontDeprecated native declaration : :227
+ * Conversion Error : /// Original signature : positionOfGlyph(NSGlyph, unichar, null)
+ * - (null)positionOfGlyph:(NSGlyph)aGlyph forCharacter:(unichar)aChar struckOverRect:(null)aRect; (Argument aRect cannot be converted) + */ + /** + * from NSFontDeprecated native declaration : :228
+ * Conversion Error : /// Original signature : positionOfGlyph(NSGlyph, NSGlyphRelation, NSGlyph, null, BOOL*)
+ * - (null)positionOfGlyph:(NSGlyph)thisGlyph withRelation:(NSGlyphRelation)rel toBaseGlyph:(NSGlyph)baseGlyph totalAdvancement:(null)adv metricsExist:(BOOL*)exist; (Argument adv cannot be converted) + */ +} \ No newline at end of file diff --git a/rococoa-contrib/src/main/java/org/rococoa/contrib/appkit/NSInvocationOperation.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSInvocationOperation.java similarity index 97% rename from rococoa-contrib/src/main/java/org/rococoa/contrib/appkit/NSInvocationOperation.java rename to rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSInvocationOperation.java index 52ff589..67eb33a 100644 --- a/rococoa-contrib/src/main/java/org/rococoa/contrib/appkit/NSInvocationOperation.java +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSInvocationOperation.java @@ -17,7 +17,7 @@ * along with Rococoa. If not, see . */ -package org.rococoa.contrib.appkit; +package org.rococoa.cocoa.appkit; import org.rococoa.ID; import org.rococoa.ObjCClass; diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/NSMenu.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSMenu.java similarity index 96% rename from rococoa-contrib/src/main/java/org/rococoa/cocoa/NSMenu.java rename to rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSMenu.java index 1280d1f..3752750 100644 --- a/rococoa-contrib/src/main/java/org/rococoa/cocoa/NSMenu.java +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSMenu.java @@ -17,7 +17,7 @@ * along with Rococoa. If not, see . */ -package org.rococoa.cocoa; +package org.rococoa.cocoa.appkit; import org.rococoa.cocoa.foundation.NSObject; diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSMenuItem.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSMenuItem.java new file mode 100644 index 0000000..31a04d6 --- /dev/null +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSMenuItem.java @@ -0,0 +1,355 @@ +package org.rococoa.cocoa.appkit; + +import org.rococoa.ObjCClass; +import org.rococoa.Selector; +import org.rococoa.cocoa.foundation.NSCopying; +import org.rococoa.cocoa.foundation.NSObject; +import org.rococoa.cocoa.foundation.NSAttributedString; + + +/// native declaration : :14 +public abstract class NSMenuItem extends NSObject implements NSCopying, NSValidatedUserInterfaceItem { + private static final _Class CLASS = org.rococoa.Rococoa.createClass("NSMenuItem", _Class.class); + + public static NSMenuItem separatorItem() { + return CLASS.separatorItem(); + } + + public static NSMenuItem itemWithTitle(String title, Selector selector, String charCode) { + return CLASS.alloc().initWithTitle_action_keyEquivalent(title, selector, charCode); + } + + public interface _Class extends ObjCClass { + /** + * Original signature : void setUsesUserKeyEquivalents(BOOL)
+ * native declaration : :44 + */ + void setUsesUserKeyEquivalents(boolean flag); + + /** + * Original signature : BOOL usesUserKeyEquivalents()
+ * native declaration : :45 + */ + boolean usesUserKeyEquivalents(); + + /** + * Original signature : NSMenuItem* separatorItem()
+ * native declaration : :47 + */ + NSMenuItem separatorItem(); + + NSMenuItem alloc(); + } + + /** + * Original signature : id initWithTitle(NSString*, SEL, NSString*)
+ * native declaration : :49 + */ + public abstract NSMenuItem initWithTitle_action_keyEquivalent(String aString, org.rococoa.Selector aSelector, String charCode); + + /** + * Original signature : void setMenu(NSMenu*)
+ * native declaration : :51 + */ + public abstract void setMenu(NSMenu menu); + + /** + * Original signature : NSMenu* menu()
+ * native declaration : :52 + */ + public abstract NSMenu menu(); + + /** + * Original signature : BOOL hasSubmenu()
+ * native declaration : :56 + */ + public abstract boolean hasSubmenu(); + + /** + * Original signature : void setSubmenu(NSMenu*)
+ * native declaration : :57 + */ + public abstract void setSubmenu(NSMenu submenu); + + /** + * Original signature : NSMenu* submenu()
+ * native declaration : :58 + */ + public abstract NSMenu submenu(); + + /** + * Original signature : void setTitle(NSString*)
+ * native declaration : :60 + */ + public abstract void setTitle(String aString); + + /** + * Original signature : NSString* title()
+ * native declaration : :61 + */ + public abstract String title(); + + /** + * Original signature : void setAttributedTitle(NSAttributedString*)
+ * native declaration : :63 + */ + public abstract void setAttributedTitle(NSAttributedString string); + + /** + * Original signature : NSAttributedString* attributedTitle()
+ * native declaration : :64 + */ + public abstract NSAttributedString attributedTitle(); + + /** + * Original signature : BOOL isSeparatorItem()
+ * native declaration : :67 + */ + public abstract boolean isSeparatorItem(); + + /** + * Original signature : void setKeyEquivalent(NSString*)
+ * native declaration : :69 + */ + public abstract void setKeyEquivalent(String aKeyEquivalent); + + /** + * Original signature : NSString* keyEquivalent()
+ * native declaration : :70 + */ + public abstract String keyEquivalent(); + + /** + * Original signature : void setKeyEquivalentModifierMask(NSUInteger)
+ * native declaration : :71 + */ + public abstract void setKeyEquivalentModifierMask(int mask); + + /** + * Original signature : NSUInteger keyEquivalentModifierMask()
+ * native declaration : :72 + */ + public abstract int keyEquivalentModifierMask(); + + /** + * Original signature : NSString* userKeyEquivalent()
+ * native declaration : :74 + */ + public abstract String userKeyEquivalent(); + + /** + * Original signature : void setMnemonicLocation(NSUInteger)
+ * native declaration : :76 + */ + public abstract void setMnemonicLocation(int location); + + /** + * Original signature : NSUInteger mnemonicLocation()
+ * native declaration : :77 + */ + public abstract int mnemonicLocation(); + + /** + * Original signature : NSString* mnemonic()
+ * native declaration : :78 + */ + public abstract String mnemonic(); + + /** + * Original signature : void setTitleWithMnemonic(NSString*)
+ * native declaration : :79 + */ + public abstract void setTitleWithMnemonic(String stringWithAmpersand); + + /** + * Original signature : void setImage(NSImage*)
+ * native declaration : :81 + */ + public abstract void setImage(NSImage menuImage); + + /** + * Original signature : NSImage* image()
+ * native declaration : :82 + */ + public abstract NSImage image(); + + /** + * Original signature : void setState(NSInteger)
+ * native declaration : :84 + */ + public abstract void setState(int state); + + /** + * Original signature : NSInteger state()
+ * native declaration : :85 + */ + public abstract int state(); + + /** + * Original signature : void setOnStateImage(NSImage*)
+ * checkmark by default
+ * native declaration : :86 + */ + public abstract void setOnStateImage(NSImage image); + + /** + * Original signature : NSImage* onStateImage()
+ * native declaration : :87 + */ + public abstract NSImage onStateImage(); + + /** + * Original signature : void setOffStateImage(NSImage*)
+ * none by default
+ * native declaration : :88 + */ + public abstract void setOffStateImage(NSImage image); + + /** + * Original signature : NSImage* offStateImage()
+ * native declaration : :89 + */ + public abstract NSImage offStateImage(); + + /** + * Original signature : void setMixedStateImage(NSImage*)
+ * horizontal line by default?
+ * native declaration : :90 + */ + public abstract void setMixedStateImage(NSImage image); + + /** + * Original signature : NSImage* mixedStateImage()
+ * native declaration : :91 + */ + public abstract NSImage mixedStateImage(); + + /** + * Original signature : void setEnabled(BOOL)
+ * native declaration : :93 + */ + public abstract void setEnabled(boolean flag); + + /** + * Original signature : BOOL isEnabled()
+ * native declaration : :94 + */ + public abstract boolean isEnabled(); + + /** + * Original signature : void setAlternate(BOOL)
+ * native declaration : :98 + */ + public abstract void setAlternate(boolean isAlternate); + + /** + * Original signature : BOOL isAlternate()
+ * native declaration : :99 + */ + public abstract boolean isAlternate(); + + /** + * Original signature : void setIndentationLevel(NSInteger)
+ * native declaration : :101 + */ + public abstract void setIndentationLevel(int indentationLevel); + + /** + * Original signature : NSInteger indentationLevel()
+ * native declaration : :102 + */ + public abstract int indentationLevel(); + + /** + * Original signature : void setTarget(id)
+ * native declaration : :105 + */ + public abstract void setTarget(org.rococoa.ID anObject); + + /** + * Original signature : id target()
+ * native declaration : :106 + */ + public abstract org.rococoa.ID target(); + + /** + * Original signature : void setAction(SEL)
+ * native declaration : :107 + */ + public abstract void setAction(org.rococoa.Selector aSelector); + + /** + * Original signature : void setTag(NSInteger)
+ * native declaration : :110 + */ + public abstract void setTag(int anInt); + + /** + * Original signature : void setRepresentedObject(id)
+ * native declaration : :113 + */ + public abstract void setRepresentedObject(String anObject); + + /** + * Original signature : id representedObject()
+ * native declaration : :114 + */ + public abstract String representedObject(); + + /** + * Set (and get) the view for a menu item. By default, a menu item has a nil view.
+ * A menu item with a view does not draw its title, state, font, or other standard drawing attributes, and assigns drawing responsibility entirely to the view. Keyboard equivalents and type-select continue to use the key equivalent and title as normal.
+ * A menu item with a view sizes itself according to the view's frame, and the width of the other menu items. The menu item will always be at least as wide as its view, but it may be wider. If you want your view to auto-expand to fill the menu item, then make sure that its autoresizing mask has NSViewWidthSizable set; in that case, the view's width at the time setView: is called will be treated as the minimum width for the view. A menu will resize itself as its containing views change frame size. Changes to the view's frame during tracking are reflected immediately in the menu.
+ * A view in a menu item will receive mouse and keyboard events normally. During non-sticky menu tracking (manipulating menus with the mouse button held down), a view in a menu item will receive mouseDragged: events.
+ * Animation is possible via the usual mechanism (set a timer to call setNeedsDisplay: or display), but because menu tracking occurs in the NSEventTrackingRunLoopMode, you must add the timer to the run loop in that mode.
+ * When the menu is opened, the view is added to a window; when the menu is closed the view is removed from the window. Override viewDidMoveToWindow in your view for a convenient place to start/stop animations, reset tracking rects, etc., but do not attempt to move or otherwise modify the window.
+ * When a menu item is copied via NSCopying, any attached view is copied via archiving/unarchiving. Menu item views are not supported in the Dock menu.
+ * Original signature : void setView(NSView*)
+ * native declaration : :124 + */ + public abstract void setView(NSView view); + + /** + * Original signature : NSView* view()
+ * native declaration : :125 + */ + public abstract NSView view(); + + /** + * Indicates whether the menu item should be drawn highlighted or not.
+ * Original signature : BOOL isHighlighted()
+ * native declaration : :128 + */ + public abstract boolean isHighlighted(); + + /** + * Set (and get) the visibility of a menu item. Hidden menu items (or items with a hidden superitem) do not appear in a menu and do not participate in command key matching. isHiddenOrHasHiddenAncestor returns YES if the item is hidden or any of its superitems are hidden.
+ * Original signature : void setHidden(BOOL)
+ * native declaration : :131 + */ + public abstract void setHidden(boolean hidden); + + /** + * Original signature : BOOL isHidden()
+ * native declaration : :132 + */ + public abstract boolean isHidden(); + + /** + * Original signature : BOOL isHiddenOrHasHiddenAncestor()
+ * native declaration : :133 + */ + public abstract boolean isHiddenOrHasHiddenAncestor(); + + /** + * Original signature : void setToolTip(NSString*)
+ * native declaration : :138 + */ + public abstract void setToolTip(String toolTip); + + /** + * Original signature : NSString* toolTip()
+ * native declaration : :139 + */ + public abstract String toolTip(); +} \ No newline at end of file diff --git a/rococoa-contrib/src/main/java/org/rococoa/contrib/appkit/NSOperation.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSOperation.java similarity index 97% rename from rococoa-contrib/src/main/java/org/rococoa/contrib/appkit/NSOperation.java rename to rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSOperation.java index 5bc6b02..d2fdbe5 100644 --- a/rococoa-contrib/src/main/java/org/rococoa/contrib/appkit/NSOperation.java +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSOperation.java @@ -17,7 +17,7 @@ * along with Rococoa. If not, see . */ -package org.rococoa.contrib.appkit; +package org.rococoa.cocoa.appkit; import org.rococoa.ObjCClass; import org.rococoa.Rococoa; diff --git a/rococoa-contrib/src/main/java/org/rococoa/contrib/appkit/NSOperationQueue.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSOperationQueue.java similarity index 95% rename from rococoa-contrib/src/main/java/org/rococoa/contrib/appkit/NSOperationQueue.java rename to rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSOperationQueue.java index cf3d3c1..871f03d 100644 --- a/rococoa-contrib/src/main/java/org/rococoa/contrib/appkit/NSOperationQueue.java +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSOperationQueue.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU Lesser General Public License * along with Rococoa. If not, see . */ -package org.rococoa.contrib.appkit; +package org.rococoa.cocoa.appkit; import org.rococoa.ObjCClass; import org.rococoa.Rococoa; @@ -29,7 +29,7 @@ * */ public abstract class NSOperationQueue extends NSObject { - public static final _Class CLASS = Rococoa.createClass(NSOperationQueue.class.getSimpleName(), _Class.class); //$NON-NLS-1$ + public static final _Class CLASS = Rococoa.createClass(NSOperationQueue.class.getSimpleName(), _Class.class); public static final int NSOperationQueueDefaultMaxConcurrentOperationCount = -1; public interface _Class extends ObjCClass { public NSOperationQueue alloc(); diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSPanel.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSPanel.java new file mode 100644 index 0000000..2f4298b --- /dev/null +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSPanel.java @@ -0,0 +1,73 @@ +package org.rococoa.cocoa.appkit; + +/* + * Copyright (c) 2002-2009 David Kocher. All rights reserved. + * + * http://cyberduck.ch/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * Bug fixes, suggestions and comments should be sent to: + * dkocher@cyberduck.ch + */ + +/// native declaration : :83 +public abstract class NSPanel extends NSWindow { + + /** + * Original signature : BOOL isFloatingPanel()
+ * native declaration : :88 + */ + public abstract boolean isFloatingPanel(); + + /** + * Original signature : void setFloatingPanel(BOOL)
+ * native declaration : :89 + */ + public abstract void setFloatingPanel(boolean flag); + + /** + * Original signature : BOOL becomesKeyOnlyIfNeeded()
+ * native declaration : :90 + */ + public abstract boolean becomesKeyOnlyIfNeeded(); + + /** + * Original signature : void setBecomesKeyOnlyIfNeeded(BOOL)
+ * native declaration : :91 + */ + public abstract void setBecomesKeyOnlyIfNeeded(boolean flag); + + /** + * Original signature : void setWorksWhenModal(BOOL)
+ * native declaration : :93 + */ + public abstract void setWorksWhenModal(boolean flag); + + /// native declaration : :61 + public static final int NSOKButton = 1; + /// native declaration : :62 + public static final int NSCancelButton = 0; + /// native declaration : :67 + public static final int NSUtilityWindowMask = 1 << 4; + /// native declaration : :68 + public static final int NSDocModalWindowMask = 1 << 6; + /** + * specify a panel that does not activate owning application
+ * native declaration : :73 + */ + public static final int NSNonactivatingPanelMask = 1 << 7; + /** + * specify a heads up display panel
+ * native declaration : :79 + */ + public static final int NSHUDWindowMask = 1 << 13; +} \ No newline at end of file diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSResponder.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSResponder.java new file mode 100644 index 0000000..e13299b --- /dev/null +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSResponder.java @@ -0,0 +1,681 @@ +package org.rococoa.cocoa.appkit; + +import org.rococoa.ID; +import org.rococoa.cocoa.foundation.NSError; +import org.rococoa.cocoa.foundation.NSObject; + +/// native declaration : :11 +public abstract class NSResponder extends NSObject { + + /** + * Original signature : NSResponder* nextResponder()
+ * native declaration : :17 + */ + public abstract NSResponder NSResponder_nextResponder(); + + /** + * Original signature : void setNextResponder(NSResponder*)
+ * native declaration : :18 + */ + public abstract void setNextResponder(NSResponder aResponder); + /** + * native declaration : :19
+ * Conversion Error : /// Original signature : BOOL tryToPerform(null, id)
+ * - (BOOL)tryToPerform:(null)anAction with:(id)anObject; (Argument anAction cannot be converted) + */ + /** + * Original signature : BOOL performKeyEquivalent(NSEvent*)
+ * native declaration : :20 + */ + public abstract boolean performKeyEquivalent(NSEvent event); + + /** + * Original signature : id validRequestorForSendType(NSString*, NSString*)
+ * native declaration : :21 + */ + public abstract org.rococoa.ID validRequestorForSendType_returnType(String sendType, String returnType); + + /** + * Original signature : void mouseDown(NSEvent*)
+ * native declaration : :22 + */ + public abstract void mouseDown(NSEvent event); + + /** + * Original signature : void rightMouseDown(NSEvent*)
+ * native declaration : :23 + */ + public abstract void rightMouseDown(NSEvent event); + + /** + * Original signature : void otherMouseDown(NSEvent*)
+ * native declaration : :24 + */ + public abstract void otherMouseDown(NSEvent event); + + /** + * Original signature : void mouseUp(NSEvent*)
+ * native declaration : :25 + */ + public abstract void mouseUp(NSEvent event); + + /** + * Original signature : void rightMouseUp(NSEvent*)
+ * native declaration : :26 + */ + public abstract void rightMouseUp(NSEvent event); + + /** + * Original signature : void otherMouseUp(NSEvent*)
+ * native declaration : :27 + */ + public abstract void otherMouseUp(NSEvent event); + + /** + * Original signature : void mouseMoved(NSEvent*)
+ * native declaration : :28 + */ + public abstract void mouseMoved(NSEvent event); + + /** + * Original signature : void mouseDragged(NSEvent*)
+ * native declaration : :29 + */ + public abstract void mouseDragged(NSEvent event); + + /** + * Original signature : void scrollWheel(NSEvent*)
+ * native declaration : :30 + */ + public abstract void scrollWheel(NSEvent event); + + /** + * Original signature : void rightMouseDragged(NSEvent*)
+ * native declaration : :31 + */ + public abstract void rightMouseDragged(NSEvent event); + + /** + * Original signature : void otherMouseDragged(NSEvent*)
+ * native declaration : :32 + */ + public abstract void otherMouseDragged(NSEvent event); + + /** + * Original signature : void mouseEntered(NSEvent*)
+ * native declaration : :33 + */ + public abstract void mouseEntered(NSEvent event); + + /** + * Original signature : void mouseExited(NSEvent*)
+ * native declaration : :34 + */ + public abstract void mouseExited(NSEvent event); + + /** + * Original signature : void keyDown(NSEvent*)
+ * native declaration : :35 + */ + public abstract void keyDown(NSEvent event); + + /** + * Original signature : void keyUp(NSEvent*)
+ * native declaration : :36 + */ + public abstract void keyUp(NSEvent event); + + /** + * Original signature : void flagsChanged(NSEvent*)
+ * native declaration : :37 + */ + public abstract void flagsChanged(NSEvent event); + + /** + * Original signature : void tabletPoint(NSEvent*)
+ * native declaration : :39 + */ + public abstract void tabletPoint(NSEvent event); + + /** + * Original signature : void tabletProximity(NSEvent*)
+ * native declaration : :40 + */ + public abstract void tabletProximity(NSEvent event); + + /** + * Original signature : void cursorUpdate(NSEvent*)
+ * native declaration : :43 + */ + public abstract void cursorUpdate(NSEvent event); + /** + * native declaration : :45
+ * Conversion Error : /// Original signature : void noResponderFor(null)
+ * - (void)noResponderFor:(null)eventSelector; (Argument eventSelector cannot be converted) + */ + /** + * Original signature : BOOL acceptsFirstResponder()
+ * native declaration : :46 + */ + public abstract boolean acceptsFirstResponder(); + + /** + * Original signature : BOOL becomeFirstResponder()
+ * native declaration : :47 + */ + public abstract boolean becomeFirstResponder(); + + /** + * Original signature : BOOL resignFirstResponder()
+ * native declaration : :48 + */ + public abstract boolean resignFirstResponder(); + + /** + * Original signature : void interpretKeyEvents(NSArray*)
+ * native declaration : :50 + */ + public abstract void interpretKeyEvents(NSEvent eventArray); + + /** + * Original signature : void flushBufferedKeyEvents()
+ * native declaration : :51 + */ + public abstract void flushBufferedKeyEvents(); + + /** + * Original signature : void setMenu(NSMenu*)
+ * native declaration : :53 + */ + public abstract void setMenu(NSMenu menu); + + /** + * Original signature : NSMenu* menu()
+ * native declaration : :54 + */ + public abstract NSMenu menu(); + + /** + * Original signature : void showContextHelp(id)
+ * native declaration : :56 + */ + public abstract void showContextHelp(final ID sender); + + /** + * Original signature : void helpRequested(NSEvent*)
+ * native declaration : :58 + */ + public abstract void helpRequested(NSEvent eventPtr); + + /** + * Original signature : BOOL shouldBeTreatedAsInkEvent(NSEvent*)
+ * native declaration : :61 + */ + public abstract boolean shouldBeTreatedAsInkEvent(NSEvent event); + + /** + * Original signature : BOOL performMnemonic(NSString*)
+ * from NSKeyboardUI native declaration : :66 + */ + public abstract boolean performMnemonic(String theString); + + /** + * Original signature : void insertText(id)
+ * from NSStandardKeyBindingMethods native declaration : :75 + */ + public abstract void insertText(NSObject insertString); + /** + * from NSStandardKeyBindingMethods native declaration : :78
+ * Conversion Error : /// Original signature : void doCommandBySelector(null)
+ * - (void)doCommandBySelector:(null)aSelector; (Argument aSelector cannot be converted) + */ + /** + * Original signature : void moveForward(id)
+ * from NSStandardKeyBindingMethods native declaration : :85 + */ + public abstract void moveForward(final ID sender); + + /** + * Original signature : void moveRight(id)
+ * from NSStandardKeyBindingMethods native declaration : :86 + */ + public abstract void moveRight(final ID sender); + + /** + * Original signature : void moveBackward(id)
+ * from NSStandardKeyBindingMethods native declaration : :87 + */ + public abstract void moveBackward(final ID sender); + + /** + * Original signature : void moveLeft(id)
+ * from NSStandardKeyBindingMethods native declaration : :88 + */ + public abstract void moveLeft(final ID sender); + + /** + * Original signature : void moveUp(id)
+ * from NSStandardKeyBindingMethods native declaration : :89 + */ + public abstract void moveUp(final ID sender); + + /** + * Original signature : void moveDown(id)
+ * from NSStandardKeyBindingMethods native declaration : :90 + */ + public abstract void moveDown(final ID sender); + + /** + * Original signature : void moveWordForward(id)
+ * from NSStandardKeyBindingMethods native declaration : :91 + */ + public abstract void moveWordForward(final ID sender); + + /** + * Original signature : void moveWordBackward(id)
+ * from NSStandardKeyBindingMethods native declaration : :92 + */ + public abstract void moveWordBackward(final ID sender); + + /** + * Original signature : void moveToBeginningOfLine(id)
+ * from NSStandardKeyBindingMethods native declaration : :93 + */ + public abstract void moveToBeginningOfLine(final ID sender); + + /** + * Original signature : void moveToEndOfLine(id)
+ * from NSStandardKeyBindingMethods native declaration : :94 + */ + public abstract void moveToEndOfLine(final ID sender); + + /** + * Original signature : void moveToBeginningOfParagraph(id)
+ * from NSStandardKeyBindingMethods native declaration : :95 + */ + public abstract void moveToBeginningOfParagraph(final ID sender); + + /** + * Original signature : void moveToEndOfParagraph(id)
+ * from NSStandardKeyBindingMethods native declaration : :96 + */ + public abstract void moveToEndOfParagraph(final ID sender); + + /** + * Original signature : void moveToEndOfDocument(id)
+ * from NSStandardKeyBindingMethods native declaration : :97 + */ + public abstract void moveToEndOfDocument(final ID sender); + + /** + * Original signature : void moveToBeginningOfDocument(id)
+ * from NSStandardKeyBindingMethods native declaration : :98 + */ + public abstract void moveToBeginningOfDocument(final ID sender); + + /** + * Original signature : void pageDown(id)
+ * from NSStandardKeyBindingMethods native declaration : :99 + */ + public abstract void pageDown(final ID sender); + + /** + * Original signature : void pageUp(id)
+ * from NSStandardKeyBindingMethods native declaration : :100 + */ + public abstract void pageUp(final ID sender); + + /** + * Original signature : void centerSelectionInVisibleArea(id)
+ * from NSStandardKeyBindingMethods native declaration : :101 + */ + public abstract void centerSelectionInVisibleArea(final ID sender); + + /** + * Original signature : void moveBackwardAndModifySelection(id)
+ * from NSStandardKeyBindingMethods native declaration : :103 + */ + public abstract void moveBackwardAndModifySelection(final ID sender); + + /** + * Original signature : void moveForwardAndModifySelection(id)
+ * from NSStandardKeyBindingMethods native declaration : :104 + */ + public abstract void moveForwardAndModifySelection(final ID sender); + + /** + * Original signature : void moveWordForwardAndModifySelection(id)
+ * from NSStandardKeyBindingMethods native declaration : :105 + */ + public abstract void moveWordForwardAndModifySelection(final ID sender); + + /** + * Original signature : void moveWordBackwardAndModifySelection(id)
+ * from NSStandardKeyBindingMethods native declaration : :106 + */ + public abstract void moveWordBackwardAndModifySelection(final ID sender); + + /** + * Original signature : void moveUpAndModifySelection(id)
+ * from NSStandardKeyBindingMethods native declaration : :107 + */ + public abstract void moveUpAndModifySelection(final ID sender); + + /** + * Original signature : void moveDownAndModifySelection(id)
+ * from NSStandardKeyBindingMethods native declaration : :108 + */ + public abstract void moveDownAndModifySelection(final ID sender); + + /** + * Original signature : void moveWordRight(id)
+ * from NSStandardKeyBindingMethods native declaration : :111 + */ + public abstract void moveWordRight(final ID sender); + + /** + * Original signature : void moveWordLeft(id)
+ * from NSStandardKeyBindingMethods native declaration : :112 + */ + public abstract void moveWordLeft(final ID sender); + + /** + * Original signature : void moveRightAndModifySelection(id)
+ * from NSStandardKeyBindingMethods native declaration : :113 + */ + public abstract void moveRightAndModifySelection(final ID sender); + + /** + * Original signature : void moveLeftAndModifySelection(id)
+ * from NSStandardKeyBindingMethods native declaration : :114 + */ + public abstract void moveLeftAndModifySelection(final ID sender); + + /** + * Original signature : void moveWordRightAndModifySelection(id)
+ * from NSStandardKeyBindingMethods native declaration : :115 + */ + public abstract void moveWordRightAndModifySelection(final ID sender); + + /** + * Original signature : void moveWordLeftAndModifySelection(id)
+ * from NSStandardKeyBindingMethods native declaration : :116 + */ + public abstract void moveWordLeftAndModifySelection(final ID sender); + + /** + * Original signature : void scrollPageUp(id)
+ * from NSStandardKeyBindingMethods native declaration : :119 + */ + public abstract void scrollPageUp(final ID sender); + + /** + * Original signature : void scrollPageDown(id)
+ * from NSStandardKeyBindingMethods native declaration : :120 + */ + public abstract void scrollPageDown(final ID sender); + + /** + * Original signature : void scrollLineUp(id)
+ * from NSStandardKeyBindingMethods native declaration : :121 + */ + public abstract void scrollLineUp(final ID sender); + + /** + * Original signature : void scrollLineDown(id)
+ * from NSStandardKeyBindingMethods native declaration : :122 + */ + public abstract void scrollLineDown(final ID sender); + + /** + * Original signature : void transpose(id)
+ * from NSStandardKeyBindingMethods native declaration : :126 + */ + public abstract void transpose(final ID sender); + + /** + * Original signature : void transposeWords(id)
+ * from NSStandardKeyBindingMethods native declaration : :127 + */ + public abstract void transposeWords(final ID sender); + + /** + * Original signature : void selectAll(id)
+ * from NSStandardKeyBindingMethods native declaration : :131 + */ + public abstract void selectAll(final ID sender); + + /** + * Original signature : void selectParagraph(id)
+ * from NSStandardKeyBindingMethods native declaration : :132 + */ + public abstract void selectParagraph(final ID sender); + + /** + * Original signature : void selectLine(id)
+ * from NSStandardKeyBindingMethods native declaration : :133 + */ + public abstract void selectLine(final ID sender); + + /** + * Original signature : void selectWord(id)
+ * from NSStandardKeyBindingMethods native declaration : :134 + */ + public abstract void selectWord(final ID sender); + + /** + * Original signature : void indent(id)
+ * from NSStandardKeyBindingMethods native declaration : :138 + */ + public abstract void indent(final ID sender); + + /** + * Original signature : void insertTab(id)
+ * from NSStandardKeyBindingMethods native declaration : :139 + */ + public abstract void insertTab(final ID sender); + + /** + * Original signature : void insertBacktab(id)
+ * from NSStandardKeyBindingMethods native declaration : :140 + */ + public abstract void insertBacktab(final ID sender); + + /** + * Original signature : void insertNewline(id)
+ * from NSStandardKeyBindingMethods native declaration : :141 + */ + public abstract void insertNewline(final ID sender); + + /** + * Original signature : void insertParagraphSeparator(id)
+ * from NSStandardKeyBindingMethods native declaration : :142 + */ + public abstract void insertParagraphSeparator(final ID sender); + + /** + * Original signature : void insertNewlineIgnoringFieldEditor(id)
+ * from NSStandardKeyBindingMethods native declaration : :143 + */ + public abstract void insertNewlineIgnoringFieldEditor(final ID sender); + + /** + * Original signature : void insertTabIgnoringFieldEditor(id)
+ * from NSStandardKeyBindingMethods native declaration : :144 + */ + public abstract void insertTabIgnoringFieldEditor(final ID sender); + + /** + * Original signature : void insertLineBreak(id)
+ * from NSStandardKeyBindingMethods native declaration : :146 + */ + public abstract void insertLineBreak(final ID sender); + + /** + * Original signature : void insertContainerBreak(id)
+ * from NSStandardKeyBindingMethods native declaration : :147 + */ + public abstract void insertContainerBreak(final ID sender); + + /** + * Original signature : void changeCaseOfLetter(id)
+ * from NSStandardKeyBindingMethods native declaration : :152 + */ + public abstract void changeCaseOfLetter(final ID sender); + + /** + * Original signature : void uppercaseWord(id)
+ * from NSStandardKeyBindingMethods native declaration : :153 + */ + public abstract void uppercaseWord(final ID sender); + + /** + * Original signature : void lowercaseWord(id)
+ * from NSStandardKeyBindingMethods native declaration : :154 + */ + public abstract void lowercaseWord(final ID sender); + + /** + * Original signature : void capitalizeWord(id)
+ * from NSStandardKeyBindingMethods native declaration : :155 + */ + public abstract void capitalizeWord(final ID sender); + + /** + * Original signature : void deleteForward(id)
+ * from NSStandardKeyBindingMethods native declaration : :159 + */ + public abstract void deleteForward(final ID sender); + + /** + * Original signature : void deleteBackward(id)
+ * from NSStandardKeyBindingMethods native declaration : :160 + */ + public abstract void deleteBackward(final ID sender); + + /** + * Original signature : void deleteBackwardByDecomposingPreviousCharacter(id)
+ * from NSStandardKeyBindingMethods native declaration : :162 + */ + public abstract void deleteBackwardByDecomposingPreviousCharacter(final ID sender); + + /** + * Original signature : void deleteWordForward(id)
+ * from NSStandardKeyBindingMethods native declaration : :164 + */ + public abstract void deleteWordForward(final ID sender); + + /** + * Original signature : void deleteWordBackward(id)
+ * from NSStandardKeyBindingMethods native declaration : :165 + */ + public abstract void deleteWordBackward(final ID sender); + + /** + * Original signature : void deleteToBeginningOfLine(id)
+ * from NSStandardKeyBindingMethods native declaration : :166 + */ + public abstract void deleteToBeginningOfLine(final ID sender); + + /** + * Original signature : void deleteToEndOfLine(id)
+ * from NSStandardKeyBindingMethods native declaration : :167 + */ + public abstract void deleteToEndOfLine(final ID sender); + + /** + * Original signature : void deleteToBeginningOfParagraph(id)
+ * from NSStandardKeyBindingMethods native declaration : :168 + */ + public abstract void deleteToBeginningOfParagraph(final ID sender); + + /** + * Original signature : void deleteToEndOfParagraph(id)
+ * from NSStandardKeyBindingMethods native declaration : :169 + */ + public abstract void deleteToEndOfParagraph(final ID sender); + + /** + * Original signature : void yank(id)
+ * from NSStandardKeyBindingMethods native declaration : :171 + */ + public abstract void yank(final ID sender); + + /** + * Original signature : void complete(id)
+ * from NSStandardKeyBindingMethods native declaration : :175 + */ + public abstract void complete(final ID sender); + + /** + * Original signature : void setMark(id)
+ * from NSStandardKeyBindingMethods native declaration : :179 + */ + public abstract void setMark(final ID sender); + + /** + * Original signature : void deleteToMark(id)
+ * from NSStandardKeyBindingMethods native declaration : :180 + */ + public abstract void deleteToMark(final ID sender); + + /** + * Original signature : void selectToMark(id)
+ * from NSStandardKeyBindingMethods native declaration : :181 + */ + public abstract void selectToMark(final ID sender); + + /** + * Original signature : void swapWithMark(id)
+ * from NSStandardKeyBindingMethods native declaration : :182 + */ + public abstract void swapWithMark(final ID sender); + + /** + * Original signature : void cancelOperation(id)
+ * from NSStandardKeyBindingMethods native declaration : :187 + */ + public abstract void cancelOperation(final ID sender); + + /** + * Original signature : NSUndoManager* undoManager()
+ * from NSUndoSupport native declaration : :192 + */ + public abstract com.sun.jna.Pointer undoManager(); + /** + * from NSErrorPresentation native declaration : :222
+ * Conversion Error : /**
+ * * Present an error alert to the user, as a document-modal panel. When the user has dismissed the alert and any recovery possible for the error and chosen by the user has been attempted, send the selected message to the specified delegate. The method selected by didPresentSelector must have the same signature as:
+ * * - (void)didPresentErrorWithRecovery:(BOOL)didRecover contextInfo:(void *)contextInfo;
+ * * The default implementation of this method always invokes [self willPresentError:error] to give subclassers an opportunity to customize error presentation. It then forwards the message, passing the customized error, to the next responder or, if there is no next responder, NSApp. NSApplication's override of this method invokes [[NSAlert alertWithError:theErrorToPresent] beginSheetModalForWindow:window modalDelegate:self didEndSelector:selectorForAPrivateMethod contextInfo:privateContextInfo]. When the user has dismissed the alert, the error's recovery attempter is sent an -attemptRecoveryFromError:optionIndex:delegate:didRecoverSelector:contextInfo: message, if the error had recovery options and a recovery delegate.
+ * * Errors for which ([[error domain] isEqualToString:NSCocoaErrorDomain] && [error code]==NSUserCancelledError) are a special case, because they do not actually represent errors and should not be presented as such to the user. NSApplication's override of this method does not present an alert to the user for these kinds of errors. Instead it merely invokes the delegate specifying didRecover==NO.
+ * * Between the responder chain in a typical application and various overrides of this method in AppKit classes, objects are given the opportunity to present errors in orders like these:
+ * * For windows owned by documents:
+ * * view -> superviews -> window -> window controller -> document -> document controller -> application
+ * * For windows that have window controllers but aren't associated with documents:
+ * * view -> superviews -> window -> window controller -> application
+ * * For windows that have no window controller at all:
+ * * view -> superviews -> window -> application
+ * * You can invoke this method to present error alert sheets. For example, Cocoa's own -[NSDocument saveToURL:ofType:forSaveOperation:delegate:didSaveSelector:contextInfo:] invokes this method when it's just invoked -saveToURL:ofType:forSaveOperation:error: and that method has returned NO.
+ * * You probably shouldn't override this method, because you have no way of reliably predicting whether this method vs. -presentError will be invoked for any particular error. You should instead override the -willPresentError: method described below.
+ * * Original signature : void presentError(NSError*, NSWindow*, id, null, void*)
+ * * /
+ * - (void)presentError:(NSError*)error modalForWindow:(NSWindow*)window delegate:(id)delegate didPresentSelector:(null)didPresentSelector contextInfo:(void*)contextInfo; (Argument didPresentSelector cannot be converted) + */ + /** + * Present an error alert to the user, as an application-modal panel, and return YES if error recovery was done, NO otherwise. This method behaves much like the previous one except it does not return until the user has dismissed the alert and, if the error had recovery options and a recovery delegate, the error's recovery delegate has been sent an -attemptRecoveryFromError:optionIndex: message.
+ * You can invoke this method to present error alert dialog boxes. For example, Cocoa's own [NSDocumentController openDocument:] invokes this method when it's just invoked -openDocumentWithContentsOfURL:display:error: and that method has returned nil.
+ * You probably shouldn't override this method, because you have no way of reliably predicting whether this method vs. -presentError:modalForWindow:delegate:didPresentSelector:contextInfo: will be invoked for any particular error. You should instead override the -willPresentError: method described below.
+ * Original signature : BOOL presentError(NSError*)
+ * from NSErrorPresentation native declaration : :230 + */ + public abstract boolean presentError(NSError error); + + /** + * Given that the receiver is about to present an error (perhaps by just forwarding it to the next responder), return the error that should actually be presented. The default implementation of this method merely returns the passed-in error.
+ * You can override this method to customize the presentation of errors by examining the passed-in error and if, for example, its localized description or recovery information is unsuitably generic, returning a more specific one. When you override this method always check the NSError's domain and code to discriminate between errors whose presentation you want to customize and those you don't. For those you don't just return [super willPresentError:error]. Don't make decisions based on the NSError's localized description, recovery suggestion, or recovery options because it's usually not a good idea to try to parse localized text.
+ * Original signature : NSError* willPresentError(NSError*)
+ * from NSErrorPresentation native declaration : :236 + */ + public abstract NSError willPresentError(NSError error); +} \ No newline at end of file diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSScreen.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSScreen.java new file mode 100644 index 0000000..4146910 --- /dev/null +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSScreen.java @@ -0,0 +1,97 @@ +package org.rococoa.cocoa.appkit; + +import org.rococoa.ObjCClass; +import org.rococoa.cocoa.CGFloat; +import org.rococoa.cocoa.foundation.NSArray; +import org.rococoa.cocoa.foundation.NSDictionary; +import org.rococoa.cocoa.foundation.NSObject; +import org.rococoa.cocoa.foundation.NSRect; + +/** + * This file was autogenerated by JNAerator,
+ * a tool written by Olivier Chafik that uses a few opensource projects..
+ * For help, please visit NativeLibs4Java, Rococoa, or JNA. + + */ +public abstract class NSScreen extends NSObject { + private static final _Class CLASS = org.rococoa.Rococoa.createClass("NSScreen", _Class.class); + + public interface _Class extends ObjCClass { + /** + * Original signature : +(NSArray*)screens
+ * All screens; first one is "zero" screen
+ * native declaration : /System/Library/Frameworks/AppKit.framework/Headers/NSGraphics.h:235 + */ + NSArray screens(); + + /** + * Original signature : +(NSScreen*)mainScreen
+ * Screen with key window
+ * native declaration : /System/Library/Frameworks/AppKit.framework/Headers/NSGraphics.h:236 + */ + NSScreen mainScreen(); + + /** + * Original signature : +(NSScreen*)deepestScreen
+ * native declaration : /System/Library/Frameworks/AppKit.framework/Headers/NSGraphics.h:237 + */ + NSScreen deepestScreen(); + } + + /** + * Original signature : +(NSArray*)screens
+ * All screens; first one is "zero" screen
+ * native declaration : /System/Library/Frameworks/AppKit.framework/Headers/NSGraphics.h:235 + */ + public static NSArray screens() { + return CLASS.screens(); + } + + /** + * Original signature : +(NSScreen*)mainScreen
+ * Screen with key window
+ * native declaration : /System/Library/Frameworks/AppKit.framework/Headers/NSGraphics.h:236 + */ + public static NSScreen mainScreen() { + return CLASS.mainScreen(); + } + + /** + * Original signature : +(NSScreen*)deepestScreen
+ * native declaration : /System/Library/Frameworks/AppKit.framework/Headers/NSGraphics.h:237 + */ + public static NSScreen deepestScreen() { + return CLASS.deepestScreen(); + } + + /** + * Original signature : -(NSWindowDepth)depth
+ * native declaration : /System/Library/Frameworks/AppKit.framework/Headers/NSGraphics.h:239 + */ + public abstract int depth(); + + /** + * Original signature : -(NSRect)frame
+ * native declaration : /System/Library/Frameworks/AppKit.framework/Headers/NSGraphics.h:240 + */ + public abstract NSRect frame(); + + /** + * Original signature : -(NSRect)visibleFrame
+ * native declaration : /System/Library/Frameworks/AppKit.framework/Headers/NSGraphics.h:241 + */ + public abstract NSRect visibleFrame(); + + /** + * Original signature : -(NSDictionary*)deviceDescription
+ * native declaration : /System/Library/Frameworks/AppKit.framework/Headers/NSGraphics.h:242 + */ + public abstract NSDictionary deviceDescription(); + + /** + * Returns scale factor applied by default to windows created on this screen
+ * Original signature : -(CGFloat)userSpaceScaleFactor
+ * native declaration : /System/Library/Frameworks/AppKit.framework/Headers/NSGraphics.h:249 + */ + public abstract CGFloat userSpaceScaleFactor(); +} \ No newline at end of file diff --git a/rococoa-contrib/src/main/java/org/rococoa/contrib/appkit/NSSpeechDictionary.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSSpeechDictionary.java similarity index 98% rename from rococoa-contrib/src/main/java/org/rococoa/contrib/appkit/NSSpeechDictionary.java rename to rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSSpeechDictionary.java index 5acfb1f..85458d1 100755 --- a/rococoa-contrib/src/main/java/org/rococoa/contrib/appkit/NSSpeechDictionary.java +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSSpeechDictionary.java @@ -17,7 +17,7 @@ * along with Rococoa. If not, see . */ -package org.rococoa.contrib.appkit; +package org.rococoa.cocoa.appkit; import org.rococoa.contrib.AbstractPropertyDictionary; import java.util.ArrayList; @@ -33,7 +33,7 @@ import org.rococoa.cocoa.foundation.NSMutableArray; import org.rococoa.cocoa.foundation.NSMutableDictionary; import org.rococoa.cocoa.foundation.NSString; -import static org.rococoa.contrib.appkit.NSSpeechDictionary.SpeechDictionaryProperty.*; +import static org.rococoa.cocoa.appkit.NSSpeechDictionary.SpeechDictionaryProperty.*; /** NSVoice encapsulates the properties of a speech synthesis dictionary, and can be * used with NSSpeechSynthesizer to change the way words are pronounced. diff --git a/rococoa-contrib/src/main/java/org/rococoa/contrib/appkit/NSSpeechSynthesizer.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSSpeechSynthesizer.java similarity index 99% rename from rococoa-contrib/src/main/java/org/rococoa/contrib/appkit/NSSpeechSynthesizer.java rename to rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSSpeechSynthesizer.java index 5a6dcd4..e52ce32 100755 --- a/rococoa-contrib/src/main/java/org/rococoa/contrib/appkit/NSSpeechSynthesizer.java +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSSpeechSynthesizer.java @@ -17,7 +17,7 @@ * along with Rococoa. If not, see . */ -package org.rococoa.contrib.appkit; +package org.rococoa.cocoa.appkit; import java.net.URI; import java.util.ArrayList; @@ -51,7 +51,7 @@ public abstract class NSSpeechSynthesizer extends NSObject { /** Defines the properties associated with a speech synthesizer. Getters and setters have been provided for most of these, * so using the properties directly will not usually be necessary. - * @see NSSpeechSynthesizer#getProperty(org.rococoa.contrib.appkit.NSSpeechSynthesizer.SpeechProperty) + * @see NSSpeechSynthesizer#getProperty(NSSpeechSynthesizer.SpeechProperty) * @see NSSpeechSynthesizer#setProperty(SpeechProperty, NSObject) */ public enum SpeechProperty implements NativeEnum { diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSText.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSText.java new file mode 100644 index 0000000..bae6856 --- /dev/null +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSText.java @@ -0,0 +1,508 @@ +package org.rococoa.cocoa.appkit; + +import org.rococoa.ID; +import org.rococoa.cocoa.foundation.NSRange; +import org.rococoa.cocoa.foundation.NSSize; + +// BridgeSupport v 0.017 +public abstract class NSText extends NSView { + + /// native declaration : /Users/dkocher/null:15 + public static final int NSEnterCharacter = 3; + /// native declaration : /Users/dkocher/null:16 + public static final int NSBackspaceCharacter = 8; + /// native declaration : /Users/dkocher/null:17 + public static final int NSTabCharacter = 9; + /// native declaration : /Users/dkocher/null:18 + public static final int NSNewlineCharacter = 10; + /// native declaration : /Users/dkocher/null:19 + public static final int NSFormFeedCharacter = 12; + /// native declaration : /Users/dkocher/null:20 + public static final int NSCarriageReturnCharacter = 13; + /// native declaration : /Users/dkocher/null:21 + public static final int NSBackTabCharacter = 25; + /// native declaration : /Users/dkocher/null:22 + public static final int NSDeleteCharacter = 127; + /// native declaration : /Users/dkocher/null:23 + public static final int NSLineSeparatorCharacter = 8232; + /// native declaration : /Users/dkocher/null:24 + public static final int NSParagraphSeparatorCharacter = 8233; + /** + * Visually left aligned
+ * native declaration : /Users/dkocher/null:29 + */ + public static final int NSTextAlignmentLeft = 0; + /** + * Visually right aligned
+ * native declaration : /Users/dkocher/null:30 + */ + public static final int NSRightTextAlignment = 1; + public static final int NSTextAlignmentRight = 2; + /** + * Visually centered
+ * native declaration : /Users/dkocher/null:31 + */ + public static final int NSCenterTextAlignment = 2; + public static final int NSTextAlignmentCenter = 1; + /** + * Fully-justified. The last line in a paragraph is natural-aligned.
+ * native declaration : /Users/dkocher/null:32 + */ + public static final int NSTextAlignmentJustified = 3; + /** + * Indicates the default alignment for script
+ * native declaration : /Users/dkocher/null:33 + */ + public static final int NSTextAlignmentNatural = 4; + /** + * Determines direction using the Unicode Bidi Algorithm rules P2 and P3
+ * native declaration : /Users/dkocher/null:40 + */ + public static final int NSWritingDirectionNatural = -1; + /** + * Left to right writing direction
+ * native declaration : /Users/dkocher/null:42 + */ + public static final int NSWritingDirectionLeftToRight = 0; + /** + * Right to left writing direction
+ * native declaration : /Users/dkocher/null:43 + */ + public static final int NSWritingDirectionRightToLeft = 1; + /// native declaration : /Users/dkocher/null:50 + public static final int NSIllegalTextMovement = 0; + /// native declaration : /Users/dkocher/null:51 + public static final int NSReturnTextMovement = 16; + /// native declaration : /Users/dkocher/null:52 + public static final int NSTabTextMovement = 17; + /// native declaration : /Users/dkocher/null:53 + public static final int NSBacktabTextMovement = 18; + /// native declaration : /Users/dkocher/null:54 + public static final int NSLeftTextMovement = 19; + /// native declaration : /Users/dkocher/null:55 + public static final int NSRightTextMovement = 20; + /// native declaration : /Users/dkocher/null:56 + public static final int NSUpTextMovement = 21; + /// native declaration : /Users/dkocher/null:57 + public static final int NSDownTextMovement = 22; + /// native declaration : /Users/dkocher/null:60 + public static final int NSCancelTextMovement = 23; + /// native declaration : /Users/dkocher/null:61 + public static final int NSOtherTextMovement = 0; + + public static final String TextDidBeginEditingNotification = "NSTextDidBeginEditingNotification"; + public static final String TextDidEndEditingNotification = "NSTextDidEndEditingNotification"; + public static final String TextDidChangeNotification = "NSTextDidChangeNotification"; + + /** + * Original signature : NSString* string()
+ * native declaration : /Users/dkocher/null:70 + */ + public abstract String string(); + + /** + * Original signature : void setString(NSString*)
+ * native declaration : /Users/dkocher/null:71 + */ + public abstract void setString(String string); + /** + * native declaration : /Users/dkocher/null:73
+ * Conversion Error : /// Original signature : void replaceCharactersInRange(null, NSString*)
+ * - (void)replaceCharactersInRange:(null)range withString:(NSString*)aString; (Argument range cannot be converted) + */ + /** + * native declaration : /Users/dkocher/null:74
+ * Conversion Error : /// Original signature : void replaceCharactersInRange(null, NSData*)
+ * - (void)replaceCharactersInRange:(null)range withRTF:(NSData*)rtfData; (Argument range cannot be converted) + */ + /** + * native declaration : /Users/dkocher/null:75
+ * Conversion Error : /// Original signature : void replaceCharactersInRange(null, NSData*)
+ * - (void)replaceCharactersInRange:(null)range withRTFD:(NSData*)rtfdData; (Argument range cannot be converted) + */ + /** + * native declaration : /Users/dkocher/null:77
+ * Conversion Error : /// Original signature : NSData* RTFFromRange(null)
+ * - (NSData*)RTFFromRange:(null)range; (Argument range cannot be converted) + */ + /** + * native declaration : /Users/dkocher/null:78
+ * Conversion Error : /// Original signature : NSData* RTFDFromRange(null)
+ * - (NSData*)RTFDFromRange:(null)range; (Argument range cannot be converted) + */ + /** + * Original signature : BOOL writeRTFDToFile(NSString*, BOOL)
+ * native declaration : /Users/dkocher/null:80 + */ + public abstract boolean writeRTFDToFile_atomically(String path, boolean flag); + + /** + * Original signature : BOOL readRTFDFromFile(NSString*)
+ * native declaration : /Users/dkocher/null:81 + */ + public abstract boolean readRTFDFromFile(String path); + + /** + * Original signature : id delegate()
+ * native declaration : /Users/dkocher/null:83 + */ + public abstract org.rococoa.ID delegate(); + + /** + * Original signature : void setDelegate(id)
+ * native declaration : /Users/dkocher/null:84 + */ + public abstract void setDelegate(org.rococoa.ID anObject); + + /** + * Original signature : BOOL isEditable()
+ * native declaration : /Users/dkocher/null:86 + */ + public abstract boolean isEditable(); + + /** + * Original signature : void setEditable(BOOL)
+ * native declaration : /Users/dkocher/null:87 + */ + public abstract void setEditable(boolean flag); + + /** + * Original signature : BOOL isSelectable()
+ * native declaration : /Users/dkocher/null:88 + */ + public abstract boolean isSelectable(); + + /** + * Original signature : void setSelectable(BOOL)
+ * native declaration : /Users/dkocher/null:89 + */ + public abstract void setSelectable(boolean flag); + + /** + * Original signature : BOOL isRichText()
+ * native declaration : /Users/dkocher/null:90 + */ + public abstract boolean isRichText(); + + /** + * Original signature : void setRichText(BOOL)
+ * If NO, also clears setImportsGraphics:
+ * native declaration : /Users/dkocher/null:91 + */ + public abstract void setRichText(boolean flag); + + /** + * Original signature : BOOL importsGraphics()
+ * native declaration : /Users/dkocher/null:92 + */ + public abstract boolean importsGraphics(); + + /** + * Original signature : void setImportsGraphics(BOOL)
+ * If YES, also sets setRichText:
+ * native declaration : /Users/dkocher/null:93 + */ + public abstract void setImportsGraphics(boolean flag); + + /** + * Original signature : BOOL isFieldEditor()
+ * native declaration : /Users/dkocher/null:94 + */ + public abstract boolean isFieldEditor(); + + /** + * Original signature : void setFieldEditor(BOOL)
+ * Indicates whether to end editing on CR, TAB, etc.
+ * native declaration : /Users/dkocher/null:95 + */ + public abstract void setFieldEditor(boolean flag); + + /** + * Original signature : BOOL usesFontPanel()
+ * native declaration : /Users/dkocher/null:96 + */ + public abstract boolean usesFontPanel(); + + /** + * Original signature : void setUsesFontPanel(BOOL)
+ * native declaration : /Users/dkocher/null:97 + */ + public abstract void setUsesFontPanel(boolean flag); + + /** + * Original signature : BOOL drawsBackground()
+ * native declaration : /Users/dkocher/null:98 + */ + public abstract boolean drawsBackground(); + + /** + * Original signature : void setDrawsBackground(BOOL)
+ * native declaration : /Users/dkocher/null:99 + */ + public abstract void setDrawsBackground(boolean flag); + + /** + * Original signature : NSColor* backgroundColor()
+ * native declaration : /Users/dkocher/null:100 + */ + public abstract NSColor backgroundColor(); + + /** + * Original signature : void setBackgroundColor(NSColor*)
+ * native declaration : /Users/dkocher/null:101 + */ + public abstract void setBackgroundColor(NSColor color); + + /** + * Original signature : BOOL isRulerVisible()
+ * native declaration : /Users/dkocher/null:103 + */ + public abstract boolean isRulerVisible(); + + /** + * Original signature : selectedRange()
+ * native declaration : /Users/dkocher/null:105 + */ + public abstract NSRange selectedRange(); + + /** + * native declaration : /Users/dkocher/null:106
+ * Conversion Error : /// Original signature : void setSelectedRange(null)
- + * (void)setSelectedRange:(null)range; (Argument range cannot be converted) + */ + public abstract void setSelectedRange(NSRange range); + /** + * native declaration : /Users/dkocher/null:108
+ * Conversion Error : /// Original signature : void scrollRangeToVisible(null)
+ * - (void)scrollRangeToVisible:(null)range; (Argument range cannot be converted) + */ + public abstract void scrollRangeToVisible(NSRange range); + + /** + * Original signature : void setFont(NSFont*)
+ * native declaration : /Users/dkocher/null:110 + */ + public abstract void setFont(NSFont obj); + + /** + * Original signature : NSFont* font()
+ * native declaration : /Users/dkocher/null:111 + */ + public abstract NSFont font(); + + /** + * Original signature : void setTextColor(NSColor*)
+ * native declaration : /Users/dkocher/null:112 + */ + public abstract void setTextColor(NSColor color); + + /** + * Original signature : NSColor* textColor()
+ * native declaration : /Users/dkocher/null:113 + */ + public abstract NSColor textColor(); + + /** + * Original signature : NSTextAlignment alignment()
+ * native declaration : /Users/dkocher/null:114 + */ + public abstract int alignment(); + + /** + * Original signature : void setAlignment(NSTextAlignment)
+ * native declaration : /Users/dkocher/null:115 + */ + public abstract void setAlignment(int mode); + + /** + * Original signature : NSWritingDirection baseWritingDirection()
+ * native declaration : /Users/dkocher/null:117 + */ + public abstract int baseWritingDirection(); + + /** + * Original signature : void setBaseWritingDirection(NSWritingDirection)
+ * native declaration : /Users/dkocher/null:118 + */ + public abstract void setBaseWritingDirection(int writingDirection); + /** + * native declaration : /Users/dkocher/null:121
+ * Conversion Error : /// Original signature : void setTextColor(NSColor*, null)
+ * - (void)setTextColor:(NSColor*)color range:(null)range; (Argument range cannot be converted) + */ + /** + * native declaration : /Users/dkocher/null:122
+ * Conversion Error : /// Original signature : void setFont(NSFont*, null)
+ * - (void)setFont:(NSFont*)font range:(null)range; (Argument range cannot be converted) + */ + /** + * Original signature : maxSize()
+ * native declaration : /Users/dkocher/null:124 + */ + public abstract NSSize maxSize(); + /** + * native declaration : /Users/dkocher/null:125
+ * Conversion Error : /// Original signature : void setMaxSize(null)
+ * - (void)setMaxSize:(null)newMaxSize; (Argument newMaxSize cannot be converted) + */ + /** + * Original signature : minSize()
+ * native declaration : /Users/dkocher/null:126 + */ + public abstract NSSize minSize(); + /** + * native declaration : /Users/dkocher/null:127
+ * Conversion Error : /// Original signature : void setMinSize(null)
+ * - (void)setMinSize:(null)newMinSize; (Argument newMinSize cannot be converted) + */ + /** + * Original signature : BOOL isHorizontallyResizable()
+ * native declaration : /Users/dkocher/null:129 + */ + public abstract boolean isHorizontallyResizable(); + + /** + * Original signature : void setHorizontallyResizable(BOOL)
+ * native declaration : /Users/dkocher/null:130 + */ + public abstract void setHorizontallyResizable(boolean flag); + + /** + * Original signature : BOOL isVerticallyResizable()
+ * native declaration : /Users/dkocher/null:131 + */ + public abstract boolean isVerticallyResizable(); + + /** + * Original signature : void setVerticallyResizable(BOOL)
+ * native declaration : /Users/dkocher/null:132 + */ + public abstract void setVerticallyResizable(boolean flag); + + /** + * Original signature : void sizeToFit()
+ * native declaration : /Users/dkocher/null:134 + */ + public abstract void sizeToFit(); + + /** + * Original signature : void copy(id)
+ * native declaration : /Users/dkocher/null:136 + */ + public abstract void copy(final ID sender); + + /** + * Original signature : void copyFont(id)
+ * native declaration : /Users/dkocher/null:137 + */ + public abstract void copyFont(final ID sender); + + /** + * Original signature : void copyRuler(id)
+ * native declaration : /Users/dkocher/null:138 + */ + public abstract void copyRuler(final ID sender); + + /** + * Original signature : void cut(id)
+ * native declaration : /Users/dkocher/null:139 + */ + public abstract void cut(final ID sender); + + /** + * Original signature : void delete(id)
+ * native declaration : /Users/dkocher/null:140 + */ + public abstract void delete(final ID sender); + + /** + * Original signature : void paste(id)
+ * native declaration : /Users/dkocher/null:141 + */ + public abstract void paste(final ID sender); + + /** + * Original signature : void pasteFont(id)
+ * native declaration : /Users/dkocher/null:142 + */ + public abstract void pasteFont(final ID sender); + + /** + * Original signature : void pasteRuler(id)
+ * native declaration : /Users/dkocher/null:143 + */ + public abstract void pasteRuler(final ID sender); + + /** + * Original signature : void selectAll(id)
+ * native declaration : /Users/dkocher/null:144 + */ + public abstract void selectAll(final ID sender); + + /** + * Original signature : void changeFont(id)
+ * native declaration : /Users/dkocher/null:145 + */ + public abstract void changeFont(final ID sender); + + /** + * Original signature : void alignLeft(id)
+ * native declaration : /Users/dkocher/null:146 + */ + public abstract void alignLeft(final ID sender); + + /** + * Original signature : void alignRight(id)
+ * native declaration : /Users/dkocher/null:147 + */ + public abstract void alignRight(final ID sender); + + /** + * Original signature : void alignCenter(id)
+ * native declaration : /Users/dkocher/null:148 + */ + public abstract void alignCenter(final ID sender); + + /** + * Original signature : void subscript(id)
+ * native declaration : /Users/dkocher/null:149 + */ + public abstract void subscript(final ID sender); + + /** + * Original signature : void superscript(id)
+ * native declaration : /Users/dkocher/null:150 + */ + public abstract void superscript(final ID sender); + + /** + * Original signature : void underline(id)
+ * native declaration : /Users/dkocher/null:151 + */ + public abstract void underline(final ID sender); + + /** + * Original signature : void unscript(id)
+ * native declaration : /Users/dkocher/null:152 + */ + public abstract void unscript(final ID sender); + + /** + * Original signature : void showGuessPanel(id)
+ * native declaration : /Users/dkocher/null:153 + */ + public abstract void showGuessPanel(final ID sender); + + /** + * Original signature : void checkSpelling(id)
+ * native declaration : /Users/dkocher/null:154 + */ + public abstract void checkSpelling(final ID sender); + + /** + * Original signature : void toggleRuler(id)
+ * native declaration : /Users/dkocher/null:155 + */ + public abstract void toggleRuler(final ID sender); + +} \ No newline at end of file diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSTextFieldCell.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSTextFieldCell.java new file mode 100644 index 0000000..372c25f --- /dev/null +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSTextFieldCell.java @@ -0,0 +1,117 @@ +package org.rococoa.cocoa.appkit; + +import org.rococoa.ObjCClass; +import org.rococoa.cocoa.foundation.NSArray; +import org.rococoa.cocoa.foundation.NSAttributedString; + +/// native declaration : :21 +public abstract class NSTextFieldCell extends NSActionCell { + private static final _Class CLASS = org.rococoa.Rococoa.createClass("NSTextFieldCell", _Class.class); + + public static NSTextFieldCell textFieldCell() { + return CLASS.alloc().init(); + } + + public interface _Class extends ObjCClass { + NSTextFieldCell alloc(); + } + + public abstract NSTextFieldCell init(); + + /** + * Original signature : void setBackgroundColor(NSColor*)
+ * native declaration : :40 + */ + public abstract void setBackgroundColor(NSColor color); + + /** + * Original signature : NSColor* backgroundColor()
+ * native declaration : :41 + */ + public abstract NSColor backgroundColor(); + + /** + * Original signature : void setDrawsBackground(BOOL)
+ * native declaration : :42 + */ + public abstract void setDrawsBackground(boolean flag); + + /** + * Original signature : BOOL drawsBackground()
+ * native declaration : :43 + */ + public abstract boolean drawsBackground(); + + /** + * Original signature : void setTextColor(NSColor*)
+ * native declaration : :44 + */ + public abstract void setTextColor(NSColor color); + + /** + * Original signature : NSColor* textColor()
+ * native declaration : :45 + */ + public abstract NSColor textColor(); + + /** + * Original signature : NSText* setUpFieldEditorAttributes(NSText*)
+ * native declaration : :46 + */ + public abstract NSText setUpFieldEditorAttributes(NSText textObj); + + /** + * Original signature : void setBezelStyle(NSTextFieldBezelStyle)
+ * native declaration : :49 + */ + public abstract void setBezelStyle(int style); + + /** + * Original signature : NSTextFieldBezelStyle bezelStyle()
+ * native declaration : :50 + */ + public abstract int bezelStyle(); + + /** + * Original signature : void setPlaceholderString(NSString*)
+ * native declaration : :54 + */ + public abstract void setPlaceholderString(String string); + + /** + * Original signature : NSString* placeholderString()
+ * native declaration : :55 + */ + public abstract String placeholderString(); + + /** + * Original signature : void setPlaceholderAttributedString(NSAttributedString*)
+ * native declaration : :56 + */ + public abstract void setPlaceholderAttributedString(NSAttributedString string); + + /** + * Original signature : NSAttributedString* placeholderAttributedString()
+ * native declaration : :57 + */ + public abstract NSAttributedString placeholderAttributedString(); + + /** + * Original signature : void setWantsNotificationForMarkedText(BOOL)
+ * native declaration : :61 + */ + public abstract void setWantsNotificationForMarkedText(boolean flag); + + /** + * Returns an array of locale identifiers representing input sources allowed to be enabled when the receiver has the keyboard focus.
+ * Original signature : NSArray* allowedInputSourceLocales()
+ * native declaration : :65 + */ + public abstract NSArray allowedInputSourceLocales(); + + /** + * Original signature : void setAllowedInputSourceLocales(NSArray*)
+ * native declaration : :66 + */ + public abstract void setAllowedInputSourceLocales(NSArray localeIdentifiers); +} \ No newline at end of file diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSTitlebarAccessoryViewController.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSTitlebarAccessoryViewController.java new file mode 100644 index 0000000..5212646 --- /dev/null +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSTitlebarAccessoryViewController.java @@ -0,0 +1,45 @@ +package org.rococoa.cocoa.appkit; + +/* + * Copyright (c) 2002-2016 iterate GmbH. All rights reserved. + * https://cyberduck.io/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +import org.rococoa.ObjCClass; +import org.rococoa.cocoa.foundation.NSInteger; + +public abstract class NSTitlebarAccessoryViewController extends NSResponder { + private static final NSTitlebarAccessoryViewController._Class CLASS = org.rococoa.Rococoa.createClass("NSTitlebarAccessoryViewController", NSTitlebarAccessoryViewController._Class.class); + + public interface _Class extends ObjCClass { + NSTitlebarAccessoryViewController alloc(); + } + + public static final NSInteger NSLayoutAttributeLeft = new NSInteger(1); + public static final NSInteger NSLayoutAttributeRight = new NSInteger(2); + public static final NSInteger NSLayoutAttributeBottom = new NSInteger(4); + + public static NSTitlebarAccessoryViewController create() { + return CLASS.alloc().init(); + } + + public abstract NSTitlebarAccessoryViewController init(); + + public abstract void removeFromParentViewController(); + + public abstract void setLayoutAttribute(NSInteger layout); + + public abstract void setAutomaticallyAdjustsSize(boolean value); + + public abstract void setView(NSView view); +} \ No newline at end of file diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSToolbar.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSToolbar.java new file mode 100644 index 0000000..eae9fdc --- /dev/null +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSToolbar.java @@ -0,0 +1,228 @@ +package org.rococoa.cocoa.appkit; + +import org.rococoa.ID; +import org.rococoa.ObjCClass; +import org.rococoa.cocoa.foundation.NSArray; +import org.rococoa.cocoa.foundation.NSDictionary; +import org.rococoa.cocoa.foundation.NSInteger; +import org.rococoa.cocoa.foundation.NSObject; +import org.rococoa.cocoa.foundation.NSUInteger; + +/// native declaration : :17 +public abstract class NSToolbar extends NSObject { + private static final _Class CLASS = org.rococoa.Rococoa.createClass("NSToolbar", _Class.class); + + /// native declaration : :12 + public static final NSUInteger NSToolbarDisplayModeDefault = new NSUInteger(0); + /// native declaration : :12 + public static final NSUInteger NSToolbarDisplayModeIconAndLabel = new NSUInteger(1); + /// native declaration : :12 + public static final NSUInteger NSToolbarDisplayModeIconOnly = new NSUInteger(2); + /// native declaration : :12 + public static final NSUInteger NSToolbarDisplayModeLabelOnly = new NSUInteger(3); + /// native declaration : :15 + public static final NSUInteger NSToolbarSizeModeDefault = new NSUInteger(0); + /// native declaration : :15 + public static final NSUInteger NSToolbarSizeModeRegular = new NSUInteger(1); + /// native declaration : :15 + public static final NSUInteger NSToolbarSizeModeSmall = new NSUInteger(2); + + public static NSToolbar toolbarWithIdentifier(String identifier) { + return CLASS.alloc().initWithIdentifier(identifier); + } + + public interface _Class extends ObjCClass { + NSToolbar alloc(); + } + + public interface Delegate { + boolean validateToolbarItem(final NSToolbarItem item); + + /** + * Original signature : NSToolbarItem* toolbar(NSToolbar*, NSString*, BOOL)
+ * native declaration : :149 + */ + NSToolbarItem toolbar_itemForItemIdentifier_willBeInsertedIntoToolbar(NSToolbar toolbar, String itemIdentifier, boolean flag); + + /** + * Original signature : NSArray* toolbarDefaultItemIdentifiers(NSToolbar*)
+ * native declaration : :152 + */ + NSArray toolbarDefaultItemIdentifiers(NSToolbar toolbar); + + /** + * Original signature : NSArray* toolbarAllowedItemIdentifiers(NSToolbar*)
+ * native declaration : :155 + */ + NSArray toolbarAllowedItemIdentifiers(NSToolbar toolbar); + + /** + * Original signature : NSArray* toolbarSelectableItemIdentifiers(NSToolbar*)
+ * native declaration : :159 + */ + NSArray toolbarSelectableItemIdentifiers(NSToolbar toolbar); + } + + /** + * Original signature : id initWithIdentifier(NSString*)
+ * native declaration : :68 + */ + public abstract NSToolbar initWithIdentifier(String identifier); + + /** + * Original signature : void insertItemWithItemIdentifier(NSString*, NSInteger)
+ * native declaration : :71 + */ + public abstract void insertItemWithItemIdentifier_atIndex(String itemIdentifier, NSInteger index); + + /** + * Original signature : void removeItemAtIndex(NSInteger)
+ * native declaration : :72 + */ + public abstract void removeItemAtIndex(NSInteger index); + + /** + * Original signature : void setDelegate(id)
+ * native declaration : :75 + */ + public abstract void setDelegate(org.rococoa.ID delegate); + + /** + * Original signature : id delegate()
+ * native declaration : :76 + */ + public abstract org.rococoa.ID delegate(); + + /** + * Original signature : void setVisible(BOOL)
+ * native declaration : :79 + */ + public abstract void setVisible(boolean shown); + + /** + * Original signature : BOOL isVisible()
+ * native declaration : :80 + */ + public abstract boolean isVisible(); + + /** + * Original signature : void runCustomizationPalette(id)
+ * native declaration : :83 + */ + public abstract void runCustomizationPalette(final ID sender); + + /** + * Original signature : BOOL customizationPaletteIsRunning()
+ * native declaration : :84 + */ + public abstract boolean customizationPaletteIsRunning(); + + /** + * Original signature : void setDisplayMode(NSToolbarDisplayMode)
+ * native declaration : :90 + */ + public abstract void setDisplayMode(NSUInteger displayMode); + + /** + * Original signature : NSToolbarDisplayMode displayMode()
+ * native declaration : :91 + */ + public abstract NSUInteger displayMode(); + + /** + * Original signature : void setSelectedItemIdentifier(NSString*)
+ * native declaration : :94 + */ + public abstract void setSelectedItemIdentifier(String itemIdentifier); + + /** + * Original signature : NSString* selectedItemIdentifier()
+ * native declaration : :95 + */ + public abstract String selectedItemIdentifier(); + + /** + * Original signature : void setSizeMode(NSToolbarSizeMode)
+ * native declaration : :100 + */ + public abstract void setSizeMode(NSUInteger sizeMode); + + /** + * Original signature : NSToolbarSizeMode sizeMode()
+ * native declaration : :101 + */ + public abstract NSUInteger sizeMode(); + + /** + * Use this API to hide the baseline NSToolbar draws between itself and the main window contents. The default is YES. This method should only be used before the toolbar is attached to its window (-[NSWindow setToolbar:]).
+ * Original signature : void setShowsBaselineSeparator(BOOL)
+ * native declaration : :107 + */ + public abstract void setShowsBaselineSeparator(boolean flag); + + /** + * Original signature : BOOL showsBaselineSeparator()
+ * native declaration : :108 + */ + public abstract boolean showsBaselineSeparator(); + + /** + * Original signature : void setAllowsUserCustomization(BOOL)
+ * native declaration : :111 + */ + public abstract void setAllowsUserCustomization(boolean allowCustomization); + + /** + * Original signature : BOOL allowsUserCustomization()
+ * native declaration : :112 + */ + public abstract boolean allowsUserCustomization(); + + /** + * Original signature : NSString* identifier()
+ * native declaration : :118 + */ + public abstract String identifier(); + + /** + * Original signature : NSArray* items()
+ * native declaration : :121 + */ + public abstract NSArray items(); + + /** + * Original signature : NSArray* visibleItems()
+ * native declaration : :124 + */ + public abstract NSArray visibleItems(); + + /** + * Original signature : void setAutosavesConfiguration(BOOL)
+ * native declaration : :130 + */ + public abstract void setAutosavesConfiguration(boolean flag); + + /** + * Original signature : BOOL autosavesConfiguration()
+ * native declaration : :131 + */ + public abstract boolean autosavesConfiguration(); + + /** + * Original signature : void setConfigurationFromDictionary(NSDictionary*)
+ * native declaration : :134 + */ + public abstract void setConfigurationFromDictionary(NSDictionary configDict); + + /** + * Original signature : NSDictionary* configurationDictionary()
+ * native declaration : :135 + */ + public abstract NSDictionary configurationDictionary(); + + /** + * Original signature : void validateVisibleItems()
+ * native declaration : :141 + */ + public abstract void validateVisibleItems(); +} \ No newline at end of file diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSToolbarItem.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSToolbarItem.java new file mode 100644 index 0000000..2211a87 --- /dev/null +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSToolbarItem.java @@ -0,0 +1,245 @@ +package org.rococoa.cocoa.appkit; + +import org.rococoa.ID; +import org.rococoa.ObjCClass; +import org.rococoa.Selector; +import org.rococoa.cocoa.foundation.NSCopying; +import org.rococoa.cocoa.foundation.NSObject; +import org.rococoa.cocoa.foundation.NSSize; + +/// native declaration : :10 +public abstract class NSToolbarItem extends NSObject implements NSCopying, NSValidatedUserInterfaceItem { + + private static final _Class CLASS = org.rococoa.Rococoa.createClass("NSToolbarItem", _Class.class); + + public static final String NSToolbarFlexibleItemIdentifier = "NSToolbarFlexibleSpaceItem"; + + /** + * In macOS 10.7 and later the separator icon has been removed from the toolbar and customization palettes. This + * constant is ignored. + */ + public static final String NSToolbarSeparatorItemIdentifier = "NSToolbarSeparatorItem"; + /** + * Creates a new NSTrackingSeparatorToolbarItem and automatically configures it to track the divider of the sidebar + * if one is discovered. + */ + public static final String NSToolbarSidebarTrackingSeparatorItemIdentifier = "NSToolbarSidebarTrackingSeparatorItem"; + public static final String NSToolbarSpaceItemIdentifier = "NSToolbarSpaceItem"; + public static final String NSToolbarFlexibleSpaceItemIdentifier = "NSToolbarFlexibleSpaceItem"; + public static final String NSToolbarShowColorsItemIdentifier = "NSToolbarShowColorsItem"; + public static final String NSToolbarShowFontsItemIdentifier = "NSToolbarShowFontsItem"; + public static final String NSToolbarCustomizeToolbarItemIdentifier = "NSToolbarCustomizeToolbarItem"; + public static final String NSToolbarPrintItemIdentifier = "NSToolbarPrintItem"; + public static final String NSToolbarToggleSidebarItemIdentifier = "NSToolbarToggleSidebarItem"; + public static final String NSToolbarCloudSharingItemIdentifier = "NSToolbarCloudSharingItem"; + + public static final int VisibilityPriorityStandard = 0; + public static final int VisibilityPriorityLow = -1000; + public static final int VisibilityPriorityHigh = 1000; + public static final int VisibilityPriorityUser = 2000; + + public static NSToolbarItem itemWithIdentifier(String itemIdentifier) { + return CLASS.alloc().initWithItemIdentifier(itemIdentifier); + } + + public interface _Class extends ObjCClass { + NSToolbarItem alloc(); + } + + /** + * Original signature : id initWithItemIdentifier(NSString*)
+ * native declaration : :62 + */ + public abstract NSToolbarItem initWithItemIdentifier(String itemIdentifier); + + /** + * Original signature : NSString* itemIdentifier()
+ * native declaration : :65 + */ + public abstract String itemIdentifier(); + + /** + * Original signature : NSToolbar* toolbar()
+ * native declaration : :66 + */ + public abstract NSToolbar toolbar(); + + /** + * Original signature : void setLabel(NSString*)
+ * native declaration : :71 + */ + public abstract void setLabel(String label); + + /** + * Original signature : NSString* label()
+ * native declaration : :72 + */ + public abstract String label(); + + /** + * Original signature : void setPaletteLabel(NSString*)
+ * native declaration : :75 + */ + public abstract void setPaletteLabel(String paletteLabel); + + /** + * Original signature : NSString* paletteLabel()
+ * native declaration : :76 + */ + public abstract String paletteLabel(); + + /** + * Original signature : void setToolTip(NSString*)
+ * native declaration : :79 + */ + public abstract void setToolTip(String toolTip); + + /** + * Original signature : NSString* toolTip()
+ * native declaration : :80 + */ + public abstract String toolTip(); + + /** + * Original signature : void setMenuFormRepresentation(NSMenuItem*)
+ * native declaration : :83 + */ + public abstract void setMenuFormRepresentation(NSMenuItem menuItem); + + /** + * Original signature : NSMenuItem* menuFormRepresentation()
+ * native declaration : :84 + */ + public abstract NSMenuItem menuFormRepresentation(); + + /** + * Original signature : void setTag(NSInteger)
+ * native declaration : :87 + */ + public abstract void setTag(int tag); + + /** + * Original signature : void setTarget(id)
+ * native declaration : :91 + */ + public abstract void setTarget(ID target); + + /** + * Original signature : id target()
+ * native declaration : :92 + */ + public abstract ID target(); + + /** + * native declaration : :95
+ */ + public abstract void setAction(Selector action); + + /** + * Original signature : void setEnabled(BOOL)
+ * native declaration : :99 + */ + public abstract void setEnabled(boolean enabled); + + /** + * Original signature : BOOL isEnabled()
+ * native declaration : :100 + */ + public abstract boolean isEnabled(); + + /** + * Original signature : void setImage(NSImage*)
+ * native declaration : :103 + */ + public abstract void setImage(NSImage image); + + /** + * Original signature : NSImage* image()
+ * native declaration : :104 + */ + public abstract NSImage image(); + + /** + * Original signature : void setView(NSView*)
+ * native declaration : :107 + */ + public abstract void setView(NSView view); + + /** + * Original signature : NSView* view()
+ * native declaration : :108 + */ + public abstract NSView view(); + + /** + * native declaration : :111
+ */ + public abstract void setMinSize(NSSize size); + + /** + * native declaration : :112
+ */ + public abstract NSSize minSize(); + + /** + * native declaration : :115
+ */ + public abstract void setMaxSize(NSSize size); + + /** + * native declaration : :116
+ */ + public abstract NSSize maxSize(); + + /** + * Original signature : void setVisibilityPriority(NSInteger)
+ * native declaration : :123 + */ + public abstract void setVisibilityPriority(int visibilityPriority); + + /** + * Original signature : NSInteger visibilityPriority()
+ * native declaration : :124 + */ + public abstract int visibilityPriority(); + + /** + * Original signature : void validate()
+ * native declaration : :131 + */ + public abstract void validate(); + + /** + * Original signature : void setAutovalidates(BOOL)
+ * native declaration : :136 + */ + public abstract void setAutovalidates(boolean resistance); + + /** + * Original signature : BOOL autovalidates()
+ * native declaration : :137 + */ + public abstract boolean autovalidates(); + + /** + * Original signature : BOOL allowsDuplicatesInToolbar()
+ * native declaration : :145 + */ + public abstract boolean allowsDuplicatesInToolbar(); + + /** + * The system can position navigation items outside of the normal list of items in the toolbar. You specify the + * order of the items using toolbarDefaultItemIdentifiers:. + * + * @return A Boolean value that indicates whether the item behaves as a navigation item in the toolbar. + */ + public abstract boolean isNavigational(); + + /** + * The system can position navigation items outside of the normal list of items in the toolbar. You specify the + * order of the items using toolbarDefaultItemIdentifiers:. + * + * @param value A Boolean value that indicates whether the item behaves as a navigation item in the toolbar. + */ + public abstract void setNavigational(boolean value); +} \ No newline at end of file diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSValidatedUserInterfaceItem.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSValidatedUserInterfaceItem.java new file mode 100644 index 0000000..eaeba33 --- /dev/null +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSValidatedUserInterfaceItem.java @@ -0,0 +1,37 @@ +package org.rococoa.cocoa.appkit; + +/* + * Copyright (c) 2002-2009 David Kocher. All rights reserved. + * + * http://cyberduck.ch/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * Bug fixes, suggestions and comments should be sent to: + * dkocher@cyberduck.ch + */ + +import org.rococoa.Selector; + +/// native declaration : /System/Library/Frameworks/AppKit.framework/Headers/NSUserInterfaceValidation.h:69 +public interface NSValidatedUserInterfaceItem { + /** + * Original signature : action()
+ * native declaration : /System/Library/Frameworks/AppKit.framework/Headers/NSUserInterfaceValidation.h:70 + */ + Selector action(); + + /** + * Original signature : NSInteger tag()
+ * native declaration : /System/Library/Frameworks/AppKit.framework/Headers/NSUserInterfaceValidation.h:71 + */ + int tag(); +} \ No newline at end of file diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSView.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSView.java new file mode 100644 index 0000000..63491bf --- /dev/null +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSView.java @@ -0,0 +1,1130 @@ +package org.rococoa.cocoa.appkit; + +import org.rococoa.ID; +import org.rococoa.ObjCClass; +import org.rococoa.cocoa.CGFloat; +import org.rococoa.cocoa.foundation.NSArray; +import org.rococoa.cocoa.foundation.NSDictionary; +import org.rococoa.cocoa.foundation.NSObject; +import org.rococoa.cocoa.foundation.NSPoint; +import org.rococoa.cocoa.foundation.NSRect; +import org.rococoa.cocoa.foundation.NSSize; +import org.rococoa.cocoa.foundation.NSUInteger; +import org.rococoa.cocoa.foundation.NSAttributedString; + +public abstract class NSView extends NSResponder { + private static final NSView._Class CLASS = org.rococoa.Rococoa.createClass("NSView", NSView._Class.class); + + public static final int NSViewNotSizable = 0; + public static final int NSViewMinXMargin = 1; + public static final int NSViewWidthSizable = 2; + public static final int NSViewMaxXMargin = 4; + public static final int NSViewMinYMargin = 8; + public static final int NSViewHeightSizable = 16; + public static final int NSViewMaxYMargin = 32; + + public static final int NSViewLayerContentsRedrawNever = 0; + public static final int NSViewLayerContentsRedrawOnSetNeedsDisplay = 1; + public static final int NSViewLayerContentsRedrawDuringViewResize = 2; + public static final int NSViewLayerContentsRedrawBeforeViewResize = 3; + public static final int NSViewLayerContentsRedrawCrossfade = 4; + + public enum NSFocusRingType { + NSFocusRingTypeDefault, + NSFocusRingTypeNone, + NSFocusRingTypeExterior + } + + public static NSView create() { + return CLASS.alloc().init(); + } + + public static NSView create(NSRect frameRect) { + return CLASS.alloc().initWithFrame(frameRect); + } + + public interface _Class extends ObjCClass { + NSView alloc(); + + /** + * Original signature : NSView* focusView()
+ * native declaration : :213 + */ + NSView focusView(); + + /** + * Original signature : NSMenu* defaultMenu()
+ * native declaration : :311 + */ + NSMenu defaultMenu(); + + /** + * Original signature : defaultFocusRingType()
+ * from NSKeyboardUI native declaration : :357 + */ + NSObject defaultFocusRingType(); + } + + public abstract NSView init(); + + public abstract NSView initWithFrame(NSRect frameRect); + + /** + * native declaration : :115
+ * Conversion Error : NSRect + */ + /** + * Original signature : NSWindow* window()
+ * native declaration : :117 + */ + public abstract NSWindow window(); + + /** + * Original signature : NSView* superview()
+ * native declaration : :118 + */ + public abstract NSView superview(); + + /** + * Original signature : NSArray* subviews()
+ * native declaration : :119 + */ + public abstract NSArray subviews(); + + /** + * Original signature : BOOL isDescendantOf(NSView*)
+ * native declaration : :120 + */ + public abstract boolean isDescendantOf(NSView aView); + + /** + * Original signature : NSView* ancestorSharedWithView(NSView*)
+ * native declaration : :121 + */ + public abstract NSView ancestorSharedWithView(NSView aView); + + /** + * Original signature : NSView* opaqueAncestor()
+ * native declaration : :122 + */ + public abstract NSView opaqueAncestor(); + + /** + * Original signature : void setHidden(BOOL)
+ * native declaration : :124 + */ + public abstract void setHidden(boolean flag); + + /** + * Original signature : BOOL isHidden()
+ * native declaration : :125 + */ + public abstract boolean isHidden(); + + /** + * Original signature : BOOL isHiddenOrHasHiddenAncestor()
+ * native declaration : :126 + */ + public abstract boolean isHiddenOrHasHiddenAncestor(); + + /** + * Original signature : void getRectsBeingDrawn(const NSRect**, NSInteger*)
+ * native declaration : :128 + */ + public abstract void getRectsBeingDrawn_count(com.sun.jna.ptr.PointerByReference rects, java.nio.IntBuffer count); + /** + * native declaration : :129
+ * Conversion Error : NSRect + */ + /** + * Original signature : BOOL wantsDefaultClipping()
+ * native declaration : :130 + */ + public abstract boolean wantsDefaultClipping(); + + /** + * Original signature : void viewDidHide()
+ * native declaration : :133 + */ + public abstract void viewDidHide(); + + /** + * Original signature : void viewDidUnhide()
+ * native declaration : :134 + */ + public abstract void viewDidUnhide(); + + /** + * Original signature : void setSubviews(NSArray*)
+ * native declaration : :136 + */ + public abstract void setSubviews(NSArray newSubviews); + + /** + * Original signature : void addSubview(NSView*)
+ * native declaration : :138 + */ + public abstract void addSubview(NSView aView); + + /** + * native declaration : :139
+ * Conversion Error : /// Original signature : void addSubview(NSView*, null, NSView*)
+ * - (void)addSubview:(NSView*)aView positioned:(null)place relativeTo:(NSView*)otherView; (Argument place cannot be converted) + */ + public abstract void addSubview_positioned_relativeTo(NSView aView, int place, NSView otherView); + + /** + * Original signature : void viewWillMoveToWindow(NSWindow*)
+ * native declaration : :141 + */ + public abstract void viewWillMoveToWindow(NSWindow newWindow); + + /** + * Original signature : void viewDidMoveToWindow()
+ * native declaration : :142 + */ + public abstract void viewDidMoveToWindow(); + + /** + * Original signature : void viewWillMoveToSuperview(NSView*)
+ * native declaration : :143 + */ + public abstract void viewWillMoveToSuperview(NSView newSuperview); + + /** + * Original signature : void viewDidMoveToSuperview()
+ * native declaration : :144 + */ + public abstract void viewDidMoveToSuperview(); + + /** + * Original signature : void didAddSubview(NSView*)
+ * native declaration : :145 + */ + public abstract void didAddSubview(NSView subview); + + /** + * Original signature : void willRemoveSubview(NSView*)
+ * native declaration : :146 + */ + public abstract void willRemoveSubview(NSView subview); + + /** + * Original signature : void removeFromSuperview()
+ * native declaration : :147 + */ + public abstract void removeFromSuperview(); + + /** + * Original signature : void replaceSubview(NSView*, NSView*)
+ * native declaration : :148 + */ + public abstract void replaceSubview_with(NSView oldView, NSView newView); + + /** + * Original signature : void removeFromSuperviewWithoutNeedingDisplay()
+ * native declaration : :149 + */ + public abstract void removeFromSuperviewWithoutNeedingDisplay(); + + /** + * Original signature : void setPostsFrameChangedNotifications(BOOL)
+ * native declaration : :151 + */ + public abstract void setPostsFrameChangedNotifications(boolean flag); + + /** + * Original signature : BOOL postsFrameChangedNotifications()
+ * native declaration : :152 + */ + public abstract boolean postsFrameChangedNotifications(); + /** + * native declaration : :153
+ * Conversion Error : /// Original signature : void resizeSubviewsWithOldSize(null)
+ * - (void)resizeSubviewsWithOldSize:(null)oldSize; (Argument oldSize cannot be converted) + */ + /** + * native declaration : :154
+ * Conversion Error : /// Original signature : void resizeWithOldSuperviewSize(null)
+ * - (void)resizeWithOldSuperviewSize:(null)oldSize; (Argument oldSize cannot be converted) + */ + /** + * Original signature : void setAutoresizesSubviews(BOOL)
+ * native declaration : :155 + */ + public abstract void setAutoresizesSubviews(boolean flag); + + /** + * Original signature : BOOL autoresizesSubviews()
+ * native declaration : :156 + */ + public abstract boolean autoresizesSubviews(); + + /** + * Original signature : void setAutoresizingMask(NSUInteger)
+ * native declaration : :157 + */ + public abstract void setAutoresizingMask(NSUInteger mask); + + /** + * Original signature : NSUInteger autoresizingMask()
+ * native declaration : :158 + */ + public abstract NSUInteger autoresizingMask(); + + /** + * native declaration : :160
+ * Conversion Error : /// Original signature : void setFrameOrigin(null)
+ * - (void)setFrameOrigin:(null)newOrigin; (Argument newOrigin cannot be converted) + */ + public abstract void setFrameOrigin(NSPoint origin); + + /** + * native declaration : :161
+ * Conversion Error : /// Original signature : void setFrameSize(null)
+ * - (void)setFrameSize:(null)newSize; (Argument newSize cannot be converted) + */ + public abstract void setFrameSize(NSSize size); + + /** + * native declaration : :162
+ * Conversion Error : NSRect + */ + public abstract void setFrame(NSRect frame); + + /** + * native declaration : :163
+ * Conversion Error : NSRect + */ + public abstract NSRect frame(); + + /** + * Original signature : void setFrameRotation(CGFloat)
+ * native declaration : :164 + */ + public abstract void setFrameRotation(CGFloat angle); + + /** + * Original signature : CGFloat frameRotation()
+ * native declaration : :165 + */ + public abstract CGFloat frameRotation(); + + /** + * Original signature : void setFrameCenterRotation(CGFloat)
+ * native declaration : :167 + */ + public abstract void setFrameCenterRotation(CGFloat angle); + + /** + * Original signature : CGFloat frameCenterRotation()
+ * native declaration : :168 + */ + public abstract CGFloat frameCenterRotation(); + /** + * native declaration : :171
+ * Conversion Error : /// Original signature : void setBoundsOrigin(null)
+ * - (void)setBoundsOrigin:(null)newOrigin; (Argument newOrigin cannot be converted) + */ + /** + * native declaration : :172
+ * Conversion Error : /// Original signature : void setBoundsSize(null)
+ * - (void)setBoundsSize:(null)newSize; (Argument newSize cannot be converted) + */ + /** + * Original signature : void setBoundsRotation(CGFloat)
+ * native declaration : :173 + */ + public abstract void setBoundsRotation(CGFloat angle); + + /** + * Original signature : CGFloat boundsRotation()
+ * native declaration : :174 + */ + public abstract CGFloat boundsRotation(); + /** + * native declaration : :175
+ * Conversion Error : /// Original signature : void translateOriginToPoint(null)
+ * - (void)translateOriginToPoint:(null)translation; (Argument translation cannot be converted) + */ + /** + * native declaration : :176
+ * Conversion Error : /// Original signature : void scaleUnitSquareToSize(null)
+ * - (void)scaleUnitSquareToSize:(null)newUnitSize; (Argument newUnitSize cannot be converted) + */ + /** + * Original signature : void rotateByAngle(CGFloat)
+ * native declaration : :177 + */ + public abstract void rotateByAngle(CGFloat angle); + /** + * native declaration : :178
+ * Conversion Error : NSRect + */ + /** + * native declaration : :179
+ * Conversion Error : NSRect + */ + /** + * Original signature : BOOL isFlipped()
+ * native declaration : :181 + */ + public abstract boolean isFlipped(); + + /** + * Original signature : BOOL isRotatedFromBase()
+ * native declaration : :182 + */ + public abstract boolean isRotatedFromBase(); + + /** + * Original signature : BOOL isRotatedOrScaledFromBase()
+ * native declaration : :183 + */ + public abstract boolean isRotatedOrScaledFromBase(); + + /** + * Original signature : BOOL isOpaque()
+ * native declaration : :184 + */ + public abstract boolean isOpaque(); + + /** + * native declaration : :186
+ * Conversion Error : /// Original signature : convertPoint(null, NSView*)
+ * - (null)convertPoint:(null)aPoint fromView:(NSView*)aView; (Argument aPoint cannot be converted) + */ + public abstract NSPoint convertPoint_fromView(NSPoint aPoint, NSView aView); + + /** + * native declaration : :187
+ * Conversion Error : /// Original signature : convertPoint(null, NSView*)
+ * - (null)convertPoint:(null)aPoint toView:(NSView*)aView; (Argument aPoint cannot be converted) + */ + public abstract NSPoint convertPoint_toView(NSPoint aPoint, NSView aView); + /** + * native declaration : :188
+ * Conversion Error : /// Original signature : convertSize(null, NSView*)
+ * - (null)convertSize:(null)aSize fromView:(NSView*)aView; (Argument aSize cannot be converted) + */ + /** + * native declaration : :189
+ * Conversion Error : /// Original signature : convertSize(null, NSView*)
+ * - (null)convertSize:(null)aSize toView:(NSView*)aView; (Argument aSize cannot be converted) + */ + /** + * native declaration : :190
+ * Conversion Error : NSRect + */ + /** + * native declaration : :191
+ * Conversion Error : NSRect + */ + /** + * native declaration : :192
+ * Conversion Error : NSRect + */ + /** + * native declaration : :195
+ * Conversion Error : /// Original signature : convertPointToBase(null)
+ * - (null)convertPointToBase:(null)aPoint; (Argument aPoint cannot be converted) + */ + public abstract NSPoint convertPointToBase(NSPoint aPoint); + + /** + * native declaration : :196
+ * Conversion Error : /// Original signature : convertPointFromBase(null)
+ * - (null)convertPointFromBase:(null)aPoint; (Argument aPoint cannot be converted) + */ + public abstract NSPoint convertPointFromBase(NSPoint aPoint); + + /** + * native declaration : :197
+ * Conversion Error : /// Original signature : convertSizeToBase(null)
+ * - (null)convertSizeToBase:(null)aSize; (Argument aSize cannot be converted) + */ + public abstract NSSize convertSizeToBase(NSSize aSize); + + /** + * native declaration : :198
+ * Conversion Error : /// Original signature : convertSizeFromBase(null)
+ * - (null)convertSizeFromBase:(null)aSize; (Argument aSize cannot be converted) + */ + public abstract NSSize convertSizeFromBase(NSSize aSize); + /** + * native declaration : :199
+ * Conversion Error : NSRect + */ + /** + * native declaration : :200
+ * Conversion Error : NSRect + */ + /** + * Original signature : BOOL canDraw()
+ * native declaration : :203 + */ + public abstract boolean canDraw(); + + /** + * Original signature : void setNeedsDisplay(BOOL)
+ * native declaration : :204 + */ + public abstract void setNeedsDisplay(boolean flag); + /** + * native declaration : :205
+ * Conversion Error : NSRect + */ + /** + * Original signature : BOOL needsDisplay()
+ * native declaration : :206 + */ + public abstract boolean needsDisplay(); + + /** + * Original signature : void lockFocus()
+ * native declaration : :207 + */ + public abstract void lockFocus(); + + /** + * Original signature : void unlockFocus()
+ * native declaration : :208 + */ + public abstract void unlockFocus(); + + /** + * Original signature : BOOL lockFocusIfCanDraw()
+ * native declaration : :209 + */ + public abstract boolean lockFocusIfCanDraw(); + + /** + * Original signature : BOOL lockFocusIfCanDrawInContext(NSGraphicsContext*)
+ * native declaration : :211 + */ + public abstract boolean lockFocusIfCanDrawInContext(com.sun.jna.Pointer context); + /** + * native declaration : :214
+ * Conversion Error : NSRect + */ + /** + * Original signature : void display()
+ * native declaration : :216 + */ + public abstract void display(); + + /** + * Original signature : void displayIfNeeded()
+ * native declaration : :217 + */ + public abstract void displayIfNeeded(); + + /** + * Original signature : void displayIfNeededIgnoringOpacity()
+ * native declaration : :218 + */ + public abstract void displayIfNeededIgnoringOpacity(); + /** + * native declaration : :219
+ * Conversion Error : NSRect + */ + /** + * native declaration : :220
+ * Conversion Error : NSRect + */ + /** + * native declaration : :221
+ * Conversion Error : NSRect + */ + /** + * native declaration : :222
+ * Conversion Error : NSRect + */ + /** + * native declaration : :223
+ * Conversion Error : NSRect + */ + /** + * native declaration : :225
+ * Conversion Error : NSRect + */ + /** + * native declaration : :227
+ * Conversion Error : NSRect + */ + /** + * native declaration : :228
+ * Conversion Error : NSRect + */ + /** + * Original signature : void viewWillDraw()
+ * native declaration : :231 + */ + public abstract void viewWillDraw(); + + /** + * Original signature : NSInteger gState()
+ * native declaration : :234 + */ + public abstract int gState(); + + /** + * Original signature : void allocateGState()
+ * native declaration : :235 + */ + public abstract void allocateGState(); + + /** + * Original signature : void releaseGState()
+ * native declaration : :236 + */ + public abstract void releaseGState(); + + /** + * Original signature : void setUpGState()
+ * native declaration : :237 + */ + public abstract void setUpGState(); + + /** + * Original signature : void renewGState()
+ * native declaration : :238 + */ + public abstract void renewGState(); + /** + * native declaration : :240
+ * Conversion Error : /// Original signature : void scrollPoint(null)
+ * - (void)scrollPoint:(null)aPoint; (Argument aPoint cannot be converted) + */ + /** + * native declaration : :241
+ * Conversion Error : NSRect + */ + /** + * Original signature : BOOL autoscroll(NSEvent*)
+ * native declaration : :242 + */ + public abstract boolean autoscroll(NSEvent event); + /** + * native declaration : :243
+ * Conversion Error : NSRect + */ + /** + * native declaration : :244
+ * Conversion Error : NSRect + */ + /** + * native declaration : :246
+ * Conversion Error : NSRect + */ + /** + * native declaration : :249
+ */ + public abstract NSView hitTest(NSPoint point); + + /** + * native declaration : :250
+ * Conversion Error : /// Original signature : BOOL mouse(null, NSRect)
+ * - (BOOL)mouse:(null)aPoint inRect:(NSRect)aRect; (Argument aPoint cannot be converted) + */ + /** + * Original signature : id viewWithTag(NSInteger)
+ * native declaration : :251 + */ + public abstract NSView viewWithTag(int aTag); + + /** + * Original signature : NSInteger tag()
+ * native declaration : :252 + */ + public abstract int tag(); + + /** + * Original signature : BOOL acceptsFirstMouse(NSEvent*)
+ * native declaration : :254 + */ + public abstract boolean acceptsFirstMouse(NSEvent event); + + /** + * Original signature : BOOL shouldDelayWindowOrderingForEvent(NSEvent*)
+ * native declaration : :255 + */ + public abstract boolean shouldDelayWindowOrderingForEvent(NSEvent event); + + /** + * Original signature : BOOL needsPanelToBecomeKey()
+ * native declaration : :256 + */ + public abstract boolean needsPanelToBecomeKey(); + + /** + * Original signature : BOOL mouseDownCanMoveWindow()
+ * native declaration : :258 + */ + public abstract boolean mouseDownCanMoveWindow(); + /** + * native declaration : :261
+ * Conversion Error : NSRect + */ + /** + * native declaration : :262
+ * Conversion Error : NSRect + */ + /** + * Original signature : void discardCursorRects()
+ * native declaration : :263 + */ + public abstract void discardCursorRects(); + + /** + * Original signature : void resetCursorRects()
+ * native declaration : :264 + */ + public abstract void resetCursorRects(); + /** + * native declaration : :266
+ * Conversion Error : NSRect + */ + /** + * Original signature : void removeTrackingRect(NSTrackingRectTag)
+ * native declaration : :267 + */ + public abstract void removeTrackingRect(int tag); + + /** + * Original signature : void setWantsLayer(BOOL)
+ * native declaration : :270 + */ + public abstract void setWantsLayer(boolean flag); + + /** + * Original signature : BOOL wantsLayer()
+ * native declaration : :271 + */ + public abstract boolean wantsLayer(); + + /** + * Original signature : void setLayer(CALayer*)
+ * native declaration : :273 + */ + public abstract void setLayer(com.sun.jna.Pointer newLayer); + + /** + * Original signature : CALayer* layer()
+ * native declaration : :274 + */ + public abstract com.sun.jna.Pointer layer(); + + public abstract void setLayerContentsRedrawPolicy(int policy); + + public abstract int layerContentsRedrawPolicy(); + + /** + * Original signature : void setAlphaValue(CGFloat)
+ * native declaration : :276 + */ + public abstract void setAlphaValue(CGFloat viewAlpha); + + /** + * Original signature : CGFloat alphaValue()
+ * native declaration : :277 + */ + public abstract CGFloat alphaValue(); + + /** + * Original signature : void setBackgroundFilters(NSArray*)
+ * native declaration : :279 + */ + public abstract void setBackgroundFilters(NSArray filters); + + /** + * Original signature : NSArray* backgroundFilters()
+ * native declaration : :280 + */ + public abstract NSArray backgroundFilters(); + + /** + * Original signature : void setCompositingFilter(CIFilter*)
+ * native declaration : :282 + */ + public abstract void setCompositingFilter(com.sun.jna.Pointer filter); + + /** + * Original signature : CIFilter* compositingFilter()
+ * native declaration : :283 + */ + public abstract com.sun.jna.Pointer compositingFilter(); + + /** + * Original signature : void setContentFilters(NSArray*)
+ * native declaration : :285 + */ + public abstract void setContentFilters(com.sun.jna.Pointer filters); + + /** + * Original signature : NSArray* contentFilters()
+ * native declaration : :286 + */ + public abstract com.sun.jna.Pointer contentFilters(); + + /** + * Original signature : void setShadow(NSShadow*)
+ * native declaration : :288 + */ + public abstract void setShadow(com.sun.jna.Pointer shadow); + + /** + * Original signature : NSShadow* shadow()
+ * native declaration : :289 + */ + public abstract com.sun.jna.Pointer shadow(); + + /** + * The following methods are meant to be invoked, and probably don't need to be overridden
+ * Original signature : void addTrackingArea(NSTrackingArea*)
+ * native declaration : :293 + */ + public abstract void addTrackingArea(com.sun.jna.Pointer trackingArea); + + /** + * Original signature : void removeTrackingArea(NSTrackingArea*)
+ * native declaration : :294 + */ + public abstract void removeTrackingArea(com.sun.jna.Pointer trackingArea); + + /** + * Original signature : NSArray* trackingAreas()
+ * native declaration : :295 + */ + public abstract NSArray trackingAreas(); + + /** + * updateTrackingAreas should be overridden to remove out of date tracking areas and add recomputed tracking areas, and should call super.
+ * Original signature : void updateTrackingAreas()
+ * native declaration : :299 + */ + public abstract void updateTrackingAreas(); + + /** + * Original signature : BOOL shouldDrawColor()
+ * native declaration : :303 + */ + public abstract boolean shouldDrawColor(); + + /** + * Original signature : void setPostsBoundsChangedNotifications(BOOL)
+ * native declaration : :305 + */ + public abstract void setPostsBoundsChangedNotifications(boolean flag); + + /** + * Original signature : BOOL postsBoundsChangedNotifications()
+ * native declaration : :306 + */ + public abstract boolean postsBoundsChangedNotifications(); + + /** + * Original signature : NSScrollView* enclosingScrollView()
+ * native declaration : :308 + */ + public abstract NSView enclosingScrollView(); + + /** + * Original signature : NSMenu* menuForEvent(NSEvent*)
+ * native declaration : :310 + */ + public abstract NSMenu menuForEvent(NSEvent event); + + /** + * Original signature : void setToolTip(NSString*)
+ * native declaration : :313 + */ + public abstract void setToolTip(String string); + + /** + * Original signature : NSString* toolTip()
+ * native declaration : :314 + */ + public abstract String toolTip(); + /** + * native declaration : :315
+ * Conversion Error : NSRect + */ + /** + * Original signature : void removeToolTip(NSToolTipTag)
+ * native declaration : :316 + */ + public abstract void removeToolTip(int tag); + + /** + * Original signature : void removeAllToolTips()
+ * native declaration : :317 + */ + public abstract void removeAllToolTips(); + + /** + * a view receives viewWillStartLiveResize before the frame is first changed for a live resize
+ * Original signature : void viewWillStartLiveResize()
+ * native declaration : :321 + */ + public abstract void viewWillStartLiveResize(); + + /** + * a view receives viewWillEndLiveResize after the frame is last changed for a live resize
+ * Original signature : void viewDidEndLiveResize()
+ * native declaration : :323 + */ + public abstract void viewDidEndLiveResize(); + + /** + * inLiveResize can be called from drawRect: to decide between cheap and full drawing
+ * Original signature : BOOL inLiveResize()
+ * native declaration : :325 + */ + public abstract boolean inLiveResize(); + + /** + * A view that returns YES for -preservesContentDuringLiveResize is responsible for invalidating its own dirty rects during live resize
+ * Original signature : BOOL preservesContentDuringLiveResize()
+ * native declaration : :328 + */ + public abstract boolean preservesContentDuringLiveResize(); + /** + * native declaration : :330
+ * Conversion Error : NSRect + */ + + /** + * On return from -getRectsExposedDuringLiveResize, exposedRects indicates the parts of the view that are newly exposed (at most 4 rects). *count indicates how many rects are in the exposedRects list
+ * Original signature : void getRectsExposedDuringLiveResize(NSRect[], NSInteger*)
+ * native declaration : :332 + */ + public abstract void getRectsExposedDuringLiveResize_count(com.sun.jna.Pointer exposedRects, java.nio.IntBuffer count); + + /** + * Original signature : BOOL performMnemonic(NSString*)
+ * from NSKeyboardUI native declaration : :341 + */ + public abstract boolean performMnemonic(com.sun.jna.Pointer theString); + + /** + * Original signature : void setNextKeyView(NSView*)
+ * from NSKeyboardUI native declaration : :342 + */ + public abstract void setNextKeyView(NSView next); + + /** + * Original signature : NSView* nextKeyView()
+ * from NSKeyboardUI native declaration : :343 + */ + public abstract NSView nextKeyView(); + + /** + * Original signature : NSView* previousKeyView()
+ * from NSKeyboardUI native declaration : :344 + */ + public abstract NSView previousKeyView(); + + /** + * Original signature : NSView* nextValidKeyView()
+ * from NSKeyboardUI native declaration : :345 + */ + public abstract NSView nextValidKeyView(); + + /** + * Original signature : NSView* previousValidKeyView()
+ * from NSKeyboardUI native declaration : :346 + */ + public abstract NSView previousValidKeyView(); + + /** + * Original signature : BOOL canBecomeKeyView()
+ * from NSKeyboardUI native declaration : :349 + */ + public abstract boolean canBecomeKeyView(); + /** + * from NSKeyboardUI native declaration : :352
+ * Conversion Error : NSRect + */ + /** + * from NSKeyboardUI native declaration : :355
+ * Conversion Error : /// Original signature : void setFocusRingType(null)
+ */ + public abstract void setFocusRingType(int focusRingType); + + /** + * Original signature : focusRingType()
+ * from NSKeyboardUI native declaration : :356 + */ + public abstract int focusRingType(); + /** + * from NSPrinting native declaration : :364
+ * Conversion Error : NSRect + */ + /** + * from NSPrinting native declaration : :365
+ * Conversion Error : NSRect + */ + /** + * from NSPrinting native declaration : :366
+ * Conversion Error : NSRect + */ + /** + * from NSPrinting native declaration : :367
+ * Conversion Error : NSRect + */ + /** + * Printing action method (Note fax: is obsolete)
+ * Original signature : void print(id)
+ * from NSPrinting native declaration : :370 + */ + public abstract void print(final ID sender); + /** + * from NSPrinting native declaration : :373
+ * Conversion Error : /**
+ * * Pagination
+ * * Original signature : BOOL knowsPageRange(null)
+ * * /
+ * - (BOOL)knowsPageRange:(null)range; (Argument range cannot be converted) + */ + /** + * Original signature : CGFloat heightAdjustLimit()
+ * from NSPrinting native declaration : :374 + */ + public abstract CGFloat heightAdjustLimit(); + + /** + * Original signature : CGFloat widthAdjustLimit()
+ * from NSPrinting native declaration : :375 + */ + public abstract CGFloat widthAdjustLimit(); + + /** + * Original signature : void adjustPageWidthNew(CGFloat*, CGFloat, CGFloat, CGFloat)
+ * from NSPrinting native declaration : :376 + */ + public abstract void adjustPageWidthNew_left_right_limit(java.nio.FloatBuffer newRight, CGFloat oldLeft, CGFloat oldRight, CGFloat rightLimit); + + /** + * Original signature : void adjustPageHeightNew(CGFloat*, CGFloat, CGFloat, CGFloat)
+ * from NSPrinting native declaration : :377 + */ + public abstract void adjustPageHeightNew_top_bottom_limit(java.nio.FloatBuffer newBottom, CGFloat oldTop, CGFloat oldBottom, CGFloat bottomLimit); + /** + * from NSPrinting native declaration : :378
+ * Conversion Error : NSRect + */ + /** + * from NSPrinting native declaration : :379
+ * Conversion Error : NSRect + */ + /** + * from NSPrinting native declaration : :380
+ * Conversion Error : /// Original signature : void drawPageBorderWithSize(null)
+ * - (void)drawPageBorderWithSize:(null)borderSize; (Argument borderSize cannot be converted) + */ + /** + * Original signature : NSAttributedString* pageHeader()
+ * from NSPrinting native declaration : :382 + */ + public abstract NSAttributedString pageHeader(); + + /** + * Original signature : NSAttributedString* pageFooter()
+ * from NSPrinting native declaration : :383 + */ + public abstract NSAttributedString pageFooter(); + /** + * from NSPrinting native declaration : :387
+ * Conversion Error : /**
+ * * This method is obsolete. It will never be invoked from within AppKit, and NSView's implementation of it does nothing. **
+ * * Original signature : void drawSheetBorderWithSize(null)
+ * * /
+ * - (void)drawSheetBorderWithSize:(null)borderSize; (Argument borderSize cannot be converted) + */ + /** + * Returns print job title. Default implementation first tries its window's NSDocument (displayName), then window's title
+ * Original signature : NSString* printJobTitle()
+ * from NSPrinting native declaration : :391 + */ + public abstract String printJobTitle(); + + /** + * Original signature : void beginDocument()
+ * from NSPrinting native declaration : :392 + */ + public abstract void beginDocument(); + + /** + * Original signature : void endDocument()
+ * from NSPrinting native declaration : :393 + */ + public abstract void endDocument(); + /** + * from NSPrinting native declaration : :395
+ * Conversion Error : NSRect + */ + /** + * Original signature : void endPage()
+ * from NSPrinting native declaration : :396 + */ + public abstract void endPage(); + /** + * from NSDrag native declaration : :401
+ * Conversion Error : /// Original signature : void dragImage(NSImage*, null, null, NSEvent*, NSPasteboard*, id, BOOL)
+ * - (void)dragImage:(NSImage*)anImage at:(null)viewLocation offset:(null)initialOffset event:(NSEvent*)event pasteboard:(NSPasteboard*)pboard source:(id)sourceObj slideBack:(BOOL)slideFlag; (Argument viewLocation cannot be converted) + */ + /** + * Original signature : NSArray* registeredDraggedTypes()
+ * from NSDrag native declaration : :404 + */ + public abstract NSArray registeredDraggedTypes(); + + /** + * Original signature : void registerForDraggedTypes(NSArray*)
+ * from NSDrag native declaration : :406 + */ + public abstract void registerForDraggedTypes(NSArray types); + + /** + * Original signature : void unregisterDraggedTypes()
+ * from NSDrag native declaration : :407 + */ + public abstract void unregisterDraggedTypes(); + + /** + * from NSDrag native declaration : :409
+ * Conversion Error : NSRect + */ + public abstract boolean dragFile_fromRect_slideBack_event(String filename, NSRect rect, boolean slideBack, NSEvent event); + + /** + * from NSDrag native declaration : :411
+ * Conversion Error : NSRect + */ + public abstract boolean dragPromisedFilesOfTypes_fromRect_source_slideBack_event( + NSArray typeArray, NSRect rect, org.rococoa.ID sourceObject, boolean slideBack, NSEvent event); + + public boolean dragPromisedFilesOfTypes( + NSArray typeArray, NSRect rect, org.rococoa.ID sourceObject, boolean slideBack, NSEvent event) { + return this.dragPromisedFilesOfTypes_fromRect_source_slideBack_event(typeArray, rect, sourceObject, slideBack, event); + } + + /** + * Original signature : BOOL enterFullScreenMode(NSScreen*, NSDictionary*)
+ * from NSFullScreenMode native declaration : :417 + */ + public abstract boolean enterFullScreenMode_withOptions(com.sun.jna.Pointer screen, com.sun.jna.Pointer options); + + /** + * Original signature : void exitFullScreenModeWithOptions(NSDictionary*)
+ * from NSFullScreenMode native declaration : :418 + */ + public abstract void exitFullScreenModeWithOptions(NSDictionary options); + + /** + * Original signature : BOOL isInFullScreenMode()
+ * from NSFullScreenMode native declaration : :419 + */ + public abstract boolean isInFullScreenMode(); +} \ No newline at end of file diff --git a/rococoa-contrib/src/main/java/org/rococoa/contrib/appkit/NSVoice.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSVoice.java similarity index 92% rename from rococoa-contrib/src/main/java/org/rococoa/contrib/appkit/NSVoice.java rename to rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSVoice.java index e88b209..43dc858 100755 --- a/rococoa-contrib/src/main/java/org/rococoa/contrib/appkit/NSVoice.java +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSVoice.java @@ -17,7 +17,7 @@ * along with Rococoa. If not, see . */ -package org.rococoa.contrib.appkit; +package org.rococoa.cocoa.appkit; import org.rococoa.cocoa.foundation.NSArray; import org.rococoa.cocoa.foundation.NSDictionary; @@ -26,15 +26,15 @@ import org.rococoa.contrib.AbstractPropertyDictionary; import org.rococoa.contrib.NativeEnum; -import static org.rococoa.contrib.appkit.NSVoice.VoiceProperty.Age; -import static org.rococoa.contrib.appkit.NSVoice.VoiceProperty.DemoText; -import static org.rococoa.contrib.appkit.NSVoice.VoiceProperty.Gender; -import static org.rococoa.contrib.appkit.NSVoice.VoiceProperty.Identifier; -import static org.rococoa.contrib.appkit.NSVoice.VoiceProperty.IndividuallySpokenCharacters; -import static org.rococoa.contrib.appkit.NSVoice.VoiceProperty.Language; -import static org.rococoa.contrib.appkit.NSVoice.VoiceProperty.LocaleIdentifier; -import static org.rococoa.contrib.appkit.NSVoice.VoiceProperty.Name; -import static org.rococoa.contrib.appkit.NSVoice.VoiceProperty.SupportedCharacters; +import static org.rococoa.cocoa.appkit.NSVoice.VoiceProperty.Age; +import static org.rococoa.cocoa.appkit.NSVoice.VoiceProperty.DemoText; +import static org.rococoa.cocoa.appkit.NSVoice.VoiceProperty.Gender; +import static org.rococoa.cocoa.appkit.NSVoice.VoiceProperty.Identifier; +import static org.rococoa.cocoa.appkit.NSVoice.VoiceProperty.IndividuallySpokenCharacters; +import static org.rococoa.cocoa.appkit.NSVoice.VoiceProperty.Language; +import static org.rococoa.cocoa.appkit.NSVoice.VoiceProperty.LocaleIdentifier; +import static org.rococoa.cocoa.appkit.NSVoice.VoiceProperty.Name; +import static org.rococoa.cocoa.appkit.NSVoice.VoiceProperty.SupportedCharacters; /** NSVoice encapsulates the properties of a speech synthesis voice, and can be * used with NSSpeechSynthesizer to change the voice used to spreak. diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSWindow.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSWindow.java new file mode 100644 index 0000000..253dd1f --- /dev/null +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSWindow.java @@ -0,0 +1,1716 @@ +package org.rococoa.cocoa.appkit; + +import org.rococoa.Foundation; +import org.rococoa.ID; +import org.rococoa.ObjCClass; +import org.rococoa.Rococoa; +import org.rococoa.cocoa.CGFloat; +import org.rococoa.cocoa.foundation.NSArray; +import org.rococoa.cocoa.foundation.NSDate; +import org.rococoa.cocoa.foundation.NSDictionary; +import org.rococoa.cocoa.foundation.NSInteger; +import org.rococoa.cocoa.foundation.NSNotification; +import org.rococoa.cocoa.foundation.NSObject; +import org.rococoa.cocoa.foundation.NSPoint; +import org.rococoa.cocoa.foundation.NSRect; +import org.rococoa.cocoa.foundation.NSSize; +import org.rococoa.cocoa.foundation.NSUInteger; +import org.rococoa.cocoa.foundation.NSURL; + + +/// native declaration : :119 +public abstract class NSWindow extends NSResponder { + private static final _Class CLASS = org.rococoa.Rococoa.createClass("NSWindow", _Class.class); + + /// native declaration : line 22 + public static final int NSBorderlessWindowMask = 0; + /// native declaration : line 23 + public static final int NSTitledWindowMask = 1 << 0; + /// native declaration : line 24 + public static final int NSClosableWindowMask = 1 << 1; + /// native declaration : line 25 + public static final int NSMiniaturizableWindowMask = 1 << 2; + /// native declaration : line 26 + public static final int NSResizableWindowMask = 1 << 3; + /** + * Specifies a window with textured background (eg. metal)
+ * native declaration : line 34 + */ + public static final int NSTexturedBackgroundWindowMask = 1 << 8; + /** + * Specifies a window that ignores the userSpaceScaleFactor of the NSScreen on which it is created. Currently + * restricted to borderless windows (NSBorderlessWindowMask)
+ * native declaration : line 42 + */ + public static final int NSUnscaledWindowMask = 1 << 11; + /** + * Specifies a window whose titlebar and toolbar have a unified look - that is, a continuous background
+ * native declaration : line 48 + */ + public static final int NSUnifiedTitleAndToolbarWindowMask = 1 << 12; + /** + * used with NSRunLoop's performSelector:target:argument:order:modes:
+ * native declaration : line 55 + */ + public static final int NSDisplayWindowRunLoopOrdering = 600000; + /** + * used with NSRunLoop's performSelector:target:argument:order:modes:
+ * native declaration : line 56 + */ + public static final int NSResetCursorRectsRunLoopOrdering = 700000; + /** + * Window contents may not be read by another process
+ * native declaration : line 62 + */ + public static final int NSWindowSharingNone = 0; + /** + * Window contents may be read but not modified by another process
+ * native declaration : line 63 + */ + public static final int NSWindowSharingReadOnly = 1; + /** + * Window contents may be read or modified by another process
+ * native declaration : line 64 + */ + public static final int NSWindowSharingReadWrite = 2; + /** + * System determines if window backing store is in VRAM or main memory
+ * native declaration : line 70 + */ + public static final int NSWindowBackingLocationDefault = 0; + /** + * Window backing store is in VRAM
+ * native declaration : line 71 + */ + public static final int NSWindowBackingLocationVideoMemory = 1; + /** + * Window backing store is in main memory
+ * native declaration : line 72 + */ + public static final int NSWindowBackingLocationMainMemory = 2; + /// native declaration : line 78 + public static final int NSWindowCollectionBehaviorDefault = 0; + /// native declaration : line 79 + public static final int NSWindowCollectionBehaviorCanJoinAllSpaces = 1 << 0; + /// native declaration : line 80 + public static final int NSWindowCollectionBehaviorMoveToActiveSpace = 1 << 1; + /** + * You may specify at most one of NSWindowCollectionBehaviorManaged, NSWindowCollectionBehaviorTransient, or + * NSWindowCollectionBehaviorStationary. If unspecified, the window gets the default behavior determined by its + * window level
participates in spaces, expos\u00e9. Default behavior if windowLevel == + * NSNormalWindowLevel
+ * native declaration : line 86 + */ + public static final int NSWindowCollectionBehaviorManaged = 1 << 2; + /** + * You may specify at most one of NSWindowCollectionBehaviorManaged, NSWindowCollectionBehaviorTransient, or + * NSWindowCollectionBehaviorStationary. If unspecified, the window gets the default behavior determined by its + * window level
floats in spaces, hidden by expos\u00e9. Default behavior if windowLevel != + * NSNormalWindowLevel
+ * native declaration : line 87 + */ + public static final int NSWindowCollectionBehaviorTransient = 1 << 3; + /** + * You may specify at most one of NSWindowCollectionBehaviorManaged, NSWindowCollectionBehaviorTransient, or + * NSWindowCollectionBehaviorStationary. If unspecified, the window gets the default behavior determined by its + * window level
unaffected by expos\u00e9. Stays visible and stationary, like desktop window
+ * native declaration : line 88 + */ + public static final int NSWindowCollectionBehaviorStationary = 1 << 4; + /** + * You may specify at most one of NSWindowCollectionBehaviorParticipatesInCycle or + * NSWindowCollectionBehaviorIgnoresCycle. If unspecified, the window gets the default behavior determined by its + * window level
default behavior if windowLevel == NSNormalWindowLevel
+ * native declaration : line 93 + */ + public static final int NSWindowCollectionBehaviorParticipatesInCycle = 1 << 5; + /** + * You may specify at most one of NSWindowCollectionBehaviorParticipatesInCycle or + * NSWindowCollectionBehaviorIgnoresCycle. If unspecified, the window gets the default behavior determined by its + * window level
default behavior if windowLevel != NSNormalWindowLevel
+ * native declaration : line 94 + */ + public static final int NSWindowCollectionBehaviorIgnoresCycle = 1 << 6; + + /// enum values + public interface NSWindowLevel { + int NSNormalWindowLevel = 0; + int NSFloatingWindowLevel = 3; + int NSSubmenuWindowLevel = 3; + int NSTornOffMenuWindowLevel = 3; + int NSMainMenuWindowLevel = 24; + int NSStatusWindowLevel = 25; + int NSModalPanelWindowLevel = 8; + int NSPopUpMenuWindowLevel = 101; + int NSScreenSaverWindowLevel = 1000; + } + + /// enum values + public interface NSWindowCollectionBehavior { + int NSWindowCollectionBehaviorManaged = 1 << 2; // participates in spaces, exposÊ. Default behavior if windowLevel == NSNormalWindowLevel + int NSWindowCollectionBehaviorTransient = 1 << 3; // floats in spaces, hidden by exposÊ. Default behavior if windowLevel != NSNormalWindowLevel + int NSWindowCollectionBehaviorStationary = 1 << 4; // unaffected by exposÊ. Stays visible and stationary, like desktop window + + int NSWindowCollectionBehaviorParticipatesInCycle = 1 << 5; // default behavior if windowLevel == NSNormalWindowLevel + int NSWindowCollectionBehaviorIgnoresCycle = 1 << 6; // default behavior if windowLevel != NSNormalWindowLevel + + int NSWindowNumberListAllApplications = 1 << 0; + int NSWindowNumberListAllSpaces = 1 << 4; + + int NSWindowCollectionBehaviorFullScreenPrimary = 1 << 7; // the frontmost window with this collection behavior will be the fullscreen window. + int NSWindowCollectionBehaviorFullScreenAuxiliary = 1 << 8; // windows with this collection behavior can be shown with the fullscreen window. + } + + /// enum values + public interface NSSelectionDirection { + int NSDirectSelection = 0; + int NSSelectingNext = 1; + int NSSelectingPrevious = 2; + } + + /// enum values + public interface NSWindowButton { + int NSWindowCloseButton = 0; + int NSWindowMiniaturizeButton = 1; + int NSWindowZoomButton = 2; + int NSWindowToolbarButton = 3; + int NSWindowDocumentIconButton = 4; + } + + /// enum values + public interface NSWindowToolbarStyle { + // The default value. The style will be determined by the window's given configuration + int NSWindowToolbarStyleAutomatic = 0; + // The toolbar will appear below the window title + int NSWindowToolbarStyleExpanded = 1; + // The toolbar will appear below the window title and the items in the toolbar will attempt to have equal widths when possible + int NSWindowToolbarStylePreference = 2; + // The window title will appear inline with the toolbar when visible + int NSWindowToolbarStyleUnified = 3; + // Same as NSWindowToolbarStyleUnified, but with reduced margins in the toolbar allowing more focus to be on the contents of the window + int NSWindowToolbarStyleUnifiedCompact = 4; + } + + /// enum values + public interface NSTitlebarSeparatorStyle { + int NSTitlebarSeparatorStyleAutomatic = 0; + int NSTitlebarSeparatorStyleNone = 1; + int NSTitlebarSeparatorStyleLine = 2; + int NSTitlebarSeparatorStyleShadow = 3; + } + + public interface _Class extends ObjCClass { + /** + * native declaration : :217
+ * Conversion Error : NSRect + */ + NSRect contentRectForFrameRect_styleMask(NSRect windowFrame, NSUInteger windowStyle); + + /** + * native declaration : :218
+ * Conversion Error : NSRect + */ + NSRect frameRectForContentRect_styleMask(NSRect cRect, NSUInteger aStyle); + + /** + * Original signature : CGFloat minFrameWidthWithTitle(NSString*, NSUInteger)
+ * native declaration : :219 + */ + CGFloat minFrameWidthWithTitle_styleMask(String aTitle, NSUInteger aStyle); + + /** + * Original signature : defaultDepthLimit()
+ * native declaration : :220 + */ + NSObject defaultDepthLimit(); + + /** + * Original signature : void removeFrameUsingName(NSString*)
+ * native declaration : :473 + */ + void removeFrameUsingName(String name); + + /** + * Original signature : void menuChanged(NSMenu*)
+ * native declaration : :504 + */ + void menuChanged(NSMenu menu); + + /** + * Original signature : NSButton* standardWindowButton(NSWindowButton, NSUInteger)
+ * native declaration : :513 + */ + NSButton standardWindowButton_forStyleMask(int b, int styleMask); + + /** + * @param automatic A Boolean value that indicates whether the app can automatically organize windows into + * tabs. + */ + void setAllowsAutomaticWindowTabbing(boolean automatic); + + /** + * @return A Boolean value that indicates whether the app can automatically organize windows into tabs. + */ + boolean allowsAutomaticWindowTabbing(); + } + + public static void setAllowsAutomaticWindowTabbing(boolean automatic) { + if(Rococoa.cast(CLASS, NSObject.class).respondsToSelector( + Foundation.selector("setAllowsAutomaticWindowTabbing:"))) { + CLASS.setAllowsAutomaticWindowTabbing(automatic); + } + } + + public interface Delegate { + /** + * Tells the delegate that the user has attempted to close a window or the window has received a performClose: + * message. This method is optional. + *

+ * This method may not always be called during window closing. Specifically, this method is not called when a + * user quits an application. You can find additional information on application termination in Graceful + * Application Termination. + * + * @param sender + * @return + */ + boolean windowShouldClose(NSWindow sender); + + /** + * Tells the delegate that the user has attempted to close a window or the window has received a performClose: + * message. This method is optional. + *

+ * You can retrieve the NSWindow object in question by sending object to notification. + * + * @param notification + */ + void windowWillClose(NSNotification notification); + + /** + * Notifies the delegate that the window is about to open a sheet. + * + * @param notification + */ + void windowWillBeginSheet(NSNotification notification); + + /** + * Informs the delegate that the window has become the key window. This method is optional. + *

+ * You can retrieve the window object in question by sending object to notification. + * + * @param notification + */ + void windowDidBecomeKey(NSNotification notification); + + void windowDidBecomeMain(NSNotification notification); + + /** + * Informs the delegate that the window has resigned key window status. This method is optional. + *

+ * You can retrieve the window object in question by sending object to notification. + * + * @param notification + */ + void windowDidResignKey(NSNotification notification); + + void windowDidResignMain(NSNotification notification); + } + + /** + * native declaration : :223
+ * Conversion Error : NSRect + */ + public static CGFloat minFrameWidthWithTitle_styleMask(String aTitle, org.rococoa.cocoa.foundation.NSUInteger aStyle) { + return CLASS.minFrameWidthWithTitle_styleMask(aTitle, aStyle); + } + + /** + * Original signature : +(CGFloat)minFrameWidthWithTitle:(NSString*) styleMask:(NSUInteger)
+ * native declaration : line 248 + */ + public static NSRect contentRectForFrameRect_styleMask(NSRect windowFrame, NSUInteger windowStyle) { + return CLASS.contentRectForFrameRect_styleMask(windowFrame, windowStyle); + } + + /** + * native declaration : :224
+ * Conversion Error : NSRect + */ + public static NSRect frameRectForContentRect_styleMask(NSRect cRect, NSUInteger aStyle) { + return CLASS.frameRectForContentRect_styleMask(cRect, aStyle); + } + + /** + * native declaration : :227
+ * Conversion Error : NSRect + */ + /** + * native declaration : :228
+ * Conversion Error : NSRect + */ + /** + * Original signature : NSString* title()
+ * native declaration : :230 + */ + public abstract String title(); + + /** + * Original signature : void setTitle(NSString*)
+ * native declaration : :231 + */ + public abstract void setTitle(String aString); + + /** + * @return A secondary line of text that appears in the title bar of the window. + */ + public abstract String subtitle(); + + /** + * When this property is the empty string, the system removes the subtitle from the window layout. + * + * @param aString A secondary line of text that appears in the title bar of the window. + */ + public abstract void setSubtitle(String aString); + + /** + * The default value is NSTitlebarSeparatorStyleAutomatic. Changing this value overrides any preference by + * NSSplitViewItem. + * + * @param style The type of separator that the UI displays between the window’s titlebar and its content. + */ + public abstract void setTitlebarSeparatorStyle(int style); + + /** + * setRepresentedURL:
If url is not nil and its path is not empty, the window will show a document icon in the + * titlebar.
If the url represents a filename or other resource with a known icon, that icon will be used as + * the document icon. Otherwise the default document icon will be used. The icon can be customized using + * [[NSWindow standardWindowButton:NSWindowDocumentIconButton] setImage:customImage]. If url is not nil and its + * path is not empty, the window will have a pop-up menu which can be shown via command-click on the area containing + * the document icon and title. By default, this menu will display the path components of the url. The presence + * and contents of this menu can be controlled by the delegate method window:shouldPopUpDocumentPathMenu:If the url + * is nil or has an empty path, the window will not show a document icon and will not have a pop-up menu available + * via command-click.
Original signature : void setRepresentedURL(NSURL*)
+ * native declaration : :237 + */ + public abstract void setRepresentedURL(NSURL url); + + /** + * Original signature : NSURL* representedURL()
+ * native declaration : :238 + */ + public abstract NSURL representedURL(); + + /** + * Original signature : NSString* representedFilename()
+ * native declaration : :240 + */ + public abstract String representedFilename(); + + /** + * Original signature : void setRepresentedFilename(NSString*)
+ * native declaration : :241 + */ + public abstract void setRepresentedFilename(String aString); + + /** + * Original signature : void setTitleWithRepresentedFilename(NSString*)
+ * native declaration : :242 + */ + public abstract void setTitleWithRepresentedFilename(String filename); + + /** + * Original signature : void setExcludedFromWindowsMenu(BOOL)
+ * native declaration : :243 + */ + public abstract void setExcludedFromWindowsMenu(boolean flag); + + /** + * Original signature : BOOL isExcludedFromWindowsMenu()
+ * native declaration : :244 + */ + public abstract boolean isExcludedFromWindowsMenu(); + + /** + * Original signature : void setContentView(NSView*)
+ * native declaration : :245 + */ + public abstract void setContentView(NSView aView); + + /** + * Original signature : id contentView()
+ * native declaration : :246 + */ + public abstract NSView contentView(); + + /** + * Original signature : void setDelegate(id)
+ * native declaration : :247 + */ + public abstract void setDelegate(org.rococoa.ID anObject); + + /** + * Original signature : id delegate()
+ * native declaration : :248 + */ + public abstract org.rococoa.ID delegate(); + + /** + * Original signature : NSInteger windowNumber()
+ * native declaration : :249 + */ + public abstract NSInteger windowNumber(); + + /** + * Original signature : NSUInteger styleMask()
+ * native declaration : :250 + */ + public abstract NSUInteger styleMask(); + + public abstract void setStyleMask(NSUInteger mask); + + /** + * Original signature : NSText* fieldEditor(BOOL, id)
+ * native declaration : :251 + */ + public abstract NSText fieldEditor_forObject(boolean createFlag, NSObject anObject); + + /** + * Original signature : void endEditingFor(id)
+ * native declaration : :252 + */ + public abstract void endEditingFor(NSObject anObject); + /** + * native declaration : :254
+ * Conversion Error : NSRect + */ + /** + * native declaration : :255
+ * Conversion Error : NSRect + */ + /** + * native declaration : :256
+ * Conversion Error : NSSize + */ + /** + * native declaration : :257
+ * Conversion Error : /// Original signature : void setFrameOrigin(null)
- + * (void)setFrameOrigin:(null)aPoint; (Argument aPoint cannot be converted) + */ + public abstract void setFrameOrigin(NSPoint aPoint); + + /** + * native declaration : :258
+ * Conversion Error : /// Original signature : void setFrameTopLeftPoint(null)
- + * (void)setFrameTopLeftPoint:(null)aPoint; (Argument aPoint cannot be converted) + */ + public abstract void setFrameTopLeftPoint(NSPoint aPoint); + + /** + * native declaration : :259
+ * Conversion Error : /// Original signature : cascadeTopLeftFromPoint(null)
- + * (null)cascadeTopLeftFromPoint:(null)topLeftPoint; (Argument topLeftPoint cannot be converted) + */ + public abstract NSPoint cascadeTopLeftFromPoint(NSPoint topLeftPoint); + + /** + * native declaration : :260
+ * Conversion Error : NSRect + */ + public abstract NSRect frame(); + + /** + * native declaration : :265
+ * Conversion Error : NSRect + */ + public abstract void setFrame_display_animate(NSRect frameRect, boolean displayFlag, boolean animateFlag); + /** + * native declaration : :268
+ * Conversion Error : NSRect + */ + /** + * show/hide resize corner (does not affect whether window is resizable)
Original signature : void + * setShowsResizeIndicator(BOOL)
+ * native declaration : :271 + */ + public abstract void setShowsResizeIndicator(boolean show); + + /** + * Original signature : BOOL showsResizeIndicator()
+ * native declaration : :272 + */ + public abstract boolean showsResizeIndicator(); + /** + * native declaration : :274
+ * Conversion Error : NSSize + */ + /** + * native declaration : :275
+ * Conversion Error : NSSize + */ + /** + * native declaration : :276
+ * Conversion Error : NSSize + */ + /** + * native declaration : :277
+ * Conversion Error : NSSize + */ + /** + * native declaration : :280
+ * Conversion Error : NSSize + */ + /** + * native declaration : :281
+ * Conversion Error : NSSize + */ + /** + * native declaration : :282
+ * Conversion Error : NSSize + */ + /** + * native declaration : :283
+ * Conversion Error : NSSize + */ + /** + * Original signature : void useOptimizedDrawing(BOOL)
+ * native declaration : :286 + */ + public abstract void useOptimizedDrawing(boolean flag); + + /** + * Original signature : void disableFlushWindow()
+ * native declaration : :287 + */ + public abstract void disableFlushWindow(); + + /** + * Original signature : void enableFlushWindow()
+ * native declaration : :288 + */ + public abstract void enableFlushWindow(); + + /** + * Original signature : BOOL isFlushWindowDisabled()
+ * native declaration : :289 + */ + public abstract boolean isFlushWindowDisabled(); + + /** + * Original signature : void flushWindow()
+ * native declaration : :290 + */ + public abstract void flushWindow(); + + /** + * Original signature : void flushWindowIfNeeded()
+ * native declaration : :291 + */ + public abstract void flushWindowIfNeeded(); + + /** + * Original signature : void setViewsNeedDisplay(BOOL)
+ * native declaration : :292 + */ + public abstract void setViewsNeedDisplay(boolean flag); + + /** + * Original signature : BOOL viewsNeedDisplay()
+ * native declaration : :293 + */ + public abstract boolean viewsNeedDisplay(); + + /** + * Original signature : void displayIfNeeded()
+ * native declaration : :294 + */ + public abstract void displayIfNeeded(); + + /** + * Original signature : void display()
+ * native declaration : :295 + */ + public abstract void display(); + + /** + * Original signature : void setAutodisplay(BOOL)
+ * native declaration : :296 + */ + public abstract void setAutodisplay(boolean flag); + + /** + * Original signature : BOOL isAutodisplay()
+ * native declaration : :297 + */ + public abstract boolean isAutodisplay(); + + /** + * Original signature : BOOL preservesContentDuringLiveResize()
+ * native declaration : :300 + */ + public abstract boolean preservesContentDuringLiveResize(); + + /** + * Original signature : void setPreservesContentDuringLiveResize(BOOL)
+ * native declaration : :301 + */ + public abstract void setPreservesContentDuringLiveResize(boolean flag); + + /** + * Original signature : void update()
+ * native declaration : :304 + */ + public abstract void update(); + + /** + * Original signature : BOOL makeFirstResponder(NSResponder*)
+ * native declaration : :305 + */ + public abstract boolean makeFirstResponder(NSResponder aResponder); + + /** + * Original signature : NSResponder* firstResponder()
+ * native declaration : :306 + */ + public abstract NSResponder firstResponder(); + + /** + * Original signature : NSInteger resizeFlags()
+ * native declaration : :307 + */ + public abstract int resizeFlags(); + + /** + * Original signature : void close()
+ * native declaration : :309 + */ + public abstract void close(); + + /** + * Original signature : void setReleasedWhenClosed(BOOL)
+ * native declaration : :310 + */ + public abstract void setReleasedWhenClosed(boolean flag); + + /** + * Original signature : BOOL isReleasedWhenClosed()
+ * native declaration : :311 + */ + public abstract boolean isReleasedWhenClosed(); + + /** + * Original signature : void miniaturize(id)
+ * native declaration : :312 + */ + public abstract void miniaturize(final ID sender); + + /** + * Original signature : void deminiaturize(id)
+ * native declaration : :313 + */ + public abstract void deminiaturize(final ID sender); + + /** + * Original signature : BOOL isZoomed()
+ * native declaration : :314 + */ + public abstract boolean isZoomed(); + + /** + * Original signature : void zoom(id)
+ * native declaration : :315 + */ + public abstract void zoom(final ID sender); + + /** + * Original signature : BOOL isMiniaturized()
+ * native declaration : :316 + */ + public abstract boolean isMiniaturized(); + /** + * native declaration : :317
+ * Conversion Error : /// Original signature : BOOL tryToPerform(null, id)
+ * - (BOOL)tryToPerform:(null)anAction with:(id)anObject; (Argument anAction cannot be converted) + */ + /** + * Original signature : id validRequestorForSendType(NSString*, NSString*)
+ * native declaration : :318 + */ + public abstract NSObject validRequestorForSendType_returnType(com.sun.jna.Pointer sendType, com.sun.jna.Pointer returnType); + + /** + * Original signature : void setBackgroundColor(NSColor*)
+ * native declaration : :319 + */ + public abstract void setBackgroundColor(NSColor color); + + /** + * Original signature : NSColor* backgroundColor()
+ * native declaration : :320 + */ + public abstract NSColor backgroundColor(); + /** + * native declaration : :323
+ * Conversion Error : /// Original signature : void setContentBorderThickness(CGFloat, null)
+ * - (void)setContentBorderThickness:(CGFloat)thickness forEdge:(null)edge; (Argument edge cannot be converted) + */ + /** + * native declaration : :324
+ * Conversion Error : /// Original signature : CGFloat contentBorderThicknessForEdge(null)
+ * - (CGFloat)contentBorderThicknessForEdge:(null)edge; (Argument edge cannot be converted) + */ + /** + * native declaration : :326
+ * Conversion Error : /// Original signature : void setAutorecalculatesContentBorderThickness(BOOL, null)
+ * - (void)setAutorecalculatesContentBorderThickness:(BOOL)flag forEdge:(null)edge; (Argument edge cannot be converted) + */ + /** + * native declaration : :327
+ * Conversion Error : /// Original signature : BOOL autorecalculatesContentBorderThicknessForEdge(null)
+ * - (BOOL)autorecalculatesContentBorderThicknessForEdge:(null)edge; (Argument edge cannot be converted) + */ + /** + * Original signature : void setMovableByWindowBackground(BOOL)
+ * native declaration : :331 + */ + public abstract void setMovableByWindowBackground(boolean flag); + + /** + * Original signature : BOOL isMovableByWindowBackground()
+ * native declaration : :332 + */ + public abstract boolean isMovableByWindowBackground(); + + /** + * Original signature : void setHidesOnDeactivate(BOOL)
+ * native declaration : :335 + */ + public abstract void setHidesOnDeactivate(boolean flag); + + /** + * Original signature : BOOL hidesOnDeactivate()
+ * native declaration : :336 + */ + public abstract boolean hidesOnDeactivate(); + + /** + * indicate whether a window can be hidden during -[NSApplication hide:]. Default is YES
Original signature : + * void setCanHide(BOOL)
+ * native declaration : :339 + */ + public abstract void setCanHide(boolean flag); + + /** + * Original signature : BOOL canHide()
+ * native declaration : :340 + */ + public abstract boolean canHide(); + + /** + * Original signature : void center()
+ * native declaration : :342 + */ + public abstract void center(); + + /** + * Original signature : void makeKeyAndOrderFront(id)
+ * native declaration : :343 + */ + public abstract void makeKeyAndOrderFront(final ID sender); + + /** + * Original signature : void orderFront(id)
+ * native declaration : :344 + */ + public abstract void orderFront(final ID sender); + + /** + * Original signature : void orderBack(id)
+ * native declaration : :345 + */ + public abstract void orderBack(final ID sender); + + /** + * Original signature : void orderOut(id)
+ * native declaration : :346 + */ + public abstract void orderOut(final ID sender); + /** + * native declaration : :347
+ * Conversion Error : /// Original signature : void orderWindow(null, NSInteger)
+ * - (void)orderWindow:(null)place relativeTo:(NSInteger)otherWin; (Argument place cannot be converted) + */ + /** + * Original signature : void orderFrontRegardless()
+ * native declaration : :348 + */ + public abstract void orderFrontRegardless(); + + /** + * Original signature : void setMiniwindowImage(NSImage*)
+ * native declaration : :350 + */ + public abstract void setMiniwindowImage(NSImage image); + + /** + * Original signature : void setMiniwindowTitle(NSString*)
+ * native declaration : :351 + */ + public abstract void setMiniwindowTitle(String title); + + /** + * Original signature : NSImage* miniwindowImage()
+ * native declaration : :352 + */ + public abstract NSImage miniwindowImage(); + + /** + * Original signature : NSString* miniwindowTitle()
+ * native declaration : :353 + */ + public abstract String miniwindowTitle(); + + /** + * Original signature : NSDockTile* dockTile()
+ * native declaration : :356 + */ + public abstract NSDockTile dockTile(); + + /** + * Original signature : void setDocumentEdited(BOOL)
+ * native declaration : :359 + */ + public abstract void setDocumentEdited(boolean flag); + + /** + * Original signature : BOOL isDocumentEdited()
+ * native declaration : :360 + */ + public abstract boolean isDocumentEdited(); + + /** + * Original signature : BOOL isVisible()
+ * native declaration : :361 + */ + public abstract boolean isVisible(); + + /** + * Original signature : BOOL isKeyWindow()
+ * native declaration : :362 + */ + public abstract boolean isKeyWindow(); + + /** + * Original signature : BOOL isMainWindow()
+ * native declaration : :363 + */ + public abstract boolean isMainWindow(); + + /** + * Original signature : BOOL canBecomeKeyWindow()
+ * native declaration : :364 + */ + public abstract boolean canBecomeKeyWindow(); + + /** + * Original signature : BOOL canBecomeMainWindow()
+ * native declaration : :365 + */ + public abstract boolean canBecomeMainWindow(); + + /** + * Original signature : void makeKeyWindow()
+ * native declaration : :366 + */ + public abstract void makeKeyWindow(); + + /** + * Original signature : void makeMainWindow()
+ * native declaration : :367 + */ + public abstract void makeMainWindow(); + + /** + * Original signature : void becomeKeyWindow()
+ * native declaration : :368 + */ + public abstract void becomeKeyWindow(); + + /** + * Original signature : void resignKeyWindow()
+ * native declaration : :369 + */ + public abstract void resignKeyWindow(); + + /** + * Original signature : void becomeMainWindow()
+ * native declaration : :370 + */ + public abstract void becomeMainWindow(); + + /** + * Original signature : void resignMainWindow()
+ * native declaration : :371 + */ + public abstract void resignMainWindow(); + + /** + * Original signature : BOOL worksWhenModal()
+ * native declaration : :373 + */ + public abstract boolean worksWhenModal(); + /** + * native declaration : :374
+ * Conversion Error : /// Original signature : convertBaseToScreen(null)
+ * - (null)convertBaseToScreen:(null)aPoint; (Argument aPoint cannot be converted) + */ + /** + * native declaration : :375
+ * Conversion Error : /// Original signature : convertScreenToBase(null)
+ * - (null)convertScreenToBase:(null)aPoint; (Argument aPoint cannot be converted) + */ + /** + * Original signature : void performClose(id)
+ * native declaration : :376 + */ + public abstract void performClose(final ID sender); + + /** + * Original signature : void performMiniaturize(id)
+ * native declaration : :377 + */ + public abstract void performMiniaturize(final ID sender); + + /** + * Original signature : void performZoom(id)
+ * native declaration : :378 + */ + public abstract void performZoom(final ID sender); + + /** + * Original signature : NSInteger gState()
+ * native declaration : :379 + */ + public abstract int gState(); + + /** + * Original signature : void setOneShot(BOOL)
+ * native declaration : :380 + */ + public abstract void setOneShot(boolean flag); + + /** + * Original signature : BOOL isOneShot()
+ * native declaration : :381 + */ + public abstract boolean isOneShot(); + /** + * native declaration : :382
+ * Conversion Error : NSRect + */ + /** + * native declaration : :383
+ * Conversion Error : NSRect + */ + /** + * Original signature : void print(id)
+ * native declaration : :384 + */ + public abstract void print(final ID sender); + + /** + * Original signature : void disableCursorRects()
+ * native declaration : :386 + */ + public abstract void disableCursorRects(); + + /** + * Original signature : void enableCursorRects()
+ * native declaration : :387 + */ + public abstract void enableCursorRects(); + + /** + * Original signature : void discardCursorRects()
+ * native declaration : :388 + */ + public abstract void discardCursorRects(); + + /** + * Original signature : BOOL areCursorRectsEnabled()
+ * native declaration : :389 + */ + public abstract boolean areCursorRectsEnabled(); + + /** + * Original signature : void invalidateCursorRectsForView(NSView*)
+ * native declaration : :390 + */ + public abstract void invalidateCursorRectsForView(com.sun.jna.Pointer aView); + + /** + * Original signature : void resetCursorRects()
+ * native declaration : :391 + */ + public abstract void resetCursorRects(); + + /** + * Original signature : void setAllowsToolTipsWhenApplicationIsInactive(BOOL)
+ * native declaration : :394 + */ + public abstract void setAllowsToolTipsWhenApplicationIsInactive(boolean allowWhenInactive); + + /** + * Original signature : BOOL allowsToolTipsWhenApplicationIsInactive()
+ * native declaration : :397 + */ + public abstract boolean allowsToolTipsWhenApplicationIsInactive(); + /** + * native declaration : :401
+ * Conversion Error : /// Original signature : void setBackingType(null)
+ * - (void)setBackingType:(null)bufferingType; (Argument bufferingType cannot be converted) + */ + /** + * Original signature : backingType()
+ * native declaration : :402 + */ + public abstract NSObject backingType(); + + /** + * Original signature : void setLevel(NSInteger)
+ * native declaration : :403 + */ + public abstract void setLevel(int newLevel); + + /** + * Original signature : NSInteger level()
+ * native declaration : :404 + */ + public abstract int level(); + /** + * native declaration : :405
+ * Conversion Error : /// Original signature : void setDepthLimit(null)
+ * - (void)setDepthLimit:(null)limit; (Argument limit cannot be converted) + */ + /** + * Original signature : depthLimit()
+ * native declaration : :406 + */ + public abstract NSObject depthLimit(); + + /** + * Original signature : void setDynamicDepthLimit(BOOL)
+ * native declaration : :407 + */ + public abstract void setDynamicDepthLimit(boolean flag); + + /** + * Original signature : BOOL hasDynamicDepthLimit()
+ * native declaration : :408 + */ + public abstract boolean hasDynamicDepthLimit(); + + /** + * Original signature : NSScreen* screen()
+ * native declaration : :409 + */ + public abstract com.sun.jna.Pointer screen(); + + /** + * Original signature : NSScreen* deepestScreen()
+ * native declaration : :410 + */ + public abstract com.sun.jna.Pointer deepestScreen(); + + /** + * Original signature : BOOL canStoreColor()
+ * native declaration : :411 + */ + public abstract boolean canStoreColor(); + + /** + * Original signature : void setHasShadow(BOOL)
+ * native declaration : :412 + */ + public abstract void setHasShadow(boolean hasShadow); + + /** + * Original signature : BOOL hasShadow()
+ * native declaration : :413 + */ + public abstract boolean hasShadow(); + + /** + * Original signature : void invalidateShadow()
+ * native declaration : :415 + */ + public abstract void invalidateShadow(); + + /** + * Original signature : void setAlphaValue(CGFloat)
+ * native declaration : :417 + */ + public abstract void setAlphaValue(CGFloat windowAlpha); + + /** + * Original signature : CGFloat alphaValue()
+ * native declaration : :418 + */ + public abstract CGFloat alphaValue(); + + /** + * Original signature : void setOpaque(BOOL)
+ * native declaration : :419 + */ + public abstract void setOpaque(boolean isOpaque); + + /** + * Original signature : BOOL isOpaque()
+ * native declaration : :420 + */ + public abstract boolean isOpaque(); + + /** + * -setSharingType: specifies whether the window content can be read and/or written from another process. The + * default sharing type is NSWindowSharingReadOnly, which means other processes can read the window content (eg. for + * window capture) but cannot modify it. If you set your window sharing type to NSWindowSharingNone, so that the + * content cannot be captured, your window will also not be able to participate in a number of system services, so + * this setting should be used with caution. If you set your window sharing type to NSWindowSharingReadWrite, other + * processes can both read and modify the window content.
Original signature : void + * setSharingType(NSWindowSharingType)
+ * native declaration : :426 + */ + public abstract void setSharingType(int type); + + /** + * Original signature : NSWindowSharingType sharingType()
+ * native declaration : :427 + */ + public abstract int sharingType(); + + /** + * -setPreferredBackingLocation: sets the preferred location for the window backing store. In general, you should + * not use this API unless indicated by performance measurement.
Original signature : void + * setPreferredBackingLocation(NSWindowBackingLocation)
+ * native declaration : :431 + */ + public abstract void setPreferredBackingLocation(int backingLocation); + + /** + * -preferredBackingLocation gets the preferred location for the window backing store. This may be different from + * the actual location.
Original signature : NSWindowBackingLocation preferredBackingLocation()
+ * native declaration : :434 + */ + public abstract int preferredBackingLocation(); + + /** + * -backingLocation gets the current location of the window backing store.
Original signature : + * NSWindowBackingLocation backingLocation()
+ * native declaration : :437 + */ + public abstract int backingLocation(); + + /** + * Original signature : BOOL displaysWhenScreenProfileChanges()
+ * native declaration : :442 + */ + public abstract boolean displaysWhenScreenProfileChanges(); + + /** + * Original signature : void setDisplaysWhenScreenProfileChanges(BOOL)
+ * native declaration : :443 + */ + public abstract void setDisplaysWhenScreenProfileChanges(boolean flag); + + /** + * Original signature : void disableScreenUpdatesUntilFlush()
+ * native declaration : :445 + */ + public abstract void disableScreenUpdatesUntilFlush(); + + /** + * This API controls whether the receiver is permitted onscreen before the user has logged in. This property is off + * by default. Alert panels and windows presented by input managers are examples of windows which should have this + * property set.
Original signature : BOOL canBecomeVisibleWithoutLogin()
+ * native declaration : :451 + */ + public abstract boolean canBecomeVisibleWithoutLogin(); + + /** + * Original signature : void setCanBecomeVisibleWithoutLogin(BOOL)
+ * native declaration : :452 + */ + public abstract void setCanBecomeVisibleWithoutLogin(boolean flag); + + /** + * Original signature : void setCollectionBehavior(NSWindowCollectionBehavior)
+ * native declaration : :455 + */ + public abstract void setCollectionBehavior(int behavior); + + /** + * Original signature : NSWindowCollectionBehavior collectionBehavior()
+ * native declaration : :456 + */ + public abstract int collectionBehavior(); + + /** + * -setCanBeVisibleOnAllSpaces: controls whether a window can be visible on all spaces (YES) or is associated with + * one space at a time (NO). The default setting is NO.
Original signature : BOOL + * canBeVisibleOnAllSpaces()
+ * native declaration : :462 + */ + public abstract boolean canBeVisibleOnAllSpaces(); + + /** + * Original signature : void setCanBeVisibleOnAllSpaces(BOOL)
+ * native declaration : :463 + */ + public abstract void setCanBeVisibleOnAllSpaces(boolean flag); + + /** + * Original signature : NSString* stringWithSavedFrame()
+ * native declaration : :465 + */ + public abstract String stringWithSavedFrame(); + + /** + * Original signature : void setFrameFromString(NSString*)
+ * native declaration : :466 + */ + public abstract void setFrameFromString(String string); + + /** + * Original signature : void saveFrameUsingName(NSString*)
+ * native declaration : :467 + */ + public abstract void saveFrameUsingName(String name); + + /** + * Set force=YES to use setFrameUsingName on a non-resizable window
Original signature : BOOL + * setFrameUsingName(NSString*, BOOL)
+ * native declaration : :469 + */ + public abstract boolean setFrameUsingName_force(String name, boolean force); + + /** + * Original signature : BOOL setFrameUsingName(NSString*)
+ * native declaration : :470 + */ + public abstract boolean setFrameUsingName(String name); + + /** + * Original signature : BOOL setFrameAutosaveName(NSString*)
+ * native declaration : :471 + */ + public abstract boolean setFrameAutosaveName(String name); + + /** + * Original signature : NSString* frameAutosaveName()
+ * native declaration : :472 + */ + public abstract String frameAutosaveName(); + /** + * native declaration : :476
+ * Conversion Error : NSRect + */ + /** + * Original signature : void restoreCachedImage()
+ * native declaration : :477 + */ + public abstract void restoreCachedImage(); + + /** + * Original signature : void discardCachedImage()
+ * native declaration : :478 + */ + public abstract void discardCachedImage(); + + /** + * native declaration : :480
+ * Conversion Error : NSSize + */ + public abstract NSSize minSize(); + + /** + * native declaration : :481
+ * Conversion Error : NSSize + */ + public abstract NSSize maxSize(); + + /** + * native declaration : :482
+ * Conversion Error : NSSize + */ + public abstract void setMinSize(NSSize size); + + /** + * native declaration : :483
+ * Conversion Error : NSSize + */ + public abstract void setMaxSize(NSSize size); + + /** + * native declaration : :485
+ * Conversion Error : NSSize + */ + public abstract void setContentMinSize(NSSize size); + + /** + * native declaration : :486
+ * Conversion Error : NSSize + */ + public abstract void setContentMaxSize(NSSize size); + /** + * native declaration : :487
+ * Conversion Error : NSSize + */ + /** + * native declaration : :488
+ * Conversion Error : NSSize + */ + /** + * Original signature : NSEvent* nextEventMatchingMask(NSUInteger)
+ * native declaration : :490 + */ + public abstract NSEvent nextEventMatchingMask(int mask); + + /** + * Original signature : NSEvent* nextEventMatchingMask(NSUInteger, NSDate*, NSString*, BOOL)
+ * native declaration : :491 + */ + public abstract NSEvent nextEventMatchingMask_untilDate_inMode_dequeue(int mask, NSDate expiration, String mode, boolean deqFlag); + + /** + * Original signature : void discardEventsMatchingMask(NSUInteger, NSEvent*)
+ * native declaration : :492 + */ + public abstract void discardEventsMatchingMask_beforeEvent(int mask, com.sun.jna.Pointer lastEvent); + + /** + * Original signature : void postEvent(NSEvent*, BOOL)
+ * native declaration : :493 + */ + public abstract void postEvent_atStart(NSEvent event, boolean flag); + + /** + * Original signature : NSEvent* currentEvent()
+ * native declaration : :494 + */ + public abstract NSEvent currentEvent(); + + /** + * Original signature : void setAcceptsMouseMovedEvents(BOOL)
+ * native declaration : :495 + */ + public abstract void setAcceptsMouseMovedEvents(boolean flag); + + /** + * Original signature : BOOL acceptsMouseMovedEvents()
+ * native declaration : :496 + */ + public abstract boolean acceptsMouseMovedEvents(); + + /** + * Original signature : void setIgnoresMouseEvents(BOOL)
+ * native declaration : :498 + */ + public abstract void setIgnoresMouseEvents(boolean flag); + + /** + * Original signature : BOOL ignoresMouseEvents()
+ * native declaration : :499 + */ + public abstract boolean ignoresMouseEvents(); + + /** + * Original signature : NSDictionary* deviceDescription()
+ * native declaration : :501 + */ + public abstract NSDictionary deviceDescription(); + + /** + * Original signature : void sendEvent(NSEvent*)
+ * native declaration : :502 + */ + public abstract void sendEvent(NSEvent theEvent); + + /** + * Original signature : mouseLocationOutsideOfEventStream()
+ * native declaration : :503 + */ + public abstract NSObject mouseLocationOutsideOfEventStream(); + + /** + * Original signature : id windowController()
+ * native declaration : :506 + */ + public abstract NSObject windowController(); + + /** + * Original signature : void setWindowController(NSWindowController*)
+ * native declaration : :507 + */ + public abstract void setWindowController(NSObject windowController); + + /** + * Original signature : BOOL isSheet()
+ * native declaration : :509 + */ + public abstract boolean isSheet(); + + /** + * Original signature : NSWindow* attachedSheet()
+ * native declaration : :510 + */ + public abstract NSWindow attachedSheet(); + + /** + * Original signature : NSButton* standardWindowButton(NSWindowButton)
+ * native declaration : :514 + */ + public abstract NSButton standardWindowButton(int b); + /** + * native declaration : :518
+ * Conversion Error : /// Original signature : void addChildWindow(NSWindow*, null)
+ * - (void)addChildWindow:(NSWindow*)childWin ordered:(null)place; (Argument place cannot be converted) + */ + /** + * Original signature : void removeChildWindow(NSWindow*)
+ * native declaration : :519 + */ + public abstract void removeChildWindow(NSWindow childWin); + + /** + * Original signature : NSArray* childWindows()
+ * native declaration : :520 + */ + public abstract NSArray childWindows(); + + /** + * Original signature : NSWindow* parentWindow()
+ * native declaration : :522 + */ + public abstract NSWindow parentWindow(); + + /** + * Original signature : void setParentWindow(NSWindow*)
+ * native declaration : :523 + */ + public abstract void setParentWindow(NSWindow window); + + /** + * Returns NSGraphicsContext used to render the receiver's content on the screen for the calling thread.
+ * Original signature : NSGraphicsContext* graphicsContext()
+ * native declaration : :529 + */ + public abstract com.sun.jna.Pointer graphicsContext(); + + /** + * Returns scale factor applied to view coordinate system to get to base coordinate system of window
Original + * signature : CGFloat userSpaceScaleFactor()
+ * native declaration : :533 + */ + public abstract CGFloat userSpaceScaleFactor(); + + /** + * Original signature : void setInitialFirstResponder(NSView*)
+ * from NSKeyboardUI native declaration : :539 + */ + public abstract void setInitialFirstResponder(NSView view); + + /** + * Original signature : NSView* initialFirstResponder()
+ * from NSKeyboardUI native declaration : :540 + */ + public abstract NSView initialFirstResponder(); + + /** + * Original signature : void selectNextKeyView(id)
+ * from NSKeyboardUI native declaration : :541 + */ + public abstract void selectNextKeyView(final ID sender); + + /** + * Original signature : void selectPreviousKeyView(id)
+ * from NSKeyboardUI native declaration : :542 + */ + public abstract void selectPreviousKeyView(final ID sender); + + /** + * Original signature : void selectKeyViewFollowingView(NSView*)
+ * from NSKeyboardUI native declaration : :543 + */ + public abstract void selectKeyViewFollowingView(NSView aView); + + /** + * Original signature : void selectKeyViewPrecedingView(NSView*)
+ * from NSKeyboardUI native declaration : :544 + */ + public abstract void selectKeyViewPrecedingView(NSView aView); + + /** + * Original signature : NSSelectionDirection keyViewSelectionDirection()
+ * from NSKeyboardUI native declaration : :545 + */ + public abstract int keyViewSelectionDirection(); + + /** + * Original signature : void setDefaultButtonCell(NSButtonCell*)
+ * from NSKeyboardUI native declaration : :546 + */ + public abstract void setDefaultButtonCell(NSButtonCell defButt); + + /** + * Original signature : NSButtonCell* defaultButtonCell()
+ * from NSKeyboardUI native declaration : :547 + */ + public abstract NSButtonCell defaultButtonCell(); + + /** + * Original signature : void disableKeyEquivalentForDefaultButtonCell()
+ * from NSKeyboardUI native declaration : :548 + */ + public abstract void disableKeyEquivalentForDefaultButtonCell(); + + /** + * Original signature : void enableKeyEquivalentForDefaultButtonCell()
+ * from NSKeyboardUI native declaration : :549 + */ + public abstract void enableKeyEquivalentForDefaultButtonCell(); + + /** + * Original signature : void setAutorecalculatesKeyViewLoop(BOOL)
+ * from NSKeyboardUI native declaration : :551 + */ + public abstract void setAutorecalculatesKeyViewLoop(boolean flag); + + /** + * Original signature : BOOL autorecalculatesKeyViewLoop()
+ * from NSKeyboardUI native declaration : :552 + */ + public abstract boolean autorecalculatesKeyViewLoop(); + + /** + * Original signature : void recalculateKeyViewLoop()
+ * from NSKeyboardUI native declaration : :553 + */ + public abstract void recalculateKeyViewLoop(); + + /** + * Original signature : void setToolbar(NSToolbar*)
+ * from NSToolbarSupport native declaration : :558 + */ + public abstract void setToolbar(NSToolbar toolbar); + + /** + * The style of the titlebar area when the window displays a toolbar. + * + * @param toolbarStyle {@link NSWindowToolbarStyle} + */ + public abstract void setToolbarStyle(int toolbarStyle); + + /** + * Original signature : NSToolbar* toolbar()
+ * from NSToolbarSupport native declaration : :559 + */ + public abstract NSToolbar toolbar(); + + /** + * Original signature : void toggleToolbarShown(id)
+ * from NSToolbarSupport native declaration : :560 + */ + public abstract void toggleToolbarShown(final ID sender); + + /** + * Original signature : void runToolbarCustomizationPalette(id)
+ * from NSToolbarSupport native declaration : :561 + */ + public abstract void runToolbarCustomizationPalette(final ID sender); + + /** + * Original signature : void setShowsToolbarButton(BOOL)
+ * from NSToolbarSupport native declaration : :563 + */ + public abstract void setShowsToolbarButton(boolean show); + + /** + * Original signature : BOOL showsToolbarButton()
+ * from NSToolbarSupport native declaration : :564 + */ + public abstract boolean showsToolbarButton(); + /** + * from NSDrag native declaration : :569
+ * Conversion Error : /// Original signature : void dragImage(NSImage*, null, NSSize, NSEvent*, NSPasteboard*, id, BOOL)
+ * - (void)dragImage:(NSImage*)anImage at:(null)baseLocation offset:(NSSize)initialOffset event:(NSEvent*)event pasteboard:(NSPasteboard*)pboard source:(id)sourceObj slideBack:(BOOL)slideFlag; (Argument baseLocation cannot be converted) + */ + /** + * Original signature : void registerForDraggedTypes(NSArray*)
+ * from NSDrag native declaration : :571 + */ + public abstract void registerForDraggedTypes(NSArray types); + + /** + * Original signature : void unregisterDraggedTypes()
+ * from NSDrag native declaration : :572 + */ + public abstract void unregisterDraggedTypes(); + + public static final String WindowDidBecomeKeyNotification = "NSWindowDidBecomeKeyNotification"; + public static final String WindowDidBecomeMainNotification = "NSWindowDidBecomeMainNotification"; + public static final String WindowDidChangeScreenNotification = "NSWindowDidChangeScreenNotification"; + public static final String WindowDidChangeScreenProfileNotification = "NSWindowDidChangeScreenProfileNotification"; + public static final String WindowDidDeminiaturizeNotification = "NSWindowDidDeminiaturizeNotification"; + public static final String WindowDidEndSheetNotification = "NSWindowDidEndSheetNotification"; + public static final String WindowDidExposeNotification = "NSWindowDidExposeNotification"; + public static final String WindowDidMiniaturizeNotification = "NSWindowDidMiniaturizeNotification"; + public static final String WindowDidMoveNotification = "NSWindowDidMoveNotification"; + public static final String WindowDidResignKeyNotification = "NSWindowDidResignKeyNotification"; + public static final String WindowDidResignMainNotification = "NSWindowDidResignMainNotification"; + public static final String WindowDidResizeNotification = "NSWindowDidResizeNotification"; + public static final String WindowDidUpdateNotification = "NSWindowDidUpdateNotification"; + public static final String WindowWillBeginSheetNotification = "NSWindowWillBeginSheetNotification"; + public static final String WindowWillCloseNotification = "NSWindowWillCloseNotification"; + public static final String WindowWillMiniaturizeNotification = "NSWindowWillMiniaturizeNotification"; + public static final String WindowWillMoveNotification = "NSWindowWillMoveNotification"; + + public abstract void addTitlebarAccessoryViewController(NSTitlebarAccessoryViewController controller); + + /** + * @return A value that allows a group of related windows. + */ + public abstract String tabbingIdentifier(); + + /** + * By default, a window generates a tabbing identifier from inherent window properties, such as the window class + * name, the delegate class name, the window controller class name, and some additional state. Group windows + * together by using the same tabbing identifier. + * + * @param identifier A value that allows a group of related windows. + */ + public abstract void setTabbingIdentifier(String identifier); + + /** + * @return A Boolean value that indicates whether the window prevents application termination when modal. The value + * of this property is YES if the window prevents application termination when modal; otherwise, NO. The default + * value is YES. + */ + public abstract boolean preventsApplicationTerminationWhenModal(); + + /** + * Usually, application termination is prevented when a modal window or sheet is open, without consulting the + * application delegate. Some windows may wish not to prevent termination, however. Setting this property to NO + * overrides the default behavior and allows termination to proceed even if the window is open, either through the + * sudden termination path if enabled, or after consulting the application delegate. + * + * @param value A Boolean value that indicates whether the window prevents application termination when modal. + */ + public abstract void setPreventsApplicationTerminationWhenModal(final boolean value); + + /** + * When the value of this property is true, the title bar does not draw its background, which allows all content + * underneath it to show through. It only makes sense to set this property to true when + * NSFullSizeContentViewWindowMask is also set. + * + * @param value A Boolean value that indicates whether the title bar draws its background. + */ + public abstract void setTitlebarAppearsTransparent(final boolean value); +} \ No newline at end of file diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/coregraphics/CGImage.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/coregraphics/CGImage.java new file mode 100644 index 0000000..41d4752 --- /dev/null +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/coregraphics/CGImage.java @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2022 by Naohide Sano, All rights reserved. + * + * Programmed by Naohide Sano + */ + +package org.rococoa.cocoa.coregraphics; + +import java.awt.Graphics; +import java.awt.Image; +import java.awt.image.ImageObserver; +import java.awt.image.ImageProducer; +import java.io.IOException; +import java.io.InputStream; +import java.nio.ByteBuffer; +import java.nio.channels.Channels; + +import com.sun.jna.Pointer; +import org.rococoa.cocoa.appkit.NSImage; +import org.rococoa.cocoa.coreimage.CIImage; +import org.rococoa.cocoa.foundation.NSData; + +import static org.rococoa.cocoa.coregraphics.CGLibrary.library; + + +/** + * CGImage. + * + * @author Naohide Sano (nsano) + * @version 0.00 2022-09-11 nsano initial version
+ */ +public class CGImage extends Image { + + /** */ + private Pointer/*CGImageRef*/ image; + + /** utility NSImage -> CGImageRef */ + private static Pointer/*CGImageRef*/ initFrom(InputStream stream) throws IOException { + ByteBuffer bb = ByteBuffer.allocate(stream.available() != -1 ? stream.available() : Integer.MAX_VALUE / 2); + int l = 0; + while (l < bb.capacity()) { + int r = Channels.newChannel(stream).read(bb); + if (r < 0) break; + l += r; + } + + NSImage image = NSImage.imageWithData(NSData.dataWithBytes(bb.array())); + return image.CGImageForProposedRect_context_hints(null, null, null); + } + + /** */ + public CGImage(InputStream stream) throws IOException { + this.image = initFrom(stream); + } + + /** */ + public void dispose() { + library.CGImageRelease(image); + } + + /** */ + public int getWidth() { + return library.CGImageGetWidth(image); + } + + /** */ + public int getHeight() { + return library.CGImageGetHeight(image); + } + + @Override + public int getWidth(ImageObserver observer) { + return getWidth(); + } + + @Override + public int getHeight(ImageObserver observer) { + return getHeight(); + } + + @Override + public ImageProducer getSource() { + return null; + } + + @Override + public Graphics getGraphics() { + return null; + } + + @Override + public Object getProperty(String name, ImageObserver observer) { + return null; + } + + /** */ + public CIImage toCIImage() { + return CIImage.CLASS.imageWithCGImage(image); + } + + /** */ + public Pointer pointer() { + return image; + } +} diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/coregraphics/CGLibrary.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/coregraphics/CGLibrary.java new file mode 100644 index 0000000..5237d42 --- /dev/null +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/coregraphics/CGLibrary.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2022 by Naohide Sano, All rights reserved. + * + * Programmed by Naohide Sano + */ + +package org.rococoa.cocoa.coregraphics; + +import java.util.Collections; + +import com.sun.jna.Callback; +import com.sun.jna.Library; +import com.sun.jna.Native; +import com.sun.jna.Pointer; +import org.rococoa.cocoa.CGFloat; +import org.rococoa.internal.RococoaTypeMapper; + + +/** + * CGLibrary. + * + * @author Naohide Sano (nsano) + * @version 0.00 2022-09-10 nsano initial version
+ */ +public interface CGLibrary extends Library { + + CGLibrary library = Native.load( + "CoreGraphics", CGLibrary.class, Collections.singletonMap(Library.OPTION_TYPE_MAPPER, new RococoaTypeMapper())); + + int kCGEventTapDisabledByTimeout = 0xFFFF_FFFE; + + int kCGHIDEventTap = 0; + int kCGSessionEventTap = 1; + int kCGHeadInsertEventTap = 0; + int kCGEventTapOptionListenOnly = 1; + long kCGEventMaskForAllEvents = 0xFFFF_FFFF_FFFF_FFFFL; + + interface CGEventTapCallBack extends Callback { + Pointer/*CGEventRef*/ apply(Pointer/*CGEventTapProxy*/ proxy, + int/*CGEventType*/ type, + Pointer /*CGEventRef*/ event, + Pointer userInfo); + } + + void CGEventTapEnable(Pointer/*CFMachPortRef*/ tap, boolean enable); + + Pointer/*CFMachPortRef*/ CGEventTapCreate(int /*CGEventTapLocation*/ tap, + int /*CGEventTapPlacement*/ place, + int /*CGEventTapOptions*/ options, + long /*CGEventMask*/ eventsOfInterest, + CGEventTapCallBack callback, Pointer userInfo); + + Pointer/*CGColorRef*/ CGColorCreateGenericRGB(CGFloat red, CGFloat green, CGFloat blue, CGFloat alpha); + + Pointer/*CGImageRef*/ CGImageCreateWithImageInRect(Pointer /*CGImageRef*/ image, CGRect rect); + + int CGImageGetWidth(Pointer/*CGImageRef*/ image); + + int CGImageGetHeight(Pointer/*CGImageRef*/ image); + + void CGImageRelease(Pointer/*CGImageRef*/ image); +} diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/coregraphics/CGPoint.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/coregraphics/CGPoint.java new file mode 100644 index 0000000..97d6c30 --- /dev/null +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/coregraphics/CGPoint.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2022 by Naohide Sano, All rights reserved. + * + * Programmed by Naohide Sano + */ + +package org.rococoa.cocoa.coregraphics; + +import java.util.Arrays; +import java.util.List; + +import com.sun.jna.Pointer; +import com.sun.jna.Structure; + + +/** + * CGPoint. + * + * @author Naohide Sano (nsano) + * @version 0.00 2022-09-04 nsano initial version
+ */ +public class CGPoint extends Structure { + + public double x; + public double y; + + public CGPoint() { + } + + public CGPoint(Pointer pointer) { + super(pointer); + } + + public CGPoint(int x, int y) { + this.x = x; + this.y = y; + } + + @Override + public String toString() { + return "CGPoint{" + + "x=" + x + + ", y=" + y + + '}'; + } + + @Override + protected List getFieldOrder() { + return Arrays.asList("x", "y"); + } +} diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/coregraphics/CGRect.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/coregraphics/CGRect.java new file mode 100644 index 0000000..722f03e --- /dev/null +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/coregraphics/CGRect.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2022 by Naohide Sano, All rights reserved. + * + * Programmed by Naohide Sano + */ + +package org.rococoa.cocoa.coregraphics; + +import java.util.Arrays; +import java.util.List; + +import com.sun.jna.Pointer; +import com.sun.jna.Structure; + + +/** + * CGRect. + * + * @author Naohide Sano (nsano) + * @version 0.00 2022-09-04 nsano initial version
+ */ +public class CGRect extends Structure { + + public CGPoint origin; + public CGSize size; + + public CGRect() { + } + + public CGRect(Pointer pointer) { + super(pointer); + } + + public CGRect(int x, int y, int width, int height) { + this.origin = new CGPoint(x, y); + this.size = new CGSize(width, height); + } + + @Override + public String toString() { + return "CGRect{" + + "origin=" + origin + + ", size=" + size + + '}'; + } + + @Override + protected List getFieldOrder() { + return Arrays.asList("origin", "size"); + } +} diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/coregraphics/CGSize.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/coregraphics/CGSize.java new file mode 100644 index 0000000..db3ca7b --- /dev/null +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/coregraphics/CGSize.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2022 by Naohide Sano, All rights reserved. + * + * Programmed by Naohide Sano + */ + +package org.rococoa.cocoa.coregraphics; + +import java.util.Arrays; +import java.util.List; + +import com.sun.jna.Pointer; +import com.sun.jna.Structure; + + +/** + * CGSize. + * + * @author Naohide Sano (nsano) + * @version 0.00 2022-09-04 nsano initial version
+ */ +public class CGSize extends Structure { + + public double width; + public double height; + + public CGSize() { + } + + public CGSize(Pointer pointer) { + super(pointer); + } + + public CGSize(int width, int height) { + this.width = width; + this.height = height; + } + + @Override + public String toString() { + return "CGSize{" + + "width=" + width + + ", height=" + height + + '}'; + } + + @Override + protected List getFieldOrder() { + return Arrays.asList("width", "height"); + } +} diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/coreimage/CIColor.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/coreimage/CIColor.java new file mode 100644 index 0000000..733da53 --- /dev/null +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/coreimage/CIColor.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2022 by Naohide Sano, All rights reserved. + * + * Programmed by Naohide Sano + */ + +package org.rococoa.cocoa.coreimage; + +import com.sun.jna.Pointer; +import org.rococoa.ObjCClass; +import org.rococoa.Rococoa; +import org.rococoa.cocoa.coregraphics.CGRect; +import org.rococoa.cocoa.foundation.NSDictionary; +import org.rococoa.cocoa.foundation.NSObject; +import org.rococoa.cocoa.foundation.NSString; + + +/** + * CIColor. + * + * @author Naohide Sano (nsano) + * @version 0.00 2022-09-04 nsano initial version
+ */ +public abstract class CIColor extends NSObject { + + public static final _Class CLASS = Rococoa.createClass("CIColor", _Class.class); + + public interface _Class extends ObjCClass { + CIColor colorWithCGColor(Pointer/*CGColorRef*/ c); + + CIColor colorWithString(String representation); + } + + public abstract Pointer/*CGImageRef*/ createCGImage_fromRect(CIImage image, CGRect fromRect); + + public abstract String stringRepresentation(); +} diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/coreimage/CIContext.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/coreimage/CIContext.java new file mode 100644 index 0000000..6a87b95 --- /dev/null +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/coreimage/CIContext.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2022 by Naohide Sano, All rights reserved. + * + * Programmed by Naohide Sano + */ + +package org.rococoa.cocoa.coreimage; + +import com.sun.jna.Pointer; +import org.rococoa.ObjCClass; +import org.rococoa.Rococoa; +import org.rococoa.cocoa.coregraphics.CGRect; +import org.rococoa.cocoa.foundation.NSArray; +import org.rococoa.cocoa.foundation.NSDictionary; +import org.rococoa.cocoa.foundation.NSObject; + + +/** + * CIContext. + * + * @author Naohide Sano (nsano) + * @version 0.00 2022-09-04 nsano initial version
+ */ +public abstract class CIContext extends NSObject { + + public static final _Class CLASS = Rococoa.createClass("CIContext", _Class.class); + + public interface _Class extends ObjCClass { + CIContext contextWithOptions(NSDictionary options); + } + + public abstract Pointer/*CGImageRef*/ createCGImage_fromRect(CIImage image, CGRect fromRect); +} diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/coreimage/CIFilter.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/coreimage/CIFilter.java new file mode 100644 index 0000000..d054a1c --- /dev/null +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/coreimage/CIFilter.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2022 by Naohide Sano, All rights reserved. + * + * Programmed by Naohide Sano + */ + +package org.rococoa.cocoa.coreimage; + +import org.rococoa.ID; +import org.rococoa.ObjCClass; +import org.rococoa.Rococoa; +import org.rococoa.cocoa.foundation.NSArray; +import org.rococoa.cocoa.foundation.NSDictionary; +import org.rococoa.cocoa.foundation.NSObject; +import org.rococoa.cocoa.foundation.NSString; + + +/** + * CIFilter. + * + * @author Naohide Sano (nsano) + * @version 0.00 2022-09-04 nsano initial version
+ */ +public abstract class CIFilter extends NSObject { + + public static final _Class CLASS = Rococoa.createClass("CIFilter", _Class.class); + + public interface _Class extends ObjCClass { + CIFilter filterWithName(String name); + CIFilter filterWithName_withInputParameters(String name, NSDictionary params); + CIFilter filterWithName_keysAndValues(String name, ID... key0); + } + + public abstract void setValue_forKey(NSObject value, String key); + + public abstract NSDictionary attributes(); + + public abstract void setEnabled(boolean enabled); + + public abstract boolean enabled(); + + public abstract NSArray inputKeys(); + + public abstract NSArray outputKeys(); + + public abstract CIImage outputImage(); + + public abstract NSObject value_ForKey(String key); +} diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/coreimage/CIImage.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/coreimage/CIImage.java new file mode 100644 index 0000000..16fe16a --- /dev/null +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/coreimage/CIImage.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2022 by Naohide Sano, All rights reserved. + * + * Programmed by Naohide Sano + */ + +package org.rococoa.cocoa.coreimage; + +import com.sun.jna.Pointer; +import org.rococoa.ObjCClass; +import org.rococoa.Rococoa; +import org.rococoa.cocoa.coregraphics.CGRect; +import org.rococoa.cocoa.foundation.NSArray; +import org.rococoa.cocoa.foundation.NSObject; +import org.rococoa.cocoa.foundation.NSURL; + + +/** + * CIImage. + * + * @author Naohide Sano (nsano) + * @version 0.00 2022-09-04 nsano initial version
+ */ +public abstract class CIImage extends NSObject { + + public static final _Class CLASS = Rococoa.createClass("CIImage", _Class.class); + + public interface _Class extends ObjCClass { + CIImage emptyImage(); + CIImage imageWithCGImage(Pointer/*CGImageRef*/ image); + CIImage imageWithContentsOfURL(NSURL url); + } + + public abstract CGRect extent(); +} diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/foundation/CFAllocatorRef.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/foundation/CFAllocatorRef.java new file mode 100644 index 0000000..6b8cb5a --- /dev/null +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/foundation/CFAllocatorRef.java @@ -0,0 +1,23 @@ +package org.rococoa.cocoa.foundation; + +/* + * Copyright (c) 2002-2015 David Kocher. All rights reserved. + * http://cyberduck.ch/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * Bug fixes, suggestions and comments should be sent to feedback@cyberduck.ch + */ + +import com.sun.jna.ptr.PointerByReference; + +public class CFAllocatorRef extends PointerByReference { +} \ No newline at end of file diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/foundation/CFStringRef.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/foundation/CFStringRef.java new file mode 100644 index 0000000..46b6bcf --- /dev/null +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/foundation/CFStringRef.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2002-2015 David Kocher. All rights reserved. + * http://cyberduck.ch/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * Bug fixes, suggestions and comments should be sent to feedback@cyberduck.ch + */ + +package org.rococoa.cocoa.foundation; + +import org.rococoa.cocoa.CFIndex; + +import com.sun.jna.ptr.PointerByReference; + +public class CFStringRef extends PointerByReference { + + public static CFStringRef toCFString(String s) { + final char[] chars = s.toCharArray(); + int length = chars.length; + return FoundationKitFunctions.library.CFStringCreateWithCharacters(null, chars, CFIndex.valueOf(length)); + } +} \ No newline at end of file diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/foundation/FoundationKitFunctions.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/foundation/FoundationKitFunctions.java new file mode 100644 index 0000000..aaeda27 --- /dev/null +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/foundation/FoundationKitFunctions.java @@ -0,0 +1,325 @@ +/* + * Copyright (c) 2002-2009 David Kocher. All rights reserved. + * + * http://cyberduck.ch/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * Bug fixes, suggestions and comments should be sent to: + * dkocher@cyberduck.ch + */ + +package org.rococoa.cocoa.foundation; + +import java.util.Collections; + +import com.sun.jna.NativeLong; +import com.sun.jna.Pointer; +import org.rococoa.ID; +import org.rococoa.cocoa.CFIndex; + +import org.rococoa.cocoa.coregraphics.CGLibrary; +import org.rococoa.internal.RococoaTypeMapper; + +import com.sun.jna.Library; +import com.sun.jna.Native; +import com.sun.jna.platform.mac.CoreFoundation; + +public interface FoundationKitFunctions extends Library { + FoundationKitFunctions library = Native.load( + "Foundation", FoundationKitFunctions.class, Collections.singletonMap(Library.OPTION_TYPE_MAPPER, new RococoaTypeMapper())); + + /** + * native declaration : /System/Library/Frameworks/ApplicationServices.framework/Headers/../Frameworks/CoreGraphics.framework/Headers/CGGeometry.h:36
+ * enum values + */ + interface CGRectEdge { + int CGRectMinXEdge = 0; + int CGRectMinYEdge = 1; + int CGRectMaxXEdge = 2; + int CGRectMaxYEdge = 3; + } + + /** + * native declaration : /System/Library/Frameworks/ApplicationServices.framework/Headers/../Frameworks/CoreGraphics.framework/Headers/CGGeometry.h
+ * enum values + */ + interface NSRectEdge { + int NSMinXEdge = 0; + int NSMinYEdge = 1; + int NSMaxXEdge = 2; + int NSMaxYEdge = 3; + } + + /** + * native declaration : /System/Library/Frameworks/Foundation.framework/Headers/NSPathUtilities.h
+ * enum values + */ + interface NSSearchPathDirectory { + /// supported applications (Applications) + int NSApplicationDirectory = 1; + /// unsupported applications, demonstration versions (Demos) + int NSDemoApplicationDirectory = 2; + /// developer applications (Developer/Applications). DEPRECATED - there is no one single Developer directory. + int NSDeveloperApplicationDirectory = 3; + /// system and network administration applications (Administration) + int NSAdminApplicationDirectory = 4; + /// various user-visible documentation, support, and configuration files, resources (Library) + int NSLibraryDirectory = 5; + /// developer resources (Developer) DEPRECATED - there is no one single Developer directory. + int NSDeveloperDirectory = 6; + /// user home directories (Users) + int NSUserDirectory = 7; + /// documentation (Documentation) + int NSDocumentationDirectory = 8; + /// documents (Documents) + int NSDocumentDirectory = 9; + /// location of CoreServices directory (System/Library/CoreServices) + int NSCoreServiceDirectory = 10; + /// location of autosaved documents (Documents/Autosaved) + int NSAutosavedInformationDirectory = 11; + /// location of user's desktop + int NSDesktopDirectory = 12; + /// location of discardable cache files (Library/Caches) + int NSCachesDirectory = 13; + /// location of application support files (plug-ins, etc) (Library/Application Support) + int NSApplicationSupportDirectory = 14; + /// location of the user's "Downloads" directory + int NSDownloadsDirectory = 15; + /// input methods (Library/Input Methods) + int NSInputMethodsDirectory = 16; + /// location of user's Movies directory (~/Movies) + int NSMoviesDirectory = 17; + /// location of user's Music directory (~/Music) + int NSMusicDirectory = 18; + /// location of user's Pictures directory (~/Pictures) + int NSPicturesDirectory = 19; + /// location of system's PPDs directory (Library/Printers/PPDs) + int NSPrinterDescriptionDirectory = 20; + /// location of user's Public sharing directory (~/Public) + int NSSharedPublicDirectory = 21; + /// location of the PreferencePanes directory for use with System Preferences (Library/PreferencePanes) + int NSPreferencePanesDirectory = 22; + /// For use with NSFileManager's URLForDirectory:inDomain:appropriateForURL:create:error: + int NSItemReplacementDirectory = 99; + /// all directories where applications can occur + int NSAllApplicationsDirectory = 100; + /// all directories where resources can occur + int NSAllLibrariesDirectory = 101; + } + + /** + * native declaration : /System/Library/Frameworks/Foundation.framework/Headers/NSPathUtilities.h
+ * enum values + */ + interface NSSearchPathDomainMask { + /// user's home directory --- place to install user's personal items (~) + int NSUserDomainMask = 1; + /// local to the current machine --- place to install items available to everyone on this machine (/Library) + int NSLocalDomainMask = 2; + /// publically available location in the local area network --- place to install items available on the network (/Network) + int NSNetworkDomainMask = 4; + /// provided by Apple, unmodifiable (/System) + int NSSystemDomainMask = 8; + /// all domains: all of the above and future items + int NSAllDomainsMask = 65535; + } + + /** + * Original signature : BOOL NSEqualPoints(NSPoint, NSPoint)
+ * native declaration : /System/Library/Frameworks/ApplicationServices.framework/Headers/../Frameworks/CoreGraphics.framework/Headers/CGGeometry.h:447 + */ + boolean NSEqualPoints(NSPoint aPoint, NSPoint bPoint); + + /** + * Original signature : BOOL NSEqualSizes(NSSize, NSSize)
+ * native declaration : /System/Library/Frameworks/ApplicationServices.framework/Headers/../Frameworks/framework/Headers/CGGeometry.h:448 + */ + boolean NSEqualSizes(NSSize aSize, NSSize bSize); + + /** + * Original signature : BOOL NSEqualRects(NSRect, NSRect)
+ * native declaration : /System/Library/Frameworks/ApplicationServices.framework/Headers/../Frameworks/framework/Headers/CGGeometry.h:449 + */ + boolean NSEqualRects(NSRect aRect, NSRect bRect); + + /** + * Original signature : BOOL NSIsEmptyRect(NSRect)
+ * native declaration : /System/Library/Frameworks/ApplicationServices.framework/Headers/../Frameworks/framework/Headers/CGGeometry.h:450 + */ + boolean NSIsEmptyRect(NSRect aRect); + + /** + * Original signature : NSRect NSInsetRect(NSRect, CGFloat, CGFloat)
+ * native declaration : /System/Library/Frameworks/ApplicationServices.framework/Headers/../Frameworks/framework/Headers/CGGeometry.h:452 + */ + NSRect NSInsetRect(NSRect aRect, org.rococoa.cocoa.CGFloat dX, org.rococoa.cocoa.CGFloat dY); + + /** + * Original signature : NSRect NSIntegralRect(NSRect)
+ * native declaration : /System/Library/Frameworks/ApplicationServices.framework/Headers/../Frameworks/framework/Headers/CGGeometry.h:453 + */ + NSRect NSIntegralRect(NSRect aRect); + + /** + * Original signature : NSRect NSUnionRect(NSRect, NSRect)
+ * native declaration : /System/Library/Frameworks/ApplicationServices.framework/Headers/../Frameworks/framework/Headers/CGGeometry.h:454 + */ + NSRect NSUnionRect(NSRect aRect, NSRect bRect); + + /** + * Original signature : NSRect NSIntersectionRect(NSRect, NSRect)
+ * native declaration : /System/Library/Frameworks/ApplicationServices.framework/Headers/../Frameworks/framework/Headers/CGGeometry.h:455 + */ + NSRect NSIntersectionRect(NSRect aRect, NSRect bRect); + + /** + * Original signature : NSRect NSOffsetRect(NSRect, CGFloat, CGFloat)
+ * native declaration : /System/Library/Frameworks/ApplicationServices.framework/Headers/../Frameworks/framework/Headers/CGGeometry.h:456 + */ + NSRect NSOffsetRect(NSRect aRect, org.rococoa.cocoa.CGFloat dX, org.rococoa.cocoa.CGFloat dY); + + /** + * Original signature : void NSDivideRect(NSRect, NSRect*, NSRect*, CGFloat, NSRectEdge)
+ * native declaration : /System/Library/Frameworks/ApplicationServices.framework/Headers/../Frameworks/framework/Headers/CGGeometry.h:457
+ * + * @param edge @see NSRectEdge + */ + void NSDivideRect(NSRect inRect, NSRect slice, NSRect rem, org.rococoa.cocoa.CGFloat amount, int edge); + + /** + * Original signature : BOOL NSPointInRect(NSPoint, NSRect)
+ * native declaration : /System/Library/Frameworks/ApplicationServices.framework/Headers/../Frameworks/framework/Headers/CGGeometry.h:458 + */ + boolean NSPointInRect(NSPoint aPoint, NSRect aRect); + + /** + * Original signature : BOOL NSMouseInRect(NSPoint, NSRect, BOOL)
+ * native declaration : /System/Library/Frameworks/ApplicationServices.framework/Headers/../Frameworks/framework/Headers/CGGeometry.h:459 + */ + boolean NSMouseInRect(NSPoint aPoint, NSRect aRect, boolean flipped); + + /** + * Original signature : BOOL NSContainsRect(NSRect, NSRect)
+ * native declaration : /System/Library/Frameworks/ApplicationServices.framework/Headers/../Frameworks/framework/Headers/CGGeometry.h:460 + */ + boolean NSContainsRect(NSRect aRect, NSRect bRect); + + /** + * Original signature : BOOL NSIntersectsRect(NSRect, NSRect)
+ * native declaration : /System/Library/Frameworks/ApplicationServices.framework/Headers/../Frameworks/framework/Headers/CGGeometry.h:461 + */ + boolean NSIntersectsRect(NSRect aRect, NSRect bRect); + + /** + * Original signature : NSString* NSStringFromPoint(NSPoint)
+ * native declaration : /System/Library/Frameworks/ApplicationServices.framework/Headers/../Frameworks/framework/Headers/CGGeometry.h:463 + */ + String NSStringFromPoint(NSPoint aPoint); + + /** + * Original signature : NSString* NSStringFromSize(NSSize)
+ * native declaration : /System/Library/Frameworks/ApplicationServices.framework/Headers/../Frameworks/framework/Headers/CGGeometry.h:464 + */ + String NSStringFromSize(NSSize aSize); + + /** + * Original signature : NSString* NSStringFromRect(NSRect)
+ * native declaration : /System/Library/Frameworks/ApplicationServices.framework/Headers/../Frameworks/framework/Headers/CGGeometry.h:465 + */ + String NSStringFromRect(NSRect aRect); + + /** + * Original signature : NSPoint NSPointFromString(NSString*)
+ * native declaration : /System/Library/Frameworks/ApplicationServices.framework/Headers/../Frameworks/framework/Headers/CGGeometry.h:466 + */ + NSPoint NSPointFromString(String aString); + + /** + * Original signature : NSSize NSSizeFromString(NSString*)
+ * native declaration : /System/Library/Frameworks/ApplicationServices.framework/Headers/../Frameworks/framework/Headers/CGGeometry.h:467 + */ + NSSize NSSizeFromString(String aString); + + /** + * Original signature : NSString* NSUserName()
+ * native declaration : /System/Library/Frameworks/Foundation.framework/Headers/NSPathUtilities.h:46 + */ + String NSUserName(); + + /** + * Original signature : NSString* NSFullUserName()
+ * native declaration : /System/Library/Frameworks/Foundation.framework/Headers/NSPathUtilities.h:47 + */ + String NSFullUserName(); + + /** + * Original signature : NSString* NSHomeDirectory()
+ * native declaration : /System/Library/Frameworks/Foundation.framework/Headers/NSPathUtilities.h:49 + */ + String NSHomeDirectory(); + + /** + * Original signature : NSString* NSHomeDirectoryForUser(String*)
+ * native declaration : /System/Library/Frameworks/Foundation.framework/Headers/NSPathUtilities.h:50 + */ + String NSHomeDirectoryForUser(String userName); + + /** + * Original signature : NSString* NSTemporaryDirectory()
+ * native declaration : /System/Library/Frameworks/Foundation.framework/Headers/NSPathUtilities.h:52 + */ + String NSTemporaryDirectory(); + + /** + * Original signature : NSArray* NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory, + * NSSearchPathDomainMask, BOOL)
+ * native declaration : /System/Library/Frameworks/Foundation.framework/Headers/NSPathUtilities.h:106
+ * + * @param directory @see NSSearchPathDirectory
+ * @param domainMask @see NSSearchPathDomainMask + */ + NSArray NSSearchPathForDirectoriesInDomains(int directory, int domainMask, boolean expandTilde); + + /** + * Logs an error message to the Apple System Log facility. + * TODO duplicated + * @param format Statement + */ + void NSLog(String format, String... args); + + CFStringRef CFStringCreateWithCharacters(CFAllocatorRef allocator, char[] chars, CFIndex index); + + /** + * Releases a Core Foundation object. If the retain count of cf becomes zero the memory allocated to the object is + * deallocated and the object is destroyed. If you create, copy, or explicitly retain (see the CFRetain function) a + * Core Foundation object, you are responsible for releasing it when you no longer need it (see Memory Management + * Programming Guide for Core Foundation). + * + * @param ref A CFType object to release. This value must not be NULL. + */ + void CFRelease(CoreFoundation.CFTypeRef ref); + + void CFRunLoopAddSource(Pointer/*CFRunLoopRef*/ rl, Pointer/*CFRunLoopSourceRef*/ source, CFStringRef/*CFRunLoopMode*/ mode); + + // TODO duplicated + Pointer kCFAllocatorDefault = null; + + Pointer/*CFRunLoopSourceRef*/ CFMachPortCreateRunLoopSource(CFAllocatorRef allocator, Pointer/*CFMachPortRef*/ port, CFIndex order); + + CFStringRef kCFRunLoopCommonModes = CFStringRef.toCFString("kCFRunLoopCommonModes"); + + Pointer CFRunLoopGetCurrent(); + + void CFRunLoopRun(); + + void CFRunLoopStop(Pointer runningLoop); +} diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/foundation/NSAttributedString.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/foundation/NSAttributedString.java new file mode 100644 index 0000000..2db8bd1 --- /dev/null +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/foundation/NSAttributedString.java @@ -0,0 +1,370 @@ +package org.rococoa.cocoa.foundation; + +/* + * Copyright (c) 2002-2009 David Kocher. All rights reserved. + * + * http://cyberduck.ch/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * Bug fixes, suggestions and comments should be sent to: + * dkocher@cyberduck.ch + */ + +import org.rococoa.ObjCClass; +import org.rococoa.ObjCObjectByReference; + + +/// native declaration : /System/Library/Frameworks/Foundation.framework/Headers/NSAttributedString.h:9 +public abstract class NSAttributedString extends NSObject { + private static final _Class CLASS = org.rococoa.Rococoa.createClass("NSAttributedString", _Class.class); + + public static NSAttributedString attributedString(String str) { + if(null == str) { + str = ""; + } + return CLASS.alloc().initWithString(str); + } + + public static NSAttributedString attributedStringWithAttributes(String str, NSDictionary attrs) { + if(null == str) { + str = ""; + } + return CLASS.alloc().initWithString_attributes(str, attrs); + } + + public interface _Class extends ObjCClass { + /** + * Methods to determine what types can be loaded as NSAttributedStrings.
+ * Original signature : NSArray* textTypes()
+ * from NSAttributedStringKitAdditions native declaration : :183 + */ + NSArray textTypes(); + + /** + * Original signature : NSArray* textUnfilteredTypes()
+ * from NSAttributedStringKitAdditions native declaration : :184 + */ + NSArray textUnfilteredTypes(); + + /** + * Methods that were deprecated in Mac OS 10.5. You can now use +textTypes and +textUnfilteredTypes to get arrays of Uniform Type Identifiers (UTIs).
+ * Original signature : NSArray* textFileTypes()
+ * from NSDeprecatedKitAdditions native declaration : :249 + */ + NSArray textFileTypes(); + + /** + * Original signature : NSArray* textPasteboardTypes()
+ * from NSDeprecatedKitAdditions native declaration : :250 + */ + NSArray textPasteboardTypes(); + + /** + * Original signature : NSArray* textUnfilteredFileTypes()
+ * from NSDeprecatedKitAdditions native declaration : :251 + */ + NSArray textUnfilteredFileTypes(); + + /** + * Original signature : NSArray* textUnfilteredPasteboardTypes()
+ * from NSDeprecatedKitAdditions native declaration : :252 + */ + NSArray textUnfilteredPasteboardTypes(); + + NSAttributedString alloc(); + } + + /** + * Original signature : NSString* string()
+ * native declaration : /System/Library/Frameworks/Foundation.framework/Headers/NSAttributedString.h:11 + */ + public abstract String string(); + /** + * native declaration : /System/Library/Frameworks/Foundation.framework/Headers/NSAttributedString.h:12
+ * Conversion Error : /// Original signature : NSDictionary* attributesAtIndex(NSUInteger, null)
+ * - (NSDictionary*)attributesAtIndex:(NSUInteger)location effectiveRange:(null)range; (Argument range cannot be converted) + */ + /** + * Original signature : NSUInteger length()
+ * from NSExtendedAttributedString native declaration : /System/Library/Frameworks/Foundation.framework/Headers/NSAttributedString.h:18 + */ + public abstract NSUInteger length(); + /** + * from NSExtendedAttributedString native declaration : /System/Library/Frameworks/Foundation.framework/Headers/NSAttributedString.h:19
+ * Conversion Error : /// Original signature : attribute(NSString*, NSUInteger, null)
+ * - (null)attribute:(NSString*)attrName atIndex:(NSUInteger)location effectiveRange:(null)range; (Argument range cannot be converted) + */ + /** + * from NSExtendedAttributedString native declaration : /System/Library/Frameworks/Foundation.framework/Headers/NSAttributedString.h:20
+ * Conversion Error : /// Original signature : NSAttributedString* attributedSubstringFromRange(null)
+ * - (NSAttributedString*)attributedSubstringFromRange:(null)range; (Argument range cannot be converted) + */ + /** + * from NSExtendedAttributedString native declaration : /System/Library/Frameworks/Foundation.framework/Headers/NSAttributedString.h:22
+ * Conversion Error : /// Original signature : NSDictionary* attributesAtIndex(NSUInteger, null, null)
+ * - (NSDictionary*)attributesAtIndex:(NSUInteger)location longestEffectiveRange:(null)range inRange:(null)rangeLimit; (Argument range cannot be converted) + */ + /** + * from NSExtendedAttributedString native declaration : /System/Library/Frameworks/Foundation.framework/Headers/NSAttributedString.h:23
+ * Conversion Error : /// Original signature : attribute(NSString*, NSUInteger, null, null)
+ * - (null)attribute:(NSString*)attrName atIndex:(NSUInteger)location longestEffectiveRange:(null)range inRange:(null)rangeLimit; (Argument range cannot be converted) + */ + /** + * Original signature : BOOL isEqualToAttributedString(NSAttributedString*)
+ * from NSExtendedAttributedString native declaration : /System/Library/Frameworks/Foundation.framework/Headers/NSAttributedString.h:25 + */ + public abstract byte isEqualToAttributedString(NSAttributedString other); + + /** + * Original signature : initWithString(NSString*)
+ * from NSExtendedAttributedString native declaration : /System/Library/Frameworks/Foundation.framework/Headers/NSAttributedString.h:27 + */ + public abstract NSAttributedString initWithString(String str); + + /** + * Original signature : initWithString(String*, NSDictionary*)
+ * from NSExtendedAttributedString native declaration : /System/Library/Frameworks/Foundation.framework/Headers/NSAttributedString.h:28 + */ + public abstract NSAttributedString initWithString_attributes(String str, NSDictionary attrs); + + /** + * Original signature : initWithAttributedString(NSAttributedString*)
+ * from NSExtendedAttributedString native declaration : /System/Library/Frameworks/Foundation.framework/Headers/NSAttributedString.h:29 + */ + public abstract NSAttributedString initWithAttributedString(NSAttributedString attrStr); + /** + * from NSAttributedStringKitAdditions native declaration : :156
+ * Conversion Error : /**
+ * * Attributes which should be copied/pasted with "copy font".
+ * * Original signature : NSDictionary* fontAttributesInRange(null)
+ * * /
+ * - (NSDictionary*)fontAttributesInRange:(null)range; (Argument range cannot be converted) + */ + /** + * from NSAttributedStringKitAdditions native declaration : :160
+ * Conversion Error : /**
+ * * Attributes which should be copied/pasted with "copy ruler".
+ * * Original signature : NSDictionary* rulerAttributesInRange(null)
+ * * /
+ * - (NSDictionary*)rulerAttributesInRange:(null)range; (Argument range cannot be converted) + */ + /** + * Original signature : BOOL containsAttachments()
+ * from NSAttributedStringKitAdditions native declaration : :162 + */ + public abstract byte containsAttachments(); + /** + * from NSAttributedStringKitAdditions native declaration : :166
+ * Conversion Error : /**
+ * * Returns NSNotFound if no line break location found in the specified range; otherwise returns the index of the first character that should go on the NEXT line.
+ * * Original signature : NSUInteger lineBreakBeforeIndex(NSUInteger, null)
+ * * /
+ * - (NSUInteger)lineBreakBeforeIndex:(NSUInteger)location withinRange:(null)aRange; (Argument aRange cannot be converted) + */ + /** + * from NSAttributedStringKitAdditions native declaration : :168
+ * Conversion Error : /// Original signature : NSUInteger lineBreakByHyphenatingBeforeIndex(NSUInteger, null)
+ * - (NSUInteger)lineBreakByHyphenatingBeforeIndex:(NSUInteger)location withinRange:(null)aRange; (Argument aRange cannot be converted) + */ + /** + * Original signature : doubleClickAtIndex(NSUInteger)
+ * from NSAttributedStringKitAdditions native declaration : :171 + */ + public abstract NSObject doubleClickAtIndex(NSUInteger location); + + /** + * Original signature : NSUInteger nextWordFromIndex(NSUInteger, BOOL)
+ * from NSAttributedStringKitAdditions native declaration : :172 + */ + public abstract NSUInteger nextWordFromIndex_forward(NSUInteger location, byte isForward); + /** + * from NSAttributedStringKitAdditions native declaration : :177
+ * Conversion Error : /**
+ * * Returns a URL either from a link attribute or from text at the given location that appears to be a URL string, for use in automatic link detection. The effective range is the range of the link attribute or URL string.
+ * * Original signature : NSURL* URLAtIndex(NSUInteger, null)
+ * * /
+ * - (NSURL*)URLAtIndex:(NSUInteger)location effectiveRange:(null)effectiveRange; (Argument effectiveRange cannot be converted) + */ + /** + * Convenience methods for calculating the range of an individual text block, range of an entire table, range of a list, and the index within a list.
+ * Original signature : rangeOfTextBlock(NSTextBlock*, NSUInteger)
+ * from NSAttributedStringKitAdditions native declaration : :190 + */ + public abstract NSObject rangeOfTextBlock_atIndex(com.sun.jna.Pointer block, NSUInteger location); + + /** + * Original signature : rangeOfTextTable(NSTextTable*, NSUInteger)
+ * from NSAttributedStringKitAdditions native declaration : :191 + */ + public abstract NSObject rangeOfTextTable_atIndex(com.sun.jna.Pointer table, NSUInteger location); + + /** + * Original signature : rangeOfTextList(NSTextList*, NSUInteger)
+ * from NSAttributedStringKitAdditions native declaration : :192 + */ + public abstract NSObject rangeOfTextList_atIndex(com.sun.jna.Pointer list, NSUInteger location); + + /** + * Original signature : NSInteger itemNumberInTextList(NSTextList*, NSUInteger)
+ * from NSAttributedStringKitAdditions native declaration : :193 + */ + public abstract NSInteger itemNumberInTextList_atIndex(com.sun.jna.Pointer list, NSUInteger location); + + /** + * These first two general methods supersede the previous versions shown below. They take a dictionary of options to specify how the document should be loaded. The various possible options are specified above, as NS...DocumentOption. If NSDocumentTypeDocumentOption is specified, the document will be treated as being in the specified format. If NSDocumentTypeDocumentOption is not specified, these methods will examine the document and do their best to load it using whatever format it seems to contain.
+ * Original signature : initWithURL(NSURL*, NSDictionary*, NSDictionary**, NSError**)
+ * from NSAttributedStringKitAdditions native declaration : :201 + */ + public abstract NSAttributedString initWithURL_options_documentAttributes_error(com.sun.jna.Pointer url, NSDictionary options, ObjCObjectByReference dict, ObjCObjectByReference error); + + /** + * Original signature : initWithData(NSData*, NSDictionary*, NSDictionary**, NSError**)
+ * from NSAttributedStringKitAdditions native declaration : :202 + */ + public abstract NSAttributedString initWithData_options_documentAttributes_error(com.sun.jna.Pointer data, NSDictionary options, ObjCObjectByReference dict, ObjCObjectByReference error); + + /** + * These two superseded methods are similar to the first listed above except that they lack the options dictionary and error return arguments. They will always attempt to determine the format from the document.
+ * Original signature : initWithPath(String*, NSDictionary**)
+ * from NSAttributedStringKitAdditions native declaration : :207 + */ + public abstract NSAttributedString initWithPath_documentAttributes(String path, ObjCObjectByReference dict); + + /** + * Original signature : initWithURL(NSURL*, NSDictionary**)
+ * from NSAttributedStringKitAdditions native declaration : :208 + */ + public abstract NSAttributedString initWithURL_documentAttributes(com.sun.jna.Pointer url, ObjCObjectByReference dict); + + /** + * The following methods should now be considered as conveniences for various common document types.
+ * Original signature : initWithRTF(NSData*, NSDictionary**)
+ * from NSAttributedStringKitAdditions native declaration : :212 + */ + public abstract NSAttributedString initWithRTF_documentAttributes(com.sun.jna.Pointer data, ObjCObjectByReference dict); + + /** + * Original signature : initWithRTFD(NSData*, NSDictionary**)
+ * from NSAttributedStringKitAdditions native declaration : :213 + */ + public abstract NSAttributedString initWithRTFD_documentAttributes(com.sun.jna.Pointer data, ObjCObjectByReference dict); + + /** + * Original signature : initWithHTML(NSData*, NSDictionary**)
+ * from NSAttributedStringKitAdditions native declaration : :214 + */ + public abstract NSAttributedString initWithHTML_documentAttributes(com.sun.jna.Pointer data, ObjCObjectByReference dict); + + /** + * Original signature : initWithHTML(NSData*, NSURL*, NSDictionary**)
+ * from NSAttributedStringKitAdditions native declaration : :215 + */ + public abstract NSAttributedString initWithHTML_baseURL_documentAttributes(com.sun.jna.Pointer data, com.sun.jna.Pointer base, ObjCObjectByReference dict); + + /** + * Original signature : initWithDocFormat(NSData*, NSDictionary**)
+ * from NSAttributedStringKitAdditions native declaration : :217 + */ + public abstract NSAttributedString initWithDocFormat_documentAttributes(com.sun.jna.Pointer data, ObjCObjectByReference dict); + + /** + * Original signature : initWithHTML(NSData*, NSDictionary*, NSDictionary**)
+ * from NSAttributedStringKitAdditions native declaration : :218 + */ + public abstract NSAttributedString initWithHTML_options_documentAttributes(com.sun.jna.Pointer data, NSDictionary options, ObjCObjectByReference dict); + + /** + * A separate method is available for initializing from an RTFD file wrapper. No options apply in this case.
+ * Original signature : initWithRTFDFileWrapper(NSFileWrapper*, NSDictionary**)
+ * from NSAttributedStringKitAdditions native declaration : :223 + */ + public abstract NSAttributedString initWithRTFDFileWrapper_documentAttributes(com.sun.jna.Pointer wrapper, ObjCObjectByReference dict); + /** + * from NSAttributedStringKitAdditions native declaration : :230
+ * Conversion Error : /**
+ * * These first two methods generalize on the more specific previous versions shown below. They require a document attributes dict specifying at least the NSDocumentTypeDocumentAttribute to determine the format to be written. The file wrapper method will return a directory file wrapper for those document types for which it is appropriate, otherwise a regular-file file wrapper.
+ * * Original signature : NSData* dataFromRange(null, NSDictionary*, NSError**)
+ * * /
+ * - (NSData*)dataFromRange:(null)range documentAttributes:(NSDictionary*)dict error:(NSError**)error; (Argument range cannot be converted) + */ + /** + * from NSAttributedStringKitAdditions native declaration : :231
+ * Conversion Error : /// Original signature : NSFileWrapper* fileWrapperFromRange(null, NSDictionary*, NSError**)
+ * - (NSFileWrapper*)fileWrapperFromRange:(null)range documentAttributes:(NSDictionary*)dict error:(NSError**)error; (Argument range cannot be converted) + */ + /** + * from NSAttributedStringKitAdditions native declaration : :236
+ * Conversion Error : /**
+ * * The following methods should now be considered as conveniences for various common document types. In these methods the document attributes dictionary is optional.
+ * * Original signature : NSData* RTFFromRange(null, NSDictionary*)
+ * * /
+ * - (NSData*)RTFFromRange:(null)range documentAttributes:(NSDictionary*)dict; (Argument range cannot be converted) + */ + /** + * from NSAttributedStringKitAdditions native declaration : :237
+ * Conversion Error : /// Original signature : NSData* RTFDFromRange(null, NSDictionary*)
+ * - (NSData*)RTFDFromRange:(null)range documentAttributes:(NSDictionary*)dict; (Argument range cannot be converted) + */ + /** + * from NSAttributedStringKitAdditions native declaration : :238
+ * Conversion Error : /// Original signature : NSFileWrapper* RTFDFileWrapperFromRange(null, NSDictionary*)
+ * - (NSFileWrapper*)RTFDFileWrapperFromRange:(null)range documentAttributes:(NSDictionary*)dict; (Argument range cannot be converted) + */ + /** + * from NSAttributedStringKitAdditions native declaration : :240
+ * Conversion Error : /// Original signature : NSData* docFormatFromRange(null, NSDictionary*)
+ * - (NSData*)docFormatFromRange:(null)range documentAttributes:(NSDictionary*)dict; (Argument range cannot be converted) + */ + + public static final String FontAttributeName = "NSFont"; + public static final String ParagraphStyleAttributeName = "NSParagraphStyle"; + public static final String ForegroundColorAttributeName = "NSColor"; + public static final String UnderlineStyleAttributeName = "NSUnderline"; + public static final String SuperscriptAttributeName = "NSSuperScript"; + public static final String BackgroundColorAttributeName = "NSBackgroundColor"; + public static final String AttachmentAttributeName = "NSAttachment"; + public static final String LigatureAttributeName = "NSLigature"; + public static final String BaselineOffsetAttributeName = "NSBaselineOffset"; + public static final String KernAttributeName = "NSKern"; + public static final String LinkAttributeName = "NSLink"; + public static final String CharacterShapeAttributeName = "NSCharacterShape"; + public static final String StrokeWidthAttributeName = "NSStrokeWidth"; + public static final String StrokeColorAttributeName = "NSStrokeColor"; + public static final String UnderlineColorAttributeName = "NSUnderlineColor"; + public static final String StrikethroughStyleAttributeName = "NSStrikethrough"; + public static final String StrikethroughColorAttributeName = "NSStrikethroughColor"; + public static final String ShadowAttributeName = "NSShadow"; + public static final String ObliquenessAttributeName = "NSObliqueness"; + public static final String ExpansionAttributeName = "NSExpansion"; + public static final String CursorAttributeName = "NSCursor"; + public static final String ToolTipAttributeName = "NSToolTip"; + public static final String NSPlainTextDocumentType = "NSPlainText"; + public static final String NSRTFTextDocumentType = "NSRTF"; + public static final String NSRTFDTextDocumentType = "NSRTFD"; + public static final String NSMacSimpleTextDocumentType = "NSMacSimpleText"; + public static final String NSHTMLTextDocumentType = "NSHTML"; + public static final String NSDocFormatTextDocumentType = "NSDocFormat"; + public static final String NSWordMLTextDocumentType = "NSWordML"; + public static final int UnderlineStyleNone = 0; + public static final int UnderlineStyleSingle = 1; + public static final int UnderlineStyleThick = 2; + public static final int UnderlineStyleDouble = 9; + public static final int UnderlinePatternSolid = 0; + public static final int UnderlinePatternDot = 256; + public static final int UnderlinePatternDash = 512; + public static final int UnderlinePatternDashDot = 768; + public static final int UnderlinePatternDashDotDot = 1024; + public static final int UnderlineByWordMask = 32768; + public static final int NoUnderlineStyle = 0; + public static final int SingleUnderlineStyle = 1; + public static final int UnderlineStrikethroughMask = 16384; +} \ No newline at end of file diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/foundation/NSThread.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/foundation/NSThread.java new file mode 100644 index 0000000..088803f --- /dev/null +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/foundation/NSThread.java @@ -0,0 +1,41 @@ +package org.rococoa.cocoa.foundation; + +/* + * Copyright (c) 2002-2009 David Kocher. All rights reserved. + * + * http://cyberduck.ch/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * Bug fixes, suggestions and comments should be sent to: + * dkocher@cyberduck.ch + */ + +import org.rococoa.ObjCClass; +import org.rococoa.cocoa.foundation.NSObject; + +public abstract class NSThread extends NSObject { + private static final _Class CLASS = org.rococoa.Rococoa.createClass("NSThread", _Class.class); + + public static boolean isMainThread() { + return CLASS.isMainThread(); + } + + public interface _Class extends ObjCClass { + + /** + * Returns a Boolean value that indicates whether the current thread is the main thread. + * + * @return + */ + boolean isMainThread(); + } +} \ No newline at end of file diff --git a/rococoa-contrib/src/main/java/org/rococoa/contrib/dispatch/GCDExecutorService.java b/rococoa-contrib/src/main/java/org/rococoa/contrib/dispatch/GCDExecutorService.java index 6dd5295..2f40332 100644 --- a/rococoa-contrib/src/main/java/org/rococoa/contrib/dispatch/GCDExecutorService.java +++ b/rococoa-contrib/src/main/java/org/rococoa/contrib/dispatch/GCDExecutorService.java @@ -39,9 +39,9 @@ import org.rococoa.Selector; import org.rococoa.cocoa.foundation.NSArray; import org.rococoa.cocoa.foundation.NSAutoreleasePool; -import org.rococoa.contrib.appkit.NSInvocationOperation; -import org.rococoa.contrib.appkit.NSOperation; -import org.rococoa.contrib.appkit.NSOperationQueue; +import org.rococoa.cocoa.appkit.NSInvocationOperation; +import org.rococoa.cocoa.appkit.NSOperation; +import org.rococoa.cocoa.appkit.NSOperationQueue; /** GCDExecutorService runs tasks by passing them to Grand Central Dispatch. * Presently, every GCDExecutorService creates its own diff --git a/rococoa-contrib/src/main/java/org/rococoa/contrib/growl/Growl.java b/rococoa-contrib/src/main/java/org/rococoa/contrib/growl/Growl.java index aa611c8..22336f9 100644 --- a/rococoa-contrib/src/main/java/org/rococoa/contrib/growl/Growl.java +++ b/rococoa-contrib/src/main/java/org/rococoa/contrib/growl/Growl.java @@ -23,8 +23,8 @@ import java.util.Collections; import java.util.List; -import org.rococoa.cocoa.NSApplication; -import org.rococoa.cocoa.NSDistributedNotificationCenter; +import org.rococoa.cocoa.appkit.NSApplication; +import org.rococoa.cocoa.appkit.NSDistributedNotificationCenter; import org.rococoa.cocoa.appkit.NSImage; import org.rococoa.cocoa.foundation.NSArray; import org.rococoa.cocoa.foundation.NSDictionary; diff --git a/rococoa-contrib/src/test/java/org/rococoa/cocoa/appkit/NSApplicationTest.java b/rococoa-contrib/src/test/java/org/rococoa/cocoa/appkit/NSApplicationTest.java new file mode 100644 index 0000000..f291aa0 --- /dev/null +++ b/rococoa-contrib/src/test/java/org/rococoa/cocoa/appkit/NSApplicationTest.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2022 by Naohide Sano, All rights reserved. + * + * Programmed by Naohide Sano + */ + +package org.rococoa.cocoa.appkit; + +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import vavi.util.StringUtil; +import org.rococoa.cocoa.foundation.NSData; +import org.rococoa.cocoa.foundation.NSPasteboard; + + +/** + * NSApplicationTest. + * + * @author Naohide Sano (nsano) + * @version 0.00 2022-09-14 nsano initial version
+ */ +class NSApplicationTest { + @Test + @Disabled("TODO wip") + void test1() throws Exception { + NSApplication.sharedApplication().setServicesProvider((pboard, userData, error) -> { + System.err.println(pboard.stringForType("NSPasteboardTypeString")); + }); + } + + @Test + void test2() throws Exception { + NSPasteboard pasteboard = NSPasteboard.generalPasteboard(); + String typeString = pasteboard.stringForType(NSPasteboard.StringPboardType); + System.err.println("typeString: " + typeString); + NSData data = pasteboard.dataForType(NSPasteboard.StringPboardType); + System.err.println("dataForType:\n" + StringUtil.getDump(data.getBytes())); + } +} diff --git a/rococoa-contrib/src/test/java/org/rococoa/contrib/appkit/NSOperationQueueTest.java b/rococoa-contrib/src/test/java/org/rococoa/cocoa/appkit/NSOperationQueueTest.java similarity index 97% rename from rococoa-contrib/src/test/java/org/rococoa/contrib/appkit/NSOperationQueueTest.java rename to rococoa-contrib/src/test/java/org/rococoa/cocoa/appkit/NSOperationQueueTest.java index abad801..fd4f8c8 100644 --- a/rococoa-contrib/src/test/java/org/rococoa/contrib/appkit/NSOperationQueueTest.java +++ b/rococoa-contrib/src/test/java/org/rococoa/cocoa/appkit/NSOperationQueueTest.java @@ -17,7 +17,7 @@ * along with Rococoa. If not, see . */ -package org.rococoa.contrib.appkit; +package org.rococoa.cocoa.appkit; import java.util.ArrayList; import java.util.List; @@ -27,6 +27,9 @@ import org.rococoa.ObjCObject; import static org.junit.jupiter.api.Assertions.*; import org.rococoa.Rococoa; +import org.rococoa.cocoa.appkit.NSInvocationOperation; +import org.rococoa.cocoa.appkit.NSOperation; +import org.rococoa.cocoa.appkit.NSOperationQueue; import org.rococoa.cocoa.foundation.NSArray; import org.rococoa.cocoa.foundation.NSInteger; import org.rococoa.test.RococoaTestCase; diff --git a/rococoa-contrib/src/test/java/org/rococoa/contrib/appkit/NSSpeechSynthesizerTest.java b/rococoa-contrib/src/test/java/org/rococoa/cocoa/appkit/NSSpeechSynthesizerTest.java similarity index 91% rename from rococoa-contrib/src/test/java/org/rococoa/contrib/appkit/NSSpeechSynthesizerTest.java rename to rococoa-contrib/src/test/java/org/rococoa/cocoa/appkit/NSSpeechSynthesizerTest.java index b7950ac..747c736 100644 --- a/rococoa-contrib/src/test/java/org/rococoa/contrib/appkit/NSSpeechSynthesizerTest.java +++ b/rococoa-contrib/src/test/java/org/rococoa/cocoa/appkit/NSSpeechSynthesizerTest.java @@ -17,7 +17,7 @@ * along with Rococoa. If not, see . */ -package org.rococoa.contrib.appkit; +package org.rococoa.cocoa.appkit; import java.io.File; import java.io.FileInputStream; @@ -33,9 +33,12 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; +import org.rococoa.cocoa.appkit.NSSpeechDictionary; +import org.rococoa.cocoa.appkit.NSSpeechSynthesizer; +import org.rococoa.cocoa.appkit.NSVoice; import org.rococoa.cocoa.foundation.NSAutoreleasePool; import org.rococoa.cocoa.foundation.NSRange; -import org.rococoa.contrib.appkit.NSSpeechSynthesizer.NSSpeechStatus; +import org.rococoa.cocoa.appkit.NSSpeechSynthesizer.NSSpeechStatus; import static org.junit.jupiter.api.Assertions.*; @@ -45,6 +48,7 @@ */ public class NSSpeechSynthesizerTest { private static final int TIME_TO_WAIT = 5000; + private static final float VOLUME = 0.2f; private NSAutoreleasePool pool; private static NSVoice testVoice = new NSVoice(NSVoice.VICTORIA); @@ -62,7 +66,7 @@ public void postTeardown() { @Test @Disabled("by vavi") public void testDefaultVoice() { - assertNotNull(NSSpeechSynthesizer.CLASS.defaultVoice()); //System preference, so no way of knowing actual value + assertNotNull(NSSpeechSynthesizer.CLASS.defaultVoice()); // System preference, so no way of knowing actual value assertNotNull(NSSpeechSynthesizer.defaultVoice().getName()); assertNotNull(NSSpeechSynthesizer.synthesizerWithVoice(testVoice)); assertEquals(NSSpeechSynthesizer.defaultVoice(), NSSpeechSynthesizer.synthesizerWithVoice(testVoice).getVoice()); @@ -79,14 +83,14 @@ public void testAvailableVoices() { @Test @Disabled("by vavi") public void testAddGetSpeechDictionary() { - //first, let's teach the synth to talk like its from Newcastle (sort of) + // first, let's teach the synth to talk like its from Newcastle (sort of) NSSpeechDictionary dict = new NSSpeechDictionary(); dict.setLocaleIdentifier(Locale.US); Date now = new Date(); dict.setModificationDate(now); assertEquals(Locale.US, dict.getLocaleIdentifier()); assertEquals(now, dict.getModificationDate()); - dict.addPronounciation(new NSSpeechDictionary.Entry("about", "AXbUWt")); //en_GB_geordie! + dict.addPronounciation(new NSSpeechDictionary.Entry("about", "AXbUWt")); // en_GB_geordie! NSSpeechSynthesizer ss = NSSpeechSynthesizer.synthesizerWithVoice(testVoice); SynthesizerDelegate sd = new SynthesizerDelegate(ss); ss.setDelegate(sd); @@ -96,14 +100,14 @@ public void testAddGetSpeechDictionary() { String[] expected = new String[] {"%", "AX", "b", "UW", "t", "%"}; assertEquals(Arrays.asList(expected), sd.getPhonemesSpoken()); - //Normally the synth falls into the SQL = 'S' 'Q' 'L' camp + // Normally the synth falls into the SQL = 'S' 'Q' 'L' camp sd.reset(); ss.startSpeakingString("SQL"); sd.waitForSpeechDone(TIME_TO_WAIT, true); expected = new String[] {"%", "EH", "s", "k", "y", "UW", "EH", "l", "%"}; assertEquals(Arrays.asList(expected), sd.getPhonemesSpoken()); - //but we can make it say 'sequel' instead... + // but we can make it say 'sequel' instead... dict.setModificationDate(new Date()); dict.addAbbreviation(new NSSpeechDictionary.Entry("SQL", "sIYkwAXl")); ss.addSpeechDictionary(dict); @@ -119,6 +123,7 @@ public void testAddGetSpeechDictionary() { public void testStartSpeakingString() throws InterruptedException { NSSpeechSynthesizer ss = NSSpeechSynthesizer.synthesizerWithVoice(testVoice); SynthesizerDelegate sd = new SynthesizerDelegate(ss); + ss.setVolume(VOLUME); ss.startSpeakingString("Hello world"); sd.waitForSpeechDone(TIME_TO_WAIT, true); } @@ -128,7 +133,8 @@ public void testStartSpeakingString() throws InterruptedException { public void testIsSpeaking() throws InterruptedException { NSSpeechSynthesizer ss = NSSpeechSynthesizer.synthesizerWithVoice(testVoice); SynthesizerDelegate sd = new SynthesizerDelegate(ss); - assertTrue(!ss.isSpeaking()); + ss.setVolume(VOLUME); + assertFalse(ss.isSpeaking()); ss.startSpeakingString("Hello world"); assertTrue(ss.isSpeaking()); sd.waitForSpeechDone(TIME_TO_WAIT, true); @@ -139,7 +145,8 @@ public void testIsAnyApplicationSpeaking() throws InterruptedException { NSSpeechSynthesizer ss = NSSpeechSynthesizer.synthesizerWithVoice(testVoice); SynthesizerDelegate sd = new SynthesizerDelegate(ss); ss.setDelegate(sd); - assertTrue(!NSSpeechSynthesizer.isAnyApplicationSpeaking()); + ss.setVolume(VOLUME); + assertFalse(NSSpeechSynthesizer.isAnyApplicationSpeaking()); ss.startSpeakingString("Hello world"); assertTrue(NSSpeechSynthesizer.isAnyApplicationSpeaking()); sd.waitForSpeechDone(TIME_TO_WAIT, true); @@ -150,6 +157,7 @@ public void testDidFinishSpeaking() { NSSpeechSynthesizer ss = NSSpeechSynthesizer.synthesizerWithVoice(testVoice); SynthesizerDelegate sd = new SynthesizerDelegate(ss); ss.setDelegate(sd); + ss.setVolume(VOLUME); ss.startSpeakingString("hello doctor"); sd.waitForSpeechDone(TIME_TO_WAIT, true); } @@ -160,6 +168,7 @@ public void testWillSpeakWord() { NSSpeechSynthesizer ss = NSSpeechSynthesizer.synthesizerWithVoice(testVoice); SynthesizerDelegate sd = new SynthesizerDelegate(ss); ss.setDelegate(sd); + ss.setVolume(VOLUME); String toSpeak = "hello doctor name"; ss.startSpeakingString(toSpeak); sd.waitForSpeechDone(5000, true); @@ -171,11 +180,12 @@ public void testWillSpeakPhoneme() { NSSpeechSynthesizer ss = NSSpeechSynthesizer.synthesizerWithVoice(testVoice); SynthesizerDelegate sd = new SynthesizerDelegate(ss); ss.setDelegate(sd); + ss.setVolume(VOLUME); String toSpeak = "blue daisy"; ss.startSpeakingString(toSpeak); sd.waitForSpeechDone(TIME_TO_WAIT, true); - //every so often some of the phonemes get flipped around, which isn't important to this test - List expected = new ArrayList<>(Arrays.asList(new String[] {"%", "b", "l", "UW", "d", "EY", "z", "IY", "%"})); + // every so often some phonemes get flipped around, which isn't important to this test + List expected = new ArrayList<>(Arrays.asList("%", "b", "l", "UW", "d", "EY", "z", "IY", "%")); Collections.sort(expected); List actual = new ArrayList<>(sd.getPhonemesSpoken()); Collections.sort(actual); @@ -188,23 +198,24 @@ public void testStopSpeakingAtBoundary() throws InterruptedException { NSSpeechSynthesizer ss = NSSpeechSynthesizer.synthesizerWithVoice(testVoice); SynthesizerDelegate sd = new SynthesizerDelegate(ss); ss.setDelegate(sd); + ss.setVolume(VOLUME); String toSpeak = "Hello are you receiving me now? I really hope someone is!"; ss.startSpeakingString(toSpeak); Thread.sleep(50); ss.stopSpeakingAtBoundary(NSSpeechSynthesizer.NSSpeechBoundary.WordBoundary); sd.waitForSpeechDone(TIME_TO_WAIT, false); - //don't want test case to be too timing dependent + // don't want test case to be too timing dependent assertTrue(sd.getWordsSpoken().size() < 3, "Expected less than 3 words but got: " + sd.getWordsSpoken()); assertTrue(sd.getWordsSpoken().size() >= 1, "Expected at least one word but got: " + sd.getWordsSpoken()); - //near as I can tell, SentenceBoundary just doesn't work! + // near as I can tell, SentenceBoundary just doesn't work! sd.reset(); ss.startSpeakingString(toSpeak); sd.waitForNextWord(TIME_TO_WAIT); ss.stopSpeakingAtBoundary(NSSpeechSynthesizer.NSSpeechBoundary.SentenceBoundary); sd.waitForWord(TIME_TO_WAIT, "now"); sd.waitForSpeechDone(TIME_TO_WAIT, false); - assertTrue(sd.getWordsSpoken().size() == 6, "Expected 6 word sentence but got: " + sd.getWordsSpoken()); + assertEquals(6, sd.getWordsSpoken().size(), "Expected 6 word sentence but got: " + sd.getWordsSpoken()); sd.reset(); ss.startSpeakingString(toSpeak); @@ -219,7 +230,8 @@ public void testStopSpeakingAtBoundary() throws InterruptedException { @Disabled("by vavi") public void testGetStatus() { NSSpeechSynthesizer ss = NSSpeechSynthesizer.synthesizerWithVoice(testVoice); - SynthesizerDelegate sd = new SynthesizerDelegate(ss); + SynthesizerDelegate sd = new SynthesizerDelegate(ss); + ss.setVolume(VOLUME); NSSpeechStatus status = ss.getStatus(); assertEquals(status.isOutputBusy(), ss.isSpeaking()); assertFalse(status.isOutputPaused()); @@ -240,10 +252,11 @@ public void testGetStatus() { public void testPauseSpeakingAtBoundary() throws InterruptedException { NSSpeechSynthesizer ss = NSSpeechSynthesizer.synthesizerWithVoice(testVoice); SynthesizerDelegate sd = new SynthesizerDelegate(ss); + ss.setVolume(VOLUME); ss.startSpeakingString("Status check number two"); sd.waitForNextWord(1000); ss.pauseSpeakingAtBoundary(NSSpeechSynthesizer.NSSpeechBoundary.WordBoundary); - Thread.sleep(1000); //this API is very asynchronous ... need to sleep before polling status + Thread.sleep(1000); // this API is very asynchronous ... need to sleep before polling status NSSpeechStatus status = ss.getStatus(); assertFalse(status.isOutputBusy(), "Output should not be busy"); assertTrue(status.isOutputPaused(), "Output should be paused"); @@ -265,6 +278,7 @@ public void testPauseSpeakingAtBoundary() throws InterruptedException { public void testPauseSpeakingAtSentenceBoundary() throws InterruptedException { NSSpeechSynthesizer ss = NSSpeechSynthesizer.synthesizerWithVoice(testVoice); SynthesizerDelegate sd = new SynthesizerDelegate(ss); + ss.setVolume(VOLUME); ss.startSpeakingString("This is the way the world ends. Not with a bang."); sd.waitForNextWord(1000); ss.pauseSpeakingAtBoundary(NSSpeechSynthesizer.NSSpeechBoundary.SentenceBoundary); @@ -273,7 +287,7 @@ public void testPauseSpeakingAtSentenceBoundary() throws InterruptedException { NSSpeechStatus status = ss.getStatus(); assertFalse(status.isOutputBusy(), "Output should not be busy"); assertTrue(status.isOutputPaused(), "Output should be paused"); - //often returns 22, which is just before 'ends'. There's a heck of a lag, basically, in the getStatus interface + // often returns 22, which is just before 'ends'. There's a heck of a lag, basically, in the getStatus interface assertTrue(status.getNumberOfCharactersLeft() >= 16, "Check number of characters left failed"); ss.continueSpeaking(); sd.waitForSpeechDone(5000, true); @@ -284,10 +298,11 @@ public void testPauseSpeakingAtSentenceBoundary() throws InterruptedException { public void testGetError() throws InterruptedException { NSSpeechSynthesizer ss = NSSpeechSynthesizer.synthesizerWithVoice(testVoice); SynthesizerDelegate sd = new SynthesizerDelegate(ss); + ss.setVolume(VOLUME); ss.startSpeakingString("Try this one [[pbas foobar]] two three"); sd.waitForWord(1000, "three"); assertTrue(sd.position > 0, "Should have error position"); - assertTrue(sd.errorMessage != null, "Should have error message"); + assertNotNull(sd.errorMessage, "Should have error message"); NSSpeechSynthesizer.NSSpeechError error = ss.getError(); assertTrue(error.getErrorCount() > 0, "Should find error"); @@ -334,8 +349,8 @@ public void testNumberMode() { public void testSynthesizerInfo() { NSSpeechSynthesizer ss = NSSpeechSynthesizer.synthesizerWithVoice(testVoice); NSSpeechSynthesizer.NSSpeechSynthesizerInfo ssi = ss.getSynthesizerInfo(); - assertTrue(ssi.getSynthesizerIdentifier() != null); - assertTrue(ssi.getSynthesizerVersion() != null); + assertNotNull(ssi.getSynthesizerIdentifier()); + assertNotNull(ssi.getSynthesizerVersion()); } @Test @@ -359,12 +374,12 @@ public void testPitchMod() { try { ss.setPitchMod(-1.0f); fail("Should have thrown IllegalArgumentException"); - } catch (IllegalArgumentException iae) { + } catch (IllegalArgumentException ignored) { } try { ss.setPitchMod(127.1f); fail("Should have thrown IllegalArgumentException"); - } catch (IllegalArgumentException iae) { + } catch (IllegalArgumentException ignored) { } } @@ -374,8 +389,8 @@ public void testPhonemeInfo() { List spis = ss.getPhonemeInfo(); assertTrue(spis.size() > 5); NSSpeechSynthesizer.NSSpeechPhonemeInfo spi = spis.get(4); - assertTrue(spi.getExample() != null); - assertTrue(spi.getSymbol() != null); + assertNotNull(spi.getExample()); + assertNotNull(spi.getSymbol()); assertTrue(spi.getHiliteEnd() >= 0); assertTrue(spi.getHiliteStart() >= 0); assertTrue(spi.getOpcode() != 0); @@ -386,6 +401,7 @@ public void testPhonemeInfo() { public void testRecentSyncAndCallback() throws InterruptedException { NSSpeechSynthesizer ss = NSSpeechSynthesizer.synthesizerWithVoice(testVoice); SynthesizerDelegate sd = new SynthesizerDelegate(ss); + ss.setVolume(VOLUME); ss.startSpeakingString("I see no " + NSSpeechSynthesizer.createSyncPoint('A') + " ships sailing"); sd.waitForWord(2500, "sailing"); assertEquals("A", sd.synchMark, "Should have synch with A"); @@ -413,6 +429,7 @@ public void testVoice() { public void testCommandDelimiter() { NSSpeechSynthesizer ss = NSSpeechSynthesizer.synthesizerWithVoice(testVoice); SynthesizerDelegate sd = new SynthesizerDelegate(ss); + ss.setVolume(VOLUME); // this raises a question - NSSpeechCommand - should it encapsulate the available commands and //offer factory methods? e.g. NSSpeechCommand.createSyncPoint above has a bug, in the sense that it doesn't know what the @@ -449,6 +466,7 @@ public void testSetOutputToFileURL() throws IOException { helloWorld.deleteOnExit(); NSSpeechSynthesizer ss = NSSpeechSynthesizer.synthesizerWithVoice(testVoice); SynthesizerDelegate sd = new SynthesizerDelegate(ss); + ss.setVolume(VOLUME); ss.setOutputToFileURL(helloWorld.toURI()); ss.startSpeakingString("Hello World"); sd.waitForSpeechDone(5000, true); @@ -474,6 +492,7 @@ public void testStartSpeakingStringToURL() throws IOException { helloWorld.deleteOnExit(); NSSpeechSynthesizer ss = NSSpeechSynthesizer.synthesizerWithVoice(testVoice); SynthesizerDelegate sd = new SynthesizerDelegate(ss); + ss.setVolume(VOLUME); ss.startSpeakingStringToURL("Hello World", helloWorld.toURI()); sd.waitForSpeechDone(5000, true); assertTrue(helloWorld.exists()); diff --git a/rococoa-contrib/src/test/java/org/rococoa/contrib/appkit/NSVoiceTest.java b/rococoa-contrib/src/test/java/org/rococoa/cocoa/appkit/NSVoiceTest.java similarity index 94% rename from rococoa-contrib/src/test/java/org/rococoa/contrib/appkit/NSVoiceTest.java rename to rococoa-contrib/src/test/java/org/rococoa/cocoa/appkit/NSVoiceTest.java index 9df4069..9322fc4 100644 --- a/rococoa-contrib/src/test/java/org/rococoa/contrib/appkit/NSVoiceTest.java +++ b/rococoa-contrib/src/test/java/org/rococoa/cocoa/appkit/NSVoiceTest.java @@ -16,14 +16,15 @@ * You should have received a copy of the GNU Lesser General Public License * along with Rococoa. If not, see . */ -package org.rococoa.contrib.appkit; +package org.rococoa.cocoa.appkit; import java.util.Locale; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; +import org.rococoa.cocoa.appkit.NSVoice; import org.rococoa.cocoa.foundation.NSArray; -import org.rococoa.contrib.appkit.NSVoice.VoiceGender; +import org.rococoa.cocoa.appkit.NSVoice.VoiceGender; import org.rococoa.test.RococoaTestCase; import static org.junit.jupiter.api.Assertions.*; diff --git a/rococoa-contrib/src/test/java/org/rococoa/cocoa/coregraphics/CGLibraryTest.java b/rococoa-contrib/src/test/java/org/rococoa/cocoa/coregraphics/CGLibraryTest.java new file mode 100644 index 0000000..9e579aa --- /dev/null +++ b/rococoa-contrib/src/test/java/org/rococoa/cocoa/coregraphics/CGLibraryTest.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2022 by Naohide Sano, All rights reserved. + * + * Programmed by Naohide Sano + */ + +package org.rococoa.cocoa.coregraphics; + +import com.sun.jna.Pointer; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; + + +/** + * CGLibraryTest. + * + * @author Naohide Sano (nsano) + * @version 0.00 2022-09-11 nsano initial version
+ */ +public class CGLibraryTest { + + @Test + void tes1() throws Exception { + CGRect r = new CGRect(10, 20, 200, 100); +System.err.println("rect: " + r); + } + + @Test + @Disabled("TODO crash at CGRect") + void tes2() throws Exception { + CGImage cgImage = new CGImage(CGLibraryTest.class.getResourceAsStream("/sample1.heic")); + CGRect r = new CGRect(10, 20, 200, 100); + Pointer cgImage2 = CGLibrary.library.CGImageCreateWithImageInRect(cgImage.pointer(), r); +System.err.println("CGImageCreateWithImageInRect: " + cgImage2); + } +} diff --git a/rococoa-contrib/src/test/java/org/rococoa/cocoa/coreimage/TestCoreImage.java b/rococoa-contrib/src/test/java/org/rococoa/cocoa/coreimage/TestCoreImage.java new file mode 100644 index 0000000..63fd50a --- /dev/null +++ b/rococoa-contrib/src/test/java/org/rococoa/cocoa/coreimage/TestCoreImage.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2022 by Naohide Sano, All rights reserved. + * + * Programmed by Naohide Sano + */ + +package org.rococoa.cocoa.coreimage; + +import com.sun.jna.Pointer; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.rococoa.cocoa.CGFloat; +import org.rococoa.cocoa.coregraphics.CGImage; +import org.rococoa.cocoa.coregraphics.CGLibrary; +import org.rococoa.cocoa.coregraphics.CGRect; +import org.rococoa.cocoa.foundation.NSArray; +import org.rococoa.cocoa.foundation.NSNumber; + + +/** + * TestCoreImage. + * + * @author Naohide Sano (nsano) + * @version 0.00 2022-09-11 nsano initial version
+ */ +class TestCoreImage { + + /** @see "https://stackoverflow.com/a/23877167" */ + @Test + @Disabled("TODO crash at CIImage#extent()") + void test1() throws Exception { + + Pointer/*CGColorRef*/ colorRef = CGLibrary.library.CGColorCreateGenericRGB( + new CGFloat(255.0), + new CGFloat(0), + new CGFloat(255.0), + new CGFloat(255.0)); + String colorString = CIColor.CLASS.colorWithCGColor(colorRef).stringRepresentation(); + CIColor coreColor = CIColor.CLASS.colorWithString(colorString); + + CIContext context = CIContext.CLASS.contextWithOptions(null);; + + CGImage cgImage = new CGImage(TestCoreImage.class.getResourceAsStream("/sample1.heic")); +System.err.println("cgImage: " + cgImage.getWidth() + "x" + cgImage.getHeight()); + + // Convert UIImage to CIImage + CIImage ciImage = cgImage.toCIImage(); + + // Set values for CIColorMonochrome Filter + CIFilter filter = CIFilter.CLASS.filterWithName("CIColorMonochrome"); + NSArray a = filter.inputKeys(); +for (int i = 0; i < a.count(); i++) { + System.err.printf("[%d] %s%n", i, a.objectAtIndex(i)); +} + filter.setValue_forKey(ciImage, "inputImage"); + filter.setValue_forKey(NSNumber.numberWithInt(1), "inputIntensity"); + filter.setValue_forKey(coreColor, "inputColor"); + + CIImage result = filter.outputImage(); +System.err.println("result: " + result); + + CGRect extent = result.extent(); +System.err.println("extent: " + extent); + + Pointer/*CGImageRef*/ cgImage2 = context.createCGImage_fromRect(result, extent); +System.err.println("hereE: " + cgImage2); + } +} diff --git a/rococoa-contrib/src/test/resources/sample1.heic b/rococoa-contrib/src/test/resources/sample1.heic new file mode 100644 index 0000000000000000000000000000000000000000..00cc549c037e4241d6e3c739a409fb318e82dd9a GIT binary patch literal 293608 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 z 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

|QMAEUyU-INy1x)!Oqfl!`7&uiPw`98xb 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 +u%5JFZk{f2 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 Guh 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 LOL#BesH_s697_Tp literal 0 HcmV?d00001 diff --git a/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSData.java b/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSData.java index c444407..696c958 100644 --- a/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSData.java +++ b/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSData.java @@ -32,10 +32,14 @@ public static NSData dataWithContentsOfURL(NSURL url) { } public static NSData dataWithBytes(byte[] bytes) { - return CLASS.data().initWithBytes_length(bytes, bytes.length); + return CLASS.alloc().initWithBytes_length(bytes, bytes.length); } public interface _Class extends ObjCClass { + /** + */ + NSData alloc(); + /** * Original signature : data()
* from NSDataCreation native declaration : :53 diff --git a/rococoa-core/src/main/java/org/rococoa/internal/FoundationLibrary.java b/rococoa-core/src/main/java/org/rococoa/internal/FoundationLibrary.java index e69b825..9e9fe97 100644 --- a/rococoa-core/src/main/java/org/rococoa/internal/FoundationLibrary.java +++ b/rococoa-core/src/main/java/org/rococoa/internal/FoundationLibrary.java @@ -55,10 +55,16 @@ public interface FoundationLibrary extends Library { ID CFStringTokenizerCopyCurrentTokenAttribute(ID tokenizer, int attribute); int CFStringTokenizerAdvanceToNextToken(ID tokenizer); - static final ID kCFAllocatorDefault = null; - static final int kCFStringTokenizerUnitWordBoundary = 4; - static final int kCFStringTokenizerTokenNone = 0; - static final int kCFStringTokenizerAttributeLatinTranscription = 1 << 16; + /** + * This is a synonym for NULL. + * @see "https://developer.apple.com/documentation/corefoundation/kcfallocatordefault" + */ + ID kCFAllocatorDefault = null; + + int kCFStringTokenizerUnitWordBoundary = 4; + int kCFStringTokenizerTokenNone = 0; + int kCFStringTokenizerAttributeLatinTranscription = 1 << 16; + // TODO static final String kCFStringTransformLatinHiragana = "Latin-Hiragana"; } \ No newline at end of file From 3362775e58deb844eddb652043646971ab630888 Mon Sep 17 00:00:00 2001 From: Naohide Sano Date: Fri, 30 Sep 2022 12:54:12 +0900 Subject: [PATCH 03/36] clean up --- .../src/main/jnaerator/config.jnaerator | 7 +++- .../cocoa/foundation/NSDateFormatter.java | 2 +- .../rococoa/cocoa/foundation/NSLocale.java | 2 +- .../java/org/rococoa/cocoa/qtkit/QTMovie.java | 20 ++++----- .../org/rococoa/cocoa/qtkit/QTMovieView.java | 2 +- .../src/main/java/org/rococoa/Foundation.java | 41 ++++++++----------- .../src/main/java/org/rococoa/ID.java | 2 +- .../org/rococoa/cocoa/foundation/NSArray.java | 2 +- .../org/rococoa/cocoa/foundation/NSDate.java | 2 +- .../org/rococoa/cocoa/foundation/NSError.java | 2 +- .../cocoa/foundation/NSMutableArray.java | 2 +- .../cocoa/foundation/NSNotification.java | 2 +- .../foundation/NSNotificationCenter.java | 2 +- .../rococoa/cocoa/foundation/NSNumber.java | 2 +- .../rococoa/cocoa/foundation/NSString.java | 2 +- .../org/rococoa/cocoa/foundation/NSValue.java | 2 +- .../test/java/org/rococoa/RococoaTest.java | 17 ++++---- 17 files changed, 53 insertions(+), 58 deletions(-) diff --git a/rococoa-auto/src/main/jnaerator/config.jnaerator b/rococoa-auto/src/main/jnaerator/config.jnaerator index cf59c1b..187e12a 100644 --- a/rococoa-auto/src/main/jnaerator/config.jnaerator +++ b/rococoa-auto/src/main/jnaerator/config.jnaerator @@ -1,12 +1,15 @@ --F "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks:$(JNAERATOR_FRAMEWORKS_PATH)" +// TODO -F seems not working +//-F "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks:$(JNAERATOR_FRAMEWORKS_PATH)" +-F "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks" //-framework Foundation //-framework AppKit //-framework CoreFoundation //-framework CoreGraphics +//-framework CoreImage -root org.rococoa.cocoa //-parseInOneChunk --runtime JNAerator +-runtime JNA //-o "$(DIR)/../java" // overwrite versioned files instead of writing to target/generated-sources/java diff --git a/rococoa-cocoa/src/main/java/org/rococoa/cocoa/foundation/NSDateFormatter.java b/rococoa-cocoa/src/main/java/org/rococoa/cocoa/foundation/NSDateFormatter.java index c0108dc..4ce92ee 100644 --- a/rococoa-cocoa/src/main/java/org/rococoa/cocoa/foundation/NSDateFormatter.java +++ b/rococoa-cocoa/src/main/java/org/rococoa/cocoa/foundation/NSDateFormatter.java @@ -23,7 +23,7 @@ import org.rococoa.Rococoa; public abstract class NSDateFormatter extends NSFormatter { - public static final _Class CLASS = Rococoa.createClass("NSDateFormatter", _Class.class); //$NON-NLS-1$ + public static final _Class CLASS = Rococoa.createClass("NSDateFormatter", _Class.class); public abstract class _Class extends NSObject._class_ { } diff --git a/rococoa-cocoa/src/main/java/org/rococoa/cocoa/foundation/NSLocale.java b/rococoa-cocoa/src/main/java/org/rococoa/cocoa/foundation/NSLocale.java index 87ce0af..58300b5 100644 --- a/rococoa-cocoa/src/main/java/org/rococoa/cocoa/foundation/NSLocale.java +++ b/rococoa-cocoa/src/main/java/org/rococoa/cocoa/foundation/NSLocale.java @@ -24,7 +24,7 @@ import org.rococoa.Rococoa; public abstract class NSLocale extends NSObject { - public static final _Class CLASS = Rococoa.createClass("NSLocale", _Class.class); //$NON-NLS-1$ + public static final _Class CLASS = Rococoa.createClass("NSLocale", _Class.class); public abstract class _Class extends NSObject._class_ { public abstract NSLocale autoupdatingCurrentLocale(); } diff --git a/rococoa-cocoa/src/main/java/org/rococoa/cocoa/qtkit/QTMovie.java b/rococoa-cocoa/src/main/java/org/rococoa/cocoa/qtkit/QTMovie.java index 25a479e..3c80eca 100755 --- a/rococoa-cocoa/src/main/java/org/rococoa/cocoa/qtkit/QTMovie.java +++ b/rococoa-cocoa/src/main/java/org/rococoa/cocoa/qtkit/QTMovie.java @@ -52,7 +52,7 @@ private static final _Class CLASS = Foundation.callOnMainThread(new Callable<_Class>() { public _Class call() throws Exception { - return Rococoa.wrap(Foundation.getClass("QTMovie"), _Class.class); //$NON-NLS-1$ + return Rococoa.wrap(Foundation.getClass("QTMovie"), _Class.class); } }); @@ -64,19 +64,19 @@ public _Class call() throws Exception { public abstract QTMovie movieWithQuickTimeMovie_disposeWhenDone_error(Pointer movie, boolean b, ObjCObjectByReference errorReference); } - public static final String QTMovieTimeScaleAttribute = "QTMovieTimeScaleAttribute"; //$NON-NLS-1$ - public static final String QTMovieFileNameAttribute = "QTMovieFileNameAttribute"; //$NON-NLS-1$ - public static final String QTMovieOpenAsyncOKAttribute = "QTMovieOpenAsyncOKAttribute"; //$NON-NLS-1$ - public static final String QTMoviePlaysSelectionOnlyAttribute = "QTMoviePlaysSelectionOnlyAttribute"; //$NON-NLS-1$ - public static final String QTMovieLoadStateAttribute = "QTMovieLoadStateAttribute"; //$NON-NLS-1$ + public static final String QTMovieTimeScaleAttribute = "QTMovieTimeScaleAttribute"; + public static final String QTMovieFileNameAttribute = "QTMovieFileNameAttribute"; + public static final String QTMovieOpenAsyncOKAttribute = "QTMovieOpenAsyncOKAttribute"; + public static final String QTMoviePlaysSelectionOnlyAttribute = "QTMoviePlaysSelectionOnlyAttribute"; + public static final String QTMovieLoadStateAttribute = "QTMovieLoadStateAttribute"; public static final long QTMovieLoadStateError = -1L; public static final long QTMovieLoadStateLoading = 1000L; public static final long QTMovieLoadStateComplete = 100000L; - public static final String QTMovieFlatten = "QTMovieFlatten"; //$NON-NLS-1$ - public static final String QTMovieExport = "QTMovieExport"; //$NON-NLS-1$ - public static final String QTMovieExportType = "QTMovieExportType"; //$NON-NLS-1$ - public static final String QTMovieEditableAttribute = "QTMovieEditableAttribute"; //$NON-NLS-1$ + public static final String QTMovieFlatten = "QTMovieFlatten"; + public static final String QTMovieExport = "QTMovieExport"; + public static final String QTMovieExportType = "QTMovieExportType"; + public static final String QTMovieEditableAttribute = "QTMovieEditableAttribute"; public static QTMovie movie() { return CLASS.movie(); diff --git a/rococoa-cocoa/src/main/java/org/rococoa/cocoa/qtkit/QTMovieView.java b/rococoa-cocoa/src/main/java/org/rococoa/cocoa/qtkit/QTMovieView.java index acf3e37..d20f081 100644 --- a/rococoa-cocoa/src/main/java/org/rococoa/cocoa/qtkit/QTMovieView.java +++ b/rococoa-cocoa/src/main/java/org/rococoa/cocoa/qtkit/QTMovieView.java @@ -36,7 +36,7 @@ public static class _Class { public QTMovieView create() { return Foundation.callOnMainThread(new Callable() { public QTMovieView call() throws Exception { - return Rococoa.create("QTMovieView", QTMovieView.class); //$NON-NLS-1$ + return Rococoa.create("QTMovieView", QTMovieView.class); }}); } } diff --git a/rococoa-core/src/main/java/org/rococoa/Foundation.java b/rococoa-core/src/main/java/org/rococoa/Foundation.java index 3d3f077..5cfb588 100644 --- a/rococoa-core/src/main/java/org/rococoa/Foundation.java +++ b/rococoa-core/src/main/java/org/rococoa/Foundation.java @@ -20,6 +20,7 @@ package org.rococoa; import java.io.UnsupportedEncodingException; +import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; import java.util.concurrent.Callable; @@ -101,14 +102,10 @@ public static void nsLog(String format, Object thing) { public static ID cfString(String s) { // Use a byte[] rather than letting jna do the String -> char* marshalling itself. // Turns out about 10% quicker for long strings. - try { - byte[] utf16Bytes = s.getBytes("UTF-16LE"); - return foundationLibrary.CFStringCreateWithBytes(null, utf16Bytes, - utf16Bytes.length, - StringEncoding.kCFStringEncodingUTF16LE.value, (byte) 0); - } catch (UnsupportedEncodingException x) { - throw new RococoaException(x); - } + byte[] utf16Bytes = s.getBytes(StandardCharsets.UTF_16LE); + return foundationLibrary.CFStringCreateWithBytes(null, utf16Bytes, + utf16Bytes.length, + StringEncoding.kCFStringEncodingUTF16LE.value, (byte) 0); } public static ID cfLocaleCreateCanonicalLanguageIdentifierFromString(ID allocator, String localeIdentifier) { @@ -165,19 +162,15 @@ public static String toString(ID cfString) { /* Experimental */ static String toStringViaUTF16(ID cfString) { - try { - int lengthInChars = foundationLibrary.CFStringGetLength(cfString); - int potentialLengthInBytes = 3 * lengthInChars + 1; // UTF16 fully escaped 16 bit chars, plus nul - - byte[] buffer = new byte[potentialLengthInBytes]; - byte ok = foundationLibrary.CFStringGetCString(cfString, buffer, buffer.length, StringEncoding.kCFStringEncodingUTF16LE.value); - if (ok == 0) { - throw new RococoaException("Could not convert string"); - } - return new String(buffer, "UTF-16LE").substring(0, lengthInChars); - } catch (UnsupportedEncodingException e) { - throw new RococoaException(e); + int lengthInChars = foundationLibrary.CFStringGetLength(cfString); + int potentialLengthInBytes = 3 * lengthInChars + 1; // UTF16 fully escaped 16 bit chars, plus nul + + byte[] buffer = new byte[potentialLengthInBytes]; + byte ok = foundationLibrary.CFStringGetCString(cfString, buffer, buffer.length, StringEncoding.kCFStringEncodingUTF16LE.value); + if (ok == 0) { + throw new RococoaException("Could not convert string"); } + return new String(buffer, StandardCharsets.UTF_16LE).substring(0, lengthInChars); } static String toStringViaUTF8(ID cfString) { @@ -230,7 +223,7 @@ public static T send(ID receiver, String selectorName, Class returnType, public static T send(ID receiver, Selector selector, Class returnType, Object... args) { if (logging.isLoggable(Level.FINEST)) { logging.finest(String.format("sending (%s) %s.%s(%s)", - new Object[]{returnType.getSimpleName(), receiver, selector.getName(), new VarArgsUnpacker(args)})); + returnType.getSimpleName(), receiver, selector.getName(), new VarArgsUnpacker(args))); } return (T) messageSendLibrary.syntheticSendMessage(returnType, receiver, selector, args); } @@ -263,18 +256,19 @@ public static T callOnMainThread(final Callable callable) { } /** - * Run runnable on the main Cococoa thread, waiting for completion. + * Run runnable on the main Rococoa thread, waiting for completion. */ public static void runOnMainThread(final Runnable runnable) { MainThreadUtils.runOnMainThread(rococoaLibrary, runnable, true); } /** - * Run runnable on the main Cococoa thread, optionally waiting for completion. + * Run runnable on the main Rococoa thread, optionally waiting for completion. */ public static void runOnMainThread(Runnable runnable, boolean waitUntilDone) { MainThreadUtils.runOnMainThread(rococoaLibrary, runnable, waitUntilDone); } + /** * Create an Objective-C object which delegates to callbacks when methods * are invoked on it. @@ -303,5 +297,4 @@ public static boolean selectorNameMeansWeOwnReturnedObject(String selectorName) selectorName.startsWith("new") || selectorName.toLowerCase().contains("copy"); } - } diff --git a/rococoa-core/src/main/java/org/rococoa/ID.java b/rococoa-core/src/main/java/org/rococoa/ID.java index b7857ab..895cfbd 100644 --- a/rococoa-core/src/main/java/org/rococoa/ID.java +++ b/rococoa-core/src/main/java/org/rococoa/ID.java @@ -56,7 +56,7 @@ protected ID(ID anotherID) { @Override public String toString() { - return String.format("[ID 0x%x]", longValue()); //$NON-NLS-1$ + return String.format("[ID 0x%x]", longValue()); } public boolean isNull() { diff --git a/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSArray.java b/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSArray.java index 5d60831..03566d0 100755 --- a/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSArray.java +++ b/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSArray.java @@ -24,7 +24,7 @@ public abstract class NSArray extends NSEnumerator { - public static final _Class CLASS = Rococoa.createClass("NSArray", _Class.class); //$NON-NLS-1$ + public static final _Class CLASS = Rococoa.createClass("NSArray", _Class.class); public interface _Class extends ObjCClass { /** * @param objects Contents and then a trailing null diff --git a/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSDate.java b/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSDate.java index b501487..2fcfc3e 100644 --- a/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSDate.java +++ b/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSDate.java @@ -24,7 +24,7 @@ public abstract class NSDate extends NSObject { - public static final _Class CLASS = Rococoa.createClass("NSDate", _Class.class); //$NON-NLS-1$ + public static final _Class CLASS = Rococoa.createClass("NSDate", _Class.class); public interface _Class extends ObjCClass { public NSDate dateWithTimeIntervalSince1970(double d); } diff --git a/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSError.java b/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSError.java index 1f25c0a..6aa3e94 100644 --- a/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSError.java +++ b/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSError.java @@ -24,7 +24,7 @@ public abstract class NSError extends NSObject { - public static final _Class CLASS = Rococoa.createClass("NSError", _Class.class); //$NON-NLS-1$ + public static final _Class CLASS = Rococoa.createClass("NSError", _Class.class); public interface _Class extends ObjCClass { NSError alloc(); diff --git a/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSMutableArray.java b/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSMutableArray.java index 34bade1..9f7573e 100644 --- a/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSMutableArray.java +++ b/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSMutableArray.java @@ -24,7 +24,7 @@ public abstract class NSMutableArray extends NSObject { - public static final _Class CLASS = Rococoa.createClass("NSMutableArray", _Class.class); //$NON-NLS-1$ + public static final _Class CLASS = Rococoa.createClass("NSMutableArray", _Class.class); public interface _Class extends ObjCClass { NSMutableArray array(); NSMutableArray arrayWithCapacity(int numItems); diff --git a/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSNotification.java b/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSNotification.java index 1919a87..65a6d73 100644 --- a/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSNotification.java +++ b/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSNotification.java @@ -24,7 +24,7 @@ public abstract class NSNotification extends NSObject { - public static final _Class CLASS = Rococoa.createClass("NSNotification", _Class.class); //$NON-NLS-1$ + public static final _Class CLASS = Rococoa.createClass("NSNotification", _Class.class); public interface _Class extends ObjCClass { NSNotification notificationWithName_object(String notificationName, NSObject object); } diff --git a/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSNotificationCenter.java b/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSNotificationCenter.java index 7ca145b..4dda9bd 100644 --- a/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSNotificationCenter.java +++ b/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSNotificationCenter.java @@ -26,7 +26,7 @@ public abstract class NSNotificationCenter extends NSObject { - public static final _Class CLASS = Rococoa.createClass("NSNotificationCenter", _Class.class); //$NON-NLS-1$ + public static final _Class CLASS = Rococoa.createClass("NSNotificationCenter", _Class.class); public interface _Class extends ObjCClass { public NSNotificationCenter defaultCenter(); } diff --git a/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSNumber.java b/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSNumber.java index 752a73f..31b50d3 100644 --- a/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSNumber.java +++ b/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSNumber.java @@ -24,7 +24,7 @@ public abstract class NSNumber extends NSObject { - public static final _Class CLASS = Rococoa.createClass("NSNumber", _Class.class); //$NON-NLS-1$ + public static final _Class CLASS = Rococoa.createClass("NSNumber", _Class.class); public interface _Class extends ObjCClass { public NSNumber numberWithBool(boolean value); public NSNumber numberWithInt(int value); diff --git a/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSString.java b/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSString.java index 96e5142..2145ae6 100644 --- a/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSString.java +++ b/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSString.java @@ -26,7 +26,7 @@ public abstract class NSString extends NSObject { - public static _Class CLASS = Rococoa.createClass("NSString", _Class.class); //$NON-NLS-1$ + public static _Class CLASS = Rococoa.createClass("NSString", _Class.class); public interface _Class extends ObjCClass { NSString stringWithString(String string); diff --git a/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSValue.java b/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSValue.java index ca9d30a..02e73c5 100755 --- a/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSValue.java +++ b/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSValue.java @@ -27,7 +27,7 @@ public abstract class NSValue extends NSObject { - public static final _Class CLASS = Rococoa.createClass("NSValue", _Class.class); //$NON-NLS-1$ + public static final _Class CLASS = Rococoa.createClass("NSValue", _Class.class); public interface _Class extends ObjCClass { NSValue valueWithSize(NSSize size); NSValue valueWithBytes_objCType(byte[] value, String type); diff --git a/rococoa-core/src/test/java/org/rococoa/RococoaTest.java b/rococoa-core/src/test/java/org/rococoa/RococoaTest.java index e8a1eb5..6b0331e 100644 --- a/rococoa-core/src/test/java/org/rococoa/RococoaTest.java +++ b/rococoa-core/src/test/java/org/rococoa/RococoaTest.java @@ -41,17 +41,17 @@ public class RococoaTest extends RococoaTestCase { NSNumber fortyTwo = NSNumber.CLASS.numberWithInt(42); NSNumber fortyTwoAlias = Rococoa.wrap(fortyTwo.id(), NSNumber.class); NSNumber fortyThree = NSNumber.CLASS.numberWithInt(43); - assertTrue(fortyTwo.equals(fortyTwoAlias)); - assertTrue(fortyTwoAlias.equals(fortyTwo)); - assertFalse(fortyTwo.equals(fortyThree)); - assertFalse(fortyTwo.equals(null)); + assertEquals(fortyTwo, fortyTwoAlias); + assertEquals(fortyTwoAlias, fortyTwo); + assertNotEquals(fortyTwo, fortyThree); + assertNotEquals(null, fortyTwo); } @Test public void testEqualsMapsToIsEqual() { NSString s1 = NSString.stringWithString("string"); NSString s2 = NSString.stringWithString("STRING").lowercaseString(); assertNotSame(s1, s2); - assertFalse(s1.id().equals(s2.id())); + assertNotEquals(s1.id(), s2.id()); assertEquals(s1, s2); } @@ -98,7 +98,7 @@ public class RococoaTest extends RococoaTestCase { } @Test public void testFactory() { - NSNumber._Class nsNumberClass = Rococoa.createClass("NSNumber", NSNumber._Class.class); //$NON-NLS-1$ + NSNumber._Class nsNumberClass = Rococoa.createClass("NSNumber", NSNumber._Class.class); assertEquals(nsNumberClass.id(), Foundation.getClass("NSNumber")); } @@ -108,8 +108,8 @@ public interface OddClass extends ObjCClass { @Test public void testDownCast() { // this is OK - NSObject numberAsObject = NSNumber.CLASS.numberWithInt(42); - assertEquals(42, ((NSNumber) numberAsObject).intValue()); + NSNumber numberAsObject = NSNumber.CLASS.numberWithInt(42); + assertEquals(42, numberAsObject.intValue()); // but when defined return type is NSObject, we can't cast Java objects OddClass nsClass = Rococoa.createClass("NSNumber", OddClass.class); @@ -134,5 +134,4 @@ public interface OddClass extends ObjCClass { assertEquals(NSString.class.getPackage(), stringClass.getPackage()); assertEquals("NSString$$ByRococoa", stringClass.getSimpleName()); } - } From 6437295429f23cad8c0dd2d15bb012096c05124d Mon Sep 17 00:00:00 2001 From: Naohide Sano Date: Fri, 30 Sep 2022 12:55:20 +0900 Subject: [PATCH 04/36] update settings --- README.md | 9 +++++++-- pom.xml | 26 ++++++++++++++++---------- rococoa-auto/pom.xml | 19 ++++++------------- rococoa-contrib/pom.xml | 25 +++++++++++++++++++++++-- rococoa-core/pom.xml | 10 ++++++++-- rococoa-functionaltest/pom.xml | 3 ++- 6 files changed, 62 insertions(+), 30 deletions(-) diff --git a/README.md b/README.md index d261107..fe055ad 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ [![GitHub Packages](https://github.com/umjammer/rococoa/actions/workflows/maven-publish.yml/badge.svg)](https://github.com/umjammer/rococoa/actions/workflows/maven-publish.yml) [![CodeQL](https://github.com/umjammer/rococoa/actions/workflows/codeql-analysis.yml/badge.svg)](https://github.com/umjammer/rococoa/actions/workflows/codeql-analysis.yml) +![Java](https://img.shields.io/badge/Java-8-b07219) # īŖŋ Welcome to Rococoa @@ -32,6 +33,10 @@ any other problems. ## TODO * https://github.com/ibinti/bugvm - * http://cocoawithlove.com/2009/10/how-blocks-are-implemented-and.html - * http://www.opensource.apple.com/source/libclosure/libclosure-38/BlockImplementation.txt + * NSUrl tags (wip) + * block (wip) + * http://cocoawithlove.com/2009/10/how-blocks-are-implemented-and.html + * http://www.opensource.apple.com/source/libclosure/libclosure-38/BlockImplementation.txt + * CIFilter (wip) + * https://gitlab.com/axet/apple \ No newline at end of file diff --git a/pom.xml b/pom.xml index f399ae6..23f3416 100644 --- a/pom.xml +++ b/pom.xml @@ -6,8 +6,8 @@ org.rococoa rococoa-parent + 0.8.5-SNAPSHOT pom - 0.8.4 rococoa-auto @@ -80,12 +80,12 @@ 1.8 1.8 + 5.12.1 github - GitHub umjammer Apache Maven Packages https://maven.pkg.github.com/umjammer/rococoa @@ -94,8 +94,9 @@ + org.apache.maven.plugins maven-dependency-plugin - 2.10 + 3.3.0 copy @@ -124,8 +125,9 @@ + org.apache.maven.plugins maven-source-plugin - 2.2.1 + 3.2.1 attach-sources @@ -136,7 +138,9 @@ + org.apache.maven.plugins maven-javadoc-plugin + 3.4.0 attach-javadocs @@ -148,15 +152,19 @@ false false false - -Xdoclint:none -Xdoclint:-missing + + -Xdoclint:none + -Xdoclint:-missing + none + org.apache.maven.plugins maven-resources-plugin - 2.6 + 3.2.0 true UTF-8 @@ -196,7 +204,7 @@ net.java.dev.jna jna - 5.9.0 + ${jna.version} cglib @@ -207,7 +215,7 @@ org.junit junit-bom - 5.8.1 + 5.8.2 pom import @@ -217,7 +225,6 @@ github - GitHub umjammer Apache Maven Packages https://maven.pkg.github.com/umjammer/rococoa-core @@ -239,5 +246,4 @@ test - \ No newline at end of file diff --git a/rococoa-auto/pom.xml b/rococoa-auto/pom.xml index b21b8a8..965276f 100644 --- a/rococoa-auto/pom.xml +++ b/rococoa-auto/pom.xml @@ -46,30 +46,17 @@ sonatype-oss-public https://oss.sonatype.org/content/groups/public - - true - - - true - nativelibs4java - NativeLibs4Java https://nativelibs4java.sourceforge.net/maven sonatype-oss-public https://oss.sonatype.org/content/groups/public - - true - - - true - @@ -78,7 +65,9 @@ com.nativelibs4java jnaerator-runtime ${jnaerator.version} + provided + org.rococoa rococoa-core @@ -88,9 +77,13 @@ + org.apache.maven.plugins maven-javadoc-plugin + 3.4.0 + 128m 512 true diff --git a/rococoa-contrib/pom.xml b/rococoa-contrib/pom.xml index f25f80e..497a10f 100644 --- a/rococoa-contrib/pom.xml +++ b/rococoa-contrib/pom.xml @@ -19,11 +19,14 @@ + org.apache.maven.plugins maven-dependency-plugin + 3.3.0 + org.apache.maven.plugins maven-surefire-plugin - 3.0.0-M4 + 3.0.0-M7 once false @@ -33,6 +36,13 @@ + + + jitpack.io + https://jitpack.io + + + org.rococoa @@ -42,12 +52,23 @@ org.rococoa rococoa-cocoa + + net.java.dev.jna + jna-platform + ${jna.version} + + org.rococoa rococoa-core test-jar test + + com.github.umjammer + vavi-commons + 1.1.6 + test + - diff --git a/rococoa-core/pom.xml b/rococoa-core/pom.xml index b40e3dc..396ec0a 100644 --- a/rococoa-core/pom.xml +++ b/rococoa-core/pom.xml @@ -21,6 +21,7 @@ org.codehaus.mojo native-maven-plugin + 1.0-alpha-11 true @@ -43,7 +44,7 @@ -framework QTKit -framework Foundation - + @@ -101,7 +102,9 @@ + org.apache.maven.plugins maven-jar-plugin + 2.4 @@ -112,8 +115,9 @@ + org.apache.maven.plugins maven-surefire-plugin - 3.0.0-M5 + 3.0.0-M7 Y6)^P)~_BJF@c(HIP)xPGp5x;dVFx}*NyI(qMtgAX|rh}<^ik3O4XBAdkbhOmZ z9YgIRUlLbM)b13IDPjNs6$1^d^R9YtuKEI&g0lBXNjN8BPYlrbg#(yN2>5V5 z>cC}LhdQy*-6e;`jID4k909*Qo99BV#{}oZ=KTItKCS7pmb-Q1r)7esI=1ktrl;J& z-ITE)$e@sLa=~$v_>USd@WY@RtS+w?P}It{>PT>j1w?Hl%EN$H%GkzF0F15)1dUQ! zd#_N^S|&=0ifZbaq>fn*_yUF7we@>|8fd*a)py6U^p#@P&qpH13^e}$ zHCa#O1-zTu5%~6y8)}e1&JP;$?_AxZth&fXw;3#Z2F^B*ejxRoY}RY7 zuu@J%#x2V4|DTYTc!0xhSac zZq;z45D<4a?#KX^BOG~;8T8QWmr>jLiv4z}7UUNisi!Y=ckotGCgxV17;XOmXFgnl zGD+l~>3@k6d^@hUTqx}J+m%|%^7xglAt<=o1bavd**k=XaRd%M>J?pQZM#ua%~ESA zs_E@tD?2pM8EWeus%Z-iyF(xnC}P8Q6!3V_V&X4(cJz6Xy>j2f)igLZHs$1{byfbB z`$*Fmgmcr*{yS3mtfq2}o!gzp;s={<#p9lN)Eh^QL2E%Qlf;{#njn$+WL8`gyx@Vx z2^mv@IU_|Npnk2g(VFhHqqe2Ko>-Y~(o~$IGPYF0uLzIIHi3uS4(yOMbohDFHak_x zDJyBMy=z%qQejqBraF6VFl@YvvMTOuVYf2z#sSWmhk!e>2HN^}pPpzQ$3J7b6;WAV zSpbGwN43QAI#aB&nY>`UZ;g*752pZX?eOx)G}k}dmDI*~t<+8;tDW1rupwhn-2G1j z@2l^`ewm=EOBL45D&5w)Mew7Q07xTjD4Ao(lO2mFK5PTWuR3d|X{>iE>=w$G>h7R| zohoN~sl_xVp)wKRjFY^sN0cc}-e6ln78R0PoGGUC_BZRzY|A^tK)XECG#?W>dXo29 zPw^U@TjmU@QEsT|`uUntxgm(~aJ|9YGI-$n>YLS_Gtt+}P4lUK81)@3y5CP;wRM#5 zx{6vFxYUVSj7}7S@v+QuU>4KHUTX3@y%0us)h=wJc%dOfP`Id^Vo=7LCS<${>9bzajtZ;Z>ILPM&;OMPI z>blj_%WQ(FL)X={ZBaln?%)6m1Lgn@2c}QHtFY5m)HHBJjU-Q*-A6CNS$2e#tMtE5MMFtVQ*^WoopTQsDLfT%5cI=_9h@yOSl$He*Y#MSNfT9|h-Ie-VB(FWKtz{{T-?3-uK{Mq=|ulo9Ypu@Pv6 z=dEwKA1%~R7w+-3X#fYGUm(_wCkHe7K+T&|M}PkS$GKFG63@{Hz|e57f(zpvGK(jamd6m3?XY1JOL->W( zH2rtd%X;bBsp7U!N~v+Ck|2&`bF~MFjQM;+oNz%pru0oLPj0yvf|he6h$Moc5!V}c z0s{l)7$ZMjCW^YG^=&Ure(IXZaPfX-l_5x#gCldm9Qjm_s*P{3HV{eIkDypMyhE{4 zXKt5Y&#E4_x}Oe6R>>mx%AEYPgswY~dwIQomNZMI<3SaCbrHk9mAqtzS%M&+%CW8s zd7Ozc#(3|-@Cvu0I)Vu#j%jIjJCGm7;zD`OKE3p2>t;PA(6-i+t{1qq-Rc9xi>hB3YuHRB|IVSv(mjWJ}hjF8etCM z<^&uNbM4z2&3c-m8-HK*6&Sj;qK1NUEfml|tdPoM4Z9L$e;H&9Lj@8x2eJPEf&D~o zT^_Ra4er}pc&fP?{{RgoNZl01sJoN}8?ud%Gu&rY&c5l+p}Tdp<7!E5v{g#R8>Em( z@JxkQWL_jWBPFCcJPc&^8t}ap1ET4P+lb;1{@byrz4WlXH%Q7KfQitZy=sp1tXICd zDbm)udKsgsk_KkEM_2?hBY>M+0x-|P^B^OTyFeHqr>ehol{C{>m#O81)EVlnj~zg! zL^$6flOJP@jN~4BV;a{!7+U&Urg~z-Rd=^^{QY502$ta`R8!2A3oBrUbL1G>z<@9@ z>z!!ze-oscDrl*%)C)XM;e%CLrZxoOn<4r9zMAyTYz_XLY^vl3vd4_f*9jc!+lgL8 zr>eNxFV_B{l7_-1@mj9cRX0~b3~v#_9H%++r>+Pff<1I6tz>?pyftaN^o%N>>f(c_ zV%y>~F?ZU|dGi6^01iEMuKxg(2TgR<;=xySut#Nk=to&aqM|hUuM##Ays?McafEQ= z4dlVyuPuJlo(gDShM_ze99IDt+w2Y}B9QGLJ>#MkCH1?VWjW+&%YN}$SbDnc? zH@e+E2U@N4)tyTvP2xIB^+gb*w^dqhFwU_?`SDIycbt_`&N$8vbBayY$h{D^KAGw| zy6Ed=srla&Q^NE!1yYc>-JoNQ+i1e=nz7i~rA`nD@qAU(bJFwew zGpaGkEPWv76Pd1|T!`X3yS&rpjgw#lK&Lj%^9O++b(2Qcs8PT5y#$Uyz-lZNZb9=Y znU0K+g;K za--8D?T^*dAgeEK*ufz7Io6%X*Yio;Ymvk z1trxd6|~X^h9ev8NtKBNo(h4Hj&cCxa9iox+6#Y7SZQi*5Tx|hx>zMpvT*4Nss0i> zgQAl4J)#)j8rh@!WytI;WFRrxpkWH6!1<=mwzfpF04(@(E-vvx(NP_VY8gV`A&vuLTS4mw~?PsWu=4ji> zTpg0ee}UH{D8n3NdTT`J`pGJ+7cQfz`G48+RnPNC)j?BpKK4-={{UE|$$&G@Zu%F{ zHol~#tE9Nw>~!}Ah9?lcO*E}c+?{QDF~_b_mF3J0B$nJp1R|=Q-D`I!>rvnv%M*nJ2m`Q8dyfQwP9p%OE8A$V_>0>zwh5 zc#JrOf{pm6$2VH?NTrijd^U!*mY1k)^Sv#iYDuT7k!4}EVg(fJWZb8EK0qu8!5#6f zgQacW2SwSewr7&yw#XW)M3uwL5>oPpWFDYDIPJ89$kt(B4^rK_%I(t@ZlSaO#y1-K zbqKkHk>rjR%SO<~r19bb!hqbIch=R@;-10#0?$J6T5m~irlp>y*=|KqIolh_h8&XH z_+jWUJ*#5!wh!vNP9C4ivxEjodjh$hAK?R%k_zjkuBsTR<`r|SULYlzi%Av`E^)M~ zociQ_^>(rJ#geMNYO4*-uIBVpKg@iTvD73*i3KDH9#nT2;CO;&_Pl(gZuw4p}q7X^4mISJoIp;$l9JUnI*;xw>i%r zkmFu_PRODU49s|5lmV;XjacqlQnBrk(UVoZbLHj559t1cq^8?qBC*_qxmDae!1nFmQaVCQt#wU1+#jg+#Hr#m;$tgFNMJx92Rt7$0l@av z#$suin$SLXtob7)+8bVO_`yp(lj4mjrnP*t`(GK;?vSe z;MB9zozaBQzzXRt_cG=NpxQ z1aM?0IxT6l3#EPCndzjdiYJP{IHot`s!?S~cM&e3f5;!F4xz$wE7mlH} zEw)MiMo7M5s!j{Sijcgd5s$;j9>il>eJ>*?!ATP}*njeG=h&|&(D-?V&zam@(1RQO21ZB$0V`fJl4bTLrSwbBZfGv(Im>rCHPFKvzOotDz%1hF2i>GmXd=t17L)f1_HS!*iX>3ktG)LKew-Y#)2A66bL?4~Y(Oo@qx^*1_kvhWc zwJmxakB78(YV(^l3kJa#*EtV3v8>X>AT zsLdYmR|CX#Y;GgUS6)mU&MvcFKg!8#n&)L9Qhp&K^#zu$!y{6yrslG4iDWHMM~F;E z#N?fxQU_vGXCUhh_{n{_L)L#GZMav{Tj^+{iX?%|M=FIJxF3Z6?Bo)AduvCElA6^W z1$9?f%Uw@JF_6;K&;VUj0>gW`z{-wD1A+#;@77n@dXDpPzt#}~*GgVEln|#Vjy#<$u#0SQ5=t&-f{G&ZR)Gs|X(u(VIsPN~u+!l<_yH8k69RW#24*nvT08P0Qpq=GTqUWd4J#h0o&g08adB#%`r5d5e(XbZ36 zX%`uC*#mPN53aSbG21eLtKpqTF;pLgeG_oLb>~QRCrs1RL1whv7Fku~D9s`933Shu zz%Db45!;;WDVLt7LK|xhh;iM^1Ei?}>GZ+COwy6P+)a2m(bx7PK0C;|XD#Zyb zk@MhQr2haX%Mx6AB5JzUNxW+IJKwD=M(SN!M=GhvA939DDPfA+AAf? zp#CVmBwskS&a|}61R1TA_)(PuYI$j&L686h4QW3X zeiQg#4L%*)Hxn;UM-i-j>>gBT*wiQ^ozDAzQgws;EozG`-h-&?=%bFyQw2q|%}Y?n z!-{DG8QzqfW5iHNQVBRD5HdY~UuU7eT5Szwxk+)Or>6-V;rv5XrvrX_1|MG7An6#{ zOcI>FI(z*)ltSF$rT+dOJ_X||M@$~Brs|vB{8QC8k0epT;exBDAb`0117^?6 z%ZI|tNw`qWf36i4OLZKP%8^Xe^VLhZv@j!#k=fgE2L$atTwv|G8Vh9<)NN3aNi|Ha z)S=X|%Wc31lbxVs40pzLOT1b7ulALF6`GRac%z^}^4lY6k{ILxKv1BSVdh-_0A&a# z2M5&%L=lHHcD5SmH1VogrTt@wcHZSo=z8ms=^H)5*;j7q>Sm{znn_@GN(5OQURb76 zx+m^=4l>6Js!Me(tEm1drTeNcHu~}eal+Bju%|MlNgQ%Ix_}g6oQ=5O>5WV4{+sGc zN5k%tu~Mwh3N=8jqK#R1N@U)gup9QP@&-UT@84M^Rkpg0;}x`0Py0qi46t}-#3bj9 zqrYuTczB-oNt%hUDy$3Vx>Kf+jcCiDqsLOTwZBx~dg?ju+nFMH76`)a@Z;WG@ITny z`CxV$uyk$4C_W{;Y+YxHH(EB0$O}+}KFl8KLb4D?Bm>`Bb&CC2OY)Vm6nco(Lw&6xA}RGe=k}CuCiq0Q-r+>@r6KUZWGy*hk{vif%cvUH<@5&wDTq1agbCNv>931!8oj=MR z{{UHi_^o_`>hh#C1}G^Ynm~LQycBGWxEUphCmHAIuSR?{Xeuf$YN{uf_I}EU(2c}+ z;{=T4aoe|UHRkW~k+sK5@k+JQHi|mCeI-WI+#Q7vss8}n_2GIc!}W&u%lKZ$9@>jd zukxhy4_98gW2Ne@6x~~OqqfvVQ${ESLrDn)d7HyxKz?$pfG{Vy)raAiQ`)-wsq7WB zb{YCAO6#E`aB@HKmG;%z1Sad`AxI`>Ihq zIiL+I-1AoYYRh}dAxg9^^6qAIbs+v@8m;_xX=C_*)U~#%t6gM9Rj0U7&W_G$&xIIh zPhjE7x0qxM;PHcIv{DM2q;b@~RVx-Un^zd!{IQ0-51-Y253 zrSM`YF$2VnzlG2Gvycur90SSoke7eVq75Kl((b%XXtpJjCJI6?ZXNo6lpEkom9q4o zS(l-T-({sSql8WMlh)4|RVqnU5UMUnJB~=(+~`Ht=}%GdQl65U2=>}3Af$^Cr~%eR znnJi79JVvu?bIKHcl-KYuDdHmEwo$1+$mBR$IZ4`VB8BiZLGxaTr!R`gN<4`&e?D2 zODsKIWu>F6t&Tml^tDW6M^O`x6NV0s6+s0^^8kJGsf-!1rI)y&;(7XerC??w033D) z*mCne%VnvidZ(3Pja{GjfGQqxLC){7Iyr2EH#wyn!Vsf-MBa+S7yzGLQLUG{tEJka zlC2<;oC$n6Aj)jnupm9bBoayEw`~@5ucPzR&2oha2xEqzuRQX3$Dtf+%i;)pWDYA> zG_l&N56iqAKwXuF@c3(BA2V$|j&lov!Iohg@#~hqsV>uXqQVXA5 z*F9HNUumeMn6uMI3jYA3#_Ry)2O&ox>-#TsHwOi@L37*JfnG49=Qq+*Jh;OXd&s!&)C+glPkqMu9M6L zS_WP5nG_5b0l^sTLC1V+Sm>{Zwyv(Ips9zc6=ky;cD2-tG}RGGL{UiD@aA2iS&=s3 zi6G$f#%z&9BLE%6{m^H7BqiJpeU>B9eKkGuy=J*mwARQSWR+Re3HC5=1o9bGz$#xD z8T#tU)SXuq$Ea?Vm#TH6t~CzQ!s12nvA|qoBODKG4QrLZ2W}5=ims0T0Mmk^Ia*j= zWv#XyrLxKU`esms76cX}2iF5w&sp5!rs~_$U2K$a)zZ|wQi@50sLYN}h_VoOhWtVJ z1QEdPr^4rFbsZ0iqlxOv8_jI}6J1uFCrL$jMWLvTqDYaTjb;!WNf9i>5L?E^?2jQ` z+;Oi%{5PYgt@wLmiKI%{`aBZlR~yUD39>yTFP8 zEp;tZKw>gLj|nLx!AbDSX9`y!ah~$7e-t{G;U`4&g_-QVI^a-CFZx3~+^fz;8Y!`o zs;o}{_=FF_b>p!ZbBS>c0?G2@vfqkcrLEq8^FTk!Z=>(^HP*>xmRgE?O|25IS5OPzH!BvVvbRu_tu97Mpw1CfVjJek~gcQb^icI+N_l+cC}N*M?qXf7<{>s zMNi&%JCv^0Ag)=maKr+moxB5!B5V%e6>Lb(deOxVxAnEb>7LzJG$z|oODuCWTfEAw zF}%kZ-~|VR+>zY&)swD19o>3s;q5)*^yb|oR-|;chKw+#Mv0iqJA=&UX!4E_9A`Qq z@Mopy?w1kN74o%Qmim~YrKeN^6eMSH^=uq~F}K&9T7Eioy;XlvS*}yoirPBbrKA?w z%f^v3ah8%{BA&&0BZIhu$kEA){{XCH4Kz18Z`?klp=33ObgtLt>jbvV^5%Hwk(tQK z;Xe@d=eE(tuheyho2QoFRRqs4o{pl8uy7&`BAAaDKkGvwK8nN9bzXy~ZBf)#(^84* zYUrf!W{B0YMh4=nq17@#Z?Lkogbah<9rbbONUEqBQ9)NzZ=ETd&rbVTgCOAhkEXm($Mra)AvWB{ zLG#1WZvK=$DgvEDQn%Z8Qrd2}ny#Kyu9B{Z%eiHT2>S>G?i?S)G1%(0@mkU@H|~O@ zjwz-qc8;W~HzY?@O(QWsOm06wewrQ7RZ!4%T}^fBwGrl}l^UX<)py8U4oTo-g+Hc< zd`G)bPt+X|Ej4s9#}&#kB(O}cvvo~6s5m?ZJbkmRw&L51z-M)S_5e86cGd5}XY~dQ zP-y=EY4yree;sKSpP~>`Mgld$m@zUP+%Z1A`we;Dr6UrF%M+;6qn@BO?C{+fXw?Dn*EjV0028cM4az9hsD zBiad5_usQ0rli*In(Nf2ILSY@ZU=$rvk*`6(y3>(+iU7x@oo9Yr=w^&0fMW3AW@D8 zU@@Of5ho$9Wy4m5u-j>2mdkIBuAR)kEl#oqtCa{l7t6|H86C5ZPO~45cY1oxl(|_T zq@I?0Ep5Hua)yP3#1+`%x%^oe^wyj&RJN;n8mgqVqe2!FFlXm)lx-en#~rdx4zU~M z@?N2{$z|$#&+~$B-lt+d7oB{46k##eK5$pis_0nV?mTS4&pg;DPf)5T{N7V%~g z#}Yn4-5Sj0n0Cera6esWHfUq%dnKwnywFhiHpQh_*|O!g=L!JJas7~W8YpGA14%&y zHbMYn1r&cVR(*@N@O|4KM$)3R)x@Dh>RaN?>x z`I;JdB30d8R`k)eB_dE#@T*r|FkAlsjl!pMAJ6_B1h1y3l7_b9JThFTriJE;OPMJd zAY^QTae?(ae?3$BN3Cs?Ry(y#@2JGRT^-sX6(s7@O;-~FhB(I4v?&{o%wrfh&a@dR z`k$yP7R_&3N=B=OQ6o*Y)nh;lHb~BU3<7db0H;7$zo&4+1KLAK-){7SC~&(~%Qg7a z^tVl2I*DVfsk_wNAu5Dr!ESkgFw3zDy%eB5W8>Nj3>TopD7%WG3Gj;TV%&nZ)o zLk}(p#~99d(fg0VE|}=*h%P-l8EI&0r&(&N(ds6hvmO};Dv|BW3@8VYl6ciC;{`mz zmfeVb|zaCqyH;CH68NVI8y_K!0 z=qVgR)-f?v*_f&0VdVfGJvse(*CqXy2H7lbfd2sX68F#k8Z8*hFJP1yuLXr)^KP)O4L}GS6h&1OiD2 zExMV{J+NF7aqp?W5}`Bn)NyUk`ebd7vOcI?6Vd+wByJV=dMWB@?=`PIEi_W7#4!a= z6KgO4u_Wi5s2U>H4=&u?vO6;#5i;&(|jTSS1E@JaIzL!W&y&1i|bYH#X<7Z;s$3qI;= z#p|kPm!@dahLW-<)~v}>3n+zL>>1nUW;r`>1~H#tVth2QUMz;!6;)47#YJ5x7Qq8)AnZY!c2}%m@daD*e>db{~irmAlnTGsSJ9ii#NN!_-t3X&r)u0JaDn z_ybm7hqRY_gcjP%-M*UJNl$GQw%ELH5}>2V9!Vv^+PNsZRB{J@s$=W3J(2;EffrUy zZaC?DHt|GqkPA+`9}e|h_@8*ZP*+>%Emd^16;*MwG?a92HB_J-qBx?-$8t-Opmxuu zh5Rz;O8S1JUZcFq?NJ&|s*}oQoU;=dX$U(M@Z2u%eB)YgP|yf&{{TN4w&tLgndRI( zqs54Y?Vd>|zC5~bqgEkcrI?Te#pNJz$#x_9{{THen8rkLfGk^$YIha%O)<2$JB{)j z0@?lyR(zHI^Gpd>s-l8O!VrXr-cjD-=sn1wBj=$h$J3l8`an zqn=a`rcb`9#`RTUuc5ECBFj}Az7j+H*&5#4_J>r**N%JZ zIhU&`DLR@OX)4yX;ZaXd3ewQ0`aLjtBqYx%;1CM;J==k)y-9znwOH%wR;rRu4kjw0 zq(*EG6mE|I`)Ef;bbJ+8dxgf13aed)wi-H_Y?DetB+R}b+z82KV0mtE?c5v-(6NL$ z@9;}`a3QT%7r9hKPSZ|67|E`PWB&HCIeNzTe(SmH^f#)T91+PVfvKs@M(Ii+c9ez~ zjD!G?PB`F$k-bk$wUIiTe0z>VZ1BnF-+`>_rEGIhd`Rlxvuzcy_<$DTHVUArAY%h> z81(PXj|)tDoOyl_$}<2v)vk*7EYy%m6tpTN9gScFWRgcCBb@!Tin^7mwsoy-Z4HXz z_8yv+zLWNaFYOp(ou-aG;THfnLf|psO9nVl+Ot~eR^3A#G%!G@h;f1&%uY$kPIHoT z?sfIP@efbjuhBI#M=kfKD(PS`$e0Y7knSgF8B}qedE3W1)oG4Kx%`1mZnPD48>ItX z?iC#+Y^S!_?h`$2BoRa?lWU$&g8NKl;AMI3!ND4OYmID@LmEKg0C!jMn%l1Vz2kys~)*&}H_g9GV}My;Z!5<^i-Zb0<1ElN79V6M(d z{8{atIl|l!u+Uy`_;&{Gx~r>!R#&2erQ%-`3>ZwxPBZNx7(8>W^)6NZ0_?Wbv|wZs z6#oE2?W||u^|EjCzpG>LgG~e>9HtI8Or)HgXIqf7Tg4+s`!!3aW)PE~Z(exz`s(g8 zR|-joZB{|o)%157;}20>D(tioA|#P~!$b2d(xVl1P+`n+_7V4|_bL209% z>8OK21H%itn8D)*2Rt1By!55AqU~0dG$}1J#|1~q)xnUCYN19eyPRN={{Rsjjb1G_ zIBDLbTq&C-NeX2oOetbO%8X;%A8ctPkqbhW{_;u>cB-hWsfwK`Dq=MAy-II(HwKJ-5!JiNu z{eaWNnm)2q3&l{Ot}w1y8));6az?Z`oCL@O?%RxgwM(m^rZu)^ zgw#mJwiah;9PYymvkYS=9QGQyQxng8oObo&*G_P%K-A=bV3NnSGyOGR>JKzjoCPO- z>~oCcN9JSZ3^tE&4;}Sg>PP*>I_HqDoSYt8LQ$$x)TDi1U@YOIiRV0wf7uW}n`=g% z;S-$iIL1y+NNr*_S}VoNt8H;wD`VR#OPWIt{{RziHw^Z}1_LMXft_p;*h4^7(%IsL z{68qbjy=@r(uxful0;`xvfqg}7^-adC@LSsq^7F3naS<7sz(R%2lUqWRdG=y`(!}7 zn1&6(13shE8uRDHYB6W{cXOr`)Y8i>${DKOo+6R#ZQc-5oRhgmOAgrs8rCf~=9AP_!>>)7i|j+SZ6W+=;G43Gu@+6J)?h!)C^3Roh7xn6uA%~CL3#0;?u!t>u- zg8|~mBkmh+e#0DonipzCsczCLNCL_qsasB!qQxj9WEU}HvjA3(*5B+Ccd89&i z7C0P@$4Hkg7oCil^lwZ9{u&cR8b&u+2UcDwl&vgvDkXVVJZH?LoO^wBsapIxDhR3J zeUTys3I}d6oc>zNy5?CLk}|CLTovTwInQs)R!cR?rlN`oOs& z?g->D)xv74k&T(Hl|&d6&&wb(xgAMp2`NCMqK!@;u?m2iG3j(`A%HD#`~L zCC<~&_kDC0Yl_P=3P_}@Rm7r5A}*}0&fv-jIp?2UK&$E@1Ps!_QWZhQ=v-sNoPc0lyK^X~^ z1P{|1%es~&>MD9lYn{Gn&C0$QQZ`=>Lkph4yP-RC>A)WP(ye#s=&f`#)vp{g$4d-y zp>Q^`#sR_g86C!)+6)$xyUI6FvJI^vBpv}cKA+I*Hn_|vE2!vIrJM`Iwd$&j#G}PK z{t=RK$j{SOih{6DJcdzTts<0SqEBb!6x_Y3M64Wq@b1p*DzSkHT8QeX6 zduU@lqNYuNT7|Na;I;;+AWbM&edE&{4n4HRRXQUuJQ*{ba!B+&wGppLgm#l8uMM1S zKHO>*(&rMwT)M0G9{JU0yHwVS*;P7%?6fsD+G*txm~M*XvDz@O%Y**_j;-ApLn2td za;i*8T;_CE{usyse^3GZ#;8}B1$=f{<*lfQPgOf%B?KrG^5L+5uh&|FT!4n1p=4M> zq1(4SZQ~sA>8p>?jkJc2(Os#hiGsAs1{A9tcK-mb`lVOVJXUi=XN*YqYAE+e*vK_u zyZYb}t8Hb%G>6PofIA;=rm59+UpWMAxGEdQ2ph;=uJ;BEZ^!;>xj#ZAGRT+x_Mp$PjxBY$e6RB(Cnw7#ZW7~tC z$Diq=bFIiS_EBDsXKs|Tc*OY2N>e!JYPk#g06$G1j{!+J1Rv~@Gz+9y9+t5`4Vo}X z_a%w%qo@lEem+UYs-NCd$L$L^zt2@KPTXUml@{$wA!wpj5v1NKx+-o2s1A}6s#tEu zHGs!S7f98t7bUHutE8!m3mhud0E8k&#H+P%cHke+gRe*RrKjQVRnT=cUrXDqS1O7- zOtsfJXzml!!%Y-ORLS6is$6gscxT%h^HSHnp4akmM-0={M<37DmzBdN0a&odgcw|o z#DT#8XknABBs3jr#@_aQD~hj)1~-jYs5(!jEIm=t5mnb(YAFPec+VY?VW*aO;*KT^ zXMM&w4<+%penv?Ptg$*vt**`U$xCasDoZbgZo5{^ElMuqwmBL10KfnSKp#vUTY7V> zu3aV4wrlOqDtYOusSzp-O;_(El00~^NeCw@;{yyAhRDYtj_C{iM^I2#U9T3nzFMKS z#E-aQI2VRzXAjF0&!7Ny8qL7TiGn#S44~+Dy}=vqDz#e;h8Mk{gJfFC`m?Anao**$ z-z!pBXlC%zDQQ_FTnsT0#pE1=*m`HzOR#lC;@5Mcm!~diXsc&1{KXvvx$xNX92^H; z=MCSsr1f3d?wwU}uVsn`l&c>Ha8&^md2#_D0meqVZ>b+U7igG}ySH)=q0b&+>)R&> zUg9F>VcUF%(Rj&nj7iJ2{nq7EM{KIFLq}3&o!l^-H8c>Zky|2kL_iUV<$K@(-zQin zRnt;I)K@V>PS}d!Eer-pJVt$xCU+Bqlb-qRJ8NK;rb>HNQ&!B$Q5__%YSK(5xJyCXx%=0>^c4MA$0Pm}qtUebFhhz+89qxcS^Pn&I z35=Fmq%U)3C}urqPmWz@mG5B=SK0D=9UV01W>EAm|`)) z=OZ8CqX|LN6-txbx(Z6mm0eJ$kHG4Oi{@q^oUp)HfeKG^su+lHY{N9MwBvSfUj1!Y zkF9%)OSDvaPnoNF+FqYGD#v(XsE`VEiwzoK%M^SFl)vL)zyXfmOC3#$t)-}IRcyCf zC<11tNI_{PAb5&)Nd8cFVT*DGcsy%e_+`RNTN(l9Yr?xiHlmwQYBcD5akq=7*$irVsVmnI{on?Y8%v)?Ni~_iYJaL zDQTD_637*bl2<$espdYQa1MwiRnDudXQAlY${3VW(SF)BD6*`3C78N2WM?ICMhMAd z?m5*Gs;REMaL?DCB(d9)d7)R8HbA83!oUDFKrP#M9OP(lGQ#OhZ~fJE$6o5M;b==7 zjf_3JU0(&X#d&L#-?Xi@mbl)LHdfn~IMr!tN~%W5BPdr!%9cPk1C6ckP3oyB>%MAl z^M)G4>9*f-tD}u6{2PpptQlHm=kHZ*O^GD)BRF&=fzkOIPU1f5ixZec? zQ%w!tsv{L$GL@zkkgtazP4SYaX~rb;b|CSp{{Y1Q0P~4#*IRW%(O1%5rGloqcUXkb z%NRvMrI|xE(aBH=+Cky8>1B*%W5@*TJU8z9`l`*1?rD2QfmZrMr0e>lsH`?sX=yF> zu$kqV2;A|;Jj5SEoDZgRt={MG!^LQ0rng$DE%dRfts{q$I)(>3_p5J>{WoCl_0=n& zYbh<2{VKI{O4P!dR$Y-OcRNW@wT=dG3Fr0J#dP?IYzp5Xu}@sgRUnc>7m7W0kQn~} zEPb`-T|D@=wXJQ9MRx=HuEwj>!3GvMTxB(=*O?>s>BEnDt5Wnbcr%HAWYAN{n<^uq zsg|N+pZg}7KnkzEGJS~Go;stVZ@mN7G}M+)5`US@lu|>S6#gjKl6W17Cy;ZmP`%#8 zSsW1>b3`JI#FX(*uz81=U=6Hu>PLNN*Xre}zEeo3(Ie8B36-O16_kQOW#f=WalzH7 zu^*(3?qJ@=Q?8uu&HAdiyd-Z8Zz?&q*Oh5Xkw-)!Dg^e;=mwhfuE*=Se!3YRlr=VKeEh>n9dK5 ziliTLhUeY2snPLuaS%C^`S)44w+BCD0#1*hqNJv!f+k@jG~c{p8QU9FpI+UEvDH>; zGivMpnUN##gU+de&pXPV{{Zg|Z1nUHUMHPjFFZgVS0Q(H&)*z-;Od|89?U6k{Q`0$ zFLh|kMx_{eq9F5~XcuTf?^MfnAr_K~neMjrc+uGSyLTu&h36lxt6gnPEnVW#Z?;o- zk;6+Q%!;@`>`x?~2bDc_X|Dzzw6W7E203A^l2S(`EMQ}f0Lyk7nFQ9q^N!;k(xvIz zOKfn{9|W>AhBt2Ok_v@yPVNslI>Bp>Yy7PL0H>|AboMKaw&E$p z$_tQkpbh0@jR-2-XB$pNbyw<3bu2U0H9w1$saTiytU`dGk>A|v^?kE^l~q*6cv>3T zBr7yhi56Ffh6X$aUL*q~d9jhK{{X1tl9C!_kOgVn$WR}{g$vK;tvDT-;n%;ys!TGp zwzfm)=q9a|BBWC!tjeKG`$;Tt0LdP@8spT53l-~oZ@ z#~9X)6+|Lb&{IQAJkiF9DpShdes>+n0Kxm8eQ1^+gS9u-sEUuMpoUelMRZhpCOh}V zETRBIagPTZzuE^J9aU@=m8tvwRaj_^ zbwgX>>NxH8i6?QkNN8FlrDg~CS%I4bjtq!>HHXqTi6MdSiPT4R`%&*&7-*RzfOxU< z_*oZ8UZ^ddB(eC5HNx*vP+mA{BP@|Z5TM)WSjiy-oE@hfj%^)9)Gb-lR{9~})4~J| z3+@})zFjx-{gn=${GYzEext*NGy*7k61>Nw7`wj^>L8EnF{Y*ii({goh}D!~VO;trl z<5^v@r`tZ><5k|DG0%LYg_~mh#`BZtKkFLynA}tFO^P_cIf!i@OU~i2?8TWL^I1jt zqqhG5kJ9vo39@wm07Xzx+pUsI6mhNIcK-mhW@D1M$!21C_0VgN#wrWl!m7UE@aDrM z%5?qxV%#bcX;cM38J8P~81r}FbH=lK+{5<8+rt2>*3b9h*y;=t60SQD5d)u6z-z`! zsVmU2pa8Ee)jbO0%q$$2hZuO4Dk`xn@kMY%v{A{O!K~Yce>!+#TA+rsA zOnc4<%LTwB0(<`eXzM8%01U60fn^@R5`Vu;ySC8&iI3(7_~56*8mTG|WiAx6jTZfxD=acu-)IS*NDsIwMj)dsXpJ|e2sg@a@Mv-x~iQYL~ z#|P`IiU33kxXP6{=k8A$C2gy8o#am=?Z{v-M;AjTfqZ4fQQ=Rvx2{ zs>fxswK~A!UZ1loPTSeXn8_wT?11BgxQt^M(r96(iU}h!^$f|~!$nO2&IlvQ#~sHX z?CZGWXjGqa$c1IC16&*k?mN8`IF-Pg7N0&21>H zyiY83F%cR_A>(f57-jP=NI6n@KJ&gR^|cMk_Z9Y~Yi+Yt*GpXX$@VmmMA1naa1;;; zWgc!hJ;t*?hO^6czE#3aKv`jF)v1sE%PDmw!2ZcN1Y;bG`|Hy^(l?@86sNQ`J~YsL ztQu8gbAMTwY7UgI{{R%}Ef+3>sl3vqK)6!YLn5cnEkeSis!4(~+;fbaW7Aak>M2&` zYq{GiftG7*Z8VhR!zwhZvPe%PU>Nhe)HiICuf8xX&Xx-z+$OG?iWiVeB!DD)+Z#r} z0LTEIdGDy!PLZ#^bk!`DXkw|Pnt7ZUokKz)MDbONV~^ek3OOL0cE+|p;ioj)U8`Mw z+i&OUsr0cW*3AoR=gvz*=`OchZ$;hcDQWG(dMjKq$22Y@ELDPTkum3R?3hqXWGUfu zfEKyx2gF-F(t2D|+>+xe8Bj=!UN!LsJ1Z*_9n)f`bEw+Z1 zq)YyfyKeVgnO@F&k567SBF@y6T}x-9tDbRcj!K!`^WeUGIMk9HuL+1i-De5aoBjJ(D2ut@5@DH__KSs-*5J5ZXYirLu**pLIh>i zr;v=}g82=TfuC&TofqI=LG=admg#V(d!;MU(=`t0s9LS0QgUHd$N;EVM{ocnWE^HJ zeIjJtR}Bg_p$6((y^}UGQ~qE7rN6Y_*o2>0k}5dB z*;por#byK+B*`KWr#;Bel#gOcQQGS)w6`U?^&zjJqYQj2mEN9otb}Bh5Qv*mHanT5d&JR&jL z?{Ng4{Y82JJXUOznQH4!L+@(Mb*$(ck3e-iG}PTK7mY~I^0phSf~ky{0I0^)!N?$I z@SfW9JM{TXagCSXxvFX!w?T~t#aY;`=;u|b@JP`*IQ$0DJG6* zQkVpQMsUmDf<1Mf*H+M1r-?aJxaEKuC+V+W(T!_Z?k4#E01F=wJ3#~JN^6y6_pN%O z=4swZpoRok1`%bEcd`MW;7|eQxz??4i}roCnmQ28B`gSsb7y~-oS(1wYPoK-G<_#+ zw_9n&6!(cU?Q`9U@fikN8B&;+3#2Dn@?bc^#q)Iw8jz&P>oyTC$KU1ya{GBT0 zr1+6XRY4U!O>HHzu2@#8MvWDSM9CpV~~G`Oymp!`et{Ds2pEtEuWYH8pJ+si zo=%0RnvRtghTn66q&F!%WSXfdYUV+*T%(YYFvA>XRp62^zN;*)%r2c?oBZ=uUnXeJ z4L*GGSww#sy4qA~mFgKHnnpe;N?K)R`s7EP{e3lZ=zhPhyxBfp{nq!(1<>CqAo;ot zu!$%e%{i6hfzISreTT4TT&Wo#3-pbRuE+LWDy6=HAzhH!D5>rwbc zOGnW#%hl^wOJ<^;^$m)qPaR@pf&4ONQcia)%?S3`WMU4{tt>}K#^{S$(|%r@eu{%| zk}=tw@2VTszZ30URq%VHt##LHeb(y6nAFm}M3ohlE~x0vIMvT~l7&l$#%({}{6UMXgow?O5fs0_t_bs#anBcH;={#u|Uf-fvX zZao0)t4+EJ+s!=2hKhQIj0mJK#LNQ~C2~OEkPql}>pD5W!}>{GVye$BUxnm4P9oWc zG9gC6q4oT)OF??LQrjwecG+C^d+qk1TAHF4+dKj<5=yBfKf+ZblLyeqxaS96d-$zV z^%u)TXQ=NTOW;{447GPkg_*or7sPalfCs};*ugD^4aw(Tg0;?TFZ8`ZZm*Kb4AGe= z?sYXvuLq3~r>Lux$S|pxsx~WNu~q)ou#bo^(bPXqSJTwNSoIx0M3TiE(8y_$H8H@A z;eZ2}&^Z{$+y|l0hUn%tDG0Cg{sk{-j&YC!&c1rA;aH;#9!J+&FG?KVAysCMN3DT( zp}|Arz;pB?Y1J^S3Q$t2G`x^@=L7l^t6e>OpSRMYoXYb&w9_duoE&S&#K3w+BUkpT+fnapdQo^M>tD?(FTyGdou#F?#X!|H zeMwA|eLY5H5gL|RfqJKQ1Vu`iU}QYIc~BFQEdKx=>$;|^qG&0vkwH}%taxf_t+!|< zfSGBgRE(;`l8{?z^9%x`86*%J;MZ5(?|&MWqOzUgn(J+;8vszTMHhz3p+5$}v?df` zRCz}l*m{GeAnGoUz0uJTB`qqvf|XV}fbzzsNRKjxkIbYgKuHC&!t=W{Om;LoD6z+n zE`7^44)QR0L#$uVRRgCXxzEwo3cF2LONs6_dTO<+xmjH*lf+bgh2fGjBAhVXRGvQ( z9B8Ur{vb%~CXbKYoVqOqf$%0|NZD# zK{_(;)jdILvtI?1r529uL@HuRj-{`O;*Ln$3j1JTk_#^x<-Xd>J|}!yx7}%Au=K^G zTWz#SB?VnIHS(gWmZmtu#TaR2jyEWxE+fZ1+dK^}v#Tnoz88EvwA(H>3R?PmJq5r$ zJ1k171E^B#=RB1mex#nmRXUELvtIhDO3tb2ddvOJSUzT=8XC`)Gm^OyNMR}@BoVk_ zT<4NbwD1k;i_7B#S*qMoAZ~u+-6p^-ed}C#{XK00Pl@;2Eka34U$SWiB7ieAcnov6 zNXOiP!uc0$4NldlWipr1_*ko58eWxVk5F2mb8YkDV(RCHVg6Uaen%Nyp zKeMQ4Z4<*BB`M^1vOjdpxn*pYAo4qnQt0|pv#F}0rRe$!n9Vv9C+#};!z*tC0mNy? znR|{8uC;&V*k`y-_`rYDyG2$`lEt`|2a?j9v~?T3+Bj zV?LSIfq9bGT_nFWVMm2o(LP={8M46bROiYUE5m*+{1A1T-nu`iI!5C_y+sson&{+e zIU}f9mSUs^0s9#@E%+RjVBNbgApW{mBLc}>*G5RLNMgl0IL>`+ z@mE@oj-%>Z&9>)et`!#HQB6a0qBQRfOew(*vA^R5P7gTaTerd+Qq|HMjWpC2s#X;h zu`H3Vgh4VqaK@Y}w$lbP#uFGi^WC!h6-5k*H6qH$gh~6)35p)-Ksj#TU0jdFPOj;S zj+>)3ba(r7)N$gLy3sh$sD5 zk=S}<=?Vz~%N%=v8744skITQVw&2X-N$yxUmKeiY;Y&{GiupRC&vCh2?6+$Bq-c=Q zOKmMOnPZD;iP2+W{1NTiK|4v*Ka3WND{ZvfWwYI=?le?%v=LU;)HHO{tu-RYBSRBJ zHv+|pAC@-@^m`SZZOXM!Nbd|UT9vz^rWkM?|%-4FB*rg-72?mfQ|Sb|J7wI)9_= zy(d*u6@r`Ops1D;D^FBhXLb~BbLAOg0MBwYK=`jEPf~Te&^2(Rptn(&(FAM)G_kDB zB&y?*%27@@2s;CvUebc5w&<5GqJ|0Hj2fytc&R~2N>Mi#FNX1E$Y8GE0gR%I=T+Z{ z{U=uhl^tyLD-3d6X-iT_o3=C3h_T`>M2LJaq?~fyv8O=2>`^i9LAI)AM0b|F^1QPakjy5AfHnVW2~tg)TEf-sv;9Iw>tLTpnS=Zm1)*M_=t zy$D2WXxTl+6$TC9!J-91BZHs!Ru6p0-4u*x2v#RY>;7B~wjJ|VzfPbwQZE7LI# zoUJN3`E?k_`+xXqzti1qMb$kGZR$&fbu|+`JKb7i(n8?Pe z$#A~UZ|eIMjV!fwab2RQb6pwz)jx&H?%<9AQg;>M*KXsGBlT1#<}ApmbS!amTuKM=QUr>{M6n{FmgJm; z#~u`#r}RP={{S^X9DL)kAN;phkBXqjYO;gIZainy_)U-Ns;5N8u%}H;Az0v!X<6Od zYN!h@a(Dw!Y>UvjhjN**OWy-EK7wwKellT*448}@BdDzRp$P5}P^ z-o~o`01$e%%_yZQ>oEfjZ%C@y|8ykslZ+~8!Vr^v|J zPJ?mDz#IhlCPl!6Moop`Q`cI0WsB2QebDljoa;vv>s!)P)s+_sDyt-xvb`~DF<0Cp_*gyvNRod$$EXK!rYX?%?C@HCKm6a03yowhxZtTqxnL5>S8$${l+n?^ zUU?+mKN^nQdXudu;uxy6^kv4X#ab;l8Y(F#N}6>7MO0rps{xQ%cP2+|+OXE8i!6eNMb1{sGn6!h%Y)H$%8wnf@7r9X1 zVW_5lhZg9rki{$f#o^iM>7v?I=2*seNHPMh2=kMUGBVDI=z2NsogGy(%UO2$Xz$hY zPb*046T=y%k0k#96tXjYqB_{_Qbj;wsj85{O&T)PN=`OJMp%$LD8MJ^4zwq8M9ej) zRM~k5Q7yeccd}E;x6Y=l>RQ{4!mL%xJYF1X@%TV^Nt3ZiIV04K3hR`bDnzM@R86iD zNf~kw9y5dKoPRwQwDq;8s|8hEl3I$3To)Rl4NR2n3RG`pV$l=J0kuK)KXIY`S96XF zC2X$BQ^G8{9rz@FO;?gfHxMs@`k&=CgQC-t%z84;FWpH`<3<2^2c+9kQfhhoJ``gO6PfE=rb%1uzO|JKD&89awBN_X!}mOCtE< zbft!vGtD(ZgfW?4X&wei+;;};+rG3uvtbooHDia_z14~ieCk(@c>GxO^~SrIr5MO-#~u)r46=IAtaJ` z_k7h{#8DYQpaQ(b8AjN{8(55!o(>(bfmNeNdcmzWyuA3E(SsGj49K<5T!6!Y1nr&_6Plv zeRTIgtZ8MYb#2p49^!rZ;C@5;=*vN2B?&a@3oZDcSx;!|Zj1TpC3U7tjKyP55>_tC z5miSdmH|ig)}PR~NxH7vQ+$@+CAOBLX;O*_n=^PpuwD4TV!?n>*be7F`tH!RyqWOr{NYpcJbr|Cx!r&kHk8N4HV&_hJZrJp!jRVsr(miwE?dH$e>BY=2wzvLD zSPsrl&4Q@)J+xadmrJ}mH&xn_C2#;`F$uCW++;fE-)^nlIFZp=ZK$i9Q^(x*J4YI( z{8GKtQQ75^-3%2~4->}FxGXll6Ce-b=ZxSVeH^t@Tr23-T8c=hs&E!sdTOSPVsM}^ z0oR-y^Zx*zvxE+7-H5;4L%%>3j<97B^82a1O>&lrVX35~tgoIUBZ_Jz25Ew!Y$!ir zlj-bxYOm52)i;iuw$8CnM#h>jAWCxVfpVdol046X_#TWigQj|;=V_j)O-ytVB`X)G zs+86+1RpF^=oMU&23k|Kf3n9{n^#W7(^PTWt#uVX1tJL3<{4ys5A8nH$?xA+C=VeBM-m5dZjoT5OnN*(Jh+;Fq&NN$~`exm0r2V;Srj8k| z%Okm{XO?h+X#$3rw&y1qCj%$!Fk0(nuc?;VQA;g4nrhUW#hxP?Mt~fhz>*sW0E~C; zG)B+zmYZ$9f;W4k!4Zun+u`r?GZT}Y-TwfD9ZODFvVx|wI?9dIR5RW!H5989GjE86 zg@c{X=m0!tIKldQYqokZZ279Y@QRYQz2cP9ES@B}SW!sYqa^MP$m5>;=;2C}05=-c zx1l67RQ^U`>Nhu-{{X{|4{ahCBd1n2`*>~4Gc7^d3j5>nAJ0M3|Wk9TEi9YKkSZNyy|1h>t&~ZC7rT zR9Cu)n&)b$l%Qo$l~G}G2srbOa7g-U!!$xaESDK$Bd~gy^53ZEO8Gjq+~%UKagtlX zMkkL!vzzpvb{x59) znwqrLaU^Cr=HrYtG6KKLU3lwcVDVJ55rLMaUf+C=PBj(9a-{U%OIbQr{{UZCYJ%+< zxl?B>d0C`V2IQJU1eDxY3Vrrv5?NZCz^Ia|)df2XRO-w~aDn_ayZ~^fc zu_JZ{a5)~{+Uoq$1K`wB;JIVIC*{3)&WMujN`Nb6U9PuLRo2Z`mpN(7l(E18qjp`X zDoVZAIo%k~J+q?XvW$7}t~`MM5cQDF8X_Di3`AENwX+x{mcTBxPi!h0aC~j=2MlKMy0 zOP0}3Js*V}qs%JDn+K4+@_za)3QHOR8bL7r(#g9gu)!VlBASK>o#d8^woeo(bz=;X zf-{YvoP*EjjZPF+=gU2&VsqG2LVuvqWC(SoI!Y?HjD@2t*v=A66VHBqHB0LXE0twM zJtZ2|(@lo+L?ZJN4guYeG6ClrvaJoMHsMQC8z~?#rDeeN91oz-8>Kx27n)>CjI?RG zGEzZ0G4hZwLHGK8niATjDejW#nXR^Zb-vI>)#)UpPdY^;ff#~6c!PnDL86x$N_M7| zmMqG#Hq#7_8}OWPIq!}%?K{y%s3X5g$8q!01COTTsVb{1t&8(`U=6?N@ss(6AAK}{ zLJ^=@{{Tz$#CLmz&~+8ErdV-K^x~()jBiIQ8F?8X?LN5n7l2u zsf<%xp;gW^8kPVb!-6p0qZ+%~tq@qKVxqTCD?=P%BWaZ#um>3-Ms#RFd5r97;ALLh zsNHk+A%=e~EXQ*LGDAZqPw^y!{{WvlTR|wPWZxAN?&aCZl zv;Ba0`i)R} zy47a6^!0s;oKr;{Y_-(kUBtdV^+Mu6Moz~gX$|GiwzXMkWSSYFgb>VzA-x-D1a{yY z4OS?+BJWRpq^)n3H1zWB%yP-R4TKH~4texCnC*|u7duf!KV#|0D5-_EF$Fcg+zmY% z(p5ULAjUGxNjdM|oRg(oY>72HV&ia%KjJagZaDNKByv0FM&*qm$TG0cAh96#$Ef$v ztHn8%hM{RGo>|?{D((PM_Hu^5Jy+^yOtM4xa2x%33+XH3{Cqq@m0(%m#@uJ`VQDk>I8ju$^1(Na+-Hwo+PO6}xlETT z2PK_P>T#gGO!X8L^z&1*hLOl^@ToWhIT#-LL)rPqUR)%Q96A5e7N6-}P9wWO>{tkV-BnIn{u0(Z#{4~3j zRc#zn)JaV6s=mc!t2l5+4S;ixxz7hw>smp3yi?Ks&yE=(tNo)a=}^&!i2+deRfkj!W>7EqDM72-}BMbni3{|nnU`X2BjE{WkjnwRvl=3p%s(=F{ z#GniHJ)2rZ4YnJ65-FtR$;ye$nER4FzWT29MYdO=sHlP^mYxV*<;1Ctpb}3bpI$Z8 z3$#(FYCF-H{{S>PbiP|Q$WCxZax>f0RydB|P!4;6{rUyct&W2<7S*{dwRobV#-7a#aL=dt7Og;#aSa^eDDciflDo5cU@-<((bwy3a z+|6{oS5!$9%+S-+Ol3$06ArBGc_a*tzL_V}L#Xwm7^rs9A$bs;h-i z+0Fm}0qudQj|At!=FDuJ_a0pSi5Q2*B^d<)OIhkpsp+fjzH7z3E3S8{s*ehSD!OSS zTYM@3YN_`ClhsI0)eD%>S9u$V8qDN+m}=6ZC#gx&MPoF14hG?qk@U`v^iaQEMA6#? z?&cyvAR;Duc)Y+dEZ#&Mfs#PrWcJY-io3-Wa
$I9*9bij9SAnf4|>-RF--KALn) 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 z�*&sIyhf@sh*i?Qc}=M;j1u}c77mP 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�{*K&c6*Iz8eOB_G6 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
w0Zs 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 DHqOp1 literal 0 HcmV?d00001 diff --git a/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSNumber.java b/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSNumber.java index 31b50d3..c8ecbf4 100644 --- a/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSNumber.java +++ b/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSNumber.java @@ -36,6 +36,18 @@ public interface _Class extends ObjCClass { public static NSNumber numberWithInt(int value) { return CLASS.numberWithInt(value); } + public static NSNumber of(int value) { + return numberWithInt(value); + } + public static NSNumber of(double value) { + return CLASS.numberWithDouble(value); + } + public static NSNumber of(float value) { + return CLASS.numberWithFloat(value); + } + public static NSNumber of(long value) { + return CLASS.numberWithLong(value); + } public abstract short shortValue(); public abstract int intValue(); From 5beeb4441ff5b61031e9649912b6c08596d9749e Mon Sep 17 00:00:00 2001 From: Naohide Sano Date: Fri, 14 Oct 2022 18:15:09 +0900 Subject: [PATCH 06/36] update settings --- .github/workflows/maven.yml | 24 ++++++++++++++++++++++++ README.md | 3 ++- 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/maven.yml diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml new file mode 100644 index 0000000..77431ec --- /dev/null +++ b/.github/workflows/maven.yml @@ -0,0 +1,24 @@ +# This workflow will build a Java project with Maven +# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven + +name: Java CI with Maven + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + build: + + runs-on: macos-latest + + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + - name: Build with Maven + run: mvn -B package --file pom.xml diff --git a/README.md b/README.md index fe055ad..23b8ea6 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ -[![GitHub Packages](https://github.com/umjammer/rococoa/actions/workflows/maven-publish.yml/badge.svg)](https://github.com/umjammer/rococoa/actions/workflows/maven-publish.yml) +[![GitHub Packages](https://github.com/umjammer/rococoa/actions/workflows/maven-publish.yml/badge.svg)](https://github.com/umjammer?tab=packages&repo_name=rococoa) +[![Java CI](https://github.com/umjammer/rococoa/actions/workflows/maven.yml/badge.svg)](https://github.com/umjammer/rococoa/actions/workflows/maven.yml) [![CodeQL](https://github.com/umjammer/rococoa/actions/workflows/codeql-analysis.yml/badge.svg)](https://github.com/umjammer/rococoa/actions/workflows/codeql-analysis.yml) ![Java](https://img.shields.io/badge/Java-8-b07219) From c9ebbb59f0dce37858ca213821f175731636d8cc Mon Sep 17 00:00:00 2001 From: Naohide Sano Date: Sat, 15 Oct 2022 23:00:02 +0900 Subject: [PATCH 07/36] [core-graphics] rename class --- README.md | 2 +- .../rococoa/cocoa/coregraphics/CGImage.java | 11 ++++++++--- ...GLibrary.java => CoreGraphicsLibrary.java} | 6 +++--- .../org/rococoa/cocoa/coreimage/CIColor.java | 6 ++---- .../rococoa/cocoa/coreimage/CIFilterOp.java | 1 + ...Test.java => CoreGraphicsLibraryTest.java} | 8 ++++---- ...{TestCoreImage.java => CoreImageTest.java} | 19 ++++++++++--------- 7 files changed, 29 insertions(+), 24 deletions(-) rename rococoa-contrib/src/main/java/org/rococoa/cocoa/coregraphics/{CGLibrary.java => CoreGraphicsLibrary.java} (95%) rename rococoa-contrib/src/test/java/org/rococoa/cocoa/coregraphics/{CGLibraryTest.java => CoreGraphicsLibraryTest.java} (76%) rename rococoa-contrib/src/test/java/org/rococoa/cocoa/coreimage/{TestCoreImage.java => CoreImageTest.java} (90%) diff --git a/README.md b/README.md index 23b8ea6..dd2f42a 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,6 @@ any other problems. * block (wip) * http://cocoawithlove.com/2009/10/how-blocks-are-implemented-and.html * http://www.opensource.apple.com/source/libclosure/libclosure-38/BlockImplementation.txt - * CIFilter (wip) + * ~~CIFilter~~ (done) * https://gitlab.com/axet/apple \ No newline at end of file diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/coregraphics/CGImage.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/coregraphics/CGImage.java index 3aa4a73..c4a0bdd 100644 --- a/rococoa-contrib/src/main/java/org/rococoa/cocoa/coregraphics/CGImage.java +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/coregraphics/CGImage.java @@ -20,7 +20,7 @@ import org.rococoa.cocoa.coreimage.CIImage; import org.rococoa.cocoa.foundation.NSData; -import static org.rococoa.cocoa.coregraphics.CGLibrary.library; +import static org.rococoa.cocoa.coregraphics.CoreGraphicsLibrary.library; /** @@ -70,11 +70,16 @@ public CGImage(BufferedImage image) throws IOException { /** */ public CGImage(Pointer/*CGImageRef*/ cgImageRef) { this.image = cgImageRef; - int cBits = CGLibrary.library.CGImageGetBitsPerComponent(image); - int bits = CGLibrary.library.CGImageGetBitsPerPixel(image); + int cBits = CoreGraphicsLibrary.library.CGImageGetBitsPerComponent(image); + int bits = CoreGraphicsLibrary.library.CGImageGetBitsPerPixel(image); logger.finer(String.format("cgImage: %dx%d, cb:%d, b:%d%n", getWidth(), getHeight(), cBits, bits)); } + @Override + public String toString() { + return "CGImage: " + getWidth() + "x" + getHeight() + ", " + image; + } + /** */ public void dispose() { library.CGImageRelease(image); diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/coregraphics/CGLibrary.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/coregraphics/CoreGraphicsLibrary.java similarity index 95% rename from rococoa-contrib/src/main/java/org/rococoa/cocoa/coregraphics/CGLibrary.java rename to rococoa-contrib/src/main/java/org/rococoa/cocoa/coregraphics/CoreGraphicsLibrary.java index 93472e5..63642f7 100644 --- a/rococoa-contrib/src/main/java/org/rococoa/cocoa/coregraphics/CGLibrary.java +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/coregraphics/CoreGraphicsLibrary.java @@ -14,14 +14,14 @@ /** - * CGLibrary. + * CoreGraphicsLibrary. * * @author
Naohide Sano (nsano) * @version 0.00 2022-09-10 nsano initial version
*/ -public interface CGLibrary extends Library { +public interface CoreGraphicsLibrary extends Library { - CGLibrary library = Native.load("CoreGraphics", CGLibrary.class); + CoreGraphicsLibrary library = Native.load("CoreGraphics", CoreGraphicsLibrary.class); int kCGEventTapDisabledByTimeout = 0xFFFF_FFFE; diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/coreimage/CIColor.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/coreimage/CIColor.java index da06f12..c9d2afa 100644 --- a/rococoa-contrib/src/main/java/org/rococoa/cocoa/coreimage/CIColor.java +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/coreimage/CIColor.java @@ -10,11 +10,9 @@ import org.rococoa.ObjCClass; import org.rococoa.Rococoa; import org.rococoa.cocoa.CGFloat; -import org.rococoa.cocoa.coregraphics.CGLibrary; +import org.rococoa.cocoa.coregraphics.CoreGraphicsLibrary; import org.rococoa.cocoa.coregraphics.CGRect; -import org.rococoa.cocoa.foundation.NSDictionary; import org.rococoa.cocoa.foundation.NSObject; -import org.rococoa.cocoa.foundation.NSString; /** @@ -38,7 +36,7 @@ public interface _Class extends ObjCClass { public abstract String stringRepresentation(); public static CIColor newInstance(double r, double g, double b, double a) { - Pointer colorRef = CGLibrary.library.CGColorCreateGenericRGB( + Pointer colorRef = CoreGraphicsLibrary.library.CGColorCreateGenericRGB( new CGFloat(r), new CGFloat(g), new CGFloat(b), new CGFloat(a)); String colorString = CIColor.CLASS.colorWithCGColor(colorRef).stringRepresentation(); return CIColor.CLASS.colorWithString(colorString); diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/coreimage/CIFilterOp.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/coreimage/CIFilterOp.java index 2c1d47d..c1af1da 100644 --- a/rococoa-contrib/src/main/java/org/rococoa/cocoa/coreimage/CIFilterOp.java +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/coreimage/CIFilterOp.java @@ -26,6 +26,7 @@ * * @author Naohide Sano (nsano) * @version 0.00 2022-10-13 nsano initial version
+ * @see "https://cifilter.io/" */ public class CIFilterOp implements BufferedImageOp { diff --git a/rococoa-contrib/src/test/java/org/rococoa/cocoa/coregraphics/CGLibraryTest.java b/rococoa-contrib/src/test/java/org/rococoa/cocoa/coregraphics/CoreGraphicsLibraryTest.java similarity index 76% rename from rococoa-contrib/src/test/java/org/rococoa/cocoa/coregraphics/CGLibraryTest.java rename to rococoa-contrib/src/test/java/org/rococoa/cocoa/coregraphics/CoreGraphicsLibraryTest.java index 651041f..8363f54 100644 --- a/rococoa-contrib/src/test/java/org/rococoa/cocoa/coregraphics/CGLibraryTest.java +++ b/rococoa-contrib/src/test/java/org/rococoa/cocoa/coregraphics/CoreGraphicsLibraryTest.java @@ -13,12 +13,12 @@ /** - * CGLibraryTest. + * CoreGraphicsLibraryTest. * * @author Naohide Sano (nsano) * @version 0.00 2022-09-11 nsano initial version
*/ -public class CGLibraryTest { +public class CoreGraphicsLibraryTest { @Test void tes1() throws Exception { @@ -28,7 +28,7 @@ void tes1() throws Exception { @Test void tes2() throws Exception { - CGImage cgImage = new CGImage(CGLibraryTest.class.getResourceAsStream("/sample1.heic")); + CGImage cgImage = new CGImage(CoreGraphicsLibraryTest.class.getResourceAsStream("/sample1.heic")); Debug.println("cgImage: " + cgImage.getWidth() + "x" + cgImage.getHeight()); CGRect r = new CGRect(10, 20, 200, 100); Debug.println("rect: " + r); @@ -36,7 +36,7 @@ void tes2() throws Exception { CIImage ciImage = CIImage.CLASS.imageWithCGImage(cgImage.pointer()); Debug.println("ciImage: " + ciImage); - Pointer cgImage2 = CGLibrary.library.CGImageCreateWithImageInRect(cgImage.pointer(), r); + Pointer cgImage2 = CoreGraphicsLibrary.library.CGImageCreateWithImageInRect(cgImage.pointer(), r); Debug.println("CGImageCreateWithImageInRect: " + cgImage2); } } diff --git a/rococoa-contrib/src/test/java/org/rococoa/cocoa/coreimage/TestCoreImage.java b/rococoa-contrib/src/test/java/org/rococoa/cocoa/coreimage/CoreImageTest.java similarity index 90% rename from rococoa-contrib/src/test/java/org/rococoa/cocoa/coreimage/TestCoreImage.java rename to rococoa-contrib/src/test/java/org/rococoa/cocoa/coreimage/CoreImageTest.java index 73217d1..2a6da38 100644 --- a/rococoa-contrib/src/test/java/org/rococoa/cocoa/coreimage/TestCoreImage.java +++ b/rococoa-contrib/src/test/java/org/rococoa/cocoa/coreimage/CoreImageTest.java @@ -22,7 +22,7 @@ import org.rococoa.cocoa.CGFloat; import org.rococoa.cocoa.appkit.NSImage; import org.rococoa.cocoa.coregraphics.CGImage; -import org.rococoa.cocoa.coregraphics.CGLibrary; +import org.rococoa.cocoa.coregraphics.CoreGraphicsLibrary; import org.rococoa.cocoa.coregraphics.CGRect; import org.rococoa.cocoa.foundation.NSArray; import org.rococoa.cocoa.foundation.NSNumber; @@ -31,19 +31,19 @@ /** - * TestCoreImage. + * CoreImageTest. * * @author Naohide Sano (nsano) * @version 0.00 2022-09-11 nsano initial version
*/ -class TestCoreImage { +class CoreImageTest { /** @see "https://stackoverflow.com/a/23877167" */ @Test @EnabledIfSystemProperty(named = "vavi.test", matches = "ide") void test1() throws Exception { - Pointer/*CGColorRef*/ colorRef = CGLibrary.library.CGColorCreateGenericRGB( + Pointer/*CGColorRef*/ colorRef = CoreGraphicsLibrary.library.CGColorCreateGenericRGB( new CGFloat(255.0), new CGFloat(0), new CGFloat(255.0), @@ -53,7 +53,7 @@ void test1() throws Exception { CIContext context = CIContext.CLASS.contextWithOptions(null); - CGImage cgImage = new CGImage(TestCoreImage.class.getResourceAsStream("/sample1.heic")); + CGImage cgImage = new CGImage(CoreImageTest.class.getResourceAsStream("/sample1.heic")); Debug.println("cgImage: " + cgImage.getWidth() + "x" + cgImage.getHeight()); // Convert UIImage to CIImage @@ -91,6 +91,7 @@ void test1() throws Exception { show(image); } + /** */ void show(BufferedImage image) { JFrame frame = new JFrame(); JPanel panel = new JPanel() { @@ -111,7 +112,7 @@ public void paintComponent(Graphics g) { @DisplayName("CIImage -> BufferedImage") @EnabledIfSystemProperty(named = "vavi.test", matches = "ide") void test2() throws Exception { - CIImage ciImage = CIImage.newInstance(TestCoreImage.class.getResourceAsStream("/sample1.heic")); + CIImage ciImage = CIImage.newInstance(CoreImageTest.class.getResourceAsStream("/sample1.heic")); Debug.println("ciImage: " + ciImage); show(ciImage.toBufferedImage()); } @@ -120,7 +121,7 @@ void test2() throws Exception { @DisplayName("BufferedImage -> CIImage") @EnabledIfSystemProperty(named = "vavi.test", matches = "ide") void test3() throws Exception { - BufferedImage bi = ImageIO.read(TestCoreImage.class.getResourceAsStream("/test.jpg")); + BufferedImage bi = ImageIO.read(CoreImageTest.class.getResourceAsStream("/test.jpg")); Debug.println("bi: " + bi); CIImage ciImage = CIImage.newInstance(bi); Debug.println("ciImage: " + ciImage); @@ -130,7 +131,7 @@ void test3() throws Exception { @Test @EnabledIfSystemProperty(named = "vavi.test", matches = "ide") void test4() throws Exception { - BufferedImage image = ImageIO.read(TestCoreImage.class.getResourceAsStream("/test.jpg")); + BufferedImage image = ImageIO.read(CoreImageTest.class.getResourceAsStream("/test.jpg")); long t = System.currentTimeMillis(); Map options = new HashMap<>(); @@ -146,7 +147,7 @@ void test4() throws Exception { @Test @EnabledIfSystemProperty(named = "vavi.test", matches = "ide") void test5() throws Exception { - BufferedImage image = ImageIO.read(TestCoreImage.class.getResourceAsStream("/test.jpg")); + BufferedImage image = ImageIO.read(CoreImageTest.class.getResourceAsStream("/test.jpg")); long t = System.currentTimeMillis(); Map options = new HashMap<>(); From 81974356417fbbdde274586de1335e1dc86bc8cc Mon Sep 17 00:00:00 2001 From: Naohide Sano Date: Sat, 15 Oct 2022 23:00:54 +0900 Subject: [PATCH 08/36] [core-ml] first implementation --- .../rococoa/cocoa/coreml/CoreMLLibrary.java | 27 ++ .../org/rococoa/cocoa/coreml/MLModel.java | 86 ++++++ .../cocoa/coreml/MLModelConfiguration.java | 44 +++ .../cocoa/coreml/MLModelDescription.java | 31 +++ .../cocoa/corevideo/CoreVideoLibrary.java | 34 +++ .../cocoa/corevideo/VideoToolboxLibrary.java | 26 ++ .../foundation/FoundationKitFunctions.java | 3 - .../rococoa/cocoa/vision/VNCoreMLModel.java | 58 ++++ .../rococoa/cocoa/vision/VNCoreMLRequest.java | 39 +++ .../cocoa/vision/VNImageBasedRequest.java | 29 ++ .../cocoa/vision/VNImageRequestHandler.java | 67 +++++ .../rococoa/cocoa/vision/VNObservation.java | 30 ++ .../vision/VNPixelBufferObservation.java | 37 +++ .../org/rococoa/cocoa/vision/VNRequest.java | 61 ++++ .../rococoa/cocoa/vision/VisionLibrary.java | 23 ++ .../org/rococoa/cocoa/coreml/CoreMLTest.java | 80 ++++++ .../org/rococoa/cocoa/foundation/NSArray.java | 14 + .../rococoa/cocoa/foundation/NSBundle.java | 263 ++++++++++++++++++ .../cocoa/foundation/NSDictionary.java | 4 + 19 files changed, 953 insertions(+), 3 deletions(-) create mode 100644 rococoa-contrib/src/main/java/org/rococoa/cocoa/coreml/CoreMLLibrary.java create mode 100644 rococoa-contrib/src/main/java/org/rococoa/cocoa/coreml/MLModel.java create mode 100644 rococoa-contrib/src/main/java/org/rococoa/cocoa/coreml/MLModelConfiguration.java create mode 100644 rococoa-contrib/src/main/java/org/rococoa/cocoa/coreml/MLModelDescription.java create mode 100644 rococoa-contrib/src/main/java/org/rococoa/cocoa/corevideo/CoreVideoLibrary.java create mode 100644 rococoa-contrib/src/main/java/org/rococoa/cocoa/corevideo/VideoToolboxLibrary.java create mode 100644 rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNCoreMLModel.java create mode 100644 rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNCoreMLRequest.java create mode 100644 rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNImageBasedRequest.java create mode 100644 rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNImageRequestHandler.java create mode 100644 rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNObservation.java create mode 100644 rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNPixelBufferObservation.java create mode 100644 rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNRequest.java create mode 100644 rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VisionLibrary.java create mode 100644 rococoa-contrib/src/test/java/org/rococoa/cocoa/coreml/CoreMLTest.java create mode 100644 rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSBundle.java diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/coreml/CoreMLLibrary.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/coreml/CoreMLLibrary.java new file mode 100644 index 0000000..70cc90b --- /dev/null +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/coreml/CoreMLLibrary.java @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2022 by Naohide Sano, All rights reserved. + * + * Programmed by Naohide Sano + */ + +package org.rococoa.cocoa.coreml; + +import com.sun.jna.Callback; +import com.sun.jna.Library; +import com.sun.jna.Native; +import com.sun.jna.Pointer; +import org.rococoa.cocoa.CGFloat; +import org.rococoa.cocoa.coregraphics.CGRect; + + +/** + * CoreMLLibrary. + * + * @author Naohide Sano (nsano) + * @version 0.00 2022-10-15 nsano initial version
+ */ +public interface CoreMLLibrary extends Library { + + CoreMLLibrary library = Native.load("CoreML", CoreMLLibrary.class); + +} diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/coreml/MLModel.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/coreml/MLModel.java new file mode 100644 index 0000000..82f0dfb --- /dev/null +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/coreml/MLModel.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2022 by Naohide Sano, All rights reserved. + * + * Programmed by Naohide Sano + */ + +package org.rococoa.cocoa.coreml; + +import java.net.URL; +import java.util.logging.Logger; + +import org.rococoa.ObjCClass; +import org.rococoa.ObjCObjectByReference; +import org.rococoa.Rococoa; +import org.rococoa.cocoa.foundation.NSError; +import org.rococoa.cocoa.foundation.NSObject; +import org.rococoa.cocoa.foundation.NSURL; + + +/** + * MLModel. + * + * @author Naohide Sano (nsano) + * @version 0.00 2022-10-15 nsano initial version
+ */ +public abstract class MLModel extends NSObject { + + static { + CoreMLLibrary.library.toString(); + } + + private static final Logger logger = Logger.getLogger(MLModel.class.getName()); + + public static final _Class CLASS = Rococoa.createClass("MLModel", _Class.class); + + public interface _Class extends ObjCClass { + /** Creates a Core ML model instance from a compiled model file. */ + MLModel modelWithContentsOfURL_error(NSURL url, ObjCObjectByReference/*NSError*/ error); + /** Creates a Core ML model instance from a compiled model file and a custom configuration. */ + MLModel modelWithContentsOfURL_configuration_error(NSURL url, MLModelConfiguration configuration, ObjCObjectByReference/*NSError*/ error); + MLModel alloc(); + @Deprecated + NSURL compileModelAtURL_error(NSURL modelURL, ObjCObjectByReference/*NSError*/ error); + } + + public static MLModel modelWithContentsOfURL(NSURL url) { + ObjCObjectByReference errorRef = new ObjCObjectByReference(); + MLModel model = CLASS.modelWithContentsOfURL_error(url, errorRef); + NSError error = errorRef.getValueAs(NSError.class); + if (error != null) { + throw new IllegalStateException(error.description()); + } + return model; + } + + public static MLModel modelWithContentsOfURLConfiguration(NSURL url, MLModelConfiguration configuration) { + ObjCObjectByReference errorRef = new ObjCObjectByReference(); + MLModel model = CLASS.modelWithContentsOfURL_configuration_error(url, configuration, errorRef); + NSError error = errorRef.getValueAs(NSError.class); + if (error != null) { + throw new IllegalStateException(error.description()); + } + return model; + } + + /** Model information you use at runtime during development, which Xcode also displays in its Core ML model editor view. */ + public abstract MLModelDescription modelDescription(); + + /** */ + public static NSURL compileModelAtURL(NSURL modelURL) { + ObjCObjectByReference errorRef = new ObjCObjectByReference(); + NSURL url = CLASS.compileModelAtURL_error(modelURL, errorRef); + NSError error = errorRef.getValueAs(NSError.class); + if (error != null) { + throw new IllegalStateException(error.description()); + } + return url; + } + + public static MLModel fromPath(String path) { + NSURL url = NSURL.fileURLWithPath(path); + NSURL compiledUrl = MLModel.compileModelAtURL(url); +logger.fine("compiledUrl: " + compiledUrl); + return MLModel.modelWithContentsOfURL(compiledUrl); + } +} diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/coreml/MLModelConfiguration.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/coreml/MLModelConfiguration.java new file mode 100644 index 0000000..6654a64 --- /dev/null +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/coreml/MLModelConfiguration.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2022 by Naohide Sano, All rights reserved. + * + * Programmed by Naohide Sano + */ + +package org.rococoa.cocoa.coreml; + +import java.util.logging.Logger; + +import org.rococoa.ObjCClass; +import org.rococoa.Rococoa; +import org.rococoa.cocoa.foundation.NSDictionary; +import org.rococoa.cocoa.foundation.NSObject; +import org.rococoa.cocoa.foundation.NSString; + + +/** + * The settings for creating or updating a machine learning model. + * + * @author Naohide Sano (nsano) + * @version 0.00 2022-10-15 nsano initial version
+ */ +public abstract class MLModelConfiguration extends NSObject { + + static { + CoreMLLibrary.library.toString(); + } + + private static final Logger logger = Logger.getLogger(MLModelConfiguration.class.getName()); + + public static final _Class CLASS = Rococoa.createClass("MLModelConfiguration", _Class.class); + + public interface _Class extends ObjCClass { + MLModelConfiguration alloc(); + MLModelConfiguration init(); + } + + /** A human readable name of a model for display purposes. */ + public abstract String modelDisplayName(); + + /** A dictionary of configuration settings your app can override when loading a model. */ + public abstract NSDictionary parameters(); +} diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/coreml/MLModelDescription.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/coreml/MLModelDescription.java new file mode 100644 index 0000000..218bb2b --- /dev/null +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/coreml/MLModelDescription.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2022 by Naohide Sano, All rights reserved. + * + * Programmed by Naohide Sano + */ + +package org.rococoa.cocoa.coreml; + +import java.util.logging.Logger; + +import org.rococoa.ObjCClass; +import org.rococoa.ObjCObjectByReference; +import org.rococoa.Rococoa; +import org.rococoa.cocoa.foundation.NSObject; + + +/** + * MLModelDescription. + * + * @author Naohide Sano (nsano) + * @version 0.00 2022-10-15 nsano initial version
+ */ +public abstract class MLModelDescription extends NSObject { + + private static final Logger logger = Logger.getLogger(MLModelDescription.class.getName()); + + public static final _Class CLASS = Rococoa.createClass("MLModelDescription", _Class.class); + + public interface _Class extends ObjCClass { + } +} diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/corevideo/CoreVideoLibrary.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/corevideo/CoreVideoLibrary.java new file mode 100644 index 0000000..f2afd6f --- /dev/null +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/corevideo/CoreVideoLibrary.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2022 by Naohide Sano, All rights reserved. + * + * Programmed by Naohide Sano + */ + +package org.rococoa.cocoa.corevideo; + +import com.sun.jna.Library; +import com.sun.jna.Native; +import com.sun.jna.NativeLong; +import com.sun.jna.Pointer; + + +/** + * CoreVideoLibrary. + * + * @author Naohide Sano (nsano) + * @version 0.00 2022-10-15 nsano initial version
+ */ +public interface CoreVideoLibrary extends Library { + + CoreVideoLibrary library = Native.load("CoreVideo", CoreVideoLibrary.class); + + int CVPixelBufferGetWidth(Pointer/*CVPixelBufferRef*/ pixelBuffer); + + int CVPixelBufferGetHeight(Pointer/*CVPixelBufferRef*/ pixelBuffer); + + void CVPixelBufferRetain(Pointer/*CVPixelBufferRef*/ pixelBuffer); + + void CVPixelBufferRelease(Pointer/*CVPixelBufferRef*/ pixelBuffer); + + int CVPixelBufferGetDataSize(Pointer/*CVPixelBufferRef*/ pixelBuffer); +} diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/corevideo/VideoToolboxLibrary.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/corevideo/VideoToolboxLibrary.java new file mode 100644 index 0000000..01c27f5 --- /dev/null +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/corevideo/VideoToolboxLibrary.java @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2022 by Naohide Sano, All rights reserved. + * + * Programmed by Naohide Sano + */ + +package org.rococoa.cocoa.corevideo; + +import com.sun.jna.Library; +import com.sun.jna.Native; +import com.sun.jna.Pointer; +import com.sun.jna.ptr.PointerByReference; + + +/** + * VideoToolboxLibrary. + * + * @author Naohide Sano (nsano) + * @version 0.00 2022-10-15 nsano initial version
+ */ +public interface VideoToolboxLibrary extends Library { + + VideoToolboxLibrary library = Native.load("VideoToolbox", VideoToolboxLibrary.class); + + int/*OSStatus*/ VTCreateCGImageFromCVPixelBuffer(Pointer/*CVPixelBufferRef*/ pixelBuffer, Pointer/*CFDictionaryRef*/ options, PointerByReference/*CGImageRef*/ imageOut); +} diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/foundation/FoundationKitFunctions.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/foundation/FoundationKitFunctions.java index aaeda27..ed02cd4 100644 --- a/rococoa-contrib/src/main/java/org/rococoa/cocoa/foundation/FoundationKitFunctions.java +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/foundation/FoundationKitFunctions.java @@ -21,12 +21,9 @@ import java.util.Collections; -import com.sun.jna.NativeLong; import com.sun.jna.Pointer; -import org.rococoa.ID; import org.rococoa.cocoa.CFIndex; -import org.rococoa.cocoa.coregraphics.CGLibrary; import org.rococoa.internal.RococoaTypeMapper; import com.sun.jna.Library; diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNCoreMLModel.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNCoreMLModel.java new file mode 100644 index 0000000..cd79d83 --- /dev/null +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNCoreMLModel.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2022 by Naohide Sano, All rights reserved. + * + * Programmed by Naohide Sano + */ + +package org.rococoa.cocoa.vision; + +import java.util.logging.Logger; + +import org.rococoa.ObjCClass; +import org.rococoa.ObjCObjectByReference; +import org.rococoa.Rococoa; +import org.rococoa.cocoa.coreml.MLModel; +import org.rococoa.cocoa.foundation.NSError; +import org.rococoa.cocoa.foundation.NSObject; +import org.rococoa.cocoa.foundation.NSString; + + +/** + * VNCoreMLModel. + * + * @author Naohide Sano (nsano) + * @version 0.00 2022-10-15 nsano initial version
+ */ +public abstract class VNCoreMLModel extends NSObject { + + static { + VisionLibrary.library.toString(); + } + + private static final Logger logger = Logger.getLogger(VNCoreMLModel.class.getName()); + + public static final _Class CLASS = Rococoa.createClass("VNCoreMLModel", _Class.class); + + public interface _Class extends ObjCClass { + /** + * This method may fail if Vision does not support the created CoreML model. + * For example, a model that does not accept an image as any of its inputs + * will yield an VNErrorInvalidModel error. + */ + VNCoreMLModel modelForMLModel_error(MLModel model, ObjCObjectByReference/*NSError*/ error); + } + + /** The name of the MLFeatureValue that Vision sets from the request handler. */ + public abstract String inputImageFeatureName(); + + /** utility */ + public static VNCoreMLModel fromMLModel(MLModel mlModel) { + ObjCObjectByReference errorRef = new ObjCObjectByReference(); + VNCoreMLModel model = VNCoreMLModel.CLASS.modelForMLModel_error(mlModel, errorRef); + NSError error = errorRef.getValueAs(NSError.class); + if (error != null) { + throw new IllegalStateException(error.description()); + } + return model; + } +} diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNCoreMLRequest.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNCoreMLRequest.java new file mode 100644 index 0000000..5c4af77 --- /dev/null +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNCoreMLRequest.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2022 by Naohide Sano, All rights reserved. + * + * Programmed by Naohide Sano + */ + +package org.rococoa.cocoa.vision; + +import java.util.logging.Logger; + +import org.rococoa.ObjCClass; +import org.rococoa.Rococoa; + + +/** + * VNCoreMLRequest. + * + * @author Naohide Sano (nsano) + * @version 0.00 2022-10-15 nsano initial version
+ */ +public abstract class VNCoreMLRequest extends VNImageBasedRequest { + + private static final Logger logger = Logger.getLogger(VNCoreMLRequest.class.getName()); + + public static final _Class CLASS = Rococoa.createClass("VNCoreMLRequest", _Class.class); + + public interface _Class extends ObjCClass { + VNCoreMLRequest alloc(); + } + + public abstract VNCoreMLRequest initWithModel(VNCoreMLModel model); + + /** utility */ + public static VNCoreMLRequest newRequest(VNCoreMLModel model) { + return CLASS.alloc().initWithModel(model); + } + + public abstract VNCoreMLModel model(); +} diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNImageBasedRequest.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNImageBasedRequest.java new file mode 100644 index 0000000..b051910 --- /dev/null +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNImageBasedRequest.java @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2022 by Naohide Sano, All rights reserved. + * + * Programmed by Naohide Sano + */ + +package org.rococoa.cocoa.vision; + +import java.util.logging.Logger; + +import org.rococoa.ObjCClass; +import org.rococoa.Rococoa; + + +/** + * VNImageBasedRequest. + * + * @author Naohide Sano (nsano) + * @version 0.00 2022-10-15 nsano initial version
+ */ +public abstract class VNImageBasedRequest extends VNRequest { + + private static final Logger logger = Logger.getLogger(VNImageBasedRequest.class.getName()); + + public static final _Class CLASS = Rococoa.createClass("VNImageBasedRequest", _Class.class); + + public interface _Class extends ObjCClass { + } +} diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNImageRequestHandler.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNImageRequestHandler.java new file mode 100644 index 0000000..9a57ffd --- /dev/null +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNImageRequestHandler.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2022 by Naohide Sano, All rights reserved. + * + * Programmed by Naohide Sano + */ + +package org.rococoa.cocoa.vision; + +import java.util.logging.Logger; + +import com.sun.jna.Pointer; +import org.rococoa.ObjCClass; +import org.rococoa.ObjCObjectByReference; +import org.rococoa.Rococoa; +import org.rococoa.cocoa.coreimage.CIImage; +import org.rococoa.cocoa.foundation.NSArray; +import org.rococoa.cocoa.foundation.NSData; +import org.rococoa.cocoa.foundation.NSDictionary; +import org.rococoa.cocoa.foundation.NSError; +import org.rococoa.cocoa.foundation.NSObject; +import org.rococoa.cocoa.foundation.NSURL; + + +/** + * An object that processes one or more image analysis requests pertaining to a single image. + * + * @author Naohide Sano (nsano) + * @version 0.00 2022-10-15 nsano initial version
+ */ +public abstract class VNImageRequestHandler extends NSObject { + + private static final Logger logger = Logger.getLogger(VNImageRequestHandler.class.getName()); + + public static final _Class CLASS = Rococoa.createClass("VNImageRequestHandler", _Class.class); + + public interface _Class extends ObjCClass { + VNImageRequestHandler alloc(); + } + + /** Creates a handler to be used for performing requests on Core Graphics images. */ + public abstract VNImageRequestHandler initWithCGImage_options(Pointer/*CGImageRef*/ image, NSDictionary options); + /** Creates a handler to be used for performing requests on CIImage data. */ + public abstract VNImageRequestHandler initWithCIImage_options(CIImage image, NSDictionary options); + /** Creates a handler to be used for performing requests on an image contained in an NSData object. */ + public abstract VNImageRequestHandler initWithData_options(NSData imageData, NSDictionary options); + /** Creates a handler to be used for performing requests on an image at the specified URL. */ + public abstract VNImageRequestHandler initWithURL_options(NSURL imageURL, NSDictionary options); + + /** utility */ + public static VNImageRequestHandler initWithCGImage(Pointer/*CGImageRef*/ image) { + return CLASS.alloc().initWithCGImage_options(image, NSDictionary.emptyDictionary()); + } + + /** Schedules Vision requests to be performed. */ + public abstract boolean performRequests_error(NSArray requests, ObjCObjectByReference/*NSError*/ error); + + /** utility */ + public void performRequests(VNCoreMLRequest request) { + ObjCObjectByReference errorRef = new ObjCObjectByReference(); + NSArray coreMLRequests = NSArray.arrayWithObjects(request); + performRequests_error(coreMLRequests, errorRef); + NSError error = errorRef.getValueAs(NSError.class); + if (error != null) { + throw new IllegalStateException(error.description()); + } + } +} diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNObservation.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNObservation.java new file mode 100644 index 0000000..5a9d2f5 --- /dev/null +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNObservation.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2022 by Naohide Sano, All rights reserved. + * + * Programmed by Naohide Sano + */ + +package org.rococoa.cocoa.vision; + +import java.util.logging.Logger; + +import org.rococoa.ObjCClass; +import org.rococoa.Rococoa; + + +/** + * The abstract superclass for analysis results. + * + * @author Naohide Sano (nsano) + * @version 0.00 2022-10-15 nsano initial version
+ */ +public abstract class VNObservation extends VNImageBasedRequest { + + private static final Logger logger = Logger.getLogger(VNObservation.class.getName()); + + public static final _Class CLASS = Rococoa.createClass("VNObservation", _Class.class); + + public interface _Class extends ObjCClass { + VNObservation alloc(); + } +} diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNPixelBufferObservation.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNPixelBufferObservation.java new file mode 100644 index 0000000..a1f2a5d --- /dev/null +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNPixelBufferObservation.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2022 by Naohide Sano, All rights reserved. + * + * Programmed by Naohide Sano + */ + +package org.rococoa.cocoa.vision; + +import java.util.logging.Logger; + +import com.sun.jna.Pointer; +import org.rococoa.ObjCClass; +import org.rococoa.Rococoa; + + +/** + * An object that represents an image that an image analysis request produces. + * + * @author Naohide Sano (nsano) + * @version 0.00 2022-10-15 nsano initial version
+ */ +public abstract class VNPixelBufferObservation extends VNImageBasedRequest { + + private static final Logger logger = Logger.getLogger(VNPixelBufferObservation.class.getName()); + + public static final _Class CLASS = Rococoa.createClass("VNPixelBufferObservation", _Class.class); + + public interface _Class extends ObjCClass { + VNPixelBufferObservation alloc(); + } + + /** The image that results from a request with image output. */ + public abstract Pointer/*CVPixelBufferRef*/ pixelBuffer(); + + /** A feature name that the CoreML model defines. */ + public abstract String featureName(); +} diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNRequest.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNRequest.java new file mode 100644 index 0000000..243335a --- /dev/null +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNRequest.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2022 by Naohide Sano, All rights reserved. + * + * Programmed by Naohide Sano + */ + +package org.rococoa.cocoa.vision; + +import java.util.logging.Logger; + +import com.sun.jna.Pointer; +import com.sun.jna.ptr.PointerByReference; +import org.rococoa.ObjCClass; +import org.rococoa.Rococoa; +import org.rococoa.cocoa.corevideo.VideoToolboxLibrary; +import org.rococoa.cocoa.foundation.NSArray; +import org.rococoa.cocoa.foundation.NSObject; + + +/** + * VNRequest. + * + * @author Naohide Sano (nsano) + * @version 0.00 2022-10-15 nsano initial version
+ */ +public abstract class VNRequest extends NSObject { + + private static final Logger logger = Logger.getLogger(VNRequest.class.getName()); + + public static final _Class CLASS = Rococoa.createClass("VNRequest", _Class.class); + + public interface _Class extends ObjCClass { + VNRequest alloc(); + } + + public abstract VNRequest init(); + + /** Cancels the request before it can finish executing. */ + public abstract void cancel(); + + /** + * The collection of VNObservation results generated by request processing. + * @return NSArray + */ + public abstract NSArray results(); + + /** utility */ + public Pointer result() { + NSArray results = results(); +logger.finer(results.count() + ", " + results.firstObject()); + if (results.firstObject().isKindOfClass(VNPixelBufferObservation.CLASS)) { + Pointer pixelBuffer = Rococoa.cast(results.firstObject(), VNPixelBufferObservation.class).pixelBuffer(); + PointerByReference imageRef = new PointerByReference(); + VideoToolboxLibrary.library.VTCreateCGImageFromCVPixelBuffer(pixelBuffer, null, imageRef); + return imageRef.getValue(); + } else { + // TODO + throw new UnsupportedOperationException(results.firstObject().getClass().getName()); + } + } +} diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VisionLibrary.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VisionLibrary.java new file mode 100644 index 0000000..8a33d5b --- /dev/null +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VisionLibrary.java @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2022 by Naohide Sano, All rights reserved. + * + * Programmed by Naohide Sano + */ + +package org.rococoa.cocoa.vision; + +import com.sun.jna.Library; +import com.sun.jna.Native; + + +/** + * VisionLibrary. + * + * @author Naohide Sano (nsano) + * @version 0.00 2022-10-15 nsano initial version
+ */ +public interface VisionLibrary extends Library { + + VisionLibrary library = Native.load("Vision", VisionLibrary.class); + +} diff --git a/rococoa-contrib/src/test/java/org/rococoa/cocoa/coreml/CoreMLTest.java b/rococoa-contrib/src/test/java/org/rococoa/cocoa/coreml/CoreMLTest.java new file mode 100644 index 0000000..237e2cc --- /dev/null +++ b/rococoa-contrib/src/test/java/org/rococoa/cocoa/coreml/CoreMLTest.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2022 by Naohide Sano, All rights reserved. + * + * Programmed by Naohide Sano + */ + +package org.rococoa.cocoa.coreml; + +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.image.BufferedImage; +import java.nio.file.Files; +import java.nio.file.Paths; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.JScrollPane; + +import org.junit.jupiter.api.Test; +import org.rococoa.cocoa.coregraphics.CGImage; +import org.rococoa.cocoa.vision.VNCoreMLModel; +import org.rococoa.cocoa.vision.VNCoreMLRequest; +import org.rococoa.cocoa.vision.VNImageRequestHandler; +import vavi.util.Debug; + + +/** + * CoreMLTest. + * + * @author Naohide Sano (nsano) + * @version 0.00 2022/10/15 nsano initial version
+ * @see "https://github.com/mworks/mworks/blob/01dade67c468f5fe5942457809cf4a6367294b6c/plugins/core/FaceRecognizer/FaceRecognizer/Helpers/ModelManager.cpp" + */ +class CoreMLTest { + + @Test + void test1() throws Exception { + +long t = System.currentTimeMillis(); +Debug.println("MLModel: loading..."); + MLModel mlModel = MLModel.fromPath("/Users/nsano/Downloads/realesrganAnime512.mlmodel"); +// MLModel mlModel = MLModel.fromPath("/Users/nsano/Downloads/bsrgan.mlmodel"); +//Debug.println("MLModel: " + mlModel.modelDescription()); + + VNCoreMLModel model = VNCoreMLModel.fromMLModel(mlModel); +//Debug.println("VNCoreMLModel: " + model.inputImageFeatureName()); +Debug.println("prepare done: " + (System.currentTimeMillis() - t) + " ms"); + + VNCoreMLRequest request = VNCoreMLRequest.newRequest(model); + +// CGImage cgImage = new CGImage(CoreMLTest.class.getResourceAsStream("/test.jpg")); + CGImage cgImage = new CGImage(Files.newInputStream(Paths.get("/Users/nsano/src/vavi/vavi-image-dlfilter/tmp/v01_031.jpg"))); +// CGImage cgImage = new CGImage(Files.newInputStream(Paths.get("/Users/nsano/src/vavi/vavi-image-dlfilter/src/test/resources/namacha.jpg"))); + + VNImageRequestHandler handler = VNImageRequestHandler.initWithCGImage(cgImage.pointer()); +t = System.currentTimeMillis(); + handler.performRequests(request); + + CGImage filteredImage = new CGImage(request.result()); +Debug.println((System.currentTimeMillis() - t) + " ms"); +Debug.println("cgImage: " + filteredImage); + show(filteredImage.toBufferedImage()); + } + + /** */ + void show(BufferedImage image) { + JFrame frame = new JFrame(); + JPanel panel = new JPanel() { + public void paintComponent(Graphics g) { + g.drawImage(image, 0, 0, this); + } + }; + panel.setPreferredSize(new Dimension(image.getWidth(), image.getHeight())); + frame.setContentPane(new JScrollPane(panel)); + frame.setTitle("CoreML"); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.pack(); + frame.setVisible(true); + while (true) Thread.yield(); + } +} \ No newline at end of file diff --git a/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSArray.java b/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSArray.java index 03566d0..5676fab 100755 --- a/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSArray.java +++ b/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSArray.java @@ -22,24 +22,38 @@ import org.rococoa.ObjCClass; import org.rococoa.Rococoa; + +/** + * A static ordered collection of objects. + */ public abstract class NSArray extends NSEnumerator { public static final _Class CLASS = Rococoa.createClass("NSArray", _Class.class); + public interface _Class extends ObjCClass { + /** Creates and returns an empty array. */ + NSArray array(); /** * @param objects Contents and then a trailing null */ NSArray arrayWithObjects(NSObject...objects); } + /** */ public static NSArray arrayWithObjects(NSObject...objects) { return CLASS.arrayWithObjects(objects); } + /**The number of objects in the array. */ public abstract int count(); + /** The first object in the array. */ + public abstract NSObject firstObject(); + /** The last object in the array. */ public abstract NSObject lastObject(); + /** Returns the object located at the specified index. */ public abstract NSObject objectAtIndex(int zeroOffsetIndex); + /** Returns an enumerator object that lets you access each object in the array. */ public abstract NSEnumerator objectEnumerator(); } diff --git a/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSBundle.java b/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSBundle.java new file mode 100644 index 0000000..3e7f600 --- /dev/null +++ b/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSBundle.java @@ -0,0 +1,263 @@ +/* + * Copyright (c) 2002-2009 David Kocher. All rights reserved. + * + * http://cyberduck.ch/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * Bug fixes, suggestions and comments should be sent to: + * dkocher@cyberduck.ch + */ + +package org.rococoa.cocoa.foundation; + +import org.rococoa.ObjCClass; +import org.rococoa.ObjCObjectByReference; + +/// native declaration : :12 +public abstract class NSBundle extends NSObject { + private static final _Class CLASS = org.rococoa.Rococoa.createClass("NSBundle", _Class.class); + + private static NSBundle mainBundle = null; + + public static NSBundle mainBundle() { + if(null == mainBundle) { + mainBundle = CLASS.mainBundle(); + } + return mainBundle; + } + + public static NSArray allBundles() { + return CLASS.allBundles(); + } + + public static boolean loadNibNamed(String nibName, org.rococoa.ID owner) { + return CLASS.loadNibNamed_owner(nibName, owner); + } + + public static NSBundle bundleWithPath(String path) { + return CLASS.bundleWithPath(path); + } + + + public interface _Class extends ObjCClass { + /** + * Original signature : NSBundle* mainBundle)
+ * native declaration : :24 + */ + NSBundle mainBundle(); + + /** + * Original signature : NSBundle* bundleWithPath(String*)
+ * native declaration : :25 + */ + NSBundle bundleWithPath(String path1); + + /** + * Original signature : NSBundle* bundleWithIdentifier(String*)
+ * native declaration : :29 + */ + NSBundle bundleWithIdentifier(String identifier1); + + /** + * Original signature : NSArray* allBundles)
+ * native declaration : :31 + */ + NSArray allBundles(); + + /** + * Original signature : NSArray* allFrameworks)
+ * native declaration : :32 + */ + NSArray allFrameworks(); + + /** + * In the following methods, bundlePath is an absolute path to a bundle, and may not be nil; subpath is a relative path to a subdirectory inside the relevant global or localized resource directory, and should be nil if the resource file in question is not in a subdirectory.
+ * Original signature : String* pathForResource(String*, String*, String*)
+ * native declaration : :62 + */ + String pathForResource_ofType_inDirectory(String name1, String ext2, String bundlePath3); + + /** + * Original signature : NSArray* pathsForResourcesOfType(String*, String*)
+ * native declaration : :67 + */ + NSArray pathsForResourcesOfType_inDirectory(String ext1, String bundlePath2); + + /** + * Original signature : NSArray* preferredLocalizationsFromArray(NSArray*)
+ * native declaration : :85 + */ + NSArray preferredLocalizationsFromArray(NSArray localizationsArray1); + + /** + * Original signature : NSArray* preferredLocalizationsFromArray(NSArray*, NSArray*)
+ * native declaration : :87 + */ + NSArray preferredLocalizationsFromArray_forPreferences(NSArray localizationsArray1, NSArray preferencesArray2); + + boolean loadNibNamed_owner(String nibName, org.rococoa.ID owner); + } + + /** + * Original signature : id initWithPath(String*)
+ * native declaration : :26 + */ + public abstract NSBundle initWithPath(String path1); + + /** + * Original signature : BOOL load)
+ * native declaration : :34 + */ + public abstract boolean load(); + + /** + * Original signature : BOOL isLoaded)
+ * native declaration : :36 + */ + public abstract boolean isLoaded(); + + /** + * Original signature : BOOL unload)
+ * native declaration : :37 + */ + public abstract boolean unload(); + + /** + * Original signature : BOOL preflightAndReturnError(NSError**)
+ * native declaration : :41 + */ + public abstract boolean preflightAndReturnError(ObjCObjectByReference error1); + + /** + * Original signature : BOOL loadAndReturnError(NSError**)
+ * native declaration : :42 + */ + public abstract boolean loadAndReturnError(ObjCObjectByReference error1); + + /** + * Original signature : String* bundlePath)
+ * native declaration : :45 + */ + public abstract String bundlePath(); + + /** + * Original signature : String* resourcePath)
+ * native declaration : :46 + */ + public abstract String resourcePath(); + + /** + * Original signature : String* executablePath)
+ * native declaration : :47 + */ + public abstract String executablePath(); + + /** + * Original signature : String* pathForAuxiliaryExecutable(String*)
+ * native declaration : :48 + */ + public abstract String pathForAuxiliaryExecutable(String executableName1); + + /** + * Original signature : String* privateFrameworksPath)
+ * native declaration : :50 + */ + public abstract String privateFrameworksPath(); + + /** + * Original signature : String* sharedFrameworksPath)
+ * native declaration : :51 + */ + public abstract String sharedFrameworksPath(); + + /** + * Original signature : String* sharedSupportPath)
+ * native declaration : :52 + */ + public abstract String sharedSupportPath(); + + /** + * Original signature : String* builtInPlugInsPath)
+ * native declaration : :53 + */ + public abstract String builtInPlugInsPath(); + + /** + * Original signature : String* bundleIdentifier)
+ * native declaration : :55 + */ + public abstract String bundleIdentifier(); + + /** + * Original signature : String* pathForResource(String*, String*)
+ * native declaration : :63 + */ + public abstract String pathForResource_ofType(String name1, String ext2); + + /** + * Original signature : String* pathForResource(String*, String*, String*, String*)
+ * native declaration : :65 + */ + public abstract String pathForResource_ofType_inDirectory_forLocalization(String name1, String ext2, String subpath3, String localizationName4); + + /** + * Original signature : NSArray* pathsForResourcesOfType(String*, String*, String*)
+ * native declaration : :69 + */ + public abstract NSArray pathsForResourcesOfType_inDirectory_forLocalization(String ext1, String subpath2, String localizationName3); + + public String localizedString(String key, String tableName) { + return localizedStringForKey_value_table(key, key, tableName); + } + + /** + * Original signature : String* localizedStringForKey(String*, String*, String*)
+ * native declaration : :71 + */ + public abstract String localizedStringForKey_value_table(String key1, String value2, String tableName3); + + /** + * Original signature : NSDictionary* infoDictionary)
+ * native declaration : :73 + */ + public abstract NSDictionary infoDictionary(); + + /** + * Original signature : NSDictionary* localizedInfoDictionary)
+ * native declaration : :75 + */ + public abstract NSDictionary localizedInfoDictionary(); + + /** + * Original signature : id objectForInfoDictionaryKey(String*)
+ * native declaration : :76 + */ + public abstract NSObject objectForInfoDictionaryKey(String key1); + + /** + * Original signature : NSArray* localizations)
+ * native declaration : :79 + */ + public abstract NSArray localizations(); + + /** + * Original signature : NSArray* preferredLocalizations)
+ * native declaration : :80 + */ + public abstract NSArray preferredLocalizations(); + + /** + * Original signature : String* developmentLocalization)
+ * native declaration : :82 + */ + public abstract String developmentLocalization(); +} \ No newline at end of file diff --git a/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSDictionary.java b/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSDictionary.java index a241074..b933af8 100755 --- a/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSDictionary.java +++ b/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSDictionary.java @@ -42,6 +42,10 @@ public static NSDictionary dictionaryWithObjectsAndKeys(NSObject...objects) { return CLASS.dictionaryWithObjectsAndKeys(objects); } + public static NSDictionary emptyDictionary() { + return CLASS.dictionary(); + } + public interface _Class extends ObjCClass { /** * Original signature : id dictionary()
From 4f05bb508aaf20c56ec5ea22c0ebb542440dd63d Mon Sep 17 00:00:00 2001 From: Naohide Sano Date: Wed, 19 Oct 2022 04:35:03 +0900 Subject: [PATCH 09/36] clean up follow ide advices --- rococoa-core/src/main/native/test.h | 4 +-- rococoa-core/src/main/native/test.m | 1 - .../FoundationMemoryAssumptionsTest.java | 1 - .../rococoa/NSAutoreleasePoolThreadTest.java | 32 +++++------------- .../rococoa/RococoaObjectOwnershipTest.java | 33 ++++--------------- .../src/test/java/org/rococoa/TestStruct.java | 1 - .../internal/ObjCObjectTypeConverterTest.java | 24 +++++++------- .../RococoaObjCObjectByReferenceTest.java | 6 ++-- .../internal/StringTypeConverterTest.java | 16 ++++----- .../java/org/rococoa/test/LogFormatter.java | 2 +- 10 files changed, 37 insertions(+), 83 deletions(-) diff --git a/rococoa-core/src/main/native/test.h b/rococoa-core/src/main/native/test.h index 2361d9c..5d7b48c 100644 --- a/rococoa-core/src/main/native/test.h +++ b/rococoa-core/src/main/native/test.h @@ -57,9 +57,7 @@ double addFieldsOfStructByValue(TestIntDoubleStruct s); - (BOOL) valueIsYES:(BOOL) a; - (BOOL) valueIsNO:(BOOL) a; - -- (bool) isMainThread; - +- (bool) isMainThread; @end diff --git a/rococoa-core/src/main/native/test.m b/rococoa-core/src/main/native/test.m index 3ed824c..480b914 100644 --- a/rococoa-core/src/main/native/test.m +++ b/rococoa-core/src/main/native/test.m @@ -93,5 +93,4 @@ - (bool) isMainThread { return pthread_main_np(); } - @end diff --git a/rococoa-core/src/test/java/org/rococoa/FoundationMemoryAssumptionsTest.java b/rococoa-core/src/test/java/org/rococoa/FoundationMemoryAssumptionsTest.java index 8219afb..e660a37 100644 --- a/rococoa-core/src/test/java/org/rococoa/FoundationMemoryAssumptionsTest.java +++ b/rococoa-core/src/test/java/org/rococoa/FoundationMemoryAssumptionsTest.java @@ -154,5 +154,4 @@ public void autoReleaseWorksForCFString() { Foundation.sendReturnsVoid(idPool, "drain"); assertRetainCount(1, cfStringRef); } - } diff --git a/rococoa-core/src/test/java/org/rococoa/NSAutoreleasePoolThreadTest.java b/rococoa-core/src/test/java/org/rococoa/NSAutoreleasePoolThreadTest.java index ab6b0a6..694cc2a 100644 --- a/rococoa-core/src/test/java/org/rococoa/NSAutoreleasePoolThreadTest.java +++ b/rococoa-core/src/test/java/org/rococoa/NSAutoreleasePoolThreadTest.java @@ -50,18 +50,15 @@ public class NSAutoreleasePoolThreadTest { // This is the test that is made pass by marking NSAutoreleasePool as ReleaseInFinalize(false) @Test public void garbageCollectDrainedPool() throws InterruptedException { - Thread thread = new Thread("test") { - public void run() { + Thread thread = new Thread(null, () -> { NSAutoreleasePool pool = NSAutoreleasePool.new_(); pool.drain(); - } - }; + }, "test"); thread.start(); thread.join(); RococoaTestCase.gc(); } - @Test public void drainPoolAndFinalize() { NSAutoreleasePool pool = NSAutoreleasePool.new_(); @@ -76,11 +73,7 @@ public void drainPoolAndFinalize() { @Test public void drainPoolAndFinalizeOnAnotherThread() throws InterruptedException { - Thread thread = new Thread("test") { - public void run() { - drainPoolAndFinalize(); - } - }; + Thread thread = new Thread(null, this::drainPoolAndFinalize, "test"); thread.start(); thread.join(); RococoaTestCase.gc(); @@ -90,11 +83,9 @@ public void run() { @Test public void cantDrainPoolCreatedOnAFinishedThread() throws InterruptedException { final NSAutoreleasePool[] poolHolder = new NSAutoreleasePool[1]; - Thread thread = new Thread("test") { - public void run() { + Thread thread = new Thread(null, () -> { poolHolder[0] = NSAutoreleasePool.new_(); - } - }; + }, "test"); thread.start(); thread.join(); poolHolder[0].drain(); @@ -106,13 +97,11 @@ public void drainPoolCreatedOnANotFinishedThread() throws InterruptedException { final NSAutoreleasePool[] poolHolder = new NSAutoreleasePool[1]; final CyclicBarrier beforeDrain = new CyclicBarrier(2); final CyclicBarrier afterDrain = new CyclicBarrier(2); - Thread thread = new Thread("test") { - public void run() { + Thread thread = new Thread(null, () -> { poolHolder[0] = NSAutoreleasePool.new_(); await(beforeDrain); await(afterDrain); - } - }; + }, "test"); thread.start(); await(beforeDrain); poolHolder[0].drain(); @@ -125,14 +114,12 @@ public void drainAlreadyDrainedPoolCreatedOnANotFinishedThread() throws Interrup final NSAutoreleasePool[] poolHolder = new NSAutoreleasePool[1]; final CyclicBarrier beforeDrain = new CyclicBarrier(2); final CyclicBarrier afterDrain = new CyclicBarrier(2); - Thread thread = new Thread("test") { - public void run() { + Thread thread = new Thread(null, () -> { poolHolder[0] = NSAutoreleasePool.new_(); poolHolder[0].drain(); await(beforeDrain); await(afterDrain); - } - }; + }, "test"); thread.start(); await(beforeDrain); poolHolder[0].drain(); @@ -150,5 +137,4 @@ private void await(CyclicBarrier barrier) { throw new RuntimeException(e); } } - } \ No newline at end of file diff --git a/rococoa-core/src/test/java/org/rococoa/RococoaObjectOwnershipTest.java b/rococoa-core/src/test/java/org/rococoa/RococoaObjectOwnershipTest.java index a806da8..456aba3 100644 --- a/rococoa-core/src/test/java/org/rococoa/RococoaObjectOwnershipTest.java +++ b/rococoa-core/src/test/java/org/rococoa/RococoaObjectOwnershipTest.java @@ -39,53 +39,35 @@ public class RococoaObjectOwnershipTest extends RococoaTestCase { @Test public void directFactoryMethodsReturnsYieldsPooledObject() { // TODO - I've seen this fail with a retain count of 3. I wonder whether // there is some aggressive instance sharing going on with NSDate - check(shouldBeInPool, - new Factory() { - public NSDate create() { - return Rococoa.create("NSDate", NSDate.class, "dateWithTimeIntervalSince1970:", 0.0); - }}); + check(shouldBeInPool, () -> Rococoa.create("NSDate", NSDate.class, "dateWithTimeIntervalSince1970:", NSNumber.CLASS.numberWithInt(0))); } @Disabled("by vavi") @Test public void factoryMethodOnClassYieldsPooledObject() { // TODO - see above - check(shouldBeInPool, - new Factory() { - public NSDate create() { - return NSDate.CLASS.dateWithTimeIntervalSince1970(0.0); - }}); + check(shouldBeInPool, () -> NSDate.CLASS.dateWithTimeIntervalSince1970(0.0)); } @Disabled("by vavi") @Test public void createYieldsNonPooledObject() { - check(shouldNotBeInPool, - new Factory() { - public NSDate create() { - return Rococoa.create("NSDate", NSDate.class); - }}); + check(shouldNotBeInPool, () -> Rococoa.create("NSDate", NSDate.class)); } @Disabled("by vavi") @Test public void newYieldsNonPooledObject() { // calling new on an NSClass results in a NOT autorelease'd object - check(shouldNotBeInPool, - new Factory() { - public NSDate create() { - return Rococoa.create("NSDate", NSDate.class, "new"); - }}); + check(shouldNotBeInPool, () -> Rococoa.create("NSDate", NSDate.class, "new")); } @Test public void allocYieldsNonPooledObject() { // calling alloc on an NSClass results in a NOT autorelease'd object - check(shouldNotBeInPool, - new Factory() { - public NSObject create() { + check(shouldNotBeInPool, () -> { // NSDate.alloc fails as it is an Umbrella class return Rococoa.create("NSObject", NSObject.class, "alloc"); - }}); + }); } - private static interface Factory { + private interface Factory { NSObject create(); } @@ -122,5 +104,4 @@ private void check(boolean expectedAutorelease, Factory factory) { assertRetainCount(expectedFinalRetainCount, alias); } - } diff --git a/rococoa-core/src/test/java/org/rococoa/TestStruct.java b/rococoa-core/src/test/java/org/rococoa/TestStruct.java index c3ddd73..560ae2c 100644 --- a/rococoa-core/src/test/java/org/rococoa/TestStruct.java +++ b/rococoa-core/src/test/java/org/rococoa/TestStruct.java @@ -47,7 +47,6 @@ public ByValue(int anInt, double aDouble) { } } - @Override protected List getFieldOrder() { return Arrays.asList("anInt", "aDouble"); diff --git a/rococoa-core/src/test/java/org/rococoa/internal/ObjCObjectTypeConverterTest.java b/rococoa-core/src/test/java/org/rococoa/internal/ObjCObjectTypeConverterTest.java index 7b446af..9e4d892 100644 --- a/rococoa-core/src/test/java/org/rococoa/internal/ObjCObjectTypeConverterTest.java +++ b/rococoa-core/src/test/java/org/rococoa/internal/ObjCObjectTypeConverterTest.java @@ -39,11 +39,11 @@ @SuppressWarnings({ "nls", "unchecked", "cast" }) public class ObjCObjectTypeConverterTest extends RococoaTestCase { - private static Class primitiveTypeOfID = + private static final Class primitiveTypeOfID = (Class) new ID().nativeType(); @Test public void convertsNSObjectAsArgumentToID() { - ToNativeConverter converter = new ObjCObjectTypeConverter(ObjCObject.class); + ToNativeConverter converter = new ObjCObjectTypeConverter<>(ObjCObject.class); // We treat all NSObject's equally in toNative, see RococoaTypeMapper assertEquals(primitiveTypeOfID, converter.nativeType()); @@ -57,25 +57,25 @@ public class ObjCObjectTypeConverterTest extends RococoaTestCase { @Test public void convertsNullAsArgumentToNull() { // Not entirely sure about this, maybe 0 would be better than null, // but JNA seems to interpret it properly - ToNativeConverter converter = new ObjCObjectTypeConverter(ObjCObject.class); - assertEquals(null, converter.toNative(null, null)); + ToNativeConverter converter = new ObjCObjectTypeConverter<>(ObjCObject.class); + assertNull(converter.toNative(null, null)); } @Test public void convertsReturnedIDToNSObjectSubclass() { - FromNativeConverter converter = new ObjCObjectTypeConverter(NSNumber.class); + FromNativeConverter converter = new ObjCObjectTypeConverter<>(NSNumber.class); // returning is based on declared type, see RococoaTypeMapper NSNumber number = Rococoa.create("NSNumber", NSNumber.class, "numberWithInt:", 45); // We can cope with 64 bits on 64 and 32 - Number nativeValue = new Long(number.id().longValue()); + Number nativeValue = number.id().longValue(); NSNumber converted = (NSNumber) converter.fromNative(nativeValue, null); assertEquals(converted.id(), number.id()); assertEquals(45, converted.intValue()); // We must cope with 32 bits on 32-bit if (NativeLong.SIZE == 4) { - nativeValue = new Integer(number.id().intValue()); + nativeValue = number.id().intValue(); converted = (NSNumber) converter.fromNative(nativeValue, null); assertEquals(45, converted.intValue()); } @@ -83,18 +83,18 @@ public class ObjCObjectTypeConverterTest extends RococoaTestCase { @Test public void convertsReturnedNilToNull() { // Again I'm not sure that this is desirable, but it is what happens. - FromNativeConverter converter = new ObjCObjectTypeConverter(NSNumber.class); - Number nativeValue = new Long(0); + FromNativeConverter converter = new ObjCObjectTypeConverter<>(NSNumber.class); + Number nativeValue = 0L; assertNull(converter.fromNative(nativeValue, null)); } @Test public void returnedNSObjectIsNormallyRetained() { - FromNativeConverter converter = new ObjCObjectTypeConverter(NSNumber.class); + FromNativeConverter converter = new ObjCObjectTypeConverter<>(NSNumber.class); NSNumber number = Rococoa.create("NSNumber", NSNumber.class, "numberWithInt:", 45); assertRetainCount(2, number); // one for the pool, one for Java - NSNumber converted = (NSNumber) converter.fromNative(new Long(number.id().longValue()), null); + NSNumber converted = (NSNumber) converter.fromNative(number.id().longValue(), null); assertRetainCount(3, converted); // now we have another Java alias assertRetainCount(3, number); } @@ -106,6 +106,4 @@ public class ObjCObjectTypeConverterTest extends RococoaTestCase { ID idClass = Foundation.getClass("NSObject"); assertRetainCount(1, Foundation.send(idClass, "alloc", NSObject.class)); // not in the pool, so just one for Java } - - } diff --git a/rococoa-core/src/test/java/org/rococoa/internal/RococoaObjCObjectByReferenceTest.java b/rococoa-core/src/test/java/org/rococoa/internal/RococoaObjCObjectByReferenceTest.java index 10e9d67..fbe875c 100644 --- a/rococoa-core/src/test/java/org/rococoa/internal/RococoaObjCObjectByReferenceTest.java +++ b/rococoa-core/src/test/java/org/rococoa/internal/RococoaObjCObjectByReferenceTest.java @@ -35,9 +35,9 @@ @SuppressWarnings("nls") public class RococoaObjCObjectByReferenceTest extends RococoaTestCase { + private interface TestShunt extends ObjCObject { void testNSNumberByReference_with(ObjCObjectByReference reference, int value); - void testCallbackWithReference(ID delegate); } @@ -67,11 +67,9 @@ public void testDelegate() { NSAutoreleasePool pool = NSAutoreleasePool.new_(); TestShunt shunt = Rococoa.create("TestShunt", TestShunt.class); final CountDownLatch count = new CountDownLatch(1); - final ObjCObject callback = Rococoa.proxy(new TestShuntDelegate() { - public void callback(ObjCObjectByReference reference) { + final ObjCObject callback = Rococoa.proxy((TestShuntDelegate) reference -> { // Success count.countDown(); - } }); final ID delegate = callback.id(); shunt.testCallbackWithReference(delegate); diff --git a/rococoa-core/src/test/java/org/rococoa/internal/StringTypeConverterTest.java b/rococoa-core/src/test/java/org/rococoa/internal/StringTypeConverterTest.java index 995c6db..095a687 100644 --- a/rococoa-core/src/test/java/org/rococoa/internal/StringTypeConverterTest.java +++ b/rococoa-core/src/test/java/org/rococoa/internal/StringTypeConverterTest.java @@ -31,11 +31,10 @@ @SuppressWarnings({ "nls", "unchecked", "cast" }) public class StringTypeConverterTest extends RococoaTestCase { - private static Class primitiveTypeOfID = + private static final Class primitiveTypeOfID = (Class) new NativeLong().nativeType(); - private StringTypeConverter converter = new StringTypeConverter(); - + private final StringTypeConverter converter = new StringTypeConverter(); @Test public void convertsStringAsArgumentToIDofCFString() { assertEquals(primitiveTypeOfID, converter.nativeType()); @@ -48,30 +47,27 @@ public class StringTypeConverterTest extends RococoaTestCase { @Test public void convertsNullAsArgumentToNull() { // Not entirely sure about this, maybe 0 would be better than null, // but JNA seems to interpret it properly - assertEquals(null, converter.toNative(null, null)); + assertNull(converter.toNative(null, null)); } @Test public void convertsReturnedIDToString() { ID helloID = Foundation.cfString("Hello"); // just leaks // We can cope with 64 bits on 64 and 32 - Number nativeValue = new Long(helloID.longValue()); + Number nativeValue = helloID.longValue(); String converted = converter.fromNative(nativeValue, null); assertEquals("Hello", converted); // We must cope with 32 bits on 32-bit if (NativeLong.SIZE == 4) { - nativeValue = new Integer(helloID.intValue()); + nativeValue = helloID.intValue(); converted = converter.fromNative(nativeValue, null); assertEquals("Hello", converted); } } @Test public void convertsReturnedNilToNull() { - Number nativeValue = new Long(0); + Number nativeValue = 0L; assertNull(converter.fromNative(nativeValue, null)); } - - - } diff --git a/rococoa-core/src/test/java/org/rococoa/test/LogFormatter.java b/rococoa-core/src/test/java/org/rococoa/test/LogFormatter.java index 7012542..935a5b9 100644 --- a/rococoa-core/src/test/java/org/rococoa/test/LogFormatter.java +++ b/rococoa-core/src/test/java/org/rococoa/test/LogFormatter.java @@ -69,7 +69,7 @@ public synchronized String format(LogRecord record) PrintWriter pw = new PrintWriter(sw); record.getThrown().printStackTrace(pw); pw.close(); - sb.append(sw.toString()); + sb.append(sw); } catch (Exception ex) { From c84bb93f12972ee84782d0318df38ea922e3297f Mon Sep 17 00:00:00 2001 From: Naohide Sano Date: Wed, 19 Oct 2022 04:37:36 +0900 Subject: [PATCH 10/36] port from cyberduck --- rococoa-core/src/main/native/test.m | 6 +++++ .../rococoa/RococoaObjectOwnershipTest.java | 24 ++++++++++++++----- .../RococoaObjCObjectByReferenceTest.java | 16 ++++++++++++- 3 files changed, 39 insertions(+), 7 deletions(-) diff --git a/rococoa-core/src/main/native/test.m b/rococoa-core/src/main/native/test.m index 480b914..81ecd9b 100644 --- a/rococoa-core/src/main/native/test.m +++ b/rococoa-core/src/main/native/test.m @@ -69,6 +69,12 @@ - (double) testPassStructOfStructByValue: (TestStructOfStruct) s { return s.aStruct.aDouble; } +- (NSNumber*) testNumberFromInt: (int) aValue { + NSLog(@"Received number %i", aValue); + NSNumber* number = [NSNumber numberWithInt: aValue]; + return number; +} + - (void) testNSNumberByReference: (NSNumber**) fillMeIn with: (int) aValue { NSNumber* number = [NSNumber numberWithInt: aValue]; *fillMeIn = number; diff --git a/rococoa-core/src/test/java/org/rococoa/RococoaObjectOwnershipTest.java b/rococoa-core/src/test/java/org/rococoa/RococoaObjectOwnershipTest.java index 456aba3..d25dfcf 100644 --- a/rococoa-core/src/test/java/org/rococoa/RococoaObjectOwnershipTest.java +++ b/rococoa-core/src/test/java/org/rococoa/RococoaObjectOwnershipTest.java @@ -25,8 +25,10 @@ import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; +import org.rococoa.cocoa.foundation.NSArray; import org.rococoa.cocoa.foundation.NSAutoreleasePool; import org.rococoa.cocoa.foundation.NSDate; +import org.rococoa.cocoa.foundation.NSNumber; import org.rococoa.cocoa.foundation.NSObject; import org.rococoa.test.RococoaTestCase; @@ -34,17 +36,27 @@ public class RococoaObjectOwnershipTest extends RococoaTestCase { public static boolean shouldBeInPool = true; public static boolean shouldNotBeInPool = false; - + + @Test + public void directFactoryMethodsReturnsYieldsPooledObject2() { + check(shouldBeInPool, () -> Rococoa.create("NSArray", NSArray.class, "arrayWithObjects:", NSNumber.CLASS.numberWithInt(0))); + } + + @Test + public void factoryMethodOnClassYieldsPooledObject2() { + check(shouldBeInPool, () -> NSArray.CLASS.arrayWithObjects(NSNumber.CLASS.numberWithInt(0))); + } + @Disabled("by vavi because of error") @Test public void directFactoryMethodsReturnsYieldsPooledObject() { - // TODO - I've seen this fail with a retain count of 3. I wonder whether - // there is some aggressive instance sharing going on with NSDate + // TODO - I've seen this fail with a retain count of 3. I wonder whether + // there is some aggressive instance sharing going on with NSDate check(shouldBeInPool, () -> Rococoa.create("NSDate", NSDate.class, "dateWithTimeIntervalSince1970:", NSNumber.CLASS.numberWithInt(0))); } @Disabled("by vavi") @Test public void factoryMethodOnClassYieldsPooledObject() { - // TODO - see above + // TODO - see above check(shouldBeInPool, () -> NSDate.CLASS.dateWithTimeIntervalSince1970(0.0)); } @@ -62,8 +74,8 @@ public class RococoaObjectOwnershipTest extends RococoaTestCase { @Test public void allocYieldsNonPooledObject() { // calling alloc on an NSClass results in a NOT autorelease'd object check(shouldNotBeInPool, () -> { - // NSDate.alloc fails as it is an Umbrella class - return Rococoa.create("NSObject", NSObject.class, "alloc"); + // NSDate.alloc fails as it is an Umbrella class + return Rococoa.create("NSObject", NSObject.class, "alloc"); }); } diff --git a/rococoa-core/src/test/java/org/rococoa/internal/RococoaObjCObjectByReferenceTest.java b/rococoa-core/src/test/java/org/rococoa/internal/RococoaObjCObjectByReferenceTest.java index fbe875c..19bae67 100644 --- a/rococoa-core/src/test/java/org/rococoa/internal/RococoaObjCObjectByReferenceTest.java +++ b/rococoa-core/src/test/java/org/rococoa/internal/RococoaObjCObjectByReferenceTest.java @@ -37,12 +37,26 @@ public class RococoaObjCObjectByReferenceTest extends RococoaTestCase { private interface TestShunt extends ObjCObject { + NSNumber testNumberFromInt(int value); void testNSNumberByReference_with(ObjCObjectByReference reference, int value); void testCallbackWithReference(ID delegate); } private interface TestShuntDelegate { - public void callback(ObjCObjectByReference reference); + void callback(ID reference); + } + + @Test + public void testArgumentInt() { + TestShunt shunt = Rococoa.create("TestShunt", TestShunt.class); + NSNumber value = shunt.testNumberFromInt(42); + assertEquals(42, value.intValue()); + } + + @Test + public void testNSNumberFromInt() { + NSNumber nsNumber = NSNumber.CLASS.numberWithInt(42); + assertEquals(42, nsNumber.intValue()); } @Disabled("by vavi") From 7ab8826e8ab46fe2e0c6493ac31d75ed269c0314 Mon Sep 17 00:00:00 2001 From: Naohide Sano Date: Wed, 19 Oct 2022 04:39:38 +0900 Subject: [PATCH 11/36] enable working test case - maybe because of bellows - jna update - jdk update - os update --- .../FoundationMemoryAssumptionsTest.java | 3 ++- .../rococoa/NSAutoreleasePoolThreadTest.java | 23 ++++++++----------- .../internal/ObjCObjectTypeConverterTest.java | 3 ++- .../RococoaObjCObjectByReferenceTest.java | 5 ++-- 4 files changed, 16 insertions(+), 18 deletions(-) diff --git a/rococoa-core/src/test/java/org/rococoa/FoundationMemoryAssumptionsTest.java b/rococoa-core/src/test/java/org/rococoa/FoundationMemoryAssumptionsTest.java index e660a37..275449a 100644 --- a/rococoa-core/src/test/java/org/rococoa/FoundationMemoryAssumptionsTest.java +++ b/rococoa-core/src/test/java/org/rococoa/FoundationMemoryAssumptionsTest.java @@ -36,7 +36,6 @@ * * @author duncan */ -@Disabled("by vavi because of crash") public class FoundationMemoryAssumptionsTest { @Test @@ -85,6 +84,7 @@ public void testAutoreleasePool() { Foundation.cfRelease(idNSObject); } + @Disabled("by vavi because of crash") @Test public void testAutoreleaseFactoryMethod() { ID idPool = Foundation.sendReturnsID(Foundation.getClass("NSAutoreleasePool"), "new"); @@ -126,6 +126,7 @@ public void zombies() { Foundation.cfRelease(idNSObject); // crash, but with stderr logging } + @Disabled("by vavi because of crash") @Test public void nSStringSpecialCases() { ID idEmptyNSString = Foundation.sendReturnsID(Foundation.getClass("NSString"), "alloc"); diff --git a/rococoa-core/src/test/java/org/rococoa/NSAutoreleasePoolThreadTest.java b/rococoa-core/src/test/java/org/rococoa/NSAutoreleasePoolThreadTest.java index 694cc2a..b99ba4a 100644 --- a/rococoa-core/src/test/java/org/rococoa/NSAutoreleasePoolThreadTest.java +++ b/rococoa-core/src/test/java/org/rococoa/NSAutoreleasePoolThreadTest.java @@ -19,7 +19,6 @@ package org.rococoa; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.rococoa.cocoa.foundation.NSAutoreleasePool; import org.rococoa.test.RococoaTestCase; @@ -51,8 +50,8 @@ public class NSAutoreleasePoolThreadTest { @Test public void garbageCollectDrainedPool() throws InterruptedException { Thread thread = new Thread(null, () -> { - NSAutoreleasePool pool = NSAutoreleasePool.new_(); - pool.drain(); + NSAutoreleasePool pool = NSAutoreleasePool.new_(); + pool.drain(); }, "test"); thread.start(); thread.join(); @@ -79,28 +78,26 @@ public void drainPoolAndFinalizeOnAnotherThread() throws InterruptedException { RococoaTestCase.gc(); } - @Disabled("crashes") @Test public void cantDrainPoolCreatedOnAFinishedThread() throws InterruptedException { final NSAutoreleasePool[] poolHolder = new NSAutoreleasePool[1]; Thread thread = new Thread(null, () -> { - poolHolder[0] = NSAutoreleasePool.new_(); + poolHolder[0] = NSAutoreleasePool.new_(); }, "test"); thread.start(); thread.join(); poolHolder[0].drain(); } - @Disabled("crashes") @Test public void drainPoolCreatedOnANotFinishedThread() throws InterruptedException { final NSAutoreleasePool[] poolHolder = new NSAutoreleasePool[1]; final CyclicBarrier beforeDrain = new CyclicBarrier(2); final CyclicBarrier afterDrain = new CyclicBarrier(2); Thread thread = new Thread(null, () -> { - poolHolder[0] = NSAutoreleasePool.new_(); - await(beforeDrain); - await(afterDrain); + poolHolder[0] = NSAutoreleasePool.new_(); + await(beforeDrain); + await(afterDrain); }, "test"); thread.start(); await(beforeDrain); @@ -115,10 +112,10 @@ public void drainAlreadyDrainedPoolCreatedOnANotFinishedThread() throws Interrup final CyclicBarrier beforeDrain = new CyclicBarrier(2); final CyclicBarrier afterDrain = new CyclicBarrier(2); Thread thread = new Thread(null, () -> { - poolHolder[0] = NSAutoreleasePool.new_(); - poolHolder[0].drain(); - await(beforeDrain); - await(afterDrain); + poolHolder[0] = NSAutoreleasePool.new_(); + poolHolder[0].drain(); + await(beforeDrain); + await(afterDrain); }, "test"); thread.start(); await(beforeDrain); diff --git a/rococoa-core/src/test/java/org/rococoa/internal/ObjCObjectTypeConverterTest.java b/rococoa-core/src/test/java/org/rococoa/internal/ObjCObjectTypeConverterTest.java index 9e4d892..153c23d 100644 --- a/rococoa-core/src/test/java/org/rococoa/internal/ObjCObjectTypeConverterTest.java +++ b/rococoa-core/src/test/java/org/rococoa/internal/ObjCObjectTypeConverterTest.java @@ -35,7 +35,6 @@ import com.sun.jna.NativeLong; import com.sun.jna.ToNativeConverter; -@Disabled("by vavi because of error") @SuppressWarnings({ "nls", "unchecked", "cast" }) public class ObjCObjectTypeConverterTest extends RococoaTestCase { @@ -61,6 +60,7 @@ public class ObjCObjectTypeConverterTest extends RococoaTestCase { assertNull(converter.toNative(null, null)); } + @Disabled("by vavi because of error") @Test public void convertsReturnedIDToNSObjectSubclass() { FromNativeConverter converter = new ObjCObjectTypeConverter<>(NSNumber.class); // returning is based on declared type, see RococoaTypeMapper @@ -88,6 +88,7 @@ public class ObjCObjectTypeConverterTest extends RococoaTestCase { assertNull(converter.fromNative(nativeValue, null)); } + @Disabled("by vavi because of error") @Test public void returnedNSObjectIsNormallyRetained() { FromNativeConverter converter = new ObjCObjectTypeConverter<>(NSNumber.class); diff --git a/rococoa-core/src/test/java/org/rococoa/internal/RococoaObjCObjectByReferenceTest.java b/rococoa-core/src/test/java/org/rococoa/internal/RococoaObjCObjectByReferenceTest.java index 19bae67..9b860c7 100644 --- a/rococoa-core/src/test/java/org/rococoa/internal/RococoaObjCObjectByReferenceTest.java +++ b/rococoa-core/src/test/java/org/rococoa/internal/RococoaObjCObjectByReferenceTest.java @@ -75,15 +75,14 @@ public void testArgument() { assertEquals(2, value.retainCount()); } - @Disabled("by vavi") @Test public void testDelegate() { NSAutoreleasePool pool = NSAutoreleasePool.new_(); TestShunt shunt = Rococoa.create("TestShunt", TestShunt.class); final CountDownLatch count = new CountDownLatch(1); final ObjCObject callback = Rococoa.proxy((TestShuntDelegate) reference -> { - // Success - count.countDown(); + // Success + count.countDown(); }); final ID delegate = callback.id(); shunt.testCallbackWithReference(delegate); From 9893912560237c1f92b2037f65dd2bf35d72db7e Mon Sep 17 00:00:00 2001 From: Naohide Sano Date: Thu, 20 Oct 2022 18:18:13 +0900 Subject: [PATCH 12/36] adapt 3byte rgb --- .../rococoa/cocoa/coregraphics/CGImage.java | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/coregraphics/CGImage.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/coregraphics/CGImage.java index c4a0bdd..03b6e47 100644 --- a/rococoa-contrib/src/main/java/org/rococoa/cocoa/coregraphics/CGImage.java +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/coregraphics/CGImage.java @@ -112,19 +112,24 @@ public BufferedImage toBufferedImage() { Pointer buffer = library.CFDataGetBytePtr(data); byte[] src = buffer.getByteArray(0, stride * height); - BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_4BYTE_ABGR); + int cNum = bits / cBits; + BufferedImage bi; + if (cNum == 4) { + bi = new BufferedImage(width, height, BufferedImage.TYPE_4BYTE_ABGR); + } else { + bi = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR); + } byte[] dst = ((DataBufferByte) bi.getRaster().getDataBuffer()).getData(); int dP = 0; for (int y = 0; y < height; y++) { int sP = y * stride; for (int x = 0; x < width; x++) { - dst[dP + 0] = src[sP + 3]; // a - dst[dP + 1] = src[sP + 2]; // b - dst[dP + 2] = src[sP + 1]; // g - dst[dP + 3] = src[sP + 0]; // r - sP += 4; - dP += 4; + for (int i = 0; i < cNum; i++) { + dst[dP + i] = src[sP + (cNum - 1 - i)]; + } + dP += cNum; + sP += cNum; } } From 0b09d0000cc4cbd43cf42a5c60245ac8f2a7e8cb Mon Sep 17 00:00:00 2001 From: Naohide Sano Date: Thu, 20 Oct 2022 21:23:15 +0900 Subject: [PATCH 13/36] try to fix float problem but failed --- rococoa-core/src/main/doc/release-notes.txt | 4 +- .../src/main/java/org/rococoa/Foundation.java | 11 ++- .../src/main/java/org/rococoa/Rococoa.java | 2 +- .../rococoa/cocoa/foundation/NSNumber.java | 27 ++++++-- .../org/rococoa/internal/BoolConverter.java | 4 +- .../org/rococoa/internal/FloatConverter.java | 67 +++++++++++++++++++ .../rococoa/internal/FoundationLibrary.java | 3 +- .../org/rococoa/internal/MainThreadUtils.java | 35 ++++------ .../internal/OCInvocationCallbacks.java | 15 ++--- .../org/rococoa/internal/RococoaLibrary.java | 15 ++++- .../rococoa/internal/RococoaTypeMapper.java | 6 +- .../org/rococoa/internal/VarArgsUnpacker.java | 15 ++--- rococoa-core/src/main/native/scratch.m | 4 +- rococoa-core/src/main/native/test.m | 25 +++++++ .../FoundationStructureReturnTest.java | 39 +++++++++++ .../test/java/org/rococoa/FoundationTest.java | 66 +++++++++++++----- .../test/java/org/rococoa/JavaProxyTest.java | 9 ++- .../test/java/org/rococoa/NSClassTest.java | 6 +- .../org/rococoa/RococoaAbstractClassTest.java | 12 ++-- .../org/rococoa/RococoaMainThreadTest.java | 6 +- .../test/java/org/rococoa/RococoaTest.java | 2 +- .../org/rococoa/StructsInObjectsTest.java | 3 +- .../src/test/java/org/rococoa/TestStruct.java | 4 ++ .../java/org/rococoa/TestStructOfStruct.java | 4 ++ .../org/rococoa/test/RococoaTestCase.java | 7 +- .../test/resources/test-logging.properties | 15 +++-- 26 files changed, 288 insertions(+), 118 deletions(-) create mode 100644 rococoa-core/src/main/java/org/rococoa/internal/FloatConverter.java diff --git a/rococoa-core/src/main/doc/release-notes.txt b/rococoa-core/src/main/doc/release-notes.txt index cd0376a..d35bcca 100644 --- a/rococoa-core/src/main/doc/release-notes.txt +++ b/rococoa-core/src/main/doc/release-notes.txt @@ -13,7 +13,7 @@ Change History thanks to Paul Loy for fixes and discussions, and Andy Thompson for NSInteger et al We should now correctly l small structs as return values, not just NSSize! Improved NSDictionary - Support for JNA-3.0.4 + Support for JNA-3.0.4 0.2.0 Much more rigorous memory management. @@ -33,7 +33,7 @@ Change History 0.1.3 Now ship a Universal Binary dylib - + 0.1.2 Added LGPL licence files and these release notes. diff --git a/rococoa-core/src/main/java/org/rococoa/Foundation.java b/rococoa-core/src/main/java/org/rococoa/Foundation.java index 5cfb588..00996ae 100644 --- a/rococoa-core/src/main/java/org/rococoa/Foundation.java +++ b/rococoa-core/src/main/java/org/rococoa/Foundation.java @@ -19,12 +19,15 @@ package org.rococoa; -import java.io.UnsupportedEncodingException; import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; import java.util.concurrent.Callable; +import java.util.logging.Level; +import java.util.logging.Logger; +import com.sun.jna.Library; +import com.sun.jna.Native; import org.rococoa.cocoa.CFIndex; import org.rococoa.cocoa.CFRange; import org.rococoa.internal.FoundationLibrary; @@ -35,12 +38,6 @@ import org.rococoa.internal.RococoaLibrary; import org.rococoa.internal.VarArgsUnpacker; -import java.util.logging.Level; -import java.util.logging.Logger; - -import com.sun.jna.Library; -import com.sun.jna.Native; - /** * The core of Rococoa - statics to handle selectors and messaging at a function call level. diff --git a/rococoa-core/src/main/java/org/rococoa/Rococoa.java b/rococoa-core/src/main/java/org/rococoa/Rococoa.java index b8a6384..84ef2df 100644 --- a/rococoa-core/src/main/java/org/rococoa/Rococoa.java +++ b/rococoa-core/src/main/java/org/rococoa/Rococoa.java @@ -80,7 +80,7 @@ private static T create(String ocClassName, Class java Object... args) { if (logging.isLoggable(Level.FINEST)) { logging.finest(String.format("creating [%s (%s)].%s(%s)", - new Object[]{ocClassName, javaClass.getName(), ocFactoryName, new VarArgsUnpacker(args)})); + ocClassName, javaClass.getName(), ocFactoryName, new VarArgsUnpacker(args))); } ID ocClass = Foundation.getClass(ocClassName); ID ocInstance = Foundation.send(ocClass, ocFactoryName, ID.class, args); diff --git a/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSNumber.java b/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSNumber.java index c8ecbf4..127157e 100644 --- a/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSNumber.java +++ b/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSNumber.java @@ -26,11 +26,11 @@ public abstract class NSNumber extends NSObject { public static final _Class CLASS = Rococoa.createClass("NSNumber", _Class.class); public interface _Class extends ObjCClass { - public NSNumber numberWithBool(boolean value); - public NSNumber numberWithInt(int value); - public NSNumber numberWithDouble(double e); - public NSNumber numberWithLong(long value); - public NSNumber numberWithFloat(float value); + NSNumber numberWithBool(boolean value); + NSNumber numberWithInt(int value); + NSNumber numberWithDouble(double e); + NSNumber numberWithLong(long value); + NSNumber numberWithFloat(float value); // TODO } public static NSNumber numberWithInt(int value) { @@ -43,7 +43,7 @@ public static NSNumber of(double value) { return CLASS.numberWithDouble(value); } public static NSNumber of(float value) { - return CLASS.numberWithFloat(value); + return CLASS.numberWithFloat(value); // TODO } public static NSNumber of(long value) { return CLASS.numberWithLong(value); @@ -52,7 +52,20 @@ public static NSNumber of(long value) { public abstract short shortValue(); public abstract int intValue(); public abstract long longValue(); - public abstract float floatValue(); + public abstract float floatValue(); // TODO public abstract double doubleValue(); public abstract int compare(NSNumber another); + + public abstract String stringValue(); + + public abstract String objCType(); + +// public float floatValue() { +// return (float) doubleValue(); +// } + + @Override + public String toString() { + return stringValue(); + } } \ No newline at end of file diff --git a/rococoa-core/src/main/java/org/rococoa/internal/BoolConverter.java b/rococoa-core/src/main/java/org/rococoa/internal/BoolConverter.java index e8c73d4..a8bc9df 100644 --- a/rococoa-core/src/main/java/org/rococoa/internal/BoolConverter.java +++ b/rococoa-core/src/main/java/org/rococoa/internal/BoolConverter.java @@ -37,11 +37,11 @@ */ public class BoolConverter implements ToNativeConverter, FromNativeConverter { - public Object toNative(final Object value, final ToNativeContext context) { + public Object toNative(Object value, ToNativeContext context) { return ((Boolean) value) ? 1 : 0; } - public Object fromNative(final Object value, final FromNativeContext context) { + public Object fromNative(Object value, FromNativeContext context) { return ((Byte) value).intValue() == 1; } diff --git a/rococoa-core/src/main/java/org/rococoa/internal/FloatConverter.java b/rococoa-core/src/main/java/org/rococoa/internal/FloatConverter.java new file mode 100644 index 0000000..2f5f0fd --- /dev/null +++ b/rococoa-core/src/main/java/org/rococoa/internal/FloatConverter.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2022 by Naohide Sano, All rights reserved. + * + * Programmed by Naohide Sano + */ + +package org.rococoa.internal; + +import java.util.logging.Logger; + +import com.sun.jna.FromNativeContext; +import com.sun.jna.FromNativeConverter; +import com.sun.jna.ToNativeContext; +import com.sun.jna.ToNativeConverter; +import org.rococoa.cocoa.CGFloat; + + +/** + * Converts {@code java.lang.Float} to native by mapping to {@code org.rococa.cocoa.foundation.CGFloat} as defined by: + * + * #define CGFloat Native.Long + * + * + * @author Harald Kuhr + * @author last modified by $Author: haraldk$ + * @version $Id: BoolConverter.java,v 1.0 Feb 19, 2010 8:44:39 PM haraldk Exp$ + */ +public class FloatConverter implements ToNativeConverter, FromNativeConverter { + + private static final Logger logger = Logger.getLogger(FloatConverter.class.getName()); + + public Object toNative(Object value, ToNativeContext context) { +logger.info("toNative: " + value + ", " + context); + switch (CGFloat.SIZE) { + case 4: + return value; + case 8: +logger.info("toNative: " + value + " -> " + ((double) value)); + return (double) value; + default: + throw new Error("Unknown Native.LONG_SIZE: " + CGFloat.SIZE); + } + } + + public Object fromNative(Object value, FromNativeContext context) { + switch (CGFloat.SIZE) { + case 4: + return value; + case 8: +logger.info("fromNative: " + value + " -> " + ((Double) value).floatValue()); + return ((Double) value).floatValue(); + default: + throw new Error("Unknown Native.LONG_SIZE: " + CGFloat.SIZE); + } + } + + public Class nativeType() { + switch (CGFloat.SIZE) { + case 4: + return float.class; + case 8: + return double.class; + default: + throw new Error("Unknown Native.LONG_SIZE: " + CGFloat.SIZE); + } + } +} diff --git a/rococoa-core/src/main/java/org/rococoa/internal/FoundationLibrary.java b/rococoa-core/src/main/java/org/rococoa/internal/FoundationLibrary.java index 9e9fe97..cc594ed 100644 --- a/rococoa-core/src/main/java/org/rococoa/internal/FoundationLibrary.java +++ b/rococoa-core/src/main/java/org/rococoa/internal/FoundationLibrary.java @@ -20,13 +20,12 @@ package org.rococoa.internal; +import com.sun.jna.Library; import org.rococoa.ID; import org.rococoa.Selector; import org.rococoa.cocoa.CFIndex; import org.rococoa.cocoa.CFRange; -import com.sun.jna.Library; - /** * JNA Library for plain C calls, standard JNA marshalling applies to these */ diff --git a/rococoa-core/src/main/java/org/rococoa/internal/MainThreadUtils.java b/rococoa-core/src/main/java/org/rococoa/internal/MainThreadUtils.java index 984d988..069ab82 100644 --- a/rococoa-core/src/main/java/org/rococoa/internal/MainThreadUtils.java +++ b/rococoa-core/src/main/java/org/rococoa/internal/MainThreadUtils.java @@ -35,20 +35,15 @@ * Exists just to tidy up Foundation. * * @author duncan - * */ public abstract class MainThreadUtils { - private static Logger logging = Logger.getLogger("org.rococoa.foundation"); + + private static final Logger logging = Logger.getLogger("org.rococoa.foundation"); private static final ID idNSThreadClass = Foundation.getClass("NSThread"); private static final Selector isMainThreadSelector = Foundation.selector("isMainThread"); - private static final ThreadLocal isMainThreadThreadLocal = new ThreadLocal() { - @Override - protected Boolean initialValue() { - return nsThreadSaysIsMainThread(); - } - }; + private static final ThreadLocal isMainThreadThreadLocal = ThreadLocal.withInitial(MainThreadUtils::nsThreadSaysIsMainThread); private MainThreadUtils() { // @@ -61,17 +56,16 @@ private MainThreadUtils() { * Return the result of calling callable on the main Cococoa thread. */ @SuppressWarnings("unchecked") - public static T callOnMainThread(RococoaLibrary rococoaLibrary, final Callable callable) { + public static T callOnMainThread(RococoaLibrary rococoaLibrary, Callable callable) { final Object[] result = new Object[1]; final Throwable[] thrown = new Throwable[1]; - RococoaLibrary.VoidCallback callback = new RococoaLibrary.VoidCallback() { - public void callback() { - try { - result[0] = callable.call(); - } catch (Throwable t) { - thrown[0] = t; - } - }}; + RococoaLibrary.VoidCallback callback = () -> { + try { + result[0] = callable.call(); + } catch (Throwable t) { + thrown[0] = t; + } + }; rococoaLibrary.callOnMainThread(callback, true); rethrow(thrown[0]); @@ -83,8 +77,8 @@ public void callback() { * @param waitUntilDone A Boolean that specifies whether the current thread blocks until after * the specified selector is performed on the receiver on the main thread. */ - public static void runOnMainThread(RococoaLibrary rococoaLibrary, final Runnable runnable, final boolean waitUntilDone) { - final Throwable[] thrown = new Throwable[1]; + public static void runOnMainThread(RococoaLibrary rococoaLibrary, Runnable runnable, boolean waitUntilDone) { + Throwable[] thrown = new Throwable[1]; RococoaLibrary.VoidCallback callback = new RococoaLibrary.VoidCallback() { public void callback() { try { @@ -92,8 +86,7 @@ public void callback() { } catch (Throwable t) { if (waitUntilDone) { thrown[0] = t; - } - else { + } else { logging.log(Level.SEVERE, "Lost exception on main thread", t); } } finally { diff --git a/rococoa-core/src/main/java/org/rococoa/internal/OCInvocationCallbacks.java b/rococoa-core/src/main/java/org/rococoa/internal/OCInvocationCallbacks.java index 341fa0a..f9f6142 100644 --- a/rococoa-core/src/main/java/org/rococoa/internal/OCInvocationCallbacks.java +++ b/rococoa-core/src/main/java/org/rococoa/internal/OCInvocationCallbacks.java @@ -62,14 +62,12 @@ public class OCInvocationCallbacks { * @see "http://www.cocoadev.com/index.pl?NSMethodSignature" */ public final RococoaLibrary.MethodSignatureCallback methodSignatureCallback = - new RococoaLibrary.MethodSignatureCallback() { - public String callback(String selectorName) { + selectorName -> { if (logging.isLoggable(Level.FINEST)) { logging.finest(String.format("callback wanting methodSignature for selector %s", selectorName)); } return methodSignatureForSelector(selectorName); - } - }; + }; /** * Called when method has been invoked on OC proxy and needs to be forwarded to javaObject @@ -106,11 +104,8 @@ protected Method methodForSelector(String selectorName) { Method[] methods = javaObject.getClass().getMethods(); for (Method method : methods) { if (method.getName().equals(methodName) && method.getParameterTypes().length == parameterCount) { - boolean match = true; - if(null == stringForType(method.getReturnType())) { - match = false; - } - if(match) { + boolean match = null != stringForType(method.getReturnType()); + if (match) { for (Class parameterType : method.getParameterTypes()) { if(null == stringForType(parameterType)) { match = false; @@ -118,7 +113,7 @@ protected Method methodForSelector(String selectorName) { } } } - if(match) { + if (match) { return method; } } diff --git a/rococoa-core/src/main/java/org/rococoa/internal/RococoaLibrary.java b/rococoa-core/src/main/java/org/rococoa/internal/RococoaLibrary.java index d627335..0bf30b0 100644 --- a/rococoa-core/src/main/java/org/rococoa/internal/RococoaLibrary.java +++ b/rococoa-core/src/main/java/org/rococoa/internal/RococoaLibrary.java @@ -33,14 +33,14 @@ public interface RococoaLibrary extends Library { /** * Callback from Obj-C to get method signature string for Java method matching selectorName */ - public interface MethodSignatureCallback extends Callback { + interface MethodSignatureCallback extends Callback { String callback(String selectorName); } /** * Callback from Obj-C to invoke method on Java object */ - public interface SelectorInvokedCallback extends Callback { + interface SelectorInvokedCallback extends Callback { void callback(String selectorName, ID nsInvocation); } @@ -54,7 +54,7 @@ ID proxyForJavaObject(SelectorInvokedCallback selectorInvokedCallback, /** * Generic callback from Obj-C */ - public interface VoidCallback extends Callback { + interface VoidCallback extends Callback { void callback(); } @@ -62,4 +62,13 @@ public interface VoidCallback extends Callback { * Call callback on the main Cococa event thread */ void callOnMainThread(RococoaLibrary.VoidCallback callback, boolean waitUntilDone); + + /** for block */ + long createObjCBlockWithFunctionPointer(long fptr); + + /** for block */ + long getObjCBlockFunctionPointer(long blockPtr); + + /** for block */ + void releaseObjCBlock(long blockPtr); } \ No newline at end of file diff --git a/rococoa-core/src/main/java/org/rococoa/internal/RococoaTypeMapper.java b/rococoa-core/src/main/java/org/rococoa/internal/RococoaTypeMapper.java index 2e549c8..f0559f3 100644 --- a/rococoa-core/src/main/java/org/rococoa/internal/RococoaTypeMapper.java +++ b/rococoa-core/src/main/java/org/rococoa/internal/RococoaTypeMapper.java @@ -19,6 +19,7 @@ package org.rococoa.internal; +import net.sf.cglib.core.Converter; import org.rococoa.ObjCObject; import org.rococoa.cocoa.foundation.NSObject; @@ -40,12 +41,12 @@ * and objects and native values. * * @author duncan - * */ public class RococoaTypeMapper extends DefaultTypeMapper { public RococoaTypeMapper() { addToNativeConverter(ObjCObject.class, new ObjCObjectTypeConverter<>(ObjCObject.class)); +// addToNativeConverter(Float.class, new FloatConverter()); // TODO doesn't work addToNativeConverter(Boolean.class, new BoolConverter()); addFromNativeConverter(Boolean.class, new BoolConverter()); addTypeConverter(String.class, new StringTypeConverter()); @@ -53,7 +54,7 @@ public RococoaTypeMapper() { // not actually used at present because NSObjectInvocationHandler does marshalling } - @SuppressWarnings("unchecked") + @SuppressWarnings({"unchecked", "rawtypes"}) @Override public FromNativeConverter getFromNativeConverter(Class javaType) { if (ObjCObject.class.isAssignableFrom(javaType)) { // return a new converter that knows the subtype it is going to create @@ -61,5 +62,4 @@ public RococoaTypeMapper() { } return super.getFromNativeConverter(javaType); } - } diff --git a/rococoa-core/src/main/java/org/rococoa/internal/VarArgsUnpacker.java b/rococoa-core/src/main/java/org/rococoa/internal/VarArgsUnpacker.java index 9b0a9cc..ac94fa9 100644 --- a/rococoa-core/src/main/java/org/rococoa/internal/VarArgsUnpacker.java +++ b/rococoa-core/src/main/java/org/rococoa/internal/VarArgsUnpacker.java @@ -19,6 +19,10 @@ package org.rococoa.internal; +import java.util.Arrays; +import java.util.stream.Collectors; + + @SuppressWarnings("nls") public class VarArgsUnpacker { @@ -33,14 +37,7 @@ public VarArgsUnpacker(Object... args) { @Override public String toString() { - StringBuilder result = new StringBuilder(); - for (int i = 0; i < args.length; i++) { - result.append(String.valueOf(args[i])).append(SEPERATOR); - } - if (result.length() > 0) { - result.setLength(result.length() - SEPERATOR.length()); - } - return result.toString(); +// return Arrays.stream(args).map(String::valueOf).collect(Collectors.joining(SEPERATOR)); + return Arrays.stream(args).map(o -> o == null ? "null" : o + ":" + o.getClass().getSimpleName()).collect(Collectors.joining(SEPERATOR)); } - } diff --git a/rococoa-core/src/main/native/scratch.m b/rococoa-core/src/main/native/scratch.m index bb347e7..94ab1f4 100644 --- a/rococoa-core/src/main/native/scratch.m +++ b/rococoa-core/src/main/native/scratch.m @@ -4,9 +4,9 @@ #import int main (int argc, const char * argv[]) { - + NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; - + QTMovie* movie = [QTMovie movieWithFile: @"DrWho.mov" error: nil]; NSLog(@"Hello %@", QTMovieTimeDidChangeNotification); diff --git a/rococoa-core/src/main/native/test.m b/rococoa-core/src/main/native/test.m index 81ecd9b..66c010f 100644 --- a/rococoa-core/src/main/native/test.m +++ b/rococoa-core/src/main/native/test.m @@ -99,4 +99,29 @@ - (bool) isMainThread { return pthread_main_np(); } +- (float) testPassFloatByValue { + float f = 3.14; + return f; +} + +union floatint +{ + float f; + int i; +}; + +- (int) testConvertFloatToInt: (float) f { + union floatint fi; + fi.f = f; +fprintf(stderr, "%d\n", fi.i); +fflush(stderr); + return fi.i; +} + +- (BOOL) testGetFloatByValue: (float) f { +fprintf(stderr, "%3.1f\n", f); +fflush(stderr); + return f == 3.14; +} + @end diff --git a/rococoa-core/src/test/java/org/rococoa/FoundationStructureReturnTest.java b/rococoa-core/src/test/java/org/rococoa/FoundationStructureReturnTest.java index 24f266c..bd6772a 100644 --- a/rococoa-core/src/test/java/org/rococoa/FoundationStructureReturnTest.java +++ b/rococoa-core/src/test/java/org/rococoa/FoundationStructureReturnTest.java @@ -21,11 +21,15 @@ import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.rococoa.test.RococoaTestCase; import com.sun.jna.Library; import com.sun.jna.Native; +import vavi.util.Debug; +import vavi.util.StringUtil; + @SuppressWarnings("nls") public class FoundationStructureReturnTest extends RococoaTestCase { @@ -95,4 +99,39 @@ private interface StructLibrary extends Library { double.class, args); assertEquals(Math.E, result2, 0); } + + @Test + @Disabled("float: fromNative is ok") + void test1() throws Exception { + ID testID = Foundation.sendReturnsID(Foundation.getClass("TestShunt"), "new"); + Foundation.sendReturnsID(testID, "autorelease"); + float result = Foundation.send(testID, + Foundation.selector("testPassFloatByValue"), + float.class); + assertEquals(3.14f, result, 0.01); + } + + @Test + @Disabled("float: toNative is NG") + void test3() throws Exception { + ID testID = Foundation.sendReturnsID(Foundation.getClass("TestShunt"), "new"); + Foundation.sendReturnsID(testID, "autorelease"); + int result = Foundation.send(testID, + Foundation.selector("testConvertFloatToInt:"), + int.class, 3.14d); +Debug.printf("%08x, %s", Float.floatToIntBits(3.14f), StringUtil.toBits(Float.floatToIntBits(3.14f), 32)); +Debug.printf("%08x, %s", result, StringUtil.toBits(result, 32)); + assertEquals(Float.floatToIntBits(3.14f), result); + } + + @Test + @Disabled("float: toNative is NG") + void test2() throws Exception { + ID testID = Foundation.sendReturnsID(Foundation.getClass("TestShunt"), "new"); + Foundation.sendReturnsID(testID, "autorelease"); + boolean result = Foundation.send(testID, + Foundation.selector("testGetFloatByValue:"), + boolean.class, 3.14f); + assertTrue(result); + } } diff --git a/rococoa-core/src/test/java/org/rococoa/FoundationTest.java b/rococoa-core/src/test/java/org/rococoa/FoundationTest.java index 30f88cd..f88f6b7 100644 --- a/rococoa-core/src/test/java/org/rococoa/FoundationTest.java +++ b/rococoa-core/src/test/java/org/rococoa/FoundationTest.java @@ -19,21 +19,34 @@ package org.rococoa; -import static org.junit.jupiter.api.Assertions.*; +import java.util.logging.Logger; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; +import org.rococoa.cocoa.CGFloat; +import org.rococoa.cocoa.foundation.NSNumber; import org.rococoa.test.RococoaTestCase; +import vavi.util.Debug; +import vavi.util.StringUtil; -public class FoundationTest extends RococoaTestCase { +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; - @Test public void testCFString() { +class FoundationTest extends RococoaTestCase { + + private static final Logger logger = Logger.getLogger(RococoaTestCase.class.getName()); + + @Test void testCFString() { ID string = Foundation.cfString("Hello World"); assertNotNull(string); assertEquals("Hello World", Foundation.toString(string)); } - @Test public void testCFStringWithDifferentEncoding() throws Exception { + @Test void testCFStringWithDifferentEncoding() throws Exception { String stringWithOddChar = "Hello \u2648"; // Aries ID string = Foundation.cfString(stringWithOddChar); assertEquals(stringWithOddChar, Foundation.toString(string)); @@ -41,7 +54,7 @@ public class FoundationTest extends RococoaTestCase { @SuppressWarnings("unused") @Disabled("slow") - @Test public void testStringPerformance() { + @Test void testStringPerformance() { String stringWithOddChar = "Hello \u2648"; StringBuilder longStringBuilder = new StringBuilder(); for (int i = 0; i < 1000; i++) { @@ -55,14 +68,14 @@ public class FoundationTest extends RococoaTestCase { } } - @Test public void testInt() { + @Test void testInt() { ID clas = Foundation.getClass("NSNumber"); ID anInt = Foundation.sendReturnsID(clas, "numberWithInt:", 42); int anIntValue = Foundation.send(anInt, "intValue", int.class); assertEquals(42, anIntValue); } - @Test public void testDouble() { + @Test void testDouble() { ID clas = Foundation.getClass("NSNumber"); ID aDouble = Foundation.sendReturnsID(clas, "numberWithDouble:", Math.E); Object[] args = {}; @@ -71,22 +84,26 @@ public class FoundationTest extends RococoaTestCase { } @Disabled("by vavi") - @Test public void testFloat() { + @Test void testFloat() { ID clas = Foundation.getClass("NSNumber"); ID aFloat = Foundation.sendReturnsID(clas, "numberWithFloat:", 3.142f); + String aStringValue = Foundation.send(aFloat, Foundation.selector("stringValue"), String.class); +logger.info("NSNumber: " + aStringValue + ", " + CGFloat.SIZE); Object[] args = {}; - float aFloatValue = Foundation.send(aFloat, Foundation.selector("floatValue"), float.class, args); + float aFloatValue = Foundation.send(aFloat, Foundation.selector("floatValue"), int.class, args); +Debug.println(StringUtil.toBits(Float.floatToIntBits(3.142f), 32)); +Debug.println(StringUtil.toBits(Float.floatToIntBits(aFloatValue), 32)); assertEquals(3.142f, aFloatValue, 0.001); } - @Test public void testSendNoArgs() { + @Test void testSendNoArgs() { ID clas = Foundation.getClass("NSDate"); ID instance = Foundation.sendReturnsID(clas, "date"); ID result = Foundation.sendReturnsID(instance, "description"); assertTrue(Foundation.toString(result).startsWith("2")); // 2007-11-15 16:01:50 +0000 } - @Test public void testSelector() { + @Test void testSelector() { Selector selector = Foundation.selector("selectorName:"); assertTrue(selector.longValue() != 0); // selectors always exist assertSame("selectorName:", selector.getName()); @@ -96,19 +113,36 @@ public class FoundationTest extends RococoaTestCase { assertSame("noSelector:NamedThis:OrribleThing:", noSuchSelector.getName()); } - @Test public void sendMessageToNilIsOK() { + @Test void sendMessageToNilIsOK() { assertEquals(new ID(0), Foundation.sendReturnsID(new ID(0), "description")); } // TODO - make work by wrapping call with native try- catch @Disabled("to make work") - @Test public void testInvokeUnknownSelector() { + @Test void testInvokeUnknownSelector() { Selector noSuchSelector = Foundation.selector("noSelector:NamedThis:OrribleThing:"); assertTrue(noSuchSelector.longValue() != 0); ID clas = Foundation.getClass("NSNumber"); - try { + assertThrows(NoSuchMethodError.class, () -> { Foundation.send(clas, noSuchSelector, int.class); - fail(); - } catch (NoSuchMethodError xpected) {} + }); + } + + @Test + @Disabled("setting float doesn't work") + void test1() throws Exception { + NSNumber number = NSNumber.of(1234); + assertEquals(1234f, number.floatValue()); + assertEquals(1234, number.doubleValue()); + assertNotEquals(1235, number.floatValue()); + + NSNumber number3 = NSNumber.of(1.234d); + assertEquals(1.234f, number3.floatValue()); + assertEquals(1.234d, number3.doubleValue()); + + NSNumber number2 = NSNumber.of(1.234f); +Debug.println(StringUtil.toBits(Float.floatToIntBits(1.234f), 32)); +Debug.println(StringUtil.toBits(Float.floatToIntBits(number2.floatValue()), 32)); + assertEquals(1.234f, number2.floatValue()); // TODO error } } diff --git a/rococoa-core/src/test/java/org/rococoa/JavaProxyTest.java b/rococoa-core/src/test/java/org/rococoa/JavaProxyTest.java index 4def783..f967e33 100644 --- a/rococoa-core/src/test/java/org/rococoa/JavaProxyTest.java +++ b/rococoa-core/src/test/java/org/rococoa/JavaProxyTest.java @@ -234,15 +234,15 @@ public void notify(NSNotification notification) { ObjCObject proxy2 = Rococoa.proxy(implementor2); Foundation.sendReturnsVoid(proxy.id(), "testTakesIDReturnsID:", ID.fromLong(42)); - assertEquals(ID.fromLong(42), implementor.arg); + assertEquals(ID.fromLong(42), implementor.arg); Foundation.sendReturnsVoid(proxy2.id(), "testTakesIDReturnsID:", ID.fromLong(43)); - assertEquals(ID.fromLong(43), implementor2.arg); + assertEquals(ID.fromLong(43), implementor2.arg); } @Test public void testNotifications() { NSNotificationCenter notificationCentre = NSNotificationCenter.CLASS.defaultCenter(); - final ID observer = proxy.id(); + ID observer = proxy.id(); notificationCentre.addObserver_selector_name_object( observer, Foundation.selector("notify:"), @@ -260,7 +260,7 @@ public void notify(NSNotification notification) { @Test public void testMemoryManagement() { // we were autorelease'ing the proxy - so that this failed NSNotificationCenter notificationCentre = NSNotificationCenter.CLASS.defaultCenter(); - final ID observer = proxy.id(); + ID observer = proxy.id(); notificationCentre.addObserver_selector_name_object( observer, Foundation.selector("notify:"), @@ -273,5 +273,4 @@ public void notify(NSNotification notification) { notificationCentre.postNotification(notification); notificationCentre.removeObserver(observer); } - } diff --git a/rococoa-core/src/test/java/org/rococoa/NSClassTest.java b/rococoa-core/src/test/java/org/rococoa/NSClassTest.java index 8f9c0b5..356d8e7 100644 --- a/rococoa-core/src/test/java/org/rococoa/NSClassTest.java +++ b/rococoa-core/src/test/java/org/rococoa/NSClassTest.java @@ -26,8 +26,9 @@ import org.rococoa.test.RococoaTestCase; @SuppressWarnings("nls") -public class NSClassTest extends RococoaTestCase { - @Test public void test() { +class NSClassTest extends RococoaTestCase { + + @Test void test() { NSNumber fortyTwo = NSNumber.CLASS.numberWithInt(42); ID idOfNSNumber = Foundation.getClass("NSNumber"); ID idOfNSString = Foundation.getClass("NSString"); @@ -37,5 +38,4 @@ public class NSClassTest extends RococoaTestCase { assertTrue(fortyTwo.isKindOfClass(ObjCClass.CLASS.classWithName("NSNumber"))); assertFalse(fortyTwo.isKindOfClass(ObjCClass.CLASS.classWithName("NSString"))); } - } diff --git a/rococoa-core/src/test/java/org/rococoa/RococoaAbstractClassTest.java b/rococoa-core/src/test/java/org/rococoa/RococoaAbstractClassTest.java index ae5fd8b..75ab7aa 100644 --- a/rococoa-core/src/test/java/org/rococoa/RococoaAbstractClassTest.java +++ b/rococoa-core/src/test/java/org/rococoa/RococoaAbstractClassTest.java @@ -29,22 +29,22 @@ public class RococoaAbstractClassTest extends RococoaTestCase { public static abstract class NSNumberAsClass extends NSObject { - + public static final _Class CLASS = Rococoa.createClass("NSNumber", _Class.class); + public interface _Class extends ObjCClass { - public NSNumberAsClass numberWithInt(int value); + NSNumberAsClass numberWithInt(int value); } - + public static NSNumberAsClass numberWithInt(int value) { return CLASS.numberWithInt(value); } - + public abstract int intValue(); - + public int twice() { return 2 * intValue(); } - } @Test public void test() { diff --git a/rococoa-core/src/test/java/org/rococoa/RococoaMainThreadTest.java b/rococoa-core/src/test/java/org/rococoa/RococoaMainThreadTest.java index b4baf97..b8a580a 100644 --- a/rococoa-core/src/test/java/org/rococoa/RococoaMainThreadTest.java +++ b/rococoa-core/src/test/java/org/rococoa/RococoaMainThreadTest.java @@ -42,7 +42,6 @@ private interface TestShunt extends ObjCObject { @Test public void testOnMainThreadAtClassLevel() { TestShunt testShunt = Rococoa.create("TestShunt", TestShuntOnMainThread.class); assertTrue(testShunt.isMainThread()); - } @Test public void testNotMainThreadAtMethodLevel() { @@ -53,15 +52,14 @@ private interface TestShunt extends ObjCObject { @Test public void testOnMainThreadAtMethodLevel() { TestShunt testShunt = Rococoa.create("TestShunt", TestShuntAnnotatedMethod.class); assertTrue(testShunt.isMainThread()); - } private interface TestShuntAnnotatedMethod extends TestShunt { @RunOnMainThread - public boolean isMainThread(); + boolean isMainThread(); } private interface TestShuntUnAnnotatedMethod extends TestShunt { - public boolean isMainThread(); + boolean isMainThread(); } } diff --git a/rococoa-core/src/test/java/org/rococoa/RococoaTest.java b/rococoa-core/src/test/java/org/rococoa/RococoaTest.java index 6b0331e..16984fe 100644 --- a/rococoa-core/src/test/java/org/rococoa/RococoaTest.java +++ b/rococoa-core/src/test/java/org/rococoa/RococoaTest.java @@ -103,7 +103,7 @@ public class RococoaTest extends RococoaTestCase { } public interface OddClass extends ObjCClass { - public NSObject numberWithInt(int value); + NSObject numberWithInt(int value); } @Test public void testDownCast() { diff --git a/rococoa-core/src/test/java/org/rococoa/StructsInObjectsTest.java b/rococoa-core/src/test/java/org/rococoa/StructsInObjectsTest.java index e095cc1..c7a682e 100644 --- a/rococoa-core/src/test/java/org/rococoa/StructsInObjectsTest.java +++ b/rococoa-core/src/test/java/org/rococoa/StructsInObjectsTest.java @@ -44,8 +44,7 @@ public interface MyLibrary extends Library { Foundation.send(value.id(), Foundation.selector("sizeValue"), NSSize.class); - NSSize size = value.sizeValue(); - // fails here with jna 3.0.6+ in Java 1.5, see StaticStructureReturnTest + NSSize size = value.sizeValue(); // fails here with jna 3.0.6+ in Java 1.5, see StaticStructureReturnTest assertEquals(1.0, size.width.doubleValue(), 0.0001); assertEquals(3.0, size.height.doubleValue(), 0.0001); diff --git a/rococoa-core/src/test/java/org/rococoa/TestStruct.java b/rococoa-core/src/test/java/org/rococoa/TestStruct.java index 560ae2c..089660f 100644 --- a/rococoa-core/src/test/java/org/rococoa/TestStruct.java +++ b/rococoa-core/src/test/java/org/rococoa/TestStruct.java @@ -24,6 +24,10 @@ import com.sun.jna.Structure; + +/** + * TestIntDoubleStruct in test.h + */ public class TestStruct extends Structure { public int anInt; public double aDouble; diff --git a/rococoa-core/src/test/java/org/rococoa/TestStructOfStruct.java b/rococoa-core/src/test/java/org/rococoa/TestStructOfStruct.java index 1fde2a0..72430ae 100644 --- a/rococoa-core/src/test/java/org/rococoa/TestStructOfStruct.java +++ b/rococoa-core/src/test/java/org/rococoa/TestStructOfStruct.java @@ -24,6 +24,10 @@ import com.sun.jna.Structure; + +/** + * TestStructOfStruct in test.h + */ public class TestStructOfStruct extends Structure { public double aDouble; public TestStruct.ByValue aStruct; diff --git a/rococoa-core/src/test/java/org/rococoa/test/RococoaTestCase.java b/rococoa-core/src/test/java/org/rococoa/test/RococoaTestCase.java index f7da704..781fd9b 100644 --- a/rococoa-core/src/test/java/org/rococoa/test/RococoaTestCase.java +++ b/rococoa-core/src/test/java/org/rococoa/test/RococoaTestCase.java @@ -58,15 +58,10 @@ public abstract class RococoaTestCase { public static void initializeLogging() { try { - InputStream is = null; - try { - is = RococoaTestCase.class.getResourceAsStream("/test-logging.properties"); + try (InputStream is = RococoaTestCase.class.getResourceAsStream("/test-logging.properties")) { if (is == null) throw new FileNotFoundException("Cannot find test-logging.properties"); LogManager.getLogManager().readConfiguration(is); - } finally { - if (is != null) - is.close(); } } catch (IOException x) { throw new RuntimeException("Could not initialize logging", x); diff --git a/rococoa-core/src/test/resources/test-logging.properties b/rococoa-core/src/test/resources/test-logging.properties index ad13366..ded1be7 100644 --- a/rococoa-core/src/test/resources/test-logging.properties +++ b/rococoa-core/src/test/resources/test-logging.properties @@ -1,8 +1,11 @@ -handlers= java.util.logging.ConsoleHandler +handlers=java.util.logging.ConsoleHandler -org.rococoa.level = FINEST -org.rococoa.foundation.level = FINEST -org.rococoa.proxy.level = FINEST +org.rococoa.level=FINEST +org.rococoa.foundation.level=FINEST +org.rococoa.proxy.level=FINEST -java.util.logging.ConsoleHandler.level = ALL -java.util.logging.ConsoleHandler.formatter = org.rococoa.test.LogFormatter \ No newline at end of file +java.util.logging.ConsoleHandler.level=ALL +java.util.logging.ConsoleHandler.formatter=org.rococoa.test.LogFormatter + +vavi.util.level=FINER +com.sun.jna.level=ALL \ No newline at end of file From 228df2a70556ca9ac02a1e1eb6d9a77016545087 Mon Sep 17 00:00:00 2001 From: Naohide Sano Date: Fri, 21 Oct 2022 00:31:55 +0900 Subject: [PATCH 14/36] clean up add comments make test work well --- .../cocoa/appkit/NSSpeechSynthesizer.java | 4 +-- .../rococoa/cocoa/coreml/CoreMLLibrary.java | 4 --- .../cocoa/appkit/NSApplicationTest.java | 14 +++++++++ .../cocoa/appkit/NSOperationQueueTest.java | 22 +++++--------- .../cocoa/appkit/NSSpeechSynthesizerTest.java | 30 +++++++++---------- .../org/rococoa/cocoa/appkit/NSVoiceTest.java | 6 ++-- .../cocoa/coreimage/CoreImageTest.java | 5 +++- .../org/rococoa/cocoa/coreml/CoreMLTest.java | 14 +++++---- 8 files changed, 52 insertions(+), 47 deletions(-) diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSSpeechSynthesizer.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSSpeechSynthesizer.java index e52ce32..45f9747 100755 --- a/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSSpeechSynthesizer.java +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSSpeechSynthesizer.java @@ -437,7 +437,7 @@ public float getPitchBase() { * @param baselinePitch the baseline pitch to use */ public void setPitchBase(float baselinePitch) { - setProperty(SpeechProperty.PitchBaseProperty, NSNumber.CLASS.numberWithFloat(baselinePitch)); + setProperty(SpeechProperty.PitchBaseProperty, NSNumber.of((double) baselinePitch)); // TODO float bug? } /** Get the pitch modulation for the synthesizer @@ -454,7 +454,7 @@ public void setPitchMod(float modulation) { if ( modulation < 0.0f || modulation > 127.0f) { throw new IllegalArgumentException("Pitch modulation must be in the range 0.0 - 127.0"); } - setProperty(SpeechProperty.PitchModProperty, NSNumber.CLASS.numberWithFloat(modulation)); + setProperty(SpeechProperty.PitchModProperty, NSNumber.of((double) modulation)); // TODO float bug? } /** Get a list of phonemes the synthesizer uses diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/coreml/CoreMLLibrary.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/coreml/CoreMLLibrary.java index 70cc90b..259f8e0 100644 --- a/rococoa-contrib/src/main/java/org/rococoa/cocoa/coreml/CoreMLLibrary.java +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/coreml/CoreMLLibrary.java @@ -6,12 +6,8 @@ package org.rococoa.cocoa.coreml; -import com.sun.jna.Callback; import com.sun.jna.Library; import com.sun.jna.Native; -import com.sun.jna.Pointer; -import org.rococoa.cocoa.CGFloat; -import org.rococoa.cocoa.coregraphics.CGRect; /** diff --git a/rococoa-contrib/src/test/java/org/rococoa/cocoa/appkit/NSApplicationTest.java b/rococoa-contrib/src/test/java/org/rococoa/cocoa/appkit/NSApplicationTest.java index f291aa0..4de40ae 100644 --- a/rococoa-contrib/src/test/java/org/rococoa/cocoa/appkit/NSApplicationTest.java +++ b/rococoa-contrib/src/test/java/org/rococoa/cocoa/appkit/NSApplicationTest.java @@ -6,6 +6,11 @@ package org.rococoa.cocoa.appkit; +import java.awt.Toolkit; +import java.awt.datatransfer.Clipboard; +import java.awt.datatransfer.StringSelection; + +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import vavi.util.StringUtil; @@ -20,6 +25,15 @@ * @version 0.00 2022-09-14 nsano initial version
*/ class NSApplicationTest { + + @BeforeEach + void setup() { + Toolkit kit = Toolkit.getDefaultToolkit(); + Clipboard clip = kit.getSystemClipboard(); + StringSelection ss = new StringSelection("vavi"); + clip.setContents(ss, ss); + } + @Test @Disabled("TODO wip") void test1() throws Exception { diff --git a/rococoa-contrib/src/test/java/org/rococoa/cocoa/appkit/NSOperationQueueTest.java b/rococoa-contrib/src/test/java/org/rococoa/cocoa/appkit/NSOperationQueueTest.java index fd4f8c8..55b0304 100644 --- a/rococoa-contrib/src/test/java/org/rococoa/cocoa/appkit/NSOperationQueueTest.java +++ b/rococoa-contrib/src/test/java/org/rococoa/cocoa/appkit/NSOperationQueueTest.java @@ -27,23 +27,17 @@ import org.rococoa.ObjCObject; import static org.junit.jupiter.api.Assertions.*; import org.rococoa.Rococoa; -import org.rococoa.cocoa.appkit.NSInvocationOperation; -import org.rococoa.cocoa.appkit.NSOperation; -import org.rococoa.cocoa.appkit.NSOperationQueue; import org.rococoa.cocoa.foundation.NSArray; import org.rococoa.cocoa.foundation.NSInteger; import org.rococoa.test.RococoaTestCase; -/** Test case for mapping of NSOperationQueue. - * +/** + * Test case for mapping of NSOperationQueue. */ -public class NSOperationQueueTest extends RococoaTestCase { +class NSOperationQueueTest extends RococoaTestCase { NSOperationQueue fixture; - public NSOperationQueueTest() { - } - @BeforeEach public void setUp() { fixture = NSOperationQueue.CLASS.alloc().init(); @@ -59,11 +53,9 @@ public RunnableHolder(int numItems) { ops = new NSInvocationOperation[numItems]; for(int i=0; i < ops.length; i++) { final int j = i; - Runnable r = new Runnable() { - public void run() { - synchronized(results) { - results[j] = true; - } + Runnable r = () -> { + synchronized(results) { + results[j] = true; } }; ops[i] = NSInvocationOperation.CLASS.alloc(); @@ -198,6 +190,6 @@ public void testOperations() { runnables.addOperations(fixture); assertTrue(fixture.operations().count() > 0, "Should have some operations"); fixture.waitUntilAllOperationsAreFinished(); - assertTrue(fixture.operations().count() == 0, "Should have completed all operations"); + assertEquals(0, fixture.operations().count(), "Should have completed all operations"); } } \ No newline at end of file diff --git a/rococoa-contrib/src/test/java/org/rococoa/cocoa/appkit/NSSpeechSynthesizerTest.java b/rococoa-contrib/src/test/java/org/rococoa/cocoa/appkit/NSSpeechSynthesizerTest.java index 747c736..6674475 100644 --- a/rococoa-contrib/src/test/java/org/rococoa/cocoa/appkit/NSSpeechSynthesizerTest.java +++ b/rococoa-contrib/src/test/java/org/rococoa/cocoa/appkit/NSSpeechSynthesizerTest.java @@ -33,14 +33,15 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; -import org.rococoa.cocoa.appkit.NSSpeechDictionary; -import org.rococoa.cocoa.appkit.NSSpeechSynthesizer; -import org.rococoa.cocoa.appkit.NSVoice; +import org.rococoa.cocoa.appkit.NSSpeechSynthesizer.NSSpeechStatus; import org.rococoa.cocoa.foundation.NSAutoreleasePool; import org.rococoa.cocoa.foundation.NSRange; -import org.rococoa.cocoa.appkit.NSSpeechSynthesizer.NSSpeechStatus; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; /** @@ -64,7 +65,7 @@ public void postTeardown() { } @Test - @Disabled("by vavi") + @Disabled("by vavi: depends on system settings") public void testDefaultVoice() { assertNotNull(NSSpeechSynthesizer.CLASS.defaultVoice()); // System preference, so no way of knowing actual value assertNotNull(NSSpeechSynthesizer.defaultVoice().getName()); @@ -81,7 +82,7 @@ public void testAvailableVoices() { } @Test - @Disabled("by vavi") + @Disabled("by vavi: depends on locale?") public void testAddGetSpeechDictionary() { // first, let's teach the synth to talk like its from Newcastle (sort of) NSSpeechDictionary dict = new NSSpeechDictionary(); @@ -129,13 +130,13 @@ public void testStartSpeakingString() throws InterruptedException { } @Test - @Disabled("by vavi") + @Disabled("by vavi: depends on timing?") public void testIsSpeaking() throws InterruptedException { NSSpeechSynthesizer ss = NSSpeechSynthesizer.synthesizerWithVoice(testVoice); SynthesizerDelegate sd = new SynthesizerDelegate(ss); ss.setVolume(VOLUME); assertFalse(ss.isSpeaking()); - ss.startSpeakingString("Hello world"); + ss.startSpeakingString("Hello world, Hello world, Hello world, Hello world"); assertTrue(ss.isSpeaking()); sd.waitForSpeechDone(TIME_TO_WAIT, true); } @@ -193,7 +194,7 @@ public void testWillSpeakPhoneme() { } @Test - @Disabled("by vavi") + @Disabled("by vavi: not stable") public void testStopSpeakingAtBoundary() throws InterruptedException { NSSpeechSynthesizer ss = NSSpeechSynthesizer.synthesizerWithVoice(testVoice); SynthesizerDelegate sd = new SynthesizerDelegate(ss); @@ -215,7 +216,7 @@ public void testStopSpeakingAtBoundary() throws InterruptedException { ss.stopSpeakingAtBoundary(NSSpeechSynthesizer.NSSpeechBoundary.SentenceBoundary); sd.waitForWord(TIME_TO_WAIT, "now"); sd.waitForSpeechDone(TIME_TO_WAIT, false); - assertEquals(6, sd.getWordsSpoken().size(), "Expected 6 word sentence but got: " + sd.getWordsSpoken()); + assertEquals(7, sd.getWordsSpoken().size(), "Expected 6 word sentence but got: " + sd.getWordsSpoken()); sd.reset(); ss.startSpeakingString(toSpeak); @@ -223,7 +224,7 @@ public void testStopSpeakingAtBoundary() throws InterruptedException { ss.stopSpeakingAtBoundary(NSSpeechSynthesizer.NSSpeechBoundary.ImmediateBoundary); sd.waitForSpeechDone(TIME_TO_WAIT, false); assertTrue(sd.getWordsSpoken().size() < 3, "Expected less than 3 words but got: " + sd.getWordsSpoken()); - assertTrue(sd.getWordsSpoken().size() >= 0, "Expected at least one word but got: " + sd.getWordsSpoken()); + assertTrue(sd.getWordsSpoken().size() > 0, "Expected at least one word but got: " + sd.getWordsSpoken()); } @Test @@ -301,7 +302,7 @@ public void testGetError() throws InterruptedException { ss.setVolume(VOLUME); ss.startSpeakingString("Try this one [[pbas foobar]] two three"); sd.waitForWord(1000, "three"); - assertTrue(sd.position > 0, "Should have error position"); + assertTrue(sd.position > 0, "Should have error position: " + sd.position); assertNotNull(sd.errorMessage, "Should have error message"); NSSpeechSynthesizer.NSSpeechError error = ss.getError(); @@ -354,7 +355,6 @@ public void testSynthesizerInfo() { } @Test - @Disabled("by vavi") public void testPitchBase() { NSSpeechSynthesizer ss = NSSpeechSynthesizer.synthesizerWithVoice(testVoice); float pitchBase = ss.getPitchBase(); @@ -364,7 +364,6 @@ public void testPitchBase() { } @Test - @Disabled("by vavi") public void testPitchMod() { NSSpeechSynthesizer ss = NSSpeechSynthesizer.synthesizerWithVoice(testVoice); float pitchMod = ss.getPitchMod(); @@ -445,7 +444,6 @@ public void testCommandDelimiter() { } @Test - @Disabled("by vavi") public void testReset() { NSSpeechSynthesizer ss = NSSpeechSynthesizer.synthesizerWithVoice(testVoice); float pitchBase = ss.getPitchBase(); diff --git a/rococoa-contrib/src/test/java/org/rococoa/cocoa/appkit/NSVoiceTest.java b/rococoa-contrib/src/test/java/org/rococoa/cocoa/appkit/NSVoiceTest.java index 9322fc4..833fb46 100644 --- a/rococoa-contrib/src/test/java/org/rococoa/cocoa/appkit/NSVoiceTest.java +++ b/rococoa-contrib/src/test/java/org/rococoa/cocoa/appkit/NSVoiceTest.java @@ -16,13 +16,13 @@ * You should have received a copy of the GNU Lesser General Public License * along with Rococoa. If not, see . */ + package org.rococoa.cocoa.appkit; import java.util.Locale; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; -import org.rococoa.cocoa.appkit.NSVoice; import org.rococoa.cocoa.foundation.NSArray; import org.rococoa.cocoa.appkit.NSVoice.VoiceGender; import org.rococoa.test.RococoaTestCase; @@ -57,9 +57,7 @@ public void testAttributesForVoice() { @Test public void testBadIdentifier() { String badId = "This voice does not exist"; - IllegalArgumentException e = assertThrows(IllegalArgumentException.class, () -> { - new NSVoice(badId); - }); + IllegalArgumentException e = assertThrows(IllegalArgumentException.class, () -> new NSVoice(badId)); assertTrue(e.getMessage().indexOf(badId) > 0); } } diff --git a/rococoa-contrib/src/test/java/org/rococoa/cocoa/coreimage/CoreImageTest.java b/rococoa-contrib/src/test/java/org/rococoa/cocoa/coreimage/CoreImageTest.java index 2a6da38..aae0b2f 100644 --- a/rococoa-contrib/src/test/java/org/rococoa/cocoa/coreimage/CoreImageTest.java +++ b/rococoa-contrib/src/test/java/org/rococoa/cocoa/coreimage/CoreImageTest.java @@ -40,6 +40,7 @@ class CoreImageTest { /** @see "https://stackoverflow.com/a/23877167" */ @Test + @DisplayName("use primitives") @EnabledIfSystemProperty(named = "vavi.test", matches = "ide") void test1() throws Exception { @@ -91,7 +92,7 @@ void test1() throws Exception { show(image); } - /** */ + /** never stop, u need to close the window by yourself */ void show(BufferedImage image) { JFrame frame = new JFrame(); JPanel panel = new JPanel() { @@ -129,6 +130,7 @@ void test3() throws Exception { } @Test + @DisplayName("use utilities") @EnabledIfSystemProperty(named = "vavi.test", matches = "ide") void test4() throws Exception { BufferedImage image = ImageIO.read(CoreImageTest.class.getResourceAsStream("/test.jpg")); @@ -145,6 +147,7 @@ void test4() throws Exception { } @Test + @DisplayName("CIUnsharpMask") @EnabledIfSystemProperty(named = "vavi.test", matches = "ide") void test5() throws Exception { BufferedImage image = ImageIO.read(CoreImageTest.class.getResourceAsStream("/test.jpg")); diff --git a/rococoa-contrib/src/test/java/org/rococoa/cocoa/coreml/CoreMLTest.java b/rococoa-contrib/src/test/java/org/rococoa/cocoa/coreml/CoreMLTest.java index 237e2cc..58198b8 100644 --- a/rococoa-contrib/src/test/java/org/rococoa/cocoa/coreml/CoreMLTest.java +++ b/rococoa-contrib/src/test/java/org/rococoa/cocoa/coreml/CoreMLTest.java @@ -15,7 +15,9 @@ import javax.swing.JPanel; import javax.swing.JScrollPane; +import com.sun.jna.Pointer; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.EnabledIfSystemProperty; import org.rococoa.cocoa.coregraphics.CGImage; import org.rococoa.cocoa.vision.VNCoreMLModel; import org.rococoa.cocoa.vision.VNCoreMLRequest; @@ -33,13 +35,15 @@ class CoreMLTest { @Test + @EnabledIfSystemProperty(named = "vavi.test", matches = "ide") void test1() throws Exception { long t = System.currentTimeMillis(); Debug.println("MLModel: loading..."); - MLModel mlModel = MLModel.fromPath("/Users/nsano/Downloads/realesrganAnime512.mlmodel"); -// MLModel mlModel = MLModel.fromPath("/Users/nsano/Downloads/bsrgan.mlmodel"); -//Debug.println("MLModel: " + mlModel.modelDescription()); +// MLModel mlModel = MLModel.fromPath("/Users/nsano/Downloads/realesrganAnime512.mlmodel"); // wtf about color? + MLModel mlModel = MLModel.fromPath("/Users/nsano/Downloads/bsrgan.mlmodel"); // no good for japanese +// MLModel mlModel = MLModel.fromPath("/Users/nsano/Downloads/anime_noise0_model.mlmodel"); // input/output is not image +Debug.println("MLModel: " + mlModel.modelDescription()); VNCoreMLModel model = VNCoreMLModel.fromMLModel(mlModel); //Debug.println("VNCoreMLModel: " + model.inputImageFeatureName()); @@ -55,13 +59,13 @@ void test1() throws Exception { t = System.currentTimeMillis(); handler.performRequests(request); - CGImage filteredImage = new CGImage(request.result()); + CGImage filteredImage = new CGImage((Pointer) request.result()); Debug.println((System.currentTimeMillis() - t) + " ms"); Debug.println("cgImage: " + filteredImage); show(filteredImage.toBufferedImage()); } - /** */ + /** never stop, u need to close the window by yourself */ void show(BufferedImage image) { JFrame frame = new JFrame(); JPanel panel = new JPanel() { From 101ca357e170107f54179d25eacf1c9389f6d2a7 Mon Sep 17 00:00:00 2001 From: Naohide Sano Date: Fri, 21 Oct 2022 00:33:36 +0900 Subject: [PATCH 15/36] update readmes --- README.md | 51 ++++++++++++++++++++++++++++++--------- pom.xml | 1 + rococoa-contrib/readme.md | 30 +++++++++++++++++++++++ rococoa-core/readme.md | 30 +++++++++++++++++++++++ 4 files changed, 100 insertions(+), 12 deletions(-) create mode 100644 rococoa-contrib/readme.md create mode 100644 rococoa-core/readme.md diff --git a/README.md b/README.md index dd2f42a..ee6c2da 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,45 @@ Rococoa is a generic Java binding to the Mac Objective-C object system. It allows the creation and use of Objective-C objects in Java, and the implementation of Objective-C interfaces in Java. +## Installation + + * https://github.com/umjammer/rococoa/packages/ + * this project uses github packages. add a personal access token to `~/.m2/settings.xml` + * see https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-apache-maven-registry + +## How To + +* [Basics](rococoa-core/readme.md#how-to) +* [CGFilter Java2D BufferedImageOp](rococoa-contrib/src/test/java/org/rococoa/cocoa/coreimage/CoreImageTest.java) +* [CoreML](rococoa-contrib/src/test/java/org/rococoa/cocoa/coreml/CoreMLTest.java) +* [iTunes Library](https://github.com/umjammer/vavi-sound-sandbox/tree/master/src/main/java/vavix/rococoa/ituneslibrary) +* [AudioUnit Java MIDI SPI synthesizer](https://github.com/umjammer/vavi-sound-sandbox/tree/master/src/main/java/vavi/sound/midi/rococoa) +* [CoreMidi Java MIDI SPI](https://github.com/umjammer/osxmidi4j) +* [NSSpeechSynthesizer Java Speech API](https://github.com/umjammer/vavi-speech2/tree/master/src/main/java/vavi/speech/rococoa/jsapi2) +* [HEIF Java ImageIO SPI](https://github.com/umjammer/vavi-image-sandbox/tree/master/src/main/java/vavix/imageio/rococoa) +* [MTLibrary](https://github.com/umjammer/vavi-apps-padsynth/tree/main/src/main/java/vavix/rococoa/multitouch) +* [KeyChain Java crypto Keystore SPI](https://github.com/umjammer/vavi-crypto-sandbox/tree/1.0.2/src/main/java/vavix/rococoa/keychain) +* [Vision Detecting Human Body Poses in Images](rococoa-contrib/src/test/java/org/rococoa/cocoa/vision/VisionTest.java) + +## Limitation + +* float +* block + +## TODO + +* https://github.com/ibinti/bugvm +* NSUrl tags (wip) +* block (wip) + * http://cocoawithlove.com/2009/10/how-blocks-are-implemented-and.html + * http://www.opensource.apple.com/source/libclosure/libclosure-38/BlockImplementation.txt +* ~~CIFilter~~ (done) +* https://gitlab.com/axet/apple + +---- + +# Original + ## Fair Warning Rococoa is very much work in progress. Much is subject to change. A lot isn't @@ -29,15 +68,3 @@ any other problems. * [Quicktime](https://github.com/iterate-ch/rococoa/blob/wiki/Quicktime.md) * [Limitations](https://github.com/iterate-ch/rococoa/blob/wiki/Limitations.md) * [Help Wanted](https://github.com/iterate-ch/rococoa/blob/wiki/HelpWanted.md) - * [How To](https://github.com/iterate-ch/rococoa/blob/wiki/HowTo.md) - -## TODO - - * https://github.com/ibinti/bugvm - * NSUrl tags (wip) - * block (wip) - * http://cocoawithlove.com/2009/10/how-blocks-are-implemented-and.html - * http://www.opensource.apple.com/source/libclosure/libclosure-38/BlockImplementation.txt - * ~~CIFilter~~ (done) - * https://gitlab.com/axet/apple - \ No newline at end of file diff --git a/pom.xml b/pom.xml index 23f3416..2820a1e 100644 --- a/pom.xml +++ b/pom.xml @@ -153,6 +153,7 @@ false false + -J-Duser.language=en_US -Xdoclint:none -Xdoclint:-missing diff --git a/rococoa-contrib/readme.md b/rococoa-contrib/readme.md new file mode 100644 index 0000000..37e58d4 --- /dev/null +++ b/rococoa-contrib/readme.md @@ -0,0 +1,30 @@ + +# rococoa-contrib + +## Features + +### đŸ—Ŗ NSSpeechSynthesizer + + * https://github.com/umjammer/vavi-speech/tree/master/src/main/java/vavi/speech/rococoa + * https://github.com/umjammer/vavi-speech2/tree/master/src/main/java/vavi/speech/rococoa/jsapi2 + +### đŸ–ŧī¸ CoreImage + + * CGImage class ... utility for interoperability with BufferedImage + +### đŸ–ŧī¸ CoreImage Filter + + * [BufferedImageOp](https://docs.oracle.com/javase/8/docs/api/java/awt/image/BufferedImageOp.html) using CIFilter + * https://cifilter.io/ + +### 👁ī¸ CoreML + + * make loading models (that is manual-less else swift) easy + * see [sample](src/test/java/org/rococoa/cocoa/coreml/CoreMLTest.java) + * TODO + * color will be different form originals + * input size is strictly fixed as 512x512 ... it's useless for comics (mostly height is over 800 pixels and not square) + +### 👁ī¸ Vision Face and Body Detection + +wip diff --git a/rococoa-core/readme.md b/rococoa-core/readme.md new file mode 100644 index 0000000..e0758d5 --- /dev/null +++ b/rococoa-core/readme.md @@ -0,0 +1,30 @@ +# rococoa-core + +## How To + +### Error Handling + +```java + ObjCObjectByReference errorRef = new ObjCObjectByReference(); + ... foo.bar_error(..., errorRef); + NSError error = errorRef.getValueAs(NSError.class); + if (error != null) { + throw new BuzException(error.description()); + } +``` +### Run on main thread + +```java + Foundation.runOnMainThread(() -> { ... }); +``` + +### Cast + +```java + if (objcObject.isKindOfClass(fooObjcClass)) + FooObjcObject fooObjcObject = Rococoa.cast(objcObject, FooObjcClass.class); +``` + +## References + + * https://github.com/java-native-access/jna/tree/master/contrib/platform/src/com/sun/jna/platform/mac \ No newline at end of file From 1c7dfacf4d8ab298c0eaffb47f018d3a166ea007 Mon Sep 17 00:00:00 2001 From: David Kocher Date: Thu, 4 Nov 2021 11:59:39 +0100 Subject: [PATCH 16/36] Skip lookup of undefined function `objc_msgSend_stret` on aarch64. > Error looking up function 'objc_msgSend_stret': dlsym(0x49eaf4a50, objc_msgSend_stret): symbol not found --- .../org/rococoa/internal/MsgSendHandler.java | 87 +++++++++---------- .../internal/MsgSendInvocationMapper.java | 5 +- 2 files changed, 46 insertions(+), 46 deletions(-) diff --git a/rococoa-core/src/main/java/org/rococoa/internal/MsgSendHandler.java b/rococoa-core/src/main/java/org/rococoa/internal/MsgSendHandler.java index c61d9ae..d1c1861 100644 --- a/rococoa-core/src/main/java/org/rococoa/internal/MsgSendHandler.java +++ b/rococoa-core/src/main/java/org/rococoa/internal/MsgSendHandler.java @@ -1,13 +1,13 @@ /* * Copyright 2007, 2008 Duncan McGregor - * + * * This file is part of Rococoa, a library to allow Java to talk to Cocoa. - * + * * Rococoa is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - * + * * Rococoa is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the @@ -16,49 +16,46 @@ * You should have received a copy of the GNU Lesser General Public License * along with Rococoa. If not, see . */ - -package org.rococoa.internal; - -import java.lang.reflect.InvocationHandler; -import java.lang.reflect.Method; -import java.util.HashMap; -import java.util.Map; -import org.rococoa.ID; -import org.rococoa.RococoaException; -import org.rococoa.Selector; +package org.rococoa.internal; import com.sun.jna.Function; import com.sun.jna.Library; import com.sun.jna.NativeLong; import com.sun.jna.Structure; +import org.rococoa.ID; +import org.rococoa.RococoaException; +import org.rococoa.Selector; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; /** * Very special case InvocationHandler that invokes the correct message dispatch * function for different return types. - * + *

* Either objc_msgSend or objc_msgSend_stret should be called, depending on the * return type. The latter is usually for struct by value, but the former is * used for small structs on Intel! Oh and the call has to be mangled in all * cases as the result is returned on the stack, but is different sizes * depending on its type. Luckily jna and libffi take care of the details - * provided they know what the return type is. - * + *

* This InvocationHandler is passed the return type as the first arg to the method call that it * intercepts, it uses it to determine which function to call, and removes it before * calling invoking. - * + * + * @author duncan * @see "http://www.cocoabuilder.com/archive/message/cocoa/2006/6/25/166236" * @see "http://developer.apple.com/mac/library/documentation/DeveloperTools/Conceptual/LowLevelABI/Mac_OS_X_ABI_Function_Calls.pdf" * @see "http://www.sealiesoftware.com/blog/archive/2008/10/30/objc_explain_objc_msgSend_stret.html" - * - * Note also that there is a objc_msgSend_fret that is used supposed to be for + *

+ * Note also that there is a objc_msgSend_fret that is used supposed to be for * floating point return types, but that I haven't (yet) had to use. - * * @see "http://www.sealiesoftware.com/blog/archive/2008/11/16/objc_explain_objc_msgSend_fpret.html" - * - * @author duncan - * */ class MsgSendHandler implements InvocationHandler { @@ -67,24 +64,25 @@ class MsgSendHandler implements InvocationHandler { */ private final String OPTION_INVOKING_METHOD = "invoking-method"; // TODO - use JNA string when made public - + private final static int I386_STRET_CUTOFF = 9; private final static int IA64_STRET_CUTOFF = 17; - private final static int stretCutoff = NativeLong.SIZE == 8 ? IA64_STRET_CUTOFF : I386_STRET_CUTOFF; + private final static int STRET_CUTOFF = NativeLong.SIZE == 8 ? IA64_STRET_CUTOFF : I386_STRET_CUTOFF; - private final static boolean ppc = System.getProperty("os.arch").trim().equalsIgnoreCase("ppc"); + public final static boolean AARCH64 = System.getProperty("os.arch").trim().equalsIgnoreCase("aarch64"); + public final static boolean PPC = System.getProperty("os.arch").trim().equalsIgnoreCase("ppc"); private final static Method OBJC_MSGSEND; private final static Method OBJC_MSGSEND_STRET; + static { try { OBJC_MSGSEND = MsgSendLibrary.class.getDeclaredMethod("objc_msgSend", ID.class, Selector.class, Object[].class); OBJC_MSGSEND_STRET = MsgSendLibrary.class.getDeclaredMethod("objc_msgSend_stret", ID.class, Selector.class, Object[].class); - } - catch (NoSuchMethodException x) { + } catch (NoSuchMethodException x) { throw new RococoaException(x); } } @@ -92,49 +90,50 @@ class MsgSendHandler implements InvocationHandler { private final Pair objc_msgSend_stret_Pair; private final Pair objc_msgSend_Pair; - private RococoaTypeMapper rococoaTypeMapper = new RococoaTypeMapper(); + private final RococoaTypeMapper rococoaTypeMapper = new RococoaTypeMapper(); - public MsgSendHandler(Function objc_msgSend_Function, Function objc_msgSend_stret_Function) { - this.objc_msgSend_Pair = new Pair<>(OBJC_MSGSEND, objc_msgSend_Function); - this.objc_msgSend_stret_Pair = new Pair<>(OBJC_MSGSEND_STRET, objc_msgSend_stret_Function); + public MsgSendHandler(Optional objc_msgSend_Function, Optional objc_msgSend_stret_Function) { + this.objc_msgSend_Pair = new Pair<>(OBJC_MSGSEND, objc_msgSend_Function.orElse(null)); + this.objc_msgSend_stret_Pair = new Pair<>(OBJC_MSGSEND_STRET, objc_msgSend_stret_Function.orElse(null)); } - - public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + + public Object invoke(Object proxy, Method method, Object[] args) { Class returnTypeForThisCall = (Class) args[0]; Object[] argsWithoutReturnType = this.removeReturnTypeFrom(args); + Map options = new HashMap<>(1); options.put(Library.OPTION_TYPE_MAPPER, rococoaTypeMapper); - + Pair invocation = this.invocationFor(returnTypeForThisCall); options.put(OPTION_INVOKING_METHOD, invocation.a); return invocation.b.invoke(returnTypeForThisCall, argsWithoutReturnType, options); } - + private Object[] removeReturnTypeFrom(Object[] args) { Object[] result = new Object[args.length - 1]; System.arraycopy(args, 1, result, 0, args.length - 2); return result; } - + private Pair invocationFor(Class returnTypeForThisCall) { + if (AARCH64) { + return objc_msgSend_Pair; + } boolean isStruct = Structure.class.isAssignableFrom(returnTypeForThisCall); boolean isStructByValue = isStruct && Structure.ByValue.class.isAssignableFrom(returnTypeForThisCall); - if (!isStructByValue) + if (!isStructByValue) { return objc_msgSend_Pair; + } try { - if(ppc) { + if (PPC) { // on ppc32 structs never return in registers return objc_msgSend_stret_Pair; } // on i386 structs with sizeof exactly equal to 1, 2, 4, or 8 return in registers Structure prototype = (Structure) returnTypeForThisCall.newInstance(); - return prototype.size() < stretCutoff ? objc_msgSend_Pair : objc_msgSend_stret_Pair; - } - catch(InstantiationException e) { - throw new RococoaException(e); - } - catch(IllegalAccessException e) { + return prototype.size() < STRET_CUTOFF ? objc_msgSend_Pair : objc_msgSend_stret_Pair; + } catch (InstantiationException | IllegalAccessException e) { throw new RococoaException(e); } } diff --git a/rococoa-core/src/main/java/org/rococoa/internal/MsgSendInvocationMapper.java b/rococoa-core/src/main/java/org/rococoa/internal/MsgSendInvocationMapper.java index 3ef6068..841331f 100644 --- a/rococoa-core/src/main/java/org/rococoa/internal/MsgSendInvocationMapper.java +++ b/rococoa-core/src/main/java/org/rococoa/internal/MsgSendInvocationMapper.java @@ -24,6 +24,7 @@ import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; +import java.util.Optional; import org.rococoa.ID; import org.rococoa.Selector; @@ -61,8 +62,8 @@ public InvocationHandler getInvocationHandler(NativeLibrary lib, Method m) { // Have to late bind this, as it's the only time we get to see lib. // Not too bad as the results are cached. return new MsgSendHandler( - lib.getFunction("objc_msgSend"), - lib.getFunction("objc_msgSend_stret")); + Optional.of(lib.getFunction("objc_msgSend")), + MsgSendHandler.AARCH64 ? Optional.ofNullable(null) : Optional.of(lib.getFunction("objc_msgSend_stret"))); } } \ No newline at end of file From 00d4e6acff61897e623b2e418c06c93c29d3e132 Mon Sep 17 00:00:00 2001 From: David Kocher Date: Thu, 4 Nov 2021 12:12:53 +0100 Subject: [PATCH 17/36] Fix compiler warnings. --- rococoa-core/src/main/native/Rococoa.h | 2 +- rococoa-core/src/main/native/Rococoa.m | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/rococoa-core/src/main/native/Rococoa.h b/rococoa-core/src/main/native/Rococoa.h index 427b07f..c47b12a 100644 --- a/rococoa-core/src/main/native/Rococoa.h +++ b/rococoa-core/src/main/native/Rococoa.h @@ -1,7 +1,7 @@ #import #include -void callOnMainThread(void (*fn)(), BOOL waitUntilDone); +void callOnMainThread(void (*fn)(void), BOOL waitUntilDone); @interface RococoaHelper : NSObject + (void) callback: (NSValue*) fn; diff --git a/rococoa-core/src/main/native/Rococoa.m b/rococoa-core/src/main/native/Rococoa.m index 5caadff..48481d8 100644 --- a/rococoa-core/src/main/native/Rococoa.m +++ b/rococoa-core/src/main/native/Rococoa.m @@ -1,6 +1,6 @@ #include "Rococoa.h" -void callOnMainThread(void (*fn)(), BOOL waitUntilDone) { +void callOnMainThread(void (*fn)(void), BOOL waitUntilDone) { // NSLog(@"callOnMainThread function at address %p", fn); // Pool is required as we're being called from Java, which probably doesn't have a pool to // allocate the NSValue from. @@ -13,7 +13,7 @@ void callOnMainThread(void (*fn)(), BOOL waitUntilDone) { @implementation RococoaHelper : NSObject + (void) callback: (NSValue*) fnAsValue { - void (*fn)() = [fnAsValue pointerValue]; + void (*fn)(void) = [fnAsValue pointerValue]; (*fn)(); } From a623746ccf000bca3ee7b2bd11a0623353a77c0f Mon Sep 17 00:00:00 2001 From: David Kocher Date: Sun, 7 Nov 2021 23:22:52 +0100 Subject: [PATCH 18/36] Fix https://github.com/iterate-ch/rococoa/issues/20 --- .../src/main/java/org/rococoa/Foundation.java | 23 +++++++- .../{Pair.java => MethodFunctionPair.java} | 16 ++++-- .../org/rococoa/internal/MsgSendHandler.java | 55 ++++++++++--------- .../internal/MsgSendInvocationMapper.java | 49 ++++++++--------- .../org/rococoa/internal/MsgSendLibrary.java | 8 ++- 5 files changed, 88 insertions(+), 63 deletions(-) rename rococoa-core/src/main/java/org/rococoa/internal/{Pair.java => MethodFunctionPair.java} (73%) diff --git a/rococoa-core/src/main/java/org/rococoa/Foundation.java b/rococoa-core/src/main/java/org/rococoa/Foundation.java index 00996ae..e366921 100644 --- a/rococoa-core/src/main/java/org/rococoa/Foundation.java +++ b/rococoa-core/src/main/java/org/rococoa/Foundation.java @@ -19,6 +19,7 @@ package org.rococoa; +import java.lang.reflect.Method; import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; @@ -207,21 +208,39 @@ public static Selector selector(String selectorName) { * * Note that you are responsible for memory management if returnType is ID. */ + @SuppressWarnings("unchecked") public static T send(ID receiver, String selectorName, Class returnType, Object... args) { - return send(receiver, selector(selectorName), returnType, args); + return send(receiver, selectorName, returnType, null, args); + } + + @SuppressWarnings("unchecked") + public static T send(ID receiver, String selectorName, Class returnType, Method method, Object... args) { + return send(receiver, selector(selectorName), returnType, method, args); + } + + @SuppressWarnings("unchecked") + public static T send(ID receiver, Selector selector, Class returnType, Object... args) { + return send(receiver, selector, returnType, null, args); } /** * Send message with selector to receiver, passing args, expecting returnType. * * Note that you are responsible for memory management if returnType is ID. + * + * @param returnType Expected return type mapping + * @param method Used to determine if variadic function call is required + * @param args Arguments including ID and selector */ @SuppressWarnings("unchecked") - public static T send(ID receiver, Selector selector, Class returnType, Object... args) { + public static T send(ID receiver, Selector selector, Class returnType, Method method, Object... args) { if (logging.isLoggable(Level.FINEST)) { logging.finest(String.format("sending (%s) %s.%s(%s)", returnType.getSimpleName(), receiver, selector.getName(), new VarArgsUnpacker(args))); } + if (method != null && method.isVarArgs()) { + return (T) messageSendLibrary.syntheticSendVarArgsMessage(returnType, receiver, selector, args); + } return (T) messageSendLibrary.syntheticSendMessage(returnType, receiver, selector, args); } diff --git a/rococoa-core/src/main/java/org/rococoa/internal/Pair.java b/rococoa-core/src/main/java/org/rococoa/internal/MethodFunctionPair.java similarity index 73% rename from rococoa-core/src/main/java/org/rococoa/internal/Pair.java rename to rococoa-core/src/main/java/org/rococoa/internal/MethodFunctionPair.java index 90c550b..a2d594f 100644 --- a/rococoa-core/src/main/java/org/rococoa/internal/Pair.java +++ b/rococoa-core/src/main/java/org/rococoa/internal/MethodFunctionPair.java @@ -19,13 +19,17 @@ package org.rococoa.internal; -public class Pair { +import com.sun.jna.Function; + +import java.lang.reflect.Method; + +public class MethodFunctionPair { - public final T1 a; - public final T2 b; + public final Method method; + public final Function function; - public Pair(T1 a, T2 b) { - this.a = a; - this.b = b; + public MethodFunctionPair(Method method, Function function) { + this.method = method; + this.function = function; } } \ No newline at end of file diff --git a/rococoa-core/src/main/java/org/rococoa/internal/MsgSendHandler.java b/rococoa-core/src/main/java/org/rococoa/internal/MsgSendHandler.java index d1c1861..b92521a 100644 --- a/rococoa-core/src/main/java/org/rococoa/internal/MsgSendHandler.java +++ b/rococoa-core/src/main/java/org/rococoa/internal/MsgSendHandler.java @@ -19,8 +19,8 @@ package org.rococoa.internal; -import com.sun.jna.Function; import com.sun.jna.Library; +import com.sun.jna.NativeLibrary; import com.sun.jna.NativeLong; import com.sun.jna.Structure; import org.rococoa.ID; @@ -28,10 +28,12 @@ import org.rococoa.Selector; import java.lang.reflect.InvocationHandler; +import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.Map; -import java.util.Optional; /** * Very special case InvocationHandler that invokes the correct message dispatch @@ -63,7 +65,6 @@ class MsgSendHandler implements InvocationHandler { * @see com.sun.jna.Function#OPTION_INVOKING_METHOD */ private final String OPTION_INVOKING_METHOD = "invoking-method"; - // TODO - use JNA string when made public private final static int I386_STRET_CUTOFF = 9; private final static int IA64_STRET_CUTOFF = 17; @@ -74,12 +75,15 @@ class MsgSendHandler implements InvocationHandler { public final static boolean PPC = System.getProperty("os.arch").trim().equalsIgnoreCase("ppc"); private final static Method OBJC_MSGSEND; + private final static Method OBJC_MSGSEND_VAR_ARGS; private final static Method OBJC_MSGSEND_STRET; static { try { OBJC_MSGSEND = MsgSendLibrary.class.getDeclaredMethod("objc_msgSend", ID.class, Selector.class, Object[].class); + OBJC_MSGSEND_VAR_ARGS = MsgSendLibrary.class.getDeclaredMethod("objc_msgSend", + ID.class, Selector.class, Object.class, Object[].class); OBJC_MSGSEND_STRET = MsgSendLibrary.class.getDeclaredMethod("objc_msgSend_stret", ID.class, Selector.class, Object[].class); } catch (NoSuchMethodException x) { @@ -87,37 +91,34 @@ class MsgSendHandler implements InvocationHandler { } } - private final Pair objc_msgSend_stret_Pair; - private final Pair objc_msgSend_Pair; + private final MethodFunctionPair objc_msgSend_stret_Pair; + private final MethodFunctionPair objc_msgSend_varArgs_Pair; + private final MethodFunctionPair objc_msgSend_Pair; private final RococoaTypeMapper rococoaTypeMapper = new RococoaTypeMapper(); - public MsgSendHandler(Optional objc_msgSend_Function, Optional objc_msgSend_stret_Function) { - this.objc_msgSend_Pair = new Pair<>(OBJC_MSGSEND, objc_msgSend_Function.orElse(null)); - this.objc_msgSend_stret_Pair = new Pair<>(OBJC_MSGSEND_STRET, objc_msgSend_stret_Function.orElse(null)); + public MsgSendHandler(final NativeLibrary lib) { + this.objc_msgSend_Pair = new MethodFunctionPair(AARCH64 ? null : OBJC_MSGSEND, + lib.getFunction("objc_msgSend")); + this.objc_msgSend_varArgs_Pair = new MethodFunctionPair(OBJC_MSGSEND_VAR_ARGS, + lib.getFunction("objc_msgSend")); + this.objc_msgSend_stret_Pair = new MethodFunctionPair(OBJC_MSGSEND_STRET, + AARCH64 ? null : lib.getFunction("objc_msgSend_stret")); } - public Object invoke(Object proxy, Method method, Object[] args) { + public Object invoke(final Object proxy, final Method method, final Object[] args) { Class returnTypeForThisCall = (Class) args[0]; - Object[] argsWithoutReturnType = this.removeReturnTypeFrom(args); - - - Map options = new HashMap<>(1); - options.put(Library.OPTION_TYPE_MAPPER, rococoaTypeMapper); - - Pair invocation = this.invocationFor(returnTypeForThisCall); - options.put(OPTION_INVOKING_METHOD, invocation.a); - return invocation.b.invoke(returnTypeForThisCall, argsWithoutReturnType, options); + MethodFunctionPair invocation = this.invocationFor(returnTypeForThisCall, MsgSendInvocationMapper.SYNTHETIC_SEND_VARARGS_MSG.equals(method)); + Map options = new HashMap<>(Collections.singletonMap(Library.OPTION_TYPE_MAPPER, rococoaTypeMapper)); + options.put(OPTION_INVOKING_METHOD, invocation.method); + return invocation.function.invoke(returnTypeForThisCall, Arrays.copyOfRange(args, 1, args.length), options); } - private Object[] removeReturnTypeFrom(Object[] args) { - Object[] result = new Object[args.length - 1]; - System.arraycopy(args, 1, result, 0, args.length - 2); - return result; - } - - private Pair invocationFor(Class returnTypeForThisCall) { + private MethodFunctionPair invocationFor(Class returnTypeForThisCall, boolean varArgs) { if (AARCH64) { + if (varArgs) { + return objc_msgSend_varArgs_Pair; + } return objc_msgSend_Pair; } boolean isStruct = Structure.class.isAssignableFrom(returnTypeForThisCall); @@ -131,9 +132,9 @@ private Pair invocationFor(Class returnTypeForThisCall) { return objc_msgSend_stret_Pair; } // on i386 structs with sizeof exactly equal to 1, 2, 4, or 8 return in registers - Structure prototype = (Structure) returnTypeForThisCall.newInstance(); + Structure prototype = (Structure) returnTypeForThisCall.getDeclaredConstructor().newInstance(); return prototype.size() < STRET_CUTOFF ? objc_msgSend_Pair : objc_msgSend_stret_Pair; - } catch (InstantiationException | IllegalAccessException e) { + } catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) { throw new RococoaException(e); } } diff --git a/rococoa-core/src/main/java/org/rococoa/internal/MsgSendInvocationMapper.java b/rococoa-core/src/main/java/org/rococoa/internal/MsgSendInvocationMapper.java index 841331f..c330537 100644 --- a/rococoa-core/src/main/java/org/rococoa/internal/MsgSendInvocationMapper.java +++ b/rococoa-core/src/main/java/org/rococoa/internal/MsgSendInvocationMapper.java @@ -17,53 +17,52 @@ * along with Rococoa. If not, see . */ -/** - * - */ package org.rococoa.internal; -import java.lang.reflect.InvocationHandler; -import java.lang.reflect.Method; -import java.util.Optional; - +import com.sun.jna.InvocationMapper; +import com.sun.jna.NativeLibrary; import org.rococoa.ID; +import org.rococoa.RococoaException; import org.rococoa.Selector; -import com.sun.jna.InvocationMapper; -import com.sun.jna.NativeLibrary; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; /** * A JNA InvocationMapper that maps calls to syntheticSendMessage to a MsgSendHandler. - * + *

* This allows us to dispatch all calls to syntheticSendMessage and have MsgSendHandler * call objc_msgSend or objc_msgSend_stret as appropriate, casting the return * type appropriately. - * + * * @author duncan */ public class MsgSendInvocationMapper implements InvocationMapper { - private final static Method SYNTHETIC_SEND_MSG; + public final static Method SYNTHETIC_SEND_MSG; + public final static Method SYNTHETIC_SEND_VARARGS_MSG; static { try { - SYNTHETIC_SEND_MSG = MsgSendLibrary.class.getDeclaredMethod("syntheticSendMessage", + SYNTHETIC_SEND_MSG = MsgSendLibrary.class.getDeclaredMethod("syntheticSendMessage", Class.class, ID.class, Selector.class, Object[].class); + } catch (Exception e) { + throw new RococoaException("Error retrieving method"); } - catch (Exception e) { - throw new Error("Error retrieving method"); + try { + SYNTHETIC_SEND_VARARGS_MSG = MsgSendLibrary.class.getDeclaredMethod("syntheticSendVarArgsMessage", + Class.class, ID.class, Selector.class, Object[].class); + } catch (Exception e) { + throw new RococoaException("Error retrieving method"); } } - + public InvocationHandler getInvocationHandler(NativeLibrary lib, Method m) { - if (!m.equals(SYNTHETIC_SEND_MSG)) - return null; // default handler - - // Have to late bind this, as it's the only time we get to see lib. - // Not too bad as the results are cached. - return new MsgSendHandler( - Optional.of(lib.getFunction("objc_msgSend")), - MsgSendHandler.AARCH64 ? Optional.ofNullable(null) : Optional.of(lib.getFunction("objc_msgSend_stret"))); + if (m.equals(SYNTHETIC_SEND_MSG) || m.equals(SYNTHETIC_SEND_VARARGS_MSG)) { + // Have to late bind this, as it's the only time we get to see lib. + // Not too bad as the results are cached. + return new MsgSendHandler(lib); + } + return null; // default handler } - } \ No newline at end of file diff --git a/rococoa-core/src/main/java/org/rococoa/internal/MsgSendLibrary.java b/rococoa-core/src/main/java/org/rococoa/internal/MsgSendLibrary.java index 56db174..16ee497 100644 --- a/rococoa-core/src/main/java/org/rococoa/internal/MsgSendLibrary.java +++ b/rococoa-core/src/main/java/org/rococoa/internal/MsgSendLibrary.java @@ -32,8 +32,10 @@ public interface MsgSendLibrary extends Library { // This doesn't exist in the library, but is synthesised by msgSendHandler Object syntheticSendMessage(Class returnType, ID receiver, Selector selector, Object... args); - + Object syntheticSendVarArgsMessage(Class returnType, ID receiver, Selector selector, Object... args); + // We don't call these directly, but through syntheticSendMessage - Object objc_msgSend(ID receiver, Selector selector, Object... args); - Structure objc_msgSend_stret(ID receiver, Selector selector, Object... args); + Object objc_msgSend(ID receiver, Selector selector, Object... args); + Object objc_msgSend(ID receiver, Selector selector, Object arg, Object... args); + Structure objc_msgSend_stret(ID receiver, Selector selector, Object... args); } \ No newline at end of file From a6ece1c2aaecf7e36295623cacd34327929a0674 Mon Sep 17 00:00:00 2001 From: David Kocher Date: Thu, 4 Nov 2021 11:21:32 +0100 Subject: [PATCH 19/36] Add definition for `objc_msgSend_fpret` --- .../src/main/java/org/rococoa/internal/MsgSendHandler.java | 6 ++++++ .../src/main/java/org/rococoa/internal/MsgSendLibrary.java | 1 + 2 files changed, 7 insertions(+) diff --git a/rococoa-core/src/main/java/org/rococoa/internal/MsgSendHandler.java b/rococoa-core/src/main/java/org/rococoa/internal/MsgSendHandler.java index b92521a..4a3794e 100644 --- a/rococoa-core/src/main/java/org/rococoa/internal/MsgSendHandler.java +++ b/rococoa-core/src/main/java/org/rococoa/internal/MsgSendHandler.java @@ -75,6 +75,7 @@ class MsgSendHandler implements InvocationHandler { public final static boolean PPC = System.getProperty("os.arch").trim().equalsIgnoreCase("ppc"); private final static Method OBJC_MSGSEND; + private final static Method OBJC_MSGSEND_FPRET; private final static Method OBJC_MSGSEND_VAR_ARGS; private final static Method OBJC_MSGSEND_STRET; @@ -82,6 +83,8 @@ class MsgSendHandler implements InvocationHandler { try { OBJC_MSGSEND = MsgSendLibrary.class.getDeclaredMethod("objc_msgSend", ID.class, Selector.class, Object[].class); + OBJC_MSGSEND_FPRET = MsgSendLibrary.class.getDeclaredMethod("objc_msgSend_fpret", + ID.class, Selector.class, Object[].class); OBJC_MSGSEND_VAR_ARGS = MsgSendLibrary.class.getDeclaredMethod("objc_msgSend", ID.class, Selector.class, Object.class, Object[].class); OBJC_MSGSEND_STRET = MsgSendLibrary.class.getDeclaredMethod("objc_msgSend_stret", @@ -92,6 +95,7 @@ class MsgSendHandler implements InvocationHandler { } private final MethodFunctionPair objc_msgSend_stret_Pair; + private final Pair objc_msgSend_fpret_Pair; private final MethodFunctionPair objc_msgSend_varArgs_Pair; private final MethodFunctionPair objc_msgSend_Pair; @@ -100,6 +104,8 @@ class MsgSendHandler implements InvocationHandler { public MsgSendHandler(final NativeLibrary lib) { this.objc_msgSend_Pair = new MethodFunctionPair(AARCH64 ? null : OBJC_MSGSEND, lib.getFunction("objc_msgSend")); + this.objc_msgSend_fpret_Pair = new MethodFunctionPair(OBJC_MSGSEND_FPRET, + lib.getFunction("objc_msgSend_fpret")); this.objc_msgSend_varArgs_Pair = new MethodFunctionPair(OBJC_MSGSEND_VAR_ARGS, lib.getFunction("objc_msgSend")); this.objc_msgSend_stret_Pair = new MethodFunctionPair(OBJC_MSGSEND_STRET, diff --git a/rococoa-core/src/main/java/org/rococoa/internal/MsgSendLibrary.java b/rococoa-core/src/main/java/org/rococoa/internal/MsgSendLibrary.java index 16ee497..fd0497e 100644 --- a/rococoa-core/src/main/java/org/rococoa/internal/MsgSendLibrary.java +++ b/rococoa-core/src/main/java/org/rococoa/internal/MsgSendLibrary.java @@ -36,6 +36,7 @@ public interface MsgSendLibrary extends Library { // We don't call these directly, but through syntheticSendMessage Object objc_msgSend(ID receiver, Selector selector, Object... args); + Structure objc_msgSend_fpret(ID receiver, Selector selector, Object... args); Object objc_msgSend(ID receiver, Selector selector, Object arg, Object... args); Structure objc_msgSend_stret(ID receiver, Selector selector, Object... args); } \ No newline at end of file From 3d47947cfa9536c01c3549ddd5636e5c4b97e05b Mon Sep 17 00:00:00 2001 From: David Kocher Date: Thu, 4 Nov 2021 11:21:32 +0100 Subject: [PATCH 20/36] Fix https://github.com/iterate-ch/rococoa/issues/20 bump version --- .github/workflows/maven.yml | 4 ++-- README.md | 3 ++- pom.xml | 2 +- rococoa-auto/pom.xml | 2 +- rococoa-cocoa/pom.xml | 2 +- rococoa-contrib/pom.xml | 2 +- rococoa-core/pom.xml | 21 +++++++++++++------ .../org/rococoa/internal/MsgSendHandler.java | 6 ++++++ .../org/rococoa/internal/MsgSendLibrary.java | 1 + rococoa-functionaltest/pom.xml | 2 +- 10 files changed, 31 insertions(+), 14 deletions(-) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 77431ec..246663a 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -5,9 +5,9 @@ name: Java CI with Maven on: push: - branches: [ master ] + branches: [ develop ] pull_request: - branches: [ master ] + branches: [ develop ] jobs: build: diff --git a/README.md b/README.md index ee6c2da..e70319b 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,8 @@ implementation of Objective-C interfaces in Java. ## Limitation -* float +* obj-c class's method call with float argument don't work + * i found [the reason](https://github.com/java-native-access/jna/issues/463#issuecomment-1286015013) * block ## TODO diff --git a/pom.xml b/pom.xml index 2820a1e..bb906b0 100644 --- a/pom.xml +++ b/pom.xml @@ -216,7 +216,7 @@ org.junit junit-bom - 5.8.2 + 5.9.0 pom import diff --git a/rococoa-auto/pom.xml b/rococoa-auto/pom.xml index 965276f..d4374f0 100644 --- a/rococoa-auto/pom.xml +++ b/rococoa-auto/pom.xml @@ -10,7 +10,7 @@ org.rococoa rococoa-parent - 0.8.4 + 0.8.5-SNAPSHOT Rococoa Autogenerated Cocoa Package diff --git a/rococoa-cocoa/pom.xml b/rococoa-cocoa/pom.xml index 5c3c46b..0aa9c53 100644 --- a/rococoa-cocoa/pom.xml +++ b/rococoa-cocoa/pom.xml @@ -10,7 +10,7 @@ org.rococoa rococoa-parent - 0.8.4 + 0.8.5-SNAPSHOT Rococoa Cocoa Mappings diff --git a/rococoa-contrib/pom.xml b/rococoa-contrib/pom.xml index 497a10f..bba96c6 100644 --- a/rococoa-contrib/pom.xml +++ b/rococoa-contrib/pom.xml @@ -10,7 +10,7 @@ org.rococoa rococoa-parent - 0.8.4 + 0.8.5-SNAPSHOT Rococoa Contrib diff --git a/rococoa-core/pom.xml b/rococoa-core/pom.xml index 396ec0a..81d0a5c 100644 --- a/rococoa-core/pom.xml +++ b/rococoa-core/pom.xml @@ -9,7 +9,7 @@ org.rococoa rococoa-parent - 0.8.4 + 0.8.5-SNAPSHOT Rococoa Core @@ -119,11 +119,6 @@ maven-surefire-plugin 3.0.0-M7 - - - **/TestStruct*.java - once false true @@ -208,6 +203,13 @@ + + + jitpack.io + https://jitpack.io + + + net.java.dev.jna @@ -217,5 +219,12 @@ cglib cglib + + + com.github.umjammer + vavi-commons + 1.1.6 + test + diff --git a/rococoa-core/src/main/java/org/rococoa/internal/MsgSendHandler.java b/rococoa-core/src/main/java/org/rococoa/internal/MsgSendHandler.java index b92521a..4a3794e 100644 --- a/rococoa-core/src/main/java/org/rococoa/internal/MsgSendHandler.java +++ b/rococoa-core/src/main/java/org/rococoa/internal/MsgSendHandler.java @@ -75,6 +75,7 @@ class MsgSendHandler implements InvocationHandler { public final static boolean PPC = System.getProperty("os.arch").trim().equalsIgnoreCase("ppc"); private final static Method OBJC_MSGSEND; + private final static Method OBJC_MSGSEND_FPRET; private final static Method OBJC_MSGSEND_VAR_ARGS; private final static Method OBJC_MSGSEND_STRET; @@ -82,6 +83,8 @@ class MsgSendHandler implements InvocationHandler { try { OBJC_MSGSEND = MsgSendLibrary.class.getDeclaredMethod("objc_msgSend", ID.class, Selector.class, Object[].class); + OBJC_MSGSEND_FPRET = MsgSendLibrary.class.getDeclaredMethod("objc_msgSend_fpret", + ID.class, Selector.class, Object[].class); OBJC_MSGSEND_VAR_ARGS = MsgSendLibrary.class.getDeclaredMethod("objc_msgSend", ID.class, Selector.class, Object.class, Object[].class); OBJC_MSGSEND_STRET = MsgSendLibrary.class.getDeclaredMethod("objc_msgSend_stret", @@ -92,6 +95,7 @@ class MsgSendHandler implements InvocationHandler { } private final MethodFunctionPair objc_msgSend_stret_Pair; + private final Pair objc_msgSend_fpret_Pair; private final MethodFunctionPair objc_msgSend_varArgs_Pair; private final MethodFunctionPair objc_msgSend_Pair; @@ -100,6 +104,8 @@ class MsgSendHandler implements InvocationHandler { public MsgSendHandler(final NativeLibrary lib) { this.objc_msgSend_Pair = new MethodFunctionPair(AARCH64 ? null : OBJC_MSGSEND, lib.getFunction("objc_msgSend")); + this.objc_msgSend_fpret_Pair = new MethodFunctionPair(OBJC_MSGSEND_FPRET, + lib.getFunction("objc_msgSend_fpret")); this.objc_msgSend_varArgs_Pair = new MethodFunctionPair(OBJC_MSGSEND_VAR_ARGS, lib.getFunction("objc_msgSend")); this.objc_msgSend_stret_Pair = new MethodFunctionPair(OBJC_MSGSEND_STRET, diff --git a/rococoa-core/src/main/java/org/rococoa/internal/MsgSendLibrary.java b/rococoa-core/src/main/java/org/rococoa/internal/MsgSendLibrary.java index 16ee497..fd0497e 100644 --- a/rococoa-core/src/main/java/org/rococoa/internal/MsgSendLibrary.java +++ b/rococoa-core/src/main/java/org/rococoa/internal/MsgSendLibrary.java @@ -36,6 +36,7 @@ public interface MsgSendLibrary extends Library { // We don't call these directly, but through syntheticSendMessage Object objc_msgSend(ID receiver, Selector selector, Object... args); + Structure objc_msgSend_fpret(ID receiver, Selector selector, Object... args); Object objc_msgSend(ID receiver, Selector selector, Object arg, Object... args); Structure objc_msgSend_stret(ID receiver, Selector selector, Object... args); } \ No newline at end of file diff --git a/rococoa-functionaltest/pom.xml b/rococoa-functionaltest/pom.xml index 8529b0f..7638ee8 100644 --- a/rococoa-functionaltest/pom.xml +++ b/rococoa-functionaltest/pom.xml @@ -9,7 +9,7 @@ org.rococoa rococoa-parent - 0.8.3-SNAPSHOT + 0.8.5-SNAPSHOT Rococoa Functional Test From 4ceaa12031482ac12b41b46aa308d72bd2db4646 Mon Sep 17 00:00:00 2001 From: Naohide Sano Date: Fri, 21 Oct 2022 04:51:22 +0900 Subject: [PATCH 21/36] update about test --- .../src/main/java/org/rococoa/Foundation.java | 4 +- .../src/main/java/org/rococoa/ObjCBlock.java | 26 ++++++----- .../src/main/java/org/rococoa/ObjCBlocks.java | 46 +++++++++++++++++-- .../org/rococoa/internal/MsgSendHandler.java | 18 ++++++-- .../org/rococoa/internal/MsgSendLibrary.java | 4 +- 5 files changed, 71 insertions(+), 27 deletions(-) diff --git a/rococoa-core/src/main/java/org/rococoa/Foundation.java b/rococoa-core/src/main/java/org/rococoa/Foundation.java index e366921..c9e4ad0 100644 --- a/rococoa-core/src/main/java/org/rococoa/Foundation.java +++ b/rococoa-core/src/main/java/org/rococoa/Foundation.java @@ -208,17 +208,14 @@ public static Selector selector(String selectorName) { * * Note that you are responsible for memory management if returnType is ID. */ - @SuppressWarnings("unchecked") public static T send(ID receiver, String selectorName, Class returnType, Object... args) { return send(receiver, selectorName, returnType, null, args); } - @SuppressWarnings("unchecked") public static T send(ID receiver, String selectorName, Class returnType, Method method, Object... args) { return send(receiver, selector(selectorName), returnType, method, args); } - @SuppressWarnings("unchecked") public static T send(ID receiver, Selector selector, Class returnType, Object... args) { return send(receiver, selector, returnType, null, args); } @@ -241,6 +238,7 @@ public static T send(ID receiver, Selector selector, Class returnType, Me if (method != null && method.isVarArgs()) { return (T) messageSendLibrary.syntheticSendVarArgsMessage(returnType, receiver, selector, args); } +logging.info("@@@0: " + new VarArgsUnpacker(args)); return (T) messageSendLibrary.syntheticSendMessage(returnType, receiver, selector, args); } diff --git a/rococoa-core/src/main/java/org/rococoa/ObjCBlock.java b/rococoa-core/src/main/java/org/rococoa/ObjCBlock.java index b7b055c..b3e5b14 100644 --- a/rococoa-core/src/main/java/org/rococoa/ObjCBlock.java +++ b/rococoa-core/src/main/java/org/rococoa/ObjCBlock.java @@ -28,6 +28,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + package org.rococoa; import com.sun.jna.Pointer; @@ -36,16 +37,17 @@ public abstract class ObjCBlock implements ObjCObject, Callback { Pointer pCallback; - //static final int CALLBACK_CONSTRUCTOR_ID = -2; - /*protected C callback; - public ObjCBlock(C callback) { - super(CALLBACK_CONSTRUCTOR_ID, callback); - this.callback = callback; // retain a reference - } - public ObjCBlock() { - super(); - assert callback != null; // set by parent constructor - } - * - */ + +/* + static final int CALLBACK_CONSTRUCTOR_ID = -2; + protected C callback; + public ObjCBlock(C callback) { + super(CALLBACK_CONSTRUCTOR_ID, callback); + this.callback = callback; // retain a reference + } + public ObjCBlock() { + super(); + assert callback != null; // set by parent constructor + } +*/ } diff --git a/rococoa-core/src/main/java/org/rococoa/ObjCBlocks.java b/rococoa-core/src/main/java/org/rococoa/ObjCBlocks.java index deedbdd..6fdc5cc 100644 --- a/rococoa-core/src/main/java/org/rococoa/ObjCBlocks.java +++ b/rococoa-core/src/main/java/org/rococoa/ObjCBlocks.java @@ -7,7 +7,7 @@ * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: - * + * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright @@ -16,7 +16,7 @@ * * Neither the name of Olivier Chafik nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. - * + * * THIS SOFTWARE IS PROVIDED BY OLIVIER CHAFIK AND CONTRIBUTORS ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE @@ -28,13 +28,49 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + package org.rococoa; +import com.sun.jna.Callback; +import com.sun.jna.Native; +import com.sun.jna.Pointer; +import org.rococoa.internal.RococoaLibrary; + + public class ObjCBlocks { - static synchronized native long createObjCBlockWithFunctionPointer(long fptr); + private static final RococoaLibrary rococoaLibrary; + + static { + rococoaLibrary = Native.load("rococoa", RococoaLibrary.class); + } + + /** */ + static synchronized Pointer createObjCBlockWithFunctionPointer(Pointer pcb) { + Pointer pointer = new Pointer(rococoaLibrary.createObjCBlockWithFunctionPointer(Pointer.nativeValue(pcb))); + Runtime.getRuntime().addShutdownHook(new Thread(() -> { + releaseObjCBlock(pointer); + })); + return pointer; + } + + /** */ + static synchronized Pointer getObjCBlockFunctionPointer(Pointer blockPtr) { + return new Pointer(rococoaLibrary.getObjCBlockFunctionPointer(Pointer.nativeValue(blockPtr))); + } + + /** */ + static synchronized void releaseObjCBlock(Pointer pBlock) { + rococoaLibrary.releaseObjCBlock(Pointer.nativeValue(pBlock)); + } + + void x(ObjCObject instance) { + if (instance instanceof ObjCBlock) { - static synchronized native long getObjCBlockFunctionPointer(long blockPtr); +// Pointer pcb = registerCallbackInstance((Callback) instance); +// ((ObjCBlock) instance).pCallback = pcb; - static synchronized native void releaseObjCBlock(long blockPtr); +// Pointer pBlock = createObjCBlockWithFunctionPointer(pcb); + } + } } diff --git a/rococoa-core/src/main/java/org/rococoa/internal/MsgSendHandler.java b/rococoa-core/src/main/java/org/rococoa/internal/MsgSendHandler.java index 4a3794e..4e52fb1 100644 --- a/rococoa-core/src/main/java/org/rococoa/internal/MsgSendHandler.java +++ b/rococoa-core/src/main/java/org/rococoa/internal/MsgSendHandler.java @@ -34,6 +34,8 @@ import java.util.Collections; import java.util.HashMap; import java.util.Map; +import java.util.logging.Logger; + /** * Very special case InvocationHandler that invokes the correct message dispatch @@ -61,10 +63,12 @@ */ class MsgSendHandler implements InvocationHandler { + private static Logger logging = Logger.getLogger("org.rococoa.foundation"); + /** - * @see com.sun.jna.Function#OPTION_INVOKING_METHOD + * @see "com.sun.jna.Function#OPTION_INVOKING_METHOD" */ - private final String OPTION_INVOKING_METHOD = "invoking-method"; + private static final String OPTION_INVOKING_METHOD = "invoking-method"; private final static int I386_STRET_CUTOFF = 9; private final static int IA64_STRET_CUTOFF = 17; @@ -95,13 +99,14 @@ class MsgSendHandler implements InvocationHandler { } private final MethodFunctionPair objc_msgSend_stret_Pair; - private final Pair objc_msgSend_fpret_Pair; + // only for i386 https://github.com/jspahrsummers/ObjectiveHaskell/issues/22 + private final MethodFunctionPair objc_msgSend_fpret_Pair; private final MethodFunctionPair objc_msgSend_varArgs_Pair; private final MethodFunctionPair objc_msgSend_Pair; private final RococoaTypeMapper rococoaTypeMapper = new RococoaTypeMapper(); - public MsgSendHandler(final NativeLibrary lib) { + public MsgSendHandler(NativeLibrary lib) { this.objc_msgSend_Pair = new MethodFunctionPair(AARCH64 ? null : OBJC_MSGSEND, lib.getFunction("objc_msgSend")); this.objc_msgSend_fpret_Pair = new MethodFunctionPair(OBJC_MSGSEND_FPRET, @@ -112,7 +117,10 @@ public MsgSendHandler(final NativeLibrary lib) { AARCH64 ? null : lib.getFunction("objc_msgSend_stret")); } - public Object invoke(final Object proxy, final Method method, final Object[] args) { + public Object invoke(Object proxy, Method method, Object[] args) { +if (((Selector)args[2]).getName().equals("testGetFloatByValue:")) { + new Exception("@@@1: " + new VarArgsUnpacker(args)).printStackTrace(); +} Class returnTypeForThisCall = (Class) args[0]; MethodFunctionPair invocation = this.invocationFor(returnTypeForThisCall, MsgSendInvocationMapper.SYNTHETIC_SEND_VARARGS_MSG.equals(method)); Map options = new HashMap<>(Collections.singletonMap(Library.OPTION_TYPE_MAPPER, rococoaTypeMapper)); diff --git a/rococoa-core/src/main/java/org/rococoa/internal/MsgSendLibrary.java b/rococoa-core/src/main/java/org/rococoa/internal/MsgSendLibrary.java index fd0497e..785097b 100644 --- a/rococoa-core/src/main/java/org/rococoa/internal/MsgSendLibrary.java +++ b/rococoa-core/src/main/java/org/rococoa/internal/MsgSendLibrary.java @@ -31,8 +31,8 @@ */ public interface MsgSendLibrary extends Library { // This doesn't exist in the library, but is synthesised by msgSendHandler - Object syntheticSendMessage(Class returnType, ID receiver, Selector selector, Object... args); - Object syntheticSendVarArgsMessage(Class returnType, ID receiver, Selector selector, Object... args); + Object syntheticSendMessage(Class returnType, ID receiver, Selector selector, Object... args); + Object syntheticSendVarArgsMessage(Class returnType, ID receiver, Selector selector, Object... args); // We don't call these directly, but through syntheticSendMessage Object objc_msgSend(ID receiver, Selector selector, Object... args); From 89061ad8a566363c9c482e815ef86985f7c0608e Mon Sep 17 00:00:00 2001 From: Naohide Sano Date: Fri, 21 Oct 2022 04:59:06 +0900 Subject: [PATCH 22/36] update github workflows settings --- .github/workflows/maven.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 246663a..f429917 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -21,4 +21,4 @@ jobs: with: java-version: 1.8 - name: Build with Maven - run: mvn -B package --file pom.xml + run: mvn -B install --file pom.xml From e21faafbd768521b96604386f7dd5ed193562358 Mon Sep 17 00:00:00 2001 From: David Kocher Date: Mon, 24 Oct 2022 12:39:44 +0900 Subject: [PATCH 23/36] Use CFIndex return value for retain count. --- .../src/main/java/org/rococoa/Foundation.java | 2 +- .../src/main/java/org/rococoa/Rococoa.java | 13 +++++++------ .../rococoa/cocoa/foundation/NSObject.java | 4 +++- .../rococoa/internal/FoundationLibrary.java | 2 +- .../internal/ObjCObjectInvocationHandler.java | 15 ++++++++------- .../RococoaObjCObjectByReferenceTest.java | 10 +++++----- .../org/rococoa/test/RococoaTestCase.java | 19 +++++++++---------- 7 files changed, 34 insertions(+), 31 deletions(-) diff --git a/rococoa-core/src/main/java/org/rococoa/Foundation.java b/rococoa-core/src/main/java/org/rococoa/Foundation.java index c9e4ad0..d5fceb0 100644 --- a/rococoa-core/src/main/java/org/rococoa/Foundation.java +++ b/rococoa-core/src/main/java/org/rococoa/Foundation.java @@ -150,7 +150,7 @@ public static void cfRelease(ID id) { foundationLibrary.CFRelease(id); } - public static int cfGetRetainCount(ID cfTypeRef) { + public static CFIndex cfGetRetainCount(ID cfTypeRef) { return foundationLibrary.CFGetRetainCount(cfTypeRef); } diff --git a/rococoa-core/src/main/java/org/rococoa/Rococoa.java b/rococoa-core/src/main/java/org/rococoa/Rococoa.java index 84ef2df..6970e9d 100644 --- a/rococoa-core/src/main/java/org/rococoa/Rococoa.java +++ b/rococoa-core/src/main/java/org/rococoa/Rococoa.java @@ -25,6 +25,7 @@ import net.sf.cglib.core.Predicate; import net.sf.cglib.proxy.Enhancer; +import org.rococoa.cocoa.CFIndex; import org.rococoa.internal.OCInvocationCallbacks; import org.rococoa.internal.ObjCObjectInvocationHandler; import org.rococoa.internal.VarArgsUnpacker; @@ -40,7 +41,7 @@ */ public abstract class Rococoa { - private static Logger logging = Logger.getLogger("org.rococoa.proxy"); + private static final Logger logging = Logger.getLogger("org.rococoa.proxy"); /** * Create a Java NSClass representing the Objective-C class with ocClassName @@ -84,9 +85,9 @@ private static T create(String ocClassName, Class java } ID ocClass = Foundation.getClass(ocClassName); ID ocInstance = Foundation.send(ocClass, ocFactoryName, ID.class, args); - int initialRetainCount = Foundation.cfGetRetainCount(ocInstance); + CFIndex initialRetainCount = Foundation.cfGetRetainCount(ocInstance); T result = wrap(ocInstance, javaClass, retain); - checkRetainCount(ocInstance, retain ? initialRetainCount + 1 : initialRetainCount); + checkRetainCount(ocInstance, retain ? initialRetainCount.intValue() + 1 : initialRetainCount.intValue()); return result; } @@ -203,9 +204,9 @@ public ProxyID(ID anotherID, OCInvocationCallbacks callbacks) { } private static void checkRetainCount(ID ocInstance, int expected) { - int retainCount = Foundation.cfGetRetainCount(ocInstance); - if (retainCount != expected) { - throw new IllegalStateException("Created an object which had a retain count of " + retainCount + " not " + expected); + CFIndex retainCount = Foundation.cfGetRetainCount(ocInstance); + if (retainCount.intValue() != expected) { + logging.warning("Created an object which had a retain count of " + retainCount + " not " + expected); } } diff --git a/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSObject.java b/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSObject.java index 4c479e5..76f2fe4 100644 --- a/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSObject.java +++ b/rococoa-core/src/main/java/org/rococoa/cocoa/foundation/NSObject.java @@ -24,6 +24,8 @@ import org.rococoa.ObjCObject; import org.rococoa.Rococoa; import org.rococoa.Selector; +import org.rococoa.cocoa.CFIndex; + public abstract class NSObject implements ObjCObject { public static _class_ CLASS = Rococoa.createClass("NSObject", _class_.class); @@ -34,7 +36,7 @@ public static abstract class _class_ implements ObjCClass { public abstract NSObject retain(); public abstract void release(); - public abstract int retainCount(); + public abstract CFIndex retainCount(); public abstract boolean isKindOfClass(ObjCClass nsClass); public abstract boolean isKindOfClass(ID nsClass); diff --git a/rococoa-core/src/main/java/org/rococoa/internal/FoundationLibrary.java b/rococoa-core/src/main/java/org/rococoa/internal/FoundationLibrary.java index cc594ed..753d0a9 100644 --- a/rococoa-core/src/main/java/org/rococoa/internal/FoundationLibrary.java +++ b/rococoa-core/src/main/java/org/rococoa/internal/FoundationLibrary.java @@ -41,7 +41,7 @@ public interface FoundationLibrary extends Library { ID CFRetain(ID cfTypeRef); void CFRelease(ID cfTypeRef); - int CFGetRetainCount (ID cfTypeRef); + CFIndex CFGetRetainCount(ID cfTypeRef); ID objc_getClass(String className); ID class_createInstance(ID pClass, int extraBytes); diff --git a/rococoa-core/src/main/java/org/rococoa/internal/ObjCObjectInvocationHandler.java b/rococoa-core/src/main/java/org/rococoa/internal/ObjCObjectInvocationHandler.java index 8d7e53a..f27bfd5 100644 --- a/rococoa-core/src/main/java/org/rococoa/internal/ObjCObjectInvocationHandler.java +++ b/rococoa-core/src/main/java/org/rococoa/internal/ObjCObjectInvocationHandler.java @@ -46,6 +46,7 @@ import java.util.logging.Logger; import com.sun.jna.Pointer; +import org.rococoa.cocoa.CFIndex; /** * Listens to invocations of methods on a Java NSObject, and forwards them to @@ -59,7 +60,7 @@ public class ObjCObjectInvocationHandler implements InvocationHandler, MethodInt private static final int FINALIZE_AUTORELEASE_BATCH_SIZE = 1000; - private static Logger logging = Logger.getLogger("org.rococoa.proxy"); + private static final Logger logging = Logger.getLogger("org.rococoa.proxy"); static final Method OBJECT_TOSTRING; static final Method OBJECT_HASHCODE; @@ -92,9 +93,9 @@ public ObjCObjectInvocationHandler(final ID ocInstance, Class Date: Mon, 24 Oct 2022 17:07:43 +0900 Subject: [PATCH 24/36] update github ci settings --- .github/workflows/maven-publish.yml | 6 ++++-- .github/workflows/maven.yml | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/.github/workflows/maven-publish.yml b/.github/workflows/maven-publish.yml index 882ba89..28c8038 100644 --- a/.github/workflows/maven-publish.yml +++ b/.github/workflows/maven-publish.yml @@ -15,9 +15,11 @@ jobs: steps: - uses: actions/checkout@v2 - name: Set up JDK 1.8 - uses: actions/setup-java@v1 + uses: actions/setup-java@v2 with: - java-version: 1.8 + java-version: '8' + distribution: 'adopt' + cache: maven server-id: github # Value of the distributionManagement/repository/id field of the pom.xml settings-path: ${{ github.workspace }} # location for the settings.xml file diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index f429917..0802814 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -17,8 +17,10 @@ jobs: steps: - uses: actions/checkout@v2 - name: Set up JDK 1.8 - uses: actions/setup-java@v1 + uses: actions/setup-java@v2 with: - java-version: 1.8 + java-version: '8' + distribution: 'adopt' + cache: maven - name: Build with Maven run: mvn -B install --file pom.xml From 30fa893fec50a5060e63a901401e01190fa9bda6 Mon Sep 17 00:00:00 2001 From: Naohide Sano Date: Mon, 24 Oct 2022 17:08:46 +0900 Subject: [PATCH 25/36] update settings --- README.md | 14 ++++++++--- pom.xml | 13 +++++++---- rococoa-cocoa/pom.xml | 23 +++++++++++++++++-- .../src/test/resources/logging.properties | 8 +++++++ rococoa-contrib/pom.xml | 5 +++- .../src/test/resources/logging.properties | 3 ++- rococoa-core/pom.xml | 6 +++-- 7 files changed, 58 insertions(+), 14 deletions(-) create mode 100644 rococoa-cocoa/src/test/resources/logging.properties diff --git a/README.md b/README.md index e70319b..dfbd284 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ implementation of Objective-C interfaces in Java. ## How To * [Basics](rococoa-core/readme.md#how-to) -* [CGFilter Java2D BufferedImageOp](rococoa-contrib/src/test/java/org/rococoa/cocoa/coreimage/CoreImageTest.java) +* [CIFilter Java2D BufferedImageOp](rococoa-contrib/src/test/java/org/rococoa/cocoa/coreimage/CoreImageTest.java) * [CoreML](rococoa-contrib/src/test/java/org/rococoa/cocoa/coreml/CoreMLTest.java) * [iTunes Library](https://github.com/umjammer/vavi-sound-sandbox/tree/master/src/main/java/vavix/rococoa/ituneslibrary) * [AudioUnit Java MIDI SPI synthesizer](https://github.com/umjammer/vavi-sound-sandbox/tree/master/src/main/java/vavi/sound/midi/rococoa) @@ -31,19 +31,27 @@ implementation of Objective-C interfaces in Java. ## Limitation -* obj-c class's method call with float argument don't work +* obj-c class's method call with float argument doesn't work * i found [the reason](https://github.com/java-native-access/jna/issues/463#issuecomment-1286015013) * block ## TODO -* https://github.com/ibinti/bugvm * NSUrl tags (wip) * block (wip) * http://cocoawithlove.com/2009/10/how-blocks-are-implemented-and.html * http://www.opensource.apple.com/source/libclosure/libclosure-38/BlockImplementation.txt * ~~CIFilter~~ (done) + +## References + +* https://github.com/ibinti/bugvm * https://gitlab.com/axet/apple +* https://github.com/cbyrneee/JNApple +* https://github.com/multi-os-engine/moe-mac-core +* https://github.com/dthommes/jcocoa +* https://github.com/allertonm/Couverjure +* https://github.com/shannah/Java-Objective-C-Bridge ---- diff --git a/pom.xml b/pom.xml index bb906b0..17c6fd7 100644 --- a/pom.xml +++ b/pom.xml @@ -148,16 +148,19 @@ jar + + -J-Duser.language=en_US + + + -Xdoclint:none + -Xdoclint:-missing + false false false false - - -J-Duser.language=en_US - -Xdoclint:none - -Xdoclint:-missing - none + true diff --git a/rococoa-cocoa/pom.xml b/rococoa-cocoa/pom.xml index 0aa9c53..a0d9759 100644 --- a/rococoa-cocoa/pom.xml +++ b/rococoa-cocoa/pom.xml @@ -19,13 +19,19 @@ + org.apache.maven.plugins maven-dependency-plugin + 3.3.0 + org.apache.maven.plugins maven-surefire-plugin - 3.0.0-M5 + 3.0.0-M7 once + + -Djava.util.logging.config.file=${project.build.testOutputDirectory}/logging.properties + false true @@ -33,17 +39,30 @@ + + + jitpack.io + https://jitpack.io + + + org.rococoa rococoa-core + org.rococoa rococoa-core test-jar test + + com.github.umjammer + vavi-commons + 1.1.7 + test + - diff --git a/rococoa-cocoa/src/test/resources/logging.properties b/rococoa-cocoa/src/test/resources/logging.properties new file mode 100644 index 0000000..befa6b4 --- /dev/null +++ b/rococoa-cocoa/src/test/resources/logging.properties @@ -0,0 +1,8 @@ +handlers=java.util.logging.ConsoleHandler +.level=INFO +java.util.logging.ConsoleHandler.level=ALL +java.util.logging.ConsoleHandler.formatter=vavi.util.logging.VaviFormatter + +vavi.util.level=FINE +org.rococoa.level=INFO +org.rococoa.foundation.level=INFO diff --git a/rococoa-contrib/pom.xml b/rococoa-contrib/pom.xml index bba96c6..43316b3 100644 --- a/rococoa-contrib/pom.xml +++ b/rococoa-contrib/pom.xml @@ -29,6 +29,9 @@ 3.0.0-M7 once + + -Djava.util.logging.config.file=${project.build.testOutputDirectory}/logging.properties + false true @@ -67,7 +70,7 @@ com.github.umjammer vavi-commons - 1.1.6 + 1.1.7 test diff --git a/rococoa-contrib/src/test/resources/logging.properties b/rococoa-contrib/src/test/resources/logging.properties index 59254c0..59329b7 100644 --- a/rococoa-contrib/src/test/resources/logging.properties +++ b/rococoa-contrib/src/test/resources/logging.properties @@ -4,4 +4,5 @@ java.util.logging.ConsoleHandler.level=ALL java.util.logging.ConsoleHandler.formatter=vavi.util.logging.VaviFormatter vavi.util.level=FINE -org.rococoa.level=FINE \ No newline at end of file +org.rococoa.level=ALL +org.rococoa.foundation.level=FINEST diff --git a/rococoa-core/pom.xml b/rococoa-core/pom.xml index 81d0a5c..f6c716c 100644 --- a/rococoa-core/pom.xml +++ b/rococoa-core/pom.xml @@ -27,7 +27,6 @@ org.rococoa.Rococoa - org.rococoa.ObjCBlocks true @@ -120,6 +119,9 @@ 3.0.0-M7 once + + -Djava.util.logging.config.file=${project.build.testOutputDirectory}/logging.properties + false true @@ -223,7 +225,7 @@ com.github.umjammer vavi-commons - 1.1.6 + 1.1.7 test From 487cb143e8dc864d69626090b1e699e0a5efe542 Mon Sep 17 00:00:00 2001 From: Naohide Sano Date: Sat, 5 Nov 2022 16:14:17 +0900 Subject: [PATCH 26/36] [speech] review tests --- .../cocoa/appkit/NSSpeechSynthesizer.java | 576 +++++++++++------- .../cocoa/appkit/NSSpeechSynthesizerTest.java | 5 +- .../org/rococoa/cocoa/appkit/NSVoiceTest.java | 1 - 3 files changed, 359 insertions(+), 223 deletions(-) diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSSpeechSynthesizer.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSSpeechSynthesizer.java index 45f9747..9cb4fbf 100755 --- a/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSSpeechSynthesizer.java +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSSpeechSynthesizer.java @@ -22,14 +22,12 @@ import java.net.URI; import java.util.ArrayList; import java.util.List; +import java.util.logging.Logger; - -import org.rococoa.contrib.AbstractPropertyDictionary; import org.rococoa.ID; import org.rococoa.ObjCClass; import org.rococoa.ObjCObject; import org.rococoa.ObjCObjectByReference; -import org.rococoa.contrib.NativeEnum; import org.rococoa.Rococoa; import org.rococoa.cocoa.foundation.NSArray; import org.rococoa.cocoa.foundation.NSDictionary; @@ -41,37 +39,35 @@ import org.rococoa.cocoa.foundation.NSString; import org.rococoa.cocoa.foundation.NSUInteger; import org.rococoa.cocoa.foundation.NSURL; -//import org.rococoa.RunOnMainThread; +import org.rococoa.cocoa.vision.VNDetectHumanBodyPoseRequest; +import org.rococoa.contrib.AbstractPropertyDictionary; +import org.rococoa.contrib.NativeEnum; -/** Provides access to Cocoa NSSpeechSynthesizer. - * Methods have been wrapped to take and return natural Java types. - * Convenience methods and wrapper classes have been implemented for property and NSDictionary based datastructures. + +/** + * Provides access to Cocoa NSSpeechSynthesizer. + * Methods have been wrapped to take and return natural Java types. + * Convenience methods and wrapper classes have been implemented for property and NSDictionary based datastructures. */ -//@RunOnMainThread public abstract class NSSpeechSynthesizer extends NSObject { - /** Defines the properties associated with a speech synthesizer. Getters and setters have been provided for most of these, - * so using the properties directly will not usually be necessary. - * @see NSSpeechSynthesizer#getProperty(NSSpeechSynthesizer.SpeechProperty) - * @see NSSpeechSynthesizer#setProperty(SpeechProperty, NSObject) + + private static final Logger logger = Logger.getLogger(NSSpeechSynthesizer.class.getName()); + + /** + * Defines the properties associated with a speech synthesizer. Getters and setters have been provided for most of these, + * so using the properties directly will not usually be necessary. + * + * @see NSSpeechSynthesizer#getProperty(NSSpeechSynthesizer.SpeechProperty) + * @see NSSpeechSynthesizer#setProperty(SpeechProperty, NSObject) */ public enum SpeechProperty implements NativeEnum { - StatusProperty, - ErrorsProperty, - InputModeProperty, - CharacterModeProperty, - NumberModeProperty, - RateProperty, - PitchBaseProperty, - PitchModProperty, - VolumeProperty, - SynthesizerInfoProperty, - RecentSyncProperty, - PhonemeSymbolsProperty, - CurrentVoiceProperty, - CommandDelimiterProperty, - ResetProperty, - OutputToFileURLProperty; - private final NSString value = NSString.getGlobalString("NSSpeech" + name()); + StatusProperty, ErrorsProperty, InputModeProperty, CharacterModeProperty, + NumberModeProperty, RateProperty, PitchBaseProperty, PitchModProperty, + VolumeProperty, SynthesizerInfoProperty, RecentSyncProperty, PhonemeSymbolsProperty, + CurrentVoiceProperty, CommandDelimiterProperty, ResetProperty, OutputToFileURLProperty; + + private final NSString value = NSString.getGlobalString("NSSpeech" + name()); + public NSString getNativeValue() { return value; } @@ -80,105 +76,140 @@ public NSString getNativeValue() { public String toString() { return super.toString() + " (" + getNativeValue() + ')'; } - } - /**Represents the Objective C class for NSSpeechSynthesizer*/ + + /** Represents the Objective-C class for NSSpeechSynthesizer */ public static final _Class CLASS = Rococoa.createClass("NSSpeechSynthesizer", _Class.class); - /** Synthesizers have an associated delegate. This is the Objective C delegate object acting as the delegate*/ + + /** Synthesizers have an associated delegate. This is the Objective-C delegate object acting as the delegate */ private ObjCObject delegateProxy = null; - /** Synthesizers have an associated delegate. This is the Java object provided by the user of this class - that allows Java code to receive delegate related callbacks.*/ + + /** + * Synthesizers have an associated delegate. This is the Java object provided by the user of this class + * that allows Java code to receive delegate related callbacks. + */ private NSSpeechSynthesizerDelegate delegate = null; - /** Represents the Objective C class of the speech synthesizer*/ + /** Represents the Objective-C class of the speech synthesizer */ public static abstract class _Class implements ObjCClass { - public _Class() {} + public _Class() { + } + public abstract NSSpeechSynthesizer alloc(); + public abstract NSDictionary attributesForVoice(String voiceIdentifier); public abstract NSArray availableVoices(); + public abstract String defaultVoice(); + public abstract boolean isAnyApplicationSpeaking(); } - /** Interface to be implemented by Java objects that want to be informed about events reported to the speech syntheszier's delegate*/ + /** + * Interface to be implemented by Java objects that want to be informed about events reported to the speech syntheszier's delegate + * + * @objc.protocol NSSpeechSynthesizerDelegate + * @see "https://developer.apple.com/documentation/appkit/nsspeechsynthesizerdelegate?language=objc" + */ public interface NSSpeechSynthesizerDelegate { void speechSynthesizer_didEncounterErrorAtIndex_ofString_message(NSSpeechSynthesizer sender, Integer characterIndex, String text, String errorMessage); + void speechSynthesizer_didEncounterSyncMessage(NSSpeechSynthesizer sender, String syncFlag); + void speechSynthesizer_didFinishSpeaking(NSSpeechSynthesizer sender, boolean success); + void speechSynthesizer_willSpeakPhoneme(NSSpeechSynthesizer sender, short phonemeOpcode); + void speechSynthesizer_willSpeakWord_ofString(NSSpeechSynthesizer sender, NSRange wordToSpeak, String text); } - /** Construct a new synthesizer that speaks with a specified voice. - * @param voiceIdentifer the identifier of the voice to use - * @return the newly created synthesizer - * @throws IllegalArgumentException if the identifier is invalid or the voice indicated is not installed + /** + * Construct a new synthesizer that speaks with a specified voice. + * + * @param voiceIdentifier the identifier of the voice to use + * @return the newly created synthesizer + * @throws IllegalArgumentException if the identifier is invalid or the voice indicated is not installed */ - public static NSSpeechSynthesizer synthesizerWithVoiceIdentifier(String voiceIdentifer) throws IllegalArgumentException { - return CLASS.alloc().initWithVoice(voiceIdentifer); + public static NSSpeechSynthesizer synthesizerWithVoiceIdentifier(String voiceIdentifier) throws IllegalArgumentException { + return CLASS.alloc().initWithVoice(voiceIdentifier); } - /** Construct a new synthesizer that speaks with a specified voice. - * @param voice the voice to use, or null to use the defalt voice - * @return the newly created synthesizer - * @throws IllegalArgumentException if the voice is invalid or not installed + /** + * Construct a new synthesizer that speaks with a specified voice. + * + * @param voice the voice to use, or null to use the default voice + * @return the newly created synthesizer + * @throws IllegalArgumentException if the voice is invalid or not installed */ public static NSSpeechSynthesizer synthesizerWithVoice(NSVoice voice) { return synthesizerWithVoiceIdentifier(voice == null ? null : voice.getIdentifier()); } - /** Determine the default voice for this computer, set in system preferences - * @return the system default voice + /** + * Determine the default voice for this computer, set in system preferences + * + * @return the system default voice */ public static NSVoice defaultVoice() { return new NSVoice(CLASS.attributesForVoice(CLASS.defaultVoice())); } - /** Get a list of all available voices - * @return a list of available voices + /** + * Get a list of all available voices + * + * @return a list of available voices */ public static List availableVoices() { NSArray availableVoices = CLASS.availableVoices(); List result = new ArrayList<>(availableVoices.count()); - for (int i=0; i < availableVoices.count(); i++) { + for (int i = 0; i < availableVoices.count(); i++) { result.add(new NSVoice(CLASS.attributesForVoice(availableVoices.objectAtIndex(i).toString()))); } return result; } - /** Determine whether any application is currently generating speech through - * the default output channel at present. - * @return true if the default speech output channel is in use + /** + * Determine whether any application is currently generating speech through + * the default output channel at present. + * + * @return true if the default speech output channel is in use */ public static boolean isAnyApplicationSpeaking() { return CLASS.isAnyApplicationSpeaking(); } - /** Set the delegate that will receive events when speech is generated. - * @param delegate the delegate to set, replacing any existing one + /** + * Set the delegate that will receive events when speech is generated. + * + * @param delegate the delegate to set, replacing any existing one */ - public synchronized void setDelegate(final NSSpeechSynthesizerDelegate delegate) { - if ( delegate != null ) { + public synchronized void setDelegate(NSSpeechSynthesizerDelegate delegate) { + if (delegate != null) { this.delegate = delegate; delegateProxy = Rococoa.proxy(delegate); +logger.severe(String.format("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ delegate: %16x", this.delegateProxy.id().longValue())); setDelegate(this.delegateProxy.id()); } } - /** Get the current delegate - * @return the delegate + /** + * Get the current delegate + * + * @return the delegate */ public synchronized NSSpeechSynthesizerDelegate getDelegate() { return delegate; } - /** Convert a phoneme opcode to human readable form - * @param opcode the phoneme code to convert - * @return the corresponding readable string + /** + * Convert a phoneme opcode to human readable form + * + * @param opcode the phoneme code to convert + * @return the corresponding readable string */ public String opcodeToPhoneme(short opcode) { - for(NSSpeechPhonemeInfo info : getPhonemeInfo()) { + for (NSSpeechPhonemeInfo info : getPhonemeInfo()) { if (info.getOpcode() == opcode) { return info.getSymbol(); } @@ -186,81 +217,93 @@ public String opcodeToPhoneme(short opcode) { return "?"; } - /** Create a sync point that can be embeded in speech, to trigger a - * synchronization callback. - * @param marker the marker number for the sync point - * @return a sync point marker that can be embeded in a string to be spoken + /** + * Create a sync point that can be embeded in speech, to trigger a + * synchronization callback. + * + * @param marker the marker number for the sync point + * @return a sync point marker that can be embeded in a string to be spoken */ public static String createSyncPoint(int marker) { return String.format("[[sync 0x%h]]", marker); } - /** Get the value of a synthesizer property. - * @param property the property whose value should be retrieved - * @return the value asociated with the property - * @throws IllegalArgumentException if an error occurs while reading the property + /** + * Get the value of a synthesizer property. + * + * @param property the property whose value should be retrieved + * @return the value asociated with the property + * @throws IllegalArgumentException if an error occurs while reading the property */ public NSObject getProperty(SpeechProperty property) throws IllegalArgumentException { - ObjCObjectByReference errorPtr = new ObjCObjectByReference(); - NSObject result = objectForProperty_error(property.getNativeValue(), errorPtr); - NSError error = errorPtr.getValueAs(NSError.class); - //objectForProperty:error isn't well documented, so be very conservative - if ( result != null && !result.id().isNull() && (error == null || error.id().isNull() || error.code().intValue() == 0) ) { - return result; - } else { - throw new IllegalArgumentException("Could not get property: " + property + ", error: " + error.localizedDescription()); - } - } - - /** Set the value of a synthesizer property. - * @param property the property whose value will be set - * @param value the value to set - * @throws IllegalArgumentException if an error occurs while setting the property + ObjCObjectByReference errorPtr = new ObjCObjectByReference(); + NSObject result = objectForProperty_error(property.getNativeValue(), errorPtr); + NSError error = errorPtr.getValueAs(NSError.class); + //objectForProperty:error isn't well documented, so be very conservative + if (result != null && !result.id().isNull() && (error == null || error.id().isNull() || error.code().intValue() == 0)) { + return result; + } else { + throw new IllegalArgumentException("Could not get property: " + property + ", error: " + error.localizedDescription()); + } + } + + /** + * Set the value of a synthesizer property. + * + * @param property the property whose value will be set + * @param value the value to set + * @throws IllegalArgumentException if an error occurs while setting the property */ public void setProperty(SpeechProperty property, NSObject value) throws IllegalArgumentException { ObjCObjectByReference errorPtr = new ObjCObjectByReference(); - if ( !setObject_forProperty_error(value, property.getNativeValue(), errorPtr) ) { + if (!setObject_forProperty_error(value, property.getNativeValue(), errorPtr)) { NSError error = errorPtr.getValueAs(NSError.class); throw new IllegalArgumentException("Could not set property: " + property + " to value " + value + ", error: " + error.localizedDescription()); } } - /** Add a speech dictionary to those in use with this synthesizer - * @param dictionary the dictionary to add + /** + * Add a speech dictionary to those in use with this synthesizer + * + * @param dictionary the dictionary to add */ public void addSpeechDictionary(NSSpeechDictionary dictionary) { addSpeechDictionary(dictionary.getData()); } - - /** Describes boundaries between speech units*/ + /** Describes boundaries between speech units */ public static final class NSSpeechBoundary extends NSUInteger { private static final long serialVersionUID = 0; public static final NSSpeechBoundary ImmediateBoundary = new NSSpeechBoundary(0); public static final NSSpeechBoundary WordBoundary = new NSSpeechBoundary(1); public static final NSSpeechBoundary SentenceBoundary = new NSSpeechBoundary(2); - public NSSpeechBoundary() {} //required by the plumbing + + // required by the plumbing + public NSSpeechBoundary() { + } + private NSSpeechBoundary(int ordinal) { super(ordinal); } } - /** Get the status of the synthesizer - * @return the current status of the synthesizer + /** + * Get the status of the synthesizer + * + * @return the current status of the synthesizer */ public NSSpeechStatus getStatus() { return new NSSpeechStatus(Rococoa.cast(getProperty(SpeechProperty.StatusProperty), NSMutableDictionary.class)); } - //read-only - /** Describes the current status of the synthesizer*/ + // read-only + + /** Describes the current status of the synthesizer */ public static class NSSpeechStatus extends AbstractPropertyDictionary { public enum StatusProperty implements NativeEnum { - OutputBusy, - OutputPaused, - NumberOfCharactersLeft, - PhonemeCode; - private final NSString value = NSString.getGlobalString(NSSpeechStatus.class.getSimpleName() + name()); + OutputBusy, OutputPaused, NumberOfCharactersLeft, PhonemeCode; + private final NSString value = NSString.getGlobalString(NSSpeechStatus.class.getSimpleName() + name()); + public NSString getNativeValue() { return value; } @@ -291,23 +334,23 @@ public short getPhonemeCode() { } } - /** Get the latest error that occurred in the synthesizer - * @return the latest error to occur + /** + * Get the latest error that occurred in the synthesizer + * + * @return the latest error to occur */ public NSSpeechError getError() { return new NSSpeechError(Rococoa.cast(getProperty(SpeechProperty.ErrorsProperty), NSMutableDictionary.class)); } - //read-only - /** Describes an error that occurred*/ + // read-only + + /** Describes an error that occurred */ public static class NSSpeechError extends AbstractPropertyDictionary { public enum ErrorProperty implements NativeEnum { - Count, - OldestCode, - OldestCharacterOffset, - NewestCode, - NewestCharacterOffset; - private final NSString value = NSString.getGlobalString(NSSpeechError.class.getSimpleName() + name()); + Count, OldestCode, OldestCharacterOffset, NewestCode, NewestCharacterOffset; + private final NSString value = NSString.getGlobalString(NSSpeechError.class.getSimpleName() + name()); + public NSString getNativeValue() { return value; } @@ -328,158 +371,185 @@ public int getErrorCount() { public int getOldestCode() { return getInt(ErrorProperty.OldestCode); } + public int getOldestCharacterOffset() { return getInt(ErrorProperty.OldestCharacterOffset); } + public int getNewestCode() { return getInt(ErrorProperty.NewestCode); } + public int getNewestCharacterOffset() { return getInt(ErrorProperty.NewestCharacterOffset); } - } - /** Describes the modes a synthesizer can operate in.*/ + /** Describes the modes a synthesizer can operate in. */ public enum NSSpeechMode implements NativeEnum { - Text, - Phoneme, - Normal, - Literal; - private final NSString value = NSString.getGlobalString(this.getClass().getSimpleName() + name()); + Text, Phoneme, Normal, Literal; + private final NSString value = NSString.getGlobalString(this.getClass().getSimpleName() + name()); + public NSString getNativeValue() { return value; } } - /** Get the current input mode, whether the synthesizer is currently expecting regular text input or raw phonemes. - * @return either NSSpeechMode.Text or NSSpeechMode.Phoneme depending on the current mode + /** + * Get the current input mode, whether the synthesizer is currently expecting regular text input or raw phonemes. + * + * @return either NSSpeechMode.Text or NSSpeechMode.Phoneme depending on the current mode */ public NSSpeechMode getInputMode() { - return NativeEnum.Resolver.fromNative(NSSpeechMode.class, getProperty(SpeechProperty.InputModeProperty)); + return NativeEnum.Resolver.fromNative(NSSpeechMode.class, getProperty(SpeechProperty.InputModeProperty)); } - /** Set the current input mode, whether the synthesizer is currently expecting regular text input or raw phonemes. - * @param mode either NSSpeechMode.Text or NSSpeechMode.Phoneme depending on the desired mode + /** + * Set the current input mode, whether the synthesizer is currently expecting regular text input or raw phonemes. + * + * @param mode either NSSpeechMode.Text or NSSpeechMode.Phoneme depending on the desired mode */ public void setInputMode(NSSpeechMode mode) { setProperty(SpeechProperty.InputModeProperty, mode.getNativeValue()); } - /** Get the current character mode, whether the synthesizer is currently speaking strings normally or speaking each character literally. - * @return either NSSpeechMode.Normal or NSSpeechMode.Literal depending on the current mode + /** + * Get the current character mode, whether the synthesizer is currently speaking strings normally or speaking each character literally. + * + * @return either NSSpeechMode.Normal or NSSpeechMode.Literal depending on the current mode */ public NSSpeechMode getCharacterMode() { return NativeEnum.Resolver.fromNative(NSSpeechMode.class, getProperty(SpeechProperty.CharacterModeProperty)); } - /** Set the current character mode, whether the synthesizer is currently speaking strings normally or speaking each character literally. - * @param mode either NSSpeechMode.Normal or NSSpeechMode.Literal depending on the desired mode + /** + * Set the current character mode, whether the synthesizer is currently speaking strings normally or speaking each character literally. + * + * @param mode either NSSpeechMode.Normal or NSSpeechMode.Literal depending on the desired mode */ public void setCharacterMode(NSSpeechMode mode) { setProperty(SpeechProperty.CharacterModeProperty, mode.getNativeValue()); } - /** Get the current number mode, whether the synthesizer is currently speaking numbers normally or speaking each digit literally. - * @return either NSSpeechMode.Normal or NSSpeechMode.Literal depending on the current mode + /** + * Get the current number mode, whether the synthesizer is currently speaking numbers normally or speaking each digit literally. + * + * @return either NSSpeechMode.Normal or NSSpeechMode.Literal depending on the current mode */ public NSSpeechMode getNumberMode() { return NativeEnum.Resolver.fromNative(NSSpeechMode.class, getProperty(SpeechProperty.NumberModeProperty)); } - /** Set the current number mode, whether the synthesizer is currently speaking numbers normally or speaking each digit literally. - * @param mode either NSSpeechMode.Normal or NSSpeechMode.Literal depending on the desired mode + /** + * Set the current number mode, whether the synthesizer is currently speaking numbers normally or speaking each digit literally. + * + * @param mode either NSSpeechMode.Normal or NSSpeechMode.Literal depending on the desired mode */ public void setNumberMode(NSSpeechMode mode) { setProperty(SpeechProperty.NumberModeProperty, mode.getNativeValue()); } - /** Get identifying information about this synthesizer - * @return information that identifies this synthesizer + /** + * Get identifying information about this synthesizer + * + * @return information that identifies this synthesizer */ public NSSpeechSynthesizerInfo getSynthesizerInfo() { return new NSSpeechSynthesizerInfo(Rococoa.cast(getProperty(SpeechProperty.SynthesizerInfoProperty), NSMutableDictionary.class)); } - //read-only - /** Describes identifying information about the synthesizer*/ + // read-only + + /** Describes identifying information about the synthesizer */ public static class NSSpeechSynthesizerInfo extends AbstractPropertyDictionary { public enum SpeechSynthesizerInfoProperty implements NativeEnum { - Identifier, - Version; - private final NSString value = NSString.getGlobalString(NSSpeechSynthesizerInfo.class.getSimpleName() + name()); + Identifier, Version; + private final NSString value = NSString.getGlobalString(NSSpeechSynthesizerInfo.class.getSimpleName() + name()); + public NSString getNativeValue() { return value; } } + public NSSpeechSynthesizerInfo() { super(SpeechSynthesizerInfoProperty.values().length); } + public NSSpeechSynthesizerInfo(final NSMutableDictionary data) { super(data); } + public String getSynthesizerIdentifier() { return getString(SpeechSynthesizerInfoProperty.Identifier); } + public String getSynthesizerVersion() { return getString(SpeechSynthesizerInfoProperty.Version); } } - /** Get the baseline pitch for the synthesizer - * @return the baseline pitch + /** + * Get the baseline pitch for the synthesizer + * + * @return the baseline pitch */ public float getPitchBase() { return Rococoa.cast(getProperty(SpeechProperty.PitchBaseProperty), NSNumber.class).floatValue(); } - /** Set the baseline pitch for the synthesizer - * @param baselinePitch the baseline pitch to use + /** + * Set the baseline pitch for the synthesizer + * + * @param baselinePitch the baseline pitch to use */ public void setPitchBase(float baselinePitch) { setProperty(SpeechProperty.PitchBaseProperty, NSNumber.of((double) baselinePitch)); // TODO float bug? } - /** Get the pitch modulation for the synthesizer - * @return the pitch modulation + /** + * Get the pitch modulation for the synthesizer + * + * @return the pitch modulation */ public float getPitchMod() { return Rococoa.cast(getProperty(SpeechProperty.PitchModProperty), NSNumber.class).floatValue(); } - /** Set the pitch modulation for the synthesizer - * @param modulation the pitch modulation to use + /** + * Set the pitch modulation for the synthesizer + * + * @param modulation the pitch modulation to use */ public void setPitchMod(float modulation) { - if ( modulation < 0.0f || modulation > 127.0f) { + if (modulation < 0.0f || modulation > 127.0f) { throw new IllegalArgumentException("Pitch modulation must be in the range 0.0 - 127.0"); } setProperty(SpeechProperty.PitchModProperty, NSNumber.of((double) modulation)); // TODO float bug? } - /** Get a list of phonemes the synthesizer uses - * @return information about the phonemes the synthesizer uses + /** + * Get a list of phonemes the synthesizer uses + * + * @return information about the phonemes the synthesizer uses */ public List getPhonemeInfo() { NSArray infos = Rococoa.cast(getProperty(SpeechProperty.PhonemeSymbolsProperty), NSArray.class); List result = new ArrayList<>(infos.count()); - for(int i=0; i < infos.count(); i++) { + for (int i = 0; i < infos.count(); i++) { NSDictionary phonemeInfo = Rococoa.cast(infos.objectAtIndex(i), NSDictionary.class); result.add(new NSSpeechPhonemeInfo(NSMutableDictionary.dictionaryWithDictionary(phonemeInfo))); } return result; } - //read-only - /** Describes information about phonemes the synthesizer uses*/ + // read-only + + /** Describes information about phonemes the synthesizer uses */ public static class NSSpeechPhonemeInfo extends AbstractPropertyDictionary { public enum PhonemeInfoProperty implements NativeEnum { - Opcode, - Symbol, - Example, - HiliteStart, - HiliteEnd; - private final NSString value = NSString.getGlobalString(NSSpeechPhonemeInfo.class.getSimpleName() + name()); + Opcode, Symbol, Example, HiliteStart, HiliteEnd; + private final NSString value = NSString.getGlobalString(NSSpeechPhonemeInfo.class.getSimpleName() + name()); + public NSString getNativeValue() { return value; } @@ -519,46 +589,55 @@ public String toString() { } } - /** Get the most recent sync point encountered when speaking - * @return the identifying number of the most recent sync point + /** + * Get the most recent sync point encountered when speaking + * + * @return the identifying number of the most recent sync point */ public int getRecentSync() { return Rococoa.cast(getProperty(SpeechProperty.RecentSyncProperty), NSNumber.class).intValue(); } - /** Set the voice to use - * @param voice the new voice to use - * @return true if the voice change was successful + /** + * Set the voice to use + * + * @param voice the new voice to use + * @return true if the voice change was successful */ public boolean setVoice(NSVoice voice) { - //CurrentVocieProperty basically takes a map with 2 keys, creator and id like an old school VoiceSpec spec (see SpeechSynthesis.h) - //setProperty(SpeechProperty.CurrentVoiceProperty, dictionary of creator and id would go here ); - //this is much less painful - we'd have to call the C API, and why do it the hard way? If someone needs to, they can always - //call setProperty() for themselves. + // CurrentVoiceProperty basically takes a map with 2 keys, creator and id like an old school VoiceSpec spec (see SpeechSynthesis.h) + // setProperty(SpeechProperty.CurrentVoiceProperty, dictionary of creator and id would go here ); + // this is much less painful - we'd have to call the C API, and why do it the hard way? If someone needs to, they can always + // call setProperty() for themselves. return setVoice(voice.getIdentifier()); } - /** Get the current voice in use - * @return the voice in use + /** + * Get the current voice in use + * + * @return the voice in use */ public NSVoice getVoice() { return new NSVoice(CLASS.attributesForVoice(voice())); } - /** Set the command delimiter to use - * @param delimiters the delimiters to use when embedding commands in speech + /** + * Set the command delimiter to use + * + * @param delimiters the delimiters to use when embedding commands in speech */ public void setCommandDelimiter(NSSpeechCommand delimiters) { setProperty(SpeechProperty.CommandDelimiterProperty, delimiters.getData()); } - //write-only - /** Desribes how to set the delimiters used to embed commands in text to be spoken*/ + // write-only + + /** Describes how to set the delimiters used to embed commands in text to be spoken */ public static class NSSpeechCommand extends AbstractPropertyDictionary { - public enum CommandDelimiterProperty implements NativeEnum{ - Prefix, - Suffix; - private final NSString value = NSString.getGlobalString(NSSpeechCommand.class.getSimpleName() + name()); + public enum CommandDelimiterProperty implements NativeEnum { + Prefix, Suffix; + private final NSString value = NSString.getGlobalString(NSSpeechCommand.class.getSimpleName() + name()); + public NSString getNativeValue() { return value; } @@ -581,6 +660,7 @@ public NSSpeechCommand(String prefix, String suffix) { public String getCommandPrefix() { return getString(CommandDelimiterProperty.Prefix); } + public void setCommandPrefix(String prefix) { setString(CommandDelimiterProperty.Prefix, prefix); } @@ -588,101 +668,157 @@ public void setCommandPrefix(String prefix) { public String getCommandSuffix() { return getString(CommandDelimiterProperty.Suffix); } + public void setCommandSuffix(String suffix) { setString(CommandDelimiterProperty.Suffix, suffix); } } - /** Reset the synthesizer to the default settings*/ + /** Reset the synthesizer to the default settings */ public void reset() { - setProperty(SpeechProperty.ResetProperty, null); + setProperty(SpeechProperty.ResetProperty, null); // pass null for computer speakers } - //pass null for computer speakers - /** Set the synthesizer to send output to a file instead of the default output channel - * @param uri a file URI to send output to, pass null to switch back to the computer speakers + + /** + * Set the synthesizer to send output to a file instead of the default output channel + * + * @param uri a file URI to send output to, pass null to switch back to the computer speakers */ public void setOutputToFileURL(URI uri) { setProperty(SpeechProperty.OutputToFileURLProperty, uri != null ? NSURL.URLWithString(uri.toString()) : null); } - /** Speak the given string to a file - * @param text the text to speak - * @param uri a file URI indicating where to send output to - * @return true if the synthesis began successfully + /** + * Speak the given string to a file + * + * @param text the text to speak + * @param uri a file URI indicating where to send output to + * @return true if the synthesis began successfully */ public boolean startSpeakingStringToURL(String text, URI uri) { return startSpeakingString_toURL(NSString.stringWithString(text), NSURL.URLWithString(uri.toString())); } - //Those methods that will simply be called directly are public, the rest are 'package' - wrapper methods can be found above. + // Those methods that will simply be called directly are public, + // the rest are 'package' - wrapper methods can be found above. + abstract void addSpeechDictionary(NSDictionary speechDictionary); - /** Resume speaking if output was paused*/ + + /** Resume speaking if output was paused */ public abstract void continueSpeaking(); + abstract ID delegate(); + abstract NSSpeechSynthesizer initWithVoice(String voiceIdentifier); - /** Determine whether the current application is speaking using the default output channel - * @return true if the current application is speaking + + /** + * Determine whether the current application is speaking using the default output channel + * + * @return true if the current application is speaking */ public abstract boolean isSpeaking(); + abstract NSObject objectForProperty_error(NSString speechProperty, ObjCObjectByReference out_error); + abstract boolean setObject_forProperty_error(NSObject object, NSString speechProperty, ObjCObjectByReference out_error); - /** Pause speech at the indicated boundary - * @param boundary the place to stop speech + + /** + * Pause speech at the indicated boundary + * + * @param boundary the place to stop speech */ public abstract void pauseSpeakingAtBoundary(NSSpeechBoundary boundary); - /** Convert text to phonemes. - * @param text the text to convert - * @return the corresponding phonemes + + /** + * Convert text to phonemes. + * + * @param text the text to convert + * @return the corresponding phonemes */ public abstract String phonemesFromText(String text); - /** Get the current rate of speech - * @return the current rate of speech + + /** + * Get the current rate of speech + * + * @return the current rate of speech */ public abstract float rate(); + abstract void setDelegate(ID delegate); - /** Set the current rate of speech - * @param rate the rate to use + + /** + * Set the current rate of speech + * + * @param rate the rate to use */ public abstract void setRate(float rate); - /** Set whether the feedback window should be used - * @param useFeedbackWindow pass true to enable the feedback window + + /** + * Set whether the feedback window should be used + * + * @param useFeedbackWindow pass true to enable the feedback window */ public abstract void setUsesFeedbackWindow(boolean useFeedbackWindow); - /** Set the voice to use, should be called when the synthesizer is not currently speaking - * @param voiceIdentifier the identifier of the voice to use - * @return true if the voice change was successful + + /** + * Set the voice to use, should be called when the synthesizer is not currently speaking + * + * @param voiceIdentifier the identifier of the voice to use + * @return true if the voice change was successful */ public abstract boolean setVoice(String voiceIdentifier); - /** Set the volume - * @param volume the volume to use + + /** + * Set the volume + * + * @param volume the volume to use */ public abstract void setVolume(float volume); - /** Start speaking the given string through the default system speech channel - * @param text the text to speak - * @return true if synthesis starts successfully + + /** + * Start speaking the given string through the default system speech channel + * + * @param text the text to speak + * @return true if synthesis starts successfully */ public abstract boolean startSpeakingString(String text); + abstract boolean startSpeakingString_toURL(NSString text, NSURL url); - /** Stop this synthesizer from speaking*/ + + /** Stop this synthesizer from speaking */ public abstract void stopSpeaking(); - /** Stop this synthesizer from speaking when it reaches the indicated place. - * @param boundary the place to stop speaking + + /** + * Stop this synthesizer from speaking when it reaches the indicated place. + * + * @param boundary the place to stop speaking */ public abstract void stopSpeakingAtBoundary(NSSpeechBoundary boundary); - /** Get whether the feedback window is enabled - * @return true if the feedback window is enabled + + /** + * Get whether the feedback window is enabled + * + * @return true if the feedback window is enabled */ public abstract boolean usesFeedbackWindow(); + abstract String voice(); - /** Get the identifier of the current voice - * @return the identifier of the current voice + + /** + * Get the identifier of the current voice + * + * @return the identifier of the current voice */ public String getVoiceIdentifier() { return voice(); } + abstract float volume(); - /** Get the current volume - * @return the current volume + + /** + * Get the current volume + * + * @return the current volume */ public float getVolume() { return volume(); diff --git a/rococoa-contrib/src/test/java/org/rococoa/cocoa/appkit/NSSpeechSynthesizerTest.java b/rococoa-contrib/src/test/java/org/rococoa/cocoa/appkit/NSSpeechSynthesizerTest.java index 6674475..9f54751 100644 --- a/rococoa-contrib/src/test/java/org/rococoa/cocoa/appkit/NSSpeechSynthesizerTest.java +++ b/rococoa-contrib/src/test/java/org/rococoa/cocoa/appkit/NSSpeechSynthesizerTest.java @@ -28,6 +28,7 @@ import java.util.Date; import java.util.List; import java.util.Locale; +import java.util.logging.Logger; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; @@ -544,7 +545,7 @@ public List getPhonemesSpoken() { return phonemesSpoken; } - public void speechSynthesizer_didFinishSpeaking(NSSpeechSynthesizer sender, final boolean success) { + public void speechSynthesizer_didFinishSpeaking(NSSpeechSynthesizer sender, boolean success) { this.success = success; synchronized (speechDoneMonitor) { speechDoneMonitor.notify(); @@ -585,7 +586,7 @@ public void waitForWord(long interval, final String word) { private String getCallerName() { for (StackTraceElement ste : Thread.currentThread().getStackTrace()) { - if ( ste.getMethodName().startsWith("test") ) { + if (ste.getMethodName().startsWith("test")) { return ste.getMethodName(); } } diff --git a/rococoa-contrib/src/test/java/org/rococoa/cocoa/appkit/NSVoiceTest.java b/rococoa-contrib/src/test/java/org/rococoa/cocoa/appkit/NSVoiceTest.java index 833fb46..a474728 100644 --- a/rococoa-contrib/src/test/java/org/rococoa/cocoa/appkit/NSVoiceTest.java +++ b/rococoa-contrib/src/test/java/org/rococoa/cocoa/appkit/NSVoiceTest.java @@ -35,7 +35,6 @@ public class NSVoiceTest extends RococoaTestCase { @Test - @Disabled @SuppressWarnings("deprecation") public void testAttributesForVoice() { NSVoice voice = new NSVoice(NSVoice.VICTORIA); From 3484faa4ac3ce248b02b29448b449a73ce53bcdf Mon Sep 17 00:00:00 2001 From: Naohide Sano Date: Sat, 5 Nov 2022 16:17:31 +0900 Subject: [PATCH 27/36] [open/save panel] make it work well --- .../org/rococoa/cocoa/appkit/NSOpenPanel.java | 21 ++++++-- .../org/rococoa/cocoa/appkit/NSPanel.java | 29 +++++++++++ .../org/rococoa/cocoa/appkit/NSSavePanel.java | 52 +++++++++++++++++++ .../org/rococoa/cocoa/NSOpenPanelTest.java | 24 ++++++--- 4 files changed, 114 insertions(+), 12 deletions(-) create mode 100644 rococoa-cocoa/src/main/java/org/rococoa/cocoa/appkit/NSPanel.java create mode 100644 rococoa-cocoa/src/main/java/org/rococoa/cocoa/appkit/NSSavePanel.java diff --git a/rococoa-cocoa/src/main/java/org/rococoa/cocoa/appkit/NSOpenPanel.java b/rococoa-cocoa/src/main/java/org/rococoa/cocoa/appkit/NSOpenPanel.java index 02ab2e1..81d8288 100644 --- a/rococoa-cocoa/src/main/java/org/rococoa/cocoa/appkit/NSOpenPanel.java +++ b/rococoa-cocoa/src/main/java/org/rococoa/cocoa/appkit/NSOpenPanel.java @@ -19,6 +19,7 @@ package org.rococoa.cocoa.appkit; +import com.sun.webkit.network.URLs; import org.rococoa.ID; import org.rococoa.cocoa.foundation.NSObject; @@ -26,21 +27,31 @@ import org.rococoa.RunOnMainThread; import org.rococoa.cocoa.foundation.NSArray; import org.rococoa.cocoa.foundation.NSString; +import org.rococoa.cocoa.foundation.NSURL; -public @RunOnMainThread abstract class NSOpenPanel extends NSObject { + +/** + * A panel that prompts the user to select a file to open. + */ +public @RunOnMainThread abstract class NSOpenPanel extends NSSavePanel { public static final int NSOKButton = 1; public static final int NSCancelButton = 0; - public static final _Class CLASS = Rococoa.createClass("NSOpenPanel", _Class.class); - public @RunOnMainThread abstract class _Class extends NSObject._class_ { + public static final _Class CLASS = Rococoa.createClass("NSOpenPanel", _Class.class); + + public static @RunOnMainThread abstract class _Class extends NSObject._class_ { public abstract NSOpenPanel openPanel(); } public abstract int runModalForTypes(NSArray arrayOfTypeStrings); - public abstract NSString filename(); + public abstract String filename(); public abstract NSArray filenames(); + public abstract NSArray/*NSURL*/ URLs(); - public abstract void setDelegate(ID ocProxy); + public abstract boolean canChooseFiles(); + public abstract boolean canChooseDirectories(); + public abstract boolean allowsMultipleSelection(); + public abstract void allowsMultipleSelection(boolean value); } diff --git a/rococoa-cocoa/src/main/java/org/rococoa/cocoa/appkit/NSPanel.java b/rococoa-cocoa/src/main/java/org/rococoa/cocoa/appkit/NSPanel.java new file mode 100644 index 0000000..96c7bb1 --- /dev/null +++ b/rococoa-cocoa/src/main/java/org/rococoa/cocoa/appkit/NSPanel.java @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2022 by Naohide Sano, All rights reserved. + * + * Programmed by Naohide Sano + */ + +package org.rococoa.cocoa.appkit; + +import org.rococoa.Rococoa; +import org.rococoa.RunOnMainThread; +import org.rococoa.cocoa.foundation.NSObject; + + +/** + * A special kind of window that typically performs a function that is auxiliary to the main window. + * + * @author Naohide Sano (nsano) + * @version 0.00 2022/10/22 nsano initial version
+ */ +public @RunOnMainThread abstract class NSPanel extends NSObject { + + public static final _Class CLASS = Rococoa.createClass("NSPanel", _Class.class); + + public static @RunOnMainThread abstract class _Class extends _class_ { + } + + /** A Boolean value that indicates whether the receiver is a floating panel. */ + public abstract boolean floatingPanel(); +} diff --git a/rococoa-cocoa/src/main/java/org/rococoa/cocoa/appkit/NSSavePanel.java b/rococoa-cocoa/src/main/java/org/rococoa/cocoa/appkit/NSSavePanel.java new file mode 100644 index 0000000..b5578a5 --- /dev/null +++ b/rococoa-cocoa/src/main/java/org/rococoa/cocoa/appkit/NSSavePanel.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2022 by Naohide Sano, All rights reserved. + * + * Programmed by Naohide Sano + */ + +package org.rococoa.cocoa.appkit; + +import org.rococoa.ID; +import org.rococoa.Rococoa; +import org.rococoa.RunOnMainThread; +import org.rococoa.cocoa.foundation.NSArray; +import org.rococoa.cocoa.foundation.NSObject; +import org.rococoa.cocoa.foundation.NSString; +import org.rococoa.cocoa.foundation.NSURL; + + +/** + * A panel that prompts the user for information about where to save a file. + * + * @author Naohide Sano (nsano) + * @version 0.00 2022/10/21 nsano initial version
+ */ +public @RunOnMainThread abstract class NSSavePanel extends NSPanel { + + public static final int NSOKButton = 1; + public static final int NSCancelButton = 0; + + public static final _Class CLASS = Rococoa.createClass("NSSavePanel", _Class.class); + + public static @RunOnMainThread abstract class _Class extends _class_ { + public abstract NSSavePanel savePanel(); + } + + /** A URL that contains the fully specified location of the targeted file. */ + public abstract NSURL URL(); + + /** The title of the panel. */ + public abstract String title(); + public abstract void setTitle(String title); + /** The text to display in the default button. */ + public abstract String prompt(); + /** The message text displayed in the panel. */ + public abstract String message(); + + /** The current directory shown in the panel. */ + public abstract NSURL directoryURL(); + public abstract void directoryURL(NSURL url); + + /** @see "https://developer.apple.com/documentation/appkit/nsopensavepaneldelegate?language=objc" */ + public abstract void setDelegate(ID ocProxy); +} diff --git a/rococoa-cocoa/src/test/java/org/rococoa/cocoa/NSOpenPanelTest.java b/rococoa-cocoa/src/test/java/org/rococoa/cocoa/NSOpenPanelTest.java index 9ad6d48..84e6861 100644 --- a/rococoa-cocoa/src/test/java/org/rococoa/cocoa/NSOpenPanelTest.java +++ b/rococoa-cocoa/src/test/java/org/rococoa/cocoa/NSOpenPanelTest.java @@ -20,6 +20,8 @@ package org.rococoa.cocoa; import java.io.File; +import java.nio.file.Files; +import java.nio.file.Paths; import javax.swing.JFrame; @@ -27,18 +29,22 @@ import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.EnabledIfSystemProperty; import org.rococoa.ID; import org.rococoa.Rococoa; import org.rococoa.ObjCObject; import org.rococoa.cocoa.appkit.NSOpenPanel; import org.rococoa.cocoa.foundation.NSString; +import org.rococoa.cocoa.foundation.NSURL; import org.rococoa.test.RococoaTestCase; +import vavi.util.Debug; + public class NSOpenPanelTest extends RococoaTestCase { // Requires user to select a text file somewhere downtree from ~ @Test - @Disabled + @EnabledIfSystemProperty(named = "vavi.test", matches = "ide") public void testShow() { new JFrame().setVisible(true); // otherwise no panel NSOpenPanel panel = NSOpenPanel.CLASS.openPanel(); @@ -46,23 +52,27 @@ public void testShow() { // Keep this reference! ObjCObject ocProxy = Rococoa.proxy(new Object() { @SuppressWarnings("unused") - public boolean panel_shouldShowFilename(ID panel, String filename) { - char initialChar = new File(filename).getName().toLowerCase().charAt(0); + public boolean panel_shouldEnableURL(ID panel, NSURL url) { +Debug.println("url: " + url); + char initialChar = new File(url.path()).getName().toLowerCase().charAt(0); return initialChar % 2 == 0; } }); - +Debug.println("proxy: " + ocProxy); + + panel.setTitle("Open Sesame!"); panel.setDelegate(ocProxy.id()); int button = panel.runModalForTypes(null); // or, eg // NSArray.CLASS.arrayWithObjects( // NSString.stringWithString("txt"), null)); - NSString filenameAsNSString = panel.filename(); + String filename = panel.filename(); +Debug.println("filename: " + filename); if (button == NSOpenPanel.NSOKButton) { - assertTrue(filenameAsNSString.toString().startsWith("/Users")); + assertTrue(Files.exists(Paths.get(filename))); } else { assertEquals(NSOpenPanel.NSCancelButton, button); - assertNull(filenameAsNSString); + assertNull(filename); } } } From 79fced6ee69a734c84b4d69dc654e59a1e637aba Mon Sep 17 00:00:00 2001 From: Naohide Sano Date: Sat, 5 Nov 2022 16:20:57 +0900 Subject: [PATCH 28/36] clean up --- .../rococoa/cocoa/appkit/AppKitLibrary.java | 8 +- .../org/rococoa/cocoa/qtkit/QTMovieTest.java | 1 + .../rococoa/cocoa/appkit/NSApplication.java | 19 +- .../cocoa/coreml/MLModelConfiguration.java | 3 +- .../cocoa/appkit/NSApplicationTest.java | 40 +++- .../src/main/java/org/rococoa/ID.java | 1 - .../src/main/java/org/rococoa/Rococoa.java | 4 +- .../org/rococoa/internal/MainThreadUtils.java | 2 +- .../rococoa/internal/NSInvocationMapper.java | 2 +- .../internal/OCInvocationCallbacks.java | 1 - .../internal/ObjCObjectInvocationHandler.java | 24 +-- .../rococoa/internal/RococoaTypeMapper.java | 1 - .../rococoa/FoundationRetainReleaseTest.java | 1 - .../FoundationStructureReturnTest.java | 10 +- .../test/java/org/rococoa/JavaProxyTest.java | 177 ++++++++++-------- 15 files changed, 161 insertions(+), 133 deletions(-) diff --git a/rococoa-cocoa/src/main/java/org/rococoa/cocoa/appkit/AppKitLibrary.java b/rococoa-cocoa/src/main/java/org/rococoa/cocoa/appkit/AppKitLibrary.java index 708125a..c466dc2 100644 --- a/rococoa-cocoa/src/main/java/org/rococoa/cocoa/appkit/AppKitLibrary.java +++ b/rococoa-cocoa/src/main/java/org/rococoa/cocoa/appkit/AppKitLibrary.java @@ -19,20 +19,16 @@ package org.rococoa.cocoa.appkit; -import java.util.Collections; - -import org.rococoa.cocoa.foundation.NSRect; -import org.rococoa.internal.RococoaTypeMapper; - import com.sun.jna.Library; import com.sun.jna.Native; +import org.rococoa.cocoa.foundation.NSRect; /** * @author paulloy */ public interface AppKitLibrary extends Library { - public static final AppKitLibrary INSTANCE = Native.load("AppKit", AppKitLibrary.class); + AppKitLibrary INSTANCE = Native.load("AppKit", AppKitLibrary.class); void NSRectFill (NSRect aRect); diff --git a/rococoa-cocoa/src/test/java/org/rococoa/cocoa/qtkit/QTMovieTest.java b/rococoa-cocoa/src/test/java/org/rococoa/cocoa/qtkit/QTMovieTest.java index 38091a3..0356842 100644 --- a/rococoa-cocoa/src/test/java/org/rococoa/cocoa/qtkit/QTMovieTest.java +++ b/rococoa-cocoa/src/test/java/org/rococoa/cocoa/qtkit/QTMovieTest.java @@ -44,6 +44,7 @@ public class QTMovieTest extends RococoaTestCase { static String testMovieFile = "testdata/DrWho.mov"; static int testMovieTimeScale = 1000; + static { @SuppressWarnings("unused") QTKit instance = QTKit.instance; diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSApplication.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSApplication.java index 2d68f79..7ac02ef 100644 --- a/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSApplication.java +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/appkit/NSApplication.java @@ -22,13 +22,11 @@ import com.sun.jna.Callback; import org.rococoa.ID; import org.rococoa.ObjCClass; -import org.rococoa.ObjCObject; import org.rococoa.ObjCObjectByReference; import org.rococoa.Rococoa; import org.rococoa.RunOnMainThread; import org.rococoa.cocoa.foundation.NSInteger; import org.rococoa.cocoa.foundation.NSObject; -import org.rococoa.cocoa.foundation.NSPasteboard; /** @@ -89,18 +87,14 @@ static public NSApplication sharedApplication() { abstract ServicesProviderCallback servicesProvider(); + /** + * @see "https://github.com/gnustep/tests-examples/blob/ec7876dd4031c20bfb3aed1ab79809210a1d58e8/gui/Ink/AppDelegate.m" + */ interface ServicesProviderCallback extends Callback { - void apply(NSPasteboard pboard, String userData, ObjCObjectByReference/*NSError*/ error); + void openSelection_userData_error(ID pboard, String userData, ObjCObjectByReference/*NSError*/ error); } - public abstract void setServicesProvider(ServicesProviderCallback callback); - - /* - typedef enum { - NSCriticalRequest = 0, - NSInformationalRequest = 10 - } NSRequestUserAttentionType; - */ + public abstract void setServicesProvider(ID callback); public static final int NSCriticalRequest = 0; public static final int NSInformationalRequest = 10; @@ -329,4 +323,7 @@ typedef enum { * ? beginModalSessionForWindow:relativeToWindow: * ? application:printFiles: delegate method Deprecated in Mac OS X v10.4 */ + + /** Indicates whether the receiver can send and receive the specified pasteboard types. */ + public abstract ID validRequestorForSendType_returnType(String/*NSPasteboardType*/ sendType, String/*NSPasteboardType*/ returnType); } diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/coreml/MLModelConfiguration.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/coreml/MLModelConfiguration.java index 6654a64..957d12c 100644 --- a/rococoa-contrib/src/main/java/org/rococoa/cocoa/coreml/MLModelConfiguration.java +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/coreml/MLModelConfiguration.java @@ -33,9 +33,10 @@ public abstract class MLModelConfiguration extends NSObject { public interface _Class extends ObjCClass { MLModelConfiguration alloc(); - MLModelConfiguration init(); } + public abstract MLModelConfiguration init(); + /** A human readable name of a model for display purposes. */ public abstract String modelDisplayName(); diff --git a/rococoa-contrib/src/test/java/org/rococoa/cocoa/appkit/NSApplicationTest.java b/rococoa-contrib/src/test/java/org/rococoa/cocoa/appkit/NSApplicationTest.java index 4de40ae..da8c62e 100644 --- a/rococoa-contrib/src/test/java/org/rococoa/cocoa/appkit/NSApplicationTest.java +++ b/rococoa-contrib/src/test/java/org/rococoa/cocoa/appkit/NSApplicationTest.java @@ -12,11 +12,20 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.EnabledIfSystemProperty; +import org.rococoa.ID; +import org.rococoa.ObjCObject; +import org.rococoa.ObjCObjectByReference; +import org.rococoa.Rococoa; +import vavi.util.Debug; import vavi.util.StringUtil; import org.rococoa.cocoa.foundation.NSData; import org.rococoa.cocoa.foundation.NSPasteboard; +import static org.junit.jupiter.api.Assertions.assertEquals; + /** * NSApplicationTest. @@ -35,19 +44,36 @@ void setup() { } @Test - @Disabled("TODO wip") + @DisplayName("TODO wip") + @EnabledIfSystemProperty(named = "vavi.test", matches = "ide") void test1() throws Exception { - NSApplication.sharedApplication().setServicesProvider((pboard, userData, error) -> { - System.err.println(pboard.stringForType("NSPasteboardTypeString")); - }); + NSApplication.ServicesProviderCallback servicesProvider = (pboard, userData, error) -> { + NSPasteboard pasteboard = Rococoa.wrap(pboard, NSPasteboard.class); +System.err.println(pasteboard.stringForType("NSPasteboardTypeString")); + }; + ObjCObject proxy = Rococoa.proxy(servicesProvider); + NSApplication application = NSApplication.sharedApplication(); + ID proxyId = proxy.id(); + application.setServicesProvider(proxyId); +Debug.println(proxyId); + + Toolkit kit = Toolkit.getDefaultToolkit(); + Clipboard clip = kit.getSystemClipboard(); + StringSelection ss = new StringSelection("umjammer"); + clip.setContents(ss, ss); + + ID id = application.validRequestorForSendType_returnType("NSPasteboardTypeString", "NSPasteboardTypeString"); +Debug.println(id); + while (true) Thread.yield(); } @Test void test2() throws Exception { NSPasteboard pasteboard = NSPasteboard.generalPasteboard(); - String typeString = pasteboard.stringForType(NSPasteboard.StringPboardType); - System.err.println("typeString: " + typeString); + String string = pasteboard.stringForType(NSPasteboard.StringPboardType); +System.err.println("string: " + string); + assertEquals("vavi", string); NSData data = pasteboard.dataForType(NSPasteboard.StringPboardType); - System.err.println("dataForType:\n" + StringUtil.getDump(data.getBytes())); +System.err.println("dataForType:\n" + StringUtil.getDump(data.getBytes())); } } diff --git a/rococoa-core/src/main/java/org/rococoa/ID.java b/rococoa-core/src/main/java/org/rococoa/ID.java index 895cfbd..27b51f9 100644 --- a/rococoa-core/src/main/java/org/rococoa/ID.java +++ b/rococoa-core/src/main/java/org/rococoa/ID.java @@ -33,7 +33,6 @@ * Technically, this should be {@link Native#POINTER_SIZE} not {@link Native#LONG_SIZE}, * but as they are both 32 on 32-bit and 64 on 64-bit we'll gloss over that. Ideally * it would be Pointer, but they have no protected constructors. - * */ public class ID extends NativeLong { diff --git a/rococoa-core/src/main/java/org/rococoa/Rococoa.java b/rococoa-core/src/main/java/org/rococoa/Rococoa.java index 6970e9d..3f86cff 100644 --- a/rococoa-core/src/main/java/org/rococoa/Rococoa.java +++ b/rococoa-core/src/main/java/org/rococoa/Rococoa.java @@ -161,10 +161,10 @@ public static T proxy(Object javaObject, Class javaTyp /** * Create a java.lang.reflect.Proxy or cglib proxy of type, which forwards - * invocations to invococationHandler. + * invocations to invocationHandler. */ @SuppressWarnings("unchecked") - private static T createProxy(final Class type, ObjCObjectInvocationHandler invocationHandler) { + private static T createProxy(Class type, ObjCObjectInvocationHandler invocationHandler) { if (type.isInterface()) { return (T) Proxy.newProxyInstance( invocationHandler.getClass().getClassLoader(), diff --git a/rococoa-core/src/main/java/org/rococoa/internal/MainThreadUtils.java b/rococoa-core/src/main/java/org/rococoa/internal/MainThreadUtils.java index 069ab82..dc2a538 100644 --- a/rococoa-core/src/main/java/org/rococoa/internal/MainThreadUtils.java +++ b/rococoa-core/src/main/java/org/rococoa/internal/MainThreadUtils.java @@ -53,7 +53,7 @@ private MainThreadUtils() { private static final Set asynchronousCallbacks = new HashSet<>(); /** - * Return the result of calling callable on the main Cococoa thread. + * Return the result of calling callable on the main Rococoa thread. */ @SuppressWarnings("unchecked") public static T callOnMainThread(RococoaLibrary rococoaLibrary, Callable callable) { diff --git a/rococoa-core/src/main/java/org/rococoa/internal/NSInvocationMapper.java b/rococoa-core/src/main/java/org/rococoa/internal/NSInvocationMapper.java index a2e722a..17d1ce1 100644 --- a/rococoa-core/src/main/java/org/rococoa/internal/NSInvocationMapper.java +++ b/rococoa-core/src/main/java/org/rococoa/internal/NSInvocationMapper.java @@ -51,7 +51,7 @@ public Object readArgumentFrom(NSInvocation invocation, int index, Class type } protected Object readFrom(Memory buffer, Class type) { - throw new Error("Should be overriden or bypassed"); + throw new Error("Should be overridden or bypassed"); } public abstract Memory bufferForResult(Object methodCallResult); diff --git a/rococoa-core/src/main/java/org/rococoa/internal/OCInvocationCallbacks.java b/rococoa-core/src/main/java/org/rococoa/internal/OCInvocationCallbacks.java index f9f6142..0e97ebd 100644 --- a/rococoa-core/src/main/java/org/rococoa/internal/OCInvocationCallbacks.java +++ b/rococoa-core/src/main/java/org/rococoa/internal/OCInvocationCallbacks.java @@ -47,7 +47,6 @@ * on the Java Object. * * @author duncan - * */ @SuppressWarnings("nls") public class OCInvocationCallbacks { diff --git a/rococoa-core/src/main/java/org/rococoa/internal/ObjCObjectInvocationHandler.java b/rococoa-core/src/main/java/org/rococoa/internal/ObjCObjectInvocationHandler.java index f27bfd5..b65caf5 100644 --- a/rococoa-core/src/main/java/org/rococoa/internal/ObjCObjectInvocationHandler.java +++ b/rococoa-core/src/main/java/org/rococoa/internal/ObjCObjectInvocationHandler.java @@ -53,7 +53,6 @@ * its Objective-C counterpart. * * @author duncan - * */ @SuppressWarnings("nls") public class ObjCObjectInvocationHandler implements InvocationHandler, MethodInterceptor { @@ -131,10 +130,7 @@ protected void finalize() throws Throwable { } try { if (callAcrossToMainThread()) { - Foundation.runOnMainThread(new Runnable() { - public void run() { - release(); - }}); + Foundation.runOnMainThread(this::release); } else { AutoreleaseBatcher autoreleaseBatcher = AutoreleaseBatcher.forThread(FINALIZE_AUTORELEASE_BATCH_SIZE); release(); @@ -259,13 +255,10 @@ private void handleInitMethod(Object result) { ocInstance = ID.fromLong(0); } - private Object sendOnThisOrMainThread(Method method, final ID id, final String selectorName, final Class returnType, final Object... args) { + private Object sendOnThisOrMainThread(Method method, ID id, String selectorName, Class returnType, Object... args) { if (callAcrossToMainThreadFor(method)) { return Foundation.callOnMainThread( - new Callable() { - public Object call() { - return Foundation.send(id, selectorName, returnType, args); - }}); + (Callable) () -> Foundation.send(id, selectorName, returnType, args)); } else { return Foundation.send(id, selectorName, returnType, args); @@ -309,17 +302,16 @@ private Object[] marshallArgsFor(Object[] args) { return null; } List result = new ArrayList<>(args.length); - for (int i = 0; i < args.length; i++) { - Object marshalled = marshall(args[i]); + for (Object arg : args) { + Object marshalled = marshall(arg); if (marshalled instanceof Object[]) { - // flatten varags, it would never(?) make sense to pass Object[] to Cococoa + // flatten varags, it would never(?) make sense to pass Object[] to Cocoa result.addAll(Arrays.asList((Object[]) marshalled)); - } - else { + } else { result.add(marshalled); } } - return result.toArray(new Object[result.size()]); + return result.toArray(new Object[0]); } private Object marshall(Object arg) { diff --git a/rococoa-core/src/main/java/org/rococoa/internal/RococoaTypeMapper.java b/rococoa-core/src/main/java/org/rococoa/internal/RococoaTypeMapper.java index f0559f3..350c840 100644 --- a/rococoa-core/src/main/java/org/rococoa/internal/RococoaTypeMapper.java +++ b/rococoa-core/src/main/java/org/rococoa/internal/RococoaTypeMapper.java @@ -19,7 +19,6 @@ package org.rococoa.internal; -import net.sf.cglib.core.Converter; import org.rococoa.ObjCObject; import org.rococoa.cocoa.foundation.NSObject; diff --git a/rococoa-core/src/test/java/org/rococoa/FoundationRetainReleaseTest.java b/rococoa-core/src/test/java/org/rococoa/FoundationRetainReleaseTest.java index 2a016da..f952cc0 100644 --- a/rococoa-core/src/test/java/org/rococoa/FoundationRetainReleaseTest.java +++ b/rococoa-core/src/test/java/org/rococoa/FoundationRetainReleaseTest.java @@ -77,5 +77,4 @@ public class FoundationRetainReleaseTest extends RococoaTestCase { assertRetainCount(1, idOfString); Foundation.cfRelease(idOfString); } - } diff --git a/rococoa-core/src/test/java/org/rococoa/FoundationStructureReturnTest.java b/rococoa-core/src/test/java/org/rococoa/FoundationStructureReturnTest.java index bd6772a..b097cde 100644 --- a/rococoa-core/src/test/java/org/rococoa/FoundationStructureReturnTest.java +++ b/rococoa-core/src/test/java/org/rococoa/FoundationStructureReturnTest.java @@ -19,17 +19,17 @@ package org.rococoa; -import static org.junit.jupiter.api.Assertions.*; - +import com.sun.jna.Library; +import com.sun.jna.Native; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.rococoa.test.RococoaTestCase; - -import com.sun.jna.Library; -import com.sun.jna.Native; import vavi.util.Debug; import vavi.util.StringUtil; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + @SuppressWarnings("nls") public class FoundationStructureReturnTest extends RococoaTestCase { diff --git a/rococoa-core/src/test/java/org/rococoa/JavaProxyTest.java b/rococoa-core/src/test/java/org/rococoa/JavaProxyTest.java index f967e33..1a9568c 100644 --- a/rococoa-core/src/test/java/org/rococoa/JavaProxyTest.java +++ b/rococoa-core/src/test/java/org/rococoa/JavaProxyTest.java @@ -1,13 +1,13 @@ /* * Copyright 2007, 2008 Duncan McGregor - * + * * This file is part of Rococoa, a library to allow Java to talk to Cocoa. - * + * * Rococoa is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - * + * * Rococoa is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the @@ -16,11 +16,10 @@ * You should have received a copy of the GNU Lesser General Public License * along with Rococoa. If not, see . */ - -package org.rococoa; -import static org.junit.jupiter.api.Assertions.*; +package org.rococoa; +import com.sun.jna.NativeLong; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.rococoa.cocoa.foundation.NSAutoreleasePool; @@ -30,52 +29,55 @@ import org.rococoa.cocoa.foundation.NSString; import org.rococoa.test.RococoaTestCase; -import com.sun.jna.NativeLong; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; @SuppressWarnings("nls") public class JavaProxyTest extends RococoaTestCase { - + public static class JavaImplementor { public Object arg; - + public void nothing() { arg = null; } - + public ID sayHello() { return Foundation.cfString("Hello"); } - + public ID testTakesIDReturnsID(ID id) { arg = id; return Foundation.cfString("Hello"); } - + public NSObject takesNSObjectReturnsNSObject(NSObject s) { arg = s; return s; } - + public void takesInt_AndInt(int a, int b) { arg = new Object[] {a, b}; } - + public byte takesStringReturnsByte(NSString s) { arg = s; return 42; } - + public boolean takesBooleanReturnsBoolean(boolean b) { arg = b; return !b; } - + public String takesJavaStringReturnsJavaString(String s) { arg = s; return s.toLowerCase(); } - + public TestStruct takesStructureReturnsStructure(TestStruct s) { arg = s; return new TestStruct(s.anInt, s.aDouble); @@ -85,7 +87,7 @@ public TestStruct.ByValue takesStructureByValueReturnsStructureByValue(TestStruc arg = s; return new TestStruct.ByValue(s.anInt, s.aDouble); } - + public NativeLong takesNativeLongReturnsNativeLong(NativeLong l) { arg = l; return l; @@ -95,7 +97,7 @@ public long takesLongReturnsLong(long l) { arg = l; return l; } - + public double takesDoubleReturnsDouble(double d) { arg = d; return d; @@ -104,84 +106,95 @@ public double takesDoubleReturnsDouble(double d) { public void notify(NSNotification notification) { this.arg = notification; } - } + } private JavaImplementor implementor; private NSObject proxy; - - @BeforeEach public void setUp() throws Exception { + + @BeforeEach + public void setUp() throws Exception { implementor = new JavaImplementor(); proxy = Rococoa.proxy(implementor, NSObject.class); // hang onto this to prevent GC issues - } - - @Test public void testRepondsToSelector() { + } + + @Test + public void testRepondsToSelector() { // respond to selector is required for delegates - assertEquals(0, (byte) Foundation.send(proxy.id(), "respondsToSelector:", + assertEquals(0, (byte) Foundation.send(proxy.id(), "respondsToSelector:", byte.class, Foundation.selector("Bo"))); - assertEquals(1, (byte) Foundation.send(proxy.id(), "respondsToSelector:", + assertEquals(1, (byte) Foundation.send(proxy.id(), "respondsToSelector:", byte.class, Foundation.selector("sayHello"))); } - - @Test public void testNoArgsReturnsVoid() { + + @Test + public void testNoArgsReturnsVoid() { implementor.arg = "something"; ID result = Foundation.sendReturnsID(proxy.id(), "nothing"); assertTrue(result.isNull()); assertNull(implementor.arg); } - @Test public void testNoArgsReturnsID() { + @Test + public void testNoArgsReturnsID() { ID result = Foundation.sendReturnsID(proxy.id(), "sayHello"); - assertEquals("Hello", Foundation.toString(result)); + assertEquals("Hello", Foundation.toString(result)); assertNull(implementor.arg); } - @Test public void testTakesIDReturnsID() { - ID result = Foundation.sendReturnsID(proxy.id(), "testTakesIDReturnsID:", - ID.fromLong(42)); - assertEquals("Hello", Foundation.toString(result)); + @Test + public void testTakesIDReturnsID() { + ID result = Foundation.sendReturnsID(proxy.id(), "testTakesIDReturnsID:", + ID.fromLong(42)); + assertEquals("Hello", Foundation.toString(result)); assertEquals(ID.fromLong(42), implementor.arg); } - - @Test public void testTakesNSObjectReturnsNSObject() { - ID result = Foundation.sendReturnsID(proxy.id(), "takesNSObjectReturnsNSObject:", + + @Test + public void testTakesNSObjectReturnsNSObject() { + ID result = Foundation.sendReturnsID(proxy.id(), "takesNSObjectReturnsNSObject:", Foundation.cfString("hello")); assertEquals("hello", Foundation.toString(result)); - assertEquals("hello", + assertEquals("hello", Rococoa.cast((NSObject) implementor.arg, NSString.class).toString()); - // as parameter was NSObject, it lost its string-ness + // as parameter was NSObject, it lost its string-ness } - @Test public void testTakesStringReturnsByte() { - byte result = Foundation.send(proxy.id(), "takesStringReturnsByte:", + @Test + public void testTakesStringReturnsByte() { + byte result = Foundation.send(proxy.id(), "takesStringReturnsByte:", byte.class, Foundation.cfString("hello")); assertEquals(42, result); assertEquals("hello", ((NSString) implementor.arg).toString()); } - - @Test public void testTakesBooleanReturnsBoolean() { - assertTrue(Foundation.send(proxy.id(), "takesBooleanReturnsBoolean:", + + @Test + public void testTakesBooleanReturnsBoolean() { + assertTrue(Foundation.send(proxy.id(), "takesBooleanReturnsBoolean:", boolean.class, false)); - assertFalse(Foundation.send(proxy.id(), "takesBooleanReturnsBoolean:", + assertFalse(Foundation.send(proxy.id(), "takesBooleanReturnsBoolean:", boolean.class, true)); } - - @Test public void testTakesIntAndInt() { - ID result = Foundation.sendReturnsID(proxy.id(), "takesInt:AndInt:", + + @Test + public void testTakesIntAndInt() { + ID result = Foundation.sendReturnsID(proxy.id(), "takesInt:AndInt:", 42, -1); assertTrue(result.isNull()); Object[] arg = (Object[]) implementor.arg; assertEquals(42, arg[0]); assertEquals(-1, arg[1]); } - - @Test public void testTakesJavaStringReturnsJavaString() { - assertEquals("lower", Foundation.send(proxy.id(), "takesJavaStringReturnsJavaString:", + + @Test + public void testTakesJavaStringReturnsJavaString() { + assertEquals("lower", Foundation.send(proxy.id(), "takesJavaStringReturnsJavaString:", String.class, "LoWeR")); } - - @Test public void testSendAndReceiveStructByReference() { + + @Test + public void testSendAndReceiveStructByReference() { TestStruct struct = new TestStruct(42, Math.PI); - TestStruct result = Foundation.send(proxy.id(), "takesStructureReturnsStructure:", + TestStruct result = Foundation.send(proxy.id(), "takesStructureReturnsStructure:", TestStruct.class, struct); assertEquals(42, ((TestStruct) implementor.arg).anInt, "passing to java"); assertEquals(Math.PI, ((TestStruct) implementor.arg).aDouble, 0.00001, "passing to java"); @@ -189,57 +202,62 @@ public void notify(NSNotification notification) { assertEquals(Math.PI, result.aDouble, 0.00001, "returning to OC"); } - @Test public void testSendAndReceiveStructByValue() { + @Test + public void testSendAndReceiveStructByValue() { // Hmmm, difficult to prove this is passed by value TestStruct.ByValue struct = new TestStruct.ByValue(42, Math.PI); - TestStruct result = Foundation.send(proxy.id(), "takesStructureByValueReturnsStructureByValue:", + TestStruct result = Foundation.send(proxy.id(), "takesStructureByValueReturnsStructureByValue:", TestStruct.ByValue.class, struct); assertEquals(42, ((TestStruct) implementor.arg).anInt, "passing to java"); assertEquals(Math.PI, ((TestStruct) implementor.arg).aDouble, 0.00001, "passing to java"); assertEquals(42, result.anInt, "returning to OC"); assertEquals(Math.PI, result.aDouble, 0.00001, "returning to OC"); } - - @Test public void testSendAndReceiveNativeLong() { - NativeLong result = Foundation.send(proxy.id(), "takesNativeLongReturnsNativeLong:", + + @Test + public void testSendAndReceiveNativeLong() { + NativeLong result = Foundation.send(proxy.id(), "takesNativeLongReturnsNativeLong:", NativeLong.class, new NativeLong(42)); assertEquals(42, result.longValue()); } - - @Test public void testSendAndReceiveLong() { - long result = Foundation.send(proxy.id(), "takesLongReturnsLong:", + + @Test + public void testSendAndReceiveLong() { + long result = Foundation.send(proxy.id(), "takesLongReturnsLong:", long.class, 42); assertEquals(42, result); - result = Foundation.send(proxy.id(), "takesLongReturnsLong:", + result = Foundation.send(proxy.id(), "takesLongReturnsLong:", long.class, Long.MAX_VALUE); assertEquals(Long.MAX_VALUE, result); } - - @Test public void testSendAndReceiveDouble() { - double result = Foundation.send(proxy.id(), "takesDoubleReturnsDouble:", + + @Test + public void testSendAndReceiveDouble() { + double result = Foundation.send(proxy.id(), "takesDoubleReturnsDouble:", double.class, Math.PI); assertEquals(Double.doubleToLongBits(Math.PI), Double.doubleToLongBits(result)); - - result = Foundation.send(proxy.id(), "takesDoubleReturnsDouble:", + + result = Foundation.send(proxy.id(), "takesDoubleReturnsDouble:", double.class, Double.MAX_VALUE); assertEquals(Double.doubleToLongBits(Double.MAX_VALUE), Double.doubleToLongBits(result)); } - - @Test public void testMultipleCallbacks() { + + @Test + public void testMultipleCallbacks() { // We managed to have static callback data, so that the last callback // registered was always the one called! // @see https://rococoa.dev.java.net/issues/show_bug.cgi?id=9 JavaImplementor implementor2 = new JavaImplementor(); ObjCObject proxy2 = Rococoa.proxy(implementor2); - + Foundation.sendReturnsVoid(proxy.id(), "testTakesIDReturnsID:", ID.fromLong(42)); assertEquals(ID.fromLong(42), implementor.arg); Foundation.sendReturnsVoid(proxy2.id(), "testTakesIDReturnsID:", ID.fromLong(43)); assertEquals(ID.fromLong(43), implementor2.arg); - } - + } + @Test public void testNotifications() { NSNotificationCenter notificationCentre = NSNotificationCenter.CLASS.defaultCenter(); ID observer = proxy.id(); @@ -250,14 +268,15 @@ public void notify(NSNotification notification) { null); NSNotification notification = NSNotification.CLASS.notificationWithName_object("MyNotification", null); - + assertNull(implementor.arg); - notificationCentre.postNotification(notification); + notificationCentre.postNotification(notification); assertEquals(notification, implementor.arg); notificationCentre.removeObserver(observer); } - - @Test public void testMemoryManagement() { + + @Test + public void testMemoryManagement() { // we were autorelease'ing the proxy - so that this failed NSNotificationCenter notificationCentre = NSNotificationCenter.CLASS.defaultCenter(); ID observer = proxy.id(); @@ -269,7 +288,7 @@ public void notify(NSNotification notification) { pool.drain(); pool = NSAutoreleasePool.new_(); - NSNotification notification = NSNotification.CLASS.notificationWithName_object("MyNotification", null); + NSNotification notification = NSNotification.CLASS.notificationWithName_object("MyNotification", null); notificationCentre.postNotification(notification); notificationCentre.removeObserver(observer); } From 55851d0a27aceb9e812ff307eb73fb3fc2beb3c3 Mon Sep 17 00:00:00 2001 From: Naohide Sano Date: Sun, 6 Nov 2022 12:51:25 +0900 Subject: [PATCH 29/36] [core] review tests --- .../java/org/rococoa/FoundationMemoryAssumptionsTest.java | 4 ++-- .../test/java/org/rococoa/FoundationRetainReleaseTest.java | 2 +- rococoa-core/src/test/java/org/rococoa/FoundationTest.java | 2 +- rococoa-core/src/test/java/org/rococoa/JavaProxyTest.java | 6 +++++- .../test/java/org/rococoa/RococoaObjectOwnershipTest.java | 6 +++--- .../rococoa/internal/RococoaObjCObjectByReferenceTest.java | 2 +- 6 files changed, 13 insertions(+), 9 deletions(-) diff --git a/rococoa-core/src/test/java/org/rococoa/FoundationMemoryAssumptionsTest.java b/rococoa-core/src/test/java/org/rococoa/FoundationMemoryAssumptionsTest.java index 275449a..0f34487 100644 --- a/rococoa-core/src/test/java/org/rococoa/FoundationMemoryAssumptionsTest.java +++ b/rococoa-core/src/test/java/org/rococoa/FoundationMemoryAssumptionsTest.java @@ -103,7 +103,7 @@ public void testAutoreleaseFactoryMethod() { Foundation.cfRelease(idNSString); } - @Disabled + @Disabled("because of crash") @Test public void crashDoubleFreeing() { ID idNSObject = Foundation.sendReturnsID(Foundation.getClass("NSObject"), "new"); @@ -113,7 +113,7 @@ public void crashDoubleFreeing() { Foundation.cfRelease(idNSObject); // crash } - @Disabled + @Disabled("because of crash") @Test public void zombies() { assertEquals("YES", System.getenv("NSZombiesEnabled")); diff --git a/rococoa-core/src/test/java/org/rococoa/FoundationRetainReleaseTest.java b/rococoa-core/src/test/java/org/rococoa/FoundationRetainReleaseTest.java index f952cc0..59ed799 100644 --- a/rococoa-core/src/test/java/org/rococoa/FoundationRetainReleaseTest.java +++ b/rococoa-core/src/test/java/org/rococoa/FoundationRetainReleaseTest.java @@ -28,7 +28,6 @@ import org.junit.jupiter.api.Test; @SuppressWarnings("nls") -@Disabled("by vavi because of crash") public class FoundationRetainReleaseTest extends RococoaTestCase { @Test public void test() { @@ -64,6 +63,7 @@ public class FoundationRetainReleaseTest extends RococoaTestCase { // causes count to go to 0 and dispose will happen } + @Disabled("by vavi because of crash") @Test public void testInitedObject() { NSAutoreleasePool pool = NSAutoreleasePool.new_(); diff --git a/rococoa-core/src/test/java/org/rococoa/FoundationTest.java b/rococoa-core/src/test/java/org/rococoa/FoundationTest.java index f88f6b7..12091ec 100644 --- a/rococoa-core/src/test/java/org/rococoa/FoundationTest.java +++ b/rococoa-core/src/test/java/org/rococoa/FoundationTest.java @@ -83,7 +83,7 @@ class FoundationTest extends RococoaTestCase { assertEquals(Math.E, aDoubleValue, 0.001); } - @Disabled("by vavi") + @Disabled("by vavi because of jna") @Test void testFloat() { ID clas = Foundation.getClass("NSNumber"); ID aFloat = Foundation.sendReturnsID(clas, "numberWithFloat:", 3.142f); diff --git a/rococoa-core/src/test/java/org/rococoa/JavaProxyTest.java b/rococoa-core/src/test/java/org/rococoa/JavaProxyTest.java index 1a9568c..e64616b 100644 --- a/rococoa-core/src/test/java/org/rococoa/JavaProxyTest.java +++ b/rococoa-core/src/test/java/org/rococoa/JavaProxyTest.java @@ -258,7 +258,11 @@ public void testMultipleCallbacks() { assertEquals(ID.fromLong(43), implementor2.arg); } - @Test public void testNotifications() { + /** + * @see "https://developer.apple.com/documentation/foundation/nsnotificationcenter/1415360-addobserver?language=objc" + */ + @Test + public void testNotifications() { NSNotificationCenter notificationCentre = NSNotificationCenter.CLASS.defaultCenter(); ID observer = proxy.id(); notificationCentre.addObserver_selector_name_object( diff --git a/rococoa-core/src/test/java/org/rococoa/RococoaObjectOwnershipTest.java b/rococoa-core/src/test/java/org/rococoa/RococoaObjectOwnershipTest.java index d25dfcf..af0427e 100644 --- a/rococoa-core/src/test/java/org/rococoa/RococoaObjectOwnershipTest.java +++ b/rococoa-core/src/test/java/org/rococoa/RococoaObjectOwnershipTest.java @@ -54,18 +54,18 @@ public void factoryMethodOnClassYieldsPooledObject2() { check(shouldBeInPool, () -> Rococoa.create("NSDate", NSDate.class, "dateWithTimeIntervalSince1970:", NSNumber.CLASS.numberWithInt(0))); } - @Disabled("by vavi") + @Disabled("by vavi ditto") @Test public void factoryMethodOnClassYieldsPooledObject() { // TODO - see above check(shouldBeInPool, () -> NSDate.CLASS.dateWithTimeIntervalSince1970(0.0)); } - @Disabled("by vavi") + @Disabled("by vavi ditto") @Test public void createYieldsNonPooledObject() { check(shouldNotBeInPool, () -> Rococoa.create("NSDate", NSDate.class)); } - @Disabled("by vavi") + @Disabled("by vavi ditto") @Test public void newYieldsNonPooledObject() { // calling new on an NSClass results in a NOT autorelease'd object check(shouldNotBeInPool, () -> Rococoa.create("NSDate", NSDate.class, "new")); diff --git a/rococoa-core/src/test/java/org/rococoa/internal/RococoaObjCObjectByReferenceTest.java b/rococoa-core/src/test/java/org/rococoa/internal/RococoaObjCObjectByReferenceTest.java index de13a8c..47c8990 100644 --- a/rococoa-core/src/test/java/org/rococoa/internal/RococoaObjCObjectByReferenceTest.java +++ b/rococoa-core/src/test/java/org/rococoa/internal/RococoaObjCObjectByReferenceTest.java @@ -59,7 +59,7 @@ public void testNSNumberFromInt() { assertEquals(42, nsNumber.intValue()); } - @Disabled("by vavi") + @Disabled("by vavi because of ???") @Test public void testArgument() { NSAutoreleasePool pool = NSAutoreleasePool.new_(); From 9e4c58c081fcac7c4898a9864bd06b82e960a795 Mon Sep 17 00:00:00 2001 From: Naohide Sano Date: Sun, 13 Nov 2022 12:20:57 +0900 Subject: [PATCH 30/36] update github ci settings --- .github/workflows/codeql-analysis.yml | 12 +++------ .github/workflows/maven-publish.yml | 36 ++++++++++++++------------- .github/workflows/maven.yml | 25 ++++++++++++------- 3 files changed, 39 insertions(+), 34 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 977c305..16cd591 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -30,15 +30,11 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v2 - with: - # We must fetch at least the immediate parents so that if this is - # a pull request then we can checkout the head. - fetch-depth: 2 + uses: actions/checkout@v3 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v1 + uses: github/codeql-action/init@v2 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -48,7 +44,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - - name: Autobuild + - name: build run: mvn -B install --file pom.xml -DskipTest # ℹī¸ Command-line programs to run using the OS shell. @@ -59,4 +55,4 @@ jobs: # uses a compiled language - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v1 + uses: github/codeql-action/analyze@v2 diff --git a/.github/workflows/maven-publish.yml b/.github/workflows/maven-publish.yml index 28c8038..a271f45 100644 --- a/.github/workflows/maven-publish.yml +++ b/.github/workflows/maven-publish.yml @@ -13,20 +13,22 @@ jobs: runs-on: macos-latest steps: - - uses: actions/checkout@v2 - - name: Set up JDK 1.8 - uses: actions/setup-java@v2 - with: - java-version: '8' - distribution: 'adopt' - cache: maven - server-id: github # Value of the distributionManagement/repository/id field of the pom.xml - settings-path: ${{ github.workspace }} # location for the settings.xml file - - - name: Build with Maven - run: mvn -B install --file pom.xml - - - name: Publish to GitHub Packages Apache Maven - run: mvn deploy -s $GITHUB_WORKSPACE/settings.xml -Dmaven.test.skip=true - env: - GITHUB_TOKEN: ${{ github.token }} + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Set up JDK 8 + uses: actions/setup-java@v3 + with: + java-version: '8' + distribution: 'temurin' + cache: maven + server-id: github # Value of the distributionManagement/repository/id field of the pom.xml + settings-path: ${{ github.workspace }} # location for the settings.xml file + + - name: Build with Maven + run: mvn -B install --file pom.xml + + - name: Publish to GitHub Packages Apache Maven + run: mvn deploy -s $GITHUB_WORKSPACE/settings.xml -Dmaven.test.skip=true + env: + GITHUB_TOKEN: ${{ github.token }} diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 0802814..22a5a81 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -15,12 +15,19 @@ jobs: runs-on: macos-latest steps: - - uses: actions/checkout@v2 - - name: Set up JDK 1.8 - uses: actions/setup-java@v2 - with: - java-version: '8' - distribution: 'adopt' - cache: maven - - name: Build with Maven - run: mvn -B install --file pom.xml + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Check w/o SNAPSHOT when "bump version" + if: ${{ contains(github.event.head_commit.message, 'bump version') }} + run: grep "" pom.xml | head -1 | grep -v SNAPSHOT + + - name: Set up JDK 8 + uses: actions/setup-java@v3 + with: + java-version: '8' + distribution: 'temurin' + cache: maven + + - name: Build with Maven + run: mvn -B install --file pom.xml From ec63cd7efc029d721b316c2eb7ff5523763c2a86 Mon Sep 17 00:00:00 2001 From: Naohide Sano Date: Tue, 15 Nov 2022 23:55:31 +0900 Subject: [PATCH 31/36] [vision] add Detecting Human Body Poses capability --- .../rococoa/cocoa/vision/VNCoreMLRequest.java | 24 +++- .../vision/VNDetectHumanBodyPoseRequest.java | 41 ++++++ .../rococoa/cocoa/vision/VNDetectedPoint.java | 33 +++++ .../vision/VNHumanBodyPoseObservation.java | 120 ++++++++++++++++++ .../cocoa/vision/VNImageRequestHandler.java | 2 +- .../vision/VNPixelBufferObservation.java | 11 ++ .../org/rococoa/cocoa/vision/VNPoint.java | 38 ++++++ .../cocoa/vision/VNRecognizedPoint.java | 33 +++++ .../vision/VNRecognizedPointsObservation.java | 31 +++++ .../org/rococoa/cocoa/vision/VNRequest.java | 33 +++-- .../rococoa/cocoa/vision/VisionLibrary.java | 6 +- .../org/rococoa/cocoa/vision/VisionTest.java | 86 +++++++++++++ .../src/test/resources/logging.properties | 4 +- rococoa-contrib/src/test/resources/test.webp | Bin 0 -> 174088 bytes 14 files changed, 449 insertions(+), 13 deletions(-) create mode 100644 rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNDetectHumanBodyPoseRequest.java create mode 100644 rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNDetectedPoint.java create mode 100644 rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNHumanBodyPoseObservation.java create mode 100644 rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNPoint.java create mode 100644 rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNRecognizedPoint.java create mode 100644 rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNRecognizedPointsObservation.java create mode 100644 rococoa-contrib/src/test/java/org/rococoa/cocoa/vision/VisionTest.java create mode 100644 rococoa-contrib/src/test/resources/test.webp diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNCoreMLRequest.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNCoreMLRequest.java index 5c4af77..818b372 100644 --- a/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNCoreMLRequest.java +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNCoreMLRequest.java @@ -8,12 +8,16 @@ import java.util.logging.Logger; +import com.sun.jna.Pointer; +import org.rococoa.ID; +import org.rococoa.ObjCBlock; import org.rococoa.ObjCClass; +import org.rococoa.ObjCObjectByReference; import org.rococoa.Rococoa; /** - * VNCoreMLRequest. + * An image analysis request that uses a Core ML model to process images. * * @author Naohide Sano (nsano) * @version 0.00 2022-10-15 nsano initial version
@@ -28,12 +32,30 @@ public interface _Class extends ObjCClass { VNCoreMLRequest alloc(); } + /** Creates a model container to be used with VNCoreMLRequest based on a Core ML model. */ public abstract VNCoreMLRequest initWithModel(VNCoreMLModel model); + /** + * A type alias to encapsulate the syntax for the completion handler block + * that's invoked after the request has finished processing. + */ + public interface VNRequestCompletionHandler extends ObjCBlock { + void apply(ID/*VNRequest*/ requestId, ObjCObjectByReference errorRef); + } + + /** + * Creates a model container to be used with VNCoreMLRequest + * based on a Core ML model, with an optional completion handler. + */ + public abstract VNCoreMLRequest initWithModel_completionHandler(VNCoreMLModel model, ID/*VNRequestCompletionHandler*/ completionHandler); + /** utility */ public static VNCoreMLRequest newRequest(VNCoreMLModel model) { return CLASS.alloc().initWithModel(model); } + /** + * The Core ML model on which the request is based, wrapped in a VNCoreMLModel. + */ public abstract VNCoreMLModel model(); } diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNDetectHumanBodyPoseRequest.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNDetectHumanBodyPoseRequest.java new file mode 100644 index 0000000..d399f4d --- /dev/null +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNDetectHumanBodyPoseRequest.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2022 by Naohide Sano, All rights reserved. + * + * Programmed by Naohide Sano + */ + +package org.rococoa.cocoa.vision; + +import java.util.logging.Logger; + +import org.rococoa.ObjCClass; +import org.rococoa.Rococoa; + + +/** + * A request that detects a human body pose. + * + * @author Naohide Sano (nsano) + * @version 0.00 2022-10-16 nsano initial version
+ */ +public abstract class VNDetectHumanBodyPoseRequest extends VNImageBasedRequest { + + static { + VisionLibrary.library.toString(); + } + + private static final Logger logger = Logger.getLogger(VNDetectHumanBodyPoseRequest.class.getName()); + + public static final _Class CLASS = Rococoa.createClass("VNDetectHumanBodyPoseRequest", _Class.class); + + public interface _Class extends ObjCClass { + VNDetectHumanBodyPoseRequest alloc(); + } + + public abstract VNDetectHumanBodyPoseRequest init(); + + /** utility */ + public static VNDetectHumanBodyPoseRequest newRequest() { + return CLASS.alloc().init(); + } +} diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNDetectedPoint.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNDetectedPoint.java new file mode 100644 index 0000000..cf72b54 --- /dev/null +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNDetectedPoint.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2022 by Naohide Sano, All rights reserved. + * + * Programmed by Naohide Sano + */ + +package org.rococoa.cocoa.vision; + +import java.util.logging.Logger; + +import org.rococoa.ObjCClass; +import org.rococoa.Rococoa; + + +/** + * An object that represents a normalized point in an image, along with a confidence value. + * + * @author Naohide Sano (nsano) + * @version 0.00 2022-10-16 nsano initial version
+ */ +public abstract class VNDetectedPoint extends VNPoint { + + private static final Logger logger = Logger.getLogger(VNDetectedPoint.class.getName()); + + public static final _Class CLASS = Rococoa.createClass("VNDetectedPoint", _Class.class); + + public interface _Class extends ObjCClass { + VNDetectedPoint alloc(); + } + + /** A confidence score that indicates the detected point’s accuracy. */ + public abstract float/*VNConfidence*/ confidence(); +} diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNHumanBodyPoseObservation.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNHumanBodyPoseObservation.java new file mode 100644 index 0000000..d8f393f --- /dev/null +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNHumanBodyPoseObservation.java @@ -0,0 +1,120 @@ +/* + * Copyright (c) 2022 by Naohide Sano, All rights reserved. + * + * Programmed by Naohide Sano + */ + +package org.rococoa.cocoa.vision; + +import java.util.logging.Logger; +import java.util.stream.IntStream; + +import org.rococoa.ObjCClass; +import org.rococoa.ObjCObjectByReference; +import org.rococoa.Rococoa; +import org.rococoa.cocoa.coregraphics.CGPoint; +import org.rococoa.cocoa.foundation.NSArray; +import org.rococoa.cocoa.foundation.NSDictionary; +import org.rococoa.cocoa.foundation.NSError; + + +/** + * An observation that provides the body points the analysis recognized. + * + * @author Naohide Sano (nsano) + * @version 0.00 2022-10-16 nsano initial version
+ */ +public abstract class VNHumanBodyPoseObservation extends VNRecognizedPointsObservation { + + static { + VisionLibrary.library.toString(); + } + + private static final Logger logger = Logger.getLogger(VNHumanBodyPoseObservation.class.getName()); + + public static final _Class CLASS = Rococoa.createClass("VNHumanBodyPoseObservation", _Class.class); + + public interface _Class extends ObjCClass { + VNHumanBodyPoseObservation alloc(); + } + + public abstract VNHumanBodyPoseObservation init(); + + /** The names of the available joints in the observation. */ + public abstract NSArray availableJointNames(); + + /** The available joint group names in the observation. */ + public abstract NSArray availableJointsGroupNames(); + + /** Retrieves the recognized point for a joint name. */ + public abstract VNRecognizedPoint recognizedPointForJointName_error(String/*String*/ jointName, ObjCObjectByReference/*NSError*/ error); + + /** + * Retrieves the recognized points associated with the joint group name. + * @return NSDictionary + */ + public abstract NSDictionary recognizedPointsForJointsGroupName_error(String/*VNHumanBodyPoseObservationJointsGroupName*/ jointsGroupName, ObjCObjectByReference/*NSError*/ error); + + public static final String Nose = "Nose"; + public static final String LeftEye = "left_eye_joint"; + public static final String RightEye = "right_eye_joint"; + public static final String LeftEar = "left_ear_joint"; + public static final String RightEar = "right_ear_joint"; + public static final String LeftShoulder = "left_shoulder_1_joint"; + public static final String RightShoulder = "right_shoulder_1_joint"; + public static final String Neck = "neck_1_joint"; + public static final String LeftElbow = "left_forearm_joint"; + public static final String RightElbow = "right_forearm_joint"; + public static final String LeftWrist = "LeftWrist"; + public static final String RightWrist = "RightWrist"; + public static final String LeftHip = "left_upLeg_joint"; + public static final String RightHip = "right_upLeg_joint"; + public static final String Root = "root"; + public static final String LeftKnee = "left_leg_joint"; + public static final String RightKnee = "right_leg_joint"; + public static final String LeftAnkle = "left_foot_joint"; + public static final String RightAnkle = "right_foot_joint"; + + public static final String RecognizedPointGroupKeyAll = "VNIPOAll"; + public static final String BodyLandmarkRegionKeyFace = "VNBLKFACE"; + public static final String BodyLandmarkRegionKeyTorso = "VNBLKTORSO"; + public static final String BodyLandmarkRegionKeyLeftArm = "VNBLKLARM"; + public static final String BodyLandmarkRegionKeyRightArm = "VNBLKRARM"; + public static final String BodyLandmarkRegionKeyLeftLeg = "VNBLKLLEG"; + public static final String BodyLandmarkRegionKeyRightLeg = "VNBLKRLEG"; + + private static boolean done = false; + private void debug() { + if (done) return; + NSArray names = availableJointNames(); + for (int i = 0; i < names.count(); i++) { +logger.fine("joint key: " + names.objectAtIndex(i)); + } + names = availableJointsGroupNames(); + for (int i = 0; i < names.count(); i++) { +logger.fine("group key: " + names.objectAtIndex(i)); + } + done = true; + } + + /** @return CGPoint[] */ + public static Object convert(VNHumanBodyPoseObservation observation) { +//observation.debug(); + ObjCObjectByReference errorRef = new ObjCObjectByReference(); + NSDictionary recognizedPoints = observation.recognizedPointsForJointsGroupName_error(BodyLandmarkRegionKeyTorso, errorRef); + NSError error = errorRef.getValueAs(NSError.class); + if (error != null) { + throw new IllegalStateException(error.description()); + } + // Torso joint names in a clockwise ordering. + String[] torsoJointNames = { + Neck, RightShoulder, RightHip, Root, LeftHip, LeftShoulder + }; + CGPoint[] imagePoints = new CGPoint[torsoJointNames.length]; + IntStream.range(0, torsoJointNames.length).forEach(i -> { + VNRecognizedPoint point = Rococoa.cast(recognizedPoints.objectForKey(torsoJointNames[i]), VNRecognizedPoint.class); + imagePoints[i] = point.confidence() > 0 ? point.location() : null; + }); + return imagePoints; + } +} diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNImageRequestHandler.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNImageRequestHandler.java index 9a57ffd..964b84c 100644 --- a/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNImageRequestHandler.java +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNImageRequestHandler.java @@ -55,7 +55,7 @@ public static VNImageRequestHandler initWithCGImage(Pointer/*CGImageRef*/ image) public abstract boolean performRequests_error(NSArray requests, ObjCObjectByReference/*NSError*/ error); /** utility */ - public void performRequests(VNCoreMLRequest request) { + public void performRequests(VNImageBasedRequest request) { ObjCObjectByReference errorRef = new ObjCObjectByReference(); NSArray coreMLRequests = NSArray.arrayWithObjects(request); performRequests_error(coreMLRequests, errorRef); diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNPixelBufferObservation.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNPixelBufferObservation.java index a1f2a5d..d8e8e9f 100644 --- a/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNPixelBufferObservation.java +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNPixelBufferObservation.java @@ -9,8 +9,11 @@ import java.util.logging.Logger; import com.sun.jna.Pointer; +import com.sun.jna.ptr.PointerByReference; import org.rococoa.ObjCClass; import org.rococoa.Rococoa; +import org.rococoa.cocoa.corevideo.VideoToolboxLibrary; +import org.rococoa.cocoa.foundation.NSObject; /** @@ -34,4 +37,12 @@ public interface _Class extends ObjCClass { /** A feature name that the CoreML model defines. */ public abstract String featureName(); + + /** @return CGImage Pointer */ + static Pointer convert(VNPixelBufferObservation observation) { + Pointer pixelBuffer = observation.pixelBuffer(); + PointerByReference imageRef = new PointerByReference(); + VideoToolboxLibrary.library.VTCreateCGImageFromCVPixelBuffer(pixelBuffer, null, imageRef); + return imageRef.getValue(); + } } diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNPoint.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNPoint.java new file mode 100644 index 0000000..e09d286 --- /dev/null +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNPoint.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2022 by Naohide Sano, All rights reserved. + * + * Programmed by Naohide Sano + */ + +package org.rococoa.cocoa.vision; + +import java.util.logging.Logger; + +import org.rococoa.ObjCClass; +import org.rococoa.Rococoa; +import org.rococoa.cocoa.coregraphics.CGPoint; +import org.rococoa.cocoa.foundation.NSObject; + + +/** + * An immutable object that represents a single, two-dimensional point in an image. + * + * @author Naohide Sano (nsano) + * @version 0.00 2022-10-16 nsano initial version
+ */ +public abstract class VNPoint extends NSObject { + + private static final Logger logger = Logger.getLogger(VNPoint.class.getName()); + + public static final _Class CLASS = Rococoa.createClass("VNPoint", _Class.class); + + public interface _Class extends ObjCClass { + VNPoint alloc(); + } + + public abstract double x(); + + public abstract double y(); + + public abstract CGPoint location(); +} diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNRecognizedPoint.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNRecognizedPoint.java new file mode 100644 index 0000000..b866b45 --- /dev/null +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNRecognizedPoint.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2022 by Naohide Sano, All rights reserved. + * + * Programmed by Naohide Sano + */ + +package org.rococoa.cocoa.vision; + +import java.util.logging.Logger; + +import org.rococoa.ObjCClass; +import org.rococoa.Rococoa; + + +/** + * An object that represents a normalized point in an image, along with an identifier label and a confidence value. + * + * @author Naohide Sano (nsano) + * @version 0.00 2022-10-16 nsano initial version
+ */ +public abstract class VNRecognizedPoint extends VNDetectedPoint { + + private static final Logger logger = Logger.getLogger(VNRecognizedPoint.class.getName()); + + public static final _Class CLASS = Rococoa.createClass("VNRecognizedPoint", _Class.class); + + public interface _Class extends ObjCClass { + VNRecognizedPoint alloc(); + } + + /** The point’s identifier label. */ + public abstract String/*VNRecognizedPointKey*/ identifier(); +} diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNRecognizedPointsObservation.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNRecognizedPointsObservation.java new file mode 100644 index 0000000..8732498 --- /dev/null +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNRecognizedPointsObservation.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2022 by Naohide Sano, All rights reserved. + * + * Programmed by Naohide Sano + */ + +package org.rococoa.cocoa.vision; + +import java.util.logging.Logger; + +import com.sun.jna.Pointer; +import org.rococoa.ObjCClass; +import org.rococoa.Rococoa; + + +/** + * An observation that provides the body points the analysis recognized. + * + * @author Naohide Sano (nsano) + * @version 0.00 2022-10-16 nsano initial version
+ */ +public abstract class VNRecognizedPointsObservation extends VNObservation { + + private static final Logger logger = Logger.getLogger(VNRecognizedPointsObservation.class.getName()); + + public static final _Class CLASS = Rococoa.createClass("VNRecognizedPointsObservation", _Class.class); + + public interface _Class extends ObjCClass { + VNRecognizedPointsObservation alloc(); + } +} diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNRequest.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNRequest.java index 243335a..3e820ea 100644 --- a/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNRequest.java +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNRequest.java @@ -6,6 +6,7 @@ package org.rococoa.cocoa.vision; +import java.util.function.Consumer; import java.util.logging.Logger; import com.sun.jna.Pointer; @@ -44,18 +45,32 @@ public interface _Class extends ObjCClass { */ public abstract NSArray results(); - /** utility */ - public Pointer result() { + /** utility for only 1st */ + public Object result() { NSArray results = results(); -logger.finer(results.count() + ", " + results.firstObject()); - if (results.firstObject().isKindOfClass(VNPixelBufferObservation.CLASS)) { - Pointer pixelBuffer = Rococoa.cast(results.firstObject(), VNPixelBufferObservation.class).pixelBuffer(); - PointerByReference imageRef = new PointerByReference(); - VideoToolboxLibrary.library.VTCreateCGImageFromCVPixelBuffer(pixelBuffer, null, imageRef); - return imageRef.getValue(); +logger.finer("result: " + results.count()); + return each(results.firstObject()); + } + + /** utility conversion */ + private Object each(NSObject object) { +logger.finer("result each: " + object); + if (object.isKindOfClass(VNPixelBufferObservation.CLASS)) { + return VNPixelBufferObservation.convert(Rococoa.cast(object, VNPixelBufferObservation.class)); + } else if (object.isKindOfClass(VNHumanBodyPoseObservation.CLASS)) { + return VNHumanBodyPoseObservation.convert(Rococoa.cast(object, VNHumanBodyPoseObservation.class)); } else { // TODO - throw new UnsupportedOperationException(results.firstObject().getClass().getName()); + throw new UnsupportedOperationException(object.getClass().getName()); + } + } + + /** utility for each */ + public void result(Consumer c) { + NSArray results = results(); +logger.finer("result: " + results.count()); + for (int i = 0; i < results.count(); i++) { + c.accept(each(results.objectAtIndex(i))); } } } diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VisionLibrary.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VisionLibrary.java index 8a33d5b..7944b03 100644 --- a/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VisionLibrary.java +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VisionLibrary.java @@ -8,10 +8,12 @@ import com.sun.jna.Library; import com.sun.jna.Native; +import com.sun.jna.NativeLong; +import org.rococoa.cocoa.coregraphics.CGPoint; /** - * VisionLibrary. + * Apply computer vision algorithms to perform a variety of tasks on input images and video. * * @author Naohide Sano (nsano) * @version 0.00 2022-10-15 nsano initial version
@@ -20,4 +22,6 @@ public interface VisionLibrary extends Library { VisionLibrary library = Native.load("Vision", VisionLibrary.class); + /** Projects a point in normalized coordinates into image coordinates. */ + CGPoint VNImagePointForNormalizedPoint(CGPoint normalizedPoint, NativeLong imageWidth, NativeLong imageHeight); } diff --git a/rococoa-contrib/src/test/java/org/rococoa/cocoa/vision/VisionTest.java b/rococoa-contrib/src/test/java/org/rococoa/cocoa/vision/VisionTest.java new file mode 100644 index 0000000..ddc0f31 --- /dev/null +++ b/rococoa-contrib/src/test/java/org/rococoa/cocoa/vision/VisionTest.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2022 by Naohide Sano, All rights reserved. + * + * Programmed by Naohide Sano + */ + +package org.rococoa.cocoa.vision; + +import java.awt.BasicStroke; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Font; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.image.BufferedImage; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.Arrays; +import java.util.concurrent.atomic.AtomicInteger; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.JScrollPane; + +import com.sun.jna.NativeLong; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.EnabledIfSystemProperty; +import org.rococoa.cocoa.coregraphics.CGImage; +import org.rococoa.cocoa.coregraphics.CGPoint; +import vavi.util.Debug; + + +class VisionTest { + + @Test + @EnabledIfSystemProperty(named = "vavi.test", matches = "ide") + void test1() throws Exception { + + VNDetectHumanBodyPoseRequest request = VNDetectHumanBodyPoseRequest.newRequest(); + + CGImage cgImage = new CGImage(Files.newInputStream(Paths.get("src/test/resources/test.webp"))); + + VNImageRequestHandler handler = VNImageRequestHandler.initWithCGImage(cgImage.pointer()); +long t = System.currentTimeMillis(); + handler.performRequests(request); + + BufferedImage image = cgImage.toBufferedImage(); + Graphics2D g = image.createGraphics(); + + final int W = 10; + request.result(o -> { + CGPoint[] points = (CGPoint[]) o; +Debug.println("points: " + points.length); +Debug.println((System.currentTimeMillis() - t) + " ms"); + AtomicInteger i = new AtomicInteger(1); + Arrays.stream(points).forEach(p -> { + CGPoint cp = (VisionLibrary.library.VNImagePointForNormalizedPoint( + p, new NativeLong(cgImage.getWidth()), new NativeLong(cgImage.getHeight()))); + int x = cp.x.intValue(); + int y = cgImage.getHeight() - cp.y.intValue(); + g.setColor(Color.green); + g.setStroke(new BasicStroke(W)); + g.drawArc(x - W, y - W, 2 * W, 2 * W, 0, 360); + g.setFont(new Font("Dialog", Font.PLAIN, 32)); + g.drawString(String.valueOf(i.getAndIncrement()), x - 2 * W, y - 2 * W); + }); + }); + show(image); + } + + /** */ + void show(BufferedImage image) { + JFrame frame = new JFrame(); + JPanel panel = new JPanel() { + public void paintComponent(Graphics g) { + g.drawImage(image, 0, 0, this); + } + }; + panel.setPreferredSize(new Dimension(image.getWidth(), image.getHeight())); + frame.setContentPane(new JScrollPane(panel)); + frame.setTitle("Vision"); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.pack(); + frame.setVisible(true); + while (true) Thread.yield(); + } +} \ No newline at end of file diff --git a/rococoa-contrib/src/test/resources/logging.properties b/rococoa-contrib/src/test/resources/logging.properties index 59329b7..4a257ea 100644 --- a/rococoa-contrib/src/test/resources/logging.properties +++ b/rococoa-contrib/src/test/resources/logging.properties @@ -5,4 +5,6 @@ java.util.logging.ConsoleHandler.formatter=vavi.util.logging.VaviFormatter vavi.util.level=FINE org.rococoa.level=ALL -org.rococoa.foundation.level=FINEST +org.rococoa.foundation.level=INFO +org.rococoa.internal.level=INFO +org.rococoa.cocoa.appkit.level=ALL diff --git a/rococoa-contrib/src/test/resources/test.webp b/rococoa-contrib/src/test/resources/test.webp new file mode 100644 index 0000000000000000000000000000000000000000..56179ddc5fa9973adc0cb7c538b6718e21bd9a07 GIT binary patch literal 174088 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%0DPQHux?-(74Y-CisT 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 AZvX%Q literal 0 HcmV?d00001 From a1294caaf753c8cc02fae5c5f925fb23ac96379d Mon Sep 17 00:00:00 2001 From: Naohide Sano Date: Tue, 15 Nov 2022 23:58:06 +0900 Subject: [PATCH 32/36] update settings --- .github/workflows/codeql-analysis.yml | 4 ++-- README.md | 7 +++++-- pom.xml | 2 +- rococoa-core/src/test/resources/test-logging.properties | 8 ++++---- 4 files changed, 12 insertions(+), 9 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 16cd591..9b7e6be 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -45,9 +45,9 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: build - run: mvn -B install --file pom.xml -DskipTest + run: mvn -B install --file pom.xml -Dmaven.test.skip=true - # ℹī¸ Command-line programs to run using the OS shell. + # ℹī¸ Command-line programs to run using the OS shell. # 📚 https://git.io/JvXDl # ✏ī¸ If the Autobuild fails above, remove it and uncomment the following three lines diff --git a/README.md b/README.md index dfbd284..56b4b8e 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ implementation of Objective-C interfaces in Java. ## How To -* [Basics](rococoa-core/readme.md#how-to) +* [Basics](rococoa-core/readme.md#How-To) * [CIFilter Java2D BufferedImageOp](rococoa-contrib/src/test/java/org/rococoa/cocoa/coreimage/CoreImageTest.java) * [CoreML](rococoa-contrib/src/test/java/org/rococoa/cocoa/coreml/CoreMLTest.java) * [iTunes Library](https://github.com/umjammer/vavi-sound-sandbox/tree/master/src/main/java/vavix/rococoa/ituneslibrary) @@ -32,7 +32,8 @@ implementation of Objective-C interfaces in Java. ## Limitation * obj-c class's method call with float argument doesn't work - * i found [the reason](https://github.com/java-native-access/jna/issues/463#issuecomment-1286015013) + * [the reason](https://github.com/java-native-access/jna/issues/463#issuecomment-1286015013) + * https://www.mikeash.com/pyblog/objc_msgsends-new-prototype.html * block ## TODO @@ -42,6 +43,8 @@ implementation of Objective-C interfaces in Java. * http://cocoawithlove.com/2009/10/how-blocks-are-implemented-and.html * http://www.opensource.apple.com/source/libclosure/libclosure-38/BlockImplementation.txt * ~~CIFilter~~ (done) +* `cglib` is mostly [suspended](https://github.com/cglib/cglib#readme) + * `cglib` recommends [ByteBuddy](https://bytebuddy.net/) that is based on `asm` same as the `cglib` ## References diff --git a/pom.xml b/pom.xml index 17c6fd7..edc8405 100644 --- a/pom.xml +++ b/pom.xml @@ -219,7 +219,7 @@ org.junit junit-bom - 5.9.0 + 5.9.1 pom import diff --git a/rococoa-core/src/test/resources/test-logging.properties b/rococoa-core/src/test/resources/test-logging.properties index ded1be7..7e5268e 100644 --- a/rococoa-core/src/test/resources/test-logging.properties +++ b/rococoa-core/src/test/resources/test-logging.properties @@ -1,11 +1,11 @@ handlers=java.util.logging.ConsoleHandler +.level=INFO +java.util.logging.ConsoleHandler.level=ALL +java.util.logging.ConsoleHandler.formatter=org.rococoa.test.LogFormatter org.rococoa.level=FINEST org.rococoa.foundation.level=FINEST org.rococoa.proxy.level=FINEST -java.util.logging.ConsoleHandler.level=ALL -java.util.logging.ConsoleHandler.formatter=org.rococoa.test.LogFormatter - vavi.util.level=FINER -com.sun.jna.level=ALL \ No newline at end of file +com.sun.jna.level=ALL From f973dcb72ad9ea819dd1f70a81dac0df97aac294 Mon Sep 17 00:00:00 2001 From: Naohide Sano Date: Wed, 16 Nov 2022 00:04:26 +0900 Subject: [PATCH 33/36] update dependencies --- rococoa-cocoa/pom.xml | 2 +- rococoa-contrib/pom.xml | 2 +- .../java/org/rococoa/cocoa/vision/VNCoreMLRequest.java | 8 -------- rococoa-core/pom.xml | 4 +--- 4 files changed, 3 insertions(+), 13 deletions(-) diff --git a/rococoa-cocoa/pom.xml b/rococoa-cocoa/pom.xml index a0d9759..e9e6406 100644 --- a/rococoa-cocoa/pom.xml +++ b/rococoa-cocoa/pom.xml @@ -61,7 +61,7 @@ com.github.umjammer vavi-commons - 1.1.7 + 1.1.8 test diff --git a/rococoa-contrib/pom.xml b/rococoa-contrib/pom.xml index 43316b3..8c3c176 100644 --- a/rococoa-contrib/pom.xml +++ b/rococoa-contrib/pom.xml @@ -70,7 +70,7 @@ com.github.umjammer vavi-commons - 1.1.7 + 1.1.8 test diff --git a/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNCoreMLRequest.java b/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNCoreMLRequest.java index 818b372..91e0671 100644 --- a/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNCoreMLRequest.java +++ b/rococoa-contrib/src/main/java/org/rococoa/cocoa/vision/VNCoreMLRequest.java @@ -35,14 +35,6 @@ public interface _Class extends ObjCClass { /** Creates a model container to be used with VNCoreMLRequest based on a Core ML model. */ public abstract VNCoreMLRequest initWithModel(VNCoreMLModel model); - /** - * A type alias to encapsulate the syntax for the completion handler block - * that's invoked after the request has finished processing. - */ - public interface VNRequestCompletionHandler extends ObjCBlock { - void apply(ID/*VNRequest*/ requestId, ObjCObjectByReference errorRef); - } - /** * Creates a model container to be used with VNCoreMLRequest * based on a Core ML model, with an optional completion handler. diff --git a/rococoa-core/pom.xml b/rococoa-core/pom.xml index f6c716c..7b6ca35 100644 --- a/rococoa-core/pom.xml +++ b/rococoa-core/pom.xml @@ -62,7 +62,6 @@ Rococoa.m ProxyForJava.m - ObjCBlocks.m test.m @@ -88,7 +87,6 @@ Rococoa.m ProxyForJava.m - ObjCBlocks.m @@ -225,7 +223,7 @@ com.github.umjammer vavi-commons - 1.1.7 + 1.1.8 test From e82d18cb55c77f17cc029f90b58c3f05963cf08f Mon Sep 17 00:00:00 2001 From: Naohide Sano Date: Wed, 16 Nov 2022 00:17:45 +0900 Subject: [PATCH 34/36] bump version --- pom.xml | 2 +- rococoa-auto/pom.xml | 2 +- rococoa-cocoa/pom.xml | 2 +- rococoa-contrib/pom.xml | 2 +- rococoa-core/pom.xml | 2 +- rococoa-functionaltest/pom.xml | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pom.xml b/pom.xml index edc8405..fd67123 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ org.rococoa rococoa-parent - 0.8.5-SNAPSHOT + 0.8.5 pom diff --git a/rococoa-auto/pom.xml b/rococoa-auto/pom.xml index d4374f0..af8113b 100644 --- a/rococoa-auto/pom.xml +++ b/rococoa-auto/pom.xml @@ -10,7 +10,7 @@ org.rococoa rococoa-parent - 0.8.5-SNAPSHOT + 0.8.5 Rococoa Autogenerated Cocoa Package diff --git a/rococoa-cocoa/pom.xml b/rococoa-cocoa/pom.xml index e9e6406..d77c98c 100644 --- a/rococoa-cocoa/pom.xml +++ b/rococoa-cocoa/pom.xml @@ -10,7 +10,7 @@ org.rococoa rococoa-parent - 0.8.5-SNAPSHOT + 0.8.5 Rococoa Cocoa Mappings diff --git a/rococoa-contrib/pom.xml b/rococoa-contrib/pom.xml index 8c3c176..8f7afd7 100644 --- a/rococoa-contrib/pom.xml +++ b/rococoa-contrib/pom.xml @@ -10,7 +10,7 @@ org.rococoa rococoa-parent - 0.8.5-SNAPSHOT + 0.8.5 Rococoa Contrib diff --git a/rococoa-core/pom.xml b/rococoa-core/pom.xml index 7b6ca35..ef30e3c 100644 --- a/rococoa-core/pom.xml +++ b/rococoa-core/pom.xml @@ -9,7 +9,7 @@ org.rococoa rococoa-parent - 0.8.5-SNAPSHOT + 0.8.5 Rococoa Core diff --git a/rococoa-functionaltest/pom.xml b/rococoa-functionaltest/pom.xml index 7638ee8..13d04b0 100644 --- a/rococoa-functionaltest/pom.xml +++ b/rococoa-functionaltest/pom.xml @@ -9,7 +9,7 @@ org.rococoa rococoa-parent - 0.8.5-SNAPSHOT + 0.8.5 Rococoa Functional Test From fcfdcd1e886d9e30242e82f1a45023b1e3b8c97a Mon Sep 17 00:00:00 2001 From: Naohide Sano Date: Wed, 16 Nov 2022 00:27:39 +0900 Subject: [PATCH 35/36] clean up --- .github/workflows/codeql-analysis.yml | 10 +++++++++- .../java/org/rococoa/cocoa/appkit/NSOpenPanel.java | 7 +------ .../java/org/rococoa/cocoa/appkit/NSSavePanel.java | 3 --- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 9b7e6be..f76b05b 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -41,10 +41,18 @@ jobs: # By default, queries listed here will override any specified in a config file. # Prefix the list here with "+" to use these queries and those in the config file. # queries: ./path/to/local/query, your-org/your-repo/queries@main + - name: Set up JDK 8 + uses: actions/setup-java@v3 + with: + java-version: '8' + distribution: 'temurin' + cache: maven + server-id: github # Value of the distributionManagement/repository/id field of the pom.xml + settings-path: ${{ github.workspace }} # location for the settings.xml file # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - - name: build + - name: Build with Maven run: mvn -B install --file pom.xml -Dmaven.test.skip=true # ℹī¸ Command-line programs to run using the OS shell. diff --git a/rococoa-cocoa/src/main/java/org/rococoa/cocoa/appkit/NSOpenPanel.java b/rococoa-cocoa/src/main/java/org/rococoa/cocoa/appkit/NSOpenPanel.java index 81d8288..5948b8f 100644 --- a/rococoa-cocoa/src/main/java/org/rococoa/cocoa/appkit/NSOpenPanel.java +++ b/rococoa-cocoa/src/main/java/org/rococoa/cocoa/appkit/NSOpenPanel.java @@ -19,15 +19,10 @@ package org.rococoa.cocoa.appkit; -import com.sun.webkit.network.URLs; -import org.rococoa.ID; - -import org.rococoa.cocoa.foundation.NSObject; import org.rococoa.Rococoa; import org.rococoa.RunOnMainThread; import org.rococoa.cocoa.foundation.NSArray; -import org.rococoa.cocoa.foundation.NSString; -import org.rococoa.cocoa.foundation.NSURL; +import org.rococoa.cocoa.foundation.NSObject; /** diff --git a/rococoa-cocoa/src/main/java/org/rococoa/cocoa/appkit/NSSavePanel.java b/rococoa-cocoa/src/main/java/org/rococoa/cocoa/appkit/NSSavePanel.java index b5578a5..e677916 100644 --- a/rococoa-cocoa/src/main/java/org/rococoa/cocoa/appkit/NSSavePanel.java +++ b/rococoa-cocoa/src/main/java/org/rococoa/cocoa/appkit/NSSavePanel.java @@ -9,9 +9,6 @@ import org.rococoa.ID; import org.rococoa.Rococoa; import org.rococoa.RunOnMainThread; -import org.rococoa.cocoa.foundation.NSArray; -import org.rococoa.cocoa.foundation.NSObject; -import org.rococoa.cocoa.foundation.NSString; import org.rococoa.cocoa.foundation.NSURL; From a106afc905f4cd57b7bf392dd01ddc2cba9fed9d Mon Sep 17 00:00:00 2001 From: Naohide Sano Date: Wed, 16 Nov 2022 00:33:50 +0900 Subject: [PATCH 36/36] =?UTF-8?q?=F0=9F=98=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/codeql-analysis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index f76b05b..865d4f9 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -53,7 +53,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Build with Maven - run: mvn -B install --file pom.xml -Dmaven.test.skip=true + run: mvn -B install --file pom.xml # ℹī¸ Command-line programs to run using the OS shell. # 📚 https://git.io/JvXDl