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

#ifndef __javax_swing_tree_FixedHeightLayoutCache__
#define __javax_swing_tree_FixedHeightLayoutCache__

#pragma interface

#include <javax/swing/tree/VariableHeightLayoutCache.h>
extern "Java"
{
  namespace java
  {
    namespace awt
    {
        class Rectangle;
    }
  }
  namespace javax
  {
    namespace swing
    {
      namespace event
      {
          class TreeModelEvent;
      }
      namespace tree
      {
          class FixedHeightLayoutCache;
          class TreeModel;
          class TreePath;
      }
    }
  }
}

class javax::swing::tree::FixedHeightLayoutCache : public ::javax::swing::tree::VariableHeightLayoutCache
{

public:
  FixedHeightLayoutCache();
  virtual jint getRowCount();
private:
  void update();
  void countRows(::java::lang::Object *, ::java::lang::Object *, jint);
public:
  virtual void invalidatePathBounds(::javax::swing::tree::TreePath *);
  virtual void invalidateSizes();
  virtual void setExpandedState(::javax::swing::tree::TreePath *, jboolean);
  virtual jboolean isExpanded(::javax::swing::tree::TreePath *);
  virtual ::java::awt::Rectangle * getBounds(::javax::swing::tree::TreePath *, ::java::awt::Rectangle *);
  virtual ::javax::swing::tree::TreePath * getPathForRow(jint);
  virtual jint getRowForPath(::javax::swing::tree::TreePath *);
  virtual ::javax::swing::tree::TreePath * getPathClosestTo(jint, jint);
public: // actually package-private
  virtual jint distance(::java::awt::Rectangle *, jint, jint);
public:
  virtual jint getVisibleChildCount(::javax::swing::tree::TreePath *);
  virtual ::java::util::Enumeration * getVisiblePathsFrom(::javax::swing::tree::TreePath *);
  virtual jboolean getExpandedState(::javax::swing::tree::TreePath *);
  virtual void treeNodesChanged(::javax::swing::event::TreeModelEvent *);
  virtual void treeNodesInserted(::javax::swing::event::TreeModelEvent *);
  virtual void treeNodesRemoved(::javax::swing::event::TreeModelEvent *);
  virtual void treeStructureChanged(::javax::swing::event::TreeModelEvent *);
  virtual void setModel(::javax::swing::tree::TreeModel *);
  virtual void setRootVisible(jboolean);
  virtual jint getPreferredHeight();
  virtual jint getPreferredWidth(::java::awt::Rectangle *);
public: // actually protected
  virtual jboolean isFixedRowHeight();
public: // actually package-private
  ::java::util::Set * __attribute__((aligned(__alignof__( ::javax::swing::tree::VariableHeightLayoutCache)))) expanded;
  ::java::util::Hashtable * nodes;
  ::java::util::Hashtable * row2node;
  jboolean dirty;
  jint totalHeight;
  jint maximalWidth;
public:
  static ::java::lang::Class class$;
};

#endif // __javax_swing_tree_FixedHeightLayoutCache__
