/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
package de.cismet.cids.custom.switchon.objecteditors;
import Sirius.navigator.tools.MetaObjectChangeEvent;
import Sirius.navigator.tools.MetaObjectChangeSupport;
import Sirius.server.middleware.types.MetaObject;
import org.apache.log4j.Logger;
import org.jdesktop.swingx.JXErrorPane;
import org.jdesktop.swingx.error.ErrorInfo;
import org.openide.util.NbBundle;
import org.openide.util.WeakListeners;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import de.cismet.cids.custom.switchon.AbstractCidsBeanRenderer;
import de.cismet.cids.custom.switchon.MonitorstationContext;
import de.cismet.cids.custom.switchon.Variable;
import de.cismet.cids.editors.DefaultCustomObjectEditor;
import de.cismet.cids.editors.EditorClosedEvent;
import de.cismet.cids.editors.EditorSaveListener;
/**
* DOCUMENT ME!
*
* @author mscholl
* @version $Revision$, $Date$
*/
public class MonitorstationEditor extends AbstractCidsBeanRenderer implements EditorSaveListener {
//~ Static fields/initializers ---------------------------------------------
/** LOGGER. */
private static final transient Logger LOG = Logger.getLogger(MonitorstationEditor.class);
//~ Instance fields --------------------------------------------------------
private final transient CreateCtxListener ctxL;
private transient MetaObject oldMo;
// Variables declaration - do not modify//GEN-BEGIN:variables
private final transient javax.swing.JComboBox cboContext = new javax.swing.JComboBox();
private final transient de.cismet.cismap.cids.geometryeditor.DefaultCismapGeometryComboBoxEditor cboGeometry =
new de.cismet.cismap.cids.geometryeditor.DefaultCismapGeometryComboBoxEditor();
private final transient javax.swing.Box.Filler filler1 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 0),
new java.awt.Dimension(0, 0),
new java.awt.Dimension(32767, 0));
private final transient javax.swing.Box.Filler filler2 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 0),
new java.awt.Dimension(0, 0),
new java.awt.Dimension(0, 32767));
private final transient javax.swing.JLabel lblContext = new javax.swing.JLabel();
private final transient javax.swing.JLabel lblGeometry = new javax.swing.JLabel();
private final transient javax.swing.JLabel lblName = new javax.swing.JLabel();
private final transient javax.swing.JPanel pnlContent = new javax.swing.JPanel();
private final transient javax.swing.JPanel pnlVariables = new javax.swing.JPanel();
private final transient javax.swing.JTextField txtName = new javax.swing.JTextField();
private org.jdesktop.beansbinding.BindingGroup bindingGroup;
// End of variables declaration//GEN-END:variables
//~ Constructors -----------------------------------------------------------
/**
* Creates new form MonitorstationEditor.
*/
public MonitorstationEditor() {
this.ctxL = new CreateCtxListener();
initComponents();
initVariables();
initContext();
cboContext.addItemListener(WeakListeners.create(ItemListener.class, ctxL, cboContext));
}
//~ Methods ----------------------------------------------------------------
/**
* DOCUMENT ME!
*/
private void initVariables() {
final Variable[] vars = Variable.values();
final GridLayout varLayout = new GridLayout(Math.round(vars.length / 2.0f), 2, 5, 5);
pnlVariables.setLayout(varLayout);
for (final Variable var : vars) {
final VarCheckBox box = new VarCheckBox(var);
box.setContentAreaFilled(false);
box.addItemListener(WeakListeners.create(ItemListener.class, ctxL, cboContext));
pnlVariables.add(box);
}
}
/**
* DOCUMENT ME!
*/
private void initContext() {
cboContext.removeAllItems();
for (final MonitorstationContext context : MonitorstationContext.values()) {
if (context.isCSContext()) {
cboContext.addItem(context);
}
}
cboContext.setRenderer(new ContextRenderer());
}
/**
* 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();
setOpaque(false);
setLayout(new java.awt.GridBagLayout());
filler1.setMaximumSize(new java.awt.Dimension(32767, 0));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 0;
gridBagConstraints.weightx = 1.0;
add(filler1, gridBagConstraints);
filler2.setMaximumSize(new java.awt.Dimension(0, 32767));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.weighty = 1.0;
add(filler2, gridBagConstraints);
pnlContent.setOpaque(false);
pnlContent.setLayout(new java.awt.GridBagLayout());
lblName.setText(NbBundle.getMessage(MonitorstationEditor.class, "MonitorstationEditor.lblName.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
pnlContent.add(lblName, gridBagConstraints);
org.jdesktop.beansbinding.Binding binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(
org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE,
this,
org.jdesktop.beansbinding.ELProperty.create("${cidsBean.name}"),
txtName,
org.jdesktop.beansbinding.BeanProperty.create("text"));
bindingGroup.addBinding(binding);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 0;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
pnlContent.add(txtName, gridBagConstraints);
lblGeometry.setText(NbBundle.getMessage(MonitorstationEditor.class, "MonitorstationEditor.lblGeometry.text")); // NOI18N
lblGeometry.setName(NbBundle.getMessage(MonitorstationEditor.class, "MonitorstationEditor.lblGeometry.name")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
pnlContent.add(lblGeometry, gridBagConstraints);
cboGeometry.setName(NbBundle.getMessage(MonitorstationEditor.class, "MonitorstationEditor.cboGeometry.name")); // NOI18N
binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(
org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE,
this,
org.jdesktop.beansbinding.ELProperty.create("${cidsBean.geom}"),
cboGeometry,
org.jdesktop.beansbinding.BeanProperty.create("selectedItem"));
binding.setConverter(cboGeometry.getConverter());
bindingGroup.addBinding(binding);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
pnlContent.add(cboGeometry, gridBagConstraints);
pnlVariables.setBorder(javax.swing.BorderFactory.createTitledBorder(
NbBundle.getMessage(MonitorstationEditor.class, "MonitorstationEditor.pnlVariables.border.title"))); // NOI18N
pnlVariables.setToolTipText(NbBundle.getMessage(
MonitorstationEditor.class,
"MonitorstationEditor.pnlVariables.toolTipText")); // NOI18N
pnlVariables.setOpaque(false);
pnlVariables.setLayout(new java.awt.GridBagLayout());
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 3;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.weighty = 1.0;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
pnlContent.add(pnlVariables, gridBagConstraints);
lblContext.setText(NbBundle.getMessage(MonitorstationEditor.class, "MonitorstationEditor.lblContext.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
pnlContent.add(lblContext, gridBagConstraints);
cboContext.setModel(new javax.swing.DefaultComboBoxModel(
new String[] { "Air Quality", "Hydrology", "Rainfall" }));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
pnlContent.add(cboContext, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.insets = new java.awt.Insets(10, 10, 10, 10);
add(pnlContent, gridBagConstraints);
bindingGroup.bind();
} // </editor-fold>//GEN-END:initComponents
/**
* DOCUMENT ME!
*/
@Override
protected void init() {
oldMo = cidsBean.getMetaObject();
DefaultCustomObjectEditor.setMetaClassInformationToMetaClassStoreComponentsInBindingGroup(
bindingGroup,
cidsBean);
bindingGroup.unbind();
bindingGroup.bind();
initType();
}
/**
* DOCUMENT ME!
*/
private void initType() {
final String type = (String)cidsBean.getProperty("type"); // NOI18N
clearCheckboxes();
if (type != null) {
if ("R".equals(type)) {
LOG.warn("old monitor station type: " + cidsBean);
return;
}
final String[] split = type.split(":", 2); // NOI18N
assert split.length == 2 : "illegal type definition (token): " + type; // NOI18N
final String ctxKey = split[0];
boolean ctxSet = false;
for (final MonitorstationContext context : MonitorstationContext.values()) {
if (context.getKey().equals(ctxKey)) {
cboContext.setSelectedItem(context);
ctxSet = true;
break;
}
}
assert ctxSet : "illegal type definition (context): " + type; // NOI18N
final String[] vars = split[1].split(","); // NOI18N
for (final String var : vars) {
setVarSelected(Variable.getVariable(var), true);
}
}
}
/**
* DOCUMENT ME!
*
* @param var DOCUMENT ME!
* @param selected DOCUMENT ME!
*
* @return DOCUMENT ME!
*
* @throws IllegalArgumentException DOCUMENT ME!
*/
private boolean setVarSelected(final Variable var, final boolean selected) {
for (final Component c : pnlVariables.getComponents()) {
if (c instanceof VarCheckBox) {
final VarCheckBox box = (VarCheckBox)c;
if (box.getVar().equals(var)) {
box.setSelected(selected);
return true;
}
}
}
throw new IllegalArgumentException("var not present: " + var); // NOI18N
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
private List<Variable> getSelectedVars() {
final List<Variable> vars = new ArrayList<Variable>();
for (final Component c : pnlVariables.getComponents()) {
if (c instanceof VarCheckBox) {
final VarCheckBox box = (VarCheckBox)c;
if (box.isSelected()) {
vars.add(box.getVar());
}
}
}
return vars;
}
/**
* DOCUMENT ME!
*/
private void clearCheckboxes() {
for (final Component c : pnlVariables.getComponents()) {
if (c instanceof JCheckBox) {
final JCheckBox box = (JCheckBox)c;
box.setSelected(false);
}
}
}
/**
* DOCUMENT ME!
*
* @param event DOCUMENT ME!
*/
@Override
public void editorClosed(final EditorClosedEvent event) {
if (EditorSaveStatus.SAVE_SUCCESS == event.getStatus()) {
final MetaObject newMo = event.getSavedBean().getMetaObject();
// FIXME: this is not ok, the old mo is currently not present anymore, however, in our case everything
// works as expected
if (LOG.isDebugEnabled()) {
LOG.debug("old metaobject id = " + oldMo.getID()); // NOI18N
}
if (oldMo.getID() < 0) {
final MetaObjectChangeEvent moce = new MetaObjectChangeEvent(this, null, newMo);
MetaObjectChangeSupport.getDefault().fireMetaObjectAdded(moce);
} else {
final MetaObjectChangeEvent moce = new MetaObjectChangeEvent(this, oldMo, newMo);
MetaObjectChangeSupport.getDefault().fireMetaObjectChanged(moce);
}
// TODO: soft refresh when the editor won't do a hard refresh anymore
}
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
@Override
public boolean prepareForSave() {
if (cboGeometry.getSelectedItem() == null) {
JOptionPane.showMessageDialog(
this,
"Please select a geometry",
"Missing geometry",
JOptionPane.INFORMATION_MESSAGE);
return false;
}
return true;
}
//~ Inner Classes ----------------------------------------------------------
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
private final class CreateCtxListener implements ItemListener {
//~ Methods ------------------------------------------------------------
@Override
public void itemStateChanged(final ItemEvent e) {
createCtx();
if ((e.getSource() instanceof JCheckBox) && (cidsBean.getProperty("type") == null)) {
// we have to use invoke later in the edt because the dialog would cause a selection event to be thrown
// again, resulting in a checkbox that cannot be deselected
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JOptionPane.showMessageDialog(
MonitorstationEditor.this,
"Please select at least one variable",
"Missing variable",
JOptionPane.INFORMATION_MESSAGE);
}
});
}
}
/**
* DOCUMENT ME!
*/
private void createCtx() {
final StringBuilder typeSb = new StringBuilder();
final MonitorstationContext mCtx = (MonitorstationContext)cboContext.getSelectedItem();
typeSb.append(mCtx.getKey());
typeSb.append(':');
final List<Variable> selectedVars = getSelectedVars();
if (selectedVars.isEmpty()) {
try {
cidsBean.setProperty("type", null); // NOI18N
} catch (final Exception ex) {
LOG.error("cannot set type string", ex); // NOI18N
final ErrorInfo info = new ErrorInfo(
"Error",
"Error while setting type property",
null,
"Error",
ex,
Level.SEVERE,
null);
JXErrorPane.showDialog(MonitorstationEditor.this, info);
}
return;
}
for (final Variable var : selectedVars) {
typeSb.append(var.getPropertyKey());
typeSb.append(',');
}
typeSb.deleteCharAt(typeSb.length() - 1);
try {
cidsBean.setProperty("type", typeSb.toString()); // NOI18N
} catch (final Exception ex) {
LOG.error("cannot set type string", ex); // NOI18N
final ErrorInfo info = new ErrorInfo(
"Error",
"Error while setting type property",
null,
"Error",
ex,
Level.SEVERE,
null);
JXErrorPane.showDialog(MonitorstationEditor.this, info);
}
}
}
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
private final class ContextRenderer extends DefaultListCellRenderer {
//~ Methods ------------------------------------------------------------
/**
* DOCUMENT ME!
*
* @param list DOCUMENT ME!
* @param value DOCUMENT ME!
* @param index DOCUMENT ME!
* @param isSelected DOCUMENT ME!
* @param cellHasFocus DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
@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 (c instanceof JLabel) {
final JLabel label = (JLabel)c;
final String name = ((MonitorstationContext)value).getLocalisedName();
label.setText(name);
}
return c;
}
}
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
public static final class VarCheckBox extends JCheckBox {
//~ Instance fields ----------------------------------------------------
private final transient Variable var;
//~ Constructors -------------------------------------------------------
/**
* Creates a new VarCheckBox object.
*
* @param var DOCUMENT ME!
*/
public VarCheckBox(final Variable var) {
super(var.getLocalisedName());
this.var = var;
}
//~ Methods ------------------------------------------------------------
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public Variable getVar() {
return var;
}
}
}