/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package de.cismet.cids.search;
import Sirius.navigator.actiontag.ActionTagProtected;
import Sirius.navigator.connection.SessionManager;
import Sirius.navigator.exception.ConnectionException;
import Sirius.navigator.search.dynamic.SearchControlPanel;
import Sirius.server.localserver.attribute.ClassAttribute;
import Sirius.server.localserver.attribute.MemberAttributeInfo;
import Sirius.server.middleware.types.MetaClass;
import Sirius.server.middleware.types.MetaObject;
import com.vividsolutions.jts.geom.Geometry;
import org.apache.log4j.Logger;
import org.openide.util.Exceptions;
import org.openide.util.Lookup;
import org.openide.util.NbBundle;
import java.awt.Component;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;
import java.util.Vector;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import javax.swing.DefaultListCellRenderer;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.ListSelectionModel;
import javax.swing.SwingUtilities;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.text.BadLocationException;
import de.cismet.cids.navigator.utils.ClassCacheMultiple;
import de.cismet.cids.server.search.CidsServerSearch;
import de.cismet.cids.server.search.MetaObjectNodeServerSearch;
import de.cismet.cids.server.search.builtin.DistinctValuesSearch;
import de.cismet.cids.server.search.builtin.QueryEditorSearch;
import de.cismet.cids.tools.search.clientstuff.CidsWindowSearch;
import de.cismet.cids.tools.search.clientstuff.CidsWindowSearchWithMenuEntry;
import de.cismet.cismap.commons.CrsTransformer;
import de.cismet.cismap.commons.XBoundingBox;
import de.cismet.cismap.commons.features.FeatureServiceFeature;
import de.cismet.cismap.commons.featureservice.AbstractFeatureService;
import de.cismet.cismap.commons.featureservice.FeatureServiceAttribute;
import de.cismet.cismap.commons.gui.layerwidget.ActiveLayerModel;
import de.cismet.cismap.commons.gui.layerwidget.ZoomToLayerWorker;
import de.cismet.cismap.commons.interaction.CismapBroker;
import de.cismet.cismap.commons.interaction.DefaultQueryButtonAction;
import de.cismet.cismap.commons.rasterservice.MapService;
import de.cismet.tools.gui.PaginationPanel;
/**
* DOCUMENT ME!
*
* @author mroncoroni
* @version $Revision$, $Date$
*/
@org.openide.util.lookup.ServiceProvider(service = CidsWindowSearch.class)
public class QuerySearch extends javax.swing.JPanel implements CidsWindowSearchWithMenuEntry,
ActionTagProtected,
ActionListener {
//~ Static fields/initializers ---------------------------------------------
private static transient Logger LOG = Logger.getLogger(QuerySearch.class);
public static final String PROP_ATTRIBUTES = "attributes"; // NOI18N
public static final String PROP_METACLASS = "metaclass";
public static final String PROP_VALUES = "values"; // NOI18N
public static final String PROP_SELECT_COMMAND = "selectCommand";
public static final String PROP_COUNT = "count";
public static final String ACTION_TAG = "navigator.querybuilder.searchdialogue@";
//~ Instance fields --------------------------------------------------------
ExecutorService threadPool = Executors.newCachedThreadPool();
private List<? extends Object> attributes;
private List<Object> values;
private String selectCommand;
private List<MetaClass> classes;
private List<AbstractFeatureService> services;
private List<Object> layers;
private Set<String> queryableValues;
private int count = 0;
private ActiveLayerModel model;
private ImageIcon iconSearch;
private ImageIcon iconCancel;
private String[] methodList;
private QuerySearchMethod[] additionalMethods;
private String currentlyExpandedAttribute;
private String searchButtonName = org.openide.util.NbBundle.getMessage(
QuerySearch.class,
"SearchControlPanel.btnSearchCancel.text");
private MetaClass metaClass;
private final boolean paginationEnabled;
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton btnSearchCancel;
private javax.swing.JList jAttributesLi;
private javax.swing.JLabel jCommandLb;
private javax.swing.JLabel jGeheZuLb;
private javax.swing.JButton jGetValuesBn;
private javax.swing.JComboBox jLayerCB;
private javax.swing.JLabel jLayerLb;
private javax.swing.JComboBox jMethodCB;
private javax.swing.JLabel jMethodLb;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JPanel jPanel4;
private javax.swing.JPanel jPanel6;
private javax.swing.JPanel jPanelTasten;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JScrollPane jScrollPane3;
private javax.swing.JTextField jTextField1;
private javax.swing.JList jValuesLi;
private javax.swing.JLabel jlEinzelwerteAnzeigen;
private org.jdesktop.swingx.JXBusyLabel lblBusyIcon;
private org.jdesktop.swingx.JXBusyLabel lblBusyValueIcon;
private javax.swing.JPanel panCommand;
private de.cismet.tools.gui.PaginationPanel panPagination;
private javax.swing.Box.Filler strGap;
private javax.swing.JTextArea taQuery;
private org.jdesktop.beansbinding.BindingGroup bindingGroup;
// End of variables declaration//GEN-END:variables
//~ Constructors -----------------------------------------------------------
/**
* Creates a new QuerySearch object.
*/
public QuerySearch() {
this(false);
}
/**
* Creates new form StandaloneStart.
*
* @param paginationEnabled DOCUMENT ME!
*/
public QuerySearch(final boolean paginationEnabled) {
this(null, new String[] { "de.cismet.cids.search.SearchQuerySearchMethod" }, paginationEnabled);
}
/**
* Creates a new QuerySearch object.
*
* @param model DOCUMENT ME!
* @param methodList DOCUMENT ME!
*/
public QuerySearch(final ActiveLayerModel model, final String[] methodList) {
this(model, methodList, false);
}
/**
* Creates a new QuerySearch object.
*
* @param model DOCUMENT ME!
* @param methodList DOCUMENT ME!
* @param choosenLayers DOCUMENT ME!
*/
public QuerySearch(final ActiveLayerModel model,
final String[] methodList,
final AbstractFeatureService[] choosenLayers) {
this(model, methodList, choosenLayers, null, false);
}
/**
* Creates new form StandaloneStart.
*
* @param model the layer model to be use
* @param methodList only the method of this list can be used, if they can be found by the lookup. If the
* methodList == null, all methods can be used
* @param paginationEnabled DOCUMENT ME!
*/
public QuerySearch(final ActiveLayerModel model, final String[] methodList, final boolean paginationEnabled) {
this(model, methodList, null, paginationEnabled);
}
/**
* Creates a new QuerySearch object.
*
* @param model the layer model to be use
* @param methodList only the method of this list can be used, if they can be found by the lookup. If the
* methodList == null, all methods can be used
* @param choosenLayers if choosenLayers is not null, only the layers from this list will be used
* @param additionalMethods additional methods, which can also be used
*/
public QuerySearch(final ActiveLayerModel model,
final String[] methodList,
final AbstractFeatureService[] choosenLayers,
final QuerySearchMethod[] additionalMethods) {
this(model, methodList, choosenLayers, additionalMethods, false);
}
/**
* Creates new form StandaloneStart.
*
* @param model the layer model to be use
* @param methodList only the method of this list can be used, if they can be found by the lookup. If the
* methodList == null, all methods can be used
* @param choosenLayers the available layers. If null, all layers from the model and all configured cids layer
* @param paginationEnabled will be available
*/
public QuerySearch(final ActiveLayerModel model,
final String[] methodList,
final AbstractFeatureService[] choosenLayers,
final boolean paginationEnabled) {
this(model, methodList, choosenLayers, null, paginationEnabled);
}
/**
* Creates new form StandaloneStart.
*
* @param model the layer model to be use
* @param methodList only the method of this list can be used, if they can be found by the lookup. If the
* methodList == null, all methods can be used
* @param choosenLayers the available layers. If null, all layers from the model and all configured cids layer
* will be available
* @param additionalMethods additional methods that should be used
* @param paginationEnabled DOCUMENT ME!
*/
public QuerySearch(final ActiveLayerModel model,
final String[] methodList,
final AbstractFeatureService[] choosenLayers,
final QuerySearchMethod[] additionalMethods,
final boolean paginationEnabled) {
this.model = model;
this.methodList = methodList;
this.additionalMethods = additionalMethods;
this.paginationEnabled = paginationEnabled;
if (choosenLayers == null) {
services = getFeatureServices(model);
classes = GetClasses();
layers = new ArrayList<Object>(services);
layers.addAll(classes);
} else {
layers = new ArrayList<Object>(Arrays.asList(choosenLayers));
services = new ArrayList<AbstractFeatureService>();
services.addAll(Arrays.asList(choosenLayers));
classes = new ArrayList<MetaClass>();
}
initComponents();
jMethodCB.setVisible((jMethodCB.getModel().getSize() > 1));
jMethodLb.setVisible((jMethodCB.getModel().getSize() > 1));
jGeheZuLb.setVisible(false);
jTextField1.setVisible(false);
jAttributesLi.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
jAttributesLi.addMouseListener(new MouseAdapterImpl());
jValuesLi.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
jValuesLi.addMouseListener(new MouseAdapterImpl());
jGetValuesBn.setEnabled(false);
jAttributesLi.addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(final ListSelectionEvent e) {
if (e.getValueIsAdjusting()) {
return;
}
if (!((attributes == null) || (jAttributesLi.getSelectedIndex() == -1))) {
final Object attributeObject = attributes.get(jAttributesLi.getSelectedIndex());
if (attributeObject instanceof MemberAttributeInfo) {
final MemberAttributeInfo attributeInfo = (MemberAttributeInfo)attributeObject;
if (queryableValues.contains(attributeInfo.getFieldName())) {
jGetValuesBn.setEnabled(true);
return;
}
} else if (attributeObject instanceof FeatureServiceAttribute) {
jGetValuesBn.setEnabled(true);
return;
}
}
jGetValuesBn.setEnabled(false);
}
});
jAttributesLi.setCellRenderer(new DefaultListCellRenderer() {
@Override
public Component getListCellRendererComponent(final JList<?> list,
final Object value,
final int index,
final boolean isSelected,
final boolean cellHasFocus) {
final Component component = super.getListCellRendererComponent(
list,
value,
index,
isSelected,
cellHasFocus); // To change body of generated methods, choose Tools | Templates.
final Object attributeObject = attributes.get(index);
if (attributeObject instanceof MemberAttributeInfo) {
final MemberAttributeInfo mai = (MemberAttributeInfo)attributeObject;
((JLabel)component).setText(mai.getFieldName());
((JLabel)component).setToolTipText(mai.getName());
}
return component;
}
});
if (classes.size() > 0) {
jLayerCB.setSelectedIndex(0);
}
if (getMethods().size() > 0) {
jMethodCB.setSelectedIndex(0);
}
jValuesLi.setCellRenderer(new DefaultListCellRenderer() {
@Override
public Component getListCellRendererComponent(final JList list,
final Object value,
final int index,
final boolean isSelected,
final boolean cellHasFocus) {
final Component c = super.getListCellRendererComponent(
list,
value,
index,
isSelected,
cellHasFocus);
if ((value instanceof MetaObject) && (c instanceof JLabel)) {
final MetaObject mo = (MetaObject)value;
((JLabel)c).setText(mo.getID() + " - " + mo.toString());
}
return c;
}
});
final URL iconSearchUrl = getClass().getResource(
"/Sirius/navigator/search/dynamic/SearchControlPanel_btnSearchCancel.png");
if (iconSearchUrl != null) {
this.iconSearch = new ImageIcon(iconSearchUrl);
} else {
this.iconSearch = new ImageIcon();
}
final URL iconCancelUrl = getClass().getResource(
"/Sirius/navigator/search/dynamic/SearchControlPanel_btnSearchCancel_cancel.png");
if (iconCancelUrl != null) {
this.iconCancel = new ImageIcon(iconCancelUrl);
} else {
this.iconCancel = new ImageIcon();
}
jLayerCBActionPerformed(null);
}
//~ Methods ----------------------------------------------------------------
/**
* Enables line wrap in the query text area.
*
* @param enabled true or false, if the line wrap should be enabled or disabled
*/
public void enableLineWrap(final boolean enabled) {
taQuery.setLineWrap(enabled);
taQuery.setWrapStyleWord(enabled);
}
@Override
public void actionPerformed(final ActionEvent e) {
if (e.getSource().equals(panPagination)) {
performSearch();
}
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public PaginationPanel getPanginationPanel() {
return panPagination;
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public MetaClass getMetaClass() {
return metaClass;
}
/**
* fills the buttons panel with the buttons from the seleced service.
*/
private void fillButtonPanel() {
final Object layer = jLayerCB.getSelectedItem();
List<DefaultQueryButtonAction> queryButtons;
int x = 0;
int y = 0;
jPanelTasten.removeAll();
if (layer instanceof AbstractFeatureService) {
queryButtons = ((AbstractFeatureService)layer).getQueryButtons();
} else {
queryButtons = AbstractFeatureService.SQL_QUERY_BUTTONS;
}
for (final DefaultQueryButtonAction buttonAction : queryButtons) {
final JButton button = new JButton(buttonAction.getText());
button.addActionListener(buttonAction);
final GridBagConstraints constraint = new GridBagConstraints(
x,
y,
buttonAction.getWidth(),
1,
1,
0,
GridBagConstraints.CENTER,
GridBagConstraints.HORIZONTAL,
new Insets(2, 2, 2, 2),
0,
0);
jPanelTasten.add(button, constraint);
buttonAction.setQueryTextArea(taQuery);
x += buttonAction.getWidth();
if (x > 5) {
x = 0;
++y;
}
}
jPanelTasten.invalidate();
jPanelTasten.revalidate();
jPanelTasten.repaint();
}
/**
* Retrieves all configured cids layer classes.
*
* @return DOCUMENT ME!
*/
private static List<MetaClass> GetClasses() {
final List<MetaClass> metaClassesWithAttribute = new LinkedList<MetaClass>();
try {
final MetaClass[] metaClass = SessionManager.getProxy()
.getClasses(SessionManager.getSession().getUser().getDomain());
for (final MetaClass mClass : metaClass) {
if (!mClass.getAttributeByName("Queryable").isEmpty()) {
metaClassesWithAttribute.add(mClass);
}
}
} catch (Exception e) {
LOG.error("Error while retrieving classes", e);
}
return metaClassesWithAttribute;
}
/**
* Retrieves all feature services from the model.
*
* @param model DOCUMENT ME!
*
* @return all feature services from the model
*/
private List<AbstractFeatureService> getFeatureServices(final ActiveLayerModel model) {
final List<AbstractFeatureService> list = new ArrayList<AbstractFeatureService>();
if (model != null) {
final TreeMap<Integer, MapService> map = model.getMapServices();
for (final Integer key : map.keySet()) {
final MapService service = map.get(key);
if (service instanceof AbstractFeatureService) {
list.add((AbstractFeatureService)service);
}
}
}
return list;
}
/**
* DOCUMENT ME!
*
* @param metaClass DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public static List<MemberAttributeInfo> getAttributesFromClass(final MetaClass metaClass) {
final HashMap map = metaClass.getMemberAttributeInfos();
final List<MemberAttributeInfo> attributes = new ArrayList<MemberAttributeInfo>(map.size());
for (final Object o : map.entrySet()) {
final MemberAttributeInfo mai = (MemberAttributeInfo)((java.util.Map.Entry)o).getValue();
if (!mai.isExtensionAttribute()) {
attributes.add(mai);
}
}
return attributes;
}
/**
* DOCUMENT ME!
*
* @param metaClass DOCUMENT ME!
* @param attribute DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
private static List<Object> GetValuesFromAttribute(final MetaClass metaClass, final MemberAttributeInfo attribute) {
final List<Object> values = new ArrayList<Object>();
try {
if (attribute.isForeignKey() && !attribute.isArray()) {
final MetaClass foreignClass = ClassCacheMultiple.getMetaClass(metaClass.getDomain(),
attribute.getForeignKeyClassId());
final String query = "select " + foreignClass.getID() + ", " + foreignClass.getPrimaryKey()
+ " from "
+ foreignClass.getTableName();
final MetaObject[] mos = SessionManager.getProxy()
.getMetaObjectByQuery(SessionManager.getSession().getUser(), query);
if (mos != null) {
values.addAll(Arrays.asList(mos));
}
} else {
final CidsServerSearch search = new DistinctValuesSearch(SessionManager.getSession().getUser()
.getDomain(),
metaClass.getTableName(),
attribute.getFieldName());
final Collection resultCollection = SessionManager.getProxy()
.customServerSearch(SessionManager.getSession().getUser(), search);
final ArrayList<ArrayList> resultArray = (ArrayList<ArrayList>)resultCollection;
if ((resultArray == null) || resultArray.isEmpty() || (resultArray.get(0).size() != 1)) {
return null;
}
for (final ArrayList attributes : resultArray) {
values.add(String.valueOf(attributes.get(0)));
}
}
} catch (ConnectionException e) {
Exceptions.printStackTrace(e);
}
return values;
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
private Vector<QuerySearchMethod> getMethods() {
final Collection<? extends QuerySearchMethod> searchMethods = Lookup.getDefault()
.lookupAll(QuerySearchMethod.class);
final Vector<QuerySearchMethod> methods = new Vector<QuerySearchMethod>();
if (methodList != null) {
Arrays.sort(methodList);
}
for (final QuerySearchMethod method : searchMethods) {
if ((methodList == null) || (Arrays.binarySearch(methodList, method.getClass().getName()) >= 0)) {
method.setQuerySearch(this);
methods.add(method);
}
}
if (additionalMethods != null) {
for (final QuerySearchMethod method : additionalMethods) {
method.setQuerySearch(this);
methods.add(method);
}
}
return methods;
}
/**
* DOCUMENT ME!
*
* @param metaClass DOCUMENT ME!
* @param whereClause DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
private static int GetCount(final MetaClass metaClass, final String whereClause) {
// int values = -1;
try {
final CidsServerSearch search = new QueryEditorSearch(SessionManager.getSession().getUser().getDomain(),
metaClass.getTableName(),
whereClause,
metaClass.getId());
final Collection resultCollection = SessionManager.getProxy()
.customServerSearch(SessionManager.getSession().getUser(), search);
final ArrayList<ArrayList> resultArray = (ArrayList<ArrayList>)resultCollection;
if (resultArray.size() != 1) {
return -1;
} else {
if (resultArray.get(0).size() != 1) {
return -1;
} else {
return (Integer)resultArray.get(0).get(0);
}
} /*
* if (resultArray == null || resultArray.size() == 0 || resultArray.get(0).size() != 1) { return 0; } for
* (ArrayList attributes : resultArray) { values.add(String.valueOf(attributes.get(0)));}*/
} catch (ConnectionException e) {
Exceptions.printStackTrace(e);
}
return -1;
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public List<? extends Object> getAttributes() {
return attributes;
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public List<Object> getValues() {
return values;
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public String getSelectCommand() {
return selectCommand;
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public int getCount() {
return count;
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
@Override
public String getName() {
return NbBundle.getMessage(QuerySearch.class, "QuerySearch.getName()");
}
/**
* DOCUMENT ME!
*
* @param str DOCUMENT ME!
*/
private void AppendString(String str) {
// jTextArea1.append(str + " ");
if ((taQuery.getText() != null) && !taQuery.getText().isEmpty()) {
try {
if (!taQuery.getText(taQuery.getCaretPosition() - 1, 1).contains("(")) {
str = " " + str;
}
} catch (BadLocationException ex) {
LOG.error("Error while appending string", ex);
str = " " + str;
}
}
taQuery.insert(str, taQuery.getCaretPosition());
}
/**
* 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.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
java.awt.GridBagConstraints gridBagConstraints;
bindingGroup = new org.jdesktop.beansbinding.BindingGroup();
jLayerLb = new javax.swing.JLabel();
jLayerCB = new javax.swing.JComboBox();
jMethodLb = new javax.swing.JLabel();
jMethodCB = new javax.swing.JComboBox();
jScrollPane1 = new javax.swing.JScrollPane();
jAttributesLi = new javax.swing.JList();
jScrollPane2 = new javax.swing.JScrollPane();
jValuesLi = new javax.swing.JList();
jPanelTasten = new javax.swing.JPanel();
jScrollPane3 = new javax.swing.JScrollPane();
taQuery = new javax.swing.JTextArea();
jCommandLb = new javax.swing.JLabel();
jGetValuesBn = new javax.swing.JButton();
jGeheZuLb = new javax.swing.JLabel();
jTextField1 = new javax.swing.JTextField();
panCommand = new javax.swing.JPanel();
jPanel2 = new javax.swing.JPanel();
lblBusyIcon = new org.jdesktop.swingx.JXBusyLabel(new java.awt.Dimension(20, 20));
strGap = new javax.swing.Box.Filler(new java.awt.Dimension(5, 0),
new java.awt.Dimension(5, 25),
new java.awt.Dimension(5, 32767));
btnSearchCancel = new javax.swing.JButton();
jPanel6 = new javax.swing.JPanel();
jPanel4 = new javax.swing.JPanel();
jPanel1 = new javax.swing.JPanel();
lblBusyValueIcon = new org.jdesktop.swingx.JXBusyLabel(new java.awt.Dimension(20, 20));
jlEinzelwerteAnzeigen = new javax.swing.JLabel();
panPagination = new de.cismet.tools.gui.PaginationPanel(this);
setLayout(new java.awt.GridBagLayout());
jLayerLb.setText(org.openide.util.NbBundle.getMessage(QuerySearch.class, "QuerySearch.jLayerLb.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(5, 8, 5, 5);
add(jLayerLb, gridBagConstraints);
jLayerCB.setModel(new javax.swing.DefaultComboBoxModel(layers.toArray()));
jLayerCB.addItemListener(new java.awt.event.ItemListener() {
@Override
public void itemStateChanged(final java.awt.event.ItemEvent evt) {
jLayerCBItemStateChanged(evt);
}
});
jLayerCB.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(final java.awt.event.ActionEvent evt) {
jLayerCBActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 0;
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
add(jLayerCB, gridBagConstraints);
jMethodLb.setText(org.openide.util.NbBundle.getMessage(QuerySearch.class, "QuerySearch.jMethodLb.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.weightx = 0.2;
gridBagConstraints.insets = new java.awt.Insets(5, 8, 5, 5);
add(jMethodLb, gridBagConstraints);
jMethodCB.setModel(new javax.swing.DefaultComboBoxModel(getMethods()));
jMethodCB.addItemListener(new java.awt.event.ItemListener() {
@Override
public void itemStateChanged(final java.awt.event.ItemEvent evt) {
jMethodCBItemStateChanged(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 1;
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.weightx = 0.75;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
add(jMethodCB, gridBagConstraints);
jScrollPane1.setMinimumSize(new java.awt.Dimension(258, 40));
jAttributesLi.setModel(new javax.swing.AbstractListModel() {
Object[] objects = {};
@Override
public int getSize() {
return objects.length;
}
@Override
public Object getElementAt(final int i) {
return objects[i];
}
});
jAttributesLi.setVisibleRowCount(0);
org.jdesktop.beansbinding.ELProperty eLProperty = org.jdesktop.beansbinding.ELProperty.create("${attributes}");
org.jdesktop.swingbinding.JListBinding jListBinding = org.jdesktop.swingbinding.SwingBindings
.createJListBinding(
org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE,
this,
eLProperty,
jAttributesLi,
"");
jListBinding.setDetailBinding(org.jdesktop.beansbinding.ELProperty.create("${name}"));
jListBinding.setSourceNullValue(null);
jListBinding.setSourceUnreadableValue(null);
bindingGroup.addBinding(jListBinding);
jScrollPane1.setViewportView(jAttributesLi);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
add(jScrollPane1, gridBagConstraints);
jScrollPane2.setMinimumSize(new java.awt.Dimension(258, 40));
jValuesLi.setModel(new javax.swing.AbstractListModel() {
Object[] objects = {};
@Override
public int getSize() {
return objects.length;
}
@Override
public Object getElementAt(final int i) {
return objects[i];
}
});
jValuesLi.setVisibleRowCount(0);
eLProperty = org.jdesktop.beansbinding.ELProperty.create("${values}");
jListBinding = org.jdesktop.swingbinding.SwingBindings.createJListBinding(
org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE,
this,
eLProperty,
jValuesLi);
bindingGroup.addBinding(jListBinding);
jScrollPane2.setViewportView(jValuesLi);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 4;
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
add(jScrollPane2, gridBagConstraints);
jPanelTasten.setLayout(new java.awt.GridBagLayout());
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 3;
gridBagConstraints.gridheight = 3;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
add(jPanelTasten, gridBagConstraints);
jScrollPane3.setMinimumSize(new java.awt.Dimension(262, 87));
taQuery.setColumns(20);
taQuery.setRows(5);
jScrollPane3.setViewportView(taQuery);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 7;
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
add(jScrollPane3, gridBagConstraints);
final org.jdesktop.beansbinding.Binding binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(
org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE,
this,
org.jdesktop.beansbinding.ELProperty.create("${selectCommand}"),
jCommandLb,
org.jdesktop.beansbinding.BeanProperty.create("text"));
bindingGroup.addBinding(binding);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 6;
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START;
add(jCommandLb, gridBagConstraints);
jGetValuesBn.setText(org.openide.util.NbBundle.getMessage(QuerySearch.class, "QuerySearch.jGetValuesBn.text")); // NOI18N
jGetValuesBn.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(final java.awt.event.ActionEvent evt) {
jGetValuesBnActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 5;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4);
add(jGetValuesBn, gridBagConstraints);
jGeheZuLb.setText(org.openide.util.NbBundle.getMessage(QuerySearch.class, "QuerySearch.jGeheZuLb.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 2;
gridBagConstraints.gridy = 5;
gridBagConstraints.weightx = 0.2;
gridBagConstraints.insets = new java.awt.Insets(0, 4, 0, 4);
add(jGeheZuLb, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 3;
gridBagConstraints.gridy = 5;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4);
add(jTextField1, gridBagConstraints);
panCommand.setLayout(new java.awt.GridBagLayout());
jPanel2.setMinimumSize(new java.awt.Dimension(125, 25));
jPanel2.setPreferredSize(new java.awt.Dimension(185, 25));
jPanel2.setLayout(new java.awt.GridBagLayout());
lblBusyIcon.setEnabled(false);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 0;
jPanel2.add(lblBusyIcon, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 2;
gridBagConstraints.gridy = 0;
jPanel2.add(strGap, gridBagConstraints);
btnSearchCancel.setText(org.openide.util.NbBundle.getMessage(
QuerySearch.class,
"SearchControlPanel.btnSearchCancel.text")); // NOI18N
btnSearchCancel.setToolTipText(org.openide.util.NbBundle.getMessage(
QuerySearch.class,
"SearchControlPanel.btnSearchCancel.toolTipText")); // NOI18N
btnSearchCancel.setMaximumSize(new java.awt.Dimension(100, 25));
btnSearchCancel.setMinimumSize(new java.awt.Dimension(100, 25));
btnSearchCancel.setPreferredSize(new java.awt.Dimension(100, 25));
btnSearchCancel.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(final java.awt.event.ActionEvent evt) {
btnSearchCancelActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 3;
gridBagConstraints.gridy = 0;
jPanel2.add(btnSearchCancel, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
jPanel2.add(jPanel6, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 0;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_END;
panCommand.add(jPanel2, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.weightx = 1.0;
panCommand.add(jPanel4, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 8;
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.insets = new java.awt.Insets(0, 0, 5, 5);
add(panCommand, gridBagConstraints);
jPanel1.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.LEFT));
lblBusyValueIcon.setEnabled(false);
jPanel1.add(lblBusyValueIcon);
jPanel1.add(jlEinzelwerteAnzeigen);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 3;
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
add(jPanel1, gridBagConstraints);
if (paginationEnabled) {
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 9;
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.insets = new java.awt.Insets(0, 0, 5, 0);
add(panPagination, gridBagConstraints);
}
bindingGroup.bind();
} // </editor-fold>//GEN-END:initComponents
/**
* DOCUMENT ME!
*
* @param metaClass DOCUMENT ME!
*/
private void setMetaClass(final MetaClass metaClass) {
final MetaClass old = this.metaClass;
this.metaClass = metaClass;
firePropertyChange(PROP_METACLASS, old, this.metaClass);
}
/**
* DOCUMENT ME!
*
* @param evt DOCUMENT ME!
*/
private void jLayerCBActionPerformed(final java.awt.event.ActionEvent evt) { //GEN-FIRST:event_jLayerCBActionPerformed
setMetaClass(null);
if (jLayerCB.getSelectedItem() instanceof MetaClass) {
setMetaClass((MetaClass)jLayerCB.getSelectedItem());
threadPool.submit(new Runnable() {
@Override
public void run() {
final ClassAttribute[] classAttributes = metaClass.getAttribs();
for (final ClassAttribute attribute : classAttributes) {
if ("Queryable".equals(attribute.getName())) {
queryableValues = attribute.getOptions().keySet();
break;
}
}
final List<MemberAttributeInfo> newAttributes = getAttributesFromClass(metaClass);
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
final List<? extends Object> old = attributes;
attributes = newAttributes;
if (attributes != old) {
firePropertyChange(PROP_ATTRIBUTES, old, attributes);
}
final String old2 = selectCommand;
selectCommand = String.format(
"SELECT * FROM %s WHERE",
jLayerCB.getSelectedItem().toString());
firePropertyChange(PROP_SELECT_COMMAND, old2, selectCommand);
}
});
}
});
} else if (jLayerCB.getSelectedItem() instanceof AbstractFeatureService) {
final AbstractFeatureService afs = (AbstractFeatureService)jLayerCB.getSelectedItem();
final Map<String, FeatureServiceAttribute> newAttribMap = afs.getFeatureServiceAttributes();
final List<FeatureServiceAttribute> newAttributes = new ArrayList<FeatureServiceAttribute>();
for (final String attr : (List<String>)afs.getOrderedFeatureServiceAttributes()) {
final FeatureServiceAttribute fsa = newAttribMap.get(attr);
if (attr != null) {
newAttributes.add(fsa);
}
}
if (afs.getCalculatedAttributes() != null) {
for (final String attrName : afs.getCalculatedAttributes()) {
for (int i = 0; i < newAttributes.size(); ++i) {
if (newAttributes.get(i).getName().equals(attrName)) {
newAttributes.remove(i);
break;
}
}
}
}
final List<? extends Object> old = attributes;
attributes = newAttributes;
if (attributes != old) {
firePropertyChange(PROP_ATTRIBUTES, old, attributes);
}
}
jlEinzelwerteAnzeigen.setText("");
final List<Object> old = values;
values = new LinkedList<Object>();
firePropertyChange(PROP_VALUES, old, values);
fillButtonPanel();
} //GEN-LAST:event_jLayerCBActionPerformed
/**
* DOCUMENT ME!
*
* @param evt DOCUMENT ME!
*/
private void jGetValuesBnActionPerformed(final java.awt.event.ActionEvent evt) { //GEN-FIRST:event_jGetValuesBnActionPerformed
if (jAttributesLi.getSelectedValue() == null) {
return;
}
final Object attributeObject = attributes.get(jAttributesLi.getSelectedIndex());
currentlyExpandedAttribute = "";
if (attributeObject instanceof MemberAttributeInfo) {
final MetaClass metaClass = (MetaClass)jLayerCB.getSelectedItem();
final MemberAttributeInfo attributeInfo = (MemberAttributeInfo)attributeObject;
threadPool.submit(new Runnable() {
@Override
public void run() {
lblBusyValueIcon.setEnabled(true);
lblBusyValueIcon.setBusy(true);
final List<Object> newValues = GetValuesFromAttribute(metaClass, attributeInfo);
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
final List<Object> old = values;
values = newValues;
lblBusyValueIcon.setEnabled(false);
lblBusyValueIcon.setBusy(false);
firePropertyChange(PROP_VALUES, old, values);
}
});
}
});
currentlyExpandedAttribute = attributeInfo.getName();
} else if (attributeObject instanceof FeatureServiceAttribute) {
lblBusyValueIcon.setEnabled(true);
lblBusyValueIcon.setBusy(true);
final AbstractFeatureService afs = (AbstractFeatureService)jLayerCB.getSelectedItem();
final FeatureServiceAttribute attributeInfo = (FeatureServiceAttribute)attributeObject;
jGetValuesBn.setEnabled(false);
threadPool.submit(new Runnable() {
@Override
public void run() {
List allFeatures;
try {
final Geometry g = ZoomToLayerWorker.getServiceBounds(afs);
XBoundingBox bounds = null;
if (g != null) {
bounds = new XBoundingBox(g);
String crs;
if (model != null) {
crs = model.getSrs().getCode();
} else {
crs = CismapBroker.getInstance().getSrs().getCode();
}
final CrsTransformer trans = new CrsTransformer(crs);
bounds = trans.transformBoundingBox(bounds);
}
allFeatures = afs.getFeatureFactory()
.createFeatures(afs.getQuery(), bounds, null, 0, 0, null);
} catch (Exception e) {
allFeatures = afs.getFeatureFactory().getLastCreatedFeatures();
}
final TreeSet set = new TreeSet();
for (final Object tmp : allFeatures) {
final FeatureServiceFeature tmpFeature = (FeatureServiceFeature)tmp;
final Object attrValue = tmpFeature.getProperty(attributeInfo.getName());
if (attrValue != null) {
set.add(attrValue);
}
}
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
final List<Object> old = values;
values = new ArrayList<Object>(set);
lblBusyValueIcon.setEnabled(false);
lblBusyValueIcon.setBusy(false);
jGetValuesBn.setEnabled(true);
firePropertyChange(PROP_VALUES, old, values);
}
});
}
});
currentlyExpandedAttribute = attributeInfo.getName();
}
jlEinzelwerteAnzeigen.setText(NbBundle.getMessage(
QuerySearch.class,
"QuerySearch.jGetValuesBnActionPerformed().jlEinzelwerteAnzeigen.text",
currentlyExpandedAttribute));
} //GEN-LAST:event_jGetValuesBnActionPerformed
/**
* DOCUMENT ME!
*
* @param evt DOCUMENT ME!
*/
private void btnSearchCancelActionPerformed(final java.awt.event.ActionEvent evt) { //GEN-FIRST:event_btnSearchCancelActionPerformed
if (panPagination.getParent() != null) {
panPagination.reset();
}
performSearch();
} //GEN-LAST:event_btnSearchCancelActionPerformed
/**
* DOCUMENT ME!
*/
private void performSearch() {
final QuerySearchMethod method = getSelectedMethod();
final Object layer = jLayerCB.getSelectedItem();
String query = taQuery.getText();
if (layer instanceof AbstractFeatureService) {
if (((AbstractFeatureService)layer).decorateLater()) {
query = ((AbstractFeatureService)layer).decorateQuery(query);
}
}
method.actionPerformed(jLayerCB.getSelectedItem(), query);
}
/**
* DOCUMENT ME!
*
* @param evt DOCUMENT ME!
*/
private void jMethodCBItemStateChanged(final java.awt.event.ItemEvent evt) { //GEN-FIRST:event_jMethodCBItemStateChanged
} //GEN-LAST:event_jMethodCBItemStateChanged
/**
* DOCUMENT ME!
*
* @param evt DOCUMENT ME!
*/
private void jLayerCBItemStateChanged(final java.awt.event.ItemEvent evt) { //GEN-FIRST:event_jLayerCBItemStateChanged
taQuery.setText("");
} //GEN-LAST:event_jLayerCBItemStateChanged
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public QuerySearchMethod getSelectedMethod() {
return (QuerySearchMethod)jMethodCB.getSelectedItem();
}
/**
* DOCUMENT ME!
*
* @param busy DOCUMENT ME!
*/
public void setBusy(final boolean busy) {
lblBusyIcon.setEnabled(busy);
lblBusyIcon.setBusy(busy);
}
@Override
public JComponent getSearchWindowComponent() {
return this;
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public String getWhereCause() {
return taQuery.getText();
}
@Override
public MetaObjectNodeServerSearch getServerSearch() {
final MetaClass metaClass = (MetaClass)jLayerCB.getSelectedItem();
if (panPagination.getParent() != null) {
return new QueryEditorSearch(SessionManager.getSession().getUser().getDomain(),
metaClass.getTableName(),
getWhereCause(),
metaClass.getId(),
panPagination.getPageSize(),
(panPagination.getPage() - 1)
* panPagination.getPageSize());
} else {
return new QueryEditorSearch(SessionManager.getSession().getUser().getDomain(),
metaClass.getTableName(),
taQuery.getText(),
metaClass.getId());
}
}
@Override
public ImageIcon getIcon() {
return new ImageIcon(this.getClass().getResource("/de/cismet/cids/search/binocular.png"));
}
@Override
public boolean checkActionTag() {
boolean result;
try {
result = SessionManager.getConnection()
.getConfigAttr(SessionManager.getSession().getUser(),
ACTION_TAG
+ SessionManager.getSession().getUser().getDomain())
!= null;
} catch (ConnectionException ex) {
LOG.error("Can not check ActionTag!", ex);
result = false;
}
return result;
}
/**
* Set the name of the search button.
*
* @param newName the new name of the search button
*/
public void setSearchButtonName(final String newName) {
searchButtonName = newName;
btnSearchCancel.setText(newName);
}
/**
* DOCUMENT ME!
*
* @param searching DOCUMENT ME!
*/
public void setControlsAccordingToState(final boolean searching) {
if (searching) {
btnSearchCancel.setText(org.openide.util.NbBundle.getMessage(
SearchControlPanel.class,
"SearchControlPanel.btnSearchCancel_cancel.text")); // NOI18N
btnSearchCancel.setToolTipText(org.openide.util.NbBundle.getMessage(
SearchControlPanel.class,
"SearchControlPanel.btnSearchCancel_cancel.toolTipText")); // NOI18N
btnSearchCancel.setIcon(iconCancel);
lblBusyIcon.setEnabled(true);
lblBusyIcon.setBusy(true);
panPagination.setEnabled(false);
} else {
btnSearchCancel.setText(searchButtonName); // NOI18N
btnSearchCancel.setToolTipText(org.openide.util.NbBundle.getMessage(
SearchControlPanel.class,
"SearchControlPanel.btnSearchCancel.toolTipText")); // NOI18N
btnSearchCancel.setIcon(iconSearch);
lblBusyIcon.setEnabled(false);
lblBusyIcon.setBusy(false);
panPagination.setEnabled(true);
}
}
//~ Inner Classes ----------------------------------------------------------
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
private class MouseAdapterImpl extends MouseAdapter {
//~ Constructors -------------------------------------------------------
/**
* Creates a new MouseAdapterImpl object.
*/
public MouseAdapterImpl() {
}
//~ Methods ------------------------------------------------------------
@Override
public void mouseClicked(final MouseEvent e) {
if (e.getClickCount() == 2) {
final JList source = ((JList)e.getSource());
Object selectedObject = source.getSelectedValue();
String value;
if (e.getSource() == jAttributesLi) {
selectedObject = attributes.get(jAttributesLi.getSelectedIndex());
} // TODO remove hack
if (selectedObject instanceof MemberAttributeInfo) {
if (((MemberAttributeInfo)selectedObject).getJavaclassname().equals(
com.vividsolutions.jts.geom.Geometry.class.getName())) {
value = "'" + ((MemberAttributeInfo)selectedObject).getFieldName() + "'";
} else {
value = ((MemberAttributeInfo)selectedObject).getFieldName();
}
} else {
final Object layer = jLayerCB.getSelectedItem();
if (layer instanceof AbstractFeatureService) {
if (source == jAttributesLi) {
final String v = ((FeatureServiceAttribute)selectedObject).getName();
if (((AbstractFeatureService)layer).decorateLater()) {
value = v;
} else {
value = ((AbstractFeatureService)layer).decoratePropertyName(v);
}
} else {
value = ((AbstractFeatureService)layer).decoratePropertyValue(
currentlyExpandedAttribute,
selectedObject.toString());
}
} else {
if (source == jAttributesLi) {
value = ((FeatureServiceAttribute)selectedObject).getName();
} else {
if (selectedObject instanceof MetaObject) {
value = String.valueOf(((MetaObject)selectedObject).getID());
} else {
value = "'" + selectedObject.toString() + "'";
}
}
}
}
AppendString(value);
}
}
}
}