diff --git a/src/java/com/threerings/admin/client/AsStringFieldEditor.java b/src/java/com/threerings/admin/client/AsStringFieldEditor.java new file mode 100644 index 000000000..b3bec58cc --- /dev/null +++ b/src/java/com/threerings/admin/client/AsStringFieldEditor.java @@ -0,0 +1,110 @@ +// +// $Id: FieldEditor.java 3286 2004-12-28 03:49:23Z mdb $ +// +// Narya library - tools for developing networked games +// Copyright (C) 2002-2004 Three Rings Design, Inc., All Rights Reserved +// http://www.threerings.net/code/narya/ +// +// This library is free software; you can redistribute it and/or modify it +// under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation; either version 2.1 of the License, or +// (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +package com.threerings.admin.client; + +import java.lang.reflect.Field; +import javax.swing.JTextField; + +import com.samskivert.util.StringUtil; + +import com.threerings.presents.dobj.DObject; +import com.threerings.presents.util.PresentsContext; + +import com.threerings.admin.Log; + +/** + * Used to display and edit a particular distributed object field. + */ +public class AsStringFieldEditor extends FieldEditor +{ + public AsStringFieldEditor (PresentsContext ctx, Field field, DObject object) + { + super(ctx, field, object); + + // and a text entry field to display the field value + add(_value = new JTextField()); + _value.addActionListener(this); + + // we want to let the user know if they remove focus from a text + // box without changing a field that it's not saved + _value.addFocusListener(this); + } + + // documentation inherited + protected Object getDisplayValue () + throws Exception + { + String text = _value.getText(); + if (_field.getType().equals(Integer.class) || + _field.getType().equals(Integer.TYPE)) { + return new Integer(text); + + } else if (_field.getType().equals(Long.class) || + _field.getType().equals(Long.TYPE)) { + return new Long(text); + + } else if (_field.getType().equals(Float.class) || + _field.getType().equals(Float.TYPE)) { + return new Float(text); + + } else if (_field.getType().equals(Double.class) || + _field.getType().equals(Double.TYPE)) { + return new Double(text); + + } else if (_field.getType().equals(String.class)) { + return text; + + } else if (_field.getType().equals(STRING_ARRAY_PROTO.getClass())) { + return StringUtil.parseStringArray(_value.getText()); + + } else if (_field.getType().equals(INT_ARRAY_PROTO.getClass())) { + return StringUtil.parseIntArray(_value.getText()); + + } else if (_field.getType().equals(FLOAT_ARRAY_PROTO.getClass())) { + return StringUtil.parseFloatArray(_value.getText()); + + } else if (_field.getType().equals(LONG_ARRAY_PROTO.getClass())) { + return StringUtil.parseLongArray(_value.getText()); + + } else if (_field.getType().equals(Boolean.TYPE)) { + return new Boolean(_value.getText().equalsIgnoreCase("true")); + + } else { + Log.warning("Unknown field type '" + _field.getName() + "': " + + _field.getType().getName() + "."); + return null; + } + } + + // documentation inherited + protected void displayValue (Object value) + { + _value.setText(StringUtil.toString(value, "", "")); + } + + protected JTextField _value; + + protected static final String[] STRING_ARRAY_PROTO = new String[0]; + protected static final int[] INT_ARRAY_PROTO = new int[0]; + protected static final float[] FLOAT_ARRAY_PROTO = new float[0]; + protected static final long[] LONG_ARRAY_PROTO = new long[0]; +} diff --git a/src/java/com/threerings/admin/client/BooleanFieldEditor.java b/src/java/com/threerings/admin/client/BooleanFieldEditor.java new file mode 100644 index 000000000..d0040236b --- /dev/null +++ b/src/java/com/threerings/admin/client/BooleanFieldEditor.java @@ -0,0 +1,63 @@ +// +// $Id$ +// +// Narya library - tools for developing networked games +// Copyright (C) 2002-2005 Three Rings Design, Inc., All Rights Reserved +// http://www.threerings.net/code/narya/ +// +// This library is free software; you can redistribute it and/or modify it +// under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation; either version 2.1 of the License, or +// (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +package com.threerings.admin.client; + +import java.lang.reflect.Field; + +import javax.swing.JCheckBox; + +import com.threerings.presents.dobj.DObject; +import com.threerings.presents.util.PresentsContext; + +/** + * Provides "editing" of boolean fields + */ +public class BooleanFieldEditor extends FieldEditor +{ + public BooleanFieldEditor (PresentsContext ctx, Field field, DObject object) + { + super(ctx, field, object); + + // and a text entry field to display the field value + add(_value = new JCheckBox()); + _value.addActionListener(this); + + // we want to let the user know if they remove focus from a text + // box without changing a field that it's not saved + _value.addFocusListener(this); + } + + // documentation inherited + protected Object getDisplayValue () + throws Exception + { + return Boolean.valueOf(_value.isSelected()); + } + + // documentation inherited + protected void displayValue (Object value) + { + _value.setSelected(Boolean.TRUE.equals(value)); + } + + protected JCheckBox _value; +} diff --git a/src/java/com/threerings/admin/client/ConfigEditorPanel.java b/src/java/com/threerings/admin/client/ConfigEditorPanel.java index 9ef254ec1..09d9da281 100644 --- a/src/java/com/threerings/admin/client/ConfigEditorPanel.java +++ b/src/java/com/threerings/admin/client/ConfigEditorPanel.java @@ -1,5 +1,5 @@ // -// $Id: ConfigEditorPanel.java,v 1.8 2004/08/27 02:12:23 mdb Exp $ +// $Id$ // // Narya library - tools for developing networked games // Copyright (C) 2002-2004 Three Rings Design, Inc., All Rights Reserved @@ -44,14 +44,24 @@ public class ConfigEditorPanel extends JPanel * access the distributed object services. */ public ConfigEditorPanel (PresentsContext ctx) + { + this(ctx, null); + } + + /** + * Constructs an editor panel with the specified pane defaulting to + * selected. + */ + public ConfigEditorPanel (PresentsContext ctx, String defaultPane) { _ctx = ctx; + _defaultPane = defaultPane; setLayout(new VGroupLayout(VGroupLayout.STRETCH, VGroupLayout.STRETCH, 5, VGroupLayout.CENTER)); // create our objects tabbed pane - add(_oeditors = new JTabbedPane()); + add(_oeditors = new JTabbedPane(JTabbedPane.LEFT)); // add a handy label at the bottom add(new JLabel("Fields outline in red have been modified " + @@ -93,6 +103,9 @@ public class ConfigEditorPanel extends JPanel new ObjectEditorPanel(_ctx, keys[ii], oids[ii]); SafeScrollPane scrolly = new SafeScrollPane(panel); _oeditors.addTab(keys[ii], scrolly); + if (keys[ii].equals(_defaultPane)) { + _oeditors.setSelectedComponent(scrolly); + } } } @@ -107,4 +120,7 @@ public class ConfigEditorPanel extends JPanel /** Holds our object editors. */ protected JTabbedPane _oeditors; + + /** Our default tab pane. */ + protected String _defaultPane; } diff --git a/src/java/com/threerings/admin/client/FieldEditor.java b/src/java/com/threerings/admin/client/FieldEditor.java index ff39a0032..0a0d9b974 100644 --- a/src/java/com/threerings/admin/client/FieldEditor.java +++ b/src/java/com/threerings/admin/client/FieldEditor.java @@ -34,6 +34,7 @@ import javax.swing.JPanel; import javax.swing.JTextField; import com.samskivert.swing.HGroupLayout; +import com.samskivert.util.ObjectUtil; import com.samskivert.util.StringUtil; import com.threerings.presents.dobj.AttributeChangeListener; @@ -47,7 +48,7 @@ import com.threerings.admin.Log; /** * Used to display and edit a particular distributed object field. */ -public class FieldEditor extends JPanel +public abstract class FieldEditor extends JPanel implements AttributeChangeListener, ActionListener, FocusListener { public FieldEditor (PresentsContext ctx, Field field, DObject object) @@ -62,16 +63,8 @@ public class FieldEditor extends JPanel // a label to display the field name add(_label = new JLabel(_field.getName())); - // and a text entry field to display the field value - add(_value = new JTextField()); - _value.addActionListener(this); - // set up our default border updateBorder(false); - - // we want to let the user know if they remove focus from a text - // box without changing a field that it's not saved - _value.addFocusListener(this); } // documentation inherited @@ -81,7 +74,7 @@ public class FieldEditor extends JPanel // listen to the object while we're visible _object.addListener(FieldEditor.this); - _value.setText(readValue()); + displayValue(getValue()); } public void removeNotify () @@ -95,77 +88,16 @@ public class FieldEditor extends JPanel // documentation inherited from interface public void attributeChanged (AttributeChangedEvent event) { - _value.setText(readValue()); + displayValue(getValue()); updateBorder(false); } - /** - * Reads the value from the distributed object field and returns it. - */ - protected String readValue () - { - try { - return StringUtil.toString(_field.get(_object), "", ""); - } catch (IllegalAccessException iae) { - updateBorder(true); - return ""; - } - } - - /** - * Parse the value. - */ - protected Object parseValue (String text) - throws Exception - { - // parse the new value - if (_field.getType().equals(Integer.class) || - _field.getType().equals(Integer.TYPE)) { - return new Integer(text); - - } else if (_field.getType().equals(Long.class) || - _field.getType().equals(Long.TYPE)) { - return new Long(text); - - } else if (_field.getType().equals(Float.class) || - _field.getType().equals(Float.TYPE)) { - return new Float(text); - - } else if (_field.getType().equals(Double.class) || - _field.getType().equals(Double.TYPE)) { - return new Double(text); - - } else if (_field.getType().equals(String.class)) { - return text; - - } else if (_field.getType().equals(STRING_ARRAY_PROTO.getClass())) { - return StringUtil.parseStringArray(_value.getText()); - - } else if (_field.getType().equals(INT_ARRAY_PROTO.getClass())) { - return StringUtil.parseIntArray(_value.getText()); - - } else if (_field.getType().equals(FLOAT_ARRAY_PROTO.getClass())) { - return StringUtil.parseFloatArray(_value.getText()); - - } else if (_field.getType().equals(LONG_ARRAY_PROTO.getClass())) { - return StringUtil.parseLongArray(_value.getText()); - - } else if (_field.getType().equals(Boolean.TYPE)) { - return new Boolean(_value.getText().equalsIgnoreCase("true")); - - } else { - Log.warning("Unknown field type '" + _field.getName() + "': " + - _field.getType().getName() + "."); - return null; - } - } - // documentation inherited from interface public void actionPerformed (ActionEvent event) { Object value = null; try { - value = parseValue(_value.getText()); + value = getDisplayValue(); } catch (Exception e) { updateBorder(true); } @@ -190,10 +122,42 @@ public class FieldEditor extends JPanel // documentation inherited from interface public void focusLost (FocusEvent event) { - // make sure the value is not changed, if it is, set a modified - // border - String value = readValue(); - updateBorder(!value.equals(_value.getText())); + // make sure the value is not changed from the value in the + // object; if it is, set a modified border + Object dvalue = null; + try { + dvalue = getDisplayValue(); + } catch (Exception e) { + Log.warning("Failed to parse display value " + e + "."); + displayValue(getValue()); + } + updateBorder(!ObjectUtil.equals(dvalue, getValue())); + } + + /** + * Returns the currently displayed value. + */ + protected abstract Object getDisplayValue () + throws Exception; + + /** + * Reads the value from the distributed object field and updates the + * display with it. + */ + protected abstract void displayValue (Object value); + + /** + * Returns the current object value. + */ + protected Object getValue () + { + try { + return _field.get(_object); + } catch (Exception e) { + Log.warning("Failed to fetch field [field=" + _field + + ", object=" + _object + ", error=" + e + "]."); + return null; + } } /** @@ -203,10 +167,9 @@ public class FieldEditor extends JPanel protected void updateBorder (boolean modified) { if (modified) { - _value.setBorder(BorderFactory.createMatteBorder( - 2, 2, 2, 2, Color.red)); + setBorder(BorderFactory.createMatteBorder(2, 2, 2, 2, Color.red)); } else { - _value.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2)); + setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2)); } } @@ -214,10 +177,4 @@ public class FieldEditor extends JPanel protected Field _field; protected DObject _object; protected JLabel _label; - protected JTextField _value; - - protected static final String[] STRING_ARRAY_PROTO = new String[0]; - protected static final int[] INT_ARRAY_PROTO = new int[0]; - protected static final float[] FLOAT_ARRAY_PROTO = new float[0]; - protected static final long[] LONG_ARRAY_PROTO = new long[0]; } diff --git a/src/java/com/threerings/admin/client/ObjectEditorPanel.java b/src/java/com/threerings/admin/client/ObjectEditorPanel.java index 237e48943..73690d702 100644 --- a/src/java/com/threerings/admin/client/ObjectEditorPanel.java +++ b/src/java/com/threerings/admin/client/ObjectEditorPanel.java @@ -1,5 +1,5 @@ // -// $Id: ObjectEditorPanel.java,v 1.6 2004/08/27 02:12:23 mdb Exp $ +// $Id$ // // Narya library - tools for developing networked games // Copyright (C) 2002-2004 Three Rings Design, Inc., All Rights Reserved diff --git a/src/java/com/threerings/admin/data/ConfigObject.java b/src/java/com/threerings/admin/data/ConfigObject.java index 7445e460e..e11cc818a 100644 --- a/src/java/com/threerings/admin/data/ConfigObject.java +++ b/src/java/com/threerings/admin/data/ConfigObject.java @@ -27,7 +27,8 @@ import javax.swing.JPanel; import com.threerings.presents.dobj.DObject; import com.threerings.presents.util.PresentsContext; -import com.threerings.admin.client.FieldEditor; +import com.threerings.admin.client.AsStringFieldEditor; +import com.threerings.admin.client.BooleanFieldEditor; /** * Base class for runtime config distributed objects. Used to allow @@ -40,6 +41,10 @@ public class ConfigObject extends DObject */ public JPanel getEditor (PresentsContext ctx, Field field) { - return new FieldEditor(ctx, field, this); + if (field.getType().equals(Boolean.TYPE)) { + return new BooleanFieldEditor(ctx, field, this); + } else { + return new AsStringFieldEditor(ctx, field, this); + } } }