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

#ifndef __javax_swing_tree_DefaultTreeSelectionModel__
#define __javax_swing_tree_DefaultTreeSelectionModel__

#pragma interface

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

extern "Java"
{
  namespace java
  {
    namespace beans
    {
        class PropertyChangeListener;
    }
  }
  namespace javax
  {
    namespace swing
    {
        class DefaultListSelectionModel;
      namespace event
      {
          class EventListenerList;
          class SwingPropertyChangeSupport;
          class TreeSelectionEvent;
          class TreeSelectionListener;
      }
      namespace tree
      {
          class DefaultTreeSelectionModel;
          class RowMapper;
          class TreePath;
      }
    }
  }
}

class javax::swing::tree::DefaultTreeSelectionModel : public ::java::lang::Object
{

public:
  DefaultTreeSelectionModel();
  virtual ::java::lang::Object * clone();
  virtual ::java::lang::String * toString();
private:
  void writeObject(::java::io::ObjectOutputStream *);
  void readObject(::java::io::ObjectInputStream *);
public:
  virtual void setRowMapper(::javax::swing::tree::RowMapper *);
  virtual ::javax::swing::tree::RowMapper * getRowMapper();
  virtual void setSelectionMode(jint);
  virtual jint getSelectionMode();
  virtual void setSelectionPath(::javax::swing::tree::TreePath *);
public: // actually package-private
  virtual jint getRow(::javax::swing::tree::TreePath *);
public:
  virtual void setSelectionPaths(JArray< ::javax::swing::tree::TreePath * > *);
  virtual void addSelectionPath(::javax::swing::tree::TreePath *);
  virtual void addSelectionPaths(JArray< ::javax::swing::tree::TreePath * > *);
  virtual void removeSelectionPath(::javax::swing::tree::TreePath *);
  virtual void removeSelectionPaths(JArray< ::javax::swing::tree::TreePath * > *);
  virtual ::javax::swing::tree::TreePath * getSelectionPath();
  virtual JArray< ::javax::swing::tree::TreePath * > * getSelectionPaths();
  virtual jint getSelectionCount();
  virtual jboolean isPathSelected(::javax::swing::tree::TreePath *);
  virtual jboolean isSelectionEmpty();
  virtual void clearSelection();
  virtual void addTreeSelectionListener(::javax::swing::event::TreeSelectionListener *);
  virtual void removeTreeSelectionListener(::javax::swing::event::TreeSelectionListener *);
  virtual JArray< ::javax::swing::event::TreeSelectionListener * > * getTreeSelectionListeners();
public: // actually protected
  virtual void fireValueChanged(::javax::swing::event::TreeSelectionEvent *);
public:
  virtual JArray< ::java::util::EventListener * > * getListeners(::java::lang::Class *);
  virtual JArray< jint > * getSelectionRows();
  virtual jint getMinSelectionRow();
  virtual jint getMaxSelectionRow();
  virtual jboolean isRowSelected(jint);
  virtual void resetRowSelection();
  virtual jint getLeadSelectionRow();
  virtual ::javax::swing::tree::TreePath * getLeadSelectionPath();
  virtual void addPropertyChangeListener(::java::beans::PropertyChangeListener *);
  virtual void removePropertyChangeListener(::java::beans::PropertyChangeListener *);
  virtual JArray< ::java::beans::PropertyChangeListener * > * getPropertyChangeListeners();
public: // actually protected
  virtual void insureRowContinuity();
  virtual jboolean arePathsContiguous(JArray< ::javax::swing::tree::TreePath * > *);
  virtual jboolean canPathsBeAdded(JArray< ::javax::swing::tree::TreePath * > *);
  virtual jboolean canPathsBeRemoved(JArray< ::javax::swing::tree::TreePath * > *);
  virtual void notifyPathChange(::java::util::Vector *, ::javax::swing::tree::TreePath *);
  virtual void updateLeadIndex();
  virtual void insureUniqueness();
public: // actually package-private
  static const jlong serialVersionUID = 3288129636638950196LL;
public:
  static ::java::lang::String * SELECTION_MODE_PROPERTY;
public: // actually protected
  ::javax::swing::event::SwingPropertyChangeSupport * __attribute__((aligned(__alignof__( ::java::lang::Object)))) changeSupport;
  JArray< ::javax::swing::tree::TreePath * > * selection;
  ::javax::swing::event::EventListenerList * listenerList;
  ::javax::swing::tree::RowMapper * rowMapper;
  ::javax::swing::DefaultListSelectionModel * listSelectionModel;
  jint selectionMode;
  ::javax::swing::tree::TreePath * leadPath;
  jint leadIndex;
  jint leadRow;
private:
  ::java::util::HashSet * selectedPaths;
  ::java::util::HashSet * tmpPaths;
public:
  static ::java::lang::Class class$;
};

#endif // __javax_swing_tree_DefaultTreeSelectionModel__
