]> ruin.nu Git - moosique.git/blobdiff - MooTrackTitle.java
no message
[moosique.git] / MooTrackTitle.java
index e388e4d2b6fdd38379d44ac992661060d7ec5611..8bec94bc2495c2a65d5f730b03b910f986cd999b 100644 (file)
 import javax.swing.*;
+import java.awt.*;
+import java.awt.event.*;
+import javax.sound.midi.*;
 
 /**
- * The title bar for each track with track name, channel, instrument etc.
+ * The title bar for each track with track name, channelBox, instrument etc.
  * 
  * @author  Andersson, Andreen, Lanneskog, Pehrson
  * @version 1
  */
  
-public class MooTrackTitle extends JPanel{
+public class MooTrackTitle extends JPanel {
+
+       private Track track;
+       private MetaMessage trackNameMessage;
+       private ShortMessage programChangeMessage;
+       private MooTrackView mtv;
+
+       private JTextField title;
+       private MooInstrumentList instruments;
+       private JComboBox channelBox;
+       private JCheckBox mute;
+       private JCheckBox solo;
+       private JButton record;
+
+       private String trackName = "";
+       private int channel = 0;
+
+       /** 
+        * Creates the title bar for an empty track, and therefore an initial channel is required.
+        * @param aTrack the track that this tracktitle is operating on.
+        * @param chan  the initial channel
+        */
+       public MooTrackTitle (Track aTrack, int chan) {
+               this(aTrack);
+               channel = chan;
+       }
 
        /** 
         * Creates the title bar.
+        * @param aTrack the track that this tracktitle is operating on.
+        */
+       public MooTrackTitle (Track aTrack) {
+               setDoubleBuffered(true);
+               track = aTrack;
+
+               // Finds track name, program change and channel.
+               MidiMessage msg;
+               int status;
+               for (int i = 0; i < track.size(); i++) {
+                       msg = track.get(i).getMessage();
+                       status = msg.getStatus();
+                       if (status == MetaMessage.META) {
+                               if (((MetaMessage)msg).getType() == 3) {
+                                       trackNameMessage = (MetaMessage)msg;
+                                       trackName = new String(trackNameMessage.getData());
+                               }
+                       } else if (status >= 192 && status < 208) {
+                               programChangeMessage = (ShortMessage)msg;
+                               // System.out.println("Program change " + programChangeMessage.getData1());
+                               channel = status - 192;
+                       }
+               }
+
+               // Creates and places components.
+               setLayout(new GridLayout(4,1));
+               setBorder(BorderFactory.createLineBorder(Color.black));
+               TitleListener tl = new TitleListener();
+
+               setPreferredSize(new Dimension(MooTrackView.VIEW_WIDTH,70));
+               title = new JTextField(trackName);
+               title.setFont(Moosique.getGUI().FONT);
+               title.addFocusListener(new TitleFocusListener());
+               add(title);
+
+               int type;
+               if (channel == 9) type = MooInstrumentList.DRUMS;
+               else type = MooInstrumentList.INSTRUMENTS;
+               instruments = new MooInstrumentList(channel, type);
+               // instruments = new MooInstrumentList(channel, type, programChangeMessage);
+               add(instruments);
+
+               channelBox = new JComboBox();
+               channelBox.setFont(Moosique.getGUI().FONT);
+               for (int i = 1; i <= 16; i++)
+                       channelBox.addItem(new Integer(i));
+
+               channelBox.setSelectedIndex(channel);
+
+               channelBox.addActionListener(tl);
+               add(channelBox);
+
+               JPanel checkboxes = new JPanel();
+               checkboxes.setLayout(new GridLayout(1,3));
+
+               mute = new JCheckBox("Mute");
+               mute.setSelected(false);
+               Moosique.setTrackMute(track, false);
+               mute.setFont(Moosique.getGUI().FONT);
+               mute.addActionListener(tl);
+               checkboxes.add(mute);
+
+               solo = new JCheckBox("Solo");
+               solo.setSelected(false);
+               Moosique.setTrackSolo(track, false);
+               solo.setFont(Moosique.getGUI().FONT);
+               solo.addActionListener(tl);
+               checkboxes.add(solo);
+               
+               record = new JButton("Record");
+               record.setFont(Moosique.getGUI().FONT);
+               record.addActionListener(tl);
+               checkboxes.add(record);
+
+               add(checkboxes);
+       }
+       
+       /** 
+        * Returns the channel of the track that the view is visualising.
+        * @return the chanel of the visualised track
         */
-       public MooTrackTitle () {
+       public int getChannel() {
+               return channel;
+       }
 
+       /** 
+        * Sets the track view this title should update after recording.
+        * @param the track view
+        */
+       public void setTrackView(MooTrackView tv) {
+               mtv = tv;
+       }
+
+       /**
+        * Checks if the focus is lost.
+        */
+       class TitleFocusListener extends FocusAdapter {
+               public void focusLost(FocusEvent e) {
+                       // Update the MidiEvent containing the title of this track
+               }
+       }
+
+       /**
+        * Takes the appropriate action when a user selects an item on the popup menu.
+        */
+       class TitleListener implements ActionListener {
+               public void actionPerformed(ActionEvent e) {
+                       Object source = e.getSource();
+                       if (source == channelBox) {
+                               channel = channelBox.getSelectedIndex();
+                               MidiEvent me;
+                               MooNote mn;
+                               instruments.setChannel(channel);
+                               // Query the user before rechannelling???
+                               for (int j = 0; j < track.size(); j++) {
+                                       me = track.get(j);
+                                       if (me instanceof MooNote){
+                                               mn = (MooNote)me;
+                                               mn.setChannel(channel);
+                                       }
+                               }
+                       } else if (source == solo) {
+                               boolean selected = mute.isSelected();
+                               if (selected){
+                                       solo.setSelected(false);
+                                       Moosique.setTrackSolo(track, false);
+                               }
+                               Moosique.setTrackMute(track, selected);
+                       } else if (source == mute) {
+                               boolean selected = solo.isSelected();
+                               if (selected){
+                                       mute.setSelected(false);
+                                       Moosique.setTrackMute(track, false);
+                               }
+                               Moosique.setTrackSolo(track, selected);
+                       } else if (source == record) {
+                               Sequencer sequencer = Moosique.getSequencer();
+                               boolean quantize = false;
+                               if (record.getText() == "Record") {
+                                       /* Show a dialog with:
+                                               "Track" combo box,
+                                               "Channel" combo box (disabled?,
+                                               "Quantize" checkbox and 
+                                               "Start Recording" button.
+                                       */
+                                       record.setText("Stop");
+                                       mtv.enableKeyboardRecording();
+                                       sequencer.recordEnable(track, channel);
+                                       sequencer.startRecording();
+                                       Moosique.setEdited();
+                               } else {
+                                       record.setText("Record");
+                                       mtv.disableKeyboardRecording();
+                                       sequencer.stopRecording();
+                                       sequencer.recordDisable(track);
+                                       Moosique.convertTrack(track, quantize);
+                                       mtv.placeNoteElements();
+                               }
+                       }
+               }
        }
 }