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

#ifndef __java_awt_MenuComponent__
#define __java_awt_MenuComponent__

#pragma interface

#include <java/lang/Object.h>
extern "Java"
{
  namespace java
  {
    namespace awt
    {
        class AWTEvent;
        class Event;
        class Font;
        class MenuComponent;
        class MenuContainer;
        class Toolkit;
      namespace event
      {
          class FocusListener;
      }
      namespace peer
      {
          class MenuComponentPeer;
      }
    }
  }
  namespace javax
  {
    namespace accessibility
    {
        class AccessibleContext;
    }
  }
}

class java::awt::MenuComponent : public ::java::lang::Object
{

public:
  MenuComponent();
  virtual ::java::awt::Font * getFont();
  virtual void setFont(::java::awt::Font *);
  virtual ::java::lang::String * getName();
public: // actually package-private
  virtual ::java::lang::String * generateName();
public:
  virtual void setName(::java::lang::String *);
  virtual ::java::awt::MenuContainer * getParent();
public: // actually package-private
  virtual void setParent(::java::awt::MenuContainer *);
public:
  virtual ::java::awt::peer::MenuComponentPeer * getPeer();
public: // actually package-private
  virtual void setPeer(::java::awt::peer::MenuComponentPeer *);
public:
  virtual void removeNotify();
public: // actually package-private
  virtual ::java::awt::Toolkit * getToolkit();
public: // actually protected
  virtual ::java::lang::Object * getTreeLock();
public: // actually package-private
  virtual void setTreeLock(::java::lang::Object *);
public:
  virtual jboolean postEvent(::java::awt::Event *);
  virtual void dispatchEvent(::java::awt::AWTEvent *);
public: // actually package-private
  virtual void dispatchEventImpl(::java::awt::AWTEvent *);
public: // actually protected
  virtual void processEvent(::java::awt::AWTEvent *);
public:
  virtual ::java::lang::String * toString();
public: // actually protected
  virtual ::java::lang::String * paramString();
public:
  virtual ::javax::accessibility::AccessibleContext * getAccessibleContext();
private:
  static const jlong serialVersionUID = -4536902356223894379LL;
  ::java::awt::Font * __attribute__((aligned(__alignof__( ::java::lang::Object)))) font;
  ::java::lang::String * name;
public: // actually package-private
  ::java::awt::MenuContainer * parent;
  ::java::awt::peer::MenuComponentPeer * peer;
private:
  ::java::lang::Object * tree_lock;
  static ::java::awt::Toolkit * toolkit;
public: // actually package-private
  ::javax::accessibility::AccessibleContext * accessibleContext;
private:
  jboolean nameExplicitlySet;
  jboolean newEventsOnly;
public: // actually package-private
  ::java::awt::event::FocusListener * focusListener;
public:
  static ::java::lang::Class class$;
};

#endif // __java_awt_MenuComponent__
