2007-11-14 14:34:36 -05:00
function TreeStyleTabBrowser ( aTabBrowser )
{
this . mTabBrowser = aTabBrowser ;
}
TreeStyleTabBrowser . prototype = {
2007-11-17 01:05:23 -05:00
2009-07-06 05:21:06 -04:00
kMENUITEM _RELOADSUBTREE : 'context-item-reloadTabSubTree' ,
kMENUITEM _RELOADCHILDREN : 'context-item-reloadDescendantTabs' ,
2007-11-17 01:05:23 -05:00
kMENUITEM _REMOVESUBTREE : 'context-item-removeTabSubTree' ,
2007-11-26 10:07:10 -05:00
kMENUITEM _REMOVECHILDREN : 'context-item-removeDescendantTabs' ,
2007-11-17 01:05:23 -05:00
kMENUITEM _COLLAPSEEXPAND _SEPARATOR : 'context-separator-collapseExpandAll' ,
kMENUITEM _COLLAPSE : 'context-item-collapseAllSubtree' ,
kMENUITEM _EXPAND : 'context-item-expandAllSubtree' ,
kMENUITEM _AUTOHIDE _SEPARATOR : 'context-separator-toggleAutoHide' ,
kMENUITEM _AUTOHIDE : 'context-item-toggleAutoHide' ,
2008-02-22 12:55:35 -05:00
kMENUITEM _FIXED : 'context-item-toggleFixed' ,
2008-10-14 13:48:19 -04:00
kMENUITEM _BOOKMARKSUBTREE : 'context-item-bookmarkTabSubTree' ,
2008-12-01 03:30:36 -05:00
2007-11-14 14:34:36 -05:00
mTabBrowser : null ,
tabbarResizing : false ,
2009-04-07 13:14:09 -04:00
indent : - 1 ,
indentProp : 'margin-left' ,
collapseProp : 'margin-top' ,
2007-11-14 14:34:36 -05:00
positionProp : 'screenY' ,
sizeProp : 'height' ,
invertedPositionProp : 'screenX' ,
invertedSizeProp : 'width' ,
2009-04-06 13:47:57 -04:00
2009-04-07 13:14:09 -04:00
kVERTICAL _MARGIN _RULES _PATTERN : /margin-(top|bottom):[^;]+;?/g ,
kHORIZONTAL _MARGIN _RULES _PATTERN : /margin-(left|right):[^;]+;?/g ,
get indentRulesRegExp ( )
{
return this . isVertical ?
this . kHORIZONTAL _MARGIN _RULES _PATTERN :
this . kVERTICAL _MARGIN _RULES _PATTERN ;
} ,
get collapseRulesRegExp ( )
{
return this . isVertical ?
this . kVERTICAL _MARGIN _RULES _PATTERN :
this . kHORIZONTAL _MARGIN _RULES _PATTERN ;
} ,
2007-11-14 14:34:36 -05:00
2007-11-17 07:59:48 -05:00
get browser ( )
{
return this . mTabBrowser ;
} ,
2007-11-14 14:34:36 -05:00
get container ( )
{
2009-09-02 22:05:25 -04:00
if ( ! this . _container ) {
this . _container = document . getElementById ( 'appcontent' ) ;
}
return this . _container ;
2007-11-14 14:34:36 -05:00
} ,
2009-09-02 22:05:25 -04:00
_container : null ,
2007-11-14 14:34:36 -05:00
2008-06-20 01:57:38 -04:00
get scrollBox ( )
{
2009-09-02 22:05:25 -04:00
if ( ! this . _scrollBox ) {
this . _scrollBox = document . getAnonymousElementByAttribute ( this . mTabBrowser . mTabContainer , 'class' , 'tabs-frame' ) || // Tab Mix Plus
2009-03-16 07:58:43 -04:00
this . mTabBrowser . mTabContainer . mTabstrip ;
2009-09-02 22:05:25 -04:00
}
return this . _scrollBox ;
2008-06-20 01:57:38 -04:00
} ,
2009-09-02 22:05:25 -04:00
_scrollBox : null ,
2008-10-17 13:16:16 -04:00
get scrollBoxObject ( )
2008-06-20 01:57:38 -04:00
{
2009-07-07 00:22:08 -04:00
return ( this . scrollBox . scrollBoxObject || this . scrollBox . boxObject )
. QueryInterface ( Components . interfaces . nsIScrollBoxObject ) ; // Tab Mix Plus
2008-06-20 01:57:38 -04:00
} ,
2007-11-14 14:34:36 -05:00
/* utils */
2008-03-09 23:51:21 -04:00
2008-02-22 02:44:06 -05:00
/* get tab contents */
2008-12-01 03:30:36 -05:00
2007-11-17 00:20:26 -05:00
getTabLabel : function ( aTab )
{
2008-05-29 04:59:41 -04:00
var label = document . getAnonymousElementByAttribute ( aTab , 'class' , 'tab-text-stack' ) || // Mac OS X
document . getAnonymousElementByAttribute ( aTab , 'class' , 'tab-text-container' ) || // Tab Mix Plus
2007-11-17 00:20:26 -05:00
document . getAnonymousElementByAttribute ( aTab , 'class' , 'tab-text' ) ;
return label ;
} ,
getTabClosebox : function ( aTab )
{
2009-04-28 00:55:59 -04:00
var close = document . getAnonymousElementByAttribute ( aTab , 'class' , 'tab-close-button always-right' ) || // Tab Mix Plus
2007-11-17 00:20:26 -05:00
document . getAnonymousElementByAttribute ( aTab , 'class' , 'tab-close-button' ) ;
return close ;
} ,
/* status */
2008-02-22 02:44:06 -05:00
2007-11-14 14:43:54 -05:00
get isVertical ( )
2007-11-14 14:34:36 -05:00
{
var b = this . mTabBrowser ;
if ( ! b ) return false ;
2008-06-20 01:57:38 -04:00
var box = this . scrollBox || b . mTabContainer ;
2007-11-14 14:34:36 -05:00
return ( box . getAttribute ( 'orient' ) || window . getComputedStyle ( box , '' ) . getPropertyValue ( '-moz-box-orient' ) ) == 'vertical' ;
} ,
isTabInViewport : function ( aTab )
{
if ( ! aTab ) return false ;
var tabBox = aTab . boxObject ;
2008-06-20 01:57:38 -04:00
var barBox = this . scrollBox . boxObject ;
2009-04-08 11:16:34 -04:00
var xOffset = this . getXOffsetOfTab ( aTab ) ;
var yOffset = this . getYOffsetOfTab ( aTab ) ;
return ( tabBox . screenX + xOffset >= barBox . screenX &&
tabBox . screenX + xOffset + tabBox . width <= barBox . screenX + barBox . width &&
tabBox . screenY + yOffset >= barBox . screenY &&
tabBox . screenY + yOffset + tabBox . height <= barBox . screenY + barBox . height ) ;
2007-11-14 14:34:36 -05:00
} ,
2008-02-22 02:44:06 -05:00
isMultiRow : function ( )
{
return false ;
} ,
2008-02-22 12:55:35 -05:00
2007-11-17 00:20:26 -05:00
/* initialize */
2008-12-01 03:30:36 -05:00
2007-11-17 00:20:26 -05:00
init : function ( )
2007-11-14 14:34:36 -05:00
{
2007-11-17 00:20:26 -05:00
var b = this . mTabBrowser ;
2007-11-14 14:34:36 -05:00
2007-11-17 00:20:26 -05:00
this . initTabbar ( ) ;
2007-11-14 14:34:36 -05:00
2007-11-17 00:20:26 -05:00
b . addEventListener ( 'TabOpen' , this , true ) ;
b . addEventListener ( 'TabClose' , this , true ) ;
b . addEventListener ( 'TabMove' , this , true ) ;
b . addEventListener ( 'SSTabRestoring' , this , true ) ;
2009-08-25 03:20:56 -04:00
b . mStrip . addEventListener ( 'draggesture' , this , false ) ;
2007-11-17 12:21:33 -05:00
b . mStrip . addEventListener ( 'dragenter' , this , false ) ;
b . mStrip . addEventListener ( 'dragexit' , this , false ) ;
2009-08-25 03:20:56 -04:00
b . mStrip . addEventListener ( 'dragend' , this , false ) ;
2007-11-17 12:21:33 -05:00
b . mStrip . addEventListener ( 'dragover' , this , false ) ;
2007-11-17 12:52:51 -05:00
b . mStrip . addEventListener ( 'dragdrop' , this , false ) ;
2007-11-30 14:22:34 -05:00
b . mTabContainer . addEventListener ( 'mouseover' , this , true ) ;
b . mTabContainer . addEventListener ( 'mouseout' , this , true ) ;
2007-11-17 00:20:26 -05:00
b . mTabContainer . addEventListener ( 'click' , this , true ) ;
b . mTabContainer . addEventListener ( 'dblclick' , this , true ) ;
b . mTabContainer . addEventListener ( 'mousedown' , this , true ) ;
b . mTabContainer . addEventListener ( 'select' , this , true ) ;
2008-06-18 20:15:57 -04:00
b . mTabContainer . addEventListener ( 'scroll' , this , true ) ;
2009-08-25 04:35:05 -04:00
b . mPanelContainer . addEventListener ( 'dragexit' , this , false ) ;
b . mPanelContainer . addEventListener ( 'dragover' , this , false ) ;
b . mPanelContainer . addEventListener ( 'dragdrop' , this , false ) ;
2007-11-14 14:34:36 -05:00
2009-03-04 15:42:41 -05:00
2007-11-29 11:49:18 -05:00
/ * C l o s i n g c o l l a p s e d l a s t t r e e b r e a k s s e l e c t e d t a b .
To solve this problem , I override the setter to
force to set a tab and forbid it becomes null . * /
2009-05-13 02:09:17 -04:00
let ( getter , setter ) {
getter = b . _ _lookupGetter _ _ ( 'selectedTab' ) ;
setter = b . _ _lookupSetter _ _ ( 'selectedTab' ) ;
eval ( 'setter = ' + setter . toSource ( ) . replace (
'{' ,
< ! [ CDATA [ $ &
if ( ! val ) {
val = TreeStyleTabService . getLastTab ( this ) ;
}
] ] > . toString ( )
) ) ;
/ * W e h a v e t o u s e b o t h _ _ d e f i n e S e t t e r _ _ a n d _ _ d e f i n e G e t t e r _ _
just in same time ! ! If we update only setter ,
getter will be vanished . * /
b . _ _defineGetter _ _ ( 'selectedTab' , getter ) ;
b . _ _defineSetter _ _ ( 'selectedTab' , setter ) ;
getter = null ;
setter = null ;
}
2007-11-29 11:49:18 -05:00
2009-07-24 04:11:05 -04:00
eval ( 'b.mTabContainer._selectNewTab = ' +
2009-07-24 04:41:33 -04:00
b . mTabContainer . _selectNewTab . toSource ( ) . replace (
2007-11-17 00:20:26 -05:00
'{' ,
2009-03-26 11:30:00 -04:00
< ! [ CDATA [ $ &
2008-03-03 04:07:02 -05:00
if ( arguments [ 0 ] . _ _treestyletab _ _preventSelect ) {
arguments [ 0 ] . _ _treestyletab _ _preventSelect = false ;
return ;
}
2009-03-26 11:30:00 -04:00
] ] >
2007-11-17 00:20:26 -05:00
)
) ;
2007-11-14 14:34:36 -05:00
2008-03-03 04:07:02 -05:00
eval ( 'b.mTabContainer.adjustTabstrip = ' +
b . mTabContainer . adjustTabstrip . toSource ( ) . replace (
2009-05-12 11:09:49 -04:00
/(\}\)?)$/ ,
2009-03-26 11:30:00 -04:00
< ! [ CDATA [
2008-03-03 04:21:33 -05:00
var b = TreeStyleTabService . getTabBrowserFromChild ( this ) ;
b . treeStyleTab . updateInvertedTabContentsOrder ( true ) ;
2009-05-12 11:09:49 -04:00
$1 ] ] >
2008-03-03 04:07:02 -05:00
)
) ;
2007-11-17 00:20:26 -05:00
eval ( 'b.mTabContainer.advanceSelectedTab = ' +
b . mTabContainer . advanceSelectedTab . toSource ( ) . replace (
'{' ,
2009-03-26 11:30:00 -04:00
< ! [ CDATA [ $ &
2009-08-14 02:12:08 -04:00
var treeStyleTab = TreeStyleTabService . getTabBrowserFromChild ( this ) . treeStyleTab ;
treeStyleTab . _focusChangedByShortcut = TreeStyleTabService . accelKeyPressed ;
if ( treeStyleTab . getTreePref ( 'focusMode' ) == treeStyleTab . kFOCUS _VISIBLE ) {
2008-03-03 04:07:02 -05:00
( function ( aDir , aWrap , aSelf ) {
var nextTab = ( aDir < 0 ) ? treeStyleTab . getPreviousVisibleTab ( aSelf . selectedItem ) : treeStyleTab . getNextVisibleTab ( aSelf . selectedItem ) ;
if ( ! nextTab && aWrap ) {
2009-01-26 01:13:37 -05:00
nextTab = TreeStyleTabService . evaluateXPath (
'child::xul:tab[not(@' + TreeStyleTabService . kCOLLAPSED + '="true")][' +
( aDir < 0 ? 'last()' : '1' ) +
']' ,
2009-03-24 13:44:30 -04:00
aSelf ,
2009-02-22 12:33:32 -05:00
XPathResult . FIRST _ORDERED _NODE _TYPE
2009-01-26 01:13:37 -05:00
) . singleNodeValue ;
2008-03-03 04:07:02 -05:00
}
if ( nextTab && nextTab != aSelf . selectedItem ) {
2009-07-24 04:42:18 -04:00
aSelf . _selectNewTab ( nextTab , aDir , aWrap ) ;
2008-03-03 04:07:02 -05:00
}
} ) ( arguments [ 0 ] , arguments [ 1 ] , this ) ;
return ;
}
2009-03-26 11:30:00 -04:00
] ] >
2007-11-17 00:20:26 -05:00
)
) ;
2007-11-14 14:34:36 -05:00
2007-11-17 00:20:26 -05:00
eval ( 'b.mTabContainer._handleTabSelect = ' +
b . mTabContainer . _handleTabSelect . toSource ( ) . replace (
'{' ,
2009-03-26 11:30:00 -04:00
< ! [ CDATA [ $ &
2009-03-16 07:58:43 -04:00
if ( ( function ( aTabs ) {
var treeStyleTab = TreeStyleTabService . getTabBrowserFromChild ( aTabs ) . treeStyleTab ;
var tab = aTabs . selectedItem ;
if ( ! treeStyleTab . isTabInViewport ( tab ) ) {
treeStyleTab . scrollToTab ( tab ) ;
return true ;
}
return false ;
} ) ( this ) ) {
2008-03-03 04:07:02 -05:00
return ;
}
2009-03-26 11:30:00 -04:00
] ] >
2007-11-17 00:20:26 -05:00
)
) ;
2007-11-14 14:34:36 -05:00
2008-06-18 11:04:37 -04:00
/ *
if ( 'ensureElementIsVisible' in b . mTabContainer . mTabstrip &&
'_smoothScrollByPixels' in b . mTabContainer . mTabstrip ) {
eval ( 'b.mTabContainer.mTabstrip.ensureElementIsVisible = ' +
b . mTabContainer . mTabstrip . ensureElementIsVisible . toSource ( ) . replace (
'{' ,
2009-03-26 11:30:00 -04:00
< ! [ CDATA [ $ &
2008-06-18 11:04:37 -04:00
var browser = TreeStyleTabService . getTabBrowserFromChild ( this ) ;
var startProp = browser . treeStyleTab . isVertical ? 'top' : 'left' ;
var endProp = browser . treeStyleTab . isVertical ? 'bottom' : 'right' ;
2009-03-26 11:30:00 -04:00
] ] >
2008-06-18 11:04:37 -04:00
) . replace (
/\.left/g , '[startProp]'
) . replace (
/\.right/g , '[endProp]'
) . replace (
'|| this.getAttribute("orient") == "vertical"' , ''
)
) ;
eval ( 'b.mTabContainer.mTabstrip._smoothScrollByPixels = ' +
b . mTabContainer . mTabstrip . _smoothScrollByPixels . toSource ( ) . replace (
'{' ,
2009-03-26 11:30:00 -04:00
< ! [ CDATA [ $ &
2008-06-18 11:04:37 -04:00
var TST = TreeStyleTabService . getTabBrowserFromChild ( this ) ;
2009-03-26 11:30:00 -04:00
] ] >
2008-06-18 11:04:37 -04:00
) . replace (
'scrollBy(distance, 0)' ,
2009-03-26 11:30:00 -04:00
< ! [ CDATA [ scrollBy (
2008-06-18 11:04:37 -04:00
( TST . isVertical ? 0 : distance ) ,
( TST . isVertical ? distance : 0 )
2009-03-26 11:30:00 -04:00
) ] ] >
2008-06-18 11:04:37 -04:00
)
) ;
}
* /
2007-11-17 00:20:26 -05:00
eval ( 'b.mTabContainer._notifyBackgroundTab = ' +
b . mTabContainer . _notifyBackgroundTab . toSource ( ) . replace (
'{' ,
2007-11-17 08:32:41 -05:00
'{ var treeStyleTab = TreeStyleTabService.getTabBrowserFromChild(this).treeStyleTab;'
2007-11-17 00:20:26 -05:00
) . replace (
/\.screenX/g , '[treeStyleTab.positionProp]'
) . replace (
/\.width/g , '[treeStyleTab.sizeProp]'
)
) ;
2007-11-14 14:34:36 -05:00
2007-11-17 00:20:26 -05:00
this . updateTabDNDObserver ( b ) ;
2007-11-14 14:34:36 -05:00
2007-11-17 00:20:26 -05:00
eval ( 'b.getNewIndex = ' +
b . getNewIndex . toSource ( ) . replace (
/\.screenX/g , '[this.treeStyleTab.positionProp]'
) . replace (
/\.width/g , '[this.treeStyleTab.sizeProp]'
)
) ;
2007-11-14 14:34:36 -05:00
2007-11-17 00:20:26 -05:00
eval ( 'b.moveTabForward = ' +
b . moveTabForward . toSource ( ) . replace (
'{' , '{ var nextTab;'
) . replace (
'tabPos < this.browsers.length - 1' ,
'nextTab = this.treeStyleTab.getNextSiblingTab(this.mCurrentTab)'
) . replace (
'tabPos + 1' , 'nextTab._tPos'
) . replace (
'this.moveTabTo(' ,
2009-03-26 11:30:00 -04:00
< ! [ CDATA [
2007-11-17 00:20:26 -05:00
var descendant = this . treeStyleTab . getDescendantTabs ( nextTab ) ;
if ( descendant . length ) {
nextTab = descendant [ descendant . length - 1 ] ;
}
2009-03-26 11:30:00 -04:00
$ & ] ] >
2007-11-17 00:20:26 -05:00
) . replace (
'this.moveTabToStart();' ,
2009-03-26 11:30:00 -04:00
< ! [ CDATA [
2007-11-17 00:20:26 -05:00
this . treeStyleTab . internallyTabMoving = true ;
var parentTab = this . treeStyleTab . getParentTab ( this . mCurrentTab ) ;
if ( parentTab ) {
this . moveTabTo ( this . mCurrentTab , this . treeStyleTab . getFirstChildTab ( parentTab ) . _tPos ) ;
this . mCurrentTab . focus ( ) ;
}
else {
2008-03-03 04:07:02 -05:00
$ &
2007-11-17 00:20:26 -05:00
}
this . treeStyleTab . internallyTabMoving = false ;
2009-03-26 11:30:00 -04:00
] ] >
2007-11-17 00:20:26 -05:00
)
) ;
2007-11-14 14:34:36 -05:00
2007-11-17 00:20:26 -05:00
eval ( 'b.moveTabBackward = ' +
b . moveTabBackward . toSource ( ) . replace (
'{' , '{ var prevTab;'
) . replace (
'tabPos > 0' ,
'prevTab = this.treeStyleTab.getPreviousSiblingTab(this.mCurrentTab)'
) . replace (
'tabPos - 1' , 'prevTab._tPos'
) . replace (
'this.moveTabToEnd();' ,
2009-03-26 11:30:00 -04:00
< ! [ CDATA [
2007-11-17 00:20:26 -05:00
this . treeStyleTab . internallyTabMoving = true ;
var parentTab = this . treeStyleTab . getParentTab ( this . mCurrentTab ) ;
if ( parentTab ) {
this . moveTabTo ( this . mCurrentTab , this . treeStyleTab . getLastChildTab ( parentTab ) . _tPos ) ;
this . mCurrentTab . focus ( ) ;
}
else {
2008-03-03 04:07:02 -05:00
$ &
2007-11-17 00:20:26 -05:00
}
this . treeStyleTab . internallyTabMoving = false ;
2009-03-26 11:30:00 -04:00
] ] >
2007-11-17 00:20:26 -05:00
)
) ;
2007-11-14 14:34:36 -05:00
2007-11-17 00:20:26 -05:00
eval ( 'b._keyEventHandler.handleEvent = ' +
b . _keyEventHandler . handleEvent . toSource ( ) . replace (
'this.tabbrowser.moveTabOver(aEvent);' ,
2009-03-26 11:30:00 -04:00
< ! [ CDATA [
2007-11-17 00:20:26 -05:00
if ( ! this . tabbrowser . treeStyleTab . isVertical ||
! this . tabbrowser . treeStyleTab . moveTabLevel ( aEvent ) ) {
2008-03-03 04:07:02 -05:00
$ &
2007-11-17 00:20:26 -05:00
}
2009-03-26 11:30:00 -04:00
] ] >
2007-11-17 00:20:26 -05:00
) . replace (
'this.tabbrowser.moveTabForward();' ,
2009-03-26 11:30:00 -04:00
< ! [ CDATA [
2007-11-17 00:20:26 -05:00
if ( this . tabbrowser . treeStyleTab . isVertical ||
! this . tabbrowser . treeStyleTab . moveTabLevel ( aEvent ) ) {
2008-03-03 04:07:02 -05:00
$ &
2007-11-17 00:20:26 -05:00
}
2009-03-26 11:30:00 -04:00
] ] >
2007-11-17 00:20:26 -05:00
) . replace (
'this.tabbrowser.moveTabBackward();' ,
2009-03-26 11:30:00 -04:00
< ! [ CDATA [
2007-11-17 00:20:26 -05:00
if ( this . tabbrowser . treeStyleTab . isVertical ||
! this . tabbrowser . treeStyleTab . moveTabLevel ( aEvent ) ) {
2008-03-03 04:07:02 -05:00
$ &
2007-11-17 00:20:26 -05:00
}
2009-03-26 11:30:00 -04:00
] ] >
2007-11-17 00:20:26 -05:00
)
) ;
2007-11-14 14:34:36 -05:00
2007-11-17 00:20:26 -05:00
eval ( 'b.loadTabs = ' +
b . loadTabs . toSource ( ) . replace (
'var tabNum = ' ,
2009-03-26 11:30:00 -04:00
< ! [ CDATA [
2007-11-17 00:20:26 -05:00
if ( this . treeStyleTab . readyToAttachNewTabGroup )
TreeStyleTabService . readyToOpenChildTab ( firstTabAdded || this . selectedTab , true ) ;
2009-03-26 11:30:00 -04:00
$ & ] ] >
2007-11-17 00:20:26 -05:00
) . replace (
'if (!aLoadInBackground)' ,
2009-03-26 11:30:00 -04:00
< ! [ CDATA [
2007-11-17 00:20:26 -05:00
if ( TreeStyleTabService . checkToOpenChildTab ( this ) )
TreeStyleTabService . stopToOpenChildTab ( this ) ;
2009-03-26 11:30:00 -04:00
$ & ] ] >
2009-06-18 05:05:36 -04:00
) . replace (
'this.selectedTab = firstTabAdded;' ,
< ! [ CDATA [
this . selectedTab = aURIs [ 0 ] . indexOf ( 'about:treestyletab-group' ) < 0 ?
firstTabAdded :
TreeStyleTabService . getNextTab ( firstTabAdded ) ;
] ] >
2007-11-17 00:20:26 -05:00
)
) ;
2007-11-14 14:34:36 -05:00
2007-11-30 14:22:34 -05:00
eval ( 'b.createTooltip = ' +
b . createTooltip . toSource ( ) . replace (
2009-07-31 06:09:11 -04:00
'if ("mOverCloseButton" in tn && tn.mOverCloseButton) {' ,
2009-03-26 11:30:00 -04:00
< ! [ CDATA [
2009-07-31 06:09:11 -04:00
if ( TreeStyleTabService . getTabBrowserFromChild ( tn ) . treeStyleTab . handleTooltip ( event , tn ) ) {
2007-11-30 14:22:34 -05:00
return true ;
}
2009-07-31 06:09:11 -04:00
else $ & ] ] >
2007-11-30 14:22:34 -05:00
)
) ;
2008-02-22 13:06:22 -05:00
eval ( 'b.onTabBarDblClick = ' +
b . onTabBarDblClick . toSource ( ) . replace (
'aEvent.originalTarget.localName == "box"' ,
'/^(box|(arrow)?scrollbox|tabs)$/.test(aEvent.originalTarget.localName)'
)
) ;
2008-12-01 04:14:05 -05:00
if ( '_onDragEnd' in b ) {
eval ( 'b._onDragEnd = ' + b . _onDragEnd . toSource ( ) . replace (
2009-07-15 14:03:35 -04:00
/(this\._?replaceTabWithWindow\()/ ,
2009-07-15 14:00:33 -04:00
'if (this.treeStyleTab.isDraggingAllTabs(draggedTab)) return; $1'
2009-07-15 14:07:38 -04:00
) . replace (
'{' ,
'{ var treeStyleTab = this.treeStyleTab;'
2009-07-15 14:20:39 -04:00
) . replace (
/window\.screenX/g , 'gBrowser.boxObject.screenX'
) . replace (
/window\.outerWidth/g , 'gBrowser.boxObject.width'
2009-07-15 14:07:38 -04:00
) . replace (
/\.screenX/g , '[treeStyleTab.positionProp]'
) . replace (
/\.width/g , '[treeStyleTab.sizeProp]'
) . replace (
/\.screenY/g , '[treeStyleTab.invertedPositionProp]'
) . replace (
/\.height/g , '[treeStyleTab.invertedSizeProp]'
2008-12-01 04:14:05 -05:00
) ) ;
}
2008-12-01 21:51:41 -05:00
// https://bugzilla.mozilla.org/show_bug.cgi?id=406216
if ( '_beginRemoveTab' in b ) {
eval ( 'b._beginRemoveTab = ' + b . _beginRemoveTab . toSource ( ) . replace (
'for (let i = 0; i < l; ++i) {' ,
'l = this.mTabs.length; $&'
) ) ;
}
2009-05-13 02:09:17 -04:00
let ( tabs , i , maxi ) {
tabs = this . getTabs ( b ) ;
for ( i = 0 , maxi = tabs . snapshotLength ; i < maxi ; i ++ )
{
this . initTab ( tabs . snapshotItem ( i ) ) ;
}
}
2007-11-14 14:34:36 -05:00
2009-05-13 02:09:17 -04:00
this . onPrefChange ( 'extensions.treestyletab.tabbar.style' ) ;
this . onPrefChange ( 'extensions.treestyletab.twisty.style' ) ;
this . onPrefChange ( 'extensions.treestyletab.showBorderForFirstTab' ) ;
this . onPrefChange ( 'extensions.treestyletab.tabbar.invertTabContents' ) ;
this . onPrefChange ( 'extensions.treestyletab.tabbar.invertClosebox' ) ;
2009-07-08 06:40:51 -04:00
var tabContextMenu = document . getAnonymousElementByAttribute ( b , 'anonid' , 'tabContextMenu' ) ;
tabContextMenu . addEventListener ( 'popupshowing' , this , false ) ;
if ( ! ( 'MultipleTabService' in window ) ) {
window . setTimeout ( function ( aSelf , aTabBrowser , aPopup ) {
let suffix = '-tabbrowser-' + ( aTabBrowser . id || 'instance-' + parseInt ( Math . random ( ) * 65000 ) ) ;
[
aSelf . kMENUITEM _RELOADSUBTREE ,
aSelf . kMENUITEM _RELOADCHILDREN ,
aSelf . kMENUITEM _REMOVESUBTREE ,
aSelf . kMENUITEM _REMOVECHILDREN ,
aSelf . kMENUITEM _COLLAPSEEXPAND _SEPARATOR ,
aSelf . kMENUITEM _COLLAPSE ,
aSelf . kMENUITEM _EXPAND ,
aSelf . kMENUITEM _AUTOHIDE _SEPARATOR ,
aSelf . kMENUITEM _AUTOHIDE ,
aSelf . kMENUITEM _FIXED ,
aSelf . kMENUITEM _BOOKMARKSUBTREE
] . forEach ( function ( aID ) {
let item = document . getElementById ( aID ) . cloneNode ( true ) ;
item . setAttribute ( 'id' , item . getAttribute ( 'id' ) + suffix ) ;
let refNode = void ( 0 ) ;
let insertAfter = item . getAttribute ( 'multipletab-insertafter' ) ;
if ( insertAfter ) {
try {
eval ( 'refNode = (' + insertAfter + ').nextSibling' ) ;
2009-05-12 12:56:39 -04:00
}
2009-07-08 06:40:51 -04:00
catch ( e ) {
2009-05-12 12:56:39 -04:00
}
2009-07-08 06:40:51 -04:00
}
let insertBefore = item . getAttribute ( 'multipletab-insertbefore' ) ;
if ( refNode === void ( 0 ) && insertBefore ) {
try {
eval ( 'refNode = ' + insertBefore ) ;
}
catch ( e ) {
}
}
aPopup . insertBefore ( item , refNode || null ) ;
} ) ;
2009-07-06 05:21:06 -04:00
tabContextMenu = null ;
2009-07-08 06:40:51 -04:00
} , 0 , this , b , tabContextMenu ) ;
2009-05-12 12:56:39 -04:00
}
2007-11-17 00:20:26 -05:00
2009-05-13 02:09:17 -04:00
let ( allTabPopup ) {
allTabPopup = document . getAnonymousElementByAttribute ( b . mTabContainer , 'anonid' , 'alltabs-popup' ) ;
if ( allTabPopup )
allTabPopup . addEventListener ( 'popupshowing' , this , false ) ;
2008-11-14 03:10:33 -05:00
}
2007-11-17 00:20:26 -05:00
/ * T o m o v e u p c o n t e n t a r e a o n t h e t a b b a r , s w i t c h t a b .
If we don ' t do it , a gray space appears on the content area
by negative margin of it . * /
if ( b . getAttribute ( this . kTABBAR _POSITION ) == 'left' &&
b . getAttribute ( this . kSCROLLBAR _INVERTED ) == 'true' ) {
b . removeTab (
b . selectedTab = b . addTab ( 'about:blank' )
) ;
2007-11-14 14:34:36 -05:00
}
2007-11-17 00:20:26 -05:00
2009-04-07 13:14:09 -04:00
this . ObserverService . addObserver ( this , 'TreeStyleTab:indentModified' , false ) ;
2007-11-17 00:20:26 -05:00
this . ObserverService . addObserver ( this , 'TreeStyleTab:collapseExpandAllSubtree' , false ) ;
this . addPrefListener ( this ) ;
2009-05-13 02:09:17 -04:00
2009-09-03 02:24:06 -04:00
// TreeStyleTabBrowserAutoHide fails to initialize before the tab bar is completely initialized!!!
this . autoHide = new TreeStyleTabBrowserAutoHide ( this ) ;
2009-05-13 02:09:17 -04:00
b = null ;
2007-11-14 14:34:36 -05:00
} ,
2008-12-01 03:30:36 -05:00
2007-11-17 00:20:26 -05:00
initTab : function ( aTab )
2007-11-14 14:34:36 -05:00
{
2007-11-17 00:20:26 -05:00
if ( ! aTab . hasAttribute ( this . kID ) ) {
2008-11-09 23:48:11 -05:00
var id = this . getTabValue ( aTab , this . kID ) || this . makeNewId ( ) ;
this . setTabValue ( aTab , this . kID , id ) ;
2007-11-17 00:20:26 -05:00
}
aTab . _ _treestyletab _ _linkedTabBrowser = this . mTabBrowser ;
this . initTabAttributes ( aTab ) ;
this . initTabContents ( aTab ) ;
aTab . setAttribute ( this . kNEST , 0 ) ;
2007-11-14 14:34:36 -05:00
} ,
2009-03-31 14:25:49 -04:00
ensureTabInitialized : function ( aTab )
{
if ( ! aTab || aTab . getAttribute ( this . kID ) ) return ;
this . initTab ( aTab ) ;
} ,
2008-03-09 23:51:21 -04:00
2007-11-17 00:20:26 -05:00
initTabAttributes : function ( aTab )
2007-11-14 14:34:36 -05:00
{
2007-11-17 00:20:26 -05:00
var pos = this . mTabBrowser . getAttribute ( this . kTABBAR _POSITION ) ;
if ( pos == 'left' || pos == 'right' ) {
aTab . setAttribute ( 'align' , 'stretch' ) ;
aTab . removeAttribute ( 'maxwidth' ) ;
aTab . removeAttribute ( 'minwidth' ) ;
aTab . removeAttribute ( 'width' ) ;
aTab . removeAttribute ( 'flex' ) ;
aTab . maxWidth = 65000 ;
aTab . minWidth = 0 ;
aTab . setAttribute ( 'dir' , 'ltr' ) ; // Tab Mix Plus
}
else {
aTab . removeAttribute ( 'align' ) ;
aTab . setAttribute ( 'maxwidth' , 250 ) ;
aTab . setAttribute ( 'minwidth' , this . mTabBrowser . mTabContainer . mTabMinWidth ) ;
aTab . setAttribute ( 'width' , '0' ) ;
aTab . setAttribute ( 'flex' , 100 ) ;
aTab . maxWidth = 250 ;
aTab . minWidth = this . mTabBrowser . mTabContainer . mTabMinWidth ;
aTab . removeAttribute ( 'dir' ) ; // Tab Mix Plus
2007-11-14 14:34:36 -05:00
}
} ,
2007-11-17 00:20:26 -05:00
initTabContents : function ( aTab )
2007-11-14 14:34:36 -05:00
{
2007-11-17 00:20:26 -05:00
var icon = document . getAnonymousElementByAttribute ( aTab , 'class' , 'tab-icon' ) ;
var label = this . getTabLabel ( aTab ) ;
var close = this . getTabClosebox ( aTab ) ;
var counter = document . getAnonymousElementByAttribute ( aTab , 'class' , this . kCOUNTER _CONTAINER ) ;
2007-11-14 14:34:36 -05:00
2007-11-17 00:20:26 -05:00
if ( ! document . getAnonymousElementByAttribute ( aTab , 'class' , this . kTWISTY ) ) {
var twisty = document . createElement ( 'image' ) ;
twisty . setAttribute ( 'class' , this . kTWISTY ) ;
var container = document . createElement ( 'hbox' ) ;
container . setAttribute ( 'class' , this . kTWISTY _CONTAINER ) ;
container . appendChild ( twisty ) ;
2007-11-14 14:34:36 -05:00
2007-11-17 00:20:26 -05:00
icon . appendChild ( container ) ;
2007-11-14 14:34:36 -05:00
2007-11-17 00:20:26 -05:00
var marker = document . createElement ( 'image' ) ;
marker . setAttribute ( 'class' , this . kDROP _MARKER ) ;
container = document . createElement ( 'hbox' ) ;
container . setAttribute ( 'class' , this . kDROP _MARKER _CONTAINER ) ;
container . appendChild ( marker ) ;
icon . appendChild ( container ) ;
2007-11-14 14:34:36 -05:00
}
2007-11-17 00:20:26 -05:00
if ( ! counter ) {
var counter = document . createElement ( 'hbox' ) ;
counter . setAttribute ( 'class' , this . kCOUNTER _CONTAINER ) ;
counter . appendChild ( document . createElement ( 'label' ) ) ;
counter . lastChild . setAttribute ( 'class' , this . kCOUNTER ) ;
counter . lastChild . setAttribute ( 'value' , '(0)' ) ;
if ( label ) {
2009-02-04 08:51:14 -05:00
label . parentNode . insertBefore ( counter , label . nextSibling ) ;
2007-11-17 00:20:26 -05:00
}
2007-11-14 14:34:36 -05:00
}
2007-11-17 00:20:26 -05:00
this . initTabContentsOrder ( aTab ) ;
2007-11-14 14:34:36 -05:00
} ,
2007-11-17 00:20:26 -05:00
initTabContentsOrder : function ( aTab )
2007-11-14 14:34:36 -05:00
{
2007-11-17 00:20:26 -05:00
var label = this . getTabLabel ( aTab ) ;
var close = this . getTabClosebox ( aTab ) ;
var counter = document . getAnonymousElementByAttribute ( aTab , 'class' , this . kCOUNTER _CONTAINER ) ;
2009-05-11 19:19:11 -04:00
var inverted = this . mTabBrowser . getAttribute ( this . kTAB _CONTENTS _INVERTED ) == 'true' ;
2009-04-28 00:11:22 -04:00
var nodes = Array . slice ( document . getAnonymousNodes ( aTab ) ) ;
2009-05-12 11:09:49 -04:00
// reset order
nodes . forEach ( function ( aNode , aIndex ) {
aNode . setAttribute ( 'ordinal' , aIndex ) ;
} , this ) ;
// rearrange top-level contents
2009-04-28 00:11:22 -04:00
nodes . splice ( nodes . indexOf ( close ) , 1 ) ;
if ( inverted ) {
if ( this . mTabBrowser . getAttribute ( this . kCLOSEBOX _INVERTED ) == 'true' )
nodes . splice ( nodes . indexOf ( label . parentNode ) + 1 , 0 , close ) ;
else
nodes . splice ( nodes . indexOf ( label . parentNode ) , 0 , close ) ;
}
else {
if ( this . mTabBrowser . getAttribute ( this . kCLOSEBOX _INVERTED ) == 'true' )
nodes . splice ( nodes . indexOf ( label . parentNode ) , 0 , close ) ;
else
nodes . splice ( nodes . indexOf ( label . parentNode ) + 1 , 0 , close ) ;
}
2009-04-20 07:38:58 -04:00
var count = nodes . length ;
Array . slice ( nodes ) . reverse ( )
2009-04-20 07:25:14 -04:00
. forEach ( function ( aNode , aIndex ) {
2009-04-28 00:11:22 -04:00
aNode . setAttribute ( 'ordinal' , ( count - aIndex + 1 ) * 100 ) ;
2009-04-20 07:25:14 -04:00
} , this ) ;
2007-11-14 14:34:36 -05:00
2009-05-12 11:09:49 -04:00
// rearrange contents in "tab-image-middle"
2009-04-20 07:38:58 -04:00
nodes = Array . slice ( label . parentNode . childNodes ) ;
2009-04-28 00:11:22 -04:00
nodes . splice ( nodes . indexOf ( counter ) , 1 ) ;
if ( inverted ) nodes . reverse ( ) ;
nodes . splice ( nodes . indexOf ( label ) + 1 , 0 , counter ) ;
2009-04-20 07:38:58 -04:00
count = nodes . length ;
2009-04-28 00:11:22 -04:00
nodes . reverse ( ) . forEach ( function ( aNode , aIndex ) {
if ( aNode . getAttribute ( 'class' ) == 'informationaltab-thumbnail-container' )
return ;
aNode . setAttribute ( 'ordinal' , ( count - aIndex + 1 ) * 100 ) ;
} , this ) ;
2007-11-14 14:34:36 -05:00
} ,
2008-03-03 04:21:33 -05:00
updateInvertedTabContentsOrder : function ( aAll )
{
2009-05-12 11:09:49 -04:00
if ( ! this . getTreePref ( 'tabbar.invertTabContents' ) ) return ;
2008-03-03 04:21:33 -05:00
window . setTimeout ( function ( aSelf ) {
var b = aSelf . mTabBrowser ;
2009-05-12 11:09:49 -04:00
var tabs = aAll ? aSelf . getTabsArray ( b ) : [ b . selectedTab ] ;
tabs . forEach ( function ( aTab ) {
aSelf . initTabContentsOrder ( aTab ) ;
} ) ;
2009-05-13 02:09:17 -04:00
b = null ;
tabs = null ;
2008-03-03 04:21:33 -05:00
} , 0 , this ) ;
} ,
2008-03-08 03:57:17 -05:00
2007-11-17 00:20:26 -05:00
initTabbar : function ( aPosition )
2007-11-14 14:34:36 -05:00
{
2009-09-03 02:24:06 -04:00
if ( this . autoHide ) this . autoHide . clearTabbarCanvas ( ) ;
2008-06-17 06:16:57 -04:00
2007-11-14 14:34:36 -05:00
var b = this . mTabBrowser ;
2007-11-17 00:20:26 -05:00
if ( ! aPosition ) aPosition = this . getTreePref ( 'tabbar.position' ) ;
aPosition = String ( aPosition ) . toLowerCase ( ) ;
2007-11-14 14:34:36 -05:00
2008-10-17 11:47:45 -04:00
if ( b . getAttribute ( 'id' ) != 'content' &&
! this . getTreePref ( 'tabbar.position.subbrowser.enabled' ) ) {
2007-11-17 00:20:26 -05:00
aPosition = 'top' ;
2007-11-14 14:34:36 -05:00
}
2007-11-17 00:20:26 -05:00
var pos = ( aPosition == 'left' ) ? this . kTABBAR _LEFT :
( aPosition == 'right' ) ? this . kTABBAR _RIGHT :
( aPosition == 'bottom' ) ? this . kTABBAR _BOTTOM :
this . kTABBAR _TOP ;
2007-11-14 14:34:36 -05:00
2007-11-17 00:20:26 -05:00
var splitter = document . getAnonymousElementByAttribute ( b , 'class' , this . kSPLITTER ) ;
2009-03-30 12:36:54 -04:00
var toggler = document . getAnonymousElementByAttribute ( b , 'class' , this . kTABBAR _TOGGLER ) ;
2007-11-17 00:20:26 -05:00
if ( ! splitter ) {
splitter = document . createElement ( 'splitter' ) ;
splitter . setAttribute ( 'class' , this . kSPLITTER ) ;
2009-04-21 03:30:05 -04:00
splitter . addEventListener ( 'mousedown' , this , true ) ;
2007-11-17 00:20:26 -05:00
splitter . setAttribute ( 'onmouseup' , 'TreeStyleTabService.onTabbarResized(event);' ) ;
splitter . setAttribute ( 'state' , 'open' ) ;
splitter . appendChild ( document . createElement ( 'grippy' ) ) ;
var ref = b . mPanelContainer ;
ref . parentNode . insertBefore ( splitter , ref ) ;
2009-03-30 12:36:54 -04:00
toggler = document . createElement ( 'spacer' ) ;
2009-03-29 17:03:58 -04:00
toggler . setAttribute ( 'class' , this . kTABBAR _TOGGLER ) ;
b . mStrip . parentNode . insertBefore ( toggler , b . mStrip ) ;
2007-11-17 00:20:26 -05:00
}
2007-11-14 14:34:36 -05:00
2007-11-17 00:20:26 -05:00
// Tab Mix Plus
2009-03-16 07:58:43 -04:00
var scrollFrame = document . getAnonymousElementByAttribute ( b . mTabContainer , 'class' , 'tabs-frame' ) ;
2007-11-17 00:20:26 -05:00
var newTabBox = document . getAnonymousElementByAttribute ( b . mTabContainer , 'id' , 'tabs-newbutton-box' ) ;
var tabBarMode = this . getPref ( 'extensions.tabmix.tabBarMode' ) ;
2007-11-14 14:34:36 -05:00
2008-03-03 01:00:59 -05:00
// All-in-One Sidebar
var toolboxContainer = document . getAnonymousElementByAttribute ( b . mStrip , 'anonid' , 'aiostbx-toolbox-tableft' ) ;
if ( toolboxContainer ) toolboxContainer = toolboxContainer . parentNode ;
2009-03-16 07:58:43 -04:00
var scrollInnerBox = b . mTabContainer . mTabstrip . _scrollbox ?
document . getAnonymousNodes ( b . mTabContainer . mTabstrip . _scrollbox ) [ 0 ] :
scrollFrame ; // Tab Mix Plus
var allTabsButton = document . getAnonymousElementByAttribute ( b . mTabContainer , 'class' , 'tabs-alltabs-button' ) ||
document . getAnonymousElementByAttribute ( b . mTabContainer , 'anonid' , 'alltabs-button' ) ; // Tab Mix Plus
2007-11-17 00:20:26 -05:00
this . tabbarResizing = false ;
2008-03-09 23:51:21 -04:00
b . removeAttribute ( this . kRESIZING ) ;
2007-11-14 14:34:36 -05:00
2009-07-07 04:30:30 -04:00
b . mStrip . removeAttribute ( 'width' ) ;
b . mPanelContainer . removeAttribute ( 'width' ) ;
2009-07-07 21:41:37 -04:00
var delayedPostProcess ;
2007-11-17 00:20:26 -05:00
if ( pos & this . kTABBAR _VERTICAL ) {
2009-07-07 11:56:38 -04:00
2009-04-07 13:14:09 -04:00
this . collapseProp = 'margin-top' ;
2007-11-17 00:20:26 -05:00
this . positionProp = 'screenY' ;
this . sizeProp = 'height' ;
this . invertedPositionProp = 'screenX' ;
this . invertedSizeProp = 'width' ;
2007-11-14 14:34:36 -05:00
2008-10-17 11:47:45 -04:00
b . mTabBox . orient = splitter . orient = 'horizontal' ;
2007-11-17 00:20:26 -05:00
b . mStrip . orient =
2009-03-30 12:36:54 -04:00
toggler . orient =
2007-11-17 00:20:26 -05:00
b . mTabContainer . orient =
b . mTabContainer . mTabstrip . orient =
b . mTabContainer . mTabstrip . parentNode . orient = 'vertical' ;
2008-11-06 23:38:21 -05:00
if ( allTabsButton . hasChildNodes ( ) ) {
allTabsButton . firstChild . setAttribute ( 'position' , 'before_start' ) ;
}
2007-11-17 00:20:26 -05:00
b . mTabContainer . setAttribute ( 'align' , 'stretch' ) ; // for Mac OS X
scrollInnerBox . removeAttribute ( 'flex' ) ;
2007-11-14 14:34:36 -05:00
2007-11-17 00:20:26 -05:00
if ( scrollFrame ) { // Tab Mix Plus
2009-04-28 00:55:59 -04:00
document . getAnonymousNodes ( scrollFrame ) [ 0 ] . removeAttribute ( 'flex' ) ;
2007-11-17 00:20:26 -05:00
scrollFrame . parentNode . orient =
scrollFrame . orient = 'vertical' ;
newTabBox . orient = 'horizontal' ;
if ( tabBarMode == 2 )
this . setPref ( 'extensions.tabmix.tabBarMode' , 1 ) ;
2007-11-14 14:34:36 -05:00
}
2008-03-03 01:00:59 -05:00
if ( toolboxContainer )
toolboxContainer . orient = 'vertical' ;
2009-07-07 11:56:38 -04:00
b . setAttribute ( this . kMODE , 'vertical' ) ;
2007-11-17 00:20:26 -05:00
b . mStrip . setAttribute ( 'width' , this . getTreePref ( 'tabbar.width' ) ) ;
2009-07-07 11:56:38 -04:00
b . mStrip . removeAttribute ( 'height' ) ;
b . mPanelContainer . removeAttribute ( 'height' ) ;
2007-11-14 14:34:36 -05:00
2007-11-17 00:20:26 -05:00
if ( pos == this . kTABBAR _RIGHT ) {
b . setAttribute ( this . kTABBAR _POSITION , 'right' ) ;
2009-05-11 03:19:37 -04:00
if ( this . getTreePref ( 'tabbar.invertTab' ) ) {
b . setAttribute ( this . kTAB _INVERTED , 'true' ) ;
2009-05-12 08:23:51 -04:00
this . indentProp = this . getTreePref ( 'indent.property.right' ) ;
2007-11-17 00:20:26 -05:00
}
else {
2009-05-11 03:19:37 -04:00
b . removeAttribute ( this . kTAB _INVERTED ) ;
2009-05-12 08:23:51 -04:00
this . indentProp = this . getTreePref ( 'indent.property.left' ) ;
2007-11-17 00:20:26 -05:00
}
2009-07-07 21:41:37 -04:00
delayedPostProcess = function ( aSelf , aTabBrowser , aSplitter , aToggler ) {
2007-11-17 00:20:26 -05:00
/ * i n F i r e f o x 3 , t h e w i d t h o f t h e r i g h t s i d e t a b b a r
unexpectedly becomes 0 on the startup . so , we have
to set the width again . * /
2009-07-07 21:41:37 -04:00
aTabBrowser . mStrip . setAttribute ( 'width' , aSelf . getTreePref ( 'tabbar.width' ) ) ;
2009-05-13 02:09:17 -04:00
aTabBrowser . mTabDropIndicatorBar . setAttribute ( 'ordinal' , 1 ) ;
aTabBrowser . mStrip . setAttribute ( 'ordinal' , 30 ) ;
aSplitter . setAttribute ( 'ordinal' , 20 ) ;
aToggler . setAttribute ( 'ordinal' , 40 ) ;
aTabBrowser . mPanelContainer . setAttribute ( 'ordinal' , 10 ) ;
aSplitter . setAttribute ( 'collapse' , 'after' ) ;
2009-07-07 21:41:37 -04:00
} ;
2007-11-14 14:34:36 -05:00
}
2007-11-17 00:20:26 -05:00
else {
b . setAttribute ( this . kTABBAR _POSITION , 'left' ) ;
2009-05-11 03:19:37 -04:00
b . removeAttribute ( this . kTAB _INVERTED ) ;
2009-05-12 08:23:51 -04:00
this . indentProp = this . getTreePref ( 'indent.property.left' ) ;
2009-07-07 21:41:37 -04:00
delayedPostProcess = function ( aSelf , aTabBrowser , aSplitter , aToggler ) {
2009-05-13 02:09:17 -04:00
aTabBrowser . mTabDropIndicatorBar . setAttribute ( 'ordinal' , 1 ) ;
aTabBrowser . mStrip . setAttribute ( 'ordinal' , 10 ) ;
aSplitter . setAttribute ( 'ordinal' , 20 ) ;
aToggler . setAttribute ( 'ordinal' , 5 ) ;
aTabBrowser . mPanelContainer . setAttribute ( 'ordinal' , 30 ) ;
aSplitter . setAttribute ( 'collapse' , 'before' ) ;
2009-07-07 21:41:37 -04:00
} ;
2007-11-14 14:34:36 -05:00
}
}
2007-11-17 00:20:26 -05:00
else {
2009-04-07 13:14:09 -04:00
this . collapseProp = 'margin-left' ;
2007-11-17 00:20:26 -05:00
this . positionProp = 'screenX' ;
this . sizeProp = 'width' ;
this . invertedPositionProp = 'screenY' ;
this . invertedSizeProp = 'height' ;
2007-11-14 14:34:36 -05:00
2008-10-17 11:47:45 -04:00
b . mTabBox . orient = splitter . orient = 'vertical' ;
2007-11-17 00:20:26 -05:00
b . mStrip . orient =
2009-03-30 12:36:54 -04:00
toggler . orient =
2007-11-17 00:20:26 -05:00
b . mTabContainer . orient =
b . mTabContainer . mTabstrip . orient =
b . mTabContainer . mTabstrip . parentNode . orient = 'horizontal' ;
2008-11-06 23:38:21 -05:00
if ( allTabsButton . hasChildNodes ( ) ) {
allTabsButton . firstChild . setAttribute ( 'position' , 'after_end' ) ;
}
2007-11-17 00:20:26 -05:00
b . mTabContainer . removeAttribute ( 'align' ) ; // for Mac OS X
scrollInnerBox . setAttribute ( 'flex' , 1 ) ;
2007-11-14 14:34:36 -05:00
2007-11-17 00:20:26 -05:00
if ( scrollFrame ) { // Tab Mix Plus
2009-04-28 00:55:59 -04:00
document . getAnonymousNodes ( scrollFrame ) [ 0 ] . setAttribute ( 'flex' , 1 ) ;
2007-11-17 00:20:26 -05:00
scrollFrame . parentNode . orient =
scrollFrame . orient = 'horizontal' ;
newTabBox . orient = 'vertical' ;
}
2007-11-14 14:34:36 -05:00
2008-03-03 01:00:59 -05:00
if ( toolboxContainer )
toolboxContainer . orient = 'horizontal' ;
2007-11-17 00:20:26 -05:00
b . setAttribute ( this . kMODE , this . getTreePref ( 'tabbar.multirow' ) ? 'multirow' : 'horizontal' ) ;
2009-05-11 03:19:37 -04:00
b . removeAttribute ( this . kTAB _INVERTED ) ;
2009-07-07 11:56:38 -04:00
2007-11-17 00:20:26 -05:00
if ( pos == this . kTABBAR _BOTTOM ) {
b . setAttribute ( this . kTABBAR _POSITION , 'bottom' ) ;
2009-05-12 08:23:51 -04:00
this . indentProp = this . getTreePref ( 'indent.property.bottom' ) ;
2009-07-07 21:41:37 -04:00
delayedPostProcess = function ( aSelf , aTabBrowser , aSplitter , aToggler ) {
2009-05-13 02:09:17 -04:00
aTabBrowser . mTabDropIndicatorBar . setAttribute ( 'ordinal' , 1 ) ;
aTabBrowser . mStrip . setAttribute ( 'ordinal' , 30 ) ;
2009-08-25 04:36:50 -04:00
aSplitter . setAttribute ( 'ordinal' , 20 ) ;
aToggler . setAttribute ( 'ordinal' , 40 ) ;
2009-05-13 02:09:17 -04:00
aTabBrowser . mPanelContainer . setAttribute ( 'ordinal' , 10 ) ;
2009-07-07 21:41:37 -04:00
} ;
2007-11-17 00:20:26 -05:00
}
else {
b . setAttribute ( this . kTABBAR _POSITION , 'top' ) ;
2009-05-12 08:23:51 -04:00
this . indentProp = this . getTreePref ( 'indent.property.top' ) ;
2009-07-07 21:41:37 -04:00
delayedPostProcess = function ( aSelf , aTabBrowser , aSplitter , aToggler ) {
2009-05-13 02:09:17 -04:00
aTabBrowser . mTabDropIndicatorBar . setAttribute ( 'ordinal' , 1 ) ;
aTabBrowser . mStrip . setAttribute ( 'ordinal' , 10 ) ;
aSplitter . setAttribute ( 'ordinal' , 20 ) ;
aToggler . setAttribute ( 'ordinal' , 5 ) ;
aTabBrowser . mPanelContainer . setAttribute ( 'ordinal' , 30 ) ;
2009-07-07 21:41:37 -04:00
} ;
2007-11-14 14:34:36 -05:00
}
}
2009-04-07 13:19:30 -04:00
this . getTabsArray ( b ) . forEach ( function ( aTab ) {
this . updateTabCollapsed ( aTab , aTab . getAttribute ( this . kCOLLAPSED ) == 'true' , true ) ;
} , this ) ;
2009-05-13 02:09:17 -04:00
2009-08-26 05:33:54 -04:00
this . updateTabbarState ( ) ;
2009-07-07 21:41:37 -04:00
window . setTimeout ( function ( aSelf , aTabBrowser , aSplitter , aToggler ) {
delayedPostProcess ( aSelf , aTabBrowser , aSplitter , aToggler ) ;
2009-07-21 23:35:54 -04:00
aSelf . updateTabbarOverflow ( ) ;
2009-07-07 21:41:37 -04:00
delayedPostProcess = null ;
} , 0 , this , b , splitter , toggler ) ;
2009-07-07 21:37:00 -04:00
2009-05-13 02:09:17 -04:00
b = null ;
pos = null ;
splitter = null ;
toggler = null ;
scrollFrame = null ;
newTabBox = null
tabBarMode = null ;
toolboxContainer = null ;
scrollInnerBox = null ;
scrollInnerBox = null ;
allTabsButton = null ;
2007-11-14 14:34:36 -05:00
} ,
2009-07-21 23:35:54 -04:00
updateTabbarState : function ( )
2009-07-07 11:56:38 -04:00
{
var b = this . mTabBrowser ;
2009-07-07 20:09:13 -04:00
var orient ;
2009-07-07 11:56:38 -04:00
if ( this . isVertical ) {
2009-07-07 20:09:13 -04:00
orient = 'vertical' ;
2009-07-07 11:56:38 -04:00
if ( this . getTreePref ( 'tabbar.fixed.vertical' ) )
b . setAttribute ( this . kFIXED , true ) ;
else
b . removeAttribute ( this . kFIXED ) ;
}
else {
2009-07-07 20:09:13 -04:00
orient = 'horizontal' ;
2009-07-07 11:56:38 -04:00
if ( this . getTreePref ( 'tabbar.fixed.horizontal' ) ) {
b . setAttribute ( this . kFIXED , true ) ;
2009-07-07 12:00:17 -04:00
if ( ! this . isMultiRow ( ) ) {
2009-07-07 11:56:38 -04:00
b . mStrip . removeAttribute ( 'height' ) ;
b . mPanelContainer . removeAttribute ( 'height' ) ;
}
}
else {
b . removeAttribute ( this . kFIXED ) ;
b . mStrip . setAttribute ( 'height' , this . getTreePref ( 'tabbar.height' ) ) ;
}
}
2009-07-07 20:09:13 -04:00
if ( this . getTreePref ( 'enableSubtreeIndent.' + orient ) )
b . setAttribute ( this . kINDENTED , 'true' ) ;
else
b . removeAttribute ( this . kINDENTED ) ;
if ( this . getTreePref ( 'allowSubtreeCollapseExpand.' + orient ) )
b . setAttribute ( this . kALLOW _COLLAPSE , 'true' ) ;
else
b . removeAttribute ( this . kALLOW _COLLAPSE ) ;
2009-07-21 22:22:00 -04:00
if ( this . getTreePref ( 'tabbar.hideNewTabButton.' + orient ) )
b . setAttribute ( this . kHIDE _NEWTAB , 'true' ) ;
else
b . removeAttribute ( this . kHIDE _NEWTAB ) ;
if ( this . getTreePref ( 'tabbar.hideAlltabsButton.' + orient ) )
b . setAttribute ( this . kHIDE _ALLTABS , 'true' ) ;
else
b . removeAttribute ( this . kHIDE _ALLTABS ) ;
2009-07-07 20:09:13 -04:00
this . updateAllTabsIndent ( ) ;
2009-07-07 11:56:38 -04:00
} ,
2009-07-21 23:35:54 -04:00
updateTabbarOverflow : function ( )
{
var b = this . mTabBrowser ;
b . mTabContainer . removeAttribute ( 'overflow' ) ; // Firefox 3.0.x
var container = document . getAnonymousElementByAttribute ( b . mTabContainer , 'class' , 'tabs-container' ) ;
if ( ! container ) return ;
container . removeAttribute ( 'overflow' ) ;
var scrollBox = this . scrollBox ;
scrollBox . addEventListener ( 'overflow' , this , true ) ;
scrollBox . addEventListener ( 'underflow' , this , true ) ;
window . setTimeout ( function ( ) {
scrollBox = document . getAnonymousElementByAttribute ( scrollBox , 'anonid' , 'scrollbox' ) ;
if ( scrollBox ) scrollBox = document . getAnonymousNodes ( scrollBox ) [ 0 ] ;
if (
scrollBox &&
(
scrollBox . boxObject . width > container . boxObject . width ||
scrollBox . boxObject . height > container . boxObject . height
)
) {
b . mTabContainer . setAttribute ( 'overflow' , true ) ; // Firefox 3.0.x
container . setAttribute ( 'overflow' , true ) ;
}
else {
b . mTabContainer . removeAttribute ( 'overflow' ) ; // Firefox 3.0.x
container . removeAttribute ( 'overflow' ) ;
}
} , 100 ) ;
} ,
2007-11-17 00:20:26 -05:00
destroy : function ( )
2007-11-14 14:34:36 -05:00
{
2009-09-03 02:24:06 -04:00
this . autoHide . destroy ( ) ;
delete this . autoHide ;
2007-11-14 14:34:36 -05:00
var b = this . mTabBrowser ;
2009-07-08 07:00:45 -04:00
this . getTabsArray ( b ) . forEach ( function ( aTab ) {
2009-07-08 06:40:51 -04:00
this . destroyTab ( aTab ) ;
} , this ) ;
2007-11-14 14:34:36 -05:00
2007-11-17 00:20:26 -05:00
b . removeEventListener ( 'TabOpen' , this , true ) ;
b . removeEventListener ( 'TabClose' , this , true ) ;
b . removeEventListener ( 'TabMove' , this , true ) ;
b . removeEventListener ( 'SSTabRestoring' , this , true ) ;
2009-08-25 03:20:56 -04:00
b . mStrip . removeEventListener ( 'draggesture' , this , false ) ;
2007-11-17 12:52:51 -05:00
b . mStrip . removeEventListener ( 'dragenter' , this , false ) ;
b . mStrip . removeEventListener ( 'dragexit' , this , false ) ;
2009-08-25 03:20:56 -04:00
b . mStrip . removeEventListener ( 'dragend' , this , false ) ;
2007-11-17 12:52:51 -05:00
b . mStrip . removeEventListener ( 'dragover' , this , false ) ;
b . mStrip . removeEventListener ( 'dragdrop' , this , false ) ;
2007-11-17 00:20:26 -05:00
b . mTabContainer . removeEventListener ( 'click' , this , true ) ;
b . mTabContainer . removeEventListener ( 'dblclick' , this , true ) ;
b . mTabContainer . removeEventListener ( 'mousedown' , this , true ) ;
b . mTabContainer . removeEventListener ( 'select' , this , true ) ;
2008-06-18 20:15:57 -04:00
b . mTabContainer . removeEventListener ( 'scroll' , this , true ) ;
2009-08-25 04:35:05 -04:00
b . mPanelContainer . removeEventListener ( 'dragexit' , this , false ) ;
b . mPanelContainer . removeEventListener ( 'dragover' , this , false ) ;
b . mPanelContainer . removeEventListener ( 'dragdrop' , this , false ) ;
2009-08-25 03:20:56 -04:00
2009-09-02 21:42:04 -04:00
this . tabbarDNDObserver . destroy ( ) ;
2009-09-02 22:05:25 -04:00
delete this . _tabbarDNDObserver ;
2009-09-02 21:42:04 -04:00
this . panelDNDObserver . destroy ( ) ;
2009-09-02 22:05:25 -04:00
delete this . _panelDNDObserver ;
2007-11-14 14:34:36 -05:00
2009-04-06 14:22:09 -04:00
this . scrollBox . removeEventListener ( 'overflow' , this , true ) ;
this . scrollBox . removeEventListener ( 'underflow' , this , true ) ;
2009-03-08 12:12:19 -04:00
2009-05-12 12:56:39 -04:00
var tabContextMenu = document . getAnonymousElementByAttribute ( b , 'anonid' , 'tabContextMenu' ) ;
tabContextMenu . removeEventListener ( 'popupshowing' , this , false ) ;
2007-11-14 14:34:36 -05:00
2007-11-17 00:20:26 -05:00
var allTabPopup = document . getAnonymousElementByAttribute ( b . mTabContainer , 'anonid' , 'alltabs-popup' ) ;
2008-11-14 03:10:33 -05:00
if ( allTabPopup ) {
allTabPopup . removeEventListener ( 'popupshowing' , this , false ) ;
}
2007-11-14 14:34:36 -05:00
2008-03-09 23:51:21 -04:00
if ( this . tabbarCanvas ) {
this . tabbarCanvas . parentNode . removeChild ( this . tabbarCanvas ) ;
this . tabbarCanvas = null ;
}
2009-04-07 13:14:09 -04:00
this . ObserverService . removeObserver ( this , 'TreeStyleTab:indentModified' ) ;
2007-11-17 00:20:26 -05:00
this . ObserverService . removeObserver ( this , 'TreeStyleTab:collapseExpandAllSubtree' ) ;
this . removePrefListener ( this ) ;
2007-11-14 14:34:36 -05:00
2007-11-17 00:20:26 -05:00
delete this . mTabBrowser ;
2009-03-16 08:04:05 -04:00
delete this . _scrollBox ;
2007-11-14 14:34:36 -05:00
} ,
2008-12-01 03:30:36 -05:00
2007-11-17 00:20:26 -05:00
destroyTab : function ( aTab )
{
delete aTab . _ _treestyletab _ _linkedTabBrowser ;
} ,
2007-11-17 07:50:36 -05:00
2007-11-17 00:20:26 -05:00
/* nsIObserver */
2008-03-03 04:21:33 -05:00
2009-08-09 22:15:10 -04:00
domains : [
2009-09-03 02:24:06 -04:00
'extensions.treestyletab.'
2009-08-09 22:15:10 -04:00
] ,
2007-11-14 14:34:36 -05:00
observe : function ( aSubject , aTopic , aData )
{
switch ( aTopic )
{
2009-04-07 13:14:09 -04:00
case 'TreeStyleTab:indentModified' :
2009-05-13 02:09:17 -04:00
if ( this . indent > - 1 )
2007-11-14 14:34:36 -05:00
this . updateAllTabsIndent ( ) ;
break ;
2007-11-17 00:20:26 -05:00
case 'TreeStyleTab:collapseExpandAllSubtree' :
2009-07-03 05:58:34 -04:00
if ( aSubject == window ) {
aData = String ( aData ) ;
this . collapseExpandAllSubtree (
aData . indexOf ( 'collapse' ) > - 1 ,
aData . indexOf ( 'now' ) > - 1
) ;
}
2007-11-17 00:20:26 -05:00
break ;
2007-11-14 14:34:36 -05:00
case 'nsPref:changed' :
2009-05-13 02:09:17 -04:00
this . onPrefChange ( aData ) ;
break ;
2007-11-14 14:34:36 -05:00
2009-05-13 02:09:17 -04:00
default :
break ;
}
} ,
onPrefChange : function ( aPrefName )
{
var b = this . mTabBrowser ;
var value = this . getPref ( aPrefName ) ;
var tabContainer = b . mTabContainer ;
var tabs = this . getTabsArray ( b ) ;
switch ( aPrefName )
{
case 'extensions.treestyletab.tabbar.position' :
2009-09-03 02:24:06 -04:00
this . autoHide . onBeforeTabbarPositionChange ( ) ;
2009-05-13 02:09:17 -04:00
this . initTabbar ( ) ;
tabs . forEach ( function ( aTab ) {
this . initTabAttributes ( aTab ) ;
} , this ) ;
tabs . forEach ( function ( aTab ) {
this . initTabContents ( aTab ) ;
} , this ) ;
2009-09-03 02:24:06 -04:00
this . autoHide . onAfterTabbarPositionChange ( ) ;
2009-07-07 04:55:19 -04:00
window . setTimeout ( function ( aSelf ) {
aSelf . checkTabsIndentOverflow ( ) ;
} , 0 , this ) ;
2009-05-13 02:09:17 -04:00
break ;
2007-11-14 14:34:36 -05:00
2009-05-13 02:09:17 -04:00
case 'extensions.treestyletab.tabbar.invertTab' :
case 'extensions.treestyletab.tabbar.multirow' :
this . initTabbar ( ) ;
this . updateAllTabsIndent ( ) ;
tabs . forEach ( function ( aTab ) {
this . initTabContents ( aTab ) ;
} , this ) ;
break ;
case 'extensions.treestyletab.tabbar.invertTabContents' :
if ( value )
b . setAttribute ( this . kTAB _CONTENTS _INVERTED , 'true' ) ;
else
b . removeAttribute ( this . kTAB _CONTENTS _INVERTED ) ;
tabs . forEach ( function ( aTab ) {
this . initTabContents ( aTab ) ;
} , this ) ;
break ;
2009-04-28 00:11:22 -04:00
2009-05-13 02:09:17 -04:00
case 'extensions.treestyletab.tabbar.invertClosebox' :
if ( value )
b . setAttribute ( this . kCLOSEBOX _INVERTED , 'true' ) ;
else
b . removeAttribute ( this . kCLOSEBOX _INVERTED ) ;
tabs . forEach ( function ( aTab ) {
this . initTabContents ( aTab ) ;
} , this ) ;
break ;
2007-11-14 14:34:36 -05:00
2009-05-13 02:09:17 -04:00
case 'extensions.treestyletab.tabbar.style' :
if ( value ) {
if ( /^(default|vertigo|mixed)$/ . test ( value ) )
value = 'square ' + value ;
b . setAttribute ( this . kSTYLE , value ) ;
}
else {
b . removeAttribute ( this . kSTYLE ) ;
}
break ;
2008-02-28 07:12:02 -05:00
2009-05-13 02:09:17 -04:00
case 'extensions.treestyletab.twisty.style' :
if ( value == 'auto' ) {
2009-07-21 02:10:53 -04:00
if (
window [ 'piro.sakura.ne.jp' ] . extensions . isAvailable ( 'informationaltab@piro.sakura.ne.jp' ) &&
this . getPref ( 'extensions.informationaltab.thumbnail.enabled' ) &&
this . getPref ( 'extensions.informationaltab.thumbnail.position' ) < 100
) {
2009-05-13 02:09:17 -04:00
value = 'retro' ;
}
else {
value = 'modern-black' ;
}
}
b . setAttribute ( this . kTWISTY _STYLE , value ) ;
break ;
2007-11-14 14:34:36 -05:00
2009-05-13 02:09:17 -04:00
case 'extensions.treestyletab.showBorderForFirstTab' :
if ( value )
b . setAttribute ( this . kFIRSTTAB _BORDER , true ) ;
else
b . removeAttribute ( this . kFIRSTTAB _BORDER ) ;
break ;
2007-11-14 14:34:36 -05:00
2009-07-07 20:09:13 -04:00
case 'extensions.treestyletab.enableSubtreeIndent.horizontal' :
case 'extensions.treestyletab.allowSubtreeCollapseExpand.horizontal' :
2009-07-07 21:23:57 -04:00
case 'extensions.treestyletab.tabbar.fixed.horizontal' :
2009-07-21 22:22:00 -04:00
case 'extensions.treestyletab.tabbar.hideNewTabButton.horizontal' :
case 'extensions.treestyletab.tabbar.hideAlltabsButton.horizontal' :
2009-07-07 21:23:57 -04:00
if ( ! this . isVertical ) this . updateTabbarState ( ) ;
break ;
case 'extensions.treestyletab.enableSubtreeIndent.vertical' :
2009-07-07 20:09:13 -04:00
case 'extensions.treestyletab.allowSubtreeCollapseExpand.vertical' :
2009-07-07 11:34:14 -04:00
case 'extensions.treestyletab.tabbar.fixed.vertical' :
2009-07-21 22:22:00 -04:00
case 'extensions.treestyletab.tabbar.hideNewTabButton.vertical' :
case 'extensions.treestyletab.tabbar.hideAlltabsButton.vertical' :
2009-07-07 21:23:57 -04:00
if ( this . isVertical ) this . updateTabbarState ( ) ;
2009-05-13 02:09:17 -04:00
break ;
2008-03-10 00:11:44 -04:00
2009-05-13 02:09:17 -04:00
case 'extensions.treestyletab.tabbar.width' :
case 'extensions.treestyletab.tabbar.shrunkenWidth' :
if ( ! this . tabbarResizing && this . isVertical ) {
this . mTabBrowser . mStrip . removeAttribute ( 'width' ) ;
this . mTabBrowser . mStrip . setAttribute (
'width' ,
(
2009-09-03 02:24:06 -04:00
! this . autoHide . shown &&
this . autoHide . mode == this . autoHide . kMODE _SHRINK
2009-05-13 02:09:17 -04:00
) ?
this . getTreePref ( 'tabbar.shrunkenWidth' ) :
this . getTreePref ( 'tabbar.width' )
) ;
}
this . checkTabsIndentOverflow ( ) ;
break ;
2009-04-02 07:17:52 -04:00
2009-07-07 04:30:30 -04:00
case 'extensions.treestyletab.tabbar.height' :
this . _horizontalTabMaxIndentBase = 0 ;
this . checkTabsIndentOverflow ( ) ;
break ;
2007-11-14 14:34:36 -05:00
default :
break ;
}
} ,
2008-02-24 02:58:12 -05:00
2007-11-17 00:20:26 -05:00
/* DOM Event Handling */
2008-03-09 23:51:21 -04:00
2007-11-14 14:34:36 -05:00
handleEvent : function ( aEvent )
{
switch ( aEvent . type )
{
case 'TabOpen' :
this . onTabAdded ( aEvent ) ;
return ;
case 'TabClose' :
this . onTabRemoved ( aEvent ) ;
2009-05-13 02:09:17 -04:00
this . updateLastScrollPosition ( ) ;
2007-11-14 14:34:36 -05:00
return ;
case 'TabMove' :
this . onTabMove ( aEvent ) ;
return ;
case 'SSTabRestoring' :
this . onTabRestored ( aEvent ) ;
return ;
case 'select' :
this . onTabSelect ( aEvent ) ;
return ;
case 'click' :
2009-03-31 23:46:30 -04:00
if ( aEvent . target . ownerDocument == document )
2007-11-14 14:34:36 -05:00
this . onTabClick ( aEvent ) ;
return ;
case 'dblclick' :
2009-05-13 02:09:17 -04:00
this . onDblClick ( aEvent ) ;
2007-11-14 14:34:36 -05:00
return ;
case 'mousedown' :
2009-05-13 02:09:17 -04:00
this . onMouseDown ( aEvent ) ;
2007-11-14 14:34:36 -05:00
return ;
case 'scroll' :
2009-05-13 02:09:17 -04:00
this . onScroll ( aEvent ) ;
2007-11-14 14:34:36 -05:00
return ;
case 'popupshowing' :
2009-03-24 13:44:30 -04:00
this . onPopupShowing ( aEvent ) ;
2007-11-14 14:34:36 -05:00
return ;
2009-08-25 05:27:01 -04:00
2009-08-25 03:20:56 -04:00
case 'draggesture' :
nsDragAndDrop . startDrag ( aEvent , this . tabbarDNDObserver ) ;
return ;
2007-11-17 12:21:33 -05:00
case 'dragenter' :
2009-08-25 05:27:01 -04:00
nsDragAndDrop . dragEnter ( aEvent , this . tabbarDNDObserver ) ;
2007-11-17 12:21:33 -05:00
return ;
case 'dragexit' :
2009-08-25 03:20:56 -04:00
nsDragAndDrop . dragExit (
aEvent ,
aEvent . currentTarget == this . mTabBrowser . mStrip ?
this . tabbarDNDObserver :
this . panelDNDObserver
) ;
return ;
case 'dragend' :
this . tabbarDNDObserver . onDragEnd ( aEvent ) ;
2007-11-17 12:21:33 -05:00
return ;
case 'dragover' :
2007-11-17 12:52:51 -05:00
case 'dragdrop' :
2009-08-25 05:27:01 -04:00
let ( canDrop , observer ) {
if ( aEvent . currentTarget == this . mTabBrowser . mStrip ) {
observer = this . tabbarDNDObserver ;
canDrop = true ;
}
else {
observer = this . panelDNDObserver ;
canDrop = observer . canDrop ( aEvent , this . getCurrentDragSession ( ) ) ;
}
// don't use nsDragAndDrop if it can't be dropped!!
// http://piro.sakura.ne.jp/latest/blosxom/mozilla/xul/2007-02-02_splitbrowser-dragdrop.htm
if ( canDrop )
nsDragAndDrop [ aEvent . type == 'dragover' ? 'dragOver' : 'drop' ] ( aEvent , observer ) ;
}
2007-11-17 12:52:51 -05:00
return ;
2007-11-30 14:22:34 -05:00
2009-08-25 05:27:01 -04:00
2007-11-30 14:22:34 -05:00
case 'mouseover' :
2009-05-13 02:09:17 -04:00
if ( this . isEventFiredOnTwisty ( aEvent ) )
2007-11-30 14:22:34 -05:00
aEvent . target . setAttribute ( this . kTWISTY _HOVER , true ) ;
return ;
case 'mouseout' :
2009-05-13 02:09:17 -04:00
if ( this . isEventFiredOnTwisty ( aEvent ) )
2007-11-30 14:22:34 -05:00
aEvent . target . removeAttribute ( this . kTWISTY _HOVER ) ;
return ;
2009-03-08 12:12:19 -04:00
case 'overflow' :
case 'underflow' :
2009-03-24 13:44:30 -04:00
this . onTabbarOverflow ( aEvent ) ;
2009-03-08 12:12:19 -04:00
return ;
2007-11-14 14:34:36 -05:00
}
} ,
2008-06-18 20:15:57 -04:00
lastScrollX : - 1 ,
lastScrollY : - 1 ,
2009-05-13 02:09:17 -04:00
updateLastScrollPosition : function ( )
{
if ( ! this . isVertical ) return ;
var x = { } , y = { } ;
var scrollBoxObject = this . scrollBoxObject ;
if ( ! scrollBoxObject ) return ;
scrollBoxObject . getPosition ( x , y ) ;
this . lastScrollX = x . value ;
this . lastScrollY = y . value ;
} ,
2007-11-14 14:34:36 -05:00
onTabAdded : function ( aEvent )
{
var tab = aEvent . originalTarget ;
var b = this . mTabBrowser ;
this . initTab ( tab ) ;
2009-07-30 04:57:42 -04:00
var hasStructure = this . treeStructure && this . treeStructure . length ;
var positionInTree = hasStructure ? this . treeStructure . shift ( ) : - 1 ;
2009-07-30 03:56:11 -04:00
2007-11-14 14:34:36 -05:00
if ( this . readyToAttachNewTab ) {
2009-07-30 03:56:11 -04:00
let parent = this . getTabById ( this . parentTab ) ;
if ( parent ) {
let tabs = [ parent ] . concat ( this . getDescendantTabs ( parent ) ) ;
2009-07-30 04:57:42 -04:00
parent = ( positionInTree > - 1 && positionInTree < tabs . length ) ? tabs [ positionInTree ] : parent ;
2009-07-30 03:56:11 -04:00
}
if ( parent ) {
2009-07-30 06:04:40 -04:00
this . attachTabTo ( tab , parent ) ;
2009-07-30 03:56:11 -04:00
}
2007-11-14 14:34:36 -05:00
2009-07-30 03:56:11 -04:00
let refTab ;
let newIndex = - 1 ;
2009-07-30 04:57:42 -04:00
if ( hasStructure ) {
}
else if ( this . insertBefore &&
2007-11-14 14:34:36 -05:00
( refTab = this . getTabById ( this . insertBefore ) ) ) {
newIndex = refTab . _tPos ;
}
else if ( parent &&
this . getTreePref ( 'insertNewChildAt' ) == this . kINSERT _FISRT &&
this . multipleCount == 0 ) {
/ * <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ̎ q <EFBFBD> ^ <EFBFBD> u <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> C <EFBFBD> Ɋ J <EFBFBD> <EFBFBD> <EFBFBD> ꍇ <EFBFBD> A <EFBFBD> ŏ <EFBFBD> <EFBFBD> Ɋ J <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ^ <EFBFBD> u <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
<EFBFBD> q <EFBFBD> ^ <EFBFBD> u <EFBFBD> ̍ ŏ <EFBFBD> <EFBFBD> ̈ ʒu <EFBFBD> ɑ } <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> A <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ^ <EFBFBD> u <EFBFBD> ́ u <EFBFBD> ŏ <EFBFBD> <EFBFBD> ̊ J <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ^ <EFBFBD> u <EFBFBD> v <EFBFBD> <EFBFBD>
<EFBFBD> u <EFBFBD> <EFBFBD> <EFBFBD> X <EFBFBD> ŏ <EFBFBD> <EFBFBD> ̎ q <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ^ <EFBFBD> u <EFBFBD> v <EFBFBD> Ƃ ̊ Ԃɑ } <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ă <EFBFBD> <EFBFBD> <EFBFBD> * /
newIndex = parent . _tPos + 1 ;
if ( refTab = this . getFirstChildTab ( parent ) )
this . insertBefore = refTab . getAttribute ( this . kID ) ;
}
if ( newIndex > - 1 ) {
if ( newIndex > tab . _tPos ) newIndex -- ;
this . internallyTabMoving = true ;
b . moveTabTo ( tab , newIndex ) ;
this . internallyTabMoving = false ;
}
}
if ( ! this . readyToAttachMultiple ) {
this . stopToOpenChildTab ( b ) ;
}
else {
this . multipleCount ++ ;
}
2008-03-09 01:36:52 -05:00
2009-04-07 14:07:27 -04:00
if ( this . animationEnabled ) {
this . updateTabCollapsed ( tab , true , true ) ;
2009-08-26 05:33:54 -04:00
this . updateTabCollapsed ( tab , false , ! this . completelyRestored ) ;
2009-04-07 14:07:27 -04:00
}
2009-07-08 07:00:45 -04:00
var prev = this . getPreviousSiblingTab ( tab ) ;
if ( prev )
this . setTabValue ( prev , this . kINSERT _BEFORE , tab . getAttribute ( this . kID ) ) ;
2009-09-01 22:52:16 -04:00
var next = this . getNextSiblingTab ( tab ) ;
if ( next )
this . setTabValue ( next , this . kINSERT _AFTER , tab . getAttribute ( this . kID ) ) ;
2009-09-03 02:24:06 -04:00
this . autoHide . showTabbarForFeedback ( ) ;
2007-11-14 14:34:36 -05:00
} ,
onTabRemoved : function ( aEvent )
{
var tab = aEvent . originalTarget ;
var b = this . mTabBrowser ;
2009-04-07 12:09:17 -04:00
this . stopTabIndentAnimation ( tab ) ;
2009-04-07 13:14:09 -04:00
this . stopTabCollapseAnimation ( tab ) ;
2007-11-14 14:34:36 -05:00
this . destroyTab ( tab ) ;
2009-04-05 14:55:06 -04:00
var closeParentBehavior = this . getTreePref ( 'closeParentBehavior' ) ;
2009-06-09 11:03:59 -04:00
var closeRootBehavior = this . getTreePref ( 'closeRootBehavior' ) ;
2009-04-05 14:55:06 -04:00
if (
closeParentBehavior == this . CLOSE _PARENT _BEHAVIOR _CLOSE ||
tab . getAttribute ( this . kSUBTREE _COLLAPSED ) == 'true'
) {
2009-04-20 07:25:14 -04:00
this . getDescendantTabs ( tab ) . reverse ( ) . forEach ( function ( aTab ) {
b . removeTab ( aTab ) ;
} , this ) ;
2007-11-14 14:34:36 -05:00
2009-01-24 00:39:22 -05:00
if ( this . getTabs ( b ) . snapshotLength == 1 ) { // this is the last tab
2007-11-14 14:34:36 -05:00
b . addTab ( 'about:blank' ) ;
}
}
var firstChild = this . getFirstChildTab ( tab ) ;
var parentTab = this . getParentTab ( tab ) ;
var nextFocusedTab = null ;
2009-07-08 07:00:45 -04:00
var prev = this . getPreviousSiblingTab ( tab ) ;
2009-09-01 22:52:16 -04:00
var next = this . getNextSiblingTab ( tab ) ;
2009-07-08 07:00:45 -04:00
if ( prev ) {
2009-09-01 22:52:16 -04:00
this . setTabValue ( tab , this . kINSERT _AFTER , prev . getAttribute ( this . kID ) ) ;
2009-07-08 07:00:45 -04:00
if ( next )
this . setTabValue ( prev , this . kINSERT _BEFORE , next . getAttribute ( this . kID ) ) ;
else
this . deleteTabValue ( prev , this . kINSERT _BEFORE ) ;
}
2009-09-01 22:52:16 -04:00
if ( next ) {
this . setTabValue ( tab , this . kINSERT _BEFORE , next . getAttribute ( this . kID ) ) ;
if ( prev )
this . setTabValue ( next , this . kINSERT _AFTER , prev . getAttribute ( this . kID ) ) ;
else
this . deleteTabValue ( next , this . kINSERT _AFTER ) ;
}
2009-07-08 07:00:45 -04:00
2009-04-20 08:48:34 -04:00
var backupAttributes = { } ;
2009-04-20 09:00:05 -04:00
var indentModifiedTabs = [ ] ;
2007-11-14 14:34:36 -05:00
if ( firstChild ) {
2009-04-20 08:48:34 -04:00
backupAttributes [ this . kCHILDREN ] = this . getTabValue ( tab , this . kCHILDREN ) ;
2009-04-20 08:45:27 -04:00
let children = this . getChildTabs ( tab ) ;
2009-04-20 07:25:14 -04:00
children . forEach ( (
2009-06-09 11:03:59 -04:00
( closeParentBehavior == this . CLOSE _PARENT _BEHAVIOR _DETACH ) ?
2009-04-05 14:55:06 -04:00
function ( aTab ) {
2009-06-09 11:03:59 -04:00
indentModifiedTabs . push ( aTab ) ;
2009-07-30 05:56:28 -04:00
this . partTab ( aTab , {
dontUpdateIndent : true
} ) ;
2009-04-20 07:25:14 -04:00
this . moveTabSubTreeTo ( aTab , this . getLastTab ( b ) . _tPos ) ;
2009-04-05 14:55:06 -04:00
} :
2009-06-09 11:03:59 -04:00
( parentTab ?
2009-07-29 10:28:49 -04:00
(
closeParentBehavior == this . CLOSE _PARENT _BEHAVIOR _ESCALATE _FIRST &&
this . getChildTabs ( parentTab ) . length > 1
) :
2009-06-09 11:03:59 -04:00
closeRootBehavior == this . CLOSE _ROOT _BEHAVIOR _ESCALATE _FIRST
) ?
function ( aTab , aIndex ) {
2009-07-30 05:56:28 -04:00
this . partTab ( aTab , { dontUpdateIndent : true } ) ;
2009-06-09 11:03:59 -04:00
if ( aIndex == 0 ) {
2009-07-01 04:01:26 -04:00
nextFocusedTab = aTab ;
2009-06-09 11:03:59 -04:00
indentModifiedTabs . push ( aTab ) ;
if ( parentTab ) {
this . attachTabTo ( aTab , parentTab , {
dontUpdateIndent : true ,
2009-07-30 05:56:28 -04:00
dontExpand : true ,
dontMove : true
2009-06-09 11:03:59 -04:00
} ) ;
}
}
else {
this . attachTabTo ( aTab , children [ 0 ] , {
dontUpdateIndent : true ,
2009-07-30 05:56:28 -04:00
dontExpand : true ,
dontMove : true
2009-06-09 11:03:59 -04:00
} ) ;
}
} :
2009-04-05 14:55:06 -04:00
parentTab ?
function ( aTab ) {
2009-06-09 11:03:59 -04:00
indentModifiedTabs . push ( aTab ) ;
2009-04-20 07:25:14 -04:00
this . attachTabTo ( aTab , parentTab , {
2009-04-05 14:55:06 -04:00
dontUpdateIndent : true ,
2009-07-30 05:56:28 -04:00
dontExpand : true ,
dontMove : true
2009-04-05 14:55:06 -04:00
} ) ;
} :
function ( aTab ) {
2009-06-09 11:03:59 -04:00
indentModifiedTabs . push ( aTab ) ;
2009-07-30 05:56:28 -04:00
this . partTab ( aTab , { dontUpdateIndent : true } ) ;
2009-04-20 07:25:14 -04:00
}
) , this ) ;
2009-07-30 05:36:10 -04:00
if ( closeParentBehavior == this . CLOSE _PARENT _BEHAVIOR _ESCALATE _ALL ||
closeParentBehavior == this . CLOSE _PARENT _BEHAVIOR _ESCALATE _FIRST )
2007-11-14 14:34:36 -05:00
nextFocusedTab = firstChild ;
}
if ( parentTab ) {
2009-04-20 08:45:27 -04:00
let firstSibling = this . getFirstChildTab ( parentTab ) ;
let lastSibling = this . getLastChildTab ( parentTab ) ;
2009-02-05 03:38:01 -05:00
if ( tab == lastSibling && ! nextFocusedTab ) {
2007-11-14 14:34:36 -05:00
if ( tab == firstSibling ) { // there is only one child
nextFocusedTab = parentTab ;
}
else { // previous sibling tab
nextFocusedTab = this . getPreviousSiblingTab ( tab ) ;
}
}
2007-11-26 14:55:58 -05:00
2009-06-19 14:02:48 -04:00
let ancestors = [ ] ,
ancestor = parentTab ;
2007-11-26 14:55:58 -05:00
do {
2009-06-19 14:02:48 -04:00
ancestors . push ( ancestor . getAttribute ( this . kID ) ) ;
if ( ! next && ( next = this . getNextSiblingTab ( ancestor ) ) )
2009-04-20 08:48:34 -04:00
backupAttributes [ this . kINSERT _BEFORE ] = next . getAttribute ( this . kID ) ;
2007-11-26 14:55:58 -05:00
}
2009-06-19 14:02:48 -04:00
while ( ancestor = this . getParentTab ( ancestor ) ) ;
2009-04-20 08:48:34 -04:00
backupAttributes [ this . kANCESTOR ] = ancestors . join ( '|' ) ;
2007-11-26 14:55:58 -05:00
2009-07-06 21:15:13 -04:00
let shouldCloseParentTab = (
2009-07-06 21:09:50 -04:00
this . isGroupTab ( parentTab ) &&
this . getDescendantTabs ( parentTab ) . length == 1
) ;
if ( shouldCloseParentTab && nextFocusedTab == parentTab )
nextFocusedTab = this . getNextFocusedTab ( parentTab ) ;
2009-07-30 05:56:28 -04:00
this . partTab ( tab , { dontUpdateIndent : true } ) ;
2009-06-19 14:02:48 -04:00
2009-07-06 21:09:50 -04:00
if ( shouldCloseParentTab ) {
2009-07-06 21:34:40 -04:00
window . setTimeout ( function ( ) {
2009-07-06 21:19:31 -04:00
if ( parentTab . parentNode )
b . removeTab ( parentTab ) ;
2009-07-06 21:34:40 -04:00
parentTab = null ;
b = null ;
} , 0 ) ;
2009-06-19 14:02:48 -04:00
}
2007-11-14 14:34:36 -05:00
}
else if ( ! nextFocusedTab ) {
2009-07-06 21:09:50 -04:00
nextFocusedTab = this . getNextFocusedTab ( tab ) ;
2007-11-14 14:34:36 -05:00
}
2009-07-06 21:53:19 -04:00
if ( b . selectedTab == tab ) {
this . _focusChangedByCurrentTabRemove = true ;
if (
nextFocusedTab &&
this . _tabFocusAllowance . every ( function ( aFunc ) {
return aFunc . call ( this , b ) ;
} , this )
)
b . selectedTab = nextFocusedTab ;
}
2007-11-14 14:34:36 -05:00
2009-04-20 09:00:05 -04:00
if ( indentModifiedTabs . length )
this . updateTabsIndentWithDelay ( indentModifiedTabs ) ;
2007-11-14 14:34:36 -05:00
this . checkTabsIndentOverflow ( ) ;
2009-09-03 02:24:06 -04:00
this . autoHide . showTabbarForFeedback ( ) ;
2009-04-20 08:45:27 -04:00
2009-04-20 08:48:34 -04:00
for ( var i in backupAttributes )
{
this . setTabValue ( tab , i , backupAttributes [ i ] ) ;
}
2007-11-14 14:34:36 -05:00
} ,
2009-06-09 11:03:59 -04:00
CLOSE _PARENT _BEHAVIOR _ESCALATE _FIRST : 3 ,
CLOSE _PARENT _BEHAVIOR _ESCALATE _ALL : 0 ,
CLOSE _PARENT _BEHAVIOR _DETACH : 1 ,
CLOSE _PARENT _BEHAVIOR _CLOSE : 2 ,
2009-06-09 23:34:47 -04:00
CLOSE _ROOT _BEHAVIOR _ESCALATE _FIRST : 3 ,
2009-06-09 11:03:59 -04:00
CLOSE _ROOT _BEHAVIOR _DETACH : 1 ,
2009-07-06 21:09:50 -04:00
getNextFocusedTab : function ( aTab )
{
return this . getNextSiblingTab ( aTab ) ||
this . getPreviousVisibleTab ( aTab ) ;
} ,
2007-11-14 14:34:36 -05:00
onTabMove : function ( aEvent )
{
var tab = aEvent . originalTarget ;
var b = this . mTabBrowser ;
this . initTabContents ( tab ) ; // twisty vanished after the tab is moved!!
2008-04-29 14:17:44 -04:00
if ( this . hasChildTabs ( tab ) && ! this . isSubTreeMoving ) {
2007-11-14 14:34:36 -05:00
this . moveTabSubTreeTo ( tab , tab . _tPos ) ;
}
var parentTab = this . getParentTab ( tab ) ;
if ( parentTab && ! this . isSubTreeChildrenMoving ) {
this . updateChildrenArray ( parentTab ) ;
}
2007-11-15 08:01:07 -05:00
this . updateTabsCount ( tab , true ) ;
2009-09-01 22:52:16 -04:00
var prev = this . getPreviousSiblingTab ( tab ) ;
if ( prev )
this . setTabValue ( tab , this . kINSERT _AFTER , prev . getAttribute ( this . kID ) ) ;
else
this . deleteTabValue ( tab , this . kINSERT _AFTER ) ;
2009-07-08 07:00:45 -04:00
var next = this . getNextSiblingTab ( tab ) ;
if ( next )
this . setTabValue ( tab , this . kINSERT _BEFORE , next . getAttribute ( this . kID ) ) ;
else
this . deleteTabValue ( tab , this . kINSERT _BEFORE ) ;
var old = aEvent . detail ;
if ( old > tab . _tPos ) old -- ;
old = this . getTabs ( b ) . snapshotItem ( old ) ;
2009-09-01 22:52:16 -04:00
prev = this . getPreviousSiblingTab ( old ) ;
if ( prev )
this . setTabValue ( old , this . kINSERT _AFTER , prev . getAttribute ( this . kID ) ) ;
else
this . deleteTabValue ( old , this . kINSERT _AFTER ) ;
2009-07-08 07:00:45 -04:00
next = this . getNextSiblingTab ( old ) ;
if ( next )
this . setTabValue ( old , this . kINSERT _BEFORE , next . getAttribute ( this . kID ) ) ;
else
this . deleteTabValue ( old , this . kINSERT _BEFORE ) ;
2007-11-14 14:34:36 -05:00
if (
this . isSubTreeMoving ||
this . internallyTabMoving
)
return ;
2009-09-01 10:39:01 -04:00
this . attachTabFromPosition ( tab , aEvent . detail ) ;
2008-03-09 01:36:52 -05:00
2009-09-03 02:24:06 -04:00
this . autoHide . showTabbarForFeedback ( ) ;
2007-11-26 14:55:58 -05:00
} ,
2009-09-01 10:39:01 -04:00
attachTabFromPosition : function ( aTab , aOldPosition )
2007-11-26 14:55:58 -05:00
{
2007-11-26 17:43:50 -05:00
var parent = this . getParentTab ( aTab ) ;
2009-09-01 10:39:01 -04:00
if ( aOldPosition === void ( 0 ) ) aOldPosition = aTab . _tPos ;
var pos = this . getChildIndex ( aTab , parent ) ;
var oldPos = this . getChildIndex ( this . getTabs ( this . mTabBrowser ) . snapshotItem ( aOldPosition ) , parent ) ;
var delta ;
if ( pos == oldPos ) { // no move?
return ;
}
else if ( pos < 0 || oldPos < 0 ) {
delta = 2 ;
}
else {
delta = Math . abs ( pos - oldPos ) ;
}
2009-01-24 00:39:22 -05:00
var prevTab = this . getPreviousTab ( aTab ) ;
var nextTab = this . getNextTab ( aTab ) ;
2007-11-26 21:42:02 -05:00
var tabs = this . getDescendantTabs ( aTab ) ;
if ( tabs . length ) {
2009-01-24 00:39:22 -05:00
nextTab = this . getNextTab ( tabs [ tabs . length - 1 ] ) ;
2007-11-26 21:42:02 -05:00
}
var prevParent = this . getParentTab ( prevTab ) ;
var nextParent = this . getParentTab ( nextTab ) ;
var prevLevel = prevTab ? Number ( prevTab . getAttribute ( this . kNEST ) ) : - 1 ;
var nextLevel = nextTab ? Number ( nextTab . getAttribute ( this . kNEST ) ) : - 1 ;
var newParent ;
2007-11-26 17:43:50 -05:00
2009-09-01 10:39:01 -04:00
if ( ! prevTab ) { // moved to topmost position
2007-11-26 21:42:02 -05:00
newParent = null ;
2007-11-26 17:43:50 -05:00
}
2009-09-01 10:39:01 -04:00
else if ( ! nextTab ) { // moved to last position
newParent = ( delta > 1 ) ? prevParent : parent ;
2007-11-26 17:43:50 -05:00
}
2009-09-01 10:39:01 -04:00
else if ( prevParent == nextParent ) { // moved into existing tree
2007-11-26 17:43:50 -05:00
newParent = prevParent ;
}
2009-09-01 10:39:01 -04:00
else if ( prevLevel > nextLevel ) { // moved to end of existing tree
2009-09-01 22:03:58 -04:00
if ( this . mTabBrowser . selectedTab != aTab ) { // maybe newly opened tab
newParent = prevParent ;
}
else { // maybe drag and drop
var realDelta = Math . abs ( aTab . _tPos - aOldPosition ) ;
newParent = realDelta < 2 ? prevParent : ( parent || nextParent ) ;
}
2007-11-26 14:55:58 -05:00
}
2009-09-01 10:39:01 -04:00
else if ( prevLevel < nextLevel ) { // moved to first child position of existing tree
2009-09-01 06:30:21 -04:00
newParent = parent || nextParent ;
2007-11-26 17:43:50 -05:00
}
if ( newParent != parent ) {
if ( newParent )
2009-07-30 06:04:40 -04:00
this . attachTabTo ( aTab , newParent , { insertBefore : nextTab } ) ;
2007-11-14 14:34:36 -05:00
else
2007-11-26 14:55:58 -05:00
this . partTab ( aTab ) ;
2007-11-14 14:34:36 -05:00
}
} ,
2007-11-26 14:55:58 -05:00
2007-11-14 14:34:36 -05:00
updateChildrenArray : function ( aTab )
{
var children = this . getChildTabs ( aTab ) ;
children . sort ( function ( aA , aB ) { return aA . _tPos - aB . _tPos ; } ) ;
2008-10-17 08:35:55 -04:00
this . setTabValue (
aTab ,
this . kCHILDREN ,
children
. map ( function ( aItem ) {
return aItem . getAttribute ( this . kID ) ;
} , this )
. join ( '|' )
) ;
2007-11-14 14:34:36 -05:00
} ,
onTabRestored : function ( aEvent )
{
2009-08-26 05:33:54 -04:00
this . restoreStructure ( aEvent . originalTarget , ! this . completelyRestored ) ;
2008-11-09 23:48:11 -05:00
} ,
2009-04-07 13:58:58 -04:00
restoreStructure : function ( aTab , aWithoutAnimation )
2008-11-09 23:48:11 -05:00
{
var tab = aTab ;
2007-11-14 14:34:36 -05:00
var b = this . mTabBrowser ;
2007-11-15 08:11:26 -05:00
2008-11-10 00:21:34 -05:00
var maybeDuplicated = false ;
2007-11-17 07:50:36 -05:00
var id = this . getTabValue ( tab , this . kID ) ;
2008-02-23 21:01:50 -05:00
2007-11-17 07:50:36 -05:00
if ( this . getTabById ( id ) ) { // this is a duplicated tab!
2008-11-10 00:21:34 -05:00
maybeDuplicated = true ;
id = this . redirectId ( id ) ;
2007-11-17 07:50:36 -05:00
}
2008-11-10 00:21:34 -05:00
if ( ! maybeDuplicated ) {
2007-11-23 16:34:43 -05:00
/ * I f i t h a s a p a r e n t , i t i s w r o n g l y a t t a c c h e d b y t a b m o v i n g
on restoring . Restoring the old ID ( the next statement )
breaks the children list of the temporary parent and causes
many problems . So , to prevent these problems , I part the tab
from the temporary parent manually . * /
2009-08-26 05:33:54 -04:00
this . partTab ( tab , {
dontUpdateIndent : true ,
dontAnimate : aWithoutAnimation
} ) ;
2007-11-23 16:34:43 -05:00
/* reset attributes before restoring */
tab . removeAttribute ( this . kID ) ;
tab . removeAttribute ( this . kPARENT ) ;
tab . removeAttribute ( this . kCHILDREN ) ;
tab . removeAttribute ( this . kSUBTREE _COLLAPSED ) ;
tab . removeAttribute ( this . kCOLLAPSED ) ;
tab . removeAttribute ( this . kNEST ) ;
2009-04-07 13:58:58 -04:00
this . updateTabsIndent ( [ tab ] , undefined , undefined , aWithoutAnimation ) ;
2007-11-23 16:34:43 -05:00
}
2007-11-15 08:11:26 -05:00
2007-11-14 14:34:36 -05:00
this . setTabValue ( tab , this . kID , id ) ;
var isSubTreeCollapsed = ( this . getTabValue ( tab , this . kSUBTREE _COLLAPSED ) == 'true' ) ;
var children = this . getTabValue ( tab , this . kCHILDREN ) ;
2007-11-15 08:01:07 -05:00
var tabs = [ ] ;
2007-11-14 14:34:36 -05:00
if ( children ) {
2008-02-23 21:01:50 -05:00
tab . removeAttribute ( this . kCHILDREN ) ;
2007-11-14 14:34:36 -05:00
children = children . split ( '|' ) ;
2008-11-10 00:21:34 -05:00
if ( maybeDuplicated )
2008-02-23 20:06:19 -05:00
children = children . map ( function ( aChild ) {
2008-11-10 00:21:34 -05:00
return this . redirectId ( aChild ) ;
2008-10-17 08:35:55 -04:00
} , this ) ;
2009-04-20 07:25:14 -04:00
children . forEach ( function ( aTab ) {
if ( aTab && ( aTab = this . getTabById ( aTab ) ) ) {
2009-08-26 05:33:54 -04:00
this . attachTabTo ( aTab , tab , {
dontExpand : true ,
dontUpdateIndent : true ,
dontAnimate : aWithoutAnimation
} ) ;
2009-04-20 07:25:14 -04:00
tabs . push ( aTab ) ;
2007-11-14 14:34:36 -05:00
}
2009-04-20 07:25:14 -04:00
} , this ) ;
2007-11-14 14:34:36 -05:00
}
2008-04-29 14:17:44 -04:00
var nextTab = this . getTabValue ( tab , this . kINSERT _BEFORE ) ;
2009-07-08 06:40:51 -04:00
if ( nextTab && maybeDuplicated ) nextTab = this . redirectId ( nextTab ) ;
nextTab = this . getTabById ( nextTab ) ;
2007-11-17 07:50:36 -05:00
2009-09-01 22:52:16 -04:00
if ( ! nextTab ) {
var prevTab = this . getTabValue ( tab , this . kINSERT _AFTER ) ;
if ( prevTab && maybeDuplicated ) prevTab = this . redirectId ( prevTab ) ;
nextTab = this . getNextSiblingTab ( this . getTabById ( prevTab ) ) ;
}
2009-03-16 09:43:06 -04:00
var ancestors = ( this . getTabValue ( tab , this . kANCESTOR ) || this . getTabValue ( tab , this . kPARENT ) ) . split ( '|' ) ;
2007-11-26 14:55:58 -05:00
var parent = null ;
for ( var i in ancestors )
{
2008-11-10 00:21:34 -05:00
if ( maybeDuplicated ) ancestors [ i ] = this . redirectId ( ancestors [ i ] ) ;
2007-11-26 14:55:58 -05:00
parent = this . getTabById ( ancestors [ i ] ) ;
if ( parent ) {
parent = ancestors [ i ] ;
break ;
}
}
2007-11-26 16:17:46 -05:00
this . deleteTabValue ( tab , this . kANCESTOR ) ;
2007-11-26 14:55:58 -05:00
2007-11-14 14:34:36 -05:00
if ( parent ) {
2008-02-23 21:01:50 -05:00
tab . removeAttribute ( this . kPARENT ) ;
2007-11-14 14:34:36 -05:00
parent = this . getTabById ( parent ) ;
if ( parent ) {
this . attachTabTo ( tab , parent , {
2009-07-30 05:56:28 -04:00
dontExpand : true ,
insertBefore : nextTab ,
2009-08-26 05:33:54 -04:00
dontUpdateIndent : true ,
dontAnimate : aWithoutAnimation
2007-11-14 14:34:36 -05:00
} ) ;
2009-04-07 13:58:58 -04:00
this . updateTabsIndent ( [ tab ] , undefined , undefined , aWithoutAnimation ) ;
2007-11-14 14:34:36 -05:00
this . checkTabsIndentOverflow ( ) ;
}
else {
this . deleteTabValue ( tab , this . kPARENT ) ;
}
}
else if ( children ) {
2009-04-07 13:58:58 -04:00
this . updateTabsIndent ( tabs , undefined , undefined , aWithoutAnimation ) ;
2007-11-14 14:34:36 -05:00
this . checkTabsIndentOverflow ( ) ;
}
2008-04-29 14:17:44 -04:00
if ( ! parent ) {
2009-01-24 00:39:22 -05:00
if ( ! nextTab ) nextTab = this . getNextTab ( tab ) ;
2008-04-29 14:17:44 -04:00
var parentOfNext = this . getParentTab ( nextTab ) ;
var newPos = - 1 ;
if ( parentOfNext ) {
var descendants = this . getDescendantTabs ( parentOfNext ) ;
newPos = descendants [ descendants . length - 1 ] . _tPos ;
}
else if ( nextTab ) {
var newPos = nextTab . _tPos ;
if ( newPos > tab . _tPos ) newPos -- ;
}
if ( newPos > - 1 )
b . moveTabTo ( tab , newPos ) ;
2007-11-14 14:34:36 -05:00
}
if ( isSubTreeCollapsed ) {
2009-04-07 13:58:58 -04:00
this . collapseExpandSubtree ( tab , isSubTreeCollapsed , aWithoutAnimation ) ;
2007-11-14 14:34:36 -05:00
}
2008-02-22 16:52:44 -05:00
2008-11-10 00:21:34 -05:00
if ( maybeDuplicated ) this . clearRedirectionTable ( ) ;
2008-02-23 20:06:19 -05:00
} ,
2008-03-08 03:57:17 -05:00
2008-11-10 00:21:34 -05:00
redirectId : function ( aId )
2008-02-23 20:06:19 -05:00
{
2008-11-10 00:21:34 -05:00
if ( ! ( aId in this . _redirectionTable ) )
this . _redirectionTable [ aId ] = this . makeNewId ( ) ;
return this . _redirectionTable [ aId ] ;
2008-02-23 20:06:19 -05:00
} ,
2008-11-10 00:21:34 -05:00
_redirectionTable : { } ,
2008-02-24 02:58:12 -05:00
2008-11-10 00:21:34 -05:00
clearRedirectionTable : function ( )
2008-02-23 20:06:19 -05:00
{
2008-11-10 00:21:34 -05:00
if ( this . _clearRedirectionTableTimer ) {
window . clearTimeout ( this . _clearRedirectionTableTimer ) ;
this . _clearRedirectionTableTimer = null ;
2008-02-23 20:06:19 -05:00
}
2008-11-10 00:21:34 -05:00
this . _clearRedirectionTableTimer = window . setTimeout ( function ( aSelf ) {
aSelf . _redirectionTable = { } ;
2008-02-23 20:06:19 -05:00
} , 1000 , this ) ;
} ,
2008-11-10 00:21:34 -05:00
_clearRedirectionTableTimer : null ,
2008-03-03 04:21:33 -05:00
2007-11-14 14:34:36 -05:00
onTabSelect : function ( aEvent )
{
var b = this . mTabBrowser ;
var tab = b . selectedTab
if ( tab . getAttribute ( this . kCOLLAPSED ) == 'true' ) {
2009-07-09 01:03:07 -04:00
if ( this . getTreePref ( 'autoExpandSubTreeOnCollapsedChildFocused' ) ) {
var parentTab = tab ;
while ( parentTab = this . getParentTab ( parentTab ) )
{
this . collapseExpandSubtree ( parentTab , false ) ;
}
2009-08-14 02:16:40 -04:00
this . collapseExpandTreesIntelligentlyWithDelayFor ( tab ) ;
2009-07-09 01:03:07 -04:00
}
else {
b . selectedTab = this . getRootTab ( tab ) ;
2007-11-14 14:34:36 -05:00
}
}
2009-08-14 02:12:08 -04:00
else if (
this . getTreePref ( 'autoCollapseExpandSubTreeOnSelect' ) &&
(
! this . _focusChangedByCurrentTabRemove ||
this . getTreePref ( 'autoCollapseExpandSubTreeOnSelect.onCurrentTabRemove' )
)
) {
if ( ! this . hasChildTabs ( tab ) || ( tab . getAttribute ( this . kSUBTREE _COLLAPSED ) != 'true' ) )
tab = null ;
if (
this . _focusChangedByShortcut &&
this . accelKeyPressed &&
! this . getTreePref ( 'autoCollapseExpandSubTreeOnSelect.whileFocusMovingByShortcut' )
) {
TreeStyleTabService . expandTreeAfterKeyReleased ( tab ) ;
}
else {
2009-07-06 21:53:19 -04:00
this . collapseExpandTreesIntelligentlyWithDelayFor ( tab ) ;
2009-08-14 02:12:08 -04:00
}
2007-11-14 14:34:36 -05:00
}
2009-07-06 21:53:19 -04:00
this . _focusChangedByCurrentTabRemove = false ;
2009-08-14 02:12:08 -04:00
this . _focusChangedByShortcut = false ;
2009-07-06 21:53:19 -04:00
2008-03-03 04:21:33 -05:00
this . updateInvertedTabContentsOrder ( ) ;
2008-03-09 01:36:52 -05:00
2009-09-03 02:24:06 -04:00
this . autoHide . onTabSelect ( ) ;
2007-11-14 14:34:36 -05:00
} ,
onTabClick : function ( aEvent )
{
2008-12-03 07:48:42 -05:00
if ( aEvent . button != 0 ) return ;
2007-11-14 14:34:36 -05:00
2008-12-03 07:48:42 -05:00
if ( this . isEventFiredOnTwisty ( aEvent ) ) {
var tab = this . getTabFromEvent ( aEvent ) ;
2009-04-26 22:18:17 -04:00
if ( this . hasChildTabs ( tab ) &&
this . mTabBrowser . getAttribute ( this . kALLOW _COLLAPSE ) == 'true' ) {
this . collapseExpandSubtree ( tab , tab . getAttribute ( this . kSUBTREE _COLLAPSED ) != 'true' ) ;
aEvent . preventDefault ( ) ;
aEvent . stopPropagation ( ) ;
}
2008-12-03 07:48:42 -05:00
}
else if ( ! this . getTabFromEvent ( aEvent ) ) {
2008-12-03 08:05:01 -05:00
var tab = this . getTabFromTabbarEvent ( aEvent ) ;
2008-12-03 08:11:08 -05:00
if ( tab ) this . mTabBrowser . selectedTab = tab ;
2008-12-03 07:48:42 -05:00
}
2007-11-14 14:34:36 -05:00
} ,
2008-12-03 08:05:01 -05:00
getTabFromTabbarEvent : function ( aEvent )
{
2009-03-24 13:44:30 -04:00
if (
! this . shouldDetectClickOnIndentSpaces ||
this . isEventFiredOnClickable ( aEvent )
)
2008-12-14 21:59:51 -05:00
return null ;
2008-12-03 08:17:40 -05:00
2008-12-03 08:05:01 -05:00
var tab = null ;
var clickedPoint = aEvent [ this . positionProp ] ;
2009-01-24 00:39:22 -05:00
this . getTabsArray ( this . mTabBrowser ) . some ( function ( aTab ) {
2008-12-03 08:05:01 -05:00
var box = aTab . boxObject ;
if ( box [ this . positionProp ] > clickedPoint ||
box [ this . positionProp ] + box [ this . sizeProp ] < clickedPoint ) {
return false ;
}
tab = aTab ;
return true ;
} , this ) ;
return tab ;
} ,
2007-11-14 14:34:36 -05:00
2009-05-13 02:09:17 -04:00
onDblClick : function ( aEvent )
{
var tab = this . getTabFromEvent ( aEvent ) ;
if ( tab &&
this . hasChildTabs ( tab ) &&
this . getTreePref ( 'collapseExpandSubTree.dblclick' ) ) {
this . collapseExpandSubtree ( tab , tab . getAttribute ( this . kSUBTREE _COLLAPSED ) != 'true' ) ;
aEvent . preventDefault ( ) ;
aEvent . stopPropagation ( ) ;
}
} ,
onMouseDown : function ( aEvent )
2007-11-14 14:34:36 -05:00
{
if ( aEvent . button != 0 ||
! this . isEventFiredOnTwisty ( aEvent ) )
return ;
this . getTabFromEvent ( aEvent ) . _ _treestyletab _ _preventSelect = true ;
} ,
2009-05-13 02:09:17 -04:00
onScroll : function ( aEvent )
{
var node = aEvent . originalTarget ;
if ( node && node . ownerDocument == document ) {
if ( this . lastScrollX < 0 || this . lastScrollY < 0 ) return ;
var x = { } , y = { } ;
var scrollBoxObject = this . scrollBoxObject ;
scrollBoxObject . getPosition ( x , y ) ;
if ( x . value != this . lastScrollX || y . value != this . lastScrollY )
scrollBoxObject . scrollTo ( this . lastScrollX , this . lastScrollY ) ;
this . lastScrollX = - 1 ;
this . lastScrollY = - 1 ;
}
} ,
2007-11-14 14:34:36 -05:00
2009-03-24 13:44:30 -04:00
onTabbarOverflow : function ( aEvent )
{
var tabs = this . mTabBrowser . mTabContainer ;
var horizontal = tabs . orient == 'horizontal' ;
if ( horizontal ) return ;
aEvent . stopPropagation ( ) ;
if ( aEvent . detail == 1 ) return ;
if ( aEvent . type == 'overflow' ) {
tabs . setAttribute ( 'overflow' , 'true' ) ;
2009-04-28 00:55:59 -04:00
this . scrollBoxObject . ensureElementIsVisible ( tabs . selectedItem ) ;
2009-03-24 13:44:30 -04:00
}
else {
tabs . removeAttribute ( 'overflow' ) ;
}
} ,
onPopupShowing : function ( aEvent )
{
if ( aEvent . target != aEvent . currentTarget ) return ;
switch ( aEvent . target . getAttribute ( 'anonid' ) )
{
case 'tabContextMenu' :
this . initTabContextMenu ( aEvent ) ;
break ;
case 'alltabs-popup' :
this . initAllTabsPopup ( aEvent ) ;
break ;
}
} ,
2007-11-14 14:34:36 -05:00
initTabContextMenu : function ( aEvent )
{
var b = this . mTabBrowser ;
2009-07-06 05:21:06 -04:00
var sep , items = { } ;
[
this . kMENUITEM _RELOADSUBTREE ,
this . kMENUITEM _RELOADCHILDREN ,
this . kMENUITEM _REMOVESUBTREE ,
this . kMENUITEM _REMOVECHILDREN ,
this . kMENUITEM _COLLAPSE ,
this . kMENUITEM _EXPAND ,
this . kMENUITEM _AUTOHIDE ,
this . kMENUITEM _FIXED ,
this . kMENUITEM _BOOKMARKSUBTREE
] . forEach ( function ( aID ) {
let item = this . evaluateXPath (
'descendant::xul:*[starts-with(@id, "' + aID + '")]' ,
aEvent . currentTarget ,
XPathResult . FIRST _ORDERED _NODE _TYPE
) . singleNodeValue ;
items [ aID ] = item ;
if ( this . getTreePref ( 'show.' + aID ) )
item . removeAttribute ( 'hidden' ) ;
else
item . setAttribute ( 'hidden' , true ) ;
2009-07-07 04:31:00 -04:00
switch ( aID )
{
case this . kMENUITEM _RELOADSUBTREE :
case this . kMENUITEM _RELOADCHILDREN :
case this . kMENUITEM _REMOVESUBTREE :
case this . kMENUITEM _REMOVECHILDREN :
case this . kMENUITEM _COLLAPSE :
case this . kMENUITEM _EXPAND :
case this . kMENUITEM _BOOKMARKSUBTREE :
this . showHideSubTreeMenuItem ( item , [ b . mContextTab ] ) ;
break ;
default :
break ;
}
2009-07-06 05:21:06 -04:00
} , this ) ;
2007-11-26 10:07:10 -05:00
2007-11-17 01:05:23 -05:00
// collapse/expand all
sep = this . evaluateXPath (
'descendant::xul:menuseparator[starts-with(@id, "' + this . kMENUITEM _COLLAPSEEXPAND _SEPARATOR + '")]' ,
aEvent . currentTarget ,
XPathResult . FIRST _ORDERED _NODE _TYPE
) . singleNodeValue ;
2009-07-07 11:34:14 -04:00
let collapseItem = items [ this . kMENUITEM _COLLAPSE ] ;
let expanndItem = items [ this . kMENUITEM _EXPAND ] ;
2007-11-17 01:05:23 -05:00
if ( this . evaluateXPath (
'child::xul:tab[@' + this . kCHILDREN + ']' ,
b . mTabContainer
) . snapshotLength ) {
2009-07-06 05:21:06 -04:00
if ( this . evaluateXPath (
'child::xul:tab[@' + this . kCHILDREN + ' and not(@' + this . kSUBTREE _COLLAPSED + '="true")]' ,
b . mTabContainer
) . snapshotLength )
collapseItem . removeAttribute ( 'disabled' ) ;
else
collapseItem . setAttribute ( 'disabled' , true ) ;
2007-11-17 01:05:23 -05:00
2009-07-06 05:21:06 -04:00
if ( this . evaluateXPath (
'child::xul:tab[@' + this . kCHILDREN + ' and @' + this . kSUBTREE _COLLAPSED + '="true"]' ,
b . mTabContainer
) . snapshotLength )
expanndItem . removeAttribute ( 'disabled' ) ;
else
expanndItem . setAttribute ( 'disabled' , true ) ;
2007-11-17 01:05:23 -05:00
}
else {
collapseItem . setAttribute ( 'hidden' , true ) ;
expanndItem . setAttribute ( 'hidden' , true ) ;
}
if ( collapseItem . getAttribute ( 'hidden' ) == 'true' &&
expanndItem . getAttribute ( 'hidden' ) == 'true' ) {
sep . setAttribute ( 'hidden' , true ) ;
}
else {
sep . removeAttribute ( 'hidden' ) ;
}
// auto hide
2009-07-07 11:34:14 -04:00
let autohide = items [ this . kMENUITEM _AUTOHIDE ] ;
2009-09-03 02:24:06 -04:00
this . autoHide . updateAutoHideMenuItem ( autohide ) ;
2008-02-22 12:55:35 -05:00
// fix
2009-07-07 11:34:14 -04:00
let fixedPref ;
let fixedLabel ;
if ( this . isVertical ) {
fixedPref = 'tabbar.fixed.vertical' ;
fixedLabel = 'label-vertical' ;
}
else {
fixedPref = 'tabbar.fixed.horizontal' ;
fixedLabel = 'label-horizontal' ;
}
let fixed = items [ this . kMENUITEM _FIXED ] ;
fixed . setAttribute ( 'label' , fixed . getAttribute ( fixedLabel ) ) ;
if ( this . getTreePref ( fixedPref ) )
2009-07-07 04:42:17 -04:00
fixed . setAttribute ( 'checked' , true ) ;
else
fixed . removeAttribute ( 'checked' ) ;
2008-02-22 12:55:35 -05:00
2007-11-17 01:05:23 -05:00
sep = this . evaluateXPath (
'descendant::xul:menuseparator[starts-with(@id, "' + this . kMENUITEM _AUTOHIDE _SEPARATOR + '")]' ,
2007-11-14 14:34:36 -05:00
aEvent . currentTarget ,
XPathResult . FIRST _ORDERED _NODE _TYPE
) . singleNodeValue ;
2008-02-22 12:55:35 -05:00
if ( autohide . getAttribute ( 'hidden' ) != 'true' ||
2009-08-25 12:48:10 -04:00
fixed . getAttribute ( 'hidden' ) != 'true' ) {
2007-11-14 14:34:36 -05:00
sep . removeAttribute ( 'hidden' ) ;
}
else {
sep . setAttribute ( 'hidden' , true ) ;
}
} ,
2007-11-17 07:50:36 -05:00
initAllTabsPopup : function ( aEvent )
2007-11-17 00:20:26 -05:00
{
2007-11-17 01:05:23 -05:00
if ( ! this . getTreePref ( 'enableSubtreeIndent.allTabsPopup' ) ) return ;
2007-11-17 00:20:26 -05:00
var items = aEvent . target . childNodes ;
2009-01-24 00:39:22 -05:00
var tabs = this . getTabs ( this . mTabBrowser ) ;
2007-11-17 00:20:26 -05:00
for ( var i = 0 , maxi = items . length ; i < maxi ; i ++ )
{
2009-01-24 00:39:22 -05:00
items [ i ] . style . paddingLeft = tabs . snapshotItem ( i ) . getAttribute ( this . kNEST ) + 'em' ;
2007-11-17 00:20:26 -05:00
}
} ,
2009-05-12 14:47:36 -04:00
2007-11-17 00:20:26 -05:00
/* drag and drop */
2008-12-01 03:30:36 -05:00
2009-09-02 21:26:38 -04:00
get tabbarDNDObserver ( )
2009-08-25 03:20:56 -04:00
{
2009-09-02 22:05:25 -04:00
return this . _tabbarDNDObserver || ( this . _tabbarDNDObserver = new TreeStyleTabBrowserTabbarDNDObserver ( this ) ) ;
2007-11-17 12:21:33 -05:00
} ,
2009-09-02 21:26:38 -04:00
get panelDNDObserver ( )
2009-08-25 03:20:56 -04:00
{
2009-09-02 22:05:25 -04:00
return this . _panelDNDObserver || ( this . _panelDNDObserver = new TreeStyleTabBrowserTabpanelDNDObserver ( this ) ) ;
2009-08-25 03:20:56 -04:00
} ,
2008-10-01 21:32:31 -04:00
getCurrentDragSession : function ( )
{
return Components
. classes [ '@mozilla.org/widget/dragservice;1' ]
. getService ( Components . interfaces . nsIDragService )
. getCurrentSession ( ) ;
} ,
2007-11-14 14:34:36 -05:00
getDropAction : function ( aEvent , aDragSession )
{
2008-10-01 21:32:31 -04:00
if ( ! aDragSession )
aDragSession = this . getCurrentDragSession ( ) ;
2008-10-17 08:35:55 -04:00
var tab = aDragSession ? this . getTabFromChild ( aDragSession . sourceNode ) : null ;
2009-03-31 14:25:49 -04:00
this . ensureTabInitialized ( tab ) ;
2008-10-17 08:35:55 -04:00
var info = this . getDropActionInternal ( aEvent , tab ) ;
2007-11-14 14:34:36 -05:00
info . canDrop = true ;
2008-12-03 13:41:58 -05:00
info . source = tab ;
2008-10-17 08:35:55 -04:00
if ( tab ) {
var isCopy = this . isAccelKeyPressed ( aEvent ) ;
if ( isCopy && 'duplicateTab' in this . mTabBrowser ) {
2008-10-17 13:16:16 -04:00
info . action |= this . kACTION _DUPLICATE ;
2008-10-17 08:35:55 -04:00
}
2008-02-24 03:11:17 -05:00
if (
2008-10-17 08:35:55 -04:00
! isCopy &&
2008-10-17 13:16:16 -04:00
this . getTabBrowserFromChild ( tab ) != this . mTabBrowser &&
2008-02-24 03:11:17 -05:00
(
2008-10-17 08:35:55 -04:00
( 'duplicateTab' in this . mTabBrowser ) ||
( 'swapBrowsersAndCloseOther' in this . mTabBrowser )
2008-02-24 03:11:17 -05:00
)
) {
2008-10-17 13:16:16 -04:00
info . action |= this . kACTION _IMPORT ;
}
if ( info . action & this . kACTIONS _FOR _DESTINATION ) {
if ( info . action & this . kACTION _MOVE ) info . action ^= this . kACTION _MOVE ;
if ( info . action & this . kACTION _STAY ) info . action ^= this . kACTION _STAY ;
2008-02-24 03:11:17 -05:00
}
2008-02-22 18:31:22 -05:00
if ( info . action & this . kACTION _ATTACH ) {
2008-10-17 13:16:16 -04:00
if ( info . parent == tab ) {
2007-11-14 14:34:36 -05:00
info . canDrop = false ;
2008-02-22 18:31:22 -05:00
}
else {
2008-10-17 13:16:16 -04:00
var orig = tab ;
tab = info . target ;
2008-02-22 18:31:22 -05:00
while ( tab = this . getParentTab ( tab ) )
{
if ( tab != orig ) continue ;
info . canDrop = false ;
break ;
}
2007-11-14 14:34:36 -05:00
}
}
}
return info ;
} ,
2008-10-17 13:16:16 -04:00
2008-10-17 08:35:55 -04:00
getDropActionInternal : function ( aEvent , aSourceTab )
2007-11-14 14:34:36 -05:00
{
var tab = aEvent . target ;
var b = this . mTabBrowser ;
2009-01-24 00:39:22 -05:00
var tabs = this . getTabsArray ( b ) ;
2009-04-07 10:36:31 -04:00
var lastTabIndex = tabs . length - 1 ;
2007-11-14 14:43:54 -05:00
var isInverted = this . isVertical ? false : window . getComputedStyle ( b . parentNode , null ) . direction == 'rtl' ;
2007-11-14 14:34:36 -05:00
var info = {
target : null ,
position : null ,
action : null ,
parent : null ,
insertBefore : null
} ;
2008-10-17 08:35:55 -04:00
var isTabMoveFromOtherWindow = aSourceTab && aSourceTab . ownerDocument != document ;
2008-11-30 19:01:12 -05:00
var isNewTabAction = ! aSourceTab || aSourceTab . ownerDocument != document ;
2008-10-17 08:35:55 -04:00
2007-11-14 14:34:36 -05:00
if ( tab . localName != 'tab' ) {
2008-10-17 13:16:16 -04:00
var action = isTabMoveFromOtherWindow ? this . kACTION _STAY : ( this . kACTION _MOVE | this . kACTION _PART ) ;
2008-11-30 19:01:12 -05:00
if ( isNewTabAction ) action |= this . kACTION _NEWTAB ;
2007-11-14 14:34:36 -05:00
if ( aEvent [ this . positionProp ] < tabs [ 0 ] . boxObject [ this . positionProp ] ) {
info . target = info . parent = info . insertBefore = tabs [ 0 ] ;
info . position = isInverted ? this . kDROP _AFTER : this . kDROP _BEFORE ;
2008-10-17 08:35:55 -04:00
info . action = action ;
2007-11-14 14:34:36 -05:00
return info ;
}
2009-04-07 10:36:31 -04:00
else if ( aEvent [ this . positionProp ] > tabs [ lastTabIndex ] . boxObject [ this . positionProp ] + tabs [ lastTabIndex ] . boxObject [ this . sizeProp ] ) {
info . target = info . parent = tabs [ lastTabIndex ] ;
2007-11-14 14:34:36 -05:00
info . position = isInverted ? this . kDROP _BEFORE : this . kDROP _AFTER ;
2008-10-17 08:35:55 -04:00
info . action = action ;
2007-11-14 14:34:36 -05:00
return info ;
}
else {
2009-04-07 10:36:31 -04:00
info . target = tabs [ Math . min ( b . getNewIndex ( aEvent ) , lastTabIndex ) ] ;
2007-11-14 14:34:36 -05:00
}
}
else {
2009-03-31 14:25:49 -04:00
this . ensureTabInitialized ( tab ) ;
2007-11-14 14:34:36 -05:00
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 :
2009-03-16 10:35:30 -04:00
info . action = this . kACTION _STAY | this . kACTION _ATTACH ;
2007-11-14 14:34:36 -05:00
info . parent = tab ;
2009-03-16 10:35:30 -04:00
var visible = this . getNextVisibleTab ( tab ) ;
info . insertBefore = this . getTreePref ( 'insertNewChildAt' ) == this . kINSERT _FISRT ?
( this . getFirstChildTab ( tab ) || visible ) :
( this . getNextSiblingTab ( tab ) || this . getNextTab ( this . getLastDescendantTab ( tab ) ) || visible ) ;
2007-11-14 14:34:36 -05:00
break ;
case this . kDROP _BEFORE :
/ *
[ TARGET ] <EFBFBD> <EFBFBD> part from parent , and move
[ ]
[ TARGET ] <EFBFBD> <EFBFBD> attach to the parent of the target , and move
[ ]
[ TARGET ] <EFBFBD> <EFBFBD> attach to the parent of the target , and move
[ ]
[ TARGET ] <EFBFBD> <EFBFBD> attach to the parent of the target ( previous tab ) , and move
* /
var prevTab = this . getPreviousVisibleTab ( tab ) ;
if ( ! prevTab ) {
info . action = this . kACTION _MOVE | this . kACTION _PART ;
info . insertBefore = tabs [ 0 ] ;
}
else {
2007-11-26 17:43:50 -05:00
var prevLevel = Number ( prevTab . getAttribute ( this . kNEST ) ) ;
2007-11-14 14:34:36 -05:00
var targetNest = Number ( tab . getAttribute ( this . kNEST ) ) ;
2007-11-26 17:43:50 -05:00
info . parent = ( prevLevel < targetNest ) ? prevTab : this . getParentTab ( tab ) ;
2007-11-14 14:34:36 -05:00
info . action = this . kACTION _MOVE | ( info . parent ? this . kACTION _ATTACH : this . kACTION _PART ) ;
info . insertBefore = tab ;
}
break ;
case this . kDROP _AFTER :
/ *
[ TARGET ] <EFBFBD> <EFBFBD> if the target has a parent , attach to it and and move
[ TARGET ] <EFBFBD> <EFBFBD> attach to the parent of the target , and move
[ ]
[ TARGET ] <EFBFBD> <EFBFBD> attach to the parent of the target , and move
[ ]
[ TARGET ] <EFBFBD> <EFBFBD> attach to the target , and move
[ ]
* /
var nextTab = this . getNextVisibleTab ( tab ) ;
if ( ! nextTab ) {
info . action = this . kACTION _MOVE | this . kACTION _ATTACH ;
info . parent = this . getParentTab ( tab ) ;
}
else {
var targetNest = Number ( tab . getAttribute ( this . kNEST ) ) ;
2007-11-26 17:43:50 -05:00
var nextLevel = Number ( nextTab . getAttribute ( this . kNEST ) ) ;
info . parent = ( targetNest < nextLevel ) ? tab : this . getParentTab ( tab ) ;
2007-11-14 14:34:36 -05:00
info . action = this . kACTION _MOVE | ( info . parent ? this . kACTION _ATTACH : this . kACTION _PART ) ;
info . insertBefore = nextTab ;
2009-03-04 22:13:56 -05:00
/ *
[ TARGET ] <EFBFBD> <EFBFBD> attach dragged tab to the parent of the target as its next sibling
[ DRAGGED ]
* /
if ( aSourceTab == nextTab && this . getDescendantTabs ( info . parent ) . length == 1 ) {
info . action = this . kACTION _MOVE | this . kACTION _ATTACH ;
info . parent = this . getParentTab ( tab ) ;
info . insertBefore = this . getNextTab ( nextTab ) ;
}
2007-11-14 14:34:36 -05:00
}
break ;
}
2008-11-30 19:01:12 -05:00
if ( isNewTabAction ) action |= this . kACTION _NEWTAB ;
2007-11-14 14:34:36 -05:00
return info ;
} ,
2008-10-17 13:16:16 -04:00
performDrop : function ( aInfo , aDraggedTab )
2007-11-14 14:34:36 -05:00
{
2008-12-01 03:30:36 -05:00
var tabsInfo = this . getDraggedTabsInfoFromOneTab ( aInfo , aDraggedTab ) ;
aDraggedTab = tabsInfo . draggedTab ;
var draggedTabs = tabsInfo . draggedTabs ;
var draggedRoots = tabsInfo . draggedRoots ;
2008-10-17 08:35:55 -04:00
var targetBrowser = this . mTabBrowser ;
2009-01-24 00:39:22 -05:00
var tabs = this . getTabsArray ( targetBrowser ) ;
2008-02-22 18:31:22 -05:00
2008-10-17 08:35:55 -04:00
var sourceWindow = aDraggedTab . ownerDocument . defaultView ;
var sourceBrowser = this . getTabBrowserFromChild ( aDraggedTab ) ;
2008-02-24 03:34:45 -05:00
2009-08-10 10:31:48 -04:00
var draggedWholeTree = [ ] . concat ( draggedRoots ) ;
draggedRoots . forEach ( function ( aRoot ) {
draggedWholeTree = draggedWholeTree . concat ( this . getDescendantTabs ( aRoot ) ) ;
} , this ) ;
while ( aInfo . insertBefore && draggedWholeTree . indexOf ( aInfo . insertBefore ) > - 1 )
2009-08-10 10:09:38 -04:00
{
aInfo . insertBefore = this . getNextTab ( aInfo . insertBefore ) ;
}
2008-10-17 13:16:16 -04:00
if ( aInfo . action & this . kACTIONS _FOR _SOURCE ) {
if ( aInfo . action & this . kACTION _PART ) {
2008-02-22 20:42:42 -05:00
this . partTabsOnDrop ( draggedRoots ) ;
2008-10-17 13:16:16 -04:00
}
else if ( aInfo . action & this . kACTION _ATTACH ) {
2008-02-22 20:42:42 -05:00
this . attachTabsOnDrop ( draggedRoots , aInfo . parent ) ;
2008-10-17 13:16:16 -04:00
}
else {
return false ;
}
if ( // if this move will cause no change...
sourceBrowser == targetBrowser &&
2009-08-10 10:09:38 -04:00
sourceBrowser . treeStyleTab . getNextVisibleTab ( draggedTabs [ draggedTabs . length - 1 ] ) == aInfo . insertBefore
2008-10-17 13:16:16 -04:00
) {
// then, do nothing
return true ;
}
2007-11-14 14:34:36 -05:00
}
2008-02-22 19:41:15 -05:00
2008-10-17 13:16:16 -04:00
// prevent Multiple Tab Handler feature
targetBrowser . duplicatingSelectedTabs = true ;
targetBrowser . movingSelectedTabs = true ;
2008-10-17 08:35:55 -04:00
2008-02-22 18:31:22 -05:00
2008-10-17 13:16:16 -04:00
var newRoots = [ ] ;
var shouldClose = (
aInfo . action & this . kACTION _IMPORT &&
2009-01-24 00:39:22 -05:00
this . getTabs ( sourceBrowser ) . snapshotLength == draggedTabs . length
2008-10-17 13:16:16 -04:00
) ;
var oldTabs = [ ] ;
var newTabs = [ ] ;
var treeStructure = draggedTabs . map ( function ( aTab ) {
var parent = sourceBrowser . treeStyleTab . getParentTab ( aTab ) ;
return parent ? draggedTabs . indexOf ( parent ) : - 1 ;
} ) ;
2008-02-22 18:31:22 -05:00
2009-03-25 09:19:53 -04:00
var parentTabsArray = draggedTabs . map ( function ( aTab ) {
return ( aInfo . action & this . kACTIONS _FOR _DESTINATION ) ?
sourceBrowser . treeStyleTab . getParentTab ( aTab ) : null ;
} , this ) ;
2009-08-19 01:48:41 -04:00
// Firefox fails to "move" collapsed tabs. So, expand them first
// and collapse them after they are moved.
2009-08-19 01:47:18 -04:00
var collapseExpandState = [ ] ;
if ( aInfo . action & this . kACTION _IMPORT &&
'swapBrowsersAndCloseOther' in targetBrowser ) {
draggedWholeTree . forEach ( function ( aTab ) {
collapseExpandState . push ( this . getTabValue ( aTab , this . kSUBTREE _COLLAPSED ) == 'true' ) ;
this . collapseExpandSubtree ( aTab , false , true ) ;
this . collapseExpandTab ( aTab , false , true ) ;
} , this ) ;
}
2009-04-07 10:36:31 -04:00
var lastTabIndex = tabs . length - 1 ;
2009-03-25 09:19:53 -04:00
draggedTabs . forEach ( function ( aTab , aIndex ) {
2008-10-17 13:16:16 -04:00
var tab = aTab ;
if ( aInfo . action & this . kACTIONS _FOR _DESTINATION ) {
2009-03-25 09:19:53 -04:00
var parent = parentTabsArray [ aIndex ] ;
2008-12-01 03:30:36 -05:00
if ( tabsInfo . isSelectionMove )
2008-10-17 13:16:16 -04:00
sourceWindow . MultipleTabService . setSelection ( aTab , false ) ;
if ( aInfo . action & this . kACTION _IMPORT &&
'swapBrowsersAndCloseOther' in targetBrowser ) {
tab = targetBrowser . addTab ( ) ;
tab . linkedBrowser . stop ( ) ;
tab . linkedBrowser . docShell ;
targetBrowser . swapBrowsersAndCloseOther ( tab , aTab ) ;
targetBrowser . setTabTitle ( tab ) ;
}
else {
tab = targetBrowser . duplicateTab ( aTab ) ;
this . deleteTabValue ( tab , this . kCHILDREN ) ;
this . deleteTabValue ( tab , this . kPARENT ) ;
if ( aInfo . action & this . kACTION _IMPORT )
oldTabs . push ( aTab ) ;
}
newTabs . push ( tab ) ;
2008-12-01 03:30:36 -05:00
if ( tabsInfo . isSelectionMove )
2008-10-17 13:16:16 -04:00
MultipleTabService . setSelection ( tab , true ) ;
if ( ! parent || draggedTabs . indexOf ( parent ) < 0 )
newRoots . push ( tab ) ;
2009-04-07 10:36:31 -04:00
lastTabIndex ++ ;
2008-10-17 13:16:16 -04:00
}
2008-02-24 03:11:17 -05:00
2009-04-07 10:36:31 -04:00
var newIndex = aInfo . insertBefore ? aInfo . insertBefore . _tPos : lastTabIndex ;
2008-10-17 13:16:16 -04:00
if ( aInfo . insertBefore && newIndex > tab . _tPos ) newIndex -- ;
2008-10-17 08:35:55 -04:00
2008-10-17 13:16:16 -04:00
this . internallyTabMoving = true ;
targetBrowser . moveTabTo ( tab , newIndex ) ;
2009-08-19 01:47:18 -04:00
this . collapseExpandTab ( tab , false , true ) ;
2008-10-17 13:16:16 -04:00
this . internallyTabMoving = false ;
2008-02-22 19:41:15 -05:00
2008-10-17 13:16:16 -04:00
} , this ) ;
2008-02-24 05:01:10 -05:00
2008-10-17 13:16:16 -04:00
// close imported tabs from the source browser
oldTabs . forEach ( function ( aTab ) {
sourceBrowser . removeTab ( aTab ) ;
} ) ;
if ( shouldClose ) this . closeOwner ( sourceBrowser ) ;
2008-02-22 19:41:15 -05:00
2008-10-17 13:16:16 -04:00
// restore tree structure for newly opened tabs
newTabs . forEach ( function ( aTab , aIndex ) {
var index = treeStructure [ aIndex ] ;
if ( index < 0 ) return ;
targetBrowser . treeStyleTab . attachTabTo ( aTab , newTabs [ index ] ) ;
} ) ;
2009-08-19 01:47:18 -04:00
newTabs . reverse ( ) ;
collapseExpandState . reverse ( ) ;
collapseExpandState . forEach ( function ( aCollapsed , aIndex ) {
this . collapseExpandSubtree ( newTabs [ aIndex ] , aCollapsed , true ) ;
} , this ) ;
2008-02-24 03:11:17 -05:00
2008-10-17 13:16:16 -04:00
if ( aInfo . action & this . kACTIONS _FOR _DESTINATION &&
aInfo . action & this . kACTION _ATTACH )
this . attachTabsOnDrop ( newRoots , aInfo . parent ) ;
// Multiple Tab Handler
targetBrowser . movingSelectedTabs = false ;
targetBrowser . duplicatingSelectedTabs = false ;
2008-02-22 19:41:15 -05:00
2007-11-14 14:34:36 -05:00
return true ;
} ,
2008-10-17 13:16:16 -04:00
2008-12-01 03:30:36 -05:00
getDraggedTabsInfoFromOneTab : function ( aInfo , aTab )
{
aTab = this . getTabFromChild ( aTab ) ;
var targetBrowser = this . mTabBrowser ;
2009-01-24 00:39:22 -05:00
var tabs = this . getTabsArray ( targetBrowser ) ;
2008-12-01 03:30:36 -05:00
var draggedTabs = [ aTab ] ;
var draggedRoots = [ aTab ] ;
var sourceWindow = aTab . ownerDocument . defaultView ;
var sourceBrowser = this . getTabBrowserFromChild ( aTab ) ;
var isSelectionMove = (
'MultipleTabService' in sourceWindow &&
sourceWindow . MultipleTabService . isSelected ( aTab ) &&
MultipleTabService . allowMoveMultipleTabs
) ;
if ( isSelectionMove ) {
draggedTabs = sourceWindow . MultipleTabService . getSelectedTabs ( sourceBrowser ) ;
if ( ! ( aInfo . action & this . kACTIONS _FOR _DESTINATION ) ) {
draggedRoots = [ ] ;
draggedTabs . forEach ( function ( aTab ) {
var parent = aTab ,
current ;
do {
current = parent ;
parent = sourceBrowser . treeStyleTab . getParentTab ( parent )
if ( parent && sourceWindow . MultipleTabService . isSelected ( parent ) ) continue ;
draggedRoots . push ( current ) ;
return ;
}
while ( parent ) ;
} , this ) ;
}
}
else if ( aInfo . action & this . kACTIONS _FOR _DESTINATION ) {
draggedTabs = draggedTabs . concat ( sourceBrowser . treeStyleTab . getDescendantTabs ( aTab ) ) ;
}
return {
draggedTab : aTab ,
draggedTabs : draggedTabs ,
draggedRoots : draggedRoots ,
isSelectionMove : isSelectionMove
} ;
} ,
2008-10-17 13:16:16 -04:00
attachTabsOnDrop : function ( aTabs , aParent )
2008-02-22 19:41:15 -05:00
{
this . mTabBrowser . movingSelectedTabs = true ; // Multiple Tab Handler
aTabs . forEach ( function ( aTab ) {
2009-05-06 22:19:10 -04:00
if ( ! aTab . parentNode ) return ; // ignore removed tabs
2008-02-22 19:41:15 -05:00
if ( aParent )
2008-10-17 08:35:55 -04:00
this . attachTabTo ( aTab , aParent ) ;
2008-02-22 19:41:15 -05:00
else
2008-10-17 08:35:55 -04:00
this . partTab ( aTab ) ;
this . collapseExpandTab ( aTab , false ) ;
} , this ) ;
2008-02-22 19:41:15 -05:00
this . mTabBrowser . movingSelectedTabs = false ; // Multiple Tab Handler
} ,
2008-10-17 13:16:16 -04:00
partTabsOnDrop : function ( aTabs )
2008-02-22 19:41:15 -05:00
{
this . mTabBrowser . movingSelectedTabs = true ; // Multiple Tab Handler
aTabs . forEach ( function ( aTab ) {
2009-05-06 22:19:10 -04:00
if ( ! aTab . parentNode ) return ; // ignore removed tabs
2008-10-17 08:35:55 -04:00
this . partTab ( aTab ) ;
this . collapseExpandTab ( aTab , false ) ;
} , this ) ;
2008-02-22 19:41:15 -05:00
this . mTabBrowser . movingSelectedTabs = false ; // Multiple Tab Handler
} ,
2008-10-17 13:16:16 -04:00
closeOwner : function ( aTabOwner )
2008-10-17 08:35:55 -04:00
{
var w = aTabOwner . ownerDocument . defaultView ;
2008-10-17 13:30:10 -04:00
if ( ! w ) return ;
2009-04-29 23:53:38 -04:00
if ( 'SplitBrowser' in w ) {
if ( 'getSubBrowserFromChild' in w . SplitBrowser ) {
var subbrowser = w . SplitBrowser . getSubBrowserFromChild ( aTabOwner ) ;
if ( subbrowser ) {
subbrowser . close ( ) ;
return ;
}
2008-10-17 08:35:55 -04:00
}
2009-04-29 23:53:38 -04:00
if ( w . SplitBrowser . browsers . length ) return ;
2008-10-17 08:35:55 -04:00
}
w . close ( ) ;
} ,
2008-12-01 03:30:36 -05:00
2007-11-14 14:34:36 -05:00
clearDropPosition : function ( )
{
var b = this . mTabBrowser ;
var xpathResult = this . evaluateXPath (
'child::xul:tab[@' + this . kDROP _POSITION + ']' ,
b . mTabContainer
) ;
for ( var i = 0 , maxi = xpathResult . snapshotLength ; i < maxi ; i ++ )
{
xpathResult . snapshotItem ( i ) . removeAttribute ( this . kDROP _POSITION ) ;
}
} ,
2008-12-01 04:14:05 -05:00
isDraggingAllTabs : function ( aTab )
{
var actionInfo = {
action : this . kACTIONS _FOR _DESTINATION | this . kACTION _IMPORT
} ;
var tabsInfo = this . getDraggedTabsInfoFromOneTab ( actionInfo , aTab ) ;
2009-01-24 00:39:22 -05:00
return tabsInfo . draggedTabs . length == this . getTabs ( this . mTabBrowser ) . snapshotLength ;
2008-12-01 04:14:05 -05:00
} ,
2007-11-14 14:34:36 -05:00
2007-11-17 00:20:26 -05:00
/* commands */
2007-11-14 14:34:36 -05:00
2007-11-17 00:20:26 -05:00
/* attach/part */
2009-05-15 11:51:12 -04:00
attachTabTo : function ( aChild , aParent , aInfo ) /* PUBLIC API */
2007-11-14 14:34:36 -05:00
{
2009-04-07 12:09:17 -04:00
var currentParent ;
2007-11-17 00:20:26 -05:00
if (
! aChild ||
! aParent ||
aChild == aParent ||
2009-04-07 12:09:17 -04:00
( currentParent = this . getParentTab ( aChild ) ) == aParent
2008-02-28 02:45:39 -05:00
) {
2009-05-15 13:17:57 -04:00
/* PUBLIC API */
let event = document . createEvent ( 'Events' ) ;
event . initEvent ( 'TreeStyleTabAttached' , true , true ) ;
event . parentTab = aParent ;
aChild . dispatchEvent ( event ) ;
2007-11-17 00:20:26 -05:00
return ;
2008-02-28 02:45:39 -05:00
}
2007-11-14 14:34:36 -05:00
2009-04-07 12:09:17 -04:00
shouldInheritIndent = (
! currentParent ||
( currentParent . getAttribute ( this . kNEST ) == aParent . getAttribute ( this . kNEST ) )
) ;
2009-03-31 14:25:49 -04:00
this . ensureTabInitialized ( aChild ) ;
this . ensureTabInitialized ( aParent ) ;
2007-11-17 00:20:26 -05:00
if ( ! aInfo ) aInfo = { } ;
2007-11-14 14:34:36 -05:00
2007-11-17 00:20:26 -05:00
var id = aChild . getAttribute ( this . kID ) ;
2007-11-14 14:34:36 -05:00
2009-07-30 05:56:28 -04:00
this . partTab ( aChild , {
dontUpdateIndent : true
} ) ;
2007-11-17 00:20:26 -05:00
2009-04-20 08:03:38 -04:00
var children = aParent . getAttribute ( this . kCHILDREN )
. split ( '|' ) . filter ( function ( aId ) {
return this . getTabById ( aId ) ;
} , this ) ;
2007-11-17 00:20:26 -05:00
var newIndex ;
2009-04-20 08:03:38 -04:00
var oldIndex = children . indexOf ( id ) ;
2009-04-20 09:22:34 -04:00
if ( oldIndex > - 1 ) children . splice ( oldIndex , 1 ) ;
2007-11-17 00:20:26 -05:00
2009-08-03 17:53:08 -04:00
var insertBefore = aInfo . insertBefore ||
( aInfo . dontMove ? this . getNextTab ( aChild ) : null ) ;
2007-11-17 00:20:26 -05:00
var beforeTab = insertBefore ? insertBefore . getAttribute ( this . kID ) : null ;
2009-04-20 08:03:38 -04:00
var beforeIndex ;
if ( beforeTab && ( beforeIndex = children . indexOf ( beforeTab ) ) > - 1 ) {
children . splice ( beforeIndex , 0 , id ) ;
2007-11-17 00:20:26 -05:00
newIndex = insertBefore . _tPos ;
}
else {
2009-04-20 08:03:38 -04:00
children . push ( id ) ;
2009-07-30 05:56:28 -04:00
let refTab = aParent ;
let descendant = this . getDescendantTabs ( aParent ) ;
2007-11-17 00:20:26 -05:00
if ( descendant . length ) refTab = descendant [ descendant . length - 1 ] ;
newIndex = refTab . _tPos + 1 ;
}
2009-04-20 08:03:38 -04:00
this . setTabValue ( aParent , this . kCHILDREN , children . join ( '|' ) ) ;
2007-11-17 00:20:26 -05:00
this . setTabValue ( aChild , this . kPARENT , aParent . getAttribute ( this . kID ) ) ;
this . updateTabsCount ( aParent ) ;
2009-06-26 20:37:39 -04:00
if ( shouldInheritIndent && ! aInfo . dontUpdateIndent )
this . inheritTabIndent ( aChild , aParent ) ;
2007-11-17 00:20:26 -05:00
2009-07-30 05:56:28 -04:00
if ( ! aInfo . dontMove ) {
if ( newIndex > aChild . _tPos ) newIndex -- ;
this . moveTabSubTreeTo ( aChild , newIndex ) ;
}
2007-11-17 00:20:26 -05:00
if ( ! aInfo . dontExpand ) {
2009-04-20 08:03:38 -04:00
if ( this . getTreePref ( 'autoCollapseExpandSubTreeOnSelect' ) ) {
2007-11-17 00:20:26 -05:00
this . collapseExpandTreesIntelligentlyFor ( aParent ) ;
var p = aParent ;
do {
2009-08-26 05:33:54 -04:00
this . collapseExpandSubtree ( p , false , aInfo . dontAnimate ) ;
2007-11-17 00:20:26 -05:00
}
while ( p = this . getParentTab ( p ) ) ;
}
else if ( aParent . getAttribute ( this . kSUBTREE _COLLAPSED ) == 'true' ) {
if ( this . getTreePref ( 'autoExpandSubTreeOnAppendChild' ) ) {
var p = aParent ;
do {
2009-08-26 05:33:54 -04:00
this . collapseExpandSubtree ( p , false , aInfo . dontAnimate ) ;
2007-11-17 00:20:26 -05:00
}
while ( p = this . getParentTab ( p ) ) ;
}
else
2009-08-26 05:33:54 -04:00
this . collapseExpandTab ( aChild , true , aInfo . dontAnimate ) ;
2007-11-17 00:20:26 -05:00
}
if ( aParent . getAttribute ( this . kCOLLAPSED ) == 'true' )
2009-08-26 05:33:54 -04:00
this . collapseExpandTab ( aChild , true , aInfo . dontAnimate ) ;
2007-11-17 00:20:26 -05:00
}
else if ( aParent . getAttribute ( this . kSUBTREE _COLLAPSED ) == 'true' ||
aParent . getAttribute ( this . kCOLLAPSED ) == 'true' ) {
2009-08-26 05:33:54 -04:00
this . collapseExpandTab ( aChild , true , aInfo . dontAnimate ) ;
2007-11-17 00:20:26 -05:00
}
if ( ! aInfo . dontUpdateIndent ) {
2009-08-26 05:33:54 -04:00
this . updateTabsIndent ( [ aChild ] , undefined , undefined , aInfo . dontAnimate ) ;
2007-11-17 00:20:26 -05:00
this . checkTabsIndentOverflow ( ) ;
}
2008-02-28 02:45:39 -05:00
2009-05-15 13:17:57 -04:00
/* PUBLIC API */
2009-05-15 13:11:01 -04:00
var event = document . createEvent ( 'Events' ) ;
event . initEvent ( 'TreeStyleTabAttached' , true , true ) ;
event . parentTab = aParent ;
aChild . dispatchEvent ( event ) ;
2008-02-28 02:45:39 -05:00
} ,
2007-11-14 14:34:36 -05:00
2009-07-30 05:56:28 -04:00
partTab : function ( aChild , aInfo ) /* PUBLIC API */
2007-11-14 14:34:36 -05:00
{
2007-11-17 00:20:26 -05:00
if ( ! aChild ) return ;
2009-07-30 05:56:28 -04:00
if ( ! aInfo ) aInfo = { } ;
2007-11-14 14:34:36 -05:00
2007-11-17 00:20:26 -05:00
var parentTab = this . getParentTab ( aChild ) ;
if ( ! parentTab ) return ;
2007-11-14 14:34:36 -05:00
2007-11-17 00:20:26 -05:00
var id = aChild . getAttribute ( this . kID ) ;
2009-04-20 08:03:38 -04:00
this . setTabValue (
parentTab ,
this . kCHILDREN ,
parentTab . getAttribute ( this . kCHILDREN )
. split ( '|' )
. filter ( function ( aId ) {
return this . getTabById ( aId ) && aId != id ;
} , this ) . join ( '|' )
) ;
2007-11-26 16:17:46 -05:00
this . deleteTabValue ( aChild , this . kPARENT ) ;
2007-11-17 00:20:26 -05:00
this . updateTabsCount ( parentTab ) ;
2007-11-14 14:34:36 -05:00
2009-07-30 05:56:28 -04:00
if ( ! aInfo . dontUpdateIndent ) {
2009-08-26 05:33:54 -04:00
this . updateTabsIndent ( [ aChild ] , undefined , undefined , aInfo . dontAnimate ) ;
2007-11-17 00:20:26 -05:00
this . checkTabsIndentOverflow ( ) ;
}
2008-02-28 02:45:39 -05:00
2009-05-15 13:17:57 -04:00
/* PUBLIC API */
var event = document . createEvent ( 'Events' ) ;
event . initEvent ( 'TreeStyleTabParted' , true , true ) ;
aChild . dispatchEvent ( event ) ;
2009-07-23 12:26:33 -04:00
2009-07-23 12:28:31 -04:00
if ( this . isGroupTab ( parentTab ) && ! this . hasChildTabs ( parentTab ) ) {
2009-07-23 12:59:35 -04:00
window . setTimeout ( function ( aTabBrowser ) {
if ( parentTab . parentNode )
aTabBrowser . removeTab ( parentTab ) ;
parentTab = null ;
} , 0 , this . getTabBrowserFromChild ( parentTab ) ) ;
2009-07-23 12:26:33 -04:00
}
} ,
2009-08-09 19:47:51 -04:00
detachTab : function ( aChild , aInfo ) // alias (unstable API!)
2009-07-23 12:26:33 -04:00
{
2009-07-30 05:56:28 -04:00
return this . partTab ( aChild , aInfo ) ;
2007-11-14 14:34:36 -05:00
} ,
2007-11-17 00:20:26 -05:00
2009-04-07 13:58:58 -04:00
updateTabsIndent : function ( aTabs , aLevel , aProp , aJustNow )
2007-11-14 14:34:36 -05:00
{
2007-11-17 00:20:26 -05:00
if ( ! aTabs || ! aTabs . length ) return ;
if ( aLevel === void ( 0 ) ) {
var parentTab = this . getParentTab ( aTabs [ 0 ] ) ;
var aLevel = 0 ;
while ( parentTab )
2007-11-14 14:34:36 -05:00
{
2007-11-17 00:20:26 -05:00
aLevel ++ ;
parentTab = this . getParentTab ( parentTab ) ;
2007-11-14 14:34:36 -05:00
}
}
2007-11-17 00:20:26 -05:00
var b = this . mTabBrowser ;
if ( ! aProp ) {
2009-07-07 20:09:13 -04:00
let orient = this . isVertical ? 'vertical' : 'horizontal' ;
aProp = this . getTreePref ( 'enableSubtreeIndent.' + orient ) ? this . indentProp : null ;
2007-11-17 00:20:26 -05:00
}
2009-04-07 13:14:09 -04:00
var margin = this . indent < 0 ? this . baseIndent : this . indent ;
2007-11-17 00:20:26 -05:00
var indent = margin * aLevel ;
2008-02-22 02:44:06 -05:00
var multirow = this . isMultiRow ( ) ;
2009-04-07 13:14:09 -04:00
var topBottom = this . indentProp . match ( /top|bottom/ ) ;
2009-04-20 07:38:58 -04:00
var maxIndent = parseInt ( aTabs [ 0 ] . boxObject . height / 2 ) ;
2008-02-22 02:44:06 -05:00
2009-04-20 07:38:58 -04:00
Array . slice ( aTabs ) . forEach ( function ( aTab ) {
2009-05-06 22:19:10 -04:00
if ( ! aTab . parentNode ) return ; // ignore removed tabs
2008-02-22 02:44:06 -05:00
if ( multirow ) {
2008-02-22 03:50:18 -05:00
indent = Math . min ( aLevel * 3 , maxIndent ) ;
2009-05-12 08:23:51 -04:00
var colors = '-moz-border-' + topBottom + '-colors:' + ( function ( aNum ) {
2008-02-22 03:50:18 -05:00
var retVal = [ ] ;
for ( var i = 1 ; i < aNum ; i ++ )
{
retVal . push ( 'transparent' ) ;
}
retVal . push ( 'ThreeDShadow' ) ;
return retVal . length == 1 ? 'none' : retVal . join ( ' ' ) ;
} ) ( indent ) + ' !important;' ;
2009-04-20 07:38:58 -04:00
Array . slice ( document . getAnonymousNodes ( aTab ) ) . forEach ( function ( aBox ) {
if ( aBox . nodeType != Node . ELEMENT _NODE ) return ;
aBox . setAttribute (
'style' ,
aBox . getAttribute ( 'style' ) . replace ( /(-moz-)?border-(top|bottom)(-[^:]*)?.*:[^;]+;?/g , '' ) +
'; border-' + topBottom + ': solid transparent ' + indent + 'px !important;' + colors
) ;
} , this ) ;
2008-02-22 02:44:06 -05:00
}
else {
2009-04-20 07:38:58 -04:00
this . updateTabIndent ( aTab , aProp , indent , aJustNow ) ;
2008-02-22 02:44:06 -05:00
}
2009-04-20 07:38:58 -04:00
aTab . setAttribute ( this . kNEST , aLevel ) ;
2009-08-26 05:33:54 -04:00
this . updateTabsIndent ( this . getChildTabs ( aTab ) , aLevel + 1 , aProp , aJustNow ) ;
2009-04-20 07:38:58 -04:00
} , this ) ;
2007-11-14 14:34:36 -05:00
} ,
2009-04-20 10:10:58 -04:00
updateTabsIndentWithDelay : function ( aTabs )
2009-04-20 09:00:05 -04:00
{
if ( this . updateTabsIndentWithDelayTimer )
window . clearTimeout ( this . updateTabsIndentWithDelayTimer ) ;
2009-04-20 10:10:58 -04:00
this . updateTabsIndentWithDelayTabs = this . updateTabsIndentWithDelayTabs . concat ( aTabs ) ;
2009-04-20 09:00:05 -04:00
this . updateTabsIndentWithDelayTimer = window . setTimeout ( function ( aSelf ) {
2009-04-20 10:10:58 -04:00
var tabs = [ ] ;
aSelf . updateTabsIndentWithDelayTabs . forEach ( function ( aTab ) {
2009-05-06 22:19:10 -04:00
if ( tabs . indexOf ( aTab ) < 0 && aTab . parentNode ) tabs . push ( aTab ) ;
2009-04-20 10:10:58 -04:00
} ) ;
2009-04-22 07:32:39 -04:00
aSelf . updateTabsIndentWithDelayTabs = [ ] ;
2009-04-20 10:10:58 -04:00
aSelf . updateTabsIndent ( tabs ) ;
2009-04-20 09:00:05 -04:00
window . clearTimeout ( aSelf . updateTabsIndentWithDelayTimer ) ;
aSelf . updateTabsIndentWithDelayTimer = null ;
2009-05-13 02:09:17 -04:00
tabs = null ;
2009-04-20 09:00:05 -04:00
} , 0 , this ) ;
} ,
2009-04-20 10:10:58 -04:00
updateTabsIndentWithDelayTabs : [ ] ,
2009-04-20 09:00:05 -04:00
updateTabsIndentWithDelayTimer : null ,
2009-04-07 12:09:17 -04:00
2009-04-07 13:58:58 -04:00
updateTabIndent : function ( aTab , aProp , aIndent , aJustNow )
2009-04-07 12:09:17 -04:00
{
this . stopTabIndentAnimation ( aTab ) ;
2009-04-07 13:14:09 -04:00
var regexp = this . indentRulesRegExp ;
2009-04-07 12:09:17 -04:00
if (
! this . animationEnabled ||
2009-04-07 13:58:58 -04:00
aJustNow ||
2009-04-09 21:32:03 -04:00
this . indentDuration < 1 ||
2009-04-07 12:09:17 -04:00
! aProp ||
( aTab . getAttribute ( this . kCOLLAPSED ) == 'true' )
) {
aTab . setAttribute (
'style' ,
aTab . getAttribute ( 'style' )
2009-04-07 13:14:09 -04:00
. replace ( regexp , '' ) + ';' +
2009-04-07 12:09:17 -04:00
( aProp ? aProp + ':' + aIndent + 'px !important;' : '' )
) ;
return ;
}
var startIndent = this . getPropertyPixelValue ( aTab , aProp ) ;
var delta = aIndent - startIndent ;
2009-04-08 09:43:44 -04:00
var radian = 90 * Math . PI / 180 ;
2009-04-08 05:44:44 -04:00
var self = this ;
2009-04-09 21:32:03 -04:00
aTab . _ _treestyletab _ _updateTabIndentTask = function ( aTime , aBeginning , aChange , aDuration ) {
2009-04-08 09:43:44 -04:00
var indent , finished ;
2009-04-09 21:32:03 -04:00
if ( aTime >= aDuration ) {
2009-04-08 05:16:39 -04:00
delete aTab . _ _treestyletab _ _updateTabIndentTask ;
2009-04-08 09:43:44 -04:00
indent = aIndent ;
finished = true ;
2009-04-08 05:16:39 -04:00
}
else {
2009-04-09 21:32:03 -04:00
indent = startIndent + ( delta * Math . sin ( aTime / aDuration * radian ) ) ;
2009-04-08 09:43:44 -04:00
finished = false ;
2009-04-08 05:16:39 -04:00
}
2009-04-08 09:43:44 -04:00
aTab . setAttribute (
'style' ,
aTab . getAttribute ( 'style' ) . replace ( regexp , '' ) + ';' +
aProp + ':' + indent + 'px !important;'
) ;
2009-05-13 02:09:17 -04:00
if ( finished ) {
startIndent = null ;
delta = null ;
radian = null ;
self = null ;
aTab = null ;
}
2009-04-08 09:43:44 -04:00
return finished ;
2009-04-08 05:16:39 -04:00
} ;
2009-04-08 05:44:44 -04:00
window [ 'piro.sakura.ne.jp' ] . animationManager . addTask (
aTab . _ _treestyletab _ _updateTabIndentTask ,
2009-04-09 21:32:03 -04:00
0 , 0 , this . indentDuration
2009-04-08 05:44:44 -04:00
) ;
2009-04-07 12:09:17 -04:00
} ,
stopTabIndentAnimation : function ( aTab )
2009-04-07 10:44:39 -04:00
{
2009-04-08 05:44:44 -04:00
window [ 'piro.sakura.ne.jp' ] . animationManager . removeTask (
aTab . _ _treestyletab _ _updateTabIndentTask
) ;
2009-04-07 12:09:17 -04:00
} ,
inheritTabIndent : function ( aNewTab , aExistingTab )
{
2009-04-07 13:14:09 -04:00
var regexp = this . indentRulesRegExp ;
var indents = ( aExistingTab . getAttribute ( 'style' ) || '' ) . match ( regexp ) || [ ] ;
2009-04-07 12:09:17 -04:00
aNewTab . setAttribute (
'style' ,
aNewTab . getAttribute ( 'style' )
2009-04-07 13:14:09 -04:00
. replace ( regexp , '' ) + ';' + indents . join ( ';' )
2009-04-07 12:09:17 -04:00
) ;
2009-04-07 10:44:39 -04:00
} ,
2007-11-14 14:34:36 -05:00
2007-11-17 00:20:26 -05:00
updateAllTabsIndent : function ( )
2007-11-14 14:34:36 -05:00
{
2007-11-17 00:20:26 -05:00
this . updateTabsIndent ( this . rootTabs , 0 ) ;
// this.checkTabsIndentOverflow();
2007-11-14 14:34:36 -05:00
} ,
2007-11-17 00:20:26 -05:00
checkTabsIndentOverflow : function ( )
2007-11-14 14:34:36 -05:00
{
2007-11-17 00:20:26 -05:00
if ( this . checkTabsIndentOverflowTimer ) {
window . clearTimeout ( this . checkTabsIndentOverflowTimer ) ;
this . checkTabsIndentOverflowTimer = null ;
2007-11-14 14:34:36 -05:00
}
2007-11-17 00:20:26 -05:00
this . checkTabsIndentOverflowTimer = window . setTimeout ( function ( aSelf ) {
aSelf . checkTabsIndentOverflowCallback ( ) ;
} , 100 , this ) ;
2007-11-14 14:34:36 -05:00
} ,
2007-11-17 00:20:26 -05:00
checkTabsIndentOverflowTimer : null ,
checkTabsIndentOverflowCallback : function ( )
2007-11-14 14:34:36 -05:00
{
2007-11-17 00:20:26 -05:00
var b = this . mTabBrowser ;
var tabs = this . getArrayFromXPathResult ( this . evaluateXPath (
'child::xul:tab[@' + this . kNEST + ' and not(@' + this . kNEST + '="0" or @' + this . kNEST + '="")]' ,
b . mTabContainer
) ) ;
if ( ! tabs . length ) return ;
2007-11-14 14:34:36 -05:00
2007-11-17 00:20:26 -05:00
var self = this ;
tabs . sort ( function ( aA , aB ) { return Number ( aA . getAttribute ( self . kNEST ) ) - Number ( aB . getAttribute ( self . kNEST ) ) ; } ) ;
2008-10-17 08:35:55 -04:00
var nest = tabs [ tabs . length - 1 ] . getAttribute ( this . kNEST ) ;
2007-11-17 00:20:26 -05:00
if ( ! nest ) return ;
2007-11-14 14:34:36 -05:00
2009-04-07 13:14:09 -04:00
var oldIndent = this . indent ;
var indent = ( oldIndent < 0 ? this . baseIndent : oldIndent ) * nest ;
2009-07-07 04:30:30 -04:00
var maxIndentBase = Math . min (
this . getFirstTab ( b ) . boxObject [ this . invertedSizeProp ] ,
2009-05-12 15:09:13 -04:00
b . mTabContainer . boxObject [ this . invertedSizeProp ]
) ;
if ( ! this . isVertical ) {
if ( this . _horizontalTabMaxIndentBase )
maxIndentBase = this . _horizontalTabMaxIndentBase ;
else
this . _horizontalTabMaxIndentBase = maxIndentBase ;
}
var maxIndent = maxIndentBase * ( this . isVertical ? 0.33 : 0.5 ) ;
2007-11-14 14:34:36 -05:00
2009-04-07 13:14:09 -04:00
var indentUnit = Math . max ( Math . floor ( maxIndent / nest ) , 1 ) ;
2007-11-17 00:20:26 -05:00
if ( indent > maxIndent ) {
2009-04-07 13:14:09 -04:00
this . indent = indentUnit ;
2007-11-17 00:20:26 -05:00
}
else {
2009-04-07 13:14:09 -04:00
this . indent = - 1 ;
if ( ( this . baseIndent * nest ) > maxIndent )
this . indent = indentUnit ;
2007-11-17 00:20:26 -05:00
}
2007-11-14 14:34:36 -05:00
2009-04-07 13:14:09 -04:00
if ( oldIndent != this . indent ) {
2007-11-17 00:20:26 -05:00
this . updateAllTabsIndent ( ) ;
}
} ,
2009-05-12 15:09:13 -04:00
_horizontalTabMaxIndentBase : 0 ,
2007-11-17 00:20:26 -05:00
updateTabsCount : function ( aTab , aDontUpdateAncestor )
{
var count = document . getAnonymousElementByAttribute ( aTab , 'class' , this . kCOUNTER ) ;
if ( count ) {
count . setAttribute ( 'value' , '(' + this . getDescendantTabs ( aTab ) . length + ')' ) ;
}
var parent = this . getParentTab ( aTab ) ;
if ( parent && ! aDontUpdateAncestor )
this . updateTabsCount ( parent ) ;
} ,
/* move */
moveTabSubTreeTo : function ( aTab , aIndex )
{
if ( ! aTab ) return ;
2007-11-14 14:34:36 -05:00
2007-11-17 00:20:26 -05:00
var b = this . mTabBrowser ;
this . isSubTreeMoving = true ;
2007-11-14 14:34:36 -05:00
2007-11-17 00:20:26 -05:00
this . internallyTabMoving = true ;
b . moveTabTo ( aTab , aIndex ) ;
this . internallyTabMoving = false ;
2007-11-14 14:34:36 -05:00
2007-11-17 00:20:26 -05:00
this . isSubTreeChildrenMoving = true ;
this . internallyTabMoving = true ;
2009-04-20 09:30:54 -04:00
this . getDescendantTabs ( aTab ) . forEach ( function ( aDescendantTab , aIndex ) {
b . moveTabTo ( aDescendantTab , aTab . _tPos + aIndex + ( aTab . _tPos < aDescendantTab . _tPos ? 1 : 0 ) ) ;
2009-04-20 07:38:58 -04:00
} , this ) ;
2007-11-17 00:20:26 -05:00
this . internallyTabMoving = false ;
this . isSubTreeChildrenMoving = false ;
2007-11-14 14:34:36 -05:00
2007-11-17 00:20:26 -05:00
this . isSubTreeMoving = false ;
} ,
moveTabLevel : function ( aEvent )
{
var b = this . mTabBrowser ;
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 ) ;
this . internallyTabMoving = true ;
if ( nextTab ) {
b . moveTabTo ( b . mCurrentTab , nextTab . _tPos - 1 ) ;
}
else {
2009-01-26 01:37:29 -05:00
b . moveTabTo ( b . mCurrentTab , this . getLastTab ( b ) . _tPos ) ;
2007-11-17 00:20:26 -05:00
}
this . internallyTabMoving = false ;
b . mCurrentTab . focus ( ) ;
return true ;
}
}
return false ;
} ,
/* collapse/expand */
2008-12-01 03:30:36 -05:00
2009-05-15 11:51:12 -04:00
collapseExpandSubtree : function ( aTab , aCollapse , aJustNow ) /* PUBLIC API */
2007-11-17 00:20:26 -05:00
{
if ( ! aTab ) return ;
2007-11-14 14:34:36 -05:00
2007-11-17 00:20:26 -05:00
if ( ( aTab . getAttribute ( this . kSUBTREE _COLLAPSED ) == 'true' ) == aCollapse ) return ;
2007-11-14 14:34:36 -05:00
2007-11-17 00:20:26 -05:00
var b = this . mTabBrowser ;
this . doingCollapseExpand = true ;
2007-11-14 14:34:36 -05:00
2007-11-17 00:20:26 -05:00
this . setTabValue ( aTab , this . kSUBTREE _COLLAPSED , aCollapse ) ;
2007-11-14 14:34:36 -05:00
2009-04-20 07:38:58 -04:00
this . getChildTabs ( aTab ) . forEach ( function ( aTab ) {
this . collapseExpandTab ( aTab , aCollapse , aJustNow ) ;
} , this ) ;
2007-11-14 14:34:36 -05:00
2007-11-17 00:20:26 -05:00
if ( ! aCollapse )
this . scrollToTabSubTree ( aTab ) ;
this . doingCollapseExpand = false ;
2007-11-14 14:34:36 -05:00
} ,
2007-11-17 00:20:26 -05:00
2009-04-07 13:58:58 -04:00
collapseExpandTab : function ( aTab , aCollapse , aJustNow )
2007-11-14 14:34:36 -05:00
{
2007-11-23 15:45:38 -05:00
if ( ! aTab || ! this . getParentTab ( aTab ) ) return ;
2007-11-14 14:34:36 -05:00
2007-11-17 00:20:26 -05:00
this . setTabValue ( aTab , this . kCOLLAPSED , aCollapse ) ;
2009-04-07 13:58:58 -04:00
this . updateTabCollapsed ( aTab , aCollapse , aJustNow ) ;
2007-11-14 14:34:36 -05:00
2009-05-15 11:51:12 -04:00
/* PUBLIC API */
2009-03-25 09:26:41 -04:00
var event = document . createEvent ( 'Events' ) ;
event . initEvent ( 'TreeStyleTabCollapsedStateChange' , true , true ) ;
event . collapsed = aCollapse ;
aTab . dispatchEvent ( event ) ;
2007-11-17 00:20:26 -05:00
var b = this . mTabBrowser ;
2008-07-30 14:03:44 -04:00
var parent ;
if ( aCollapse && aTab == b . selectedTab && ( parent = this . getParentTab ( aTab ) ) ) {
var newSelection = parent ;
while ( parent . getAttribute ( this . kCOLLAPSED ) == 'true' )
{
parent = this . getParentTab ( parent ) ;
if ( ! parent ) break ;
newSelection = parent ;
}
b . selectedTab = newSelection ;
2007-11-14 14:34:36 -05:00
}
2007-11-17 00:20:26 -05:00
2009-04-20 07:38:58 -04:00
if ( aTab . getAttribute ( this . kSUBTREE _COLLAPSED ) != 'true' ) {
this . getChildTabs ( aTab ) . forEach ( function ( aTab ) {
this . collapseExpandTab ( aTab , aCollapse , aJustNow ) ;
} , this ) ;
2007-11-14 14:34:36 -05:00
}
} ,
2009-04-07 13:19:30 -04:00
updateTabCollapsed : function ( aTab , aCollapsed , aJustNow )
2009-04-07 13:14:09 -04:00
{
this . stopTabCollapseAnimation ( aTab ) ;
2009-04-08 11:00:21 -04:00
aTab . removeAttribute ( this . kX _OFFSET ) ;
aTab . removeAttribute ( this . kY _OFFSET ) ;
2009-04-07 13:19:30 -04:00
if (
! this . animationEnabled ||
2009-04-08 01:36:02 -04:00
aJustNow ||
2009-04-09 21:32:03 -04:00
this . collapseDuration < 1 ||
2009-05-12 14:59:05 -04:00
// !this.isVertical ||
2009-04-14 03:30:55 -04:00
this . mTabBrowser . getAttribute ( this . kALLOW _COLLAPSE ) != 'true'
2009-04-07 13:19:30 -04:00
) {
2009-04-07 13:14:09 -04:00
aTab . setAttribute (
'style' ,
aTab . getAttribute ( 'style' )
2009-05-13 02:09:17 -04:00
. replace ( this . collapseRulesRegExp , '' )
2009-04-07 13:14:09 -04:00
. replace ( this . kOPACITY _RULE _REGEXP , '' )
) ;
aTab . removeAttribute ( this . kCOLLAPSING ) ;
if ( aCollapsed )
aTab . setAttribute ( this . kCOLLAPSED _DONE , true ) ;
else
aTab . removeAttribute ( this . kCOLLAPSED _DONE ) ;
return ;
}
2009-04-08 11:00:21 -04:00
var maxMargin ;
var offsetAttr ;
2009-05-13 02:47:06 -04:00
let ( firstTab ) {
firstTab = this . getFirstTab ( this . mTabBrowser ) ;
if ( this . isVertical ) {
maxMargin = firstTab . boxObject . height ;
offsetAttr = this . kY _OFFSET ;
if ( firstTab . style . height )
aTab . style . height = firstTab . style . height ;
}
else {
maxMargin = firstTab . boxObject . width ;
offsetAttr = this . kX _OFFSET ;
if ( firstTab . style . width )
aTab . style . width = firstTab . style . width ;
}
2009-04-08 11:00:21 -04:00
}
2009-04-08 09:43:44 -04:00
var startMargin , endMargin , startOpacity , endOpacity ;
if ( aCollapsed ) {
startMargin = 0 ;
2009-04-08 11:00:21 -04:00
endMargin = maxMargin ;
2009-04-08 09:43:44 -04:00
startOpacity = 1 ;
endOpacity = 0 ;
}
else {
2009-04-08 11:16:34 -04:00
aTab . setAttribute ( offsetAttr , maxMargin ) ;
2009-04-08 11:00:21 -04:00
startMargin = maxMargin ;
2009-04-08 09:43:44 -04:00
endMargin = 0 ;
startOpacity = 0 ;
endOpacity = 1 ;
}
2009-04-07 13:14:09 -04:00
var deltaMargin = endMargin - startMargin ;
var deltaOpacity = endOpacity - startOpacity ;
var collapseProp = this . collapseProp ;
aTab . setAttribute ( this . kCOLLAPSING , true ) ;
aTab . setAttribute (
'style' ,
aTab . getAttribute ( 'style' )
2009-05-13 02:09:17 -04:00
. replace ( this . collapseRulesRegExp , '' ) + ';' +
2009-04-07 13:14:09 -04:00
collapseProp + ': -' + startMargin + 'px !important;' +
'opacity: ' + startOpacity + ' !important;'
) ;
2009-04-08 11:00:21 -04:00
2009-04-07 13:14:09 -04:00
if ( ! aCollapsed ) aTab . removeAttribute ( this . kCOLLAPSED _DONE ) ;
2009-04-08 09:43:44 -04:00
var radian = 90 * Math . PI / 180 ;
var self = this ;
2009-04-09 21:32:03 -04:00
aTab . _ _treestyletab _ _updateTabCollapsedTask = function ( aTime , aBeginning , aChange , aDuration ) {
2009-05-12 13:35:06 -04:00
// If this is the last tab, negative scroll happens.
// Then, we shouldn't do animation.
var stopAnimation = false ;
var scrollBox = self . scrollBox ;
if ( scrollBox ) {
if ( scrollBox . _scrollbox ) scrollBox = scrollBox . _scrollbox ;
if ( 'scrollTop' in scrollBox &&
( scrollBox . scrollTop < 0 || scrollBox . scrollLeft < 0 ) ) {
scrollBox . scrollTop = 0 ;
scrollBox . scrollLeft = 0 ;
stopAnimation = true ;
}
}
if ( aTime >= aDuration || stopAnimation ) {
2009-04-08 09:43:44 -04:00
delete aTab . _ _treestyletab _ _updateTabCollapsedTask ;
2009-04-08 05:16:39 -04:00
aTab . removeAttribute ( self . kCOLLAPSING ) ;
2009-04-08 11:00:21 -04:00
if ( aCollapsed ) aTab . setAttribute ( self . kCOLLAPSED _DONE , true ) ;
2009-04-07 13:14:09 -04:00
aTab . setAttribute (
'style' ,
aTab . getAttribute ( 'style' )
2009-05-13 02:09:17 -04:00
. replace ( self . collapseRulesRegExp , '' )
2009-04-08 05:16:39 -04:00
. replace ( self . kOPACITY _RULE _REGEXP , '' )
2009-04-07 13:14:09 -04:00
) ;
2009-04-08 11:00:21 -04:00
aTab . removeAttribute ( offsetAttr ) ;
2009-05-13 02:09:17 -04:00
maxMargin = null ;
offsetAttr = null ;
startMargin = null ;
endMargin = null ;
startOpacity = null ;
endOpacity = null ;
deltaMargin = null ;
deltaOpacity = null ;
collapseProp = null ;
radian = null ;
self = null ;
aTab = null ;
2009-04-08 05:16:39 -04:00
return true ;
2009-04-07 13:14:09 -04:00
}
2009-04-08 05:16:39 -04:00
else {
2009-04-09 21:32:03 -04:00
var power = Math . sin ( aTime / aDuration * radian ) ;
2009-04-08 09:43:44 -04:00
var margin = startMargin + ( deltaMargin * power ) ;
var opacity = startOpacity + ( deltaOpacity * power ) ;
aTab . setAttribute (
'style' ,
aTab . getAttribute ( 'style' )
2009-05-13 02:09:17 -04:00
. replace ( self . collapseRulesRegExp , '' ) + ';' +
2009-04-08 09:43:44 -04:00
collapseProp + ': -' + margin + 'px !important;' +
'opacity: ' + opacity + ' !important;'
) ;
2009-04-08 11:16:34 -04:00
aTab . setAttribute ( offsetAttr , maxMargin ) ;
2009-04-08 05:16:39 -04:00
return false ;
}
} ;
2009-04-08 05:44:44 -04:00
window [ 'piro.sakura.ne.jp' ] . animationManager . addTask (
aTab . _ _treestyletab _ _updateTabCollapsedTask ,
2009-04-09 21:32:03 -04:00
0 , 0 , this . collapseDuration
2009-04-08 05:44:44 -04:00
) ;
2009-04-07 13:14:09 -04:00
} ,
kOPACITY _RULE _REGEXP : /opacity\s*:[^;]+;?/ ,
stopTabCollapseAnimation : function ( aTab )
{
2009-04-08 05:44:44 -04:00
window [ 'piro.sakura.ne.jp' ] . animationManager . removeTask (
aTab . _ _treestyletab _ _updateTabCollapsedTask
) ;
2009-04-07 13:14:09 -04:00
} ,
2007-11-14 14:34:36 -05:00
2009-04-07 13:58:58 -04:00
collapseExpandTreesIntelligentlyFor : function ( aTab , aJustNow )
2007-11-14 14:34:36 -05:00
{
2009-08-14 02:12:08 -04:00
if ( ! aTab || this . doingCollapseExpand ) return ;
2007-11-14 14:34:36 -05:00
2009-08-14 02:12:08 -04:00
var b = this . mTabBrowser ;
2007-11-17 00:20:26 -05:00
var sameParentTab = this . getParentTab ( aTab ) ;
var expandedParentTabs = [
aTab . getAttribute ( this . kID )
] ;
var parentTab = aTab ;
while ( parentTab = this . getParentTab ( parentTab ) )
{
expandedParentTabs . push ( parentTab . getAttribute ( this . kID ) ) ;
2007-11-14 14:34:36 -05:00
}
2007-11-17 00:20:26 -05:00
expandedParentTabs = expandedParentTabs . join ( '|' ) ;
2007-11-14 14:34:36 -05:00
2007-11-17 00:20:26 -05:00
var xpathResult = this . evaluateXPath (
'child::xul:tab[@' + this . kCHILDREN + ' and not(@' + this . kCOLLAPSED + '="true") and not(@' + this . kSUBTREE _COLLAPSED + '="true") and @' + this . kID + ' 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 ) ;
2007-11-14 14:34:36 -05:00
2007-11-17 00:20:26 -05:00
parentTab = this . getParentTab ( collapseTab ) ;
if ( parentTab ) {
dontCollapse = true ;
if ( parentTab . getAttribute ( this . kSUBTREE _COLLAPSED ) != 'true' ) {
do {
if ( expandedParentTabs . indexOf ( parentTab . getAttribute ( this . kID ) ) < 0 )
continue ;
dontCollapse = false ;
break ;
}
while ( parentTab = this . getParentTab ( parentTab ) ) ;
}
2007-11-14 14:34:36 -05:00
}
2007-11-17 00:20:26 -05:00
if ( ! dontCollapse )
2009-04-07 13:58:58 -04:00
this . collapseExpandSubtree ( collapseTab , true , aJustNow ) ;
2007-11-14 14:34:36 -05:00
}
2007-11-17 00:20:26 -05:00
2009-04-07 13:58:58 -04:00
this . collapseExpandSubtree ( aTab , false , aJustNow ) ;
2007-11-14 14:34:36 -05:00
} ,
2009-04-20 10:10:58 -04:00
collapseExpandTreesIntelligentlyWithDelayFor : function ( aTab )
{
2009-04-25 02:20:09 -04:00
if ( this . doingCollapseExpand ) return ;
2009-04-20 10:10:58 -04:00
if ( this . cETIWDFTimer )
window . clearTimeout ( this . cETIWDFTimer ) ;
this . cETIWDFTimer = window . setTimeout ( function ( aSelf ) {
window . clearTimeout ( aSelf . cETIWDFTimer ) ;
aSelf . cETIWDFTimer = null ;
aSelf . collapseExpandTreesIntelligentlyFor ( aTab ) ;
} , 0 , this ) ;
} ,
cETIWDFTimer : null ,
2007-11-14 14:34:36 -05:00
2009-07-03 05:58:34 -04:00
collapseExpandAllSubtree : function ( aCollapse , aJustNow )
2007-11-14 14:34:36 -05:00
{
2007-11-17 00:20:26 -05:00
var xpathResult = this . evaluateXPath (
'child::xul:tab[@' + this . kID + ' and @' + this . kCHILDREN +
(
aCollapse ?
' and not(@' + this . kSUBTREE _COLLAPSED + '="true")' :
' and @' + this . kSUBTREE _COLLAPSED + '="true"'
) +
']' ,
this . mTabBrowser . mTabContainer
) ;
for ( var i = 0 , maxi = xpathResult . snapshotLength ; i < maxi ; i ++ )
2007-11-14 14:34:36 -05:00
{
2009-07-03 05:58:34 -04:00
this . collapseExpandSubtree ( xpathResult . snapshotItem ( i ) , aCollapse , aJustNow ) ;
2007-11-14 14:34:36 -05:00
}
2007-11-17 00:20:26 -05:00
} ,
/* scroll */
2008-12-01 03:30:36 -05:00
2007-11-17 00:20:26 -05:00
scrollTo : function ( aEndX , aEndY )
{
2009-04-08 12:00:51 -04:00
if ( this . animationEnabled || this . smoothScrollEnabled ) {
2007-11-17 00:20:26 -05:00
this . smoothScrollTo ( aEndX , aEndY ) ;
2007-11-14 14:34:36 -05:00
}
else {
2007-11-17 00:20:26 -05:00
try {
2008-06-20 01:57:38 -04:00
this . scrollBoxObject . scrollTo ( aEndX , aEndY ) ;
2007-11-17 00:20:26 -05:00
}
catch ( e ) {
2007-11-14 14:34:36 -05:00
}
}
} ,
2008-12-01 03:30:36 -05:00
2007-11-17 00:20:26 -05:00
smoothScrollTo : function ( aEndX , aEndY )
2007-11-14 14:34:36 -05:00
{
var b = this . mTabBrowser ;
2009-04-08 06:03:17 -04:00
window [ 'piro.sakura.ne.jp' ] . animationManager . removeTask ( this . smoothScrollTask ) ;
2007-11-14 14:34:36 -05:00
2008-06-20 01:57:38 -04:00
var scrollBoxObject = this . scrollBoxObject ;
2007-11-17 00:20:26 -05:00
var x = { } , y = { } ;
scrollBoxObject . getPosition ( x , y ) ;
2009-04-08 06:03:17 -04:00
var startX = x . value ;
var startY = y . value ;
var deltaX = aEndX - startX ;
var deltaY = aEndY - startY ;
2007-11-14 14:34:36 -05:00
2009-04-08 09:43:44 -04:00
var radian = 90 * Math . PI / 180 ;
2009-04-08 06:03:17 -04:00
var self = this ;
2009-04-09 21:32:03 -04:00
this . smoothScrollTask = function ( aTime , aBeginning , aChange , aDuration ) {
2009-04-08 06:03:17 -04:00
var scrollBoxObject = self . scrollBoxObject ;
2009-04-09 21:32:03 -04:00
if ( aTime >= aDuration ) {
2009-04-08 06:03:17 -04:00
scrollBoxObject . scrollTo ( aEndX , aEndY ) ;
2009-05-13 02:09:17 -04:00
b = null ;
scrollBoxObject = null ;
x = null ;
y = null ;
startX = null ;
startY = null ;
radian = null ;
self = null ;
2009-04-08 06:03:17 -04:00
return true ;
}
2007-11-14 14:34:36 -05:00
2009-04-09 21:32:03 -04:00
var power = Math . sin ( aTime / aDuration * radian ) ;
2009-04-08 09:43:44 -04:00
var newX = startX + parseInt ( deltaX * power ) ;
var newY = startY + parseInt ( deltaY * power ) ;
2007-11-14 14:34:36 -05:00
2009-04-08 06:03:17 -04:00
var x = { } , y = { } ;
scrollBoxObject . getPosition ( x , y ) ;
2007-11-14 14:34:36 -05:00
2009-04-08 06:03:17 -04:00
var w = { } , h = { } ;
scrollBoxObject . getScrolledSize ( w , h ) ;
var maxX = Math . max ( 0 , w . value - scrollBoxObject . width ) ;
var maxY = Math . max ( 0 , h . value - scrollBoxObject . height ) ;
scrollBoxObject . scrollTo ( newX , newY ) ;
return false ;
} ;
window [ 'piro.sakura.ne.jp' ] . animationManager . addTask (
this . smoothScrollTask ,
2009-04-09 21:32:03 -04:00
0 , 0 , this . smoothScrollDuration
2009-04-08 06:03:17 -04:00
) ;
2007-11-17 00:20:26 -05:00
} ,
2009-04-08 06:03:17 -04:00
smoothScrollTask : null ,
2007-11-17 00:20:26 -05:00
scrollToTab : function ( aTab )
{
if ( ! aTab || this . isTabInViewport ( aTab ) ) return ;
2007-11-14 14:34:36 -05:00
2007-11-17 00:20:26 -05:00
var b = this . mTabBrowser ;
2007-11-14 14:34:36 -05:00
2008-06-20 01:57:38 -04:00
var scrollBoxObject = this . scrollBoxObject ;
2007-11-17 00:20:26 -05:00
var w = { } , h = { } ;
try {
scrollBoxObject . getScrolledSize ( w , h ) ;
}
catch ( e ) { // Tab Mix Plus
return ;
2007-11-14 14:34:36 -05:00
}
2007-11-17 00:20:26 -05:00
var targetTabBox = aTab . boxObject ;
var baseTabBox = aTab . parentNode . firstChild . boxObject ;
2007-11-14 14:34:36 -05:00
2009-04-08 11:16:34 -04:00
var xOffset = this . getXOffsetOfTab ( aTab ) ;
var yOffset = this . getYOffsetOfTab ( aTab ) ;
2007-11-17 00:20:26 -05:00
2009-04-08 11:16:34 -04:00
var targetX = ( aTab . boxObject . screenX + xOffset < scrollBoxObject . screenX ) ?
( targetTabBox . screenX + xOffset - baseTabBox . screenX ) - ( targetTabBox . width * 0.5 ) :
( targetTabBox . screenX + xOffset - baseTabBox . screenX ) - scrollBoxObject . width + ( targetTabBox . width * 1.5 ) ;
var targetY = ( aTab . boxObject . screenY + yOffset < scrollBoxObject . screenY ) ?
( targetTabBox . screenY + yOffset - baseTabBox . screenY ) - ( targetTabBox . height * 0.5 ) :
( targetTabBox . screenY + yOffset - baseTabBox . screenY ) - scrollBoxObject . height + ( targetTabBox . height * 1.5 ) ;
2007-11-17 00:20:26 -05:00
this . scrollTo ( targetX , targetY ) ;
} ,
scrollToTabSubTree : function ( aTab )
{
var b = this . mTabBrowser ;
var descendant = this . getDescendantTabs ( aTab ) ;
var lastVisible = aTab ;
for ( var i = descendant . length - 1 ; i > - 1 ; i -- )
{
if ( descendant [ i ] . getAttribute ( this . kCOLLAPSED ) == 'true' ) continue ;
lastVisible = descendant [ i ] ;
break ;
}
2007-11-14 14:34:36 -05:00
2008-06-18 22:11:00 -04:00
if ( this . isTabInViewport ( aTab ) && this . isTabInViewport ( lastVisible ) ) {
return ;
}
2007-11-17 00:20:26 -05:00
var containerPosition = b . mStrip . boxObject [ this . positionProp ] ;
var containerSize = b . mStrip . boxObject [ this . sizeProp ] ;
var parentPosition = aTab . boxObject [ this . positionProp ] ;
var lastPosition = lastVisible . boxObject [ this . positionProp ] ;
var tabSize = lastVisible . boxObject [ this . sizeProp ] ;
2007-11-14 14:34:36 -05:00
2007-11-17 00:20:26 -05:00
if ( lastPosition - parentPosition + tabSize > containerSize - tabSize ) { // out of screen
2009-01-26 01:39:51 -05:00
var endPos = parentPosition - this . getFirstTab ( b ) . boxObject [ this . positionProp ] - tabSize * 0.5 ;
2007-11-17 00:20:26 -05:00
var endX = this . isVertical ? 0 : endPos ;
var endY = this . isVertical ? endPos : 0 ;
this . scrollTo ( endX , endY ) ;
}
else if ( ! this . isTabInViewport ( aTab ) && this . isTabInViewport ( lastVisible ) ) {
this . scrollToTab ( aTab ) ;
}
else if ( this . isTabInViewport ( aTab ) && ! this . isTabInViewport ( lastVisible ) ) {
this . scrollToTab ( lastVisible ) ;
}
else if ( parentPosition < containerPosition ) {
this . scrollToTab ( aTab ) ;
}
else {
this . scrollToTab ( lastVisible ) ;
2007-11-14 14:34:36 -05:00
}
} ,
2007-11-17 00:20:26 -05:00
2009-09-03 02:24:06 -04:00
/* show/hide tab bar (backward compatibility) */
get tabbarShown ( ) { return this . autoHide . tabbarShown ; } ,
set tabbarShown ( aValue ) { return this . autoHide . tabbarShown = aValue ; } ,
get tabbarExpanded ( ) { return this . autoHide . tabbarExpanded ; } ,
set tabbarExpanded ( aValue ) { return this . autoHide . tabbarExpanded = aValue ; } ,
get togglerSize ( ) { return this . autoHide . togglerSize ; } ,
set togglerSize ( aValue ) { return this . autoHide . togglerSize = aValue ; } ,
get sensitiveArea ( ) { return this . autoHide . sensitiveArea ; } ,
set sensitiveArea ( aValue ) { return this . autoHide . sensitiveArea = aValue ; } ,
get lastMouseDownTarget ( ) { return this . autoHide . lastMouseDownTarget ; } ,
set lastMouseDownTarget ( aValue ) { return this . autoHide . lastMouseDownTarget = aValue ; } ,
get tabbarWidth ( ) { return this . autoHide . tabbarWidth ; } ,
set tabbarWidth ( aValue ) { return this . autoHide . tabbarWidth = aValue ; } ,
get tabbarHeight ( ) { return this . autoHide . tabbarHeight ; } ,
set tabbarHeight ( aValue ) { return this . autoHide . tabbarHeight = aValue ; } ,
get splitterWidth ( ) { return this . autoHide . splitterWidth ; } ,
set autoHideShown ( ) { return this . autoHide . shown ; } ,
set autoHideShown ( aValue ) { return this . autoHide . shown = aValue ; } ,
set autoHideXOffset ( ) { return this . autoHide . XOffset ; } ,
set autoHideYOffset ( ) { return this . autoHide . YOffset ; } ,
get autoHideMode ( ) { return this . autoHide . mode ; } ,
set autoHideMode ( aValue ) { return this . autoHide . mode = aValue ; } ,
updateAutoHideMode : function ( ) { this . autoHide . updateAutoHideMode ( ) ; } ,
showHideTabbarInternal : function ( aReason ) { this . autoHide . showHideTabbarInternal ( aReason ) ; } ,
showTabbar : function ( aReason ) { this . autoHide . showTabbar ( aReason ) ; } ,
hideTabbar : function ( aReason ) { this . autoHide . hideTabbar ( aReason ) ; } ,
redrawContentArea : function ( ) { this . autoHide . redrawContentArea ( ) ; } ,
drawTabbarCanvas : function ( ) { this . autoHide . drawTabbarCanvas ( ) ; } ,
get splitterBorderColor ( ) { this . autoHide . splitterBorderColor ; } ,
clearTabbarCanvas : function ( ) { this . autoHide . clearTabbarCanvas ( ) ; } ,
updateTabbarTransparency : function ( ) { this . autoHide . updateTabbarTransparency ( ) ; } ,
get autoHideEnabled ( ) { return this . autoHide . enabled ; } ,
set autoHideEnabled ( aValue ) { return this . autoHide . enabled = aValue ; } ,
startAutoHide : function ( ) { this . autoHide . start ( ) ; } ,
endAutoHide : function ( ) { this . autoHide . end ( ) ; } ,
startAutoHideForFullScreen : function ( ) { this . autoHide . startForFullScreen ( ) ; } ,
endAutoHideForFullScreen : function ( ) { this . autoHide . endForFullScreen ( ) ; } ,
startListenMouseMove : function ( ) { this . autoHide . startListenMouseMove ( ) ; } ,
endListenMouseMove : function ( ) { this . autoHide . endListenMouseMove ( ) ; } ,
get shouldListenMouseMove ( ) { return this . autoHide . shouldListenMouseMove ; } ,
showHideTabbarOnMousemove : function ( ) { this . autoHide . showHideTabbarOnMousemove ( ) ; } ,
cancelShowHideTabbarOnMousemove : function ( ) { this . autoHide . cancelShowHideTabbarOnMousemove ( ) ; } ,
showTabbarForFeedback : function ( ) { this . autoHide . showTabbarForFeedback ( ) ; } ,
delayedShowTabbarForFeedback : function ( ) { this . autoHide . delayedShowTabbarForFeedback ( ) ; } ,
cancelHideTabbarForFeedback : function ( ) { this . autoHide . cancelHideTabbarForFeedback ( ) ; }
2008-03-09 23:51:21 -04:00
2007-11-14 14:34:36 -05:00
} ;
TreeStyleTabBrowser . prototype . _ _proto _ _ = TreeStyleTabService ;