summaryrefslogtreecommitdiffstats
path: root/dozentenmodul/src/main/java/org/openslx/dozmod/gui/configurator/LdapFilterConfigurator.java
blob: 15959322b085c3a32f8d1924e542a414ed919d2c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
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);
				txtAttribute.setEnabled(editable);
				txtValue.setEnabled(editable);
				if (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<LdapFilter> newEntry = new Wrapper<LdapFilter>(input, false);
				List<Wrapper<LdapFilter>> 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<LdapFilter> 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<LdapFilter> selection = tblFilters.getSelectedItem();
				if (selection == null) {
					return;
				}
				try {
					List<Wrapper<LdapFilter>> 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<LdapFilter> getState() {
		List<Wrapper<LdapFilter>> current = tblFilters.getData();
		if (current == null)
			return new ArrayList<>(0);;
		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, List<Integer> predefSelected) {
		if (data == null)
			return false;
		ArrayList<LdapFilter> filterList = new ArrayList<>(data);
		Set<LdapFilter> checked = new HashSet<LdapFilter>();
		List<LdapFilter> 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<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);
	}
}