top > メニュー定義 リファレンス

メニュー定義 リファレンス

contents

メニュー定義

version 0.6 から、メインメニューの定義をスクリプトで行うことができるようになりました。メニューにはアクションに関連づかないプレーンな項目、アクションに関連付けられた項目、そして特殊な仮想項目を定義することができます。

定義できる 3 つのアイテム

プレーンメニューアイテム

プレーンメニューアイテムは、メニューに表示されるキャプション、選択のためのショートカットキー、および選択されたときに実行するスクリプトを個別に、自由に定義できます。アクションメニューアイテムに比べ、なんでもありのタイプですが、その分定義するための情報がたくさん必要です。

アクションメニューアイテム

アクションメニューアイテムは、定義済みのアクションを割り当てます。メニューのキャプション、およびショートカットはアクションのそれを使用します。プレーンメニューアイテムに対して、定義が簡単です。

仮想(割り込みポイント)メニューアイテム

仮想メニューアイテムは、他の 2 つに比べて特殊です。このアイテムが直接メニューに表示されることはありません。メニューが表示される直前、仮想メニューアイテムはイベント onMenuRequest を発生させ、仮想メニューアイテムを実際のメニューアイテム(群)にマップする機会をスクリプト側に与えます。このとき仮想メニューアイテムは、メニューアイテムをメニューのどこにマップするかという大まかな位置を示す、プレースホルダとしても機能します。

onMenuRequest のイベントハンドラを拡張子クラスごとに定義する・しないことにより、それぞれの拡張子クラスにふさわしいメニューアイテムを部分的に定義することができます。

制限

萌ディタでは、拡張子クラスのほとんどのプロパティやイベントハンドラについて、親の拡張子クラスからの継承・または上書きを選択できますが、これに対しメニューの定義は、どの拡張子クラスでも共有されるようになっています。そのかわり、仮想メニューアイテムについては、拡張子クラスごとに再定義を行う余地を残しています。

あと、今のところ GUI がありません。

実際に定義してみる

メニューの定義は、以下のとおりです。これらのスクリプトは、拡張子クラスの onInitProp イベントハンドラ内に記述します。

    var m = App.MenuItems;
    m.BeginUpdate();

メニューのルートは、App.MenuItems オブジェクトです。まず BeginUpdate() を呼び出して、変更通知を抑制します。抑制しないと、Add() などを行うごとにメニューを更新してしまいます。

    try {
        with (m.Add('ファイル(&F)')) {
            AddAction('new');
            AddAction('manualnew');
            AddSeparator();
            AddAction('open');
            with (Add('最近のファイル(&D)')) {
                AddAction('openedfilelist');
            }
                :
                :
        }

メニューバーに表示される 'ファイル(&F)' などのアイテムを Add() で追加します。メニューバーに表示されるアイテムは、必ずプレーンメニューアイテムである必要があります。Add() の戻り値である MenuItems オブジェクトに対して、階層化されたメニューを定義していきます。

        with (m.Add('編集(&E)')) {
            AddAction('undo');
            AddAction('redo');
            AddSeparator();
            Add('引用符付きコピー', '', '(それ相応のスクリプト)');
            AddInterruptPoint('edit', 'clipboard');
                :
                :
        }

同様に、'編集(&E)' メニューも追加していきます。Add() の第 2 引数、第 3 引数はそれぞれショートカット、実行するスクリプトです。これらは省略できます。AddInterruptPoint() は仮想メニューアイテムを追加します。このとき、onMenuRequest イベントハンドラ内で使用するカテゴリを指定します。

                :
                :
    }
    finally {
        m.EndUpdate();
    }

すべて追加し終わったら、EndUpdate() を呼び出して、メニュー定義を萌ディタに通知します。

onMenuRequest イベント

メニューに仮想メニューアイテムを定義した場合、メニューが表示される直前に onMenuRequest イベントが発生します。

イベントのハンドラには、MenuItems オブジェクト、および仮想メニューアイテムの追加時に設定したカテゴリが渡されます。カテゴリをもとに追加するメニューアイテムを決定し、MenuItems オブジェクトへ追加します。

    f.onMenuRequest = function (arg, classname, methodname) {
        var m = arg('menuitem');
        var category1 = arg('category1');
        var category2 = arg('category2');

        switch (category1) {
        case 'file':
            switch (category2) {
            case 'open':
                //「ファイル」メニューの「開く」系の
                // メニューアイテムに必要なら追加する
                m.AddAction('property');
            }
        }
    }

onMenuRequest イベントに渡される引数 arg は名前付きコレクションで、追加用の MenuItems オブジェクト、およびどのメニューアイテムをどこに追加するかを判断するためのカテゴリ文字列が 2 種類格納されています。

標準の仮想カテゴリ

仮想メニューアイテムを実体化する際のカテゴリは文字列型で、その内容はユーザが自由に決めることができますが、標準のメニュー(std.javascript.txt で定義される)にはあらかじめ仮想メニューアイテムとそのカテゴリが定義されています。

ファイル(F)
新規(N)アクション 'New'
指定して新規(F)アクション 'ManualNew'
仮想メニューアイテム 'file', 'new'
開く(O)...アクション 'Open'
最近のファイル(D)プレーン
最近のファイル一覧アクション 'OpenedFileList'
仮想メニューアイテム 'file', 'open'

上書き保存(S)アクション 'Save'
名前を付けて保存(A)...アクション 'SaveAs'
仮想メニューアイテム 'file', 'save'

閉じる(C)アクション 'Close'
仮想メニューアイテム 'file', 'close'

ページ設定(U)...アクション 'PageSetup'
印刷(P)...アクション 'Print'
仮想メニューアイテム 'file', 'print'

萌ディタの終了(X)アクション 'Quit'
仮想メニューアイテム 'file', 'quit'
編集(E)
元に戻す(U)アクション 'Undo'
やり直す(R)アクション 'Redo'
仮想メニューアイテム 'edit', 'history'

切り取り(T)アクション 'Cut'
コピー(C)アクション 'Copy'
貼り付け(P)アクション 'Paste'
削除(L)アクション 'Delete'
仮想メニューアイテム 'edit', 'clipboard'

検索(F)...アクション 'Find'
次を検索(N)アクション 'FindNext'
置換(R)...アクション 'Replace'
行へ移動(G)アクション 'GotoLine'
マーク(M)プレーン
移動(M)プレーン
1アクション 'GotoMark1'
2アクション 'GotoMark2'
3アクション 'GotoMark3'
4アクション 'GotoMark4'
5アクション 'GotoMark5'
6アクション 'GotoMark6'
7アクション 'GotoMark7'
8アクション 'GotoMark8'
9アクション 'GotoMark9'

前(P)アクション 'GotoPrevMark'
次(N)アクション 'GotoNextMark'
設定/解除(S)プレーン
1アクション 'SetMark1'
2アクション 'SetMark2'
3アクション 'SetMark3'
4アクション 'SetMark4'
5アクション 'SetMark5'
6アクション 'SetMark6'
7アクション 'SetMark7'
8アクション 'SetMark8'
9アクション 'SetMark9'

すべてクリア(C)アクション 'ClearAllMarks'
仮想メニューアイテム 'edit', 'caretmove'

仮想メニューアイテム 'edit', 'selection'

従来の編集メニューの「すべて選択」と「日付と時刻」はカテゴリ edit, selection に属するものとし、std.javascript.txt の onMenuRequest イベントハンドラで追加するようにします。

書式(O)
カラー テーマ(E)プレーン
カラーテーマのリストアクション 'ColorThemeList'

変更(C)...アクション 'SelectColorTheme'

テーマの表/裏のリストアクション 'ThemeSideList'
エディタの背景(B)プレーン
壁紙のリストアクション 'WallpaperList'

変更(C)...アクション 'SelectWallpaper'

フィルタのリストアクション 'WallpaperFilterList'
仮想メニューアイテム 'format', 'global'

ツールバーを表示(T)アクション 'ToggleToolbarVisible'
ファンクションキーを表示(F)アクション 'ToggleFunckeyVisible'
ステータスバーを表示(S)アクション 'ToggleStatusbarVisible'
スクリプトを有効(S)アクション 'ToggleScriptable'
仮想メニューアイテム 'format', 'window'

ナビゲータを呼ぶ(N)アクション 'ShowNavi'
色とスタイルの設定(S)...アクション 'ColorConfig'
むずかしい設定(C)...アクション 'Config'
仮想メニューアイテム 'format', 'config'
ビュー
上下に分割(N)アクション 'SplitNS'
左右に分割(W)アクション 'SplitWE'
仮想メニューアイテム 'view', 'inc'

現在のビューを削除する(C)アクション 'DeleteCurrentView'
他のビューをすべて削除する(M)アクション 'MergeAllViews'
仮想メニューアイテム 'view', 'dec'
ツール(T)
キーボード マクロ(K)プレーン
記録開始/終了(R)アクション 'ToggleKbdMacro'
記録中止(T)アクション 'AbortKbdMacro'
再生(P)アクション 'PlayKbdMacro'

キャレット位置へ出力(C)アクション 'PrintKbdMacro'
ファイルへ保存(S)...アクション 'SaveKbdMacro'
仮想メニューアイテム 'tool', 'kbdmacro'

マクロのリストアクション 'MacroList'

マクロの管理(S)...アクション 'MacroManager'
仮想メニューアイテム 'tool', 'macro'
ヘルプ(H)
トピックの検索(H)アクション 'FindTopic'
仮想メニューアイテム 'help', 'help'

バージョン情報(A)アクション 'Version'

更新履歴


top > メニュー定義 リファレンス