diff options
| author | Jonathan Bauer | 2015-09-07 12:39:19 +0200 |
|---|---|---|
| committer | Jonathan Bauer | 2015-09-07 12:39:19 +0200 |
| commit | aee42f600187552a31eb042d9c87dbd12f0f03ea (patch) | |
| tree | ee856c037a90e6dbbd0d5f0104695d3b784fd66d /dozentenmodul/src/main/java | |
| parent | [client] more work on client update stuff (diff) | |
| parent | [client] Add a date picker that supports proper event for changes :) (diff) | |
| download | tutor-module-aee42f600187552a31eb042d9c87dbd12f0f03ea.tar.gz tutor-module-aee42f600187552a31eb042d9c87dbd12f0f03ea.tar.xz tutor-module-aee42f600187552a31eb042d9c87dbd12f0f03ea.zip | |
Merge branch 'v1.1' of git.openslx.org:openslx-ng/tutor-module into v1.1
Diffstat (limited to 'dozentenmodul/src/main/java')
4 files changed, 174 insertions, 59 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 f313df22..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; @@ -39,6 +41,7 @@ import org.openslx.dozmod.gui.helper.MessageType; import org.openslx.dozmod.gui.helper.UiFeedback; import org.openslx.dozmod.gui.window.UserListWindow.UserAddedCallback; import org.openslx.dozmod.gui.window.layout.LectureDetailsWindowLayout; +import org.openslx.dozmod.permissions.ImagePerms; import org.openslx.dozmod.permissions.LecturePerms; import org.openslx.dozmod.permissions.PermissionDefaultToCustomLink; import org.openslx.dozmod.thrift.Session; @@ -99,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 @@ -119,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() { @@ -214,15 +210,20 @@ public class LectureDetailsWindow extends LectureDetailsWindowLayout implements makeEditable(false); // save default color of date/time stuff to reset the background later dateTimeTextColor = startDate.getForeground(); + + listenToChange(); } /** * @param forceRefresh */ private void refresh(boolean forceRefresh) { + if (lecture == null) + return; String lectureId = lecture.getLectureId(); synchronized (me) { lecture = null; + image = null; } setLecture(lectureId); } @@ -239,8 +240,10 @@ public class LectureDetailsWindow extends LectureDetailsWindowLayout implements synchronized (me) { lecture = lectureDetails; image = imageDetails; - permissionMap = ThriftActions.getLecturePermissions( - JOptionPane.getFrameForComponent(me), lecture.lectureId); + if (lecture != null) { + permissionMap = ThriftActions.getLecturePermissions( + JOptionPane.getFrameForComponent(me), lecture.lectureId); + } } fill(); } @@ -251,7 +254,9 @@ 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); return; } @@ -292,9 +297,7 @@ public class LectureDetailsWindow extends LectureDetailsWindowLayout implements endCal.get(Calendar.DATE)); endTime.getModel().setValue(endCal.getTime()); - listenToChange(); makeEditable(true); - setVisible(true); } @@ -446,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 @@ -480,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); } /** @@ -543,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; } @@ -594,6 +597,8 @@ public class LectureDetailsWindow extends LectureDetailsWindowLayout implements startTime.setEnabled(editable); endDate.setEnabled(editable); endTime.setEnabled(editable); + btnDownloadImage.setEnabled(ImagePerms.canDownload(image)); + checkForChanges = editable; } /** @@ -626,7 +631,7 @@ public class LectureDetailsWindow extends LectureDetailsWindowLayout implements ********************************************************************************/ @Override public boolean wantConfirmQuit() { - return reactToChange() && btnSaveChanges.isEnabled(); + return reactToChange(); } @Override @@ -642,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); diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/state/LectureWizardState.java b/dozentenmodul/src/main/java/org/openslx/dozmod/state/LectureWizardState.java index 313c9c9d..acffa792 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/state/LectureWizardState.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/state/LectureWizardState.java @@ -13,10 +13,10 @@ public class LectureWizardState { public String imageVersionId = null; public String name = null; public String description = null; - public boolean autoUpdate = false; - public boolean isEnabled = false; + public boolean autoUpdate = true; + public boolean isEnabled = true; public boolean isExam = false; - public boolean internetAccess = false; + public boolean internetAccess = true; public Date start = null; public Date end = null; // default permissions assigned to that lecture by the user |
