・ドラッグ&ドロップまわりの実装を進行中
・メソッド名などを変更 git-svn-id: http://www.cozmixng.org/repos/piro/treestyletab/trunk@1238 599a83e7-65a4-db11-8015-0010dcdd6dc2
This commit is contained in:
parent
7f874d60b5
commit
8175f5707a
@ -20,8 +20,8 @@
|
|||||||
<!--preference id="extensions.treestyletab.autoExpandSubTreeOnAppendChild"
|
<!--preference id="extensions.treestyletab.autoExpandSubTreeOnAppendChild"
|
||||||
name="extensions.treestyletab.autoExpandSubTreeOnAppendChild"
|
name="extensions.treestyletab.autoExpandSubTreeOnAppendChild"
|
||||||
type="bool"/-->
|
type="bool"/-->
|
||||||
<preference id="extensions.treestyletab.adoptChildrenToGrandParentOnRemoveTab"
|
<preference id="extensions.treestyletab.attachChildrenToGrandParentOnRemoveTab"
|
||||||
name="extensions.treestyletab.adoptChildrenToGrandParentOnRemoveTab"
|
name="extensions.treestyletab.attachChildrenToGrandParentOnRemoveTab"
|
||||||
type="bool"
|
type="bool"
|
||||||
inverted="true"/>
|
inverted="true"/>
|
||||||
<preference id="extensions.treestyletab.focusMode"
|
<preference id="extensions.treestyletab.focusMode"
|
||||||
@ -44,9 +44,9 @@
|
|||||||
<!--checkbox id="extensions.treestyletab.autoExpandSubTreeOnAppendChild-check"
|
<!--checkbox id="extensions.treestyletab.autoExpandSubTreeOnAppendChild-check"
|
||||||
preference="extensions.treestyletab.autoExpandSubTreeOnAppendChild"
|
preference="extensions.treestyletab.autoExpandSubTreeOnAppendChild"
|
||||||
label="&config.autoExpandSubTreeOnAppendChild;"/-->
|
label="&config.autoExpandSubTreeOnAppendChild;"/-->
|
||||||
<checkbox id="extensions.treestyletab.adoptChildrenToGrandParentOnRemoveTab-check"
|
<checkbox id="extensions.treestyletab.attachChildrenToGrandParentOnRemoveTab-check"
|
||||||
preference="extensions.treestyletab.adoptChildrenToGrandParentOnRemoveTab"
|
preference="extensions.treestyletab.attachChildrenToGrandParentOnRemoveTab"
|
||||||
label="&config.adoptChildrenToGrandParentOnRemoveTab;"/>
|
label="&config.attachChildrenToGrandParentOnRemoveTab;"/>
|
||||||
<checkbox id="extensions.treestyletab.focusMode-check"
|
<checkbox id="extensions.treestyletab.focusMode-check"
|
||||||
preference="extensions.treestyletab.focusMode"
|
preference="extensions.treestyletab.focusMode"
|
||||||
label="&config.focusMode;"
|
label="&config.focusMode;"
|
||||||
|
@ -7,21 +7,31 @@ var TreeStyleTabService = {
|
|||||||
kINSERT_BEFORE : 'treestyletab-insert-before',
|
kINSERT_BEFORE : 'treestyletab-insert-before',
|
||||||
kSUBTREE_COLLAPSED : 'treestyletab-subtree-collapsed',
|
kSUBTREE_COLLAPSED : 'treestyletab-subtree-collapsed',
|
||||||
kCOLLAPSED : 'treestyletab-tab-collapsed',
|
kCOLLAPSED : 'treestyletab-tab-collapsed',
|
||||||
|
kNEST : 'treestyletab-nest',
|
||||||
|
kDROP_POSITION : 'treestyletab-drop-position',
|
||||||
|
|
||||||
kTWISTY : 'treestyletab-tab-tree-twisty',
|
kTWISTY : 'treestyletab-tab-tree-twisty',
|
||||||
kTWISTY_CONTAINER : 'treestyletab-tab-tree-twisty-container',
|
kTWISTY_CONTAINER : 'treestyletab-tab-tree-twisty-container',
|
||||||
kCOUNTER : 'treestyletab-tab-tree-counter',
|
kCOUNTER : 'treestyletab-tab-tree-counter',
|
||||||
kCOUNTER_CONTAINER : 'treestyletab-tab-tree-counter-container',
|
kCOUNTER_CONTAINER : 'treestyletab-tab-tree-counter-container',
|
||||||
|
|
||||||
kMENUITEM_REMOVESUBTREE_MULTIPLETAB_SELECTION : 'multipletab-selection-item-removeTabSubTree',
|
kMENUITEM_REMOVESUBTREE_SELECTION : 'multipletab-selection-item-removeTabSubTree',
|
||||||
kMENUITEM_REMOVESUBTREE_CONTEXT : 'context-item-removeTabSubTree',
|
kMENUITEM_REMOVESUBTREE_CONTEXT : 'context-item-removeTabSubTree',
|
||||||
|
|
||||||
kFOCUS_ALL : 0,
|
kFOCUS_ALL : 0,
|
||||||
kFOCUS_VISIBLE : 1,
|
kFOCUS_VISIBLE : 1,
|
||||||
|
|
||||||
|
kDROP_BEFORE : -1,
|
||||||
|
kDROP_ON : 0,
|
||||||
|
kDROP_AFTER : 1,
|
||||||
|
|
||||||
|
kACTION_MOVE : 1,
|
||||||
|
kACTION_ATTACH : 2,
|
||||||
|
kACTION_PART : 4,
|
||||||
|
|
||||||
levelMargin : 12,
|
levelMargin : 12,
|
||||||
positionProp : 'screenY',
|
positionProp : 'screenY',
|
||||||
sizeProp : 'width',
|
sizeProp : 'height',
|
||||||
|
|
||||||
NSResolver : {
|
NSResolver : {
|
||||||
lookupNamespaceURI : function(aPrefix)
|
lookupNamespaceURI : function(aPrefix)
|
||||||
@ -208,7 +218,7 @@ var TreeStyleTabService = {
|
|||||||
var ownerBrowser = ('SplitBrowser' in window) ? TreeStyleTabService.getTabBrowserFromChildren(SplitBrowser.getSubBrowserAndBrowserFromFrame(aOpener.top).browser) : gBrowser ;
|
var ownerBrowser = ('SplitBrowser' in window) ? TreeStyleTabService.getTabBrowserFromChildren(SplitBrowser.getSubBrowserAndBrowserFromFrame(aOpener.top).browser) : gBrowser ;
|
||||||
var parentTab = TreeStyleTabService.getTabFromFrame(aOpener, ownerBrowser);
|
var parentTab = TreeStyleTabService.getTabFromFrame(aOpener, ownerBrowser);
|
||||||
|
|
||||||
ownerBrowser.__treestyletab__readyToAdoptNewTab = true;
|
ownerBrowser.__treestyletab__readyToAttachNewTab = true;
|
||||||
ownerBrowser.__treestyletab__parentTab = parentTab.getAttribute(TreeStyleTabService.kID);
|
ownerBrowser.__treestyletab__parentTab = parentTab.getAttribute(TreeStyleTabService.kID);
|
||||||
})(aOpener);
|
})(aOpener);
|
||||||
}
|
}
|
||||||
@ -230,7 +240,7 @@ var TreeStyleTabService = {
|
|||||||
var tabs;
|
var tabs;
|
||||||
if (aPopup.id == 'multipletab-selection-menu') {
|
if (aPopup.id == 'multipletab-selection-menu') {
|
||||||
b = MultipleTabService.browser;
|
b = MultipleTabService.browser;
|
||||||
item = document.getElementById(TreeStyleTabService.kMENUITEM_REMOVESUBTREE_MULTIPLETAB_SELECTION);
|
item = document.getElementById(TreeStyleTabService.kMENUITEM_REMOVESUBTREE_SELECTION);
|
||||||
tabs = MultipleTabService.getSelectedTabs();
|
tabs = MultipleTabService.getSelectedTabs();
|
||||||
}
|
}
|
||||||
else { // context
|
else { // context
|
||||||
@ -296,14 +306,9 @@ var TreeStyleTabService = {
|
|||||||
<><![CDATA[
|
<><![CDATA[
|
||||||
{
|
{
|
||||||
if (TreeStyleTabService.getPref('extensions.treestyletab.focusMode') == TreeStyleTabService.kFOCUS_VISIBLE) {
|
if (TreeStyleTabService.getPref('extensions.treestyletab.focusMode') == TreeStyleTabService.kFOCUS_VISIBLE) {
|
||||||
(function(aDir, aWarp, aSelf) {
|
(function(aDir, aWrap, aSelf) {
|
||||||
var xpathResult = TreeStyleTabService.evaluateXPath(
|
var nextTab = (aDir < 0) ? TreeStyleTabService.getPreviousVisibleTab(aSelf.selectedItem) : TreeStyleTabService.getNextVisibleTab(aSelf.selectedItem) ;
|
||||||
(aDir < 0 ? 'preceding-sibling' : 'following-sibling' )+
|
if (!nextTab && aWrap) {
|
||||||
'::xul:tab[not(@'+TreeStyleTabService.kCOLLAPSED+'="true")]',
|
|
||||||
aSelf.selectedItem
|
|
||||||
);
|
|
||||||
var nextTab = xpathResult.snapshotItem(aDir < 0 ? xpathResult.snapshotLength-1 : 0 );
|
|
||||||
if (!nextTab && aWarp) {
|
|
||||||
var xpathResult = TreeStyleTabService.evaluateXPath(
|
var xpathResult = TreeStyleTabService.evaluateXPath(
|
||||||
'child::xul:tab[not(@'+TreeStyleTabService.kCOLLAPSED+'="true")]',
|
'child::xul:tab[not(@'+TreeStyleTabService.kCOLLAPSED+'="true")]',
|
||||||
aSelf
|
aSelf
|
||||||
@ -311,7 +316,7 @@ var TreeStyleTabService = {
|
|||||||
nextTab = xpathResult.snapshotItem(aDir < 0 ? xpathResult.snapshotLength-1 : 0 );
|
nextTab = xpathResult.snapshotItem(aDir < 0 ? xpathResult.snapshotLength-1 : 0 );
|
||||||
}
|
}
|
||||||
if (nextTab && nextTab != aSelf.selectedItem) {
|
if (nextTab && nextTab != aSelf.selectedItem) {
|
||||||
aSelf.selectNewTab(nextTab, aDir, aWarp);
|
aSelf.selectNewTab(nextTab, aDir, aWrap);
|
||||||
}
|
}
|
||||||
})(arguments[0], arguments[1], this);
|
})(arguments[0], arguments[1], this);
|
||||||
return;
|
return;
|
||||||
@ -320,6 +325,14 @@ var TreeStyleTabService = {
|
|||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
eval('aTabBrowser.mTabContainer._notifyBackgroundTab = '+
|
||||||
|
aTabBrowser.mTabContainer._notifyBackgroundTab.toSource().replace(
|
||||||
|
/\.screenX/g, '[TreeStyleTabService.positionProp]'
|
||||||
|
).replace(
|
||||||
|
/\.width/g, '[TreeStyleTabService.sizeProp]'
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
eval('aTabBrowser.canDrop = '+
|
eval('aTabBrowser.canDrop = '+
|
||||||
aTabBrowser.canDrop.toSource().replace(
|
aTabBrowser.canDrop.toSource().replace(
|
||||||
/\.screenX/g, '[TreeStyleTabService.positionProp]'
|
/\.screenX/g, '[TreeStyleTabService.positionProp]'
|
||||||
@ -328,19 +341,30 @@ var TreeStyleTabService = {
|
|||||||
).replace(
|
).replace(
|
||||||
/return true;/,
|
/return true;/,
|
||||||
<><![CDATA[
|
<><![CDATA[
|
||||||
if ((function(aEvent, aDragSession, aSelf) { // is the tab is in the subtree?
|
if (!(function(aEvent, aDragSession, aSelf) {
|
||||||
if (!aDragSession.sourceNode ||
|
if (!aDragSession.sourceNode ||
|
||||||
aDragSession.sourceNode.parentNode != aSelf.mTabContainer ||
|
aDragSession.sourceNode.parentNode != aSelf.mTabContainer ||
|
||||||
aEvent.target.localName != 'tab')
|
aEvent.target.localName != 'tab')
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (aEvent.target.getAttribute(TreeStyleTabService.kCOLLAPSED) == 'true')
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
var info = TreeStyleTabService.getDropAction(aEvent);
|
||||||
|
if (!(info.action & TreeStyleTabService.kACTION_ATTACH))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
//dump(' target : '+info.tab._tPos+'\n position : '+info.position+'\n index : '+info.index+'\n action : '+info.action+'\n');
|
||||||
|
|
||||||
|
// is the tab is in the subtree?
|
||||||
var orig = aDragSession.sourceNode;
|
var orig = aDragSession.sourceNode;
|
||||||
var tab = aEvent.target;
|
var tab = info.tab;
|
||||||
while (tab = TreeStyleTabService.getParentTabOf(tab))
|
while (tab = TreeStyleTabService.getParentTab(tab))
|
||||||
{
|
{
|
||||||
if (tab == orig)
|
if (tab == orig)
|
||||||
return true;
|
return false;
|
||||||
}
|
}
|
||||||
return false;
|
return true;
|
||||||
})(aEvent, aDragSession, this))
|
})(aEvent, aDragSession, this))
|
||||||
return false;
|
return false;
|
||||||
return true;
|
return true;
|
||||||
@ -348,18 +372,53 @@ var TreeStyleTabService = {
|
|||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
eval('aTabBrowser.onDragOver = '+
|
||||||
|
aTabBrowser.onDragOver.toSource().replace(
|
||||||
|
'{',
|
||||||
|
<><![CDATA[
|
||||||
|
{
|
||||||
|
var xpathResult = TreeStyleTabService.evaluateXPath(
|
||||||
|
'child::xul:tab[@'+TreeStyleTabService.kDROP_POSITION+']',
|
||||||
|
this.mTabContainer
|
||||||
|
);
|
||||||
|
for (var i = 0, maxi = xpathResult.snapshotLength; i < maxi; i++)
|
||||||
|
{
|
||||||
|
xpathResult.snapshotItem(i).removeAttribute(TreeStyleTabService.kDROP_POSITION);
|
||||||
|
}
|
||||||
|
var info = TreeStyleTabService.getDropAction(aEvent);
|
||||||
|
if (info.tab) {
|
||||||
|
info.tab.setAttribute(
|
||||||
|
TreeStyleTabService.kDROP_POSITION,
|
||||||
|
info.position == TreeStyleTabService.kDROP_BEFORE ? 'before' :
|
||||||
|
info.position == TreeStyleTabService.kDROP_AFTER ? 'after' :
|
||||||
|
'self'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
]]></>
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
eval('aTabBrowser.getNewIndex = '+
|
||||||
|
aTabBrowser.getNewIndex.toSource().replace(
|
||||||
|
/\.screenX/g, '[TreeStyleTabService.positionProp]'
|
||||||
|
).replace(
|
||||||
|
/\.width/g, '[TreeStyleTabService.sizeProp]'
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
eval('aTabBrowser.moveTabForward = '+
|
eval('aTabBrowser.moveTabForward = '+
|
||||||
aTabBrowser.moveTabForward.toSource().replace(
|
aTabBrowser.moveTabForward.toSource().replace(
|
||||||
'{', '{ var nextTab;'
|
'{', '{ var nextTab;'
|
||||||
).replace(
|
).replace(
|
||||||
'tabPos < this.browsers.length - 1',
|
'tabPos < this.browsers.length - 1',
|
||||||
'nextTab = TreeStyleTabService.getNextSiblingTabOf(this.mCurrentTab)'
|
'nextTab = TreeStyleTabService.getNextSiblingTab(this.mCurrentTab)'
|
||||||
).replace(
|
).replace(
|
||||||
'tabPos + 1', 'nextTab._tPos'
|
'tabPos + 1', 'nextTab._tPos'
|
||||||
).replace(
|
).replace(
|
||||||
'this.moveTabTo(',
|
'this.moveTabTo(',
|
||||||
<><![CDATA[
|
<><![CDATA[
|
||||||
var descendant = TreeStyleTabService.getDescendantTabsOf(nextTab);
|
var descendant = TreeStyleTabService.getDescendantTabs(nextTab);
|
||||||
if (descendant.length) {
|
if (descendant.length) {
|
||||||
nextTab = descendant[descendant.length-1];
|
nextTab = descendant[descendant.length-1];
|
||||||
}
|
}
|
||||||
@ -367,9 +426,9 @@ var TreeStyleTabService = {
|
|||||||
).replace(
|
).replace(
|
||||||
'this.moveTabToStart();',
|
'this.moveTabToStart();',
|
||||||
<><![CDATA[
|
<><![CDATA[
|
||||||
var parentTab = TreeStyleTabService.getParentTabOf(this.mCurrentTab);
|
var parentTab = TreeStyleTabService.getParentTab(this.mCurrentTab);
|
||||||
if (parentTab) {
|
if (parentTab) {
|
||||||
this.moveTabTo(this.mCurrentTab, TreeStyleTabService.getFirstChildTabOf(parentTab)._tPos);
|
this.moveTabTo(this.mCurrentTab, TreeStyleTabService.getFirstChildTab(parentTab)._tPos);
|
||||||
this.mCurrentTab.focus();
|
this.mCurrentTab.focus();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -384,15 +443,15 @@ var TreeStyleTabService = {
|
|||||||
'{', '{ var prevTab;'
|
'{', '{ var prevTab;'
|
||||||
).replace(
|
).replace(
|
||||||
'tabPos > 0',
|
'tabPos > 0',
|
||||||
'prevTab = TreeStyleTabService.getPreviousSiblingTabOf(this.mCurrentTab)'
|
'prevTab = TreeStyleTabService.getPreviousSiblingTab(this.mCurrentTab)'
|
||||||
).replace(
|
).replace(
|
||||||
'tabPos - 1', 'prevTab._tPos'
|
'tabPos - 1', 'prevTab._tPos'
|
||||||
).replace(
|
).replace(
|
||||||
'this.moveTabToEnd();',
|
'this.moveTabToEnd();',
|
||||||
<><![CDATA[
|
<><![CDATA[
|
||||||
var parentTab = TreeStyleTabService.getParentTabOf(this.mCurrentTab);
|
var parentTab = TreeStyleTabService.getParentTab(this.mCurrentTab);
|
||||||
if (parentTab) {
|
if (parentTab) {
|
||||||
this.moveTabTo(this.mCurrentTab, TreeStyleTabService.getLastChildTabOf(parentTab)._tPos);
|
this.moveTabTo(this.mCurrentTab, TreeStyleTabService.getLastChildTab(parentTab)._tPos);
|
||||||
this.mCurrentTab.focus();
|
this.mCurrentTab.focus();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -402,37 +461,30 @@ var TreeStyleTabService = {
|
|||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
eval('aTabBrowser.moveTabOver = '+
|
eval('aTabBrowser._keyEventHandler.handleEvent = '+
|
||||||
aTabBrowser.moveTabOver.toSource().replace(
|
aTabBrowser._keyEventHandler.handleEvent.toSource().replace(
|
||||||
'{',
|
'this.tabbrowser.moveTabOver(aEvent);',
|
||||||
<><![CDATA[
|
<><![CDATA[
|
||||||
{
|
if (!TreeStyleTabService.isTabVertical(this.tabbrowser) ||
|
||||||
var parentTab = TreeStyleTabService.getParentTabOf(this.mCurrentTab);
|
!TreeStyleTabService.moveTabLevel(aEvent)) {
|
||||||
if (aEvent.keyCode == KeyEvent.DOM_VK_RIGHT) {
|
this.tabbrowser.moveTabOver(aEvent);
|
||||||
var prevTab = TreeStyleTabService.getPreviousSiblingTabOf(this.mCurrentTab);
|
}
|
||||||
if ((!parentTab && prevTab) ||
|
]]></>
|
||||||
(parentTab && this.mCurrentTab != TreeStyleTabService.getFirstChildTabOf(parentTab))) {
|
).replace(
|
||||||
TreeStyleTabService.adoptTabTo(this.mCurrentTab, prevTab);
|
'this.tabbrowser.moveTabForward();',
|
||||||
this.mCurrentTab.focus();
|
<><![CDATA[
|
||||||
return;
|
if (TreeStyleTabService.isTabVertical(this.tabbrowser) ||
|
||||||
}
|
!TreeStyleTabService.moveTabLevel(aEvent)) {
|
||||||
}
|
this.tabbrowser.moveTabForward();
|
||||||
else if (aEvent.keyCode == KeyEvent.DOM_VK_LEFT && parentTab) {
|
}
|
||||||
var grandParent = TreeStyleTabService.getParentTabOf(parentTab);
|
]]></>
|
||||||
if (grandParent) {
|
).replace(
|
||||||
TreeStyleTabService.adoptTabTo(this.mCurrentTab, grandParent, { insertBefore : TreeStyleTabService.getNextSiblingTabOf(parentTab) });
|
'this.tabbrowser.moveTabBackward();',
|
||||||
this.mCurrentTab.focus();
|
<><![CDATA[
|
||||||
}
|
if (TreeStyleTabService.isTabVertical(this.tabbrowser) ||
|
||||||
else {
|
!TreeStyleTabService.moveTabLevel(aEvent)) {
|
||||||
var nextTab = TreeStyleTabService.getNextSiblingTabOf(parentTab);
|
this.tabbrowser.moveTabBackward();
|
||||||
TreeStyleTabService.repudiateTab(this.mCurrentTab);
|
}
|
||||||
if (nextTab) {
|
|
||||||
this.moveTabTo(this.mCurrentTab, nextTab._tPos - 1);
|
|
||||||
}
|
|
||||||
this.mCurrentTab.focus();
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
]]></>
|
]]></>
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
@ -551,7 +603,7 @@ var TreeStyleTabService = {
|
|||||||
var parent;
|
var parent;
|
||||||
for (var i = 0, maxi = tabs.length; i < maxi; i++)
|
for (var i = 0, maxi = tabs.length; i < maxi; i++)
|
||||||
{
|
{
|
||||||
parent = this.getParentTabOf(tabs[i]);
|
parent = this.getParentTab(tabs[i]);
|
||||||
if (parent)
|
if (parent)
|
||||||
this.setTabValue(tabs[i], this.kPARENT, parent.getAttribute(this.kID));
|
this.setTabValue(tabs[i], this.kPARENT, parent.getAttribute(this.kID));
|
||||||
}
|
}
|
||||||
@ -610,7 +662,7 @@ var TreeStyleTabService = {
|
|||||||
}
|
}
|
||||||
if (node.href && isMiddleClick) {
|
if (node.href && isMiddleClick) {
|
||||||
var b = this.getTabBrowserFromChildren(aEvent.currentTarget);
|
var b = this.getTabBrowserFromChildren(aEvent.currentTarget);
|
||||||
b.__treestyletab__readyToAdoptNewTab = true;
|
b.__treestyletab__readyToAttachNewTab = true;
|
||||||
b.__treestyletab__parentTab = b.selectedTab.getAttribute(this.kID);
|
b.__treestyletab__parentTab = b.selectedTab.getAttribute(this.kID);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
@ -661,13 +713,13 @@ var TreeStyleTabService = {
|
|||||||
var tab = aEvent.originalTarget;
|
var tab = aEvent.originalTarget;
|
||||||
var b = this.getTabBrowserFromChildren(tab);
|
var b = this.getTabBrowserFromChildren(tab);
|
||||||
|
|
||||||
if (b.__treestyletab__readyToAdoptNewTab) {
|
if (b.__treestyletab__readyToAttachNewTab) {
|
||||||
var parent = this.getTabById(b.__treestyletab__parentTab, b);
|
var parent = this.getTabById(b.__treestyletab__parentTab, b);
|
||||||
if (parent)
|
if (parent)
|
||||||
this.adoptTabTo(tab, parent);
|
this.attachTabTo(tab, parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
b.__treestyletab__readyToAdoptNewTab = false;
|
b.__treestyletab__readyToAttachNewTab = false;
|
||||||
b.__treestyletab__parentTab = '';
|
b.__treestyletab__parentTab = '';
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -677,45 +729,45 @@ var TreeStyleTabService = {
|
|||||||
var b = this.getTabBrowserFromChildren(tab);
|
var b = this.getTabBrowserFromChildren(tab);
|
||||||
|
|
||||||
if (tab.getAttribute(this.kSUBTREE_COLLAPSED)) {
|
if (tab.getAttribute(this.kSUBTREE_COLLAPSED)) {
|
||||||
var descendant = this.getDescendantTabsOf(tab);
|
var descendant = this.getDescendantTabs(tab);
|
||||||
for (var i = descendant.length-1; i > -1; i--)
|
for (var i = descendant.length-1; i > -1; i--)
|
||||||
{
|
{
|
||||||
b.removeTab(descendant[i]);
|
b.removeTab(descendant[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var firstChild = this.getFirstChildTabOf(tab);
|
var firstChild = this.getFirstChildTab(tab);
|
||||||
var parentTab = this.getParentTabOf(tab);
|
var parentTab = this.getParentTab(tab);
|
||||||
var nextFocusedTab = null;
|
var nextFocusedTab = null;
|
||||||
|
|
||||||
if (parentTab) {
|
if (parentTab) {
|
||||||
this.setTabValue(tab, this.kPARENT, parentTab.getAttribute(this.kID));
|
this.setTabValue(tab, this.kPARENT, parentTab.getAttribute(this.kID));
|
||||||
var next = this.getNextSiblingTabOf(tab);
|
var next = this.getNextSiblingTab(tab);
|
||||||
if (next)
|
if (next)
|
||||||
this.setTabValue(tab, this.kINSERT_BEFORE, next.getAttribute(this.kID));
|
this.setTabValue(tab, this.kINSERT_BEFORE, next.getAttribute(this.kID));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (firstChild) {
|
if (firstChild) {
|
||||||
var backupChildren = this.getTabValue(tab, this.kCHILDREN);
|
var backupChildren = this.getTabValue(tab, this.kCHILDREN);
|
||||||
var children = this.getChildTabsOf(tab);
|
var children = this.getChildTabs(tab);
|
||||||
var self = this;
|
var self = this;
|
||||||
var adoption = this.getPref('extensions.treestyletab.adoptChildrenToGrandParentOnRemoveTab');
|
var attachion = this.getPref('extensions.treestyletab.attachChildrenToGrandParentOnRemoveTab');
|
||||||
var processTab = !adoption ? function(aTab) {
|
var processTab = !attachion ? function(aTab) {
|
||||||
self.repudiateTab(aTab, true);
|
self.partTab(aTab, true);
|
||||||
self.moveTabSubTreeTo(aTab, b.mTabContainer.lastChild._tPos);
|
self.moveTabSubTreeTo(aTab, b.mTabContainer.lastChild._tPos);
|
||||||
} :
|
} :
|
||||||
parentTab ? function(aTab) {
|
parentTab ? function(aTab) {
|
||||||
self.adoptTabTo(aTab, parentTab, { insertBefore : tab, dontUpdateIndent : true });
|
self.attachTabTo(aTab, parentTab, { insertBefore : tab, dontUpdateIndent : true });
|
||||||
} :
|
} :
|
||||||
function(aTab) {
|
function(aTab) {
|
||||||
self.repudiateTab(aTab, true);
|
self.partTab(aTab, true);
|
||||||
};
|
};
|
||||||
for (var i = 0, maxi = children.length; i < maxi; i++)
|
for (var i = 0, maxi = children.length; i < maxi; i++)
|
||||||
{
|
{
|
||||||
processTab(children[i]);
|
processTab(children[i]);
|
||||||
}
|
}
|
||||||
this.updateTabsIndent(children);
|
this.updateTabsIndent(children);
|
||||||
if (adoption) {
|
if (attachion) {
|
||||||
nextFocusedTab = firstChild;
|
nextFocusedTab = firstChild;
|
||||||
}
|
}
|
||||||
this.setTabValue(tab, this.kCHILDREN, backupChildren);
|
this.setTabValue(tab, this.kCHILDREN, backupChildren);
|
||||||
@ -723,20 +775,20 @@ var TreeStyleTabService = {
|
|||||||
|
|
||||||
if (!nextFocusedTab) {
|
if (!nextFocusedTab) {
|
||||||
if (parentTab) {
|
if (parentTab) {
|
||||||
var firstSibling = this.getFirstChildTabOf(parentTab);
|
var firstSibling = this.getFirstChildTab(parentTab);
|
||||||
var lastSibling = this.getLastChildTabOf(parentTab);
|
var lastSibling = this.getLastChildTab(parentTab);
|
||||||
if (tab == lastSibling) {
|
if (tab == lastSibling) {
|
||||||
if (tab == firstSibling) { // there is only one child
|
if (tab == firstSibling) { // there is only one child
|
||||||
nextFocusedTab = parentTab;
|
nextFocusedTab = parentTab;
|
||||||
}
|
}
|
||||||
else { // previous sibling tab
|
else { // previous sibling tab
|
||||||
nextFocusedTab = this.getPreviousSiblingTabOf(tab);
|
nextFocusedTab = this.getPreviousSiblingTab(tab);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.repudiateTab(tab, true);
|
this.partTab(tab, true);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
nextFocusedTab = this.getNextSiblingTabOf(tab);
|
nextFocusedTab = this.getNextSiblingTab(tab);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -754,9 +806,9 @@ var TreeStyleTabService = {
|
|||||||
this.moveTabSubTreeTo(tab, tab._tPos);
|
this.moveTabSubTreeTo(tab, tab._tPos);
|
||||||
}
|
}
|
||||||
|
|
||||||
var parentTab = this.getParentTabOf(tab);
|
var parentTab = this.getParentTab(tab);
|
||||||
if (parentTab && !b.__treestyletab__isSubTreeChildrenMoving) {
|
if (parentTab && !b.__treestyletab__isSubTreeChildrenMoving) {
|
||||||
var children = this.getChildTabsOf(parentTab);
|
var children = this.getChildTabs(parentTab);
|
||||||
children.sort(function(aA, aB) { return aA._tPos - aB._tPos; });
|
children.sort(function(aA, aB) { return aA._tPos - aB._tPos; });
|
||||||
var self = this;
|
var self = this;
|
||||||
this.setTabValue(parentTab, this.kCHILDREN, children.map(function(aItem) { return aItem.getAttribute(self.kID); }).join('|'));
|
this.setTabValue(parentTab, this.kCHILDREN, children.map(function(aItem) { return aItem.getAttribute(self.kID); }).join('|'));
|
||||||
@ -779,7 +831,7 @@ var TreeStyleTabService = {
|
|||||||
for (var i = 0, maxi = children.length; i < maxi; i++)
|
for (var i = 0, maxi = children.length; i < maxi; i++)
|
||||||
{
|
{
|
||||||
if (children[i] && (children[i] = this.getTabById(children[i], b))) {
|
if (children[i] && (children[i] = this.getTabById(children[i], b))) {
|
||||||
this.adoptTabTo(children[i], tab, { dontExpand : true, dontUpdateIndent : true });
|
this.attachTabTo(children[i], tab, { dontExpand : true, dontUpdateIndent : true });
|
||||||
tabs.push(children[i]);
|
tabs.push(children[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -788,7 +840,7 @@ var TreeStyleTabService = {
|
|||||||
var parent = this.getTabValue(tab, this.kPARENT);
|
var parent = this.getTabValue(tab, this.kPARENT);
|
||||||
var before = this.getTabValue(tab, this.kINSERT_BEFORE);
|
var before = this.getTabValue(tab, this.kINSERT_BEFORE);
|
||||||
if (parent && (parent = this.getTabById(parent, b))) {
|
if (parent && (parent = this.getTabById(parent, b))) {
|
||||||
this.adoptTabTo(tab, parent, { dontExpand : true, insertBefore : (before ? this.getTabById(before, b) : null ), dontUpdateIndent : true });
|
this.attachTabTo(tab, parent, { dontExpand : true, insertBefore : (before ? this.getTabById(before, b) : null ), dontUpdateIndent : true });
|
||||||
this.deleteTabValue(tab, this.kPARENT);
|
this.deleteTabValue(tab, this.kPARENT);
|
||||||
this.updateTabsIndent([tab]);
|
this.updateTabsIndent([tab]);
|
||||||
}
|
}
|
||||||
@ -831,13 +883,13 @@ var TreeStyleTabService = {
|
|||||||
/*
|
/*
|
||||||
var p;
|
var p;
|
||||||
if ((tab.getAttribute(this.kCOLLAPSED) == 'true') &&
|
if ((tab.getAttribute(this.kCOLLAPSED) == 'true') &&
|
||||||
(p = this.getParentTabOf(tab))) {
|
(p = this.getParentTab(tab))) {
|
||||||
b.selectedTab = p;
|
b.selectedTab = p;
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
if (tab.getAttribute(this.kCOLLAPSED) == 'true') {
|
if (tab.getAttribute(this.kCOLLAPSED) == 'true') {
|
||||||
var parentTab = tab;
|
var parentTab = tab;
|
||||||
while (parentTab = this.getParentTabOf(parentTab))
|
while (parentTab = this.getParentTab(parentTab))
|
||||||
{
|
{
|
||||||
this.collapseExpandTabSubTree(parentTab, false);
|
this.collapseExpandTabSubTree(parentTab, false);
|
||||||
}
|
}
|
||||||
@ -896,7 +948,27 @@ var TreeStyleTabService = {
|
|||||||
).singleNodeValue;
|
).singleNodeValue;
|
||||||
},
|
},
|
||||||
|
|
||||||
getParentTabOf : function(aTab)
|
getNextVisibleTab : function(aTab)
|
||||||
|
{
|
||||||
|
var xpathResult = this.evaluateXPath(
|
||||||
|
'following-sibling::xul:tab[not(@'+TreeStyleTabService.kCOLLAPSED+'="true")]',
|
||||||
|
aTab
|
||||||
|
);
|
||||||
|
return xpathResult.snapshotItem(0);
|
||||||
|
},
|
||||||
|
|
||||||
|
getPreviousVisibleTab : function(aTab)
|
||||||
|
{
|
||||||
|
var xpathResult = this.evaluateXPath(
|
||||||
|
'preceding-sibling::xul:tab[not(@'+TreeStyleTabService.kCOLLAPSED+'="true")]',
|
||||||
|
aTab
|
||||||
|
);
|
||||||
|
return xpathResult.snapshotItem(xpathResult.snapshotLength-1);
|
||||||
|
},
|
||||||
|
|
||||||
|
/* tree */
|
||||||
|
|
||||||
|
getParentTab : function(aTab)
|
||||||
{
|
{
|
||||||
var id = aTab.getAttribute(this.kID);
|
var id = aTab.getAttribute(this.kID);
|
||||||
return this.evaluateXPath(
|
return this.evaluateXPath(
|
||||||
@ -906,17 +978,17 @@ var TreeStyleTabService = {
|
|||||||
).singleNodeValue;
|
).singleNodeValue;
|
||||||
},
|
},
|
||||||
|
|
||||||
getNextSiblingTabOf : function(aTab)
|
getNextSiblingTab : function(aTab)
|
||||||
{
|
{
|
||||||
var id = aTab.getAttribute(this.kID);
|
var id = aTab.getAttribute(this.kID);
|
||||||
var parentTab = this.getParentTabOf(aTab);
|
var parentTab = this.getParentTab(aTab);
|
||||||
|
|
||||||
if (!parentTab) {
|
if (!parentTab) {
|
||||||
var next = aTab;
|
var next = aTab;
|
||||||
do {
|
do {
|
||||||
next = next.nextSibling;
|
next = next.nextSibling;
|
||||||
}
|
}
|
||||||
while (next && this.getParentTabOf(next));
|
while (next && this.getParentTab(next));
|
||||||
return next;
|
return next;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -933,17 +1005,17 @@ var TreeStyleTabService = {
|
|||||||
return null;
|
return null;
|
||||||
},
|
},
|
||||||
|
|
||||||
getPreviousSiblingTabOf : function(aTab)
|
getPreviousSiblingTab : function(aTab)
|
||||||
{
|
{
|
||||||
var id = aTab.getAttribute(this.kID);
|
var id = aTab.getAttribute(this.kID);
|
||||||
var parentTab = this.getParentTabOf(aTab);
|
var parentTab = this.getParentTab(aTab);
|
||||||
|
|
||||||
if (!parentTab) {
|
if (!parentTab) {
|
||||||
var prev = aTab;
|
var prev = aTab;
|
||||||
do {
|
do {
|
||||||
prev = prev.previousSibling;
|
prev = prev.previousSibling;
|
||||||
}
|
}
|
||||||
while (prev && this.getParentTabOf(prev));
|
while (prev && this.getParentTab(prev));
|
||||||
return prev;
|
return prev;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -960,14 +1032,7 @@ var TreeStyleTabService = {
|
|||||||
return null;
|
return null;
|
||||||
},
|
},
|
||||||
|
|
||||||
getDescendantTabsOf : function(aTab)
|
getChildTabs : function(aTab, aAllTabsArray)
|
||||||
{
|
|
||||||
var tabs = [];
|
|
||||||
this.getChildTabsOf(aTab, tabs);
|
|
||||||
return tabs;
|
|
||||||
},
|
|
||||||
|
|
||||||
getChildTabsOf : function(aTab, aAllTabsArray)
|
|
||||||
{
|
{
|
||||||
var tabs = [];
|
var tabs = [];
|
||||||
var children = aTab.getAttribute(this.kCHILDREN);
|
var children = aTab.getAttribute(this.kCHILDREN);
|
||||||
@ -984,13 +1049,20 @@ var TreeStyleTabService = {
|
|||||||
if (!tab) continue;
|
if (!tab) continue;
|
||||||
tabs.push(tab);
|
tabs.push(tab);
|
||||||
if (aAllTabsArray)
|
if (aAllTabsArray)
|
||||||
this.getChildTabsOf(tab, tabs);
|
this.getChildTabs(tab, tabs);
|
||||||
}
|
}
|
||||||
|
|
||||||
return tabs;
|
return tabs;
|
||||||
},
|
},
|
||||||
|
|
||||||
getFirstChildTabOf : function(aTab)
|
getDescendantTabs : function(aTab)
|
||||||
|
{
|
||||||
|
var tabs = [];
|
||||||
|
this.getChildTabs(aTab, tabs);
|
||||||
|
return tabs;
|
||||||
|
},
|
||||||
|
|
||||||
|
getFirstChildTab : function(aTab)
|
||||||
{
|
{
|
||||||
var b = this.getTabBrowserFromChildren(aTab);
|
var b = this.getTabBrowserFromChildren(aTab);
|
||||||
var children = aTab.getAttribute(this.kCHILDREN);
|
var children = aTab.getAttribute(this.kCHILDREN);
|
||||||
@ -1006,7 +1078,7 @@ var TreeStyleTabService = {
|
|||||||
return firstChild;
|
return firstChild;
|
||||||
},
|
},
|
||||||
|
|
||||||
getLastChildTabOf : function(aTab)
|
getLastChildTab : function(aTab)
|
||||||
{
|
{
|
||||||
var b = this.getTabBrowserFromChildren(aTab);
|
var b = this.getTabBrowserFromChildren(aTab);
|
||||||
var children = aTab.getAttribute(this.kCHILDREN);
|
var children = aTab.getAttribute(this.kCHILDREN);
|
||||||
@ -1022,9 +1094,130 @@ var TreeStyleTabService = {
|
|||||||
return lastChild;
|
return lastChild;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
getDropAction : function(aEvent)
|
||||||
|
{
|
||||||
|
var tab = aEvent.target;
|
||||||
|
var b = this.getTabBrowserFromChildren(tab);
|
||||||
|
var tabs = b.mTabContainer.childNodes;
|
||||||
|
var isInverted = this.isTabVertical(b) ? false : window.getComputedStyle(b.parentNode, null).direction == 'ltr';
|
||||||
|
var info = {
|
||||||
|
tab : null,
|
||||||
|
target : null,
|
||||||
|
position : null,
|
||||||
|
index : null,
|
||||||
|
action : null
|
||||||
|
};
|
||||||
|
|
||||||
|
if (tab.localName != 'tab') {
|
||||||
|
if (aEvent[this.positionProp] < tabs[0].boxObject[this.positionProp]) {
|
||||||
|
info.tab = info.target = tabs[0];
|
||||||
|
info.position = isInverted ? this.kDROP_AFTER : this.kDROP_BEFORE ;
|
||||||
|
info.index = 0;
|
||||||
|
info.action = this.kACTION_MOVE | this.kACTION_PART;
|
||||||
|
return info;
|
||||||
|
}
|
||||||
|
else if (aEvent[this.positionProp] > tabs[tabs.length-1].boxObject[this.positionProp] + tabs[tabs.length-1].boxObject[this.sizeProp]) {
|
||||||
|
info.tab = info.target = tabs[tabs.length-1];
|
||||||
|
info.position = isInverted ? this.kDROP_BEFORE : this.kDROP_AFTER ;
|
||||||
|
info.index = tabs.length-1;
|
||||||
|
info.action = this.kACTION_MOVE | this.kACTION_PART;
|
||||||
|
return info;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
info.tab = tabs[b.getNewIndex(aEvent)];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
info.tab = tab;
|
||||||
|
}
|
||||||
|
|
||||||
|
info.target = tab;
|
||||||
|
|
||||||
|
var boxPos = tab.boxObject[this.positionProp];
|
||||||
|
var boxUnit = Math.round(tab.boxObject[this.sizeProp] / 3);
|
||||||
|
if (aEvent[this.positionProp] < boxPos + boxUnit) {
|
||||||
|
info.position = isInverted ? this.kDROP_AFTER : this.kDROP_BEFORE ;
|
||||||
|
}
|
||||||
|
else if (aEvent[this.positionProp] > boxPos + boxUnit + boxUnit) {
|
||||||
|
info.position = isInverted ? this.kDROP_BEFORE : this.kDROP_AFTER ;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
info.position = this.kDROP_ON;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (info.position)
|
||||||
|
{
|
||||||
|
case this.kDROP_ON:
|
||||||
|
info.index = tab._tPos;
|
||||||
|
info.action = this.kACTION_ATTACH;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case this.kDROP_BEFORE:
|
||||||
|
/*
|
||||||
|
[TARGET ] <EFBFBD>ªpart from parent, and move
|
||||||
|
|
||||||
|
[ ]
|
||||||
|
[TARGET ] <EFBFBD>ªattach to the parent of the previous visible, and move
|
||||||
|
|
||||||
|
[ ]
|
||||||
|
[TARGET ] <EFBFBD>ªattach to the parent of the target, and move
|
||||||
|
|
||||||
|
[ ]
|
||||||
|
[TARGET] <EFBFBD>ªattach to the parent of the targetm and move
|
||||||
|
*/
|
||||||
|
var prevTab = this.getPreviousVisibleTab(tab);
|
||||||
|
if (!prevTab) {
|
||||||
|
info.index = 0;
|
||||||
|
info.action = this.kACTION_MOVE | this.kACTION_PART;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
var prevNest = Number(prevTab.getAttribute(this.kNEST));
|
||||||
|
var targetNest = Number(tab.getAttribute(this.kNEST));
|
||||||
|
info.index = tab._tPos;
|
||||||
|
info.action = this.kACTION_MOVE | this.kACTION_ATTACH;
|
||||||
|
info.target = (prevNest < targetNest) ? this.getParentTab(prevTab) :
|
||||||
|
(prevNest > targetNest) ? prevTab :
|
||||||
|
this.getParentTab(tab);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case this.kDROP_AFTER:
|
||||||
|
/*
|
||||||
|
[TARGET ] <EFBFBD>«part from parent, and move
|
||||||
|
|
||||||
|
[TARGET] <EFBFBD>«attach to the parent of the target, and move
|
||||||
|
[ ]
|
||||||
|
|
||||||
|
[TARGET ] <EFBFBD>«attach to the parent of the target, and move
|
||||||
|
[ ]
|
||||||
|
|
||||||
|
[TARGET ] <EFBFBD>«attach to the target, and move
|
||||||
|
[ ]
|
||||||
|
*/
|
||||||
|
var nextTab = this.getNextVisibleTab(tab);
|
||||||
|
if (!nextTab) {
|
||||||
|
info.index = tabs.length-1;
|
||||||
|
info.action = this.kACTION_MOVE | this.kACTION_PART;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
var targetNest = Number(tab.getAttribute(this.kNEST));
|
||||||
|
var nextNest = Number(nextTab.getAttribute(this.kNEST));
|
||||||
|
info.index = tab._tPos + 1;
|
||||||
|
info.action = this.kACTION_MOVE | this.kACTION_ATTACH;
|
||||||
|
info.target = (targetNest < nextNest) ? tab :
|
||||||
|
this.getParentTab(tab);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return info;
|
||||||
|
},
|
||||||
|
|
||||||
/* Commands */
|
/* Commands */
|
||||||
|
|
||||||
adoptTabTo : function(aChild, aParent, aInfo)
|
/* attach/part */
|
||||||
|
|
||||||
|
attachTabTo : function(aChild, aParent, aInfo)
|
||||||
{
|
{
|
||||||
if (!aChild || !aParent) return;
|
if (!aChild || !aParent) return;
|
||||||
if (!aInfo) aInfo = {};
|
if (!aInfo) aInfo = {};
|
||||||
@ -1032,7 +1225,7 @@ var TreeStyleTabService = {
|
|||||||
var id = aChild.getAttribute(this.kID);
|
var id = aChild.getAttribute(this.kID);
|
||||||
var b = this.getTabBrowserFromChildren(aParent);
|
var b = this.getTabBrowserFromChildren(aParent);
|
||||||
|
|
||||||
this.repudiateTab(aChild, true);
|
this.partTab(aChild, true);
|
||||||
|
|
||||||
var children = aParent.getAttribute(this.kCHILDREN);
|
var children = aParent.getAttribute(this.kCHILDREN);
|
||||||
var newIndex;
|
var newIndex;
|
||||||
@ -1050,7 +1243,7 @@ var TreeStyleTabService = {
|
|||||||
else {
|
else {
|
||||||
children = ((children || '')+'|'+id).replace(/^\|/, '');
|
children = ((children || '')+'|'+id).replace(/^\|/, '');
|
||||||
var refTab = aParent;
|
var refTab = aParent;
|
||||||
var descendant = TreeStyleTabService.getDescendantTabsOf(aParent);
|
var descendant = this.getDescendantTabs(aParent);
|
||||||
if (descendant.length) refTab = descendant[descendant.length-1];
|
if (descendant.length) refTab = descendant[descendant.length-1];
|
||||||
newIndex = refTab._tPos+1;
|
newIndex = refTab._tPos+1;
|
||||||
}
|
}
|
||||||
@ -1078,7 +1271,7 @@ var TreeStyleTabService = {
|
|||||||
do {
|
do {
|
||||||
this.collapseExpandTabSubTree(p, false);
|
this.collapseExpandTabSubTree(p, false);
|
||||||
}
|
}
|
||||||
while (p = this.getParentTabOf(p));
|
while (p = this.getParentTab(p));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
this.collapseExpandTab(aChild, true);
|
this.collapseExpandTab(aChild, true);
|
||||||
@ -1095,11 +1288,11 @@ var TreeStyleTabService = {
|
|||||||
if (!aInfo.dontUpdateIndent) this.updateTabsIndent([aChild]);
|
if (!aInfo.dontUpdateIndent) this.updateTabsIndent([aChild]);
|
||||||
},
|
},
|
||||||
|
|
||||||
repudiateTab : function(aChild, aDontUpdateIndent)
|
partTab : function(aChild, aDontUpdateIndent)
|
||||||
{
|
{
|
||||||
if (!aChild) return;
|
if (!aChild) return;
|
||||||
|
|
||||||
var parentTab = this.getParentTabOf(aChild);
|
var parentTab = this.getParentTab(aChild);
|
||||||
if (!parentTab) return;
|
if (!parentTab) return;
|
||||||
|
|
||||||
var id = aChild.getAttribute(this.kID);
|
var id = aChild.getAttribute(this.kID);
|
||||||
@ -1117,12 +1310,12 @@ var TreeStyleTabService = {
|
|||||||
if (!aTabs || !aTabs.length) return;
|
if (!aTabs || !aTabs.length) return;
|
||||||
|
|
||||||
if (aLevel === void(0)) {
|
if (aLevel === void(0)) {
|
||||||
var parentTab = this.getParentTabOf(aTabs[0]);
|
var parentTab = this.getParentTab(aTabs[0]);
|
||||||
var aLevel = 0;
|
var aLevel = 0;
|
||||||
while (parentTab)
|
while (parentTab)
|
||||||
{
|
{
|
||||||
aLevel++;
|
aLevel++;
|
||||||
parentTab = this.getParentTabOf(parentTab);
|
parentTab = this.getParentTab(parentTab);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1133,21 +1326,24 @@ var TreeStyleTabService = {
|
|||||||
for (var i = 0, maxi = aTabs.length; i < maxi; i++)
|
for (var i = 0, maxi = aTabs.length; i < maxi; i++)
|
||||||
{
|
{
|
||||||
aTabs[i].setAttribute('style', aTabs[i].getAttribute('style')+';'+aProp+':'+indent+' !important;');
|
aTabs[i].setAttribute('style', aTabs[i].getAttribute('style')+';'+aProp+':'+indent+' !important;');
|
||||||
this.updateTabsIndent(this.getChildTabsOf(aTabs[i]), aLevel+1, aProp);
|
aTabs[i].setAttribute(this.kNEST, aLevel);
|
||||||
|
this.updateTabsIndent(this.getChildTabs(aTabs[i]), aLevel+1, aProp);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
updateTabsCount : function(aTab)
|
updateTabsCount : function(aTab)
|
||||||
{
|
{
|
||||||
var count = document.getAnonymousElementByAttribute(aTab, 'class', this.kCOUNTER);
|
var count = document.getAnonymousElementByAttribute(aTab, 'class', this.kCOUNTER);
|
||||||
if (count) {
|
if (count) {
|
||||||
count.setAttribute('value', '('+this.getDescendantTabsOf(aTab).length+')');
|
count.setAttribute('value', '('+this.getDescendantTabs(aTab).length+')');
|
||||||
}
|
}
|
||||||
var parent = this.getParentTabOf(aTab);
|
var parent = this.getParentTab(aTab);
|
||||||
if (parent)
|
if (parent)
|
||||||
this.updateTabsCount(parent);
|
this.updateTabsCount(parent);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/* move */
|
||||||
|
|
||||||
moveTabSubTreeTo : function(aTab, aIndex)
|
moveTabSubTreeTo : function(aTab, aIndex)
|
||||||
{
|
{
|
||||||
if (!aTab) return;
|
if (!aTab) return;
|
||||||
@ -1158,7 +1354,7 @@ var TreeStyleTabService = {
|
|||||||
b.moveTabTo(aTab, aIndex);
|
b.moveTabTo(aTab, aIndex);
|
||||||
|
|
||||||
b.__treestyletab__isSubTreeChildrenMoving = true;
|
b.__treestyletab__isSubTreeChildrenMoving = true;
|
||||||
var tabs = this.getDescendantTabsOf(aTab);
|
var tabs = this.getDescendantTabs(aTab);
|
||||||
for (var i = 0, maxi = tabs.length; i < maxi; i++)
|
for (var i = 0, maxi = tabs.length; i < maxi; i++)
|
||||||
{
|
{
|
||||||
b.moveTabTo(tabs[i], aTab._tPos+i+(aTab._tPos < tabs[i]._tPos ? 1 : 0 ));
|
b.moveTabTo(tabs[i], aTab._tPos+i+(aTab._tPos < tabs[i]._tPos ? 1 : 0 ));
|
||||||
@ -1168,6 +1364,123 @@ var TreeStyleTabService = {
|
|||||||
b.__treestyletab__isSubTreeMoving = false;
|
b.__treestyletab__isSubTreeMoving = false;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
moveTabLevel : function(aEvent)
|
||||||
|
{
|
||||||
|
var b = this.getTabBrowserFromChildren(aEvent.target);
|
||||||
|
var parentTab = this.getParentTab(b.mCurrentTab);
|
||||||
|
if (aEvent.keyCode == KeyEvent.DOM_VK_RIGHT) {
|
||||||
|
var prevTab = this.getPreviousSiblingTab(b.mCurrentTab);
|
||||||
|
if ((!parentTab && prevTab) ||
|
||||||
|
(parentTab && b.mCurrentTab != this.getFirstChildTab(parentTab))) {
|
||||||
|
this.attachTabTo(b.mCurrentTab, prevTab);
|
||||||
|
b.mCurrentTab.focus();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (aEvent.keyCode == KeyEvent.DOM_VK_LEFT && parentTab) {
|
||||||
|
var grandParent = this.getParentTab(parentTab);
|
||||||
|
if (grandParent) {
|
||||||
|
this.attachTabTo(b.mCurrentTab, grandParent, { insertBefore : this.getNextSiblingTab(parentTab) });
|
||||||
|
b.mCurrentTab.focus();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
var nextTab = this.getNextSiblingTab(parentTab);
|
||||||
|
this.partTab(b.mCurrentTab);
|
||||||
|
if (nextTab) {
|
||||||
|
b.moveTabTo(b.mCurrentTab, nextTab._tPos - 1);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
b.moveTabTo(b.mCurrentTab, b.mTabContainer.lastChild._tPos);
|
||||||
|
}
|
||||||
|
b.mCurrentTab.focus();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
|
||||||
|
/* collapse/expand */
|
||||||
|
|
||||||
|
collapseExpandTabSubTree : function(aTab, aCollapse)
|
||||||
|
{
|
||||||
|
if (!aTab) return;
|
||||||
|
|
||||||
|
if (aTab.getAttribute(this.kSUBTREE_COLLAPSED) == String(aCollapse)) return;
|
||||||
|
|
||||||
|
this.setTabValue(aTab, this.kSUBTREE_COLLAPSED, aCollapse);
|
||||||
|
|
||||||
|
var tabs = this.getChildTabs(aTab);
|
||||||
|
for (var i = 0, maxi = tabs.length; i < maxi; i++)
|
||||||
|
{
|
||||||
|
this.collapseExpandTab(tabs[i], aCollapse);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
collapseExpandTab : function(aTab, aCollapse)
|
||||||
|
{
|
||||||
|
if (!aTab) return;
|
||||||
|
|
||||||
|
this.setTabValue(aTab, this.kCOLLAPSED, aCollapse);
|
||||||
|
|
||||||
|
var b = this.getTabBrowserFromChildren(aTab);
|
||||||
|
var p;
|
||||||
|
if (aCollapse && aTab == b.selectedTab && (p = this.getParentTab(aTab))) {
|
||||||
|
b.selectedTab = p;
|
||||||
|
}
|
||||||
|
|
||||||
|
var isSubTreeCollapsed = (aTab.getAttribute(this.kSUBTREE_COLLAPSED) == 'true');
|
||||||
|
var tabs = this.getChildTabs(aTab);
|
||||||
|
for (var i = 0, maxi = tabs.length; i < maxi; i++)
|
||||||
|
{
|
||||||
|
if (!isSubTreeCollapsed)
|
||||||
|
this.collapseExpandTab(tabs[i], aCollapse);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
collapseExpandTreesIntelligentlyFor : function(aTab)
|
||||||
|
{
|
||||||
|
var b = this.getTabBrowserFromChildren(aTab);
|
||||||
|
var parent = this.getParentTab(aTab);
|
||||||
|
var expandedParentTabs = [
|
||||||
|
aTab.getAttribute(this.kID)
|
||||||
|
];
|
||||||
|
var parentTab = aTab;
|
||||||
|
while (parentTab = this.getParentTab(parentTab))
|
||||||
|
{
|
||||||
|
expandedParentTabs.push(parentTab.getAttribute(this.kID));
|
||||||
|
}
|
||||||
|
expandedParentTabs = expandedParentTabs.join('|');
|
||||||
|
|
||||||
|
var xpathResult = this.evaluateXPath(
|
||||||
|
'child::xul:tab[@'+this.kCHILDREN+' and not(@'+this.kCOLLAPSED+'="true") and not(@'+this.kSUBTREE_COLLAPSED+'="true") and not(contains("'+expandedParentTabs+'", @'+this.kID+'))]',
|
||||||
|
b.mTabContainer
|
||||||
|
);
|
||||||
|
var collapseTab;
|
||||||
|
var dontCollapse;
|
||||||
|
for (var i = 0, maxi = xpathResult.snapshotLength; i < maxi; i++)
|
||||||
|
{
|
||||||
|
dontCollapse = false;
|
||||||
|
collapseTab = xpathResult.snapshotItem(i);
|
||||||
|
|
||||||
|
parentTab = this.getParentTab(collapseTab);
|
||||||
|
if (parentTab) {
|
||||||
|
dontCollapse = true;
|
||||||
|
do {
|
||||||
|
if (parentTab != parent) continue;
|
||||||
|
dontCollapse = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
while (parentTab = this.getParentTab(parentTab));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!dontCollapse)
|
||||||
|
this.collapseExpandTabSubTree(collapseTab, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.collapseExpandTabSubTree(aTab, false);
|
||||||
|
},
|
||||||
|
|
||||||
removeTabSubTree : function(aTabOrTabs)
|
removeTabSubTree : function(aTabOrTabs)
|
||||||
{
|
{
|
||||||
var tabs = aTabOrTabs;
|
var tabs = aTabOrTabs;
|
||||||
@ -1178,7 +1491,7 @@ var TreeStyleTabService = {
|
|||||||
var descendant = [];
|
var descendant = [];
|
||||||
for (var i = 0, maxi = tabs.length; i < maxi; i++)
|
for (var i = 0, maxi = tabs.length; i < maxi; i++)
|
||||||
{
|
{
|
||||||
descendant = descendant.concat(this.getDescendantTabsOf(tabs[i]));
|
descendant = descendant.concat(this.getDescendantTabs(tabs[i]));
|
||||||
}
|
}
|
||||||
tabs = this.cleanUpTabsArray(tabs.concat(descendant));
|
tabs = this.cleanUpTabsArray(tabs.concat(descendant));
|
||||||
|
|
||||||
@ -1197,86 +1510,7 @@ var TreeStyleTabService = {
|
|||||||
b.removeTab(tabs[i]);
|
b.removeTab(tabs[i]);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
collapseExpandTabSubTree : function(aTab, aCollapse)
|
|
||||||
{
|
|
||||||
if (!aTab) return;
|
|
||||||
|
|
||||||
if (aTab.getAttribute(this.kSUBTREE_COLLAPSED) == String(aCollapse)) return;
|
|
||||||
|
|
||||||
this.setTabValue(aTab, this.kSUBTREE_COLLAPSED, aCollapse);
|
|
||||||
|
|
||||||
var tabs = this.getChildTabsOf(aTab);
|
|
||||||
for (var i = 0, maxi = tabs.length; i < maxi; i++)
|
|
||||||
{
|
|
||||||
this.collapseExpandTab(tabs[i], aCollapse);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
collapseExpandTab : function(aTab, aCollapse)
|
|
||||||
{
|
|
||||||
if (!aTab) return;
|
|
||||||
|
|
||||||
this.setTabValue(aTab, this.kCOLLAPSED, aCollapse);
|
|
||||||
|
|
||||||
var b = this.getTabBrowserFromChildren(aTab);
|
|
||||||
var p;
|
|
||||||
if (aCollapse && aTab == b.selectedTab && (p = this.getParentTabOf(aTab))) {
|
|
||||||
b.selectedTab = p;
|
|
||||||
}
|
|
||||||
|
|
||||||
var isSubTreeCollapsed = (aTab.getAttribute(this.kSUBTREE_COLLAPSED) == 'true');
|
|
||||||
var tabs = this.getChildTabsOf(aTab);
|
|
||||||
for (var i = 0, maxi = tabs.length; i < maxi; i++)
|
|
||||||
{
|
|
||||||
if (!isSubTreeCollapsed)
|
|
||||||
this.collapseExpandTab(tabs[i], aCollapse);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
collapseExpandTreesIntelligentlyFor : function(aTab)
|
|
||||||
{
|
|
||||||
var b = this.getTabBrowserFromChildren(aTab);
|
|
||||||
var parent = this.getParentTabOf(aTab);
|
|
||||||
var expandedParentTabs = [
|
|
||||||
aTab.getAttribute(this.kID)
|
|
||||||
];
|
|
||||||
var parentTab = aTab;
|
|
||||||
while (parentTab = this.getParentTabOf(parentTab))
|
|
||||||
{
|
|
||||||
expandedParentTabs.push(parentTab.getAttribute(this.kID));
|
|
||||||
}
|
|
||||||
expandedParentTabs = expandedParentTabs.join('|');
|
|
||||||
|
|
||||||
var xpathResult = this.evaluateXPath(
|
|
||||||
'child::xul:tab[@'+this.kCHILDREN+' and not(@'+this.kCOLLAPSED+'="true") and not(@'+this.kSUBTREE_COLLAPSED+'="true") and not(contains("'+expandedParentTabs+'", @'+this.kID+'))]',
|
|
||||||
b.mTabContainer
|
|
||||||
);
|
|
||||||
var collapseTab;
|
|
||||||
var dontCollapse;
|
|
||||||
for (var i = 0, maxi = xpathResult.snapshotLength; i < maxi; i++)
|
|
||||||
{
|
|
||||||
dontCollapse = false;
|
|
||||||
collapseTab = xpathResult.snapshotItem(i);
|
|
||||||
|
|
||||||
parentTab = this.getParentTabOf(collapseTab);
|
|
||||||
if (parentTab) {
|
|
||||||
dontCollapse = true;
|
|
||||||
do {
|
|
||||||
if (parentTab != parent) continue;
|
|
||||||
dontCollapse = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
while (parentTab = this.getParentTabOf(parentTab));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!dontCollapse)
|
|
||||||
this.collapseExpandTabSubTree(collapseTab, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.collapseExpandTabSubTree(aTab, false);
|
|
||||||
},
|
|
||||||
|
|
||||||
/* Pref Listener */
|
/* Pref Listener */
|
||||||
|
|
||||||
domain : 'extensions.treestyletab',
|
domain : 'extensions.treestyletab',
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
pref("extensions.treestyletab.autoCollapseExpandSubTreeOnSelect", true);
|
pref("extensions.treestyletab.autoCollapseExpandSubTreeOnSelect", true);
|
||||||
pref("extensions.treestyletab.collapseExpandSubTree.dblclick", false);
|
pref("extensions.treestyletab.collapseExpandSubTree.dblclick", false);
|
||||||
pref("extensions.treestyletab.autoExpandSubTreeOnAppendChild", true);
|
pref("extensions.treestyletab.autoExpandSubTreeOnAppendChild", true);
|
||||||
pref("extensions.treestyletab.adoptChildrenToGrandParentOnRemoveTab", true);
|
pref("extensions.treestyletab.attachChildrenToGrandParentOnRemoveTab", true);
|
||||||
// 0 = default, 1 = only visible tabs
|
// 0 = default, 1 = only visible tabs
|
||||||
pref("extensions.treestyletab.focusMode", 1);
|
pref("extensions.treestyletab.focusMode", 1);
|
||||||
|
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
<!ENTITY config.autoExpandSubTreeOnAppendChild "Expand subtree automatically, when tabs are inserted into the subtree">
|
<!ENTITY config.autoExpandSubTreeOnAppendChild "Expand subtree automatically, when tabs are inserted into the subtree">
|
||||||
|
|
||||||
<!ENTITY config.adoptChildrenToGrandParentOnRemoveTab "Liberate child tabs from the tree when the parent tab is closed">
|
<!ENTITY config.attachChildrenToGrandParentOnRemoveTab "Liberate child tabs from the tree when the parent tab is closed">
|
||||||
|
|
||||||
<!ENTITY config.focusMode "Focus to the next/previous tab even if it is invisible, by Control(Command)-Tab">
|
<!ENTITY config.focusMode "Focus to the next/previous tab even if it is invisible, by Control(Command)-Tab">
|
||||||
|
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
<!ENTITY config.autoExpandSubTreeOnAppendChild "折り畳まれたサブツリー内に子孫のタブが追加された時、サブツリーを自動的に展開する">
|
<!ENTITY config.autoExpandSubTreeOnAppendChild "折り畳まれたサブツリー内に子孫のタブが追加された時、サブツリーを自動的に展開する">
|
||||||
|
|
||||||
<!ENTITY config.adoptChildrenToGrandParentOnRemoveTab "親のタブを閉じたら子孫のタブをツリーから解放する">
|
<!ENTITY config.attachChildrenToGrandParentOnRemoveTab "親のタブを閉じたら子孫のタブをツリーから解放する">
|
||||||
|
|
||||||
<!ENTITY config.focusMode "Control(Command)-Tabでタブを切り替える時、折りたたまれたタブにもフォーカスする">
|
<!ENTITY config.focusMode "Control(Command)-Tabでタブを切り替える時、折りたたまれたタブにもフォーカスする">
|
||||||
|
|
||||||
|
@ -30,3 +30,17 @@ tab[treestyletab-subtree-collapsed="true"] .treestyletab-tab-tree-twisty {
|
|||||||
padding: 0;
|
padding: 0;
|
||||||
min-width: 0;
|
min-width: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
tab[treestyletab-drop-position="self"] {
|
||||||
|
border: 2px solid black !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
tab[treestyletab-drop-position="before"] {
|
||||||
|
border-top: 2px solid black !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
tab[treestyletab-drop-position="after"] {
|
||||||
|
border-bottom: 2px solid black !important;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user