Subversion Repositories svn.mios

Rev

Rev 259 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 259 Rev 628
Line 17... Line 17...
17
 * along with this application; if not, write to the Free Software
17
 * along with this application; if not, write to the Free Software
18
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19
 */
19
 */
20
package org.midibox.sidedit.gui;
20
package org.midibox.sidedit.gui;
21
21
-
 
22
import java.awt.Color;
-
 
23
import java.awt.Component;
22
import java.awt.Dimension;
24
import java.awt.Dimension;
23
import javax.swing.event.*;
-
 
24
import java.awt.Graphics;
25
import java.awt.Graphics;
25
import java.awt.event.*;
26
import java.awt.event.ActionEvent;
26
import java.util.Vector;
27
import java.awt.event.ActionListener;
27
import javax.swing.table.TableModel;
28
import java.awt.event.MouseEvent;
28
import javax.swing.*;
29
import java.awt.event.MouseListener;
-
 
30
import java.awt.event.MouseMotionListener;
29
import java.util.Observable;
31
import java.util.Observable;
30
import java.util.Observer;
32
import java.util.Observer;
31
import java.util.EventObject;
33
import java.util.Vector;
32
import org.midibox.sidlibr.SIDLibController;
-
 
33
import java.awt.Color;
-
 
34
34
35
import javax.swing.BoxLayout;
35
import javax.swing.BoxLayout;
36
import javax.swing.JMenu;
36
import javax.swing.ButtonGroup;
37
import javax.swing.JMenuItem;
37
import javax.swing.JComponent;
38
import javax.swing.JPanel;
38
import javax.swing.JPanel;
-
 
39
import javax.swing.JPopupMenu;
-
 
40
import javax.swing.JRadioButton;
39
import javax.swing.JScrollPane;
41
import javax.swing.JScrollPane;
40
import javax.swing.JTable;
42
import javax.swing.JTable;
41
import javax.swing.KeyStroke;
-
 
42
import javax.swing.ListSelectionModel;
43
import javax.swing.ListSelectionModel;
43
import org.midibox.sidlibr.Bank;
44
import javax.swing.event.TableModelEvent;
44
import java.awt.Font;
45
import javax.swing.event.TableModelListener;
45
import org.midibox.sidedit.*;
46
import javax.swing.table.TableCellRenderer;
46
import javax.swing.table.*;
47
import javax.swing.table.TableModel;
-
 
48
47
import java.awt.Component;
49
import org.midibox.sidedit.SIDSysexParameterControl;
48
50
49
public class WTTable extends JPanel implements TableModelListener, Observer, MouseListener, MouseMotionListener, ActionListener {
51
public class WTTable extends JPanel implements TableModelListener, Observer,
-
 
52
        MouseListener, MouseMotionListener, ActionListener {
50
    JTable table;
53
    JTable table;
51
    JPopupMenu popupMenu;
54
    JPopupMenu popupMenu;
52
    int bankNumber;
55
    int bankNumber;
53
    int selectedBeforeDrag = 0;
56
    int selectedBeforeDrag = 0;
54
    private int wtNumber;
57
    private int wtNumber;
Line 64... Line 67...
64
    private String[] noteString;
67
    private String[] noteString;
65
    private JRadioButton decButton;
68
    private JRadioButton decButton;
66
    private JRadioButton hexButton;
69
    private JRadioButton hexButton;
67
    private JRadioButton noteButton;
70
    private JRadioButton noteButton;
68
   
71
69
    public WTTable(int wtNumber, Vector midiParams, SIDSysexParameterControl[][] config) {
72
    public WTTable(int wtNumber, Vector midiParams,
-
 
73
            SIDSysexParameterControl[][] config) {
70
        this.wtNumber = wtNumber;
74
        this.wtNumber = wtNumber;
71
        this.midiParams = midiParams;
75
        this.midiParams = midiParams;
72
        this.config = config;
76
        this.config = config;
73
       
77
74
        setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
78
        setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
Line 80... Line 84...
80
        table.addMouseListener(this);
84
        table.addMouseListener(this);
81
        table.addMouseMotionListener(this);
85
        table.addMouseMotionListener(this);
82
       
86
83
        table.getColumnModel().getColumn(0).setPreferredWidth(30);
87
        table.getColumnModel().getColumn(0).setPreferredWidth(30);
84
        for (int c=0;c<wtNumber;c++) {
88
        for (int c = 0; c < wtNumber; c++) {
85
            table.getColumnModel().getColumn(c+1).setCellRenderer(new ColorCellRenderer());
89
            table.getColumnModel().getColumn(c + 1).setCellRenderer(
-
 
90
                    new ColorCellRenderer());
86
            table.getColumnModel().getColumn(c+1).setPreferredWidth(10);
91
            table.getColumnModel().getColumn(c + 1).setPreferredWidth(10);
87
        }
92
        }
88
       
93
89
        table.getColumnModel().getColumn(wtNumber+1).setCellRenderer(new ColorCellRenderer());     
94
        table.getColumnModel().getColumn(wtNumber + 1).setCellRenderer(
-
 
95
                new ColorCellRenderer());
90
        table.getColumnModel().getColumn(wtNumber+1).setPreferredWidth(150);
96
        table.getColumnModel().getColumn(wtNumber + 1).setPreferredWidth(150);
91
       
97
92
        table.setPreferredScrollableViewportSize(new Dimension(table.getPreferredSize().width, Math.round(table.getPreferredSize().height/10)));
98
        table.setPreferredScrollableViewportSize(new Dimension(table
-
 
99
                .getPreferredSize().width, Math
-
 
100
                .round(table.getPreferredSize().height / 10)));
93
        // TK: temporary commented out - not available under MacOS, we need a replacement
101
        // TK: temporary commented out - not available under MacOS, we need a
-
 
102
        // replacement
94
        // table.setFillsViewportHeight(true);
103
        // table.setFillsViewportHeight(true);
95
       
104
96
        JScrollPane scrollPane = new JScrollPane(table);
105
        JScrollPane scrollPane = new JScrollPane(table);
-
 
106
        scrollPane.setPreferredSize(new Dimension(
97
        scrollPane.setPreferredSize(new Dimension(table.getPreferredSize().width, Math.round(table.getPreferredSize().height/4)));
107
                table.getPreferredSize().width, Math.round(table
-
 
108
                        .getPreferredSize().height / 4)));
98
       
109
99
        for(int row=0;row<midiParams.size();row++) {       
110
        for (int row = 0; row < midiParams.size(); row++) {
100
            ((SIDSysexParameterControl)midiParams.elementAt(row)).addObserver(this);
111
            ((SIDSysexParameterControl) midiParams.elementAt(row))
-
 
112
                    .addObserver(this);
101
        }  
113
        }
102
        for(int i=0;i<config.length;i++) { 
114
        for (int i = 0; i < config.length; i++) {
103
            for(int j=0;j<config[i].length;j++) {
115
            for (int j = 0; j < config[i].length; j++) {
104
                config[i][j].addObserver(this);
116
                config[i][j].addObserver(this);
105
            }
117
            }
Line 136... Line 148...
136
   
148
137
    public void refreshTable() {       
149
    public void refreshTable() {
138
        refreshing = true;
150
        refreshing = true;
139
        TableModel m = table.getModel();
151
        TableModel m = table.getModel();
140
        for(int row=0;row<midiParams.size();row++) {   
152
        for (int row = 0; row < midiParams.size(); row++) {
141
            String newval = interpret(((SIDSysexParameterControl)midiParams.elementAt(row)).getMidiValue());
153
            String newval = interpret(((SIDSysexParameterControl) midiParams
-
 
154
                    .elementAt(row)).getMidiValue());
142
            m.setValueAt(newval, row, wtNumber+1);
155
            m.setValueAt(newval, row, wtNumber + 1);
143
           
156
144
            // Set loop indicator
157
            // Set loop indicator
145
            for(int col=1;col<wtNumber+1;col++) {
158
            for (int col = 1; col < wtNumber + 1; col++) {
146
                if (config[col-1][2].getMidiValue()==row) {
159
                if (config[col - 1][2].getMidiValue() == row) {
Line 163... Line 176...
163
                v = Integer.parseInt(s, 16);
176
            v = Integer.parseInt(s, 16);
164
                break;
177
            break;
165
            case 2: // Note view (only lower part)
178
        case 2: // Note view (only lower part)
166
                v = Integer.parseInt(s);
179
            v = Integer.parseInt(s);
167
                break;
180
            break;
-
 
181
        default:
168
            default: throw new NumberFormatException("Input not recognized!");
182
            throw new NumberFormatException("Input not recognized!");
169
        }
183
        }
170
        return v;
184
        return v;
171
    }
185
    }
172
   
186
173
    private int findNote(String s) {
187
    private int findNote(String s) {
Line 184... Line 198...
184
        return v;
198
        return v;
185
    }
199
    }
186
   
200
187
    private void createNotes() {
201
    private void createNotes() {
188
        noteString = new String[256];
202
        noteString = new String[256];
189
        String[] notes = {"C","C#","D","D#","E","F","F#","G","G#","A","A#","B"};       
203
        String[] notes = { "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#",
-
 
204
                "A", "A#", "B" };
190
        for (int i = 0; i < 128; i++) {
205
        for (int i = 0; i < 128; i++) {
191
            if (i == 0) {
206
            if (i == 0) {
192
                noteString[i] = "---";
207
                noteString[i] = "---";
193
            }
-
 
194
            else if (i == 1) {
208
            } else if (i == 1) {
195
                noteString[i] = "+++";
209
                noteString[i] = "+++";
196
            }
-
 
197
            else if (i < 124) {
210
            } else if (i < 124) {
198
                int octave = (int) Math.floor((i)/12)-2;
211
                int octave = (int) Math.floor((i) / 12) - 2;
199
                if (octave < 0) {
212
                if (octave < 0) {
200
                    noteString[i] = notes[(i)%12] + octave;
213
                    noteString[i] = notes[(i) % 12] + octave;
201
                }
-
 
202
                else {
214
                } else {
203
                    noteString[i] = notes[(i)%12] + octave;
215
                    noteString[i] = notes[(i) % 12] + octave;
204
                }
216
                }
205
            }
-
 
206
            else if (i < 128) {
217
            } else if (i < 128) {
207
                noteString[i] = "Ky" + Integer.toString(i-123);
218
                noteString[i] = "Ky" + Integer.toString(i - 123);
208
            }
219
            }
209
        }
220
        }
210
    }
221
    }
211
   
222
212
    private void parseInput(String value, int row) {
223
    private void parseInput(String value, int row) {
213
        int v = ((SIDSysexParameterControl)midiParams.elementAt(row)).getMidiValue();
224
        int v = ((SIDSysexParameterControl) midiParams.elementAt(row))
-
 
225
                .getMidiValue();
214
        try {  
226
        try {
215
            if (value.equals("---")) {
227
            if (value.equals("---")) {
216
                v = 128;
228
                v = 128;
217
            } else if (value.equals("+++")) {
229
            } else if (value.equals("+++")) {
218
                v = 129;
230
                v = 129;
219
            } else if (value.substring(0,1).equals("-")) {          // Relative negative value                  
231
            } else if (value.substring(0, 1).equals("-")) { // Relative negative
-
 
232
                // value
220
                int temp = parseHexDec(value.substring(1));                
233
                int temp = parseHexDec(value.substring(1));
221
                if (-temp < -64) {
234
                if (-temp < -64) {
222
                    v = 0;                     
235
                    v = 0;
223
                } else if (-temp > 0) {
236
                } else if (-temp > 0) {
224
                    v = 64;                    
237
                    v = 64;
225
                } else {
238
                } else {
226
                    v = -temp+64;
239
                    v = -temp + 64;
227
                }
240
                }
228
            } else if (value.substring(0,1).equals("+")) {          // Relative positive value
241
            } else if (value.substring(0, 1).equals("+")) { // Relative positive
-
 
242
                // value
229
                int temp = parseHexDec(value.substring(1));
243
                int temp = parseHexDec(value.substring(1));
230
                if (temp < 0) {
244
                if (temp < 0) {
231
                    v = 63;
245
                    v = 63;
232
                } else if (temp > 63) {
246
                } else if (temp > 63) {
233
                    v = 127;                       
247
                    v = 127;
Line 250... Line 264...
250
                }
264
                }
251
            }
265
            }
252
        } catch (NumberFormatException e) {
266
        } catch (NumberFormatException e) {
253
            // Revert!                              
267
            // Revert!
254
        }
268
        }
255
        ((SIDSysexParameterControl)midiParams.elementAt(row)).setMidiValue(v, true);
269
        ((SIDSysexParameterControl) midiParams.elementAt(row)).setMidiValue(v,
-
 
270
                true);
256
    }
271
    }
257
272
258
    private String interpretHexDec(int i) {
273
    private String interpretHexDec(int i) {
259
        String s = null;
274
        String s = null;
260
        switch (decHexNote) {
275
        switch (decHexNote) {
Line 303... Line 318...
303
    public void update(Observable observable, Object object) {
318
    public void update(Observable observable, Object object) {
304
        refreshTable();
319
        refreshTable();
305
    }
320
    }
306
   
321
307
    public void actionPerformed(ActionEvent e) {
322
    public void actionPerformed(ActionEvent e) {
308
        if ((e.getSource()==decButton)||(e.getSource()==hexButton)||(e.getSource()==noteButton)) {
323
        if ((e.getSource() == decButton) || (e.getSource() == hexButton)
-
 
324
                || (e.getSource() == noteButton)) {
309
            if (decButton.isSelected()) {
325
            if (decButton.isSelected()) {
310
                decHexNote = 0;
326
                decHexNote = 0;
311
            } else if (hexButton.isSelected()) {
327
            } else if (hexButton.isSelected()) {
312
                decHexNote = 1;
328
                decHexNote = 1;
313
            } else if (noteButton.isSelected()) {
329
            } else if (noteButton.isSelected()) {
Line 323... Line 339...
323
   
339
324
    public void mousePressed(MouseEvent e) {
340
    public void mousePressed(MouseEvent e) {
325
        if (table.getSelectedColumn()==wtNumber+1) {
341
        if (table.getSelectedColumn() == wtNumber + 1) {
326
            valueDragging = true;
342
            valueDragging = true;
327
            rowDragging = table.getSelectedRow();
343
            rowDragging = table.getSelectedRow();
328
            startVal = (float)((SIDSysexParameterControl)midiParams.elementAt(rowDragging)).getMidiValue();
344
            startVal = (float) ((SIDSysexParameterControl) midiParams
-
 
345
                    .elementAt(rowDragging)).getMidiValue();
329
            dragpos = e.getX() - e.getY();                     
346
            dragpos = e.getX() - e.getY();
330
        }          
347
        }
331
    }
348
    }
332
349
333
    public void mouseReleased(MouseEvent e) {valueDragging = false;}
350
    public void mouseReleased(MouseEvent e) {
-
 
351
        valueDragging = false;
-
 
352
    }
334
353
335
    public void mouseEntered(MouseEvent e) {}
354
    public void mouseEntered(MouseEvent e) {
-
 
355
    }
336
356
337
    public void mouseExited(MouseEvent e) {}
357
    public void mouseExited(MouseEvent e) {
-
 
358
    }
338
359
339
    public void mouseClicked(MouseEvent e) {}
360
    public void mouseClicked(MouseEvent e) {
-
 
361
    }
340
362
341
    public void mouseMoved(MouseEvent me) {}
363
    public void mouseMoved(MouseEvent me) {
-
 
364
    }
342
365
343
    public void mouseDragged(MouseEvent me) {
366
    public void mouseDragged(MouseEvent me) {
344
        if (valueDragging) {
367
        if (valueDragging) {
345
            float f = DRAG_SPEED * (float) ((me.getX() - me.getY()) - dragpos);
368
            float f = DRAG_SPEED * (float) ((me.getX() - me.getY()) - dragpos);
346
            int newval = Math.round(startVal + f);
369
            int newval = Math.round(startVal + f);
347
            if (newval<0) {
370
            if (newval < 0) {
348
                newval = 0;
371
                newval = 0;
349
            } else if (newval>255) {
372
            } else if (newval > 255) {
350
                newval = 255;
373
                newval = 255;
351
            }
374
            }
352
            table.getModel().setValueAt(interpret(newval), rowDragging, wtNumber+1);           
375
            table.getModel().setValueAt(interpret(newval), rowDragging,
-
 
376
                    wtNumber + 1);
353
        }
377
        }
354
    }
378
    }
355
   
379
356
    public class ColorCellRenderer extends JComponent implements TableCellRenderer {
380
    public class ColorCellRenderer extends JComponent implements
-
 
381
            TableCellRenderer {
357
        Color curColor;
382
        Color curColor;
358
        String curSymbol;
383
        String curSymbol;
359
        int val;
384
        int val;
360
       
385
361
        public Component getTableCellRendererComponent(JTable table, Object value,
386
        public Component getTableCellRendererComponent(JTable table,
362
                boolean isSelected, boolean hasFocus, int rowIndex, int vColIndex) {
387
                Object value, boolean isSelected, boolean hasFocus,
-
 
388
                int rowIndex, int vColIndex) {
363
           
389
364
            if (vColIndex == wtNumber+1) {
390
            if (vColIndex == wtNumber + 1) {
365
                curColor = Color.RED;              
391
                curColor = Color.RED;
366
                val = ((SIDSysexParameterControl)midiParams.elementAt(rowIndex)).getMidiValue();
392
                val = ((SIDSysexParameterControl) midiParams
-
 
393
                        .elementAt(rowIndex)).getMidiValue();
367
                curSymbol = (String)value;
394
                curSymbol = (String) value;
368
            }
395
            }
369
           
396
370
            if ((vColIndex > 0) && (vColIndex < wtNumber+1)) {
397
            if ((vColIndex > 0) && (vColIndex < wtNumber + 1)) {
371
                int b = config[vColIndex-1][0].getMidiValue();
398
                int b = config[vColIndex - 1][0].getMidiValue();
Line 387... Line 414...
387
        }
414
        }
388
       
415
389
        public void paint(Graphics g) {            
416
        public void paint(Graphics g) {
390
            if (curColor == Color.RED) {    // Red value indicator
417
            if (curColor == Color.RED) { // Red value indicator
391
                g.setColor(curColor);
418
                g.setColor(curColor);
392
                g.fillRect(0, 0, Math.round(((float)val/255)*(getWidth()-1)), getHeight()-1);
419
                g.fillRect(0, 0, Math.round(((float) val / 255)
-
 
420
                        * (getWidth() - 1)), getHeight() - 1);
393
            } else {
421
            } else {
394
                g.setColor(curColor);       // Fill color
422
                g.setColor(curColor); // Fill color
395
                g.fillRect(0, 0, getWidth()-1, getHeight()-1);
423
                g.fillRect(0, 0, getWidth() - 1, getHeight() - 1);
396
            }            
424
            }
397
            if (curColor==Color.BLACK) {    // Swap text color to contrast with background
425
            if (curColor == Color.BLACK) { // Swap text color to contrast with
-
 
426
                // background
398
                g.setColor(Color.WHITE);               
427
                g.setColor(Color.WHITE);
399
            } else {
428
            } else {
400
                g.setColor(Color.BLACK);
429
                g.setColor(Color.BLACK);
401
            }            
430
            }
402
            g.drawString(curSymbol, 2, 12); // Add loop symbol (if required)
431
            g.drawString(curSymbol, 2, 12); // Add loop symbol (if required)