summaryrefslogtreecommitdiffstats
path: root/dozentenmodul/src/main/java
diff options
context:
space:
mode:
authorSimon Rettberg2015-09-07 12:38:13 +0200
committerSimon Rettberg2015-09-07 12:38:13 +0200
commitffbc8df3b919e3b3ec4441cd55511b5414569299 (patch)
tree9c3acf213d5501ba0e4cf72273df5c2f359b6b36 /dozentenmodul/src/main/java
parent[client] Sanity checks in LectureDetailsWindow (diff)
downloadtutor-module-ffbc8df3b919e3b3ec4441cd55511b5414569299.tar.gz
tutor-module-ffbc8df3b919e3b3ec4441cd55511b5414569299.tar.xz
tutor-module-ffbc8df3b919e3b3ec4441cd55511b5414569299.zip
[client] Add a date picker that supports proper event for changes :)
Diffstat (limited to 'dozentenmodul/src/main/java')
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/QDatePickerImpl.java110
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/LectureDetailsWindow.java97
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/layout/LectureDetailsWindowLayout.java8
3 files changed, 161 insertions, 54 deletions
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/QDatePickerImpl.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/QDatePickerImpl.java
new file mode 100644
index 00000000..3bd0745a
--- /dev/null
+++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/QDatePickerImpl.java
@@ -0,0 +1,110 @@
+package org.openslx.dozmod.gui.control;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.lang.reflect.Field;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.swing.JButton;
+import javax.swing.JFormattedTextField.AbstractFormatter;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
+import javax.swing.JTextField;
+
+import org.apache.log4j.Logger;
+import org.jdatepicker.impl.JDatePanelImpl;
+import org.jdatepicker.impl.JDatePickerImpl;
+
+@SuppressWarnings("serial")
+public class QDatePickerImpl extends JDatePickerImpl {
+
+ private static final Logger LOGGER = Logger.getLogger(QDatePickerImpl.class);
+
+ private final JButton pickButton;
+
+ private final JTextField displayTextField;
+
+ private final Set<ActionListener> actionListeners = new HashSet<>();
+
+ public QDatePickerImpl(JDatePanelImpl datePanel, AbstractFormatter formatter) {
+ super(datePanel, formatter);
+ Field cfButton = null;
+ Field cfTextField = null;
+ try {
+ cfButton = JDatePickerImpl.class.getDeclaredField("button");
+ cfButton.setAccessible(true);
+ } catch (Exception e) {
+ LOGGER.warn("Could not get button field", e);
+ }
+ try {
+ cfTextField = JDatePickerImpl.class.getDeclaredField("formattedTextField");
+ cfTextField.setAccessible(true);
+ } catch (Exception e) {
+ LOGGER.warn("Could not get text field", e);
+ }
+ JButton button = null;
+ JTextField textField = null;
+ if (cfButton != null) {
+ try {
+ button = (JButton) cfButton.get(this);
+ } catch (Exception e) {
+ LOGGER.warn("Could not get button from this", e);
+ }
+ }
+ if (cfTextField != null) {
+ try {
+ textField = (JTextField) cfTextField.get(this);
+ } catch (Exception e) {
+ LOGGER.warn("Could not get textfield from this", e);
+ }
+ }
+ pickButton = button;
+ displayTextField = textField;
+ if (displayTextField != null) {
+ displayTextField.getDocument().addDocumentListener(new DocumentListener() {
+ @Override
+ public void removeUpdate(DocumentEvent e) {
+ fireChangeEvent();
+ }
+
+ @Override
+ public void insertUpdate(DocumentEvent e) {
+ fireChangeEvent();
+ }
+
+ @Override
+ public void changedUpdate(DocumentEvent e) {
+ fireChangeEvent();
+ }
+ });
+ }
+ }
+
+ private void fireChangeEvent() {
+ if (actionListeners.isEmpty())
+ return;
+ ActionEvent ae = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, "Date selected");
+ for (ActionListener al : actionListeners) {
+ al.actionPerformed(ae);
+ }
+ }
+
+ @Override
+ public void setEnabled(boolean enabled) {
+ if (pickButton != null) {
+ pickButton.setEnabled(enabled);
+ }
+ if (displayTextField != null) {
+ displayTextField.setEnabled(enabled);
+ }
+ super.setEnabled(enabled);
+ }
+
+ @Override
+ public void addActionListener(ActionListener actionListener) {
+ actionListeners.add(actionListener);
+ //super.addActionListener(actionListener);
+ }
+
+}
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 b8caf9ec..ac6c9a1e 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
@@ -20,6 +20,8 @@ import java.util.Map;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
@@ -100,9 +102,7 @@ public class LectureDetailsWindow extends LectureDetailsWindowLayout implements
private boolean imageLinkChanged = false;
- private Task dateChecker;
-
- private boolean reactive = false;
+ private boolean checkForChanges = false;
/**
* Constructor
@@ -120,11 +120,6 @@ public class LectureDetailsWindow extends LectureDetailsWindowLayout implements
public void windowClosing(WindowEvent e) {
safeClose();
}
-
- @Override
- public void windowClosed(WindowEvent e) {
- dateChecker.cancel();
- }
});
btnLinkImage.addActionListener(new ActionListener() {
@@ -215,6 +210,8 @@ public class LectureDetailsWindow extends LectureDetailsWindowLayout implements
makeEditable(false);
// save default color of date/time stuff to reset the background later
dateTimeTextColor = startDate.getForeground();
+
+ listenToChange();
}
/**
@@ -257,6 +254,7 @@ public class LectureDetailsWindow extends LectureDetailsWindowLayout implements
* callback function when we received the lecture's details from the server
*/
private void fill() {
+ checkForChanges = false;
if (lecture == null) {
txtTitle.setText("-");
makeEditable(false);
@@ -299,9 +297,7 @@ public class LectureDetailsWindow extends LectureDetailsWindowLayout implements
endCal.get(Calendar.DATE));
endTime.getModel().setValue(endCal.getTime());
- listenToChange();
makeEditable(true);
-
setVisible(true);
}
@@ -453,8 +449,6 @@ public class LectureDetailsWindow extends LectureDetailsWindowLayout implements
* reactToChange() when actions occur
*/
private void listenToChange() {
- if (reactive)
- return;
// final step, add listeners to react to change
final DocumentListener docListener = new DocumentListener() {
@Override
@@ -487,26 +481,26 @@ public class LectureDetailsWindow extends LectureDetailsWindowLayout implements
cboVersions.addItemListener(comboItemListener);
// Listener to detect changes in checkboxes
- final ActionListener checkBoxListener = new ActionListener() {
+ final ActionListener actionListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
reactToChange();
}
};
- chkAutoUpdate.addActionListener(checkBoxListener);
- chkIsExam.addActionListener(checkBoxListener);
- chkHasInternetAccess.addActionListener(checkBoxListener);
- chkIsActive.addActionListener(checkBoxListener);
-
- dateChecker = new Task() {
+ ChangeListener changeListener = new ChangeListener() {
@Override
- public void fire() {
+ public void stateChanged(ChangeEvent e) {
reactToChange();
}
};
- QuickTimer.scheduleAtFixedRate(dateChecker, 1000, 1000);
- reactive = true;
-
+ chkAutoUpdate.addActionListener(actionListener);
+ chkIsExam.addActionListener(actionListener);
+ chkHasInternetAccess.addActionListener(actionListener);
+ chkIsActive.addActionListener(actionListener);
+ startDate.addActionListener(actionListener);
+ endDate.addActionListener(actionListener);
+ startTime.addChangeListener(changeListener);
+ endTime.addChangeListener(changeListener);
}
/**
@@ -550,32 +544,34 @@ public class LectureDetailsWindow extends LectureDetailsWindowLayout implements
*/
private boolean reactToChange() {
boolean changed = false;
- // version checkbox changed?
- ImageVersionDetails currentVersion = cboVersions.getItemAt(cboVersions.getSelectedIndex());
- if (currentVersion != null && !currentVersion.getVersionId().equals(lecture.getImageVersionId())) {
- changed = true;
- } else if ((DateTimeHelper.getDateFrom(startDate, startTime).getTime() / 1000L) != lecture.getStartTime()
- || (DateTimeHelper.getDateFrom(endDate, endTime).getTime() / 1000L) != lecture.getEndTime()) {
- changed = true;
- } else if (!txtTitle.getText().isEmpty() && !txtTitle.getText().equals(lecture.getLectureName())) {
- changed = true;
- } else if (!txtDescription.getText().isEmpty()
- && !txtDescription.getText().equals(lecture.getDescription())) {
- changed = true;
- } else if (chkAutoUpdate.isSelected() != lecture.autoUpdate) {
- changed = true;
- } else if (chkIsExam.isSelected() != lecture.isExam) {
- changed = true;
- } else if (chkHasInternetAccess.isSelected() != lecture.hasInternetAccess) {
- changed = true;
- } else if (chkIsActive.isSelected() != lecture.isEnabled) {
- changed = true;
- } else if (permissionsChanged) {
- changed = true;
- } else if (imageLinkChanged) {
- changed = true;
+ if (lecture != null && checkForChanges) {
+ // version checkbox changed?
+ int vIndex = cboVersions.getSelectedIndex();
+ ImageVersionDetails currentVersion = vIndex == -1 ? null : cboVersions.getItemAt(vIndex);
+ if (currentVersion != null && !currentVersion.getVersionId().equals(lecture.getImageVersionId())) {
+ changed = true;
+ } else if ((DateTimeHelper.getDateFrom(startDate, startTime).getTime() / 1000L) != lecture.getStartTime()
+ || (DateTimeHelper.getDateFrom(endDate, endTime).getTime() / 1000L) != lecture.getEndTime()) {
+ changed = true;
+ } else if (!txtTitle.getText().isEmpty() && !txtTitle.getText().equals(lecture.getLectureName())) {
+ changed = true;
+ } else if (!txtDescription.getText().isEmpty()
+ && !txtDescription.getText().equals(lecture.getDescription())) {
+ changed = true;
+ } else if (chkAutoUpdate.isSelected() != lecture.autoUpdate) {
+ changed = true;
+ } else if (chkIsExam.isSelected() != lecture.isExam) {
+ changed = true;
+ } else if (chkHasInternetAccess.isSelected() != lecture.hasInternetAccess) {
+ changed = true;
+ } else if (chkIsActive.isSelected() != lecture.isEnabled) {
+ changed = true;
+ } else if (permissionsChanged) {
+ changed = true;
+ } else if (imageLinkChanged) {
+ changed = true;
+ }
}
-
btnSaveChanges.setEnabled(changed);
return changed;
}
@@ -602,6 +598,7 @@ public class LectureDetailsWindow extends LectureDetailsWindowLayout implements
endDate.setEnabled(editable);
endTime.setEnabled(editable);
btnDownloadImage.setEnabled(ImagePerms.canDownload(image));
+ checkForChanges = editable;
}
/**
@@ -634,7 +631,7 @@ public class LectureDetailsWindow extends LectureDetailsWindowLayout implements
********************************************************************************/
@Override
public boolean wantConfirmQuit() {
- return reactToChange() && btnSaveChanges.isEnabled();
+ return reactToChange();
}
@Override
@@ -650,7 +647,7 @@ public class LectureDetailsWindow extends LectureDetailsWindowLayout implements
private void safeClose() {
if (reactToChange()
&& !Gui.showMessageBox(me, "Ă„nderungen werden verworfen, wollen Sie wirklich abbrechen?",
- MessageType.QUESTION_YESNO, LOGGER, null))
+ MessageType.QUESTION_YESNO, null, null))
return;
dispose();
}
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/layout/LectureDetailsWindowLayout.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/layout/LectureDetailsWindowLayout.java
index 3a902b25..94f5ad21 100644
--- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/layout/LectureDetailsWindowLayout.java
+++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/layout/LectureDetailsWindowLayout.java
@@ -15,7 +15,6 @@ import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JCheckBox;
-import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JPanel;
@@ -33,6 +32,7 @@ import org.openslx.bwlp.thrift.iface.ImageVersionDetails;
import org.openslx.dozmod.gui.control.ComboBox;
import org.openslx.dozmod.gui.control.ComboBox.ComboBoxRenderer;
import org.openslx.dozmod.gui.control.PersonLabel;
+import org.openslx.dozmod.gui.control.QDatePickerImpl;
import org.openslx.dozmod.gui.control.QLabel;
import org.openslx.dozmod.gui.helper.GridManager;
import org.openslx.dozmod.util.DateLabelFormatter;
@@ -54,7 +54,7 @@ public abstract class LectureDetailsWindowLayout extends JDialog {
protected final QLabel lblStartTime;
protected final QLabel lblEndTime;
protected final JCheckBox chkAutoUpdate;
- protected final JComboBox<ImageVersionDetails> cboVersions;
+ protected final ComboBox<ImageVersionDetails> cboVersions;
protected final JCheckBox chkIsExam;
protected final JCheckBox chkHasInternetAccess;
protected final JCheckBox chkIsActive;
@@ -150,7 +150,7 @@ public abstract class LectureDetailsWindowLayout extends JDialog {
// start time of the lecture
JPanel startTimePanel = new JPanel(new BorderLayout());
- startDate = new JDatePickerImpl(new JDatePanelImpl(new UtilDateModel(new Date()), pickerStrings),
+ startDate = new QDatePickerImpl(new JDatePanelImpl(new UtilDateModel(new Date()), pickerStrings),
new DateLabelFormatter());
startTime = makeTimeSpinner(23, 59);
startTimePanel.add(startDate, BorderLayout.WEST);
@@ -162,7 +162,7 @@ public abstract class LectureDetailsWindowLayout extends JDialog {
// end time of the lecture
JPanel endTimePanel = new JPanel(new BorderLayout());
- endDate = new JDatePickerImpl(new JDatePanelImpl(new UtilDateModel(new Date()), pickerStrings),
+ endDate = new QDatePickerImpl(new JDatePanelImpl(new UtilDateModel(new Date()), pickerStrings),
new DateLabelFormatter());
endTime = makeTimeSpinner(00, 59);
endTimePanel.add(endDate, BorderLayout.WEST);