diff options
author | Simon Rettberg | 2015-09-07 12:38:13 +0200 |
---|---|---|
committer | Simon Rettberg | 2015-09-07 12:38:13 +0200 |
commit | ffbc8df3b919e3b3ec4441cd55511b5414569299 (patch) | |
tree | 9c3acf213d5501ba0e4cf72273df5c2f359b6b36 /dozentenmodul/src/main/java | |
parent | [client] Sanity checks in LectureDetailsWindow (diff) | |
download | tutor-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')
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); |