vimperator で Tree Style Tab を 操作 その7

タブの移動関連を強化しました。

  • zJ でアクティブタブを 下に移動 を 追加( 2zJ で2つ下)
  • zK でアクティブタブを 上に移動 を 追加( 2zK で2つ上)
  • PUBLIC API の 確認結果を添付(タブの移動系が 非PUBLIC API まみれ)
  • commandline.open の 第一引数に ":" を 移動
  • zv で タブの末尾に貼り付けると 階層がずれることがある点を修正

全コードはこちら


以下差分 前回コミットし忘れていたようで前回分が含まれてます(;´д`)

diff -r 64a9aaa949ee treeStyleTab.js
--- a/treeStyleTab.js	Mon Jul 06 02:24:01 2009 +0900
+++ b/treeStyleTab.js	Fri Jul 17 23:16:15 2009 +0900
@@ -1,4 +1,33 @@
 // vim:fdm=marker:et:
+//
+// used API(o=public API,x=not public API){{{
+// o attachTabTo
+// x collapseExpandAllSubtree
+// o collapseExpandSubtree
+// x getChildIndex
+// o getChildTabs
+// o getDescendantTabs
+// o getFirstChildTab
+// o getFirstTab
+// o getLastChildTab
+// o getLastTab
+// o getNextSiblingTab
+// o getParentTab
+// o getPreviousSiblingTab
+// o getRootTab
+// o hasChildTabs
+// x kACTION
+// x moveTabSubTreeTo
+// o partTab
+// x performDrop
+// o readyToOpenChildTab
+// o rootTabs
+// x showTabbar
+// o stopToOpenChildTab}}}
+// 
+// x _tPos
+//
+
 (function(){
   if(!("TreeStyleTabService" in window)) return;
   var mod=liberator.modules;
@@ -41,6 +70,8 @@
   setup("zv" , "move child tab"                 , "moveChildTab");
   setup("zV" , "show next tab"                  , "moveNextTab");
   setup("zt" , "open new tab child tab"         , "tabOpenChild");
+  setup("zJ" , "move tab(direction:next)"       , "moveTabToNext");
+  setup("zK" , "move tab(direction:previous)"   , "moveTabToPrebious");
   //}}}
 
   (plugins.caisui||(plugins.caisui={}))
@@ -88,6 +119,26 @@
       return ret;
     },readyToOpenChildTabCore:function(aTab,aFlag){
       T.readyToOpenChildTab(aTab,aFlag);
+    },getMoveTabSubTreeToIndex:function(aTab,aCount,reverse){
+      let pTab = T.getParentTab(aTab);
+      let tabs = pTab ? T.getChildTabs(pTab) : T.rootTabs;
+      let src = T.getChildIndex(aTab,pTab) 
+      let dest = src + aCount;
+      if(dest < 0) dest = 0;
+      else if(dest >= tabs.length) dest = tabs.length - 1;
+      if(src == dest) return -1;
+      else if(src < dest){
+        dest = (function(aTab){
+          let t = T.getLastChildTab(aTab);
+          return t ? arguments.callee.call(this,t) : aTab;
+        })(tabs[dest])._tPos|| -1;
+      }else dest = tabs[dest]._tPos;
+      return dest;
+    },moveTabSubTreeToEx:function(aTab,aCount,reverse){
+      if(aCount == -1) aCount = 1;
+      if(reverse) aCount = -aCount;
+      let index=U1.getMoveTabSubTreeToIndex(aTab, aCount);
+      if(index >= 0) T.moveTabSubTreeTo(aTab, index);
     }
   }/*}}}*/
   ,U2=/*{{{*/{
@@ -160,7 +211,12 @@
       markTab = g.selectedTab;
     },moveChildTab:function(){
       var t=g.selectedTab;
-      U1.performDrop(markTab, t, U1.getInsertBeforeTab(t));
+      if(markTab && T.getDescendantTabs(markTab).indexOf(t)>=0){
+        liberator.echoerr("error:loop");
+        return;
+      }
+      T.partTab(markTab);
+      T.attachTabTo(markTab, t);
     },moveNextTab:function(){
       var t=gBrowser.selectedTab;
       U1.performDrop(markTab,T.getParentTab(t),U1.getInsertBeforeTab(t));
@@ -173,7 +229,30 @@
       U1.performDrop(t,null,U1.getInsertBeforeTab(r));
     },tabOpenChild:function(aCount){
       T.readyToOpenChildTab(U1.getParentTab(g.selectedTab,aCount), false);
-      commandline.open("",":tabopen ",liberator.modules.modes.EX);
+      commandline.open(":","tabopen ",liberator.modules.modes.EX);
+    },moveTabToNext:function(aCount){
+      U1.moveTabSubTreeToEx(g.selectedTab, aCount);
+    },moveTabToPrebious:function(aCount){
+      U1.moveTabSubTreeToEx(g.selectedTab, aCount, true);
     }
   }/*}}}*/) U2;
+
+  //override reload map about:blank & treestyletab-group{{{
+  (function(){
+    let map = mappings.get(modes.NORMAL, "r");
+    let f= map.action;
+    if(f.original) f = f.original;
+
+    map.action = function(){
+      let url = content.window.document.documentURI;
+      let m;
+      if(url == "about:blank"){
+        commandline.open(":","open about:treestyletab-group?", modes.EX);
+      }else if(m=/^(about:treestyletab-group\?)(.*)$/.exec(url)){
+        commandline.open(":",<>open {m[1]}{decodeURI(m[2])}</>.toString(), modes.EX);
+      }else f.apply(this,arguments);
+    };
+    map.action.original = f;
+  })();//}}}
 })();