X-Git-Url: https://ruin.nu/git/?p=moosique.git;a=blobdiff_plain;f=MooView.java;h=9bf83673048412345f35a1f5d812ae1c1c825a56;hp=29314d96abc22b5a8409f197e3f24ccd9c2ce2aa;hb=HEAD;hpb=ae45edfc5dff1e0a098df4afe747a2dec6c90362 diff --git a/MooView.java b/MooView.java index 29314d9..9bf8367 100644 --- a/MooView.java +++ b/MooView.java @@ -14,6 +14,9 @@ public class MooView extends JScrollPane { private JPanel trackPanel; private JPanel titlePanel; + private MooViewCounter viewCounter; + private JDialog progressDialog; + private JProgressBar progressBar; private int numberOfTracks; /** @@ -21,49 +24,80 @@ public class MooView extends JScrollPane { */ public MooView(Track[] tracks) { super(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + + // Configures scroll pane viewport (track views). trackPanel = new JPanel(new GridLayout(1,3), true); setViewportView(trackPanel); + getViewport().setScrollMode(JViewport.BACKINGSTORE_SCROLL_MODE); + // Configures viewport column header (track titles). titlePanel = new JPanel(new GridLayout(1,3),true); - JViewport columnHeader = new JViewport(); columnHeader.setView(titlePanel); setColumnHeaderView(columnHeader); - setTracks(tracks); + + // Configures viewport row header (view counter). + viewCounter = new MooViewCounter(null); + JViewport rowHeader = new JViewport(); + rowHeader.setView(viewCounter); + setRowHeaderView(rowHeader); + + // Updates the view with the given tracks. + setTracks(tracks, false); } /** * 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) { + public void setTracks(Track[] tracks, boolean showProgress) { + 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()); - trackPanel.add(new MooTrackView(tracks[0])); - titlePanel.add(new MooTrackTitle(tracks[0])); + MooTrackTitle title = new MooTrackTitle(tracks[0]); + titlePanel.add(title); + MooTrackView mtv = new MooTrackView(tracks[0], title); + trackPanel.add(mtv); + title.setTrackView(mtv); } 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); - + if (showProgress) { + // Creates dialog for progress bar. + progressDialog = new JDialog(Moosique.getGUI(), "Visualizing...", false); + int tracksToDraw = 0; + for (int i = 0; i < tracks.length; i++) { + if (Moosique.shouldBeDrawn(tracks[i])) tracksToDraw++; + } + progressBar = new JProgressBar(0, tracksToDraw); + 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. - trackPanel.setLayout(new GridLayout(1,numberOfTracks)); + GridLayout gL = new GridLayout(1,numberOfTracks); + trackPanel.setLayout(gL); for (int i = 1; i < tracks.length; i++) { - trackPanel.add(new MooTrackView(tracks[i])); - titlePanel.add(new MooTrackTitle(tracks[i])); - progressBar.setValue(i+1); + if (Moosique.shouldBeDrawn(tracks[i])) { + MooTrackTitle title = new MooTrackTitle(tracks[i]); + titlePanel.add(title); + MooTrackView mtv = new MooTrackView(tracks[i], title); + trackPanel.add(mtv); + title.setTrackView(mtv); + if (showProgress) progressBar.setValue(i); + else System.out.print("."); + } else { + gL.setColumns(--numberOfTracks); + trackPanel.setLayout(gL); + } } - progressDialog.dispose(); + if (showProgress) progressDialog.dispose(); } /* JPanel filler = new JPanel(); int totalViewLength = trackPanel.getComponents().length * MooTrackView.VIEW_WIDTH; @@ -83,11 +117,20 @@ public class MooView extends JScrollPane { * Calls on each track view to update itself. */ public void update(long tickPosition) { - getViewport().setViewPosition(new Point((int)getViewport().getViewPosition().getX(), (int)(tickPosition / 24) * MooTrackView.NOTE_HEIGHT)); - Component[] comps = getComponents(); - for (int i = 0; i < comps.length; i++) { - if(comps[i] instanceof MooTrackView) ((MooTrackView)comps[i]).update(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 find the view + */ + public MooTrackView getTrackView(Track track) { + for (int i = 0; i < trackPanel.getComponents().length; i++) { + MooTrackView mtv = (MooTrackView)(trackPanel.getComponents())[i]; + if(mtv.getTrack() == track) return mtv; } + return null; } /** @@ -98,8 +141,9 @@ public class MooView extends JScrollPane { public void addTrackView(Track track, int index) { ((GridLayout)trackPanel.getLayout()).setColumns(++numberOfTracks); ((GridLayout)titlePanel.getLayout()).setColumns(++numberOfTracks); - trackPanel.add(new MooTrackView(track), index); - titlePanel.add(new MooTrackTitle(track), index); + MooTrackTitle title = new MooTrackTitle(track); + titlePanel.add(title, index); + trackPanel.add(new MooTrackView(track, title), index); validate(); }