//Easy GUI Apps, Components, IBIO
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;

//=========================================================================
//====  EasyApp - standard GUI app with standard IBIO routines ============
//=========================================================================

public class EasyApp extends Frame implements ActionListener, ItemListener, MouseListener, KeyListener
 {
   //--- Constructor -------

   MenuBar menubar = addMenuBar();

   public EasyApp()
   {
     setLayout(null);
     setSize(600,400);

     addWindowListener                    // enable [x] for closing app
     ( new WindowAdapter()
       { public void windowClosing(WindowEvent evt)
         { evt.getWindow().dispose(); }
       }
     );
     setVisible(true);
     toFront();
     requestFocus();
   }

   public MenuBar makeMenus(String[] menus)
   {
     for (int x=0;x<menus.length;x++)
     {  if (menus[x].length()>0)
        { int d = menus[x].indexOf("|");
          if (d<0) {d=menus[x].length();  }
          Menu newmenu = addMenu(menus[x].substring(0,d),menubar);

          while (d>=0 && d<menus[x].length())
          {
           int e = menus[x].indexOf("|",d+1);
            if (e<0) {e=menus[x].length();  }
            MenuItem newmi = addMenuItem(menus[x].substring(d+1,e),newmenu,this);
            newmi.setActionCommand(newmenu.getActionCommand()+"|"+newmi.getActionCommand());

            d = e;
          }
        }
      }
      return menubar;
   }

   //============================
   //--- Control Creators -------
   //============================

   public Button addButton(String text, int left, int top, int width, int height,
                           ActionListener listener)
   {
       Button newComp = new Button(text);
       add(newComp);
       newComp.setBounds(left,top,width,height);
       if (listener!=null)newComp.addActionListener(listener);
       return newComp;
   }

   public Checkbox addCheckbox(String text, int left, int top, int width, int height,
                               ItemListener listener)
   {
       Checkbox newComp = new Checkbox(text);
       add(newComp);
       newComp.setBounds(left,top,width,height);
       if (listener!=null)newComp.addItemListener(listener);
       return newComp;
   }

   public TextField addTextField(String text, int left, int top, int width, int height,
                                 ActionListener listener)
   {
       TextField newComp = new TextField(text);
       add(newComp);
       newComp.setBounds(left,top,width,height);
       if (listener!=null)newComp.addActionListener(listener);
       return newComp;
   }

   public TextArea addTextArea(String text, int left, int top, int width, int height,
                               KeyListener listener)
   {
       TextArea newComp = new TextArea(text);
       add(newComp);
       newComp.setBounds(left,top,width,height);
       if (listener!=null)newComp.addKeyListener(listener);
       return newComp;
   }

   public Label addLabel(String text, int left, int top, int width, int height,
                         MouseListener listener)
   {
       Label newComp = new Label(text);
       add(newComp);
       newComp.setBounds(left,top,width,height);
       if (listener!=null)newComp.addMouseListener(listener);
       return newComp;
   }

   public JLabel addJLabel(ImageIcon img, int left, int top, int width, int height,
                         MouseListener listener)
   {
       JLabel newComp = new JLabel(img);
       add(newComp);
       newComp.setBounds(left,top,width,height);
       if (listener!=null)newComp.addMouseListener(listener);
       return newComp;
   }

   public List addList(String words,int left, int top, int width, int height,
                       ItemListener listener)
   {
       List newComp = new List();
       while (words.length()>0)
       { int s = words.indexOf("|");
         if (s<0)
         { newComp.add(words);
           words = "";
         }
         else
         { newComp.add(words.substring(0,s));
           words = words.substring(s+1);
         }
       }
       add(newComp);
       newComp.setBounds(left,top,width,height);
       if (listener!=null)newComp.addItemListener(listener);
       return newComp;
   }

   public Choice addChoice(String words,int left, int top, int width, int height,
                           ItemListener listener)
   {
       Choice newComp = new Choice();
       while (words.length()>0)
       { int s = words.indexOf("|");
         if (s<0)
         { newComp.add(words);
           words = "";
         }
         else
         { newComp.add(words.substring(0,s));
           words = words.substring(s+1);
         }
       }
       add(newComp);
       newComp.setBounds(left,top,width,height);
       if (listener!=null)newComp.addItemListener(listener);
       return newComp;
   }

   public MenuItem addMenuItem(String mText,Menu mu,ActionListener listener)
   {  MenuItem c = new MenuItem(mText);
      mu.add(c);
      if (listener!=null)c.addActionListener(listener);
      return c;
   }

   public Menu addMenu(String mText,Menu mu)
   {
      Menu c = new Menu(mText);
      mu.add(c);
      return c;
   }

   public Menu addMenu(String mText,MenuBar mb)
   {
      Menu c = new Menu(mText);
      mb.add(c);
      return c;
   }

   public Menu addMenu(String mText)
   {
      int d = mText.indexOf("|");
      if (d<0){d=mText.length();}
      String id = mText.substring(0,d);
      Menu c = new Menu(id);
      menubar.add(c);
      while (d<mText.length())
      { int e = mText.indexOf("|",d+1);
        if (e<0){e = mText.length();}
        String cmd = mText.substring(d+1,e);
        MenuItem mi = addMenuItem(cmd,c,this);
        mi.setActionCommand(id+"|"+cmd);
        c.add(mi);
        d = e;
      }
      return c;
   }

   public MenuBar addMenuBar()
   {  MenuBar c = new MenuBar();
      setMenuBar(c);
      return c;
   }

  //==================================
  //=== Simplified Command Library ===
  //==================================

  public Process runProgram(String programName)
  {
      Process handle = null;
      try
      { handle = Runtime.getRuntime().exec(programName);
      }
      catch(IOException ex)
      { };
      return handle;
  }

  public String chooseFile()
  { FileDialog fd = new FileDialog(this);
    fd.setVisible(true);
    return fd.getDirectory() + fd.getFile();
  }

  public Image loadImage(String filename)
  {  ImageIcon im = new ImageIcon(filename);
     int c = 0;
     do
     { c++;
     } while (c<100000 && im.getImageLoadStatus()!=MediaTracker.COMPLETE);
     return im.getImage();
  }

  public boolean loadList(List list,String filename)
  {
   try
   { list.removeAll();
     BufferedReader infile = new BufferedReader(new FileReader(filename));
      while(infile.ready())
     { list.add(infile.readLine());
     }
     infile.close();
     return true;
   }
   catch(IOException e)
   { output(e.toString());
     return false;
   }
  }

  public boolean saveList(String filename,List list)
  {
   try
   { PrintWriter outfo = new PrintWriter(new FileWriter(filename));
     for (int c=0;c<list.getItemCount();c++)
     { outfo.println(list.getItem(c));
     }
     outfo.close();
     return true;
    }
    catch(IOException e)
    { output(e.toString());
      return false;
    }
  }

  
  public String getType(Object ob)
  {
     String c = ob.getClass().toString();
     int p = c.lastIndexOf(".");
     if (p<0) {p=-1;}
     return c.substring(p+1);
  }

  //=== Stub versions of Listeners to satisfy interfaces ===
   public void actionPerformed(ActionEvent evt)
   { actions(evt.getSource(),evt.getActionCommand());
   }

   public void itemStateChanged(ItemEvent evt)
   { Object source = evt.getSource();
     String t = getType(source);
     String command = "";
     if (t.equals("List")) { command = ((List)source).getSelectedItem(); }
     else if (t.equals("Choice")){ command = ((Choice)source).getSelectedItem(); }
     else {command = evt.getItem().toString();}
     actions(source,command);
   }

   public void actions(Object source,String command)
   {
      output(source.toString()+":"+command);
   }

   public void mouseClicked(MouseEvent e)
   { Object source = e.getSource();
     actions(source,"");
   }
   public void mouseEntered(MouseEvent e){}
   public void mouseExited(MouseEvent e){}
   public void mousePressed(MouseEvent e){}
   public void mouseReleased(MouseEvent e){}

   public void keyTyped(KeyEvent e)
   { Object source = e.getSource();
     actions(source,e.getKeyChar()+"");
   }
   public void keyPressed(KeyEvent e){}
   public void keyReleased(KeyEvent e){}


 //===========================================================
 //=== IBIO simplified input/output commands - GUI version ===
 //===========================================================
   public void output(String message)
   {  JOptionPane.showMessageDialog(this,message);  }

   public void outputString(String message)
   {  output(message);  }

   public void output(char info)
   {  output(info + ""); }

   public void output(byte info)
   {  output(info + ""); }

   public void output(int info)
   {  output(info + ""); }

   public void output(long info)
   {  output(info + ""); }

   public void output(double info)
   {  output(info + ""); }

   public void output(boolean info)
   {  output(info + ""); }

   //----- Numerical input methods return 0 on error ------------
   public String input(String prompt)
   {  return JOptionPane.showInputDialog(this,prompt);  }

   public String inputString(String prompt)
   { return input(prompt);  }

   public String input()
   { return input("");     }

   public char inputChar(String prompt)
   { char result=(char)0;
     try{result=input(prompt).charAt(0);}
     catch (Exception e){result = (char)0;}
     return result;
   }

   public byte inputByte(String prompt)
   { byte result=0;
     try{result=Byte.valueOf(input(prompt).trim()).byteValue();}
     catch (Exception e){result = 0;}
     return result;
   }

   public int inputInt(String prompt)
   {  int result=0;
      try{result=Integer.valueOf(
                        input(prompt).trim()).intValue();}
      catch (Exception e){result = 0;}
      return result;
   }

   public long inputLong(String prompt)
   {  long result=0;
      try{result=Long.valueOf(input(prompt).trim()).longValue();}
      catch (Exception e){result = 0;}
      return result;
   }

   public double inputDouble(String prompt)
   {  double result=0;
      try{result=Double.valueOf(
                          input(prompt).trim()).doubleValue();}
      catch (Exception e){result = 0;}
      return result;
   }

   public boolean inputBoolean(String prompt)
   {  boolean result=false;
      try{result=Boolean.valueOf(
                         input(prompt).trim()).booleanValue();}
      catch (Exception e){result = false;}
      return result;
   }
  //============================================================
  //=========== end IBIO =======================================
  //============================================================

 }