all files / lib/ui/ EditorPane.js

49.41% Statements 42/85
13.16% Branches 5/38
30.77% Functions 4/13
56% Lines 42/75
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123                                                                                                                                                                  
var blessed = require('blessed');
var path = require('path');
var _ = require('lodash');
 
var util = require('slap-util');
 
var Editor = require('editor-widget');
 
var Pane = require('./Pane');
 
EditorPane.prototype.__proto__ = Pane.prototype;
function EditorPane (opts) {
  var self = this;
 
  Iif (!(self instanceof EditorPane)) return new EditorPane(opts);
 
  Pane.call(self, _.merge({}, Slap.global.options.editorPane, opts));
 
  self.forms = self.forms || [];
 
  self.editor = new Editor(_.merge({
    parent: self,
    top: 0,
    left: 0,
    right: 0,
    bottom: 0
  }, Slap.global.options.editor, self.options.editor));
 
  self.findForm = new FindForm({parent: self});
  self.goLineForm = new GoLineForm({parent: self});
  self.saveAsForm = new SaveAsForm({parent: self});
  self.saveAsCloseForm = new SaveAsCloseForm({parent: self});
}
 
EditorPane.prototype.getTitle = function () {
  var self = this;
  var textBuf = self.editor.textBuf;
  var editorPath = textBuf.getPath();
  var title = editorPath
    ? blessed.escape(path.relative(self.screen.slap.fileBrowser.cwd, editorPath))
    : "new file";
  Iif (textBuf.isModified()) {
    title = util.markup(title+"*", self.style.changed);
  }
  return title.toString();
};
 
EditorPane.prototype.close = function () {
  var self = this;
  if (self.editor.textBuf.isModified()) {
    var currentPaneSaveAsCloseForm = (self.screen.slap.getCurrentPane() || {}).saveAsCloseForm || {};
    if (currentPaneSaveAsCloseForm.visible) {
      currentPaneSaveAsCloseForm.once('hide', self.close.bind(self));
    } else {
      self.setCurrent();
      self.saveAsCloseForm.show();
    }
    return false;
  }
 
  return Pane.prototype.close.apply(self, arguments);
};
 
EditorPane.prototype.save = function (path) {
  var self = this;
  var slap = self.screen.slap;
  var header = slap.header;
  var editor = self.editor;
  return editor.save(path, slap.fileBrowser.cwd)
    .tap(function () { header.message("saved to " + editor.textBuf.getPath(), 'success'); })
    .catch(function (err) {
      switch ((err.cause || err).code) {
        case 'EACCES': case 'EISDIR':
          header.message(err.message, 'error');
          break;
        default: throw err;
      }
    });
};
 
EditorPane.prototype._initHandlers = function () {
  var self = this;
  var editor = self.editor;
  var slap = self.screen.slap;
 
  self.on('element keypress', function (el, ch, key) {
    switch (self.resolveBinding(key)) {
      case 'save': if (!editor.readOnly()) editor.textBuf.getPath() ? self.save().done() : self.saveAsForm.show(); return false;
      case 'saveAs': if (!editor.readOnly()) self.saveAsForm.show(); return false;
      case 'close': self.close(); return false;
      case 'find': self.findForm.show(); return false;
      case 'goLine': self.goLineForm.show(); return false;
    }
  });
 
  self.on('focus', function () {
    var formHasFocus = false;
    var visibleForms = self.forms.filter(function (form) {
      formHasFocus = formHasFocus || form.hasFocus(true);
      return form.visible;
    });
    if (!formHasFocus && visibleForms.length) visibleForms[0].focus();
  });
 
  editor.on('insertMode', function () { self.screen.render(); });
  ['onDidChange', 'onDidChangePath'].forEach(function (prop) {
    editor.textBuf[prop](function () {
      slap.header.render();
      slap.paneList.update();
    });
  });
 
  return Pane.prototype._initHandlers.apply(self, arguments);
};
 
module.exports = EditorPane;
 
var Slap = require('./Slap');
var SaveAsForm = require('./SaveAsForm');
var SaveAsCloseForm = require('./SaveAsCloseForm');
var FindForm = require('./FindForm');
var GoLineForm = require('./GoLineForm');