在BPM Diagram中实现Boundary Event的中断与非中断。
一、在org.autumn.bpm.diagram插件中增加扩展点
<extension
point="org.eclipse.gmf.runtime.common.ui.services.action.contributionItemProviders">
<contributionItemProvider
checkPluginLoaded="true"
class="org.autumn.bpm.diagram.providers.DiagramActionProvider">
<Priority
name="Low">
</Priority>
<popupContribution
class="org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContextMenuProvider">
<popupAction
id="SetInterruptingAction"
path="/additionsGroup">
</popupAction>
<popupStructuredContributionCriteria
objectClass="org.autumn.bpm.model.diagram.edit.parts.BoundaryEventEditPart"
objectCount="1">
</popupStructuredContributionCriteria>
</popupContribution>
<popupContribution
class="org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContextMenuProvider">
<popupAction
id="SetInterruptingAction"
path="/additionsGroup">
</popupAction>
<popupStructuredContributionCriteria
objectClass="org.autumn.bpm.model.diagram.edit.parts.BoundaryEvent2EditPart"
objectCount="1">
</popupStructuredContributionCriteria>
</popupContribution>
</contributionItemProvider>
</extension>
在DiagramActionProvider中创建SetInterruptingAction。
package org.autumn.bpm.diagram.providers;
import org.autumn.bpm.diagram.action.SetInterruptingAction;
import org.eclipse.gmf.runtime.common.ui.services.action.contributionitem.AbstractContributionItemProvider;
import org.eclipse.gmf.runtime.common.ui.util.IWorkbenchPartDescriptor;
import org.eclipse.jface.action.IAction;
import org.eclipse.ui.IWorkbenchPage;
/**
* Provide Action for Diagram context menu.
*
* @author sunny
*
*/
public class DiagramActionProvider extends AbstractContributionItemProvider {
@Override
protected IAction createAction(String actionId, IWorkbenchPartDescriptor partDescriptor) {
IWorkbenchPage workbenchPage = partDescriptor.getPartPage();
if (SetInterruptingAction.ID.equals(actionId)) {
return new SetInterruptingAction(workbenchPage);
}
return super.createAction(actionId, partDescriptor);
}
}
在扩展中注册SetInterruptingAction到diagram的右键菜单,并与BoundaryEventEditPart、BoundaryEvent2EditPart绑定。
SetInterruptingAction在init方法中设置好注册的ID,并可以设置右键菜单上对应的图标。SetInterruptingAction在refresh方法中设置右键菜单上Action示意的Label以及Action是否可用。SetInterruptingAction在doRun方法中执行Action涉及的命令,比如设置BoundaryEvent的cancelActivity属性。
package org.autumn.bpm.diagram.action;
import org.autumn.bpm.model.BoundaryEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.gmf.runtime.common.core.command.CommandResult;
import org.eclipse.gmf.runtime.common.ui.action.AbstractActionHandler;
import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy;
import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
import org.eclipse.gmf.runtime.emf.commands.core.command.AbstractTransactionalCommand;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
/**
* Sets the cancelActivity property of Boundary Event. Repaints the Boundary
* Event figure.
*
* @author sunny
*
*/
public class SetInterruptingAction extends AbstractActionHandler {
public static final String ID = "SetInterruptingAction"; //$NON-NLS-1$
public SetInterruptingAction(IWorkbenchPart workbenchPart) {
super(workbenchPart);
}
public SetInterruptingAction(IWorkbenchPage workbenchPage) {
super(workbenchPage);
}
@Override
public void init() {
super.init();
setId(ID);
setDescription("Sets the cancelActivity property of the selected element");
setToolTipText(getDescription());
}
@Override
public void refresh() {
IStructuredSelection selection = getStructuredSelection();
if (selection == null || (selection.isEmpty())) {
setEnabled(false);
return;
}
if (selection.getFirstElement() instanceof IGraphicalEditPart) {
EObject object = ((IGraphicalEditPart) selection.getFirstElement()).getNotationView().getElement();
if (object instanceof BoundaryEvent) {
BoundaryEvent boundaryEvent = (BoundaryEvent) object;
String name = boundaryEvent.getName() == null ? "BoundaryEvent" : boundaryEvent.getName();
if (boundaryEvent.isCancelActivity()) {
setText("Set " + name + " as Non-Interrupting");
} else {
setText("Set " + name + " as Interrupting");
}
setEnabled(true);
return;
}
}
setText("Sets the interrupting property");
setEnabled(false);
}
@Override
protected void doRun(IProgressMonitor progressMonitor) {
IStructuredSelection selection = getStructuredSelection();
if (selection == null || (selection.isEmpty())) {
return;
}
if (selection.getFirstElement() instanceof IGraphicalEditPart) {
IGraphicalEditPart part = (IGraphicalEditPart) selection.getFirstElement();
final EObject object = ((IGraphicalEditPart) selection.getFirstElement()).getNotationView().getElement();
if (object instanceof BoundaryEvent) {
part.getDiagramEditDomain().getDiagramCommandStack().execute(new ICommandProxy(new MyCommand(object) {
@Override
protected CommandResult doExecuteWithResult(IProgressMonitor monitor, IAdaptable info)
throws ExecutionException {
if (object instanceof BoundaryEvent) {
((BoundaryEvent) object).setCancelActivity(!(((BoundaryEvent) object).isCancelActivity()));
}
return CommandResult.newOKCommandResult();
}
}), progressMonitor);
}
}
}
private abstract class MyCommand extends AbstractTransactionalCommand {
public MyCommand(EObject elt) {
super((TransactionalEditingDomain) AdapterFactoryEditingDomain.getEditingDomainFor(elt),
"SetInterruptingAction", getWorkspaceFiles(elt));
}
}
}
二、处理BoundaryEventEditPart的监听事件
/**
* @author sunny
*/
@Override
protected void handleNotificationEvent(Notification notification) {
if (notification.getEventType() == Notification.SET || notification.getEventType() == Notification.UNSET) {
if (ModelPackage.eINSTANCE.getBoundaryEvent_CancelActivity().equals(notification.getFeature())) {
getPrimaryShape().setInterrupting(notification.getNewBooleanValue());
}
}
super.handleNotificationEvent(notification);
}
在cancelActivity的属性发生set或unset事件后重画BoundaryEvent图形
/**
* @author sunny
*/
public void setInterrupting(boolean isInterrupting) {
this.isInterrupting = isInterrupting;
revalidate();
repaint();
}
@Override
protected void paintOuter(Graphics graphics) {
ActivityPainter.paintEventIntermediate(graphics, this.getBoundsForHandle(), isInterrupting);
}
在创建BoundaryEvent的时候,把BoundaryEvent模型的cancelActivity赋值给BoundaryEvent图形的isInterrupting属性
/**
* @generated NOT
* @author sunny
*/
private void createContents() {
createContentsGen();
if (resolveSemanticElement() instanceof BoundaryEvent) {
BoundaryEvent boundaryEvent = (BoundaryEvent) resolveSemanticElement();
isInterrupting = boundaryEvent.isCancelActivity();
}
}
分享到:
相关推荐
关于eclipse gmf插件的相关插件工具
org.eclipse.gmf.rar org.eclipse.gmf.rar org.eclipse.gmf.rarorg.eclipse.gmf.rar
eclipse 图形化开发 插件 gmf
15 分钟学会 Eclipse GMF 15 分钟学会 Eclipse GMF
GMF 学习资料 GMF中的小知识点、GMF 教程 Mindmap等
现在GMF的资源比较稀缺, 我提供了一个基于GMF的图形化数据建模的例子,供大家参考,既可以作为自己数据库设计的轻量级工具,也可以作为学习GMF的参考
GMF Tutorial中文版——一套入门教程
GMF 教程 Mindmap,本文是跟着英文教程做了一遍,并简单翻译、截图,做了一些补充,总算是实现了原文的效果。
详细描述GMF的操作过程,GMF 开发文档。
GMF实例解析.pdf
综述了图形建模框架GMF,对于认识GMF,以及演说报告都有参考价值。
eclipse 3.2下的gef,ve,gmf,经过自己的收集,把三个都收集齐了,一并传上,希望对大家有用
GMF实例解析的pdf版,有需要的可以下载回去看
GMF开发FSM的完整的例子,非常详细。教你如何开发自己的建模工具
GMF入门资料,适合初学者学习,很经典
使用Eclipse GMF进行可视化建模的实战资料,包含概念介绍和示例代码。
我对于GMF Tourial(一)的中文翻译,有需要的可一下载回去看
主要是对自己做的项目的一些总结,包括如何自动添加图元、删除图元,建立连线,获得编辑器的EditPart,不打开编辑器,获取编辑器的EditPart,属性居中,自动保存图片等功能的实现。另外还有一些参考资料
GEF Example source code 博文链接:https://jamesblog.iteye.com/blog/148279
Graphical Modeling Framework,图形化建模框架