Index: core/fpdfdoc/doc_formfield.cpp |
diff --git a/core/fpdfdoc/doc_formfield.cpp b/core/fpdfdoc/doc_formfield.cpp |
index 9849fa1e35bd1632a14a48ad6cb7f63153878a49..310f0754bf38d081e5f4d9d9a3bc7547c4de5d91 100644 |
--- a/core/fpdfdoc/doc_formfield.cpp |
+++ b/core/fpdfdoc/doc_formfield.cpp |
@@ -14,25 +14,28 @@ |
#include "core/fpdfdoc/doc_utils.h" |
#include "core/fpdfdoc/include/fpdf_doc.h" |
-FX_BOOL PDF_FormField_IsUnison(CPDF_FormField* pField) { |
- FX_BOOL bUnison = FALSE; |
- if (pField->GetType() == CPDF_FormField::CheckBox) { |
- bUnison = TRUE; |
- } else { |
- uint32_t dwFlags = pField->GetFieldFlags(); |
- bUnison = ((dwFlags & 0x2000000) != 0); |
- } |
- return bUnison; |
+namespace { |
+ |
+bool PDF_FormField_IsUnison(CPDF_FormField* pField) { |
+ if (pField->GetType() == CPDF_FormField::CheckBox) |
+ return true; |
+ |
+ return (pField->GetFieldFlags() & 0x2000000) != 0; |
} |
-CPDF_FormField::CPDF_FormField(CPDF_InterForm* pForm, CPDF_Dictionary* pDict) { |
- m_pDict = pDict; |
- m_Type = Unknown; |
- m_pForm = pForm; |
- m_pFont = NULL; |
- m_FontSize = 0; |
+ |
+} // namespace |
+ |
+CPDF_FormField::CPDF_FormField(CPDF_InterForm* pForm, CPDF_Dictionary* pDict) |
+ : m_Type(Unknown), |
+ m_pForm(pForm), |
+ m_pDict(pDict), |
+ m_FontSize(0), |
+ m_pFont(nullptr) { |
SyncFieldFlags(); |
} |
+ |
CPDF_FormField::~CPDF_FormField() {} |
+ |
void CPDF_FormField::SyncFieldFlags() { |
CFX_ByteString type_name = FPDF_GetFieldAttr(m_pDict, "FT") |
? FPDF_GetFieldAttr(m_pDict, "FT")->GetString() |
@@ -105,6 +108,7 @@ void CPDF_FormField::SyncFieldFlags() { |
CFX_WideString CPDF_FormField::GetFullName() { |
return ::GetFullName(m_pDict); |
} |
+ |
FX_BOOL CPDF_FormField::ResetField(FX_BOOL bNotify) { |
switch (m_Type) { |
case CPDF_FormField::CheckBox: |
@@ -127,41 +131,20 @@ FX_BOOL CPDF_FormField::ResetField(FX_BOOL bNotify) { |
m_pForm->m_pFormNotify->AfterCheckedStatusChange(this); |
} |
} break; |
- case CPDF_FormField::ComboBox: { |
- CFX_WideString csValue; |
- ClearSelection(); |
- int iIndex = GetDefaultSelectedItem(); |
- if (iIndex >= 0) { |
- csValue = GetOptionLabel(iIndex); |
- } |
- if (bNotify && m_pForm->m_pFormNotify) { |
- int iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue); |
- if (iRet < 0) { |
- return FALSE; |
- } |
- } |
- SetItemSelection(iIndex, TRUE); |
- if (bNotify && m_pForm->m_pFormNotify) { |
- m_pForm->m_pFormNotify->AfterValueChange(this); |
- } |
- } break; |
+ case CPDF_FormField::ComboBox: |
case CPDF_FormField::ListBox: { |
CFX_WideString csValue; |
ClearSelection(); |
int iIndex = GetDefaultSelectedItem(); |
- if (iIndex >= 0) { |
+ if (iIndex >= 0) |
csValue = GetOptionLabel(iIndex); |
- } |
- if (bNotify && m_pForm->m_pFormNotify) { |
- int iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue); |
- if (iRet < 0) { |
- return FALSE; |
- } |
- } |
+ |
+ if (bNotify && !NotifyListOrComboBoxBeforeChange(csValue)) |
+ return FALSE; |
+ |
SetItemSelection(iIndex, TRUE); |
- if (bNotify && m_pForm->m_pFormNotify) { |
- m_pForm->m_pFormNotify->AfterSelectionChange(this); |
- } |
+ if (bNotify) |
+ NotifyListOrComboBoxAfterChange(); |
} break; |
case CPDF_FormField::Text: |
case CPDF_FormField::RichText: |
@@ -169,29 +152,26 @@ FX_BOOL CPDF_FormField::ResetField(FX_BOOL bNotify) { |
default: { |
CPDF_Object* pDV = FPDF_GetFieldAttr(m_pDict, "DV"); |
CFX_WideString csDValue; |
- if (pDV) { |
+ if (pDV) |
csDValue = pDV->GetUnicodeText(); |
- } |
+ |
CPDF_Object* pV = FPDF_GetFieldAttr(m_pDict, "V"); |
CFX_WideString csValue; |
- if (pV) { |
+ if (pV) |
csValue = pV->GetUnicodeText(); |
- } |
+ |
CPDF_Object* pRV = FPDF_GetFieldAttr(m_pDict, "RV"); |
- if (!pRV && (csDValue == csValue)) { |
+ if (!pRV && (csDValue == csValue)) |
return FALSE; |
- } |
- if (bNotify && m_pForm->m_pFormNotify) { |
- int iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csDValue); |
- if (iRet < 0) { |
- return FALSE; |
- } |
- } |
+ |
+ if (bNotify && !NotifyBeforeValueChange(csDValue)) |
+ return FALSE; |
+ |
if (pDV) { |
CPDF_Object* pClone = pDV->Clone(); |
- if (!pClone) { |
+ if (!pClone) |
return FALSE; |
- } |
+ |
m_pDict->SetAt("V", pClone); |
if (pRV) { |
CPDF_Object* pCloneR = pDV->Clone(); |
@@ -201,18 +181,17 @@ FX_BOOL CPDF_FormField::ResetField(FX_BOOL bNotify) { |
m_pDict->RemoveAt("V"); |
m_pDict->RemoveAt("RV"); |
} |
- if (bNotify && m_pForm->m_pFormNotify) { |
- m_pForm->m_pFormNotify->AfterValueChange(this); |
- } |
- m_pForm->m_bUpdated = TRUE; |
+ if (bNotify) |
+ NotifyAfterValueChange(); |
} break; |
} |
return TRUE; |
} |
+ |
int CPDF_FormField::GetControlIndex(const CPDF_FormControl* pControl) { |
- if (!pControl) { |
+ if (!pControl) |
return -1; |
- } |
+ |
for (int i = 0; i < m_ControlList.GetSize(); i++) { |
if (m_ControlList.GetAt(i) == pControl) |
return i; |
@@ -284,9 +263,9 @@ CFX_WideString CPDF_FormField::GetRichTextString() { |
return pObj->GetUnicodeText(); |
} |
CFX_WideString CPDF_FormField::GetValue(FX_BOOL bDefault) { |
- if (GetType() == CheckBox || GetType() == RadioButton) { |
+ if (GetType() == CheckBox || GetType() == RadioButton) |
return GetCheckValue(bDefault); |
- } |
+ |
CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, bDefault ? "DV" : "V"); |
if (!pValue) { |
if (!bDefault) { |
@@ -297,9 +276,8 @@ CFX_WideString CPDF_FormField::GetValue(FX_BOOL bDefault) { |
pValue = FPDF_GetFieldAttr(m_pDict, "DV"); |
} |
} |
- if (!pValue) { |
+ if (!pValue) |
return CFX_WideString(); |
- } |
} |
switch (pValue->GetType()) { |
case CPDF_Object::STRING: |
@@ -315,12 +293,15 @@ CFX_WideString CPDF_FormField::GetValue(FX_BOOL bDefault) { |
} |
return CFX_WideString(); |
} |
+ |
CFX_WideString CPDF_FormField::GetValue() { |
return GetValue(FALSE); |
} |
+ |
CFX_WideString CPDF_FormField::GetDefaultValue() { |
return GetValue(TRUE); |
} |
+ |
FX_BOOL CPDF_FormField::SetValue(const CFX_WideString& value, |
FX_BOOL bDefault, |
FX_BOOL bNotify) { |
@@ -335,70 +316,55 @@ FX_BOOL CPDF_FormField::SetValue(const CFX_WideString& value, |
case Text: |
case ComboBox: { |
CFX_WideString csValue = value; |
- if (bNotify && m_pForm->m_pFormNotify) { |
- int iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue); |
- if (iRet < 0) { |
- return FALSE; |
- } |
- } |
+ if (bNotify && !NotifyBeforeValueChange(csValue)) |
+ return FALSE; |
+ |
int iIndex = FindOptionValue(csValue); |
if (iIndex < 0) { |
CFX_ByteString bsEncodeText = PDF_EncodeText(csValue); |
m_pDict->SetAtString(bDefault ? "DV" : "V", bsEncodeText); |
- if (m_Type == RichText && !bDefault) { |
+ if (m_Type == RichText && !bDefault) |
m_pDict->SetAtString("RV", bsEncodeText); |
- } |
m_pDict->RemoveAt("I"); |
} else { |
m_pDict->SetAtString(bDefault ? "DV" : "V", PDF_EncodeText(csValue)); |
- if (bDefault) { |
- } else { |
+ if (!bDefault) { |
ClearSelection(); |
SetItemSelection(iIndex, TRUE); |
} |
} |
- if (bNotify && m_pForm->m_pFormNotify) { |
- m_pForm->m_pFormNotify->AfterValueChange(this); |
- } |
- m_pForm->m_bUpdated = TRUE; |
+ if (bNotify) |
+ NotifyAfterValueChange(); |
} break; |
case ListBox: { |
int iIndex = FindOptionValue(value); |
- if (iIndex < 0) { |
+ if (iIndex < 0) |
return FALSE; |
- } |
- if (bDefault && iIndex == GetDefaultSelectedItem()) { |
+ |
+ if (bDefault && iIndex == GetDefaultSelectedItem()) |
return FALSE; |
- } |
- if (bNotify && m_pForm->m_pFormNotify) { |
- CFX_WideString csValue = value; |
- int iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue); |
- if (iRet < 0) { |
- return FALSE; |
- } |
- } |
- if (bDefault) { |
- } else { |
+ |
+ if (bNotify && !NotifyBeforeSelectionChange(value)) |
+ return FALSE; |
+ |
+ if (!bDefault) { |
ClearSelection(); |
SetItemSelection(iIndex, TRUE); |
} |
- if (bNotify && m_pForm->m_pFormNotify) { |
- m_pForm->m_pFormNotify->AfterSelectionChange(this); |
- } |
- m_pForm->m_bUpdated = TRUE; |
+ if (bNotify) |
+ NotifyAfterSelectionChange(); |
break; |
} |
default: |
break; |
} |
- if (CPDF_InterForm::m_bUpdateAP) { |
- UpdateAP(NULL); |
- } |
return TRUE; |
} |
+ |
FX_BOOL CPDF_FormField::SetValue(const CFX_WideString& value, FX_BOOL bNotify) { |
return SetValue(value, FALSE, bNotify); |
} |
+ |
int CPDF_FormField::GetMaxLen() { |
if (CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "MaxLen")) |
return pObj->GetInteger(); |
@@ -467,38 +433,21 @@ int CPDF_FormField::GetSelectedIndex(int index) { |
} |
return -1; |
} |
+ |
FX_BOOL CPDF_FormField::ClearSelection(FX_BOOL bNotify) { |
if (bNotify && m_pForm->m_pFormNotify) { |
- int iRet = 0; |
CFX_WideString csValue; |
int iIndex = GetSelectedIndex(0); |
- if (iIndex >= 0) { |
+ if (iIndex >= 0) |
csValue = GetOptionLabel(iIndex); |
- } |
- if (GetType() == ListBox) { |
- iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue); |
- } |
- if (GetType() == ComboBox) { |
- iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue); |
- } |
- if (iRet < 0) { |
+ |
+ if (!NotifyListOrComboBoxBeforeChange(csValue)) |
return FALSE; |
- } |
} |
m_pDict->RemoveAt("V"); |
m_pDict->RemoveAt("I"); |
- if (bNotify && m_pForm->m_pFormNotify) { |
- if (GetType() == ListBox) { |
- m_pForm->m_pFormNotify->AfterSelectionChange(this); |
- } |
- if (GetType() == ComboBox) { |
- m_pForm->m_pFormNotify->AfterValueChange(this); |
- } |
- } |
- if (CPDF_InterForm::m_bUpdateAP) { |
- UpdateAP(NULL); |
- } |
- m_pForm->m_bUpdated = TRUE; |
+ if (bNotify) |
+ NotifyListOrComboBoxAfterChange(); |
return TRUE; |
} |
@@ -551,31 +500,42 @@ FX_BOOL CPDF_FormField::SetItemSelection(int index, |
FX_BOOL bSelected, |
FX_BOOL bNotify) { |
ASSERT(GetType() == ComboBox || GetType() == ListBox); |
- if (index < 0 || index >= CountOptions()) { |
+ if (index < 0 || index >= CountOptions()) |
return FALSE; |
- } |
+ |
CFX_WideString opt_value = GetOptionValue(index); |
- if (bNotify && m_pForm->m_pFormNotify) { |
- int iRet = 0; |
+ if (bNotify && !NotifyListOrComboBoxBeforeChange(opt_value)) |
+ return FALSE; |
+ |
+ if (bSelected) { |
if (GetType() == ListBox) { |
- iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, opt_value); |
- } |
- if (GetType() == ComboBox) { |
- iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, opt_value); |
- } |
- if (iRet < 0) { |
- return FALSE; |
+ SelectOption(index, TRUE); |
+ if (!(m_Flags & FORMLIST_MULTISELECT)) { |
+ m_pDict->SetAtString("V", PDF_EncodeText(opt_value)); |
+ } else { |
+ CPDF_Array* pArray = new CPDF_Array; |
+ for (int i = 0; i < CountOptions(); i++) { |
+ if (i == index || IsItemSelected(i)) { |
+ opt_value = GetOptionValue(i); |
+ pArray->AddString(PDF_EncodeText(opt_value)); |
+ } |
+ } |
+ m_pDict->SetAt("V", pArray); |
+ } |
+ } else { |
+ m_pDict->SetAtString("V", PDF_EncodeText(opt_value)); |
+ CPDF_Array* pI = new CPDF_Array; |
+ pI->AddInteger(index); |
+ m_pDict->SetAt("I", pI); |
} |
- } |
- if (!bSelected) { |
+ } else { |
CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "V"); |
if (pValue) { |
- if (m_Type == ListBox) { |
+ if (GetType() == ListBox) { |
SelectOption(index, FALSE); |
if (pValue->IsString()) { |
- if (pValue->GetUnicodeText() == opt_value) { |
+ if (pValue->GetUnicodeText() == opt_value) |
m_pDict->RemoveAt("V"); |
- } |
} else if (pValue->IsArray()) { |
CPDF_Array* pArray = new CPDF_Array; |
for (int i = 0; i < CountOptions(); i++) { |
@@ -589,45 +549,14 @@ FX_BOOL CPDF_FormField::SetItemSelection(int index, |
else |
m_pDict->SetAt("V", pArray); |
} |
- } else if (m_Type == ComboBox) { |
+ } else { |
m_pDict->RemoveAt("V"); |
m_pDict->RemoveAt("I"); |
} |
} |
- } else { |
- if (m_Type == ListBox) { |
- SelectOption(index, TRUE); |
- if (!(m_Flags & FORMLIST_MULTISELECT)) { |
- m_pDict->SetAtString("V", PDF_EncodeText(opt_value)); |
- } else { |
- CPDF_Array* pArray = new CPDF_Array; |
- for (int i = 0; i < CountOptions(); i++) { |
- if (i == index || IsItemSelected(i)) { |
- opt_value = GetOptionValue(i); |
- pArray->AddString(PDF_EncodeText(opt_value)); |
- } |
- } |
- m_pDict->SetAt("V", pArray); |
- } |
- } else if (m_Type == ComboBox) { |
- m_pDict->SetAtString("V", PDF_EncodeText(opt_value)); |
- CPDF_Array* pI = new CPDF_Array; |
- pI->AddInteger(index); |
- m_pDict->SetAt("I", pI); |
- } |
} |
- if (bNotify && m_pForm->m_pFormNotify) { |
- if (GetType() == ListBox) { |
- m_pForm->m_pFormNotify->AfterSelectionChange(this); |
- } |
- if (GetType() == ComboBox) { |
- m_pForm->m_pFormNotify->AfterValueChange(this); |
- } |
- } |
- if (CPDF_InterForm::m_bUpdateAP) { |
- UpdateAP(NULL); |
- } |
- m_pForm->m_bUpdated = TRUE; |
+ if (bNotify) |
+ NotifyListOrComboBoxAfterChange(); |
return TRUE; |
} |
@@ -654,17 +583,6 @@ int CPDF_FormField::GetDefaultSelectedItem() { |
return -1; |
} |
-void CPDF_FormField::UpdateAP(CPDF_FormControl* pControl) { |
- if (m_Type == PushButton || m_Type == RadioButton || m_Type == CheckBox) |
- return; |
- if (!m_pForm->m_bGenerateAP) |
- return; |
- for (int i = 0; i < CountControls(); i++) { |
- CPDF_FormControl* pControl = GetControl(i); |
- FPDF_GenerateAP(m_pForm->m_pDocument, pControl->m_pWidgetDict); |
- } |
-} |
- |
int CPDF_FormField::CountOptions() { |
CPDF_Array* pArray = ToArray(FPDF_GetFieldAttr(m_pDict, "Opt")); |
return pArray ? pArray->GetCount() : 0; |
@@ -714,15 +632,8 @@ int CPDF_FormField::InsertOption(CFX_WideString csOptLabel, |
if (csOptLabel.IsEmpty()) |
return -1; |
- if (bNotify && m_pForm->m_pFormNotify) { |
- int iRet = 0; |
- if (GetType() == ListBox) |
- iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csOptLabel); |
- if (GetType() == ComboBox) |
- iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csOptLabel); |
- if (iRet < 0) |
- return -1; |
- } |
+ if (bNotify && !NotifyListOrComboBoxBeforeChange(csOptLabel)) |
+ return -1; |
CFX_ByteString csStr = |
PDF_EncodeText(csOptLabel.c_str(), csOptLabel.GetLength()); |
@@ -742,27 +653,18 @@ int CPDF_FormField::InsertOption(CFX_WideString csOptLabel, |
pOpt->InsertAt(index, pString); |
} |
- if (bNotify && m_pForm->m_pFormNotify) { |
- if (GetType() == ListBox) |
- m_pForm->m_pFormNotify->AfterSelectionChange(this); |
- if (GetType() == ComboBox) |
- m_pForm->m_pFormNotify->AfterValueChange(this); |
- } |
- m_pForm->m_bUpdated = TRUE; |
+ if (bNotify) |
+ NotifyListOrComboBoxAfterChange(); |
return index; |
} |
+ |
FX_BOOL CPDF_FormField::ClearOptions(FX_BOOL bNotify) { |
if (bNotify && m_pForm->m_pFormNotify) { |
- int iRet = 0; |
CFX_WideString csValue; |
int iIndex = GetSelectedIndex(0); |
if (iIndex >= 0) |
csValue = GetOptionLabel(iIndex); |
- if (GetType() == ListBox) |
- iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue); |
- if (GetType() == ComboBox) |
- iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue); |
- if (iRet < 0) |
+ if (!NotifyListOrComboBoxBeforeChange(csValue)) |
return FALSE; |
} |
@@ -772,17 +674,13 @@ FX_BOOL CPDF_FormField::ClearOptions(FX_BOOL bNotify) { |
m_pDict->RemoveAt("I"); |
m_pDict->RemoveAt("TI"); |
- if (bNotify && m_pForm->m_pFormNotify) { |
- if (GetType() == ListBox) |
- m_pForm->m_pFormNotify->AfterSelectionChange(this); |
- if (GetType() == ComboBox) |
- m_pForm->m_pFormNotify->AfterValueChange(this); |
- } |
+ if (bNotify) |
+ NotifyListOrComboBoxAfterChange(); |
- m_pForm->m_bUpdated = TRUE; |
return TRUE; |
} |
#endif // PDF_ENABLE_XFA |
+ |
FX_BOOL CPDF_FormField::CheckControl(int iControlIndex, |
bool bChecked, |
bool bNotify) { |
@@ -797,7 +695,7 @@ FX_BOOL CPDF_FormField::CheckControl(int iControlIndex, |
CFX_WideString csWExport = pControl->GetExportValue(); |
CFX_ByteString csBExport = PDF_EncodeText(csWExport); |
int iCount = CountControls(); |
- FX_BOOL bUnison = PDF_FormField_IsUnison(this); |
+ bool bUnison = PDF_FormField_IsUnison(this); |
for (int i = 0; i < iCount; i++) { |
CPDF_FormControl* pCtrl = GetControl(i); |
if (bUnison) { |
@@ -838,24 +736,19 @@ FX_BOOL CPDF_FormField::CheckControl(int iControlIndex, |
csIndex.Format("%d", iControlIndex); |
m_pDict->SetAtName("V", csIndex); |
} |
- if (bNotify && m_pForm->m_pFormNotify) { |
+ if (bNotify && m_pForm->m_pFormNotify) |
m_pForm->m_pFormNotify->AfterCheckedStatusChange(this); |
- } |
- m_pForm->m_bUpdated = TRUE; |
return TRUE; |
} |
+ |
CFX_WideString CPDF_FormField::GetCheckValue(FX_BOOL bDefault) { |
ASSERT(GetType() == CheckBox || GetType() == RadioButton); |
CFX_WideString csExport = L"Off"; |
- FX_BOOL bChecked; |
int iCount = CountControls(); |
for (int i = 0; i < iCount; i++) { |
CPDF_FormControl* pControl = GetControl(i); |
- if (bDefault) { |
- bChecked = pControl->IsDefaultChecked(); |
- } else { |
- bChecked = pControl->IsChecked(); |
- } |
+ FX_BOOL bChecked = |
+ bDefault ? pControl->IsDefaultChecked() : pControl->IsChecked(); |
if (bChecked) { |
csExport = pControl->GetExportValue(); |
break; |
@@ -863,6 +756,7 @@ CFX_WideString CPDF_FormField::GetCheckValue(FX_BOOL bDefault) { |
} |
return csExport; |
} |
+ |
FX_BOOL CPDF_FormField::SetCheckValue(const CFX_WideString& value, |
FX_BOOL bDefault, |
FX_BOOL bNotify) { |
@@ -871,23 +765,14 @@ FX_BOOL CPDF_FormField::SetCheckValue(const CFX_WideString& value, |
for (int i = 0; i < iCount; i++) { |
CPDF_FormControl* pControl = GetControl(i); |
CFX_WideString csExport = pControl->GetExportValue(); |
- if (csExport == value) { |
- if (bDefault) { |
- } else { |
- CheckControl(GetControlIndex(pControl), TRUE); |
- } |
+ bool val = csExport == value; |
+ if (!bDefault) |
+ CheckControl(GetControlIndex(pControl), val); |
+ if (val) |
break; |
- } else { |
- if (bDefault) { |
- } else { |
- CheckControl(GetControlIndex(pControl), FALSE); |
- } |
- } |
} |
- if (bNotify && m_pForm->m_pFormNotify) { |
+ if (bNotify && m_pForm->m_pFormNotify) |
m_pForm->m_pFormNotify->AfterCheckedStatusChange(this); |
- } |
- m_pForm->m_bUpdated = TRUE; |
return TRUE; |
} |
@@ -929,131 +814,153 @@ FX_BOOL CPDF_FormField::SelectOption(int iOptIndex, |
FX_BOOL bNotify) { |
CPDF_Array* pArray = m_pDict->GetArrayBy("I"); |
if (!pArray) { |
- if (!bSelected) { |
+ if (!bSelected) |
return TRUE; |
- } |
+ |
pArray = new CPDF_Array; |
m_pDict->SetAt("I", pArray); |
} |
+ |
FX_BOOL bReturn = FALSE; |
for (size_t i = 0; i < pArray->GetCount(); i++) { |
int iFind = pArray->GetIntegerAt(i); |
if (iFind == iOptIndex) { |
- if (bSelected) { |
+ if (bSelected) |
return TRUE; |
- } |
+ |
if (bNotify && m_pForm->m_pFormNotify) { |
- int iRet = 0; |
CFX_WideString csValue = GetOptionLabel(iOptIndex); |
- if (GetType() == ListBox) { |
- iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue); |
- } |
- if (GetType() == ComboBox) { |
- iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue); |
- } |
- if (iRet < 0) { |
+ if (!NotifyListOrComboBoxBeforeChange(csValue)) |
return FALSE; |
- } |
} |
pArray->RemoveAt(i); |
bReturn = TRUE; |
break; |
- } else if (iFind > iOptIndex) { |
- if (!bSelected) { |
+ } |
+ |
+ if (iFind > iOptIndex) { |
+ if (!bSelected) |
continue; |
- } |
+ |
if (bNotify && m_pForm->m_pFormNotify) { |
- int iRet = 0; |
CFX_WideString csValue = GetOptionLabel(iOptIndex); |
- if (GetType() == ListBox) { |
- iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue); |
- } |
- if (GetType() == ComboBox) { |
- iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue); |
- } |
- if (iRet < 0) { |
+ if (!NotifyListOrComboBoxBeforeChange(csValue)) |
return FALSE; |
- } |
} |
- CPDF_Number* pNum = new CPDF_Number(iOptIndex); |
- pArray->InsertAt(i, pNum); |
+ pArray->InsertAt(i, new CPDF_Number(iOptIndex)); |
bReturn = TRUE; |
break; |
} |
} |
if (!bReturn) { |
- if (bSelected) { |
+ if (bSelected) |
pArray->AddInteger(iOptIndex); |
- } |
- if (pArray->GetCount() == 0) { |
+ |
+ if (pArray->GetCount() == 0) |
m_pDict->RemoveAt("I"); |
- } |
} |
- if (bNotify && m_pForm->m_pFormNotify) { |
- if (GetType() == ListBox) { |
- m_pForm->m_pFormNotify->AfterSelectionChange(this); |
- } |
- if (GetType() == ComboBox) { |
- m_pForm->m_pFormNotify->AfterValueChange(this); |
- } |
- } |
- m_pForm->m_bUpdated = TRUE; |
+ if (bNotify) |
+ NotifyListOrComboBoxAfterChange(); |
+ |
return TRUE; |
} |
+ |
FX_BOOL CPDF_FormField::ClearSelectedOptions(FX_BOOL bNotify) { |
if (bNotify && m_pForm->m_pFormNotify) { |
- int iRet = 0; |
CFX_WideString csValue; |
int iIndex = GetSelectedIndex(0); |
- if (iIndex >= 0) { |
+ if (iIndex >= 0) |
csValue = GetOptionLabel(iIndex); |
- } |
- if (GetType() == ListBox) { |
- iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue); |
- } |
- if (GetType() == ComboBox) { |
- iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue); |
- } |
- if (iRet < 0) { |
+ |
+ if (!NotifyListOrComboBoxBeforeChange(csValue)) |
return FALSE; |
- } |
} |
m_pDict->RemoveAt("I"); |
- if (bNotify && m_pForm->m_pFormNotify) { |
- if (GetType() == ListBox) { |
- m_pForm->m_pFormNotify->AfterSelectionChange(this); |
- } |
- if (GetType() == ComboBox) { |
- m_pForm->m_pFormNotify->AfterValueChange(this); |
- } |
- } |
- m_pForm->m_bUpdated = TRUE; |
+ if (bNotify) |
+ NotifyListOrComboBoxAfterChange(); |
+ |
return TRUE; |
} |
+ |
void CPDF_FormField::LoadDA() { |
+ CPDF_Dictionary* pFormDict = m_pForm->m_pFormDict; |
+ if (!pFormDict) |
+ return; |
+ |
CFX_ByteString DA; |
- if (CPDF_Object* pObj_t = FPDF_GetFieldAttr(m_pDict, "DA")) { |
- DA = pObj_t->GetString(); |
- } |
- if (DA.IsEmpty() && m_pForm->m_pFormDict) { |
- DA = m_pForm->m_pFormDict->GetStringBy("DA"); |
- } |
- if (DA.IsEmpty()) { |
+ if (CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "DA")) |
+ DA = pObj->GetString(); |
+ |
+ if (DA.IsEmpty()) |
+ DA = pFormDict->GetStringBy("DA"); |
+ |
+ if (DA.IsEmpty()) |
return; |
- } |
+ |
+ CPDF_Dictionary* pDR = pFormDict->GetDictBy("DR"); |
+ if (!pDR) |
+ return; |
+ |
+ CPDF_Dictionary* pFont = pDR->GetDictBy("Font"); |
+ if (!pFont) |
+ return; |
+ |
CPDF_SimpleParser syntax(DA.AsStringC()); |
syntax.FindTagParamFromStart("Tf", 2); |
CFX_ByteString font_name(syntax.GetWord()); |
- CPDF_Dictionary* pFontDict = NULL; |
- if (m_pForm->m_pFormDict && m_pForm->m_pFormDict->GetDictBy("DR") && |
- m_pForm->m_pFormDict->GetDictBy("DR")->GetDictBy("Font")) { |
- pFontDict = m_pForm->m_pFormDict->GetDictBy("DR") |
- ->GetDictBy("Font") |
- ->GetDictBy(font_name); |
- } |
- if (!pFontDict) { |
+ CPDF_Dictionary* pFontDict = pFont->GetDictBy(font_name); |
+ if (!pFontDict) |
return; |
- } |
+ |
m_pFont = m_pForm->m_pDocument->LoadFont(pFontDict); |
m_FontSize = FX_atof(syntax.GetWord()); |
} |
+ |
+bool CPDF_FormField::NotifyBeforeSelectionChange(const CFX_WideString& value) { |
+ if (!m_pForm->m_pFormNotify) |
+ return true; |
+ return m_pForm->m_pFormNotify->BeforeSelectionChange(this, value) >= 0; |
+} |
+ |
+void CPDF_FormField::NotifyAfterSelectionChange() { |
+ if (!m_pForm->m_pFormNotify) |
+ return; |
+ m_pForm->m_pFormNotify->AfterSelectionChange(this); |
+} |
+ |
+bool CPDF_FormField::NotifyBeforeValueChange(const CFX_WideString& value) { |
+ if (!m_pForm->m_pFormNotify) |
+ return true; |
+ return m_pForm->m_pFormNotify->BeforeValueChange(this, value) >= 0; |
+} |
+ |
+void CPDF_FormField::NotifyAfterValueChange() { |
+ if (!m_pForm->m_pFormNotify) |
+ return; |
+ m_pForm->m_pFormNotify->AfterValueChange(this); |
+} |
+ |
+bool CPDF_FormField::NotifyListOrComboBoxBeforeChange( |
+ const CFX_WideString& value) { |
+ switch (GetType()) { |
+ case ListBox: |
+ return NotifyBeforeSelectionChange(value); |
+ case ComboBox: |
+ return NotifyBeforeValueChange(value); |
+ default: |
+ return true; |
+ } |
+} |
+ |
+void CPDF_FormField::NotifyListOrComboBoxAfterChange() { |
+ switch (GetType()) { |
+ case ListBox: |
+ NotifyAfterSelectionChange(); |
+ break; |
+ case ComboBox: |
+ NotifyAfterValueChange(); |
+ break; |
+ default: |
+ break; |
+ } |
+} |