// Change History
// 12/03/03 AV Development: Code Cleanup. const/none const conversion
// 11/19/03 AV Development: Merge Production version 7
// 10/29/03 AV Production: merge from development version 9
// 10/8/03 AV Development: Add GetType()
// 10/22/03 AV Development: Add GetWidth() to DRS_FieldInteger

#ifndef _H_DRS_FIELD_
#define _H_DRS_FIELD_

//#include "drs_fieldmap.h"
#include "drs_appl.h"
#include "drs_rec.h"

#include <map>

////////////////////////////////////////////////////////
// DRS_FieldDef classes
////////////////////////////////////////////////////////
class APPL_DECL DRS_Application;
class DRS_RecordSet;

class APPL_DECL DRS_Field
{
  public:
  DRS_Field( DRS_Database const &rDB, byte *fp, byte *sSection, uint iID);
  virtual ~DRS_Field() {}; // AV need virtual destructor
  virtual inline DRS_Descriptor const & Descriptor() const {return Descr;};
  virtual uint                          StateCount() const { return 1;};
  virtual inline DRS_Descriptor const & State( uint iState = 0) const {return Descr;};
  virtual uint                          FieldLen( DRS_RecordSet *pRecord, uint iState, uint iOcc) const { return 0; }
  virtual uint                          FieldWidth( DRS_RecordSet *pRecordSet) const { return 0; }
  virtual bool                          Hide() const { return bHide; }
  virtual uint                          MaxSize(bool CombineOccurs = true) const { return 0; }
  virtual const byte                  * FieldData( DRS_RecordSet *pRecord, uint iState, uint iOcc, byte *sDest, uint iDestLen) const
    { return NULL; }
  virtual uint                          FieldOccurrences( DRS_RecordSet *pRecordSet) const;
  virtual const byte *                  FieldOccurrGroup() const { return strOccurGroup.length() ? (const byte *)strOccurGroup.c_str() : NULL; }
  virtual uint                          FieldApportionLevel() const { return ApportionLevel; }
  inline uint                           FieldID() const { return iFieldID;};
  virtual enumDataField_Type            GetType() const { return DATAFIELDTYPE_UNKNOWN; }
  uint                                  ApplID() const; //User wants appl id of a data field object.
  DRS_Database const &	                Database() { return rDatabase;}

  protected:
  uint iFieldID;
  DRS_Database const &	rDatabase;
  std::string           strDefault;
  std::string           strOccurGroup;
  bool                  bHide;
  uint                  ApportionLevel;
  private:
  DRS_DescriptorSerialize			Descr;
};

//DRS_FieldText
class APPL_DECL DRS_FieldText: public DRS_Field
{
  public:
  DRS_FieldText( DRS_Database const &rDB, byte *fp, byte *sSection, uint iID);

  virtual enumDataField_Type            GetType() const { return DATAFIELDTYPE_TEXT; }

  uint         FieldLen( DRS_RecordSet *pRecord, uint iState, uint iOcc) const;
  uint         FieldWidth( DRS_RecordSet *pRecordSet) const;
  uint         MaxSize(bool CombineOccurs = true) const;
  const byte * FieldData( DRS_RecordSet *pRecord, uint iState, uint iOcc, byte *sDest, uint iDestLen) const;

  private:
  uint       iWidth;
};

class APPL_DECL DRS_FieldInteger: public DRS_Field
{
public:
  DRS_FieldInteger( DRS_Database const &rDB, byte *fp, byte *sSection, uint iID);

  virtual enumDataField_Type            GetType() const { return DATAFIELDTYPE_INTEGER; }
    
  uint         FieldLen( DRS_RecordSet *pRecord, uint iState, uint iOcc) const;
  uint         FieldWidth( DRS_RecordSet *pRecordSet) const;
  uint         MaxSize(bool CombineOccurs = true) const;
  const byte * FieldData( DRS_RecordSet *pRecord, uint iState, uint iOcc, byte *sDest, uint iDestLen) const;
  uint         GetWidth() const { return iWidth; }
private:
  uint       iWidth;
};

/*
class APPL_DECL DRS_FieldMapped: public DRS_Field
{
public:
  DRS_FieldMapped( DRS_Database const &rDB, byte *fp, byte *sSection, uint iID, DRS_FieldMap const &rMap);

  virtual uint StateCount() const { return pFieldMap->StateCount();};
  uint         MaxSize(bool CombineOccurs = true) const;
  uint         FieldLen( DRS_RecordSet *pRecord, uint iState, uint iOcc) const;
  uint         FieldWidth( DRS_RecordSet  *) const;
  const byte * FieldData( DRS_RecordSet *pRecord, uint iState, uint iOcc, byte *sDest, uint iDestLen) const;

  virtual inline DRS_Descriptor const & State( uint iState) const {return pFieldMap->State(iState);};

private:
  DRS_FieldMap const * pFieldMap;
};

*/

#endif
