diff options
Diffstat (limited to 'atom/packages/vim-mode/lib/view-models/vim-normal-mode-input-element.coffee')
| -rw-r--r-- | atom/packages/vim-mode/lib/view-models/vim-normal-mode-input-element.coffee | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/atom/packages/vim-mode/lib/view-models/vim-normal-mode-input-element.coffee b/atom/packages/vim-mode/lib/view-models/vim-normal-mode-input-element.coffee new file mode 100644 index 0000000..2371753 --- /dev/null +++ b/atom/packages/vim-mode/lib/view-models/vim-normal-mode-input-element.coffee @@ -0,0 +1,66 @@ +class VimNormalModeInputElement extends HTMLDivElement + createdCallback: -> + @className = "normal-mode-input" + + initialize: (@viewModel, @mainEditorElement, opts = {}) -> + if opts.class? + @classList.add(opts.class) + + @editorElement = document.createElement "atom-text-editor" + @editorElement.classList.add('editor') + @editorElement.getModel().setMini(true) + @editorElement.setAttribute('mini', '') + @appendChild(@editorElement) + + @singleChar = opts.singleChar + @defaultText = opts.defaultText ? '' + + if opts.hidden + @classList.add('vim-hidden-normal-mode-input') + @mainEditorElement.parentNode.appendChild(this) + else + @panel = atom.workspace.addBottomPanel(item: this, priority: 100) + + @focus() + @handleEvents() + + this + + handleEvents: -> + if @singleChar? + compositing = false + @editorElement.getModel().getBuffer().onDidChange (e) => + @confirm() if e.newText and not compositing + @editorElement.addEventListener 'compositionstart', -> compositing = true + @editorElement.addEventListener 'compositionend', -> compositing = false + else + atom.commands.add(@editorElement, 'editor:newline', @confirm.bind(this)) + + atom.commands.add(@editorElement, 'core:confirm', @confirm.bind(this)) + atom.commands.add(@editorElement, 'core:cancel', @cancel.bind(this)) + atom.commands.add(@editorElement, 'blur', @cancel.bind(this)) + + confirm: -> + @value = @editorElement.getModel().getText() or @defaultText + @viewModel.confirm(this) + @removePanel() + + focus: -> + @editorElement.focus() + + cancel: (e) -> + @viewModel.cancel(this) + @removePanel() + + removePanel: -> + atom.workspace.getActivePane().activate() + if @panel? + @panel.destroy() + else + this.remove() + +module.exports = +document.registerElement("vim-normal-mode-input" + extends: "div", + prototype: VimNormalModeInputElement.prototype +) |