GMF关于采用拖动方式创建连线的实例
来源:互联网 发布:java web面试题目 编辑:程序博客网 时间:2024/05/18 03:43
场景:A1 A2两个容器,分别有隔间,隔间分别容纳B1 B2两种对象,任意B1和B2之间可以单向连线(即B1-〉B2)。
问题:为了更好的用户体验,需要直接拖动A1内的B1到B2上方Drop时候,创建连线C。
解决路径:
1、A1隔间内B1可拖动,给A1隔间安装:installEditPolicy(EditPolicy.LAYOUT_ROLE, new FlowLayoutEditPolicy()....
2、A2隔间可响应拖动,给A2隔间安装:
installEditPolicy(EditPolicyRoles.DRAG_DROP_ROLE,new DragDropEditPolicy() {protected Command getDropElementCommand(EObject element,DropObjectsRequest request) {B2EditPart ep = findB2EditPartFromPoint(request.getLocation());setDropB2EditPart(ep); //自定义方法,记录拖动到的EPif (ep == null)return null;IElementType type = XXXElementTypes.CConnection_4001;CreateRelationshipRequest req = new CreateRelationshipRequest(element, ep.resolveSemanticElement(),type);ConnectionViewAndElementDescriptor viewDescriptor = new ConnectionViewAndElementDescriptor(new CreateElementRequestAdapter(req),((IHintedType) type).getSemanticHint(),XXXDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);CreateConnectionViewAndElementRequest verequest = new CreateConnectionViewAndElementRequest(viewDescriptor);EditPart sourceEditPart = XXXBaseItemSemanticEditPolicy.getDiagramEditPart(getHost()).findEditPart(null, element); // create the subtopics link command ICommand createSubTopicsCmd = new DeferredCreateConnectionViewAndElementCommand(verequest, new EObjectAdapter((EObject) sourceEditPart.getModel()), new EObjectAdapter(ep.getPrimaryView()), getHost().getViewer()); return new ICommandProxy(createSubTopicsCmd);}});
//根据拖动的位置找B2的方法private B2EditPart findB2EditPartFromPoint(Point pt) {EditPart ep = this.getRoot().getViewer().findObjectAt(pt);if (ep instanceof B2EditPart)return (B2EditPart) ep;else if (ep.getParent() instanceof AttributeEditPart) {return (B2) ep.getParent();}return null;}
3、A2隔间的A2CompartmentItemSemanticEditPolicy中,响应创建元素Request
protected Command getCreateCommand(CreateElementRequest req) { //.........以上为自动生成代码if (XXXElementTypes.CConnection_4001 == req.getElementType()) {EObject target = null;if (getHost() instanceof A2CompartmentEditPart) {A2CompartmentEditPart) part = (B2CompartmentEditPart) getHost();B2EditPart ep = part.getDropB2EditPart();if (ep != null)target = ep.resolveSemanticElement();elsereturn null;CreateRelationshipRequest req1 = new CreateRelationshipRequest(req.getNewElement(), target, req.getElementType());B2ItemSemanticEditPolicy poc = (B2ItemSemanticEditPolicy) ep.getEditPolicy(EditPolicyRoles.SEMANTIC_ROLE);Command cmd1 = poc.getCompleteCreateRelationshipCommand(req1); //此方法最终传导到了XXXBaseItemSemanticEditPolicyreturn cmd1;}}return super.getCreateCommand(req);}
4、XXXBaseItemSemanticEditPolicy中完成getCreateRelationshipCommand
protected Command getCreateRelationshipCommand(CreateRelationshipRequest req) {if (req.getSource()!=null&&req.getTarget()!=null){CConnectionCreateCommand cmd = new CConnectionCreateCommand(req,req.getSource(), req.getTarget());return new ICommandProxy(cmd);}return null;}
- GMF关于采用拖动方式创建连线的实例
- GMF中,删除节点和连线的实现
- GMF中,删除节点和连线的另一种实现
- GMF 经验点滴积累(三)- Drag and Drop方式实现图形(Node)的创建
- 关于xib的连线
- GEF 创建连线的优化
- GMF入门实例
- 采用Soap方式的php的webservice简单实例
- 详解jsPlumb这个javascript的可拖动连线库
- java中的servlet采用的是单实例多线程方式
- servlet2.x采用的是单实例多线程方式
- 采用Clone()方式创建对象
- 采用面向对象的方式创建window原生程序
- JLINK的SW调试模式连线方式
- 关于创建模型的实例
- 关于bundle的创建方式
- STM32中关于检测按键的一些问题(关于采用传统的延时消抖方式和采用中断方式)
- 关于xib连线错误的bug修正
- redhat 配置本地源
- 为什么std::valarray那么慢(2)
- The Java XML Validation API
- dumpbin命令问题的解决办法【转】
- Building hybrid mobile applications with PhoneGap and IBM WebSphere Portlet Factory
- GMF关于采用拖动方式创建连线的实例
- Liferay-Portlet -------CI
- 如梦令·编码不知日暮
- Webkit定时器(Timer)分析
- linux 5.3 管理系统下搭建samba详解
- vs2005 环境编译windows平台的nginx 心得
- asp.net 自定义控件实现无刷新上传图片,立即显示缩略图,保存图片缩略图
- 深入解析 Linux 的“硬链接”与“软链接”
- 基于软件体系结构的应用部署方案初探