jsTreeの研究  

2011-01-18

コンテキストメニューハック  

  2866                 was_sep = false;
  2867                 str += "<li class='" + (val._class || "") + (val._disabled ? " jstree-contextmenu-disabled " : "") + "'><ins ";
  2868                 if(val.icon && val.icon.indexOf("/") === -1) { str += " class='" + val.icon + "' "; }

ってことなので、_disabledが設定されているとjstree-contextmenu-disabledがセットされて、そのメニューが使用できなくなる。
で、これは

  2846             $(document).triggerHandler("context_show.vakata");

によりdocumentにcontext_show.vakataが投げられるので、

$(document).bind("context_show.vakata", function(e) {
    var menuItem = $("#vakata-contextmenu a[rel=reset_name]").parent("li");
    var node = $("#treeview").jstree("get_selected");
    if(node.attr("id") == "Project_1"){ menuItem.addClass("jstree-contextmenu-disabled"); }
    else{ menuItem.removeClass("jstree-contextmenu-disabled"); }
}

こんな感じでコンテキストメニューが表示されてから無効化してやればよい。
かなりハックな感じ・・・

ちなみに設定は以下のところにあった。
ただし、初回は初期設定からコピーするので効力はない。

$.vakata.context.data._get_settings().contextmenu.items.rename._disabled = true;

set_focus時に選択されているノードを取得  

$("#treeview").bind("set_focus.jstree", function(e, obj) {
    console.debug($("#treeview .jstree-hovered").parent("li"));
});

編集時に編集文字列を自動的に変更  

$("#treeview").bind("set_text.jstree", function(e, obj) {
    $(obj.args[0]).children("input").val("POO");
});

renameはこんな感じ  

$("#treeview").bind("rename.jstree", function(e, obj){
    var result = obj.rslt;
    var node = obj.rslt.obj;
    var rpcFunc;
    if(Leaf.nodeType(node, "MeasurementLog")) { rpcFunc = "mlog.rename"; }
    else{ rpcFunc = "project.rename"; }
    if(result.old_name != result.new_name){
        GLOBAL.rpc.call(rpcFunc, [result.obj.attr("id"), result.new_name]);
    }
});