pulsar/packages/go-to-line/lib/go-to-line-view.js
2019-05-31 18:33:56 +02:00

112 lines
3.0 KiB
JavaScript

'use babel';
import { Point, TextEditor } from 'atom';
class GoToLineView {
constructor() {
this.miniEditor = new TextEditor({ mini: true });
this.miniEditor.element.addEventListener('blur', this.close.bind(this));
this.message = document.createElement('div');
this.message.classList.add('message');
this.element = document.createElement('div');
this.element.classList.add('go-to-line');
this.element.appendChild(this.miniEditor.element);
this.element.appendChild(this.message);
this.panel = atom.workspace.addModalPanel({
item: this,
visible: false
});
atom.commands.add('atom-text-editor', 'go-to-line:toggle', () => {
this.toggle();
return false;
});
atom.commands.add(this.miniEditor.element, 'core:confirm', () => {
this.navigate();
});
atom.commands.add(this.miniEditor.element, 'core:cancel', () => {
this.close();
});
this.miniEditor.onWillInsertText(arg => {
if (arg.text.match(/[^0-9:]/)) {
arg.cancel();
}
});
this.miniEditor.onDidChange(() => {
this.navigate({ keepOpen: true });
});
}
toggle() {
this.panel.isVisible() ? this.close() : this.open();
}
close() {
if (!this.panel.isVisible()) return;
this.miniEditor.setText('');
this.panel.hide();
if (this.miniEditor.element.hasFocus()) {
this.restoreFocus();
}
}
navigate(options = {}) {
const lineNumber = this.miniEditor.getText();
const editor = atom.workspace.getActiveTextEditor();
if (!options.keepOpen) {
this.close();
}
if (!editor || !lineNumber.length) return;
const currentRow = editor.getCursorBufferPosition().row;
const rowLineNumber = lineNumber.split(/:+/)[0] || '';
const row =
rowLineNumber.length > 0 ? parseInt(rowLineNumber) - 1 : currentRow;
const columnLineNumber = lineNumber.split(/:+/)[1] || '';
const column =
columnLineNumber.length > 0 ? parseInt(columnLineNumber) - 1 : -1;
const position = new Point(row, column);
editor.setCursorBufferPosition(position);
editor.unfoldBufferRow(row);
if (column < 0) {
editor.moveToFirstCharacterOfLine();
}
editor.scrollToBufferPosition(position, {
center: true
});
}
storeFocusedElement() {
this.previouslyFocusedElement = document.activeElement;
return this.previouslyFocusedElement;
}
restoreFocus() {
if (
this.previouslyFocusedElement &&
this.previouslyFocusedElement.parentElement
) {
return this.previouslyFocusedElement.focus();
}
atom.views.getView(atom.workspace).focus();
}
open() {
if (this.panel.isVisible() || !atom.workspace.getActiveTextEditor()) return;
this.storeFocusedElement();
this.panel.show();
this.message.textContent =
'Enter a <row> or <row>:<column> to go there. Examples: "3" for row 3 or "2:7" for row 2 and column 7';
this.miniEditor.element.focus();
}
}
export default {
activate() {
return new GoToLineView();
}
};