move codes for drag and drop into JS code modules

This commit is contained in:
Piro / SHIMODA Hiroshi 2010-12-06 21:04:52 +09:00
parent 9c8eaf6c39
commit 0713e54fda
18 changed files with 359 additions and 254 deletions

@ -1 +1 @@
Subproject commit 1feb63c9d55e0aecfaa55fc49521e9250678993d Subproject commit 7adc0c6e3866bb535ffd9f851afd8d0b7224eb9d

View File

@ -346,7 +346,7 @@ var TreeStyleTabService = {
{ {
var namespace = {}; var namespace = {};
Components.utils.import( Components.utils.import(
'resource://treestyletab-modules/prefs.js', 'resource://treestyletab-modules/lib/prefs.js',
namespace namespace
); );
var prefs = namespace.prefs; var prefs = namespace.prefs;

View File

@ -19,8 +19,6 @@
]]></script> ]]></script>
<script src="treestyletabbrowser.js" type="application/javascript"/> <script src="treestyletabbrowser.js" type="application/javascript"/>
<script src="treestyletabbrowser_autoHide.js" type="application/javascript"/> <script src="treestyletabbrowser_autoHide.js" type="application/javascript"/>
<script src="treestyletabbrowser_tabbarDNDObserver.js" type="application/javascript"/>
<script src="treestyletabbrowser_tabpanelDNDObserver.js" type="application/javascript"/>
<script src="preloadImages.js" type="application/javascript"/> <script src="preloadImages.js" type="application/javascript"/>

View File

@ -87,12 +87,22 @@ TreeStyleTabBrowser.prototype = {
get tabbarDNDObserver() get tabbarDNDObserver()
{ {
return this._tabbarDNDObserver || (this._tabbarDNDObserver = new TreeStyleTabBrowserTabbarDNDObserver(this)); if (!this._tabbarDNDObserver) {
let ns = {};
Components.utils.import('resource://treestyletab-modules/tabbarDNDObserver.js', ns);
this._tabbarDNDObserver = new ns.TabbarDNDObserver(this);
}
return this._tabbarDNDObserver;
}, },
get panelDNDObserver() get panelDNDObserver()
{ {
return this._panelDNDObserver || (this._panelDNDObserver = new TreeStyleTabBrowserTabpanelDNDObserver(this)); if (!this._panelDNDObserver) {
let ns = {};
Components.utils.import('resource://treestyletab-modules/tabpanelDNDObserver.js', ns);
this._panelDNDObserver = new ns.TabpanelDNDObserver(this);
}
return this._panelDNDObserver;
}, },
/* utils */ /* utils */

View File

@ -1,109 +0,0 @@
function TreeStyleTabBrowserTabpanelDNDObserver(aOwner)
{
this.init(aOwner);
}
TreeStyleTabBrowserTabpanelDNDObserver.prototype = {
getDropPosition : function TSTTabpanelDND_getDropPosition(aEvent)
{
var box = this.mOwner.mTabBrowser.boxObject;
var W = box.width;
var H = box.height;
var X = box.screenX;
var Y = box.screenY;
var x = aEvent.screenX - X;
var y = aEvent.screenY - Y;
if (x > (W * 0.33) &&
x < (W * 0.66) &&
y > (H * 0.33) &&
y < (H * 0.66))
return 'center';
var isTL = x <= W - (y * W / H);
var isBL = x <= y * W / H;
return (isTL && isBL) ? 'left' :
(isTL && !isBL) ? 'top' :
(!isTL && isBL) ? 'bottom' :
'right' ;
},
canDrop : function TSTTabpanelDND_canDrop(aEvent)
{
var session = this.mOwner.currentDragSession;
return (
session &&
session.isDataFlavorSupported(this.mOwner.kDRAG_TYPE_TABBAR) &&
session.sourceNode
) ? true : false ;
},
handleEvent : function TSTTabpanelDND_handleEvent(aEvent)
{
switch (aEvent.type)
{
case 'dragleave': return this.onDragLeave(aEvent);
case 'dragover': return this.onDragOver(aEvent);
case 'drop': return this.onDrop(aEvent);
}
},
onDragLeave : function TSTTabpanelDND_onDragLeave(aEvent)
{
if (!this.canDrop(aEvent)) return;
var sv = this.mOwner;
if (sv.mTabBrowser.hasAttribute(sv.kDROP_POSITION))
sv.setTabbrowserAttribute(sv.kDROP_POSITION, sv.kDROP_POSITION_UNKNOWN);
},
onDragOver : function TSTTabpanelDND_onDragOver(aEvent)
{
if (!this.canDrop(aEvent)) return;
aEvent.preventDefault();
var sv = this.mOwner;
sv.setTabbrowserAttribute(sv.kDROP_POSITION, this.getDropPosition(aEvent));
},
onDrop : function TSTTabpanelDND_onDrop(aEvent)
{
if (!this.canDrop(aEvent)) return;
var sv = this.mOwner;
var dt = aEvent.dataTransfer;
var position = this.getDropPosition(aEvent);
if (position != 'center' &&
position != sv.currentTabbarPosition) {
if (sv.getTreePref('tabbar.fixed.autoCancelOnDrop') &&
dt.getData(sv.kDRAG_TYPE_TABBAR) != sv.kTABBAR_MOVE_FORCE) {
let orient = (position == 'left' || position == 'right') ? 'vertical' : 'horizontal' ;
sv.setTreePref('tabbar.fixed.'+orient, false);
}
sv.currentTabbarPosition = position;
}
aEvent.preventDefault();
aEvent.stopPropagation();
},
init : function TSTTabpanelDND_init(aOwner)
{
this.mOwner = aOwner;
var b = this.mOwner.mTabBrowser;
b.mPanelContainer.addEventListener('dragover', this, true);
b.mPanelContainer.addEventListener('dragleave', this, true);
b.mPanelContainer.addEventListener('drop', this, true);
},
destroy : function TSTTabpanelDND_destroy()
{
var b = this.mOwner.mTabBrowser;
b.mPanelContainer.removeEventListener('dragover', this, true);
b.mPanelContainer.removeEventListener('dragleave', this, true);
b.mPanelContainer.removeEventListener('drop', this, true);
delete this.mOwner;
}
};

View File

@ -35,14 +35,14 @@ if (typeof window == 'undefined' ||
// See: http://www.cozmixng.org/repos/piro/fx3-compatibility-lib/trunk/namespace.jsm // See: http://www.cozmixng.org/repos/piro/fx3-compatibility-lib/trunk/namespace.jsm
let ns = {}; let ns = {};
try { try {
Components.utils.import('resource://treestyletab-modules/namespace.jsm', ns); Components.utils.import('resource://treestyletab-modules/lib/namespace.jsm', ns);
/* var */ window = ns.getNamespaceFor('piro.sakura.ne.jp'); /* var */ window = ns.getNamespaceFor('piro.sakura.ne.jp');
} }
catch(e) { catch(e) {
window = {}; window = {};
} }
if (!('setInterval' in window)) if (!('setInterval' in window))
Components.utils.import('resource://treestyletab-modules/jstimer.jsm', window); Components.utils.import('resource://treestyletab-modules/lib/jstimer.jsm', window);
} }
(function() { (function() {

View File

@ -21,7 +21,7 @@ if (typeof window == 'undefined' ||
// See: http://www.cozmixng.org/repos/piro/fx3-compatibility-lib/trunk/namespace.jsm // See: http://www.cozmixng.org/repos/piro/fx3-compatibility-lib/trunk/namespace.jsm
try { try {
let ns = {}; let ns = {};
Components.utils.import('resource://treestyletab-modules/namespace.jsm', ns); Components.utils.import('resource://treestyletab-modules/lib/namespace.jsm', ns);
/* var */ window = ns.getNamespaceFor('piro.sakura.ne.jp'); /* var */ window = ns.getNamespaceFor('piro.sakura.ne.jp');
} }
catch(e) { catch(e) {

View File

@ -24,7 +24,7 @@ if (typeof window == 'undefined' ||
// See: http://www.cozmixng.org/repos/piro/fx3-compatibility-lib/trunk/namespace.jsm // See: http://www.cozmixng.org/repos/piro/fx3-compatibility-lib/trunk/namespace.jsm
try { try {
let ns = {}; let ns = {};
Components.utils.import('resource://treestyletab-modules/namespace.jsm', ns); Components.utils.import('resource://treestyletab-modules/lib/namespace.jsm', ns);
/* var */ window = ns.getNamespaceFor('piro.sakura.ne.jp'); /* var */ window = ns.getNamespaceFor('piro.sakura.ne.jp');
} }
catch(e) { catch(e) {

View File

@ -19,7 +19,7 @@ if (typeof namespace == 'undefined') {
// See: http://github.com/piroor/fxaddonlibs/blob/master/namespace.jsm // See: http://github.com/piroor/fxaddonlibs/blob/master/namespace.jsm
try { try {
let ns = {}; let ns = {};
Components.utils.import('resource://treestyletab-modules/namespace.jsm', ns); Components.utils.import('resource://treestyletab-modules/lib/namespace.jsm', ns);
namespace = ns.getNamespaceFor('piro.sakura.ne.jp'); namespace = ns.getNamespaceFor('piro.sakura.ne.jp');
} }
catch(e) { catch(e) {
@ -30,7 +30,7 @@ if (typeof namespace == 'undefined') {
// This depends on JSDeferred. // This depends on JSDeferred.
// See: https://github.com/cho45/jsdeferred // See: https://github.com/cho45/jsdeferred
if (typeof namespace.Deferred == 'undefined') if (typeof namespace.Deferred == 'undefined')
Components.utils.import('resource://treestyletab-modules/jsdeferred.js', namespace); Components.utils.import('resource://treestyletab-modules/lib/jsdeferred.js', namespace);
var confirmWithTab; var confirmWithTab;
(function() { (function() {

View File

@ -35,7 +35,7 @@ if (typeof window == 'undefined' ||
// See: http://www.cozmixng.org/repos/piro/fx3-compatibility-lib/trunk/namespace.jsm // See: http://www.cozmixng.org/repos/piro/fx3-compatibility-lib/trunk/namespace.jsm
try { try {
let ns = {}; let ns = {};
Components.utils.import('resource://treestyletab-modules/namespace.jsm', ns); Components.utils.import('resource://treestyletab-modules/lib/namespace.jsm', ns);
/* var */ window = ns.getNamespaceFor('piro.sakura.ne.jp'); /* var */ window = ns.getNamespaceFor('piro.sakura.ne.jp');
} }
catch(e) { catch(e) {

View File

@ -3,7 +3,7 @@ var window = {};
var location = { protocol: 'resource:' }; var location = { protocol: 'resource:' };
var document = { addEventListener : function() {} }; var document = { addEventListener : function() {} };
Components.utils.import('resource://treestyletab-modules/jstimer.jsm', window); Components.utils.import('resource://treestyletab-modules/lib/jstimer.jsm', window);
var setTimeout = window.setTimeout; var setTimeout = window.setTimeout;
var clearTimeout = window.clearTimeout; var clearTimeout = window.clearTimeout;
var setInterval = window.setInterval; var setInterval = window.setInterval;

View File

@ -35,7 +35,7 @@ if (typeof window == 'undefined' ||
// See: http://www.cozmixng.org/repos/piro/fx3-compatibility-lib/trunk/namespace.jsm // See: http://www.cozmixng.org/repos/piro/fx3-compatibility-lib/trunk/namespace.jsm
try { try {
let ns = {}; let ns = {};
Components.utils.import('resource://treestyletab-modules/namespace.jsm', ns); Components.utils.import('resource://treestyletab-modules/lib/namespace.jsm', ns);
/* var */ window = ns.getNamespaceFor('piro.sakura.ne.jp'); /* var */ window = ns.getNamespaceFor('piro.sakura.ne.jp');
} }
catch(e) { catch(e) {

View File

@ -23,7 +23,7 @@ if (typeof window == 'undefined' ||
// See: http://www.cozmixng.org/repos/piro/fx3-compatibility-lib/trunk/namespace.jsm // See: http://www.cozmixng.org/repos/piro/fx3-compatibility-lib/trunk/namespace.jsm
try { try {
let ns = {}; let ns = {};
Components.utils.import('resource://treestyletab-modules/namespace.jsm', ns); Components.utils.import('resource://treestyletab-modules/lib/namespace.jsm', ns);
/* var */ window = ns.getNamespaceFor('piro.sakura.ne.jp'); /* var */ window = ns.getNamespaceFor('piro.sakura.ne.jp');
} }
catch(e) { catch(e) {

View File

@ -1,45 +1,82 @@
function TreeStyleTabBrowserTabbarDNDObserver(aOwner) /* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is the Tree Style Tab.
*
* The Initial Developer of the Original Code is SHIMODA Hiroshi.
* Portions created by the Initial Developer are Copyright (C) 2010
* the Initial Developer. All Rights Reserved.
*
* Contributor(s): SHIMODA Hiroshi <piro@p.club.ne.jp>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ******/
const EXPORTED_SYMBOLS = ['TabbarDNDObserver'];
const Cc = Components.classes;
const Ci = Components.interfaces;
const TAB_DROP_TYPE = 'application/x-moz-tabbrowser-tab';
const SSS = Cc['@mozilla.org/content/style-sheet-service;1']
.getService(Ci.nsIStyleSheetService);
const SecMan = Cc['@mozilla.org/scriptsecuritymanager;1']
.getService(Ci.nsIScriptSecurityManager);
const IOService = Cc['@mozilla.org/network/io-service;1']
.getService(Ci.nsIIOService);
function TabbarDNDObserver(aOwner)
{ {
this.init(aOwner); this.init(aOwner);
} }
TreeStyleTabBrowserTabbarDNDObserver.prototype = { TabbarDNDObserver.prototype = {
get SSS() readyToStartTabbarDrag : function TabbarDND_readyToStartTabbarDrag()
{ {
if (this._SSS === void(0)) { var sheet = this.treeStyleTab.makeURIFromSpec('chrome://treestyletab/content/hide-embed.css');
if ('@mozilla.org/content/style-sheet-service;1' in Components.classes) { if (!SSS.sheetRegistered(sheet, SSS.AGENT_SHEET))
this._SSS = Components.classes['@mozilla.org/content/style-sheet-service;1'].getService(Components.interfaces.nsIStyleSheetService); SSS.loadAndRegisterSheet(sheet, SSS.AGENT_SHEET);
}
if (!this._SSS)
this._SSS = null;
}
return this._SSS;
}, },
readyToStartTabbarDrag : function TSTTabbarDND_readyToStartTabbarDrag() readyToEndTabbarDrag : function TabbarDND_readyToEndTabbarDrag()
{ {
var sheet = this.mOwner.makeURIFromSpec('chrome://treestyletab/content/hide-embed.css'); var sheet = this.treeStyleTab.makeURIFromSpec('chrome://treestyletab/content/hide-embed.css');
if (!this.SSS.sheetRegistered(sheet, this.SSS.AGENT_SHEET)) if (SSS.sheetRegistered(sheet, SSS.AGENT_SHEET))
this.SSS.loadAndRegisterSheet(sheet, this.SSS.AGENT_SHEET); SSS.unregisterSheet(sheet, SSS.AGENT_SHEET);
}, },
readyToEndTabbarDrag : function TSTTabbarDND_readyToEndTabbarDrag() canDragTabbar : function TabbarDND_canDragTabbar(aEvent)
{ {
var sheet = this.mOwner.makeURIFromSpec('chrome://treestyletab/content/hide-embed.css'); var sv = this.treeStyleTab;
if (this.SSS.sheetRegistered(sheet, this.SSS.AGENT_SHEET))
this.SSS.unregisterSheet(sheet, this.SSS.AGENT_SHEET);
},
canDragTabbar : function TSTTabbarDND_canDragTabbar(aEvent)
{
var sv = this.mOwner;
if ( if (
sv.evaluateXPath( sv.evaluateXPath(
'ancestor-or-self::*[contains(" scrollbar popup menupopup panel tooltip ", concat(" ", local-name(), " "))]', 'ancestor-or-self::*[contains(" scrollbar popup menupopup panel tooltip ", concat(" ", local-name(), " "))]',
aEvent.originalTarget, aEvent.originalTarget,
XPathResult.BOOLEAN_TYPE Ci.nsIDOMXPathResult.BOOLEAN_TYPE
).booleanValue || ).booleanValue ||
sv.isToolbarCustomizing sv.isToolbarCustomizing
) )
@ -51,7 +88,7 @@ TreeStyleTabBrowserTabbarDNDObserver.prototype = {
(tab ? aEvent.shiftKey : tabbar ) && (tab ? aEvent.shiftKey : tabbar ) &&
( (
aEvent.shiftKey || aEvent.shiftKey ||
sv.mTabBrowser.getAttribute(sv.kFIXED) != 'true' sv.browser.getAttribute(sv.kFIXED) != 'true'
) )
); );
@ -86,9 +123,9 @@ TreeStyleTabBrowserTabbarDNDObserver.prototype = {
return canDrag; return canDrag;
}, },
canDrop : function TSTTabbarDND_canDrop(aEvent) canDrop : function TabbarDND_canDrop(aEvent)
{ {
var sv = this.mOwner; var sv = this.treeStyleTab;
var tooltip = sv.tabStrip.firstChild; var tooltip = sv.tabStrip.firstChild;
if (tooltip && if (tooltip &&
tooltip.localName == 'tooltip' && tooltip.localName == 'tooltip' &&
@ -109,11 +146,11 @@ TreeStyleTabBrowserTabbarDNDObserver.prototype = {
return dropAction.canDrop; return dropAction.canDrop;
}, },
canDropTab : function TSTTabbarDND_canDropTab(aEvent) canDropTab : function TabbarDND_canDropTab(aEvent)
{ {
try{ try{
var sv = this.mOwner; var sv = this.treeStyleTab;
var b = sv.mTabBrowser; var b = this.browser;
var session = sv.currentDragSession; var session = sv.currentDragSession;
var node = session.sourceNode; var node = session.sourceNode;
@ -131,15 +168,15 @@ try{
return info.canDrop; return info.canDrop;
} }
catch(e) { catch(e) {
dump('TreeStyleTabService::canDrop\n'+e+'\n'); dump('TabbarDND::canDrop\n'+e+'\n');
return false; return false;
} }
}, },
getDropAction : function TSTTabbarDND_getDropAction(aEvent, aDragSession) getDropAction : function TabbarDND_getDropAction(aEvent, aDragSession)
{ {
var sv = this.mOwner; var sv = this.treeStyleTab;
var b = sv.mTabBrowser; var b = this.browser;
if (!aDragSession) if (!aDragSession)
aDragSession = sv.currentDragSession; aDragSession = sv.currentDragSession;
@ -190,16 +227,17 @@ catch(e) {
return info; return info;
}, },
getDropActionInternal : function TSTTabbarDND_getDropActionInternal(aEvent, aSourceTab) getDropActionInternal : function TabbarDND_getDropActionInternal(aEvent, aSourceTab)
{ {
var sv = this.mOwner; var sv = this.treeStyleTab;
var b = sv.mTabBrowser; var b = this.browser;
var d = this.document;
var tab = aEvent.target; var tab = aEvent.target;
var tabs = sv.getTabsArray(b); var tabs = sv.getTabsArray(b);
var firstTab = sv.getFirstNormalTab(b); var firstTab = sv.getFirstNormalTab(b);
var lastTabIndex = tabs.length -1; var lastTabIndex = tabs.length -1;
var isInverted = sv.isVertical ? false : window.getComputedStyle(b.parentNode, null).direction == 'rtl'; var isInverted = sv.isVertical ? false : b.ownerDocument.defaultView.getComputedStyle(b.parentNode, null).direction == 'rtl';
var info = { var info = {
target : null, target : null,
position : null, position : null,
@ -209,8 +247,8 @@ catch(e) {
event : aEvent event : aEvent
}; };
var isTabMoveFromOtherWindow = aSourceTab && aSourceTab.ownerDocument != document; var isTabMoveFromOtherWindow = aSourceTab && aSourceTab.ownerDocument != d;
var isNewTabAction = !aSourceTab || aSourceTab.ownerDocument != document; var isNewTabAction = !aSourceTab || aSourceTab.ownerDocument != d;
if (tab.localName != 'tab') { if (tab.localName != 'tab') {
var action = isTabMoveFromOtherWindow ? sv.kACTION_STAY : (sv.kACTION_MOVE | sv.kACTION_PART) ; var action = isTabMoveFromOtherWindow ? sv.kACTION_STAY : (sv.kACTION_MOVE | sv.kACTION_PART) ;
@ -333,10 +371,11 @@ catch(e) {
return info; return info;
}, },
performDrop : function TSTTabbarDND_performDrop(aInfo, aDraggedTab) performDrop : function TabbarDND_performDrop(aInfo, aDraggedTab)
{ {
var sv = this.mOwner; var sv = this.treeStyleTab;
var b = sv.mTabBrowser; var b = this.browser;
var w = this.window;
var tabsInfo = this.getDraggedTabsInfoFromOneTab(aInfo, aDraggedTab); var tabsInfo = this.getDraggedTabsInfoFromOneTab(aInfo, aDraggedTab);
if (!tabsInfo.draggedTab) return false; if (!tabsInfo.draggedTab) return false;
@ -439,7 +478,7 @@ catch(e) {
oldTabs.push(aTab); oldTabs.push(aTab);
} }
newTabs.push(tab); newTabs.push(tab);
if (tabsInfo.isMultipleMove && 'MultipleTabService' in window) if (tabsInfo.isMultipleMove && 'MultipleTabService' in w)
MultipleTabService.setSelection(tab, true); MultipleTabService.setSelection(tab, true);
if (!parent || draggedTabs.indexOf(parent) < 0) if (!parent || draggedTabs.indexOf(parent) < 0)
newRoots.push(tab); newRoots.push(tab);
@ -486,10 +525,11 @@ catch(e) {
return true; return true;
}, },
getDraggedTabsInfoFromOneTab : function TSTTabbarDND_getDraggedTabsInfoFromOneTab(aInfo, aTab) getDraggedTabsInfoFromOneTab : function TabbarDND_getDraggedTabsInfoFromOneTab(aInfo, aTab)
{ {
var sv = this.mOwner; var sv = this.treeStyleTab;
var b = sv.mTabBrowser; var b = this.browser;
var w = this.window;
aTab = sv.getTabFromChild(aTab); aTab = sv.getTabFromChild(aTab);
if (!aTab) if (!aTab)
@ -506,7 +546,7 @@ catch(e) {
var sourceWindow = aTab.ownerDocument.defaultView; var sourceWindow = aTab.ownerDocument.defaultView;
var sourceBrowser = sv.getTabBrowserFromChild(aTab); var sourceBrowser = sv.getTabBrowserFromChild(aTab);
var draggedTabs = window['piro.sakura.ne.jp'].tabsDragUtils.getSelectedTabs(aInfo.event || sourceBrowser); var draggedTabs = w['piro.sakura.ne.jp'].tabsDragUtils.getSelectedTabs(aInfo.event || sourceBrowser);
var draggedRoots = [aTab]; var draggedRoots = [aTab];
var isMultipleMove = false; var isMultipleMove = false;
@ -540,10 +580,10 @@ catch(e) {
}; };
}, },
attachTabsOnDrop : function TSTTabbarDND_attachTabsOnDrop(aTabs, aParent) attachTabsOnDrop : function TabbarDND_attachTabsOnDrop(aTabs, aParent)
{ {
var sv = this.mOwner; var sv = this.treeStyleTab;
var b = sv.mTabBrowser; var b = this.browser;
b.movingSelectedTabs = true; // Multiple Tab Handler b.movingSelectedTabs = true; // Multiple Tab Handler
aTabs.forEach(function(aTab) { aTabs.forEach(function(aTab) {
@ -557,10 +597,10 @@ catch(e) {
b.movingSelectedTabs = false; // Multiple Tab Handler b.movingSelectedTabs = false; // Multiple Tab Handler
}, },
partTabsOnDrop : function TSTTabbarDND_partTabsOnDrop(aTabs) partTabsOnDrop : function TabbarDND_partTabsOnDrop(aTabs)
{ {
var sv = this.mOwner; var sv = this.treeStyleTab;
var b = sv.mTabBrowser; var b = this.browser;
b.movingSelectedTabs = true; // Multiple Tab Handler b.movingSelectedTabs = true; // Multiple Tab Handler
aTabs.forEach(function(aTab) { aTabs.forEach(function(aTab) {
@ -571,7 +611,7 @@ catch(e) {
b.movingSelectedTabs = false; // Multiple Tab Handler b.movingSelectedTabs = false; // Multiple Tab Handler
}, },
closeOwner : function TSTTabbarDND_closeOwner(aTabOwner) closeOwner : function TabbarDND_closeOwner(aTabOwner)
{ {
var w = aTabOwner.ownerDocument.defaultView; var w = aTabOwner.ownerDocument.defaultView;
if (!w) return; if (!w) return;
@ -588,10 +628,10 @@ catch(e) {
w.close(); w.close();
}, },
clearDropPosition : function TSTTabbarDND_clearDropPosition() clearDropPosition : function TabbarDND_clearDropPosition()
{ {
var sv = this.mOwner; var sv = this.treeStyleTab;
var b = sv.mTabBrowser; var b = this.browser;
var xpathResult = sv.evaluateXPath( var xpathResult = sv.evaluateXPath(
'child::xul:tab[@'+sv.kDROP_POSITION+']', 'child::xul:tab[@'+sv.kDROP_POSITION+']',
b.mTabContainer b.mTabContainer
@ -602,10 +642,10 @@ catch(e) {
} }
}, },
isDraggingAllTabs : function TSTTabbarDND_isDraggingAllTabs(aTab, aTabs) isDraggingAllTabs : function TabbarDND_isDraggingAllTabs(aTab, aTabs)
{ {
var sv = this.mOwner; var sv = this.treeStyleTab;
var b = sv.mTabBrowser; var b = this.browser;
var actionInfo = { var actionInfo = {
action : sv.kACTIONS_FOR_DESTINATION | sv.kACTION_IMPORT action : sv.kACTIONS_FOR_DESTINATION | sv.kACTION_IMPORT
@ -614,12 +654,12 @@ catch(e) {
return tabsInfo.draggedTabs.length == (aTabs || sv.getAllTabsArray(b)).length; return tabsInfo.draggedTabs.length == (aTabs || sv.getAllTabsArray(b)).length;
}, },
isDraggingAllCurrentTabs : function TSTTabbarDND_isDraggingAllCurrentTabs(aTab) isDraggingAllCurrentTabs : function TabbarDND_isDraggingAllCurrentTabs(aTab)
{ {
return this.isDraggingAllTabs(aTab, this.getTabsArray(this.mOwner.mTabBrowser)); return this.isDraggingAllTabs(aTab, this.getTabsArray(this.treeStyleTab.browser));
}, },
handleEvent : function TSTTabbarDND_handleEvent(aEvent) handleEvent : function TabbarDND_handleEvent(aEvent)
{ {
switch (aEvent.type) switch (aEvent.type)
{ {
@ -632,31 +672,32 @@ catch(e) {
} }
}, },
onDragStart : function TSTTabbarDND_onDragStart(aEvent) onDragStart : function TabbarDND_onDragStart(aEvent)
{ {
if (this.canDragTabbar(aEvent)) if (this.canDragTabbar(aEvent))
return this.onTabbarDragStart(aEvent); return this.onTabbarDragStart(aEvent);
var tab = this.mOwner.getTabFromEvent(aEvent); var tab = this.treeStyleTab.getTabFromEvent(aEvent);
if (tab) if (tab)
return this.onTabDragStart(aEvent, tab); return this.onTabDragStart(aEvent, tab);
}, },
onTabDragStart : function TSTTabbarDND_onTabDragStart(aEvent, aTab) onTabDragStart : function TabbarDND_onTabDragStart(aEvent, aTab)
{ {
var sv = this.mOwner; var sv = this.treeStyleTab;
var w = this.window;
var actionInfo = { var actionInfo = {
action : sv.kACTIONS_FOR_DESTINATION | sv.kACTION_MOVE, action : sv.kACTIONS_FOR_DESTINATION | sv.kACTION_MOVE,
event : aEvent event : aEvent
}; };
var tabsInfo = this.getDraggedTabsInfoFromOneTab(actionInfo, aTab); var tabsInfo = this.getDraggedTabsInfoFromOneTab(actionInfo, aTab);
if (tabsInfo.draggedTabs.length > 1) if (tabsInfo.draggedTabs.length > 1)
window['piro.sakura.ne.jp'].tabsDragUtils.startTabsDrag(aEvent, tabsInfo.draggedTabs); w['piro.sakura.ne.jp'].tabsDragUtils.startTabsDrag(aEvent, tabsInfo.draggedTabs);
}, },
onTabbarDragStart : function TSTTabbarDND_onTabbarDragStart(aEvent) onTabbarDragStart : function TabbarDND_onTabbarDragStart(aEvent)
{ {
var sv = this.mOwner; var sv = this.treeStyleTab;
var dt = aEvent.dataTransfer; var dt = aEvent.dataTransfer;
dt.mozSetDataAt( dt.mozSetDataAt(
sv.kDRAG_TYPE_TABBAR, sv.kDRAG_TYPE_TABBAR,
@ -666,7 +707,7 @@ catch(e) {
0 0
); );
dt.mozCursor = 'move'; dt.mozCursor = 'move';
// var tabbar = sv.mTabBrowser.mTabContainer; // var tabbar = sv.browser.mTabContainer;
// var box = tabbar.boxObject; // var box = tabbar.boxObject;
// dt.setDragImage( // dt.setDragImage(
// tabbar, // tabbar,
@ -674,14 +715,15 @@ catch(e) {
// aEvent.screenY - box.screenY // aEvent.screenY - box.screenY
// ); // );
// no feedback image, because it's annoying... // no feedback image, because it's annoying...
dt.setDragImage(new Image(), 0, 0); dt.setDragImage(new this.window.Image(), 0, 0);
aEvent.stopPropagation(); aEvent.stopPropagation();
this.readyToStartTabbarDrag(); this.readyToStartTabbarDrag();
}, },
onDragEnter : function TSTTabbarDND_onDragEnter(aEvent) onDragEnter : function TabbarDND_onDragEnter(aEvent)
{ {
var sv = this.mOwner; var sv = this.treeStyleTab;
var w = this.window;
var dt = aEvent.dataTransfer; var dt = aEvent.dataTransfer;
if (!this.canDrop(aEvent)) { if (!this.canDrop(aEvent)) {
@ -694,13 +736,13 @@ catch(e) {
!sv.getTreePref('autoExpand.enabled')) !sv.getTreePref('autoExpand.enabled'))
return; return;
window.clearTimeout(this.mAutoExpandTimer); w.clearTimeout(this.mAutoExpandTimer);
var sourceNode = dt.getData(sv.kDRAG_TYPE_TABBAR+'-node'); var sourceNode = dt.getData(sv.kDRAG_TYPE_TABBAR+'-node');
if (aEvent.target == sourceNode) if (aEvent.target == sourceNode)
return; return;
this.mAutoExpandTimer = window.setTimeout( this.mAutoExpandTimer = w.setTimeout(
function(aTarget) { function(aTarget) {
let tab = sv.getTabById(aTarget); let tab = sv.getTabById(aTarget);
if (tab && if (tab &&
@ -722,22 +764,23 @@ catch(e) {
tab = null; tab = null;
}, },
onDragLeave : function TSTTabbarDND_onDragLeave(aEvent) onDragLeave : function TabbarDND_onDragLeave(aEvent)
{ {
var sv = this.mOwner; var sv = this.treeStyleTab;
var b = sv.mTabBrowser; var b = this.browser;
var w = this.window;
var tabbarFromEvent = sv.getTabbarFromChild(aEvent.relatedTarget); var tabbarFromEvent = sv.getTabbarFromChild(aEvent.relatedTarget);
if (!tabbarFromEvent) if (!tabbarFromEvent)
this.clearDropPosition(); this.clearDropPosition();
window.clearTimeout(this.mAutoExpandTimer); w.clearTimeout(this.mAutoExpandTimer);
this.mAutoExpandTimer = null; this.mAutoExpandTimer = null;
}, },
onDragEnd : function TSTTabbarDND_onDragEnd(aEvent) onDragEnd : function TabbarDND_onDragEnd(aEvent)
{ {
var sv = this.mOwner; var sv = this.treeStyleTab;
var dt = aEvent.dataTransfer; var dt = aEvent.dataTransfer;
if (dt.getData(sv.kDRAG_TYPE_TABBAR)) if (dt.getData(sv.kDRAG_TYPE_TABBAR))
this.onTabbarDragEnd(aEvent); this.onTabbarDragEnd(aEvent);
@ -745,10 +788,12 @@ catch(e) {
this.onTabDragEnd(aEvent); this.onTabDragEnd(aEvent);
}, },
onTabDragEnd : function TSTTabbarDND_onTabDragEnd(aEvent) onTabDragEnd : function TabbarDND_onTabDragEnd(aEvent)
{ {
var sv = this.mOwner; var sv = this.treeStyleTab;
var b = sv.mTabBrowser; var b = this.browser;
var d = this.document;
var w = this.window;
var tabbar = b.mTabContainer; var tabbar = b.mTabContainer;
var strip = sv.tabStrip; var strip = sv.tabStrip;
@ -767,10 +812,10 @@ catch(e) {
var x, y, w, h; var x, y, w, h;
// ignore drop on the toolbox // ignore drop on the toolbox
x = window.screenX; x = w.screenX;
y = window.screenY; y = w.screenY;
w = window.outerWidth; w = w.outerWidth;
h = document.getElementById('navigator-toolbox').boxObject.height; h = d.getElementById('navigator-toolbox').boxObject.height;
if (eX > x && eX < x + w && eY > y && eY < y + h) if (eX > x && eX < x + w && eY > y && eY < y + h)
return; return;
@ -791,17 +836,18 @@ catch(e) {
b.replaceTabWithWindow(draggedTab); b.replaceTabWithWindow(draggedTab);
}, },
onTabbarDragEnd : function TSTTabbarDND_onTabbarDragEnd(aEvent) onTabbarDragEnd : function TabbarDND_onTabbarDragEnd(aEvent)
{ {
window.setTimeout(function(aSelf) { var w = this.window;
w.setTimeout(function(aSelf) {
aSelf.readyToEndTabbarDrag(); aSelf.readyToEndTabbarDrag();
aSelf.mOwner.removeTabbrowserAttribute(aSelf.mOwner.kDROP_POSITION); aSelf.treeStyleTab.removeTabbrowserAttribute(aSelf.treeStyleTab.kDROP_POSITION);
}, 10, this); }, 10, this);
aEvent.stopPropagation(); aEvent.stopPropagation();
aEvent.preventDefault(); aEvent.preventDefault();
}, },
onDragOver : function TSTTabbarDND_onDragOver(aEvent) onDragOver : function TabbarDND_onDragOver(aEvent)
{ {
if (this.onTabDragOver(aEvent)) { if (this.onTabDragOver(aEvent)) {
aEvent.stopPropagation(); aEvent.stopPropagation();
@ -809,11 +855,11 @@ catch(e) {
} }
}, },
onTabDragOver : function TSTTabbarDND_onTabDragOver(aEvent) onTabDragOver : function TabbarDND_onTabDragOver(aEvent)
{ {
try{ try{
var sv = this.mOwner; var sv = this.treeStyleTab;
var b = sv.mTabBrowser; var b = this.browser;
var session = sv.currentDragSession; var session = sv.currentDragSession;
if (sv.isToolbarCustomizing) if (sv.isToolbarCustomizing)
@ -857,7 +903,7 @@ try{
if (!info.target || info.target != sv.evaluateXPath( if (!info.target || info.target != sv.evaluateXPath(
'child::xul:tab[@'+sv.kDROP_POSITION+']', 'child::xul:tab[@'+sv.kDROP_POSITION+']',
b.mTabContainer, b.mTabContainer,
XPathResult.FIRST_ORDERED_NODE_TYPE Ci.nsIDOMXPathResult.FIRST_ORDERED_NODE_TYPE
).singleNodeValue) ).singleNodeValue)
this.clearDropPosition(); this.clearDropPosition();
@ -880,15 +926,15 @@ try{
return (info.position == sv.kDROP_ON || sv.currentTabbarPosition != 'top') return (info.position == sv.kDROP_ON || sv.currentTabbarPosition != 'top')
} }
catch(e) { catch(e) {
dump('TreeStyleTabService::onDragOver\n'+e+'\n'); dump('TabbarDND::onDragOver\n'+e+'\n');
} }
}, },
onDrop : function TSTTabbarDND_onDrop(aEvent) onDrop : function TabbarDND_onDrop(aEvent)
{ {
this.onTabDrop(aEvent); this.onTabDrop(aEvent);
var sv = this.mOwner; var sv = this.treeStyleTab;
if (this.mAutoExpandedTabs.length) { if (this.mAutoExpandedTabs.length) {
if (sv.getTreePref('autoExpand.collapseFinally')) { if (sv.getTreePref('autoExpand.collapseFinally')) {
this.mAutoExpandedTabs.forEach(function(aTarget) { this.mAutoExpandedTabs.forEach(function(aTarget) {
@ -901,8 +947,9 @@ catch(e) {
onTabDrop : function TSTService_onTabDrop(aEvent) onTabDrop : function TSTService_onTabDrop(aEvent)
{ {
var sv = this.mOwner; var sv = this.treeStyleTab;
var b = sv.mTabBrowser; var b = this.browser;
var w = this.window;
var tabbar = b.mTabContainer; var tabbar = b.mTabContainer;
var dt = aEvent.dataTransfer; var dt = aEvent.dataTransfer;
@ -939,7 +986,7 @@ catch(e) {
dropActionInfo.position == sv.kDROP_ON dropActionInfo.position == sv.kDROP_ON
) { ) {
var beforeTabs = Array.slice(b.mTabContainer.childNodes); var beforeTabs = Array.slice(b.mTabContainer.childNodes);
window.setTimeout(function() { w.setTimeout(function() {
var newTabs = Array.slice(b.mTabContainer.childNodes).filter(function(aTab) { var newTabs = Array.slice(b.mTabContainer.childNodes).filter(function(aTab) {
return beforeTabs.indexOf(aTab) < 0; return beforeTabs.indexOf(aTab) < 0;
}); });
@ -962,11 +1009,8 @@ catch(e) {
if (sourceDoc && if (sourceDoc &&
sourceDoc.documentURI.indexOf('chrome://') < 0) { sourceDoc.documentURI.indexOf('chrome://') < 0) {
let sourceURI = sourceDoc.documentURI; let sourceURI = sourceDoc.documentURI;
let nsIScriptSecurityManager = Components.interfaces.nsIScriptSecurityManager;
let secMan = Components.classes['@mozilla.org/scriptsecuritymanager;1']
.getService(nsIScriptSecurityManager);
try { try {
secMan.checkLoadURIStr(sourceDoc.documentURI, url, nsIScriptSecurityManager.STANDARD); SecMan.checkLoadURIStr(sourceDoc.documentURI, url, Ci.nsIScriptSecurityManager.STANDARD);
} }
catch(e) { catch(e) {
aEvent.stopPropagation(); aEvent.stopPropagation();
@ -980,7 +1024,7 @@ catch(e) {
let tab = sv.getTabFromEvent(aEvent); let tab = sv.getTabFromEvent(aEvent);
if (!tab || dt.dropEffect == 'copy') { if (!tab || dt.dropEffect == 'copy') {
this.performDrop(dropActionInfo, b.loadOneTab(getShortcutOrURI(url), { inBackground: bgLoad })); this.performDrop(dropActionInfo, b.loadOneTab(w.getShortcutOrURI(url), { inBackground: bgLoad }));
} }
else { else {
let locked = ( let locked = (
@ -994,10 +1038,10 @@ catch(e) {
try { try {
if (loadDroppedLinkToNewChildTab || locked) { if (loadDroppedLinkToNewChildTab || locked) {
this.performDrop(dropActionInfo, b.loadOneTab(getShortcutOrURI(url), { inBackground: bgLoad })); this.performDrop(dropActionInfo, b.loadOneTab(w.getShortcutOrURI(url), { inBackground: bgLoad }));
} }
else { else {
tab.linkedBrowser.loadURI(getShortcutOrURI(url)); tab.linkedBrowser.loadURI(w.getShortcutOrURI(url));
if (!bgLoad) if (!bgLoad)
b.selectedTab = tab; b.selectedTab = tab;
} }
@ -1033,24 +1077,28 @@ catch(e) {
return aData.replace(/^\s+|\s+$/g, ''); return aData.replace(/^\s+|\s+$/g, '');
case 'text/x-moz-url': case 'text/x-moz-url':
return ((aData instanceof Components.interfaces.nsISupportsString) ? aData.toString() : aData) return ((aData instanceof Ci.nsISupportsString) ? aData.toString() : aData)
.split('\n')[0]; .split('\n')[0];
case 'application/x-moz-file': case 'application/x-moz-file':
let fileHandler = this.IOService.getProtocolHandler('file') let fileHandler = IOService.getProtocolHandler('file')
.QueryInterface(Components.interfaces.nsIFileProtocolHandler); .QueryInterface(Ci.nsIFileProtocolHandler);
return fileHandler.getURLSpecFromFile(aData); return fileHandler.getURLSpecFromFile(aData);
} }
return null; return null;
}, },
init : function TSTTabbarDND_init(aOwner) init : function TabbarDND_init(aOwner)
{ {
this.mOwner = aOwner; this.treeStyleTab = aOwner;
this.browser = aOwner.browser;
this.document = this.browser.ownerDocument;
this.window = this.document.defaultView;
this.mAutoExpandTimer = null; this.mAutoExpandTimer = null;
this.mAutoExpandedTabs = []; this.mAutoExpandedTabs = [];
var strip = this.mOwner.tabStrip; var strip = this.treeStyleTab.tabStrip;
strip.addEventListener('dragstart', this, true); strip.addEventListener('dragstart', this, true);
strip.addEventListener('dragover', this, true); strip.addEventListener('dragover', this, true);
strip.addEventListener('dragenter', this, false); strip.addEventListener('dragenter', this, false);
@ -1059,9 +1107,9 @@ catch(e) {
strip.addEventListener('drop', this, true); strip.addEventListener('drop', this, true);
}, },
destroy : function TSTTabbarDND_destroy() destroy : function TabbarDND_destroy()
{ {
var strip = this.mOwner.tabStrip; var strip = this.treeStyleTab.tabStrip;
strip.removeEventListener('dragstart', this, true); strip.removeEventListener('dragstart', this, true);
strip.removeEventListener('dragover', this, true); strip.removeEventListener('dragover', this, true);
strip.removeEventListener('dragenter', this, false); strip.removeEventListener('dragenter', this, false);
@ -1069,7 +1117,10 @@ catch(e) {
strip.removeEventListener('dragend', this, false); strip.removeEventListener('dragend', this, false);
strip.removeEventListener('drop', this, true); strip.removeEventListener('drop', this, true);
delete this.mOwner; delete this.treeStyleTab;
delete this.browser;
delete this.document;
delete this.window;
} }
}; };

View File

@ -0,0 +1,155 @@
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is the Tree Style Tab.
*
* The Initial Developer of the Original Code is SHIMODA Hiroshi.
* Portions created by the Initial Developer are Copyright (C) 2010
* the Initial Developer. All Rights Reserved.
*
* Contributor(s): SHIMODA Hiroshi <piro@p.club.ne.jp>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ******/
const EXPORTED_SYMBOLS = ['TabpanelDNDObserver'];
const Cc = Components.classes;
const Ci = Components.interfaces;
function TabpanelDNDObserver(aOwner)
{
this.init(aOwner);
}
TabpanelDNDObserver.prototype = {
getDropPosition : function TabpanelDND_getDropPosition(aEvent)
{
var box = this.browser.boxObject;
var W = box.width;
var H = box.height;
var X = box.screenX;
var Y = box.screenY;
var x = aEvent.screenX - X;
var y = aEvent.screenY - Y;
if (x > (W * 0.33) &&
x < (W * 0.66) &&
y > (H * 0.33) &&
y < (H * 0.66))
return 'center';
var isTL = x <= W - (y * W / H);
var isBL = x <= y * W / H;
return (isTL && isBL) ? 'left' :
(isTL && !isBL) ? 'top' :
(!isTL && isBL) ? 'bottom' :
'right' ;
},
canDrop : function TabpanelDND_canDrop(aEvent)
{
var session = this.treeStyleTab.currentDragSession;
return (
session &&
session.isDataFlavorSupported(this.treeStyleTab.kDRAG_TYPE_TABBAR) &&
session.sourceNode
) ? true : false ;
},
handleEvent : function TabpanelDND_handleEvent(aEvent)
{
switch (aEvent.type)
{
case 'dragleave': return this.onDragLeave(aEvent);
case 'dragover': return this.onDragOver(aEvent);
case 'drop': return this.onDrop(aEvent);
}
},
onDragLeave : function TabpanelDND_onDragLeave(aEvent)
{
if (!this.canDrop(aEvent)) return;
var sv = this.treeStyleTab;
if (this.browser.hasAttribute(sv.kDROP_POSITION))
sv.setTabbrowserAttribute(sv.kDROP_POSITION, sv.kDROP_POSITION_UNKNOWN);
},
onDragOver : function TabpanelDND_onDragOver(aEvent)
{
if (!this.canDrop(aEvent)) return;
aEvent.preventDefault();
var sv = this.treeStyleTab;
sv.setTabbrowserAttribute(sv.kDROP_POSITION, this.getDropPosition(aEvent));
},
onDrop : function TabpanelDND_onDrop(aEvent)
{
if (!this.canDrop(aEvent)) return;
var sv = this.treeStyleTab;
var dt = aEvent.dataTransfer;
var position = this.getDropPosition(aEvent);
if (position != 'center' &&
position != sv.currentTabbarPosition) {
if (sv.getTreePref('tabbar.fixed.autoCancelOnDrop') &&
dt.getData(sv.kDRAG_TYPE_TABBAR) != sv.kTABBAR_MOVE_FORCE) {
let orient = (position == 'left' || position == 'right') ? 'vertical' : 'horizontal' ;
sv.setTreePref('tabbar.fixed.'+orient, false);
}
sv.currentTabbarPosition = position;
}
aEvent.preventDefault();
aEvent.stopPropagation();
},
init : function TabpanelDND_init(aOwner)
{
this.treeStyleTab = aOwner;
this.browser = aOwner.browser;
this.document = this.browser.ownerDocument;
this.window = this.document.defaultView;
var b = this.treeStyleTab.mTabBrowser;
b.mPanelContainer.addEventListener('dragover', this, true);
b.mPanelContainer.addEventListener('dragleave', this, true);
b.mPanelContainer.addEventListener('drop', this, true);
},
destroy : function TabpanelDND_destroy()
{
var b = this.treeStyleTab.mTabBrowser;
b.mPanelContainer.removeEventListener('dragover', this, true);
b.mPanelContainer.removeEventListener('dragleave', this, true);
b.mPanelContainer.removeEventListener('drop', this, true);
delete this.treeStyleTab;
delete this.browser;
delete this.document;
delete this.window;
}
};

View File

@ -38,15 +38,15 @@ const EXPORTED_SYMBOLS = ['TreeStyleTabUtils'];
const Cc = Components.classes; const Cc = Components.classes;
const Ci = Components.interfaces; const Ci = Components.interfaces;
Components.utils.import('resource://treestyletab-modules/prefs.js'); Components.utils.import('resource://treestyletab-modules/lib/prefs.js');
Components.utils.import('resource://treestyletab-modules/boxObject.js'); Components.utils.import('resource://treestyletab-modules/lib/boxObject.js');
Components.utils.import('resource://treestyletab-modules/stringBundle.js'); Components.utils.import('resource://treestyletab-modules/lib/stringBundle.js');
Components.utils.import('resource://treestyletab-modules/extensions.js'); Components.utils.import('resource://treestyletab-modules/lib/extensions.js');
Components.utils.import('resource://treestyletab-modules/animationManager.js'); Components.utils.import('resource://treestyletab-modules/lib/animationManager.js');
Components.utils.import('resource://treestyletab-modules/autoScroll.js'); Components.utils.import('resource://treestyletab-modules/lib/autoScroll.js');
Components.utils.import('resource://treestyletab-modules/confirmWithTab.js'); Components.utils.import('resource://treestyletab-modules/lib/confirmWithTab.js');
Components.utils.import('resource://treestyletab-modules/namespace.jsm'); Components.utils.import('resource://treestyletab-modules/lib/namespace.jsm');
var window = getNamespaceFor('piro.sakura.ne.jp'); var window = getNamespaceFor('piro.sakura.ne.jp');
var TreeStyleTabUtils = { var TreeStyleTabUtils = {