/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2002-2008, Open Source Geospatial Foundation (OSGeo) * * 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; * version 2.1 of the License. * * 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. */ package org.geotools.swing.data; import java.awt.Font; import java.io.IOException; import java.io.Serializable; import java.util.HashMap; import java.util.Map; import java.util.StringTokenizer; import java.util.Map.Entry; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JPanel; import net.miginfocom.swing.MigLayout; import org.geotools.data.DataStoreFactorySpi; import org.geotools.data.Parameter; import org.geotools.data.DataAccessFactory.Param; import org.geotools.swing.wizard.JPage; import org.geotools.swing.wizard.ParamField; /** * A wizard page that will prompt the user for a file of the supplied format ask for any additional * information. * <p> * This page will allow the user to edit and modify the provided connectionParameters map * - but will only show parameters that match the indicated "level". If level is null it * assumed to be "user". * * * * @source $URL$ */ public class JDataStorePage extends JPage { /** * Factory for which we are collection connection parameters */ protected DataStoreFactorySpi format; /** Map of user interface ParamFields displayed to the user */ private Map<Param, ParamField> fields = new HashMap<Param, ParamField>(); /** Connection params for datastore */ protected Map<String, Object> connectionParameters; /** level of parameters to display */ private String level = null; /** max line length of parameter description labels (chars) */ private final int MAX_DESCRIPTION_WIDTH = 60; public JDataStorePage(DataStoreFactorySpi format) { this(format, null); } public JDataStorePage(DataStoreFactorySpi format, Map<String, Object> params) { this.format = format; if (params == null) { params = new HashMap<String, Object>(); if( format != null ){ for (Param param : format.getParametersInfo()) { params.put(param.key, (Serializable) param.sample); } } } this.connectionParameters = params; } public void setLevel(String level) { this.level = level; } public void setFormat(DataStoreFactorySpi format) { if( this.format != format ){ this.format = format; } } @Override public JPanel createPanel() { final JPanel page = super.createPanel(); page.setLayout(new MigLayout()); JLabel title = new JLabel(format.getDisplayName()); Font titleFont = new Font("Arial", Font.BOLD, 14); title.setFont(titleFont); page.add(title, "span"); JLabel description = new JLabel(format.getDescription()); page.add(description, "grow, span"); for (Param param : format.getParametersInfo()) { if( level != null ){ String check = param.metadata == null ? "user" : (String) param.metadata.get(Parameter.LEVEL); if( check == null ){ check = "user"; } if (level.equals( check )){ // we are good this is the one we want } else { continue; // skip since it is not the one we want } } String txt = param.title.toString(); if( param.required ){ txt +="*"; } JLabel label = new JLabel(txt); page.add(label); ParamField field = ParamField.create(param); JComponent component = field.doLayout(); page.add(component, "span, wrap"); fields.put(param, field); if (param.description != null) { JLabel info = new JLabel(formatDescription(param.description.toString())); page.add(info, "skip, span, wrap"); } } return page; } @Override public void preDisplayPanel() { // populate panel from params map for (Entry<Param, ParamField> entry : fields.entrySet()) { Param param = entry.getKey(); ParamField field = entry.getValue(); Object value = null; try { value = param.lookUp(connectionParameters); } catch (IOException e) { } if( value == null && param.required ){ value = param.sample; } field.setValue(value); } for (Entry<Param, ParamField> entry : fields.entrySet()) { ParamField field = entry.getValue(); field.addListener(getJWizard().getController()); } } @Override public void preClosePanel() { for (Entry<Param, ParamField> entry : fields.entrySet()) { Param param = entry.getKey(); ParamField field = entry.getValue(); Object value = field.getValue(); connectionParameters.put(param.key, (Serializable) value); field.setValue(value); } for (Entry<Param, ParamField> entry : fields.entrySet()) { ParamField field = entry.getValue(); field.removeListener(getJWizard().getController()); } } @Override public boolean isValid() { // populate panel for (Entry<Param, ParamField> entry : fields.entrySet()) { if (!entry.getValue().validate()) { return false; // not validate } if (entry.getKey().required && entry.getValue().getValue() == null) { } } return true; } private String formatDescription(String desc) { String prefix = "<html>"; final int LEN = desc.length(); if (LEN < MAX_DESCRIPTION_WIDTH) { return prefix + desc; } else { StringBuffer sb = new StringBuffer(prefix); StringTokenizer tokenizer = new StringTokenizer(desc); int n = 0; while (tokenizer.hasMoreTokens()) { String word = tokenizer.nextToken(); if (n + word.length() + 1 > MAX_DESCRIPTION_WIDTH) { sb.append("<br>"); n = 0; } sb.append(word); sb.append(' '); n += word.length() + 1; } return sb.toString(); } } }