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.*;

public class IRRj extends JFrame implements ActionListener{
    public static IrrdTextArea ita = new IrrdTextArea(20, 40);
    public static JTextArea log = new JTextArea(12, 30);
    public static GetRequest gr;
    IrrdSearchPane sPane = new IrrdSearchPane(this);
    JButton backButton;
    JButton forButton;
    Font smallFont = new Font("Monospaced", Font.PLAIN, 11);
    protected JButton stopButton;
    public static OptionsWindow optWin;
    public static JProgressBar jpb = new JProgressBar(0, 100);
    public static Properties prop = new Properties();
    public final static String newLine = "\n";
    public static Hashtable iconHash = new Hashtable();
    public FindWindow finder = new FindWindow();

    public IRRj(){
	super("IRRj 2.0");
	addWindowListener(new WindowAdapter(){
		public void windowClosing(WindowEvent e){
		    System.exit(1);
		} 
	    });
	buildLayout();
	sPane.input.addKeyListener (new KeyAdapter () {
		public void keyPressed (KeyEvent e) {
		    if (e.getKeyCode() == KeyEvent.VK_ENTER) 
			handleSubmit();
		}
	    });
	loadIcons();
	loadDefaults();
	ita.setSearchPane(sPane);
	ita.setSelectionColor(Color.red);
	log.setEditable(false);
	jpb.setStringPainted(true);
	jpb.setString("Ready");
	pack();
	setVisible(true);
    }
    
    public static void main(String args[]){
	Thread t = new Thread(){
		public void run(){
		    new IRRj();
		}
	    };
	t.start();
    }
    
    public static void loadDefaults(){
	try{
	    FileInputStream in = new FileInputStream("defaults.irr");
	    prop.load(in);
	    in.close();
	}
	catch(Exception e){}
	String server = prop.getProperty("queryserver", "whois.radb.net");
	int port = Integer.valueOf(prop.getProperty("queryport", "43")).intValue();
	gr = new GetRequest(server, port, GetRequest.STAY_CONNECTED);
	optWin = new OptionsWindow();
    }
    
    public void loadIcons(){
	iconHash.put("undoIcon", loadJarImage("Undo24.gif"));
	iconHash.put("redoIcon",  loadJarImage("Redo24.gif"));
	iconHash.put("copyIcon", loadJarImage("Copy24.gif"));
	iconHash.put("pasteIcon", loadJarImage("Paste24.gif"));
	iconHash.put("saveIcon", loadJarImage("Save24.gif"));
	iconHash.put("loadIcon", loadJarImage("Open24.gif"));
	iconHash.put("copyIconSmall", loadJarImage("Copy16.gif"));
	iconHash.put("clearIcon", loadJarImage("Delete16.gif"));
    }

    public void buildLayout(){
	buildMenuBar();
	buildToolBar();
	JButton qButton = new JButton("Submit");
	qButton.setFont(smallFont);
	qButton.addActionListener(this);
	sPane.add(qButton, BorderLayout.EAST);
	JPanel centerPane = new JPanel();
	centerPane.setLayout(new BorderLayout());
	centerPane.add(sPane, BorderLayout.NORTH);
	JScrollPane jsp = new JScrollPane(ita);
	centerPane.add(jsp, BorderLayout.CENTER);
	getContentPane().add(centerPane, BorderLayout.CENTER);
	getContentPane().add(jpb, BorderLayout.SOUTH);
    }

    public void buildMenuBar(){
	JMenuBar topMenuBar = new JMenuBar();
	setJMenuBar(topMenuBar);
	JMenu fileMenu = new JMenu("File");
	topMenuBar.add(fileMenu);
	JMenu editMenu = new JMenu("Edit");
	topMenuBar.add(editMenu);
	
	JMenuItem newMenuItem = new JMenuItem("New Object");
	fileMenu.add(newMenuItem);
	newMenuItem.addActionListener(this);
	JMenuItem exitMenuItem = new JMenuItem("Exit");
	fileMenu.addSeparator();
	fileMenu.add(exitMenuItem);
	exitMenuItem.addActionListener(this);

	JMenuItem copyMenuItem = new JMenuItem("Copy");
	editMenu.add(copyMenuItem);
	copyMenuItem.addActionListener(this);
	JMenuItem prefMenuItem = new JMenuItem("Preferences...");
	prefMenuItem.setActionCommand("Pref");
	editMenu.addSeparator();
	editMenu.add(prefMenuItem);
	prefMenuItem.addActionListener(this);
    }

    public void buildToolBar(){
	JToolBar topToolBar = new JToolBar();
	topToolBar.setFloatable(false);

	ImageIcon backIcon = loadJarImage("Back24.gif");
	backButton = new JButton(backIcon);
	backButton.setEnabled(false);
	backButton.setToolTipText("Back");
	backButton.setActionCommand("Back");
	backButton.addActionListener(this);	
	
	ImageIcon forIcon = loadJarImage("Forward24.gif");
	forButton = new JButton(forIcon);
	forButton.setEnabled(false);
	forButton.setToolTipText("Forward");
	forButton.setActionCommand("Forward");
	forButton.addActionListener(this);

	ImageIcon findIcon = loadJarImage("Find24.gif");
	JButton findButton = new JButton(findIcon);
	findButton.setToolTipText("Find");
	findButton.setActionCommand("Find");
	findButton.addActionListener(this);

	ImageIcon prefIcon = loadJarImage("Preferences24.gif");
	JButton prefButton = new JButton(prefIcon);
	prefButton.setToolTipText("Preferences");
	prefButton.setActionCommand("Pref");
	prefButton.addActionListener(this);

	ImageIcon stopIcon = loadJarImage("Stop24.gif");
	stopButton = new JButton(stopIcon);
	stopButton.setEnabled(false);
	stopButton.setToolTipText("Stop");
	stopButton.setActionCommand("Stop");
	stopButton.addActionListener(this);

	topToolBar.add(backButton);
	topToolBar.add(forButton);
	topToolBar.add(findButton);
	topToolBar.add(prefButton);
	topToolBar.add(stopButton);

	getContentPane().add(topToolBar, BorderLayout.NORTH);
    }

    public ImageIcon loadJarImage(String name){
	URL url = getClass().getResource("images/" + name); 
	if (url != null) { 
	    Image image = Toolkit.getDefaultToolkit().getImage(url); 
	    if (image != null) { 
		return new ImageIcon(image); 
	    } 
	}
	return null;
    } 
	
    public synchronized void handleSubmit(){
	if(sPane.getRequest() == null)
	    return;
	Cursor curs = new Cursor (Cursor.WAIT_CURSOR);
	setCursor (curs);
	stopButton.setEnabled(true);
	backButton.setEnabled(false);

	jpb.setString("Working...");
	
	Thread s = new Thread(){
		public void run(){
		    gr.getNewRequest(sPane.getRequest(), ita, jpb);
		    sPane.handleSubmit(ita.getText());
		    setCursor (Cursor.getDefaultCursor());
		    jpb.setString("Ready");
		    stopButton.setEnabled(false);
		    backButton.setEnabled(true);
		    jpb.setValue(0);
		}
	    };
	s.start();
    }

    public void actionPerformed(ActionEvent e){
	String event = e.getActionCommand();
	if(event.equals("Submit"))
	    handleSubmit();
	else if(event.equals("Exit")){
	    System.exit(1);
	}
	else if(event.equals("Back")){
	    String doc = sPane.back();
	    if(doc != null){
		ita.setText(doc);
		forButton.setEnabled(true);
	    }
	    else
		backButton.setEnabled(false);
	}
	else if(event.equals("Forward")){
	    String doc = sPane.forward();
	    if(doc != null){
		ita.setText(doc);
		backButton.setEnabled(true);
	    }
	    else
		forButton.setEnabled(false);
	}
	else if(event.equals("Copy"))
	    ita.copy();
	else if(event.equals("Stop")){
	    log.append("Action Stopped\n");
	    gr.stopQuery();
	}
	else if(event.equals("Find"))
	    finder.setVisible(true);
	else if(event.equals("New Object"))
	    new EditorWindow();
	else if(event.equals("Pref"))
	    optWin.setVisible(true);
    }
}



syntax highlighted by Code2HTML, v. 0.9.1