/*************************************************** * * cismet GmbH, Saarbruecken, Germany * * ... and it just works. * ****************************************************/ package de.cismet.cismap.commons.wfsforms; import com.vividsolutions.jts.geom.Point; import org.jdom.Element; import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.HierarchyEvent; import java.awt.event.HierarchyListener; import java.io.IOException; import java.util.HashMap; import java.util.Vector; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JProgressBar; import de.cismet.cismap.commons.CrsTransformer; import de.cismet.cismap.commons.gui.MappingComponent; import de.cismet.cismap.commons.gui.piccolo.FixedPImage; import de.cismet.cismap.commons.interaction.CismapBroker; import de.cismet.cismap.commons.interaction.CrsChangeListener; import de.cismet.cismap.commons.interaction.events.CrsChangedEvent; /** * DOCUMENT ME! * * @author thorsten.hell@cismet.de * @version $Revision$, $Date$ */ public abstract class AbstractWFSForm extends JPanel implements CrsChangeListener { //~ Static fields/initializers --------------------------------------------- public static final int FEATURE_BORDER = 200; //~ Instance fields -------------------------------------------------------- protected HashMap<String, JComponent> listComponents = new HashMap<String, JComponent>(); protected HashMap<String, WFSFormQuery> queriesByComponentName = new HashMap<String, WFSFormQuery>(); protected ImageIcon mark = new javax.swing.ImageIcon(getClass().getResource( "/images/markPoint.png")); // NOI18N protected FixedPImage pMark = new FixedPImage(mark.getImage()); protected MappingComponent mappingComponent; Vector<ActionListener> actionListener = new Vector<ActionListener>(); private final java.util.Properties sweetSpotOfpMark = new java.util.Properties(); private final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(this.getClass()); private Vector<WFSFormQuery> queries = new Vector<WFSFormQuery>(); private final String loadingMessage = org.openide.util.NbBundle.getMessage( AbstractWFSForm.class, "AbstractWFSForm.loadingMessage"); // NOI18N private final String errorMessage = org.openide.util.NbBundle.getMessage( WFSFormsListAndComboBoxModel.class, "WFSFormsListAndComboBoxModel.errorMessage"); // NOI18N private WFSFormFeature lastFeature = null; private String title; private String id; private String menuString; private Icon icon; private String iconPath; private String className; private boolean inited = false; private String sorter = null; private WFSFormFeature lastVisualizedFeature = null; //~ Constructors ----------------------------------------------------------- /** * Creates a new AbstractWFSForm object. */ public AbstractWFSForm() { try { sweetSpotOfpMark.load(this.getClass().getResourceAsStream("/images/markPointSweetSpot.properties")); pMark.setSweetSpotX(Double.valueOf(sweetSpotOfpMark.getProperty("x", "0"))); pMark.setSweetSpotY(Double.valueOf(sweetSpotOfpMark.getProperty("y", "0"))); } catch (IOException iox) { log.warn("Problem when loading the markPointSweetSpot.properties", iox); } addHierarchyListener(new HierarchyListener() { @Override public void hierarchyChanged(final HierarchyEvent e) { if (!isInited() && isDisplayable()) { initWFSForm(); } } }); pMark.setVisible(false); } //~ Methods ---------------------------------------------------------------- /** * DOCUMENT ME! * * @param name DOCUMENT ME! * * @return DOCUMENT ME! */ public JComponent getListComponentByName(final String name) { return listComponents.get(name); } /** * DOCUMENT ME! */ public void initWFSForm() { try { inited = true; // do the initial loading of all queries that are INITIAL for (final WFSFormQuery q : queries) { if (log.isDebugEnabled()) { log.debug(title + "Components:" + listComponents); // NOI18N } queriesByComponentName.put(q.getComponentName(), q); if (q.getType().equals(WFSFormQuery.INITIAL) && listComponents.containsKey(q.getComponentName())) { final JComponent c = listComponents.get(q.getComponentName()); if (log.isDebugEnabled()) { log.debug("Comp: " + q.getComponentName()); // NOI18N } if (c instanceof JComboBox) { try { final JProgressBar bar = (JProgressBar)listComponents.get(q.getComponentName() + "Progress"); // NOI18N final WFSFormsListAndComboBoxModel w = new WFSFormsListAndComboBoxModel(q, c, bar); w.addActionListener(new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { fireActionPerformed(e); } }); ((JComboBox)c).setModel(w); } catch (Exception ex) { log.error("Error in initWFSForm", ex); // NOI18N } } else if (c instanceof JList) { try { final JProgressBar bar = (JProgressBar)listComponents.get(q.getComponentName() + "Progress"); // NOI18N final WFSFormsListAndComboBoxModel w = new WFSFormsListAndComboBoxModel(q, c, bar); w.addActionListener(new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { fireActionPerformed(e); } }); ((JList)c).setModel(w); } catch (Exception ex) { log.error("Error in initWFSForm", ex); // NOI18N } } } } } catch (Exception e) { log.error("Error during initWFSForm", e); // NOI18N } } /** * DOCUMENT ME! * * @param combo DOCUMENT ME! */ protected void checkCboCorrectness(final JComboBox combo) { final String itemString = String.valueOf(combo.getSelectedItem()).trim(); if ((combo.getSelectedItem() != null) && !itemString.equals("") && !itemString.equals(loadingMessage) && !itemString.equals(errorMessage) && (combo.getSelectedIndex() == -1)) { // NOI18N combo.getEditor().getEditorComponent().setBackground(Color.red); garbageDuringAutoCompletion(combo); } else { combo.getEditor().getEditorComponent().setBackground(Color.white); } } /** * DOCUMENT ME! * * @param box DOCUMENT ME! */ public abstract void garbageDuringAutoCompletion(JComboBox box); /** * DOCUMENT ME! * * @param component DOCUMENT ME! * @param replacingValues DOCUMENT ME! */ public void requestRefresh(final String component, final HashMap<String, String> replacingValues) { if (log.isDebugEnabled()) { log.debug("requestRefresh: Queries=" + queries); // NOI18N } for (final WFSFormQuery q : queries) { if (component.equals(q.getComponentName()) && listComponents.containsKey(q.getComponentName())) { final JComponent c = listComponents.get(q.getComponentName()); if (log.isDebugEnabled()) { log.debug("requestRefresh JComponent=" + c); // NOI18N } if (c instanceof JComboBox) { try { final JProgressBar bar = (JProgressBar)listComponents.get(q.getComponentName() + "Progress"); // NOI18N final WFSFormsListAndComboBoxModel model = new WFSFormsListAndComboBoxModel( q, replacingValues, c, bar); model.addActionListener(new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { fireActionPerformed(e); } }); ((JComboBox)c).setModel(model); } catch (Exception ex) { log.error("Error in requestRefresh", ex); // NOI18N } } else if (c instanceof JList) { try { final JProgressBar bar = (JProgressBar)listComponents.get(q.getComponentName() + "Progress"); // NOI18N final WFSFormsListAndComboBoxModel model = new WFSFormsListAndComboBoxModel( q, replacingValues, c, bar); model.addActionListener(new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { fireActionPerformed(e); } }); ((JList)c).setModel(model); } catch (Exception ex) { log.error("Error in requestRefresh", ex); // NOI18N } } } } } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public Element getElement() { final Element ret = new Element("wfsForm"); // NOI18N ret.setAttribute("id", getId()); // NOI18N ret.setAttribute("title", getTitle()); // NOI18N ret.setAttribute("icon", getIconPath()); // NOI18N ret.setAttribute("className", getClassName()); // NOI18N ret.setAttribute("menu", getMenuString()); // NOI18N for (final WFSFormQuery query : queries) { ret.addContent(query.getElement()); } return ret; } /** * DOCUMENT ME! * * @param component DOCUMENT ME! * @param value DOCUMENT ME! */ public void requestRefresh(final String component, final WFSFormFeature value) { if (log.isDebugEnabled()) { log.debug("requestRefresh(+" + component + "," + value + ")"); // NOI18N } if ((lastFeature == null) || !(value.getIdentifier().equals(lastFeature.getIdentifier()))) { lastFeature = value; final WFSFormQuery q = queriesByComponentName.get(component); if (q != null) { final HashMap<String, String> hm = new HashMap<String, String>(); hm.put(q.getQueryPlaceholder(), value.getIdentifier()); requestRefresh(component, hm); } } } /** * DOCUMENT ME! * * @param feature DOCUMENT ME! * @param showMarker DOCUMENT ME! */ public void visualizePosition(final WFSFormFeature feature, final boolean showMarker) { lastVisualizedFeature = feature; mappingComponent.getHighlightingLayer().removeAllChildren(); mappingComponent.getHighlightingLayer().addChild(pMark); mappingComponent.addStickyNode(pMark); final Point p = CrsTransformer.transformToGivenCrs(feature.getPosition(), mappingComponent.getMappingModel().getSrs().getCode()); final double x = mappingComponent.getWtst().getScreenX(p.getCoordinate().x); final double y = mappingComponent.getWtst().getScreenY(p.getCoordinate().y); pMark.setOffset(x, y); pMark.setVisible(showMarker); mappingComponent.rescaleStickyNodes(); CismapBroker.getInstance().removeCrsChangeListener(this); CismapBroker.getInstance().addCrsChangeListener(this); } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public Vector<WFSFormQuery> getQueries() { return queries; } /** * DOCUMENT ME! * * @param queries DOCUMENT ME! */ public void setQueries(final Vector<WFSFormQuery> queries) { this.queries = queries; } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public String getTitle() { return title; } /** * DOCUMENT ME! * * @param title DOCUMENT ME! */ public void setTitle(final String title) { this.title = title; } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public String getId() { return id; } /** * DOCUMENT ME! * * @param id DOCUMENT ME! */ public void setId(final String id) { this.id = id; } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public String getMenuString() { return menuString; } /** * DOCUMENT ME! * * @param menuString DOCUMENT ME! */ public void setMenuString(final String menuString) { this.menuString = menuString; } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public Icon getIcon() { return icon; } /** * DOCUMENT ME! * * @param icon DOCUMENT ME! */ public void setIcon(final Icon icon) { this.icon = icon; } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public boolean isInited() { return inited; } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public String getIconPath() { return iconPath; } /** * DOCUMENT ME! * * @param iconPath DOCUMENT ME! */ public void setIconPath(final String iconPath) { this.iconPath = iconPath; } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public String getClassName() { return className; } /** * DOCUMENT ME! * * @param className DOCUMENT ME! */ public void setClassName(final String className) { this.className = className; } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public MappingComponent getMappingComponent() { return mappingComponent; } /** * DOCUMENT ME! * * @param mappingComponent DOCUMENT ME! */ public void setMappingComponent(final MappingComponent mappingComponent) { this.mappingComponent = mappingComponent; mappingComponent.addStickyNode(pMark); } /** * DOCUMENT ME! * * @param a DOCUMENT ME! */ public void addActionListener(final ActionListener a) { actionListener.add(a); } /** * DOCUMENT ME! * * @param a DOCUMENT ME! */ public void removeActionListener(final ActionListener a) { actionListener.remove(a); } /** * DOCUMENT ME! * * @param e DOCUMENT ME! */ public void fireActionPerformed(final ActionEvent e) { for (final ActionListener a : actionListener) { a.actionPerformed(e); } } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public String getSorter() { return sorter; } @Override protected void finalize() throws Throwable { super.finalize(); CismapBroker.getInstance().removeCrsChangeListener(this); } /** * DOCUMENT ME! * * @param sorter DOCUMENT ME! */ public void setSorter(final String sorter) { this.sorter = sorter; } @Override public void crsChanged(final CrsChangedEvent event) { if (mappingComponent.getHighlightingLayer().getAllNodes().contains(pMark) && (lastVisualizedFeature != null)) { visualizePosition(lastVisualizedFeature, pMark.getVisible()); } } }