複数のxmlから選択してExtendedMenuを表示

検索バースクリプトのテスト開始にともなって本体の検索バーを非表示にしたら、リンクバーだけのために1行使うのは勿体無い感じだったのでリンクバーも非表示にすることにした。ツールバーに何も無くなったので、ツールバーコンテキストメニュー*1にアクセスできなくなる。リンクバーを使わない分、どこかでブックマークにアクセスできるようにしないといけないのに更に使えるコンテキストメニューまで減るので、ExtendedMenuの中身を切り替えられるようにしようと思ったのが発端。
手順は

  1. ExtendedMenuの表示に適当なショートカットキーを割り当てておく
  2. 予め必要なだけxmlファイルを用意しておく
  3. 任意のxmlファイルをExtendedMenu.xmlにコピー
  4. 割り当てたショートカットキーをSendKeysで送ってExtendedMenuを表示

で、うち3, 4をスクリプトで処理する。
通常のメニューはマウスが当たっている要素がinput要素、textarea要素の時とそれ以外の時で別のメニューを出せるように

var documentID = API.GetDocumentID(API.ActiveIndex);
var document = API.GetDocumentObject(documentID);
var fso = CreateObject("Scripting.FileSystemObject");
var base = sleipnir.UserFolder + "setting/Override/";
var path;
var src;

document.body.attachEvent("onmousemove", function(e) {src = document.elementFromPoint(e.x, e.y)});
document.body.fireEvent("onmousemove");

switch (src.tagName) {
case "TEXTAREA":
	src.focus();
	path = "textarea.xml";
	break;
case "INPUT":
	src.focus();
	path = "input.xml";
	break;
default:
	path = "normal.xml";
	break;
}

fso.CopyFile(base + path, base + "ExtendedMenu.xml");
var Shell = CreateObject("WScript.Shell");
Shell.SendKeys("^e");

を右クリックに割り当てた。
お気に入りの表示は状況に依存する必要がないので

var base = sleipnir.UserFolder + "setting/Override/";

var fso = CreateObject("Scripting.FileSystemObject");
fso.CopyFile(base + "favorite.xml", base + "ExtendedMenu.xml");

var Shell = CreateObject("WScript.Shell");
Shell.SendKeys("^e");

を第4ボタンに割り当てた。
これで右クリックしたときは状況に応じたメニュー、第4ボタンを押したときはお気に入りがコンテキストメニューに表示されるようになった。ちなみにキー割り当てがctrl+eにしてある。右クリックに割り当てた方のスクリプトは、きちんと条件を記述してやればリンク上や、文字の選択状態で表示するxmlも切り替えられるが、私の場合リンク上とその他で表示するメニューを分ける意味があまり無いのと、文字選択時はSmartSearchを使うのでやらなかった。
一応、判別は

//選択状態の取得
if (document.selection.createRange().text) {
	//todo
}

//リンク上かどうかの判別
while (src.parentElement && src.tagName != "A") {
	src = src.parentElement;
}
if (src.tagName == "A") {
	//todo
}

でいいと思う。多分。気が向いたら週末にもうちょい扱いやすくしてラボに上げてみる。
あと、ExtendedMenuにお気に入りを入れた場合 - Fenrir User Communityにあるように、お気に入りのサブフォルダの表示は+BookmarkSubMenu〜といったアクションの再帰呼び出しになっているようなので、

<item name="+BookmarkSubMenu1" />

とやればお気に入りの特定のフォルダの中身だけを表示できる*2。指定すべき番号がお気に入りの中身に依存するので使い道が限定されると思うけど場合によっては便利かもしれない。+ScriptSubMenu1ってやればスクリプトの一部だけ表示できそうな気がしたが別にそんなことはなかった。

*1:ToolBarPopup.xmlのこと

*2:言うまでもないと思うが非公式なので十分注意すること