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

#ifndef __javax_swing_JFormattedTextField$AbstractFormatter__
#define __javax_swing_JFormattedTextField$AbstractFormatter__

#pragma interface

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

extern "Java"
{
  namespace javax
  {
    namespace swing
    {
        class Action;
        class JFormattedTextField;
        class JFormattedTextField$AbstractFormatter;
      namespace text
      {
          class DocumentFilter;
          class NavigationFilter;
      }
    }
  }
}

class javax::swing::JFormattedTextField$AbstractFormatter : public ::java::lang::Object
{

public:
  JFormattedTextField$AbstractFormatter();
public: // actually protected
  virtual ::java::lang::Object * clone();
  virtual JArray< ::javax::swing::Action * > * getActions();
  virtual ::javax::swing::text::DocumentFilter * getDocumentFilter();
  virtual ::javax::swing::JFormattedTextField * getFormattedTextField();
  virtual ::javax::swing::text::NavigationFilter * getNavigationFilter();
public:
  virtual void install(::javax::swing::JFormattedTextField *);
  virtual void uninstall();
public: // actually protected
  virtual void invalidEdit();
  virtual void setEditValid(jboolean);
public:
  virtual ::java::lang::Object * stringToValue(::java::lang::String *) = 0;
  virtual ::java::lang::String * valueToString(::java::lang::Object *) = 0;
private:
  static const jlong serialVersionUID = -5193212041738979680LL;
  ::javax::swing::JFormattedTextField * __attribute__((aligned(__alignof__( ::java::lang::Object)))) textField;
public:
  static ::java::lang::Class class$;
};

#endif // __javax_swing_JFormattedTextField$AbstractFormatter__
