+import javax.sound.midi.*;
import javax.swing.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.beans.*;
-/*
+/**
+ * The main view, the container of the track views.
*
- *
- * @author Andersson, Andreen, Lanneskog, Pehrson
- * @version 1
+ * @author Einar Pehrson
*/
-
-public class MooView {
- /*
- * Creates
+public class MooView extends JScrollPane {
+
+ private JPanel trackPanel;
+ private JPanel titlePanel;
+ private MooViewCounter viewCounter;
+ private int numberOfTracks;
+
+ /**
+ * Creates the main view
*/
- public MooView () {
+ public MooView(Track[] tracks) {
+ super(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
+ trackPanel = new JPanel(new GridLayout(1,3), true);
+ setViewportView(trackPanel);
+ getViewport().setScrollMode(JViewport.BACKINGSTORE_SCROLL_MODE);
+
+ titlePanel = new JPanel(new GridLayout(1,3),true);
+ JViewport columnHeader = new JViewport();
+ columnHeader.setView(titlePanel);
+ setColumnHeaderView(columnHeader);
+
+ viewCounter = new MooViewCounter(null);
+ JViewport rowHeader = new JViewport();
+ rowHeader.setView(viewCounter);
+ setRowHeaderView(rowHeader);
+ setTracks(tracks);
+ }
+
+ /**
+ * Fills the track panel with track views for all tracks in the current sequence.
+ * @param tracks the tracks for which to add views
+ */
+ public void setTracks(Track[] tracks) {
+ setDoubleBuffered(true);
+ numberOfTracks = tracks.length;
+ trackPanel.removeAll();
+ titlePanel.removeAll();
+ if (numberOfTracks == 1) {
+ // If MIDI file is of type 0, creates a view for the track.
+ trackPanel.setLayout(new FlowLayout());
+ MooTrackTitle title = new MooTrackTitle(tracks[0]);
+ titlePanel.add(title);
+ trackPanel.add(new MooTrackView(tracks[0], title));
+ } else {
+ // Creates dialog for progress bar.
+ JDialog progressDialog = new JDialog(Moosique.getGUI(), "Visualizing...", false);
+ JProgressBar progressBar = new JProgressBar(0, tracks.length);
+ progressBar.setValue(0);
+ progressBar.setStringPainted(true);
+ progressDialog.getContentPane().add(progressBar);
+ progressDialog.pack();
+ progressDialog.setLocation((Toolkit.getDefaultToolkit().getScreenSize().width - progressDialog.getWidth()) / 2, (Toolkit.getDefaultToolkit().getScreenSize().height - progressDialog.getHeight()) / 2);
+ progressDialog.setVisible(true);
+
+ // Starts filling the track panel with track views, while updating the progress bar.
+ GridLayout gL = new GridLayout(1,numberOfTracks);
+ trackPanel.setLayout(gL);
+ for (int i = 1; i < tracks.length; i++) {
+ if (Moosique.shouldBeDrawn(tracks[i])) {
+ MooTrackTitle title = new MooTrackTitle(tracks[i]);
+ titlePanel.add(title);
+ trackPanel.add(new MooTrackView(tracks[i], title));
+ progressBar.setValue(i);
+ } else {
+ gL.setColumns(--numberOfTracks);
+ trackPanel.setLayout(gL);
+ }
+ }
+ progressDialog.dispose();
+ }
+/* JPanel filler = new JPanel();
+ int totalViewLength = trackPanel.getComponents().length * MooTrackView.VIEW_WIDTH;
+ if (totalViewLength < getWidth()) {
+ System.out.println("Adding filler since width = " + getWidth() + " and tracks = " + totalViewLength);
+ ((GridLayout)trackPanel.getLayout()).setColumns(numberOfTracks + 1);
+ filler.setPreferredSize(new Dimension(getWidth() - totalViewLength, 140 * MooTrackView.NOTE_HEIGHT));
+ trackPanel.add(filler);
+ setPreferredSize(new Dimension(getWidth(), getHeight()));
+ }
+*/
+ trackPanel.validate();
+ setViewportView(trackPanel);
+ }
+
+ /**
+ * Calls on each track view to update itself.
+ */
+ public void update(long tickPosition) {
+ getViewport().setViewPosition(new Point((int)getViewport().getViewPosition().getX(), (int)(tickPosition / (Moosique.getSequence().getResolution() / 4)) * MooTrackView.NOTE_HEIGHT));
+ }
+
+ /**
+ * Creates a view for the given track and adds it to the main view.
+ * @param track the track for which to add a view
+ * @param index the index at which to insert the view
+ */
+ public void addTrackView(Track track, int index) {
+ ((GridLayout)trackPanel.getLayout()).setColumns(++numberOfTracks);
+ ((GridLayout)titlePanel.getLayout()).setColumns(++numberOfTracks);
+ MooTrackTitle title = new MooTrackTitle(track);
+ titlePanel.add(title, index);
+ trackPanel.add(new MooTrackView(track, title), index);
+ validate();
+ }
+
+ /**
+ * Removes the view for the given track.
+ * @param index the index of the track for which to remove the view
+ */
+ public void removeTrackView(int index) {
+ remove(index);
+ ((GridLayout)trackPanel.getLayout()).setColumns(--numberOfTracks);
+ validate();
}
}