/* Applet Copyright (C) 2004, Raymond Software, Inc. */
/* GoogleAPIDemo Copyright (C) 2002, Google, Inc. */

package com.google.soap.search;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.io.*;
import java.util.*;
import java.net.*;
import java.lang.*;

/**
 * This applet demonstrates how to use the Google Web APIs for
 * searching, spell checking, and fetching pages from the cache.
 *
 * @see com.google.soap.search.GoogleSearch
 * @see com.google.soap.search.GoogleSearchResult
 */

public class GoogleAPIDemo extends JApplet {

    private JFrame frame;
    private JTextField keyField;
    private JTextArea argField;
    private JTextArea parmField;
    private JButton searchBtn;
    private JButton cacheBtn;
    private JButton spellBtn;
    private JPanel fieldPanel;
    private JPanel buttonPanel;
    private JScrollPane argScrollPane;
    private JScrollPane parmScrollPane;
    private Container cp;
    private JButton showHideBtn;
    private SecurityManager manager;
    
    String directive;
    String directiveArg;
    String clientKey; 
    GoogleSearch s;
    GoogleSearchResult r;
    String suggestion;
    String cachedString;
        
    public void init() {
       
        // set the default look and feel
        String laf = UIManager.getSystemLookAndFeelClassName();
        try {
            // UIManager.setLookAndFeel(laf);
            // If you want the Cross Platform L&F instead, comment out the above line and
            // uncomment the following:
            UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
        } catch (UnsupportedLookAndFeelException exc) {
            System.err.println ("Warning: UnsupportedLookAndFeel: " + laf);
        } catch (Exception exc) {
            System.err.println ("Error loading " + laf + ": " + exc);
        }
        
        // create the GUI

        // separate window
        frame = new JFrame();
        frame.setTitle("Google Web API Demo Applet");
        frame.setSize(500, 400);
        cp = frame.getContentPane();
    
        fieldPanel = new JPanel();
        buttonPanel = new JPanel();
        
        cp.add(fieldPanel, BorderLayout.CENTER);
        cp.add(buttonPanel, BorderLayout.SOUTH);

        BorderLayout bordLayout = new BorderLayout();
        fieldPanel.setLayout(bordLayout);
        
        keyField = new JTextField("Enter your Google key here", 20);
        keyField.setEditable(true);
        fieldPanel.add(keyField, BorderLayout.NORTH);

        parmField = new JTextArea("Parameters:", 5, 20);
        parmField.setEditable(false);
        parmScrollPane = new JScrollPane(parmField);
        fieldPanel.add(parmScrollPane, BorderLayout.CENTER);

        argField = new JTextArea("Enter a search string or a URI here", 15, 20);
        argField.setEditable(true);
        argScrollPane = new JScrollPane(argField);
        fieldPanel.add(argScrollPane, BorderLayout.SOUTH);
    
        searchBtn = new JButton("Search");
        buttonPanel.add(searchBtn);
        cacheBtn = new JButton("Cached");
        buttonPanel.add(cacheBtn);
        spellBtn = new JButton("Spell");
        buttonPanel.add(spellBtn);

        // Show/Hide button on the web page
        this.getContentPane().setLayout(new FlowLayout());
        showHideBtn = new JButton("Show(Hide)");
        this.getContentPane().add(showHideBtn);
        
        // display the Google key if set above
        // keyField.setText(clientKey);
        
        this.setVisible(true);
        frame.setVisible(true);
      
    
    } // Init
    
    public void start() {
        
        try {
            // Create a Google Search object
            s = new GoogleSearch();
        } 
        catch (Exception e) {
            argField.setText("Exception: " + e);
            argScrollPane.validate();
        } 
    	
        keyField.requestFocus();
        keyField.selectAll();

        showHideBtn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                //Toolkit.getDefaultToolkit().beep();
                if (frame.isVisible()) frame.setVisible(false);
                else frame.setVisible(true);
            }
        });
    
        searchBtn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                //Toolkit.getDefaultToolkit().beep();
                clientKey = keyField.getText();
                directive = "search";
                directiveArg = argField.getText();
                // Report the arguments passed
                parmField.setText("Parameters:\n" + 
                "Client key = " + clientKey + "\n" + 
                "Directive  = " + directive + "\n" + 
                "Args       = " + directiveArg);
                parmScrollPane.validate();
                try {
                    s.setKey(clientKey);
                    s.setQueryString(directiveArg);
                    // Report the results of the query
                    r = s.doSearch();
                    argField.setText("Google Search Results:\n" +
                    "======================\n" + r.toString()); 
                    argScrollPane.validate();
                } catch (GoogleSearchFault f) {
                    argField.setText("The call to the Google Web APIs failed: " + f.toString());
                    argScrollPane.validate();
                } 
                catch (Exception e) {
                    argField.setText("Exception: " + e);
                    argScrollPane.validate();
                } 
        
            }
        });
    
        cacheBtn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                //Toolkit.getDefaultToolkit().beep();
                clientKey = keyField.getText();
                directive = "cached";
                directiveArg = argField.getText();
                // Report the arguments passed
                parmField.setText("Parameters:\n" + 
                "Client key = " + clientKey + "\n" + 
                "Directive  = " + directive + "\n" + 
                "Args       = " + directiveArg);
                parmScrollPane.validate();
                try {
                    s.setKey(clientKey);
                    // Report the results of the query
                    byte [] cachedBytes = s.doGetCachedPage(directiveArg);
                    // Note - this conversion to String should be done with reference
                    // to the encoding of the cached page, but we don't do that here.
                    cachedString = new String(cachedBytes);
                    argField.setText("Cached page:\n" +
                    "============\n" + cachedString);
                    argScrollPane.validate();
                } catch (GoogleSearchFault f) {
                    argField.setText("The call to the Google Web APIs failed: " + f.toString());
                    argScrollPane.validate();
                } 
                catch (Exception e) {
                    argField.setText("Exception: " + e);
                    argScrollPane.validate();
                } 
            }
        });
        
        spellBtn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                //Toolkit.getDefaultToolkit().beep();
                clientKey = keyField.getText();
                directive = "spell";
                directiveArg = argField.getText();
                // Report the arguments passed
                parmField.setText("Parameters:\n" + 
                "Client key = " + clientKey + "\n" + 
                "Directive  = " + directive + "\n" + 
                "Args       = " + directiveArg);
                parmScrollPane.validate();
                try {
                    s.setKey(clientKey);
                    // Report the results of the query
                    suggestion = s.doSpellingSuggestion(directiveArg);
                    argField.setText("Spelling suggestion:\n" + suggestion);
                    argScrollPane.validate();
                } catch (GoogleSearchFault f) {
                    argField.setText("The call to the Google Web APIs failed: " + f.toString());
                    argScrollPane.validate();
                } 
                catch (Exception e) {
                    argField.setText("Exception: " + e);
                    argScrollPane.validate();
                } 
            }
        });
        
    
    } // Start

} // Applet