annotate-esprima/scripts/lib/esprima-master/assets/orion/customeditor.js
2014-04-15 11:04:48 +02:00

211 lines
8.3 KiB
JavaScript
Executable file

/*******************************************************************************
* @license
* Copyright (c) 2013 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials are made
* available under the terms of the Eclipse Public License v1.0
* (http://www.eclipse.org/legal/epl-v10.html), and the Eclipse Distribution
* License v1.0 (http://www.eclipse.org/org/documents/edl-v10.html).
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
/*globals define */
define('custom/editor', [ //$NON-NLS-0$
"orion/editor/textView", //$NON-NLS-0$
"orion/editor/textModel", //$NON-NLS-0$
"orion/editor/projectionTextModel", //$NON-NLS-0$
"orion/editor/eventTarget", //$NON-NLS-0$
"orion/editor/keyBinding", //$NON-NLS-0$
"orion/editor/rulers", //$NON-NLS-0$
"orion/editor/annotations", //$NON-NLS-0$
"orion/editor/tooltip", //$NON-NLS-0$
"orion/editor/undoStack", //$NON-NLS-0$
"orion/editor/textDND", //$NON-NLS-0$
"orion/editor/editor", //$NON-NLS-0$
"orion/editor/editorFeatures", //$NON-NLS-0$
"orion/editor/contentAssist", //$NON-NLS-0$
"examples/editor/textStyler" //$NON-NLS-0$
], function(mTextView, mTextModel, mProjModel, mEventTarget, mKeyBinding, mRulers, mAnnotations, mTooltip, mUndoStack, mTextDND, mEditor, mEditorFeatures, mContentAssist, mTextStyler) {
/** @private */
function getTextFromElement(element) {
var document = element.ownerDocument;
var window = document.defaultView || document.parentWindow;
if (!window.getSelection) {
return element.innerText || element.textContent;
}
var newRange = document.createRange();
newRange.selectNode(element);
var selection = window.getSelection();
var oldRanges = [], i;
for (i = 0; i < selection.rangeCount; i++) {
oldRanges.push(selection.getRangeAt(i));
}
selection.removeAllRanges();
selection.addRange(newRange);
var text = selection.toString();
selection.removeAllRanges();
for (i = 0; i < oldRanges.length; i++) {
selection.addRange(oldRanges[i]);
}
return text;
}
/**
* @class This object describes the options for <code>edit</code>.
* @name orion.editor.EditOptions
*
* @property {String|DOMElement} parent the parent element for the view, it can be either a DOM element or an ID for a DOM element.
* @property {Boolean} [readonly=false] whether or not the view is read-only.
* @property {Boolean} [fullSelection=true] whether or not the view is in full selection mode.
* @property {Boolean} [tabMode=true] whether or not the tab keypress is consumed by the view or is used for focus traversal.
* @property {Boolean} [expandTab=false] whether or not the tab key inserts white spaces.
* @property {String} [themeClass] the CSS class for the view theming.
* @property {Number} [tabSize=4] The number of spaces in a tab.
* @property {Boolean} [wrapMode=false] whether or not the view wraps lines.
* @property {Function} [statusReporter] a status reporter.
* @property {String} [title=""] the editor title.
* @property {String} [contents=""] the editor contents.
* @property {String} [lang] the styler language. Plain text by default.
* @property {Boolean} [showLinesRuler=true] whether or not the lines ruler is shown.
* @property {Boolean} [showAnnotationRuler=true] whether or not the annotation ruler is shown.
* @property {Boolean} [showOverviewRuler=true] whether or not the overview ruler is shown.
* @property {Boolean} [showFoldingRuler=true] whether or not the folding ruler is shown.
*/
/**
* Creates an editor instance configured with the given options.
*
* @param {orion.editor.EditOptions} options the editor options.
*/
function edit(options) {
var parent = options.parent;
if (!parent) { parent = "editor"; } //$NON-NLS-0$
if (typeof(parent) === "string") { //$NON-NLS-0$
parent = (options.document || document).getElementById(parent);
}
if (!parent) {
if (options.className) {
var parents = (options.document || document).getElementsByClassName(options.className);
if (parents) {
options.className = undefined;
var editors = [];
for (var i = 0; i < parents.length; i++) {
options.parent = parents[i];
editors.push(edit(options));
}
return editors;
}
}
}
if (!parent) { throw "no parent"; } //$NON-NLS-0$
var textViewFactory = function() {
return new mTextView.TextView({
parent: parent,
model: new mProjModel.ProjectionTextModel(new mTextModel.TextModel("")),
tabSize: options.tabSize ? options.tabSize : 4,
readonly: options.readonly,
fullSelection: options.fullSelection,
tabMode: options.tabMode,
expandTab: options.expandTab,
themeClass: options.themeClass,
wrapMode: options.wrapMode
});
};
var contentAssist, contentAssistFactory;
if (!options.readonly && options.contentassist) {
contentAssistFactory = {
createContentAssistMode: function(editor) {
contentAssist = new mContentAssist.ContentAssist(editor.getTextView());
var contentAssistWidget = new mContentAssist.ContentAssistWidget(contentAssist);
return new mContentAssist.ContentAssistMode(contentAssist, contentAssistWidget);
}
};
}
// Canned highlighters for js, java, and css. Grammar-based highlighter for html
var syntaxHighlighter = {
styler: null,
highlight: function(lang, editor) {
if (this.styler) {
this.styler.destroy();
this.styler = null;
}
if (lang) {
var textView = editor.getTextView();
var annotationModel = editor.getAnnotationModel();
this.styler = new mTextStyler.TextStyler(textView, lang, annotationModel);
editor.setFoldingRulerVisible(options.showFoldingRuler === undefined || options.showFoldingRuler);
}
}
};
var keyBindingFactory = function(editor, keyModeStack, undoStack, contentAssist) {
// Create keybindings for generic editing
var genericBindings = new mEditorFeatures.TextActions(editor, undoStack);
keyModeStack.push(genericBindings);
// create keybindings for source editing
var codeBindings = new mEditorFeatures.SourceCodeActions(editor, undoStack, contentAssist);
keyModeStack.push(codeBindings);
};
var editor = new mEditor.Editor({
textViewFactory: textViewFactory,
undoStackFactory: new mEditorFeatures.UndoFactory(),
annotationFactory: new mEditorFeatures.AnnotationFactory(),
lineNumberRulerFactory: new mEditorFeatures.LineNumberRulerFactory(),
foldingRulerFactory: new mEditorFeatures.FoldingRulerFactory(),
textDNDFactory: new mEditorFeatures.TextDNDFactory(),
contentAssistFactory: contentAssistFactory,
keyBindingFactory: keyBindingFactory,
statusReporter: options.statusReporter,
domNode: parent
});
var contents = options.contents;
if (contents === undefined) {
contents = getTextFromElement(parent);
}
if (!contents) { contents=""; }
editor.installTextView();
editor.setLineNumberRulerVisible(options.showLinesRuler === undefined || options.showLinesRuler);
editor.setAnnotationRulerVisible(options.showAnnotationRuler === undefined || options.showFoldingRuler);
editor.setOverviewRulerVisible(options.showOverviewRuler === undefined || options.showOverviewRuler);
editor.setFoldingRulerVisible(options.showFoldingRuler === undefined || options.showFoldingRuler);
editor.setInput(options.title, null, contents);
syntaxHighlighter.highlight(options.lang, editor);
if (contentAssist) {
var mJSContentAssist = require("plugins/esprima/esprimaJsContentAssist");
var jsTemplateContentAssistProvider = new mJSContentAssist.EsprimaJavaScriptContentAssistProvider();
contentAssist.addEventListener("Activating", function() { //$NON-NLS-0$
contentAssist.setProviders([jsTemplateContentAssistProvider]);
});
}
editor.addErrorMarker = function (pos, description) {
var annotationModel = editor.getAnnotationModel();
var marker = mAnnotations.AnnotationType.createAnnotation(mAnnotations.AnnotationType.ANNOTATION_WARNING, pos, pos, description);
annotationModel.addAnnotation(marker);
};
editor.removeAllErrorMarkers = function () {
var annotationModel = editor.getAnnotationModel();
annotationModel.removeAnnotations(mAnnotations.AnnotationType.ANNOTATION_WARNING);
};
return editor;
}
return edit;
});