/******************************************************************************* * Copyright (c) 2012-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.jseditor.client.editoradapter; import java.util.ArrayList; import java.util.List; import org.eclipse.che.ide.jseditor.client.texteditor.ConfigurableTextEditor; import org.vectomatic.dom.svg.ui.SVGImage; import org.vectomatic.dom.svg.ui.SVGResource; import org.eclipse.che.ide.api.editor.EditorInitException; import org.eclipse.che.ide.api.editor.EditorInput; import org.eclipse.che.ide.api.event.FileEvent; import org.eclipse.che.ide.api.event.FileEventHandler; import org.eclipse.che.ide.api.notification.NotificationManager; import org.eclipse.che.ide.api.parts.PartPresenter; import org.eclipse.che.ide.api.parts.PropertyListener; import org.eclipse.che.ide.api.parts.WorkspaceAgent; import org.eclipse.che.ide.api.project.tree.VirtualFile; import org.eclipse.che.ide.api.selection.Selection; import org.eclipse.che.ide.api.texteditor.HandlesUndoRedo; import org.eclipse.che.ide.api.texteditor.UndoableEditor; import org.eclipse.che.ide.jseditor.client.document.EmbeddedDocument; import org.eclipse.che.ide.jseditor.client.editorconfig.TextEditorConfiguration; import org.eclipse.che.ide.jseditor.client.keymap.Keybinding; import org.eclipse.che.ide.jseditor.client.text.LinearRange; import org.eclipse.che.ide.jseditor.client.text.TextPosition; import org.eclipse.che.ide.jseditor.client.text.TextRange; import com.google.gwt.core.shared.GWT; import com.google.gwt.resources.client.ImageResource; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.AcceptsOneWidget; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.IsWidget; import com.google.gwt.user.client.ui.RequiresResize; import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.Widget; import com.google.web.bindery.event.shared.EventBus; /** * Default implementation of {@link EditorAdapter}. */ public class DefaultEditorAdapter extends Composite implements EditorAdapter, FileEventHandler, RequiresResize, UndoableEditor { /** The UI binder instance. */ private static final DefaultEditorAdapterUiBinder UIBINDER = GWT.create(DefaultEditorAdapterUiBinder.class); /** The text editor part of the nested presenter. */ private ConfigurableTextEditor textEditor; /** The nested presenter. */ private NestablePresenter nestedPresenter; /** The property listeners. */ private List<PropertyListener> propertylisteners; /** The editor input. */ private EditorInput input; /** The workspace agent. */ private WorkspaceAgent workspaceAgent; /** The panel of the component. */ @UiField SimplePanel panel = new SimplePanel(); public DefaultEditorAdapter(EventBus eventBus, final WorkspaceAgent workspaceAgent) { initWidget(UIBINDER.createAndBindUi(this)); eventBus.addHandler(FileEvent.TYPE, this); this.workspaceAgent = workspaceAgent; } @Override public void close(final boolean save) { this.textEditor.close(save); } @Override public boolean isEditable() { return this.textEditor.isEditable(); } @Override public void doRevertToSaved() { this.textEditor.doRevertToSaved(); } @Override public EmbeddedDocument getDocument() { return this.textEditor.getDocument(); } @Override public String getContentType() { return this.textEditor.getContentType(); } @Override public TextRange getSelectedTextRange() { return this.textEditor.getSelectedTextRange(); } @Override public LinearRange getSelectedLinearRange() { return this.textEditor.getSelectedLinearRange(); } @Override public TextPosition getCursorPosition() { return this.textEditor.getCursorPosition(); } @Override public int getCursorOffset() { return this.textEditor.getCursorOffset(); } @Override public void showMessage(final String message) { this.textEditor.showMessage(message); } @Override public void init(final EditorInput input) throws EditorInitException { this.textEditor.init(input); this.input = input; } @Override public EditorInput getEditorInput() { return this.textEditor.getEditorInput(); } @Override public void doSave() { this.textEditor.doSave(); } @Override public void doSave(final AsyncCallback<EditorInput> callback) { this.textEditor.doSave(callback); } @Override public void doSaveAs() { this.textEditor.doSaveAs(); } @Override public void onFileChanged() { this.textEditor.onFileChanged(); } @Override public boolean isDirty() { return this.textEditor.isDirty(); } @Override public void addCloseHandler(final EditorPartCloseHandler closeHandler) { this.textEditor.addCloseHandler(closeHandler); } @Override public void activate() { this.textEditor.activate(); } @Override public String getTitle() { return this.textEditor.getTitle(); } @Override public ImageResource getTitleImage() { return this.textEditor.getTitleImage(); } @Override public SVGResource getTitleSVGImage() { return this.textEditor.getTitleSVGImage(); } @Override public SVGImage decorateIcon(final SVGImage svgImage) { return this.textEditor.decorateIcon(svgImage); } @Override public IsWidget getTitleWidget() { return this.textEditor.getTitleWidget(); } @Override public String getTitleToolTip() { return this.textEditor.getTitleToolTip(); } @Override public int getSize() { return this.textEditor.getSize(); } @Override public void onOpen() { this.textEditor.onOpen(); } @Override public void onClose(final AsyncCallback<Void> callback) { // the nested presenter is responsible for closing the editor _it owns_ this.nestedPresenter.onClose(callback); } @Override public Selection< ? > getSelection() { return this.textEditor.getSelection(); } @Override public void addPropertyListener(final PropertyListener listener) { if (this.propertylisteners == null) { this.propertylisteners = new ArrayList<>(); this.textEditor.addPropertyListener(new PropertyListener() { @Override public void propertyChanged(final PartPresenter source, final int propId) { for (final PropertyListener listener: propertylisteners) { listener.propertyChanged(DefaultEditorAdapter.this, propId); } } }); } this.propertylisteners.add(listener); } @Override public void removePropertyListener(final PropertyListener listener) { if (this.propertylisteners != null) { this.propertylisteners.remove(listener); } } @Override public void go(final AcceptsOneWidget container) { this.nestedPresenter.go(this.panel); container.setWidget(this.panel); } @Override public void initialize(final TextEditorConfiguration configuration, final NotificationManager notificationManager) { this.textEditor.initialize(configuration, notificationManager); } @Override public TextEditorConfiguration getConfiguration() { return this.textEditor.getConfiguration(); } @Override public ConfigurableTextEditor getTextEditor() { return this.textEditor; } @Override public void setPresenter(final NestablePresenter nestedPresenter) { this.nestedPresenter = nestedPresenter; } public void setTextEditor(final ConfigurableTextEditor configurable) { this.textEditor = configurable; } @Override public void onResize() { final Widget widget = this.panel.getWidget(); if (widget instanceof RequiresResize) { ((RequiresResize)widget).onResize(); } } @Override public void addKeybinding(final Keybinding keybinding) { this.textEditor.addKeybinding(keybinding); } @Override public HandlesUndoRedo getUndoRedo() { if (this.textEditor instanceof UndoableEditor) { return ((UndoableEditor)this.textEditor).getUndoRedo(); } else { return new DummyHandlesUndoRedo(); } } @Override public void onFileOperation(FileEvent event) { if (event.getOperationType() != FileEvent.FileOperation.CLOSE) { return; } final VirtualFile eventFile = event.getFile(); final VirtualFile file = input.getFile(); if (file.equals(eventFile)) { workspaceAgent.removePart(this); } } /** Interface for this component's UIBinder. */ interface DefaultEditorAdapterUiBinder extends UiBinder<SimplePanel, Composite> {} }