`
cutesunshineriver
  • 浏览: 200116 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

构造GMF Diagram右键菜单

阅读更多
在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();
			}
		}



1
1
分享到:
评论

相关推荐

    GMF教程.doc

    - 生成`diagram code`,这将创建一个新的工程`org.eclipse.gmf.examples.mindmap.diagram`。 9. **运行图形编辑器** - 右键点击`org.eclipse.gmf.examples.mindmap.diagram`工程,运行`Eclipse Application`。 -...

    GMF 开发文档

    - **生成代码:** 右键单击`a.genmodel`文件的树视图根目录,然后从上下文菜单中选择“生成模型代码”和“生成编辑代码”。这一步骤生成了必要的代码基础。 ##### 2.4 图形定义模型创建 - **图形定义模型:** 接...

    15 分钟学会 Eclipse GMF

    2. 设计图形编辑器:使用GMF Tooling的Diagram Editor和Edit Part Editor设计图形元素和交互。 3. 生成代码:通过GMF的Generate代码操作自动生成编辑器代码。 4. 运行编辑器:在Eclipse中运行生成的编辑器,验证功能...

    gmf 1.7 最新版的gmf

    GMF(Generic Model Framework)是Eclipse平台下的一款强大的图形建模框架,它为开发者提供了构建图形用户界面(GUI)的工具,特别是用于创建复杂的图形编辑器和图表应用程序。GMF 1.7是最新的版本,它在前一版本的...

    GMF数据表建模例子

    GMF(Generic Modeling Framework)是Eclipse平台下的一个开源项目,它为开发可扩展的图形化建模工具提供了基础框架。这个"GMF数据表建模例子"显然是一个利用GMF构建的数据库设计工具,可以帮助用户以图形化的方式...

    GMF Tutorial中文版

    工具定义模型则允许开发者设计工具栏、菜单等用户界面元素。 通过本教程,读者将逐步了解如何使用GMF来设计和实现图形化建模工具,包括如何创建模型,设计图形界面,以及集成编辑功能。同时,教程还探讨了GMF如何...

    gmf-runtime-2.1.2.zip

    GMF(Graphical Modeling Framework)是Eclipse基金会推出的一个开源项目,主要用于构建图形化建模工具。这个"gmf-runtime-2.1.2.zip"压缩包文件包含了Eclipse图形化开发插件GMF的运行时组件,版本为2.1.2。此插件...

    GMF EMF

    GMF(Generic Modeling Framework)是Eclipse Modeling Framework (EMF)的一个扩展,它提供了一种通用的方法来构建基于模型的应用程序。GMF旨在简化图形用户界面(GUI)的开发,特别是那些涉及图表编辑和可视化任务...

    org.eclipse.gmf.rar

    《深入解析Eclipse GMF RAR技术》 在软件开发领域,Eclipse是一个广泛使用的集成开发环境(IDE),而GMF(Graphical Modeling Framework)则是Eclipse社区提供的一款强大的图形建模框架。本文将深入探讨GMF中的RAR...

    Eclipse插件 GMF

    2. **图元(Diagram)**:这是你在图形界面中看到的东西,代表了模型的可视化表示。你可以定义图元的外观、大小、颜色等属性。 3. **编辑器(Editor)**:这是用户与你的模型交互的地方。GMF会自动生成大部分编辑器...

    GMF实例解析.pdf

    【GMF实例解析】 GMF,全称是Graphical Modeling Framework,是Eclipse建模项目中的一个重要组成部分,它建立在GEF(Graphical Editor Framework)和EMF(Eclipse Modeling Framework)之上,为开发基于图形界面的...

    GMF Tourial中文版(一)

    - **工具定义模型(tooling definition model)**:这是一个可选组件,用于定义调色板(palette)、菜单、工具栏等图形化或工具组件,旨在提供一致的用户体验,无论面对何种领域的模型。 #### 六、GMF的工作流程 - **...

    GMF实例解析(PDF版)

    ### GMF实例解析:Taipan案例深度剖析 #### 前言:GMF与图形化编辑器的革新 在IT领域,特别是软件工程中,图形化编辑器的开发一直是复杂且具有挑战性的任务。传统的图形编辑器开发往往依赖于MVC(Model-View-...

    一个简单的GMF实例

    - `com.lgylym.reservation.diagram`:这部分可能是关于图形图表的定义,具体到GMF中,这可能涉及到元模型的图形表示,以及如何在屏幕上绘制这些图形。 - `com.lgylym.reservation`:这个顶级包可能包含了整个 ...

    GMF相关资料

    GMF,全称为Generic Mapping Tools,是一个开源的地理信息系统,用于创建、编辑和展示地理数据。这个工具在地学、环境科学以及地球物理学等领域广泛应用,因其强大的地图制作和数据分析功能而受到专业人士的喜爱。本...

    gmf例子

    "gmf.diagram"是指在GMF中创建和展示图表或图形表示的数据模型。这部分通常涉及图形建模,包括创建和编辑各种图表,如流程图、网络图或者地理特征的符号化表示。GMF的图表编辑功能允许开发者定义自己的图表元素,...

    eclipse gef ve gmf

    在Eclipse中,GEF(Graphical Editing Framework)、VE(Visual Editor)和GMF(Graphical Modeling Framework)是三个重要的插件或框架,主要用于图形化界面设计和建模。 1. GEF(Graphical Editing Framework) ...

Global site tag (gtag.js) - Google Analytics