Subversion Repositories svn.mios

Rev

Rev 246 | Rev 250 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
213 tk 1
/*
2
 * @(#)SIDV2librarian.java  beta1   2008/01/21
3
 *
4
 * Copyright (C) 2008    Rutger Vlek (rutgervlek@hotmail.com)
5
 *
6
 * This application is free software; you can redistribute it and/or modify
7
 * it under the terms of the GNU General Public License as published by
8
 * the Free Software Foundation; either version 2 of the License, or
9
 * (at your option) any later version.
10
 *
11
 * This application is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
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
19
 */
20
package org.midibox.sidedit.gui;
21
 
22
import java.awt.Dimension;
23
import javax.swing.event.*;
245 rutgerv 24
import java.awt.Graphics;
213 tk 25
import java.awt.event.*;
245 rutgerv 26
import java.util.Vector;
213 tk 27
import javax.swing.table.TableModel;
28
import javax.swing.*;
29
import java.util.Observable;
30
import java.util.Observer;
31
import java.util.EventObject;
32
import org.midibox.sidlibr.SIDLibController;
245 rutgerv 33
import java.awt.Color;
213 tk 34
import javax.swing.JMenu;
35
import javax.swing.JMenuItem;
36
import javax.swing.JPanel;
37
import javax.swing.JScrollPane;
38
import javax.swing.JTable;
39
import javax.swing.KeyStroke;
40
import javax.swing.ListSelectionModel;
41
import org.midibox.sidlibr.Bank;
42
import java.awt.Font;
245 rutgerv 43
import org.midibox.sidedit.*;
44
import javax.swing.table.*;
45
import java.awt.Component;
213 tk 46
 
246 rutgerv 47
public class WTTable extends JPanel implements TableModelListener, Observer, MouseListener, MouseMotionListener {
213 tk 48
    JTable table;
49
    JPopupMenu popupMenu;
50
    int bankNumber;
51
    int selectedBeforeDrag = 0;
52
    private int wtNumber;
245 rutgerv 53
    private Vector midiParams;
54
    private SIDSysexParameterControl[][] config;
55
    private boolean refreshing = false;
56
    public boolean useHex = false;
246 rutgerv 57
    private boolean valueDragging = false;
58
    private int rowDragging = 0;
59
    private int dragpos = -1;
60
    private float DRAG_SPEED = 1.5F;// 0.01F;
61
    private float startVal = 0;
245 rutgerv 62
 
63
    public WTTable(int wtNumber, Vector midiParams, SIDSysexParameterControl[][] config) {
213 tk 64
        this.wtNumber = wtNumber;
245 rutgerv 65
        this.midiParams = midiParams;
246 rutgerv 66
        this.config = config;
213 tk 67
 
245 rutgerv 68
        table = new JTable(new WTTableModel(wtNumber));
213 tk 69
        table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
246 rutgerv 70
        table.getModel().addTableModelListener(this);
71
        table.addMouseListener(this);
72
        table.addMouseMotionListener(this);
213 tk 73
 
74
        table.getColumnModel().getColumn(0).setPreferredWidth(30);
75
        for (int c=0;c<wtNumber;c++) {
245 rutgerv 76
            table.getColumnModel().getColumn(c+1).setCellRenderer(new ColorCellRenderer());
213 tk 77
            table.getColumnModel().getColumn(c+1).setPreferredWidth(10);
78
        }
79
 
246 rutgerv 80
        table.getColumnModel().getColumn(wtNumber+1).setCellRenderer(new ColorCellRenderer());     
81
        table.getColumnModel().getColumn(wtNumber+1).setPreferredWidth(150);
82
 
245 rutgerv 83
        table.setPreferredScrollableViewportSize(new Dimension(table.getPreferredSize().width, Math.round(table.getPreferredSize().height/10)));
247 tk 84
        // TK: temporary commented out - not available under MacOS, we need a replacement
85
        // table.setFillsViewportHeight(true);
213 tk 86
 
87
        JScrollPane scrollPane = new JScrollPane(table);
88
        scrollPane.setPreferredSize(new Dimension(table.getPreferredSize().width, Math.round(table.getPreferredSize().height/4)));
89
 
245 rutgerv 90
        for(int row=0;row<midiParams.size();row++) {       
91
            ((SIDSysexParameterControl)midiParams.elementAt(row)).addObserver(this);
92
        }  
93
        for(int i=0;i<config.length;i++) { 
94
            for(int j=0;j<config[i].length;j++) {
95
                config[i][j].addObserver(this);
96
            }
97
        }  
98
        refreshTable();
213 tk 99
        add(scrollPane);
245 rutgerv 100
    }  
101
 
102
    public void refreshTable() {       
103
        refreshing = true;
104
        TableModel m = table.getModel();
105
        for(int row=0;row<midiParams.size();row++) {   
106
            String newval = interpret(((SIDSysexParameterControl)midiParams.elementAt(row)).getMidiValue());
107
            m.setValueAt(newval, row, wtNumber+1);
108
 
109
            // Set loop indicator
110
            for(int col=1;col<wtNumber+1;col++) {
111
                if (config[col-1][2].getMidiValue()==row) {
112
                    m.setValueAt("128",row,col);
113
                } else {
114
                    m.setValueAt("",row,col);
115
                }
116
            }
117
        }
118
        refreshing = false;
213 tk 119
    }
120
 
245 rutgerv 121
    private int parseHexDec(String s) {
122
        int v;
123
        if (useHex) {
124
            v = Integer.parseInt(s, 16);
125
        } else {
126
            v = Integer.parseInt(s);
127
        }
128
        return v;
129
    }
213 tk 130
 
245 rutgerv 131
    private void parseInput(String value, int row) {
132
        int v = ((SIDSysexParameterControl)midiParams.elementAt(row)).getMidiValue();
133
        try {  
134
            if (value.equals("---")) {
135
                v = 128;
136
            } else if (value.equals("+++")) {
137
                v = 129;
138
            } else if (value.substring(0,1).equals("-")) {          // Relative negative value                  
139
                int temp = parseHexDec(value.substring(1));                
140
                if (-temp < -64) {
141
                    v = 0;                     
142
                } else if (-temp > 0) {
143
                    v = 64;                    
144
                } else {
145
                    v = -temp+64;
146
                }
147
            } else if (value.substring(0,1).equals("+")) {          // Relative positive value
148
                int temp = parseHexDec(value.substring(1));
149
                if (temp < 0) {
150
                    v = 63;
151
                } else if (temp > 63) {
152
                    v = 127;                       
153
                } else {
154
                    v = temp+64;
155
                }
156
            } else {                                                // Absolute value                   
157
                int temp = parseHexDec(value); 
158
                if (temp < 0) {
159
                    v = 128;
160
                } else if (temp > 127) {
161
                    v = 255;                       
162
                } else {
163
                    v = temp+128;
164
                }
213 tk 165
            }
245 rutgerv 166
        } catch (NumberFormatException e) {
167
            // Revert!                              
213 tk 168
        }
245 rutgerv 169
        ((SIDSysexParameterControl)midiParams.elementAt(row)).setMidiValue(v, true);
170
    }
171
 
172
    private String interpretHexDec(int i) {
173
        String s;
174
        if (useHex) {
175
            s = Integer.toHexString(i);
176
        } else {
177
            s = Integer.toString(i);
178
        }
179
        return s;
180
    }
181
 
182
    private String interpret(int i) {
183
        String s = "";
184
        if (i < 64) {
185
            s = "-" + interpretHexDec(-i+64);
186
        } else if (i < 128) {
187
            s = "+" + interpretHexDec(i-64);
188
        } else {
189
            s = interpretHexDec(i-128);
213 tk 190
        }
245 rutgerv 191
        return s;
213 tk 192
    }
193
 
245 rutgerv 194
    public void tableChanged(TableModelEvent e) {
195
        if (!refreshing) {
196
            int row = e.getFirstRow();
197
            int column = e.getColumn();
198
            TableModel model = (TableModel)e.getSource();
199
            Object data = model.getValueAt(row, column);
200
            if (column == wtNumber+1) {
201
                parseInput((String)data,row);
202
            }  
203
        }            
204
    }
205
 
206
    public void update(Observable observable, Object object) {
207
        refreshTable();
208
    }
209
 
213 tk 210
    public int getSelectedRow() {
211
        return table.getSelectedRow();
212
    }
245 rutgerv 213
 
246 rutgerv 214
    public void mousePressed(MouseEvent e) {
215
        if (table.getSelectedColumn()==wtNumber+1) {
216
            valueDragging = true;
217
            rowDragging = table.getSelectedRow();
218
            startVal = (float)((SIDSysexParameterControl)midiParams.elementAt(rowDragging)).getMidiValue();
219
            dragpos = e.getX() - e.getY();                     
220
        }          
221
    }
222
 
223
    public void mouseReleased(MouseEvent e) {valueDragging = false;}
224
 
225
    public void mouseEntered(MouseEvent e) {}
226
 
227
    public void mouseExited(MouseEvent e) {}
228
 
229
    public void mouseClicked(MouseEvent e) {}
230
 
231
    public void mouseMoved(MouseEvent me) {}
232
 
233
    public void mouseDragged(MouseEvent me) {
234
        if (valueDragging) {
235
            float f = DRAG_SPEED * (float) ((me.getX() - me.getY()) - dragpos);
236
            table.getModel().setValueAt(interpret(Math.round(startVal + f)), rowDragging, wtNumber+1);         
237
        }
238
    }
239
 
245 rutgerv 240
    public class ColorCellRenderer extends JComponent implements TableCellRenderer {
241
        Color curColor;
242
        String curSymbol;
246 rutgerv 243
        int val;
244
 
245 rutgerv 245
        public Component getTableCellRendererComponent(JTable table, Object value,
246
                boolean isSelected, boolean hasFocus, int rowIndex, int vColIndex) {
247
 
246 rutgerv 248
            if (vColIndex == wtNumber+1) {
249
                curColor = Color.RED;              
250
                val = ((SIDSysexParameterControl)midiParams.elementAt(rowIndex)).getMidiValue();
251
                curSymbol = (String)value;
252
            }
253
 
245 rutgerv 254
            if ((vColIndex > 0) && (vColIndex < wtNumber+1)) {
255
                int b = config[vColIndex-1][0].getMidiValue();
256
                int e = config[vColIndex-1][1].getMidiValue();
257
                int l = config[vColIndex-1][2].getMidiValue();
258
 
259
                if ((rowIndex <= e) && (rowIndex >= b)) {
260
                    curColor = Color.BLACK;
261
                } else {
262
                    curColor = table.getBackground();
263
                }
264
                if (rowIndex==l) {
265
                    curSymbol = "O";
266
                } else {
267
                    curSymbol = "";
268
                }
269
            }
270
            return this;
271
        }
272
 
246 rutgerv 273
        public void paint(Graphics g) {            
274
            if (curColor == Color.RED) {    // Red value indicator
275
                g.setColor(curColor);
276
                g.fillRect(0, 0, Math.round(((float)val/255)*(getWidth()-1)), getHeight()-1);
245 rutgerv 277
            } else {
246 rutgerv 278
                g.setColor(curColor);       // Fill color
279
                g.fillRect(0, 0, getWidth()-1, getHeight()-1);
280
            }            
281
            if (curColor==Color.BLACK) {    // Swap text color to contrast with background
282
                g.setColor(Color.WHITE);               
283
            } else {
245 rutgerv 284
                g.setColor(Color.BLACK);
246 rutgerv 285
            }            
286
            g.drawString(curSymbol, 2, 12); // Add loop symbol (if required)
245 rutgerv 287
        }    
213 tk 288
    }
289
}