mirror of
https://github.com/pulsar-edit/pulsar.git
synced 2024-09-11 11:15:24 +03:00
115 lines
3.1 KiB
JavaScript
115 lines
3.1 KiB
JavaScript
const { Disposable } = require('atom');
|
|
|
|
module.exports = class GrammarStatusView {
|
|
constructor(statusBar) {
|
|
this.statusBar = statusBar;
|
|
this.element = document.createElement('grammar-selector-status');
|
|
this.element.classList.add('grammar-status', 'inline-block');
|
|
this.grammarLink = document.createElement('a');
|
|
this.grammarLink.classList.add('inline-block');
|
|
this.element.appendChild(this.grammarLink);
|
|
|
|
this.activeItemSubscription = atom.workspace.observeActiveTextEditor(
|
|
this.subscribeToActiveTextEditor.bind(this)
|
|
);
|
|
|
|
this.configSubscription = atom.config.observe(
|
|
'grammar-selector.showOnRightSideOfStatusBar',
|
|
this.attach.bind(this)
|
|
);
|
|
const clickHandler = event => {
|
|
event.preventDefault();
|
|
atom.commands.dispatch(
|
|
atom.views.getView(atom.workspace.getActiveTextEditor()),
|
|
'grammar-selector:show'
|
|
);
|
|
};
|
|
this.element.addEventListener('click', clickHandler);
|
|
this.clickSubscription = new Disposable(() => {
|
|
this.element.removeEventListener('click', clickHandler);
|
|
});
|
|
}
|
|
|
|
attach() {
|
|
if (this.tile) {
|
|
this.tile.destroy();
|
|
}
|
|
|
|
this.tile = atom.config.get('grammar-selector.showOnRightSideOfStatusBar')
|
|
? this.statusBar.addRightTile({ item: this.element, priority: 10 })
|
|
: this.statusBar.addLeftTile({ item: this.element, priority: 10 });
|
|
}
|
|
|
|
destroy() {
|
|
if (this.activeItemSubscription) {
|
|
this.activeItemSubscription.dispose();
|
|
}
|
|
|
|
if (this.grammarSubscription) {
|
|
this.grammarSubscription.dispose();
|
|
}
|
|
|
|
if (this.clickSubscription) {
|
|
this.clickSubscription.dispose();
|
|
}
|
|
|
|
if (this.configSubscription) {
|
|
this.configSubscription.dispose();
|
|
}
|
|
|
|
if (this.tile) {
|
|
this.tile.destroy();
|
|
}
|
|
|
|
if (this.tooltip) {
|
|
this.tooltip.dispose();
|
|
}
|
|
}
|
|
|
|
subscribeToActiveTextEditor() {
|
|
if (this.grammarSubscription) {
|
|
this.grammarSubscription.dispose();
|
|
this.grammarSubscription = null;
|
|
}
|
|
|
|
const editor = atom.workspace.getActiveTextEditor();
|
|
if (editor) {
|
|
this.grammarSubscription = editor.onDidChangeGrammar(
|
|
this.updateGrammarText.bind(this)
|
|
);
|
|
}
|
|
this.updateGrammarText();
|
|
}
|
|
|
|
updateGrammarText() {
|
|
atom.views.updateDocument(() => {
|
|
const editor = atom.workspace.getActiveTextEditor();
|
|
const grammar = editor ? editor.getGrammar() : null;
|
|
|
|
if (this.tooltip) {
|
|
this.tooltip.dispose();
|
|
this.tooltip = null;
|
|
}
|
|
|
|
if (grammar) {
|
|
let grammarName = null;
|
|
if (grammar === atom.grammars.nullGrammar) {
|
|
grammarName = 'Plain Text';
|
|
} else {
|
|
grammarName = grammar.name || grammar.scopeName;
|
|
}
|
|
|
|
this.grammarLink.textContent = grammarName;
|
|
this.grammarLink.dataset.grammar = grammarName;
|
|
this.element.style.display = '';
|
|
|
|
this.tooltip = atom.tooltips.add(this.element, {
|
|
title: `File uses the ${grammarName} grammar`
|
|
});
|
|
} else {
|
|
this.element.style.display = 'none';
|
|
}
|
|
});
|
|
}
|
|
};
|