要想獲取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等與項目有關。