/*
* Copyright 2005 Pi4 Technologies Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*
* Change History:
* Jul 5, 2005 : Initial version created by gary
*/
package org.savara.tools.scenario.designer.editor;
import org.eclipse.draw2d.FigureCanvas;
import org.eclipse.draw2d.Viewport;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.gef.ContextMenuProvider;
import org.eclipse.gef.EditDomain;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.EditPartViewer;
import org.eclipse.gef.GraphicalViewer;
import org.eclipse.gef.commands.CommandStack;
import org.eclipse.gef.editparts.ScalableFreeformRootEditPart;
import org.eclipse.gef.ui.parts.GraphicalViewerKeyHandler;
import org.eclipse.gef.ui.parts.ScrollingGraphicalViewer;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.part.FileEditorInput;
import org.savara.tools.scenario.designer.dnd.ScenarioTemplateTransferDropTargetListener;
import org.savara.tools.scenario.designer.model.ModelSupport;
import org.savara.tools.scenario.designer.parts.*;
import org.savara.tools.scenario.designer.simulate.SimulationEntity;
import org.savara.tools.scenario.designer.view.GraphicalComponent;
/**
* This class represents the flow based representation of a
* choreography.
*/
public class ScenarioEditorPage extends AbstractEditorPage
implements org.savara.tools.scenario.designer.simulate.ScenarioSimulation {
/**
* The constructor for the choreography flow page.
*
* @param parent The multipage editor
*/
public ScenarioEditorPage(ScenarioDesigner parent) {
super(parent, new EditDomain());
}
/**
* This method returns the page name.
*
* @return The page name
*/
public String getPageName() {
return("Scenario Editor");
}
protected CommandStack getCommandStack2() {
return(super.getCommandStack());
}
/**
* This method returns the scenario.
*
* @return The scenario
*/
public org.savara.scenario.model.Scenario getScenario() {
return((org.savara.scenario.model.Scenario)getDescription());
}
/**
* This method creates the page control.
*/
protected void createPageControl(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
composite.setBackground(parent.getBackground());
composite.setLayout(new GridLayout(2, false));
createPaletteViewer(composite);
GridData gd = new GridData(GridData.FILL_VERTICAL);
gd.widthHint = 125;
getPaletteViewer().getControl().setLayoutData(gd);
createGraphicalViewer(composite);
gd = new GridData(GridData.FILL_BOTH);
gd.widthHint = 275;
getViewer().getControl().setLayoutData(gd);
}
/**
* Creates the GraphicalViewer on the specified <code>Composite</code>.
* @param parent the parent composite
*/
private void createGraphicalViewer(Composite parent) {
m_viewer = new ScrollingGraphicalViewer();
m_viewer.createControl(parent);
// configure the viewer
m_viewer.getControl().setBackground(parent.getBackground());
m_viewer.setRootEditPart(new ScalableFreeformRootEditPart());
m_viewer.setKeyHandler(new GraphicalViewerKeyHandler(m_viewer));
// hook the viewer into the editor
registerEditPartViewer(m_viewer);
// configure the viewer with drag and drop
configureEditPartViewer(m_viewer);
// initialize the viewer with input
m_viewer.setEditPartFactory(
new org.savara.tools.scenario.designer.parts.ScenarioEditPartsFactory(this));
m_viewer.setContents(getScenario());
focus(getScenario());
}
/**
* Refresh the editor page without a new input.
*
*/
public void refresh() {
EditPart ep=getFocusEditPart();
if (ep instanceof ScenarioEditPart) {
//resetViewer();
focus(ep.getModel());
} else if (ep instanceof ScenarioBaseEditPart && ModelSupport.getParent(
((ScenarioBaseEditPart)ep).getScenarioDiagram().getScenario(), ep.getModel()) != null) {
ep.refresh();
} else {
resetViewer();
}
}
public Object getFocusComponent() {
Object ret=null;
java.util.List parts=m_viewer.getSelectedEditParts();
if (parts.size() == 1) {
EditPart part=(EditPart)parts.get(0);
if (part instanceof ScenarioBaseEditPart) {
ret = ((ScenarioBaseEditPart)part).getModel();
}
}
return(ret);
}
public EditPart getFocusEditPart() {
EditPart ret=null;
java.util.List parts=m_viewer.getSelectedEditParts();
if (parts.size() == 1) {
ret=(EditPart)parts.get(0);
}
return(ret);
}
protected void resetViewer() {
if (m_viewer != null &&
getScenario() != null) {
m_viewer.setContents(getScenario());
}
}
/**
* This method returns the GraphicalViewer.
*
* @return The graphical viewer
* @see com.ibm.itso.sal330r.gefdemo.editor.AbstractEditorPage#getGraphicalViewerForZoomSupport()
*/
public org.eclipse.gef.EditPartViewer getViewer() {
return(m_viewer);
}
/**
* This method returns the context menu provider.
*
* @param viewer The edit part viewer
* @return The context menu provider
*/
protected ContextMenuProvider createContextMenuProvider(EditPartViewer viewer) {
return(new EditorContextMenuProvider(viewer,
getEditor().getActionRegistry()));
}
/**
* This method returns a transfer drop target listener.
*
* @param viewer The edit part viewer
* @return The transfer drop target listener
*/
protected org.eclipse.jface.util.TransferDropTargetListener createTransferDropTargetListener(EditPartViewer viewer) {
return(new ScenarioTemplateTransferDropTargetListener(viewer));
}
/**
* This method returns the title.
*
* @return The title
* @see org.eclipse.ui.IWorkbenchPart#getTitle()
*/
public String getTitle() {
return("Edit the test scenario");
}
/**
* This method focuses the editor page on the supplied
* component.
*
* @param component The component
*/
public void focus(Object scenarioObject) {
/*
if ((component instanceof org.pi4soa.scenario.ScenarioObject) == false) {
return;
}
org.pi4soa.scenario.ScenarioObject scenarioObject=
(org.pi4soa.scenario.ScenarioObject)component;
*/
resetViewer();
m_viewer.flush();
focusOnEditPart(scenarioObject);
}
/**
* This method finds an editpart associated with the
* supplied scenario object.
*
* @param scenarioObject The scenario object
* @return The edit part
*/
protected org.eclipse.gef.EditPart findEditPart(Object scenarioObject) {
org.eclipse.gef.EditPart ret=null;
if (scenarioObject instanceof org.savara.scenario.model.Link) {
if (m_viewer.getContents() instanceof ScenarioBaseEditPart) {
ret = ((ScenarioBaseEditPart)m_viewer.getContents()).
findEditPartForModel(scenarioObject);
}
} else {
ret = m_viewer.getContents();
if (ret instanceof ScenarioBaseEditPart) {
ret = findSelectedEditPart((ScenarioBaseEditPart)ret,
scenarioObject);
}
}
return(ret);
}
/**
* This method focuses on the editpart associated with the
* supplied scenario object, and moves the viewport (if
* necessary) to ensure the editpart is visible.
*
* @param scenarioObject The scenario object
* @return The edit part
*/
protected org.eclipse.gef.EditPart focusOnEditPart(Object scenarioObject) {
org.eclipse.gef.EditPart ret=findEditPart(scenarioObject);
if (ret != null) {
m_viewer.select(ret);
}
if (ret instanceof ScenarioEditPart) {
FigureCanvas canvas=(FigureCanvas)
m_viewer.getControl();
canvas.scrollSmoothTo(0, 0);
} else if (ret instanceof GraphicalComponent) {
GraphicalComponent ep=(GraphicalComponent)ret;
int x=0;
int y=0;
int width=ep.getComponentBounds().width;
int height=ep.getComponentBounds().height;
while (ep != null) {
Rectangle r=ep.getComponentBounds();
x += r.x;
y += r.y;
if (ep.getComponentParent() instanceof GraphicalComponent) {
ep = (GraphicalComponent)ep.getComponentParent();
} else {
ep = null;
}
}
FigureCanvas canvas=(FigureCanvas)
m_viewer.getControl();
Viewport port = canvas.getViewport();
Dimension viewportSize = port.getClientArea().getSize();
x -= (viewportSize.width - width)/2;
y -= (viewportSize.height - height)/2;
canvas.scrollSmoothTo(x, y);
}
return(ret);
}
public void startSimulation() {
m_simulationRunning = true;
}
public void resetSimulation() {
if (m_viewer.getContents() instanceof SimulationEntity) {
((SimulationEntity)m_viewer.getContents()).reset();
}
m_log = new StringBuffer();
m_simulationRunning = false;
if (m_viewer.getContents() instanceof SimulationEntity) {
focusOnEditPart(((SimulationEntity)m_viewer.getContents()));
}
}
public boolean isSimulationRunning() {
return(m_simulationRunning);
}
public SimulationEntity getSimulationEntity(Object model, boolean focus) {
SimulationEntity ret=null;
m_simulationRunning = true;
org.eclipse.gef.EditPart ep=null;
if (focus) {
ep = focusOnEditPart(model);
} else {
ep = findEditPart(model);
}
if (ep instanceof SimulationEntity) {
ret = (SimulationEntity)ep;
}
return(ret);
}
public void appendLogEntry(String results) {
m_log.append(results);
}
public String getLogEntry(int start, int end) {
String ret=null;
if (start >= 0 && end >= 0 && end >= start &&
end < m_log.length()) {
ret = m_log.substring(start, end);
}
return(ret);
}
public String getLogEntry(Object scenarioObject) {
String ret=null;
org.eclipse.gef.EditPart ep=findEditPart(scenarioObject);
if (ep instanceof SimulationEntity) {
ret = getLogEntry(((SimulationEntity)ep).getLogStartPosition(),
((SimulationEntity)ep).getLogEndPosition());
}
return(ret);
}
/**
* This method focuses the environment on the supplied
* URL and region name.
*
* @param scenarioURL The scenario path
* @param regionName The optional region name
*/
public void focus(String scenarioURL, String regionName) {
if (getEditorInput() instanceof FileEditorInput) {
FileEditorInput fei=(FileEditorInput)getEditorInput();
org.eclipse.core.resources.IFile modelFile=
fei.getFile().getParent().getFile(
new org.eclipse.core.runtime.Path(scenarioURL));
IWorkbenchWindow workbenchWindow=
getSite().getWorkbenchWindow();
try {
org.eclipse.ui.IEditorPart editorPart=
workbenchWindow.getActivePage().openEditor
(new FileEditorInput(modelFile),
workbenchWindow.getWorkbench().
getEditorRegistry().
getDefaultEditor(modelFile.getFullPath().toString()).getId());
if (regionName != null &&
editorPart instanceof ScenarioDesigner) {
ScenarioDesigner designer=(ScenarioDesigner)editorPart;
/* TODO: GPB: need to recursively check for group by name
org.savara.scenario.model.Group region=
designer.getScenario().getRegion(regionName);
if (region != null) {
designer.getScenarioEditorPage().focus(region);
}
*/
}
} catch (PartInitException exception) {
MessageDialog.openError(workbenchWindow.getShell(),
"Open Editor", exception.getMessage());
}
}
}
private GraphicalViewer m_viewer=null;
private boolean m_simulationRunning=false;
private StringBuffer m_log=new StringBuffer();
}