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();
if (item == null) {
clearInputFields();
return;
}
// share from the list is selected: fill bottom form and change "Add" to "Apply"
boolean editable = (item.filterId == 0);
txtAttribute.setText(item.attribute);
txtValue.setText(item.value);
txtAttribute.setEditable(editable);
txtValue.setEditable(editable);
btnAdd.setEnabled(editable);
btnDel.setEnabled(editable);
btnAdd.setText("Ändern");
}
});
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<LdapFilter> newEntry = new Wrapper<LdapFilter>(input, false);
List<Wrapper<LdapFilter>> oldList = 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<LdapFilter> oldEntry = tblFilters.getSelectedItem();
if (oldEntry != null && oldList.contains(oldEntry)) {
// editing existing one, delete it from the internal data
oldList = new ArrayList<>(oldList);
oldList.remove(oldEntry);
}
oldList.add(newEntry);
tblFilters.setData(oldList, true);
clearInputFields();
}
});
btnDel.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// try to delete the selected share
Wrapper<LdapFilter> selection = tblFilters.getSelectedItem();
if (selection == null) {
return;
}
try {
List<Wrapper<LdapFilter>> oldList = 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, true);
} catch (Exception ex) {
LOGGER.debug("Failed to remove " + selection.toString() + " from the table data.", ex);
return;
}
}
});
btnDel.setEnabled(false);
}
private void clearInputFields() {
btnDel.setEnabled(false);
txtAttribute.setText(null);
txtValue.setText(null);
btnAdd.setText("Hinzufügen");
}
public List<LdapFilter> getState() {
List<Wrapper<LdapFilter>> current = tblFilters.getData();
ArrayList<LdapFilter> ret = new ArrayList<>(current.size());
for (Wrapper<LdapFilter> item : current) {
if (item.isChecked() || item.item.filterId == 0) {
ret.add(item.item);
}
}
return ret;
}
public boolean setState(List<LdapFilter> data) {
if (data == null)
return false;
ArrayList<LdapFilter> filterList = new ArrayList<>(data);
List<LdapFilter> predef = MetaDataCache.getPredefinedLdapFilters();
Set<LdapFilter> checked = new HashSet<>();
for (LdapFilter item : data) {
if (item.filterId == 0)
continue;
// Item has a filterId (is predefined), so validate it's in there
// before marking it checked, or just uncheck it by removing the id
// so it becomes a custom entry.
boolean ok = false;
for (LdapFilter pd : predef) {
if (pd.filterId == item.filterId) {
checked.add(pd);
ok = true;
break;
}
}
// If it wasn't preselected, add to list now...
if (!ok) {
item.filterId = 0;
}
}
// Now add remaining filters
for (LdapFilter pd : predef) {
if (!checked.contains(pd)) {
filterList.add(pd);
LOGGER.info("Adding " + pd.filterId);
}
}
tblFilters.setData(filterList, checked, false);
return true;
}
protected List<ChangeListener> 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);
}
}