
// DO NOT EDIT THIS FILE - it is machine generated -*- c++ -*-

#ifndef __java_beans_FeatureDescriptor__
#define __java_beans_FeatureDescriptor__

#pragma interface

#include <java/lang/Object.h>
extern "Java"
{
  namespace java
  {
    namespace beans
    {
        class FeatureDescriptor;
    }
  }
}

class java::beans::FeatureDescriptor : public ::java::lang::Object
{

public:
  FeatureDescriptor();
  virtual ::java::lang::String * getName();
  virtual void setName(::java::lang::String *);
  virtual ::java::lang::String * getDisplayName();
  virtual void setDisplayName(::java::lang::String *);
  virtual ::java::lang::String * getShortDescription();
  virtual void setShortDescription(::java::lang::String *);
  virtual jboolean isExpert();
  virtual void setExpert(jboolean);
  virtual jboolean isHidden();
  virtual void setHidden(jboolean);
  virtual jboolean isPreferred();
  virtual void setPreferred(jboolean);
  virtual ::java::lang::Object * getValue(::java::lang::String *);
  virtual void setValue(::java::lang::String *, ::java::lang::Object *);
  virtual ::java::util::Enumeration * attributeNames();
public: // actually package-private
  ::java::lang::String * __attribute__((aligned(__alignof__( ::java::lang::Object)))) name;
  ::java::lang::String * displayName;
  ::java::lang::String * shortDescription;
  jboolean expert;
  jboolean hidden;
  jboolean preferred;
  ::java::util::Hashtable * valueHash;
public:
  static ::java::lang::Class class$;
};

#endif // __java_beans_FeatureDescriptor__
