diff options
author | Egil Moeller <egil.moller@freecode.no> | 2010-03-21 23:33:06 +0100 |
---|---|---|
committer | Egil Moeller <egil.moller@freecode.no> | 2010-03-21 23:33:06 +0100 |
commit | d56b9b3b82cdebcaeb00eec0fcb4326ad21adaa8 (patch) | |
tree | b1dfe31956f3fc86e3408f1efac5e12acf65b11a /infrastructure/ace/www/ace2_wrapper.js | |
parent | c1894c8e0a52f4e3d2f89fa92f0066bbf0fcf1b1 (diff) | |
parent | 103d4926ae6c61824dc0b48be7bf66f08830ed47 (diff) | |
download | etherpad-d56b9b3b82cdebcaeb00eec0fcb4326ad21adaa8.tar.gz etherpad-d56b9b3b82cdebcaeb00eec0fcb4326ad21adaa8.tar.bz2 etherpad-d56b9b3b82cdebcaeb00eec0fcb4326ad21adaa8.zip |
Merge branch 'master' of git@github.com:ether/pad
Diffstat (limited to 'infrastructure/ace/www/ace2_wrapper.js')
-rw-r--r-- | infrastructure/ace/www/ace2_wrapper.js | 226 |
1 files changed, 226 insertions, 0 deletions
diff --git a/infrastructure/ace/www/ace2_wrapper.js b/infrastructure/ace/www/ace2_wrapper.js new file mode 100644 index 0000000..b62e09d --- /dev/null +++ b/infrastructure/ace/www/ace2_wrapper.js @@ -0,0 +1,226 @@ +/** + * Copyright 2009 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS-IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Exposes interface of Aaron's ace.js, including switching between plain and fancy editor. +// Currently uses Aaron's code and depends on JQuery for plain editor. +// -- David + + +AppjetCodeEditor = function() { + this.browserSupportsModern = false; + this.aceImpl = null; + this.containerDiv = null; + this.containerId = null; + this.onKeyPress = null; + this.onKeyDown = null; + this.notifyDirty = null; + this.isEditable = true; +}; + +// TODO: take editorType as a param + +AppjetCodeEditor.prototype.init = function(containerId, + initialCode, + startModern, + done) { + this.containerId = containerId; + this.containerDiv = document.getElementById(containerId); + + if (startModern) { + this.aceImplModern = new Ace2Editor(); + this.aceImpl = this.aceImplModern; + } else { + this.aceImplPlain = new ACEPlain(); + this.aceImpl = this.aceImplPlain; + } + this.aceImpl.init(containerId, initialCode, done); +}; + +AppjetCodeEditor.prototype.updateBottomLinks = function() { + if (ACEPlain.prototype.isPrototypeOf(this.aceImpl)) { + this.toggleModernLink.innerHTML = 'switch to rich text'; + } else { + this.toggleModernLink.innerHTML = 'switch to plaintext'; + } +}; + +AppjetCodeEditor.prototype.toggleModernImpl = function() { + var codeSave = this.aceImpl.exportCode(); + + if (ACEPlain.prototype.isPrototypeOf(this.aceImpl)) { + this.aceImpl.destroy(); + this.aceImpl = new Ace2Editor(); + } else { + this.aceImpl.destroy(); + this.aceImpl = new ACEPlain(); + } + var cont = this.containerDiv; + while (cont.firstChild) { + cont.removeChild(cont.firstChild); + } + this.aceImpl.init(this.containerId, codeSave, function() {} ); + + var ace = this; + function capitalize(str) { return str.substr(0,1).toUpperCase()+str.substr(1); } + $.each(["onKeyPress", "onKeyDown", "notifyDirty"], function() { + var setter = 'set'+capitalize(this); + if (ace[this]) { + ace.aceImpl[setter](ace[this]); + } + }); + this.aceImpl.setEditable(this.isEditable); +}; + +AppjetCodeEditor.prototype.adjustContainerSizes = function() { + // TODO: adjust container sizes here. +}; + +//================================================================ +// Interface to ACE +//================================================================ + +AppjetCodeEditor.prototype.setOnKeyPress = function(f) { + this.onKeyPress = f; + this.aceImpl.setOnKeyPress(this.onKeyPress); +}; + +AppjetCodeEditor.prototype.setOnKeyDown = function(f) { + this.onKeyDown = f; + this.aceImpl.setOnKeyDown(this.onKeyDown); +}; + +AppjetCodeEditor.prototype.setNotifyDirty = function(f) { + this.notifyDirty = f; + this.aceImpl.setNotifyDirty(this.notifyDirty); +}; + +AppjetCodeEditor.prototype.setEditable = function(x) { + this.isEditable = x; + this.aceImpl.setEditable(x); +}; + +AppjetCodeEditor.prototype.adjustSize = function() { + this.adjustContainerSizes(); + this.aceImpl.adjustSize(); +}; + +//------- straight pass-through functions --------------- + +AppjetCodeEditor.prototype.importCode = function(rawCode) { + this.aceImpl.importCode(rawCode); +}; + +AppjetCodeEditor.prototype.exportCode = function() { + return this.aceImpl.exportCode(); +}; + +AppjetCodeEditor.prototype.getFormattedCode = function() { + return this.aceImpl.getFormattedCode(); +}; + +AppjetCodeEditor.prototype.focus = function() { + this.aceImpl.focus(); +}; + +/* implementation of ACE with simple textarea */ + +ACEPlain = function() { + this.containerDiv = null; + this.textArea = null; + this.onKeyPress = null; + this.onKeyDown = null; + this.notifyDirty = null; +}; + +ACEPlain.prototype.init = function(containerId, initialCode, done) { + var container = $('#'+containerId); //document.getElementById(containerId); + + // empty container div + container.empty(); + container.css('padding', 0); + + // create textarea + var textArea = $('<textarea></textarea>'); + textArea.css('border', 0). + css('margin', 0). + css('padding', 0). + css('background', 'transparent'). + css('color', '#000'). + attr('spellcheck', false); + + // add textarea to container + container.append(textArea); + + // remember nodes + this.textArea = textArea; + this.containerDiv = container; + + // first-time size adjustments + this.adjustSize(); + + // remember keystrokes + var ace = this; + textArea.keydown(function(e) { + if (ace.onKeyDown) { ace.onKeyDown(e); } + }); + textArea.keypress(function(e) { + if (ace.notifyDirty) { ace.notifyDirty(); } + if (ace.onKeyPress) { ace.onKeyPress(e); } + }); + + // set initial code + textArea.get(0).value = initialCode; + + // callback + done(); +}; + +ACEPlain.prototype.importCode = function(rawCode) { + this.textArea.attr('value', rawCode); +}; + +ACEPlain.prototype.exportCode = function() { + return this.textArea.attr('value'); +}; + +ACEPlain.prototype.adjustSize = function() { + this.textArea.width('100%'); + this.textArea.height(this.containerDiv.height()); +}; + +ACEPlain.prototype.setOnKeyPress = function(f) { this.onKeyPress = f; }; +ACEPlain.prototype.setOnKeyDown = function(f) { this.onKeyDown = f; }; +ACEPlain.prototype.setNotifyDirty = function(f) { this.notifyDirty = f; }; + +ACEPlain.prototype.getFormattedCode = function() { + return ('<pre>' + this.textArea.attr('value') + '</pre>'); +}; + +ACEPlain.prototype.setEditable = function(editable) { + if (editable) { + this.textArea.removeAttr('disabled'); + } else { + this.textArea.attr('disabled', true); + } +}; + +ACEPlain.prototype.focus = function() { + this.textArea.focus(); +}; + +ACEPlain.prototype.destroy = function() { + // nothing +}; |