タブバーの位置変更履歴を自前で保持せず、ライブラリに任せるようにした
git-svn-id: http://www.cozmixng.org/repos/piro/treestyletab/trunk@5674 599a83e7-65a4-db11-8015-0010dcdd6dc2
This commit is contained in:
parent
c5e4858203
commit
6a4511f03f
267
content/treestyletab/res/operationHistory.js
Normal file
267
content/treestyletab/res/operationHistory.js
Normal file
@ -0,0 +1,267 @@
|
|||||||
|
/*
|
||||||
|
UI Operations Global Undo History Manager
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
// window specific events
|
||||||
|
window['piro.sakura.ne.jp'].operationHistory.addEntry(
|
||||||
|
'MyAddonFeature',
|
||||||
|
{ undo : function() { ... },
|
||||||
|
redo : function() { ... } },
|
||||||
|
window
|
||||||
|
);
|
||||||
|
window['piro.sakura.ne.jp'].operationHistory.undo('MyAddonFeature', window);
|
||||||
|
window['piro.sakura.ne.jp'].operationHistory.redo('MyAddonFeature', window);
|
||||||
|
|
||||||
|
// global events (not associated to window)
|
||||||
|
window['piro.sakura.ne.jp'].operationHistory.addEntry(
|
||||||
|
'MyAddonFeature',
|
||||||
|
{ ... }
|
||||||
|
);
|
||||||
|
window['piro.sakura.ne.jp'].operationHistory.undo('MyAddonFeature');
|
||||||
|
|
||||||
|
// anonymous, window specifit
|
||||||
|
window['piro.sakura.ne.jp'].operationHistory.addEntry({ ... }, window);
|
||||||
|
window['piro.sakura.ne.jp'].operationHistory.undo(window);
|
||||||
|
|
||||||
|
// anonymous, global
|
||||||
|
window['piro.sakura.ne.jp'].operationHistory.addEntry({ ... });
|
||||||
|
window['piro.sakura.ne.jp'].operationHistory.undo();
|
||||||
|
|
||||||
|
lisence: The MIT License, Copyright (c) 2009 SHIMODA "Piro" Hiroshi
|
||||||
|
http://www.cozmixng.org/repos/piro/fx3-compatibility-lib/trunk/license.txt
|
||||||
|
original:
|
||||||
|
http://www.cozmixng.org/repos/piro/fx3-compatibility-lib/trunk/operationHistory.js
|
||||||
|
*/
|
||||||
|
(function() {
|
||||||
|
const currentRevision = 1;
|
||||||
|
|
||||||
|
if (!('piro.sakura.ne.jp' in window)) window['piro.sakura.ne.jp'] = {};
|
||||||
|
|
||||||
|
var loadedRevision = 'operationHistory' in window['piro.sakura.ne.jp'] ?
|
||||||
|
window['piro.sakura.ne.jp'].operationHistory.revision :
|
||||||
|
0 ;
|
||||||
|
if (loadedRevision && loadedRevision > currentRevision) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var tables = {};
|
||||||
|
if (loadedRevision) {
|
||||||
|
tables = window['piro.sakura.ne.jp'].operationHistory._tables;
|
||||||
|
window['piro.sakura.ne.jp'].destroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
var Cc = Components.classes;
|
||||||
|
var Ci = Components.interfaces;
|
||||||
|
|
||||||
|
window['piro.sakura.ne.jp'].operationHistory = {
|
||||||
|
revision : currentRevision,
|
||||||
|
|
||||||
|
kMAX_ENTRIES : 999,
|
||||||
|
kWINDOW_ID : 'UIOperationGlobalHistoryWindowID',
|
||||||
|
|
||||||
|
_doingUndo : false,
|
||||||
|
_tables : tables,
|
||||||
|
|
||||||
|
initialized : false,
|
||||||
|
|
||||||
|
init : function()
|
||||||
|
{
|
||||||
|
var targets = this.WindowMediator.getZOrderDOMWindowEnumerator('navigator:browser', true);
|
||||||
|
while (targets.hasMoreElements())
|
||||||
|
{
|
||||||
|
let target = targets.getNext().QueryInterface(Ci.nsIDOMWindowInternal);
|
||||||
|
if (
|
||||||
|
'piro.sakura.ne.jp' in target &&
|
||||||
|
'operationHistory' in target['piro.sakura.ne.jp'] &&
|
||||||
|
target['piro.sakura.ne.jp'].operationHistory.initialized
|
||||||
|
) {
|
||||||
|
this._tables = target['piro.sakura.ne.jp'].operationHistory._tables;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
window.addEventListener('unload', this, false);
|
||||||
|
|
||||||
|
this.initialized = true;
|
||||||
|
},
|
||||||
|
|
||||||
|
destroy : function()
|
||||||
|
{
|
||||||
|
window.removeEventListener('unload', this, false);
|
||||||
|
},
|
||||||
|
|
||||||
|
addEntry : function()
|
||||||
|
{
|
||||||
|
if (this._doingUndo)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var options = this._getOptionsFromArguments(arguments);
|
||||||
|
|
||||||
|
var history = options.history;
|
||||||
|
var entries = history.entries;
|
||||||
|
|
||||||
|
entries = entries.slice(0, history.index+1);
|
||||||
|
entries.push(options.data);
|
||||||
|
entries = entries.slice(-this.kMAX_ENTRIES);
|
||||||
|
|
||||||
|
history.entries = entries;
|
||||||
|
history.index = entries.length-1;
|
||||||
|
},
|
||||||
|
|
||||||
|
undo : function()
|
||||||
|
{
|
||||||
|
var options = this._getOptionsFromArguments(arguments);
|
||||||
|
var history = options.history;
|
||||||
|
if (history.index < 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
var error;
|
||||||
|
|
||||||
|
this._doingUndo = true;
|
||||||
|
var data = history.entries[history.index--];
|
||||||
|
try {
|
||||||
|
data.undo();
|
||||||
|
}
|
||||||
|
catch(e) {
|
||||||
|
error = e;
|
||||||
|
}
|
||||||
|
this._dispatchEvent(options);
|
||||||
|
this._doingUndo = false;
|
||||||
|
|
||||||
|
if (error) throw error;
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
|
||||||
|
redo : function()
|
||||||
|
{
|
||||||
|
var options = this._getOptionsFromArguments(arguments);
|
||||||
|
var history = options.history;
|
||||||
|
if (history.index > history.entries.length-1)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
var error;
|
||||||
|
|
||||||
|
this._doingUndo = true;
|
||||||
|
var data = history.entries[history.index++];
|
||||||
|
try {
|
||||||
|
data.redo();
|
||||||
|
}
|
||||||
|
catch(e) {
|
||||||
|
error = e;
|
||||||
|
}
|
||||||
|
this._dispatchEvent(options);
|
||||||
|
this._doingUndo = false;
|
||||||
|
|
||||||
|
if (error) throw error;
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
|
||||||
|
_dispatchEvent : function(aOptions)
|
||||||
|
{
|
||||||
|
var d = aOptions.window ? aOptions.window.document : document ;
|
||||||
|
var event = d.createEvent('Events');
|
||||||
|
event.initEvent('UIOperationGlobalHistoryUndo', true, false);
|
||||||
|
event.name = aOptions.name;
|
||||||
|
d.dispatchEvent(event);
|
||||||
|
},
|
||||||
|
|
||||||
|
_getOptionsFromArguments : function(aArguments)
|
||||||
|
{
|
||||||
|
var w, name, data;
|
||||||
|
Array.slice(aArguments).some(function(aArg) {
|
||||||
|
if (aArg instanceof Ci.nsIDOMWindow)
|
||||||
|
w = aArg;
|
||||||
|
else if (typeof aArg == 'string')
|
||||||
|
name = aArg;
|
||||||
|
else if (aArg)
|
||||||
|
data = aArg;
|
||||||
|
|
||||||
|
return (w && name && data);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!name)
|
||||||
|
name = w ? 'window' : 'global' ;
|
||||||
|
|
||||||
|
var windowId = this.SessionStore.getWindowValue(window, this.kWINDOW_ID);
|
||||||
|
if (!windowId) {
|
||||||
|
windowId = 'window-'+Date.now()+parseInt(Math.random() * 65000);
|
||||||
|
this.SessionStore.setWindowValue(window, this.kWINDOW_ID, windowId);
|
||||||
|
}
|
||||||
|
|
||||||
|
var tableName = w ? encodeURIComponent(name)+'::'+windowId : encodeURIComponent(name) ;
|
||||||
|
if (!(tableName in this._tables)) {
|
||||||
|
this._tables[tableName] = {
|
||||||
|
entries : [],
|
||||||
|
index : -1,
|
||||||
|
windowId : windowId
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
name : name,
|
||||||
|
window : w,
|
||||||
|
windowId : windowId,
|
||||||
|
data : data,
|
||||||
|
history : this._tables[tableName]
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
_getWindowById : function(aId)
|
||||||
|
{
|
||||||
|
var targets = this.WindowMediator.getZOrderDOMWindowEnumerator('navigator:browser', true);
|
||||||
|
while (targets.hasMoreElements())
|
||||||
|
{
|
||||||
|
let target = targets.getNext().QueryInterface(Ci.nsIDOMWindowInternal);
|
||||||
|
if (aId == this.SessionStore.getWindowValue(target, this.kWINDOW_ID))
|
||||||
|
return target;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
},
|
||||||
|
|
||||||
|
_deleteWindowTables : function()
|
||||||
|
{
|
||||||
|
var id = this.SessionStore.getWindowValue(window, this.kWINDOW_ID);
|
||||||
|
if (!id) return;
|
||||||
|
|
||||||
|
var removedTables = [];
|
||||||
|
for (let i in this._tables)
|
||||||
|
{
|
||||||
|
if (id == this._tables[i].windowId)
|
||||||
|
removedTables.push(i);
|
||||||
|
}
|
||||||
|
removedTables.forEach(function(aName) {
|
||||||
|
delete this._tables[aName];
|
||||||
|
}, this);
|
||||||
|
},
|
||||||
|
|
||||||
|
get WindowMediator() {
|
||||||
|
if (!this._WindowMediator) {
|
||||||
|
this._WindowMediator = Cc['@mozilla.org/appshell/window-mediator;1'].getService(Ci.nsIWindowMediator);
|
||||||
|
}
|
||||||
|
return this._WindowMediator;
|
||||||
|
},
|
||||||
|
_WindowMediator : null,
|
||||||
|
|
||||||
|
get SessionStore() {
|
||||||
|
if (!this._SessionStore) {
|
||||||
|
this._SessionStore = Cc['@mozilla.org/browser/sessionstore;1'].getService(Ci.nsISessionStore);
|
||||||
|
}
|
||||||
|
return this._SessionStore;
|
||||||
|
},
|
||||||
|
_SessionStore : null,
|
||||||
|
|
||||||
|
handleEvent : function(aEvent)
|
||||||
|
{
|
||||||
|
switch (aEvent.type)
|
||||||
|
{
|
||||||
|
case 'unload':
|
||||||
|
this._deleteWindowTables();
|
||||||
|
this.destroy();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
window['piro.sakura.ne.jp'].operationHistory.init();
|
||||||
|
})();
|
@ -12,6 +12,7 @@
|
|||||||
<script src="res/stopRendering.js" type="application/x-javascript; version=1.7"/>
|
<script src="res/stopRendering.js" type="application/x-javascript; version=1.7"/>
|
||||||
<script src="res/extensions.js" type="application/x-javascript; version=1.7"/>
|
<script src="res/extensions.js" type="application/x-javascript; version=1.7"/>
|
||||||
<script src="res/UninstallationListener.js" type="application/x-javascript; version=1.7"/>
|
<script src="res/UninstallationListener.js" type="application/x-javascript; version=1.7"/>
|
||||||
|
<script src="res/operationHistory.js" type="application/x-javascript; version=1.7"/>
|
||||||
|
|
||||||
<script src="treestyletab.js" type="application/x-javascript; version=1.7"/>
|
<script src="treestyletab.js" type="application/x-javascript; version=1.7"/>
|
||||||
<script src="treestyletabbrowser.js" type="application/x-javascript; version=1.7"/>
|
<script src="treestyletabbrowser.js" type="application/x-javascript; version=1.7"/>
|
||||||
|
@ -34,7 +34,14 @@ TreeStyleTabBrowserTabpanelDNDObserver.prototype = {
|
|||||||
let orient = (position == 'left' || position == 'right') ? 'vertical' : 'horizontal' ;
|
let orient = (position == 'left' || position == 'right') ? 'vertical' : 'horizontal' ;
|
||||||
sv.setTreePref('tabbar.fixed.'+orient, false);
|
sv.setTreePref('tabbar.fixed.'+orient, false);
|
||||||
}
|
}
|
||||||
|
var current = sv.currentTabbarPosition;
|
||||||
sv.currentTabbarPosition = position;
|
sv.currentTabbarPosition = position;
|
||||||
|
window['piro.sakura.ne.jp'].operationHistory.addEntry(
|
||||||
|
'TabbarDNDOperations',
|
||||||
|
{ undo : function() { sv.currentTabbarPosition = current; },
|
||||||
|
redo : function() { sv.currentTabbarPosition = position; } },
|
||||||
|
window
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
aEvent.stopPropagation();
|
aEvent.stopPropagation();
|
||||||
|
@ -242,8 +242,6 @@ var TreeStyleTabUtils = {
|
|||||||
this.addPrefListener(this);
|
this.addPrefListener(this);
|
||||||
this.ObserverService.addObserver(this, 'private-browsing-change-granted', false);
|
this.ObserverService.addObserver(this, 'private-browsing-change-granted', false);
|
||||||
|
|
||||||
this.onChangeTabbarPosition(this.currentTabbarPosition);
|
|
||||||
|
|
||||||
this.onPrefChange('extensions.treestyletab.indent');
|
this.onPrefChange('extensions.treestyletab.indent');
|
||||||
this.onPrefChange('extensions.treestyletab.clickOnIndentSpaces.enabled');
|
this.onPrefChange('extensions.treestyletab.clickOnIndentSpaces.enabled');
|
||||||
this.onPrefChange('browser.link.open_newwindow.restriction.override');
|
this.onPrefChange('browser.link.open_newwindow.restriction.override');
|
||||||
@ -1445,73 +1443,6 @@ var TreeStyleTabUtils = {
|
|||||||
return aValue;
|
return aValue;
|
||||||
},
|
},
|
||||||
|
|
||||||
undoChangeTabbarPosition : function TSTUtils_undoChangeTabbarPosition() /* PUBLIC API */
|
|
||||||
{
|
|
||||||
if (this._tabbarPositionHistoryIndex <= 0)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
this._inRollbackTabbarPosition = true;
|
|
||||||
|
|
||||||
var current = this.currentTabbarPosition;
|
|
||||||
var previous;
|
|
||||||
|
|
||||||
do {
|
|
||||||
previous = this._tabbarPositionHistory[--this._tabbarPositionHistoryIndex];
|
|
||||||
}
|
|
||||||
while (previous && current == previous);
|
|
||||||
|
|
||||||
this.currentTabbarPosition = previous;
|
|
||||||
|
|
||||||
this._inRollbackTabbarPosition = false;
|
|
||||||
|
|
||||||
return current != previous;
|
|
||||||
},
|
|
||||||
|
|
||||||
redoChangeTabbarPosition : function TSTUtils_redoChangeTabbarPosition() /* PUBLIC API */
|
|
||||||
{
|
|
||||||
if (this._tabbarPositionHistoryIndex >= this._tabbarPositionHistory.length-1)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
this._inRollbackTabbarPosition = true;
|
|
||||||
|
|
||||||
var current = this.currentTabbarPosition;
|
|
||||||
var next;
|
|
||||||
|
|
||||||
do {
|
|
||||||
next = this._tabbarPositionHistory[++this._tabbarPositionHistoryIndex];
|
|
||||||
}
|
|
||||||
while (next && current == next);
|
|
||||||
|
|
||||||
this.currentTabbarPosition = next;
|
|
||||||
|
|
||||||
this._inRollbackTabbarPosition = false;
|
|
||||||
|
|
||||||
return current != next;
|
|
||||||
},
|
|
||||||
|
|
||||||
onChangeTabbarPosition : function TSTUtils_onChangeTabbarPosition(aPosition)
|
|
||||||
{
|
|
||||||
var history = this._tabbarPositionHistory;
|
|
||||||
var current = history[this._tabbarPositionHistoryIndex];
|
|
||||||
if (
|
|
||||||
this._inRollbackTabbarPosition ||
|
|
||||||
(current && current == aPosition)
|
|
||||||
)
|
|
||||||
return;
|
|
||||||
|
|
||||||
history = history.slice(0, this._tabbarPositionHistoryIndex+1);
|
|
||||||
history.push(aPosition);
|
|
||||||
history = history.slice(-this.kMAX_TABBAR_POSITION_HISTORY);
|
|
||||||
|
|
||||||
this._tabbarPositionHistory = history;
|
|
||||||
this._tabbarPositionHistoryIndex = history.length-1;
|
|
||||||
},
|
|
||||||
|
|
||||||
_tabbarPositionHistory : [],
|
|
||||||
_tabbarPositionHistoryIndex : -1,
|
|
||||||
|
|
||||||
kMAX_TABBAR_POSITION_HISTORY : 999,
|
|
||||||
|
|
||||||
/* Pref Listener */
|
/* Pref Listener */
|
||||||
|
|
||||||
domains : [
|
domains : [
|
||||||
@ -1575,10 +1506,6 @@ var TreeStyleTabUtils = {
|
|||||||
this.collapseDuration = value;
|
this.collapseDuration = value;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'extensions.treestyletab.tabbar.position':
|
|
||||||
this.onChangeTabbarPosition(value);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'extensions.treestyletab.twisty.expandSensitiveArea':
|
case 'extensions.treestyletab.twisty.expandSensitiveArea':
|
||||||
this.shouldExpandTwistyArea = value;
|
this.shouldExpandTwistyArea = value;
|
||||||
break;
|
break;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user