/* Copyright 2012-2013 the original author or authors.
*
* 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.
*/
package org.snaker.designer.editors;
import java.io.File;
import java.util.EventObject;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.draw2d.FigureCanvas;
import org.eclipse.gef.DefaultEditDomain;
import org.eclipse.gef.EditPartViewer;
import org.eclipse.gef.GraphicalViewer;
import org.eclipse.gef.editparts.ScalableFreeformRootEditPart;
import org.eclipse.gef.palette.PaletteRoot;
import org.eclipse.gef.ui.actions.ToggleGridAction;
import org.eclipse.gef.ui.actions.ToggleSnapToGeometryAction;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PartInitException;
import org.snaker.designer.SnakerFlowDesignerEditor;
import org.snaker.designer.actions.ProcessContextMenuProvider;
import org.snaker.designer.config.ConfigManager;
import org.snaker.designer.io.Environment;
import org.snaker.designer.model.BaseElement;
import org.snaker.designer.model.Process;
import org.snaker.designer.palette.PaletteFactory;
import org.snaker.designer.parts.DesignerEditPartFactory;
import org.snaker.designer.utils.StringUtils;
/**
* 流程设计器
* @author yuqs
* @version 1.0
*/
public class ProcessDesignerEditor extends AbstractEditorPage {
@Override
public void init(IEditorSite site, IEditorInput input)
throws PartInitException {
super.init(site, input);
try {
IFile file = ((IFileEditorInput) input).getFile();
this.model = create(file);
if (this.model == null) {
throw new PartInitException(
"The specified input is not a valid network.");
}
} catch (CoreException e) {
throw new PartInitException(e.getStatus());
} catch (ClassCastException e) {
throw new PartInitException(
"The specified input is not a valid network.", e);
}
setSite(site);
setInput(input);
}
public ProcessDesignerEditor(SnakerFlowDesignerEditor parent, IFile file) {
super(parent);
try {
parent.model = ((BaseElement) this.model);
} catch (Exception e) {
e.printStackTrace();
}
DefaultEditDomain defaultEditDomain = new DefaultEditDomain(this);
setEditDomain(defaultEditDomain);
}
private Process create(IFile file) throws CoreException {
Process process = null;
try {
File location = new File(file.getLocationURI());
process = Environment.readerProcess(location.getAbsolutePath());
} catch (Exception e) {
process = new Process();
}
return process;
}
@Override
public String getPageName() {
return "流程定义";
}
@Override
protected PaletteRoot getPaletteRoot() {
try {
PaletteFactory factory = new PaletteFactory();
PaletteRoot root = factory
.getPaletteRoot(ConfigManager.COMPONENT_TYPE_PROCESS);
return root;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
@Override
protected void initializeGraphicalViewer() {
getGraphicalViewer().setContents(this.model);
}
@Override
protected void configureGraphicalViewer() {
super.configureGraphicalViewer();
ScalableFreeformRootEditPart rootEditPart = new ScalableFreeformRootEditPart();
GraphicalViewer viewer = getGraphicalViewer();
viewer.setRootEditPart(rootEditPart);
getGraphicalViewer().setEditPartFactory(
new DesignerEditPartFactory(getParentEditor()));
configureEditPartViewer(viewer);
((FigureCanvas) viewer.getControl())
.setScrollBarVisibility(FigureCanvas.ALWAYS);
getActionRegistry().registerAction(
new ToggleGridAction(getGraphicalViewer()));
getActionRegistry().registerAction(
new ToggleSnapToGeometryAction(getGraphicalViewer()));
}
protected void configureEditPartViewer(EditPartViewer viewer) {
ScalableFreeformRootEditPart rootEditPart = new ScalableFreeformRootEditPart();
viewer.setRootEditPart(rootEditPart);
getGraphicalViewer().setContextMenu(
new ProcessContextMenuProvider(getParentEditor()
.getActionRegistry(), getGraphicalViewer()));
((FigureCanvas) viewer.getControl())
.setScrollBarVisibility(FigureCanvas.ALWAYS);
}
@Override
public void doSave(IProgressMonitor monitor) {
IFile file = null;
try {
file = ((IFileEditorInput) getEditorInput()).getFile();
} catch (Exception e) {
e.printStackTrace();
}
if(file != null) {
File location = new File(file.getLocationURI());
Process process = (Process)this.model;
String error = process.validate();
if(StringUtils.isEmpty(error)) {
Environment.writer(process, location.getAbsolutePath());
getCommandStack().markSaveLocation();
} else {
MessageDialog.openWarning(null, "错误", error);
throw new RuntimeException(error);
}
}
}
protected void save(IFile file, IProgressMonitor progressMonitor)
throws CoreException {
if (progressMonitor == null) {
progressMonitor = new NullProgressMonitor();
}
progressMonitor.beginTask("Saving " + file, 2);
try {
progressMonitor.worked(1);
file.refreshLocal(0, new SubProgressMonitor(progressMonitor, 1));
progressMonitor.done();
} catch (Exception e) {
e.printStackTrace();
}
}
public void commandStackChanged(EventObject event) {
firePropertyChange(IEditorPart.PROP_DIRTY);
super.commandStackChanged(event);
}
public void selectionChanged(IWorkbenchPart part, ISelection selection) {
if (part.getSite().getWorkbenchWindow().getActivePage() == null) {
return;
}
super.selectionChanged(part, selection);
}
}