gmf項目:獲取圖形編輯器選擇的圖形和底層模型

        要想獲取gmf圖形編輯器的選擇的圖形,需要監聽選擇事件。gmf生成的代碼中,有一個名爲“×DiagramEditor”的類,這就是圖形化編輯器類。該類有一個selectionChanged方法,我們需要重寫該方法(若在生成的代碼中找不到,可以自己添加上去)。

該方法監聽的選擇改變事件包括了編輯器的改變,因此需要對監聽對象做一些過濾。下面是代碼。

public class BreezeDiagramEditor extends DiagramDocumentEditor {

	/**
	 * @generated NOT
	 */
	@Override
	public void selectionChanged(IWorkbenchPart part, ISelection selection) {
		super.selectionChanged(part, selection);
		//		EObject list = this.getDiagram().getElement();
		//		RootEditPart rootEditPart = this.getDiagramEditPart().getRoot();
		//		EList<EObject> elist = list.eContents();
		//		System.out.println(rootEditPart);
		//		List<EditPart> parts = rootEditPart.getChildren();
		//		for (EditPart ep : parts) {
		//			System.out.println(ep);
		//			System.out.println(ep.getModel());
		//		}
		//		System.out.println("----------------------------------------------------------");
		if (selection instanceof StructuredSelection) {
			StructuredSelection structSelection = (StructuredSelection) selection;
			Object element = structSelection.getFirstElement();
			if (element instanceof ArchEditPart) {
				ArchEditPart aep = (ArchEditPart) element;
				ShapeImpl si = (ShapeImpl) aep.getModel();
				EObject obj = si.basicGetElement();
				URI uri = EcoreUtil.getURI(obj);
				System.out.println(uri.fragment());
			} else if (element instanceof ComponentEditPart) {
				ComponentEditPart cep = (ComponentEditPart) element;
				ShapeImpl si = (ShapeImpl) cep.getModel();
				EObject obj = si.basicGetElement();
				URI uri = EcoreUtil.getURI(obj);
				System.out.println(uri.fragment());
			} else if (element instanceof PortEditPart) {
				PortEditPart pep = (PortEditPart) element;
				ShapeImpl si = (ShapeImpl) pep.getModel();
				EObject obj = si.basicGetElement();
				URI uri = EcoreUtil.getURI(obj);
				System.out.println(uri.fragment());
			}
		}
		//		for (int i = 0; i < elist.size(); ++i) {
		//			URI uri = EcoreUtil.getURI(elist.get(i));
		//			System.out.println(uri.fragment() + ":" + elist.get(i));
		//			this.getEditorInput().getName();
		//		}
	}

}

稍微解釋一下,代碼先是獲取了被選擇的元素,從selection中獲取,元素的類型是×EditPart,這是圖形化的元素,要想獲取底層模型的話,還要兩步,getModel和basicGetElement,經過兩步後,可以獲取ecore的eobject,就可以全面操作該圖形了。代碼中ArchEditPart等與項目有關。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章