/*
* The Unified Mapping Platform (JUMP) is an extensible, interactive GUI
* for visualizing and manipulating spatial features with geometry and attributes.
*
* Copyright (C) 2003 Vivid Solutions
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* For more information, contact:
*
* Vivid Solutions
* Suite #1A
* 2328 Government Street
* Victoria BC V8T 5G5
* Canada
*
* (250)385-6040
* www.vividsolutions.com
*/
package com.vividsolutions.jump.workbench.ui.plugin.wms;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.IOException;
import java.net.URL;
import java.util.LinkedList;
import java.util.Map;
import javax.swing.ButtonGroup;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.SwingUtilities;
import org.openjump.swing.listener.InvokeMethodItemListener;
import org.openjump.swing.listener.InvokeMethodKeyTypedListener;
import com.vividsolutions.jump.I18N;
import com.vividsolutions.jump.workbench.WorkbenchException;
import com.vividsolutions.jump.workbench.ui.InputChangedFirer;
import com.vividsolutions.jump.workbench.ui.InputChangedListener;
import com.vividsolutions.jump.workbench.ui.wizard.CancelNextException;
import com.vividsolutions.jump.workbench.ui.wizard.WizardPanel;
import com.vividsolutions.wms.MapImageFormatChooser;
import com.vividsolutions.wms.WMService;
public class URLWizardPanel extends JPanel implements WizardPanel {
public static final String SERVICE_KEY = "SERVICE";
public static final String FORMAT_KEY = "FORMAT";
public static final String URL_KEY = "URL";
private InputChangedFirer inputChangedFirer = new InputChangedFirer();
private Map dataMap;
private GridBagLayout gridBagLayout1 = new GridBagLayout();
private JLabel urlLabel = new JLabel();
private JComboBox urls;
private JPanel fillerPanel = new JPanel();
// [UT]
public static final String VERSION_KEY = "WMS_VERSION";
private String wmsVersion = WMService.WMS_1_1_1;
private boolean lossyPreferred = true;
public URLWizardPanel(String[] initialURLs, String wmsVersion) {
try {
this.wmsVersion = wmsVersion;
urls = new JComboBox(initialURLs);
urls.setEditable(true);
urls.getEditor().selectAll();
jbInit();
} catch (Exception ex) {
ex.printStackTrace();
}
}
public void add(InputChangedListener listener) {
inputChangedFirer.add(listener);
}
public void remove(InputChangedListener listener) {
inputChangedFirer.remove(listener);
}
void jbInit() throws Exception {
urlLabel.setText("URL:");
this.setLayout(gridBagLayout1);
urls.setPreferredSize(new Dimension(300, 21));
urlLabel.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if (SwingUtilities.isRightMouseButton(e) && e.getClickCount() == 3) {
urls.setSelectedItem("http://libcwms.gov.bc.ca/wmsconnector/com.esri.wsit.WMSServlet/ogc_layer_service");
}
super.mouseClicked(e);
}
});
urls.getEditor().getEditorComponent().addKeyListener(
new InvokeMethodKeyTypedListener(inputChangedFirer, "fire", true));
urls.addItemListener(new InvokeMethodItemListener(inputChangedFirer,
"fire", true));
this.add(urlLabel, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0,
GridBagConstraints.CENTER, GridBagConstraints.NONE,
new Insets(0, 0, 0, 4), 0, 0));
this.add(urls, new GridBagConstraints(1, 1, 1, 1, 0.0, 0.0,
GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(0,
0, 0, 4), 0, 0));
this.add(fillerPanel, new GridBagConstraints(2, 10, 1, 1, 1.0, 1.0,
GridBagConstraints.CENTER, GridBagConstraints.BOTH,
new Insets(0, 0, 0, 0), 0, 0));
// [UT]
this.add(createVersionButtons(new String[] {
WMService.WMS_1_0_0, WMService.WMS_1_1_0, WMService.WMS_1_1_1
}), new GridBagConstraints(1, 3, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER,
GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));
// [UT] 20.10.2005 not added yet; need more testing
/*
* this.add(createLossyCheckBox(), new GridBagConstraints(1, 4, 1, 1, 0.0,
* 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0,
* 0, 0), 0, 0));
*/
}
public String getInstructions() {
return I18N.get("ui.plugin.wms.URLWizardPanel.please-enter-the-url-of-the-wms-server");
}
//
// The WMService appends other parameters to the end of the URL
//
public static String fixUrlForWMService(String url) {
String fixedURL = url.trim();
if (fixedURL.indexOf("?") == -1) {
fixedURL = fixedURL + "?";
} else {
if (fixedURL.endsWith("?")) {
// ok
} else {
// it must have other parameters
if (!fixedURL.endsWith("&")) {
fixedURL = fixedURL + "&";
}
}
}
return fixedURL;
}
public void exitingToRight() throws IOException, WorkbenchException {
try {
LinkedList<String> list = new LinkedList<String>();
String url = urls.getSelectedIndex() == -1 ? urls.getEditor()
.getItem()
.toString() : urls.getItemAt(urls.getSelectedIndex()).toString();
list.add(url);
for (int i = 0; i < urls.getItemCount(); ++i)
if (i != urls.getSelectedIndex())
list.add(urls.getItemAt(i).toString());
dataMap.put(URL_KEY, list.toArray(new String[list.size()]));
// [UT]
// String ver = (String)dataMap.get(VERSION_KEY);
url = fixUrlForWMService(url);
// [UT] 20.04.2005
WMService service = new WMService(url, wmsVersion);
// WMService service = new WMService( url );
service.initialize(true);
dataMap.put(SERVICE_KEY, service);
// [UT] 20.04.2005 added version
MapImageFormatChooser formatChooser = new MapImageFormatChooser(
wmsVersion);
formatChooser.setPreferLossyCompression(false);
formatChooser.setTransparencyRequired(true);
String format = formatChooser.chooseFormat(service.getCapabilities()
.getMapFormats());
if (format == null) {
throw new WorkbenchException(
I18N.get("ui.plugin.wms.URLWizardPanel.the-server-does-not-support-gif-png-or-jpeg-format"));
}
dataMap.put(MapLayerWizardPanel.FORMAT_LIST_KEY, service.getCapabilities().getMapFormats());
dataMap.put(FORMAT_KEY, format);
dataMap.put(MapLayerWizardPanel.INITIAL_LAYER_NAMES_KEY, null);
dataMap.put(VERSION_KEY, wmsVersion);
} catch (IOException e) {
throw new CancelNextException();
}
}
public void enteredFromLeft(Map dataMap) {
this.dataMap = dataMap;
urls.getEditor().selectAll();
}
public String getTitle() {
return I18N.get("ui.plugin.wms.URLWizardPanel.select-uniform-resource-locator-url");
}
public String getID() {
return getClass().getName();
}
public boolean isInputValid() {
try {
String urlString = urls.getEditor().getItem().toString();
String host = new URL(urlString).getHost();
return host.length() > 0;
} catch (Throwable e) {
return false;
}
}
public String getNextID() {
return MapLayerWizardPanel.class.getName();
}
// [UT] 10.01.2005
private Component createVersionButtons(String[] versions) {
JPanel p = new JPanel();
ActionListener al = new ActionListener() {
public void actionPerformed(ActionEvent e) {
JRadioButton jb = (JRadioButton)e.getSource();
wmsVersion = jb.getText();
}
};
ButtonGroup group = new ButtonGroup();
JRadioButton[] buttons = new JRadioButton[versions.length];
for (int i = 0; i < buttons.length; i++) {
buttons[i] = new JRadioButton(versions[i]);
buttons[i].addActionListener(al);
group.add(buttons[i]);
p.add(buttons[i]);
// click the last one
if (versions[i].equals(wmsVersion)) {
buttons[i].setSelected(true);
}
}
return p;
}
// [UT] 20.10.2005
private Component createLossyCheckBox() {
JPanel p = new JPanel();
JCheckBox checkBox = new JCheckBox("Preferr Lossy images", true);// I18N.get("ui.plugin.wms.URLWizardPanel.select-uniform-resource-locator-url")
// );
checkBox.setToolTipText("This will try to load JPEG images, if the WMS allows it.");
checkBox.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
lossyPreferred = ((JCheckBox)e.getSource()).isSelected();
}
});
p.add(checkBox);
return p;
}
}