import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import java.util.*;
import javax.swing.text.*;
import java.awt.BorderLayout;
import java.awt.Color;
import java.net.*;
import java.io.*;
import javax.swing.border.*;

public class ObjectWizard extends JFrame implements ActionListener, ItemListener{
    public Dimension defaultSize = new Dimension(250, 250);
    JTextArea parent;
    Font smallFont = new Font("Monospaced", Font.PLAIN, 12);
    JComboBox objs = new JComboBox();
    JScrollPane cur = new JScrollPane();
    JTextArea leftTextArea = new JTextArea(10, 10);
    Vector first, curVector;
    Vector[] objVectors = new Vector[5];
    Vector commonVector = new Vector();
    JLabel topLabel =  new JLabel("Type");
    JLabel requiredLabel = new JLabel("Mandatory");
    JLabel occuranceLabel = new JLabel("Single");
    int curInternalIndex = -1;
    int curVectorIndex = 0; /* 0 = type, 1 = selected type, 2 = common*/
    JButton backButton;
    JButton nextButton;
    JButton finishButton;
    RpslObject typeObj = new RpslObject(RpslObject.MANDATORY, RpslObject.SINGLE, 
					"Type", "Choose type of object", buildTypePanel());
    Font italicFont = new Font("Monospaced", Font.ITALIC, 11);

    /* common components */
    JTextArea descrtf = new JTextArea(5, 5);
    JTextField techctf = new JTextField();
    JTextArea adminctf = new JTextArea(5, 5);
    JTextArea remarkstf = new JTextArea(5, 5);
    JTextArea notifytf = new JTextArea(5, 5);
    JTextArea mntbytf = new JTextArea(5, 5);
    JTextArea changedtf = new JTextArea(5, 5);
    JTextField sourcetf = new JTextField();

    /* maint */
    JTextField mainttf = new JTextField();
    JTextArea authtf = new JTextArea(5, 5);

    /* person */
    JTextField persontf = new JTextField();
    JTextField nichdltf = new JTextField();
    JTextArea addresstf = new JTextArea(5, 5);
    JTextArea phonetf = new JTextArea(5, 5);
    JTextArea faxtf = new JTextArea(5, 5);
    JTextArea emailtf = new JTextArea(5, 5);

    /* role */
    JTextField roletf = new JTextField();
    JTextField troubletf = new JTextField();

    /* autnum */
    JTextField autnumtf = new JTextField();
    JTextField asnametf = new JTextField();
    JTextArea memberoftf = new JTextArea(5, 5);
    JTextArea importtf = new JTextArea(5, 5);
    JTextArea exporttf = new JTextArea(5, 5);
    JTextArea defaulttf = new JTextArea(5, 5);

    /* route */
    JTextField routetf = new JTextField();
    JTextField origintf = new JTextField();
    JTextArea injecttf = new JTextArea(5, 5);
    JTextArea componentstf = new JTextArea(5, 5);
    JTextArea aggrbndrytf = new JTextArea(5, 5);
    JTextArea aggrmtdtf = new JTextArea(5, 5);
    JTextArea exportcompstf = new JTextArea(5, 5);
    JTextArea holestf = new JTextArea(5, 5);

    public ObjectWizard(JTextArea parentIn){
	super("Object Creation Wizard");
	leftTextArea.setEditable(false);
	leftTextArea.setBackground(Color.lightGray);
	topLabel.setForeground(Color.black);
	occuranceLabel.setFont(italicFont);
	requiredLabel.setFont(italicFont);
	parent = parentIn;
	buildLayout();
	pack();
	show();
    }
    
    private void buildLayout() {
	JPanel buttonPanel = new JPanel();
	backButton = new JButton("Back");
	backButton.addActionListener(this);
	backButton.setEnabled(false);
	nextButton = new JButton("Next");
	nextButton.addActionListener(this);
	JButton cancelButton = new JButton("Cancel");
	cancelButton.addActionListener(this);
	finishButton = new JButton("Finish");
	finishButton.addActionListener(this);
	finishButton.setEnabled(false);
	buttonPanel.add(backButton);
	buttonPanel.add(nextButton);
	buttonPanel.add(cancelButton);
	buttonPanel.add(finishButton);

	JPanel leftPanel = new JPanel(new BorderLayout());
	leftPanel.add(requiredLabel, BorderLayout.NORTH);
	JPanel innerLeftPanel = new JPanel(new BorderLayout());
	innerLeftPanel.add(occuranceLabel, BorderLayout.NORTH);
	innerLeftPanel.add(leftTextArea);
	leftPanel.add(innerLeftPanel);

	JPanel centerPane = new JPanel(new GridLayout(1, 2));
	//centerPane.add(leftTextArea);
	centerPane.add(leftPanel);
	centerPane.add(cur);
	cur.setViewportView(typeObj.panel);
	leftTextArea.setText(typeObj.description);

	getContentPane().add(topLabel, BorderLayout.NORTH);
	getContentPane().add(centerPane);
	getContentPane().add(buttonPanel, BorderLayout.SOUTH);
	buildObjectVectors();
    }
    
    private JPanel buildTypePanel(){
	//JLabel lbl = new JLabel("Type of object?");
	//lbl.setFont(smallFont);
	objs.addItemListener(this);
	objs.addItem("Mntner");
	objs.addItem("Person");
	objs.addItem("Aut-num");
	objs.addItem("Route");
	objs.addItem("Role");

	JPanel jp = new JPanel();
	//jp.setLayout(new BoxLayout(jp, BoxLayout.Y_AXIS));
	//jp.add(lbl);
	jp.add(objs);
	return jp;
    }
			 
    private void buildObjectVectors(){
	buildCommonVector();
	objVectors[0] = buildMaintVector();
	objVectors[1] = buildPersonVector();
	objVectors[2] = buildAutnumVector();
	objVectors[3] = buildRouteVector();
	objVectors[4] = buildRoleVector();
    }
    
    private void buildCommonVector(){
	commonVector.addElement(new RpslObject(RpslObject.MANDATORY, RpslObject.SINGLE,
					       "descr:", "A description of this object", 
					       descrtf));
	commonVector.addElement(new RpslObject(RpslObject.MANDATORY, RpslObject.SINGLE,
					       "tech-c:", "Nic handles for the\ntechnical contacts", 
					       techctf));
	commonVector.addElement(new RpslObject(RpslObject.OPTIONAL, RpslObject.MULTI,
					       "admin-c:", "Nic handles for the\nadministrative contacts", 
					       adminctf));
	commonVector.addElement(new RpslObject(RpslObject.OPTIONAL, RpslObject.MULTI,
					       "remarks:", 
					       "Any text you want to be associated\nwith this object", 
					       remarkstf));
	commonVector.addElement(new RpslObject(RpslObject.OPTIONAL, RpslObject.MULTI,
					       "notify:", 
					       "When object is updated,\nsend email to these\npeople", 
					       notifytf));
	commonVector.addElement(new RpslObject(RpslObject.MANDATORY, RpslObject.MULTI,
					       "mnt-by:", 
					       "Maintainer objects that\n are allowed to change\n" +
					       "this object", 
					       mntbytf));
	commonVector.addElement(new RpslObject(RpslObject.MANDATORY, RpslObject.MULTI,
					       "changed:", 
					       "Of the form:\n user@host.xxx YYYYMMDD ", 
					       changedtf));
	commonVector.addElement(new RpslObject(RpslObject.MANDATORY, RpslObject.SINGLE,
					       "source:", 
					       "The name of the database\nin which the object belongs", 
					       sourcetf));
    }
    
    private Vector buildMaintVector(){
	Vector v = new Vector();
	v.addElement(new RpslObject(RpslObject.MANDATORY, RpslObject.SINGLE,
				    "mntner:", "The name of the maintainer", 
				    mainttf));
	v.addElement(new RpslObject(RpslObject.MANDATORY, RpslObject.MULTI,
				    "auth:", 
				    "Type of authorization used:\nCRYPT-PW\n"+
				    "PGP-KEY\nNONE\nMAIL-FROM", 
				    authtf));
	return v;
    }

     private Vector buildPersonVector(){
	 Vector v = new Vector();
	 v.addElement(new RpslObject(RpslObject.MANDATORY, RpslObject.SINGLE,
				     "person:", 
				     "A person's name", 
				     persontf));
	 v.addElement(new RpslObject(RpslObject.MANDATORY, RpslObject.SINGLE,
				     "nic-hdl:", 
				     "The person's nic handle", 
				     nichdltf));
	 v.addElement(new RpslObject(RpslObject.MANDATORY, RpslObject.MULTI,
				     "address:", 
				     "The person's postal address", 
				     addresstf));
	 v.addElement(new RpslObject(RpslObject.MANDATORY, RpslObject.MULTI,
				     "phone:", 
				     "The person's phone\n(xxx)xxx-xxxx", 
				     phonetf));
	 v.addElement(new RpslObject(RpslObject.OPTIONAL, RpslObject.MULTI,
				     "fax-no:", 
				     "The person's fax\n(xxx)xxx-xxxx", 
				     faxtf));
	 v.addElement(new RpslObject(RpslObject.MANDATORY, RpslObject.MULTI,
				     "e-mail:", 
				     "The person's email", 
				     emailtf));
	 return v;
     }

    private Vector buildAutnumVector(){
	 Vector v = new Vector();
	 v.addElement(new RpslObject(RpslObject.MANDATORY, RpslObject.SINGLE,
				     "aut-num:", 
				     "An autonomous system number", 
				     autnumtf));
	 v.addElement(new RpslObject(RpslObject.MANDATORY, RpslObject.SINGLE,
				     "as-name:", 
				     "The symbolic name of the AS", 
				     asnametf));
	 v.addElement(new RpslObject(RpslObject.OPTIONAL, RpslObject.MULTI,
				     "member-of:", 
				     "List of as-sets", 
				     memberoftf));
	 v.addElement(new RpslObject(RpslObject.OPTIONAL, RpslObject.MULTI,
				     "import:", 
				     "No description", 
				     importtf));
	 v.addElement(new RpslObject(RpslObject.OPTIONAL, RpslObject.MULTI,
				     "export:", 
				     "No description", 
				     exporttf));
	 v.addElement(new RpslObject(RpslObject.OPTIONAL, RpslObject.MULTI,
				     "default:", 
				     "No description", 
				     defaulttf));
	 return v;
    }

    private Vector buildRouteVector(){
	Vector v = new Vector();
	v.addElement(new RpslObject(RpslObject.MANDATORY, RpslObject.SINGLE,
				    "route:", 
				    "A route:\nxxx.xxx.xxx.xxx/xx", 
				    routetf));
	v.addElement(new RpslObject(RpslObject.MANDATORY, RpslObject.SINGLE,
				    "origin:", 
				    "An autonomous system number that originate this route", 
				    origintf));
	v.addElement(new RpslObject(RpslObject.OPTIONAL, RpslObject.MULTI,
				    "member-of:", 
				    "A list of route-sets", 
				    memberoftf));
	v.addElement(new RpslObject(RpslObject.OPTIONAL, RpslObject.MULTI,
				    "inject:", 
				    "Optional\nMulti-valued\n", 
				    injecttf));
	v.addElement(new RpslObject(RpslObject.OPTIONAL, RpslObject.MULTI,
				    "components:", 
				    "Optional\nMulti-valued\n", 
				    componentstf));
	v.addElement(new RpslObject(RpslObject.OPTIONAL, RpslObject.MULTI,
				    "aggr-bndry:", 
				    "Optional\nMulti-valued\n", 
				    aggrbndrytf));
	v.addElement(new RpslObject(RpslObject.OPTIONAL, RpslObject.MULTI,
				    "aggr-mtd:", 
				    "Optional\nMulti-valued\n", 
				    aggrmtdtf));
	v.addElement(new RpslObject(RpslObject.OPTIONAL, RpslObject.MULTI,
				    "export-comps:", 
				    "Optional\nMulti-valued\n", 
				    exportcompstf));
	v.addElement(new RpslObject(RpslObject.OPTIONAL, RpslObject.MULTI,
				    "holes:", 
				    "Optional\nMulti-valued\n", 
				    holestf));
	return v;
    }

    private Vector buildRoleVector(){
	Vector v = new Vector();
	v.addElement(new RpslObject(RpslObject.MANDATORY, RpslObject.SINGLE,
				    "role:", 
				    "A person's role", 
				    roletf));
	v.addElement(new RpslObject(RpslObject.MANDATORY, RpslObject.SINGLE,
				    "nic-hdl:", 
				    "The person's nic handle", 
				    nichdltf));
	v.addElement(new RpslObject(RpslObject.OPTIONAL, RpslObject.MULTI,
				    "trouble:", 
				    "Optional\nMulti-valued\n", 
				    troubletf));
	v.addElement(new RpslObject(RpslObject.OPTIONAL, RpslObject.MULTI,
				    "address:", 
				    "The person's postal address", 
				    addresstf));
	 v.addElement(new RpslObject(RpslObject.MANDATORY, RpslObject.MULTI,
				     "phone:", 
				     "The person's phone\n(xxx)xxx-xxxx", 
				     phonetf));
	 v.addElement(new RpslObject(RpslObject.OPTIONAL, RpslObject.MULTI,
				     "fax-no:", 
				     "The person's fax\n(xxx)xxx-xxxx", 
				     faxtf));
	 v.addElement(new RpslObject(RpslObject.MANDATORY, RpslObject.MULTI,
				     "e-mail:", 
				     "Mandatory\nMulti-valued\nThe person's email", 
				     emailtf));
	 return v;
    }


    public void actionPerformed(ActionEvent e){
	String event = e.getActionCommand();
	if(event.equals("Next")){
	    if(curVectorIndex != 0){
		RpslObject curObj1 = (RpslObject)curVector.get(curInternalIndex);
		if( ((JTextComponent)curObj1.panel).getText().trim().length() == 0  &&
		    curObj1.requiredPolicy == RpslObject.MANDATORY){
		    JOptionPane.showMessageDialog(null, "This is a required field", 
						  "Field Required", JOptionPane.ERROR_MESSAGE);
		    return;
		}   
	    }
	    if(curVectorIndex == 0){
		curVector = (Vector)objVectors[objs.getSelectedIndex()];
		first = curVector;
		curVectorIndex++;
	    }
	    curInternalIndex++;
	    if(curInternalIndex > -1 && curInternalIndex < curVector.size()){
		RpslObject curObj = (RpslObject)curVector.get(curInternalIndex);
		if(curObj.requiredPolicy == RpslObject.MANDATORY)
		    requiredLabel.setText("Mandatory Field");
		else
		    requiredLabel.setText("Optional Field");
		if(curObj.occurancePolicy == RpslObject.MULTI)
		    occuranceLabel.setText("Multi-valued");
		else
		    occuranceLabel.setText("Single-valued");
		topLabel.setText(curObj.label);
		leftTextArea.setText(curObj.description);
		cur.setViewportView(curObj.panel);
	    }
	    else if(curVectorIndex < 2){
		curVectorIndex++;
		curVector = commonVector;
		curInternalIndex = 0;
		RpslObject curObj = (RpslObject)curVector.get(curInternalIndex);
		if(curObj.requiredPolicy == RpslObject.MANDATORY)
		    requiredLabel.setText("Mandatory Field");
		else
		    requiredLabel.setText("Optional Field");
		if(curObj.occurancePolicy == RpslObject.MULTI)
		    occuranceLabel.setText("Multi-valued");
		else
		    occuranceLabel.setText("Single-valued");
		topLabel.setText(curObj.label);
		leftTextArea.setText(curObj.description);
		cur.setViewportView(curObj.panel);
	    }
	    else{
		nextButton.setEnabled(false);
		finishButton.setEnabled(true);
	    }
	    backButton.setEnabled(true);
	}
	else if(event.equals("Back")){
	    curInternalIndex--;
	    if(curInternalIndex < 0){
		if(curVectorIndex == 2){
		    curVector = first;
		    curInternalIndex = curVector.size()-1;
		    curVectorIndex--;
		    RpslObject curObj = (RpslObject)curVector.get(curInternalIndex);
		    if(curObj.requiredPolicy == RpslObject.MANDATORY)
			requiredLabel.setText("Mandatory Field");
		    else
			requiredLabel.setText("Optional Field");
		    if(curObj.occurancePolicy == RpslObject.MULTI)
			occuranceLabel.setText("Multi-valued");
		    else
			occuranceLabel.setText("Single-valued");
		    topLabel.setText(curObj.label);
		    leftTextArea.setText(curObj.description);
		    cur.setViewportView(curObj.panel);
		}
		else if(curVectorIndex == 1){
		    curVectorIndex--;
		    cur.setViewportView(typeObj.panel);
		    topLabel.setText(typeObj.label);
		    leftTextArea.setText(typeObj.description);
		    backButton.setEnabled(false);
		}
	    }
	    else{
		RpslObject curObj = (RpslObject)curVector.get(curInternalIndex);
		if(curObj.requiredPolicy == RpslObject.MANDATORY)
		    requiredLabel.setText("Mandatory Field");
		else
		    requiredLabel.setText("Optional Field");
		if(curObj.occurancePolicy == RpslObject.MULTI)
		    occuranceLabel.setText("Multi-valued");
		else
		    occuranceLabel.setText("Single-valued");
		topLabel.setText(curObj.label);
		leftTextArea.setText(curObj.description);
		cur.setViewportView(curObj.panel);
	    }
	    nextButton.setEnabled(true);
	    finishButton.setEnabled(false);
	}
	else if(event.equals("Cancel"))
	    dispose();
	else if(event.equals("Finish")){
	    for(int i = 0; i < first.size(); i++)
		((RpslObject)first.get(i)).dump(parent);
	    for(int i = 0; i < commonVector.size(); i++)
		((RpslObject)commonVector.get(i)).dump(parent);
	    dispose();
	}
    }

    public void itemStateChanged(ItemEvent e){
	if(e.getStateChange() == ItemEvent.SELECTED){
	    }
    }
}


syntax highlighted by Code2HTML, v. 0.9.1