1 package tim.prune.function;
3 import java.awt.BorderLayout;
4 import java.awt.Component;
5 import java.awt.FlowLayout;
6 import java.awt.GridLayout;
7 import java.awt.event.ActionEvent;
8 import java.awt.event.ActionListener;
9 import java.awt.event.KeyAdapter;
10 import java.awt.event.KeyEvent;
11 import java.awt.event.MouseAdapter;
13 import javax.swing.BorderFactory;
14 import javax.swing.BoxLayout;
15 import javax.swing.ButtonGroup;
16 import javax.swing.JButton;
17 import javax.swing.JDialog;
18 import javax.swing.JLabel;
19 import javax.swing.JPanel;
20 import javax.swing.JRadioButton;
21 import javax.swing.SwingConstants;
24 import tim.prune.GenericFunction;
25 import tim.prune.I18nManager;
26 import tim.prune.data.Field;
27 import tim.prune.gui.WholeNumberField;
30 * Class to provide the function to add a time offset to a track range
32 public class AddTimeOffset extends GenericFunction
34 private JDialog _dialog = null;
35 private JRadioButton _addRadio = null, _subtractRadio = null;
36 private WholeNumberField _dayField = null, _hourField = null;
37 private WholeNumberField _minuteField = null;
38 private JButton _okButton = null;
43 * @param inApp application object for callback
45 public AddTimeOffset(App inApp)
50 /** Get the name key */
51 public String getNameKey() {
52 return "function.addtimeoffset";
60 int selStart = _app.getTrackInfo().getSelection().getStart();
61 int selEnd = _app.getTrackInfo().getSelection().getEnd();
62 if (!_app.getTrackInfo().getTrack().hasData(Field.TIMESTAMP, selStart, selEnd))
64 _app.showErrorMessage(getNameKey(), "dialog.addtimeoffset.notimestamps");
70 _dialog = new JDialog(_parentFrame, I18nManager.getText(getNameKey()), true);
71 _dialog.setLocationRelativeTo(_parentFrame);
72 _dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
73 _dialog.getContentPane().add(makeDialogComponents());
76 _dialog.setVisible(true);
81 * Create dialog components
82 * @return Panel containing all gui elements in dialog
84 private Component makeDialogComponents()
86 JPanel dialogPanel = new JPanel();
87 dialogPanel.setLayout(new BorderLayout());
88 JPanel mainPanel = new JPanel();
89 mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));
90 // Make a panel for the two radio buttons
91 JPanel radioPanel = new JPanel();
92 _addRadio = new JRadioButton(I18nManager.getText("dialog.addtimeoffset.add"));
93 _addRadio.setSelected(true);
94 radioPanel.add(_addRadio);
95 _subtractRadio = new JRadioButton(I18nManager.getText("dialog.addtimeoffset.subtract"));
96 _subtractRadio.setSelected(false);
97 radioPanel.add(_subtractRadio);
98 ButtonGroup radioGroup = new ButtonGroup();
99 radioGroup.add(_addRadio);
100 radioGroup.add(_subtractRadio);
101 mainPanel.add(radioPanel);
103 // Make a central panel with the text boxes
104 JPanel descPanel = new JPanel();
105 descPanel.setLayout(new GridLayout(0, 2));
106 descPanel.add(makeRightLabel("dialog.addtimeoffset.days"));
107 _dayField = new WholeNumberField(3);
108 descPanel.add(_dayField);
109 descPanel.add(makeRightLabel("dialog.addtimeoffset.hours"));
110 _hourField = new WholeNumberField(3);
111 descPanel.add(_hourField);
112 descPanel.add(makeRightLabel("dialog.addtimeoffset.minutes"));
113 _minuteField = new WholeNumberField(3);
114 descPanel.add(_minuteField);
115 mainPanel.add(descPanel);
116 dialogPanel.add(mainPanel, BorderLayout.CENTER);
118 // Listeners to enable/disable ok button
119 KeyAdapter keyListener = new KeyAdapter() {
121 public void keyTyped(KeyEvent arg0) {
122 _okButton.setEnabled(getOffsetSecs() != 0L);
125 MouseAdapter mouseListener = new MouseAdapter() {
126 public void mouseReleased(java.awt.event.MouseEvent arg0) {
127 _okButton.setEnabled(getOffsetSecs() != 0L);
130 _dayField.addKeyListener(keyListener);
131 _hourField.addKeyListener(keyListener);
132 _minuteField.addKeyListener(keyListener);
133 _dayField.addMouseListener(mouseListener);
134 _hourField.addMouseListener(mouseListener);
135 _minuteField.addMouseListener(mouseListener);
137 // button panel at bottom
138 JPanel buttonPanel = new JPanel();
139 buttonPanel.setLayout(new FlowLayout(FlowLayout.RIGHT));
140 _okButton = new JButton(I18nManager.getText("button.ok"));
141 ActionListener okListener = new ActionListener() {
142 public void actionPerformed(ActionEvent e)
147 _okButton.addActionListener(okListener);
148 _okButton.setEnabled(false);
149 buttonPanel.add(_okButton);
150 JButton cancelButton = new JButton(I18nManager.getText("button.cancel"));
151 cancelButton.addActionListener(new ActionListener() {
152 public void actionPerformed(ActionEvent e)
157 buttonPanel.add(cancelButton);
158 dialogPanel.add(buttonPanel, BorderLayout.SOUTH);
159 dialogPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 15));
165 * @param inKey text key
166 * @return right-aligned label
168 private static final JLabel makeRightLabel(String inKey)
170 JLabel label = new JLabel(I18nManager.getText(inKey) + " : ");
171 label.setHorizontalAlignment(SwingConstants.RIGHT);
176 * @return the number of offset seconds entered by the user
178 private long getOffsetSecs()
180 long offsetSecs = _minuteField.getValue() * 60L
181 + _hourField.getValue() * 60L * 60L
182 + _dayField.getValue() * 60L * 60L * 24L;
183 if (_subtractRadio.isSelected()) {offsetSecs = -offsetSecs;}
188 * Finish the dialog when OK pressed
190 private void finish()
192 // Calculate offset to add or subtract
193 long offsetSecs = getOffsetSecs();
194 if (offsetSecs != 0L)
196 // Pass offset back to app and close dialog
197 _app.finishAddTimeOffset(offsetSecs);