summaryrefslogtreecommitdiffstats
path: root/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor
diff options
context:
space:
mode:
authorSimon Rettberg2018-06-21 15:22:50 +0200
committerSimon Rettberg2018-06-21 15:22:50 +0200
commit4180be8908fa4f520599e6d416b403008e384310 (patch)
tree98480c8b9f5420e0e8ae8c774f296284e7fd43b0 /dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor
parent[client] showMessagBox with clickable Hyperlink (diff)
downloadtutor-module-4180be8908fa4f520599e6d416b403008e384310.tar.gz
tutor-module-4180be8908fa4f520599e6d416b403008e384310.tar.xz
tutor-module-4180be8908fa4f520599e6d416b403008e384310.zip
[client] Refactor change monitor classes, better error message handling
Diffstat (limited to 'dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor')
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/AbstractControlWrapper.java48
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/ButtonGroupWrapper.java6
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/CheckBoxTreeWrapper.java5
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/CheckBoxWrapper.java6
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/DatePickerWrapper.java5
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/DialogChangeMonitor.java118
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/EditableComboBoxWrapper.java5
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/FixedComboBoxWrapper.java5
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/LecturePermissionManagerWrapper.java6
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/ListEditorWindow.java40
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/TableWrapper.java7
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/TextControlWrapper.java7
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/TimeSpinnerWrapper.java7
13 files changed, 155 insertions, 110 deletions
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/AbstractControlWrapper.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/AbstractControlWrapper.java
index 4f7f2145..e43b5393 100644
--- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/AbstractControlWrapper.java
+++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/AbstractControlWrapper.java
@@ -1,6 +1,10 @@
package org.openslx.dozmod.gui.changemonitor;
+import java.util.ArrayList;
import java.util.Comparator;
+import java.util.List;
+
+import org.openslx.dozmod.gui.changemonitor.DialogChangeMonitor.ValidationConstraint;
/**
* Control/element wrapper
@@ -9,23 +13,19 @@ public abstract class AbstractControlWrapper<T> {
private final DialogChangeMonitor dcm;
protected boolean wasEverChanged;
protected boolean isCurrentlyChanged;
- protected boolean isValid = true;
private T originalContent;
- private final DialogChangeMonitor.ValidationConstraint<T> constraint;
+ private List<ValidationConstraint<T>> constraints;
private final Comparator<T> cmp;
- protected final String constraintErrorMessage;
+ protected String currentError = null;
/**
* If muted, this wrapper will not react to changes of the underlying
* control.
*/
private boolean muted = false;
- protected AbstractControlWrapper(DialogChangeMonitor dcm, String errorMessage, Comparator<T> comp,
- DialogChangeMonitor.ValidationConstraint<T> cons) {
+ protected AbstractControlWrapper(DialogChangeMonitor dcm, Comparator<T> comp) {
this.dcm = dcm;
- this.constraintErrorMessage = errorMessage;
this.cmp = comp;
- this.constraint = cons;
}
public boolean hasChangedSinceInit() {
@@ -37,6 +37,24 @@ public abstract class AbstractControlWrapper<T> {
}
/**
+ * Returns the current error message for the first failed constraint. If no
+ * constraint currently yields invalid, null is returned.
+ *
+ * @return
+ */
+ public String currentConstraintError() {
+ return currentError;
+ }
+
+ public AbstractControlWrapper<T> addConstraint(ValidationConstraint<T> constraint) {
+ if (constraints == null) {
+ constraints = new ArrayList<>();
+ }
+ constraints.add(constraint);
+ return this;
+ }
+
+ /**
* Resets the change state of this control
* and removes the "muted" flag, if set.
*/
@@ -48,7 +66,7 @@ public abstract class AbstractControlWrapper<T> {
dcm.contentChanged(this);
}
}
-
+
protected final void resetChangeState() {
muted = false;
isCurrentlyChanged = wasEverChanged = false;
@@ -107,12 +125,18 @@ public abstract class AbstractControlWrapper<T> {
}
protected void checkValid(T text) {
- if (muted)
+ if (muted || constraints == null || constraints.isEmpty())
return;
- boolean valid = constraint == null || constraint.isValid(text);
- if (isValid != valid) {
- isValid = valid;
+ String error = null;
+ for (ValidationConstraint<T> i : constraints) {
+ error = i.checkStateValid(text);
+ if (error != null)
+ break;
+ }
+ if (error != currentError) {
+ currentError = error;
dcm.validityChanged(this);
}
}
+
} \ No newline at end of file
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/ButtonGroupWrapper.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/ButtonGroupWrapper.java
index 3606a99b..1768efb6 100644
--- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/ButtonGroupWrapper.java
+++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/ButtonGroupWrapper.java
@@ -8,16 +8,14 @@ import javax.swing.AbstractButton;
import javax.swing.ButtonGroup;
import javax.swing.ButtonModel;
-import org.openslx.dozmod.gui.changemonitor.DialogChangeMonitor.ValidationConstraint;
-
/**
* Monitor a button group (e.g. group of radio boxes)
*/
class ButtonGroupWrapper extends AbstractControlWrapper<ButtonModel> {
private final ButtonGroup buttons;
- public ButtonGroupWrapper(DialogChangeMonitor dcm, ButtonGroup group, ValidationConstraint<ButtonModel> constraint, String errorMessage) {
- super(dcm, errorMessage, null, constraint);
+ public ButtonGroupWrapper(DialogChangeMonitor dcm, ButtonGroup group) {
+ super(dcm, null);
buttons = group;
ItemListener listener = new ItemListener() {
@Override
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/CheckBoxTreeWrapper.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/CheckBoxTreeWrapper.java
index 23e8a742..5f3d8e2a 100644
--- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/CheckBoxTreeWrapper.java
+++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/CheckBoxTreeWrapper.java
@@ -4,7 +4,6 @@ import java.util.Comparator;
import javax.swing.tree.TreePath;
-import org.openslx.dozmod.gui.changemonitor.DialogChangeMonitor.ValidationConstraint;
import org.openslx.dozmod.gui.control.JCheckBoxTree;
import org.openslx.dozmod.gui.control.JCheckBoxTree.CheckChangeEvent;
import org.openslx.dozmod.gui.control.JCheckBoxTree.CheckChangeEventListener;
@@ -39,8 +38,8 @@ class CheckBoxTreeWrapper extends AbstractControlWrapper<TreePath[]> {
private final JCheckBoxTree tree;
- public CheckBoxTreeWrapper(DialogChangeMonitor dcm, JCheckBoxTree t, ValidationConstraint<TreePath[]> constraint, String errorMessage) {
- super(dcm, errorMessage, COMPARATOR, constraint);
+ public CheckBoxTreeWrapper(DialogChangeMonitor dcm, JCheckBoxTree t) {
+ super(dcm, COMPARATOR);
tree = t;
tree.addCheckChangeEventListener(new CheckChangeEventListener() {
public void checkStateChanged(CheckChangeEvent event) {
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/CheckBoxWrapper.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/CheckBoxWrapper.java
index 4683458e..74f94eb9 100644
--- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/CheckBoxWrapper.java
+++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/CheckBoxWrapper.java
@@ -5,8 +5,6 @@ import java.awt.event.ItemListener;
import javax.swing.JCheckBox;
-import org.openslx.dozmod.gui.changemonitor.DialogChangeMonitor.ValidationConstraint;
-
/**
* Monitoring a JCheckBox
*/
@@ -14,8 +12,8 @@ class CheckBoxWrapper extends AbstractControlWrapper<Boolean> {
private final JCheckBox checkbox;
- public CheckBoxWrapper(DialogChangeMonitor dcm, JCheckBox box, ValidationConstraint<Boolean> constraint, String errorMessage) {
- super(dcm, errorMessage, null, constraint);
+ public CheckBoxWrapper(DialogChangeMonitor dcm, JCheckBox box) {
+ super(dcm, null);
checkbox = box;
checkbox.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/DatePickerWrapper.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/DatePickerWrapper.java
index 40930862..5e471380 100644
--- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/DatePickerWrapper.java
+++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/DatePickerWrapper.java
@@ -4,7 +4,6 @@ import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import org.jdatepicker.JDatePicker;
-import org.openslx.dozmod.gui.changemonitor.DialogChangeMonitor.ValidationConstraint;
/**
* Monitoring a JTextField etc.
@@ -12,8 +11,8 @@ import org.openslx.dozmod.gui.changemonitor.DialogChangeMonitor.ValidationConstr
class DatePickerWrapper extends AbstractControlWrapper<Object> {
private final JDatePicker component;
- public DatePickerWrapper(DialogChangeMonitor dcm, JDatePicker picker, ValidationConstraint<Object> constr, String errorMessage) {
- super(dcm, errorMessage, null, constr);
+ public DatePickerWrapper(DialogChangeMonitor dcm, JDatePicker picker) {
+ super(dcm, null);
this.component = picker;
picker.addActionListener(new ActionListener() {
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/DialogChangeMonitor.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/DialogChangeMonitor.java
index d05fac72..a1d01eaf 100644
--- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/DialogChangeMonitor.java
+++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/DialogChangeMonitor.java
@@ -3,6 +3,7 @@ package org.openslx.dozmod.gui.changemonitor;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
+import java.util.Map;
import javax.swing.ButtonGroup;
import javax.swing.ButtonModel;
@@ -14,6 +15,7 @@ import javax.swing.tree.TreePath;
import org.apache.log4j.Logger;
import org.jdatepicker.JDatePicker;
+import org.openslx.bwlp.thrift.iface.LecturePermissions;
import org.openslx.dozmod.gui.control.ComboBox;
import org.openslx.dozmod.gui.control.JCheckBoxTree;
import org.openslx.dozmod.gui.control.LectureCustomPermissionManager;
@@ -37,83 +39,59 @@ public class DialogChangeMonitor {
this.callback = cb;
}
- private void warnConstraint(Object component, ValidationConstraint<?> constraint, String errorMessage) {
- if (callback != null && constraint != null && errorMessage == null) {
- LOGGER.warn("Adding " + component.getClass().getSimpleName()
- + " with constraint but no error message!");
- }
- }
-
/*
* Methods for adding various controls
*/
- private AbstractControlWrapper<?> add(AbstractControlWrapper<?> elem) {
+ private <T> AbstractControlWrapper<T> add(AbstractControlWrapper<T> elem) {
controls.add(elem);
elem.resetChangeState();
return elem;
}
- public AbstractControlWrapper<?> add(JTextComponent component, ValidationConstraint<String> constraint,
- String errorMessage) {
- warnConstraint(component, constraint, errorMessage);
- return add(new TextControlWrapper(this, component, constraint, errorMessage));
- }
-
- public AbstractControlWrapper<?> add(JTextComponent component) {
- return add(component, null, null);
+ public AbstractControlWrapper<String> add(JTextComponent component) {
+ return add(new TextControlWrapper(this, component));
}
- public <T> AbstractControlWrapper<?> addFixedCombo(ComboBox<T> component, Comparator<T> comparator,
- ValidationConstraint<T> constraint, String errorMessage) {
- warnConstraint(component, constraint, errorMessage);
- return add(new FixedComboBoxWrapper<T>(this, component, comparator, constraint, errorMessage));
+ public <T> AbstractControlWrapper<T> addFixedCombo(ComboBox<T> component, Comparator<T> comparator) {
+ return add(new FixedComboBoxWrapper<T>(this, component, comparator));
}
- public AbstractControlWrapper<?> addEditableCombo(ComboBox<?> component, Comparator<Object> comparator,
- ValidationConstraint<Object> constraint, String errorMessage) {
- warnConstraint(component, constraint, errorMessage);
- return add(new EditableComboBoxWrapper(this, component, comparator, constraint, errorMessage));
+ public AbstractControlWrapper<Object> addEditableCombo(ComboBox<?> component,
+ Comparator<Object> comparator) {
+ return add(new EditableComboBoxWrapper(this, component, comparator));
}
- public AbstractControlWrapper<?> add(JCheckBox component, ValidationConstraint<Boolean> constraint,
- String errorMessage) {
- warnConstraint(component, constraint, errorMessage);
- return add(new CheckBoxWrapper(this, component, constraint, errorMessage));
+ public AbstractControlWrapper<Boolean> add(JCheckBox component) {
+ return add(new CheckBoxWrapper(this, component));
}
- public AbstractControlWrapper<?> add(JCheckBox component) {
- return add(component, null, null);
+ public AbstractControlWrapper<TreePath[]> add(JCheckBoxTree component) {
+ return add(new CheckBoxTreeWrapper(this, component));
}
- public AbstractControlWrapper<?> add(JCheckBoxTree component,
- ValidationConstraint<TreePath[]> constraint, String errorMessage) {
- warnConstraint(component, constraint, errorMessage);
- return add(new CheckBoxTreeWrapper(this, component, constraint, errorMessage));
+ public AbstractControlWrapper<ButtonModel> add(ButtonGroup group) {
+ return add(new ButtonGroupWrapper(this, group));
}
- public AbstractControlWrapper<?> add(ButtonGroup group, ValidationConstraint<ButtonModel> constraint,
- String errorMessage) {
- warnConstraint(group, constraint, errorMessage);
- return add(new ButtonGroupWrapper(this, group, constraint, errorMessage));
+ public AbstractControlWrapper<Object> add(JDatePicker picker) {
+ return add(new DatePickerWrapper(this, picker));
}
- public AbstractControlWrapper<?> add(JDatePicker picker, ValidationConstraint<Object> constraint,
- String errorMessage) {
- warnConstraint(picker, constraint, errorMessage);
- return add(new DatePickerWrapper(this, picker, constraint, errorMessage));
+ public AbstractControlWrapper<Object> add(JSpinner spinner) {
+ return add(new TimeSpinnerWrapper(this, spinner));
}
- public AbstractControlWrapper<?> add(JSpinner spinner) {
- return add(new TimeSpinnerWrapper(this, spinner, null, null));
+ public AbstractControlWrapper<Map<String, LecturePermissions>> add(LectureCustomPermissionManager manager) {
+ return add(new LecturePermissionManagerWrapper(this, manager));
}
- public AbstractControlWrapper<?> add(LectureCustomPermissionManager manager) {
- return add(new LecturePermissionManagerWrapper(this, manager, null, null));
+ public AbstractControlWrapper<ClonedTableModel> add(JTable table) {
+ return add(new TableWrapper(this, table));
}
- public AbstractControlWrapper<?> add(JTable table) {
- return add(new TableWrapper(this, table, null, null));
+ public <T> AbstractControlWrapper<List<T>> add(ListEditorWindow<T> editor) {
+ return add(new ListEditorWindowWrapper<T>(this, editor));
}
/*
@@ -149,19 +127,19 @@ public class DialogChangeMonitor {
void validityChanged(AbstractControlWrapper<?> cw) {
String error = null;
- LOGGER.info(cw.getClass().getSimpleName() + " changed validity to " + cw.isValid);
+ //LOGGER.info(cw.getClass().getSimpleName() + " changed validity to " + cw.isValid);
boolean oldValid = this.isValid;
- if (!cw.isValid) {
+ if (cw.currentError != null) {
this.isValid = false;
- error = cw.constraintErrorMessage;
+ error = cw.currentError;
} else {
this.isValid = true;
}
if (error == null) {
for (AbstractControlWrapper<?> c : controls) {
- if (!c.isValid) {
+ if (c.currentError != null) {
this.isValid = false;
- error = c.constraintErrorMessage;
+ error = c.currentError;
break;
}
}
@@ -207,18 +185,38 @@ public class DialogChangeMonitor {
*/
public static interface ValidationConstraint<T> {
- boolean isValid(T userInput);
+ /**
+ * Method should return <code>null</code> if the input is valid, an
+ * error message otherwise.
+ *
+ * @param userInput Current content/state of the control being monitored
+ * @return error message if invalid, <code>null</code> otherwise
+ */
+ String checkStateValid(T userInput);
}
- /*
- * Default validators
+ /**
+ * Simple validator that checks for text not being empty
*/
+ public static class TextNotEmptyConstraint implements ValidationConstraint<String> {
+ private final String errorMsg;
- public static final ValidationConstraint<String> VC_NOT_EMPTY = new ValidationConstraint<String>() {
- public boolean isValid(String userInput) {
- return !Util.isEmptyString(userInput);
+ public TextNotEmptyConstraint(String errorMessage) {
+ this.errorMsg = errorMessage;
}
- };
+
+ @Override
+ public String checkStateValid(String userInput) {
+ if (Util.isEmptyString(userInput))
+ return errorMsg;
+ return null;
+ }
+
+ }
+
+ /*
+ * Default validators
+ */
/**
* Callback for class using the monitor
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/EditableComboBoxWrapper.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/EditableComboBoxWrapper.java
index d77a5aa5..c6b0245a 100644
--- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/EditableComboBoxWrapper.java
+++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/EditableComboBoxWrapper.java
@@ -4,7 +4,6 @@ import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.Comparator;
-import org.openslx.dozmod.gui.changemonitor.DialogChangeMonitor.ValidationConstraint;
import org.openslx.dozmod.gui.control.ComboBox;
/**
@@ -13,8 +12,8 @@ import org.openslx.dozmod.gui.control.ComboBox;
class EditableComboBoxWrapper extends AbstractControlWrapper<Object> {
private final ComboBox<?> comboBox;
- public EditableComboBoxWrapper(DialogChangeMonitor dcm, ComboBox<?> combo, Comparator<Object> comparator, ValidationConstraint<Object> constraint, String errorMessage) {
- super(dcm, errorMessage, comparator, constraint);
+ public EditableComboBoxWrapper(DialogChangeMonitor dcm, ComboBox<?> combo, Comparator<Object> comparator) {
+ super(dcm, comparator);
comboBox = combo;
comboBox.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/FixedComboBoxWrapper.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/FixedComboBoxWrapper.java
index 096aaa23..6b7a4b77 100644
--- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/FixedComboBoxWrapper.java
+++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/FixedComboBoxWrapper.java
@@ -4,7 +4,6 @@ import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.Comparator;
-import org.openslx.dozmod.gui.changemonitor.DialogChangeMonitor.ValidationConstraint;
import org.openslx.dozmod.gui.control.ComboBox;
/**
@@ -13,8 +12,8 @@ import org.openslx.dozmod.gui.control.ComboBox;
class FixedComboBoxWrapper<T> extends AbstractControlWrapper<T> {
private final ComboBox<T> comboBox;
- public FixedComboBoxWrapper(DialogChangeMonitor dcm, ComboBox<T> combo, Comparator<T> comparator, ValidationConstraint<T> constraint, String errorMessage) {
- super(dcm, errorMessage, comparator, constraint);
+ public FixedComboBoxWrapper(DialogChangeMonitor dcm, ComboBox<T> combo, Comparator<T> comparator) {
+ super(dcm, comparator);
comboBox = combo;
comboBox.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/LecturePermissionManagerWrapper.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/LecturePermissionManagerWrapper.java
index 88b618d6..a1f066a0 100644
--- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/LecturePermissionManagerWrapper.java
+++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/LecturePermissionManagerWrapper.java
@@ -4,7 +4,6 @@ import java.util.Comparator;
import java.util.Map;
import org.openslx.bwlp.thrift.iface.LecturePermissions;
-import org.openslx.dozmod.gui.changemonitor.DialogChangeMonitor.ValidationConstraint;
import org.openslx.dozmod.gui.control.LectureCustomPermissionManager;
import org.openslx.dozmod.gui.control.LectureCustomPermissionManager.UserChangeEvent;
import org.openslx.dozmod.gui.control.LectureCustomPermissionManager.UserChangeEventListener;
@@ -23,9 +22,8 @@ class LecturePermissionManagerWrapper extends AbstractControlWrapper<Map<String,
private final LectureCustomPermissionManager component;
- public LecturePermissionManagerWrapper(DialogChangeMonitor dcm, LectureCustomPermissionManager manager,
- ValidationConstraint<Map<String, LecturePermissions>> constr, String errorMessage) {
- super(dcm, errorMessage, COMPARATOR, constr);
+ public LecturePermissionManagerWrapper(DialogChangeMonitor dcm, LectureCustomPermissionManager manager) {
+ super(dcm, COMPARATOR);
this.component = manager;
manager.addUserChangeEventListener(new UserChangeEventListener() {
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/ListEditorWindow.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/ListEditorWindow.java
new file mode 100644
index 00000000..ebefd326
--- /dev/null
+++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/ListEditorWindow.java
@@ -0,0 +1,40 @@
+package org.openslx.dozmod.gui.changemonitor;
+
+import java.util.List;
+
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+
+/**
+ * For wrapping editors that contain controls to edit a list of some kind.
+ * When implementing inside a pop-up window, it should be sufficient to
+ * trigger the change event only once, when the user cancels or saves the
+ * changes, since the main window that's interested in the changes will
+ * be covered anyways during editing.
+ */
+public interface ListEditorWindow<T> {
+
+ public List<T> getState();
+
+ public void addChangeListener(ChangeListener l);
+
+}
+
+class ListEditorWindowWrapper<T> extends AbstractControlWrapper<List<T>> {
+ private final ListEditorWindow<T> component;
+
+ public ListEditorWindowWrapper(DialogChangeMonitor dcm, ListEditorWindow<T> comp) {
+ super(dcm, null);
+ this.component = comp;
+
+ comp.addChangeListener(new ChangeListener() {
+ public void stateChanged(ChangeEvent e) {
+ contentChanged();
+ }
+ });
+ }
+
+ List<T> getCurrentValue() {
+ return this.component.getState();
+ }
+} \ No newline at end of file
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/TableWrapper.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/TableWrapper.java
index f8bcfa01..5c03c2fc 100644
--- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/TableWrapper.java
+++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/TableWrapper.java
@@ -9,8 +9,6 @@ import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableModel;
-import org.openslx.dozmod.gui.changemonitor.DialogChangeMonitor.ValidationConstraint;
-
/**
* Monitoring a JTable etc.
*/
@@ -47,9 +45,8 @@ class TableWrapper extends AbstractControlWrapper<ClonedTableModel> {
private final JTable component;
- public TableWrapper(DialogChangeMonitor dcm, JTable table,
- ValidationConstraint<ClonedTableModel> constr, String errorMessage) {
- super(dcm, errorMessage, COMPARATOR, constr);
+ public TableWrapper(DialogChangeMonitor dcm, JTable table) {
+ super(dcm, COMPARATOR);
this.component = table;
final TableModelListener changeListener = new TableModelListener() {
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/TextControlWrapper.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/TextControlWrapper.java
index 6535a113..0a06dd8e 100644
--- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/TextControlWrapper.java
+++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/TextControlWrapper.java
@@ -4,17 +4,14 @@ import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.JTextComponent;
-import org.openslx.dozmod.gui.changemonitor.DialogChangeMonitor.ValidationConstraint;
-
/**
* Monitoring a JTextField etc.
*/
class TextControlWrapper extends AbstractControlWrapper<String> {
private final JTextComponent component;
- public TextControlWrapper(DialogChangeMonitor dcm, JTextComponent textField,
- ValidationConstraint<String> constr, String errorMessage) {
- super(dcm, errorMessage, null, constr);
+ public TextControlWrapper(DialogChangeMonitor dcm, JTextComponent textField) {
+ super(dcm, null);
this.component = textField;
textField.getDocument().addDocumentListener(new DocumentListener() {
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/TimeSpinnerWrapper.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/TimeSpinnerWrapper.java
index ecb6e50c..a7d94f5d 100644
--- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/TimeSpinnerWrapper.java
+++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/TimeSpinnerWrapper.java
@@ -7,16 +7,14 @@ import javax.swing.JSpinner;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
-import org.openslx.dozmod.gui.changemonitor.DialogChangeMonitor.ValidationConstraint;
-
class TimeSpinnerWrapper extends AbstractControlWrapper<Object> {
private static final SimpleDateFormat TIME_FORMAT = new SimpleDateFormat("k:m");
private final JSpinner component;
- public TimeSpinnerWrapper(DialogChangeMonitor dcm, JSpinner picker, ValidationConstraint<Object> constr, String errorMessage) {
- super(dcm, errorMessage, null, constr);
+ public TimeSpinnerWrapper(DialogChangeMonitor dcm, JSpinner picker) {
+ super(dcm, null);
this.component = picker;
picker.addChangeListener(new ChangeListener() {
@@ -33,4 +31,5 @@ class TimeSpinnerWrapper extends AbstractControlWrapper<Object> {
}
return value;
}
+
} \ No newline at end of file