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

NSSplitView に NSTextView と NSTableView を表示

split.png

サンプルコード

Powered by Prism

split/dub.json

{
    "authors": ["hidhok"],
    "description": "A D/Objective-C Cocoa application.",
    "name": "split",
    "dflags": ["-L-framework", "-LCocoa"],
    "sourceFiles": ["../cocoa/window",
                    "../cocoa/control",
                    "../cocoa/split_views",
                    "../cocoa/tables",
                    "../cocoa/images",
                    "../cocoa/menus"]
}               
split/source/app.d

/**
 *	  split/source/app.d       Version 0.0.2
 */
module split.main;
import core.attribute : optional, selector;
import std.stdio;
import cocoa.window;
import cocoa.control;
import cocoa.menus;
import split.view;

string appName;
string versionNo = "0.0.2";
string helpMessage =  "CocoaAPIを使用して、windowの分割を\nD言語で表示してみました。";

ViewController vCtrlr;
NSWindow win;

void main() {
    auto delegate_ = AppDelegate.alloc.init;
    NSApp.delegate_ = cast(void*) delegate_;
    NSApp.activationPolicy = NSAppActivationPolicy.regular;
    NSApp.run;
}

extern (Objective-C)
class AppDelegate : NSObject {
    override static AppDelegate alloc() @selector("alloc");
    override typeof(this) init() @selector("init");
    bool applicationShouldTerminateAfterLastWindowClosed(
            NSNotification notification) @selector(
            "applicationShouldTerminateAfterLastWindowClosed:") {
        return true;
    }
    void applicationDidFinishLaunching(NSNotification notification) 
                @selector("applicationDidFinishLaunching:") {
        buildWindow;
        buildContents;
    }
    void aboutPanel() @selector("aboutPanel") {
        NSMutableDictionary options = NSMutableDictionary.dictionary;
        // NSImage img = NSImage.name("AppIcon.icns".toNs);
        // options.setObjKey(img, "ApplicationIcon".toNs);
        options.setObjKey(versionNo.toNs, "Version".toNs);
        options.setObjKey("horkew.la.coocan.jp".toNs, "Copyright".toNs);
        options.setObjKey(versionNo.toNs, "ApplicationVersion".toNs);
        NSApplication.shared_.aboutPanelOptions(options.copy);
    }
    void showHelp() @selector("showHelp") {
        dialog("Help", helpMessage);
    }
} 

void buildWindow() {
    appName = NSProcessInfo.processInfo.processName.toDs;
    NSApp.menu = miniMenu(appName);
    NSRect w_rect = NSMakeRect(100, 550, 400, 400);
    immutable w_style = NSWindowStyleMask.titled |
                        NSWindowStyleMask.closable |
                        NSWindowStyleMask.resizable |
                        NSWindowStyleMask.miniaturizable;
    win = NSWindow.alloc.init(w_rect, w_style, backing.buffered, false);
    win.title = (appName ~ " (D言語テスト)").toNs;
    win.minSize = NSSize(100, 128);
    vCtrlr = ViewController.alloc.init;
    vCtrlr.view.subview = win.contentView;
    win.makeKeyAndOrderFront = null ;
    NSApp.activateIgnoringOtherApps = true;
}

extern (Objective-C) 
class ViewController : NSViewController {
    override static ViewController alloc() @selector("alloc");
    override ViewController init() @selector("init");
    override void loadView() @selector("loadView") {
        writeln("loadView    " ~ appName ~ " ... running Now\n"); 
    }
    override void viewDidLoad() @selector("viewDidLoad") {
        printf("viewDidLoad\n");
    }
}               
split/source/view.d

/** 
 *    split/source/view.d
 */
module split.view;
import core.attribute : optional, selector;
import std.stdio;
import cocoa.window;
import cocoa.control;
import cocoa.splits;
import cocoa.tables;
import split.main : win;

NSTextView  textView;
NSTableView tableView;
NSSplitView splitView;
NSScrollView upperScroll, lowerScroll;
NSClipView   upperClip, lowerClip;

void buildContents() {
    splitView = NSSplitView.alloc.init;
    splitView.dividerColor = NSColor.rgba(0, 1, 1, 1);
    win.contentView = splitView;
    buildUpperPane;
    buildLowerPane;
}

void buildUpperPane() {
    upperScroll = NSScrollView.alloc.init;
    upperScroll.hScroller = false;
    upperScroll.vScroller = true;
    upperClip =  NSClipView.alloc.init;
    textView = NSTextView.alloc.init;
    // textView.bgColor = NSColor.white; // no property
    textView.resizeMask = ResizeMask.Width | ResizeMask.Height;
    // textView.autoresizesSubviews = true; // default
    upperClip.documentView = textView;
    upperScroll.contentView = upperClip;
    splitView.subview = upperScroll;
}

void buildLowerPane() {
    lowerScroll = NSScrollView.alloc.init;
    lowerScroll.hScroller = true;
    lowerScroll.vScroller = true;
    lowerClip = NSClipView.alloc.init;
    tableView = NSTableView.alloc.init;
    // tableView.bgColor = NSColor.cmyk(0, 0, 0.5, 0, 0.8); // no property
    tableView.resizeMask = ResizeMask.Width | ResizeMask.Height;
    tableView.staticContents = false; // setUsesStaticContents 
    tableView.rowBgColors = true;
    // tableView.autoresizesSubviews = true; // default
    lowerClip.documentView = tableView;
    lowerScroll.contentView = lowerClip;
    splitView.subView = lowerScroll;
}               
cocoa/window.d
cocoa/control.d
cocoa/splits.d
cocoa/tables.d
cocoa/menus.d