diff --git a/lib/runtime.coffee b/lib/runtime.coffee deleted file mode 100644 index 5c10db2a..00000000 --- a/lib/runtime.coffee +++ /dev/null @@ -1,77 +0,0 @@ -{ CompositeDisposable, Disposable } = require 'atom' - -module.exports = - modules: require './runtime/modules' - environments: require './runtime/environments' - evaluation: require './runtime/evaluation' - console: require './runtime/console' - completions: require './runtime/completions' - workspace: require './runtime/workspace' - plots: require './runtime/plots' - frontend: require './runtime/frontend' - debugger: require './runtime/debugger' - profiler: require './runtime/profiler' - outline: require './runtime/outline' - linter: require './runtime/linter' - packages: require './runtime/packages' - debuginfo: require './runtime/debuginfo' - formatter: require './runtime/formatter' - goto: require './runtime/goto' - - activate: -> - @subs = new CompositeDisposable() - - @modules.activate() - @completions.activate() - @subs.add atom.config.observe 'julia-client.juliaOptions.formatOnSave', (val) => - if val - @formatter.activate() - else - @formatter.deactivate() - - @subs.add new Disposable(=> - mod.deactivate() for mod in [@modules, @completions, @formatter]) - - deactivate: -> - @subs.dispose() - - consumeInk: (ink) -> - @evaluation.ink = ink - for mod in [@console, @debugger, @profiler, @linter, @goto, @outline, @frontend] - mod.activate(ink) - for mod in [@workspace, @plots] - mod.ink = ink - mod.activate() - @subs.add new Disposable => - mod.deactivate() for mod in [@console, @debugger, @profiler, @linter, @goto, @outline] - @environments.consumeInk(ink) - - provideAutoComplete: -> @completions - - provideHyperclick: -> @goto.provideHyperclick() - - consumeStatusBar: (bar) -> - m = @modules.consumeStatusBar bar - e = @environments.consumeStatusBar bar - d = new Disposable => - m.dispose() - e.dispose() - @subs.add d - return d - - consumeDatatip: (datatipService) -> - datatipProvider = require './runtime/datatip' - # @NOTE: Check if the service is passed by Atom-IDE-UI's datatip service: - # currently atom-ide-datatip can't render code snippets correctly. - if datatipService.constructor.name == 'DatatipManager' - datatipProvider.useAtomIDEUI = true - else - # @NOTE: Overwrite the weird default config settings of atom-ide-datatip - atom.config.set 'atom-ide-datatip', - showDataTipOnCursorMove: false - showDataTipOnMouseMove: true - datatipDisposable = datatipService.addProvider(datatipProvider) - @subs.add(datatipDisposable) - datatipDisposable - - handleURI: require './runtime/urihandler' diff --git a/lib/runtime.js b/lib/runtime.js new file mode 100644 index 00000000..3e4cfd45 --- /dev/null +++ b/lib/runtime.js @@ -0,0 +1,120 @@ +'use babel' +import { CompositeDisposable, Disposable } from 'atom'; + +// TODO use babel to export ... from ... +import modules from './runtime/modules' +import * as environments from './runtime/environments' +import evaluation from './runtime/evaluation' +import * as repl from './runtime/console' // console is a is a reserved keyword +import completions from './runtime/completions' +import workspace from './runtime/workspace' +import plots from './runtime/plots' +import * as frontend from './runtime/frontend' +import * as debug from './runtime/debugger' // debugger is a is a reserved keyword +import * as profiler from './runtime/profiler' +import * as outline from './runtime/outline' +import * as linter from './runtime/linter' +import * as packages from './runtime/packages' +import debuginfo from './runtime/debuginfo' +import * as formatter from './runtime/formatter' +import goto from './runtime/goto' +import handleURI from "./runtime/urihandler"; + +let subs; + +export function activate() { + subs = new CompositeDisposable(); + + modules.activate(); + completions.activate(); + subs.add(atom.config.observe('julia-client.juliaOptions.formatOnSave', val => { + if (val) { + formatter.activate(); + } else { + formatter.deactivate(); + } + }) + ); + + subs.add(new Disposable(() => { + [modules, completions, formatter].map((mod) => mod.deactivate()); + }) + ); +} + +export function deactivate() { + subs.dispose(); +} + +export function consumeInk(ink) { + evaluation.ink = ink; + for (let mod of [repl, debug, profiler, linter, goto, outline, frontend]) { + mod.activate(ink); + } + for (let mod of [workspace, plots]) { + mod.ink = ink; + mod.activate(); + } + + subs.add( + new Disposable(() => { + for (let mod of [repl, debug, profiler, linter, goto, outline]) { + mod.deactivate(); + } + }) + ); + + environments.consumeInk(ink); +} + +export function provideAutoComplete() { return completions; } + +export function provideHyperclick() { return goto.provideHyperclick(); } + +export function consumeStatusBar(bar) { + const m = modules.consumeStatusBar(bar); + const e = environments.consumeStatusBar(bar); + const d = new Disposable(() => { + m.dispose(); + e.dispose(); + }); + subs.add(d); + return d; +} + +export function consumeDatatip(datatipService) { + const datatipProvider = require('./runtime/datatip'); + // @NOTE: Check if the service is passed by Atom-IDE-UI's datatip service: + // currently atom-ide-datatip can't render code snippets correctly. + if (datatipService.constructor.name === 'DatatipManager') { + datatipProvider.useAtomIDEUI = true; + } else { + // @NOTE: Overwrite the weird default config settings of atom-ide-datatip + atom.config.set('atom-ide-datatip', { + showDataTipOnCursorMove: false, + showDataTipOnMouseMove: true + } + ); + } + const datatipDisposable = datatipService.addProvider(datatipProvider); + subs.add(datatipDisposable); + return datatipDisposable; +} + +exports.modules = modules +exports.environments = environments +exports.evaluation = evaluation +exports.repl = repl +exports.completions = completions +exports.workspace = workspace +exports.plots = plots +exports.frontend = frontend +exports.debug = debug +exports.profiler = profiler +exports.outline = outline +exports.linter = linter +exports.packages = packages +exports.debuginfo = debuginfo +exports.formatter = formatter +exports.goto = goto +exports.handleURI = handleURI diff --git a/lib/runtime/evaluation.coffee b/lib/runtime/evaluation.coffee index b9c68781..2219bc42 100644 --- a/lib/runtime/evaluation.coffee +++ b/lib/runtime/evaluation.coffee @@ -3,7 +3,12 @@ path = require 'path' {dialog, BrowserWindow} = require('electron').remote {client} = require '../connection' -{notifications, views, selector, docpane} = require '../ui' + +views = require '../ui/views' +notifications = require '../ui/notifications' +selector = require '../ui/selector' +docpane = require '../ui/docs' + {paths, blocks, cells, words, weave} = require '../misc' {processLinks} = require '../ui/docs' workspace = require './workspace' diff --git a/lib/runtime/plots.js b/lib/runtime/plots.js index 9ce7802c..1d475cef 100644 --- a/lib/runtime/plots.js +++ b/lib/runtime/plots.js @@ -1,9 +1,7 @@ 'use babel' import { client } from '../connection' -import { views } from '../ui' - -const { webview } = views.tags +import { tags } from '../ui/views' function consoleLog (e) { let log diff --git a/lib/runtime/workspace.coffee b/lib/runtime/workspace.coffee index e4e9d172..70ba2858 100644 --- a/lib/runtime/workspace.coffee +++ b/lib/runtime/workspace.coffee @@ -1,7 +1,7 @@ {CompositeDisposable} = require 'atom' -{client} = require '../connection' -{views} = require '../ui' +client = require '../connection/client' +views = require '../ui/views' goto = require './goto' modules = require './modules' diff --git a/lib/ui.coffee b/lib/ui.coffee deleted file mode 100644 index caf613e8..00000000 --- a/lib/ui.coffee +++ /dev/null @@ -1,42 +0,0 @@ -{CompositeDisposable, Disposable} = require 'atom' - -module.exports = - notifications: require './ui/notifications' - selector: require './ui/selector' - views: require './ui/views' - progress: require './ui/progress' - layout: require './ui/layout' - docpane: require './ui/docs' - focusutils: require './ui/focusutils' - cellhighlighter: require './ui/cellhighlighter' - - activate: (@client) -> - @subs = new CompositeDisposable - - @notifications.activate() - @subs.add atom.config.observe 'julia-client.uiOptions.highlightCells', (val) => - if val - @cellhighlighter.activate() - else - @cellhighlighter.deactivate() - @subs.add new Disposable => - @cellhighlighter.deactivate() - - @subs.add @client.onAttached => - @notifications.show("Client Connected") - @subs.add @client.onDetached => - @ink?.Result.invalidateAll() - - deactivate: -> - @subs.dispose() - - consumeInk: (@ink) -> - @views.ink = @ink - @selector.activate(@ink) - @docpane.activate(@ink) - @progress.activate(@ink) - @focusutils.activate(@ink) - @subs.add(new Disposable(=> - @docpane.deactivate() - @progress.deactivate() - @focusutils.deactivate())) diff --git a/lib/ui.js b/lib/ui.js new file mode 100644 index 00000000..40470870 --- /dev/null +++ b/lib/ui.js @@ -0,0 +1,73 @@ +'use babel' +import { CompositeDisposable, Disposable } from 'atom'; + +// TODO use babel to export ... from ... +import notifications from './ui/notifications' +import * as selector from './ui/selector' +import * as views from './ui/views' +import * as progress from './ui/progress' +import * as layout from './ui/layout' +import * as docpane from './ui/docs' +import * as focusutils from './ui/focusutils' +import * as cellhighlighter from './ui/cellhighlighter' + +let client; +let subs; +let ink; + +export function activate(client_in) { + client = client_in; + subs = new CompositeDisposable; + + notifications.activate(); + subs.add(atom.config.observe('julia-client.uiOptions.highlightCells', val => { + if (val) { + cellhighlighter.activate(); + } else { + cellhighlighter.deactivate(); + } + }) + ); + subs.add(new Disposable(() => { + cellhighlighter.deactivate(); + }) + ); + + subs.add(client.onAttached(() => { + notifications.show("Client Connected"); + }) + ); + subs.add(client.onDetached(() => { + if (ink) { + ink.Result.invalidateAll() + } + }) + ); +} + +export function deactivate() { + subs.dispose(); +} + +export function consumeInk(ink_in) { + ink = ink_in; + views.activate(ink); + selector.activate(ink); + docpane.activate(ink); + progress.activate(ink); + focusutils.activate(ink); + subs.add(new Disposable(() => { + docpane.deactivate(); + progress.deactivate(); + focusutils.deactivate(); + })); +} + +exports.notifications = notifications +exports.selector = selector +exports.views = views +exports.progress = progress +exports.layout = layout +exports.docpane = docpane +exports.focusutils = focusutils +exports.cellhighlighter = cellhighlighter diff --git a/lib/ui/layout.js b/lib/ui/layout.js index 0e4dadbc..73f1753b 100644 --- a/lib/ui/layout.js +++ b/lib/ui/layout.js @@ -1,26 +1,15 @@ 'use babel' -const repl = () => { - return require('../runtime').console -} -const workspace = () => { - return require('../runtime').workspace -} -const documentation = () => { - return require('../ui').docpane -} -const plotPane = () => { - return require('../runtime').plots -} -const debuggerPane = () => { - return require('../runtime').debugger -} -const linter = () => { - return require('../runtime').linter -} -const outline = () => { - return require('../runtime').outline -} +import { + repl, + workspace, + plots as plotPane, + debug as debuggerPane, + linter, + outline +} from '../runtime' + +import {docpane as documentation} from '../ui' function specifiedPanes () { const panes = [] @@ -41,7 +30,7 @@ export function closePromises () { const panes = specifiedPanes() const promises = panes.map(pane => { - return pane().close() + return pane.close() }) return promises @@ -86,10 +75,10 @@ function openPanesHelper (panes) { } const pane = panes.shift() - pane().open().catch((err) => { + pane.open().catch((err) => { // @FIXME: This is a temporal remedy for https://github.com/JunoLab/atom-julia-client/pull/561#issuecomment-500150318 console.error(err) - pane().open() + pane.open() }).finally(() => { // Re-focus the previously focused pane (i.e. the bundled pane by `bundlePanes`) after each opening // This prevents opening multiple panes with the same splitting rule in a same location from