Merge XFA to PDFium master at 4dc95e7 on 10/28/2014
[pdfium.git] / core / src / fpdfdoc / doc_formfield.cpp
index a2f0fbd..64e9c28 100644 (file)
@@ -797,6 +797,77 @@ int CPDF_FormField::FindOptionValue(FX_LPCWSTR csOptValue, int iStartIndex)
     }
     return -1;
 }
+int CPDF_FormField::InsertOption(CFX_WideString csOptLabel, int index, FX_BOOL bNotify)\r
+{\r
+    if (csOptLabel.IsEmpty()) return -1;\r
+\r
+    if (bNotify && m_pForm->m_pFormNotify != NULL)\r
+    {\r
+        int iRet = 0;\r
+        if (GetType() == ListBox) iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csOptLabel);\r
+        if (GetType() == ComboBox) iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csOptLabel);\r
+        if (iRet < 0) return -1;\r
+    }\r
+\r
+    CFX_ByteString csStr = PDF_EncodeText(csOptLabel, csOptLabel.GetLength());\r
+    CPDF_Array* pOpt = NULL;\r
+    CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "Opt");\r
+    if (pValue == NULL || pValue->GetType() != PDFOBJ_ARRAY)\r
+    {\r
+        pOpt = CPDF_Array::Create();\r
+        if (pOpt == NULL) return -1;\r
+        m_pDict->SetAt("Opt", pOpt);\r
+    }\r
+    else\r
+        pOpt = (CPDF_Array*)pValue;\r
+    int iCount = (int)pOpt->GetCount();\r
+    if (index < 0 || index >= iCount)\r
+    {\r
+        pOpt->AddString(csStr);\r
+        index = iCount;\r
+    }\r
+    else {\r
+        CPDF_String* pString = CPDF_String::Create(csStr);\r
+        if (pString == NULL) return -1;\r
+        pOpt->InsertAt(index, pString);\r
+    }\r
+\r
+    if (bNotify && m_pForm->m_pFormNotify != NULL)\r
+    {\r
+        if (GetType() == ListBox) m_pForm->m_pFormNotify->AfterSelectionChange(this);\r
+        if (GetType() == ComboBox) m_pForm->m_pFormNotify->AfterValueChange(this);\r
+    }\r
+    m_pForm->m_bUpdated = TRUE;\r
+    return index;\r
+}
+FX_BOOL CPDF_FormField::ClearOptions(FX_BOOL bNotify)\r
+{\r
+    if (bNotify && m_pForm->m_pFormNotify != NULL)\r
+    {\r
+        int iRet = 0;\r
+        CFX_WideString csValue;\r
+        int iIndex = GetSelectedIndex(0);\r
+        if (iIndex >= 0) csValue = GetOptionLabel(iIndex);\r
+        if (GetType() == ListBox) iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue);\r
+        if (GetType() == ComboBox) iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue);\r
+        if (iRet < 0) return FALSE;\r
+    }\r
+\r
+    m_pDict->RemoveAt("Opt");\r
+    m_pDict->RemoveAt("V");\r
+    m_pDict->RemoveAt("DV");\r
+    m_pDict->RemoveAt("I");\r
+    m_pDict->RemoveAt("TI");\r
+\r
+    if (bNotify && m_pForm->m_pFormNotify != NULL)\r
+    {\r
+        if (GetType() == ListBox) m_pForm->m_pFormNotify->AfterSelectionChange(this);\r
+        if (GetType() == ComboBox) m_pForm->m_pFormNotify->AfterValueChange(this);\r
+    }\r
+\r
+    m_pForm->m_bUpdated = TRUE;\r
+    return TRUE;\r
+}
 FX_BOOL CPDF_FormField::CheckControl(int iControlIndex, FX_BOOL bChecked, FX_BOOL bNotify)
 {
     ASSERT(GetType() == CheckBox || GetType() == RadioButton);