package com.revolsys.swing.map.layer.record.style.panel;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Window;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.List;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.tree.TreePath;
import com.revolsys.collection.list.Lists;
import com.revolsys.swing.SwingUtil;
import com.revolsys.swing.component.Form;
import com.revolsys.swing.component.ValueField;
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.BaseTree;
import com.revolsys.swing.tree.node.ListTreeNode;
import com.revolsys.swing.tree.node.layer.LayerRendererTreeNode;
import com.revolsys.util.Property;
public class LayerStylePanel extends ValueField implements MouseListener, PropertyChangeListener {
private static final long serialVersionUID = 1L;
private LayerRendererTreeNode currentNode;
private final JScrollPane editStyleContainer = new JScrollPane();
private final AbstractLayer layer;
private final ListTreeNode rootNode;
private LayerRenderer<? extends Layer> rootRenderer;
private final BaseTree tree;
public LayerStylePanel(final AbstractLayer layer) {
this.layer = layer;
setLayout(new BorderLayout());
this.rootRenderer = layer.getRenderer().clone();
Property.removeAllListeners(this.rootRenderer);
this.rootRenderer.setEditing(true);
Property.addListener(this.rootRenderer, this);
this.rootNode = new ListTreeNode(new LayerRendererTreeNode(this.rootRenderer));
this.tree = new BaseTree(this.rootNode);
this.tree.setProperty("treeType", LayerStylePanel.class.getName());
this.tree.setRootVisible(false);
final TreePath rendererPath = this.rootNode.getTreePath();
this.tree.setSelectionPath(rendererPath);
this.tree.addMouseListener(this);
setEditStylePanel(this.rootRenderer);
this.editStyleContainer.setOpaque(false);
this.editStyleContainer.getViewport().setOpaque(false);
this.editStyleContainer.setBorder(null);
this.editStyleContainer.setViewportBorder(null);
final JScrollPane treeScroll = new JScrollPane(this.tree);
treeScroll.setBorder(null);
treeScroll.setViewportBorder(null);
final JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, treeScroll,
this.editStyleContainer);
splitPane.setDividerLocation(200);
setPreferredSize(new Dimension(810, 600));
add(splitPane, BorderLayout.CENTER);
}
@Override
public void mouseClicked(final MouseEvent e) {
if (e.getClickCount() == 1 && SwingUtil.isLeftButtonAndNoModifiers(e)
&& e.getClickCount() == 1) {
final int x = e.getX();
final int y = e.getY();
final TreePath path = this.tree.getPathForLocation(x, y);
if (path != null) {
final Object node = path.getLastPathComponent();
if (node instanceof LayerRendererTreeNode) {
final LayerRendererTreeNode rendererNode = (LayerRendererTreeNode)node;
if (rendererNode != this.currentNode) {
final LayerRenderer<?> renderer = rendererNode.getRenderer();
setEditStylePanel(renderer);
this.currentNode = rendererNode;
}
}
}
}
}
@Override
public void mouseEntered(final MouseEvent e) {
}
@Override
public void mouseExited(final MouseEvent e) {
}
@Override
public void mousePressed(final MouseEvent e) {
}
@Override
public void mouseReleased(final MouseEvent e) {
}
@SuppressWarnings("unchecked")
@Override
public void propertyChange(final PropertyChangeEvent event) {
final String propertyName = event.getPropertyName();
if ("replaceRenderer".equals(propertyName)) {
saveStylePanel();
final LayerRenderer<? extends Layer> oldRenderer = (LayerRenderer<? extends Layer>)event
.getOldValue();
final LayerRenderer<? extends Layer> newRenderer = (LayerRenderer<? extends Layer>)event
.getNewValue();
if (oldRenderer == this.rootRenderer && newRenderer != null && newRenderer != oldRenderer) {
Property.removeListener(oldRenderer, this);
this.rootNode.removeNode(0);
Property.addListener(newRenderer, this);
final LayerRendererTreeNode newNode = new LayerRendererTreeNode(newRenderer);
this.rootNode.addNode(newNode);
this.tree.expandAllNodes();
this.rootRenderer = newRenderer;
// setVisible(newRenderer,true);
setSelectedRenderer(newRenderer);
}
} else if ("renderers".equals(propertyName)) {
this.tree.expandAllNodes();
}
}
@Override
public void save() {
super.save();
final LayerRenderer<? extends Layer> renderer = this.rootRenderer;
this.layer.setRenderer(renderer);
}
protected void saveStylePanel() {
final Window window = SwingUtil.getWindowAncestor(this);
if (window != null) {
final Component component = window.getFocusOwner();
if (component instanceof ValueField) {
final ValueField valueField = (ValueField)component;
valueField.save();
}
}
final Component view = this.editStyleContainer.getViewport().getView();
if (view instanceof ValueField) {
final ValueField valueField = (ValueField)view;
valueField.save();
}
}
public void setEditStylePanel(final LayerRenderer<? extends Layer> renderer) {
saveStylePanel();
if (renderer != null) {
final Form stylePanel = renderer.newStylePanel();
this.editStyleContainer.setViewportView(stylePanel);
}
}
public void setSelectedRenderer(final LayerRenderer<?> renderer) {
final List<String> pathNames = renderer.getPathNames();
final LayerRenderer<?> selectedRenderer = this.rootRenderer.getRenderer(pathNames);
if (selectedRenderer != null) {
final List<Object> path = Lists.newArray(this.rootNode);
path.addAll(selectedRenderer.getPathRenderers());
final TreePath treePath = this.tree.getTreePath(path);
this.tree.expandPath(treePath);
this.tree.setSelectionPath(treePath);
setEditStylePanel(selectedRenderer);
}
}
}