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 int numberOfTracks;
20 * Creates the main view
22 public MooView(Track[] tracks) {
23 super(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
24 trackPanel = new JPanel(new GridLayout(1,3), true);
25 setViewportView(trackPanel);
27 titlePanel = new JPanel(new GridLayout(1,3),true);
29 JViewport columnHeader = new JViewport();
30 columnHeader.setView(titlePanel);
31 setColumnHeaderView(columnHeader);
36 * Fills the track panel with track views for all tracks in the current sequence.
37 * @param tracks the tracks for which to add views
39 public void setTracks(Track[] tracks) {
40 numberOfTracks = tracks.length;
41 if (numberOfTracks == 1) {
42 // If MIDI file is of type 0, creates a view for the track.
43 trackPanel.add(new MooTrackView(tracks[0]));
44 titlePanel.add(new MooTrackTitle(tracks[0]));
46 // Creates dialog for progress bar.
47 JDialog progressDialog = new JDialog(Moosique.getGUI(), "Visualizing...", false);
48 JProgressBar progressBar = new JProgressBar(0, tracks.length);
49 progressBar.setValue(0);
50 progressBar.setStringPainted(true);
51 progressDialog.getContentPane().add(progressBar);
52 progressDialog.pack();
53 progressDialog.setLocation((Toolkit.getDefaultToolkit().getScreenSize().width - progressDialog.getWidth()) / 2, (Toolkit.getDefaultToolkit().getScreenSize().height - progressDialog.getHeight()) / 2);
54 progressDialog.setVisible(true);
56 // Starts filling the track panel with track views, while updating the progress bar.
57 trackPanel.removeAll();
58 trackPanel.setLayout(new GridLayout(1,numberOfTracks));
59 for (int i = 1; i < tracks.length; i++) {
60 trackPanel.add(new MooTrackView(tracks[i]));
61 titlePanel.add(new MooTrackTitle(tracks[i]));
62 progressBar.setValue(i+1);
64 progressDialog.dispose();
66 /* JPanel filler = new JPanel();
67 int totalViewLength = trackPanel.getComponents().length * MooTrackView.VIEW_WIDTH;
68 if (totalViewLength < getWidth()) {
69 System.out.println("Adding filler since width = " + getWidth() + " and tracks = " + totalViewLength);
70 ((GridLayout)trackPanel.getLayout()).setColumns(numberOfTracks + 1);
71 filler.setPreferredSize(new Dimension(getWidth() - totalViewLength, 140 * MooTrackView.NOTE_HEIGHT));
72 trackPanel.add(filler);
73 setPreferredSize(new Dimension(getWidth(), getHeight()));
76 trackPanel.validate();
77 setViewportView(trackPanel);
81 * Calls on each track view to update itself.
83 public void update(long tickPosition) {
84 getViewport().setViewPosition(new Point((int)getViewport().getViewPosition().getX(), (int)(tickPosition / 24) * MooTrackView.NOTE_HEIGHT));
85 Component[] comps = getComponents();
86 for (int i = 0; i < comps.length; i++) {
87 if(comps[i] instanceof MooTrackView) ((MooTrackView)comps[i]).update(tickPosition);
92 * Creates a view for the given track and adds it to the main view.
93 * @param track the track for which to add a view
94 * @param index the index at which to insert the view
96 public void addTrackView(Track track, int index) {
97 ((GridLayout)trackPanel.getLayout()).setColumns(++numberOfTracks);
98 ((GridLayout)titlePanel.getLayout()).setColumns(++numberOfTracks);
99 trackPanel.add(new MooTrackView(track), index);
100 titlePanel.add(new MooTrackTitle(track), index);
105 * Removes the view for the given track.
106 * @param index the index of the track for which to remove the view
108 public void removeTrackView(int index) {
110 ((GridLayout)trackPanel.getLayout()).setColumns(--numberOfTracks);