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

#ifndef __javax_swing_table_DefaultTableModel__
#define __javax_swing_table_DefaultTableModel__

#pragma interface

#include <javax/swing/table/AbstractTableModel.h>
#include <gcj/array.h>

extern "Java"
{
  namespace javax
  {
    namespace swing
    {
      namespace event
      {
          class TableModelEvent;
      }
      namespace table
      {
          class DefaultTableModel;
      }
    }
  }
}

class javax::swing::table::DefaultTableModel : public ::javax::swing::table::AbstractTableModel
{

public:
  DefaultTableModel();
  DefaultTableModel(jint, jint);
  DefaultTableModel(::java::util::Vector *, jint);
  DefaultTableModel(JArray< ::java::lang::Object * > *, jint);
  DefaultTableModel(::java::util::Vector *, ::java::util::Vector *);
  DefaultTableModel(JArray< JArray< ::java::lang::Object * > * > *, JArray< ::java::lang::Object * > *);
  virtual ::java::util::Vector * getDataVector();
  virtual void setDataVector(::java::util::Vector *, ::java::util::Vector *);
  virtual void setDataVector(JArray< JArray< ::java::lang::Object * > * > *, JArray< ::java::lang::Object * > *);
  virtual void newDataAvailable(::javax::swing::event::TableModelEvent *);
  virtual void newRowsAdded(::javax::swing::event::TableModelEvent *);
  virtual void rowsRemoved(::javax::swing::event::TableModelEvent *);
  virtual void setColumnIdentifiers(::java::util::Vector *);
  virtual void setColumnIdentifiers(JArray< ::java::lang::Object * > *);
  virtual void setNumRows(jint);
  virtual void setRowCount(jint);
  virtual void setColumnCount(jint);
  virtual void addColumn(::java::lang::Object *);
  virtual void addColumn(::java::lang::Object *, ::java::util::Vector *);
  virtual void addColumn(::java::lang::Object *, JArray< ::java::lang::Object * > *);
  virtual void addRow(::java::util::Vector *);
  virtual void addRow(JArray< ::java::lang::Object * > *);
  virtual void insertRow(jint, ::java::util::Vector *);
  virtual void insertRow(jint, JArray< ::java::lang::Object * > *);
  virtual void moveRow(jint, jint, jint);
  virtual void removeRow(jint);
  virtual jint getRowCount();
  virtual jint getColumnCount();
  virtual ::java::lang::String * getColumnName(jint);
  virtual jboolean isCellEditable(jint, jint);
  virtual ::java::lang::Object * getValueAt(jint, jint);
  virtual void setValueAt(::java::lang::Object *, jint, jint);
public: // actually protected
  static ::java::util::Vector * convertToVector(JArray< ::java::lang::Object * > *);
  static ::java::util::Vector * convertToVector(JArray< JArray< ::java::lang::Object * > * > *);
private:
  void addExtraRows(jint, jint);
  void checkSize();
public: // actually package-private
  static const jlong serialVersionUID = 6680042567037222321LL;
public: // actually protected
  ::java::util::Vector * __attribute__((aligned(__alignof__( ::javax::swing::table::AbstractTableModel)))) dataVector;
  ::java::util::Vector * columnIdentifiers;
public:
  static ::java::lang::Class class$;
};

#endif // __javax_swing_table_DefaultTableModel__
