/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
package de.cismet.cids.custom.switchon.objecteditors;
import Sirius.server.middleware.types.LightweightMetaObject;
import Sirius.server.middleware.types.MetaObject;
import org.openide.util.NbBundle;
import java.util.ArrayList;
import java.util.List;
import javax.swing.DefaultListModel;
import javax.swing.RowFilter;
import javax.swing.event.ListSelectionEvent;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;
import de.cismet.cids.custom.switchon.gui.InfoProviderJPanel;
import de.cismet.cids.custom.switchon.gui.utils.QueryComboBox;
import de.cismet.cids.custom.switchon.gui.utils.RendererTools;
import de.cismet.cids.custom.switchon.gui.utils.TagsJList;
import de.cismet.cids.custom.switchon.utils.TagUtils;
import de.cismet.cids.custom.switchon.utils.TaggroupUtils;
import de.cismet.cids.custom.switchon.utils.Taggroups;
import de.cismet.cids.dynamics.CidsBean;
import de.cismet.cids.dynamics.CidsBeanStore;
import de.cismet.cids.dynamics.Disposable;
import de.cismet.tools.gui.StaticSwingTools;
/**
* AdditionalTagsPanel allows it to choose a taggroup and assign tags from that to a cidsBean. It makes it also possible
* to create new tags of that taggroup. The selectable taggroups have to be determined in the constructor. Furthermore
* the GUI can be branded via the NbBundle, this means that the JLabels are different depending on the use of the GUI.
*
* @author Gilles Baatz
* @version $Revision$, $Date$
*/
public class AdditionalTagsPanel extends InfoProviderJPanel implements CidsBeanStore, Disposable {
//~ Static fields/initializers ---------------------------------------------
private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(AdditionalTagsPanel.class);
public static final String BRANDING_NONE = null;
public static final String BRANDING_KEYWORDS = "keywords";
//~ Instance fields --------------------------------------------------------
public final String branding;
private CidsBean cidsBean;
/** The query for the combobox containing the Taggroups. */
private final String tagGroupQuery;
private List<CidsBean> assignedTags = new ArrayList<CidsBean>();
private List<Taggroups> allowedTaggroups;
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton btnAdd;
private javax.swing.JButton btnNew;
private javax.swing.JButton btnRemove;
private javax.swing.JComboBox cmbTagGroups;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JPanel jPanel3;
private javax.swing.JPanel jPanel4;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane3;
private javax.swing.JList lstTags;
private javax.swing.JTable tblAssignedTags;
private org.jdesktop.beansbinding.BindingGroup bindingGroup;
// End of variables declaration//GEN-END:variables
//~ Constructors -----------------------------------------------------------
/**
* Creates a new AdditionalTagsPanel object.
*/
public AdditionalTagsPanel() {
this(null, BRANDING_NONE);
}
/**
* Creates a new AdditionalTagsPanel object.
*
* @param allowedTaggroups DOCUMENT ME!
*/
public AdditionalTagsPanel(final List<Taggroups> allowedTaggroups) {
this(allowedTaggroups, BRANDING_NONE);
}
/**
* Creates new form AdditionalTagsPanel.
*
* @param allowedTaggroups DOCUMENT ME!
* @param branding DOCUMENT ME!
*/
public AdditionalTagsPanel(final List<Taggroups> allowedTaggroups, final String branding) {
this.branding = branding;
this.allowedTaggroups = allowedTaggroups;
String tagGroupQuery = "SELECT t.ID,"
+ " t.NAME"
+ " FROM taggroup t";
if ((allowedTaggroups == null) || allowedTaggroups.isEmpty()) {
tagGroupQuery += " WHERE FALSE ";
} else {
tagGroupQuery += " WHERE t.name ilike '" + allowedTaggroups.get(0).getValue() + "' ";
for (int i = 1; i < allowedTaggroups.size(); i++) {
tagGroupQuery += " OR t.name ilike '" + allowedTaggroups.get(i).getValue() + "' ";
}
}
tagGroupQuery += " ORDER BY t.name";
if (LOG.isDebugEnabled()) {
LOG.debug("tagGroupQuery created: " + tagGroupQuery);
}
this.tagGroupQuery = tagGroupQuery;
NbBundle.setBranding(branding);
initComponents();
NbBundle.setBranding(null);
if ((allowedTaggroups == null) || allowedTaggroups.isEmpty()) {
cmbTagGroups.setEnabled(false);
lstTags.setEnabled(false);
btnAdd.setEnabled(false);
btnNew.setEnabled(false);
btnRemove.setEnabled(false);
} else {
changeListModelToSelectedTaggroup();
}
tblAssignedTags.getSelectionModel().addListSelectionListener(
new javax.swing.event.ListSelectionListener() {
@Override
public void valueChanged(final ListSelectionEvent evt) {
customRowSelectionEventHandler(evt);
}
});
}
//~ Methods ----------------------------------------------------------------
/**
* 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();
jLabel1 = new javax.swing.JLabel();
jLabel2 = new javax.swing.JLabel();
jPanel4 = new javax.swing.JPanel();
jPanel3 = new javax.swing.JPanel();
jScrollPane1 = new javax.swing.JScrollPane();
lstTags = new TagsJList();
;
cmbTagGroups = new QueryComboBox(tagGroupQuery, false, "Taggroup");
;
// ugly and dirty hack to select the X-CUAHSI Keyword group
if (this.cmbTagGroups.getModel().getSize() > 1) {
this.cmbTagGroups.setSelectedIndex(
this.cmbTagGroups.getModel().getSize()
- 1);
}
jPanel2 = new javax.swing.JPanel();
jLabel3 = new javax.swing.JLabel();
jPanel1 = new javax.swing.JPanel();
btnAdd = new javax.swing.JButton();
btnNew = new javax.swing.JButton();
btnRemove = new javax.swing.JButton();
jScrollPane3 = new javax.swing.JScrollPane();
tblAssignedTags = new javax.swing.JTable();
setBorder(javax.swing.BorderFactory.createTitledBorder(
org.openide.util.NbBundle.getMessage(AdditionalTagsPanel.class, "AdditionalTagsPanel.border.title"))); // NOI18N
setOpaque(false);
setLayout(new java.awt.GridBagLayout());
org.openide.awt.Mnemonics.setLocalizedText(
jLabel1,
org.openide.util.NbBundle.getMessage(AdditionalTagsPanel.class, "AdditionalTagsPanel.jLabel1.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.gridheight = 2;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(10, 10, 5, 5);
add(jLabel1, gridBagConstraints);
org.openide.awt.Mnemonics.setLocalizedText(
jLabel2,
org.openide.util.NbBundle.getMessage(AdditionalTagsPanel.class, "AdditionalTagsPanel.jLabel2.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(5, 10, 5, 5);
add(jLabel2, gridBagConstraints);
jPanel4.setOpaque(false);
jPanel4.setLayout(new java.awt.GridLayout(1, 0));
jPanel3.setOpaque(false);
jPanel3.setLayout(new java.awt.GridBagLayout());
lstTags.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
@Override
public void valueChanged(final javax.swing.event.ListSelectionEvent evt) {
lstTagsValueChanged(evt);
}
});
jScrollPane1.setViewportView(lstTags);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
gridBagConstraints.gridheight = 3;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 10, 5);
jPanel3.add(jScrollPane1, gridBagConstraints);
cmbTagGroups.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(final java.awt.event.ActionEvent evt) {
cmbTagGroupsActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.gridheight = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(10, 5, 5, 5);
jPanel3.add(cmbTagGroups, gridBagConstraints);
jPanel4.add(jPanel3);
jPanel2.setOpaque(false);
jPanel2.setLayout(new java.awt.GridBagLayout());
org.openide.awt.Mnemonics.setLocalizedText(
jLabel3,
org.openide.util.NbBundle.getMessage(AdditionalTagsPanel.class, "AdditionalTagsPanel.jLabel3.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(10, 5, 5, 5);
jPanel2.add(jLabel3, gridBagConstraints);
jPanel1.setOpaque(false);
jPanel1.setLayout(new java.awt.GridBagLayout());
org.openide.awt.Mnemonics.setLocalizedText(
btnAdd,
org.openide.util.NbBundle.getMessage(AdditionalTagsPanel.class, "AdditionalTagsPanel.btnAdd.text")); // NOI18N
btnAdd.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(final java.awt.event.ActionEvent evt) {
btnAddActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
jPanel1.add(btnAdd, gridBagConstraints);
org.openide.awt.Mnemonics.setLocalizedText(
btnNew,
org.openide.util.NbBundle.getMessage(AdditionalTagsPanel.class, "AdditionalTagsPanel.btnNew.text")); // NOI18N
btnNew.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(final java.awt.event.ActionEvent evt) {
btnNewActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 0;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
jPanel1.add(btnNew, gridBagConstraints);
org.openide.awt.Mnemonics.setLocalizedText(
btnRemove,
org.openide.util.NbBundle.getMessage(AdditionalTagsPanel.class, "AdditionalTagsPanel.btnRemove.text")); // NOI18N
btnRemove.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(final java.awt.event.ActionEvent evt) {
btnRemoveActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 2;
gridBagConstraints.gridy = 0;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
jPanel1.add(btnRemove, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 4;
gridBagConstraints.anchor = java.awt.GridBagConstraints.LAST_LINE_START;
gridBagConstraints.insets = new java.awt.Insets(0, 0, 5, 0);
jPanel2.add(jPanel1, gridBagConstraints);
jScrollPane3.setMinimumSize(new java.awt.Dimension(200, 22));
final org.jdesktop.beansbinding.ELProperty eLProperty = org.jdesktop.beansbinding.ELProperty.create(
"${assignedTags}");
final org.jdesktop.swingbinding.JTableBinding jTableBinding = org.jdesktop.swingbinding.SwingBindings
.createJTableBinding(
org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE,
this,
eLProperty,
tblAssignedTags);
org.jdesktop.swingbinding.JTableBinding.ColumnBinding columnBinding = jTableBinding.addColumnBinding(
org.jdesktop.beansbinding.ELProperty.create("${taggroup}"));
columnBinding.setColumnName("Taggroup");
columnBinding.setEditable(false);
columnBinding = jTableBinding.addColumnBinding(org.jdesktop.beansbinding.ELProperty.create("${name}"));
columnBinding.setColumnName("Name");
columnBinding.setEditable(false);
bindingGroup.addBinding(jTableBinding);
jTableBinding.bind();
jScrollPane3.setViewportView(tblAssignedTags);
if (tblAssignedTags.getColumnModel().getColumnCount() > 0) {
tblAssignedTags.getColumnModel()
.getColumn(0)
.setHeaderValue(org.openide.util.NbBundle.getMessage(
AdditionalTagsPanel.class,
"AdditionalTagsPanel.tblAssignedTags.columnModel.title0_2")); // NOI18N
tblAssignedTags.getColumnModel()
.getColumn(1)
.setHeaderValue(org.openide.util.NbBundle.getMessage(
AdditionalTagsPanel.class,
"AdditionalTagsPanel.tblAssignedTags.columnModel.title1_2")); // NOI18N
}
tblAssignedTags.setAutoCreateRowSorter(true);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 10);
jPanel2.add(jScrollPane3, gridBagConstraints);
jPanel4.add(jPanel2);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 0;
gridBagConstraints.gridheight = 5;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
add(jPanel4, gridBagConstraints);
bindingGroup.bind();
} // </editor-fold>//GEN-END:initComponents
/**
* DOCUMENT ME!
*
* @param evt DOCUMENT ME!
*/
private void btnAddActionPerformed(final java.awt.event.ActionEvent evt) { //GEN-FIRST:event_btnAddActionPerformed
final List<LightweightMetaObject> selectedTags = lstTags.getSelectedValuesList();
final List<CidsBean> tags = cidsBean.getBeanCollectionProperty("tags");
for (final LightweightMetaObject tag : selectedTags) {
tags.add(tag.getBean());
}
} //GEN-LAST:event_btnAddActionPerformed
/**
* DOCUMENT ME!
*
* @param evt DOCUMENT ME!
*/
private void cmbTagGroupsActionPerformed(final java.awt.event.ActionEvent evt) { //GEN-FIRST:event_cmbTagGroupsActionPerformed
changeListModelToSelectedTaggroup();
final String description = TagUtils.getDescriptionOfTag(cmbTagGroups.getSelectedItem());
provideInformation(description);
btnNew.setEnabled(TaggroupUtils.isTaggroupOpen(cmbTagGroups.getSelectedItem().toString()));
} //GEN-LAST:event_cmbTagGroupsActionPerformed
/**
* DOCUMENT ME!
*/
private void changeListModelToSelectedTaggroup() {
final LightweightMetaObject taggroupMo = (LightweightMetaObject)cmbTagGroups.getSelectedItem();
Taggroups chosenTaggroup = null;
if (taggroupMo != null) {
chosenTaggroup = TaggroupUtils.getTaggroupFromString(taggroupMo.toString());
}
if (chosenTaggroup != null) {
((TagsJList)lstTags).changeModelToTaggroup(chosenTaggroup);
} else {
lstTags.setModel(new DefaultListModel());
}
}
/**
* DOCUMENT ME!
*
* @param evt DOCUMENT ME!
*/
private void btnRemoveActionPerformed(final java.awt.event.ActionEvent evt) { //GEN-FIRST:event_btnRemoveActionPerformed
final List<CidsBean> selectedTags = new ArrayList<CidsBean>(tblAssignedTags.getSelectedRowCount());
for (final int viewIndex : tblAssignedTags.getSelectedRows()) {
final int modelIndex = tblAssignedTags.convertRowIndexToModel(viewIndex);
selectedTags.add(assignedTags.get(modelIndex));
}
assignedTags.removeAll(selectedTags);
} //GEN-LAST:event_btnRemoveActionPerformed
/**
* DOCUMENT ME!
*
* @param evt DOCUMENT ME!
*/
private void btnNewActionPerformed(final java.awt.event.ActionEvent evt) { //GEN-FIRST:event_btnNewActionPerformed
try {
final CidsBean selectedTaggroup = ((MetaObject)cmbTagGroups.getSelectedItem()).getBean();
final SimpleTagEditor simpleTagEditor = new SimpleTagEditor(selectedTaggroup);
simpleTagEditor.setCidsBean(CidsBean.createNewCidsBeanFromTableName("SWITCHON", "tag"));
final ShowEditorInDialog dialog = new ShowEditorInDialog(StaticSwingTools.getParentFrame(this),
simpleTagEditor);
dialog.setTitle(selectedTaggroup.toString());
dialog.showDialog();
((TagsJList)lstTags).reload();
assignedTags.addAll(simpleTagEditor.getNewlyAddedCidsBeans());
} catch (Exception ex) {
LOG.error("Could not create new tag-CidsBean", ex);
}
} //GEN-LAST:event_btnNewActionPerformed
/**
* DOCUMENT ME!
*
* @param evt DOCUMENT ME!
*/
private void customRowSelectionEventHandler(final javax.swing.event.ListSelectionEvent evt) {
final int rowIndexView = tblAssignedTags.getSelectedRow();
if (rowIndexView >= 0) {
final int rowIndexModel = tblAssignedTags.convertRowIndexToModel(rowIndexView);
String description = TagUtils.getDescriptionOfTag(assignedTags.get(rowIndexModel));
if ((description == null) || description.isEmpty() || description.equals("n/a")) {
description = TagUtils.getDescriptionOfTag(cmbTagGroups.getSelectedItem());
}
provideInformation(description);
}
}
/**
* DOCUMENT ME!
*
* @param evt DOCUMENT ME!
*/
private void lstTagsValueChanged(final javax.swing.event.ListSelectionEvent evt) { //GEN-FIRST:event_lstTagsValueChanged
String description = TagUtils.getDescriptionOfTag(lstTags.getSelectedValue());
if ((description == null) || description.isEmpty() || description.equals("n/a")) {
description = TagUtils.getDescriptionOfTag(cmbTagGroups.getSelectedItem());
}
provideInformation(description);
} //GEN-LAST:event_lstTagsValueChanged
@Override
public CidsBean getCidsBean() {
return cidsBean;
}
@Override
public void setCidsBean(final CidsBean cidsBean) {
bindingGroup.unbind();
if (cidsBean != null) {
this.cidsBean = cidsBean;
assignedTags = cidsBean.getBeanCollectionProperty("tags");
bindingGroup.bind();
// after the binding the column titles and the row filter have to be set again, as they will be overwritten
// otherwise set column titles
NbBundle.setBranding(branding);
if (tblAssignedTags.getColumnModel().getColumnCount() > 0) {
tblAssignedTags.getColumnModel()
.getColumn(0)
.setHeaderValue(org.openide.util.NbBundle.getMessage(
AdditionalTagsPanel.class,
"AdditionalTagsPanel.tblAssignedTags.columnModel.title0_2")); // NOI18N
tblAssignedTags.getColumnModel()
.getColumn(1)
.setHeaderValue(org.openide.util.NbBundle.getMessage(
AdditionalTagsPanel.class,
"AdditionalTagsPanel.tblAssignedTags.columnModel.title1_2")); // NOI18N
}
NbBundle.setBranding(null);
// set row filter, to only show those tags from the allowed taggroups
final RowFilter<Object, Object> filter = new RowFilter<Object, Object>() {
@Override
public boolean include(final RowFilter.Entry entry) {
final CidsBean taggroup = (CidsBean)entry.getValue(0);
final String taggroupName = (String)taggroup.getProperty("name");
boolean allowed = false;
for (final Taggroups allowedTaggroup : allowedTaggroups) {
if (allowedTaggroup.getValue().equalsIgnoreCase(taggroupName)) {
allowed = true;
break;
}
}
return allowed;
}
};
final TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(tblAssignedTags.getModel());
sorter.setRowFilter(filter);
tblAssignedTags.setRowSorter(sorter);
}
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public List<CidsBean> getAssignedTags() {
return assignedTags;
}
/**
* DOCUMENT ME!
*
* @param assignedTags DOCUMENT ME!
*/
public void setAssignedTags(final List<CidsBean> assignedTags) {
this.assignedTags = assignedTags;
}
@Override
public void dispose() {
bindingGroup.unbind();
}
/**
* DOCUMENT ME!
*/
public void makeNonEditable() {
RendererTools.makeReadOnly(btnAdd);
RendererTools.makeReadOnly(btnNew);
RendererTools.makeReadOnly(btnRemove);
RendererTools.makeReadOnly(cmbTagGroups);
RendererTools.makeReadOnly(lstTags);
RendererTools.makeReadOnly(tblAssignedTags);
}
/**
* DOCUMENT ME!
*
* @param readOnly DOCUMENT ME!
*/
public void setReadOnly(final boolean readOnly) {
this.btnNew.setEnabled(!readOnly);
}
}