// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#ifndef XFA_INCLUDE_FXFA_FXFA_OBJECTACC_H_
#define XFA_INCLUDE_FXFA_FXFA_OBJECTACC_H_

#include "core/include/fxge/fx_dib.h"
#include "xfa/fxfa/parser/xfa_object.h"

class CXFA_Node;
class IFX_Locale;
class CXFA_Margin;
class CXFA_Caption;
class CXFA_Para;
class CXFA_Event;
class CXFA_Script;
class CXFA_Value;
class CXFA_Calculate;
class CXFA_Line;
class CXFA_Text;
class CXFA_ExData;
class CXFA_Image;
class CXFA_Validate;
class CXFA_Variables;
class CXFA_Bind;
class CXFA_Assist;
class CXFA_ToolTip;
class CXFA_Keep;
class CXFA_Submit;
class CXFA_BindItems;
class CXFA_Stroke;
class CXFA_Corner;
class CXFA_Edge;
class CXFA_Box;
class CXFA_Arc;
class CXFA_Border;
class CXFA_Rectangle;
class CXFA_WidgetData;
class CXFA_Occur;
class CXFA_Filter;
class CXFA_Certificate;
class CXFA_WrapCertificate;
class CXFA_Oids;
class CXFA_SubjectDNs;
class CXFA_DigestMethods;
class CXFA_Encodings;
class CXFA_EncryptionMethods;
class CXFA_Reasons;
class CXFA_Manifest;

inline FX_BOOL XFA_IsSpace(FX_WCHAR c) {
  return (c == 0x20) || (c == 0x0d) || (c == 0x0a) || (c == 0x09);
}
inline FX_BOOL XFA_IsDigit(FX_WCHAR c) {
  return c >= '0' && c <= '9';
}
typedef CFX_ArrayTemplate<CXFA_Object*> CXFA_ObjArray;

class CXFA_Data {
 public:
  explicit CXFA_Data(CXFA_Node* pNode) : m_pNode(pNode) {}

  operator bool() const { return !!m_pNode; }
  CXFA_Node* GetNode() const { return m_pNode; }
  XFA_ELEMENT GetClassID() const;

 protected:
  FX_BOOL TryMeasure(XFA_ATTRIBUTE eAttr,
                     FX_FLOAT& fValue,
                     FX_BOOL bUseDefault = FALSE) const;
  FX_BOOL SetMeasure(XFA_ATTRIBUTE eAttr, FX_FLOAT fValue);

  CXFA_Node* m_pNode;
};

class CXFA_Fill : public CXFA_Data {
 public:
  explicit CXFA_Fill(CXFA_Node* pNode);
  ~CXFA_Fill();

  int32_t GetPresence();
  FX_ARGB GetColor(FX_BOOL bText = FALSE);
  int32_t GetFillType();
  int32_t GetPattern(FX_ARGB& foreColor);
  int32_t GetStipple(FX_ARGB& stippleColor);
  int32_t GetLinear(FX_ARGB& endColor);
  int32_t GetRadial(FX_ARGB& endColor);
  FX_BOOL SetPresence(int32_t iPresence);
  void SetColor(FX_ARGB color);
  FX_BOOL SetFillType(int32_t iType);
  FX_BOOL SetPattern(int32_t iPattern, FX_ARGB foreColor);
  FX_BOOL SetStipple(int32_t iStipple, FX_ARGB stippleColor);
  FX_BOOL SetLinear(int32_t iLinear, FX_ARGB endColor);
  FX_BOOL SetRadial(int32_t iRadial, FX_ARGB endColor);
};

class CXFA_Margin : public CXFA_Data {
 public:
  explicit CXFA_Margin(CXFA_Node* pNode);
  FX_BOOL GetLeftInset(FX_FLOAT& fInset, FX_FLOAT fDefInset = 0) const;
  FX_BOOL GetTopInset(FX_FLOAT& fInset, FX_FLOAT fDefInset = 0) const;
  FX_BOOL GetRightInset(FX_FLOAT& fInset, FX_FLOAT fDefInset = 0) const;
  FX_BOOL GetBottomInset(FX_FLOAT& fInset, FX_FLOAT fDefInset = 0) const;
  FX_BOOL SetLeftInset(FX_FLOAT fInset);
  FX_BOOL SetTopInset(FX_FLOAT fInset);
  FX_BOOL SetRightInset(FX_FLOAT fInset);
  FX_BOOL SetBottomInset(FX_FLOAT fInset);
};

class CXFA_Font : public CXFA_Data {
 public:
  explicit CXFA_Font(CXFA_Node* pNode);

  FX_FLOAT GetBaselineShift();
  FX_FLOAT GetHorizontalScale();
  FX_FLOAT GetVerticalScale();
  FX_FLOAT GetLetterSpacing();
  int32_t GetLineThrough();
  int32_t GetLineThroughPeriod();
  int32_t GetOverline();
  int32_t GetOverlinePeriod();
  int32_t GetUnderline();
  int32_t GetUnderlinePeriod();
  FX_FLOAT GetFontSize();
  void GetTypeface(CFX_WideStringC& wsTypeFace);

  FX_BOOL IsBold();
  FX_BOOL IsItalic();
  FX_BOOL IsUseKerning();

  FX_ARGB GetColor();
  void SetColor(FX_ARGB color);

  FX_BOOL SetBaselineShift(FX_FLOAT fBaselineShift);
  FX_BOOL SetHorizontalScale(FX_FLOAT fHorizontalScale);
  FX_BOOL SetVerticalScale(FX_FLOAT fVerticalScale);
  FX_BOOL SetLetterSpacing(FX_FLOAT fLetterSpacing, XFA_UNIT eUnit);
  FX_BOOL SetLineThrough(int32_t iLineThrough);
  FX_BOOL SetLineThroughPeriod(int32_t iLineThroughPeriod);
  FX_BOOL SetOverline(int32_t iOverline);
  FX_BOOL SetOverlinePeriod(int32_t iOverlinePeriod);
  FX_BOOL SetUnderline(int32_t iUnderline);
  FX_BOOL SetUnderlinePeriod(int32_t iUnderlinePeriod);
};

class CXFA_Caption : public CXFA_Data {
 public:
  explicit CXFA_Caption(CXFA_Node* pNode);

  int32_t GetPresence();
  int32_t GetPlacementType();
  FX_FLOAT GetReserve();
  CXFA_Margin GetMargin();
  CXFA_Font GetFont();
  CXFA_Value GetValue();
  CXFA_Para GetPara();
  FX_BOOL SetPresence(int32_t iPresence);
  FX_BOOL SetPlacementType(int32_t iType);
  FX_BOOL SetReserve(FX_FLOAT fReserve);
};

class CXFA_Para : public CXFA_Data {
 public:
  explicit CXFA_Para(CXFA_Node* pNode);

  int32_t GetHorizontalAlign();
  int32_t GetVerticalAlign();
  FX_FLOAT GetLineHeight();
  FX_FLOAT GetMarginLeft();
  FX_FLOAT GetMarginRight();
  int32_t GetOrphans();
  FX_FLOAT GetRadixOffset();
  FX_FLOAT GetSpaceAbove();
  FX_FLOAT GetSpaceBelow();
  FX_FLOAT GetTextIndent();
  int32_t GetWidows();
  FX_BOOL SetHorizontalAlign(int32_t iHorizontalAlign);
  FX_BOOL SetVerticalAlign(int32_t iVerticalAlign);
  FX_BOOL SetLineHeight(FX_FLOAT fLineHeight);
  FX_BOOL SetMarginLeft(FX_FLOAT fMarginLeft);
  FX_BOOL SetMarginRight(FX_FLOAT fMarginRight);
  FX_BOOL SetOrphans(int32_t iOrphans);
  FX_BOOL SetRadixOffset(FX_FLOAT fRadixOffset);
  FX_BOOL SetSpaceAbove(FX_FLOAT fSpaceAbove);
  FX_BOOL SetSpaceBelow(FX_FLOAT fSpaceBelow);
  FX_BOOL SetTextIndent(FX_FLOAT fTextIndent);
  FX_BOOL SetWidows(int32_t iWidows);
};

class CXFA_Keep : public CXFA_Data {
 public:
  CXFA_Keep(CXFA_Node* pNode, CXFA_Node* pParent);

  int32_t GetIntact();
  int32_t GetNext();
  int32_t GetPrevious();
  FX_BOOL SetIntact(int32_t iIntact);
  FX_BOOL SetNext(int32_t iNext);
  FX_BOOL SetPrevious(int32_t iPrevious);

 private:
  CXFA_Node* m_pParent;
};

enum XFA_TEXTENCODING {
  XFA_TEXTENCODING_None,
  XFA_TEXTENCODING_Big5,
  XFA_TEXTENCODING_FontSpecific,
  XFA_TEXTENCODING_GBK,
  XFA_TEXTENCODING_GB18030,
  XFA_TEXTENCODING_GB2312,
  XFA_TEXTENCODING_ISO8859NN,
  XFA_TEXTENCODING_KSC5601,
  XFA_TEXTENCODING_ShiftJIS,
  XFA_TEXTENCODING_UCS2,
  XFA_TEXTENCODING_UTF16,
  XFA_TEXTENCODING_UTF8
};

class CXFA_Event : public CXFA_Data {
 public:
  explicit CXFA_Event(CXFA_Node* pNode);

  int32_t GetActivity();
  int32_t GetEventType();
  void GetRef(CFX_WideStringC& wsRef);

  int32_t GetExecuteRunAt();
  int32_t GetExecuteType();
  void GetExecuteConnection(CFX_WideString& wsConnection);

  CXFA_Script GetScript();
  CXFA_Submit GetSubmit();

  int32_t GetSignDataOperation();
  void GetSignDataTarget(CFX_WideString& wsTarget);
  FX_BOOL SetActivity(int32_t iActivity);
  FX_BOOL SetEventType(int32_t iEventType);
  FX_BOOL SetExecuteRunAt(int32_t iExecuteRunAt);
  FX_BOOL SetExecuteType(int32_t iExecuteType);
  FX_BOOL SetExecuteConnection(const CFX_WideString& wsConnection);
  FX_BOOL SetSignDataOperation(int32_t iOperation);
  FX_BOOL SetSignDataTarget(const CFX_WideString& wsTarget);
};

enum XFA_SCRIPTTYPE {
  XFA_SCRIPTTYPE_Formcalc = 0,
  XFA_SCRIPTTYPE_Javascript,
  XFA_SCRIPTTYPE_Unkown,
};

class CXFA_Script : public CXFA_Data {
 public:
  explicit CXFA_Script(CXFA_Node* pNode);

  void GetBinding(CFX_WideString& wsBinding);
  XFA_SCRIPTTYPE GetContentType();
  int32_t GetRunAt();
  void GetExpression(CFX_WideString& wsExpression);
  FX_BOOL SetBinding(const CFX_WideString& wsBinding);
  FX_BOOL SetContentType(XFA_SCRIPTTYPE eType);
  FX_BOOL SetRunAt(int32_t iRunAt);
  FX_BOOL SetExpression(const CFX_WideString& wsExpression);
};

class CXFA_Submit : public CXFA_Data {
 public:
  explicit CXFA_Submit(CXFA_Node* pNode);

  FX_BOOL IsSubmitEmbedPDF();
  int32_t GetSubmitFormat();
  void GetSubmitTarget(CFX_WideStringC& wsTarget);
  XFA_TEXTENCODING GetSubmitTextEncoding();
  void GetSubmitXDPContent(CFX_WideStringC& wsContent);
  FX_BOOL SetSubmitFormat(int32_t iSubmitFormat);
  FX_BOOL SetSubmitTarget(const CFX_WideString& wsTarget);
  FX_BOOL SetSubmitTextEncoding(XFA_TEXTENCODING eTextEncoding);
  FX_BOOL SetSubmitXDPContent(const CFX_WideString& wsContent);
};

class CXFA_Value : public CXFA_Data {
 public:
  explicit CXFA_Value(CXFA_Node* pNode) : CXFA_Data(pNode) {}

  XFA_ELEMENT GetChildValueClassID();
  FX_BOOL GetChildValueContent(CFX_WideString& wsContent);
  CXFA_Arc GetArc();
  CXFA_Line GetLine();
  CXFA_Rectangle GetRectangle();
  CXFA_Text GetText();
  CXFA_ExData GetExData();
  CXFA_Image GetImage();
  FX_BOOL SetChildValueContent(const CFX_WideString& wsContent,
                               FX_BOOL bNotify = FALSE,
                               XFA_ELEMENT iType = XFA_ELEMENT_UNKNOWN);
};

class CXFA_Line : public CXFA_Data {
 public:
  explicit CXFA_Line(CXFA_Node* pNode) : CXFA_Data(pNode) {}

  int32_t GetHand();
  FX_BOOL GetSlop();
  CXFA_Edge GetEdge();
  FX_BOOL SetHand(int32_t iHand);
  FX_BOOL SetSlop(int32_t iSlop);
};

class CXFA_Text : public CXFA_Data {
 public:
  explicit CXFA_Text(CXFA_Node* pNode);

  void GetName(CFX_WideStringC& wsName);
  int32_t GetMaxChars();
  void GetRid(CFX_WideStringC& wsRid);
  void GetContent(CFX_WideString& wsText);
  void SetContent(CFX_WideString wsText, FX_BOOL bNotify = TRUE);
  FX_BOOL SetName(const CFX_WideString& wsName);
  FX_BOOL SetMaxChars(int32_t iMaxChars);
  FX_BOOL SetRid(const CFX_WideString& wsRid);
};

class CXFA_ExData : public CXFA_Data {
 public:
  explicit CXFA_ExData(CXFA_Node* pNode);

  void GetContentType(CFX_WideStringC& wsContentType);
  void GetHref(CFX_WideStringC& wsHref);
  int32_t GetMaxLength();
  void GetRid(CFX_WideStringC& wsRid);
  int32_t GetTransferEncoding();
  void GetContent(CFX_WideString& wsText);
  FX_BOOL SetContentType(const CFX_WideString& wsContentType);
  FX_BOOL SetHref(const CFX_WideString& wsHref);
  FX_BOOL SetMaxLength(int32_t iMaxLength);
  FX_BOOL SetRid(const CFX_WideString& wsRid);
  FX_BOOL SetTransferEncoding(int32_t iTransferEncoding);
  FX_BOOL SetContent(const CFX_WideString& wsText,
                     FX_BOOL bNotify = FALSE,
                     FX_BOOL bScriptModify = FALSE,
                     FX_BOOL bSyncData = TRUE);
};

class CXFA_Image : public CXFA_Data {
 public:
  CXFA_Image(CXFA_Node* pNode, FX_BOOL bDefValue);

  int32_t GetAspect();
  FX_BOOL GetContentType(CFX_WideString& wsContentType);
  FX_BOOL GetHref(CFX_WideString& wsHref);
  int32_t GetTransferEncoding();
  FX_BOOL GetContent(CFX_WideString& wsText);
  FX_BOOL SetAspect(int32_t iAspect);
  FX_BOOL SetContentType(const CFX_WideString& wsContentType);
  FX_BOOL SetHref(const CFX_WideString& wsHref);
  FX_BOOL SetTransferEncoding(int32_t iTransferEncoding);
  FX_BOOL SetContent(const CFX_WideString& wsText);

 protected:
  FX_BOOL m_bDefValue;
};

class CXFA_Calculate : public CXFA_Data {
 public:
  explicit CXFA_Calculate(CXFA_Node* pNode);

  int32_t GetOverride();
  CXFA_Script GetScript();
  void GetMessageText(CFX_WideString& wsMessage);
  FX_BOOL SetOverride(int32_t iOverride);
  FX_BOOL SetMessageText(const CFX_WideString& wsMessage);
};

class CXFA_Validate : public CXFA_Data {
 public:
  explicit CXFA_Validate(CXFA_Node* pNode);

  int32_t GetFormatTest();
  FX_BOOL SetFormatTest(CFX_WideString wsValue);
  int32_t GetNullTest();
  FX_BOOL SetNullTest(CFX_WideString wsValue);
  int32_t GetScriptTest();
  void GetFormatMessageText(CFX_WideString& wsMessage);
  void SetFormatMessageText(CFX_WideString wsMessage);
  void GetNullMessageText(CFX_WideString& wsMessage);
  void SetNullMessageText(CFX_WideString wsMessage);
  void GetScriptMessageText(CFX_WideString& wsMessage);
  void SetScriptMessageText(CFX_WideString wsMessage);
  void GetPicture(CFX_WideString& wsPicture);
  CXFA_Script GetScript();

 protected:
  void GetMessageText(CFX_WideString& wsMessage,
                      const CFX_WideStringC& wsMessageType);
  void SetMessageText(CFX_WideString& wsMessage,
                      const CFX_WideStringC& wsMessageType);
  FX_BOOL SetTestValue(int32_t iType,
                       CFX_WideString& wsValue,
                       XFA_ATTRIBUTEENUM eName);
};

class CXFA_Variables : public CXFA_Data {
 public:
  explicit CXFA_Variables(CXFA_Node* pNode);

  int32_t CountScripts();
  CXFA_Script GetScript(int32_t nIndex);
};

class CXFA_Bind : public CXFA_Data {
 public:
  explicit CXFA_Bind(CXFA_Node* pNode);

  int32_t GetMatch();
  void GetRef(CFX_WideStringC& wsRef);
  void GetPicture(CFX_WideString& wsPicture);
  FX_BOOL SetMatch(int32_t iMatch);
  FX_BOOL SetRef(const CFX_WideString& wsRef);
  FX_BOOL SetPicture(const CFX_WideString& wsPicture);
};

class CXFA_Assist : public CXFA_Data {
 public:
  explicit CXFA_Assist(CXFA_Node* pNode);

  CXFA_ToolTip GetToolTip();
};

class CXFA_ToolTip : public CXFA_Data {
 public:
  explicit CXFA_ToolTip(CXFA_Node* pNode);

  FX_BOOL GetTip(CFX_WideString& wsTip);
  FX_BOOL SetTip(const CFX_WideString& wsTip);
};

class CXFA_BindItems : public CXFA_Data {
 public:
  explicit CXFA_BindItems(CXFA_Node* pNode);

  void GetConnection(CFX_WideStringC& wsConnection);
  void GetLabelRef(CFX_WideStringC& wsLabelRef);
  void GetValueRef(CFX_WideStringC& wsValueRef);
  void GetRef(CFX_WideStringC& wsRef);
  FX_BOOL SetConnection(const CFX_WideString& wsConnection);
  FX_BOOL SetLabelRef(const CFX_WideString& wsLabelRef);
  FX_BOOL SetValueRef(const CFX_WideString& wsValueRef);
  FX_BOOL SetRef(const CFX_WideString& wsRef);
};

#define XFA_STROKE_SAMESTYLE_NoPresence 1
#define XFA_STROKE_SAMESTYLE_Corner 2

class CXFA_Stroke : public CXFA_Data {
 public:
  explicit CXFA_Stroke(CXFA_Node* pNode) : CXFA_Data(pNode) {}

  bool IsCorner() const { return GetClassID() == XFA_ELEMENT_Corner; }
  bool IsEdge() const { return GetClassID() == XFA_ELEMENT_Edge; }
  bool IsVisible() const { return GetPresence() == XFA_ATTRIBUTEENUM_Visible; }
  int32_t GetPresence() const;
  int32_t GetCapType() const;
  int32_t GetStrokeType() const;
  FX_FLOAT GetThickness() const;
  CXFA_Measurement GetMSThickness() const;
  void SetThickness(FX_FLOAT fThickness);
  void SetMSThickness(CXFA_Measurement msThinkness);
  FX_ARGB GetColor() const;
  void SetColor(FX_ARGB argb);
  int32_t GetJoinType() const;
  FX_BOOL IsInverted() const;
  FX_FLOAT GetRadius() const;
  FX_BOOL SameStyles(CXFA_Stroke stroke, FX_DWORD dwFlags = 0) const;
};

class CXFA_Corner : public CXFA_Stroke {
 public:
  explicit CXFA_Corner(CXFA_Node* pNode) : CXFA_Stroke(pNode) {}
};

class CXFA_Edge : public CXFA_Stroke {
 public:
  explicit CXFA_Edge(CXFA_Node* pNode) : CXFA_Stroke(pNode) {}
};

typedef CFX_ArrayTemplate<CXFA_Stroke> CXFA_StrokeArray;
typedef CFX_ArrayTemplate<CXFA_Edge> CXFA_EdgeArray;
typedef CFX_ArrayTemplate<CXFA_Corner> CXFA_CornerArray;

class CXFA_Box : public CXFA_Data {
 public:
  explicit CXFA_Box(CXFA_Node* pNode) : CXFA_Data(pNode) {}

  bool IsArc() const { return GetClassID() == XFA_ELEMENT_Arc; }
  bool IsBorder() const { return GetClassID() == XFA_ELEMENT_Border; }
  bool IsRectangle() const { return GetClassID() == XFA_ELEMENT_Rectangle; }
  int32_t GetBreak() const;
  int32_t GetHand() const;
  int32_t GetPresence() const;
  int32_t CountCorners() const;
  CXFA_Corner GetCorner(int32_t nIndex) const;
  int32_t CountEdges() const;
  CXFA_Edge GetEdge(int32_t nIndex = 0) const;
  void GetStrokes(CXFA_StrokeArray& strokes) const;
  FX_BOOL IsCircular() const;
  FX_BOOL GetStartAngle(FX_FLOAT& fStartAngle) const;
  FX_FLOAT GetStartAngle() const {
    FX_FLOAT fStartAngle;
    GetStartAngle(fStartAngle);
    return fStartAngle;
  }

  FX_BOOL GetSweepAngle(FX_FLOAT& fSweepAngle) const;
  FX_FLOAT GetSweepAngle() const {
    FX_FLOAT fSweepAngle;
    GetSweepAngle(fSweepAngle);
    return fSweepAngle;
  }

  CXFA_Fill GetFill(FX_BOOL bModified = FALSE) const;
  CXFA_Margin GetMargin() const;
  FX_BOOL SameStyles() const;
  int32_t Get3DStyle(FX_BOOL& bVisible, FX_FLOAT& fThickness) const;
};

class CXFA_Arc : public CXFA_Box {
 public:
  explicit CXFA_Arc(CXFA_Node* pNode) : CXFA_Box(pNode) {}
};

class CXFA_Border : public CXFA_Box {
 public:
  explicit CXFA_Border(CXFA_Node* pNode) : CXFA_Box(pNode) {}
};

class CXFA_Rectangle : public CXFA_Box {
 public:
  explicit CXFA_Rectangle(CXFA_Node* pNode) : CXFA_Box(pNode) {}
};

enum XFA_CHECKSTATE {
  XFA_CHECKSTATE_On = 0,
  XFA_CHECKSTATE_Off = 1,
  XFA_CHECKSTATE_Neutral = 2,
};

enum XFA_VALUEPICTURE {
  XFA_VALUEPICTURE_Raw = 0,
  XFA_VALUEPICTURE_Display,
  XFA_VALUEPICTURE_Edit,
  XFA_VALUEPICTURE_DataBind,
};

class CXFA_WidgetData : public CXFA_Data {
 public:
  explicit CXFA_WidgetData(CXFA_Node* pNode);

  CXFA_Node* GetUIChild();
  XFA_ELEMENT GetUIType();
  CFX_WideString GetRawValue();
  int32_t GetAccess(FX_BOOL bTemplate = FALSE);
  FX_BOOL GetAccessKey(CFX_WideStringC& wsAccessKey);
  int32_t GetAnchorType();
  int32_t GetColSpan();
  int32_t GetPresence();
  int32_t GetRotate();
  CXFA_Border GetBorder(FX_BOOL bModified = FALSE);
  CXFA_Caption GetCaption(FX_BOOL bModified = FALSE);
  CXFA_Font GetFont(FX_BOOL bModified = FALSE);
  CXFA_Margin GetMargin(FX_BOOL bModified = FALSE);
  CXFA_Para GetPara(FX_BOOL bModified = FALSE);
  CXFA_Keep GetKeep(FX_BOOL bModified = FALSE);
  void GetEventList(CXFA_NodeArray& events);
  int32_t GetEventByActivity(int32_t iActivity,
                             CXFA_NodeArray& events,
                             FX_BOOL bIsFormReady = FALSE);
  CXFA_Value GetDefaultValue(FX_BOOL bModified = FALSE);
  CXFA_Value GetFormValue(FX_BOOL bModified = FALSE);
  CXFA_Calculate GetCalculate(FX_BOOL bModified = FALSE);
  CXFA_Validate GetValidate(FX_BOOL bModified = FALSE);
  CXFA_Variables GetVariables(FX_BOOL bModified = FALSE);
  CXFA_Bind GetBind(FX_BOOL bModified = FALSE);
  CXFA_Assist GetAssist(FX_BOOL bModified = FALSE);
  void GetRelevant(CFX_WideStringC& wsRelevant);
  FX_DWORD GetRelevantStatus();
  FX_BOOL GetWidth(FX_FLOAT& fWidth);
  FX_BOOL GetHeight(FX_FLOAT& fHeight);
  FX_BOOL GetMinWidth(FX_FLOAT& fMinWidth);
  FX_BOOL GetMinHeight(FX_FLOAT& fMinHeight);
  FX_BOOL GetMaxWidth(FX_FLOAT& fMaxWidth);
  FX_BOOL GetMaxHeight(FX_FLOAT& fMaxHeight);
  CXFA_BindItems GetBindItems();
  FX_BOOL SetAccess(int32_t iAccess, FX_BOOL bNotify = TRUE);
  FX_BOOL SetAccessKey(const CFX_WideString& wsAccessKey);
  FX_BOOL SetAnchorType(int32_t iType);
  FX_BOOL SetColSpan(int32_t iColSpan);
  FX_BOOL SetPresence(int32_t iPresence);
  FX_BOOL SetRotate(int32_t iRotate);
  FX_BOOL SetRelevant(const CFX_WideString& wsRelevant);
  FX_BOOL SetStatus(FX_DWORD dwStatus);
  FX_BOOL SetWidth(FX_FLOAT fWidth);
  FX_BOOL SetHeight(FX_FLOAT fHeight);
  FX_BOOL SetMinWidth(FX_FLOAT fMinWidth);
  FX_BOOL SetMinHeight(FX_FLOAT fMinHeight);
  FX_BOOL SetMaxWidth(FX_FLOAT fMaxWidth);
  FX_BOOL SetMaxHeight(FX_FLOAT fMaxHeight);
  FX_BOOL SetPos(FX_FLOAT x, FX_FLOAT y);
  FX_BOOL SetName(const CFX_WideString& wsName);
  FX_BOOL SetButtonHighlight(int32_t iButtonHighlight);
  FX_BOOL SetButtonRollover(const CFX_WideString& wsRollover,
                            FX_BOOL bRichText);
  FX_BOOL SetButtonDown(const CFX_WideString& wsDown, FX_BOOL bRichText);
  FX_BOOL SetCheckButtonShape(int32_t iCheckButtonShape);
  FX_BOOL SetCheckButtonMark(int32_t iCheckButtonMark);
  FX_BOOL SetCheckButtonSize(FX_FLOAT fCheckButtonMark);
  CXFA_Border GetUIBorder(FX_BOOL bModified = FALSE);
  CXFA_Margin GetUIMargin(FX_BOOL bModified = FALSE);
  void GetUIMargin(CFX_RectF& rtUIMargin);
  int32_t GetButtonHighlight();
  FX_BOOL GetButtonRollover(CFX_WideString& wsRollover, FX_BOOL& bRichText);
  FX_BOOL GetButtonDown(CFX_WideString& wsDown, FX_BOOL& bRichText);
  int32_t GetCheckButtonShape();
  int32_t GetCheckButtonMark();
  FX_FLOAT GetCheckButtonSize();
  FX_BOOL IsAllowNeutral();
  FX_BOOL IsRadioButton();
  XFA_CHECKSTATE GetCheckState();
  void SetCheckState(XFA_CHECKSTATE eCheckState, FX_BOOL bNotify = TRUE);
  CXFA_Node* GetExclGroupNode();
  CXFA_Node* GetSelectedMember();
  CXFA_Node* SetSelectedMember(const CFX_WideStringC& wsName,
                               FX_BOOL bNotify = TRUE);
  void SetSelectedMemberByValue(const CFX_WideStringC& wsValue,
                                FX_BOOL bNotify = TRUE,
                                FX_BOOL bScriptModify = FALSE,
                                FX_BOOL bSyncData = TRUE);
  CXFA_Node* GetExclGroupFirstMember();
  CXFA_Node* GetExclGroupNextMember(CXFA_Node* pNode);
  int32_t GetChoiceListCommitOn();
  FX_BOOL IsChoiceListAllowTextEntry();
  int32_t GetChoiceListOpen();
  FX_BOOL IsListBox();
  int32_t CountChoiceListItems(FX_BOOL bSaveValue = FALSE);
  FX_BOOL GetChoiceListItem(CFX_WideString& wsText,
                            int32_t nIndex,
                            FX_BOOL bSaveValue = FALSE);
  void GetChoiceListItems(CFX_WideStringArray& wsTextArray,
                          FX_BOOL bSaveValue = FALSE);
  int32_t CountSelectedItems();
  int32_t GetSelectedItem(int32_t nIndex = 0);
  void GetSelectedItems(CFX_Int32Array& iSelArray);
  void GetSelectedItemsValue(CFX_WideStringArray& wsSelTextArray);
  FX_BOOL GetItemState(int32_t nIndex);
  void SetItemState(int32_t nIndex,
                    FX_BOOL bSelected,
                    FX_BOOL bNotify = FALSE,
                    FX_BOOL bScriptModify = FALSE,
                    FX_BOOL bSyncData = TRUE);
  void SetSelectdItems(CFX_Int32Array& iSelArray,
                       FX_BOOL bNotify = FALSE,
                       FX_BOOL bScriptModify = FALSE,
                       FX_BOOL bSyncData = TRUE);
  void ClearAllSelections();
  void InsertItem(const CFX_WideString& wsLabel,
                  const CFX_WideString& wsValue,
                  int32_t nIndex = -1,
                  FX_BOOL bNotify = FALSE);
  void GetItemLabel(const CFX_WideStringC& wsValue, CFX_WideString& wsLabel);
  void GetItemValue(const CFX_WideStringC& wsLabel, CFX_WideString& wsValue);
  FX_BOOL DeleteItem(int32_t nIndex,
                     FX_BOOL bNotify = FALSE,
                     FX_BOOL bScriptModify = FALSE,
                     FX_BOOL bSyncData = TRUE);
  int32_t GetHorizontalScrollPolicy();
  int32_t GetNumberOfCells();
  FX_BOOL IsDateTimeEditUsePicker();
  FX_BOOL SetValue(const CFX_WideString& wsValue, XFA_VALUEPICTURE eValueType);
  FX_BOOL GetPictureContent(CFX_WideString& wsPicture,
                            XFA_VALUEPICTURE ePicture);
  IFX_Locale* GetLocal();
  FX_BOOL GetValue(CFX_WideString& wsValue, XFA_VALUEPICTURE eValueType);
  FX_BOOL GetNormalizeDataValue(const CFX_WideStringC& wsValue,
                                CFX_WideString& wsNormalizeValue);
  FX_BOOL GetFormatDataValue(const CFX_WideStringC& wsValue,
                             CFX_WideString& wsFormatedValue);
  void NormalizeNumStr(const CFX_WideString& wsValue, CFX_WideString& wsOutput);
  CFX_WideString GetBarcodeType();
  FX_BOOL GetBarcodeAttribute_CharEncoding(int32_t& val);
  FX_BOOL GetBarcodeAttribute_Checksum(int32_t& val);
  FX_BOOL GetBarcodeAttribute_DataLength(int32_t& val);
  FX_BOOL GetBarcodeAttribute_StartChar(FX_CHAR& val);
  FX_BOOL GetBarcodeAttribute_EndChar(FX_CHAR& val);
  FX_BOOL GetBarcodeAttribute_ECLevel(int32_t& val);
  FX_BOOL GetBarcodeAttribute_ModuleWidth(int32_t& val);
  FX_BOOL GetBarcodeAttribute_ModuleHeight(int32_t& val);
  FX_BOOL GetBarcodeAttribute_PrintChecksum(FX_BOOL& val);
  FX_BOOL GetBarcodeAttribute_TextLocation(int32_t& val);
  FX_BOOL GetBarcodeAttribute_Truncate(FX_BOOL& val);
  FX_BOOL GetBarcodeAttribute_WideNarrowRatio(FX_FLOAT& val);
  void GetPasswordChar(CFX_WideString& wsPassWord);
  FX_BOOL IsAllowRichText();
  FX_BOOL IsMultiLine();
  int32_t GetVerticalScrollPolicy();
  int32_t GetMaxChars(XFA_ELEMENT& eType);
  FX_BOOL GetFracDigits(int32_t& iFracDigits);
  FX_BOOL GetLeadDigits(int32_t& iLeadDigits);
  CXFA_Filter GetFilter(FX_BOOL bModified = FALSE);
  CXFA_Manifest GetManifest(FX_BOOL bModified = FALSE);

  FX_BOOL m_bIsNull;
  FX_BOOL m_bPreNull;

 protected:
  void SyncValue(const CFX_WideString& wsValue, FX_BOOL bNotify);
  void InsertListTextItem(CXFA_Node* pItems,
                          const CFX_WideStringC& wsText,
                          int32_t nIndex = -1);
  void FormatNumStr(const CFX_WideString& wsValue,
                    IFX_Locale* pLocale,
                    CFX_WideString& wsOutput);

  CXFA_Node* m_pUiChildNode;
  XFA_ELEMENT m_eUIType;
};

class CXFA_Occur : public CXFA_Data {
 public:
  explicit CXFA_Occur(CXFA_Node* pNode);

  int32_t GetMax();
  int32_t GetMin();
  int32_t GetInitial();
  FX_BOOL GetOccurInfo(int32_t& iMin, int32_t& iMax, int32_t& iInit);
  void SetMax(int32_t iMax);
  void SetMin(int32_t iMin);
};

class CXFA_Filter : public CXFA_Data {
 public:
  explicit CXFA_Filter(CXFA_Node* pNode) : CXFA_Data(pNode) {}

  CFX_WideString GetFilterString(XFA_ATTRIBUTE eAttribute);
  XFA_ATTRIBUTEENUM GetAppearanceFilterType();
  CFX_WideString GetAppearanceFilterContent();
  XFA_ATTRIBUTEENUM GetCertificatesCredentialServerPolicy();
  CFX_WideString GetCertificatesURL();
  CFX_WideString GetCertificatesURLPolicy();
  CXFA_WrapCertificate GetCertificatesEncryption(FX_BOOL bModified = FALSE);
  CXFA_WrapCertificate GetCertificatesIssuers(FX_BOOL bModified = FALSE);
  CFX_WideString GetCertificatesKeyUsageString(XFA_ATTRIBUTE eAttribute);
  CXFA_Oids GetCertificatesOids();
  CXFA_WrapCertificate GetCertificatesSigning(FX_BOOL bModified = FALSE);
  CXFA_DigestMethods GetDigestMethods(FX_BOOL bModified = FALSE);
  CXFA_Encodings GetEncodings(FX_BOOL bModified = FALSE);
  CXFA_EncryptionMethods GetEncryptionMethods(FX_BOOL bModified = FALSE);
  XFA_ATTRIBUTEENUM GetHandlerType();
  CFX_WideString GetHandlerContent();
  XFA_ATTRIBUTEENUM GetlockDocumentType();
  CFX_WideString GetlockDocumentContent();
  int32_t GetMDPPermissions();
  XFA_ATTRIBUTEENUM GetMDPSignatureType();
  CXFA_Reasons GetReasons(FX_BOOL bModified = FALSE);
  CFX_WideString GetTimeStampServer();
  XFA_ATTRIBUTEENUM GetTimeStampType();
};

class CXFA_Certificate : public CXFA_Data {
 public:
  explicit CXFA_Certificate(CXFA_Node* pNode) : CXFA_Data(pNode) {}

  CFX_WideString GetCertificateName();
  CFX_WideString GetCertificateContent();
};

class CXFA_WrapCertificate : public CXFA_Data {
 public:
  explicit CXFA_WrapCertificate(CXFA_Node* pNode) : CXFA_Data(pNode) {}

  XFA_ATTRIBUTEENUM GetType();
  int32_t CountCertificates();
  CXFA_Certificate GetCertificate(int32_t nIndex);
};

class CXFA_Oids : public CXFA_Data {
 public:
  explicit CXFA_Oids(CXFA_Node* pNode) : CXFA_Data(pNode) {}

  XFA_ATTRIBUTEENUM GetOidsType();
  int32_t CountOids();
  CFX_WideString GetOidContent(int32_t nIndex);
};

class CXFA_SubjectDNs : public CXFA_Data {
 public:
  explicit CXFA_SubjectDNs(CXFA_Node* pNode) : CXFA_Data(pNode) {}

  XFA_ATTRIBUTEENUM GetSubjectDNsType();
  int32_t CountSubjectDNs();
  CFX_WideString GetSubjectDNString(int32_t nIndex, XFA_ATTRIBUTE eAttribute);
  CFX_WideString GetSubjectDNContent(int32_t nIndex);
};

class CXFA_DigestMethods : public CXFA_Data {
 public:
  explicit CXFA_DigestMethods(CXFA_Node* pNode) : CXFA_Data(pNode) {}

  XFA_ATTRIBUTEENUM GetDigestMethodsType();
  int32_t CountDigestMethods();
  CFX_WideString GetDigestMethodContent(int32_t nIndex);
};

class CXFA_Encodings : public CXFA_Data {
 public:
  explicit CXFA_Encodings(CXFA_Node* pNode) : CXFA_Data(pNode) {}

  XFA_ATTRIBUTEENUM GetEncodingsType();
  int32_t CountEncodings();
  CFX_WideString GetEncodingContent(int32_t nIndex);
};

class CXFA_EncryptionMethods : public CXFA_Data {
 public:
  explicit CXFA_EncryptionMethods(CXFA_Node* pNode) : CXFA_Data(pNode) {}
  XFA_ATTRIBUTEENUM GetEncryptionMethodsType();
  int32_t CountEncryptionMethods();
  CFX_WideString GetEncryptionMethodContent(int32_t nIndex);
};

class CXFA_Reasons : public CXFA_Data {
 public:
  explicit CXFA_Reasons(CXFA_Node* pNode) : CXFA_Data(pNode) {}

  XFA_ATTRIBUTEENUM GetReasonsType();
  int32_t CountReasons();
  CFX_WideString GetReasonContent(int32_t nIndex);
};

class CXFA_Manifest : public CXFA_Data {
 public:
  explicit CXFA_Manifest(CXFA_Node* pNode) : CXFA_Data(pNode) {}

  XFA_ATTRIBUTEENUM GetAction();
  int32_t CountReives();
  CFX_WideString GetRefContent(int32_t nIndex);
};

#endif  // XFA_INCLUDE_FXFA_FXFA_OBJECTACC_H_
