GEF Connection 选中后显示连线

关键字:GEF Connection 选中后显示连线

 

GEF(Graphics Editor Framework)是一个挺复杂的图形编辑的框架结构。基本的概念就很多,我是参考《Eclipse插件开发》这本书学习的,这本书对与GEF的内容讲解的不好。 下个星期自己把这部分的内容整理一下。

 

说说连线 后显示的问题:

第一步:

覆盖refresh()函数,不让其调用refreshSourceConnections();和refreshTargetConnections()函数。

第二步:

在editorpart中增加

installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, new SelectionEditPolicy());

 的EditorPolicy()。

在SelectionEditPolicy 中实现选择时刷新连线。

public class SelectionEditPolicy extends SelectionEditPolicy {

	protected void hideSelection() {
		BlockEditpart editpart = (BlockEditpart)getHost();
		setConnectionVisible(editpart.getSourceConnections(),false,null);
		setConnectionVisible(editpart.getTargetConnections(),false,null);
	}
	
	protected void showPrimarySelection() {
		BlockEditpart editpart = (BlockEditpart)getHost();
		editpart.refreshConnections();
		setConnectionVisible(editpart.getSourceConnections(),true,ColorConstants.red);
		setConnectionVisible(editpart.getTargetConnections(),true,ColorConstants.red);
	}

	protected void showSelection() {
		BlockEditpart editpart = (BlockEditpart)getHost();
		setConnectionVisible(editpart.getSourceConnections(),true,ColorConstants.green);
		setConnectionVisible(editpart.getTargetConnections(),true,ColorConstants.green);
	}
	
	private void setConnectionVisible(List<?> Connections, boolean b, Color fg) {
		for(Object o : Connections) {
			if(o instanceof ConnectionEditPart) {
				ConnectionEditPart cep = (ConnectionEditPart)o;
				cep.setVisible(b,fg);
			}
		}
	}
}

 

这里要注意:refreshConnections中除了调用refreshSourceConnections(); refreshTargetConnections();还要手工写一个刷新连线对应的Editor,因为前面没有调用过,不然线就连不上。

	private void refreshRelateConnection() {
		Map<Object,EditPart> modelToEditPart = new HashMap<Object,EditPart>();
		List<?> editParts = this.getParent().getChildren();
		for(Object o : editParts) {
			EditPart editPart = (EditPart)o;
			if(!(editPart instanceof BlockEditpart)) {
				continue;
			}
			modelToEditPart.put(editPart.getModel(), editPart);
		}
		
		List<?> ee = getSourceConnections();
		for (int i = 0; i < ee.size(); i++) {
			ConnectionModel c = getModelSourceConnections().get(i);
			BlockEditpart e = (BlockEditpart)modelToEditPart.get(c.getTarget());
			ConnectionEditPart cep = (ConnectionEditPart)ee.get(i);
			e.addTargetConnection(cep, 0);
		}
		
		ee = getTargetConnections();
		for (int i = 0; i < ee.size(); i++) {
			ConnectionModel c = getModelTargetConnections().get(i);
			BlockEditpart e = (BlockEditpart)modelToEditPart.get(c.getSource());
			ConnectionEditPart cep = (ConnectionEditPart)ee.get(i);
			e.addSourceConnection(cep, 0);
		}
	}

 刷新对应连线,有连个注意点,第一,如何得到对应Node的Editorpart,这个采用了最蠢的方法,遍历所有的Editorparts,不知道有没有更好的方法;第二,不能用到的Editorpart直接调用refreshSourceConnections(); refreshTargetConnections();,因为这样使用的话,原始Node的所有连线是画好了,相关Node的连线又没有画好。

办法有点儿蠢,不过效果达到了。

你可能感兴趣的:(eclipse,C++,c,框架,C#)