package org.geotools.swing.wms;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.GraphicsConfiguration;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ListSelectionModel;
import org.geotools.data.ows.Layer;
import org.geotools.data.ows.WMSCapabilities;
import org.geotools.data.wms.WMSUtils;
import org.geotools.data.wms.WebMapServer;
/**
* Dialog providing a chance to chose a WMSLayer.
* <p>
* Initially we are going to work with a JList, we will switch
* to a JTree when we get a chance.
*
* @source $URL$
*/
public class WMSLayerChooser extends JDialog implements ActionListener {
private static final long serialVersionUID = -409825958139086013L;
WebMapServer wms;
WMSCapabilities caps;
JList list;
private DefaultListModel model;
public WMSLayerChooser() throws HeadlessException {
super();
init();
}
public WMSLayerChooser(Frame owner, boolean modal) throws HeadlessException {
super(owner, modal);
init();
}
public WMSLayerChooser(Frame owner, String title, boolean modal, GraphicsConfiguration gc) {
super(owner, title, modal, gc);
init();
}
public WMSLayerChooser(Frame owner, String title, boolean modal) throws HeadlessException {
super(owner, title, modal);
init();
}
public WMSLayerChooser(Frame owner, String title) throws HeadlessException {
super(owner, title);
init();
}
public WMSLayerChooser(Frame owner) throws HeadlessException {
super(owner);
init();
}
private void init() {
this.setSize(400, 200);
// Create and initialize the buttons.
JButton cancelButton = new JButton("Cancel");
cancelButton.addActionListener(this);
final JButton setButton = new JButton("Select");
setButton.setActionCommand("Select");
setButton.addActionListener(this);
getRootPane().setDefaultButton(setButton);
model = new DefaultListModel();
list = new JList( model );
list.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
list.setLayoutOrientation(JList.VERTICAL);
list.setVisibleRowCount(-1);
list.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) {
setButton.doClick(); // emulate button click
}
}
});
JScrollPane listScroller = new JScrollPane(list);
listScroller.setPreferredSize(new Dimension(400, 280));
JPanel listPane = new JPanel();
listPane.setLayout(new BoxLayout(listPane, BoxLayout.PAGE_AXIS));
JLabel label = new JLabel("Layers");
label.setLabelFor(list);
listPane.add(label);
listPane.add(Box.createRigidArea(new Dimension(0, 5)));
listPane.add(listScroller);
listPane.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
// Lay out the buttons from left to right.
JPanel buttonPane = new JPanel();
buttonPane.setLayout(new BoxLayout(buttonPane, BoxLayout.LINE_AXIS));
buttonPane.setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10));
buttonPane.add(Box.createHorizontalGlue());
buttonPane.add(cancelButton);
buttonPane.add(Box.createRigidArea(new Dimension(10, 0)));
buttonPane.add(setButton);
// Put everything together, using the content pane's BorderLayout.
Container contentPane = getContentPane();
contentPane.add(listPane, BorderLayout.CENTER);
contentPane.add(buttonPane, BorderLayout.PAGE_END);
}
private void setupLayersList() {
caps = wms.getCapabilities();
model.clear();
for (Layer layer :WMSUtils.getNamedLayers( caps )) {
String title = layer.getTitle();
if (title == null) {
title = layer.getName();
}
model.addElement( layer );
}
}
public int getLayer() {
return list.getSelectedIndex();
}
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equalsIgnoreCase("cancel")) {
list.clearSelection();
}
this.setVisible(false);
}
public ArrayList<Layer> getLayers() {
ArrayList<Layer> layers = new ArrayList<Layer>();
for( Object selected : list.getSelectedValues() ){
layers.add( (Layer) selected );
}
return layers;
}
public WebMapServer getWms() {
return wms;
}
public void setWMS(WebMapServer wms) {
this.wms = wms;
setupLayersList();
}
public static List<Layer> showSelectLayer( WebMapServer wms) {
if( wms == null ){
return null; // run along nothing to see here
}
WMSLayerChooser prompt = new WMSLayerChooser();
prompt.setWMS( wms ); // this will populate the layers list
prompt.setModal(true);
prompt.pack();
prompt.setVisible(true);
return prompt.getLayers();
}
}