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

#ifndef __javax_swing_MenuSelectionManager__
#define __javax_swing_MenuSelectionManager__

#pragma interface

#include <java/lang/Object.h>
#include <gcj/array.h>

extern "Java"
{
  namespace java
  {
    namespace awt
    {
        class Component;
        class Point;
      namespace event
      {
          class KeyEvent;
          class MouseEvent;
      }
    }
  }
  namespace javax
  {
    namespace swing
    {
        class MenuElement;
        class MenuSelectionManager;
      namespace event
      {
          class ChangeEvent;
          class ChangeListener;
          class EventListenerList;
      }
    }
  }
}

class javax::swing::MenuSelectionManager : public ::java::lang::Object
{

public:
  MenuSelectionManager();
public: // actually protected
  virtual void fireStateChanged();
public:
  virtual void addChangeListener(::javax::swing::event::ChangeListener *);
  virtual void removeChangeListener(::javax::swing::event::ChangeListener *);
  virtual JArray< ::javax::swing::event::ChangeListener * > * getChangeListeners();
  virtual void clearSelectedPath();
  virtual ::java::awt::Component * componentForPoint(::java::awt::Component *, ::java::awt::Point *);
  static ::javax::swing::MenuSelectionManager * defaultManager();
  virtual JArray< ::javax::swing::MenuElement * > * getSelectedPath();
  virtual jboolean isComponentPartOfCurrentMenu(::java::awt::Component *);
  virtual void processKeyEvent(::java::awt::event::KeyEvent *);
  virtual void processMouseEvent(::java::awt::event::MouseEvent *);
  virtual void setSelectedPath(JArray< ::javax::swing::MenuElement * > *);
private:
  JArray< ::javax::swing::MenuElement * > * getPath(::java::awt::Component *);
public: // actually protected
  ::javax::swing::event::ChangeEvent * __attribute__((aligned(__alignof__( ::java::lang::Object)))) changeEvent;
  ::javax::swing::event::EventListenerList * listenerList;
private:
  static ::javax::swing::MenuSelectionManager * manager;
  ::java::util::Vector * selectedPath;
public:
  static ::java::lang::Class class$;
};

#endif // __javax_swing_MenuSelectionManager__
