From 0eb8cdc9517c427d5b69587c86e6a3a2e3d1473e Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Tue, 26 Jun 2018 14:53:55 +0200 Subject: [client] Clean up change monitors: Unify generic listener --- .../gui/changemonitor/AbstractControlWrapper.java | 25 ++++++----- .../gui/changemonitor/DialogChangeMonitor.java | 17 +------- .../gui/changemonitor/GenericControlWindow.java | 38 ++++++++++++++++ .../ImagePermissionManagerWrapper.java | 39 ----------------- .../LecturePermissionManagerWrapper.java | 39 ----------------- .../dozmod/gui/changemonitor/ListEditorWindow.java | 40 ----------------- .../configurator/ImagePermissionConfigurator.java | 51 ++++++++-------------- .../LecturePermissionConfigurator.java | 51 ++++++++-------------- .../gui/configurator/NetrulesConfigurator.java | 8 +--- 9 files changed, 92 insertions(+), 216 deletions(-) create mode 100644 dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/GenericControlWindow.java delete mode 100644 dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/ImagePermissionManagerWrapper.java delete mode 100644 dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/LecturePermissionManagerWrapper.java delete mode 100644 dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/ListEditorWindow.java (limited to 'dozentenmodul/src/main/java') 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 e43b5393..460f457e 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,8 +1,10 @@ package org.openslx.dozmod.gui.changemonitor; import java.util.ArrayList; +import java.util.Collection; import java.util.Comparator; import java.util.List; +import java.util.Map; import org.openslx.dozmod.gui.changemonitor.DialogChangeMonitor.ValidationConstraint; @@ -105,17 +107,20 @@ public abstract class AbstractControlWrapper { if (muted) return; final boolean changed; - if (cmp == null) { - if (originalContent == null) { - if (newContent == null) { - changed = false; - } else { - changed = true; - } - } else { - changed = !originalContent.equals(newContent); - } + if (newContent == originalContent) { + changed = false; // This also covers null == null + } else if (newContent == null || originalContent == null) { + changed = true; // So here we know either/or is null, not both + } else if (newContent instanceof Collection + && ((Collection) newContent).size() != ((Collection) originalContent).size()) { + changed = true; + } else if (newContent instanceof Map + && ((Map) newContent).size() != ((Map) originalContent).size()) { + changed = true; + } else if (cmp == null) { + changed = !originalContent.equals(newContent); } else { + // User supplied comparator changed = cmp.compare(originalContent, newContent) != 0; } if (isCurrentlyChanged != changed) { 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 f679b960..4651bdad 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,7 +3,6 @@ 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; @@ -15,10 +14,6 @@ import javax.swing.tree.TreePath; import org.apache.log4j.Logger; import org.jdatepicker.JDatePicker; -import org.openslx.bwlp.thrift.iface.ImagePermissions; -import org.openslx.bwlp.thrift.iface.LecturePermissions; -import org.openslx.dozmod.gui.configurator.ImagePermissionConfigurator; -import org.openslx.dozmod.gui.configurator.LecturePermissionConfigurator; import org.openslx.dozmod.gui.control.ComboBox; import org.openslx.dozmod.gui.control.JCheckBoxTree; import org.openslx.util.Util; @@ -84,20 +79,12 @@ public class DialogChangeMonitor { return add(new TimeSpinnerWrapper(this, spinner)); } - public AbstractControlWrapper> add(LecturePermissionConfigurator manager) { - return add(new LecturePermissionManagerWrapper(this, manager)); - } - - public AbstractControlWrapper> add(ImagePermissionConfigurator manager) { - return add(new ImagePermissionManagerWrapper(this, manager)); - } - public AbstractControlWrapper add(JTable table) { return add(new TableWrapper(this, table)); } - public AbstractControlWrapper> add(ListEditorWindow editor) { - return add(new ListEditorWindowWrapper(this, editor)); + public AbstractControlWrapper add(GenericControlWindow editor) { + return add(new GenericControlWrapper(this, editor)); } /* diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/GenericControlWindow.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/GenericControlWindow.java new file mode 100644 index 00000000..2a9637b7 --- /dev/null +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/GenericControlWindow.java @@ -0,0 +1,38 @@ +package org.openslx.dozmod.gui.changemonitor; + +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 GenericControlWindow { + + public T getState(); + + public void addChangeListener(ChangeListener l); + +} + +class GenericControlWrapper extends AbstractControlWrapper { + private final GenericControlWindow component; + + public GenericControlWrapper(DialogChangeMonitor dcm, GenericControlWindow comp) { + super(dcm, null); + this.component = comp; + + comp.addChangeListener(new ChangeListener() { + public void stateChanged(ChangeEvent e) { + contentChanged(); + } + }); + } + + T getCurrentValue() { + return this.component.getState(); + } +} \ No newline at end of file diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/ImagePermissionManagerWrapper.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/ImagePermissionManagerWrapper.java deleted file mode 100644 index a4e5746b..00000000 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/ImagePermissionManagerWrapper.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.openslx.dozmod.gui.changemonitor; - -import java.util.Comparator; -import java.util.Map; - -import org.openslx.bwlp.thrift.iface.ImagePermissions; -import org.openslx.dozmod.gui.configurator.ImagePermissionConfigurator; -import org.openslx.dozmod.gui.configurator.ImagePermissionConfigurator.UserChangeEvent; -import org.openslx.dozmod.gui.configurator.ImagePermissionConfigurator.UserChangeEventListener; -import org.openslx.dozmod.util.MapHelper; - -class ImagePermissionManagerWrapper extends AbstractControlWrapper> { - - /** - * Comparator so we can check properly if the permission list changed - */ - private static final Comparator> COMPARATOR = new Comparator>() { - public int compare(Map o1, Map o2) { - return MapHelper.compare(o1, o2); - } - }; - - private final ImagePermissionConfigurator component; - - public ImagePermissionManagerWrapper(DialogChangeMonitor dcm, ImagePermissionConfigurator manager) { - super(dcm, COMPARATOR); - this.component = manager; - - manager.addUserChangeEventListener(new UserChangeEventListener() { - public void stateChanged(UserChangeEvent event) { - contentChanged(); - } - }); - } - - Map getCurrentValue() { - return this.component.getPermissions(); - } -} \ No newline at end of file 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 deleted file mode 100644 index 5f68c4f2..00000000 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/LecturePermissionManagerWrapper.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.openslx.dozmod.gui.changemonitor; - -import java.util.Comparator; -import java.util.Map; - -import org.openslx.bwlp.thrift.iface.LecturePermissions; -import org.openslx.dozmod.gui.configurator.LecturePermissionConfigurator; -import org.openslx.dozmod.gui.configurator.LecturePermissionConfigurator.UserChangeEvent; -import org.openslx.dozmod.gui.configurator.LecturePermissionConfigurator.UserChangeEventListener; -import org.openslx.dozmod.util.MapHelper; - -class LecturePermissionManagerWrapper extends AbstractControlWrapper> { - - /** - * Comparator so we can check properly if the permission list changed - */ - private static final Comparator> COMPARATOR = new Comparator>() { - public int compare(Map o1, Map o2) { - return MapHelper.compare(o1, o2); - } - }; - - private final LecturePermissionConfigurator component; - - public LecturePermissionManagerWrapper(DialogChangeMonitor dcm, LecturePermissionConfigurator manager) { - super(dcm, COMPARATOR); - this.component = manager; - - manager.addUserChangeEventListener(new UserChangeEventListener() { - public void stateChanged(UserChangeEvent event) { - contentChanged(); - } - }); - } - - Map getCurrentValue() { - return this.component.getPermissions(); - } -} \ No newline at end of file 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 deleted file mode 100644 index ebefd326..00000000 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/changemonitor/ListEditorWindow.java +++ /dev/null @@ -1,40 +0,0 @@ -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 { - - public List getState(); - - public void addChangeListener(ChangeListener l); - -} - -class ListEditorWindowWrapper extends AbstractControlWrapper> { - private final ListEditorWindow component; - - public ListEditorWindowWrapper(DialogChangeMonitor dcm, ListEditorWindow comp) { - super(dcm, null); - this.component = comp; - - comp.addChangeListener(new ChangeListener() { - public void stateChanged(ChangeEvent e) { - contentChanged(); - } - }); - } - - List getCurrentValue() { - return this.component.getState(); - } -} \ No newline at end of file diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/configurator/ImagePermissionConfigurator.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/configurator/ImagePermissionConfigurator.java index 2310f406..efba020c 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/configurator/ImagePermissionConfigurator.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/configurator/ImagePermissionConfigurator.java @@ -8,9 +8,8 @@ import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; -import java.util.EventListener; -import java.util.EventObject; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -24,11 +23,12 @@ import javax.swing.JPanel; import javax.swing.KeyStroke; import javax.swing.SwingUtilities; import javax.swing.UIManager; -import javax.swing.event.EventListenerList; +import javax.swing.event.ChangeListener; import org.apache.log4j.Logger; import org.openslx.bwlp.thrift.iface.ImagePermissions; import org.openslx.bwlp.thrift.iface.UserInfo; +import org.openslx.dozmod.gui.changemonitor.GenericControlWindow; import org.openslx.dozmod.gui.control.table.ImagePermissionTable; import org.openslx.dozmod.gui.control.table.ImagePermissionTable.UserImagePermissions; import org.openslx.dozmod.gui.control.table.QScrollPane; @@ -43,7 +43,7 @@ import org.openslx.dozmod.util.FormatHelper; * customImagePermissions. */ @SuppressWarnings("serial") -public class ImagePermissionConfigurator extends JPanel { +public class ImagePermissionConfigurator extends JPanel implements GenericControlWindow> { protected ImagePermissionTable permissionTable; @@ -190,42 +190,27 @@ public class ImagePermissionConfigurator extends JPanel { } return newPermissionMap; } - - /** - * Custom event mechanism to detect changes to the user list + + /* + * For dialog change monitor */ - protected EventListenerList listenerList = new EventListenerList(); - /** - * Shared instance, since there is no data attached (yet) - */ - private static final UserChangeEvent CHANGE_EVENT = new UserChangeEvent(); - - public static class UserChangeEvent extends EventObject { - - public UserChangeEvent() { - super(new Object()); + void fireUserChangeEvent() { + for (ChangeListener cl : listeners) { + cl.stateChanged(null); } } - public interface UserChangeEventListener extends EventListener { - public void stateChanged(UserChangeEvent event); + @Override + public Map getState() { + return getPermissions(); } + + private final List listeners = new ArrayList<>(1); - public void addUserChangeEventListener(UserChangeEventListener listener) { - listenerList.add(UserChangeEventListener.class, listener); + @Override + public void addChangeListener(ChangeListener l) { + listeners.add(l); } - public void removeUserChangeEventListener(UserChangeEventListener listener) { - listenerList.remove(UserChangeEventListener.class, listener); - } - - void fireUserChangeEvent() { - Object[] listeners = listenerList.getListenerList(); - for (int i = 0; i < listeners.length; i++) { - if (listeners[i] == UserChangeEventListener.class) { - ((UserChangeEventListener) listeners[i + 1]).stateChanged(CHANGE_EVENT); - } - } - } } diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/configurator/LecturePermissionConfigurator.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/configurator/LecturePermissionConfigurator.java index 26052cf3..5e4c1649 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/configurator/LecturePermissionConfigurator.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/configurator/LecturePermissionConfigurator.java @@ -6,9 +6,8 @@ import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.ArrayList; -import java.util.EventListener; -import java.util.EventObject; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -22,11 +21,12 @@ import javax.swing.JPanel; import javax.swing.KeyStroke; import javax.swing.SwingUtilities; import javax.swing.UIManager; -import javax.swing.event.EventListenerList; +import javax.swing.event.ChangeListener; import org.apache.log4j.Logger; import org.openslx.bwlp.thrift.iface.LecturePermissions; import org.openslx.bwlp.thrift.iface.UserInfo; +import org.openslx.dozmod.gui.changemonitor.GenericControlWindow; import org.openslx.dozmod.gui.control.table.LecturePermissionTable; import org.openslx.dozmod.gui.control.table.LecturePermissionTable.UserLecturePermissions; import org.openslx.dozmod.gui.control.table.QScrollPane; @@ -43,7 +43,7 @@ import org.openslx.dozmod.gui.window.UserListWindow.UserAddedCallback; * */ @SuppressWarnings("serial") -public class LecturePermissionConfigurator extends JPanel { +public class LecturePermissionConfigurator extends JPanel implements GenericControlWindow> { /** * Self reference @@ -182,43 +182,26 @@ public class LecturePermissionConfigurator extends JPanel { return newPermissionMap; } - /** - * Custom event mechanism to detect changes to the user list - * (Mostly needed for the reactToChange() stuff in LectureDetailsWindow) - */ - protected EventListenerList listenerList = new EventListenerList(); - - /** - * Shared instance, since there is no data attached (yet) + /* + * For dialog change monitor */ - private static final UserChangeEvent CHANGE_EVENT = new UserChangeEvent(); - public static class UserChangeEvent extends EventObject { - - public UserChangeEvent() { - super(new Object()); + void fireUserChangeEvent() { + for (ChangeListener cl : listeners) { + cl.stateChanged(null); } } - public interface UserChangeEventListener extends EventListener { - public void stateChanged(UserChangeEvent event); - } - - public void addUserChangeEventListener(UserChangeEventListener listener) { - listenerList.add(UserChangeEventListener.class, listener); + @Override + public Map getState() { + return getPermissions(); } + + private final List listeners = new ArrayList<>(1); - public void removeUserChangeEventListener(UserChangeEventListener listener) { - listenerList.remove(UserChangeEventListener.class, listener); + @Override + public void addChangeListener(ChangeListener l) { + listeners.add(l); } - void fireUserChangeEvent() { - Object[] listeners = listenerList.getListenerList(); - for (int i = 0; i < listeners.length; i++) { - if (listeners[i] == UserChangeEventListener.class) { - ((UserChangeEventListener) listeners[i + 1]) - .stateChanged(CHANGE_EVENT); - } - } - } } diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/configurator/NetrulesConfigurator.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/configurator/NetrulesConfigurator.java index e1c59863..5841efc5 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/configurator/NetrulesConfigurator.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/configurator/NetrulesConfigurator.java @@ -1,7 +1,6 @@ package org.openslx.dozmod.gui.configurator; import java.awt.Color; -import java.awt.Container; import java.awt.Insets; import java.awt.event.FocusAdapter; import java.awt.event.FocusEvent; @@ -10,8 +9,6 @@ import java.awt.event.KeyEvent; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.ArrayList; -import java.util.EventListener; -import java.util.EventObject; import java.util.HashSet; import java.util.Iterator; import java.util.List; @@ -24,7 +21,6 @@ import javax.swing.JTextPane; import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.event.ChangeListener; -import javax.swing.event.EventListenerList; import javax.swing.text.BadLocationException; import javax.swing.text.DefaultStyledDocument; import javax.swing.text.SimpleAttributeSet; @@ -34,7 +30,7 @@ import org.apache.log4j.Logger; import org.openslx.bwlp.thrift.iface.NetDirection; 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.changemonitor.GenericControlWindow; import org.openslx.dozmod.gui.control.WordWrapLabel; import org.openslx.dozmod.gui.helper.GridManager; import org.openslx.dozmod.gui.helper.MessageType; @@ -44,7 +40,7 @@ import org.openslx.util.Util; /** * Widget for netrules configuration of lectures */ -public class NetrulesConfigurator extends NetrulesConfiguratorLayout implements ListEditorWindow { +public class NetrulesConfigurator extends NetrulesConfiguratorLayout implements GenericControlWindow> { private static final long serialVersionUID = -3497629601818983994L; private final static Logger LOGGER = Logger.getLogger(NetrulesConfigurator.class); -- cgit v1.2.3-55-g7522