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

#ifndef __javax_swing_border_EmptyBorder__
#define __javax_swing_border_EmptyBorder__

#pragma interface

#include <javax/swing/border/AbstractBorder.h>
extern "Java"
{
  namespace java
  {
    namespace awt
    {
        class Component;
        class Graphics;
        class Insets;
    }
  }
  namespace javax
  {
    namespace swing
    {
      namespace border
      {
          class EmptyBorder;
      }
    }
  }
}

class javax::swing::border::EmptyBorder : public ::javax::swing::border::AbstractBorder
{

public:
  EmptyBorder(jint, jint, jint, jint);
  EmptyBorder(::java::awt::Insets *);
  virtual void paintBorder(::java::awt::Component *, ::java::awt::Graphics *, jint, jint, jint, jint);
  virtual ::java::awt::Insets * getBorderInsets(::java::awt::Component *);
  virtual ::java::awt::Insets * getBorderInsets(::java::awt::Component *, ::java::awt::Insets *);
  virtual ::java::awt::Insets * getBorderInsets();
  virtual jboolean isBorderOpaque();
public: // actually package-private
  static const jlong serialVersionUID = -8116076291731988694LL;
public: // actually protected
  jint __attribute__((aligned(__alignof__( ::javax::swing::border::AbstractBorder)))) left;
  jint right;
  jint top;
  jint bottom;
public:
  static ::java::lang::Class class$;
};

#endif // __javax_swing_border_EmptyBorder__
