D言語からObjective-CとCocoaAPIを使いたい

NSButton を含め NSControl関連API を分けてみました。

NSArray および NSTextView関連APIを統合しました。

サンプルコード

Powered by Prism

cocoa/control.d

/**
 *      cocoa/control.d        Version 0.0.10
 */
module cocoa.control;
import core.attribute : optional, selector;
import cocoa.window;

extern (Objective-C)
extern class NSControl : NSView {
    override static NSControl alloc() @selector("alloc");
    override NSControl init(NSRect) @selector("initWithFrame:");
    void font(NSFont) @selector("setFont:");
    void target(NSColorWell) @selector("setTarget:"); 
    SEL action(SEL sel) @selector("setAction:");
    // extern (D) final SEL action_(string s) {  //
    //     return action(sel_registerName(s.toCs)); }
}

extern (Objective-C) 
extern class NSButton : NSControl{
    static NSButton checkbox(NSString, NSButton, SEL)
        @selector("checkboxWithTitle:target:action:");
    static NSButton radioButton(NSString,NSButton, SEL)
        @selector("radioButtonWithTitle:target:action:");
    static NSButton button(NSString, NSButton, SEL)
        @selector("buttonWithTitle:target:action:");
    override static NSButton alloc() @selector("alloc");
    override NSButton init() @selector("init");
    override NSButton init(NSRect) @selector("initWithFrame:");
    NSButton target(NSButton) @selector("setTarget:");
    override SEL action(SEL sel) @selector("setAction:");
    extern (D) final SEL action_(string s) { // 
        return action(sel_registerName(s.toCs)); }
    void type(NSButtonType) @selector("setButtonType:");
    void draw(NSRect, NSView) @selector("drawWithExpansionFrame:inView:");
    void draw(NSRect rect) @selector("drawRect:");
    // override CALayer layer() @selector("layer");
    void bezelStyle(NSBezelStyle) @selector("setBezelStyle:");
    NSBezelStyle bezelStyle() @selector("bezelStyle");
    // NSColor bgColor(NSColor) @selector("setBackgroundColor:");
    NSColor bezelColor(NSColor) @selector("setBezelColor:");
    void title(NSString) @selector("setTitle:");
    extern (D) final void title(string s) { return title(s.toNs); }
    NSAttributedString attrTitle() @selector("attributedTitle");
    void attrTitle(NSAttributedString) @selector("setAttributedTitle:");
    NSString title() @selector("title");
    void bordered(bool) @selector("setBordered:");
    void showsBorder(bool) @selector("setShowsBorderOnlyWhileMouseInside:");
    NSControlStateValue state() @selector("state");
    void setState(StateValue) @selector("setState:");
    void state(StateValue) @selector("setState:");
} 

enum NSControlStateValue : NSInteger { On = 1, Off = 0, Mixed = -1 }
alias StateValue = NSControlStateValue; 
alias stateVal = NSControlStateValue;
alias state = NSControlStateValue;  //
alias btnState = NSControlStateValue;

extern (Objective-C)
interface Res {
    bool respondsToSelector(SEL) @selector("respondsToSelector:");
}

NSAttributedString toAttrStr(string str, NSColor textColor) {
    NSMutableAttributedString mAttrStr
        = NSMutableAttributedString.alloc.init(str.toNs);
    NSFont font = NSFont.nameSize("YuMincho Demibold".toNs, 16);
    NSRange range = NSMakeRange(0, mAttrStr.length);
    mAttrStr.addAttrFont("NSFont".toNs, font, range);
    mAttrStr.addAttrColor("NSColor".toNs, textColor, range);
    NSMutableParagraphStyle paragraph = NSMutableParagraphStyle.alloc.init;
    paragraph.lineSpace = 9;
    mAttrStr.addAttrPara("NSParagraphStyle".toNs, paragraph, range);
    return mAttrStr.copy;
}

NSAttributedString toAttrStr(string str, NSFont font, NSColor textColor) {
    NSMutableAttributedString mAttrStr
        = NSMutableAttributedString.alloc.init(str.toNs);
    NSRange range = NSMakeRange(0, mAttrStr.length);
    mAttrStr.addAttrFont("NSFont".toNs, font, range);
    mAttrStr.addAttrColor("NSColor".toNs, textColor, range);
    NSMutableParagraphStyle paragraph = NSMutableParagraphStyle.alloc.init;
    paragraph.lineSpace = 9;
    mAttrStr.addAttrPara("NSParagraphStyle".toNs, paragraph, range);
    return mAttrStr.copy;
}

extern (Objective-C)
extern class NSMutableAttributedString : NSAttributedString {
    override static NSMutableAttributedString alloc()
        @selector("alloc");
    override NSMutableAttributedString init(NSString)
        @selector("initWithString:");
    NSUInteger length() @selector("length");
    void addAttrFont(NSString, NSFont, NSRange)
        @selector("addAttribute:value:range:");
    void addAttribute(NSString, NSFont, NSRange) 
        @selector("addAttribute:value:range:");
    void addAttrColor(NSString, NSColor, NSRange)
        @selector("addAttribute:value:range:");
    void addAttribute(NSString, NSColor, NSRange)
        @selector("addAttribute:value:range:");
    void addAttrPara(NSString, NSParagraphStyle, NSRange)
        @selector("addAttribute:value:range:");
    NSAttributedString copy() @selector("copy");
    override NSMutableAttributedString drawAtPoint(NSPoint) 
        @selector("drawAtPoint:");
}

extern (Objective-C)
extern class NSTextField : NSControl {
    override static NSTextField alloc() @selector("alloc");
    override NSTextField init() @selector("init");
    override NSTextField init(NSRect) @selector("initWithFrame:");
    static NSTextField labelStr(NSString) @selector("labelWithString:"); 
    override void font(NSFont) @selector("setFont:");
    void bezeled(bool) @selector("setBezeled:");
    void editable(bool) @selector("setEditable:");
    void selectable(bool) @selector("setSelectable:");
    void bordered(bool) @selector("setBordered:");
    void drawsBg(bool) @selector("setDrawsBackground:");
    override void wantsLayer(bool) @selector("setWantsLayer:");
    void textColor(NSColor) @selector("setTextColor:");
    void str(NSString) @selector("setStringValue:");
    extern (D) final void str(string s) { return str(s.toNs); }
    NSString str() @selector("stringValue");
    void holderStr(NSString) @selector("setPlaceholderString:");
    void holderStr(NSAttributedString) @selector("setPlaceholderString:");
    NSAttributedString attrStr() @selector("attributedStringValue");
    void attrStr(NSAttributedString) @selector("setAttributedStringValue:");
    void attrStr(NSMutableAttributedString) @selector("setAttributedStringValue:");
    NSColor bgColor() @selector("backgroundColor"); //
    void bgColor(NSColor) @selector("setBackgroundColor:"); //
    override SEL action(SEL sel) @selector("setAction:"); //
    extern (D) final SEL action_(string s) { // 
        return action(sel_registerName(s.toCs)); }
}

alias identifier = NSString; // 

enum NSTextFieldBezel : NSUInteger {
    Square      = 0,
    Rounded     = 1
}

alias NSBezelStyle = NSTextFieldBezelStyle;
alias BezelStyle = NSTextFieldBezelStyle;
enum NSTextFieldBezelStyle : NSUInteger { 
    Automatic           = 0,   // macOS 14.0+
    Push                = 1,   // macOS 14.0+
    FlexiblePush        = 2,   // macOS 14.0+
    Disclosure          = 5,   // macOS 10.12+
    Circular            = 7,   // macOS 10.12+
    HelpButton          = 9,   // macOS 10.12+
    SmallSquare         = 10,  // macOS 10.12+
    Toolbar             = 11,  // macOS 14.0+
    AccessoryBarAction  = 12,  // macOS 14.0+    
    AccessoryBar        = 13,  // macOS 14.0+
    PushDisclosure      = 14,  // macOS 14.0+
    Badge               = 15,  // macOS 10.7+
}

enum NSButtonType : NSUInteger {
    MomentaryLight          = 0,  // macOS 10.12+
    PushOnPushOff           = 1,  // macOS 10.12+
    Toggle                  = 2,  // macOS 10.12+
    Switch                  = 3,  // macOS 10.12+
    Radio                   = 4,  // macOS 10.12+
    MomentaryChange         = 5,  // macOS 10.12+
    PushOnOff               = 6,  // macOS 10.12+
    MomentaryPushIn         = 7,  // macOS 10.12+
    Accelerator             = 8,  // macOS 10.10.3+
    MultiLevelAccelerator   = 9,  // macOS 10.10.3+
}

alias buttonType = NSButtonType;  //

extern (Objective-C)
extern class NSFont : NSObject {
    static NSFont nameSize(NSString, CGFloat) @selector("fontWithName:size:");
    static NSFont fontWithName(NSString, CGFloat) @selector("fontWithName:size:"); //
}

extern (Objective-C)
extern class NSAttributedString : NSObject {
    override static NSAttributedString alloc() @selector("alloc");
    override NSAttributedString init() @selector("init");
    NSAttributedString init(NSString) @selector("initWithString:");
    NSAttributedString init(NSString, NSDictionary)
        @selector("initWithString:attributes:");
    NSAttributedString drawAtPoint(NSPoint) @selector("drawAtPoint:");
}

extern (Objective-C)
extern class NSMutableParagraphStyle : NSParagraphStyle {
    override static NSMutableParagraphStyle alloc() @selector("alloc");
    override NSMutableParagraphStyle init() @selector("init");
    void paraStyle(NSParagraphStyle) @selector("setParagraphStyle:");
    void lineSpace(CGFloat) @selector("setLineSpacing:");
}

extern (Objective-C)
extern class NSParagraphStyle : NSObject {  
}

extern (Objective-C)
extern class NSSlider : NSControl {
    override static NSSlider alloc() @selector("alloc");
    override NSSlider init(NSRect) @selector("initWithFrame:");
    static NSSlider sliderWithTarget(NSSlider, SEL) 
        @selector("sliderWithTarget:action:");
    static NSSlider slider(NSSlider, SEL) @selector("sliderWithTarget:action:");
    NSSlider target(NSSlider) @selector("setTarget:");
    override SEL action(SEL sel) @selector("setAction:");
    extern (D) final SEL action_(string s) { 
        return action(sel_registerName(s.toCs)); }
    bool continuous() @selector("isContinuous");
    void continuous(bool) @selector("setContinuous:");
    NSUInteger sliderType() @selector("sliderType");
    void sliderType(NSUInteger) @selector("setSliderType:");
    CGFloat knobThickness() @selector("knobThickness");
    void intValue(int) @selector("setIntValue:");
    int intValue() @selector("intValue");
    void maxValue(double) @selector("setMaxValue:");
    double maxValue() @selector("maxValue");
    void minValue(double) @selector("setMinValue:");
    double minValue() @selector("minValue");
    double value() @selector("value");
    void value(double) @selector("setDoubleValue:");
    void vertical(bool) @selector("setVertical:");
    NSColor trackFillColor(NSColor) @selector("setTrackFillColor:");
    void sizeToFit() @selector("sizeToFit");
}

enum NSSliderType : NSUInteger { Linear, Circular }

/*
extern (Objective-C)
extern class NSImageView : NSControl {
    override static NSImageView alloc() @selector("alloc");
    override NSImageView init(NSRect) @selector("initWithFrame:");
    NSImageScaling imageScaling() @selector("imageScaling");
}

enum NSImageScaling : NSUInteger {
    ProportionallyDown,     // 縦横比を維持したまま画像を縮小
    AxesIndependently,      // 画像の縦横比は保持されない
    NonZero,                // 画像の拡大縮小をしない
    ProportionallyUpOrDown  // 縦横比を維持しながら、最大にする
}
*/

extern (Objective-C)
extern class NSBox : NSView {
    override static NSBox alloc() @selector("alloc");
    override NSBox init() @selector("init");
    override NSBox init(NSRect) @selector("initWithFrame:");
    NSRect borderRect() @selector("borderRect");
    NSBoxType boxType() @selector("boxType");
    void boxType(NSBoxType) @selector("setBoxType:");
    bool transparent() @selector("transparent");
    NSString title() @selector("title");
    void title(NSString) @selector("setTitle:");
    extern (D) final void title(string s) { return title(s.toNs); }
    NSFont titleFont() @selector("titleFont");
    void titlePosition(NSTitlePosition) @selector("setTitlePosition:");
    NSRect titleRect() @selector("titleRect");
    NSColor borderColor() @selector("borderColor");
    void borderColor(NSColor) @selector("setBorderColor:");
    CGFloat borderWidth() @selector("borderWidth");
    void borderWidth(CGFloat) @selector("setBorderWidth:");
    CGFloat cornerRadius() @selector("cornerRadius");
    void cornerRadius(CGFloat) @selector("setCornerRadius:");
    NSColor fillColor() @selector("fillColor");
    NSView contentView() @selector("contentView");
    NSSize contentViewMargins() @selector("contentViewMargins");
    void setFrameFromContentFrame(NSRect contentFrame) 
        @selector("setFrameFromContentFrame:");
    void sizeToFit() @selector("sizeToFit");
}

enum NSBoxType : NSUInteger {
    Primary   = 0,
    Separator = 2,
    Custom    = 4
}

enum NSTitlePosition : NSUInteger {
    NoTitle     = 0,
    AboveTop    = 1,
    AtTop       = 2,
    BelowTop    = 3,
    AboveBottom = 4,
    AtBottom    = 5,
    BelowBottom = 6
}

struct objc_class;
alias Class = objc_class*;

extern (Objective-C)
extern class NSScrollView : NSView {
    override static NSScrollView alloc() @selector("alloc");
    override NSScrollView init() @selector("init");
    override NSScrollView init(NSRect) @selector("initWithFrame:");
    /*  Calculating Layout  */
    static NSSize frameSizeForContentSize(NSSize, Class, Class, // 
        NSBorderType, NSControlSize, NSScrollerStyle) @selector(
            "frameSizeForContentSize:horizontalScrollerClass:" 
          ~ "verticalScrollerClass:borderType:controlSize:scrollerStyle:");
    static NSSize contentSizeForFrameSize(NSSize, Class, Class, // 
        NSBorderType, NSControlSize, NSScrollerStyle) @selector(
            "contentSizeForFrameSize:horizontalScrollerClass:"
          ~ "verticalScrollerClass:borderType:controlSize:scrollerStyle:");
    /*  Determining Component Sizes  */
    NSSize contentSize() @selector("contentSize"); // 
    NSRect documentVisibleRect() @selector("documentVisibleRect"); // 
    /*  Managing Graphics Attributes  */ 
    NSColor backgroundColor() @selector("backgroundColor"); // 
    NSColor bgColor() @selector("backgroundColor"); // 
    void bgColor(NSColor) @selector("setBackgroundColor:"); // 
	void documentView(NSView) @selector("setDocumentView:");
    NSBorderType borderType() @selector("borderType"); // 
    void borderType(NSBorderType) @selector("setBorderType:"); // 
    NSCursor documentCursor() @selector("documentCursor"); // 

    NSRect visibleRect() @selector("visibleRect"); // 
    void contentView(NSView) @selector("setContentView:"); //
    void hRuler(bool) @selector("setHasHorizontalRuler:");
    void vRuler(bool) @selector("setHasVerticalRuler:");
    void rulersVisible(bool) @selector("setRulersVisible:");
    void autohidesScrollers(bool) @selector("setAutohidesScrollers:");
    void hScroller(bool) @selector("setHasHorizontalScroller:");
    void vScroller(bool) @selector("setHasVerticalScroller:");
    void scrollerStyle(NSScrollerStyle) @selector("setScrollerStyle:");
    override void frameOrigin(NSPoint) @selector("setFrameOrigin:"); // 23.12.19
    void adjustsContent(bool) @selector("setAutomaticallyAdjustsContentInsets:");
}

enum NSControlSize : NSUInteger { Mini, Small, Regular, Large, } // 
enum NSScrollerStyle : NSInteger { Legacy, Overlay }
enum NSBorderType : NSUInteger { No, Line, Bezel, Groover } // 枠なし、線、立体、溝

extern (Objective-C)
extern class NSClipView : NSView {
    override static NSClipView alloc() @selector("alloc");
    override NSClipView init() @selector("init");
    override NSClipView init(NSRect) @selector("initWithFrame:");
    /* Setting the Document View */  
    void documentView(NSView) @selector("setDocumentView:");
    /* Scrolling */  
    bool autoscroll(NSEvent) @selector("autoscroll:");
    // void autoscroll(bool) @selector("setAutoscroll:");
    NSRect constrainBoundsRect(NSRect) @selector("constrainBoundsRect:"); //
    NSEdgeInsets contentInsets() @selector("contentInsets"); // 



}

struct NSEdgeInsets {
    double bottom;
    double left;
    double right;
    double top;
}

extern (Objective-C)
extern class NSColorWell : NSControl {
    override static NSColorWell alloc() @selector("alloc");
    override NSColorWell init() @selector("init");
    override NSColorWell init(NSRect) @selector("initWithFrame:");
    void color(NSColor) @selector("setColor:");
    NSColor color() @selector("color");
    void bordered(bool) @selector("setBordered:");
    bool bordered() @selector("isBordered");
    void activate(bool) @selector("activate:");
    bool activate() @selector("isActivate");
    void deactivat() @selector("deactivate");
    void drawWell(NSRect) @selector("drawWellInside:");
    static NSColorWell colorWellWithStyle(NSColorWellStyle) 
        @selector("setColorWellWithStyle:");
    NSColorWellStyle colorWellStyle() @selector("colorWellStyle");
    override SEL action(SEL sel) @selector("setAction:");
    extern (D) final SEL action_(string s) { 
        return action(sel_registerName(s.toCs)); } // 
}

enum NSColorWellStyle : NSInteger {
    Default  = 0,
    Minimal  = 1,
    Expanded = 2
}

enum : string {   // NSColorSpaceName
    CaWhite = "NSCalibratedWhiteColorSpace", // 1.0 == white
    CaRGB   = "NSCalibratedRGBColorSpace",
    DeWhite = "NSDeviceWhiteColorSpace",     // 1.0 == white
    DeRGB   = "NSDeviceRGBColorSpace",
    DeCMYK  = "NSDeviceCMYKColorSpace",
    Named   = "NSNamedColorSpace",  // Used for "catalog" colors
    Pattern = "NSPatternColorSpace",
    Custom  = "NSCustomColorSpace"
}

/* NSArray */
extern (Objective-C)
extern class NSArray : NSObject {
    static NSArray array() @selector("array");
    static NSArray array(NSArray) @selector("arrayWithArray:");
    static NSArray array(NSString) @selector("arrayWithObject:");
    static NSArray array(NSString, NSUInteger) @selector("arrayWithObjects:count:");
    override NSArray init() @selector("init");
    NSArray init(NSArray) @selector("initWithArray:");
    NSArray init(NSArray, bool) @selector("initWithArray:copyItem:");
    NSInteger count() @selector("count");
    NSObject atIndex(NSUInteger) @selector("objectAtIndex:");
    NSView atIndex(int) @selector("objectAtIndex:");  // 
    NSDictionary dicAtIndex(NSUInteger) @selector("objectAtIndex:");
    NSString strAtIndex(NSUInteger) @selector("objectAtIndex:");
    // NSString atIndex(NSUInteger) @selector("objectAtIndex:");
    NSURL urlAtIndex(NSUInteger) @selector("objectAtIndex:"); // 
    NSArray arrayAtIndex(NSUInteger) @selector("objectAtIndex:");
    NSScreen scrAtIndex(NSUInteger) @selector("objectAtIndex:"); // 
    NSMutableArray copy(NSZone) @selector("mutableCopyWithZone:");
    NSMutableArray copy() @selector("mutableCopy");
    NSMutableArray muCopy() @selector("mutableCopy");
}

extern (Objective-C)
extern class NSMutableArray : NSArray {
    override static NSMutableArray alloc() @selector("alloc");
    override static NSMutableArray array() @selector("array");
    override NSMutableArray init() @selector("init");
    void add(NSObject) @selector("addObject:");
    void addArray(NSArray) @selector("addObjectsFromArray:");
    void add(NSMutableArray) @selector("addObjectsFromArray:");
    void add(NSString) @selector("addObject:");
    void insert(NSObject, NSUInteger) @selector("insertObject:atIndex:");
    void insert(NSArray, NSIndexSet) @selector("insertObjects:atIndexes:");
    NSArray copy() @selector("copy");
}

extern (Objective-C)
extern class NSIndexSet : NSObject {
    static NSIndexSet indexSet() @selector("indexset");
    static NSIndexSet indexSet(NSUInteger) @selector("indexSetWithIndex:");
    static NSIndexSet indexSet(NSRange) @selector("indexSetWithIndexesInRange:");
    override NSIndexSet init() @selector("init");
    NSUInteger count() @selector("count");
    NSUInteger first() @selector("firstIndex");
    NSUInteger last() @selector("lastIndex");
}

extern (Objective-C)
interface NSMutableCopying {
    // NSMutableArray copy(NSZone) @selector("mutableCopyWithZone:");
    NSMutableArray copy() @selector("mutableCopy");
    NSMutableDictionary copy() @selector("mutableCopy");
}

extern (Objective-C)
interface NSCopying {
    // NSCopying copy(NSZone) @selector("copyWithZone:");
    NSArray copy() @selector("copy");
    NSDictionary copy() @selector("copy");
    NSString copy() @selector("copy");
}

struct NSZone { }

extern (Objective-C)
extern class NSImage : NSObject {
    static NSArray imageTypes() @selector("imageTypes");
    static NSImage name(NSString) @selector("imageNamed:");
    override static NSImage alloc() @selector("alloc");
    NSImage init(NSString) @selector("initWithContentsOfFile:");
    NSImage init(NSURL) @selector("initWithContentsOfURL:");
    void draw(NSRect) @selector("drawInRect:");
    void draw(NSPoint, NSRect, NSUInteger, CGFloat)
        @selector("drawAtPoint:fromRect:operation:fraction:");
    NSSize size() @selector("size");
}

extern (Objective-C)  
extern class NSBundle : NSObject {  // ==
    static NSBundle mainBundle() @selector("mainBundle");
    NSString path(NSString, NSString) @selector("pathForResource:ofType:");
    NSString url(NSString) @selector("bundleWithURL:");
}

extern (Objective-C)
extern class NSDictionary : NSObject {
    /* Creating an Empty Dictionary */
    static NSDictionary dictionary() @selector("dictionary");
    override NSDictionary init() @selector("init"); //
    static NSDictionary dic(NSArray, NSArray) 
        @selector("dictionaryWithObject:forKeys:");
    static NSDictionary dic(NSArray, NSArray) 
        @selector("dictionaryWithObjects:forKeys:");  //  訂正 2024.10.29
    static NSDictionary dic(NSArray, NSArray, NSUInteger) 
        @selector("dictionaryWithObjects:forKeys:count:");  //
    /* Creating a Dictionary from Another Dictionary */  
    /* Creating a Dictionary from External Source */  
    /* Creating a Dictionary from an NSCoder */  
    /* Creating Key Sets for Shared-Key Optimized Dictionaries */  
    /* Counting Entires */ 
    NSUInteger count() @selector("count");
    /* Comparing Dictionaries */  
    /* Accessing Keys and Values */
    NSObject valueForKey(NSString) @selector("valueForKey:"); //
    NSString strForKey(NSString) @selector("objectForKey:");
    void strValForKey(NSString) @selector("setValueForKey:"); //
    NSString strForKey(NSString) @selector("objectForKey:"); //
    NSString key(NSString) @selector("objectForKey:");
    NSObject objectForKey(NSObject) @selector("objectForKey:");
    /* Enumerating Dictionaries */  
    /* Sorting Dictionaries */  
    /* Filtering Dictionaries */  
    /* Storing Dictionaries */  
    /* Accessing File Attributes */  
    /* Describing a Dictionary */ 

    // static NSDictionary dicStrStr("NSString, NSString, NSInteger") 
    //	@selector("dictionaryWithObjects:forKeys:count:");
    // static NSDictionary dicStrNum("NSString, NSNumber, NSInteger") 
    // 	@selector("dictionaryWithObjects:forKeys:count:");
    NSMutableDictionary copy() @selector("mutableCopy");
    
}

extern (Objective-C)
extern class NSMutableDictionary : NSDictionary {
    override static NSMutableDictionary dictionary() @selector("dictionary");
    NSMutableDictionary setObjKey(NSString, NSString) @selector("setObject:forKey:");
    NSString objKey(NSString) @selector("objectForKey:"); // keyの要素の取得
    void removeKey(NSString) @selector("removeObjectForKey:"); // keyの要素を削除
    void removeAll() @selector("removeAllObjects"); // 全要素を削除
    NSDictionary copy() @selector("copy");
}

/* TextAPI */
extern (Objective-C)
extern class NSTextView : NSText {
    override static NSTextView alloc() @selector("alloc");
    override NSTextView init() @selector("init");
    override NSTextView init(NSRect) @selector("initWithFrame:");
    override void frame(NSRect) @selector("setFrame:");
    void linkDetection(bool) 
        @selector("setAutomaticLinkDetectionEnabled:");
    void textCompletion(bool) 
        @selector("setAutomaticTextCompletionEnabled:");
    void autoresizingMask(NSAutoresizingMaskOptions) 
        @selector("setAutoresizingMask:");
    void resizeMask(ResizingMask) 
        @selector("setAutoresizingMask:"); // 2
    bool allowsUndo() @selector("allowsUndo"); // 
    void allowsUndo(bool) @selector("setAllowsUndo:"); //
}

extern (Objective-C)
extern class NSTextStorage : NSMutableAttributedString {}  // 

extern (Objective-C)
extern class NSText : NSView {
    override static NSText alloc() @selector("alloc");
    override NSText init(NSRect) @selector("initWithFrame:");
    NSFont font(NSFont) @selector("setFont:");
}

extern (Objective-C)
extern class NSOpenPanel : NSSavePanel {
    static NSOpenPanel openPanel() @selector("openPanel");
}

extern (Objective-C)
extern class NSSavePanel : NSPanel {
    static NSSavePanel savePanel() @selector("savePanel");
    void run() @selector("runModal");
}

extern (Objective-C)
extern class NSPanel : NSWindow { }

extern (Objective-C)
extern class NSEvent : NSObject {  // 追加 Cocoaから 24.01.26
    /* Creating an event object */ 
    /* Getting general event information */
    NSPoint locationInWindow() @selector("locationInWindow");
    NSPoint locatInWin() @selector("locationInWindow");
    NSWindow window() @selector("window");
    /* Getting modifier flags */
    NSEventModifierFlags modifierFlags() @selector("modifierFlags");
    /* Getting key event information */
    ushort keyCode() @selector("keyCode"); // 
    /* Getting mouse event information (readonly)*/
    NSUInteger pressedMouseButtons() @selector("pressedMouseButtons");
    NSTimeInterval doubleClickInterval() @selector("doubleClickInterval");
    NSPoint mouseLocation() @selector("mouseLocation");
    NSInteger buttonNumber() @selector("buttonNumber");
    NSInteger clickCount() @selector("clickCount");
    NSEventMask associatedEventsMask() @selector("associatedEventsMask");
    /* Monitoring app events */
}

alias NSTimeInterval = double;

enum NSEventMask : ulong {
    /* Getting Any Event */
    Any = ulong.max,  // NSUIntegerMax
    /* Getting Mouse-Related Events */
    LeftMouseDown      = 1UL << NSEventType.LeftMouseDown,
    LeftMouseDragged   = 1UL << NSEventType.LeftMouseDragged,
    LeftMouseUp        = 1UL << NSEventType.LeftMouseUp,
    RightMouseDown     = 1UL << NSEventType.RightMouseDown,
    RightMouseDragged  = 1UL << NSEventType.RightMouseDragged,
    RightMouseUp       = 1UL << NSEventType.RightMouseUp,
    OtherMouseDown     = 1UL << NSEventType.OtherMouseDown,
    OtherMouseDragged  = 1UL << NSEventType.OtherMouseDragged,
    OtherMouseUp       = 1UL << NSEventType.OtherMouseUp,
    MouseEntered       = 1UL << NSEventType.MouseEntered, 
    MouseMoved         = 1UL << NSEventType.MouseMoved,
    MouseExited        = 1UL << NSEventType.MouseExited,
    /* Getting Keyboard Events */
    KeyDown            = 1UL << NSEventType.KeyDown,
    KeyUp              = 1UL << NSEventType.KeyUp,
    /* Getting Touch Events */
    BeginGesture       = 1UL << NSEventType.BeginGesture,
    EndGesture         = 1UL << NSEventType.EndGesture,
    Magnify            = 1UL << NSEventType.Magnify,
    SmartMagnify       = 1UL << NSEventType.SmartMagnify,
    Swipe              = 1UL << NSEventType.Swipe,
    Rotate             = 1UL << NSEventType.Rotate,
    Gesture            = 1UL << NSEventType.Gesture,
    DirectTouch        = 1UL << NSEventType.DirectTouch,
    TablePoint         = 1UL << NSEventType.TablePoint,
    TableProximity     = 1UL << NSEventType.TableProximity,
    Pressure           = 1UL << NSEventType.Pressure,
    /* Getting Input Events */
    ScrollWheel        = 1UL << NSEventType.ScrollWheel,
    ChangeMode         = 1UL << NSEventType.ChangeMode,
    /* GettingSystem Events */
    AppKitDefined      = 1UL << NSEventType.AppKitDefined,
    ApplicationDefined = 1UL << NSEventType.ApplicationDefined,
    CursorUpdate       = 1UL << NSEventType.CursorUpdate,
    FlagsChanged       = 1UL << NSEventType.FlagsChanged,
    Periodic           = 1UL << NSEventType.Periodic,
    SystemDefined      = 1UL << NSEventType.SystemDefined,
}

enum NSEventType : NSUInteger {
    /* Getting Mouse-Related Event Types */
    LeftMouseDown      = 1,
    LeftMouseDragged   = 6,
    LeftMouseUp        = 2,
    RightMouseDown     = 3,
    RightMouseUp       = 4,
    RightMouseDragged  = 7,
    OtherMouseDown     = 25,
    OtherMouseDragged  = 27,
    OtherMouseUp       = 26,
    MouseMoved         = 5,
    MouseEntered       = 8,
    MouseExited        = 9,
    /* Getting Keyboard Event Types */
    KeyDown            = 10,
    KeyUp              = 11,
    /* Getting Touch-Based Events */
    BeginGesture       = 19,
    EndGesture         = 20,
    Magnify            = 30,
    SmartMagnify       = 32,
    Swipe              = 31,
    Rotate             = 18,
    Gesture            = 29,
    DirectTouch        = 37,
    TablePoint         = 23,
    TableProximity     = 24,
    Pressure           = 34,
    /* Getting Input Events */
    ScrollWheel       = 22,
    ChangeMode         = 38,
    /* GettingSystem Events */
    AppKitDefined      = 13,
    ApplicationDefined = 15,
    CursorUpdate       = 17,
    FlagsChanged       = 12,
    Periodic           = 16,
    QuickLook          = 33,
    SystemDefined      = 14,
}

enum NSEventModifierFlags : NSUInteger {
    CapsLoc =    1 << 16,
    Shift =      1 << 17,
    Control =    1 << 18,
    Option =     1 << 19,
    Command =    1 << 20,
    NumericPat = 1 << 21,
    Help =       1 << 22,
    Function =   1 << 23,
    DeviceIndependentFlagMask = 0xffff0000uL,
}

extern (Objective-C)
extern class NSError : NSObject {
    static NSError errorWithDomain(NSErrorDomain, NSInteger, NSDictionary) 
        @selector("errorWithDomain:code:userInfo:");
    // static NSError error(NSErrorDomain, NSInteger, NSDictionary) 
    //     @selector("errorWithDomain:code:userInfo:");
    override NSError init() @selector("init");
    extern (D)
    NSError error(ErrorDomain domain, int i, NSDictionary dic) {
        return errorWithDomain(domain.toNs, i, dic);
    }
}

alias NSErrorDomain = NSString; 

enum ErrorDomain : string {
    Cocoa           = "NSCocoaErrorDomain",
    POSIX           = "NSPOSIXErrorDomain",
    OSStatus        = "NSOSStatusErrorDomain",
    Mach            = "NSMachErrorDomain",
    URL             = "NSURLErrorDomain",
    StreamSOCKS     = "NSStreamSOCKErrorDomain",
    StreamSocketSSL = "NSStreamSocketSSLErrorDomain",
}

enum NSFileReadError : NSInteger {
    Unknown                    = 256,
    NoPermission               = 257,
    InvalidFileName            = 258,
    CorruptFileError           = 259,
    NoSuchFile                 = 260,
    InapplicableStringEncoding = 261,
    UnsupportedScheme          = 262,
    TooLarge                   = 263,
    UnknownStringEdncodeing    = 264,
}


extern (Objective-C)
extern class NSData : NSObject {
	/* Creating Data */
    // override static NSData alloc() @selector("alloc");
	static NSData data() @selector("data");
	static NSData bytes(void*, NSUInteger) @selector("dataWithBytes:length:");
	static NSData noCopy(void*, NSUInteger) @selector("dataWithBytesNoCopy:length:");
	static NSData noCopy(void*, NSUInteger, bool) 
		@selector("dataWithBytesNoCopy:length:freeWhenDone:");
	static NSData data(NSData) @selector("dataWithData:");
	NSData init(void*, NSUInteger) @selector("initWithBytes:length:");
	NSData initNoCopy(void*, NSUInteger) @selector("initWithBytesNoCopy:length:");
	// NSData initNoCopy(void*, NSUInteger, void*) 
	// 	@selector("initWithBytesNoCopy:length:deallocator:");
	NSData init(NSData) @selector("initWithData:");
	/* Reading Data from a File */
	static NSData data(NSString path) @selector("dataWithContentsOfFile:");
	static NSData data(NSString, NSDataReading, NSError) 
		@selector("dataWithContentsOfFile:options:NSError:");
	static NSData data(NSURL url) @selector("dataWithContentsOfURL:");
	/* Writing Data to a File */
	NSData writeFile(NSString path, bool) @selector("writeToFiel:atomically:");
	NSData writeFile(NSString, NSDataWriting, NSError) 
		@selector("writeToFile:options:error:");
    /* Encoding a Decoding Base64 Representations */ 
    /* Accessing UderLying Bytes */ 
    /* Finding Data */ 
    /* Testing Data */ 
    NSUInteger length() @selector("length");
    /* Compressing and Decompressing Data */
}

enum NSDataReading : NSUInteger {  // NSDataReadingOptions
	MappedIfSafe	= 1UL << 0, // ファイルを仮想メモリにマップ
	Uncached		= 1UL << 1, // キャッシュに保存すべきでない
	MappedAlways	= 1UL << 3  // ファイルをマップする
}

enum NSDataWriting : NSUInteger {
	Atomic 				= 1UL << 0,		// 補助ファイル使用
	WithoutOverwriting	= 1UL << 1, 	// ファイルが存在する時はエラー
	FileProtectionNone  = 0x10000000,
	ProtectNone			= 0x10000000,   // 暗号化しない
	FileProtectionComplete	= 0x20000000,
	ProtectComplete		= 0x20000000,	// ロックが解除されている間のみ
	FileProtectionCompleteUnlessOpen  = 0x30000000,
	ProtectUnlessOpen	= 0x30000000,	// ロック解除または開いているとき
	FileProtectionCompleteUntilFirstUserAuthentication	= 0x40000000,
	ProtectFirstUse		= 0x40000000,	// 最初に解除したとき
	FileProtectionMask	= 0xf0000000	// システムが使用
}

extern (Objective-C)
extern class NSException : NSObject {
    static NSException raise(NSExceptionName, NSString)
        @selector("raise:format:");
}

alias NSExceptionName = NSString;
alias ExceptionName = NSExceptionName;

/*    TableAPI.d --> control_api.d  */
extern (Objective-C)
extern class NSController : NSObject { 
    override static NSController alloc() @selector("alloc");
    override NSController init() @selector("init");
    // NSController init(NSCoder) @selector("initWithCorder:");
    void objectDidBeginEditing(NSEditor) @selector("objectDidBeginEditing:");
    void objectDidEndEditing(NSEditor) @selector("objectDidEndEditing:");
    bool commitEditing() @selector("commitEditing");
    void commitEditing(bool) @selector("isCommitEditing:");
    // void commitEditingWithDelegate(void*, SEL, void* )
    //     selector("commitEditingWithDelegate:didCommitSelector:contextInfo:");
    void descardEditing() @selector("discardEditing");
    bool editing() @selector("editing");
    void editing(bool) @selector("isEditing:");
}

extern (Objective-C)
interface NSEditor {}

extern (Objective-C)
extern class NSCursor : NSObject {
    NSCursor arrowCursor() @selector("arrowCursor");
    NSCursor iBeamCursor() @selector("IBeamCursor");
    NSCursor crosshairCursor() @selector("crosshairCursor");
    NSCursor closedHandCursor() @selector("closedHandCursor");
    NSCursor openHandCursor() @selector("openHandCursor");
    NSCursor pointingHandCursor() @selector("pointingHandCursor");
    NSCursor resizeLeftCursor() @selector("resizeLeftCursor");
    NSCursor resizeRightCursor() @selector("resizeRightCursor");
    NSCursor resizeLeftRightCursor() @selector("resizeLeftRightCursor");  
}

extern (Objective-C)
interface NSStandardKeyBindingResponding {
    /* Moving the Insertion Pointer */
    @optional void moveBackward(NSEvent event) @selector("moveBackward:");
    @optional void moveDown(NSEvent event) @selector("moveDown:");
    @optional void moveForward(NSEvent event) @selector("moveForward:");
    @optional void moveLeft(NSEvent event) @selector("moveLeft:");
    @optional void moveRight(NSEvent event) @selector("moveRight:");
    @optional void moveUp(NSEvent event) @selector("moveUp:");
}               

cocoa/window.d