You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ant.apache.org by me...@locus.apache.org on 2000/11/17 23:39:03 UTC

cvs commit: jakarta-ant/src/antidote/org/apache/tools/ant/gui/customizer PropertiesPropertyEditor.java DynamicCustomizer.java

metasim     00/11/17 14:39:03

  Modified:    src/antidote/org/apache/tools/ant/gui/customizer
                        DynamicCustomizer.java
  Added:       src/antidote/org/apache/tools/ant/gui/customizer
                        PropertiesPropertyEditor.java
  Log:
  Started work on a Properties Bean property editor.
  
  Revision  Changes    Path
  1.5       +15 -1     jakarta-ant/src/antidote/org/apache/tools/ant/gui/customizer/DynamicCustomizer.java
  
  Index: DynamicCustomizer.java
  ===================================================================
  RCS file: /home/cvs/jakarta-ant/src/antidote/org/apache/tools/ant/gui/customizer/DynamicCustomizer.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- DynamicCustomizer.java	2000/11/16 22:38:43	1.4
  +++ DynamicCustomizer.java	2000/11/17 22:39:02	1.5
  @@ -66,7 +66,7 @@
    * Widget for dynamically constructing a property editor based on the 
    * an Object's BeanInfo. Essentially a property sheet.
    * 
  - * @version $Revision: 1.4 $ 
  + * @version $Revision: 1.5 $ 
    * @author Simeon Fitch 
    */
   public class DynamicCustomizer extends JPanel implements Customizer {
  @@ -83,6 +83,8 @@
   			double.class, DoublePropertyEditor.class);
   		PropertyEditorManager.registerEditor(
   			Double.class, DoublePropertyEditor.class);
  +		PropertyEditorManager.registerEditor(
  +			Properties.class, PropertiesPropertyEditor.class);
   	}
   
       /** Property name that PropertyDescriptors can save in their property
  @@ -105,6 +107,9 @@
       /** List of property change listeners interested when the bean
        *  being edited has been changed. */
       private List _changeListeners = new LinkedList();
  +    /** Flag to trun off event propogation. */
  +    private boolean _squelchChangeEvents = false;
  +
   
   
   	/** 
  @@ -209,6 +214,9 @@
           } 
           _value = value;
           
  +        // Disable event generation.
  +        _squelchChangeEvents = true;
  +
           // Iterate over each property, doing a lookup on the associated editor
           // and setting the editor's value to the value of the property.
           Iterator it = _prop2Editor.keySet().iterator();
  @@ -229,6 +237,10 @@
                   }
               }
           }
  +
  +        // Enable event generation.
  +        _squelchChangeEvents = false;
  +
       }
   
   	/** 
  @@ -306,6 +318,8 @@
       /** Class for receiving change events from the PropertyEditor objects. */
       private class EditorChangeListener implements PropertyChangeListener {
           public void propertyChange(PropertyChangeEvent e) {
  +            if(_squelchChangeEvents) return;
  +
               PropertyEditor editor = (PropertyEditor) e.getSource();
               PropertyDescriptor prop =
                   (PropertyDescriptor) _editor2Prop.get(editor);
  
  
  
  1.1                  jakarta-ant/src/antidote/org/apache/tools/ant/gui/customizer/PropertiesPropertyEditor.java
  
  Index: PropertiesPropertyEditor.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999, 2000 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. 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.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR
   * ITS 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.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  package org.apache.tools.ant.gui.customizer;
  
  import javax.swing.*;
  import javax.swing.table.AbstractTableModel;
  import java.awt.Component;
  import java.awt.Dimension;
  import java.awt.BorderLayout;
  import java.util.*;
  
  /**
   * Custom property editor for the Properties class.
   * 
   * @version $Revision: 1.1 $ 
   * @author Simeon Fitch 
   */
  public class PropertiesPropertyEditor extends AbstractPropertyEditor {
      private JPanel _widget = null;
      private Properties _value = null;
      private JTable _table = null;
  
      /** 
       * Default ctor.
       * 
       */
      public PropertiesPropertyEditor() {
          _widget = new JPanel(new BorderLayout());
          _widget.addFocusListener(new FocusHandler(this));
  
          _table = new JTable();
          _table.setPreferredScrollableViewportSize(new Dimension(300, 100));
          JScrollPane scroller = new JScrollPane(_table);
          _widget.add(BorderLayout.CENTER, scroller);
      }
  
      /** 
       * Get the child editing component. Uses JComponent so we can have tool
       * tips, etc.
       * 
       * @return Child editing component.
       */
      protected Component getChild() {
          return _widget;
      }
  
      /**
       * This method is intended for use when generating Java code to set
       * the value of the property.  It should return a fragment of Java code
       * that can be used to initialize a variable with the current property
       * value.
       * <p>
       * Example results are "2", "new Color(127,127,34)", "Color.orange", etc.
       *
       * @return A fragment of Java code representing an initializer for the
       *      current value.
       */
      public String getJavaInitializationString() {
          return getAsText();
      }
  
      /**
       * Set (or change) the object that is to be edited.  Builtin types such
       * as "int" must be wrapped as the corresponding object type such as
       * "java.lang.Integer".
       *
       * @param value The new target object to be edited.  Note that this
       *     object should not be modified by the PropertyEditor, rather 
       *     the PropertyEditor should create a new object to hold any
       *     modified value.
       */
      public void setValue(Object value) {
          if(value != null && !(value instanceof Properties)) {
              throw new IllegalArgumentException(
                  value.getClass().getName() + " is not of type Properties.");
          }
  
          Object old = _value;
          _value = (Properties) value;
  
          _table.setModel(new PropertiesTableModel(_value));
  
          firePropertyChange(old, value);
      }
  
      /**
       * @return The value of the property.  Builtin types such as "int" will
       * be wrapped as the corresponding object type such as "java.lang.Integer".
       */
      public Object getValue() {
          return _value;
      }
  
      /**
       * Set the property value by parsing a given String.  May raise
       * java.lang.IllegalArgumentException if either the String is
       * badly formatted or if this kind of property can't be expressed
       * as text.
       * @param text  The string to be parsed.
       */
      public void setAsText(String text) throws IllegalArgumentException {
          throw new IllegalArgumentException("Cannot be expressed as a String");
      }
  
      /**
       * @return The property value as a human editable string.
       * <p>   Returns null if the value can't be expressed 
       *       as an editable string.
       * <p>   If a non-null value is returned, then the PropertyEditor should
       *       be prepared to parse that string back in setAsText().
       */
      public String getAsText() {
          return null;
      } 
  
      /** Table model view of the Properties object. */
      private static class PropertiesTableModel extends AbstractTableModel {
          private static final int NAME = 0;
          private static final int VALUE = 1;
  
          private Properties _properties = null;
          private String[] _keys = null;
  
          public PropertiesTableModel(Properties props) {
              _properties = props;
  
              Enumeration enum = _properties.keys();
              _keys = new String[_properties.size()];
              for(int i = 0; enum.hasMoreElements(); i++) {
                  String key = (String) enum.nextElement();
                  _keys[i] = key;
              }
          }
  
          public int getRowCount() {
              return _keys.length;
          }
  
          public int getColumnCount() {
              return 2;
          }
  
          public String getColumnName(int column) {
              // XXX fix me.
              return column == NAME ? "Name" : "Value";
          }
          public Object getValueAt(int row, int column) {
              switch(column) {
                case NAME: return _keys[row];
                case VALUE: return _properties.getProperty(_keys[row]);
              }
              return null;
          }
      }
  
  
  }