-
Notifications
You must be signed in to change notification settings - Fork 3
/
buttons.js
106 lines (97 loc) · 3.78 KB
/
buttons.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
/* ***** BEGIN LICENSE BLOCK *****
* Version: MIT/X11 License
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
* Contributor(s):
* Dmitry Gutov <dgutov@yandex.ru> (Original Author)
* Erik Vold <erikvvold@gmail.com>
*
* ***** END LICENSE BLOCK ***** */
(function(global) {
let positions = {};
/*
* Assigns position that will be used by `restorePosition`
* if the button is not found on any toolbar's current set.
* If `beforeID` is null, or no such item is found on the toolbar,
* the button will be added to the end.
* @param beforeID ID of the element before which the button will be inserted.
*/
global.setDefaultPosition = function(buttonID, toolbarID, beforeID) {
positions[buttonID] = [toolbarID, beforeID];
};
/*
* Restores the button's saved position.
* @param {XULDocument} doc XUL window document.
* @param {XULElement} button button element.
*/
global.restorePosition = function(doc, button) {
function $(sel, all) {
return doc[all ? "querySelectorAll" : "getElementById"](sel);
}
($("navigator-toolbox") || $("mail-toolbox")).palette.appendChild(button);
let toolbar, currentset, idx,
toolbars = $("toolbar", true);
for (let i = 0; i < toolbars.length; ++i) {
let tb = toolbars[i];
currentset = getCurrentset(tb),
idx = currentset.indexOf(button.id);
if (idx != -1) {
toolbar = tb;
break;
}
}
// saved position not found, using the default one, if any
if (!toolbar && (button.id in positions)) {
let [tbID, beforeID] = positions[button.id];
toolbar = $(tbID);
[currentset, idx] = persist(doc, toolbar, button.id, beforeID);
}
if (toolbar) {
if (idx != -1) {
// inserting the button before the first item in `currentset`
// after `idx` that is present in the document
for (let i = idx + 1; i < currentset.length; ++i) {
let before = $(currentset[i]);
if (before) {
toolbar.insertItem(button.id, before);
return;
}
}
}
toolbar.insertItem(button.id);
}
};
function persist(document, toolbar, buttonID, beforeID) {
let currentset = getCurrentset(toolbar),
idx = (beforeID && currentset.indexOf(beforeID)) || -1;
if (idx != -1) {
currentset.splice(idx, 0, buttonID);
} else {
currentset.push(buttonID);
}
toolbar.setAttribute("currentset", currentset.join(","));
document.persist(toolbar.id, "currentset");
return [currentset, idx];
}
function getCurrentset(toolbar) {
return (toolbar.getAttribute("currentset") ||
toolbar.getAttribute("defaultset")).split(",");
}
})(this);