]> git.gir.st - VimFx.git/blob - extension/packages/help.coffee
Refactor Esc key handling
[VimFx.git] / extension / packages / help.coffee
1 utils = require 'utils'
2 prefs = require 'prefs'
3 { _ } = require 'l10n'
4
5 { classes: Cc, interfaces: Ci, utils: Cu } = Components
6
7 CONTAINER_ID = 'VimFxHelpDialogContainer'
8
9 removeHelp = (document) ->
10 if div = document.getElementById(CONTAINER_ID)
11 div.parentNode.removeChild(div)
12
13 injectHelp = (document, commands) ->
14 if document.documentElement
15 if div = document.getElementById(CONTAINER_ID)
16 div.parentNode.removeChild(div)
17 div = document.createElement 'div'
18 div.id = CONTAINER_ID
19 div.className = 'VimFxReset'
20
21 div.appendChild(utils.parseHTML(document, helpDialogHtml(commands)))
22
23 document.documentElement.appendChild(div)
24
25 installHandlers(document, commands)
26
27 if button = document.getElementById('VimFxClose')
28 clickHandler = (event) ->
29 event.stopPropagation()
30 event.preventDefault()
31 removeHelp(document)
32 button.addEventListener('click', clickHandler, false)
33
34 installHandlers = (document, commands) ->
35 promptService = Cc["@mozilla.org/embedcomp/prompt-service;1"].getService(Ci.nsIPromptService);
36
37 changeHandler = (event) ->
38 name = event.target.getAttribute('data-name')
39 cmd = commands.reduce(((m, v) -> if (v.name == name) then v else m), null)
40 cmd.enabled(event.target.checked)
41
42 for cb in document.getElementsByClassName('VimFxKeyCheckbox')
43 cb.addEventListener('change', changeHandler)
44
45 removeHandler = (event) ->
46 event.preventDefault()
47 event.stopPropagation()
48 key = event.target.getAttribute('data-key')
49 name = event.target.getAttribute('data-command')
50 if cmd = commands.reduce(((m, v) -> if (v.name == name) then v else m), null)
51 title = _('help_remove_shortcut_title')
52 text = _('help_remove_shortcut_text')
53 if promptService.confirm(document.defaultView, title, text)
54 cmd.keys(cmd.keys().filter((a) -> a != key))
55 event.target.parentNode.removeChild(event.target)
56
57 for a in document.getElementsByClassName('VimFxKeyLink')
58 a.addEventListener('click', removeHandler)
59
60 addHandler = (event) ->
61 event.preventDefault()
62 event.stopPropagation()
63 name = event.target.getAttribute('data-command')
64 if cmd = commands.reduce(((m, v) -> if (v.name == name) then v else m), null)
65 title = _('help_add_shortcut_title')
66 text = _('help_add_shortcut_text')
67 value = { value: null }
68 check = { value: null }
69 if promptService.prompt(document.defaultView, title, text, value, null, check)
70 if commands.filter((c) => c.keys().indexOf(value.value) != -1).length > 0
71 textError = _('help_add_shortcut_text_already_exists')
72 promptService.alert(document.defaultView, title, textError)
73 else
74 cmd.keys(cmd.keys().concat(value.value))
75 for div in document.getElementsByClassName('VimFxKeySequence')
76 if div.getAttribute('data-command') == cmd.name
77 node = utils.parseHTML(document, hint(cmd, value.value))
78 node.querySelector('a').addEventListener('click', removeHandler)
79 div.appendChild(node)
80
81 for a in document.getElementsByClassName('VimFxAddShortcutLink')
82 a.addEventListener('click', addHandler, false)
83
84 td = (text, klass='') ->
85 """<td class="VimFxReset #{ klass }">#{ text }</td>"""
86
87 hint = (cmd, key) ->
88 keyDisplay = key.replace(/,/g, '')
89 """<a href="#" class="VimFxReset VimFxKeyLink" title="#{ _('help_remove_shortcut') }"
90 data-command="#{ cmd.name }" data-key="#{ key }">#{ keyDisplay }</a>"""
91
92 tr = (cmd) ->
93 checked = if cmd.enabled() then 'checked' else null
94 hints = """
95 <div class="VimFxKeySequence" data-command="#{ cmd.name }">
96 #{ (hint(cmd, key) for key in cmd.keys()).join('\n') }
97 </div>
98 """
99 dot = """<span class="VimFxReset VimFxDot">&#8729;</span>"""
100 cb = """<input type="checkbox" class="VimFxReset VimFxKeyCheckbox" data-name="#{ cmd.name }" #{ checked }></input>"""
101 a = """#{ cmd.help() }"""
102 add = """
103 <a href="#" data-command="#{ cmd.name }"
104 class="VimFxReset VimFxAddShortcutLink" title="#{ _('help_add_shortcut') }">&#8862;</a>
105 """
106
107 return """
108 <tr class="VimFxReset">
109 #{ td(hints) }
110 #{ td(add) }
111 #{ td(dot) }
112 #{ td(cb) }
113 #{ td(a) }
114 </tr>
115 """
116
117 table = (commands) ->
118 """
119 <table class="VimFxReset">
120 #{ (tr(cmd) for cmd in commands).join('') }
121 </table>
122 """
123
124 section = (title, commands) ->
125 """
126 <div class="VimFxReset VimFxSectionTitle">#{ title }</div>
127 #{ table(commands) }
128 """
129
130 helpDialogHtml = (commands) ->
131 return """
132 <div id="VimFxHelpDialog" class="VimFxReset">
133 <div class="VimFxReset VimFxHeader">
134 <div class="VimFxReset VimFxTitle">
135 <span class="VimFxReset VimFxTitleVim">Vim</span><span class="VimFxReset VimFxTitleFx">Fx</span>
136 <span class="VimFxReset">#{ _('help') }</span>
137 </div>
138 <span class="VimFxReset VimFxVersion">#{ _('help_version') } #{ utils.getVersion() }</span>
139 <a class="VimFxReset VimFxClose" id="VimFxClose" href="#">&#10006;</a>
140 <div class="VimFxReset VimFxClearFix"></div>
141 </div>
142
143 <div class="VimFxReset VimFxBody">
144 <div class="VimFxReset VimFxColumn">
145 #{ section(_('help_section_urls'), commands.filter((a) -> a.group == 'urls')) }
146 #{ section(_('help_section_nav'), commands.filter((a) -> a.group == 'nav')) }
147 </div>
148 <div class="VimFxReset VimFxColumn">
149 #{ section(_('help_section_tabs'), commands.filter((a) -> a.group == 'tabs')) }
150 #{ section(_('help_section_browse'), commands.filter((a) -> a.group == 'browse')) }
151 #{ section(_('help_section_misc'), commands.filter((a) -> a.group == 'misc')) }
152 </div>
153 <div class="VimFxReset VimFxClearFix"></div>
154 </div>
155
156 <div class="VimFxReset VimFxFooter">
157 <p class="VimFxReset">#{ _('help_overlapping_hints') }</p>
158 <p class="VimFxReset">
159 #{ _('help_found_bug') }
160 <a class="VimFxReset" target="_blank" href="https://github.com/akhodakivskiy/VimFx/issues">
161 #{ _('help_report_bug') }
162 </a>
163 </p>
164 <p class="VimFxReset">
165 #{ _('help_enjoying') }
166 <a class="VimFxReset" target="_blank" href="https://addons.mozilla.org/en-US/firefox/addon/vimfx/">
167 #{ _('help_feedback') }
168 </a>
169 </p>
170 </div>
171 </div>
172 """
173
174 exports.injectHelp = injectHelp
175 exports.removeHelp = removeHelp
Imprint / Impressum