/*************************************************** * * cismet GmbH, Saarbruecken, Germany * * ... and it just works. * ****************************************************/ package Sirius.navigator.ui.tree; /** * ***************************************************************************** * * Copyright (c) : EIG (Environmental Informatics Group) * http://www.htw-saarland.de/eig Prof. Dr. Reiner Guettler Prof. Dr. Ralf * Denzer * * HTWdS Hochschule fuer Technik und Wirtschaft des Saarlandes Goebenstr. 40 * 66117 Saarbruecken Germany * * Programmers : Pascal * * Project : WuNDA 2 Version : 1.0 Purpose : Created : 01.11.1999 History : * ****************************************************************************** */ import Sirius.navigator.types.treenode.*; import Sirius.server.middleware.types.*; import java.awt.Component; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JTree; import javax.swing.tree.DefaultTreeCellRenderer; import de.cismet.cids.navigator.utils.ClassCacheMultiple; import de.cismet.cids.utils.ClassloadingHelper; /** * DOCUMENT ME! * * @version $Revision$, $Date$ */ public class MetaTreeNodeRenderer extends DefaultTreeCellRenderer { //~ Static fields/initializers --------------------------------------------- // private MetaTreeNode treeNode; // private LocalPureNode ln; // private LocalClassNode lcn; // private LocalObjectNode lon; // private java.lang.Object userObject; private static String CLASS_PREFIX = "de.cismet.cids.custom.treeicons."; // NOI18N private static String CLASS_POSTFIX = "IconFactory"; // NOI18N private static CidsTreeObjectIconFactory NO_ICON_FACTORY = new CidsTreeObjectIconFactory() { @Override public Icon getClosedPureNodeIcon(final PureTreeNode ptn) { throw new UnsupportedOperationException("I am just a dummy!"); } @Override public Icon getOpenPureNodeIcon(final PureTreeNode ptn) { throw new UnsupportedOperationException("I am just a dummy!"); } @Override public Icon getLeafPureNodeIcon(final PureTreeNode ptn) { throw new UnsupportedOperationException("I am just a dummy!"); } @Override public Icon getOpenObjectNodeIcon(final ObjectTreeNode otn) { throw new UnsupportedOperationException("I am just a dummy!"); } @Override public Icon getClosedObjectNodeIcon(final ObjectTreeNode otn) { throw new UnsupportedOperationException("I am just a dummy!"); } @Override public Icon getLeafObjectNodeIcon(final ObjectTreeNode otn) { throw new UnsupportedOperationException("I am just a dummy!"); } @Override public Icon getClassNodeIcon(final ClassTreeNode dmtn) { throw new UnsupportedOperationException("I am just a dummy!"); } }; static HashMap<String, Icon> iconCache = new HashMap<String, Icon>(); static HashMap<String, CidsTreeObjectIconFactory> iconFactories = new HashMap<String, CidsTreeObjectIconFactory>(); //~ Instance fields -------------------------------------------------------- private final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(getClass()); //~ Constructors ----------------------------------------------------------- /** * Creates a new MetaTreeNodeRenderer object. */ public MetaTreeNodeRenderer() { super(); } //~ Methods ---------------------------------------------------------------- @Override public Component getTreeCellRendererComponent(final JTree tree, final java.lang.Object value, final boolean selected, final boolean expanded, final boolean leaf, final int row, final boolean hasFocus) { final DefaultMetaTreeNode treeNode = (DefaultMetaTreeNode)value; final int cid = treeNode.getClassID(); final String domain = treeNode.getDomain(); final String key = cid + "@" + domain; CidsTreeObjectIconFactory iconFactory = iconFactories.get(key); if (treeNode.isWaitNode()) { super.getTreeCellRendererComponent(tree, value, false, expanded, leaf, row, false); } else { Icon expandedIco = null; Icon leafIco = null; Icon closedIco = null; if (treeNode != null) { final Node metaNode = treeNode.getNode(); if ((metaNode != null) && (metaNode.getIconString() != null)) { try { final String baseIcon = metaNode.getIconString(); final String openIconString = baseIcon.substring(0, baseIcon.lastIndexOf(".")) + "Open" + baseIcon.substring(baseIcon.lastIndexOf(".")); // NOI18N final String closedIconString = baseIcon.substring(0, baseIcon.lastIndexOf(".")) + "Closed" + baseIcon.substring(baseIcon.lastIndexOf(".")); // NOI18N final String leafIconString = baseIcon.substring(0, baseIcon.lastIndexOf(".")) + "Leaf" + baseIcon.substring(baseIcon.lastIndexOf(".")); // NOI18N Icon base = null; base = iconCache.get(baseIcon); expandedIco = iconCache.get(openIconString); leafIco = iconCache.get(leafIconString); closedIco = iconCache.get(closedIconString); if (base == null) { base = new javax.swing.ImageIcon(getClass().getResource(baseIcon)); iconCache.put(baseIcon, base); } if (expandedIco == null) { try { expandedIco = new javax.swing.ImageIcon(getClass().getResource(openIconString)); } catch (Exception e) { expandedIco = base; } finally { iconCache.put(openIconString, expandedIco); } } if (leafIco == null) { try { leafIco = new javax.swing.ImageIcon(getClass().getResource(leafIconString)); } catch (Exception e) { leafIco = base; } finally { iconCache.put(leafIconString, leafIco); } } if (closedIco == null) { try { closedIco = new javax.swing.ImageIcon(getClass().getResource(closedIconString)); } catch (Exception e) { closedIco = base; } finally { iconCache.put(closedIconString, closedIco); } } } catch (Exception e) { log.error("Error during Iconstuff" + metaNode.getIconString(), e); // NOI18N } } } if (leafIco == null) { // Iconfactroy from classname if ((iconFactory == null) && (cid > 0) && (domain != null)) { try { final MetaClass mc = ClassCacheMultiple.getMetaClass(domain, cid); final Class<?> iconFactoryClass = ClassloadingHelper.getDynamicClass( mc, ClassloadingHelper.CLASS_TYPE.ICON_FACTORY); if (iconFactoryClass != null) { iconFactory = (CidsTreeObjectIconFactory)iconFactoryClass.getConstructor().newInstance(); } } catch (Exception e) { log.error("Could not load IconFactory for " + key, e); // NOI18N } if (iconFactory != null) { iconFactories.put(key, iconFactory); // NOI18N } else { iconFactories.put(key, NO_ICON_FACTORY); // NOI18N } } if ((iconFactory != null) && (iconFactory != NO_ICON_FACTORY)) { if (treeNode instanceof PureTreeNode) { if ((expanded == true) && (iconFactory.getOpenPureNodeIcon((PureTreeNode)treeNode) != null)) { expandedIco = iconFactory.getOpenPureNodeIcon((PureTreeNode)treeNode); } else if ((leaf == true) && (iconFactory.getLeafPureNodeIcon((PureTreeNode)treeNode) != null)) { leafIco = iconFactory.getLeafPureNodeIcon((PureTreeNode)treeNode); } else if (iconFactory.getClosedPureNodeIcon((PureTreeNode)treeNode) != null) { closedIco = iconFactory.getClosedPureNodeIcon((PureTreeNode)treeNode); } } else if (treeNode instanceof ObjectTreeNode) { if ((expanded == true) && (iconFactory.getOpenObjectNodeIcon((ObjectTreeNode)treeNode) != null)) { expandedIco = iconFactory.getOpenObjectNodeIcon((ObjectTreeNode)treeNode); } else if ((leaf == true) && (iconFactory.getLeafObjectNodeIcon((ObjectTreeNode)treeNode) != null)) { leafIco = iconFactory.getLeafObjectNodeIcon((ObjectTreeNode)treeNode); } else if (iconFactory.getClosedObjectNodeIcon((ObjectTreeNode)treeNode) != null) { closedIco = iconFactory.getClosedObjectNodeIcon((ObjectTreeNode)treeNode); } } else if ((treeNode instanceof ClassTreeNode) && (iconFactory.getClassNodeIcon((ClassTreeNode)treeNode) != null)) { expandedIco = iconFactory.getClassNodeIcon((ClassTreeNode)treeNode); leafIco = expandedIco; closedIco = expandedIco; } } } super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus); this.setText(treeNode.toString()); if (expanded == true) { if (expandedIco != null) { this.setIcon(expandedIco); } else { this.setIcon(treeNode.getOpenIcon()); } } else if (leaf == true) { if (leafIco != null) { this.setIcon(leafIco); } else { this.setIcon(treeNode.getLeafIcon()); } } else { if (closedIco != null) { this.setIcon(closedIco); } else { this.setIcon(treeNode.getClosedIcon()); } } } return this; } }