From 6c56221afe5df8f554a7db59186b61b487f19a1f Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Mon, 26 Sep 2011 17:22:01 -0700 Subject: [PATCH] Editor is now a plugin! This means everything is pretty modular now (and the code is a little event heavy) --- plugins/editor/editor-pane.coffee | 24 ++++++++++ {src => plugins/editor}/editor.coffee | 67 +++++++++++++++------------ plugins/editor/index.coffee | 1 + plugins/modes/index.coffee | 1 - plugins/modes/modes.coffee | 32 ------------- plugins/tabs/tabs.coffee | 3 +- plugins/tabs/tabsPane.coffee | 2 +- src/window.coffee | 51 ++++++++++---------- 8 files changed, 90 insertions(+), 91 deletions(-) create mode 100644 plugins/editor/editor-pane.coffee rename {src => plugins/editor}/editor.coffee (78%) create mode 100644 plugins/editor/index.coffee delete mode 100644 plugins/modes/index.coffee delete mode 100644 plugins/modes/modes.coffee diff --git a/plugins/editor/editor-pane.coffee b/plugins/editor/editor-pane.coffee new file mode 100644 index 000000000..c6fbe8406 --- /dev/null +++ b/plugins/editor/editor-pane.coffee @@ -0,0 +1,24 @@ +$ = require 'jquery' + +Pane = require 'pane' + +module.exports = +class EditorPane extends Pane + position: 'main' + + html: $ '
' + + # You know what I don't like? This constructor. + constructor: (@window, @editor) -> + super @window + + # Resize editor when panes are added/removed + el = document.body + el.addEventListener 'DOMNodeInsertedIntoDocument', => @resize() + el.addEventListener 'DOMNodeRemovedFromDocument', => @resize() + + resize: (timeout=1) -> + setTimeout => + @editor.ace.focus() + @editor.ace.resize() + , timeout diff --git a/src/editor.coffee b/plugins/editor/editor.coffee similarity index 78% rename from src/editor.coffee rename to plugins/editor/editor.coffee index 3f0e1f629..ff0b7458d 100644 --- a/src/editor.coffee +++ b/plugins/editor/editor.coffee @@ -2,7 +2,8 @@ _ = require 'underscore' File = require 'fs' Chrome = require 'chrome' -Pane = require 'pane' +Plugin = require 'plugin' +EditorPane = require 'editor/editor-pane' {bindKey} = require 'keybinder' @@ -12,15 +13,15 @@ ace = require 'ace/ace' {UndoManager} = require 'ace/undomanager' module.exports = -class Editor extends Pane +class Editor extends Plugin filename: null - position: 'main' - html: '
' - keymap: -> + # Maybe these don't go here? 'Command-S' : 'save' 'Command-Shift-S' : 'saveAs' + + # These are cool though. 'Command-C' : 'copy' 'Command-X' : 'cut' 'Command-R' : 'eval' @@ -34,30 +35,49 @@ class Editor extends Pane 'Alt-Shift-.' : 'end' 'Ctrl-L' : 'consolelog' + modeMap: + js: 'javascript' + c: 'c_cpp' + cpp: 'c_cpp' + h: 'c_cpp' + m: 'c_cpp' + md: 'markdown' + cs: 'csharp' + rb: 'ruby' + sessions: {} constructor: (args...) -> super(args...) - for shortcut, method of @keymap() - bindKey @, shortcut, method + @pane = new EditorPane @window + @pane.add() @ace = ace.edit "editor" + + # This stuff should all be grabbed from the .atomicity dir @ace.setTheme require "ace/theme/twilight" @ace.getSession().setUseSoftTabs true @ace.getSession().setTabSize 2 - @ace.pane = this @ace.setShowInvisibles(true) @ace.setPrintMarginColumn 78 - @ace.getSession().on 'change', -> - @window.setDirty true + @ace.getSession().on 'change', -> @window.setDirty true + @window.on 'open', ({filename}) => @open filename + @window.on 'close', ({filename}) => @close filename - el = document.body - el.addEventListener 'DOMNodeInsertedIntoDocument', => - @resize() - el.addEventListener 'DOMNodeRemovedFromDocument', => - @resize() + modeForLanguage: (language) -> + language = language.toLowerCase() + modeName = @modeMap[language] or language + + try + require("ace/mode/#{modeName}").Mode + catch e + null + + setMode: -> + if mode = @modeForLanguage _.last @filename.split '.' + @ace.getSession().setMode new mode save: -> return @saveAs() if not @filename @@ -66,7 +86,7 @@ class Editor extends Pane File.write @filename, @code() @sessions[@filename] = @ace.getSession() @window.setDirty false - @window._emit 'save', { @filename } + @window._emit 'save', { filename: @filename } open: (path) -> path = Chrome.openPanel() if not path @@ -86,12 +106,10 @@ class Editor extends Pane @sessions[@filename] or= @newSession File.read @filename @ace.setSession @sessions[@filename] @window.setDirty false - - @window._emit 'open', { @filename } + @setMode() close: (path) -> @deleteSession path - @window._emit 'close', { filename : path } saveAs: -> if file = Chrome.savePanel() @@ -109,17 +127,6 @@ class Editor extends Pane regExp: true wrap: true - resize: (timeout=1) -> - setTimeout => - @ace.focus() - @ace.resize() - , timeout - - switchToSession: (path) -> - if @sessions[path] - @filename = path - @ace.setSession @sessions[path] - deleteSession: (path) -> if path is @filename @filename = null diff --git a/plugins/editor/index.coffee b/plugins/editor/index.coffee new file mode 100644 index 000000000..a2cb9f92a --- /dev/null +++ b/plugins/editor/index.coffee @@ -0,0 +1 @@ +module.exports = require 'editor/editor' diff --git a/plugins/modes/index.coffee b/plugins/modes/index.coffee deleted file mode 100644 index 1c6a0f314..000000000 --- a/plugins/modes/index.coffee +++ /dev/null @@ -1 +0,0 @@ -module.exports = require 'modes/modes' diff --git a/plugins/modes/modes.coffee b/plugins/modes/modes.coffee deleted file mode 100644 index bf51e9248..000000000 --- a/plugins/modes/modes.coffee +++ /dev/null @@ -1,32 +0,0 @@ -_ = require 'underscore' - -Plugin = require 'plugin' - -module.exports = -class Modes extends Plugin - load: -> - @window.on 'open', ({filename}) => @setMode(filename) - @window.on 'save', ({filename}) => @setMode(filename) - - modeMap: - js: 'javascript' - c: 'c_cpp' - cpp: 'c_cpp' - h: 'c_cpp' - m: 'c_cpp' - md: 'markdown' - cs: 'csharp' - rb: 'ruby' - - modeForLanguage: (language) -> - language = language.toLowerCase() - modeName = @modeMap[language] or language - - try - require("ace/mode/#{modeName}").Mode - catch e - null - - setMode: (filename) -> - if mode = @modeForLanguage _.last filename.split '.' - @window.document.ace.getSession().setMode new mode diff --git a/plugins/tabs/tabs.coffee b/plugins/tabs/tabs.coffee index 368b6905a..04a99a520 100644 --- a/plugins/tabs/tabs.coffee +++ b/plugins/tabs/tabs.coffee @@ -39,8 +39,7 @@ class Tabs extends Plugin # Move all of this methods below to pane? I think so closeActiveTab: -> activeTab = $('#tabs ul .active') - # I don't like how this is talking directly to the document/editor - @window.document.close(activeTab.data 'path') + @window.close activeTab.data 'path' nextTab: -> @pane.switchToTab $('#tabs ul .active').next() diff --git a/plugins/tabs/tabsPane.coffee b/plugins/tabs/tabsPane.coffee index 7447ddcd9..5eb9781e2 100644 --- a/plugins/tabs/tabsPane.coffee +++ b/plugins/tabs/tabsPane.coffee @@ -30,7 +30,7 @@ class TabsPane extends Pane $("#tabs ul .active").removeClass("active") $(tab).addClass 'active' - @window.document.switchToSession $(tab).data 'path' + @window.open $(tab).data 'path' addTab: (path) -> existing = $("#tabs [data-path='#{path}']") diff --git a/src/window.coffee b/src/window.coffee index 9051af18f..c1abf3bb4 100644 --- a/src/window.coffee +++ b/src/window.coffee @@ -10,8 +10,9 @@ oop = require "pilot/oop" module.exports = class Window controller: null - document: null + nswindow: null + panes: [] keymap: -> @@ -35,12 +36,9 @@ class Window @._emit "loaded" loadPlugins: -> - Editor = require 'editor' - @document = new Editor @ - - @open @path if @path? - @plugins = [] + + # Ewwww, don't do this App = require 'app' for pluginPath in File.list(App.root + "/plugins") if File.isDirectory pluginPath @@ -51,6 +49,8 @@ class Window console.warn "Plugin Failed: #{File.base pluginPath}" console.warn error + @open @path if @path? + # After all the plugins are created, load them. for plugin in @plugins try @@ -59,19 +59,9 @@ class Window console.warn "Plugin Loading Failed: #{plugin.constructor.name}" console.warn error - close: -> - @controller.close - reload: -> Chrome.newWindow() - @close() - - isDirty: -> - @nswindow.isDocumentEdited() - - # Set the active window's dirty status. - setDirty: (bool) -> - @nswindow.setDocumentEdited bool + @controller.close inspector: -> @_inspector ?= WindowController.webView.inspector @@ -79,14 +69,6 @@ class Window new: -> Chrome.newWindow() - open: (path) -> - @document?.open path - - openURL: (url) -> - if url = prompt "Enter URL:" - Chrome = require 'app' - Chrome.openURL url - showConsole: -> @inspector().showConsole(1) @@ -95,3 +77,22 @@ class Window setTitle: (title) -> @nswindow.title = title + + # Do these get moved into document? + isDirty: -> + @nswindow.isDocumentEdited() + + # Set the active window's dirty status. + setDirty: (bool) -> + @nswindow.setDocumentEdited bool + + open: (path) -> + @_emit 'open', { filename: path } + + close: (path) -> + @_emit 'close', { filename: path } + + openURL: (url) -> + if url = prompt "Enter URL:" + Chrome = require 'app' + Chrome.openURL url