/******************************************************************************* * Copyright (c) 2014-2015 Codenvy, S.A. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Codenvy, S.A. - initial API and implementation *******************************************************************************/ package org.eclipse.che.ide.editor.codemirror.client; import java.util.Arrays; import java.util.List; import org.eclipse.che.api.promises.client.Operation; import org.eclipse.che.api.promises.client.OperationException; import org.eclipse.che.api.promises.client.Promise; import org.eclipse.che.ide.editor.codemirror.base.client.AbstractCodemirrorInitializer; import org.eclipse.che.ide.editor.codemirror.base.client.BaseCodemirrorInitializer; import org.eclipse.che.ide.editor.codemirror.resources.client.BasePathConstant; import org.eclipse.che.ide.editor.codemirrorjso.client.CodeMirrorOverlay; import org.eclipse.che.ide.jseditor.client.requirejs.RequireJsLoader; import com.google.inject.Inject; public class FullCodemirrorInitializer extends AbstractCodemirrorInitializer { private final FullCodemirrorPromise fullCodemirrorPromise; private final BaseCodemirrorInitializer baseCodemirrorInitializer; private Initializer initializer; @Inject public FullCodemirrorInitializer(final RequireJsLoader requireJsLoader, final BasePathConstant basePathConstant, final FullCodemirrorPromise fullCodemirrorPromise, final BaseCodemirrorInitializer baseCodemirrorInitializer) { super(requireJsLoader, basePathConstant); this.fullCodemirrorPromise = fullCodemirrorPromise; this.baseCodemirrorInitializer = baseCodemirrorInitializer; } public Promise<CodeMirrorOverlay> init() { if (this.fullCodemirrorPromise == null) { this.baseCodemirrorInitializer.init(); // can be done separately, if the scripts are already loading, requirejs will take that into account final Promise<CodeMirrorOverlay> result = initScripts(getScripts()); result.then(new Operation<CodeMirrorOverlay>() { @Override public void apply(final CodeMirrorOverlay codemirror) throws OperationException { initializer.init(); } }); this.fullCodemirrorPromise.setPromise(result); } return this.fullCodemirrorPromise.getPromise(); } @Override protected List<String> getScripts() { return Arrays.asList(new String[]{ // /lib/codemirror added elsewhere // library of modes "mode/meta", /* We will preload modes that have extensions */ // language modes "mode/xml/xml", "mode/htmlmixed/htmlmixed", // must be defined after xml "mode/javascript/javascript", "mode/coffeescript/coffeescript", "mode/css/css", "mode/sql/sql", "mode/clike/clike", "mode/markdown/markdown", "mode/gfm/gfm", // markdown extension for github // hints "addon/hint/show-hint", "addon/hint/xml-hint", "addon/hint/html-hint", "addon/hint/javascript-hint", "addon/hint/css-hint", "addon/hint/anyword-hint", "addon/hint/sql-hint", // pair matching "addon/edit/closebrackets", "addon/edit/closetag", "addon/edit/matchbrackets", "addon/edit/matchtags", // the two following are added to repair actual functionality in 'classic' editor "addon/selection/mark-selection", "addon/selection/active-line", // for search "addon/search/search", "addon/dialog/dialog", "addon/search/searchcursor", "addon/search/match-highlighter", // comment management "addon/comment/comment", "addon/comment/continuecomment", // folding "addon/fold/foldcode", "addon/fold/foldgutter", "addon/fold/brace-fold", "addon/fold/xml-fold", // also required by matchbrackets and closebrackets "addon/fold/comment-fold", "addon/fold/indent-fold", "addon/fold/markdown-fold", "addon/scroll/simplescrollbars", "addon/scroll/annotatescrollbar", "addon/scroll/scrollpastend", "addon/search/matchesonscrollbar", }); } public void setInitializer(final Initializer initializer) { this.initializer = initializer; } public interface Initializer { void init(); } }