blob: 0b7897d974e98b1839ff4f5baef2d7ed0c57a59c [file] [log] [blame]
/*******************************************************************************
* 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
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.stem.model.ui.editor.controls;
import org.eclipse.emf.common.command.UnexecutableCommand;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.edit.command.AddCommand;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry;
import org.eclipse.gef.commands.CompoundCommand;
import org.eclipse.gef.palette.ConnectionCreationToolEntry;
import org.eclipse.gef.palette.PanningSelectionToolEntry;
import org.eclipse.gef.palette.ToolEntry;
import org.eclipse.gef.requests.CreationFactory;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.stem.model.metamodel.Compartment;
import org.eclipse.stem.model.metamodel.MetamodelFactory;
import org.eclipse.stem.model.metamodel.MetamodelPackage;
import org.eclipse.stem.model.metamodel.Model;
import org.eclipse.stem.model.ui.editor.ModelDiagramEditor;
import org.eclipse.stem.model.ui.editor.VisualModelReconciler;
import org.eclipse.stem.model.ui.editor.actions.RunModelGeneratorAction;
import org.eclipse.stem.model.ui.editor.commands.ModelCreateCommand;
import org.eclipse.stem.model.ui.editor.commands.emf.EmfCommandWrapper;
import org.eclipse.stem.model.ui.editor.vismodel.CompartmentElement;
import org.eclipse.stem.model.ui.editor.vismodel.ModelElement;
import org.eclipse.stem.model.ui.editor.vismodel.VisualMetamodelFactory;
import org.eclipse.stem.model.ui.editor.vismodel.provider.VisualMetamodelEditPlugin;
import org.eclipse.stem.model.ui.wizards.ModelCompartmentEditorDialog;
import org.eclipse.stem.model.ui.wizards.NewModelWizard;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
public class VisualEditorToolbar extends Composite {
private ToolEntry selectTool;
private ToolEntry drawTool;
private ModelDiagramEditor editor;
private ComboViewer modelViewer;
// private Button addModelButton, editModelButton, generateModelButton,
// addCompartmentButton;
// private Button selectCompartmentButton, drawTransitionButton;
private ToolItem runModelGeneratorButton, drawTransitionButton, selectButton, editModelButton, addModelButton,addCompartmentButton;
private Image defaultImage;
private void setupTools() {
selectTool = new PanningSelectionToolEntry();
drawTool = new ConnectionCreationToolEntry("Transition",
"Create a solid-line connection", new CreationFactory() {
public Object getNewObject() {
return null;
}
public Object getObjectType() {
return new Object();
}
}, ImageDescriptor.createFromFile(ModelDiagramEditor.class,
"icons/connection_s16.gif"),
ImageDescriptor.createFromFile(ModelDiagramEditor.class,
"icons/connection_s24.gif"));
defaultImage = new Image(getDisplay(), 20, 20);
Color color = getDisplay().getSystemColor(SWT.COLOR_BLUE);
GC gc = new GC(defaultImage);
gc.setBackground(color);
gc.fillRectangle(defaultImage.getBounds());
gc.dispose();
}
// private CoolItem createCoolItem(Control control, CoolBar bar)
// {
// CoolItem item = new CoolItem(bar, SWT.NONE);
// Point controlSize = control.computeSize(SWT.DEFAULT, SWT.DEFAULT);
// item.setPreferredSize(item.computeSize(controlSize.x, controlSize.y));
// item.setControl(control);
// item.set
// return item;
// }
public VisualEditorToolbar(final ModelDiagramEditor editor, Composite parent, int style) {
super(parent, style);
this.editor = editor;
setupTools();
final VisualMetamodelEditPlugin resourceLocator = VisualMetamodelEditPlugin.INSTANCE;
setLayout(new GridLayout(3, false));
final Label topBarLabel = new Label(this, SWT.NONE);
topBarLabel.setText("Model");
modelViewer = new ComboViewer(this, SWT.READ_ONLY);
modelViewer.setContentProvider(new ArrayContentProvider());
modelViewer.setLabelProvider(new LabelProvider() {
@Override
public String getText(Object element) {
if (element instanceof ModelElement) {
return ((ModelElement) element).getModel().getName();
}
return "";
}
});
modelViewer
.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
editor.setDiagramElement(getSelectedModel());
}
});
ToolBar toolbar = new ToolBar(this, SWT.NONE);
editModelButton = new ToolItem(toolbar, SWT.PUSH);
//editModelButton.setImage(defaultImage);
editModelButton.setImage(ExtendedImageRegistry.INSTANCE.getImage(resourceLocator.getImage("EditModel.gif")));
editModelButton.setToolTipText("Edit Model");
editModelButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
launchEditModel();
}
});
addModelButton = new ToolItem(toolbar, SWT.PUSH);
addModelButton.setImage(ExtendedImageRegistry.INSTANCE.getImage(resourceLocator.getImage("AddModelIcon16")));
addModelButton.setToolTipText("Add Model");
addModelButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
launchAddModel();
}
});
addCompartmentButton = new ToolItem(toolbar, SWT.PUSH);
addCompartmentButton.setImage(ExtendedImageRegistry.INSTANCE.getImage(resourceLocator.getImage("AddCompartmentIcon24")));
addCompartmentButton.setToolTipText("Add Compartment");
addCompartmentButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
launchAddCompartment();
}
});
new ToolItem(toolbar, SWT.SEPARATOR | SWT.VERTICAL);
selectButton = new ToolItem(toolbar, SWT.CHECK);
selectButton.setImage(
ExtendedImageRegistry.INSTANCE.getImage(resourceLocator.getImage("SelectIcon20")));
selectButton.setToolTipText("Select Compartment");
selectButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (!selectButton.getSelection()) {
selectButton.setSelection(true);
}
editor.getEditingDomain().setActiveTool(selectTool.createTool());
drawTransitionButton.setSelection(false);
}
});
drawTransitionButton = new ToolItem(toolbar, SWT.CHECK);
drawTransitionButton.setImage(
ExtendedImageRegistry.INSTANCE.getImage(resourceLocator.getImage("DrawTransitionIcon20")));
drawTransitionButton.setToolTipText("Draw New Transition");
drawTransitionButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (!drawTransitionButton.getSelection()) {
drawTransitionButton.setSelection(true);
}
editor.getEditingDomain().setActiveTool(drawTool.createTool());
selectButton.setSelection(false);
}
});
new ToolItem(toolbar, SWT.SEPARATOR);
runModelGeneratorButton = new ToolItem(toolbar, SWT.PUSH);
runModelGeneratorButton.setImage(ExtendedImageRegistry.INSTANCE.getImage(resourceLocator.getImage("RunModelGeneratorIcon20")));
runModelGeneratorButton.setToolTipText("Run Model Generator");
runModelGeneratorButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
launchModelGenerator();
}
});
// ToolItem resetEditorButton = new ToolItem(toolbar, SWT.PUSH);
//
// //resetEditorButton.setImage(defaultImage);
// resetEditorButton.setImage(ExtendedImageRegistry.INSTANCE.getImage(resourceLocator.getImage("Reload.gif")));
// resetEditorButton.setToolTipText("Reload Editor");
// resetEditorButton.addSelectionListener(new SelectionAdapter() {
//
// @Override
// public void widgetSelected(SelectionEvent e) {
// editor.reload();
// }
// });
// toolbar.pack();
setInput();
selectButton.setSelection(true);
}
protected void setInput() {
EList<ModelElement> models = editor.getVisualModel().getModelElements();
modelViewer.setInput(models);
if (models.size() > 0 && models.get(0) != null) {
modelViewer.setSelection(new StructuredSelection(models.get(0)));
}
}
public void inputChanged() {
setInput();
}
private void launchModelGenerator() {
RunModelGeneratorAction action = new RunModelGeneratorAction(editor);
action.run();
}
private ModelElement getSelectedModel() {
return (ModelElement) ((IStructuredSelection) modelViewer
.getSelection()).getFirstElement();
}
private void launchAddCompartment() {
ModelElement selected = getSelectedModel();
if (selected == null) {
return;
}
Compartment newCompartment = MetamodelFactory.eINSTANCE
.createCompartment();
ModelCompartmentEditorDialog compartmentEditorDialog = new ModelCompartmentEditorDialog(
getShell(), SWT.NONE, selected.getModel().getCompartments(),
newCompartment, null);
if (compartmentEditorDialog.open() == Window.OK) {
selected.getModel().getCompartments().getCompartments()
.add(newCompartment);
CompartmentElement ce = VisualMetamodelFactory.eINSTANCE
.createCompartmentElement();
ce.setCompartment(newCompartment);
ce.setX(10);
ce.setY(10);
ce.setWidth(50);
ce.setHeight(50);
selected.getCompartmentElements().add(ce);
}
}
private void launchEditModel() {
ModelElement selected = getSelectedModel();
if (selected == null || selected.getModel() == null) {
return;
}
ModelParametersEditorDialog dialog = new ModelParametersEditorDialog(
getShell(), selected.getModel());
if (dialog.open() == Window.OK) {
// TODO make this an actual command
editor.getCommandStack().execute(new EmfCommandWrapper(UnexecutableCommand.INSTANCE));
}
}
private void launchAddModel() {
Model model = MetamodelFactory.eINSTANCE.createModel();
NewModelWizard wizard = new NewModelWizard(model, editor.getMetamodel(), false, true);
WizardDialog wizardDialog = new WizardDialog(getShell(), wizard);
if (wizardDialog.open() == Window.OK) {
// AddCommand.
EditingDomain editingDomain = editor.getMetamodelEditingDomain();
CompoundCommand command = new CompoundCommand();
command.add(new EmfCommandWrapper(AddCommand.create(editingDomain,
editor.getMetamodel(),
MetamodelPackage.Literals.PACKAGE__MODELS, model)));
command.add(new EmfCommandWrapper(AddCommand.create(editingDomain,
editor.getMetamodel(),
MetamodelPackage.Literals.PACKAGE__COMPARTMENT_GROUPS,
model.getCompartments())));
ModelElement me = VisualModelReconciler
.initializeModelElement(model);
command.add(new ModelCreateCommand(editor.getVisualModel(), me));
editor.getCommandStack().execute(command);
modelViewer.refresh();
selectModel(me);
}
}
public void selectModel(ModelElement me) {
modelViewer.setSelection(new StructuredSelection(me));
}
}