1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Copyright 2014 PDFium Authors. All rights reserved. 2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Use of this source code is governed by a BSD-style license that can be 3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// found in the LICENSE file. 4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/fpdfdoc/fpdf_doc.h" 8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/fxcrt/fx_xml.h" 9ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_WideString GetFullName(CPDF_Dictionary* pFieldDict); 10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid InitInterFormDict(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument); 11ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_DWORD CountInterFormFonts(CPDF_Dictionary* pFormDict); 12ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font* GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, FX_DWORD index, CFX_ByteString& csNameTag); 13ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font* GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csNameTag); 14ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font* GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csFontName, CFX_ByteString& csNameTag); 15ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font* GetNativeInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, FX_BYTE charSet, CFX_ByteString& csNameTag); 16ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font* GetNativeInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString& csNameTag); 17ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL FindInterFormFont(CPDF_Dictionary* pFormDict, const CPDF_Font* pFont, CFX_ByteString& csNameTag); 18ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL FindInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csFontName, CPDF_Font*& pFont, CFX_ByteString& csNameTag); 19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid AddInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, const CPDF_Font* pFont, CFX_ByteString& csNameTag); 20ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font* AddNativeInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, FX_BYTE charSet, CFX_ByteString& csNameTag); 21ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font* AddNativeInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, CFX_ByteString& csNameTag); 22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid RemoveInterFormFont(CPDF_Dictionary* pFormDict, const CPDF_Font* pFont); 23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid RemoveInterFormFont(CPDF_Dictionary* pFormDict, CFX_ByteString csNameTag); 24ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font* GetDefaultInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument); 25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid SetDefaultInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, const CPDF_Font* pFont); 26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid SaveCheckedFieldStatus(CPDF_FormField* pField, CFX_ByteArray& statusArray); 27ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL NeedPDFEncodeForFieldFullName(const CFX_WideString& csFieldName); 28ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL NeedPDFEncodeForFieldTree(CPDF_Dictionary* pFieldDict, int nLevel = 0); 29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid EncodeFieldName(const CFX_WideString& csName, CFX_ByteString& csT); 30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid UpdateEncodeFieldName(CPDF_Dictionary* pFieldDict, int nLevel = 0); 31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovconst int nMaxRecursion = 32; 32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass _CFieldNameExtractor : public CFX_Object 33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic: 35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov _CFieldNameExtractor(const CFX_WideString& full_name) 36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pStart = full_name; 38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pEnd = m_pStart + full_name.GetLength(); 39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pCur = m_pStart; 40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void GetNext(FX_LPCWSTR &pSubName, FX_STRSIZE& size) 42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pSubName = m_pCur; 44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (m_pCur < m_pEnd && m_pCur[0] != L'.') { 45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pCur++; 46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov size = (FX_STRSIZE)(m_pCur - pSubName); 48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pCur < m_pEnd && m_pCur[0] == L'.') { 49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pCur++; 50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovprotected: 53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPCWSTR m_pStart; 54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPCWSTR m_pEnd; 55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPCWSTR m_pCur; 56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CFieldTree : public CFX_Object 58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic: 60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov struct _Node : public CFX_Object { 61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov _Node *parent; 62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_PtrArray children; 63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_WideString short_name; 64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_FormField *field_ptr; 65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int CountFields(int nLevel = 0) 66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nLevel > nMaxRecursion) { 68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (field_ptr) { 71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 1; 72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int count = 0; 74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int i = 0; i < children.GetSize(); i ++) { 75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov count += ((_Node *)children.GetAt(i))->CountFields(nLevel + 1); 76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return count; 78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_FormField* GetField(int* fields_to_go) 80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (field_ptr) { 82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (*fields_to_go == 0) { 83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return field_ptr; 84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov --*fields_to_go; 86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int i = 0; i < children.GetSize(); i++) { 89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov _Node *pNode = (_Node *)children.GetAt(i); 90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_FormField* pField = pNode->GetField(fields_to_go); 91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pField) { 92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pField; 93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_FormField* GetField(int index) 98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int fields_to_go = index; 100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return GetField(&fields_to_go); 101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov }; 103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFieldTree(); 104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ~CFieldTree(); 105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void SetField(const CFX_WideString &full_name, CPDF_FormField *field_ptr); 106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_FormField *GetField(const CFX_WideString &full_name); 107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_FormField *RemoveField(const CFX_WideString &full_name); 108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void RemoveAll(); 109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov _Node *FindNode(const CFX_WideString &full_name); 110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov _Node * AddChild(_Node *pParent, const CFX_WideString &short_name, CPDF_FormField *field_ptr); 111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void RemoveNode(_Node *pNode, int nLevel = 0); 112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov _Node *_Lookup(_Node *pParent, const CFX_WideString &short_name); 113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov _Node m_Root; 114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 115ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFieldTree::CFieldTree() 116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Root.parent = NULL; 118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Root.field_ptr = NULL; 119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 120ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFieldTree::~CFieldTree() 121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov RemoveAll(); 123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 124ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFieldTree::_Node *CFieldTree::AddChild(_Node *pParent, const CFX_WideString &short_name, CPDF_FormField *field_ptr) 125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pParent == NULL) { 127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov _Node *pNode = FX_NEW _Node; 130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pNode == NULL) { 131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pNode->parent = pParent; 134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pNode->short_name = short_name; 135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pNode->field_ptr = field_ptr; 136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pParent->children.Add(pNode); 137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pNode; 138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CFieldTree::RemoveNode(_Node *pNode, int nLevel) 140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pNode == NULL) { 142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return ; 143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nLevel > nMaxRecursion) { 145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete pNode; 146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return ; 147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_PtrArray& ptr_array = pNode->children; 149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int i = 0; i < ptr_array.GetSize(); i ++) { 150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov _Node *pChild = (_Node *)ptr_array[i]; 151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov RemoveNode(pChild, nLevel + 1); 152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete pNode; 154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 155ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFieldTree::_Node *CFieldTree::_Lookup(_Node *pParent, const CFX_WideString &short_name) 156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pParent == NULL) { 158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_PtrArray& ptr_array = pParent->children; 161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int i = 0; i < ptr_array.GetSize(); i ++) { 162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov _Node *pNode = (_Node *)ptr_array[i]; 163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pNode->short_name.GetLength() == short_name.GetLength() && 164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_memcmp32((FX_LPCWSTR)pNode->short_name, (FX_LPCWSTR)short_name, short_name.GetLength()*sizeof(FX_WCHAR)) == 0) { 165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pNode; 166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CFieldTree::RemoveAll() 171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_PtrArray& ptr_array = m_Root.children; 173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int i = 0; i < ptr_array.GetSize(); i ++) { 174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov _Node *pNode = (_Node *)ptr_array[i]; 175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov RemoveNode(pNode); 176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CFieldTree::SetField(const CFX_WideString &full_name, CPDF_FormField *field_ptr) 179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (full_name == L"") { 181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov _CFieldNameExtractor name_extractor(full_name); 184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPCWSTR pName; 185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_STRSIZE nLength; 186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov name_extractor.GetNext(pName, nLength); 187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov _Node *pNode = &m_Root, *pLast = NULL; 188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (nLength > 0) { 189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pLast = pNode; 190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_WideString name = CFX_WideString(pName, nLength); 191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pNode = _Lookup(pLast, name); 192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pNode == NULL) { 193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pNode = AddChild(pLast, name, NULL); 194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov name_extractor.GetNext(pName, nLength); 196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pNode != &m_Root) { 198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pNode->field_ptr = field_ptr; 199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 201ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_FormField *CFieldTree::GetField(const CFX_WideString &full_name) 202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (full_name == L"") { 204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov _CFieldNameExtractor name_extractor(full_name); 207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPCWSTR pName; 208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_STRSIZE nLength; 209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov name_extractor.GetNext(pName, nLength); 210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov _Node *pNode = &m_Root, *pLast = NULL; 211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (nLength > 0 && pNode) { 212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pLast = pNode; 213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_WideString name = CFX_WideString(pName, nLength); 214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pNode = _Lookup(pLast, name); 215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov name_extractor.GetNext(pName, nLength); 216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pNode ? pNode->field_ptr : NULL; 218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 219ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_FormField *CFieldTree::RemoveField(const CFX_WideString & full_name) 220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (full_name == L"") { 222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov _CFieldNameExtractor name_extractor(full_name); 225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPCWSTR pName; 226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_STRSIZE nLength; 227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov name_extractor.GetNext(pName, nLength); 228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov _Node *pNode = &m_Root, *pLast = NULL; 229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (nLength > 0 && pNode) { 230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pLast = pNode; 231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_WideString name = CFX_WideString(pName, nLength); 232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pNode = _Lookup(pLast, name); 233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov name_extractor.GetNext(pName, nLength); 234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pNode && pNode != &m_Root) { 236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_PtrArray& ptr_array = pLast->children; 237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int i = 0; i < ptr_array.GetSize(); i ++) { 238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pNode == (_Node *)ptr_array[i]) { 239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ptr_array.RemoveAt(i); 240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_FormField *pField = pNode->field_ptr; 244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov RemoveNode(pNode); 245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pField; 246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 249ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFieldTree::_Node *CFieldTree::FindNode(const CFX_WideString& full_name) 250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (full_name == L"") { 252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov _CFieldNameExtractor name_extractor(full_name); 255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPCWSTR pName; 256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_STRSIZE nLength; 257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov name_extractor.GetNext(pName, nLength); 258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov _Node *pNode = &m_Root, *pLast = NULL; 259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (nLength > 0 && pNode) { 260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pLast = pNode; 261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_WideString name = CFX_WideString(pName, nLength); 262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pNode = _Lookup(pLast, name); 263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov name_extractor.GetNext(pName, nLength); 264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pNode; 266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 267ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_InterForm::CPDF_InterForm(CPDF_Document* pDocument, FX_BOOL bGenerateAP) : CFX_PrivateData() 268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pDocument = pDocument; 270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bGenerateAP = bGenerateAP; 271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pFormNotify = NULL; 272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bUpdated = FALSE; 273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pFieldTree = FX_NEW CFieldTree; 274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary* pRoot = m_pDocument->GetRoot(); 275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pFormDict = pRoot->GetDict("AcroForm"); 276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pFormDict == NULL) { 277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Array* pFields = m_pFormDict->GetArray("Fields"); 280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pFields == NULL) { 281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int count = pFields->GetCount(); 284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int i = 0; i < count; i ++) { 285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov LoadField(pFields->GetDict(i)); 286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 288ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_InterForm::~CPDF_InterForm() 289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_POSITION pos = m_ControlMap.GetStartPosition(); 291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (pos) { 292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPVOID key, value; 293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_ControlMap.GetNextAssoc(pos, key, value); 294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete (CPDF_FormControl*)value; 295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pFieldTree != NULL) { 297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int nCount = m_pFieldTree->m_Root.CountFields(); 298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int i = 0; i < nCount; i++) { 299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_FormField *pField = m_pFieldTree->m_Root.GetField(i); 300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete pField; 301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete m_pFieldTree; 303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 305ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_InterForm::m_bUpdateAP = TRUE; 306ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_InterForm::UpdatingAPEnabled() 307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_bUpdateAP; 309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_InterForm::EnableUpdateAP(FX_BOOL bUpdateAP) 311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bUpdateAP = bUpdateAP; 313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 314ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_ByteString CPDF_InterForm::GenerateNewResourceName(const CPDF_Dictionary* pResDict, FX_LPCSTR csType, int iMinLen, FX_LPCSTR csPrefix) 315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString csStr = csPrefix; 317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString csBType = csType; 318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (csStr.IsEmpty()) { 319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (csBType == "ExtGState") { 320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov csStr = "GS"; 321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (csBType == "ColorSpace") { 322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov csStr = "CS"; 323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (csBType == "Font") { 324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov csStr = "ZiTi"; 325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov csStr = "Res"; 327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString csTmp = csStr; 330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int iCount = csStr.GetLength(); 331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int m = 0; 332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (iMinLen > 0) { 333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov csTmp = ""; 334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (m < iMinLen && m < iCount) { 335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov csTmp += csStr[m ++]; 336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (m < iMinLen) { 338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov csTmp += '0' + m % 10; 339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m ++; 340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m = iCount; 343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pResDict == NULL) { 345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return csTmp; 346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary* pDict = pResDict->GetDict(csType); 348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pDict == NULL) { 349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return csTmp; 350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int num = 0; 352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString bsNum; 353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (TRUE) { 354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pDict->KeyExist(csTmp + bsNum)) { 355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return csTmp + bsNum; 356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m < iCount) { 358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov csTmp += csStr[m ++]; 359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bsNum.Format("%d", num++); 361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m ++; 363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return csTmp; 365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ 367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtypedef struct _PDF_FONTDATA { 368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bFind; 369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov LOGFONTA lf; 370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} PDF_FONTDATA, FAR* LPDF_FONTDATA; 371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic int CALLBACK EnumFontFamExProc( ENUMLOGFONTEXA *lpelfe, 372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov NEWTEXTMETRICEX *lpntme, 373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov DWORD FontType, 374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov LPARAM lParam 375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (FontType != 0x004 || strchr(lpelfe->elfLogFont.lfFaceName, '@') != NULL) { 378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 1; 379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov LPDF_FONTDATA pData = (LPDF_FONTDATA)lParam; 381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memcpy(&pData->lf, &lpelfe->elfLogFont, sizeof(LOGFONTA)); 382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pData->bFind = TRUE; 383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic FX_BOOL RetrieveSpecificFont(LOGFONTA& lf) 387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PDF_FONTDATA fd; 389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memset(&fd, 0, sizeof(PDF_FONTDATA)); 390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov HDC hDC = ::GetDC(NULL); 391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov EnumFontFamiliesExA(hDC, &lf, (FONTENUMPROCA)EnumFontFamExProc, (LPARAM)&fd, 0); 392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ::ReleaseDC(NULL, hDC); 393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (fd.bFind) { 394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memcpy(&lf, &fd.lf, sizeof(LOGFONTA)); 395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return fd.bFind; 397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic FX_BOOL RetrieveSpecificFont(FX_BYTE charSet, FX_BYTE pitchAndFamily, LPCSTR pcsFontName, LOGFONTA& lf) 399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memset(&lf, 0, sizeof(LOGFONTA)); 401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov lf.lfCharSet = charSet; 402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov lf.lfPitchAndFamily = pitchAndFamily; 403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pcsFontName != NULL) { 404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov strcpy(lf.lfFaceName, pcsFontName); 405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return RetrieveSpecificFont(lf); 407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic FX_BOOL RetrieveStockFont(int iFontObject, FX_BYTE charSet, LOGFONTA& lf) 409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov HFONT hFont = (HFONT)::GetStockObject(iFontObject); 411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (hFont != NULL) { 412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memset(&lf, 0, sizeof(LOGFONTA)); 413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int iRet = ::GetObject(hFont, sizeof(LOGFONTA), &lf); 414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (iRet > 0 && (lf.lfCharSet == charSet || charSet == 255)) { 415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return RetrieveSpecificFont(lf); 416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 421ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font* CPDF_InterForm::AddSystemDefaultFont(const CPDF_Document* pDocument) 422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pDocument == NULL) { 424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Font* pFont = NULL; 427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ 428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov LOGFONTA lf; 429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bRet; 430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bRet = RetrieveStockFont(DEFAULT_GUI_FONT, 255, lf); 431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!bRet) { 432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bRet = RetrieveStockFont(SYSTEM_FONT, 255, lf); 433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bRet) { 435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pFont = ((CPDF_Document*)pDocument)->AddWindowsFont(&lf, FALSE, TRUE); 436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pFont; 439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 440ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font* CPDF_InterForm::AddSystemFont(const CPDF_Document* pDocument, CFX_ByteString csFontName, FX_BYTE iCharSet) 441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pDocument == NULL || csFontName.IsEmpty()) { 443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ 446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (iCharSet == 1) { 447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov iCharSet = GetNativeCharSet(); 448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov HFONT hFont = ::CreateFontA(0, 0, 0, 0, 0, 0, 0, 0, iCharSet, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, (FX_LPCSTR)csFontName); 450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (hFont != NULL) { 451ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov LOGFONTA lf; 452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memset(&lf, 0, sizeof(LOGFONTA)); 453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ::GetObjectA(hFont, sizeof(LOGFONTA), &lf); 454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ::DeleteObject(hFont); 455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (strlen(lf.lfFaceName) > 0) { 456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return ((CPDF_Document*)pDocument)->AddWindowsFont(&lf, FALSE, TRUE); 457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 462ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font* CPDF_InterForm::AddSystemFont(const CPDF_Document* pDocument, CFX_WideString csFontName, FX_BYTE iCharSet) 463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pDocument == NULL || csFontName.IsEmpty()) { 465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ 468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (iCharSet == 1) { 469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov iCharSet = GetNativeCharSet(); 470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov HFONT hFont = ::CreateFontW(0, 0, 0, 0, 0, 0, 0, 0, iCharSet, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, csFontName); 472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (hFont != NULL) { 473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov LOGFONTA lf; 474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memset(&lf, 0, sizeof(LOGFONTA)); 475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ::GetObject(hFont, sizeof(LOGFONTA), &lf); 476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ::DeleteObject(hFont); 477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (strlen(lf.lfFaceName) > 0) { 478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return ((CPDF_Document*)pDocument)->AddWindowsFont(&lf, FALSE, TRUE); 479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 484ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font* CPDF_InterForm::AddStandardFont(const CPDF_Document* pDocument, CFX_ByteString csFontName) 485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pDocument == NULL || csFontName.IsEmpty()) { 487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Font* pFont = NULL; 490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (csFontName == "ZapfDingbats") { 491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pFont = ((CPDF_Document*)pDocument)->AddStandardFont(csFontName, NULL); 492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_FontEncoding encoding(PDFFONT_ENCODING_WINANSI); 494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pFont = ((CPDF_Document*)pDocument)->AddStandardFont(csFontName, &encoding); 495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pFont; 497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 498ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_ByteString CPDF_InterForm::GetNativeFont(FX_BYTE charSet, FX_LPVOID pLogFont) 499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString csFontName; 501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ 502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov LOGFONTA lf; 503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bRet; 504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (charSet == ANSI_CHARSET) { 505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov csFontName = "Helvetica"; 506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return csFontName; 507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 508ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bRet = FALSE; 509ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (charSet == SHIFTJIS_CHARSET) { 510ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, "MS Mincho", lf); 511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (charSet == GB2312_CHARSET) { 512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, "SimSun", lf); 513ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (charSet == CHINESEBIG5_CHARSET) { 514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, "MingLiU", lf); 515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 516ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!bRet) { 517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, "Arial Unicode MS", lf); 518ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 519ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!bRet) { 520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, "Microsoft Sans Serif", lf); 521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!bRet) { 523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, NULL, lf); 524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bRet) { 526ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pLogFont != NULL) { 527ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memcpy(pLogFont, &lf, sizeof(LOGFONTA)); 528ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov csFontName = lf.lfFaceName; 530ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return csFontName; 531ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 532ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 533ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return csFontName; 534ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 535ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_ByteString CPDF_InterForm::GetNativeFont(FX_LPVOID pLogFont) 536ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 537ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ 538ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BYTE charSet = GetNativeCharSet(); 539ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return GetNativeFont(charSet, pLogFont); 540ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else 541ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return CFX_ByteString(); 542ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 543ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 544ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BYTE CPDF_InterForm::GetNativeCharSet() 545ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 546ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ 547ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BYTE charSet = ANSI_CHARSET; 548ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov UINT iCodePage = ::GetACP(); 549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov switch (iCodePage) { 550ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 932: 551ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov charSet = SHIFTJIS_CHARSET; 552ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 553ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 936: 554ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov charSet = GB2312_CHARSET; 555ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 556ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 950: 557ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov charSet = CHINESEBIG5_CHARSET; 558ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 559ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 1252: 560ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov charSet = ANSI_CHARSET; 561ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 562ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 874: 563ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov charSet = THAI_CHARSET; 564ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 565ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 949: 566ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov charSet = HANGUL_CHARSET; 567ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 568ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 1200: 569ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov charSet = ANSI_CHARSET; 570ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 571ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 1250: 572ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov charSet = EASTEUROPE_CHARSET; 573ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 574ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 1251: 575ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov charSet = RUSSIAN_CHARSET; 576ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 577ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 1253: 578ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov charSet = GREEK_CHARSET; 579ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 580ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 1254: 581ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov charSet = TURKISH_CHARSET; 582ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 583ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 1255: 584ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov charSet = HEBREW_CHARSET; 585ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 586ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 1256: 587ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov charSet = ARABIC_CHARSET; 588ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 589ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 1257: 590ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov charSet = BALTIC_CHARSET; 591ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 592ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 1258: 593ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov charSet = VIETNAMESE_CHARSET; 594ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 595ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 1361: 596ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov charSet = JOHAB_CHARSET; 597ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 598ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 599ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return charSet; 600ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else 601ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 602ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 603ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 604ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font* CPDF_InterForm::AddNativeFont(FX_BYTE charSet, const CPDF_Document* pDocument) 605ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 606ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pDocument == NULL) { 607ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 608ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 609ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Font* pFont = NULL; 610ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ 611ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov LOGFONTA lf; 612ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString csFontName = GetNativeFont(charSet, &lf); 613ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!csFontName.IsEmpty()) { 614ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (csFontName == "Helvetica") { 615ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pFont = AddStandardFont(pDocument, csFontName); 616ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 617ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pFont = ((CPDF_Document*)pDocument)->AddWindowsFont(&lf, FALSE, TRUE); 618ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 619ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 620ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 621ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pFont; 622ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 623ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font* CPDF_InterForm::AddNativeFont(const CPDF_Document* pDocument) 624ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 625ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pDocument == NULL) { 626ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 627ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 628ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Font* pFont = NULL; 629ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BYTE charSet = GetNativeCharSet(); 630ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pFont = AddNativeFont(charSet, pDocument); 631ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pFont; 632ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 633ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_InterForm::ValidateFieldName(CFX_WideString& csNewFieldName, int iType, const CPDF_FormField* pExcludedField, const CPDF_FormControl* pExcludedControl) 634ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 635ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (csNewFieldName.IsEmpty()) { 636ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 637ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 638ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int iPos = 0; 639ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int iLength = csNewFieldName.GetLength(); 640ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_WideString csSub; 641ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (TRUE) { 642ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (iPos < iLength && (csNewFieldName[iPos] == L'.' || csNewFieldName[iPos] == L' ')) { 643ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov iPos ++; 644ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 645ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (iPos < iLength && !csSub.IsEmpty()) { 646ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov csSub += L'.'; 647ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 648ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (iPos < iLength && csNewFieldName[iPos] != L'.') { 649ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov csSub += csNewFieldName[iPos ++]; 650ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 651ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int i = csSub.GetLength() - 1; i > -1; i --) { 652ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (csSub[i] == L' ' || csSub[i] == L'.') { 653ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov csSub.SetAt(i, L'\0'); 654ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 655ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 656ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 657ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 658ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD dwCount = m_pFieldTree->m_Root.CountFields(); 659ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (FX_DWORD m = 0; m < dwCount; m ++) { 660ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(m); 661ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pField == NULL) { 662ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 663ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 664ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pField == pExcludedField) { 665ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pExcludedControl != NULL) { 666ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pField->CountControls() < 2) { 667ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 668ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 669ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 670ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 671ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 672ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 673ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_WideString csFullName = pField->GetFullName(); 674ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int iRet = CompareFieldName(csSub, csFullName); 675ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (iRet == 1) { 676ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pField->GetFieldType() != iType) { 677ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 678ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 679ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (iRet == 2 && csSub == csNewFieldName) { 680ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (csFullName[iPos] == L'.') { 681ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 682ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 683ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (iRet == 3 && csSub == csNewFieldName) { 684ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (csNewFieldName[csFullName.GetLength()] == L'.') { 685ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 686ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 687ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 688ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 689ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (iPos >= iLength) { 690ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 691ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 692ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 693ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (csSub.IsEmpty()) { 694ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 695ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 696ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov csNewFieldName = csSub; 697ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 698ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 699ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_InterForm::ValidateFieldName(CFX_WideString& csNewFieldName, int iType) 700ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 701ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return ValidateFieldName(csNewFieldName, iType, NULL, NULL); 702ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 703ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_InterForm::ValidateFieldName(const CPDF_FormField* pField, CFX_WideString& csNewFieldName) 704ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 705ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pField == NULL || csNewFieldName.IsEmpty()) { 706ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 707ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 708ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return ValidateFieldName(csNewFieldName, ((CPDF_FormField*)pField)->GetFieldType(), pField, NULL); 709ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 710ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_InterForm::ValidateFieldName(const CPDF_FormControl* pControl, CFX_WideString& csNewFieldName) 711ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 712ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pControl == NULL || csNewFieldName.IsEmpty()) { 713ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 714ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 715ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_FormField* pField = ((CPDF_FormControl*)pControl)->GetField(); 716ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return ValidateFieldName(csNewFieldName, pField->GetFieldType(), pField, pControl); 717ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 718ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint CPDF_InterForm::CompareFieldName(const CFX_ByteString& name1, const CFX_ByteString& name2) 719ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 720ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPCSTR ptr1 = name1, ptr2 = name2; 721ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (name1.GetLength() != name2.GetLength()) { 722ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int i = 0; 723ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (ptr1[i] == ptr2[i]) { 724ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov i ++; 725ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 726ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (i == name1.GetLength()) { 727ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 2; 728ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 729ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (i == name2.GetLength()) { 730ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 3; 731ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 732ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 733ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 734ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return name1 == name2 ? 1 : 0; 735ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 736ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 737ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint CPDF_InterForm::CompareFieldName(const CFX_WideString& name1, const CFX_WideString& name2) 738ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 739ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPCWSTR ptr1 = name1, ptr2 = name2; 740ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (name1.GetLength() != name2.GetLength()) { 741ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int i = 0; 742ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (ptr1[i] == ptr2[i]) { 743ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov i ++; 744ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 745ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (i == name1.GetLength()) { 746ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 2; 747ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 748ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (i == name2.GetLength()) { 749ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 3; 750ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 751ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 752ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 753ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return name1 == name2 ? 1 : 0; 754ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 755ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 756ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_DWORD CPDF_InterForm::CountFields(const CFX_WideString &csFieldName) 757ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 758ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (csFieldName.IsEmpty()) { 759ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return (FX_DWORD)m_pFieldTree->m_Root.CountFields(); 760ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 761ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFieldTree::_Node *pNode = m_pFieldTree->FindNode(csFieldName); 762ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pNode == NULL) { 763ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 764ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 765ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pNode->CountFields(); 766ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 767ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_FormField* CPDF_InterForm::GetField(FX_DWORD index, const CFX_WideString &csFieldName) 768ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 769ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (csFieldName == L"") { 770ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_pFieldTree->m_Root.GetField(index); 771ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 772ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFieldTree::_Node *pNode = m_pFieldTree->FindNode(csFieldName); 773ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pNode == NULL) { 774ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 775ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 776ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pNode->GetField(index); 777ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 778ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_InterForm::GetAllFieldNames(CFX_WideStringArray& allFieldNames) 779ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 780ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov allFieldNames.RemoveAll(); 781ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int nCount = m_pFieldTree->m_Root.CountFields(); 782ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int i = 0; i < nCount; i ++) { 783ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_FormField *pField = m_pFieldTree->m_Root.GetField(i); 784ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pField) { 785ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_WideString full_name = GetFullName(pField->GetFieldDict()); 786ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov allFieldNames.Add(full_name); 787ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 788ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 789ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 790ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_InterForm::IsValidFormField(const void* pField) 791ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 792ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pField == NULL) { 793ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 794ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 795ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int nCount = m_pFieldTree->m_Root.CountFields(); 796ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int i = 0; i < nCount; i++) { 797ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_FormField *pFormField = m_pFieldTree->m_Root.GetField(i); 798ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pField == pFormField) { 799ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 800ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 801ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 802ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 803ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 804ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_FormField* CPDF_InterForm::GetFieldByDict(CPDF_Dictionary* pFieldDict) const 805ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 806ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pFieldDict == NULL) { 807ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 808ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 809ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_WideString csWName = GetFullName(pFieldDict); 810ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_pFieldTree->GetField(csWName); 811ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 812ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_DWORD CPDF_InterForm::CountControls(CFX_WideString csFieldName) 813ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 814ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (csFieldName.IsEmpty()) { 815ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return (FX_DWORD)m_ControlMap.GetCount(); 816ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 817ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_FormField *pField = m_pFieldTree->GetField(csFieldName); 818ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pField == NULL) { 819ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 820ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 821ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pField->m_ControlList.GetSize(); 822ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 823ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_FormControl* CPDF_InterForm::GetControl(FX_DWORD index, CFX_WideString csFieldName) 824ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 825ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_FormField *pField = m_pFieldTree->GetField(csFieldName); 826ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pField == NULL) { 827ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 828ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 829ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (index < (FX_DWORD)pField->m_ControlList.GetSize()) { 830ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return (CPDF_FormControl *)pField->m_ControlList.GetAt(index); 831ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 832ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 833ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 834ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_InterForm::IsValidFormControl(const void* pControl) 835ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 836ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pControl == NULL) { 837ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 838ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 839ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_POSITION pos = m_ControlMap.GetStartPosition(); 840ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (pos) { 841ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary* pWidgetDict = NULL; 842ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void* pFormControl = NULL; 843ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_ControlMap.GetNextAssoc(pos, (FX_LPVOID&)pWidgetDict, pFormControl); 844ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pControl == pFormControl) { 845ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 846ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 847ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 848ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 849ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 850ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint CPDF_InterForm::CountPageControls(CPDF_Page* pPage) const 851ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 852ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Array* pAnnotList = pPage->m_pFormDict->GetArray("Annots"); 853ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pAnnotList == NULL) { 854ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 855ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 856ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int count = 0; 857ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (FX_DWORD i = 0; i < pAnnotList->GetCount(); i ++) { 858ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary* pAnnot = pAnnotList->GetDict(i); 859ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pAnnot == NULL) { 860ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 861ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 862ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_FormControl* pControl; 863ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_ControlMap.Lookup(pAnnot, (FX_LPVOID&)pControl)) { 864ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 865ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 866ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov count ++; 867ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 868ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return count; 869ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 870ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_FormControl* CPDF_InterForm::GetPageControl(CPDF_Page* pPage, int index) const 871ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 872ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Array* pAnnotList = pPage->m_pFormDict->GetArray("Annots"); 873ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pAnnotList == NULL) { 874ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 875ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 876ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int count = 0; 877ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (FX_DWORD i = 0; i < pAnnotList->GetCount(); i ++) { 878ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary* pAnnot = pAnnotList->GetDict(i); 879ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pAnnot == NULL) { 880ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 881ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 882ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_FormControl* pControl; 883ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_ControlMap.Lookup(pAnnot, (FX_LPVOID&)pControl)) { 884ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 885ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 886ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (index == count) { 887ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pControl; 888ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 889ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov count ++; 890ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 891ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 892ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 893ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_FormControl* CPDF_InterForm::GetControlAtPoint(CPDF_Page* pPage, FX_FLOAT pdf_x, FX_FLOAT pdf_y) const 894ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 895ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Array* pAnnotList = pPage->m_pFormDict->GetArray("Annots"); 896ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pAnnotList == NULL) { 897ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 898ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 899ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (FX_DWORD i = pAnnotList->GetCount(); i > 0; i --) { 900ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary* pAnnot = pAnnotList->GetDict(i - 1); 901ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pAnnot == NULL) { 902ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 903ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 904ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_FormControl* pControl; 905ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_ControlMap.Lookup(pAnnot, (FX_LPVOID&)pControl)) { 906ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 907ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 908ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_FloatRect rect = pControl->GetRect(); 909ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (rect.Contains(pdf_x, pdf_y)) { 910ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pControl; 911ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 912ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 913ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 914ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 915ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_FormControl* CPDF_InterForm::GetControlByDict(CPDF_Dictionary* pWidgetDict) const 916ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 917ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_FormControl* pControl = NULL; 918ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_ControlMap.Lookup(pWidgetDict, (FX_LPVOID&)pControl); 919ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pControl; 920ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 921ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_DWORD CPDF_InterForm::CountInternalFields(const CFX_WideString& csFieldName) const 922ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 923ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pFormDict == NULL) { 924ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 925ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 926ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Array* pArray = m_pFormDict->GetArray("Fields"); 927ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pArray == NULL) { 928ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 929ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 930ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (csFieldName.IsEmpty()) { 931ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pArray->GetCount(); 932ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 933ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int iLength = csFieldName.GetLength(); 934ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int iPos = 0; 935ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary* pDict = NULL; 936ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (pArray != NULL) { 937ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_WideString csSub; 938ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (iPos < iLength && csFieldName[iPos] == L'.') { 939ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov iPos ++; 940ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 941ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (iPos < iLength && csFieldName[iPos] != L'.') { 942ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov csSub += csFieldName[iPos ++]; 943ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 944ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int iCount = pArray->GetCount(); 945ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bFind = FALSE; 946ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int i = 0; i < iCount; i ++) { 947ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pDict = pArray->GetDict(i); 948ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pDict == NULL) { 949ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 950ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 951ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_WideString csT = pDict->GetUnicodeText("T"); 952ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (csT == csSub) { 953ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bFind = TRUE; 954ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 955ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 956ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 957ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!bFind) { 958ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 959ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 960ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (iPos >= iLength) { 961ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 962ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 963ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pArray = pDict->GetArray("Kids"); 964ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 965ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pDict == NULL) { 966ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 967ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 968ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pArray = pDict->GetArray("Kids"); 969ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pArray == NULL) { 970ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 1; 971ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 972ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pArray->GetCount(); 973ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 974ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 975ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 976ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 977ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Dictionary* CPDF_InterForm::GetInternalField(FX_DWORD index, const CFX_WideString& csFieldName) const 978ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 979ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pFormDict == NULL) { 980ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 981ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 982ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Array* pArray = m_pFormDict->GetArray("Fields"); 983ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pArray == NULL) { 984ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 985ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 986ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (csFieldName.IsEmpty()) { 987ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pArray->GetDict(index); 988ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 989ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int iLength = csFieldName.GetLength(); 990ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int iPos = 0; 991ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary* pDict = NULL; 992ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (pArray != NULL) { 993ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_WideString csSub; 994ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (iPos < iLength && csFieldName[iPos] == L'.') { 995ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov iPos ++; 996ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 997ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (iPos < iLength && csFieldName[iPos] != L'.') { 998ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov csSub += csFieldName[iPos ++]; 999ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1000ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int iCount = pArray->GetCount(); 1001ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bFind = FALSE; 1002ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int i = 0; i < iCount; i ++) { 1003ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pDict = pArray->GetDict(i); 1004ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pDict == NULL) { 1005ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 1006ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1007ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_WideString csT = pDict->GetUnicodeText("T"); 1008ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (csT == csSub) { 1009ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bFind = TRUE; 1010ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 1011ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1012ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1013ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!bFind) { 1014ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 1015ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1016ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (iPos >= iLength) { 1017ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 1018ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1019ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pArray = pDict->GetArray("Kids"); 1020ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1021ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pDict == NULL) { 1022ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 1023ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1024ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pArray = pDict->GetArray("Kids"); 1025ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pArray == NULL) { 1026ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pDict; 1027ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1028ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pArray->GetDict(index); 1029ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1030ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1031ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1032ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1033ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_InterForm::NeedConstructAP() 1034ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1035ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pFormDict == NULL) { 1036ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 1037ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1038ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_pFormDict->GetBoolean("NeedAppearances"); 1039ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1040ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_InterForm::NeedConstructAP(FX_BOOL bNeedAP) 1041ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1042ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pFormDict == NULL) { 1043ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov InitInterFormDict(m_pFormDict, m_pDocument); 1044ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1045ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pFormDict->SetAtBoolean("NeedAppearances", bNeedAP); 1046ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bGenerateAP = bNeedAP; 1047ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1048ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint CPDF_InterForm::CountFieldsInCalculationOrder() 1049ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1050ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pFormDict == NULL) { 1051ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 1052ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1053ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Array* pArray = m_pFormDict->GetArray("CO"); 1054ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pArray == NULL) { 1055ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 1056ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1057ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pArray->GetCount(); 1058ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1059ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_FormField* CPDF_InterForm::GetFieldInCalculationOrder(int index) 1060ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1061ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pFormDict == NULL || index < 0) { 1062ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 1063ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1064ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Array* pArray = m_pFormDict->GetArray("CO"); 1065ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pArray == NULL) { 1066ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 1067ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1068ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object* pElement = pArray->GetElementValue(index); 1069ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pElement != NULL && pElement->GetType() == PDFOBJ_DICTIONARY) { 1070ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return GetFieldByDict((CPDF_Dictionary*)pElement); 1071ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1072ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 1073ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1074ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint CPDF_InterForm::FindFieldInCalculationOrder(const CPDF_FormField* pField) 1075ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1076ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pFormDict == NULL || pField == NULL) { 1077ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return -1; 1078ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1079ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Array* pArray = m_pFormDict->GetArray("CO"); 1080ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pArray == NULL) { 1081ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return -1; 1082ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1083ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) { 1084ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object* pElement = pArray->GetElementValue(i); 1085ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pElement == pField->m_pDict) { 1086ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return i; 1087ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1088ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1089ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return -1; 1090ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1091ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_DWORD CPDF_InterForm::CountFormFonts() 1092ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1093ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return CountInterFormFonts(m_pFormDict); 1094ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1095ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font* CPDF_InterForm::GetFormFont(FX_DWORD index, CFX_ByteString& csNameTag) 1096ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1097ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return GetInterFormFont(m_pFormDict, m_pDocument, index, csNameTag); 1098ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1099ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font* CPDF_InterForm::GetFormFont(CFX_ByteString csNameTag) 1100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return GetInterFormFont(m_pFormDict, m_pDocument, csNameTag); 1102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1103ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font* CPDF_InterForm::GetFormFont(CFX_ByteString csFontName, CFX_ByteString& csNameTag) 1104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return GetInterFormFont(m_pFormDict, m_pDocument, csFontName, csNameTag); 1106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1107ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font* CPDF_InterForm::GetNativeFormFont(FX_BYTE charSet, CFX_ByteString& csNameTag) 1108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return GetNativeInterFormFont(m_pFormDict, m_pDocument, charSet, csNameTag); 1110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1111ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font* CPDF_InterForm::GetNativeFormFont(CFX_ByteString& csNameTag) 1112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return GetNativeInterFormFont(m_pFormDict, m_pDocument, csNameTag); 1114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1115ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_InterForm::FindFormFont(const CPDF_Font* pFont, CFX_ByteString& csNameTag) 1116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FindInterFormFont(m_pFormDict, pFont, csNameTag); 1118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1119ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_InterForm::FindFormFont(CFX_ByteString csFontName, CPDF_Font*& pFont, CFX_ByteString& csNameTag) 1120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FindInterFormFont(m_pFormDict, m_pDocument, csFontName, pFont, csNameTag); 1122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_InterForm::AddFormFont(const CPDF_Font* pFont, CFX_ByteString& csNameTag) 1124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov AddInterFormFont(m_pFormDict, m_pDocument, pFont, csNameTag); 1126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bUpdated = TRUE; 1127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1128ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font* CPDF_InterForm::AddNativeFormFont(FX_BYTE charSet, CFX_ByteString& csNameTag) 1129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bUpdated = TRUE; 1131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return AddNativeInterFormFont(m_pFormDict, m_pDocument, charSet, csNameTag); 1132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1133ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font* CPDF_InterForm::AddNativeFormFont(CFX_ByteString& csNameTag) 1134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bUpdated = TRUE; 1136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return AddNativeInterFormFont(m_pFormDict, m_pDocument, csNameTag); 1137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_InterForm::RemoveFormFont(const CPDF_Font* pFont) 1139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bUpdated = TRUE; 1141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov RemoveInterFormFont(m_pFormDict, pFont); 1142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_InterForm::RemoveFormFont(CFX_ByteString csNameTag) 1144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bUpdated = TRUE; 1146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov RemoveInterFormFont(m_pFormDict, csNameTag); 1147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1148ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_DefaultAppearance CPDF_InterForm::GetDefaultAppearance() 1149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString csDA; 1151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pFormDict == NULL) { 1152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return csDA; 1153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov csDA = m_pFormDict->GetString("DA"); 1155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return csDA; 1156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1157ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font* CPDF_InterForm::GetDefaultFormFont() 1158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return GetDefaultInterFormFont(m_pFormDict, m_pDocument); 1160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint CPDF_InterForm::GetFormAlignment() 1162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pFormDict == NULL) { 1164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 1165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_pFormDict->GetInteger("Q", 0); 1167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1168ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_InterForm::ResetForm(const CFX_PtrArray& fields, FX_BOOL bIncludeOrExclude, FX_BOOL bNotify) 1169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bNotify && m_pFormNotify != NULL) { 1171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int iRet = m_pFormNotify->BeforeFormReset(this); 1172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (iRet < 0) { 1173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 1174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int nCount = m_pFieldTree->m_Root.CountFields(); 1177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int i = 0; i < nCount; i++) { 1178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i); 1179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pField == NULL) { 1180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 1181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bFind = FALSE; 1183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int iCount = fields.GetSize(); 1184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int i = 0; i < iCount; i ++) { 1185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pField == (CPDF_FormField*)fields[i]) { 1186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bFind = TRUE; 1187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 1188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((bIncludeOrExclude && bFind) || (!bIncludeOrExclude && !bFind)) { 1191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pField->ResetField(bNotify); 1192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bNotify && m_pFormNotify != NULL) { 1195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pFormNotify->AfterFormReset(this); 1196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 1198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1199ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_InterForm::ResetForm(FX_BOOL bNotify) 1200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bNotify && m_pFormNotify != NULL) { 1202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int iRet = m_pFormNotify->BeforeFormReset(this); 1203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (iRet < 0) { 1204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 1205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int nCount = m_pFieldTree->m_Root.CountFields(); 1208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int i = 0; i < nCount; i++) { 1209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i); 1210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pField == NULL) { 1211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 1212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pField->ResetField(bNotify); 1214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bNotify && m_pFormNotify != NULL) { 1216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pFormNotify->AfterFormReset(this); 1217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 1219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_InterForm::ReloadForm() 1221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_POSITION pos = m_ControlMap.GetStartPosition(); 1223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (pos) { 1224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary* pWidgetDict; 1225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_FormControl* pControl; 1226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_ControlMap.GetNextAssoc(pos, (FX_LPVOID&)pWidgetDict, (FX_LPVOID&)pControl); 1227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete pControl; 1228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_ControlMap.RemoveAll(); 1230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int nCount = m_pFieldTree->m_Root.CountFields(); 1231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int k = 0; k < nCount; k ++) { 1232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(k); 1233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete pField; 1234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pFieldTree->RemoveAll(); 1236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pFormDict == NULL) { 1237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Array* pFields = m_pFormDict->GetArray("Fields"); 1240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pFields == NULL) { 1241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int iCount = pFields->GetCount(); 1244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int i = 0; i < iCount; i ++) { 1245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov LoadField(pFields->GetDict(i)); 1246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_InterForm::LoadField(CPDF_Dictionary* pFieldDict, int nLevel) 1249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nLevel > nMaxRecursion) { 1251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pFieldDict == NULL) { 1254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD dwParentObjNum = pFieldDict->GetObjNum(); 1257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Array* pKids = pFieldDict->GetArray("Kids"); 1258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pKids) { 1259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov AddTerminalField(pFieldDict); 1260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary* pFirstKid = pKids->GetDict(0); 1263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pFirstKid == NULL) { 1264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pFirstKid->KeyExist("T") || pFirstKid->KeyExist("Kids")) { 1267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (FX_DWORD i = 0; i < pKids->GetCount(); i ++) { 1268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary * pChildDict = pKids->GetDict(i); 1269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pChildDict) { 1270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pChildDict->GetObjNum() != dwParentObjNum) { 1271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov LoadField(pChildDict, nLevel + 1); 1272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov AddTerminalField(pFieldDict); 1277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1279ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_InterForm::HasXFAForm() const 1280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_pFormDict && m_pFormDict->GetArray(FX_BSTRC("XFA")) != NULL; 1282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_InterForm::FixPageFields(const CPDF_Page* pPage) 1284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ASSERT(pPage != NULL); 1286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary* pPageDict = pPage->m_pFormDict; 1287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pPageDict == NULL) { 1288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Array* pAnnots = pPageDict->GetArray(FX_BSTRC("Annots")); 1291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pAnnots == NULL) { 1292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int iAnnotCount = pAnnots->GetCount(); 1295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int i = 0; i < iAnnotCount; i++) { 1296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary* pAnnot = pAnnots->GetDict(i); 1297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pAnnot != NULL && pAnnot->GetString(FX_BSTRC("Subtype")) == "Widget") { 1298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov LoadField(pAnnot); 1299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1302ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_FormField* CPDF_InterForm::AddTerminalField(const CPDF_Dictionary* pFieldDict) 1303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pFieldDict->KeyExist(FX_BSTRC("T"))) { 1305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 1306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary* pDict = (CPDF_Dictionary*)pFieldDict; 1308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_WideString csWName = GetFullName(pDict); 1309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (csWName.IsEmpty()) { 1310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 1311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_FormField* pField = NULL; 1313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pField = m_pFieldTree->GetField(csWName); 1314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pField == NULL) { 1315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary *pParent = (CPDF_Dictionary*)pFieldDict; 1316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pFieldDict->KeyExist(FX_BSTR("T")) && 1317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pFieldDict->GetString(FX_BSTRC("Subtype")) == FX_BSTRC("Widget")) { 1318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pParent = pFieldDict->GetDict(FX_BSTRC("Parent")); 1319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pParent) { 1320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pParent = (CPDF_Dictionary*)pFieldDict; 1321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pParent && pParent != pFieldDict && !pParent->KeyExist(FX_BSTRC("FT"))) { 1324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pFieldDict->KeyExist(FX_BSTRC("FT"))) { 1325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object *pFTValue = pFieldDict->GetElementValue(FX_BSTRC("FT")); 1326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pFTValue) { 1327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pParent->SetAt(FX_BSTRC("FT"), pFTValue->Clone()); 1328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pFieldDict->KeyExist(FX_BSTRC("Ff"))) { 1331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object *pFfValue = pFieldDict->GetElementValue(FX_BSTRC("Ff")); 1332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pFfValue) { 1333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pParent->SetAt(FX_BSTRC("Ff"), pFfValue->Clone()); 1334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pField = FX_NEW CPDF_FormField(this, pParent); 1338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object* pTObj = pDict->GetElement("T"); 1339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pTObj && pTObj->GetType() == PDFOBJ_REFERENCE) { 1340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object* pClone = pTObj->Clone(TRUE); 1341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pClone) { 1342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pDict->SetAt("T", pClone); 1343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pDict->SetAtName("T", ""); 1345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pFieldTree->SetField(csWName, pField); 1348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Array* pKids = pFieldDict->GetArray("Kids"); 1350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pKids == NULL) { 1351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pFieldDict->GetString("Subtype") == "Widget") { 1352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov AddControl(pField, pFieldDict); 1353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (FX_DWORD i = 0; i < pKids->GetCount(); i ++) { 1356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary* pKid = pKids->GetDict(i); 1357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pKid == NULL) { 1358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 1359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pKid->GetString("Subtype") != "Widget") { 1361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 1362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov AddControl(pField, pKid); 1364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pField; 1367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1368ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_FormControl* CPDF_InterForm::AddControl(const CPDF_FormField* pField, const CPDF_Dictionary* pWidgetDict) 1369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void *rValue = NULL; 1371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_ControlMap.Lookup((CPDF_Dictionary*)pWidgetDict, rValue)) { 1372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return (CPDF_FormControl*)rValue; 1373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_FormControl* pControl = FX_NEW CPDF_FormControl((CPDF_FormField*)pField, (CPDF_Dictionary*)pWidgetDict); 1375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pControl == NULL) { 1376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 1377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_ControlMap.SetAt((CPDF_Dictionary*)pWidgetDict, pControl); 1379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ((CPDF_FormField*)pField)->m_ControlList.Add(pControl); 1380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pControl; 1381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1382ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_FormField* CPDF_InterForm::CheckRequiredFields(const CFX_PtrArray *fields, FX_BOOL bIncludeOrExclude) const 1383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int nCount = m_pFieldTree->m_Root.CountFields(); 1385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int i = 0; i < nCount; i++) { 1386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i); 1387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pField == NULL) { 1388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 1389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 iType = pField->GetType(); 1391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (iType == CPDF_FormField::PushButton || iType == CPDF_FormField::CheckBox || iType == CPDF_FormField::ListBox) { 1392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 1393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD dwFlags = pField->GetFieldFlags(); 1395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (dwFlags & 0x04) { 1396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 1397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bFind = TRUE; 1399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (fields != NULL) { 1400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bFind = fields->Find(pField, 0) >= 0; 1401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((bIncludeOrExclude && bFind) || (!bIncludeOrExclude && !bFind)) { 1403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary *pFieldDict = pField->m_pDict; 1404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((dwFlags & 0x02) != 0 && pFieldDict->GetString("V").IsEmpty()) { 1405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pField; 1406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 1410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1411ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFDF_Document* CPDF_InterForm::ExportToFDF(FX_WSTR pdf_path, FX_BOOL bSimpleFileSpec) const 1412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_PtrArray fields; 1414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int nCount = m_pFieldTree->m_Root.CountFields(); 1415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int i = 0; i < nCount; i ++) { 1416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i); 1417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fields.Add(pField); 1418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return ExportToFDF(pdf_path, fields, TRUE, bSimpleFileSpec); 1420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1421ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_WideString FILESPEC_EncodeFileName(FX_WSTR filepath); 1422ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFDF_Document* CPDF_InterForm::ExportToFDF(FX_WSTR pdf_path, CFX_PtrArray& fields, FX_BOOL bIncludeOrExclude, FX_BOOL bSimpleFileSpec) const 1423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFDF_Document* pDoc = CFDF_Document::CreateNewDoc(); 1425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pDoc == NULL) { 1426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 1427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary* pMainDict = pDoc->GetRoot()->GetDict("FDF"); 1429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pdf_path.IsEmpty()) { 1430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bSimpleFileSpec) { 1431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_WideString wsFilePath = FILESPEC_EncodeFileName(pdf_path); 1432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pMainDict->SetAtString(FX_BSTRC("F"), CFX_ByteString::FromUnicode(wsFilePath)); 1433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pMainDict->SetAtString(FX_BSTRC("UF"), PDF_EncodeText(wsFilePath)); 1434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_FileSpec filespec; 1436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov filespec.SetFileName(pdf_path); 1437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pMainDict->SetAt("F", (CPDF_Object*)filespec); 1438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Array* pFields = CPDF_Array::Create(); 1441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pFields == NULL) { 1442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 1443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pMainDict->SetAt("Fields", pFields); 1445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int nCount = m_pFieldTree->m_Root.CountFields(); 1446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int i = 0; i < nCount; i ++) { 1447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i); 1448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pField == NULL || pField->GetType() == CPDF_FormField::PushButton) { 1449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 1450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1451ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD dwFlags = pField->GetFieldFlags(); 1452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (dwFlags & 0x04) { 1453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 1454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bFind = fields.Find(pField, 0) >= 0; 1456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((bIncludeOrExclude && bFind) || (!bIncludeOrExclude && !bFind)) { 1457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((dwFlags & 0x02) != 0 && pField->m_pDict->GetString("V").IsEmpty()) { 1458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 1459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_WideString fullname = GetFullName(pField->GetFieldDict()); 1461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary* pFieldDict = CPDF_Dictionary::Create(); 1462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pFieldDict == NULL) { 1463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 1464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_String* pString = CPDF_String::Create(fullname); 1466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pString == NULL) { 1467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pFieldDict->Release(); 1468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 1469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pFieldDict->SetAt("T", pString); 1471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pField->GetType() == CPDF_FormField::CheckBox || pField->GetType() == CPDF_FormField::RadioButton) { 1472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_WideString csExport = pField->GetCheckValue(FALSE); 1473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString csBExport = PDF_EncodeText(csExport); 1474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object* pOpt = FPDF_GetFieldAttr(pField->m_pDict, "Opt"); 1475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pOpt == NULL) { 1476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pFieldDict->SetAtName("V", csBExport); 1477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pFieldDict->SetAtString("V", csBExport); 1479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object* pV = FPDF_GetFieldAttr(pField->m_pDict, "V"); 1482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pV != NULL) { 1483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pFieldDict->SetAt("V", pV->Clone(TRUE)); 1484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pFields->Add(pFieldDict); 1487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pDoc; 1490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovconst struct _SupportFieldEncoding { 1492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPCSTR m_name; 1493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 m_codePage; 1494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} g_fieldEncoding[] = { 1495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "BigFive", 950, 1496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "GBK", 936, 1497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "Shift-JIS", 932, 1498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "UHC", 949, 1499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 1500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void FPDFDOC_FDF_GetFieldValue(CPDF_Dictionary *pFieldDict, CFX_WideString &csValue, CFX_ByteString &bsEncoding) 1501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ASSERT(pFieldDict != NULL); 1503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString csBValue = pFieldDict->GetString("V"); 1504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 iCount = sizeof(g_fieldEncoding) / sizeof(g_fieldEncoding[0]); 1505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 i = 0; 1506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (; i < iCount; ++i) 1507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bsEncoding == g_fieldEncoding[i].m_name) { 1508ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 1509ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1510ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (i < iCount) { 1511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_CharMap *pCharMap = CFX_CharMap::GetDefaultMapper(g_fieldEncoding[i].m_codePage); 1512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_assert(pCharMap != NULL); 1513ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov csValue.ConvertFrom(csBValue, pCharMap); 1514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1516ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString csTemp = csBValue.Left(2); 1517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (csTemp == "\xFF\xFE" || csTemp == "\xFE\xFF") { 1518ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov csValue = PDF_DecodeText(csBValue); 1519ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov csValue = CFX_WideString::FromLocal(csBValue); 1521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_InterForm::FDF_ImportField(CPDF_Dictionary* pFieldDict, const CFX_WideString& parent_name, FX_BOOL bNotify, int nLevel) 1524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_WideString name; 1526ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!parent_name.IsEmpty()) { 1527ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov name = parent_name + L"."; 1528ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov name += pFieldDict->GetUnicodeText("T"); 1530ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Array* pKids = pFieldDict->GetArray("Kids"); 1531ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pKids) { 1532ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (FX_DWORD i = 0; i < pKids->GetCount(); i ++) { 1533ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary* pKid = pKids->GetDict(i); 1534ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pKid == NULL) { 1535ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 1536ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1537ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nLevel <= nMaxRecursion) { 1538ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FDF_ImportField(pKid, name, bNotify, nLevel + 1); 1539ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1540ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1541ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1542ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1543ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pFieldDict->KeyExist("V")) { 1544ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1545ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1546ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_FormField* pField = m_pFieldTree->GetField(name); 1547ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pField == NULL) { 1548ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1550ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_WideString csWValue; 1551ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FPDFDOC_FDF_GetFieldValue(pFieldDict, csWValue, m_bsEncoding); 1552ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int iType = pField->GetFieldType(); 1553ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bNotify && m_pFormNotify != NULL) { 1554ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int iRet = 0; 1555ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (iType == FIELDTYPE_LISTBOX) { 1556ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov iRet = m_pFormNotify->BeforeSelectionChange(pField, csWValue); 1557ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (iType == FIELDTYPE_COMBOBOX || iType == FIELDTYPE_TEXTFIELD) { 1558ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov iRet = m_pFormNotify->BeforeValueChange(pField, csWValue); 1559ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1560ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (iRet < 0) { 1561ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1562ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1563ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1564ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteArray statusArray; 1565ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (iType == FIELDTYPE_CHECKBOX || iType == FIELDTYPE_RADIOBUTTON) { 1566ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov SaveCheckedFieldStatus(pField, statusArray); 1567ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1568ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pField->SetValue(csWValue); 1569ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_FormField::Type eType = pField->GetType(); 1570ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((eType == CPDF_FormField::ListBox || eType == CPDF_FormField::ComboBox) && pFieldDict->KeyExist("Opt")) { 1571ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pField->m_pDict->SetAt("Opt", pFieldDict->GetElementValue("Opt")->Clone(TRUE)); 1572ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1573ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bNotify && m_pFormNotify != NULL) { 1574ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (iType == FIELDTYPE_CHECKBOX || iType == FIELDTYPE_RADIOBUTTON) { 1575ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pFormNotify->AfterCheckedStatusChange(pField, statusArray); 1576ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (iType == FIELDTYPE_LISTBOX) { 1577ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pFormNotify->AfterSelectionChange(pField); 1578ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (iType == FIELDTYPE_COMBOBOX || iType == FIELDTYPE_TEXTFIELD) { 1579ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pFormNotify->AfterValueChange(pField); 1580ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1581ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1582ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (CPDF_InterForm::m_bUpdateAP) { 1583ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pField->UpdateAP(NULL); 1584ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1585ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1586ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_InterForm::ImportFromFDF(const CFDF_Document* pFDF, FX_BOOL bNotify) 1587ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1588ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pFDF == NULL) { 1589ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 1590ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1591ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary* pMainDict = pFDF->GetRoot()->GetDict("FDF"); 1592ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pMainDict == NULL) { 1593ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 1594ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1595ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Array* pFields = pMainDict->GetArray("Fields"); 1596ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pFields == NULL) { 1597ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 1598ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1599ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bsEncoding = pMainDict->GetString(FX_BSTRC("Encoding")); 1600ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bNotify && m_pFormNotify != NULL) { 1601ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int iRet = m_pFormNotify->BeforeFormImportData(this); 1602ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (iRet < 0) { 1603ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 1604ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1605ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1606ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (FX_DWORD i = 0; i < pFields->GetCount(); i ++) { 1607ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary* pField = pFields->GetDict(i); 1608ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pField == NULL) { 1609ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 1610ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1611ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FDF_ImportField(pField, L"", bNotify); 1612ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1613ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bNotify && m_pFormNotify != NULL) { 1614ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pFormNotify->AfterFormImportData(this); 1615ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1616ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 1617ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1618ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_InterForm::SetFormNotify(const CPDF_FormNotify* pNotify) 1619ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1620ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pFormNotify = (CPDF_FormNotify*)pNotify; 1621ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1622ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint CPDF_InterForm::GetPageWithWidget(int iCurPage, FX_BOOL bNext) 1623ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1624ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (iCurPage < 0) { 1625ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return -1; 1626ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1627ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int iPageCount = m_pDocument->GetPageCount(); 1628ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (iCurPage >= iPageCount) { 1629ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return -1; 1630ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1631ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int iNewPage = iCurPage; 1632ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov do { 1633ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov iNewPage += bNext ? 1 : -1; 1634ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (iNewPage >= iPageCount) { 1635ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov iNewPage = 0; 1636ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1637ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (iNewPage < 0) { 1638ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov iNewPage = iPageCount - 1; 1639ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1640ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (iNewPage == iCurPage) { 1641ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 1642ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1643ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary* pPageDict = m_pDocument->GetPage(iNewPage); 1644ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pPageDict == NULL) { 1645ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 1646ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1647ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Array* pAnnots = pPageDict->GetArray("Annots"); 1648ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pAnnots == NULL) { 1649ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 1650ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1651ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD dwCount = pAnnots->GetCount(); 1652ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (FX_DWORD i = 0; i < dwCount; i ++) { 1653ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object* pAnnotDict = pAnnots->GetElementValue(i); 1654ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pAnnotDict == NULL) { 1655ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 1656ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1657ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_FormControl* pControl = NULL; 1658ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_ControlMap.Lookup(pAnnotDict, (void*&)pControl)) { 1659ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return iNewPage; 1660ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1661ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1662ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } while (TRUE); 1663ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return -1; 1664ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1665