/*---------------- FILE HEADER ------------------------------------------
This file is part of deegree.
Copyright (C) 2001-2007 by:
Department of Geography, University of Bonn
http://www.giub.uni-bonn.de/deegree/
lat/lon GmbH
http://www.lat-lon.de
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Contact:
Andreas Poth
lat/lon GmbH
Aennchenstr. 19
53177 Bonn
Germany
E-Mail: poth@lat-lon.de
Prof. Dr. Klaus Greve
Department of Geography
University of Bonn
Meckenheimer Allee 166
53115 Bonn
Germany
E-Mail: greve@giub.uni-bonn.de
---------------------------------------------------------------------------*/
package org.deegree.igeo.views.swing.addlayer;
import static org.deegree.igeo.views.swing.util.GuiUtils.addToFrontListener;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashMap;
import java.util.Map;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
import org.deegree.framework.util.StringTools;
import org.deegree.framework.utils.SwingUtils;
import org.deegree.igeo.ApplicationContainer;
import org.deegree.igeo.i18n.Messages;
import org.deegree.igeo.mapmodel.MapModel;
import org.deegree.igeo.modules.IModule;
/**
* <code>IAddServiceWizard</code>
*
* @author <a href="mailto:buesching@lat-lon.de">Lyn Buesching</a>
* @author last edited by: $Author$
*
* @version $Revision$, $Date$
* @param <T>
*
*/
public abstract class AddServiceWizard<T> extends WizardDialog implements ActionListener, CaretListener {
private static final long serialVersionUID = 3084309745488600358L;
protected MapModel mapModel;
protected IModule<T> module;
protected JComboBox knownServicesChooser;
protected JTextField enterServicesField;
protected ButtonGroup versionBG;
protected JCheckBox cbSwapAxis;
protected Map<String, String> knownServices = new HashMap<String, String>( 10 );
/**
*
* @param frame
* the previous frame
* @param module
* the module this function is assigned
* @param mapModel
* the map model adapter to add the new layer
*/
@SuppressWarnings("unchecked")
public AddServiceWizard( JFrame frame, IModule<T> module, MapModel mapModel ) {
super( frame );
addToFrontListener( this );
this.module = module;
this.appContainer = (ApplicationContainer<Container>) module.getApplicationContainer();
this.mapModel = mapModel;
this.setSize( 500, 600 );
this.setResizable( false );
// fill map with all known services
knownServices.put( getComboBoxDefaultLabel(), "http://" );
String knownWMS = module.getInitParameters().get( getKnownServicesInitParamKey() );
String[] knownWMSs = StringTools.toArray( knownWMS, ",", false );
for ( int i = 0; i < knownWMSs.length; i++ ) {
int indexOfSep = knownWMSs[i].indexOf( ':' );
if ( indexOfSep > 0 ) {
String wmsName = knownWMSs[i].substring( 0, indexOfSep ).trim();
String wmsUrl = knownWMSs[i].substring( indexOfSep + 1 ).trim();
knownServices.put( wmsName, wmsUrl );
}
}
// set buttons
buttonPanel.setButtonEnabled( ButtonPanel.NEXT_BT, false );
buttonPanel.setButtonEnabled( ButtonPanel.FINISH_BT, false );
if ( previousFrame == null ) {
buttonPanel.setButtonEnabled( ButtonPanel.PREVIOUS_BT, false );
}
buttonPanel.registerActionListener( this );
// set text of the infoPanel
infoPanel.setInfoText( getInfoText() );
super.init();
}
/**
* Inserts serviceName and serviceUrl as a new entry to the init parameter of known services if not yet registered.
*
* @param serviceName
* the name of the service to insert
* @param serviceUrl
* the url of the service to insert
*/
protected void insertKnownService( String serviceName, String serviceUrl ) {
String knownServices = this.module.getInitParameter( getKnownServicesInitParamKey() );
String[] knownServicesArray = StringTools.toArray( knownServices, ",", false );
boolean isKnown = false;
for ( int i = 0; i < knownServicesArray.length; i++ ) {
int indexOfSep = knownServicesArray[i].indexOf( ':' );
if ( indexOfSep > 0 ) {
String wmsUrl = knownServicesArray[i].substring( indexOfSep + 1 ).trim();
if ( serviceUrl.equals( wmsUrl ) ) {
isKnown = true;
break;
}
}
}
if ( !isKnown ) {
String newKnownServices = StringTools.concat( 500, knownServices, ",", serviceName, ": ", serviceUrl );
this.module.updateInitParameter( getKnownServicesInitParamKey(), newKnownServices );
}
}
// /////////////////////////////////////////////////////////////////////////////////
// WizardDialog
// /////////////////////////////////////////////////////////////////////////////////
/*
* (non-Javadoc)
*
* @see org.deegree.igeo.views.swing.IWizardDialog#getMainPanel()
*/
@Override
public JPanel getMainPanel() {
JPanel addServicePanel = new JPanel();
addServicePanel.setVisible( true );
Dimension dim = new Dimension( 400, 200 );
addServicePanel.setPreferredSize( dim );
addServicePanel.setMinimumSize( dim );
// ows version array
String owsVersions = module.getInitParameters().get( getVersionInitParamKey() );
String[] versionArray = StringTools.toArray( owsVersions, ",", true );
// int nrOfWMSVersions = versionArray.length + 1;
GridBagConstraints gbc = SwingUtils.initPanel( addServicePanel );
gbc.anchor = GridBagConstraints.LINE_START;
// -- ComboBox for known services
JLabel knownServicesLabel = new JLabel( getKnownServicesLabel() );
knownServicesLabel.setVisible( true );
knownServicesLabel.setPreferredSize( new Dimension( 200, 25 ) );
knownServicesChooser = new JComboBox();
knownServicesChooser.addActionListener( this );
knownServicesChooser.setVisible( true );
knownServicesChooser.setPreferredSize( new Dimension( 200, 25 ) );
knownServicesChooser.setEditable( false );
knownServicesChooser.addItem( getComboBoxDefaultLabel() );
for ( String serviceName : knownServices.keySet() ) {
if ( !serviceName.equals( getComboBoxDefaultLabel() ) ) {
knownServicesChooser.addItem( serviceName );
}
}
addServicePanel.add( knownServicesLabel, gbc );
++gbc.gridy;
addServicePanel.add( knownServicesChooser, gbc );
// -- TextField to enter a new service
JLabel enterServicesLabel = new JLabel( getEnterServiceLabel() );
enterServicesLabel.setVisible( true );
enterServicesLabel.setPreferredSize( new Dimension( 200, 25 ) );
enterServicesField = new JTextField();
enterServicesField.setPreferredSize( new Dimension( 350, 25 ) );
enterServicesField.setVisible( true );
enterServicesField.addCaretListener( this );
enterServicesField.setText( "http://" );
gbc.insets = new Insets( 10, 2, 2, 2 );
++gbc.gridy;
addServicePanel.add( enterServicesLabel, gbc );
gbc.insets = new Insets( 2, 2, 2, 2 );
++gbc.gridy;
addServicePanel.add( enterServicesField, gbc );
// -- RadioButtons to choose the desired version
JLabel chooseVersionLabel = new JLabel( getVersionChooserLabel() );
chooseVersionLabel.setVisible( true );
chooseVersionLabel.setPreferredSize( new Dimension( 200, 25 ) );
gbc.insets = new Insets( 10, 2, 2, 2 );
++gbc.gridy;
addServicePanel.add( chooseVersionLabel, gbc );
versionBG = new ButtonGroup();
JRadioButton versionHighestButton = new JRadioButton( getHighestVersionLabel() );
versionHighestButton.setVisible( true );
versionHighestButton.setSelected( true );
versionBG.add( versionHighestButton );
gbc.insets = new Insets( 2, 2, 2, 2 );
gbc.gridwidth = 1;
++gbc.gridy;
JPanel versionRadioBtsPanel = new JPanel();
GridBagConstraints versionsGbc = SwingUtils.initPanel( versionRadioBtsPanel );
versionRadioBtsPanel.add( versionHighestButton, versionsGbc );
for ( int i = 0; i < versionArray.length; i++ ) {
String version = versionArray[i].trim();
JRadioButton versionButton = new JRadioButton( version );
versionButton.setActionCommand( version );
versionButton.setVisible( true );
versionBG.add( versionButton );
++versionsGbc.gridx;
versionRadioBtsPanel.add( versionButton, versionsGbc );
}
addServicePanel.add( versionRadioBtsPanel, gbc );
if ( this instanceof AddWMSWizard ) {
++gbc.gridy;
cbSwapAxis = new JCheckBox( Messages.getMessage( getLocale(), "$MD11828" ) );
addServicePanel.add( cbSwapAxis, gbc );
}
addServicePanel.setVisible( true );
return addServicePanel;
}
// /////////////////////////////////////////////////////////////////////////////////
// ActionListener
// /////////////////////////////////////////////////////////////////////////////////
/*
* (non-Javadoc)
*
* @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
*/
public void actionPerformed( ActionEvent event ) {
if ( event.getSource() instanceof JButton ) {
JButton srcButton = (JButton) event.getSource();
if ( srcButton.getName().equals( ButtonPanel.CANCEL_BT ) ) {
this.dispose();
} else if ( srcButton.getName().equals( ButtonPanel.PREVIOUS_BT ) ) {
if ( this.previousFrame != null ) {
this.previousFrame.setVisible( true );
}
this.close();
} else if ( srcButton.getName().equals( ButtonPanel.NEXT_BT ) ) {
handleNextButtonAction();
}
} else if ( event.getSource() instanceof JComboBox ) {
JComboBox srcComboBox = (JComboBox) event.getSource();
String serviceName = (String) srcComboBox.getSelectedItem();
String serviceUrl = knownServices.get( serviceName );
if ( enterServicesField != null ) {
enterServicesField.setText( serviceUrl );
}
}
}
// /////////////////////////////////////////////////////////////////////////////////
// CaretListener
// /////////////////////////////////////////////////////////////////////////////////
/*
* (non-Javadoc)
*
* @see javax.swing.event.CaretListener#caretUpdate(javax.swing.event.CaretEvent)
*/
public void caretUpdate( CaretEvent event ) {
JTextField src = (JTextField) event.getSource();
if ( buttonPanel != null ) {
if ( src.getText() != null && src.getText().length() > 0 ) {
buttonPanel.setButtonEnabled( ButtonPanel.NEXT_BT, true );
} else {
buttonPanel.setButtonEnabled( ButtonPanel.NEXT_BT, false );
}
}
}
// all required labels to make this general dialog specific to one service
/**
* @return the text shown in the header of this wizard dialog
*/
protected abstract String getInfoText();
/**
* @return the title of the combo box of known services
*/
protected abstract String getKnownServicesLabel();
/**
* @return the label of the default entry in the combo box
*/
protected abstract String getComboBoxDefaultLabel();
/**
* @return the title of the text field to enter new services
*/
protected abstract String getEnterServiceLabel();
/**
* @return the title of the radio buttons to choose the desired version of the service
*/
protected abstract String getVersionChooserLabel();
/**
* @return the entry to indicate the highest implemented version
*/
protected abstract String getHighestVersionLabel();
/**
* @return the key of the init parameters for the version numbers
*/
protected abstract String getVersionInitParamKey();
/**
* @return the key of the init parameters for the known services
*/
protected abstract String getKnownServicesInitParamKey();
/**
* called if the user pressed the next button
*/
protected abstract void handleNextButtonAction();
}