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

#ifndef __javax_swing_tree_DefaultTreeCellRenderer__
#define __javax_swing_tree_DefaultTreeCellRenderer__

#pragma interface

#include <javax/swing/JLabel.h>
extern "Java"
{
  namespace java
  {
    namespace awt
    {
        class Color;
        class Component;
        class Dimension;
        class Font;
        class Graphics;
        class Rectangle;
    }
  }
  namespace javax
  {
    namespace swing
    {
        class Icon;
        class JTree;
      namespace tree
      {
          class DefaultTreeCellRenderer;
      }
    }
  }
}

class javax::swing::tree::DefaultTreeCellRenderer : public ::javax::swing::JLabel
{

public:
  DefaultTreeCellRenderer();
  virtual ::javax::swing::Icon * getDefaultOpenIcon();
  virtual ::javax::swing::Icon * getDefaultClosedIcon();
  virtual ::javax::swing::Icon * getDefaultLeafIcon();
  virtual void setOpenIcon(::javax::swing::Icon *);
  virtual ::javax::swing::Icon * getOpenIcon();
  virtual void setClosedIcon(::javax::swing::Icon *);
  virtual ::javax::swing::Icon * getClosedIcon();
  virtual void setLeafIcon(::javax::swing::Icon *);
  virtual ::javax::swing::Icon * getLeafIcon();
  virtual void setTextSelectionColor(::java::awt::Color *);
  virtual ::java::awt::Color * getTextSelectionColor();
  virtual void setTextNonSelectionColor(::java::awt::Color *);
  virtual ::java::awt::Color * getTextNonSelectionColor();
  virtual void setBackgroundSelectionColor(::java::awt::Color *);
  virtual ::java::awt::Color * getBackgroundSelectionColor();
  virtual void setBackgroundNonSelectionColor(::java::awt::Color *);
  virtual ::java::awt::Color * getBackgroundNonSelectionColor();
  virtual void setBorderSelectionColor(::java::awt::Color *);
  virtual ::java::awt::Color * getBorderSelectionColor();
  virtual void setFont(::java::awt::Font *);
  virtual void setBackground(::java::awt::Color *);
  virtual ::java::awt::Component * getTreeCellRendererComponent(::javax::swing::JTree *, ::java::lang::Object *, jboolean, jboolean, jboolean, jint, jboolean);
  virtual ::java::awt::Font * getFont();
  virtual void paint(::java::awt::Graphics *);
private:
  void paintFocus(::java::awt::Graphics *, jint, jint, jint, jint);
  jint getXOffset();
public:
  virtual ::java::awt::Dimension * getPreferredSize();
  virtual void validate();
  virtual void revalidate();
  virtual void repaint(jlong, jint, jint, jint, jint);
  virtual void repaint(::java::awt::Rectangle *);
public: // actually protected
  virtual void firePropertyChange(::java::lang::String *, ::java::lang::Object *, ::java::lang::Object *);
public:
  virtual void firePropertyChange(::java::lang::String *, jbyte, jbyte);
  virtual void firePropertyChange(::java::lang::String *, jchar, jchar);
  virtual void firePropertyChange(::java::lang::String *, jshort, jshort);
  virtual void firePropertyChange(::java::lang::String *, jint, jint);
  virtual void firePropertyChange(::java::lang::String *, jlong, jlong);
  virtual void firePropertyChange(::java::lang::String *, jfloat, jfloat);
  virtual void firePropertyChange(::java::lang::String *, jdouble, jdouble);
  virtual void firePropertyChange(::java::lang::String *, jboolean, jboolean);
public: // actually protected
  jboolean __attribute__((aligned(__alignof__( ::javax::swing::JLabel)))) selected;
  jboolean hasFocus;
private:
  jboolean drawsFocusBorderAroundIcon;
public: // actually protected
  ::javax::swing::Icon * closedIcon;
  ::javax::swing::Icon * leafIcon;
  ::javax::swing::Icon * openIcon;
  ::java::awt::Color * textSelectionColor;
  ::java::awt::Color * textNonSelectionColor;
  ::java::awt::Color * backgroundSelectionColor;
  ::java::awt::Color * backgroundNonSelectionColor;
  ::java::awt::Color * borderSelectionColor;
public:
  static ::java::lang::Class class$;
};

#endif // __javax_swing_tree_DefaultTreeCellRenderer__
