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

#ifndef __javax_swing_plaf_basic_BasicOptionPaneUI__
#define __javax_swing_plaf_basic_BasicOptionPaneUI__

#pragma interface

#include <javax/swing/plaf/OptionPaneUI.h>
#include <gcj/array.h>

extern "Java"
{
  namespace java
  {
    namespace awt
    {
        class Component;
        class Container;
        class Dimension;
        class GridBagConstraints;
        class LayoutManager;
      namespace event
      {
          class ActionListener;
      }
    }
    namespace beans
    {
        class PropertyChangeListener;
    }
  }
  namespace javax
  {
    namespace swing
    {
        class ActionMap;
        class Icon;
        class JComponent;
        class JLabel;
        class JOptionPane;
      namespace plaf
      {
          class ComponentUI;
        namespace basic
        {
            class BasicOptionPaneUI;
            class BasicOptionPaneUI$MessageIcon;
        }
      }
    }
  }
}

class javax::swing::plaf::basic::BasicOptionPaneUI : public ::javax::swing::plaf::OptionPaneUI
{

public:
  BasicOptionPaneUI();
public: // actually protected
  virtual void addButtonComponents(::java::awt::Container *, JArray< ::java::lang::Object * > *, jint);
  virtual void addIcon(::java::awt::Container *);
private:
  static ::java::awt::GridBagConstraints * createConstraints();
public: // actually protected
  virtual void addMessageComponents(::java::awt::Container *, ::java::awt::GridBagConstraints *, ::java::lang::Object *, jint, jboolean);
  virtual void burstStringInto(::java::awt::Container *, ::java::lang::String *, jint);
public:
  virtual jboolean containsCustomComponents(::javax::swing::JOptionPane *);
public: // actually protected
  virtual ::java::awt::event::ActionListener * createButtonActionListener(jint);
  virtual ::java::awt::Container * createButtonArea();
  virtual ::java::awt::LayoutManager * createLayoutManager();
  virtual ::java::awt::Container * createMessageArea();
  virtual ::java::beans::PropertyChangeListener * createPropertyChangeListener();
  virtual ::java::awt::Container * createSeparator();
public:
  static ::javax::swing::plaf::ComponentUI * createUI(::javax::swing::JComponent *);
public: // actually protected
  virtual JArray< ::java::lang::Object * > * getButtons();
  virtual ::javax::swing::Icon * getIcon();
  virtual ::javax::swing::Icon * getIconForType(jint);
  virtual jint getInitialValueIndex();
  virtual jint getMaxCharactersPerLineCount();
public:
  virtual ::java::awt::Dimension * getMaximumSize(::javax::swing::JComponent *);
public: // actually protected
  virtual ::java::lang::Object * getMessage();
public:
  virtual ::java::awt::Dimension * getMinimumOptionPaneSize();
  virtual ::java::awt::Dimension * getMinimumSize(::javax::swing::JComponent *);
  virtual ::java::awt::Dimension * getPreferredSize(::javax::swing::JComponent *);
public: // actually protected
  virtual jboolean getSizeButtonsToSameWidth();
  virtual void installComponents();
  virtual void installDefaults();
  virtual void installKeyboardActions();
private:
  ::javax::swing::ActionMap * getActionMap();
  ::javax::swing::ActionMap * createDefaultActions();
public: // actually protected
  virtual void installListeners();
public:
  virtual void installUI(::javax::swing::JComponent *);
public: // actually protected
  virtual void resetInputValue();
public:
  virtual void selectInitialValue(::javax::swing::JOptionPane *);
public: // actually package-private
  virtual void resetSelectedValue();
public: // actually protected
  virtual void uninstallComponents();
  virtual void uninstallDefaults();
  virtual void uninstallKeyboardActions();
  virtual void uninstallListeners();
public:
  virtual void uninstallUI(::javax::swing::JComponent *);
private:
  void configureLabel(::javax::swing::JLabel *);
public:
  static const jint MinimumWidth = 262;
  static const jint MinimumHeight = 90;
public: // actually protected
  jboolean __attribute__((aligned(__alignof__( ::javax::swing::plaf::OptionPaneUI)))) hasCustomComponents;
  ::java::awt::Component * initialFocusComponent;
  ::javax::swing::JComponent * inputComponent;
  ::java::awt::Dimension * minimumSize;
  ::java::beans::PropertyChangeListener * propertyChangeListener;
  ::javax::swing::JOptionPane * optionPane;
private:
  static const jint ICON_SIZE = 36;
  static ::java::lang::String * OK_STRING;
  static ::java::lang::String * YES_STRING;
  static ::java::lang::String * NO_STRING;
  static ::java::lang::String * CANCEL_STRING;
public: // actually package-private
  ::java::awt::Container * messageAreaContainer;
  ::java::awt::Container * buttonContainer;
private:
  static ::javax::swing::plaf::basic::BasicOptionPaneUI$MessageIcon * errorIcon;
  static ::javax::swing::plaf::basic::BasicOptionPaneUI$MessageIcon * infoIcon;
  static ::javax::swing::plaf::basic::BasicOptionPaneUI$MessageIcon * warningIcon;
  static ::javax::swing::plaf::basic::BasicOptionPaneUI$MessageIcon * questionIcon;
public:
  static ::java::lang::Class class$;
};

#endif // __javax_swing_plaf_basic_BasicOptionPaneUI__
