package org.openslx.dozmod.gui.control; import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.lang.reflect.Field; import java.util.Calendar; import java.util.HashSet; import java.util.Set; import javax.swing.JButton; import javax.swing.JTextField; import org.apache.log4j.Logger; import org.jdatepicker.ComponentColorDefaults; import org.jdatepicker.ComponentColorDefaults.Key; import org.jdatepicker.JDatePicker; import org.openslx.dozmod.gui.helper.ColorUtil; import org.openslx.dozmod.gui.helper.TextChangeListener; @SuppressWarnings("serial") public class QDatePickerImpl extends JDatePicker { private static final Logger LOGGER = Logger.getLogger(QDatePickerImpl.class); private final JButton pickButton; private final JTextField displayTextField; private final Set actionListeners = new HashSet<>(); static { ComponentColorDefaults def = ComponentColorDefaults.getInstance(); Color c1 = def.getColor(Key.FG_MONTH_SELECTOR); Color c2 = def.getColor(Key.BG_MONTH_SELECTOR); if (ColorUtil.getContrast(c1, c2) < 4.5) { def.setColor(Key.FG_MONTH_SELECTOR, Color.WHITE); def.setColor(Key.BG_MONTH_SELECTOR, new Color(0, 0, 128)); } } public QDatePickerImpl() { super(Calendar.getInstance()); Field cfButton = null; Field cfTextField = null; try { cfButton = JDatePicker.class.getDeclaredField("button"); cfButton.setAccessible(true); } catch (Exception e) { LOGGER.warn("Could not get button field", e); } try { cfTextField = JDatePicker.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 TextChangeListener() { @Override public void changed() { 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); } }