home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1995 November / PCWK1195.iso / inne / win95 / sieciowe / hotja32.lzh / hotjava / classsrc / browser / tools / javasearch / searchwindow.java < prev    next >
Text File  |  1995-08-11  |  10KB  |  358 lines

  1. /*
  2.  * @(#)SearchWindow.java    1.34 95/03/20 Sami Shaio, Patrick Chan
  3.  *
  4.  * Copyright (c) 1994 Sun Microsystems, Inc. All Rights Reserved.
  5.  *
  6.  * Permission to use, copy, modify, and distribute this software
  7.  * and its documentation for NON-COMMERCIAL purposes and without
  8.  * fee is hereby granted provided that this copyright notice
  9.  * appears in all copies. Please refer to the file "copyright.html"
  10.  * for further important copyright and licensing information.
  11.  *
  12.  * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
  13.  * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
  14.  * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
  15.  * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
  16.  * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
  17.  * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
  18.  */
  19.  
  20. package browser.tools.JavaSearch;
  21.  
  22. import awt.*;
  23. import java.lang.*;
  24. import java.io.*;
  25. import java.util.*;
  26. import browser.hotjava;
  27.  
  28. /** Creates a search window.  If 'wr' is null, the search window 
  29.     is not associated with any hotjava; the hotjava will
  30.     automatically be created when the user selects a document
  31.     to view. */
  32. public
  33. class SearchWindow extends Frame implements ChoiceHandler {
  34.     public SearchWindow(hotjava wr, WServer pServer) {
  35.     super(pServer, true, wr, 319, 475, Color.lightGray);
  36.     setDefaultFont(pServer.fonts.getFont("Dialog", Font.BOLD, 12));
  37.         Label l;
  38.     RowColLayout r;
  39.         FlowLayout fl;
  40.         BorderLayout bl;
  41.  
  42.         wrunner = wr;
  43.         server = pServer;
  44.     setTitle("Search Java-related Documentation");
  45.  
  46.         // construct user interface
  47.     //cw = new Window(this, "North", background, 300, 100);
  48.  
  49.     cw = new Window(this, "Center", background, 300, 300);
  50.         cw.setLayout(new ColumnLayout(true));
  51.     hitList = new List(cw,this,"", 20, false, false);
  52.     hitList.setHFill(true);
  53.     hitList.setVFill(true);
  54.  
  55.         cw = new Window(this, "South", background, 300, 300);
  56.         cw.setLayout(new ColumnLayout(false));
  57.  
  58.     l = new Label("Query:","", cw);
  59.     queryField = new QueryTextField(this, "","queryField",cw, true);
  60.     queryField.setHFill(true);
  61.  
  62.     l = new Label("Books to Search:",null, cw);
  63.  
  64.     Row row = new Row(cw, "optmenu", true);
  65.         scopeMenu = new OptionMenu(row, "", null);
  66.  
  67.     Row buttons = new Row(cw, "buttons", true);
  68.     searchB = new SearchButton(this, buttons);
  69.     quitB = new QuitButton(this, buttons);
  70.     new HelpButton(this, buttons);
  71.  
  72.         if (hasStatusBar()) {
  73.             showStatusBar(true);
  74.         } else {
  75.         statusBar = new Label("Ready.", null, cw, null);
  76.         statusBar.setHFill(true);
  77.         }
  78.  
  79.     selectedItem = 0;
  80.     readListOfBooks();
  81.     scopeMenu.select(0);
  82.     }
  83.  
  84.     public void readListOfBooks() {
  85.         boolean ok;
  86.  
  87.         // get docPath
  88.         docPath = System.getenv("HOTJAVA_HOME");
  89.         if (docPath == null) {
  90.             docPath = "/usr/local/hotjava";
  91.         }
  92.         docPath = docPath + File.separator + "doc";
  93.     docPath.replace('/', File.separatorChar);
  94.         ok = new File(docPath).exists();
  95.         if (! ok) {
  96.             setMessage("Can't locate the directory " + docPath + " for documentation.");
  97.         }
  98.  
  99.         if (ok) {
  100.         // read ListOfBooks file
  101.         listOfBooksPath = docPath + File.separator + "ListOfBooks";
  102.         FileInputStream fstream = null;
  103.         try {
  104.         fstream = new FileInputStream(listOfBooksPath);
  105.         } catch (IOException e) {
  106.         setMessage("Could not open " + listOfBooksPath + ".");
  107.                 return;
  108.         }
  109.             listOfBooks = new Vector();
  110.         DataInputStream dstream = new DataInputStream(fstream);
  111.         String line;
  112.         while ((line = dstream.readLine()) != null) {
  113.         scopeMenu.addItem(line);
  114.                 line = dstream.readLine();
  115.                 if (line == null) {
  116.                     setMessage("Number of lines in " + listOfBooksPath + " file must be even.");
  117.                     listOfBooks = null;
  118.                     break;
  119.                 }
  120.                 listOfBooks.addElement(line);
  121.         }
  122.             if (listOfBooks != null && listOfBooks.size() == 0) {
  123.         setMessage(listOfBooksPath + " is empty.");
  124.                 listOfBooks = null;
  125.             }
  126.         fstream.close();
  127.         }
  128.     }
  129.  
  130.     public static void main(String args[]) {
  131.     WServer        server;
  132.     SearchWindow    searchW;
  133.  
  134.     try {
  135.         server = new WServer();
  136.     } catch(Exception e) {
  137.         System.out.print("Couldn't open connection to window server\n");
  138.         e.printStackTrace();
  139.         return;
  140.     }
  141.     server.start();
  142.     searchW = new SearchWindow(null, server);
  143.     searchW.map();
  144.         searchW.resize();
  145.     }
  146.  
  147.     public void selected(Component c, int pos) {
  148.     selectedItem = pos;
  149.     go(hotjava.dochome + currentSearchResults.getDocAt(pos).filename);
  150.     }
  151.  
  152.     public void go(String url) {
  153.         if (wrunner == null) {
  154.         wrunner = new hotjava(server, new String[0]);
  155.         }
  156.     wrunner.map();
  157.     wrunner.go(url);
  158.     }
  159.  
  160.     public void doSearch() {
  161.     String dbname;
  162.     String query = queryField.getText();
  163.  
  164.         if (listOfBooks == null) {
  165.             return;
  166.         }
  167.         if (query.length() == 0) {
  168.         }
  169.         dbname = docPath + File.separator 
  170.             + listOfBooks.elementAt(scopeMenu.selectedIndex) + File.separator;
  171.     setMessage("Searching " + dbname + "...");
  172.  
  173.     // Clear the scrolling list before a search:
  174.     hitList.clear();
  175. /*
  176.         while (hitList.nItems() > 0) {
  177.             hitList.delItem(0);
  178.         }
  179. */
  180.  
  181.     // Do the search!
  182.         try {
  183.         Database db = Database.OpenDatabase(dbname);
  184.         currentDatabase = db;
  185.         Searcher searcher = new Searcher(db, this);
  186.         DocList resultDL = searcher.doSearch(query);
  187.         currentSearchResults = resultDL;
  188.             if (resultDL == null) {
  189.         setMessage("There are no pages that satisfy the query.");
  190.             } else {
  191.                 if (resultDL.size() <= displayLimit) {
  192.             setMessage("Found " + resultDL.size() + " pages.");
  193.         } else {
  194.             setMessage("Found " + resultDL.size() + " pages. Displaying first "+displayLimit+" only.");
  195.             displayLimitMessage(resultDL.size());
  196.                 }
  197.         for (int i=0; i<Math.min(displayLimit, resultDL.size()); i++) {
  198.             Doc doc = resultDL.getDocAt(i);
  199.             String headline = doc.headline;
  200.  
  201.             hitList.addItem(headline);
  202.         }
  203.             } 
  204.         } catch (IOException e) {
  205.             setMessage("Failed to open book " + dbname + ".");
  206.         } catch (Exception e) {
  207.             e.printStackTrace();
  208.         }
  209.     }
  210.  
  211.     /** Displays the specified message in the status bar */
  212.     public void setMessage(String msg) {
  213.         if (statusBar != null) {
  214.         statusBar.setText(msg);
  215.         } else {
  216.             setStatusMessage(msg);
  217.         }
  218.     }
  219.  
  220.     /** Display the list of stopped words in a dialog box. */
  221.     public void displayStoppedWords(Vector words) {
  222.     int listLen = words.size();
  223.     String wordList = "'"+words.elementAt(0)+"'";
  224.     
  225.     for (int i = 1; i < listLen; i++) {
  226.         if (i == listLen - 1) {
  227.         if (listLen > 2) {
  228.             wordList += ", and '"+words.elementAt(i)+"'";
  229.         } else {
  230.             wordList += " and '"+words.elementAt(i)+"'";
  231.         }
  232.         } else {
  233.         wordList += ", '"+words.elementAt(i)+"'";
  234.         }
  235.     }
  236.         
  237.     new MessageDialog(this, "Query status",
  238.               "Removed from query: "+wordList,
  239.               MessageDialog.INFO_TYPE, 1, false,
  240.               null, null, null, null).show();
  241.     }
  242.     
  243.     /** Put up a dialog that tells the user that there are too many results
  244.      *  to display.  Suggest better search strategies. */
  245.     public void displayLimitMessage(int numResults) {
  246.     new MessageDialog(this, "Search status",
  247.               "Found "+numResults+" pages. (Display limit is "+
  248.               displayLimit+".)  Try using more keywords or "+
  249.               "AND to narrow your search.",
  250.               MessageDialog.INFO_TYPE, 1, false,
  251.               null, null, null, null).show();
  252.     }
  253.     
  254.     public void doubleClick(Component c, int pos) {
  255.     selectedItem = pos;
  256.     System.out.println("Double-click on " + hitList.itemAt(pos));
  257.  
  258.     Doc doc = currentSearchResults.getDocAt(pos);
  259.     System.out.println("\n--> headline of this doc is "+doc.headline);
  260.  
  261.     String pathname = currentDatabase.docPathPrefix + doc.filename;
  262.     System.out.println("--> The full pathname for this doc is "+
  263.                pathname);
  264.  
  265.     String fullURL = null;
  266.     if (currentDatabase.docURLPrefix != null) {
  267.         fullURL = currentDatabase.docURLPrefix + doc.filename;
  268.         System.out.println("--> The full URL for this doc is "+
  269.                    fullURL);
  270.     }
  271.     else {
  272.         System.out.println("--> (This Database does not have a URL prefix...)");
  273.     }
  274.         
  275.  
  276.     //
  277.     // Ok!  Do something with this document!
  278.     //
  279.     // Given "pathname", maybe open it in its own window?
  280.     //
  281.     // Or, if we're running as an Applet, here's the time
  282.     //   to do "MosaicWindow.pushURL(fullURL)"!
  283.     //
  284.     }
  285.  
  286.     hotjava wrunner;
  287.     WServer server;
  288.  
  289.     // widgets
  290.     Button        quitB;
  291.     Button        searchB;
  292.     Window        cw;
  293.     int            selectedItem;
  294.     List        hitList;
  295.     TextField        queryField;
  296.     Label               statusBar;
  297.     OptionMenu          scopeMenu;
  298.  
  299.     String docPath;         // HOTJAVA_HOME/doc
  300.     String listOfBooksPath; // HOTJAVA_HOME/doc/ListOfBooks
  301.     Vector listOfBooks;     // list of books.  == null if no books found.
  302.     Database currentDatabase;
  303.     DocList currentSearchResults;
  304.  
  305.     final int displayLimit = 100; // display no more than this many hits
  306. }
  307.  
  308. class HelpButton extends Button {
  309.     SearchWindow target;
  310.  
  311.     HelpButton(SearchWindow searchWindow, Container w) {
  312.     super("Help", null, w);
  313.         target = searchWindow;
  314.     }
  315.     public void selected(Component c, int pos) {
  316.         target.go(hotjava.dochome + "JavaSearchHelp.html");
  317.     }
  318. }
  319.  
  320. class QuitButton extends Button {
  321.     Frame f;
  322.     QuitButton(Frame pF, Container w) {
  323.     super("Cancel", null, w);
  324.         f = pF;
  325.     }
  326.     public void selected(Component c, int pos) {
  327.     f.unMap();
  328.     }
  329. }
  330.  
  331. class SearchButton extends Button {
  332.     SearchWindow sw;
  333.     SearchButton(SearchWindow pF, Container w) {
  334.     super("Search", null, w);
  335.         sw = pF;
  336.     }
  337.     public void selected(Component c, int pos) {
  338.     sw.doSearch();
  339.     }
  340. }
  341.  
  342. class QueryTextField extends TextField {
  343.     SearchWindow target;
  344.  
  345.     QueryTextField(SearchWindow searchWindow, 
  346.            String initValue, String pName, 
  347.            Container p, boolean editable) {
  348.         super(initValue, pName, p, editable);
  349.         target = searchWindow;
  350.     }
  351.     public void selected() {
  352.         target.doSearch();
  353.     }
  354. }
  355.  
  356.  
  357.  
  358.