/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
/*
* LayerInfo.java
*
* Created on 16. Februar 2006, 13:58
*/
package de.cismet.cismap.commons.gui.infowidgets;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.ResourceBundle;
import javax.swing.DefaultComboBoxModel;
import de.cismet.cismap.commons.featureservice.WebFeatureService;
import de.cismet.cismap.commons.interaction.ActiveLayerListener;
import de.cismet.cismap.commons.interaction.CapabilityListener;
import de.cismet.cismap.commons.interaction.events.ActiveLayerEvent;
import de.cismet.cismap.commons.interaction.events.CapabilityEvent;
import de.cismet.cismap.commons.raster.wms.WMSLayer;
import de.cismet.cismap.commons.raster.wms.WMSServiceLayer;
import de.cismet.cismap.commons.wfs.capabilities.FeatureType;
import de.cismet.cismap.commons.wfs.capabilities.deegree.DeegreeFeatureType;
import de.cismet.cismap.commons.wms.capabilities.Layer;
/**
* DOCUMENT ME!
*
* @author thorsten.hell@cismet.de
* @version $Revision$, $Date$
*/
public class LayerInfo extends javax.swing.JPanel implements CapabilityListener, ActiveLayerListener {
//~ Static fields/initializers ---------------------------------------------
private static final String DE = "--DE"; // NOI18N
private static final String EN = "--EN"; // NOI18N
private static final String[] LANGUAGES = { DE, EN };
//~ Instance fields --------------------------------------------------------
// Variables declaration - do not modify
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel3;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JLabel lblFeatureInfo;
private javax.swing.JLabel lblName;
private javax.swing.JList lstSrs;
private javax.swing.JPanel panMain;
private javax.swing.JScrollPane scpAbstract;
private javax.swing.JSplitPane sppMain;
private javax.swing.JTextArea txtAbstract;
private final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(this.getClass());
private boolean splitPaneInitialized = false;
private ResourceBundle srsMapping = null;
private HashMap<String, String> srsMap = new HashMap<String, String>();
//~ Constructors -----------------------------------------------------------
/**
* Creates new form LayerInfo.
*/
public LayerInfo() {
initComponents();
sppMain.setDividerLocation(0.75d);
try {
srsMapping = ResourceBundle.getBundle("cismapCrsMapping", Locale.getDefault());
final Enumeration<String> en = srsMapping.getKeys();
while (en.hasMoreElements()) {
final String key = en.nextElement();
final String value = srsMapping.getString(key);
if (value != null) {
srsMap.put(key, value);
}
}
} catch (Exception e) {
log.error("Cannot open the resource bundle for the crs mapping.", e);
}
}
//~ Methods ----------------------------------------------------------------
@Override
public void serverChanged(final CapabilityEvent e) {
}
/**
* DOCUMENT ME!
*/
public void initDividerLocation() {
sppMain.setDividerLocation(0.75d);
}
@Override
public void layerChanged(final CapabilityEvent e) {
if (e.getCapabilityObject() instanceof Layer) {
setValues((Layer)e.getCapabilityObject());
} else if (e.getCapabilityObject() instanceof DeegreeFeatureType) {
setValues(((FeatureType)e.getCapabilityObject()));
}
}
/**
* This method is called from within the constructor to initialize the form. WARNING: Do NOT modify this code. The
* content of this method is always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
jLabel1 = new javax.swing.JLabel();
panMain = new javax.swing.JPanel();
sppMain = new javax.swing.JSplitPane();
jPanel1 = new javax.swing.JPanel();
scpAbstract = new javax.swing.JScrollPane();
txtAbstract = new javax.swing.JTextArea();
lblName = new javax.swing.JLabel();
jPanel2 = new javax.swing.JPanel();
jLabel3 = new javax.swing.JLabel();
lblFeatureInfo = new javax.swing.JLabel();
jScrollPane2 = new javax.swing.JScrollPane();
lstSrs = new javax.swing.JList();
jLabel1.setText(null);
setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1));
addComponentListener(new java.awt.event.ComponentAdapter() {
@Override
public void componentResized(final java.awt.event.ComponentEvent evt) {
formComponentResized(evt);
}
@Override
public void componentShown(final java.awt.event.ComponentEvent evt) {
formComponentShown(evt);
}
});
setLayout(new java.awt.BorderLayout());
panMain.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
panMain.setLayout(new java.awt.BorderLayout());
sppMain.setDividerLocation(200);
sppMain.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT);
sppMain.setResizeWeight(0.5);
jPanel1.setLayout(new java.awt.BorderLayout());
scpAbstract.setBorder(javax.swing.BorderFactory.createEmptyBorder(2, 2, 2, 2));
scpAbstract.setViewportBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1));
txtAbstract.setBackground(panMain.getBackground());
txtAbstract.setColumns(20);
txtAbstract.setLineWrap(true);
txtAbstract.setRows(3);
txtAbstract.setWrapStyleWord(true);
scpAbstract.setViewportView(txtAbstract);
jPanel1.add(scpAbstract, java.awt.BorderLayout.CENTER);
lblName.setFont(new java.awt.Font("Tahoma", 1, 14));
lblName.setText(null);
jPanel1.add(lblName, java.awt.BorderLayout.PAGE_START);
sppMain.setTopComponent(jPanel1);
jPanel2.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1));
jLabel3.setText(null);
lblFeatureInfo.setFont(new java.awt.Font("DejaVu Sans", 1, 13)); // NOI18N
lblFeatureInfo.setIcon(new javax.swing.ImageIcon(
getClass().getResource("/de/cismet/cismap/commons/gui/capabilitywidget/res/layerInfo.png"))); // NOI18N
lblFeatureInfo.setText(org.openide.util.NbBundle.getMessage(LayerInfo.class, "lblFeatureInfo.text")); // NOI18N
lstSrs.setBackground(panMain.getBackground());
jScrollPane2.setViewportView(lstSrs);
final org.jdesktop.layout.GroupLayout jPanel2Layout = new org.jdesktop.layout.GroupLayout(jPanel2);
jPanel2.setLayout(jPanel2Layout);
jPanel2Layout.setHorizontalGroup(
jPanel2Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING).add(0, 420, Short.MAX_VALUE).add(
jPanel2Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING).add(
org.jdesktop.layout.GroupLayout.TRAILING,
jPanel2Layout.createSequentialGroup().addContainerGap().add(
jPanel2Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING).add(
jScrollPane2,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
408,
Short.MAX_VALUE).add(
jPanel2Layout.createSequentialGroup().add(lblFeatureInfo).addPreferredGap(
org.jdesktop.layout.LayoutStyle.RELATED,
174,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)).add(
jLabel3,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
408,
Short.MAX_VALUE)).addContainerGap())));
jPanel2Layout.setVerticalGroup(
jPanel2Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING).add(0, 226, Short.MAX_VALUE).add(
jPanel2Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING).add(
jPanel2Layout.createSequentialGroup().addContainerGap().add(lblFeatureInfo).addPreferredGap(
org.jdesktop.layout.LayoutStyle.RELATED).add(jLabel3).addPreferredGap(
org.jdesktop.layout.LayoutStyle.RELATED).add(
jScrollPane2,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
173,
Short.MAX_VALUE).addContainerGap())));
sppMain.setRightComponent(jPanel2);
panMain.add(sppMain, java.awt.BorderLayout.CENTER);
add(panMain, java.awt.BorderLayout.CENTER);
} // </editor-fold>//GEN-END:initComponents
/**
* DOCUMENT ME!
*
* @param evt DOCUMENT ME!
*/
private void formComponentShown(final java.awt.event.ComponentEvent evt) { //GEN-FIRST:event_formComponentShown
} //GEN-LAST:event_formComponentShown
/**
* DOCUMENT ME!
*
* @param evt DOCUMENT ME!
*/
private void formComponentResized(final java.awt.event.ComponentEvent evt) { //GEN-FIRST:event_formComponentResized
} //GEN-LAST:event_formComponentResized
/**
* End of variables declaration.
*
* @param layer DOCUMENT ME!
*/
private void setValues(final Layer layer) {
final Values v = new Values();
try {
v.title = layer.getTitle();
} catch (Exception e) {
}
try {
v.name = layer.getName();
} catch (Exception e) {
}
try {
v.description = layer.getAbstract();
} catch (Exception e) {
}
try {
v.featureInfo = layer.isQueryable();
} catch (Exception e) {
}
try {
v.srs = layer.getSrs();
} catch (Exception e) {
}
setValues(v);
}
/**
* DOCUMENT ME!
*
* @param feature DOCUMENT ME!
*/
private void setValues(final FeatureType feature) {
final Values v = new Values();
try {
v.title = feature.getTitle();
} catch (Exception e) {
}
try {
v.name = feature.getName().getPrefix() + ":" + feature.getName().getLocalPart();
} catch (Exception e) {
}
try {
v.description = feature.getAbstract();
} catch (Exception e) {
}
v.featureInfo = false;
try {
v.srs = feature.getSupportedSRS();
if ((feature.getDefaultSRS() != null) && !contains(v.srs, feature.getDefaultSRS())) {
if (v.srs == null) {
v.srs = new String[0];
}
final String[] tmp = new String[v.srs.length + 1];
System.arraycopy(v.srs, 0, tmp, 0, v.srs.length);
tmp[v.srs.length] = feature.getDefaultSRS();
v.srs = tmp;
}
} catch (Exception e) {
}
setValues(v);
}
/**
* DOCUMENT ME!
*
* @param ar DOCUMENT ME!
* @param val DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
private boolean contains(final String[] ar, final String val) {
if (ar == null) {
return false;
}
for (final String tmp : ar) {
if (tmp.equals(val)) {
return true;
}
}
return false;
}
/**
* DOCUMENT ME!
*
* @param v DOCUMENT ME!
*/
private void setValues(final Values v) {
if (v.title != null) {
lblName.setText(v.title);
} else {
lblName.setText("-"); // NOI18N
}
if (v.name != null) {
lblName.setToolTipText(v.name);
} else {
lblName.setToolTipText(null);
}
if ((v.description != null) && (v.description.length() > 0)) {
scpAbstract.setVisible(true);
final String s = v.description;
txtAbstract.setText(getGDILanguageString(v.description));
} else {
scpAbstract.setVisible(false);
}
lblFeatureInfo.setEnabled(v.featureInfo);
if ((v.srs != null) && (v.srs.length > 0)) {
final List<String> srs = new ArrayList<String>();
lstSrs.setVisible(true);
for (String s : v.srs) {
s = getSrsDescription(s);
if (!srs.contains(s)) {
srs.add(s);
}
}
lstSrs.setModel(new DefaultComboBoxModel(srs.toArray()));
} else {
lstSrs.setVisible(false);
}
}
/**
* DOCUMENT ME!
*
* @param srs DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
private String getSrsDescription(final String srs) {
final String srsName = srsMap.get(srs);
if (srsName != null) {
return srs + " (" + srsName + ")";
}
return srs;
}
@Override
public void layerVisibilityChanged(final ActiveLayerEvent e) {
}
@Override
public void layerAvailabilityChanged(final ActiveLayerEvent e) {
}
@Override
public void layerSelectionChanged(final ActiveLayerEvent e) {
if (e.getLayer() instanceof WMSServiceLayer) {
final List v = ((WMSServiceLayer)e.getLayer()).getWMSLayers();
if (v.size() == 1) {
final Object o = v.get(0);
if (o instanceof WMSLayer) {
setValues(((WMSLayer)o).getOgcCapabilitiesLayer());
}
}
} else if (e.getLayer() instanceof WebFeatureService) {
setValues(((WebFeatureService)e.getLayer()).getFeature());
}
}
@Override
public void layerRemoved(final ActiveLayerEvent e) {
}
@Override
public void layerPositionChanged(final ActiveLayerEvent e) {
}
@Override
public void layerInformationStatusChanged(final ActiveLayerEvent e) {
}
@Override
public void layerAdded(final ActiveLayerEvent e) {
}
/**
* DOCUMENT ME!
*
* @param text DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public String getGDILanguageString(final String text) {
String ret = ""; // NOI18N
try {
for (final String lan : LANGUAGES) {
if (text.contains(lan)) {
final int from = text.indexOf(lan);
int to = text.indexOf("--", from + lan.length()); // NOI18N
if (from < 0) {
break;
}
if (to < 0) {
to = text.length();
}
ret = text.substring(from + lan.length(), to);
return ret.trim();
}
}
return text;
} catch (Exception e) {
log.warn("Error while checking the GDI String", e); // NOI18N
return text;
}
}
//~ Inner Classes ----------------------------------------------------------
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
class Values {
//~ Instance fields ----------------------------------------------------
String title;
String name;
String description;
boolean featureInfo;
String[] srs;
}
}