在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();
}
}
分享到:
相关推荐
- 生成`diagram code`,这将创建一个新的工程`org.eclipse.gmf.examples.mindmap.diagram`。 9. **运行图形编辑器** - 右键点击`org.eclipse.gmf.examples.mindmap.diagram`工程,运行`Eclipse Application`。 -...
- **生成代码:** 右键单击`a.genmodel`文件的树视图根目录,然后从上下文菜单中选择“生成模型代码”和“生成编辑代码”。这一步骤生成了必要的代码基础。 ##### 2.4 图形定义模型创建 - **图形定义模型:** 接...
2. 设计图形编辑器:使用GMF Tooling的Diagram Editor和Edit Part Editor设计图形元素和交互。 3. 生成代码:通过GMF的Generate代码操作自动生成编辑器代码。 4. 运行编辑器:在Eclipse中运行生成的编辑器,验证功能...
GMF(Generic Model Framework)是Eclipse平台下的一款强大的图形建模框架,它为开发者提供了构建图形用户界面(GUI)的工具,特别是用于创建复杂的图形编辑器和图表应用程序。GMF 1.7是最新的版本,它在前一版本的...
GMF(Generic Modeling Framework)是Eclipse平台下的一个开源项目,它为开发可扩展的图形化建模工具提供了基础框架。这个"GMF数据表建模例子"显然是一个利用GMF构建的数据库设计工具,可以帮助用户以图形化的方式...
GMF(Graphical Modeling Framework)是Eclipse基金会推出的一个开源项目,主要用于构建图形化建模工具。这个"gmf-runtime-2.1.2.zip"压缩包文件包含了Eclipse图形化开发插件GMF的运行时组件,版本为2.1.2。此插件...
工具定义模型则允许开发者设计工具栏、菜单等用户界面元素。 通过本教程,读者将逐步了解如何使用GMF来设计和实现图形化建模工具,包括如何创建模型,设计图形界面,以及集成编辑功能。同时,教程还探讨了GMF如何...
GMF(Generic Modeling Framework)是Eclipse Modeling Framework (EMF)的一个扩展,它提供了一种通用的方法来构建基于模型的应用程序。GMF旨在简化图形用户界面(GUI)的开发,特别是那些涉及图表编辑和可视化任务...
《深入解析Eclipse GMF RAR技术》 在软件开发领域,Eclipse是一个广泛使用的集成开发环境(IDE),而GMF(Graphical Modeling Framework)则是Eclipse社区提供的一款强大的图形建模框架。本文将深入探讨GMF中的RAR...
2. **图元(Diagram)**:这是你在图形界面中看到的东西,代表了模型的可视化表示。你可以定义图元的外观、大小、颜色等属性。 3. **编辑器(Editor)**:这是用户与你的模型交互的地方。GMF会自动生成大部分编辑器...
【GMF实例解析】 GMF,全称是Graphical Modeling Framework,是Eclipse建模项目中的一个重要组成部分,它建立在GEF(Graphical Editor Framework)和EMF(Eclipse Modeling Framework)之上,为开发基于图形界面的...
### GMF 开发 FSM 的完整实例解析 #### 引言 GMF(Graphical Modeling Framework)是Eclipse项目的一部分,它提供了一套完整的工具和框架用于创建图形化编辑器,帮助开发者快速构建复杂的模型编辑器。本文档将通过...
- **工具定义模型(tooling definition model)**:这是一个可选组件,用于定义调色板(palette)、菜单、工具栏等图形化或工具组件,旨在提供一致的用户体验,无论面对何种领域的模型。 #### 六、GMF的工作流程 - **...
### GMF实例解析:Taipan案例深度剖析 #### 前言:GMF与图形化编辑器的革新 在IT领域,特别是软件工程中,图形化编辑器的开发一直是复杂且具有挑战性的任务。传统的图形编辑器开发往往依赖于MVC(Model-View-...
- `com.lgylym.reservation.diagram`:这部分可能是关于图形图表的定义,具体到GMF中,这可能涉及到元模型的图形表示,以及如何在屏幕上绘制这些图形。 - `com.lgylym.reservation`:这个顶级包可能包含了整个 ...
GMF,全称为Generic Mapping Tools,是一个开源的地理信息系统,用于创建、编辑和展示地理数据。这个工具在地学、环境科学以及地球物理学等领域广泛应用,因其强大的地图制作和数据分析功能而受到专业人士的喜爱。本...
"gmf.diagram"是指在GMF中创建和展示图表或图形表示的数据模型。这部分通常涉及图形建模,包括创建和编辑各种图表,如流程图、网络图或者地理特征的符号化表示。GMF的图表编辑功能允许开发者定义自己的图表元素,...
在Eclipse中,GEF(Graphical Editing Framework)、VE(Visual Editor)和GMF(Graphical Modeling Framework)是三个重要的插件或框架,主要用于图形化界面设计和建模。 1. GEF(Graphical Editing Framework) ...