Subversion Repositories svn.mios

Rev

Rev 846 | Rev 851 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 846 Rev 850
Line 30... Line 30...
30
import java.awt.event.ActionEvent;
30
import java.awt.event.ActionEvent;
31
import java.awt.event.ActionListener;
31
import java.awt.event.ActionListener;
32
import java.awt.event.ItemEvent;
32
import java.awt.event.ItemEvent;
33
import java.awt.event.ItemListener;
33
import java.awt.event.ItemListener;
34
import java.io.File;
34
import java.io.File;
-
 
35
import java.util.Iterator;
-
 
36
import java.util.LinkedList;
35
import java.util.Observable;
37
import java.util.Observable;
36
import java.util.Observer;
38
import java.util.Observer;
37
import java.util.StringTokenizer;
39
import java.util.StringTokenizer;
38
import java.util.LinkedList;
40
import java.util.Vector;
39
41
40
import javax.swing.BorderFactory;
42
import javax.swing.BorderFactory;
41
import javax.swing.JButton;
43
import javax.swing.JButton;
-
 
44
import javax.swing.JComponent;
42
import javax.swing.JFileChooser;
45
import javax.swing.JFileChooser;
43
import javax.swing.JLabel;
46
import javax.swing.JLabel;
-
 
47
import javax.swing.JMenuItem;
-
 
48
import javax.swing.JOptionPane;
44
import javax.swing.JPanel;
49
import javax.swing.JPanel;
-
 
50
import javax.swing.JPopupMenu;
45
import javax.swing.JScrollPane;
51
import javax.swing.JScrollPane;
46
import javax.swing.JSpinner;
52
import javax.swing.JSpinner;
47
import javax.swing.JTextField;
53
import javax.swing.JTextField;
48
import javax.swing.JTextPane;
54
import javax.swing.JTextPane;
49
import javax.swing.JOptionPane;
-
 
50
import javax.swing.SpinnerNumberModel;
55
import javax.swing.SpinnerNumberModel;
51
import javax.swing.event.ChangeEvent;
56
import javax.swing.event.ChangeEvent;
52
import javax.swing.event.ChangeListener;
57
import javax.swing.event.ChangeListener;
-
 
58
import javax.swing.event.PopupMenuEvent;
-
 
59
import javax.swing.event.PopupMenuListener;
-
 
60
import javax.swing.text.Segment;
53
import javax.swing.text.Style;
61
import javax.swing.text.Style;
54
import javax.swing.text.StyleConstants;
62
import javax.swing.text.StyleConstants;
55
import javax.swing.text.StyleContext;
63
import javax.swing.text.StyleContext;
56
import javax.swing.text.StyledDocument;
64
import javax.swing.text.StyledDocument;
57
import javax.swing.text.Segment;
-
 
58
65
59
import org.midibox.midi.MidiUtils;
66
import org.midibox.midi.MidiUtils;
60
import org.midibox.midi.SysexSendReceive;
67
import org.midibox.midi.SysexSendReceive;
61
import org.midibox.utils.gui.ImageLoader;
68
import org.midibox.utils.gui.ImageLoader;
62
import org.midibox.utils.gui.SimpleFileChooserFilter;
69
import org.midibox.utils.gui.SimpleFileChooserFilter;
-
 
70
import org.midibox.utils.gui.SplitButton;
63
71
64
public class SysexSendReceiveGUI extends JPanel implements ActionListener,
72
public class SysexSendReceiveGUI extends JPanel implements ActionListener,
65
        ItemListener, ChangeListener, Observer {
73
        ItemListener, ChangeListener, Observer {
-
 
74
-
 
75
    private JPopupMenu MRUPopupMenu;
-
 
76
-
 
77
    private SplitButton openMRUButton;
-
 
78
-
 
79
    private static int maxMRU = 10;
66
80
67
    private static String currentDirectory = "";
81
    private static String currentDirectory = "";
-
 
82
-
 
83
    private static Vector MRU = new Vector();
68
84
69
    private static JFileChooser fc = null;
85
    private static JFileChooser fc = null;
70
86
71
    private SysexSendReceive sysexSendReceive;
87
    private SysexSendReceive sysexSendReceive;
72
88
Line 75... Line 91...
75
    private JButton sendBrowseButton;
91
    private JButton sendBrowseButton;
76
    private JTextField sendFileName;
92
    private JTextField sendFileName;
77
    private JButton sendStartButton;
93
    private JButton sendStartButton;
78
    private JButton sendStopButton;
94
    private JButton sendStopButton;
79
    private JButton sendClearButton;
95
    private JButton sendClearButton;
-
 
96
    private JButton sendSaveButton;
80
97
81
    private JButton receiveBrowseButton;
-
 
82
    private JTextField receiveFileName;
-
 
83
    private JButton receiveStartButton;
98
    private JButton receiveStartButton;
84
    private JButton receiveStopButton;
99
    private JButton receiveStopButton;
85
    private JButton receiveClearButton;
100
    private JButton receiveClearButton;
-
 
101
    private JButton receiveSaveButton;
86
102
87
    private JTextPane sysexSendTextArea;
103
    private JTextPane sysexSendTextArea;
88
104
89
    private JTextPane sysexReceiveTextArea;
105
    private JTextPane sysexReceiveTextArea;
90
106
91
    private JSpinner sendDelayTimeSpinner;
107
    private JSpinner sendDelayTimeSpinner;
92
108
93
    public SysexSendReceiveGUI(SysexSendReceive sysexSendReceive) {
109
    public SysexSendReceiveGUI(SysexSendReceive sysexSendReceive) {
-
 
110
94
        super(new BorderLayout());
111
        super(new BorderLayout());
95
112
96
        this.sysexSendReceive = sysexSendReceive;
113
        this.sysexSendReceive = sysexSendReceive;
-
 
114
97
        sysexSendReceive.addObserver(this);
115
        sysexSendReceive.addObserver(this);
98
116
99
        sendBrowseButton = new JButton("Open File", ImageLoader
117
        sendBrowseButton = new JButton("SysEx File", ImageLoader
100
                .getImageIcon("open.png"));
118
                .getImageIcon("open.png"));
101
        sendFileName = new JTextField();
119
        sendFileName = new JTextField();
102
        sendFileName.setEditable(false);
120
        sendFileName.setEditable(false);
103
        sendBrowseButton.setActionCommand("sendBrowse");
121
        sendBrowseButton.setActionCommand("sendBrowse");
104
        sendBrowseButton.addActionListener(this);
122
        sendBrowseButton.addActionListener(this);
Line 114... Line 132...
114
        sendClearButton = new JButton("Clear");
132
        sendClearButton = new JButton("Clear");
115
        sendClearButton.addActionListener(this);
133
        sendClearButton.addActionListener(this);
116
        sendClearButton.setActionCommand("sendClear");
134
        sendClearButton.setActionCommand("sendClear");
117
        sendClearButton.setAlignmentX(Component.LEFT_ALIGNMENT);
135
        sendClearButton.setAlignmentX(Component.LEFT_ALIGNMENT);
118
136
119
-
 
120
        receiveBrowseButton = new JButton("Save File", ImageLoader
137
        sendSaveButton = new JButton("", ImageLoader.getImageIcon("save.png"));
121
                .getImageIcon("open.png"));
-
 
122
        receiveFileName = new JTextField();
-
 
123
        receiveFileName.setEditable(false);
-
 
124
        receiveBrowseButton.setActionCommand("receiveBrowse");
138
        sendSaveButton.setActionCommand("sendSave");
125
        receiveBrowseButton.addActionListener(this);
139
        sendSaveButton.addActionListener(this);
126
140
127
        receiveStartButton = new JButton("Start");
141
        receiveStartButton = new JButton("Start");
128
        receiveStartButton.setActionCommand("receiveStart");
142
        receiveStartButton.setActionCommand("receiveStart");
129
        receiveStartButton.addActionListener(this);
143
        receiveStartButton.addActionListener(this);
130
        receiveStartButton.setAlignmentX(Component.LEFT_ALIGNMENT);
144
        receiveStartButton.setAlignmentX(Component.LEFT_ALIGNMENT);
Line 134... Line 148...
134
        receiveStopButton.setAlignmentX(Component.LEFT_ALIGNMENT);
148
        receiveStopButton.setAlignmentX(Component.LEFT_ALIGNMENT);
135
        receiveClearButton = new JButton("Clear");
149
        receiveClearButton = new JButton("Clear");
136
        receiveClearButton.addActionListener(this);
150
        receiveClearButton.addActionListener(this);
137
        receiveClearButton.setActionCommand("receiveClear");
151
        receiveClearButton.setActionCommand("receiveClear");
138
        receiveClearButton.setAlignmentX(Component.LEFT_ALIGNMENT);
152
        receiveClearButton.setAlignmentX(Component.LEFT_ALIGNMENT);
-
 
153
        receiveSaveButton = new JButton("", ImageLoader
-
 
154
                .getImageIcon("save.png"));
-
 
155
        receiveSaveButton.setActionCommand("receiveSave");
-
 
156
        receiveSaveButton.addActionListener(this);
139
157
-
 
158
        JPanel sendFileButtonsPanel = new JPanel(new BorderLayout(2, 2));
140
159
-
 
160
        MRUPopupMenu = new JPopupMenu();
-
 
161
        MRUPopupMenu.addPopupMenuListener(new PopupMenuListener() {
141
162
-
 
163
            public void popupMenuCanceled(PopupMenuEvent e) {
-
 
164
-
 
165
            }
-
 
166
-
 
167
            public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
-
 
168
-
 
169
            }
-
 
170
-
 
171
            public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
-
 
172
-
 
173
                SysexSendReceiveGUI.this.buildMRUMenu(MRUPopupMenu);
-
 
174
-
 
175
            }
-
 
176
        });
-
 
177
142
        JPanel sendFileButtonsPanel = new JPanel(new BorderLayout(2, 2));
178
        openMRUButton = new SplitButton(sendBrowseButton, MRUPopupMenu);
-
 
179
        openMRUButton.setRollover(true);
-
 
180
143
        sendFileButtonsPanel.add(sendBrowseButton, BorderLayout.WEST);
181
        sendFileButtonsPanel.add(openMRUButton, BorderLayout.WEST);
144
        sendFileButtonsPanel.add(sendFileName, BorderLayout.CENTER);
182
        sendFileButtonsPanel.add(sendFileName, BorderLayout.CENTER);
145
        sendFileButtonsPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
183
        sendFileButtonsPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5,
-
 
184
                5));
146
185
147
        JPanel sendControlButtonsPanel = new JPanel(new GridBagLayout());
186
        JPanel sendControlButtonsPanel = new JPanel(new GridBagLayout());
148
        GridBagConstraints gbc = new GridBagConstraints();
187
        GridBagConstraints gbc = new GridBagConstraints();
149
        gbc.gridx = 0;
188
        gbc.gridx = 0;
150
        gbc.gridy = 0;
189
        gbc.gridy = 0;
Line 162... Line 201...
162
        gbc.gridx++;
201
        gbc.gridx++;
163
202
164
        gbc.insets = new Insets(5, 13, 5, 5);
203
        gbc.insets = new Insets(5, 13, 5, 5);
165
204
166
        sendControlButtonsPanel.add(sendClearButton, gbc);
205
        sendControlButtonsPanel.add(sendClearButton, gbc);
-
 
206
        gbc.gridx++;
-
 
207
-
 
208
        sendControlButtonsPanel.add(sendSaveButton, gbc);
167
        gbc.gridx++;
209
        gbc.gridx++;
168
210
169
        gbc.insets = new Insets(2, 2, 2, 2);
211
        gbc.insets = new Insets(2, 2, 2, 2);
170
212
171
        gbc.weightx = 1.0;
213
        gbc.weightx = 1.0;
Line 181... Line 223...
181
223
182
        sendDelayTimeSpinner = new JSpinner(new SpinnerNumberModel(
224
        sendDelayTimeSpinner = new JSpinner(new SpinnerNumberModel(
183
                sysexSendReceive.getSendDelayTime(), 1, 1000, 1));
225
                sysexSendReceive.getSendDelayTime(), 1, 1000, 1));
184
        sendDelayTimeSpinner.addChangeListener(this);
226
        sendDelayTimeSpinner.addChangeListener(this);
185
        sendControlButtonsPanel.add(sendDelayTimeSpinner, gbc);
227
        sendControlButtonsPanel.add(sendDelayTimeSpinner, gbc);
186
-
 
187
-
 
188
-
 
189
        JPanel receiveFileButtonsPanel = new JPanel(new BorderLayout(2, 2));
-
 
190
        receiveFileButtonsPanel.add(receiveBrowseButton, BorderLayout.WEST);
-
 
191
        receiveFileButtonsPanel.add(receiveFileName, BorderLayout.CENTER);
-
 
192
        receiveFileButtonsPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
-
 
193
228
194
        JPanel receiveControlButtonsPanel = new JPanel(new GridBagLayout());
229
        JPanel receiveControlButtonsPanel = new JPanel(new GridBagLayout());
195
        gbc.gridx = 0;
230
        gbc.gridx = 0;
196
        gbc.gridy = 0;
231
        gbc.gridy = 0;
197
        gbc.gridwidth = 1;
232
        gbc.gridwidth = 1;
Line 203... Line 238...
203
        gbc.gridx++;
238
        gbc.gridx++;
204
        gbc.insets = new Insets(5, 13, 5, 5);
239
        gbc.insets = new Insets(5, 13, 5, 5);
205
        receiveControlButtonsPanel.add(receiveStopButton, gbc);
240
        receiveControlButtonsPanel.add(receiveStopButton, gbc);
206
        gbc.gridx++;
241
        gbc.gridx++;
207
        receiveControlButtonsPanel.add(receiveClearButton, gbc);
242
        receiveControlButtonsPanel.add(receiveClearButton, gbc);
208
-
 
209
243
        gbc.gridx++;
-
 
244
        receiveControlButtonsPanel.add(receiveSaveButton, gbc);
210
245
211
        JPanel sendPanel = new JPanel(new GridBagLayout());
246
        JPanel sendPanel = new JPanel(new GridBagLayout());
212
247
213
        gbc.fill = GridBagConstraints.BOTH;
248
        gbc.fill = GridBagConstraints.BOTH;
214
        gbc.weightx = 1.0;
249
        gbc.weightx = 1.0;
Line 226... Line 261...
226
        Style def = StyleContext.getDefaultStyleContext().getStyle(
261
        Style def = StyleContext.getDefaultStyleContext().getStyle(
227
                StyleContext.DEFAULT_STYLE);
262
                StyleContext.DEFAULT_STYLE);
228
263
229
        doc.addStyle("regular", def);
264
        doc.addStyle("regular", def);
230
        StyleConstants.setFontFamily(def, "Monospaced");
265
        StyleConstants.setFontFamily(def, "Monospaced");
-
 
266
-
 
267
        sysexSendTextArea.setLogicalStyle(def);
-
 
268
-
 
269
        if (sysexSendReceive.getSendFile() != null) {
-
 
270
-
 
271
            loadSysexSendFile();
-
 
272
        }
231
273
232
        JScrollPane sysexSendTextAreaScrollPane = new JScrollPane(
274
        JScrollPane sysexSendTextAreaScrollPane = new JScrollPane(
233
                sysexSendTextArea);
275
                sysexSendTextArea);
234
        sysexSendTextAreaScrollPane
276
        sysexSendTextAreaScrollPane
235
                .setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
277
                .setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
Line 245... Line 287...
245
        gbc.weighty = 1.0;
287
        gbc.weighty = 1.0;
246
        sendPanel.add(sendControlButtonsPanel, gbc);
288
        sendPanel.add(sendControlButtonsPanel, gbc);
247
        gbc.gridy++;
289
        gbc.gridy++;
248
        gbc.weighty = 1.0;
290
        gbc.weighty = 1.0;
249
        sendPanel.add(sysexSendTextAreaScrollPane, gbc);
291
        sendPanel.add(sysexSendTextAreaScrollPane, gbc);
250
-
 
251
292
252
        JPanel receivePanel = new JPanel(new GridBagLayout());
293
        JPanel receivePanel = new JPanel(new GridBagLayout());
253
        receivePanel.setBorder(BorderFactory.createCompoundBorder(BorderFactory
294
        receivePanel.setBorder(BorderFactory.createCompoundBorder(BorderFactory
254
                .createEmptyBorder(2, 2, 2, 2), BorderFactory
295
                .createEmptyBorder(2, 2, 2, 2), BorderFactory
255
                .createTitledBorder("Receive")));
296
                .createTitledBorder("Receive")));
256
297
257
        sysexReceiveTextArea = new JTextPane();
298
        sysexReceiveTextArea = new JTextPane();
258
        sysexReceiveTextArea.setBackground(Color.WHITE);
299
        sysexReceiveTextArea.setBackground(Color.WHITE);
259
300
260
        sysexReceiveTextArea.setEditable(true);
301
        sysexReceiveTextArea.setEditable(true);
-
 
302
-
 
303
        doc = sysexReceiveTextArea.getStyledDocument();
-
 
304
-
 
305
        def = StyleContext.getDefaultStyleContext().getStyle(
-
 
306
                StyleContext.DEFAULT_STYLE);
-
 
307
-
 
308
        doc.addStyle("regular", def);
-
 
309
        StyleConstants.setFontFamily(def, "Monospaced");
-
 
310
-
 
311
        sysexReceiveTextArea.setLogicalStyle(def);
-
 
312
261
        JScrollPane sysexReceiveTextAreaScrollPane = new JScrollPane(
313
        JScrollPane sysexReceiveTextAreaScrollPane = new JScrollPane(
262
                sysexReceiveTextArea);
314
                sysexReceiveTextArea);
263
        sysexReceiveTextAreaScrollPane
315
        sysexReceiveTextAreaScrollPane
264
                .setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
316
                .setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
265
317
Line 268... Line 320...
268
                .setPreferredSize(new Dimension(300, 100));
320
                .setPreferredSize(new Dimension(300, 100));
269
321
270
        gbc.insets = new Insets(5, 5, 5, 5);
322
        gbc.insets = new Insets(5, 5, 5, 5);
271
        gbc.gridy = 0;
323
        gbc.gridy = 0;
272
        gbc.gridx = 0;
324
        gbc.gridx = 0;
273
        gbc.weighty = 1.0;
-
 
274
        receivePanel.add(receiveFileButtonsPanel, gbc);
-
 
275
        gbc.gridx = 0;
-
 
276
        gbc.gridy++;
-
 
277
        gbc.weighty = 1.0;
325
        gbc.weighty = 1.0;
278
        gbc.fill = GridBagConstraints.NONE;
326
        gbc.fill = GridBagConstraints.NONE;
279
        gbc.anchor = GridBagConstraints.WEST;
327
        gbc.anchor = GridBagConstraints.WEST;
280
        receivePanel.add(receiveControlButtonsPanel, gbc);
328
        receivePanel.add(receiveControlButtonsPanel, gbc);
281
        gbc.anchor = GridBagConstraints.CENTER;
329
        gbc.anchor = GridBagConstraints.CENTER;
Line 299... Line 347...
299
347
300
        UIUpdate();
348
        UIUpdate();
301
    }
349
    }
302
350
303
    public void UIUpdate() {
351
    public void UIUpdate() {
304
        boolean bUploading = (!sysexSendReceive.isSendCancelled() && !sysexSendReceive.isSendDone());
352
        boolean bUploading = (!sysexSendReceive.isSendCancelled() && !sysexSendReceive
-
 
353
                .isSendDone());
305
        boolean bReceiving = !sysexSendReceive.isReceiveStopped();
354
        boolean bReceiving = !sysexSendReceive.isReceiveStopped();
306
355
307
        sendBrowseButton.setEnabled(!bUploading);
356
        sendBrowseButton.setEnabled(!bUploading);
308
        sendStartButton.setEnabled(!bUploading);
357
        sendStartButton.setEnabled(!bUploading);
309
        sendStopButton.setEnabled(bUploading);
358
        sendStopButton.setEnabled(bUploading);
310
        sendClearButton.setEnabled(!bUploading);
359
        sendClearButton.setEnabled(!bUploading);
311
        sendDelayTimeSpinner.setEnabled(!bUploading);
360
        sendDelayTimeSpinner.setEnabled(!bUploading);
312
        sysexSendTextArea.setEnabled(!bUploading);
361
        sysexSendTextArea.setEnabled(!bUploading);
313
362
314
        receiveBrowseButton.setEnabled(!bReceiving);
363
        receiveSaveButton.setEnabled(!bReceiving);
315
        receiveStartButton.setEnabled(!bReceiving);
364
        receiveStartButton.setEnabled(!bReceiving);
316
        receiveStopButton.setEnabled(bReceiving);
365
        receiveStopButton.setEnabled(bReceiving);
317
        //receiveClearButton.setEnabled(!bReceiving); // better to allow clear while receiving
366
        // receiveClearButton.setEnabled(!bReceiving); // better to allow clear
-
 
367
        // while receiving
318
        sysexReceiveTextArea.setEnabled(!bReceiving);
368
        sysexReceiveTextArea.setEnabled(!bReceiving);
319
    }
369
    }
320
-
 
321
370
322
    public void actionPerformed(ActionEvent e) {
371
    public void actionPerformed(ActionEvent e) {
323
        if (e.getActionCommand() == "sendStart") {
372
        if (e.getActionCommand() == "sendStart") {
324
            byte[] sysexData = new byte[sysexSendReceive.getSendBufferSize()];
373
            byte[] sysexData = new byte[sysexSendReceive.getSendBufferSize()];
325
            int sysexDataOffset = 0;
374
            int sysexDataOffset = 0;
Line 334... Line 383...
334
                text.setPartialReturn(true);  
383
                text.setPartialReturn(true);
335
                while (nleft > 0) {
384
                while (nleft > 0) {
336
                    try {
385
                    try {
337
                        doc.getText(offs, nleft, text);
386
                        doc.getText(offs, nleft, text);
338
                    } catch (Exception ex) {
387
                    } catch (Exception ex) {
-
 
388
                        JOptionPane.showMessageDialog(null,
-
 
389
                                "Error while parsing hex digits!",
339
                        JOptionPane.showMessageDialog(null, "Error while parsing hex digits!", "Syntax Error", JOptionPane.ERROR_MESSAGE);
390
                                "Syntax Error", JOptionPane.ERROR_MESSAGE);
340
                        return;
391
                        return;
341
                    }
392
                    }
342
393
343
                    StringTokenizer st = new StringTokenizer(text.toString());
394
                    StringTokenizer st = new StringTokenizer(text.toString());
344
                    while (st.hasMoreTokens()) {
395
                    while (st.hasMoreTokens()) {
345
                        int value;
396
                        int value;
346
397
347
                        try {
398
                        try {
348
                            value = (int)java.lang.Integer.parseInt(st.nextToken(), 16);
399
                            value = (int) java.lang.Integer.parseInt(st
-
 
400
                                    .nextToken(), 16);
349
                            sysexData[sysexDataOffset++] = (byte)value;
401
                            sysexData[sysexDataOffset++] = (byte) value;
350
                        } catch(Exception ex) {
402
                        } catch (Exception ex) {
-
 
403
                            JOptionPane.showMessageDialog(null,
-
 
404
                                    "Found invalid hexadecimal digit!",
351
                            JOptionPane.showMessageDialog(null, "Found invalid hexadecimal digit!", "Syntax Error", JOptionPane.ERROR_MESSAGE);
405
                                    "Syntax Error", JOptionPane.ERROR_MESSAGE);
352
                            return;
406
                            return;
353
                        }
407
                        }
354
                    }
408
                    }
355
409
356
                    nleft -= text.count;
410
                    nleft -= text.count;
Line 361... Line 415...
361
                    final byte[] finalSysexData = sysexData;
415
                    final byte[] finalSysexData = sysexData;
362
                    final int finalSysexDataOffset = sysexDataOffset;
416
                    final int finalSysexDataOffset = sysexDataOffset;
363
417
364
                    Thread t = new Thread() {
418
                    Thread t = new Thread() {
365
                            public void run() {
419
                        public void run() {
366
                                sysexSendReceive.startSend(finalSysexData, finalSysexDataOffset);
420
                            sysexSendReceive.startSend(finalSysexData,
-
 
421
                                    finalSysexDataOffset);
367
                            }
422
                        }
368
                        };
423
                    };
369
                   
424
370
                    t.start();
425
                    t.start();
371
                }
426
                }
Line 387... Line 442...
387
            sysexSendReceive.setReceiveStopped(true);
442
            sysexSendReceive.setReceiveStopped(true);
388
443
389
        } else if (e.getActionCommand() == "receiveClear") {
444
        } else if (e.getActionCommand() == "receiveClear") {
390
            sysexReceiveTextArea.setText("");
445
            sysexReceiveTextArea.setText("");
391
446
392
        } else if (e.getActionCommand() == "receiveBrowse") {
447
        } else if (e.getActionCommand() == "receiveSave") {
-
 
448
            onSaveSysexFile(sysexReceiveTextArea.getStyledDocument());
-
 
449
-
 
450
        } else if (e.getActionCommand() == "sendSave") {
393
            onSaveSysexFile();
451
            onSaveSysexFile(sysexSendTextArea.getStyledDocument());
394
        }
452
        }
395
453
396
        UIUpdate();
454
        UIUpdate();
397
    }
455
    }
398
456
Line 410... Line 468...
410
        fc.setSelectedFiles(noFiles);
468
        fc.setSelectedFiles(noFiles);
411
469
412
        int nRetVal = fc.showOpenDialog(this);
470
        int nRetVal = fc.showOpenDialog(this);
413
471
414
        if (nRetVal == JFileChooser.APPROVE_OPTION) {
472
        if (nRetVal == JFileChooser.APPROVE_OPTION) {
-
 
473
415
            File file = fc.getSelectedFile();
474
            File file = fc.getSelectedFile();
-
 
475
416
            sysexSendReceive.setSendFile(file);
476
            openSysexSendFile(file);
-
 
477
417
            currentDirectory = fc.getCurrentDirectory().toString();
478
            currentDirectory = fc.getCurrentDirectory().toString();
418
        }
479
        }
419
    }
480
    }
420
481
421
    protected void onSaveSysexFile() {
482
    protected void onSaveSysexFile(StyledDocument doc) {
422
483
423
        if (fc == null) {
484
        if (fc == null) {
424
            fc = new JFileChooser(currentDirectory);
485
            fc = new JFileChooser(currentDirectory);
425
            fc.addChoosableFileFilter(new SimpleFileChooserFilter(
486
            fc.addChoosableFileFilter(new SimpleFileChooserFilter(
426
                    "SysEx files (*.syx)", "syx", "SysEx File"));
487
                    "SysEx files (*.syx)", "syx", "SysEx File"));
Line 436... Line 497...
436
        if (nRetVal == JFileChooser.APPROVE_OPTION) {
497
        if (nRetVal == JFileChooser.APPROVE_OPTION) {
437
            File file = fc.getSelectedFile();
498
            File file = fc.getSelectedFile();
438
            sysexSendReceive.setReceiveFile(file);
499
            sysexSendReceive.setReceiveFile(file);
439
            currentDirectory = fc.getCurrentDirectory().toString();
500
            currentDirectory = fc.getCurrentDirectory().toString();
440
501
441
            int maxSysexDataLen = 200000; // TODO: find better method... linked list?
502
            int maxSysexDataLen = 200000; // TODO: find better method... linked
-
 
503
                                            // list?
442
            byte[] sysexData = new byte[maxSysexDataLen];
504
            byte[] sysexData = new byte[maxSysexDataLen];
443
            int sysexDataOffset = 0;
505
            int sysexDataOffset = 0;
444
506
445
            StyledDocument doc = sysexReceiveTextArea.getStyledDocument();
-
 
446
            int len = doc.getLength();
507
            int len = doc.getLength();
447
508
448
            if( len > 0 ) {
509
            if (len > 0) {
449
                int nleft = len;
510
                int nleft = len;
450
                Segment text = new Segment();
511
                Segment text = new Segment();
Line 452... Line 513...
452
                text.setPartialReturn(true);
513
                text.setPartialReturn(true);
453
                while (nleft > 0) {
514
                while (nleft > 0) {
454
                    try {
515
                    try {
455
                        doc.getText(offs, nleft, text);
516
                        doc.getText(offs, nleft, text);
456
                    } catch (Exception ex) {
517
                    } catch (Exception ex) {
-
 
518
                        JOptionPane.showMessageDialog(null,
-
 
519
                                "Error while parsing hex digits!",
457
                        JOptionPane.showMessageDialog(null, "Error while parsing hex digits!", "Syntax Error", JOptionPane.ERROR_MESSAGE);
520
                                "Syntax Error", JOptionPane.ERROR_MESSAGE);
458
                        return;
521
                        return;
459
                    }
522
                    }
460
523
461
                    StringTokenizer st = new StringTokenizer(text.toString());
524
                    StringTokenizer st = new StringTokenizer(text.toString());
462
                    while (st.hasMoreTokens()) {
525
                    while (st.hasMoreTokens()) {
463
                        int value;
526
                        int value;
464
527
465
                        if( sysexDataOffset >= maxSysexDataLen ) {
528
                        if (sysexDataOffset >= maxSysexDataLen) {
-
 
529
                            JOptionPane.showMessageDialog(null,
466
                            JOptionPane.showMessageDialog(null, "Too many SysEx bytes!", "Parsing Error", JOptionPane.ERROR_MESSAGE);
530
                                    "Too many SysEx bytes!", "Parsing Error",
-
 
531
                                    JOptionPane.ERROR_MESSAGE);
467
                            return;
532
                            return;
468
                        }
533
                        }
469
534
470
                        try {
535
                        try {
471
                            value = (int)java.lang.Integer.parseInt(st.nextToken(), 16);
536
                            value = (int) java.lang.Integer.parseInt(st
-
 
537
                                    .nextToken(), 16);
472
                            sysexData[sysexDataOffset++] = (byte)value;
538
                            sysexData[sysexDataOffset++] = (byte) value;
473
                        } catch(Exception ex) {
539
                        } catch (Exception ex) {
-
 
540
                            JOptionPane.showMessageDialog(null,
-
 
541
                                    "Found invalid hexadecimal digit!",
474
                            JOptionPane.showMessageDialog(null, "Found invalid hexadecimal digit!", "Syntax Error", JOptionPane.ERROR_MESSAGE);
542
                                    "Syntax Error", JOptionPane.ERROR_MESSAGE);
475
                            return;
543
                            return;
476
                        }
544
                        }
477
                    }
545
                    }
478
546
479
                    nleft -= text.count;
547
                    nleft -= text.count;
480
                    offs += text.count;
548
                    offs += text.count;
481
                }
549
                }
482
550
483
                if( sysexDataOffset > 0 ) {
551
                if (sysexDataOffset > 0) {
484
                    if( !sysexSendReceive.writeSysexFile(file, sysexData, sysexDataOffset) ) {
552
                    if (!sysexSendReceive.writeSysexFile(file, sysexData,
-
 
553
                            sysexDataOffset)) {
-
 
554
                        JOptionPane.showMessageDialog(null,
-
 
555
                                "Error while writing file!",
485
                        JOptionPane.showMessageDialog(null, "Error while writing file!", "File Access Error", JOptionPane.ERROR_MESSAGE);
556
                                "File Access Error", JOptionPane.ERROR_MESSAGE);
486
                        return;
557
                        return;
487
                    }
558
                    }
488
                }
559
                }
489
            }
560
            }
490
        }
561
        }
Line 497... Line 568...
497
    public void stateChanged(ChangeEvent e) {
568
    public void stateChanged(ChangeEvent e) {
498
569
499
        Object source = e.getSource();
570
        Object source = e.getSource();
500
571
501
        if (source == sendDelayTimeSpinner) {
572
        if (source == sendDelayTimeSpinner) {
502
            sysexSendReceive.setSendDelayTime(((Integer) sendDelayTimeSpinner.getValue()).intValue());
573
            sysexSendReceive.setSendDelayTime(((Integer) sendDelayTimeSpinner
-
 
574
                    .getValue()).intValue());
503
        }
575
        }
504
576
505
        UIUpdate();
577
        UIUpdate();
506
    }
578
    }
507
579
508
    public void update(Observable observable, Object object) {
580
    public void update(Observable observable, Object object) {
-
 
581
509
        if (observable == sysexSendReceive) {
582
        if (observable == sysexSendReceive) {
-
 
583
510
            if (object == sysexSendReceive.WORKER ) {
584
            if (object == sysexSendReceive.WORKER) {
-
 
585
511
            } else if (object == sysexSendReceive.getSendFile()) {
586
            } else if (object == sysexSendReceive.SEND_SYSEX_FILE) {
512
                sendFileName.setText(sysexSendReceive.getSendFile().getPath());
-
 
513
                sysexSendTextArea.setText("");
-
 
514
                StyledDocument doc = sysexSendTextArea.getStyledDocument();
-
 
515
                try {
-
 
516
                    doc
587
517
                            .insertString(0, MidiUtils
-
 
518
                                    .getHexString(sysexSendReceive
-
 
519
                                            .getSysexFile().getData()), doc
-
 
520
                                    .getStyle("regular"));
-
 
521
                } catch (Exception e) {
588
                loadSysexSendFile();
522
                }
589
523
            } else if (object == sysexSendReceive.getReceivedBytes()) {
590
            } else if (object == sysexSendReceive.RECEIVE_SYSEX_FILE) {
-
 
591
524
                StyledDocument doc = sysexReceiveTextArea.getStyledDocument();
592
                StyledDocument doc = sysexReceiveTextArea.getStyledDocument();
525
593
526
                LinkedList l = sysexSendReceive.getReceivedBytes();
594
                LinkedList l = sysexSendReceive.getReceivedBytes();
-
 
595
527
                int i;
596
                int i;
-
 
597
528
                for(i=0; i<l.size(); ++i) {
598
                for (i = 0; i < l.size(); ++i) {
529
                    byte[] data = (byte[])l.get(i);
599
                    byte[] data = (byte[]) l.get(i);
530
                    try {
600
                    try {
531
                        if( doc.getLength() > 0 )
601
                        if (doc.getLength() > 0)
532
                            doc.insertString(doc.getLength(), "\n", doc.getStyle("regular"));
602
                            doc.insertString(doc.getLength(), "\n", doc
-
 
603
                                    .getStyle("regular"));
533
                        doc.insertString(doc.getLength(), "F0 ", doc.getStyle("regular"));
604
                        doc.insertString(doc.getLength(), "F0 ", doc
-
 
605
                                .getStyle("regular"));
-
 
606
                        doc.insertString(doc.getLength(), MidiUtils
534
                        doc.insertString(doc.getLength(), MidiUtils.getHexString(data), doc.getStyle("regular"));
607
                                .getHexString(data), doc.getStyle("regular"));
535
                    } catch (Exception e) {
608
                    } catch (Exception e) {
536
                    }
609
                    }
537
                }
610
                }
538
                sysexSendReceive.clearReceivedBytes();
-
 
539
611
540
            } else if (object == sysexSendReceive.getReceiveFile()) {
612
                sysexSendReceive.clearReceivedBytes();
541
                receiveFileName.setText(sysexSendReceive.getReceiveFile().getPath());
-
 
542
            }
613
            }
543
614
544
            UIUpdate();
615
            UIUpdate();
545
        }
616
        }
-
 
617
    }
-
 
618
-
 
619
    private void buildMRUMenu(JComponent menu) {
-
 
620
-
 
621
        menu.removeAll();
-
 
622
-
 
623
        Iterator it = MRU.iterator();
-
 
624
-
 
625
        while (it.hasNext()) {
-
 
626
-
 
627
            final JMenuItem menuItem = new JMenuItem((String) it.next());
-
 
628
-
 
629
            menuItem.addActionListener(new ActionListener() {
-
 
630
-
 
631
                public void actionPerformed(ActionEvent ae) {
-
 
632
-
 
633
                    File file = new File(menuItem.getText());
-
 
634
-
 
635
                    openSysexSendFile(file);
-
 
636
                }
-
 
637
            });
-
 
638
-
 
639
            menu.add(menuItem, 0);
-
 
640
        }
-
 
641
    }
-
 
642
-
 
643
    protected void openSysexSendFile(File file) {
-
 
644
-
 
645
        if (file.exists()) {
-
 
646
-
 
647
            sysexSendReceive.setSendFile(file);
-
 
648
-
 
649
            saveMRU(file.getPath());
-
 
650
-
 
651
        } else {
-
 
652
            JOptionPane.showMessageDialog(this, "Hex file no longer exists",
-
 
653
                    "File does not exist", JOptionPane.ERROR_MESSAGE);
-
 
654
        }
-
 
655
    }
-
 
656
-
 
657
    public static void saveMRU(String file) {
-
 
658
-
 
659
        MRU.remove(file);
-
 
660
-
 
661
        MRU.add(file);
-
 
662
-
 
663
        for (int i = MRU.size() - maxMRU; i > 0; i--) {
-
 
664
-
 
665
            MRU.removeElementAt(i - 1);
-
 
666
        }
-
 
667
    }
-
 
668
-
 
669
    public static Vector getMRU() {
-
 
670
        return MRU;
546
    }
671
    }
547
672
548
    public SysexSendReceive getSysexSendReceive() {
673
    public SysexSendReceive getSysexSendReceive() {
549
        return sysexSendReceive;
674
        return sysexSendReceive;
550
    }
675
    }
Line 555... Line 680...
555
680
556
    public static void setCurrentDirectory(String currentDirectory) {
681
    public static void setCurrentDirectory(String currentDirectory) {
557
        SysexSendReceiveGUI.currentDirectory = currentDirectory;
682
        SysexSendReceiveGUI.currentDirectory = currentDirectory;
558
    }
683
    }
559
684
-
 
685
    private void loadSysexSendFile() {
-
 
686
-
 
687
        sendFileName.setText(sysexSendReceive.getSendFile().getPath());
-
 
688
-
 
689
        sysexSendTextArea.setText("");
-
 
690
-
 
691
        StyledDocument doc = sysexSendTextArea.getStyledDocument();
-
 
692
-
 
693
        try {
-
 
694
            doc.insertString(0, MidiUtils.getHexString(sysexSendReceive
-
 
695
                    .getSysexFile().getData()), doc.getStyle("regular"));
-
 
696
        } catch (Exception e) {
-
 
697
-
 
698
        }
-
 
699
    }
560
}
700
}