001 // License: GPL. For details, see LICENSE file.
002 package org.openstreetmap.josm.gui.dialogs.relation;
003
004 import java.awt.Color;
005 import java.awt.Component;
006
007 import javax.swing.ImageIcon;
008 import javax.swing.JLabel;
009 import javax.swing.JTree;
010 import javax.swing.tree.TreeCellRenderer;
011
012 import org.openstreetmap.josm.data.osm.Relation;
013 import org.openstreetmap.josm.gui.DefaultNameFormatter;
014 import org.openstreetmap.josm.tools.ImageProvider;
015
016 /**
017 * This is the cell renderer used in {@link RelationTree}.
018 *
019 *
020 */
021 public class RelationTreeCellRenderer extends JLabel implements TreeCellRenderer {
022 public final static Color BGCOLOR_SELECTED = new Color(143,170,255);
023
024 /** the relation icon */
025 private ImageIcon icon;
026
027 /**
028 * constructor
029 */
030 public RelationTreeCellRenderer() {
031 icon = ImageProvider.get("data", "relation");
032 setOpaque(true);
033 }
034
035 /**
036 * renders the icon
037 */
038 protected void renderIcon() {
039 setIcon(icon);
040 }
041
042 /**
043 * renders the textual value. Uses the relations names as value
044 *
045 * @param relation the relation
046 */
047 protected void renderValue(Relation relation) {
048 setText(relation.getDisplayName(DefaultNameFormatter.getInstance()));
049 }
050
051 /**
052 * renders the background
053 *
054 * @param selected true, if the current node is selected
055 */
056 protected void renderBackground(boolean selected) {
057 Color bgColor = Color.WHITE;
058 if (selected) {
059 bgColor = BGCOLOR_SELECTED;
060 }
061 setBackground(bgColor);
062 }
063
064 public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded,
065 boolean leaf, int row, boolean hasFocus) {
066
067 // Hackish fix for #7056 - if name template for duplicated relation contains tags from parent, template will fail because getReffers doesn't work on primitives not yet in dataset
068 if (!tree.isRootVisible() && tree.getModel().getRoot() == value)
069 return this;
070
071 renderIcon();
072 renderValue((Relation)value);
073 renderBackground(selected);
074 return this;
075 }
076
077 }