/******************************************************************************* * Copyright (c) 2007 Borland Software Corporation and others. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Borland Software Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.m2m.internal.qvt.oml.common.ui.views; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import org.eclipse.emf.ecore.EModelElement; import org.eclipse.swt.graphics.Image; class MetamodelContainerNode extends BrowserNode { static final int GLOBAL_REGISTRY_TYPE = 0; static final int WORKSPACE_MODELS_TYPE = 1; final int type; final String label; final Image image; MetamodelContainerNode(int type, String label, Image image, BrowserNode parent) { super(null, parent); this.label = label; this.image = image; this.type = type; assert type >= GLOBAL_REGISTRY_TYPE && type <= WORKSPACE_MODELS_TYPE; } @Override public String getText() { return label; } @Override public Image getImage() { return image; } public BrowserNode resolve(EModelElement element) { // resolve in packages from global registry first by usingf // instance based equality List<MetamodelContainerNode> childContainers = childContainers(); Collections.sort(childContainers, new Comparator<MetamodelContainerNode>() { public int compare(MetamodelContainerNode o1, MetamodelContainerNode o2) { return o1.type - o2.type; } }); BrowserNode result = null; List<BrowserNode> allChildNodes = getChildren(false); for (int i = 0; i < allChildNodes.size(); i++) { BrowserNode node = allChildNodes.get(i); if(node instanceof MetamodelNode) { MetamodelNode mmNode = (MetamodelNode)node; if(mmNode.mayContain(element)) { result = mmNode.resolveModelElement(element); if(result != null) break; } } } if(result == null) { for (MetamodelContainerNode metamodelContainerNode : childContainers) { result = metamodelContainerNode.resolve(element); if(result != null) break; } } return result; } public List<MetamodelContainerNode> childContainers() { List<MetamodelContainerNode> childContainers = new ArrayList<MetamodelContainerNode>(); List<BrowserNode> childNodes = getChildren(false); for (int i = 0; i < childNodes.size(); i++) { BrowserNode node = childNodes.get(i); if(node instanceof MetamodelContainerNode) { childContainers.add((MetamodelContainerNode)node); } } return childContainers; } }