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 >
Wrap
Text File
|
1995-08-11
|
5KB
|
213 lines
/*
* @(#)select.java 1.7 95/03/14 Jonathan Payne
*
* Copyright (c) 1994 Sun Microsystems, Inc. All Rights Reserved.
*
* Permission to use, copy, modify, and distribute this software
* and its documentation for NON-COMMERCIAL purposes and without
* fee is hereby granted provided that this copyright notice
* appears in all copies. Please refer to the file "copyright.html"
* for further important copyright and licensing information.
*
* SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
* THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
* TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
* PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
* ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
* DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
*/
package browser.forms;
import browser.FormTagRef;
import awt.DisplayItem;
import awt.Component;
import awt.DisplayItemWindow;
import awt.NativeDisplayItem;
import awt.OptionMenu;
import awt.List;
import browser.WRFormatter;
import java.util.Hashtable;
/**
* An instance of class option is created for each occurrence of a
* <select size=1> in a form.
*
* @version 1.3, 12 Dec 1994
* @author Jonathan Payne
*/
public class select extends FormItem {
boolean useOptionMenu;
boolean selected;
boolean finished = false;
Hashtable optionValues;
public DisplayItem buildDisplayItem(WRFormatter f) {
NativeDisplayItem ndi = new FormDisplayItem();
String sizeAttribute;
int size = 1;
boolean multiple;
size = getIntegerAttribute("size", 1);
multiple = owner.getAttribute("multiple") != null;
useOptionMenu = !(multiple || size >= 2);
Component c;
if (useOptionMenu) {
c = new OptionMenu(f.win, "", null);
} else {
c = new List(f.win, null, null, size, multiple);
}
ndi.setComponent(c);
ndi.reshape(ndi.x, ndi.y, c.width, c.height);
if (optionValues != null) {
optionValues = null;
}
return ndi;
}
public void addOption(String option, String value, boolean selected) {
/* This item has already been built once, and now we're building
it again because we're relayingout the document. But we want
to preserve the current settings. This feels slightly bogus. */
if (finished) {
return;
}
int limit = option.length();
int i0 = 0;
int c;
while (i0 < limit) {
if (!((c = option.charAt(i0)) == ' ' || c == '\t' || c == '\n'))
break;
i0 += 1;
}
int i1 = limit;
while (i1 > i0) {
if (!((c = option.charAt(i1 - 1)) == ' ' || c == '\t' || c == '\n'))
break;
i1 -= 1;
}
option = option.substring(i0, i1);
/* If a value was associated with this option, store that
now. It's used instead of the name of the option, when
the value of this select is requested. */
if (value != null) {
if (optionValues == null) {
optionValues = new Hashtable();
}
optionValues.put(option, value);
}
int count;
if (useOptionMenu) {
OptionMenu om = (OptionMenu) getComponent();
om.addItem(option);
count = om.nItems();
} else {
List list = (List) getComponent();
list.addItem(option);
count = list.nItems();
}
if (selected) {
select(count - 1);
}
}
public void finish() {
if (!finished) {
if (!selected) {
select(0);
}
finished = true;
}
}
void select(int item) {
if (useOptionMenu) {
OptionMenu om = (OptionMenu) getComponent();
om.select(item);
} else {
List list = (List) getComponent();
list.select(item);
}
selected = true;
}
public void acceptStringValue(String newValue) {}
public void reset() {
}
/* If a value=foo was specified, return the value; otherwise,
return the actual item displayed in the list/option menu. */
private String optionSpecifiedValue(String option) {
if (optionValues != null) {
String value = (String) optionValues.get(option);
if (value != null) {
return value;
}
}
return option;
}
final String getOptionMenuValue() {
OptionMenu om = (OptionMenu) getComponent();
return optionSpecifiedValue(om.selectedItem());
}
private int offset;
final String getListValue() {
List list = (List) getComponent();
int cnt = list.nItems() - offset;
while (--cnt >= 0) {
if (list.isSelected(offset++)) {
return optionSpecifiedValue(list.itemAt(offset - 1));
}
}
return null;
}
public String getFormString() {
if (useOptionMenu) {
return name + "=" + processString(getOptionMenuValue());
} else {
String value;
String result = "";
boolean doneOne = false;
offset = 0;
while ((value = getListValue()) != null) {
if (doneOne) {
result += "&";
}
result += name + "=" + processString(value);
doneOne = true;
}
return result;
}
}
public String getFormValue() {
throw new Exception("Internal error: select form item");
}
}