]> git.gir.st - VimFx.git/blob - extension/packages/button.coffee
Merge pull request #137 from ctype/delocale
[VimFx.git] / extension / packages / button.coffee
1 { getPref
2 , setPref } = require 'prefs'
3 { injectHelp } = require 'help'
4 { commandsHelp } = require 'commands'
5 utils = require 'utils'
6
7 KEYSET_ID = 'vimfx-keyset'
8 BUTTON_ID = 'vimfx-toolbar-button'
9 KEY_ID = 'vimfx-key'
10 MENUPOPUP_ID = 'vimfx-menupopup'
11 MENU_ITEM_PREF = 'vimfx-menu-item-preferences'
12 MENU_ITEM_HELP = 'vimfx-menu-item-help'
13 TEXTBOX_BLACKLIST_ID = 'vimfx-textbox-blacklist-id'
14 BUTTON_BLACKLIST_ID = 'vimfx-button-blacklist-id'
15
16 $ = (doc, sel) -> doc.getElementById(sel)
17 $$ = (doc, sel) -> doc.querySelectorAll(sel)
18
19 positions = {}
20
21 setButtonInstallPosition = (toolbarId, beforeId) ->
22 positions[BUTTON_ID] = [toolbarId, beforeId]
23
24 persist = (document, toolbar, buttonId, beforeId) ->
25 currentset = toolbar.currentSet.split(',')
26 idx = if beforeId then currentset.indexOf(beforeId) else -1
27 if idx != -1
28 currentset.splice(idx, 0, buttonId)
29 else
30 currentset.push(buttonId)
31
32 toolbar.setAttribute('currentset', currentset.join(','))
33 document.persist(toolbar.id, 'currentset')
34 return [currentset, idx]
35
36 restorePosition = (doc, button) ->
37 $(doc, 'navigator-toolbox').palette.appendChild(button)
38
39 for tb in $$(doc, 'toolbar')
40 currentset = tb.getAttribute('currentset').split(',')
41 idx = currentset.indexOf(button.id)
42 if idx != -1
43 toolbar = tb
44 break
45
46 # Saved position not found, using the default one, after persisting it
47 if !toolbar and pos = positions[button.id]
48 [tbID, beforeId] = pos
49 if toolbar = $(doc, tbID)
50 [currentset, idx] = persist(doc, toolbar, button.id, beforeId)
51
52 if toolbar and idx != -1
53 # Inserting the button before the first item in `currentset`
54 # after `idx` that is present in the document
55 for i in [idx + 1 ... currentset.length]
56 if before = $(doc, currentset[i])
57 toolbar.insertItem(button.id, before)
58 return
59
60 toolbar.insertItem(button.id)
61
62 iconUrl = do ->
63 kinds =
64 normal: getResourceURI('resources/icon16.png').spec
65 grey: getResourceURI('resources/icon16-grey.png').spec
66 red: getResourceURI('resources/icon16-red.png').spec
67 blacklist: getResourceURI('resources/icon16-blacklist.png').spec
68
69 return (kind) -> "url(#{ kinds[kind] })"
70
71
72 createMenupopup = (window) ->
73 doc = window.document
74
75 blacklistTextbox = doc.createElement('textbox')
76 blacklistTextbox.id = TEXTBOX_BLACKLIST_ID
77 blacklistButton = doc.createElement('toolbarbutton')
78 blacklistButton.id = BUTTON_BLACKLIST_ID
79 blacklistButton.setAttribute('tooltiptext', _('item_blacklist_button_tooltip'))
80 blacklistButton.setAttribute('class', 'toolbarbutton-1')
81 blacklistButton.style.listStyleImage = iconUrl('blacklist')
82 hbox = doc.createElement('hbox')
83 hbox.appendChild(blacklistTextbox)
84 hbox.appendChild(blacklistButton)
85
86 itemPreferences = doc.createElement('menuitem')
87 itemPreferences.id = MENU_ITEM_PREF
88 itemPreferences.setAttribute('label', _('item_preferences'))
89
90 itemHelp = doc.createElement('menuitem')
91 itemHelp.id = MENU_ITEM_HELP
92 itemHelp.setAttribute('label', _('item_help'))
93
94 menupopup = doc.createElement('menupopup')
95 menupopup.id = MENUPOPUP_ID
96 menupopup.setAttribute('ignorekeys', true)
97 menupopup.appendChild(hbox)
98 menupopup.appendChild(itemPreferences)
99 menupopup.appendChild(itemHelp)
100
101 onPopupShowing = (event) ->
102 if tabWindow = window.gBrowser.selectedTab.linkedBrowser.contentWindow
103 blacklistTextbox.value = "*#{ tabWindow.location.host }*"
104
105 onBlacklistButtonCommand = (event) ->
106 blackList = getPref('black_list')
107 blackList += ', ' if blackList.length > 0
108 blackList += blacklistTextbox.value
109
110 setPref('black_list', blackList)
111 menupopup.hidePopup()
112
113 if tabWindow = window.gBrowser.selectedTab.linkedBrowser.contentWindow
114 tabWindow.location.reload(false)
115
116 event.stopPropagation()
117
118 onPreferencesCommand = (event) ->
119 id = encodeURIComponent(getPref('addon_id'))
120 window.BrowserOpenAddonsMgr("addons://detail/#{ id }/preferences")
121
122 event.stopPropagation()
123
124 onHelpCommand = (event) ->
125 if tabWindow = window.gBrowser.selectedTab.linkedBrowser.contentWindow
126 injectHelp(tabWindow.document, commandsHelp)
127
128 event.stopPropagation()
129
130 menupopup.addEventListener 'popupshowing', onPopupShowing, false
131 blacklistButton.addEventListener 'command', onBlacklistButtonCommand, false
132 itemPreferences.addEventListener 'command', onPreferencesCommand, false
133 itemHelp.addEventListener 'command', onHelpCommand, false
134
135 return menupopup
136
137 createButton = (window) ->
138 doc = window.document
139
140 button = doc.createElement('toolbarbutton')
141 button.setAttribute('id', BUTTON_ID)
142 button.setAttribute('type', 'menu-button')
143 button.setAttribute('label', 'VimFx')
144 button.setAttribute('class', 'toolbarbutton-1')
145
146 # Create and install event listeners
147 onButtonCommand = (event) ->
148 # Change disabled state value which is stored in Prefs
149 setPref('disabled', not getPref 'disabled')
150 updateToolbarButton(button)
151
152 event.stopPropagation()
153
154 button.addEventListener('command', onButtonCommand, false)
155
156 menupopup = createMenupopup(window)
157 button.appendChild(menupopup)
158
159 vimkey = doc.createElement('key')
160 vimkey.setAttribute('id', KEY_ID)
161 vimkey.setAttribute('key', 'V')
162 vimkey.setAttribute('modifiers', 'shift,alt')
163 vimkey.setAttribute('oncommand', 'void(0);')
164 vimkey.addEventListener('command', onButtonCommand, false)
165
166 keyset = doc.createElement('keyset')
167 keyset.setAttribute('id', KEYSET_ID)
168 keyset.appendChild(vimkey)
169
170 return [button, keyset]
171
172 addToolbarButton = (window) ->
173 doc = window.document
174 win = doc.querySelector('window')
175
176 [button, keyset] = createButton(window)
177 updateToolbarButton(button)
178
179 restorePosition(doc, button)
180 win.appendChild(keyset)
181
182 unload ->
183 if buttonParent = button.parentNode
184 buttonParent.removeChild(button)
185 if keysetParent = keyset.parentNode
186 keysetParent.removeChild(keyset)
187 $(doc, 'navigator-toolbox').palette.removeChild(button)
188
189 updateToolbarButton = (button) ->
190 if getPref('disabled')
191 button.style.listStyleImage = iconUrl('grey')
192 button.setAttribute('tooltiptext', _('button_tooltip_disabled'))
193 else if button['VimFx_blacklisted']
194 button.style.listStyleImage = iconUrl('red')
195 button.setAttribute('tooltiptext', _('button_tooltip_blacklisted'))
196 else
197 button.style.listStyleImage = iconUrl('normal')
198 button.setAttribute('tooltiptext', _('button_tooltip_enabled'))
199
200 setWindowBlacklisted = (window, blacklisted) ->
201 if button = $(window.document, BUTTON_ID)
202 button['VimFx_blacklisted'] = blacklisted
203 updateToolbarButton(button)
204
205 exports.addToolbarButton = addToolbarButton
206 exports.setWindowBlacklisted = setWindowBlacklisted
207 exports.setButtonInstallPosition = setButtonInstallPosition
Imprint / Impressum