package org.openslx.dozmod.gui.helper; import java.awt.Component; import java.util.Date; import javax.swing.Box; import javax.swing.DefaultBoundedRangeModel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JSlider; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import org.apache.log4j.Logger; import org.openslx.dozmod.gui.control.QLabel; import org.openslx.dozmod.thrift.Session; import org.openslx.dozmod.util.FormatHelper; public class ExpiryDateChooser { private static final Logger LOGGER = Logger.getLogger(ExpiryDateChooser.class); /** * Helper to ask the user for the number of days to extend a date with. If * startingDate is given, it will preview the starting date + selected * number of days. If startingDate is null, no preview will be done. * Returns the numbers of days selected. * * @param parent component to center the dialog on. * @param starting date to add the user selected duration on to. Only needed * for live preview of the future date. * @return the number of days the user selected. */ public static int askFutureExpiryDuration(final Component parent, final Date startingDate) { ExpiryDateChooserWindow win = new ExpiryDateChooserWindow(parent); int ret = win.query(startingDate); if (ret <= 0 || ret > Session.getSatelliteConfig().maxImageValidityDays) { LOGGER.error("Invalid date returned after asking user extension duration: " + ret); return -1; } return ret; } } /** * Internal layout class. */ class ExpiryDateChooserWindow extends JPanel { private static final Logger LOGGER = Logger.getLogger(ExpiryDateChooser.class); public static final int DEFAULT_EXTENSION_DURATION = 14; private final JPanel pane = new JPanel(); private final GridManager grdPane = new GridManager(pane, 3, true); private final JSlider sldDaysToExtend = new JSlider(JSlider.HORIZONTAL); private final QLabel lblNewDate = new QLabel(); private final QLabel lblNewDateLabel = new QLabel("Neues Ablaufdatum: "); private final Component parent; public ExpiryDateChooserWindow(final Component parent) { this.parent = parent; grdPane.add(new QLabel("Geben Sie ein um wieviele Tage diese Version(en) verlängert werden soll:"), 3) .fill(true, true) .expand(true, true); grdPane.nextRow(); sldDaysToExtend.setModel(new DefaultBoundedRangeModel(DEFAULT_EXTENSION_DURATION, 0, 1, Session.getSatelliteConfig().maxImageValidityDays)); grdPane.add(sldDaysToExtend, 3).fill(true, false).expand(true, false); grdPane.nextRow(); grdPane.add(lblNewDateLabel); grdPane.add(Box.createGlue()).fill(true, false).expand(true, false); grdPane.add(lblNewDate).fill(true, true).expand(true, true); grdPane.finish(true); } public int query(final Date startingDate) { // show bottom date preview if only one version was selected lblNewDate.setText(startingDate == null ? "" : FormatHelper.longDate( DateTimeHelper.addDaysTo(startingDate, DEFAULT_EXTENSION_DURATION))); sldDaysToExtend.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { if (startingDate == null) return; Date current = DateTimeHelper.addDaysTo(startingDate, sldDaysToExtend.getValue()); lblNewDate.setText(FormatHelper.longDate(current)); } }); sldDaysToExtend.setValue(DEFAULT_EXTENSION_DURATION); int ret = JOptionPane.showConfirmDialog(parent, pane, "Ablaufdatum verlängern", JOptionPane.OK_CANCEL_OPTION); if (ret != 0) return -1; return sldDaysToExtend.getValue(); } }