diff --git a/content/treestyletab/treestyletab.js b/content/treestyletab/treestyletab.js index a761430f..fcf3ecf7 100644 --- a/content/treestyletab/treestyletab.js +++ b/content/treestyletab/treestyletab.js @@ -1192,6 +1192,7 @@ catch(e) { aSelf.setTreePref('tabbar.width', box.width); } } + b.treeStyleTab.updateTabbarSize(); b.treeStyleTab.clickedOnTabbarResizerGrippy = false; }, 10, this); }, diff --git a/content/treestyletab/treestyletabbrowser.js b/content/treestyletab/treestyletabbrowser.js index f68eb003..0c3bab9e 100644 --- a/content/treestyletab/treestyletabbrowser.js +++ b/content/treestyletab/treestyletabbrowser.js @@ -75,6 +75,12 @@ TreeStyleTabBrowser.prototype = { .QueryInterface(Components.interfaces.nsIScrollBoxObject); // Tab Mix Plus (ensure scrollbox-ed) }, + get splitter() + { + return document.getAnonymousElementByAttribute(this.mTabBrowser, 'class', this.kSPLITTER) || + document.getAnonymousElementByAttribute(this.mTabBrowser, 'id', 'tabkit-splitter'); // Tab Kit + }, + /* utils */ /* get tab contents */ @@ -176,7 +182,7 @@ TreeStyleTabBrowser.prototype = { } placeholder = document.getAnonymousElementByAttribute(b, 'class', 'tabbrowser-strip'); if (!placeholder) { - placeholder = document.createElement('spacer'); + placeholder = document.createElement('hbox'); placeholder.setAttribute('class', 'tabbrowser-strip'); b.mTabBox.insertBefore(placeholder, toggler.nextSibling); this.placeholder = placeholder; @@ -212,6 +218,9 @@ TreeStyleTabBrowser.prototype = { b.mPanelContainer.addEventListener('dragover', this, false); b.mPanelContainer.addEventListener('dragdrop', this, false); + if (this.placeholder) + window.addEventListener('resize', this, true); + b.addEventListener('MultipleTabHandlerTabsClosing', this, false); @@ -1095,12 +1104,17 @@ TreeStyleTabBrowser.prototype = { _ensureNewSplitter : function TSTBrowser__ensureNewSplitter() { - var splitter = document.getAnonymousElementByAttribute(this.mTabBrowser, 'class', this.kSPLITTER) || - document.getAnonymousElementByAttribute(this.mTabBrowser, 'id', 'tabkit-splitter'); // Tab Kit + var splitter = this.splitter; // We always have to re-create splitter, because its "collapse" // behavior becomes broken by repositioning of the tab bar. if (splitter) { + try { + splitter.removeEventListener('mouseup', this, false); + splitter.removeEventListener('click', this, false); + } + catch(e) { + } let oldSplitter = splitter; splitter = oldSplitter.cloneNode(true); oldSplitter.parentNode.removeChild(oldSplitter); @@ -1116,6 +1130,9 @@ TreeStyleTabBrowser.prototype = { splitterClass += (splitterClass ? ' ' : '' ) + this.kSPLITTER; splitter.setAttribute('class', splitterClass); + splitter.addEventListener('mouseup', this, false); + splitter.addEventListener('click', this, false); + var ref = this.mTabBrowser.mPanelContainer; ref.parentNode.insertBefore(splitter, ref); @@ -1138,15 +1155,22 @@ TreeStyleTabBrowser.prototype = { this.setTabbarAttribute(this.kFIXED, true, b); if (!this.isMultiRow()) { this.tabStrip.removeAttribute('height'); + if (this.placeholder) + this.placeholder.removeAttribute('height'); b.mPanelContainer.removeAttribute('height'); } } else { this.setTabbarAttribute(this.kFIXED, null, b); - this.tabStrip.setAttribute('height', this.getTreePref('tabbar.height')); + let h = this.getTreePref('tabbar.height'); + this.tabStrip.setAttribute('height', h); + if (this.placeholder) + this.placeholder.setAttribute('height', h); } } + this.updateTabbarSize(); + this.setTabbarAttribute(this.kINDENTED, this.getTreePref('enableSubtreeIndent.'+orient) ? 'true' : null , b); this.setTabbarAttribute(this.kALLOW_COLLAPSE, this.getTreePref('allowSubtreeCollapseExpand.'+orient) ? 'true' : null , b); this.setTabbarAttribute(this.kHIDE_ALLTABS, this.getTreePref('tabbar.hideAlltabsButton.'+orient) ? 'true' : null , b); @@ -1161,18 +1185,24 @@ TreeStyleTabBrowser.prototype = { if (!placeholder) return; var strip = this.tabStrip; - var box = placeholder.boxObject; + var tabContainer = this.mTabBrowser.tabContainer; if (this.currentTabbarPosition == 'top') { strip.style.position = 'static'; strip.style.MozAppearance = ''; } else { strip.style.position = 'fixed'; - strip.style.top = box.y; - strip.style.left = box.x; strip.style.MozAppearance = 'none'; - strip.style.width = (strip.width = box.width)+'px'; - strip.style.height = (strip.height = box.height)+'px'; + + let box = placeholder.boxObject; + let root = document.documentElement.boxObject; + strip.style.top = (box.screenY - root.screenY)+'px'; + strip.style.left = (box.screenX - root.screenX)+'px'; + + strip.style.width = (tabContainer.width = box.width)+'px'; + strip.style.height = (tabContainer.height = box.height)+'px'; + + tabContainer.collapsed = (this.splitter && this.splitter.getAttribute('state') == 'collapsed'); } }, @@ -1256,6 +1286,9 @@ TreeStyleTabBrowser.prototype = { b.mPanelContainer.removeEventListener('dragover', this, false); b.mPanelContainer.removeEventListener('dragdrop', this, false); + if (this.placeholder) + window.removeEventListener('resize', this, true); + b.removeEventListener('MultipleTabHandlerTabsClosing', this, false); this.tabbarDNDObserver.destroy(); @@ -1436,6 +1469,11 @@ TreeStyleTabBrowser.prototype = { if (!this.autoHide.isResizing && this.isVertical) { this.tabStrip.removeAttribute('width'); this.tabStrip.setAttribute('width', this.autoHide.widthFromMode); + if (this.placeholder) { + this.placeholder.removeAttribute('width'); + this.placeholder.setAttribute('width', this.autoHide.widthFromMode); + } + this.updateTabbarSize(); } this.checkTabsIndentOverflow(); break; @@ -1543,6 +1581,9 @@ TreeStyleTabBrowser.prototype = { case 'underflow': return this.onTabbarOverflow(aEvent); + case 'resize': + return this.onResize(aEvent); + case 'MultipleTabHandlerTabsClosing': if (!this.onTabsRemoving(aEvent)) @@ -2563,6 +2604,21 @@ TreeStyleTabBrowser.prototype = { } }, + onResize : function TSTBrowser_onResize(aEvent) + { + if ( + !aEvent.originalTarget || + ( + aEvent.originalTarget.ownerDocument != document && + aEvent.originalTarget != window && + aEvent.originalTarget != this.mTabBrowser.contentWindow + ) + ) + return; + + this.updateTabbarSize(); + }, + onPopupShowing : function TSTBrowser_onPopupShowing(aEvent) { if (aEvent.target != aEvent.currentTarget) return; diff --git a/skin/classic/treestyletab/square/compat-3.5.css b/skin/classic/treestyletab/square/compat-3.5.css index 37e9a424..e6bde7e2 100644 --- a/skin/classic/treestyletab/square/compat-3.5.css +++ b/skin/classic/treestyletab/square/compat-3.5.css @@ -12,11 +12,13 @@ -moz-box-shadow: 0.3em 0.3em 0.2em rgba(0, 0, 0, 0.15) !important; } .tabbrowser-tabs[treestyletab-style~="square"]:not([treestyletab-style~="vertigo"])[treestyletab-mode="vertical"] - .tabs-container:not([overflow="true"]) .tabbrowser-arrowscrollbox .scrollbox-innerbox { + .tabs-container:not([overflow="true"]) .tabbrowser-arrowscrollbox .scrollbox-innerbox, +toolbar .tabbrowser-tabs[treestyletab-style~="square"]:not([treestyletab-style~="vertigo"])[treestyletab-mode="vertical"]:not([overflow="true"]) .tabbrowser-arrowscrollbox .scrollbox-innerbox { background: url("newtab-shadow.png") repeat-x bottom !important; } .tabbrowser-tabs[treestyletab-style~="square"]:not([treestyletab-style~="vertigo"])[treestyletab-mode="vertical"] - .tabs-container:not([overflow="true"]) .tabbrowser-arrowscrollbox .tabs-newtab-button { + .tabs-container:not([overflow="true"]) .tabbrowser-arrowscrollbox .tabs-newtab-button, +toolbar .tabbrowser-tabs[treestyletab-style~="square"]:not([treestyletab-style~="vertigo"])[treestyletab-mode="vertical"]:not([overflow="true"]) .tabbrowser-arrowscrollbox .tabs-newtab-button { margin-bottom: 5px !important; }