//$HeadURL: svn+ssh://lbuesching@svn.wald.intevation.de/deegree/base/trunk/resources/eclipse/files_template.xml $ /*---------------------------------------------------------------------------- This file is part of deegree, http://deegree.org/ Copyright (C) 2001-2010 by: - Department of Geography, University of Bonn - and - lat/lon GmbH - 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 information: lat/lon GmbH Aennchenstr. 19, 53177 Bonn Germany http://lat-lon.de/ Department of Geography, University of Bonn Prof. Dr. Klaus Greve Postfach 1147, 53001 Bonn Germany http://www.geographie.uni-bonn.de/deegree/ e-mail: info@deegree.org ----------------------------------------------------------------------------*/ package org.deegree.igeo.views.swing.style; import static org.deegree.igeo.i18n.Messages.get; import java.awt.Component; import java.awt.Image; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.prefs.Preferences; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.table.AbstractTableModel; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.TableColumn; import javax.xml.namespace.QName; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; import javax.xml.stream.XMLStreamWriter; import org.deegree.framework.log.ILogger; import org.deegree.framework.log.LoggerFactory; import org.deegree.igeo.settings.GraphicOptions; import org.deegree.igeo.style.model.GraphicSymbol; import org.deegree.igeo.views.swing.util.GenericFileChooser; import org.deegree.igeo.views.swing.util.GenericFileChooser.FILECHOOSERTYPE; import org.deegree.igeo.views.swing.util.IGeoFileFilter; import com.jgoodies.forms.builder.ButtonBarBuilder; import com.jgoodies.forms.builder.DefaultFormBuilder; import com.jgoodies.forms.layout.CellConstraints; import com.jgoodies.forms.layout.FormLayout; /** * Manage SymbolDefinitions of {@link GraphicOptions} * * @author <a href="mailto:goltz@lat-lon.de">Lyn Goltz</a> * @author last edited by: $Author: lyn $ * * @version $Revision: $, $Date: $ */ public class EditSymbollibraryPanel extends JPanel implements ActionListener { private static final long serialVersionUID = -6882947699218187151L; private static final ILogger LOG = LoggerFactory.getLogger( EditSymbollibraryPanel.class ); private static List<String> columns = new ArrayList<String>(); private static String setNS = "http://www.deegree.org/settings"; private final GraphicOptions graphicOptions; private JTextField newSymbolNameTF; private JButton selectFileBt; private JTextField newSymbolTF; private JButton addSymbolBt; private JButton removeSymbolBt; private JButton importLibBt; private JButton exportLibBt; private JTable symbolTable; private SymbolTableModel symbolTableModel; static { columns.add( get( "$MD11839" ) ); columns.add( get( "$MD11840" ) ); columns.add( get( "$MD11841" ) ); } public EditSymbollibraryPanel( GraphicOptions graphicOptions ) { this.graphicOptions = graphicOptions; init(); } private void init() { // init // add own newSymbolNameTF = new JTextField(); selectFileBt = new JButton( get( "$MD10771" ) ); selectFileBt.addActionListener( this ); newSymbolTF = new JTextField(); addSymbolBt = new JButton( get( "$MD10772" ) ); addSymbolBt.addActionListener( this ); // remove own removeSymbolBt = new JButton( get( "$MD11165" ) ); removeSymbolBt.addActionListener( this ); removeSymbolBt.setEnabled( false ); exportLibBt = new JButton( get( "$MD11838" ) ); exportLibBt.setEnabled( false ); exportLibBt.addActionListener( this ); importLibBt = new JButton( get( "$MD11843" ) ); importLibBt.addActionListener( this ); symbolTableModel = new SymbolTableModel(); symbolTable = new JTable( symbolTableModel ); symbolTable.setAutoResizeMode( JTable.AUTO_RESIZE_OFF ); TableColumn iconCol = symbolTable.getColumnModel().getColumn( 0 ); iconCol.setPreferredWidth( 50 ); iconCol.setCellRenderer( new SymbolRenderer() ); symbolTable.getColumnModel().getColumn( 1 ).setPreferredWidth( 75 ); symbolTable.getColumnModel().getColumn( 2 ).setPreferredWidth( 500 ); symbolTable.getColumnModel().getColumn( 2 ).setCellRenderer( new URLCellRenderer() ); symbolTable.getSelectionModel().addListSelectionListener( new ListSelectionListener() { @Override public void valueChanged( ListSelectionEvent arg0 ) { if ( symbolTable.getSelectedRowCount() > 0 ) { removeSymbolBt.setEnabled( true ); exportLibBt.setEnabled( true ); } else { removeSymbolBt.setEnabled( false ); exportLibBt.setEnabled( false ); } } } ); JScrollPane scrollPane = new JScrollPane( symbolTable ); // layout FormLayout fl = new FormLayout( "left:$rgap, left:min, $ugap, fill:default:grow(0.5), $ugap, fill:default:grow(0.5)", "$cpheight, 150dlu, $btheight, " + "$sepheight, $cpheight, $btheight, $cpheight, $btheight," + "$sepheight, $btheight" ); DefaultFormBuilder builder = new DefaultFormBuilder( fl ); CellConstraints cc = new CellConstraints(); builder.addSeparator( get( "$MD11842" ), cc.xyw( 1, 1, 6 ) ); builder.add( scrollPane, cc.xyw( 2, 2, 5, CellConstraints.FILL, CellConstraints.CENTER ) ); builder.add( buildTableButtonBar(), cc.xyw( 1, 3, 6, CellConstraints.CENTER, CellConstraints.CENTER ) ); builder.addSeparator( get( "$MD10775" ), cc.xyw( 1, 4, 6 ) ); builder.addLabel( get( "$MD10776" ), cc.xy( 2, 5 ) ); builder.add( newSymbolNameTF, cc.xyw( 4, 5, 3 ) ); builder.addLabel( get( "$MD10777" ), cc.xy( 2, 6 ) ); builder.add( selectFileBt, cc.xy( 4, 6, CellConstraints.RIGHT, CellConstraints.CENTER ) ); builder.add( newSymbolTF, cc.xyw( 2, 7, 5 ) ); builder.add( addSymbolBt, cc.xyw( 2, 8, 5, CellConstraints.CENTER, CellConstraints.CENTER ) ); builder.addSeparator( get( "$MD11837" ), cc.xyw( 1, 9, 6 ) ); builder.add( importLibBt, cc.xyw( 2, 10, 5, CellConstraints.CENTER, CellConstraints.CENTER ) ); add( builder.getPanel() ); } private JPanel buildTableButtonBar() { ButtonBarBuilder bbBuilder = new ButtonBarBuilder(); bbBuilder.addFixed( exportLibBt ); bbBuilder.addUnrelatedGap(); bbBuilder.addFixed( removeSymbolBt ); return bbBuilder.getPanel(); } private void selectFile() { Preferences preferences = Preferences.userNodeForPackage( EditSymbollibraryPanel.class ); File file = GenericFileChooser.showOpenDialog( FILECHOOSERTYPE.image, null, this, preferences, "lastSelectSymbol", IGeoFileFilter.IMAGES ); if ( file != null ) { try { newSymbolTF.setText( file.toURI().toURL().toExternalForm() ); } catch ( MalformedURLException e ) { // should never happen e.printStackTrace(); } } } private void addSymbol() { String url = newSymbolTF.getText(); String name = newSymbolNameTF.getText(); if ( name == null || name.length() == 0 ) { JOptionPane.showMessageDialog( this, get( "$MD11856" ), get( "$MD11857" ), JOptionPane.INFORMATION_MESSAGE ); return; } else try { if ( graphicOptions.getSymboldefinition( name ) != null ) { int showConfirmDialog = JOptionPane.showConfirmDialog( this, get( "$MD11858" ), get( "$MD11859" ), JOptionPane.YES_NO_OPTION ); if ( showConfirmDialog == JOptionPane.NO_OPTION ) { return; } } } catch ( MalformedURLException e ) { LOG.logInfo( "Could not read graphicOptions: {}", e.getMessage() ); } boolean invalidURL = false; if ( url != null && url.length() > 0 ) { try { URL u = new URL( url ); GraphicSymbol newSymbol = new GraphicSymbol( name, u ); if ( newSymbol.getFormat() != null ) { graphicOptions.addSymbolDefinition( name, u.toExternalForm() ); newSymbolTF.setText( "" ); newSymbolNameTF.setText( "" ); symbolTableModel.updateSymbols(); symbolTableModel.fireTableDataChanged(); } else { JOptionPane.showMessageDialog( this, get( "$MD10780" ), get( "$MD10781" ), JOptionPane.INFORMATION_MESSAGE ); } } catch ( MalformedURLException e ) { invalidURL = true; } } else { invalidURL = true; } if ( invalidURL ) { JOptionPane.showMessageDialog( this, get( "$MD10782" ), get( "$MD10783" ), JOptionPane.INFORMATION_MESSAGE ); } } private void removeSymbols() { if ( symbolTable.getSelectedRows().length > 0 ) { int result = JOptionPane.showOptionDialog( this, get( "$MD11168", symbolTable.getSelectedRows().length ), get( "$MD11167" ), JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, null, null ); if ( result == JOptionPane.OK_OPTION ) { try { List<GraphicSymbol> symbolsToRemove = symbolTableModel.getRows( symbolTable.getSelectedRows() ); for ( GraphicSymbol gs : symbolsToRemove ) { graphicOptions.removeSymbolDefinition( gs.getName() ); } symbolTableModel.updateSymbols(); symbolTableModel.fireTableDataChanged(); } catch ( MalformedURLException e ) { JOptionPane.showMessageDialog( this, get( "$MD11169" ), get( "$DI10017" ), JOptionPane.INFORMATION_MESSAGE ); } } } } private void importSymbols() { File file = GenericFileChooser.showOpenDialog( FILECHOOSERTYPE.local, null, this, Preferences.systemNodeForPackage( EditSymbollibraryPanel.class ), "lastImportedSymbol", IGeoFileFilter.XML ); if ( file != null ) { FileInputStream fis = null; XMLStreamReader reader = null; try { fis = new FileInputStream( file ); reader = XMLInputFactory.newInstance().createXMLStreamReader( fis, "UTF-8" ); reader.nextTag(); reader.require( XMLStreamReader.START_ELEMENT, setNS, "SymbolDefinitions" ); reader.nextTag(); while ( reader.isStartElement() && new QName( setNS, "Graphic", "set" ).equals( reader.getName() ) ) { String name = reader.getAttributeValue( null, "name" ); String url = reader.getAttributeValue( null, "file" ); addSymbol( name, url, 1 ); do { reader.next(); } while ( !reader.isStartElement() && reader.getEventType() != XMLStreamReader.END_DOCUMENT ); } symbolTableModel.updateSymbols(); symbolTableModel.fireTableDataChanged(); } catch ( FileNotFoundException e ) { JOptionPane.showMessageDialog( this, get( "$MD11846" ), get( "$DI10017" ), JOptionPane.ERROR_MESSAGE ); } catch ( XMLStreamException e ) { e.printStackTrace(); JOptionPane.showMessageDialog( this, get( "$MD11847", e.getMessage() ), get( "$DI10017" ), JOptionPane.ERROR_MESSAGE ); } finally { if ( reader != null ) try { reader.close(); fis.close(); } catch ( XMLStreamException e ) { } catch ( IOException e ) { } } } } private void addSymbol( String name, String url, int index ) { try { GraphicSymbol symbol = graphicOptions.getSymboldefinition( name ); if ( symbol != null && !symbol.getUrl().equals( new URL( url ) ) ) { String tmpName = name + " (" + index + ')'; symbol = graphicOptions.getSymboldefinition( tmpName ); while ( symbol != null && !symbol.getUrl().equals( new URL( url ) ) ) { tmpName = name + " (" + index++ + ')'; } addSymbol( tmpName, url, index++ ); } else { graphicOptions.addSymbolDefinition( name, url ); } } catch ( MalformedURLException e ) { LOG.logInfo( "Could not resolve URL for symbol with name: " + name ); } } private void exportSymbols() { if ( symbolTable.getSelectedRows().length > 0 ) { File file = GenericFileChooser.showSaveDialog( FILECHOOSERTYPE.local, null, this, Preferences.systemNodeForPackage( EditSymbollibraryPanel.class ), "lastExportedSymbol", IGeoFileFilter.XML ); if ( file != null ) { FileOutputStream fos = null; XMLStreamWriter writer = null; try { fos = new FileOutputStream( file ); writer = XMLOutputFactory.newInstance().createXMLStreamWriter( fos, "UTF-8" ); writer.writeStartDocument( "UTF-8", "1.0" ); writer.writeStartElement( "set", "SymbolDefinitions", setNS ); writer.writeNamespace( "set", setNS ); List<GraphicSymbol> rows = symbolTableModel.getRows( symbolTable.getSelectedRows() ); for ( GraphicSymbol gs : rows ) { writer.writeStartElement( "set", "Graphic", setNS ); writer.writeAttribute( "name", gs.getName() ); writer.writeAttribute( "file", gs.getUrl().toExternalForm() ); writer.writeEndElement(); } writer.writeEndElement(); } catch ( FileNotFoundException e ) { JOptionPane.showMessageDialog( this, get( "$MD11844" ), get( "$DI10017" ), JOptionPane.ERROR_MESSAGE ); } catch ( XMLStreamException e ) { JOptionPane.showMessageDialog( this, get( "$MD11845", e.getMessage() ), get( "$DI10017" ), JOptionPane.ERROR_MESSAGE ); } finally { if ( writer != null ) try { writer.close(); fos.close(); } catch ( XMLStreamException e ) { } catch ( IOException e ) { } } } } } public void actionPerformed( ActionEvent e ) { if ( e.getSource() == selectFileBt ) { selectFile(); } else if ( e.getSource() == addSymbolBt ) { addSymbol(); } else if ( e.getSource() == removeSymbolBt ) { removeSymbols(); } else if ( e.getSource() == exportLibBt ) { exportSymbols(); } else if ( e.getSource() == importLibBt ) { importSymbols(); } } @Override public String toString() { return get( "$MD11836" ); } private class SymbolTableModel extends AbstractTableModel { private static final long serialVersionUID = 4512703217079702243L; private List<GraphicSymbol> symbols = new ArrayList<GraphicSymbol>(); public SymbolTableModel() { updateSymbols(); } private List<GraphicSymbol> getRows( int[] selectedRows ) { List<GraphicSymbol> gs = new ArrayList<GraphicSymbol>(); for ( int i : selectedRows ) { gs.add( symbols.get( i ) ); } return gs; } private void updateSymbols() { if ( graphicOptions != null ) { try { symbols.clear(); Map<String, GraphicSymbol> symbolDefinitions = graphicOptions.getSymbolDefinitions(); symbols.addAll( symbolDefinitions.values() ); Collections.sort( symbols ); } catch ( MalformedURLException e ) { JOptionPane.showMessageDialog( null, get( "$MD10789" ), get( "$DI10017" ), JOptionPane.ERROR_MESSAGE ); } } } @Override public int getColumnCount() { return columns.size(); } @Override public String getColumnName( int column ) { return columns.get( column ); } @Override public int getRowCount() { return symbols.size(); } @Override public Object getValueAt( int row, int col ) { GraphicSymbol graphicSymbol = symbols.get( row ); switch ( col ) { case 0: return graphicSymbol.getAsImage(); case 1: return graphicSymbol.getName(); case 2: return graphicSymbol.getUrl(); } return null; } } private class SymbolRenderer extends DefaultTableCellRenderer { private static final long serialVersionUID = -7866038248000655247L; @Override public Component getTableCellRendererComponent( JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column ) { JLabel label = new JLabel(); if ( value != null && value instanceof Image ) { label = new JLabel( new ImageIcon( (Image) value ) ); } if ( isSelected ) { label.setOpaque( true ); label.setBackground( table.getSelectionBackground() ); label.setForeground( table.getSelectionForeground() ); } return label; } } private class URLCellRenderer extends DefaultTableCellRenderer { private static final long serialVersionUID = -1533887940199153148L; @Override public Component getTableCellRendererComponent( JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column ) { if ( value instanceof URL ) { setToolTipText( ( (URL) value ).toExternalForm().substring( ( (URL) value ).toExternalForm().lastIndexOf( "/" ) + 1 ) ); } return super.getTableCellRendererComponent( table, value, isSelected, hasFocus, row, column ); } } }