X-Git-Url: https://ruin.nu/git/?a=blobdiff_plain;f=MooView.java;h=0215b829054c51c50fb6e9f6bb273b6239025db7;hb=d564984e345995ca352c4f5eee3296c6e02010de;hp=4f36de3ce0a5d06e20b894cdfbac6d6035579a4f;hpb=f97b2830039d5217536a815e08b987c783501975;p=moosique.git diff --git a/MooView.java b/MooView.java index 4f36de3..0215b82 100644 --- a/MooView.java +++ b/MooView.java @@ -2,6 +2,7 @@ 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. @@ -11,61 +12,117 @@ import java.awt.event.*; public class MooView extends JScrollPane { - private Track[] tracks; - private MooTrackView[] trackViews; private JPanel trackPanel; + private JPanel titlePanel; + private MooViewCounter viewCounter; + private int numberOfTracks; /** * Creates the main view */ - public MooView(Sequence seq) { - super(VERTICAL_SCROLLBAR_ALWAYS, HORIZONTAL_SCROLLBAR_AS_NEEDED); - tracks = seq.getTracks(); - - + public MooView(Track[] tracks) { + super(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); trackPanel = new JPanel(new GridLayout(1,3), true); - createTrackViews(); 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 */ - private void createTrackViews() { + public void setTracks(Track[] tracks) { + setDoubleBuffered(true); + numberOfTracks = tracks.length; trackPanel.removeAll(); - ((GridLayout)trackPanel.getLayout()).setColumns(tracks.length); - trackViews = new MooTrackView[tracks.length]; - for (int i = 0; i < tracks.length; i++) { - trackViews[i] = new MooTrackView(tracks[i]); - trackPanel.add(new MooTrackView(tracks[i])); + 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); } - public void setSequence(Sequence seq) { - tracks = seq.getTracks(); - createTrackViews(); + /** + * 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)); } - public void update() { - // Calls on each track view to update itself. - for (int i = 0; i < trackViews.length; i++) { - //trackViews[i].update(); - } - } /** * 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) { - + 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 track the track for which to remove the view + * @param index the index of the track for which to remove the view */ - public void removeTrackView(Track track) { - + public void removeTrackView(int index) { + remove(index); + ((GridLayout)trackPanel.getLayout()).setColumns(--numberOfTracks); + validate(); } }