001 //$HeadURL: svn+ssh://jwilden@svn.wald.intevation.org/deegree/base/branches/2.5_testing/src/org/deegree/tools/app3d/Export3DFile.java $ 002 /*---------------------------------------------------------------------------- 003 This file is part of deegree, http://deegree.org/ 004 Copyright (C) 2001-2009 by: 005 Department of Geography, University of Bonn 006 and 007 lat/lon GmbH 008 009 This library is free software; you can redistribute it and/or modify it under 010 the terms of the GNU Lesser General Public License as published by the Free 011 Software Foundation; either version 2.1 of the License, or (at your option) 012 any later version. 013 This library is distributed in the hope that it will be useful, but WITHOUT 014 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 015 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more 016 details. 017 You should have received a copy of the GNU Lesser General Public License 018 along with this library; if not, write to the Free Software Foundation, Inc., 019 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 020 021 Contact information: 022 023 lat/lon GmbH 024 Aennchenstr. 19, 53177 Bonn 025 Germany 026 http://lat-lon.de/ 027 028 Department of Geography, University of Bonn 029 Prof. Dr. Klaus Greve 030 Postfach 1147, 53001 Bonn 031 Germany 032 http://www.geographie.uni-bonn.de/deegree/ 033 034 e-mail: info@deegree.org 035 ----------------------------------------------------------------------------*/ 036 037 package org.deegree.tools.app3d; 038 039 import java.awt.FlowLayout; 040 import java.awt.GridBagConstraints; 041 import java.awt.GridBagLayout; 042 import java.awt.event.ActionEvent; 043 import java.awt.event.ActionListener; 044 import java.lang.reflect.Constructor; 045 import java.util.HashMap; 046 import java.util.Map; 047 048 import javax.media.j3d.BranchGroup; 049 import javax.swing.ButtonGroup; 050 import javax.swing.JButton; 051 import javax.swing.JCheckBox; 052 import javax.swing.JComponent; 053 import javax.swing.JDialog; 054 import javax.swing.JLabel; 055 import javax.swing.JOptionPane; 056 import javax.swing.JPanel; 057 import javax.swing.JRadioButton; 058 import javax.swing.JTextField; 059 060 import org.deegree.framework.log.ILogger; 061 import org.deegree.framework.log.LoggerFactory; 062 063 /** 064 * <code>Export3DFile</code> shows a dialog to the user in which export parameters can be set, and calls the 065 * appropriate export method. 066 * 067 * @author <a href="mailto:bezema@lat-lon.de">Rutger Bezema</a> 068 * @author last edited by: $Author: mschneider $ 069 * 070 * @version $Revision: 18195 $, $Date: 2009-06-18 17:55:39 +0200 (Do, 18 Jun 2009) $ 071 */ 072 public class Export3DFile { 073 private static ILogger LOG = LoggerFactory.getLogger( Export3DFile.class ); 074 075 /** 076 * Convenient map, which holds the mapping of the parameters to the components 077 */ 078 Map<String, JComponent> paramFields; 079 080 /** 081 * Holds all parameters set by the user 082 */ 083 Map<String, String> resultMap; 084 085 /** 086 * Holds all parameters which can be given to the exporter. 087 */ 088 Map<String, String> originalMap; 089 090 /** 091 * Will be true if the parameter dialog was ended with the 'ok' button. 092 */ 093 boolean okClicked = false; 094 095 // private JDialog parameterDialog = null; 096 097 /** 098 * the parent of all dialogs. 099 */ 100 private View3DFile parent; 101 102 /** 103 * A list of class which are able to export and their description. 104 */ 105 Map<String, String> exportClasses = new HashMap<String, String>(); 106 107 /** 108 * Will hold a class name of the exporter selected by the user (set in the anonymous Actionlistener of the the 109 * ok-button of the ExportDialog) 110 */ 111 String selectedExporter = null; 112 113 /** 114 * A button group to handle to activation of only one exporter. 115 */ 116 ButtonGroup exporterGroup = new ButtonGroup(); 117 118 /** 119 * Shows the export dialog (wizard) 120 */ 121 JDialog exportDialog; 122 123 /** 124 * @param parent 125 * of the dialog 126 * 127 */ 128 public Export3DFile( View3DFile parent ) { 129 this.resultMap = new HashMap<String, String>(); 130 this.paramFields = new HashMap<String, JComponent>(); 131 this.parent = parent; 132 133 findAvailableExports(); 134 createExportDialog(); 135 } 136 137 /** 138 * 139 */ 140 private void findAvailableExports() { 141 exportClasses.put( new J3DToCityGMLExporter().getShortDescription(), 142 J3DToCityGMLExporter.class.getCanonicalName() ); 143 } 144 145 private void createExportDialog() { 146 JPanel yesNoPanel = new JPanel(); 147 JButton tmpButton = new JButton( "yes" ); 148 tmpButton.addActionListener( new ActionListener() { 149 public void actionPerformed( ActionEvent e ) { 150 if ( selectedExporter == null ) { 151 JOptionPane.showMessageDialog( exportDialog, "Please select one of the exporters." ); 152 } else { 153 exportDialog.setVisible( false ); 154 } 155 } 156 } ); 157 yesNoPanel.add( tmpButton ); 158 tmpButton = new JButton( "cancel" ); 159 tmpButton.addActionListener( new ActionListener() { 160 public void actionPerformed( ActionEvent e ) { 161 selectedExporter = null; 162 exportDialog.setVisible( false ); 163 } 164 165 } ); 166 yesNoPanel.add( tmpButton ); 167 JPanel exportPane = new JPanel( new GridBagLayout() ); 168 GridBagConstraints gb = new GridBagConstraints(); 169 gb.gridx = 0; 170 gb.gridy = 0; 171 172 for ( String desc : exportClasses.keySet() ) { 173 JRadioButton exporter = new JRadioButton( desc ); 174 exporter.addActionListener( new ActionListener() { 175 public void actionPerformed( ActionEvent e ) { 176 JRadioButton jb = (JRadioButton) e.getSource(); 177 if ( jb.isSelected() ) { 178 selectedExporter = exportClasses.get( jb.getText() ); 179 jb.setSelected( false ); 180 } 181 } 182 183 } ); 184 gb.gridy++; 185 exportPane.add( exporter, gb ); 186 exporterGroup.add( exporter ); 187 } 188 exportDialog = new JDialog( parent, true ); 189 exportDialog.getContentPane().setLayout( new GridBagLayout() ); 190 gb.gridy = 0; 191 exportDialog.getContentPane().add( exportPane, gb ); 192 gb.gridy++; 193 exportDialog.getContentPane().add( yesNoPanel, gb ); 194 exportDialog.pack(); 195 exportDialog.setVisible( false ); 196 } 197 198 /** 199 * 200 * @param toExport 201 * the actual branchgroup 202 * @return the String representation of the exported branch group. 203 */ 204 public StringBuilder exportBranchgroup( BranchGroup toExport ) { 205 StringBuilder result = new StringBuilder( 20000 ); 206 this.selectedExporter = null; 207 exportDialog.setLocationRelativeTo( parent ); 208 // will set the selectedExporter 209 exportDialog.setVisible( true ); 210 if ( selectedExporter != null ) { 211 J3DExporter tmpExporter = null; 212 try { 213 Class<?> c = Class.forName( selectedExporter ); 214 c.asSubclass( J3DExporter.class ); 215 Constructor<?> cons = c.getConstructor(); 216 tmpExporter = (J3DExporter) cons.newInstance(); 217 } catch ( Exception e ) { 218 LOG.logError( e.getMessage(), e ); 219 parent.showExceptionDialog( "Could not create an exporter instance because:\n" + e.getMessage() ); 220 return result; 221 } 222 JDialog parameterDialog = createParameterDialog( tmpExporter ); 223 parameterDialog.setLocationRelativeTo( parent ); 224 originalMap = tmpExporter.getParameterMap(); 225 parameterDialog.setVisible( true ); 226 if ( isOkClicked() ) { 227 try { 228 Constructor<?> constructor = tmpExporter.getClass().getConstructor( Map.class ); 229 tmpExporter = (J3DExporter) constructor.newInstance( resultMap ); 230 toExport.detach(); 231 tmpExporter.export( result, toExport ); 232 } catch ( Exception e ) { 233 LOG.logError( e.getMessage(), e ); 234 parent.showExceptionDialog( "Could not create an exporter instance because:\n" + e.getMessage() ); 235 } 236 } 237 originalMap = null; 238 } 239 return result; 240 } 241 242 /** 243 * Creates a parameter dialog which by clicking ok sets all the values fromt the original map to the result map if 244 * they were changed by the user. 245 * 246 * @param exporter 247 * @return the dialog. 248 */ 249 private JDialog createParameterDialog( J3DExporter exporter ) { 250 final JDialog parameterDialog = new JDialog( parent, true );// JOptionPane.QUESTION_MESSAGE, 251 JPanel yesNoPanel = new JPanel(); 252 JButton tmpButton = new JButton( "yes" ); 253 tmpButton.addActionListener( new ActionListener() { 254 public void actionPerformed( ActionEvent e ) { 255 okClicked = true; 256 for ( String key : originalMap.keySet() ) { 257 String value = originalMap.get( key ); 258 if ( value != null && !"".equals( value.trim() ) ) { 259 JComponent paramField = paramFields.get( key ); 260 if ( paramField != null ) { 261 String userInput = key; 262 if ( paramField instanceof JTextField ) { 263 userInput = ( (JTextField) paramField ).getText(); 264 } else if ( paramField instanceof JCheckBox ) { 265 userInput = ( (JCheckBox) paramField ).isSelected() ? "yes" : "no"; 266 } 267 if ( !value.equalsIgnoreCase( userInput ) ) { 268 resultMap.put( key, userInput ); 269 } 270 } 271 } 272 } 273 parameterDialog.setVisible( false ); 274 } 275 } ); 276 yesNoPanel.add( tmpButton ); 277 tmpButton = new JButton( "cancel" ); 278 tmpButton.addActionListener( new ActionListener() { 279 public void actionPerformed( ActionEvent e ) { 280 parameterDialog.setVisible( false ); 281 } 282 } ); 283 yesNoPanel.add( tmpButton ); 284 Map<String, String> parameterMap = exporter.getParameterMap(); 285 JPanel parameterPane = new JPanel( new GridBagLayout() ); 286 GridBagConstraints gb = new GridBagConstraints(); 287 gb.gridx = 0; 288 gb.gridy = 0; 289 gb.anchor = GridBagConstraints.WEST; 290 for ( String param : parameterMap.keySet() ) { 291 JLabel label = new JLabel( param + ": " ); 292 JComponent parameter = null; 293 if ( parameterMap.get( param ).contains( "(yes/no)" ) ) { 294 parameter = new JCheckBox(); 295 } else { 296 parameter = new JTextField( parameterMap.get( param ), 20 ); 297 } 298 JPanel totalField = new JPanel( new FlowLayout() ); 299 totalField.add( label ); 300 totalField.add( parameter ); 301 gb.gridy++; 302 gb.weightx = 1; 303 parameterPane.add( totalField, gb ); 304 paramFields.put( param, parameter ); 305 } 306 307 // JOptionPane.YES_NO_CANCEL_OPTION, 308 // null, buttons, buttons[0] ); 309 parameterDialog.getContentPane().setLayout( new GridBagLayout() ); 310 gb.gridy = 0; 311 parameterDialog.getContentPane().add( parameterPane, gb ); 312 gb.gridy++; 313 parameterDialog.getContentPane().add( yesNoPanel, gb ); 314 parameterDialog.pack(); 315 parameterDialog.setVisible( false ); 316 return parameterDialog; 317 } 318 319 /** 320 * @return the resultMap. 321 */ 322 public Map<String, String> getResultMap() { 323 return resultMap; 324 } 325 326 /** 327 * @return the okClicked. 328 */ 329 public boolean isOkClicked() { 330 return okClicked; 331 } 332 333 }