//$HeadURL$ /*---------------- FILE HEADER ------------------------------------------ This file is part of deegree. Copyright (C) 2001-2008 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.layerlist; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Container; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.ByteArrayOutputStream; import java.io.StringReader; import java.net.URL; import java.util.List; import java.util.Locale; import javax.swing.BorderFactory; import javax.swing.BoxLayout; import javax.swing.Icon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTabbedPane; import javax.swing.JTextPane; import org.deegree.framework.util.FileUtils; import org.deegree.framework.xml.XMLFragment; import org.deegree.framework.xml.XSLTDocument; import org.deegree.igeo.ApplicationContainer; import org.deegree.igeo.config.LayerType; import org.deegree.igeo.config.OnlineResourceType; import org.deegree.igeo.config.LayerType.MetadataURL; import org.deegree.igeo.dataadapter.DataAccessAdapter; import org.deegree.igeo.dataadapter.FileFeatureAdapter; import org.deegree.igeo.dataadapter.FileGridCoverageAdapter; import org.deegree.igeo.dataadapter.MemoryFeatureAdapter; import org.deegree.igeo.dataadapter.DataAccessAdapter.DATASOURCETYPE; import org.deegree.igeo.dataadapter.wcs.WCSGridCoverageAdapter; import org.deegree.igeo.dataadapter.wfs.WFSFeatureAdapter; import org.deegree.igeo.dataadapter.wms.WMSGridCoverageAdapter; import org.deegree.igeo.i18n.Messages; import org.deegree.igeo.mapmodel.Layer; import org.deegree.igeo.mapmodel.MapModelEntry; import org.deegree.igeo.views.swing.util.IconRegistry; /** * * * @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a> * @author last edited by: $Author$ * * @version. $Revision$, $Date$ */ public class LayerInfoFrame extends JFrame { private static final long serialVersionUID = 7556921616653183981L; private InfoPanel infoPanel; private JPanel metadataPanel; private JPanel metadataPanelLeft; private ExtResourcesPanel extResPanel; private JPanel datasourcesPanel; private JPanel metadataViewPanel; private LayerStatisticPanel layerstatisticsPanel; private ApplicationContainer<Container> appContainer; private static LayerInfoFrame layerInfoFrame; /** * * @param appContainer */ private LayerInfoFrame( ApplicationContainer<Container> appContainer ) { this.appContainer = appContainer; setBounds( 100, 100, 650, 430 ); setResizable( true ); getContentPane().setLayout( new BorderLayout() ); createGUIElements(); addWindowListener( new WindowAdapter() { public void windowDeactivated( WindowEvent e ) { //LayerInfoFrame.this.toFront(); } public void windowGainedFocus( WindowEvent e ) { // LayerInfoFrame.this.toFront(); } } ); } /** * @param appContainer * @return singleton {@link LayerInfoFrame} */ public static LayerInfoFrame getInstance( ApplicationContainer<Container> appContainer ) { if ( layerInfoFrame == null ) { layerInfoFrame = new LayerInfoFrame( appContainer ); } return layerInfoFrame; } /** * * */ private void createGUIElements() { JTabbedPane tabbedPane = new JTabbedPane(); infoPanel = new InfoPanel(); tabbedPane.addTab( Messages.getMessage( Locale.getDefault(), "$MD10058" ), infoPanel ); metadataPanel = new JPanel(); tabbedPane.addTab( Messages.getMessage( Locale.getDefault(), "$MD10059" ), metadataPanel ); extResPanel = new ExtResourcesPanel( appContainer, this ); tabbedPane.addTab( Messages.getMessage( Locale.getDefault(), "$MD10060" ), extResPanel ); datasourcesPanel = new JPanel(); tabbedPane.addTab( Messages.getMessage( Locale.getDefault(), "$MD10061" ), datasourcesPanel ); layerstatisticsPanel = new LayerStatisticPanel( appContainer ); tabbedPane.addTab( "statistics", layerstatisticsPanel ); getContentPane().add( tabbedPane, BorderLayout.CENTER ); } /** * * @param mme */ private void initGUIElements( MapModelEntry mme ) { infoPanel.setMapModelEntry( mme ); if ( mme instanceof Layer ) { initMetadataPanel( (Layer) mme ); initExternalResourcesPanel( (Layer) mme ); initDatasourcesPanel( (Layer) mme ); initLayerStatisticsPanel( (Layer) mme ); } doLayout(); } private void initLayerStatisticsPanel( Layer layer ) { layerstatisticsPanel.removeAll(); layerstatisticsPanel.setLayout( new BorderLayout( 10, 0 ) ); layerstatisticsPanel.init( layer ); } /** * * @param layer */ private void initMetadataPanel( final Layer layer ) { metadataPanel.removeAll(); metadataPanel.setLayout( new BorderLayout( 10, 0 ) ); if ( layer != null ) { metadataPanelLeft = new JPanel(); metadataPanelLeft.setBorder( BorderFactory.createEmptyBorder( 10, 10, 5, 10 ) ); metadataPanelLeft.setLayout( new BoxLayout( metadataPanelLeft, BoxLayout.PAGE_AXIS ) ); JLabel title = new JLabel( layer.getTitle() ); title.setBorder( BorderFactory.createEmptyBorder( 10, 10, 5, 10 ) ); metadataPanel.add( title, BorderLayout.NORTH ); final List<MetadataURL> urlList = layer.getMetadataURLs(); for ( MetadataURL url : urlList ) { JButton open = new JButton( Messages.getMessage( Locale.getDefault(), "$MD10065" ) ); open.setIcon( IconRegistry.getIcon( "open.gif" ) ); open.setActionCommand( url.getOnlineResource().getHref() ); open.addActionListener( new MetadataOpenListener() ); metadataPanelLeft.add( open ); } metadataPanel.add( metadataPanelLeft, BorderLayout.WEST ); JScrollPane sc = new JScrollPane( metadataViewPanel = new JPanel(), JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED ); sc.setBorder( BorderFactory.createEmptyBorder( 10, 10, 10, 10 ) ); metadataViewPanel.setLayout( new BorderLayout() ); metadataPanel.add( sc, BorderLayout.CENTER ); JButton addMDBT = new JButton( Messages.getMessage( Locale.getDefault(), "$MD10109" ) ); addMDBT.setIcon( IconRegistry.getIcon( "add.png" ) ); addMDBT.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent evt ) { MetadataURLDialog dg = new MetadataURLDialog( LayerInfoFrame.this ); String s = dg.getMetadataURL(); if ( s != null && s.length() > 5 ) { JButton open = new JButton( Messages.getMessage( Locale.getDefault(), "$MD10065" ) ); open.setIcon( IconRegistry.getIcon( "open.gif" ) ); open.setActionCommand( s ); open.addActionListener( new MetadataOpenListener() ); metadataPanelLeft.add( open ); MetadataURL mdu = new LayerType.MetadataURL(); OnlineResourceType olr = new OnlineResourceType(); olr.setHref( s ); mdu.setOnlineResource( olr ); layer.addMetadataURL( mdu ); invalidate(); repaint(); } } } ); JButton removeMDBT = new JButton( Messages.getMessage( Locale.getDefault(), "$MD10110" ) ); removeMDBT.setIcon( IconRegistry.getIcon( "remove.png" ) ); removeMDBT.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent evt ) { // removes last button/meta data link from panel Component[] comps = metadataPanelLeft.getComponents(); for ( int i = comps.length; i > 0; i-- ) { if ( comps[i - 1] instanceof JButton ) { JButton bt = (JButton) comps[i - 1]; metadataPanelLeft.remove( bt ); for ( int j = 0; j < urlList.size(); j++ ) { if ( urlList.get( j ).getOnlineResource().getHref().equals( bt.getActionCommand() ) ) { layer.removeMetadataURL( urlList.get( j ) ); } } invalidate(); repaint(); break; } } } } ); JPanel panel = new JPanel( new FlowLayout( FlowLayout.LEFT ) ); panel.add( addMDBT ); panel.add( removeMDBT ); metadataPanel.add( panel, BorderLayout.SOUTH ); } } private void initExternalResourcesPanel( Layer layer ) { extResPanel.removeAll(); extResPanel.setLayout( new BorderLayout( 10, 0 ) ); extResPanel.init( layer ); } /** * creates panel for datasource informations * * @param layer */ private void initDatasourcesPanel( Layer layer ) { datasourcesPanel.removeAll(); datasourcesPanel.setLayout( new BorderLayout( 10, 0 ) ); if ( layer != null ) { JPanel left = new JPanel(); left.setBorder( BorderFactory.createEmptyBorder( 10, 10, 5, 10 ) ); left.setLayout( new BoxLayout( left, BoxLayout.PAGE_AXIS ) ); JLabel title = new JLabel( layer.getTitle() ); title.setBorder( BorderFactory.createEmptyBorder( 10, 10, 5, 10 ) ); datasourcesPanel.add( title, BorderLayout.NORTH ); List<DataAccessAdapter> list = layer.getDataAccess(); for ( int i = 0; i < list.size(); i++ ) { DataAccessAdapter adapter = list.get( i ); if ( i == 0 ) { setDatasourcePanel( adapter ); } DATASOURCETYPE dst = getDataSourceTypes( adapter ); JButton open = new JButton( adapter.getDatasource().getName(), getDSTypeIcon( dst ) ); open.putClientProperty( "DATASOURCE", adapter ); open.setActionCommand( dst.name() ); open.addActionListener( new DatasourceOpenListener() ); left.add( open ); } datasourcesPanel.add( left, BorderLayout.WEST ); } } private void setDatasourcePanel( DataAccessAdapter ada ) { JPanel datasourceViewPanel = new JPanel(); datasourceViewPanel.setBorder( BorderFactory.createEmptyBorder( 10, 10, 10, 10 ) ); datasourceViewPanel.setLayout( new BorderLayout() ); datasourceViewPanel.add( new DatasourceDescPanel( appContainer, ada ), BorderLayout.CENTER ); datasourceViewPanel.doLayout(); datasourcesPanel.add( datasourceViewPanel, BorderLayout.CENTER ); datasourcesPanel.doLayout(); LayerInfoFrame.this.repaint(); } private Icon getDSTypeIcon( DATASOURCETYPE dst ) { if ( dst.equals( DATASOURCETYPE.file ) ) { return IconRegistry.getIcon( "raster_filelayer_icon.png" ); } if ( dst.equals( DATASOURCETYPE.database ) ) { return IconRegistry.getIcon( "databaselayer_icon.gif" ); } if ( dst.equals( DATASOURCETYPE.memory ) ) { return IconRegistry.getIcon( "memorylayer_icon.gif" ); } if ( dst.equals( DATASOURCETYPE.mixed ) ) { return IconRegistry.getIcon( "mixedlayer_icon.gif" ); } if ( dst.equals( DATASOURCETYPE.wcs ) ) { return IconRegistry.getIcon( "wcslayer_icon.png" ); } if ( dst.equals( DATASOURCETYPE.wfs ) ) { return IconRegistry.getIcon( "wfslayer_icon.png" ); } if ( dst.equals( DATASOURCETYPE.wms ) ) { return IconRegistry.getIcon( "wmslayer_icon.png" ); } return null; } /** * * @param dataaccess * @return */ private DATASOURCETYPE getDataSourceTypes( DataAccessAdapter dataaccess ) { DATASOURCETYPE dst = null; if ( dataaccess instanceof FileFeatureAdapter || dataaccess instanceof FileGridCoverageAdapter ) { dst = DATASOURCETYPE.file; } else if ( dataaccess instanceof MemoryFeatureAdapter ) { dst = DATASOURCETYPE.memory; } else if ( dataaccess instanceof WFSFeatureAdapter ) { dst = DATASOURCETYPE.wfs; } else if ( dataaccess instanceof WCSGridCoverageAdapter ) { dst = DATASOURCETYPE.wcs; } else if ( dataaccess instanceof WMSGridCoverageAdapter ) { dst = DATASOURCETYPE.wms; } else { dst = DATASOURCETYPE.database; } return dst; } /** * * @param mme */ public void setLayer( MapModelEntry mme ) { setTitle( mme.getTitle() ); initGUIElements( mme ); repaint(); } // ///////////////////////////////////////////////////////////////////////////// // inner classes // ///////////////////////////////////////////////////////////////////////////// private class MetadataOpenListener implements ActionListener { /* * (non-Javadoc) * * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent) */ public void actionPerformed( ActionEvent event ) { String url = event.getActionCommand(); // JTextArea ta = new JTextArea( url ); JTextPane textpane = new JTextPane(); try { String s = FileUtils.readTextFile( new URL( url ) ).toString(); StringReader sr = new StringReader( s ); try { XMLFragment xml = new XMLFragment(); xml.load( sr, url ); XSLTDocument xslt = new XSLTDocument( LayerInfoFrame.class.getResource( "metaContent2html.xsl" ) ); ByteArrayOutputStream bos = new ByteArrayOutputStream( 2000 ); xslt.transform( xml, bos ); textpane.setContentType( "text/html" ); textpane.setText( new String( bos.toByteArray() ) ); } catch ( Exception e1 ) { e1.printStackTrace(); // cannot parse as XML assume HTML try { textpane.setPage( url ); } catch ( Exception e2 ) { e2.printStackTrace(); // not HTML -> set as text textpane.setText( s ); } } } catch ( Exception e ) { e.printStackTrace(); } metadataViewPanel.add( textpane, BorderLayout.CENTER ); metadataViewPanel.doLayout(); } } /** * * * * @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a> * @author last edited by: $Author$ * * @version. $Revision$, $Date$ */ private class DatasourceOpenListener implements ActionListener { /* * (non-Javadoc) * * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent) */ public void actionPerformed( ActionEvent e ) { DataAccessAdapter ada = (DataAccessAdapter) ( (JButton) e.getSource() ).getClientProperty( "DATASOURCE" ); setDatasourcePanel( ada ); } } }