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

#ifndef __javax_swing_plaf_basic_BasicInternalFrameUI__
#define __javax_swing_plaf_basic_BasicInternalFrameUI__

#pragma interface

#include <javax/swing/plaf/InternalFrameUI.h>
extern "Java"
{
  namespace java
  {
    namespace awt
    {
        class Dimension;
        class LayoutManager;
      namespace event
      {
          class ComponentListener;
      }
    }
    namespace beans
    {
        class PropertyChangeListener;
    }
  }
  namespace javax
  {
    namespace swing
    {
        class DesktopManager;
        class JComponent;
        class JDesktopPane;
        class JInternalFrame;
        class KeyStroke;
      namespace event
      {
          class MouseInputAdapter;
          class MouseInputListener;
      }
      namespace plaf
      {
          class ComponentUI;
        namespace basic
        {
            class BasicInternalFrameTitlePane;
            class BasicInternalFrameUI;
            class BasicInternalFrameUI$BasicInternalFrameListener;
        }
      }
    }
  }
}

class javax::swing::plaf::basic::BasicInternalFrameUI : public ::javax::swing::plaf::InternalFrameUI
{

public:
  BasicInternalFrameUI(::javax::swing::JInternalFrame *);
  static ::javax::swing::plaf::ComponentUI * createUI(::javax::swing::JComponent *);
  virtual void installUI(::javax::swing::JComponent *);
  virtual void uninstallUI(::javax::swing::JComponent *);
public: // actually protected
  virtual void installDefaults();
  virtual void installKeyboardActions();
  virtual void installComponents();
  virtual void installListeners();
  virtual void uninstallDefaults();
  virtual void uninstallComponents();
  virtual void uninstallListeners();
  virtual void uninstallKeyboardActions();
  virtual ::java::awt::LayoutManager * createLayoutManager();
  virtual ::java::beans::PropertyChangeListener * createPropertyChangeListener();
public:
  virtual ::java::awt::Dimension * getPreferredSize(::javax::swing::JComponent *);
  virtual ::java::awt::Dimension * getMinimumSize(::javax::swing::JComponent *);
  virtual ::java::awt::Dimension * getMaximumSize(::javax::swing::JComponent *);
public: // actually protected
  virtual void replacePane(::javax::swing::JComponent *, ::javax::swing::JComponent *);
  virtual void deinstallMouseHandlers(::javax::swing::JComponent *);
  virtual void installMouseHandlers(::javax::swing::JComponent *);
  virtual ::javax::swing::JComponent * createNorthPane(::javax::swing::JInternalFrame *);
  virtual ::javax::swing::JComponent * createWestPane(::javax::swing::JInternalFrame *);
  virtual ::javax::swing::JComponent * createSouthPane(::javax::swing::JInternalFrame *);
  virtual ::javax::swing::JComponent * createEastPane(::javax::swing::JInternalFrame *);
  virtual ::javax::swing::event::MouseInputAdapter * createBorderListener(::javax::swing::JInternalFrame *);
  virtual void createInternalFrameListener();
  virtual jboolean isKeyBindingRegistered();
  virtual void setKeyBindingRegistered(jboolean);
public:
  virtual jboolean isKeyBindingActive();
public: // actually protected
  virtual void setKeyBindingActive(jboolean);
  virtual void setupMenuOpenKey();
  virtual void setupMenuCloseKey();
public:
  virtual ::javax::swing::JComponent * getNorthPane();
  virtual void setNorthPane(::javax::swing::JComponent *);
  virtual ::javax::swing::JComponent * getSouthPane();
  virtual void setSouthPane(::javax::swing::JComponent *);
  virtual void setEastPane(::javax::swing::JComponent *);
  virtual ::javax::swing::JComponent * getEastPane();
  virtual void setWestPane(::javax::swing::JComponent *);
  virtual ::javax::swing::JComponent * getWestPane();
public: // actually protected
  virtual ::javax::swing::DesktopManager * getDesktopManager();
  virtual ::javax::swing::DesktopManager * createDesktopManager();
  virtual void closeFrame(::javax::swing::JInternalFrame *);
  virtual void maximizeFrame(::javax::swing::JInternalFrame *);
  virtual void minimizeFrame(::javax::swing::JInternalFrame *);
  virtual void iconifyFrame(::javax::swing::JInternalFrame *);
  virtual void deiconifyFrame(::javax::swing::JInternalFrame *);
  virtual void activateFrame(::javax::swing::JInternalFrame *);
  virtual void deactivateFrame(::javax::swing::JInternalFrame *);
  virtual ::java::awt::event::ComponentListener * createComponentListener();
  virtual ::javax::swing::event::MouseInputListener * createGlassPaneDispatcher();
  ::javax::swing::event::MouseInputAdapter * __attribute__((aligned(__alignof__( ::javax::swing::plaf::InternalFrameUI)))) borderListener;
  ::java::awt::event::ComponentListener * componentListener;
  ::javax::swing::event::MouseInputListener * glassPaneDispatcher;
  ::java::beans::PropertyChangeListener * propertyChangeListener;
private:
  ::javax::swing::plaf::basic::BasicInternalFrameUI$BasicInternalFrameListener * internalFrameListener;
public: // actually protected
  ::javax::swing::JComponent * eastPane;
  ::javax::swing::JComponent * northPane;
  ::javax::swing::JComponent * southPane;
  ::javax::swing::JComponent * westPane;
  ::javax::swing::KeyStroke * openMenuKey;
  ::javax::swing::plaf::basic::BasicInternalFrameTitlePane * titlePane;
  ::javax::swing::JInternalFrame * frame;
  ::java::awt::LayoutManager * internalFrameLayout;
private:
  ::javax::swing::JDesktopPane * desktopPane;
public:
  static ::java::lang::Class class$;
};

#endif // __javax_swing_plaf_basic_BasicInternalFrameUI__
