/******************************************************************************* * @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 edit. * @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; });