package org.openslx.dozmod.gui.configurator; import java.awt.GridBagConstraints; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.event.ChangeListener; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import org.apache.log4j.Logger; import org.openslx.bwlp.thrift.iface.LdapFilter; import org.openslx.dozmod.gui.Gui; import org.openslx.dozmod.gui.changemonitor.DialogChangeMonitor; import org.openslx.dozmod.gui.control.QLabel; import org.openslx.dozmod.gui.control.WordWrapLabel; import org.openslx.dozmod.gui.control.table.CheckListTable.Wrapper; import org.openslx.dozmod.gui.control.table.LectureLdapFilterTable; import org.openslx.dozmod.gui.control.table.QScrollPane; import org.openslx.dozmod.gui.helper.GridManager; import org.openslx.dozmod.gui.helper.MessageType; import org.openslx.dozmod.thrift.cache.MetaDataCache; /** * Widget for network share configuration of lectures */ public class LdapFilterConfigurator extends LdapFilterConfiguratorLayout { private static final long serialVersionUID = -3336605759245603655L; private final static Logger LOGGER = Logger.getLogger(LdapFilterConfigurator.class); public LdapFilterConfigurator() { super(); tblFilters.getModel().addTableModelListener(new TableModelListener() { @Override public void tableChanged(TableModelEvent e) { fireChangeEvent(); } }); tblFilters.getSelectionModel().addListSelectionListener(new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent e) { LdapFilter item = tblFilters.getSelectedItem2(); boolean editable = (item == null || item.filterId == 0); txtAttribute.setEditable(editable); txtValue.setEditable(editable); btnAdd.setEnabled(editable); btnDel.setEnabled(editable); btnAdd.setText("Ändern"); if (item == null) { clearInputFields(); return; } // share from the list is selected: fill bottom form and change "Add" to "Apply" txtAttribute.setText(item.attribute); txtValue.setText(item.value); } }); btnAdd.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // check if we are editing an existing share entry or // creating a new one, check for input either way LdapFilter input = new LdapFilter(); input.attribute = txtAttribute.getText(); if (input.attribute == null || input.attribute.isEmpty()) { Gui.showMessageBox("Kein Attribut angegeben", MessageType.ERROR, null, null); return; } input.value = txtValue.getText(); if (input.value == null) { input.value = ""; } Wrapper newEntry = new Wrapper(input, false); List> oldList = new ArrayList<>(tblFilters.getData()); // either we delete the existing share from the data or we are // creating a new one, either way add it to the list and update // the table, if its not present already if (oldList.contains(newEntry)) { Gui.showMessageBox("Eintrag bereits vorhanden", MessageType.ERROR, null, null); return; } // now decide whether to create a new entry or update existing one Wrapper oldEntry = tblFilters.getSelectedItem(); if (oldEntry != null && oldList.contains(oldEntry)) { // editing existing one, delete it from the internal data oldList.remove(oldEntry); } oldList.add(newEntry); tblFilters.setData(oldList, false); clearInputFields(); } }); btnDel.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // try to delete the selected share Wrapper selection = tblFilters.getSelectedItem(); if (selection == null) { return; } try { List> oldList = new ArrayList<>(tblFilters.getData()); if (!oldList.remove(selection)) { // false if it was not found LOGGER.error("Could not remove non-existent filter '" + selection.toString() + "' from the table data: " + oldList.toString()); return; } // refresh table data tblFilters.setData(oldList, false); } catch (Exception ex) { LOGGER.debug("Failed to remove " + selection.toString() + " from the table data.", ex); return; } } }); clearInputFields(); } private void clearInputFields() { btnDel.setEnabled(false); txtAttribute.setText(null); txtValue.setText(null); btnAdd.setText("Hinzufügen"); } public List getState() { List> current = tblFilters.getData(); if (current == null) return new ArrayList<>(0);; ArrayList ret = new ArrayList<>(current.size()); for (Wrapper item : current) { if (item.isChecked() || item.item.filterId == 0) { ret.add(item.item); } } return ret; } public boolean setState(List data, List predefSelected) { if (data == null) return false; ArrayList filterList = new ArrayList<>(data); Set checked = new HashSet(); List predef = MetaDataCache.getPredefinedLdapFilters(); // Now add remaining filters for (LdapFilter pd : predef) { filterList.add(pd); if (predefSelected != null && predefSelected.contains(pd.filterId)) { checked.add(pd); } } tblFilters.setData(filterList, checked, false); return true; } protected List listenerList = new ArrayList<>(); public void addLdapFilterListTableContentConfigurationChangeEventListener(ChangeListener listener) { listenerList.add(listener); } public void removeNetshareConfigurationChangeEventListener(ChangeListener listener) { listenerList.remove(listener); } void fireChangeEvent() { for (ChangeListener listener : new ArrayList<>(listenerList)) { listener.stateChanged(null); } } public void addToChangeMonitor(DialogChangeMonitor changeMonitor) { changeMonitor.add(tblFilters); } } /** * Internal layout class for this widget */ class LdapFilterConfiguratorLayout extends JPanel { private static final long serialVersionUID = 6479838641542743622L; private final static String HELPTEXT = "Geben Sie hier LDAP Filter ein, die die Sichtbarkeit" + " der Veranstaltung abhängig vom angemeldeten Benutzer einschränken. Eine Veranstaltung" + " ist sichtbar, sobald einer der angegebenen Filter zutrifft. Zusätzliche Raumbeschränkungen" + " greifen weiterhin."; protected final LectureLdapFilterTable tblFilters = new LectureLdapFilterTable(); protected final JTextField txtAttribute, txtValue; protected final JButton btnAdd, btnDel; public LdapFilterConfiguratorLayout() { GridManager grid = new GridManager(this, 1, true, new Insets(3, 3, 3, 3)); // top info panel grid.add(new WordWrapLabel(HELPTEXT)).fill(true, false).expand(true, false); grid.nextRow(); // middle filter list grid.add(new QScrollPane(tblFilters)).fill(true, true).expand(true, true); grid.nextRow(); btnDel = new JButton("Entfernen"); grid.add(btnDel).anchor(GridBagConstraints.EAST); grid.nextRow(); JPanel pnlNewShare = new JPanel(); GridManager gridNewFilter = new GridManager(pnlNewShare, 3, true); pnlNewShare.setBorder(BorderFactory.createTitledBorder("Eigene Filter definieren")); gridNewFilter.add(new QLabel("Attribut")); txtAttribute = new JTextField(); gridNewFilter.add(txtAttribute, 2).fill(true, false).expand(true, false); gridNewFilter.nextRow(); gridNewFilter.add(new QLabel("Wert")); txtValue = new JTextField(); gridNewFilter.add(txtValue).fill(true, false).expand(true, false); btnAdd = new JButton("Hinzufügen"); gridNewFilter.add(btnAdd).anchor(GridBagConstraints.EAST); gridNewFilter.nextRow(); gridNewFilter.finish(false); grid.add(pnlNewShare).fill(true, false).expand(true, false); grid.nextRow(); grid.finish(false); } }