]> ruin.nu Git - moosique.git/blob - MooView.java
Added MooViewCounter as the row header of MooView
[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 MooViewCounter viewCounter;
18         private int numberOfTracks;
19
20         /** 
21          * Creates the main view
22          */
23         public MooView(Track[] tracks) {
24                 super(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
25                 trackPanel = new JPanel(new GridLayout(1,3), true);
26                 setViewportView(trackPanel);
27
28                 titlePanel = new JPanel(new GridLayout(1,3),true);
29                 JViewport columnHeader = new JViewport();
30                 columnHeader.setView(titlePanel);
31                 setColumnHeaderView(columnHeader);
32
33                 viewCounter = new MooViewCounter(4, 4);
34                 JViewport rowHeader = new JViewport();
35                 rowHeader.setView(viewCounter);
36                 setRowHeaderView(rowHeader);
37
38                 setTracks(tracks);
39         }
40
41         /** 
42          * Fills the track panel with track views for all tracks in the current sequence.
43          * @param tracks        the tracks for which to add views
44          */
45         public void setTracks(Track[] tracks) {
46                 setDoubleBuffered(true);
47                 numberOfTracks = tracks.length;
48                 trackPanel.removeAll();
49                 titlePanel.removeAll();
50                 if (numberOfTracks == 1) {
51                         // If MIDI file is of type 0, creates a view for the track.
52                         trackPanel.setLayout(new FlowLayout());
53                         trackPanel.add(new MooTrackView(tracks[0]));
54                         titlePanel.add(new MooTrackTitle(tracks[0],0));
55                 } else {
56                         // Creates dialog for progress bar.
57                         JDialog progressDialog = new JDialog(Moosique.getGUI(), "Visualizing...", false);
58                         JProgressBar progressBar = new JProgressBar(0, tracks.length);
59                         progressBar.setValue(0);
60                         progressBar.setStringPainted(true);
61                         progressDialog.getContentPane().add(progressBar);
62                         progressDialog.pack();
63                         progressDialog.setLocation((Toolkit.getDefaultToolkit().getScreenSize().width - progressDialog.getWidth()) / 2, (Toolkit.getDefaultToolkit().getScreenSize().height - progressDialog.getHeight()) / 2);
64                         progressDialog.setVisible(true);
65         
66                         // Starts filling the track panel with track views, while updating the progress bar.
67                         trackPanel.setLayout(new GridLayout(1,numberOfTracks));
68                         for (int i = 1; i < tracks.length; i++) {
69                                 trackPanel.add(new MooTrackView(tracks[i]));
70                                 titlePanel.add(new MooTrackTitle(tracks[i],i));
71                                 progressBar.setValue(i);
72                         }
73                         progressDialog.dispose();
74                 }
75 /*              JPanel filler = new JPanel();
76                 int totalViewLength = trackPanel.getComponents().length * MooTrackView.VIEW_WIDTH;
77                 if (totalViewLength < getWidth()) {
78                         System.out.println("Adding filler since width = " + getWidth() + " and tracks = " + totalViewLength);
79                         ((GridLayout)trackPanel.getLayout()).setColumns(numberOfTracks + 1);
80                         filler.setPreferredSize(new Dimension(getWidth() - totalViewLength, 140 * MooTrackView.NOTE_HEIGHT));
81                         trackPanel.add(filler);
82                         setPreferredSize(new Dimension(getWidth(), getHeight()));
83                 }
84 */
85                 trackPanel.validate();
86                 setViewportView(trackPanel);
87         }
88
89         /** 
90          * Calls on each track view to update itself.
91          */
92         public void update(long tickPosition) {
93                 getViewport().setViewPosition(new Point((int)getViewport().getViewPosition().getX(), (int)(tickPosition / (Moosique.getSequence().getResolution() / 4)) * MooTrackView.NOTE_HEIGHT));
94                 Component[] comps = getComponents();
95                 for (int i = 0; i < comps.length; i++) {
96                         if(comps[i] instanceof MooTrackView) ((MooTrackView)comps[i]).update(tickPosition);
97                 }
98         }
99
100         /** 
101          * Creates a view for the given track and adds it to the main view.
102          * @param track         the track for which to add a view
103          * @param index         the index at which to insert the view
104          */
105         public void addTrackView(Track track, int index) {
106                 ((GridLayout)trackPanel.getLayout()).setColumns(++numberOfTracks);
107                 ((GridLayout)titlePanel.getLayout()).setColumns(++numberOfTracks);
108                 trackPanel.add(new MooTrackView(track), index);
109                 titlePanel.add(new MooTrackTitle(track,index), index);
110                 validate();
111         }
112
113         /** 
114          * Removes the view for the given track.
115          * @param index         the index of the track for which to remove the view
116          */
117         public void removeTrackView(int index) {
118                 remove(index);
119                 ((GridLayout)trackPanel.getLayout()).setColumns(--numberOfTracks);
120                 validate();
121         }
122 }