blob: 8ca540337f33ff431460d4798f904e22fcfa2f77 [file] [log] [blame]
/*
* Copyright (c) 2002, 2007, Oracle and/or its affiliates. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* - Neither the name of Oracle nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package j2dbench;
import java.awt.BorderLayout;
import java.awt.Toolkit;
import java.awt.Color;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JComponent;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JTextField;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;
import javax.swing.text.AttributeSet;
import javax.swing.border.LineBorder;
import java.io.PrintWriter;
import java.util.NoSuchElementException;
import java.util.StringTokenizer;
public abstract class Option extends Node implements Modifier {
public Option(Group parent, String nodeName, String description) {
super(parent, nodeName, description);
}
public abstract boolean isDefault();
public void modifyTest(TestEnvironment env, Object val) {
env.setModifier(this, val);
}
public void restoreTest(TestEnvironment env, Object val) {
env.removeModifier(this);
}
public abstract String getValString();
public String getValString(Object v) {
return v.toString();
}
public String getOptionString() {
return getTreeName()+"="+getValString();
}
public String getOptionString(Object value) {
return getTreeName()+"="+getValString(value);
}
public String getAbbreviatedModifierDescription(Object value) {
return getNodeName()+"="+getValString(value);
}
public String getModifierValueName(Object val) {
return getValString(val);
}
public String setOption(String key, String value) {
if (key.length() != 0) {
return "Option name too specific";
}
return setValueFromString(value);
}
public abstract String setValueFromString(String value);
public void write(PrintWriter pw) {
//if (!isDefault()) {
pw.println(getOptionString());
//}
}
public String toString() {
return "Option("+getOptionString()+")";
}
public static class Toggle extends Option {
public static final int Off = 0;
public static final int On = 1;
public static final int Both = 2;
private static final String valnames[] = {"Off", "On", "Both"};
private static final Boolean valuelist[][] = {
BooleanIterator.FalseList,
BooleanIterator.TrueList,
BooleanIterator.FalseTrueList,
};
int defaultvalue;
int value;
JPanel jp;
JComboBox jcb;
public Toggle(Group parent, String nodeName, String description,
int defaultvalue)
{
super(parent, nodeName, description);
if (defaultvalue != Off &&
defaultvalue != On &&
defaultvalue != Both)
{
throw new IllegalArgumentException("bad default");
}
this.defaultvalue = this.value = defaultvalue;
}
public void restoreDefault() {
if (value != defaultvalue) {
value = defaultvalue;
updateGUI();
}
}
public void updateGUI() {
if (jcb != null) {
jcb.setSelectedIndex(value);
}
}
public boolean isDefault() {
return (value == defaultvalue);
}
public Modifier.Iterator getIterator(TestEnvironment env) {
return new BooleanIterator(valuelist[value]);
}
public JComponent getJComponent() {
if (jp == null) {
jp = new JPanel();
jp.setLayout(new BorderLayout());
JLabel jl = new JLabel(getDescription());
jp.add(jl, BorderLayout.WEST);
jcb = new JComboBox(valnames);
updateGUI();
jcb.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == e.SELECTED) {
JComboBox jcb = (JComboBox) e.getItemSelectable();
value = jcb.getSelectedIndex();
if (J2DBench.verbose.isEnabled()) {
System.out.println(getOptionString());
}
}
}
});
jp.add(jcb, BorderLayout.EAST);
}
return jp;
}
public String getAbbreviatedModifierDescription(Object value) {
String ret = getNodeName();
if (value.equals(Boolean.FALSE)) {
ret = "!"+ret;
}
return ret;
}
public String getValString() {
return valnames[value];
}
public String setValueFromString(String value) {
for (int i = 0; i < valnames.length; i++) {
if (valnames[i].equalsIgnoreCase(value)) {
if (this.value != i) {
this.value = i;
updateGUI();
}
return null;
}
}
return "Bad value";
}
}
public static class Enable extends Option {
boolean defaultvalue;
boolean value;
JCheckBox jcb;
public Enable(Group parent, String nodeName, String description,
boolean defaultvalue)
{
super(parent, nodeName, description);
this.defaultvalue = this.value = defaultvalue;
}
public boolean isEnabled() {
return value;
}
public void modifyTest(TestEnvironment env) {
// Used from within a Group.EnableSet group.
}
public void restoreTest(TestEnvironment env) {
// Used from within a Group.EnableSet group.
}
public void restoreDefault() {
if (value != defaultvalue) {
value = defaultvalue;
updateGUI();
}
}
public void updateGUI() {
if (jcb != null) {
jcb.setSelected(value);
}
}
public boolean isDefault() {
return (value == defaultvalue);
}
public Modifier.Iterator getIterator(TestEnvironment env) {
return new BooleanIterator(value);
}
public JComponent getJComponent() {
if (jcb == null) {
jcb = new JCheckBox(getDescription());
updateGUI();
jcb.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
value = (e.getStateChange() == e.SELECTED);
if (J2DBench.verbose.isEnabled()) {
System.out.println(getOptionString());
}
}
});
}
return jcb;
}
public String getAbbreviatedModifierDescription(Object value) {
String ret = getNodeName();
if (value.equals(Boolean.FALSE)) {
ret = "!"+ret;
}
return ret;
}
public String getValString() {
return (value ? "enabled" : "disabled");
}
public String setValueFromString(String value) {
boolean newval;
if (value.equalsIgnoreCase("enabled")) {
newval = true;
} else if (value.equalsIgnoreCase("disabled")) {
newval = false;
} else {
return "Bad Value";
}
if (this.value != newval) {
this.value = newval;
updateGUI();
}
return null;
}
}
public static class Int extends Option {
int minvalue;
int maxvalue;
int defaultvalue;
int value;
JPanel jp;
JTextField jtf;
public Int(Group parent, String nodeName, String description,
int minvalue, int maxvalue, int defaultvalue)
{
super(parent, nodeName, description);
this.minvalue = minvalue;
this.maxvalue = maxvalue;
if (defaultvalue < minvalue || defaultvalue > maxvalue) {
throw new RuntimeException("bad value string: "+value);
}
this.defaultvalue = this.value = defaultvalue;
}
public int getIntValue() {
return value;
}
public void restoreDefault() {
if (value != defaultvalue) {
value = defaultvalue;
updateGUI();
}
}
public void updateGUI() {
if (jtf != null) {
jtf.setText(getValString());
}
}
public boolean isDefault() {
return (value == defaultvalue);
}
public Modifier.Iterator getIterator(TestEnvironment env) {
return new SwitchIterator(new Object[] { new Integer(value) }, 1);
}
public JComponent getJComponent() {
if (jp == null) {
jp = new JPanel();
jp.setLayout(new BorderLayout());
jp.add(new JLabel(getDescription()), BorderLayout.WEST);
jtf = new JTextField(10);
updateGUI();
jtf.setDocument(new PlainDocument() {
public void insertString(int offs, String str,
AttributeSet a)
throws BadLocationException
{
if (str == null) {
return;
}
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if (c < '0' || c > '9') {
Toolkit.getDefaultToolkit().beep();
return;
}
}
String oldstr = jtf.getText();
super.insertString(offs, str, a);
str = jtf.getText();
if (setValueFromString(str) == null) {
if (J2DBench.verbose.isEnabled()) {
System.out.println(getOptionString());
}
} else {
super.remove(0, super.getLength());
super.insertString(0, oldstr, null);
Toolkit.getDefaultToolkit().beep();
}
}
});
jtf.setText(getValString());
jp.add(jtf, BorderLayout.EAST);
}
return jp;
}
public String getValString() {
return Integer.toString(value);
}
public String setValueFromString(String value) {
int val;
try {
val = Integer.parseInt(value);
} catch (NumberFormatException e) {
return "Value not an integer ("+value+")";
}
if (val < minvalue || val > maxvalue) {
return "Value out of range";
}
if (this.value != val) {
this.value = val;
updateGUI();
}
return null;
}
}
public static class ObjectList extends Option {
int size;
String optionnames[];
Object optionvalues[];
String abbrevnames[];
String descnames[];
int defaultenabled;
int enabled;
JPanel jp;
JList jlist;
int numrows;
public ObjectList(Group parent, String nodeName, String description,
String optionnames[],
Object optionvalues[],
String abbrevnames[],
String descnames[],
int defaultenabled)
{
this(parent, nodeName, description,
Math.min(Math.min(optionnames.length,
optionvalues.length),
Math.min(abbrevnames.length,
descnames.length)),
optionnames, optionvalues,
abbrevnames, descnames, defaultenabled);
}
public ObjectList(Group parent, String nodeName, String description,
int size,
String optionnames[],
Object optionvalues[],
String abbrevnames[],
String descnames[],
int defaultenabled)
{
super(parent, nodeName, description);
this.size = size;
this.optionnames = trim(optionnames, size);
this.optionvalues = trim(optionvalues, size);
this.abbrevnames = trim(abbrevnames, size);
this.descnames = trim(descnames, size);
this.enabled = this.defaultenabled = defaultenabled;
}
private static String[] trim(String list[], int size) {
if (list.length == size) {
return list;
}
String newlist[] = new String[size];
System.arraycopy(list, 0, newlist, 0, size);
return newlist;
}
private static Object[] trim(Object list[], int size) {
if (list.length == size) {
return list;
}
Object newlist[] = new Object[size];
System.arraycopy(list, 0, newlist, 0, size);
return newlist;
}
public void restoreDefault() {
if (enabled != defaultenabled) {
enabled = defaultenabled;
updateGUI();
}
}
public void updateGUI() {
if (jlist != null) {
int enabled = this.enabled;
jlist.clearSelection();
for (int curindex = 0; curindex < size; curindex++) {
if ((enabled & (1 << curindex)) != 0) {
jlist.addSelectionInterval(curindex, curindex);
}
}
}
}
public boolean isDefault() {
return (enabled == defaultenabled);
}
public Modifier.Iterator getIterator(TestEnvironment env) {
return new SwitchIterator(optionvalues, enabled);
}
public void setNumRows(int numrows) {
this.numrows = numrows;
}
public JComponent getJComponent() {
if (jp == null) {
jp = new JPanel();
jp.setLayout(new BorderLayout());
jp.add(new JLabel(getDescription()), BorderLayout.WEST);
jlist = new JList(descnames);
if (numrows > 0) {
try {
jlist.setLayoutOrientation(JList.VERTICAL_WRAP);
} catch (NoSuchMethodError e) {
}
jlist.setVisibleRowCount(numrows);
}
jlist.setBorder(new LineBorder(Color.black, 2));
updateGUI();
jlist.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
int flags = 0;
for (int curindex = 0; curindex < size; curindex++) {
JList list = (JList) e.getSource();
if (list.isSelectedIndex(curindex)) {
flags |= (1 << curindex);
}
}
enabled = flags;
if (J2DBench.verbose.isEnabled()) {
System.out.println(getOptionString());
}
}
});
jp.add(jlist, BorderLayout.EAST);
}
return jp;
}
public String getValString() {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < size; i++) {
if ((enabled & (1 << i)) != 0) {
if (sb.length() > 0) {
sb.append(',');
}
sb.append(optionnames[i]);
}
}
return sb.toString();
}
int findValueIndex(Object value) {
for (int i = 0; i < size; i++) {
if (optionvalues[i] == value) {
return i;
}
}
return -1;
}
public String getValString(Object value) {
return optionnames[findValueIndex(value)];
}
public String getAbbreviatedModifierDescription(Object value) {
return abbrevnames[findValueIndex(value)];
}
public String setValueFromString(String value) {
int prev = 0;
int next = 0;
int enabled = 0;
StringTokenizer st = new StringTokenizer(value, ",");
while (st.hasMoreTokens()) {
String s = st.nextToken();
try {
for (int i = 0; i < size; i++) {
if (optionnames[i].equals(s)) {
enabled |= (1 << i);
s = null;
break;
}
}
} catch (NumberFormatException e) {
}
if (s != null) {
return "Bad value in list ("+s+")";
}
prev = next+1;
}
this.enabled = enabled;
updateGUI();
return null;
}
}
public static class IntList extends ObjectList {
public IntList(Group parent, String nodeName, String description,
int values[], String abbrevnames[], String descnames[],
int defaultenabled)
{
super(parent, nodeName, description,
makeNames(values), makeValues(values),
abbrevnames, descnames, defaultenabled);
}
private static String[] makeNames(int intvalues[]) {
String names[] = new String[intvalues.length];
for (int i = 0; i < intvalues.length; i++) {
names[i] = Integer.toString(intvalues[i]);
}
return names;
}
private static Object[] makeValues(int intvalues[]) {
Object values[] = new Object[intvalues.length];
for (int i = 0; i < intvalues.length; i++) {
values[i] = new Integer(intvalues[i]);
}
return values;
}
}
public static class BooleanIterator implements Modifier.Iterator {
private Boolean list[];
private int index;
public static final Boolean FalseList[] = { Boolean.FALSE };
public static final Boolean TrueList[] = { Boolean.TRUE };
public static final Boolean
FalseTrueList[] = { Boolean.FALSE, Boolean.TRUE };
public static final Boolean
TrueFalseList[] = { Boolean.TRUE, Boolean.FALSE };
public BooleanIterator(boolean v) {
this(v ? TrueList : FalseList);
}
public BooleanIterator(Boolean list[]) {
this.list = list;
}
public boolean hasNext() {
return (index < list.length);
}
public Object next() {
if (index >= list.length) {
throw new NoSuchElementException();
}
return list[index++];
}
public void remove() {
throw new UnsupportedOperationException();
}
}
public static class SwitchIterator implements Modifier.Iterator {
private Object list[];
private int enabled;
private int index;
public SwitchIterator(Object[] list, int enabled) {
this.list = list;
this.enabled = enabled;
}
public boolean hasNext() {
return ((1 << index) <= enabled);
}
public Object next() {
while ((enabled & (1 << index)) == 0) {
index++;
if (index >= list.length) {
throw new NoSuchElementException();
}
}
return list[index++];
}
public void remove() {
throw new UnsupportedOperationException();
}
}
}