mirror of
https://github.com/pulsar-edit/pulsar.git
synced 2024-09-19 23:17:16 +03:00
112 lines
3.0 KiB
JavaScript
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();
|
|
}
|
|
};
|