//$HeadURL$
/*---------------- FILE HEADER ------------------------------------------
This file is part of deegree.
Copyright (C) 2001-2012 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:
lat/lon GmbH
Aennchenstr. 19
53177 Bonn
Germany
http://www.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.desktop;
import java.awt.Color;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
import java.util.prefs.Preferences;
import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.ComboBoxModel;
import javax.swing.DefaultComboBoxModel;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JToggleButton;
import javax.swing.border.TitledBorder;
import org.deegree.framework.file.FileMemory;
import org.deegree.framework.util.GeometryUtils;
import org.deegree.framework.util.ImageUtils;
import org.deegree.framework.util.StringTools;
import org.deegree.framework.utils.CRSUtils;
import org.deegree.igeo.ApplicationContainer;
import org.deegree.igeo.i18n.Messages;
import org.deegree.igeo.io.FileSystemAccess;
import org.deegree.igeo.io.FileSystemAccessFactory;
import org.deegree.igeo.views.DialogFactory;
import org.deegree.igeo.views.swing.AutoCompleteComboBox;
import org.deegree.igeo.views.swing.util.GenericFileChooser;
import org.deegree.igeo.views.swing.util.IGeoFileFilter;
import org.deegree.igeo.views.swing.util.IconRegistry;
import org.deegree.igeo.views.swing.util.GenericFileChooser.FILECHOOSERTYPE;
import org.deegree.model.spatialschema.Envelope;
import org.deegree.model.spatialschema.GeometryFactory;
/**
*
* Dialog for creating a new project either from the scratch or by selecting an already existing project as a template
*
* @author <a href="mailto:wanhoff@lat-lon.de">Jeronimo Wanhoff</a>
* @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a>
* @author last edited by: $Author$
*
* @version. $Revision$, $Date$
*/
class NewProjectSelectionDialog extends javax.swing.JDialog {
private static final long serialVersionUID = -5680059587928210444L;
private static final Charset charset = Charset.forName( "UTF-8" );
private JTextField loadingProject;
private JPanel templatePanel;
private JComboBox cbCRS;
private JLabel csLabel;
private JLabel preview;
private JComboBox prjTemplateList;
private JButton btCancel;
private JButton btOK;
private JPanel loadExistingProjectPanel;
private JButton openProject;
private URL selection;
private String projectCRS;
private ProjectTemplate[] templates;
private JToggleButton btZoomIn;
private JToggleButton btBox;
private SimpleMapPanel mapPanel;
private JComboBox cbCountries;
private JToggleButton btPan;
private JToggleButton btZoomOut;
private JPanel pnMap;
private ButtonGroup bg = new ButtonGroup();
private static String[] crsList;
private ApplicationContainer<Container> appCont;
static {
if ( crsList == null ) {
crsList = CRSUtils.getAvailableEPSGCodesAsArray();
}
}
/**
* constructs a NewProjectSelectionDialog.
*
* @param appCont
* @param templates
*/
NewProjectSelectionDialog( ApplicationContainer<Container> appCont, ProjectTemplate... templates ) {
setTitle( Messages.getMessage( appCont.getMainWndow().getLocale(), "$DI10006" ) );
this.appCont = appCont;
this.templates = templates;
if ( this.templates == null ) {
this.templates = new ProjectTemplate[0];
}
setModal( true );
getContentPane().setLayout( null );
initGUI();
setVisible( true );
}
private void initGUI() {
initTemplatePanel();
initLoadExistingProjectPanel();
initOkButton();
initChancelButton();
initProjectAreaPanel();
if ( getParent() == null ) {
this.setBounds( 0, 0, 740, 367 );
} else {
setBounds( getParent().getX() + 100, getParent().getY() + 100, 740, 367 );
}
}
private void initProjectAreaPanel() {
pnMap = new JPanel();
getContentPane().add( pnMap );
pnMap.setBounds( 356, 5, 345, 290 );
pnMap.setBorder( BorderFactory.createTitledBorder( null, Messages.getMessage( getLocale(), "$DI10066" ),
TitledBorder.LEADING, TitledBorder.DEFAULT_POSITION ) );
pnMap.setLayout( null );
initZoomInButton();
initZoomOutButton();
initPanButton();
initSelectProjectAreaButton();
initCountryChooseComboBox();
initMapPanel();
}
private void initMapPanel() {
mapPanel = new SimpleMapPanel();
MouseHandler mh = new MouseHandler();
mapPanel.addMouseListener( mh );
mapPanel.addMouseMotionListener( mh );
pnMap.add( mapPanel );
mapPanel.setBounds( 17, 53, 311, 194 );
}
private void initCountryChooseComboBox() {
String res = Messages.getMessage( getLocale(), "$DI10069" );
InputStreamReader isr = null;
if ( res.startsWith( "file:" ) || res.startsWith( "http:" ) || res.startsWith( "ftp:" ) ) {
try {
isr = new InputStreamReader( new URL( res ).openStream(), charset );
} catch ( IOException e1 ) {
e1.printStackTrace();
isr = new InputStreamReader( getClass().getResourceAsStream( "countries.csv" ), charset );
}
} else {
isr = new InputStreamReader( getClass().getResourceAsStream( res ), charset );
}
BufferedReader br = new BufferedReader( isr );
List<Country> list = new ArrayList<Country>();
list.add( new Country( Messages.getMessage( getLocale(), "$DI10067" ), Messages.getMessage( getLocale(),
"$DI10068" ) ) );
String line = null;
try {
while ( ( line = br.readLine() ) != null ) {
String[] tmp = StringTools.toArray( line, ";", false );
list.add( new Country( tmp[0], tmp[1] ) );
}
} catch ( Exception e ) {
e.printStackTrace();
}
cbCountries = new JComboBox( list.toArray( new Country[list.size()] ) );
cbCountries.addActionListener( new ActionListener() {
public void actionPerformed( ActionEvent e ) {
Country country = (Country) cbCountries.getSelectedItem();
Envelope env = GeometryFactory.createEnvelope( country.env,
mapPanel.getSelectBox().getCoordinateSystem() );
mapPanel.select( env );
mapPanel.invalidate();
mapPanel.repaint();
}
} );
cbCountries.addKeyListener( new KeyListener() {
public void keyTyped( KeyEvent e ) {
}
public void keyReleased( KeyEvent e ) {
}
public void keyPressed( KeyEvent e ) {
cbCountries.selectWithKeyChar( e.getKeyChar() );
}
} );
pnMap.add( cbCountries );
cbCountries.setBounds( 17, 259, 311, 25 );
}
private void initSelectProjectAreaButton() {
btBox = new JToggleButton( Messages.getMessage( getLocale(), "$DI10065" ) );
pnMap.add( btBox );
btBox.setBounds( 120, 20, 150, 22 );
bg.add( btBox );
}
private void initTemplatePanel() {
templatePanel = new JPanel();
getContentPane().add( templatePanel );
templatePanel.setBounds( 8, 5, 342, 216 );
templatePanel.setBorder( BorderFactory.createTitledBorder( Messages.getMessage( getLocale(), "$DI10005" ) ) );
templatePanel.setLayout( null );
initProjectTemplateComboBox();
initPreviewLabel();
initCsLabel();
initCsCompoBox();
}
private void initLoadExistingProjectPanel() {
loadExistingProjectPanel = new JPanel();
loadExistingProjectPanel.setBorder( BorderFactory.createTitledBorder( Messages.getMessage( getLocale(),
"$DI10004" ) ) );
getContentPane().add( loadExistingProjectPanel );
loadExistingProjectPanel.setBounds( 8, 233, 342, 62 );
loadExistingProjectPanel.setLayout( null );
initLoadProjectTextField();
initOpenProjectButton();
}
private void initChancelButton() {
btCancel = new JButton( Messages.getMessage( getLocale(), "$DI10002" ), IconRegistry.getIcon( "cancel.png" ) );
getContentPane().add( btCancel );
btCancel.setBounds( 124, 307, 100, 21 );
btCancel.addActionListener( new ActionListener() {
public void actionPerformed( ActionEvent e ) {
projectCRS = null;
selection = null;
dispose();
}
} );
}
private void initOkButton() {
btOK = new JButton( Messages.getMessage( getLocale(), "$DI10001" ), IconRegistry.getIcon( "accept.png" ) );
btOK.setDefaultCapable( true );
btOK.setSelected( true );
getContentPane().add( btOK );
btOK.setBounds( 12, 307, 100, 21 );
btOK.addActionListener( new ActionListener() {
public void actionPerformed( ActionEvent e ) {
if ( loadingProject.getText() != null && loadingProject.getText().length() > 0 ) {
try {
// projectCRS must be set to null because an already existing
// project will be used to create a new one
projectCRS = cbCRS.getSelectedItem().toString();
selection = new URL( loadingProject.getText() );
} catch ( MalformedURLException e1 ) {
e1.printStackTrace();
}
dispose();
} else if ( prjTemplateList.getSelectedItem() != null ) {
ProjectTemplate prjt = (ProjectTemplate) prjTemplateList.getSelectedItem();
selection = prjt.getProjectURL();
projectCRS = cbCRS.getSelectedItem().toString();
dispose();
} else {
DialogFactory.openWarningDialog( "application", NewProjectSelectionDialog.this,
Messages.getMessage( getLocale(), "$DI10007" ),
Messages.getMessage( getLocale(), "$DI10008" ) );
}
}
} );
}
private void initOpenProjectButton() {
openProject = new JButton( Messages.getMessage( getLocale(), "$DI10003" ), IconRegistry.getIcon( "open.gif" ) );
loadExistingProjectPanel.add( openProject );
openProject.setBounds( 223, 28, 102, 21 );
openProject.addActionListener( new ActionListener() {
public void actionPerformed( ActionEvent e ) {
Preferences prefs = Preferences.userNodeForPackage( ApplicationContainer.class );
File file = GenericFileChooser.showOpenDialog( FILECHOOSERTYPE.project, appCont,
NewProjectSelectionDialog.this, prefs, "projectFile",
IGeoFileFilter.PRJ );
if ( file != null ) {
FileSystemAccessFactory fsaf = FileSystemAccessFactory.getInstance( appCont );
try {
FileSystemAccess fsa = fsaf.getFileSystemAccess( FILECHOOSERTYPE.project );
String s = fsa.getFileURL( file.getAbsolutePath() ).toURI().toASCIIString();
loadingProject.setText( s );
FileMemory.setLastDirectory( "newProjectFile", file );
} catch ( Exception e1 ) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
} );
}
private void initLoadProjectTextField() {
loadingProject = new JTextField();
loadExistingProjectPanel.add( loadingProject );
loadingProject.setBounds( 7, 28, 204, 21 );
}
private void initCsCompoBox() {
cbCRS = new AutoCompleteComboBox( crsList );
templatePanel.add( cbCRS );
cbCRS.setSelectedItem( Messages.getMessage( getLocale(), "$DI10071" ) );
cbCRS.setBounds( 10, 176, 315, 21 );
}
private void initCsLabel() {
csLabel = new JLabel();
templatePanel.add( csLabel );
csLabel.setText( Messages.getMessage( getLocale(), "$DI10010" ) );
csLabel.setBounds( 10, 154, 153, 14 );
}
private void initPreviewLabel() {
preview = new JLabel();
if ( templates.length > 0 ) {
preview.setIcon( new ImageIcon( templates[0].getPreView() ) );
}
templatePanel.add( preview );
preview.setBounds( 169, 12, 153, 122 );
preview.setBorder( BorderFactory.createLineBorder( Color.DARK_GRAY ) );
}
private void initProjectTemplateComboBox() {
ComboBoxModel prjTemplateListModel = new DefaultComboBoxModel( templates );
prjTemplateList = new JComboBox();
templatePanel.add( prjTemplateList );
prjTemplateList.setModel( prjTemplateListModel );
prjTemplateList.setBounds( 10, 17, 147, 21 );
prjTemplateList.addItemListener( new ItemListener() {
public void itemStateChanged( ItemEvent e ) {
ProjectTemplate prjt = (ProjectTemplate) e.getItem();
preview.setIcon( new ImageIcon( prjt.getPreView() ) );
loadingProject.setText( "" );
}
} );
}
private void initPanButton() {
btPan = new JToggleButton( IconRegistry.getIcon( "pan.png" ) );
pnMap.add( btPan );
btPan.setBounds( 85, 20, 25, 22 );
bg.add( btPan );
}
private void initZoomOutButton() {
btZoomOut = new JToggleButton( IconRegistry.getIcon( "zoomout.png" ) );
pnMap.add( btZoomOut );
btZoomOut.setBounds( 50, 20, 25, 22 );
bg.add( btZoomOut );
}
private void initZoomInButton() {
btZoomIn = new JToggleButton( IconRegistry.getIcon( "zoomin.png" ) );
pnMap.add( btZoomIn );
btZoomIn.setBounds( 15, 20, 25, 22 );
btZoomIn.doClick();
bg.add( btZoomIn );
}
/**
*
* @return URL of the project file that has been selected to create a new project from it
*/
URL getSelection() {
return selection;
}
/**
*
* @return bounding box for new Project
*/
Envelope getTargetBoundingBox() {
return mapPanel.getSelectBox();
}
/**
*
* @return desired CRS of the new project; will be <code>null</code> if a new project shall be created from an
* already exiting project
*/
String getProjectCRS() {
return projectCRS;
}
/**
*
*
*
* @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a>
* @author last edited by: $Author$
*
* @version. $Revision$, $Date$
*/
public static class ProjectTemplate {
private String title;
private URL preViewSrc;
private BufferedImage preView;
private URL prjURL;
/**
* @param title
* @param preViewSrc
*/
public ProjectTemplate( String title, URL preViewSrc, URL prjURL ) {
this.title = title;
this.preViewSrc = preViewSrc;
this.prjURL = prjURL;
}
/**
* @return the preView
*/
public BufferedImage getPreView() {
if ( preView == null ) {
try {
preView = ImageUtils.loadImage( preViewSrc );
} catch ( IOException e ) {
preView = new BufferedImage( 10, 10, BufferedImage.TYPE_INT_ARGB );
}
}
return preView;
}
/**
* @return the prjFile
*/
public URL getProjectURL() {
return prjURL;
}
@Override
public String toString() {
return title;
}
}
/**
*
* TODO add class documentation here
*
* @author <a href="mailto:name@deegree.org">Andreas Poth</a>
* @author last edited by: $Author$
*
* @version $Revision$, $Date$
*/
private class MouseHandler extends MouseAdapter implements MouseMotionListener {
private int startx;
private int starty;
/*
* (non-Javadoc)
*
* @see java.awt.event.MouseMotionListener#mouseDragged(java.awt.event.MouseEvent)
*/
public void mouseDragged( MouseEvent e ) {
if ( bg.getSelection().equals( btPan.getModel() ) ) {
mapPanel.pan( startx, starty, e.getX(), e.getY() );
startx = e.getX();
starty = e.getY();
mapPanel.invalidate();
mapPanel.repaint();
} else if ( bg.getSelection().equals( btBox.getModel() ) ) {
mapPanel.select( startx, starty, e.getX(), e.getY() );
mapPanel.invalidate();
mapPanel.repaint();
} else if ( bg.getSelection().equals( btZoomIn.getModel() )
&& GeometryUtils.distance( startx, starty, e.getX(), e.getY() ) >= 5 ) {
mapPanel.setZoomBox( startx, starty, e.getX(), e.getY() );
mapPanel.invalidate();
mapPanel.repaint();
}
}
/*
* (non-Javadoc)
*
* @see java.awt.event.MouseMotionListener#mouseMoved(java.awt.event.MouseEvent)
*/
public void mouseMoved( MouseEvent e ) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed( MouseEvent e ) {
startx = e.getX();
starty = e.getY();
}
@Override
public void mouseReleased( MouseEvent e ) {
if ( bg.getSelection().equals( btZoomIn.getModel() ) ) {
if ( GeometryUtils.distance( startx, starty, e.getX(), e.getY() ) < 5 ) {
mapPanel.zoomIn();
} else {
mapPanel.zoomIn( startx, starty, e.getX(), e.getY() );
}
} else if ( bg.getSelection().equals( btZoomOut.getModel() ) ) {
mapPanel.zoomOut();
} else if ( bg.getSelection().equals( btPan.getModel() ) ) {
mapPanel.pan( startx, starty, e.getX(), e.getY() );
}
mapPanel.invalidate();
mapPanel.repaint();
}
}
/**
*
* TODO add class documentation here
*
* @author <a href="mailto:name@deegree.org">Andreas Poth</a>
* @author last edited by: $Author$
*
* @version $Revision$, $Date$
*/
private class Country {
String name;
String env;
/**
* @param name
* @param env
*/
public Country( String name, String env ) {
this.name = name;
this.env = env;
}
@Override
public String toString() {
return name;
}
}
}