diff options
author | Simon Rettberg | 2018-06-21 15:22:50 +0200 |
---|---|---|
committer | Simon Rettberg | 2018-06-21 15:22:50 +0200 |
commit | 4180be8908fa4f520599e6d416b403008e384310 (patch) | |
tree | 98480c8b9f5420e0e8ae8c774f296284e7fd43b0 /dozentenmodul/src/main/java/org/openslx/dozmod/gui/window | |
parent | [client] showMessagBox with clickable Hyperlink (diff) | |
download | tutor-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/window')
3 files changed, 68 insertions, 20 deletions
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/LectureDetailsWindow.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/LectureDetailsWindow.java index 512175a5..9794c37a 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/LectureDetailsWindow.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/LectureDetailsWindow.java @@ -1,6 +1,5 @@ package org.openslx.dozmod.gui.window; -import java.awt.Color; import java.awt.Frame; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; @@ -35,6 +34,8 @@ import org.openslx.dozmod.gui.Gui; import org.openslx.dozmod.gui.MainWindow; import org.openslx.dozmod.gui.changemonitor.AbstractControlWrapper; import org.openslx.dozmod.gui.changemonitor.DialogChangeMonitor; +import org.openslx.dozmod.gui.changemonitor.DialogChangeMonitor.TextNotEmptyConstraint; +import org.openslx.dozmod.gui.changemonitor.DialogChangeMonitor.ValidationConstraint; import org.openslx.dozmod.gui.helper.DateTimeHelper; import org.openslx.dozmod.gui.helper.MessageType; import org.openslx.dozmod.gui.helper.UiFeedback; @@ -126,12 +127,31 @@ public class LectureDetailsWindow extends LectureDetailsWindowLayout implements }); // Add controls to change monitor - changeMonitor.addFixedCombo(cboVersions, Comparators.imageVersionDetails, + changeMonitor.addFixedCombo(cboVersions, Comparators.imageVersionDetails) + .addConstraint( new DialogChangeMonitor.ValidationConstraint<ImageVersionDetails>() { - public boolean isValid(ImageVersionDetails userInput) { - return userInput != null && userInput.isValid; + public String checkStateValid(ImageVersionDetails userInput) { + if (userInput != null && userInput.isValid) + return null; + return "Keine/Ungültige VM-Version ausgewählt"; } - }, "Keine/Ungültige VM-Version ausgewählt"); + }); + // Create constraint for date start/end + final Date maxValidity; + Calendar c = Calendar.getInstance(); + c.add(Calendar.DAY_OF_MONTH, Session.getSatelliteConfig().maxLectureValidityDays); + maxValidity = c.getTime(); + ValidationConstraint<Object> dateRangeValidator = new DialogChangeMonitor.ValidationConstraint<Object>() { + public String checkStateValid(Object ignored) { + Date start = DateTimeHelper.getDateFrom(dtpStartDate, spnStartTime); + Date end = DateTimeHelper.getDateFrom(dtpEndDate, spnEndTime); + if (!end.after(start)) + return "Enddatum darf nicht vor dem Startdatum liegen"; + if (end.after(maxValidity)) + return "Enddatum liegt nach dem " + FormatHelper.shortDate(maxValidity); + return null; + } + }; changeMonitor.add(chkAutoUpdate); changeMonitor.add(chkIsExam); changeMonitor.add(chkHasInternetAccess); @@ -139,20 +159,18 @@ public class LectureDetailsWindow extends LectureDetailsWindowLayout implements changeMonitor.add(chkIsActive); changeMonitor.add(chkCustomPermAdmin); changeMonitor.add(chkCustomPermEdit); - changeMonitor.add(txtTitle, DialogChangeMonitor.VC_NOT_EMPTY, "Veranstaltungsname darf nicht leer sein"); - changeMonitor.add(txtDescription, DialogChangeMonitor.VC_NOT_EMPTY, "Beschreibung darf nicht leer sein"); - changeMonitor.add(dtpEndDate, null, null); - changeMonitor.add(dtpStartDate, null, null); - changeMonitor.add(spnEndTime); - changeMonitor.add(spnStartTime); + changeMonitor.add(txtTitle).addConstraint(new TextNotEmptyConstraint("Veranstaltungsname darf nicht leer sein")); + changeMonitor.add(txtDescription).addConstraint(new TextNotEmptyConstraint("Beschreibung darf nicht leer sein")); + changeMonitor.add(dtpEndDate).addConstraint(dateRangeValidator); + changeMonitor.add(dtpStartDate).addConstraint(dateRangeValidator); + changeMonitor.add(spnEndTime).addConstraint(dateRangeValidator); + changeMonitor.add(spnStartTime).addConstraint(dateRangeValidator); changeListenerPermissions = changeMonitor.add(ctlPermissionManager); ctlLocationSelector.addToChangeMonitor(changeMonitor); ctlRunscriptConfigurator.addToChangeMonitor(changeMonitor); ctlNetshareConfigurator.addToChangeMonitor(changeMonitor); ctlLdapFilterConfigurator.addToChangeMonitor(changeMonitor); - // TODO: NetShare: Having uncommitted changes in the input fields should be handled too - // TODO: NetRules editor - // TODO: LDAP editor + // TODO: LDAP/NetShare: Having uncommitted changes in the input fields should be handled too // End change monitor addWindowListener(new WindowAdapter() { @@ -234,7 +252,7 @@ public class LectureDetailsWindow extends LectureDetailsWindowLayout implements btnNetrules.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - List<NetRule> newNetrules = LectureNetrulesWindow.open(me, lecture.networkExceptions); + List<NetRule> newNetrules = LectureNetrulesWindow.open(me, lecture.networkExceptions, changeMonitor); if (newNetrules != null) lecture.networkExceptions = newNetrules; } diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/LectureNetrulesWindow.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/LectureNetrulesWindow.java index f570cc0e..e5b1659b 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/LectureNetrulesWindow.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/LectureNetrulesWindow.java @@ -3,13 +3,18 @@ package org.openslx.dozmod.gui.window; import java.awt.Window; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; import java.util.ArrayList; import java.util.List; +import javax.swing.event.ChangeListener; + import org.apache.log4j.Logger; import org.openslx.bwlp.thrift.iface.NetRule; import org.openslx.dozmod.gui.Gui; import org.openslx.dozmod.gui.Gui.GuiCallable; +import org.openslx.dozmod.gui.changemonitor.DialogChangeMonitor; import org.openslx.dozmod.gui.helper.MessageType; import org.openslx.dozmod.gui.helper.UiFeedback; import org.openslx.dozmod.gui.window.layout.LectureNetrulesWindowLayout; @@ -24,13 +29,13 @@ public class LectureNetrulesWindow extends LectureNetrulesWindowLayout private List<NetRule> newRules = null; public LectureNetrulesWindow(Window modalParent, - List<NetRule> netrules) { + List<NetRule> netrules, DialogChangeMonitor changeMonitor) { super(modalParent); btnSave.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - newRules = ctlNetrulesConfigurator.getState(); + newRules = ctlNetrulesConfigurator.getState(false); if (newRules == null) { return; } @@ -46,6 +51,7 @@ public class LectureNetrulesWindow extends LectureNetrulesWindowLayout } }); ctlNetrulesConfigurator.setState(netrules); + changeMonitor.add(this).reset(); } /** @@ -64,17 +70,18 @@ public class LectureNetrulesWindow extends LectureNetrulesWindowLayout * * @param modalParent * parent to this window + * @param changeMonitor If you want to track changes... * @param locations * locations to preselect in the LocationSelector * @return forwards the return value of the window itself: list of ids of * the selected locations */ public static List<NetRule> open(final Window modalParent, - final List<NetRule> netrules) { + final List<NetRule> netrules, final DialogChangeMonitor changeMonitor) { return Gui.syncExec(new GuiCallable<List<NetRule>>() { @Override public List<NetRule> run() { - return new LectureNetrulesWindow(modalParent, netrules) + return new LectureNetrulesWindow(modalParent, netrules, changeMonitor) .runAndReturn(); } }); @@ -98,4 +105,20 @@ public class LectureNetrulesWindow extends LectureNetrulesWindowLayout dispose(); } } + + @Override + public List<NetRule> getState() { + return ctlNetrulesConfigurator.getState(true); + } + + @Override + public void addChangeListener(final ChangeListener l) { + addWindowListener(new WindowAdapter() { + @Override + public void windowClosed(WindowEvent e) { + l.stateChanged(null); + } + }); + } + } diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/layout/LectureNetrulesWindowLayout.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/layout/LectureNetrulesWindowLayout.java index 31a1a929..ce4067ce 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/layout/LectureNetrulesWindowLayout.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/layout/LectureNetrulesWindowLayout.java @@ -2,6 +2,9 @@ package org.openslx.dozmod.gui.window.layout; import java.awt.BorderLayout; import java.awt.Window; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.util.List; import javax.swing.BorderFactory; import javax.swing.Box; @@ -9,11 +12,14 @@ import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JPanel; +import javax.swing.event.ChangeListener; +import org.openslx.bwlp.thrift.iface.NetRule; import org.openslx.dozmod.gui.Gui; +import org.openslx.dozmod.gui.changemonitor.ListEditorWindow; import org.openslx.dozmod.gui.control.NetrulesConfigurator; -public class LectureNetrulesWindowLayout extends JDialog { +public abstract class LectureNetrulesWindowLayout extends JDialog implements ListEditorWindow<NetRule> { private static final long serialVersionUID = 5565439063675405598L; @@ -53,4 +59,5 @@ public class LectureNetrulesWindowLayout extends JDialog { pack(); Gui.centerShellOverShell(modalParent, this); } + } |