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

#ifndef __javax_swing_LookAndFeel__
#define __javax_swing_LookAndFeel__

#pragma interface

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

extern "Java"
{
  namespace java
  {
    namespace awt
    {
        class Component;
    }
  }
  namespace javax
  {
    namespace swing
    {
        class ComponentInputMap;
        class InputMap;
        class JComponent;
        class LookAndFeel;
        class UIDefaults;
      namespace text
      {
          class JTextComponent$KeyBinding;
      }
    }
  }
}

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

public:
  LookAndFeel();
  virtual ::javax::swing::UIDefaults * getDefaults();
  virtual ::java::lang::String * getDescription() = 0;
  static ::java::lang::Object * getDesktopPropertyValue(::java::lang::String *, ::java::lang::Object *);
  virtual ::java::lang::String * getID() = 0;
  virtual ::java::lang::String * getName() = 0;
  virtual jboolean getSupportsWindowDecorations();
  virtual void initialize();
  static void installBorder(::javax::swing::JComponent *, ::java::lang::String *);
  static void installColors(::javax::swing::JComponent *, ::java::lang::String *, ::java::lang::String *);
  static void installColorsAndFont(::javax::swing::JComponent *, ::java::lang::String *, ::java::lang::String *, ::java::lang::String *);
  virtual jboolean isNativeLookAndFeel() = 0;
  virtual jboolean isSupportedLookAndFeel() = 0;
  static void loadKeyBindings(::javax::swing::InputMap *, JArray< ::java::lang::Object * > *);
  static ::javax::swing::ComponentInputMap * makeComponentInputMap(::javax::swing::JComponent *, JArray< ::java::lang::Object * > *);
  static ::java::lang::Object * makeIcon(::java::lang::Class *, ::java::lang::String *);
  static ::javax::swing::InputMap * makeInputMap(JArray< ::java::lang::Object * > *);
  static JArray< ::javax::swing::text::JTextComponent$KeyBinding * > * makeKeyBindings(JArray< ::java::lang::Object * > *);
  virtual void provideErrorFeedback(::java::awt::Component *);
  virtual ::java::lang::String * toString();
  virtual void uninitialize();
  static void uninstallBorder(::javax::swing::JComponent *);
  static void installProperty(::javax::swing::JComponent *, ::java::lang::String *, ::java::lang::Object *);
  static ::java::lang::Class class$;
};

#endif // __javax_swing_LookAndFeel__
