diff options
author | Alexander Sulfrian <alexander@sulfrian.net> | 2010-06-08 09:01:43 +0200 |
---|---|---|
committer | Alexander Sulfrian <alexander@sulfrian.net> | 2010-06-08 09:01:43 +0200 |
commit | d1fa08fdc9cb11dccee76d668ff85df30458c295 (patch) | |
tree | 1d19df6405103577d872902486792e8c23bce711 /infrastructure/ace/www/ace2_wrapper.js | |
parent | d7c5ad7d6263fd1baf9bfdbaa4c50b70ef2fbdb2 (diff) | |
parent | 70d1f9d6fcaefe611e778b8dbf3bafea8934aa08 (diff) | |
download | etherpad-d1fa08fdc9cb11dccee76d668ff85df30458c295.tar.gz etherpad-d1fa08fdc9cb11dccee76d668ff85df30458c295.tar.xz etherpad-d1fa08fdc9cb11dccee76d668ff85df30458c295.zip |
Merge remote branch 'upstream/master'
Conflicts:
etherpad/src/etherpad/control/pro/admin/pro_admin_control.js
etherpad/src/etherpad/control/pro/pro_main_control.js
etherpad/src/etherpad/control/pro_help_control.js
etherpad/src/etherpad/globals.js
etherpad/src/etherpad/legacy_urls.js
etherpad/src/etherpad/pne/pne_utils.js
etherpad/src/etherpad/pro/pro_utils.js
etherpad/src/main.js
etherpad/src/plugins/fileUpload/templates/fileUpload.ejs
etherpad/src/plugins/testplugin/templates/page.ejs
etherpad/src/static/css/pad2_ejs.css
etherpad/src/static/css/pro-help.css
etherpad/src/static/img/jun09/pad/protop.gif
etherpad/src/static/js/store.js
etherpad/src/themes/default/templates/framed/framedheader-pro.ejs
etherpad/src/themes/default/templates/main/home.ejs
etherpad/src/themes/default/templates/pro-help/main.ejs
etherpad/src/themes/default/templates/pro-help/pro-help-template.ejs
infrastructure/com.etherpad/licensing.scala
trunk/etherpad/src/etherpad/collab/ace/contentcollector.js
trunk/etherpad/src/etherpad/collab/ace/linestylefilter.js
trunk/etherpad/src/static/css/home-opensource.css
trunk/etherpad/src/static/js/ace.js
trunk/etherpad/src/static/js/linestylefilter_client.js
trunk/etherpad/src/templates/email/eepnet_license_info.ejs
trunk/etherpad/src/templates/pad/pad_body2.ejs
trunk/etherpad/src/templates/pad/pad_content.ejs
trunk/etherpad/src/templates/pad/padfull_body.ejs
trunk/etherpad/src/templates/pro/admin/pne-license-manager.ejs
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 +}; |