package com.sap.ide.treeprovider.internal.explorer; import java.lang.reflect.Method; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExtensionPoint; import org.eclipse.core.runtime.Platform; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EObject; import org.eclipse.swt.graphics.Image; import com.sap.ide.treeprovider.GenericRefObjectNode; import com.sap.ide.treeprovider.TextLabelProvider; import com.sap.ide.treeprovider.internal.Activator; import com.sap.ide.treeprovider.internal.explorer.nodes.RootNodeComponent; /** * Provides images and texts for the tree nodes. By default, the * {@link Activator#getImage(com.sap.tc.moin.repository.mmi.reflect.RefObject)} * method is used to determine the image for the tree node. The root node and * nodes that are not of type {@link EObject} get handled * specifically. * <p> * * The text label is determined bz {@link #getText(Object)}. TODO That method * needs refactoring. It currently does a set of <tt>instanceof</tt> checks and * utilizes {@link StringFormatter} for a few special types such as * <tt>TypeDefinition</tt> and <tt>Signature</tt>. * * @author D046040 * */ public final class TreeLabelProvider extends TreeNodeLabelProvider { public TreeLabelProvider() { super(); } @Override public String getText(EObject treenode) { String result = super.getText(treenode); if (result == null) { // specials for RootNode and Loading Node if (treenode instanceof RootNodeComponent) { result = "Model"; } else { // ask providers IExtensionPoint eventListenerPoint = Platform.getExtensionRegistry().getExtensionPoint( "com.sap.ide.treeprovider.textLabelProvider"); for (IConfigurationElement e : eventListenerPoint.getConfigurationElements()) { if (e.getName().equals("textLabelProvider")) { TextLabelProvider provider; try { provider = (TextLabelProvider) e.createExecutableExtension("classname"); result = provider.getText(treenode); if (result != null) { break; } } catch (CoreException ex) { throw new RuntimeException(ex); } } } } // default handling if (result == null) { // if it has a name: show the name EObject<?> node = (EObject<?>) treenode; EObject modelElement = node.getValue(); try { Method getName = modelElement.getClass().getMethod("getName", String.class); String name = (String) getName.invoke(modelElement); return name; } catch (NoSuchMethodException e) { // has no name // if not: optional role name + class name + MOF ID String roleName = ""; if (treenode instanceof GenericRefObjectNode) { String nodeRoleName = ((GenericRefObjectNode) treenode).getRoleName(); if (nodeRoleName != null) { roleName = nodeRoleName + ": "; } } return roleName + "[" + ((EClass) node.getValue().refMetaObject()).getName() + "] MOF ID " + node.getValue().refMofId(); } catch (Exception e) { throw new RuntimeException(e); } } } return result; } public Image getImage(EObject treenode) { if (treenode instanceof RootNodeComponent) { return Activator.getImageModelRoot(); } if (treenode instanceof EObject<?>) { Image image = Activator.getImage(((EObject<?>) treenode).getValue()); if (image != null) { return image; } } return super.getImage(treenode); } }