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

  1. /*
  2.  * @(#)select.java    1.7 95/03/14 Jonathan Payne
  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.forms;
  21.  
  22. import browser.FormTagRef;
  23. import awt.DisplayItem;
  24. import awt.Component;
  25. import awt.DisplayItemWindow;
  26. import awt.NativeDisplayItem;
  27. import awt.OptionMenu;
  28. import awt.List;
  29. import browser.WRFormatter;
  30. import java.util.Hashtable;
  31.  
  32. /**
  33.  * An instance of class option is created for each occurrence of a
  34.  * <select size=1> in a form.
  35.  *
  36.  * @version 1.3, 12 Dec 1994
  37.  * @author Jonathan Payne
  38.  */
  39.  
  40. public class select extends FormItem {
  41.     boolean useOptionMenu;
  42.     boolean selected;
  43.     boolean finished = false;
  44.     Hashtable    optionValues;
  45.  
  46.     public DisplayItem buildDisplayItem(WRFormatter f) {
  47.     NativeDisplayItem   ndi = new FormDisplayItem();
  48.     String            sizeAttribute;
  49.     int            size = 1;
  50.     boolean            multiple;
  51.  
  52.     size = getIntegerAttribute("size", 1);
  53.     multiple = owner.getAttribute("multiple") != null;
  54.         
  55.     useOptionMenu = !(multiple || size >= 2);
  56.  
  57.     Component c;
  58.  
  59.     if (useOptionMenu) {
  60.         c = new OptionMenu(f.win, "", null);
  61.     } else {
  62.         c = new List(f.win, null, null, size, multiple);
  63.     }
  64.     ndi.setComponent(c);
  65.     ndi.reshape(ndi.x, ndi.y, c.width, c.height);
  66.  
  67.     if (optionValues != null) {
  68.         optionValues = null;
  69.     }
  70.  
  71.     return ndi;
  72.     }
  73.  
  74.     public void addOption(String option, String value, boolean selected) {
  75.     /* This item has already been built once, and now we're building
  76.        it again because we're relayingout the document.  But we want
  77.        to preserve the current settings.  This feels slightly bogus. */
  78.     if (finished) {
  79.         return;
  80.     }
  81.  
  82.     int limit = option.length();
  83.     int i0 = 0;
  84.     int c;
  85.  
  86.     while (i0 < limit) {
  87.         if (!((c = option.charAt(i0)) == ' ' || c == '\t' || c == '\n'))
  88.         break;
  89.         i0 += 1;
  90.     }
  91.     int i1 = limit;
  92.     while (i1 > i0) {
  93.         if (!((c = option.charAt(i1 - 1)) == ' ' || c == '\t' || c == '\n'))
  94.         break;
  95.         i1 -= 1;
  96.     }
  97.     option = option.substring(i0, i1);
  98.  
  99.     /* If a value was associated with this option, store that
  100.        now.  It's used instead of the name of the option, when
  101.        the value of this select is requested. */
  102.     if (value != null) {
  103.         if (optionValues == null) {
  104.         optionValues = new Hashtable();
  105.         }
  106.         optionValues.put(option, value);
  107.     }
  108.  
  109.     int count;
  110.  
  111.     if (useOptionMenu) {
  112.         OptionMenu  om = (OptionMenu) getComponent();
  113.  
  114.         om.addItem(option);
  115.         count = om.nItems();
  116.     } else {
  117.         List    list = (List) getComponent();
  118.  
  119.         list.addItem(option);
  120.         count = list.nItems();
  121.     }
  122.     if (selected) {
  123.         select(count - 1);
  124.     }
  125.     }
  126.  
  127.     public void finish() {
  128.     if (!finished) {
  129.         if (!selected) {
  130.         select(0);
  131.         }
  132.         finished = true;
  133.     }
  134.     }
  135.  
  136.     void select(int item) {
  137.     if (useOptionMenu) {
  138.         OptionMenu  om = (OptionMenu) getComponent();
  139.  
  140.         om.select(item);
  141.     } else {
  142.         List    list = (List) getComponent();
  143.  
  144.         list.select(item);
  145.     }
  146.     selected = true;
  147.     }        
  148.  
  149.     public void acceptStringValue(String newValue) {}
  150.         
  151.     public void reset() {
  152.     }
  153.  
  154.     /* If a value=foo was specified, return the value; otherwise,
  155.        return the actual item displayed in the list/option menu. */
  156.     private String optionSpecifiedValue(String option) {
  157.     if (optionValues != null) {
  158.         String  value = (String) optionValues.get(option);
  159.  
  160.         if (value != null) {
  161.         return value;
  162.         }
  163.     }
  164.     return option;
  165.     }
  166.  
  167.     final String getOptionMenuValue() {
  168.     OptionMenu  om = (OptionMenu) getComponent();
  169.  
  170.     return optionSpecifiedValue(om.selectedItem());
  171.     }
  172.  
  173.     private int    offset;
  174.  
  175.     final String getListValue() {
  176.     List    list = (List) getComponent();
  177.  
  178.     int    cnt = list.nItems() - offset;
  179.  
  180.     while (--cnt >= 0) {
  181.         if (list.isSelected(offset++)) {
  182.         return optionSpecifiedValue(list.itemAt(offset - 1));
  183.         }
  184.     }
  185.     return null;
  186.     }
  187.  
  188.     public String getFormString() {
  189.     if (useOptionMenu) {
  190.         return name + "=" + processString(getOptionMenuValue());
  191.     } else {
  192.         String  value;
  193.         String  result = "";
  194.         boolean doneOne = false;
  195.  
  196.         offset = 0;
  197.  
  198.         while ((value = getListValue()) != null) {
  199.         if (doneOne) {
  200.             result += "&";
  201.         }
  202.         result += name + "=" + processString(value);
  203.         doneOne = true;
  204.         }
  205.         return result;
  206.     }
  207.     }
  208.  
  209.     public String getFormValue() {
  210.     throw new Exception("Internal error: select form item");
  211.     }
  212. }
  213.