aboutsummaryrefslogtreecommitdiffstats
path: root/trunk/infrastructure/ace/www/ace2_wrapper.js
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/infrastructure/ace/www/ace2_wrapper.js')
-rw-r--r--trunk/infrastructure/ace/www/ace2_wrapper.js226
1 files changed, 226 insertions, 0 deletions
diff --git a/trunk/infrastructure/ace/www/ace2_wrapper.js b/trunk/infrastructure/ace/www/ace2_wrapper.js
new file mode 100644
index 0000000..b62e09d
--- /dev/null
+++ b/trunk/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
+};