/*******************************************************************************
* Copyright (c) 2012-2017 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.orion.client.jso;
import com.google.gwt.core.client.JavaScriptObject;
import org.eclipse.che.ide.api.editor.link.LinkedMode;
import org.eclipse.che.ide.api.editor.link.LinkedModel;
/**
* @author Evgen Vidolob
*/
public class OrionLinkedModeOverlay extends JavaScriptObject implements LinkedMode {
protected OrionLinkedModeOverlay() {
}
/** Starts Linked Mode, selects the first position and registers the listeners.
* @param linkedModel linkedModeModel An object describing the model to be used by linked mode.
* Contains one or more position groups. If a position in a group is edited, the other positions in
* the same group are edited the same way. The model structure is as follows:
* <pre>{
* groups: [{
* data: {},
* positions: [{
* offset: 10, // Relative to the text buffer
* length: 3
* }]
* }],
* escapePosition: 19, // Relative to the text buffer
* }</pre>
*
* Each group in the model has an optional <code>data</code> property which can be
* used to provide additional content assist for the group. The <code>type</code> in
* data determines what kind of content assist is provided. These are the support
* structures for the <code>data</code> property.
* <pre>{
* type: "link"
* values: ["proposal0", "proposal1", ...]
* }</pre>
*
* The "link" data struture provides static content assist proposals stored in the
* <code>values</code> property.
*/
public final native void enterLinkedMode(OrionLinkedModelOverlay linkedModel) /*-{
this.enterLinkedMode(linkedModel);
}-*/;
/**
* Exits Linked Mode. Optionally places the caret at linkedMode escapePosition.
* @param escapePosition if true, place the caret at the escape position.
*/
@Override
public final native void exitLinkedMode(boolean escapePosition) /*-{
this.exitLinkedMode(escapePosition);
}-*/;
/**
* Exits Linked Mode. Optionally places the caret at linkedMode escapePosition.
* @param escapePosition if true, place the caret at the escape position.
* @param successful successful or not exit linked mode
*/
@Override
public final native void exitLinkedMode(boolean escapePosition, boolean successful) /*-{
this.exitLinkedMode(escapePosition, successful);
}-*/;
@Override
public final native void selectLinkedGroup(int index) /*-{
this.selectLinkedGroup(index);
}-*/;
@Override
public final native void addListener(LinkedModeListener listener) /*-{
if ($wnd.che_handels === undefined) {
$wnd.che_handels = {};
}
var start, end;
var model = this._annotationModel
var annotationListener = function () {
var annotations = model.getAnnotations(), annotation;
while (annotations.hasNext()) {
annotation = annotations.next();
switch (annotation.type) {
case "orion.annotation.linkedGroup":
case "orion.annotation.selectedLinkedGroup":
case "orion.annotation.currentLinkedGroup":
{
start = annotation.start;
end = annotation.end;
}
}
}
};
this._annotationModel.addEventListener("Changed", annotationListener, true);
this.annotationListener = annotationListener;
var func = function (param) {
listener.@org.eclipse.che.ide.api.editor.link.LinkedMode.LinkedModeListener::onLinkedModeExited(*)(param.isSuccessful,
start, end);
};
$wnd.che_handels[listener] = func;
this.addEventListener("LinkedModeExit", func, true);
}-*/;
@Override
public final native void removeListener(LinkedModeListener listener) /*-{
this._annotationModel.removeEventListener("Changed", this.annotationListener, true);
this.removeEventListener("LinkedModeExit", $wnd.che_handels[listener], true);
}-*/;
@Override
public final void enterLinkedMode(LinkedModel model) {
if (model instanceof OrionLinkedModelOverlay) {
enterLinkedMode((OrionLinkedModelOverlay)model);
} else {
throw new IllegalArgumentException("This implementation supports only OrionLinkedModelOverlay model");
}
}
}