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

D言語から CocoaAPI の Menu を使用する

D言語から Mac GUI の Menu を表示するためのプログラムです。

不充分な点が多数ありますが、少しは使えると思います。

サンプルコード

Powered by Prism

cocoa/menu.d

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

NSMenu mainMenu(string aName) {
   /* menubar main menu */
    NSMenu menubar = NSMenu.alloc.init;
    NSMenuItem apItem = NSMenuItem.alloc.init;
    menubar.item = apItem;
   /* application menu */
    NSMenu apMenu = NSMenu.alloc.init;
    apItem.submenu = apMenu;
    // apMenu.item = NSMenuItem.alloc.init("About " ~ aName, "orderFrontStandardAboutPanel:", "");
    apMenu.item = NSMenuItem.alloc.init("About " ~ aName, "aboutPanel", "");
    apMenu.item = NSMenuItem.separatorItem;
   /* preferences menu */
    apMenu.item = NSMenuItem.alloc.init("Preferences…", "preferences", ",");
    apMenu.item = NSMenuItem.separatorItem;
   /* services menu */
    NSMenu servicesMenu = NSMenu.alloc.init("Services");
    NSApp.servicesMenu = NSMenu.alloc.init;
    NSMenuItem servicesItem = NSMenuItem.alloc.init;
    servicesItem.title = "Services".toNs;
    servicesItem.submenu = NSApp.servicesMenu;
    apMenu.item = servicesItem;
   /* hide menu */
    apMenu.item = NSMenuItem.separatorItem;
    apMenu.item = NSMenuItem.alloc.init("Hide " ~ aName, "hide:", "h");
    apMenu.item = NSMenuItem.alloc.init("Hide Others", "hideOtherApplications:", "H");
    apMenu.item = NSMenuItem.alloc.init("Show All", "unhideAllApplications:", "");
    apMenu.item = NSMenuItem.separatorItem;
    apMenu.item = NSMenuItem.alloc.init("Quit " ~ aName , "terminate:", "q");
   /* file menu */
    NSMenu fileMenu = NSMenu.alloc.init("File");
    NSMenuItem fileItem = menubar.addItem("File", null, ""); // <--
    menubar.submenu(fileMenu, fileItem);
    // fileMenu.item = NSMenuItem.alloc.init("New", "newDocument:", "n");
    fileMenu.item = NSMenuItem.alloc.init("New", "newDocument", "n");
    // fileMenu.item = NSMenuItem.alloc.init("Open", "openDocument:", "o");
    fileMenu.item = NSMenuItem.alloc.init("Open", "openDocument", "o");
    NSMenu recentMenu = NSMenu.alloc.init("Open Recent");
    NSMenuItem recentItem = fileMenu.addItem("Open Recent", null, ""); // <--
    recentMenu.submenu(recentMenu, recentItem);
    NSMenu clearMenu = NSMenu.alloc.init("Clear Menu");
    NSMenuItem clearItem = recentMenu.addItem("Clear Menu", null, ""); // <--
    // clearMenu.setSubmenu(clearMenu, clearItem);
    clearMenu.item = NSMenuItem.alloc.init("ClearMenu", "clearRecentDocuments:", "");
    fileMenu.item = NSMenuItem.separatorItem; 
    fileMenu.item = NSMenuItem.alloc.init("Close", "performClose:", "w");
    // fileMenu.item = NSMenuItem.alloc.init("Save", "saveDocument:", "s");
    fileMenu.item = NSMenuItem.alloc.init("Save", "saveDocument", "s");
    // fileMenu.item = NSMenuItem.alloc.init("Save As…", "saveDocumentAs:", "S");
    fileMenu.item = NSMenuItem.alloc.init("Save As…", "saveDocumentAs", "S");
    // fileMenu.addItem = NSMenuItem.alloc.init("revert to Saved", "revertDocumentToSaved", "r");
    fileMenu.item = NSMenuItem.separatorItem;
    fileMenu.item = NSMenuItem.alloc.init("Page Setup…", "runPageLayout:", "s");
    fileMenu.item = NSMenuItem.alloc.init("Print…", "print:", "p");
   /* edit menu */
    NSMenu editMenu = NSMenu.alloc.init("Edit");
    NSMenuItem editItem = menubar.addItem("Edit", null, ""); // <--
    menubar.setSubmenu(editMenu, editItem);
    editMenu.item = NSMenuItem.alloc.init("Undo", "undo:", "z");
    editMenu.item = NSMenuItem.alloc.init("Redo", "redo:", "Z");
    editMenu.item = NSMenuItem.separatorItem;
    editMenu.item = NSMenuItem.alloc.init("Cut", "cut:", "x");
    editMenu.item = NSMenuItem.alloc.init("Copy", "copy:", "c");
    editMenu.item = NSMenuItem.alloc.init("Paste", "paste:", "v");
    // editMenu.addItem(NSMenuItem.alloc.init("Paste and Match Style", "pasteAsPlainText:", "V"));
    editMenu.item = NSMenuItem.alloc.init("Delete", "delete:", "\b");
    editMenu.item = NSMenuItem.separatorItem; 
    editMenu.item = NSMenuItem.alloc.init("select all", "selectAll:", "n");
    editMenu.item = NSMenuItem.separatorItem;
    NSMenu findMenu = NSMenu.alloc.init("Find");
    NSMenuItem findItem = editMenu.addItem("Find…", null, ""); // <--
    findMenu.setSubmenu(findMenu, findItem);
    findMenu.item = NSMenuItem.alloc.init("Find…", "performFindPanelAction:", "f");
    findMenu.item = NSMenuItem.alloc.init("Find and Replace…", "performFindPanelAction:", "F");
    findMenu.item = NSMenuItem.alloc.init("Find Next", "performFindPanelAction:", "g");
    findMenu.item = NSMenuItem.alloc.init("Find Previous", "performFindPanelAction:", "G");
    findMenu.item = NSMenuItem.alloc.init("Use Selection for Find", "performFindPanelAction:", "e");
    findMenu.item = NSMenuItem.alloc.init("Jump to Selection", "centerSelectionInVisibleArea:", "j");
    NSMenu spellMenu = NSMenu.alloc.init("Spelling and Grammar");
    NSMenuItem spellItem = editMenu.addItem("Spelling ang Grammar", null, ""); // <--
    spellMenu.setSubmenu(spellMenu, spellItem);
    spellMenu.item = NSMenuItem.alloc.init("Show Spelling and Grammar", "showGuessPanel:", ":");
    spellMenu.item = NSMenuItem.alloc.init("CheckDocument Now", "checkSpelling:", ";");
    spellMenu.item = NSMenuItem.separatorItem;
    spellMenu.item = NSMenuItem.alloc.init("Check Spelling while Typing", "toggleContinuousSpellChecking:", "");
    spellMenu.item = NSMenuItem.alloc.init("Check Grammar With Spelling", "toggleGrammarhecking:", "");
    spellMenu.item = NSMenuItem.alloc.init("Correct Spelling Automatically", "toggleAutomaticSpellingCorrection:", "");
    NSMenu subMenu = NSMenu.alloc.init("Substitutions");
    NSMenuItem subItem = editMenu.addItem("Substitutions", null, ""); // <--
    subMenu.setSubmenu(subMenu, subItem);
    subMenu.item = NSMenuItem.alloc.init("Show Substitutions", "orderFrontSubstitutionsPanel:", "");
    subMenu.item = NSMenuItem.separatorItem;
    subMenu.item = NSMenuItem.alloc.init("Smart Copy/Paste", "toggleSmartInsertDelete:", "");
    subMenu.item = NSMenuItem.alloc.init("Smart Quotes", "toggleAutomaticQuoteSubstitution:", "");
    subMenu.item = NSMenuItem.alloc.init("Smart Dashes", "toggleAutomaticDashSubstitution:", "");
    subMenu.item = NSMenuItem.alloc.init("Smart Links", "toggleAutomaticLinkDetection:", "");
    subMenu.item = NSMenuItem.alloc.init("Data Detectors", "toggleAutomaticDataDetection:", "");
    subMenu.item = NSMenuItem.alloc.init("Text Replacement", "toggleAutomaticTextReplacement:", "");
    NSMenu transMenu = NSMenu.alloc.init("Transformations");
    NSMenuItem transItem = editMenu.addItem("Transformations", null, ""); // <--
    transMenu.setSubmenu(transMenu, transItem);
    transMenu.item = NSMenuItem.alloc.init("Make Upper Case", "uppercaseWord:", "");
    transMenu.item = NSMenuItem.alloc.init("Make Lower Case", "lowercaseWord:", "");
    transMenu.item = NSMenuItem.alloc.init("Capitalize", "capitalizeWord:", "");
    NSMenu speechMenu = NSMenu.alloc.init("Speech");
    NSMenuItem speechItem = editMenu.addItem("Speech", null, ""); // <--
    speechMenu.setSubmenu(speechMenu, speechItem);
    speechMenu.item = NSMenuItem.alloc.init("Start Speaking", "startSpeaking:", "");
    speechMenu.item = NSMenuItem.alloc.init("Stop Speaking", "stopSpeaking:", "");
   /* format menu */
    NSMenu formatMenu = NSMenu.alloc.init("Format");
    NSMenuItem formatItem = menubar.addItem("Format", null, ""); // <--
    menubar.setSubmenu(formatMenu, formatItem);
    NSMenu fontMenu = formatMenu.alloc.init("Font");
    NSMenuItem fontItem = formatMenu.addItem("Font", null, ""); // <--
    fontMenu.setSubmenu(fontMenu, fontItem);
    fontMenu.item = NSMenuItem.alloc.init("Show Fonts", "orderFrontFontPanel:", "t");
    fontMenu.item = NSMenuItem.alloc.init("Bold", "addFontTrait:", "b");
    fontMenu.item = NSMenuItem.alloc.init("Italic", "addFontTrait:", "i");
    fontMenu.item = NSMenuItem.alloc.init("Underline", "underline:", "u");
    fontMenu.item = NSMenuItem.separatorItem;
    fontMenu.item = NSMenuItem.alloc.init("Bigger", "modifyFont:", "+");
    fontMenu.item = NSMenuItem.alloc.init("Smaller", "modifyFont:", "-");
    fontMenu.item = NSMenuItem.separatorItem;
    NSMenu kernMenu = fontMenu.alloc.init("Kern");
    NSMenuItem kernItem = fontMenu.addItem("Kern", null, ""); // <--
    kernMenu.setSubmenu(kernMenu, kernItem);
    kernMenu.item = NSMenuItem.alloc.init("Use Default", "useStandardKerning:", "");
    kernMenu.item = NSMenuItem.alloc.init("Use None", "turnOffKerning:", "");
    kernMenu.item = NSMenuItem.alloc.init("Tighten", "tightenKerning:", "");
    kernMenu.item = NSMenuItem.alloc.init("Loosen", "loosenKerning:", "");
    NSMenu ligatureMenu = fontMenu.alloc.init("Ligtures");
    NSMenuItem ligatureItem = fontMenu.addItem("Ligtures", null, ""); // <--
    ligatureMenu.setSubmenu(ligatureMenu, ligatureItem);
    ligatureMenu.item = NSMenuItem.alloc.init("Use Default", "useStandardLigatures:", "");
    ligatureMenu.item = NSMenuItem.alloc.init("Use None", "turnOffLigatures:", "");
    ligatureMenu.item = NSMenuItem.alloc.init("Use All", "useAllLigatures:", "");
    NSMenu baseMenu = fontMenu.alloc.init("Baseline");
    NSMenuItem baseItem = fontMenu.addItem("Baseline", null, ""); // <--
    baseMenu.setSubmenu(baseMenu, baseItem);
    baseMenu.item = NSMenuItem.alloc.init("Use Default", "unscript:", "");
    baseMenu.item = NSMenuItem.alloc.init("SuperScript", "superscript:", "");
    baseMenu.item = NSMenuItem.alloc.init("Subscript", "subscript:", "");
    baseMenu.item = NSMenuItem.alloc.init("Raise", "raiseBaseline:", "");
    baseMenu.item = NSMenuItem.alloc.init("Lower", "lowerBaseline:", "");
    fontMenu.item = NSMenuItem.separatorItem;
    fontMenu.item = NSMenuItem.alloc.init("Show Colors", "orderFrontColorPanel:", "");
    fontMenu.item = NSMenuItem.separatorItem;
    fontMenu.item = NSMenuItem.alloc.init("Copy Style", "copyFont:", "");
    fontMenu.item = NSMenuItem.alloc.init("Paste Style", "pasteFont", "");
    NSMenu textMenu = formatMenu.alloc.init("Text");
    NSMenuItem textItem = formatMenu.addItem("Text", null, ""); // <--
    textMenu.setSubmenu(textMenu, textItem);
    textMenu.item = NSMenuItem.alloc.init("Align Left", "alignLeft:", "{");
    textMenu.item = NSMenuItem.alloc.init("Center", "alignCenter:", "|");
    textMenu.item = NSMenuItem.alloc.init("Justify", "alignJustified:", "");
    textMenu.item = NSMenuItem.alloc.init("Align Right", "alignRight:", "}");
    textMenu.item = NSMenuItem.separatorItem;
    NSMenu wdMenu = textMenu.alloc.init("Writing Direction");
    NSMenuItem wdItem = textMenu.addItem("writing Direction", null, ""); // <--
    wdMenu.setSubmenu(wdMenu, wdItem);
    wdMenu.item = NSMenuItem.alloc.init("Paragraph", null, "");
    wdMenu.item = NSMenuItem.alloc.init("\tDefault", "makeBaseWritingDirectionNatural:", "");
    wdMenu.item = NSMenuItem.alloc.init("\tLeft to Right", "makeBaseWritingDirectionLeftToRight:", "");
    wdMenu.item = NSMenuItem.alloc.init("\tRight to Left", "makeBaseWritingDirectionRightToLeft:", "");
    wdMenu.item = NSMenuItem.separatorItem;
    wdMenu.item = NSMenuItem.alloc.init("Selection", null, "");
    wdMenu.item = NSMenuItem.alloc.init("\tDefault", "makeTextWritingDirectionNatural:", "");
    wdMenu.item = NSMenuItem.alloc.init("\tLeft to Right", "makeTextWritingDirectionLeftToRight:", "");
    wdMenu.item = NSMenuItem.alloc.init("\tRight to Left", "makeTextWritingDirectionRightToLeft:", "");
    textMenu.item = NSMenuItem.separatorItem;
    textMenu.item = NSMenuItem.alloc.init("Show Ruler", "toggleRuler:", "R");
    textMenu.item = NSMenuItem.alloc.init("Copy Ruler", "copyRuler:", "C");
    textMenu.item = NSMenuItem.alloc.init("Paste Ruler", "pasteRuler:", "V");
   /* view menu */
    NSMenu viewMenu = NSMenu.alloc.init("View");
    NSMenuItem viewItem = menubar.addItem("View", null, ""); // <--
    menubar.setSubmenu(viewMenu, viewItem);
    // viewMenu.item = NSMenuItem.alloc.init("Show Toolbar", "toggleToolbarShown:", "t");
    // NSMenuItem showItem = NSMenuItem.alloc.init("Show Toolbar", "toggleToolbarShown:", "t");
    // showItem.keyMask(NSEventModifierFlag.Option | NSEventModifierFlag.Command); // 
    // showItem.key = "t".toNs; //
    // viewMenu.item(showItem);  
    viewMenu.item = NSMenuItem.alloc.init("Customize Toolbar…", "runToolbarCustomizationPallette:", "");
    viewMenu.item = NSMenuItem.separatorItem;
    viewMenu.item = NSMenuItem.alloc.init("Show Sidebar", "toggleSidebar:", "s");
    viewMenu.item = NSMenuItem.alloc.init("Enter Full Screen", "toggleFullScreen:", "f");
   /* window menu */
    NSMenu winMenu = NSMenu.alloc.init("Window");
    NSMenuItem winItem = menubar.addItem("Window", null, ""); // <--
    menubar.setSubmenu(winMenu, winItem);
    winMenu.item = NSMenuItem.alloc.init("Minimize", "performMiniaturize:", "m");
    winMenu.item = NSMenuItem.alloc.init("Zoom", "performZoom:", "");
    winMenu.item = NSMenuItem.alloc.init("Tile Window to Left of Screen", "", "");
    winMenu.item = NSMenuItem.alloc.init("Tile Window to Right of Screen", "", "");
    winMenu.item = NSMenuItem.alloc.init("Replace Tiled Window", "", "");
    winMenu.item = NSMenuItem.separatorItem;
    winMenu.item = NSMenuItem.alloc.init("Show Previous Tab", "", "");
    winMenu.item = NSMenuItem.alloc.init("Show Next Tab", "", "");
    winMenu.item = NSMenuItem.alloc.init("Move Tab to New Window", "", "");
    winMenu.item = NSMenuItem.alloc.init("Merge All Windows", "", "");
    winMenu.item = NSMenuItem.separatorItem;
    winMenu.item = NSMenuItem.alloc.init("Bring All to Front", "arrangeInFront:", "");
    winMenu.item = NSMenuItem.separatorItem;
    // winMenu.addItem = NSMenuItem.alloc.init(aName, "", "");
   /* help menu */
    NSMenu helpMenu = NSMenu.alloc.init("Help");
    NSMenuItem helpItem = menubar.addItem("Help", null, ""); // <--
    menubar.setSubmenu(helpMenu, helpItem);
    // helpMenu.item = NSMenuItem.alloc.init(aName ~ " Help" , "showHelp:", "");
    helpMenu.item = NSMenuItem.alloc.init(aName ~ " Help" , "showHelp", "");
    helpMenu.item = NSMenuItem.alloc.init(aName ~ " Web Help" , "showWebHelp", "");
    return menubar;
}

extern (Objective-C)
string dialog(string msgText, string infoText) {
    NSAlert alert = NSAlert.alloc.init;
    alert.addButton= "OK".toNs;
    alert.messageText = msgText.toNs;
    alert.information = infoText.toNs;
    alert.style = alertStyle.warning;
    switch (alert.run) {
        case response.OK: return("OK");
        default: return("Other");
    }
}               
cocoa/window.d
cocoa/control.d