D言語からObjective-CとCocoaAPIを使いたい
NSSplitView に NSTextView と NSTableView を表示

サンプルコード
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
- Log
- 2025-03-04 修正しました
- 2024-07-25 upload