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

NSTableView を使ってみたい

NSTableView NSTableViewDelegate NSTableViewDataSource を使ってみました。

NSTableViewのSample

NSTableViewのSample

サンプルコード

Powered by Prism

table/dub.json

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

/** 
 *		table/source/app.d     Version 0.0.1
 */
module table.main;
import core.attribute : optional, selector;
import std.stdio;
import cocoa.window;
import cocoa.control;
import cocoa.tables;
import cocoa.menu;


string appName;
string versionNo = "0.0.1";
string helpMessage = "CocoaAPIを使用して、\nmlb team の table を\nD言語で表示しています。";
string jsonPath = "../data/mlb.json";
NSScrollView scrView;

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

void buildWindow() {
    NSWindow win;
    NSRect rect = NSMakeRect(0, 0, 300, 240);
    appName = NSProcessInfo.processInfo.processName.toDs;
    NSApp.menu = mainMenu(appName);
    immutable w_style = NSWindowStyleMask.titled | 
                        NSWindowStyleMask.closable | 
                        NSWindowStyleMask.resizable | 
                        NSWindowStyleMask.miniaturizable;
    win = NSWindow.alloc.init(rect, w_style, backing.buffered, false);
    win.title = (appName ~ "  (D言語)").toNs;
    win.minSize = NSSize(100, 100);
    win.moveTop = NSPoint(200, 900);
    scrView = NSScrollView.alloc.init;
    ViewController vCtrler = ViewController.alloc.init;
    vCtrler.view.subview = scrView;
    win.contentView = scrView;
    win.makeKeyAndOrderFront = null;
    NSApp.activateIgnoringOtherApps = true;
}

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;
    }
    void aboutPanel() @selector("aboutPanel") {
        dialog(appName, "Version " ~ versionNo);
    }
    void showHelp() @selector("showHelp") {
        dialog("Help", helpMessage);
    }
} 

extern (Objective-C) 
class ViewController : NSViewController,
        NSTableViewDelegate, NSTableViewDataSource  {
    NSMutableArray mlbArray;
    override static ViewController alloc() @selector("alloc");
    override ViewController init() @selector("init");
    override void loadView() @selector("loadView") { 
        printf("loadView\n"); 
        mlbArray = jsonPath.toArrayJson.copy;
        NSTableView tblView = NSTableView.alloc.init;
        scrView.hScroller = true;
        scrView.vScroller = true;
        NSClipView clpView = NSClipView.alloc.init;
        tblView.resizeMask = ResizeMask.WidthSizable | ResizeMask.HeightSizable;
        tblView.staticContents = true;
        tblView.rowBgColors = true;
        tblView.delegate_ = this;
        tblView.dataSource = this;

        NSString[3] idStr = ["Team".toNs, "Division".toNs, "League".toNs];
        NSTableColumn[3] column;
        double[3] columnWidth = [140, 50, 70];
        foreach(i; 0..3) {
            column[i] = NSTableColumn.alloc.init(idStr[i]);
            column[i].title = idStr[i];
            column[i].width = columnWidth[i];
            tblView.addTableColumn = column[i];
        }
        clpView.documentView = tblView;
        scrView.contentView = clpView;
    }
    override void viewDidLoad() @selector("viewDidLoad") { 
        printf("viewDidLoad\n"); 
    }
    // ----- Delegate -----
    NSView tableView(NSTableView tv, NSTableColumn co, NSInteger ri) 
            @selector("tableView:viewForTableColumn:row:") {
        NSTextField txtFld = NSTextField.alloc.init;
        NSDictionary dict = mlbArray.dicAtIndex(ri);
        txtFld.bezeled = false;
        txtFld.bgColor = NSColor.clear;
        txtFld.str = dict.strForKey(co.identifier);
        return txtFld;
    }
    // ----- DataSource - Getting Values -----
    NSInteger numOfRows(NSTableView tv) @selector("numberOfRowsInTableView:") {
        return mlbArray.count;
    }
    NSString tableViewS(NSTableView tv, NSTableColumn co, NSInteger ri) 
            @selector("tableView:objectValueForTableColumn:row:") {
        NSDictionary data = mlbArray.dicAtIndex(ri);
        return data.strForKey(co.identifier);
    }
}               
mlb.json
cocoa/tables.d
cocoa/control.d
cocoa/window.d
cocoa/menu.d