]> ruin.nu Git - moosique.git/blob - MooView.java
Fixed the scrolling on play!!!
[moosique.git] / MooView.java
1 import javax.sound.midi.*;
2 import javax.swing.*;
3 import java.awt.*;
4 import java.awt.event.*;
5 import java.beans.*;
6
7 /**
8  * The main view, the container of the track views.
9  * 
10  * @author  Einar Pehrson
11  */
12
13 public class MooView extends JScrollPane {
14
15         private JPanel trackPanel;
16         private JPanel titlePanel;
17         private int numberOfTracks;
18
19         /** 
20          * Creates the main view
21          */
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);
26
27                 titlePanel = new JPanel(new GridLayout(1,3),true);
28
29                 JViewport columnHeader = new JViewport();
30                 columnHeader.setView(titlePanel);
31                 setColumnHeaderView(columnHeader);
32                 setTracks(tracks);
33         }
34
35         /** 
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
38          */
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]));
45                 } else {
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);
55         
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);
63                         }
64                         progressDialog.dispose();
65                 }
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()));
74                 }
75 */
76                 trackPanel.validate();
77                 setViewportView(trackPanel);
78         }
79
80         /** 
81          * Calls on each track view to update itself.
82          */
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);
88                 }
89         }
90
91         /** 
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
95          */
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);
101                 validate();
102         }
103
104         /** 
105          * Removes the view for the given track.
106          * @param index         the index of the track for which to remove the view
107          */
108         public void removeTrackView(int index) {
109                 remove(index);
110                 ((GridLayout)trackPanel.getLayout()).setColumns(--numberOfTracks);
111                 validate();
112         }
113 }