package com.ibm.nmon.gui.interval;
import java.beans.PropertyChangeEvent;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
import javax.swing.SwingConstants;
import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.SpinnerDateModel;
import javax.swing.JSpinner.DateEditor;
import javax.swing.event.ChangeListener;
import javax.swing.event.ChangeEvent;
import com.ibm.nmon.gui.Styles;
import com.ibm.nmon.gui.main.NMONVisualizerGui;
import com.ibm.nmon.interval.Interval;
/**
* Panel for entering intervals using absolute date times
*/
final class AbsoluteTimeIntervalPanel extends BaseIntervalPanel {
private static final long serialVersionUID = 3451148920350034946L;
private final JSpinner start;
private final JSpinner end;
private final JLabel startLabel;
private final JLabel endLabel;
AbsoluteTimeIntervalPanel(NMONVisualizerGui gui) {
super(gui);
setLayout(new BorderLayout());
add.addActionListener(addInterval);
// start and end text boxes with labels, followed by a Add button
startLabel = new JLabel("Start:");
startLabel.setHorizontalAlignment(SwingConstants.TRAILING);
startLabel.setFont(Styles.LABEL);
start = new JSpinner(new SpinnerDateModel(new Date(getDefaultStartTime()), null, null, Calendar.MINUTE));
start.setEditor(new DateEditor(start, Styles.DATE_FORMAT_STRING_WITH_YEAR));
start.addChangeListener(intervalUpdater);
endLabel = new JLabel("End:");
endLabel.setHorizontalAlignment(SwingConstants.TRAILING);
endLabel.setFont(Styles.LABEL);
end = new JSpinner(new SpinnerDateModel(new Date(getDefaultEndTime()), null, null, Calendar.MINUTE));
end.setEditor(new DateEditor(end, Styles.DATE_FORMAT_STRING_WITH_YEAR));
end.addChangeListener(intervalUpdater);
JPanel namePanel = new JPanel();
namePanel.add(nameLabel);
namePanel.add(name);
JPanel startPanel = new JPanel();
startPanel.add(startLabel);
startPanel.add(start);
JPanel endPanel = new JPanel();
endPanel.add(endLabel);
endPanel.add(end);
JPanel buttonsPanel = new JPanel();
buttonsPanel.add(add);
buttonsPanel.add(endToStart);
buttonsPanel.add(reset);
JPanel dataPanel = new JPanel();
dataPanel.setLayout(new GridBagLayout());
GridBagConstraints labelConstraints = new GridBagConstraints();
GridBagConstraints fieldConstraints = new GridBagConstraints();
labelConstraints.gridx = 0;
fieldConstraints.gridx = 1;
labelConstraints.gridy = 0;
fieldConstraints.gridy = 0;
labelConstraints.insets = new Insets(0, 0, 0, 5);
fieldConstraints.insets = new Insets(5, 0, 0, 5);
labelConstraints.fill = GridBagConstraints.HORIZONTAL;
fieldConstraints.fill = GridBagConstraints.HORIZONTAL;
dataPanel.add(startLabel, labelConstraints);
dataPanel.add(start, fieldConstraints);
++labelConstraints.gridy;
++fieldConstraints.gridy;
dataPanel.add(endLabel, labelConstraints);
dataPanel.add(end, fieldConstraints);
add(namePanel, BorderLayout.PAGE_START);
add(dataPanel, BorderLayout.CENTER);
add(buttonsPanel, BorderLayout.PAGE_END);
}
@Override
long getStartTime() {
return ((Date) start.getValue()).getTime();
}
@Override
long getEndTime() {
return ((Date) end.getValue()).getTime();
}
void setTimes(long start, long end) {
this.start.setValue(new java.util.Date(start));
this.end.setValue(new java.util.Date(end));
}
@Override
TimeZone getTimeZone() {
DateEditor de = (DateEditor) start.getEditor();
return de.getFormat().getTimeZone();
}
@Override
protected void setStartToEnd() {
start.setValue(end.getValue());
((JSpinner.DefaultEditor) end.getEditor()).getTextField().requestFocus();
}
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
if (enabled) {
((JSpinner.DefaultEditor) start.getEditor()).getTextField().requestFocus();
}
}
@Override
public void propertyChange(PropertyChangeEvent evt) {
if ("timeZone".equals(evt.getPropertyName())) {
TimeZone timeZone = (TimeZone) evt.getNewValue();
DateEditor de = (DateEditor) start.getEditor();
de.getFormat().setTimeZone(timeZone);
// hack to get the spinner to fire a state change and update the displayed value
((SpinnerDateModel) start.getModel()).setCalendarField(Calendar.MINUTE);
((SpinnerDateModel) start.getModel()).setCalendarField(Calendar.SECOND);
de = (DateEditor) end.getEditor();
de.getFormat().setTimeZone(timeZone);
((SpinnerDateModel) end.getModel()).setCalendarField(Calendar.MINUTE);
((SpinnerDateModel) end.getModel()).setCalendarField(Calendar.SECOND);
}
}
// update the interval when the start or end time changes
private final ChangeListener intervalUpdater = new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
long startTime = getStartTime();
long endTime = getEndTime();
if (endTime > startTime) {
startLabel.setFont(Styles.LABEL);
endLabel.setFont(Styles.LABEL);
startLabel.setForeground(Styles.DEFAULT_COLOR);
endLabel.setForeground(Styles.DEFAULT_COLOR);
((JSpinner.DefaultEditor) start.getEditor()).getTextField().setForeground(Styles.DEFAULT_COLOR);
((JSpinner.DefaultEditor) end.getEditor()).getTextField().setForeground(Styles.DEFAULT_COLOR);
Interval i = new Interval(startTime, endTime);
firePropertyChange("interval", null, i);
}
else {
startLabel.setFont(Styles.LABEL_ERROR);
endLabel.setFont(Styles.LABEL_ERROR);
startLabel.setForeground(Styles.ERROR_COLOR);
endLabel.setForeground(Styles.ERROR_COLOR);
((JSpinner.DefaultEditor) start.getEditor()).getTextField().setForeground(Styles.ERROR_COLOR);
((JSpinner.DefaultEditor) end.getEditor()).getTextField().setForeground(Styles.ERROR_COLOR);
firePropertyChange("interval", null, null);
}
}
};
}