import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Dialog;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.Panel;
import java.awt.Rectangle;
import java.awt.SystemColor;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class MyQuestions implements ActionListener {
  public final static int YES = 1;
  public final static int NO = -1;
  
  Frame parent;
  Font ftDialog;
  Dialog diDialog;
  Button btOK = new Button();
  Button btCancel = new Button();
  Panel pnButtons = new Panel(new FlowLayout(FlowLayout.RIGHT));
  TextField tfInput = new TextField();
  int maxWidth = 200;
  int result = 0;
  String userinput = null;
  WrapperDefs[] wd;
  
  public MyQuestions(Frame p, Font ft) {
    parent = p;
    ftDialog = ft;
    btOK.addActionListener(this);
    btCancel.addActionListener(this);
    wd = new WrapperDefs[3];
    wd[0] = new WrapperDefs(" ", true);
    wd[1] = new WrapperDefs("\\", false, true);
    wd[2] = new WrapperDefs("-", false, false);
  }
  
  public MyQuestions(Frame p) {
    this(p, new Font("Dialog", Font.PLAIN, 8));
  }
  
  private int getLastWrap(String text) {
    for (int i=text.length()-1;i>0;i--) {
      for (int j=0;j<wd.length;j++) {
        if (text.substring(i,i+wd[j].w.length()).equals(wd[j].w)) {
          return i;
        }
      }
    }
    return -1;
  }
  
  private Rectangle getBnds(Dialog di) {
    Rectangle rtWindow = parent.getBounds();
    Rectangle rtResult = di.getBounds();
    rtResult.x = rtWindow.x+(rtWindow.width-rtResult.width)/2;
    rtResult.y = rtWindow.y+rtWindow.height-rtResult.height;
    return rtResult;
  }
  
  private void makeText(Dialog di, String text) {
    String[] txts = new String[1];
    String[] tmps;
    txts[0] = text;

    // convert newline character
    while (txts[txts.length-1].indexOf("\n") != -1) {
      tmps = new String[txts.length+1];
      for (int i=0;i<txts.length;i++) {
        tmps[i] = txts[i];
      }
      tmps[tmps.length-2] = txts[txts.length-1].substring(0,txts[txts.length-1].indexOf("\n"));
      tmps[tmps.length-1] = txts[txts.length-1].substring(txts[txts.length-1].indexOf("\n")+1);
      txts = tmps;
    }

    // make each line below maxWidth as long as there is a whitespace in it
    int idx;
    FontMetrics fm = di.getFontMetrics(ftDialog);
    for (int i=0;i<txts.length;i++) {
      txts[i] = txts[i].trim();
      while (fm.stringWidth(txts[i]) > maxWidth && txts[i].indexOf(" ") != -1) {
        // auto-lengthen txts, if there is more space needed
        if (i+1>=txts.length) {
          tmps = new String[txts.length+1];
          for (int j=0;j<txts.length;j++) {
            tmps[j] = txts[j];
          }
          tmps[tmps.length-1] = "";
          txts = tmps;
        }
        // wrap word to next line
        idx = txts[i].lastIndexOf(" ");
        txts[i+1] = txts[i].substring(idx) + txts[i+1];
        txts[i] = txts[i].substring(0, idx);
      }
    }
    
    // create Panel with Labels and add to Dialog
    Panel pn = new Panel(new GridLayout(0,1,0,0));
    Label[] lbs = new Label[txts.length];
    for (int i=0;i<lbs.length;i++) {
      lbs[i] = new Label(txts[i]);
      pn.add(lbs[i]);
    }
    di.add(pn, BorderLayout.NORTH);
  }

  public void msgBox(String title, String text, String buttext) {
    btOK.setLabel(buttext);
    diDialog = new Dialog(parent, title, true);
    diDialog.setFont(ftDialog);
    diDialog.setLayout(new BorderLayout());
    diDialog.setBackground(SystemColor.control);
    pnButtons.removeAll();
    pnButtons.add(btOK);
    makeText(diDialog, text);
    diDialog.add(pnButtons, BorderLayout.SOUTH);
    diDialog.pack();
    diDialog.setBounds(getBnds(diDialog));
    diDialog.show();
  }
  
  public void msgBox(String title, String text) {
    msgBox(title, text, "OK");
  }
  
  public String inputBox(String title, String text, String definput, String yestext, String notext) {
    btOK.setLabel(yestext);
    btCancel.setLabel(notext);
    tfInput.setText(definput);
    diDialog = new Dialog(parent, title, true);
    diDialog.setFont(ftDialog);
    diDialog.setLayout(new BorderLayout());
    diDialog.setBackground(SystemColor.control);
    pnButtons.removeAll();
    pnButtons.add(btCancel);
    pnButtons.add(btOK);
    makeText(diDialog, text);
    diDialog.add(tfInput, BorderLayout.CENTER);
    diDialog.add(pnButtons, BorderLayout.SOUTH);
    diDialog.pack();
    diDialog.setBounds(getBnds(diDialog));
    diDialog.show();
    if (result == YES) {
      return tfInput.getText();
    } else {
      return null;
    }
  }
  
  public String inputBox(String title, String text, String definput) {
    return inputBox(title, text, definput, "OK", "Cancel");
  }
  
  public String inputBox(String title, String text) {
    return inputBox(title, text, "");
  }
  
  public int yesnoBox(String title, String text, String yestext, String notext) {
    btOK.setLabel(yestext);
    btCancel.setLabel(notext);
    diDialog = new Dialog(parent, title, true);
    diDialog.setFont(ftDialog);
    diDialog.setLayout(new BorderLayout());
    diDialog.setBackground(SystemColor.control);
    pnButtons.removeAll();
    pnButtons.add(btCancel);
    pnButtons.add(btOK);
    makeText(diDialog, text);
    diDialog.add(pnButtons, BorderLayout.SOUTH);
    diDialog.pack();
    diDialog.setBounds(getBnds(diDialog));
    diDialog.show();
    return result;
  }
  
  public int yesnoBox(String title, String text) {
    return yesnoBox(title, text, "Yes", "No");
  }
  
  public void actionPerformed(ActionEvent ae) {
    if (ae.getSource().equals(btOK)) {
      result = YES;
      diDialog.setVisible(false);
    } else if (ae.getSource().equals(btCancel)) {
      result = NO;
      diDialog.setVisible(false);
    }
  }


  class WrapperDefs {
    String w;
    boolean remove;
    boolean before;
    
    public WrapperDefs(String w) {
      this(w, false, false);
    }
    
    public WrapperDefs(String w, boolean r) {
      this(w, r, false);
    }
    
    public WrapperDefs(String w, boolean r, boolean b) {
      this.w = w;
      remove = r;
      before = b;
    }
  }
  
}