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

#ifndef __java_awt_MenuBar__
#define __java_awt_MenuBar__

#pragma interface

#include <java/awt/MenuComponent.h>
extern "Java"
{
  namespace java
  {
    namespace awt
    {
        class Menu;
        class MenuBar;
        class MenuComponent;
        class MenuItem;
        class MenuShortcut;
    }
  }
  namespace javax
  {
    namespace accessibility
    {
        class AccessibleContext;
    }
  }
}

class java::awt::MenuBar : public ::java::awt::MenuComponent
{

public:
  MenuBar();
  virtual ::java::awt::Menu * getHelpMenu();
  virtual void setHelpMenu(::java::awt::Menu *);
  virtual ::java::awt::Menu * add(::java::awt::Menu *);
  virtual void remove(jint);
  virtual void remove(::java::awt::MenuComponent *);
  virtual jint getMenuCount();
  virtual jint countMenus();
  virtual ::java::awt::Menu * getMenu(jint);
  virtual void addNotify();
  virtual void removeNotify();
  virtual ::java::util::Enumeration * shortcuts();
  virtual ::java::awt::MenuItem * getShortcutMenuItem(::java::awt::MenuShortcut *);
  virtual void deleteShortcut(::java::awt::MenuShortcut *);
  virtual ::javax::accessibility::AccessibleContext * getAccessibleContext();
public: // actually package-private
  virtual ::java::lang::String * generateName();
private:
  static jlong getUniqueLong();
  static const jlong serialVersionUID = -4930327919388951260LL;
  static jlong next_menubar_number;
  ::java::awt::Menu * __attribute__((aligned(__alignof__( ::java::awt::MenuComponent)))) helpMenu;
  ::java::util::Vector * menus;
public:
  static ::java::lang::Class class$;
};

#endif // __java_awt_MenuBar__
