/*******************************************************************************
* Copyright (c) 2008 CEA LIST.
* 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:
* CEA LIST - initial API and implementation
*******************************************************************************/
package org.eclipse.papyrus.extensionpoints.editors.ui;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.transaction.RecordingCommand;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.gef.GraphicalEditPart;
import org.eclipse.gmf.runtime.diagram.ui.parts.DiagramEditor;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.window.Window;
import org.eclipse.papyrus.extensionpoints.editors.configuration.IAdvancedEditorConfiguration;
import org.eclipse.papyrus.extensionpoints.editors.configuration.IDirectEditorConfiguration;
import org.eclipse.papyrus.extensionpoints.editors.configuration.IPopupEditorConfiguration;
import org.eclipse.papyrus.extensionpoints.editors.definition.DirectEditorExtensionPoint;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Widget;
import org.eclipse.ui.IObjectActionDelegate;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PlatformUI;
/**
* This action implementation is an abstract implementation of an object contribution action that
* opens a TEF editor window within a host editor. Inheriting concrete implementations have to
* provide the EMF object to be edited, the position of the editor window, access to the hosting GUI
* control and edit part.
*/
public abstract class OpenEmbeddedTextEditorObjectActionDelegate implements IObjectActionDelegate {
/** part in which the editor is embedded */
protected IWorkbenchPart part = null;
/** the configuration for the embedded editor */
private DirectEditorExtensionPoint directEditorExtensionPoint;
/**
* Returns the edited EObject
*
* @return the EObject edited in the editor. It should never be <code>null</code>.
*/
protected abstract EObject getEditedObject();
/**
* Returns the selected graphical edit part
*
* @return the GraphicalEditPart selected in the editor. It should never be <code>null</code>.
*/
protected abstract GraphicalEditPart getSelectedElement() ;
/**
* Retrieves the position where the editor should be opened.
*
* @return the position of the shell containing the editor
*/
// @unused
protected abstract Point getPosition();
/**
* Retrieves the editor context
*
* @return the context for the current editor
*/
// protected abstract IEditorContext getEditorContext();
/**
* Returns the editor's main control
*
* @return the editor's main control
*/
// @unused
protected abstract Control getControl();
/**
* {@inheritDoc}
*/
public void setActivePart(IAction action, IWorkbenchPart targetPart) {
part = targetPart;
}
/**
* {@inheritDoc}
*/
public void run(IAction action) {
// retrieves graphical context (in which shell it should open for
// exemple)
final IDirectEditorConfiguration configuration = directEditorExtensionPoint.getDirectEditorConfiguration();
configuration.preEditAction(getEditedObject());
Dialog dialog = null;
if (configuration instanceof IPopupEditorConfiguration) {
IPopupEditorConfiguration popupEditor = (IPopupEditorConfiguration)configuration ;
popupEditor.createPopupEditorHelper(getSelectedElement()).showEditor() ;
return ;
}
if(configuration instanceof IAdvancedEditorConfiguration) {
dialog = ((IAdvancedEditorConfiguration)configuration).createDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), getEditedObject(), configuration.getTextToEdit(getEditedObject()));
} else if(configuration instanceof IDirectEditorConfiguration) {
dialog = new ExtendedDirectEditionDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), getEditedObject(), ((IDirectEditorConfiguration)configuration).getTextToEdit(getEditedObject()), (IDirectEditorConfiguration)configuration);
} else {
return;
}
final Dialog finalDialog = dialog;
if(Window.OK == dialog.open()) {
TransactionalEditingDomain domain = ((DiagramEditor)part).getEditingDomain();
RecordingCommand command = new RecordingCommand(domain, "Edit Label") {
@Override
protected void doExecute() {
configuration.postEditAction(getEditedObject(), ((ILabelEditorDialog)finalDialog).getValue());
}
};
domain.getCommandStack().execute(command);
}
}
/**
* Sets the configuration for the editor
*
* @param configuration
* the configuration for the specified editor
*/
public void setExtensionPointConfiguration(DirectEditorExtensionPoint directEditorExtensionPoint) {
this.directEditorExtensionPoint = directEditorExtensionPoint;
}
/**
* Returns the parent composite for the new embedded editor
*
* @return the parent composite for the new embedded editor
*/
protected abstract Composite getParentComposite();
/**
* Returns whether the widget is <code>null</code> or disposed or active.
*
* @param widget
* the widget to check
* @return <code>true</code> if the widget can be used
*/
public static boolean isValid(Widget widget) {
return (widget != null && !widget.isDisposed());
}
}