package com.ibm.nmon.gui.interval; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import javax.swing.JFormattedTextField; import javax.swing.event.DocumentListener; import javax.swing.event.DocumentEvent; import com.ibm.nmon.gui.time.TimeMaskFormatter; import com.ibm.nmon.interval.Interval; /** * DocumentListener used by {@link RelativeTimeIntervalPanel} to ensure that changes in the entry * text boxes update the absolute time labels and the displayed interval. */ final class RelativeTimeDocumentListener implements DocumentListener { private final RelativeTimeIntervalPanel relativeTimeIntervalPanel; private final JFormattedTextField parent; private final JFormattedTextField start; private final JFormattedTextField end; private final JFormattedTextField days; private final PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this); RelativeTimeDocumentListener(RelativeTimeIntervalPanel relativeTimeIntervalPanel, JFormattedTextField parent, JFormattedTextField start, JFormattedTextField end, JFormattedTextField days) { this.relativeTimeIntervalPanel = relativeTimeIntervalPanel; this.parent = parent; this.start = start; this.end = end; this.days = days; } @Override public void removeUpdate(DocumentEvent e) {} @Override public void insertUpdate(DocumentEvent e) { if (e.getLength() == 0) { return; } try { String text = e.getDocument().getText(e.getDocument().getStartPosition().getOffset(), e.getDocument().getLength()); int startValue = -1; int endValue = -1; int daysValue = -1; String property = null; if (parent == start) { try { startValue = TimeMaskFormatter.parseTime(text); } catch (NumberFormatException nfe) {} endValue = (Integer) end.getValue(); daysValue = (Integer) days.getValue(); property = "start"; } else if (parent == end) { try { endValue = TimeMaskFormatter.parseTime(text); } catch (NumberFormatException nfe) {} startValue = (Integer) start.getValue(); daysValue = (Integer) days.getValue(); property = "end"; } else if (parent == days) { try { daysValue = Integer.parseInt(text); } catch (NumberFormatException nfe) {} startValue = (Integer) start.getValue(); endValue = (Integer) end.getValue(); property = "end"; } else { throw new IllegalStateException("unexpected parent " + parent); } if ((startValue != -1) && (endValue != -1) && (daysValue != -1)) { long startTime = relativeTimeIntervalPanel.getStartTime(startValue); long endTime = relativeTimeIntervalPanel.getEndTime(endValue, daysValue); if (startTime < endTime) { propertyChangeSupport.firePropertyChange("interval", null, new Interval(startTime, endTime)); } else { propertyChangeSupport.firePropertyChange("interval", null, null); } if ("start".equals(property)) { propertyChangeSupport.firePropertyChange(property, null, startTime); } else { propertyChangeSupport.firePropertyChange(property, null, endTime); } } } catch (Exception ex) { ex.printStackTrace(); } } @Override public void changedUpdate(DocumentEvent e) {} public void addPropertyChangeListener(PropertyChangeListener listener) { propertyChangeSupport.addPropertyChangeListener(listener); } public void removePropertyChangeListener(PropertyChangeListener listener) { propertyChangeSupport.removePropertyChangeListener(listener); } }