/* Demo.java -- And example of MIDI support
   Copyright (C) 2005 Free Software Foundation, Inc.

This file is part of GNU Classpath examples.

GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.

GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING.  If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA. */

package gnu.classpath.examples.midi;

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.sound.midi.*;

/**
 * An example how javax.sound.midi facilities work.
 */
public class Demo extends Frame implements ItemListener
{
  Choice midiInChoice = new Choice();
  Choice midiOutChoice = new Choice();

  MidiDevice inDevice = null;
  MidiDevice outDevice = null;

  ArrayList inDevices = new ArrayList();
  ArrayList outDevices = new ArrayList();

  public Demo () throws Exception
  {
    MenuBar mb = new MenuBar ();
    Menu menu = new Menu ("File");
    MenuItem quit = new MenuItem("Quit", new MenuShortcut('Q'));
    quit.addActionListener(new ActionListener()
      {
        public void actionPerformed(ActionEvent e)
        {
          System.exit(0);
        }
      });
    menu.add (quit);
    mb.add(menu);

    setTitle("synthcity: the GNU Classpath MIDI Demo");
    setLayout(new FlowLayout());

    MidiDevice.Info[] infos = MidiSystem.getMidiDeviceInfo();

    for (int i = 0; i < infos.length; i++)
      {
        MidiDevice device = MidiSystem.getMidiDevice(infos[i]);
        if (device.getMaxReceivers() > 0)
          {
            midiOutChoice.addItem(infos[i].getDescription());
            outDevices.add(device);
          }
        if (device.getMaxTransmitters() > 0)
          {
            midiInChoice.addItem(infos[i].getDescription());
            inDevices.add(device);
          }
      }

    setMenuBar (mb);
    add(new Label("MIDI IN: "));
    add(midiInChoice);
    add(new Label("   MIDI OUT: "));
    add(midiOutChoice);

    midiInChoice.addItemListener(this);
    midiOutChoice.addItemListener(this);

    pack();
    show();
  }

  public void itemStateChanged (ItemEvent e)
  {
    try
      {
        if (e.getItemSelectable() == midiInChoice)
          {
            if (inDevice != null)
              inDevice.close();
            inDevice =  (MidiDevice)
              inDevices.get(midiInChoice.getSelectedIndex());
          }

        if (e.getItemSelectable() == midiOutChoice)
          {
            if (outDevice != null)
              outDevice.close();
            outDevice = (MidiDevice)
              outDevices.get(midiOutChoice.getSelectedIndex());
          }

        if (inDevice != null && outDevice != null)
          {
            if (! inDevice.isOpen())
              inDevice.open();
            if (! outDevice.isOpen())
              outDevice.open();
            Transmitter t = inDevice.getTransmitter();
            if (t == null)
              System.err.println (inDevice + ".getTransmitter() == null");
            Receiver r = outDevice.getReceiver();
            if (r == null)
              System.err.println (outDevice + ".getReceiver() == null");

            if (t != null && r != null)
              t.setReceiver (r);
          }
      }
    catch (Exception ex)
      {
        ex.printStackTrace();
      }
  }

  public static void main (String args[]) throws Exception
    {
      new Demo();
    }
}
