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

#ifndef __java_awt_MenuItem__
#define __java_awt_MenuItem__

#pragma interface

#include <java/awt/MenuComponent.h>
#include <gcj/array.h>

extern "Java"
{
  namespace java
  {
    namespace awt
    {
        class AWTEvent;
        class MenuItem;
        class MenuShortcut;
      namespace event
      {
          class ActionEvent;
          class ActionListener;
      }
    }
  }
  namespace javax
  {
    namespace accessibility
    {
        class AccessibleContext;
    }
  }
}

class java::awt::MenuItem : public ::java::awt::MenuComponent
{

public:
  MenuItem();
  MenuItem(::java::lang::String *);
  MenuItem(::java::lang::String *, ::java::awt::MenuShortcut *);
  virtual ::java::lang::String * getLabel();
  virtual void setLabel(::java::lang::String *);
  virtual jboolean isEnabled();
  virtual void setEnabled(jboolean);
  virtual void enable(jboolean);
  virtual void enable();
  virtual void disable();
  virtual ::java::awt::MenuShortcut * getShortcut();
  virtual void setShortcut(::java::awt::MenuShortcut *);
  virtual void deleteShortcut();
  virtual ::java::lang::String * getActionCommand();
  virtual void setActionCommand(::java::lang::String *);
public: // actually protected
  virtual void enableEvents(jlong);
  virtual void disableEvents(jlong);
public:
  virtual void addNotify();
  virtual void addActionListener(::java::awt::event::ActionListener *);
  virtual void removeActionListener(::java::awt::event::ActionListener *);
  virtual JArray< ::java::awt::event::ActionListener * > * getActionListeners();
  virtual JArray< ::java::util::EventListener * > * getListeners(::java::lang::Class *);
public: // actually package-private
  virtual void dispatchEventImpl(::java::awt::AWTEvent *);
public: // actually protected
  virtual void processEvent(::java::awt::AWTEvent *);
  virtual void processActionEvent(::java::awt::event::ActionEvent *);
public:
  virtual ::java::lang::String * paramString();
  virtual ::javax::accessibility::AccessibleContext * getAccessibleContext();
public: // actually package-private
  virtual ::java::lang::String * generateName();
private:
  static jlong getUniqueLong();
  static jlong next_menuitem_number;
  static const jlong serialVersionUID = -21757335363267194LL;
public: // actually package-private
  ::java::lang::String * __attribute__((aligned(__alignof__( ::java::awt::MenuComponent)))) actionCommand;
  jboolean enabled;
  jlong eventMask;
  ::java::lang::String * label;
private:
  ::java::awt::MenuShortcut * shortcut;
  ::java::awt::event::ActionListener * action_listeners;
public:
  static ::java::lang::Class class$;
};

#endif // __java_awt_MenuItem__
