package org.geotools.swing;
import java.awt.BorderLayout;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ResourceBundle;
import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;
import org.geotools.map.MapLayer;
import org.geotools.styling.Style;
import org.geotools.swing.control.DnDList;
import org.geotools.swing.control.DnDListModel;
import org.geotools.swing.styling.JSimpleStyleDialog;
public class MapLayerTable extends JPanel {
private static final long serialVersionUID = -8461593609237317561L;
private static final ResourceBundle stringRes = ResourceBundle.getBundle("org/geotools/swing/Text");
private JMapPane pane;
private DnDListModel<MapLayer> listModel;
private DnDList<MapLayer> list;
private JScrollPane scrollPane;
private static final long DOUBLE_CLICK_TIME = 500;
private long lastClickTime = 0;
private boolean confirmRemove = true;
public MapLayerTable() {
init();
}
public MapLayerTable(JMapPane pane) {
init();
setMapPane(pane);
}
public void setMapPane(JMapPane pane) {
this.pane = pane;
pane.setMapLayerTable(this);
}
public void onAddLayer(MapLayer layer) {
listModel.insertItem(0, layer);
}
void onRemoveLayer(MapLayer layer) {
listModel.removeItem(layer);
}
public void repaint(MapLayer layer) {
int index = listModel.indexOf(layer);
list.repaint(list.getCellBounds(index, index));
}
private void init() {
listModel = new DnDListModel<MapLayer>();
list = new DnDList<MapLayer>(listModel) {
private static final long serialVersionUID = 1289744440656016412L;
@Override
public String getToolTipText(MouseEvent e) {
int item = list.locationToIndex(e.getPoint());
if (item >= 0) {
Rectangle r = list.getCellBounds(item, item);
if (r.contains(e.getPoint())) {
Point p = new Point(e.getPoint().x, e.getPoint().y - r.y);
if (MapLayerTableCellRenderer.hitSelectionLabel(p)) {
return stringRes.getString("select_layer");
} else if (MapLayerTableCellRenderer.hitVisibilityLabel(p)) {
return stringRes.getString("show_layer");
} else if (MapLayerTableCellRenderer.hitStyleLabel(p)) {
return stringRes.getString("style_layer");
} else if (MapLayerTableCellRenderer.hitRemoveLabel(p)) {
return stringRes.getString("remove_layer");
} else if (MapLayerTableCellRenderer.hitNameLabel(p)) {
return stringRes.getString("rename_layer");
}
}
}
return null;
}
};
listModel.addListDataListener(new ListDataListener() {
public void intervalAdded(ListDataEvent e) {
}
public void intervalRemoved(ListDataEvent e) {
}
public void contentsChanged(ListDataEvent e) {
onReorderLayers(e);
}
});
list.setCellRenderer(new MapLayerTableCellRenderer());
list.setFixedCellHeight(MapLayerTableCellRenderer.getCellHeight());
list.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
long clickTime = System.currentTimeMillis();
boolean doubleClick = clickTime - lastClickTime < DOUBLE_CLICK_TIME;
lastClickTime = clickTime;
onLayerItemClicked(e, doubleClick);
}
});
scrollPane = new JScrollPane(list,
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
scrollPane.setBorder(BorderFactory.createTitledBorder(stringRes.getString("layers_list_title")));
JPanel btnPanel = new JPanel();
Icon showIcon = MapLayerTableCellRenderer.LayerControlItem.VISIBLE.getIcon();
JButton showAllBtn = new JButton(showIcon);
showAllBtn.setToolTipText(stringRes.getString("show_all_layers"));
showAllBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
onShowAllLayers();
}
});
btnPanel.add(showAllBtn);
Icon hideIcon = MapLayerTableCellRenderer.LayerControlItem.VISIBLE.getOffIcon();
JButton hideAllBtn = new JButton(hideIcon);
hideAllBtn.setToolTipText(stringRes.getString("hide_all_layers"));
hideAllBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
onHideAllLayers();
}
});
btnPanel.add(hideAllBtn);
Icon onIcon = MapLayerTableCellRenderer.LayerControlItem.SELECTED.getIcon();
JButton selAllBtn = new JButton(onIcon);
selAllBtn.setToolTipText(stringRes.getString("select_all_layers"));
selAllBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
onSelectAllLayers();
}
});
btnPanel.add(selAllBtn);
Icon offIcon = MapLayerTableCellRenderer.LayerControlItem.SELECTED.getOffIcon();
JButton unselAllBtn = new JButton(offIcon);
unselAllBtn.setToolTipText(stringRes.getString("unselect_all_layers"));
unselAllBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
onUnselectAllLayers();
}
});
btnPanel.add(unselAllBtn);
setLayout(new BorderLayout());
add(scrollPane, BorderLayout.CENTER);
add(btnPanel, BorderLayout.SOUTH);
}
private void onLayerItemClicked(MouseEvent ev, boolean doubleClick) {
int item = list.locationToIndex(ev.getPoint());
if (item >= 0) {
Rectangle r = list.getCellBounds(item, item);
if (r.contains(ev.getPoint())) {
MapLayer layer = listModel.getElementAt(item);
Point p = new Point(ev.getPoint().x, ev.getPoint().y - r.y);
if (MapLayerTableCellRenderer.hitSelectionLabel(p)) {
layer.setSelected(!layer.isSelected());
} else if (MapLayerTableCellRenderer.hitVisibilityLabel(p)) {
layer.setVisible(!layer.isVisible());
} else if (MapLayerTableCellRenderer.hitStyleLabel(p)) {
doSetStyle(layer);
} else if (MapLayerTableCellRenderer.hitRemoveLabel(p)) {
doRemoveLayer(layer);
} else if (MapLayerTableCellRenderer.hitNameLabel(p)) {
if (doubleClick) {
doSetLayerName(layer);
}
}
}
}
}
private void doSetStyle(MapLayer layer) {
Style style = JSimpleStyleDialog.showDialog(this, layer);
if (style != null) {
layer.setStyle(style);
}
}
private void doSetLayerName(MapLayer layer) {
String name = JOptionPane.showInputDialog(stringRes.getString("new_layer_name_message"));
if (name != null && name.trim().length() > 0) {
layer.setTitle(name.trim());
}
}
private void doRemoveLayer(MapLayer layer) {
if (confirmRemove) {
int confirm = JOptionPane.showConfirmDialog(null,
stringRes.getString("confirm_remove_layer_message"),
stringRes.getString("confirm_remove_layer_title"),
JOptionPane.YES_NO_OPTION);
if (confirm != JOptionPane.YES_OPTION) {
return;
}
}
pane.getMapContext().removeLayer(layer);
}
private void onReorderLayers(ListDataEvent ev) {
pane.setRepaint(false);
for (int pos = ev.getIndex0(); pos <= ev.getIndex1(); pos++) {
MapLayer layer = listModel.getElementAt(pos);
int newContextPos = listModel.getSize() - pos - 1;
int curContextPos = pane.getMapContext().indexOf(layer);
if (curContextPos != newContextPos) {
pane.getMapContext().moveLayer(curContextPos, newContextPos);
}
}
pane.setRepaint(true);
pane.repaint();
}
private void onShowAllLayers() {
if (pane != null && pane.getMapContext() != null) {
for (MapLayer layer : pane.getMapContext().getLayers()) {
if (!layer.isVisible()) {
layer.setVisible(true);
}
}
}
}
private void onHideAllLayers() {
if (pane != null && pane.getMapContext() != null) {
for (MapLayer layer : pane.getMapContext().getLayers()) {
if (layer.isVisible()) {
layer.setVisible(false);
}
}
}
}
private void onSelectAllLayers() {
if (pane != null && pane.getMapContext() != null) {
for (MapLayer layer : pane.getMapContext().getLayers()) {
if (!layer.isSelected()) {
layer.setSelected(true);
}
}
}
}
private void onUnselectAllLayers() {
if (pane != null && pane.getMapContext() != null) {
for (MapLayer layer : pane.getMapContext().getLayers()) {
if (layer.isSelected()) {
layer.setSelected(false);
}
}
}
}
}