package com.revolsys.swing.tree.node.layer; import java.awt.Rectangle; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.beans.PropertyChangeEvent; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import javax.swing.Icon; import javax.swing.JTree; import javax.swing.SwingUtilities; import javax.swing.plaf.TreeUI; import javax.swing.tree.TreePath; import com.revolsys.collection.set.Sets; import com.revolsys.swing.Icons; import com.revolsys.swing.map.layer.AbstractLayer; import com.revolsys.swing.map.layer.Layer; import com.revolsys.swing.map.layer.LayerRenderer; import com.revolsys.swing.tree.BaseTreeNode; public class LayerTreeNode extends AbstractLayerTreeNode implements MouseListener { private static final Icon EDIT_ICON = Icons.getIcon("pencil"); private static final Map<List<Icon>, Icon> ICON_CACHE = new HashMap<>(); private static final Icon NOT_EXISTS_ICON = Icons.getIcon("error"); private static final Icon SELECT_ICON = Icons.getIcon("map_select"); private static final Set<String> REFRESH_ICON_PROPERTY_NAMES = Sets.newHash("visible", "selectSupported", "selectable", "exists", "initialized", "icon", "readOnly", "editable"); public LayerTreeNode(final Layer layer) { super(layer); refreshIcon(); } @Override public int addChild(final int index, final Object child) { if (child instanceof LayerRenderer<?>) { final LayerRenderer<?> childRenderer = (LayerRenderer<?>)child; final AbstractLayer layer = getLayer(); return layer.addRenderer(childRenderer, index); } else { return -1; } } @Override public int addChild(final Object child) { if (child instanceof LayerRenderer<?>) { final LayerRenderer<?> childRenderer = (LayerRenderer<?>)child; final AbstractLayer layer = getLayer(); return layer.addRenderer(childRenderer); } else { return -1; } } @Override public Icon getDisabledIcon() { return getIcon(); } @Override public boolean isExists() { final Layer layer = getLayer(); return layer.isExists(); } @Override protected List<BaseTreeNode> loadChildrenDo() { final Layer layer = getLayer(); final LayerRenderer<? extends Layer> renderer = layer.getRenderer(); if (renderer == null) { return Collections.emptyList(); } else { final LayerRendererTreeNode rendererNode = new LayerRendererTreeNode(renderer); return Collections.<BaseTreeNode> singletonList(rendererNode); } } @Override public void mouseClicked(final MouseEvent e) { final Object source = e.getSource(); final JTree tree = getTree(); if (source == tree) { final int clickCount = e.getClickCount(); if (clickCount == 2 && SwingUtilities.isLeftMouseButton(e)) { final int x = e.getX(); final int y = e.getY(); final TreePath path = tree.getPathForLocation(x, y); final Layer layer = getLayer(); final TreeUI ui = tree.getUI(); final Rectangle bounds = ui.getPathBounds(tree, path); final int cX = x - bounds.x; final int index = cX / 21; int offset = 0; if (index == offset) { layer.setVisible(!layer.isVisible()); } offset++; if (layer.isSelectSupported()) { if (index == offset) { layer.setSelectable(!layer.isSelectable()); } offset++; } if (!layer.isReadOnly()) { if (index == offset) { layer.setEditable(!layer.isEditable()); } offset++; } } e.consume(); } } @Override protected void propertyChangeDo(final PropertyChangeEvent e) { super.propertyChangeDo(e); final Object source = e.getSource(); if (source == getLayer()) { final String propertyName = e.getPropertyName(); if (propertyName.equals("renderer")) { refreshIcon(); refresh(); } else if (REFRESH_ICON_PROPERTY_NAMES.contains(propertyName)) { refreshIcon(); } } } public void refreshIcon() { Icon icon; final Layer layer = getLayer(); final List<Icon> icons = new ArrayList<>(); if (!layer.isExists() && layer.isInitialized()) { icon = NOT_EXISTS_ICON; } else { final Icon layerIcon = layer.getIcon(); if (layer.getRenderer() == null) { Icons.addIcon(icons, layerIcon, true); } else { final boolean visible = layer.isVisible(); Icons.addIcon(icons, layerIcon, visible); if (layer.isSelectSupported()) { final boolean selectable = layer.isSelectable(); Icons.addIcon(icons, SELECT_ICON, selectable); } } if (!layer.isReadOnly()) { final boolean editable = layer.isEditable(); Icons.addIcon(icons, EDIT_ICON, editable); } if (icons.isEmpty()) { icon = null; } else if (icons.size() == 1) { icon = icons.get(0); } else { icon = ICON_CACHE.get(icons); if (icon == null) { icon = Icons.merge(icons, 5); ICON_CACHE.put(icons, icon); } } } setIcon(icon); } }