1 import javax.sound.midi.*;
4 import java.awt.event.*;
8 * The main view, the container of the track views.
10 * @author Einar Pehrson
13 public class MooView extends JScrollPane {
15 private JPanel trackPanel;
16 private JPanel titlePanel;
17 private MooViewCounter viewCounter;
18 private JDialog progressDialog;
19 private JProgressBar progressBar;
20 private int numberOfTracks;
23 * Creates the main view
25 public MooView(Track[] tracks) {
26 super(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
28 // Configures scroll pane viewport (track views).
29 trackPanel = new JPanel(new GridLayout(1,3), true);
30 setViewportView(trackPanel);
31 getViewport().setScrollMode(JViewport.BACKINGSTORE_SCROLL_MODE);
33 // Configures viewport column header (track titles).
34 titlePanel = new JPanel(new GridLayout(1,3),true);
35 JViewport columnHeader = new JViewport();
36 columnHeader.setView(titlePanel);
37 setColumnHeaderView(columnHeader);
39 // Configures viewport row header (view counter).
40 viewCounter = new MooViewCounter(null);
41 JViewport rowHeader = new JViewport();
42 rowHeader.setView(viewCounter);
43 setRowHeaderView(rowHeader);
45 // Updates the view with the given tracks.
46 setTracks(tracks, false);
50 * Fills the track panel with track views for all tracks in the current sequence.
51 * @param tracks the tracks for which to add views
53 public void setTracks(Track[] tracks, boolean showProgress) {
54 setDoubleBuffered(true);
55 numberOfTracks = tracks.length;
56 trackPanel.removeAll();
57 titlePanel.removeAll();
58 if (numberOfTracks == 1) {
59 // If MIDI file is of type 0, creates a view for the track.
60 trackPanel.setLayout(new FlowLayout());
61 MooTrackTitle title = new MooTrackTitle(tracks[0]);
62 titlePanel.add(title);
63 MooTrackView mtv = new MooTrackView(tracks[0], title);
65 title.setTrackView(mtv);
68 // Creates dialog for progress bar.
69 progressDialog = new JDialog(Moosique.getGUI(), "Visualizing...", false);
71 for (int i = 0; i < tracks.length; i++) {
72 if (Moosique.shouldBeDrawn(tracks[i])) tracksToDraw++;
74 progressBar = new JProgressBar(0, tracksToDraw);
75 progressBar.setValue(0);
76 progressBar.setStringPainted(true);
77 progressDialog.getContentPane().add(progressBar);
78 progressDialog.pack();
79 progressDialog.setLocation((Toolkit.getDefaultToolkit().getScreenSize().width - progressDialog.getWidth()) / 2, (Toolkit.getDefaultToolkit().getScreenSize().height - progressDialog.getHeight()) / 2);
80 progressDialog.setVisible(true);
83 // Starts filling the track panel with track views, while updating the progress bar.
84 GridLayout gL = new GridLayout(1,numberOfTracks);
85 trackPanel.setLayout(gL);
86 for (int i = 1; i < tracks.length; i++) {
87 if (Moosique.shouldBeDrawn(tracks[i])) {
88 MooTrackTitle title = new MooTrackTitle(tracks[i]);
89 titlePanel.add(title);
90 MooTrackView mtv = new MooTrackView(tracks[i], title);
92 title.setTrackView(mtv);
93 if (showProgress) progressBar.setValue(i);
94 else System.out.print(".");
96 gL.setColumns(--numberOfTracks);
97 trackPanel.setLayout(gL);
100 if (showProgress) progressDialog.dispose();
102 /* JPanel filler = new JPanel();
103 int totalViewLength = trackPanel.getComponents().length * MooTrackView.VIEW_WIDTH;
104 if (totalViewLength < getWidth()) {
105 System.out.println("Adding filler since width = " + getWidth() + " and tracks = " + totalViewLength);
106 ((GridLayout)trackPanel.getLayout()).setColumns(numberOfTracks + 1);
107 filler.setPreferredSize(new Dimension(getWidth() - totalViewLength, 140 * MooTrackView.NOTE_HEIGHT));
108 trackPanel.add(filler);
109 setPreferredSize(new Dimension(getWidth(), getHeight()));
112 trackPanel.validate();
113 setViewportView(trackPanel);
117 * Calls on each track view to update itself.
119 public void update(long tickPosition) {
120 getViewport().setViewPosition(new Point((int)getViewport().getViewPosition().getX(), (int)(tickPosition / (Moosique.getSequence().getResolution() / 4)) * MooTrackView.NOTE_HEIGHT));
125 * Creates a view for the given track and adds it to the main view.
126 * @param track the track for which to find the view
128 public MooTrackView getTrackView(Track track) {
129 for (int i = 0; i < trackPanel.getComponents().length; i++) {
130 MooTrackView mtv = (MooTrackView)(trackPanel.getComponents())[i];
131 if(mtv.getTrack() == track) return mtv;
137 * Creates a view for the given track and adds it to the main view.
138 * @param track the track for which to add a view
139 * @param index the index at which to insert the view
141 public void addTrackView(Track track, int index) {
142 ((GridLayout)trackPanel.getLayout()).setColumns(++numberOfTracks);
143 ((GridLayout)titlePanel.getLayout()).setColumns(++numberOfTracks);
144 MooTrackTitle title = new MooTrackTitle(track);
145 titlePanel.add(title, index);
146 trackPanel.add(new MooTrackView(track, title), index);
151 * Removes the view for the given track.
152 * @param index the index of the track for which to remove the view
154 public void removeTrackView(int index) {
156 ((GridLayout)trackPanel.getLayout()).setColumns(--numberOfTracks);