| OLD | NEW |
| 1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| 6 | 6 |
| 7 #include "../../third_party/base/nonstd_unique_ptr.h" | 7 #include "../../third_party/base/nonstd_unique_ptr.h" |
| 8 #include "../include/fsdk_define.h" | 8 #include "../include/fsdk_define.h" |
| 9 #include "../include/fsdk_mgr.h" | 9 #include "../include/fsdk_mgr.h" |
| 10 #include "../include/fsdk_baseannot.h" | 10 #include "../include/fsdk_baseannot.h" |
| 11 #include "../include/fsdk_baseform.h" | 11 #include "../include/fsdk_baseform.h" |
| 12 #include "../include/formfiller/FFL_FormFiller.h" | 12 #include "../include/formfiller/FFL_FormFiller.h" |
| 13 #include "../include/fsdk_actionhandler.h" | 13 #include "../include/fsdk_actionhandler.h" |
| 14 | 14 |
| 15 #include "../include/javascript/IJavaScript.h" | 15 #include "../include/javascript/IJavaScript.h" |
| 16 | 16 |
| 17 //------------------------------------------------------------------------------
------ | 17 //------------------------------------------------------------------------------
------ |
| 18 //* CPDFSDK_Widget | 18 //* CPDFSDK_Widget |
| 19 //------------------------------------------------------------------------------
------ | 19 //------------------------------------------------------------------------------
------ |
| 20 | 20 |
| 21 #define IsFloatZero(f) ((f) < 0.01 && (f) > -0.01) | 21 #define IsFloatZero(f) ((f) < 0.01 && (f) > -0.01) |
| 22 #define IsFloatBigger(fa,fb) ((fa) > (fb) && !IsFloatZero((fa) -
(fb))) | 22 #define IsFloatBigger(fa, fb) ((fa) > (fb) && !IsFloatZero((fa) - (fb))) |
| 23 #define IsFloatSmaller(fa,fb) ((fa) < (fb) && !IsFloatZero((fa) -
(fb))) | 23 #define IsFloatSmaller(fa, fb) ((fa) < (fb) && !IsFloatZero((fa) - (fb))) |
| 24 #define IsFloatEqual(fa,fb) IsFloatZero((fa)-(fb)) | 24 #define IsFloatEqual(fa, fb) IsFloatZero((fa) - (fb)) |
| 25 | 25 |
| 26 CPDFSDK_Widget::CPDFSDK_Widget(CPDF_Annot* pAnnot, CPDFSDK_PageView* pPageView,
CPDFSDK_InterForm* pInterForm) : | 26 CPDFSDK_Widget::CPDFSDK_Widget(CPDF_Annot* pAnnot, |
| 27 CPDFSDK_Annot(pAnnot, pPageView), | 27 CPDFSDK_PageView* pPageView, |
| 28 m_pInterForm(pInterForm), | 28 CPDFSDK_InterForm* pInterForm) |
| 29 m_nAppAge(0), | 29 : CPDFSDK_Annot(pAnnot, pPageView), |
| 30 m_nValueAge(0) | 30 m_pInterForm(pInterForm), |
| 31 { | 31 m_nAppAge(0), |
| 32 ASSERT(m_pInterForm != NULL); | 32 m_nValueAge(0) { |
| 33 } | 33 ASSERT(m_pInterForm != NULL); |
| 34 | 34 } |
| 35 CPDFSDK_Widget::~CPDFSDK_Widget() | 35 |
| 36 { | 36 CPDFSDK_Widget::~CPDFSDK_Widget() {} |
| 37 | 37 |
| 38 } | 38 FX_BOOL CPDFSDK_Widget::IsWidgetAppearanceValid( |
| 39 | 39 CPDF_Annot::AppearanceMode mode) { |
| 40 FX_BOOL CPDFSDK_Widget::IsWidgetAppearanceValid(CPDF_Annot::AppearanceMode m
ode) | 40 CPDF_Dictionary* pAP = m_pAnnot->GetAnnotDict()->GetDict("AP"); |
| 41 { | 41 if (pAP == NULL) |
| 42 CPDF_Dictionary* pAP = m_pAnnot->GetAnnotDict()->GetDict("AP"); | 42 return FALSE; |
| 43 if (pAP == NULL) return FALSE; | 43 |
| 44 | 44 // Choose the right sub-ap |
| 45 // Choose the right sub-ap | 45 const FX_CHAR* ap_entry = "N"; |
| 46 const FX_CHAR* ap_entry = "N"; | 46 if (mode == CPDF_Annot::Down) |
| 47 if (mode == CPDF_Annot::Down) | 47 ap_entry = "D"; |
| 48 ap_entry = "D"; | 48 else if (mode == CPDF_Annot::Rollover) |
| 49 else if (mode == CPDF_Annot::Rollover) | 49 ap_entry = "R"; |
| 50 ap_entry = "R"; | 50 if (!pAP->KeyExist(ap_entry)) |
| 51 if (!pAP->KeyExist(ap_entry)) | 51 ap_entry = "N"; |
| 52 ap_entry = "N"; | 52 |
| 53 | 53 // Get the AP stream or subdirectory |
| 54 // Get the AP stream or subdirectory | 54 CPDF_Object* psub = pAP->GetElementValue(ap_entry); |
| 55 CPDF_Object* psub = pAP->GetElementValue(ap_entry); | 55 if (psub == NULL) |
| 56 if (psub == NULL) return FALSE; | 56 return FALSE; |
| 57 | 57 |
| 58 int nFieldType = GetFieldType(); | 58 int nFieldType = GetFieldType(); |
| 59 switch (nFieldType) | 59 switch (nFieldType) { |
| 60 { | |
| 61 case FIELDTYPE_PUSHBUTTON: | 60 case FIELDTYPE_PUSHBUTTON: |
| 62 case FIELDTYPE_COMBOBOX: | 61 case FIELDTYPE_COMBOBOX: |
| 63 case FIELDTYPE_LISTBOX: | 62 case FIELDTYPE_LISTBOX: |
| 64 case FIELDTYPE_TEXTFIELD: | 63 case FIELDTYPE_TEXTFIELD: |
| 65 case FIELDTYPE_SIGNATURE: | 64 case FIELDTYPE_SIGNATURE: |
| 66 return psub->GetType() == PDFOBJ_STREAM; | 65 return psub->GetType() == PDFOBJ_STREAM; |
| 67 case FIELDTYPE_CHECKBOX: | 66 case FIELDTYPE_CHECKBOX: |
| 68 case FIELDTYPE_RADIOBUTTON: | 67 case FIELDTYPE_RADIOBUTTON: |
| 69 if (psub->GetType() == PDFOBJ_DICTIONARY) { | 68 if (psub->GetType() == PDFOBJ_DICTIONARY) { |
| 70 CPDF_Dictionary* pSubDict = (CPDF_Dictionary*)psub; | 69 CPDF_Dictionary* pSubDict = (CPDF_Dictionary*)psub; |
| 71 return pSubDict->GetStream(GetAppState()) != NULL; | 70 return pSubDict->GetStream(GetAppState()) != NULL; |
| 72 } | 71 } |
| 73 return FALSE; | 72 return FALSE; |
| 74 } | 73 } |
| 75 | 74 |
| 76 return TRUE; | 75 return TRUE; |
| 77 } | 76 } |
| 78 | 77 |
| 79 int CPDFSDK_Widget::GetFieldType() const | 78 int CPDFSDK_Widget::GetFieldType() const { |
| 80 { | 79 CPDF_FormField* pField = GetFormField(); |
| 81 CPDF_FormField* pField = GetFormField(); | 80 ASSERT(pField != NULL); |
| 82 ASSERT(pField != NULL); | 81 |
| 83 | 82 return pField->GetFieldType(); |
| 84 return pField->GetFieldType(); | 83 } |
| 85 } | 84 |
| 86 | 85 int CPDFSDK_Widget::GetFieldFlags() const { |
| 87 int CPDFSDK_Widget::GetFieldFlags() const | 86 CPDF_InterForm* pPDFInterForm = m_pInterForm->GetInterForm(); |
| 88 { | 87 ASSERT(pPDFInterForm != NULL); |
| 89 CPDF_InterForm* pPDFInterForm = m_pInterForm->GetInterForm(); | 88 |
| 90 ASSERT(pPDFInterForm != NULL); | 89 CPDF_FormControl* pFormControl = |
| 91 | 90 pPDFInterForm->GetControlByDict(m_pAnnot->GetAnnotDict()); |
| 92 CPDF_FormControl* pFormControl = pPDFInterForm->GetControlByDict(m_pAnnot->G
etAnnotDict()); | 91 CPDF_FormField* pFormField = pFormControl->GetField(); |
| 93 CPDF_FormField* pFormField = pFormControl->GetField(); | 92 return pFormField->GetFieldFlags(); |
| 94 return pFormField->GetFieldFlags(); | 93 } |
| 95 } | 94 |
| 96 | 95 CFX_ByteString CPDFSDK_Widget::GetSubType() const { |
| 97 CFX_ByteString CPDFSDK_Widget::GetSubType() const | 96 int nType = GetFieldType(); |
| 98 { | 97 |
| 99 int nType = GetFieldType(); | 98 if (nType == FIELDTYPE_SIGNATURE) |
| 100 | 99 return BFFT_SIGNATURE; |
| 101 if (nType == FIELDTYPE_SIGNATURE) | 100 return CPDFSDK_Annot::GetSubType(); |
| 102 return BFFT_SIGNATURE; | 101 } |
| 103 return CPDFSDK_Annot::GetSubType(); | 102 |
| 104 } | 103 CPDF_FormField* CPDFSDK_Widget::GetFormField() const { |
| 105 | 104 ASSERT(m_pInterForm != NULL); |
| 106 CPDF_FormField* CPDFSDK_Widget::GetFormField() const | 105 |
| 107 { | 106 CPDF_FormControl* pCtrl = GetFormControl(); |
| 108 ASSERT(m_pInterForm != NULL); | 107 ASSERT(pCtrl != NULL); |
| 109 | 108 |
| 110 CPDF_FormControl* pCtrl = GetFormControl(); | 109 return pCtrl->GetField(); |
| 111 ASSERT(pCtrl != NULL); | 110 } |
| 112 | 111 |
| 113 return pCtrl->GetField(); | 112 CPDF_FormControl* CPDFSDK_Widget::GetFormControl() const { |
| 114 } | 113 ASSERT(m_pInterForm != NULL); |
| 115 | 114 |
| 116 CPDF_FormControl* CPDFSDK_Widget::GetFormControl() const | 115 CPDF_InterForm* pPDFInterForm = m_pInterForm->GetInterForm(); |
| 117 { | 116 ASSERT(pPDFInterForm != NULL); |
| 118 ASSERT(m_pInterForm != NULL); | 117 |
| 119 | 118 return pPDFInterForm->GetControlByDict(GetAnnotDict()); |
| 120 CPDF_InterForm* pPDFInterForm = m_pInterForm->GetInterForm(); | 119 } |
| 121 ASSERT(pPDFInterForm != NULL); | 120 |
| 122 | 121 CPDF_FormControl* CPDFSDK_Widget::GetFormControl(CPDF_InterForm* pInterForm, |
| 123 return pPDFInterForm->GetControlByDict(GetAnnotDict()); | 122 CPDF_Dictionary* pAnnotDict) { |
| 124 } | 123 ASSERT(pInterForm != NULL); |
| 125 | 124 ASSERT(pAnnotDict != NULL); |
| 126 CPDF_FormControl* CPDFSDK_Widget::GetFormControl(CPDF_InterForm* pInterForm, CPD
F_Dictionary* pAnnotDict) | 125 |
| 127 { | 126 CPDF_FormControl* pControl = pInterForm->GetControlByDict(pAnnotDict); |
| 128 ASSERT(pInterForm != NULL); | 127 |
| 129 ASSERT(pAnnotDict != NULL); | 128 return pControl; |
| 130 | 129 } |
| 131 CPDF_FormControl* pControl = pInterForm->GetControlByDict(pAnnotDict); | 130 |
| 132 | 131 int CPDFSDK_Widget::GetRotate() const { |
| 133 return pControl; | 132 CPDF_FormControl* pCtrl = GetFormControl(); |
| 134 } | 133 ASSERT(pCtrl != NULL); |
| 135 | 134 |
| 136 int CPDFSDK_Widget::GetRotate() const | 135 return pCtrl->GetRotation() % 360; |
| 137 { | 136 } |
| 138 CPDF_FormControl* pCtrl = GetFormControl(); | 137 |
| 139 ASSERT(pCtrl != NULL); | 138 FX_BOOL CPDFSDK_Widget::GetFillColor(FX_COLORREF& color) const { |
| 140 | 139 CPDF_FormControl* pFormCtrl = GetFormControl(); |
| 141 return pCtrl->GetRotation() % 360; | 140 ASSERT(pFormCtrl != NULL); |
| 142 } | 141 |
| 143 | 142 int iColorType = 0; |
| 144 FX_BOOL CPDFSDK_Widget::GetFillColor(FX_COLORREF& color) const | 143 color = FX_ARGBTOCOLORREF(pFormCtrl->GetBackgroundColor(iColorType)); |
| 145 { | 144 |
| 146 CPDF_FormControl* pFormCtrl = GetFormControl(); | 145 return iColorType != COLORTYPE_TRANSPARENT; |
| 147 ASSERT(pFormCtrl != NULL); | 146 } |
| 148 | 147 |
| 149 int iColorType = 0; | 148 FX_BOOL CPDFSDK_Widget::GetBorderColor(FX_COLORREF& color) const { |
| 150 color = FX_ARGBTOCOLORREF(pFormCtrl->GetBackgroundColor(iColorType)); | 149 CPDF_FormControl* pFormCtrl = GetFormControl(); |
| 150 ASSERT(pFormCtrl != NULL); |
| 151 |
| 152 int iColorType = 0; |
| 153 color = FX_ARGBTOCOLORREF(pFormCtrl->GetBorderColor(iColorType)); |
| 154 |
| 155 return iColorType != COLORTYPE_TRANSPARENT; |
| 156 } |
| 157 |
| 158 FX_BOOL CPDFSDK_Widget::GetTextColor(FX_COLORREF& color) const { |
| 159 CPDF_FormControl* pFormCtrl = GetFormControl(); |
| 160 ASSERT(pFormCtrl != NULL); |
| 161 |
| 162 CPDF_DefaultAppearance da = pFormCtrl->GetDefaultAppearance(); |
| 163 if (da.HasColor()) { |
| 164 FX_ARGB argb; |
| 165 int iColorType = COLORTYPE_TRANSPARENT; |
| 166 da.GetColor(argb, iColorType); |
| 167 color = FX_ARGBTOCOLORREF(argb); |
| 151 | 168 |
| 152 return iColorType != COLORTYPE_TRANSPARENT; | 169 return iColorType != COLORTYPE_TRANSPARENT; |
| 153 } | 170 } |
| 154 | 171 |
| 155 FX_BOOL CPDFSDK_Widget::GetBorderColor(FX_COLORREF& color) const | 172 return FALSE; |
| 156 { | 173 } |
| 157 CPDF_FormControl* pFormCtrl = GetFormControl(); | 174 |
| 158 ASSERT(pFormCtrl != NULL); | 175 FX_FLOAT CPDFSDK_Widget::GetFontSize() const { |
| 159 | 176 CPDF_FormControl* pFormCtrl = GetFormControl(); |
| 160 int iColorType = 0; | 177 ASSERT(pFormCtrl != NULL); |
| 161 color = FX_ARGBTOCOLORREF(pFormCtrl->GetBorderColor(iColorType)); | 178 |
| 162 | 179 CPDF_DefaultAppearance pDa = pFormCtrl->GetDefaultAppearance(); |
| 163 return iColorType != COLORTYPE_TRANSPARENT; | 180 CFX_ByteString csFont = ""; |
| 164 } | 181 FX_FLOAT fFontSize = 0.0f; |
| 165 | 182 pDa.GetFont(csFont, fFontSize); |
| 166 FX_BOOL CPDFSDK_Widget::GetTextColor(FX_COLORREF& color) const | 183 |
| 167 { | 184 return fFontSize; |
| 168 CPDF_FormControl* pFormCtrl = GetFormControl(); | 185 } |
| 169 ASSERT(pFormCtrl != NULL); | 186 |
| 170 | 187 int CPDFSDK_Widget::GetSelectedIndex(int nIndex) const { |
| 171 CPDF_DefaultAppearance da = pFormCtrl->GetDefaultAppearance(); | 188 CPDF_FormField* pFormField = GetFormField(); |
| 172 if (da.HasColor()) | 189 ASSERT(pFormField != NULL); |
| 173 { | 190 |
| 174 FX_ARGB argb; | 191 return pFormField->GetSelectedIndex(nIndex); |
| 175 int iColorType = COLORTYPE_TRANSPARENT; | 192 } |
| 176 da.GetColor(argb, iColorType); | 193 |
| 177 color = FX_ARGBTOCOLORREF(argb); | 194 CFX_WideString CPDFSDK_Widget::GetValue() const { |
| 178 | 195 CPDF_FormField* pFormField = GetFormField(); |
| 179 return iColorType != COLORTYPE_TRANSPARENT; | 196 ASSERT(pFormField != NULL); |
| 180 } | 197 |
| 181 | 198 return pFormField->GetValue(); |
| 182 return FALSE; | 199 } |
| 183 } | 200 |
| 184 | 201 CFX_WideString CPDFSDK_Widget::GetDefaultValue() const { |
| 185 FX_FLOAT CPDFSDK_Widget::GetFontSize() const | 202 CPDF_FormField* pFormField = GetFormField(); |
| 186 { | 203 ASSERT(pFormField != NULL); |
| 187 CPDF_FormControl* pFormCtrl = GetFormControl(); | 204 |
| 188 ASSERT(pFormCtrl != NULL); | 205 return pFormField->GetDefaultValue(); |
| 189 | 206 } |
| 190 CPDF_DefaultAppearance pDa = pFormCtrl->GetDefaultAppearance(); | 207 |
| 191 CFX_ByteString csFont = ""; | 208 CFX_WideString CPDFSDK_Widget::GetOptionLabel(int nIndex) const { |
| 192 FX_FLOAT fFontSize = 0.0f; | 209 CPDF_FormField* pFormField = GetFormField(); |
| 193 pDa.GetFont(csFont, fFontSize); | 210 ASSERT(pFormField != NULL); |
| 194 | 211 |
| 195 return fFontSize; | 212 return pFormField->GetOptionLabel(nIndex); |
| 196 } | 213 } |
| 197 | 214 |
| 198 int CPDFSDK_Widget::GetSelectedIndex(int nIndex) const | 215 int CPDFSDK_Widget::CountOptions() const { |
| 199 { | 216 CPDF_FormField* pFormField = GetFormField(); |
| 200 CPDF_FormField* pFormField = GetFormField(); | 217 ASSERT(pFormField != NULL); |
| 201 ASSERT(pFormField != NULL); | 218 |
| 202 | 219 return pFormField->CountOptions(); |
| 203 return pFormField->GetSelectedIndex(nIndex); | 220 } |
| 204 } | 221 |
| 205 | 222 FX_BOOL CPDFSDK_Widget::IsOptionSelected(int nIndex) const { |
| 206 CFX_WideString CPDFSDK_Widget::GetValue() const | 223 CPDF_FormField* pFormField = GetFormField(); |
| 207 { | 224 ASSERT(pFormField != NULL); |
| 208 CPDF_FormField* pFormField = GetFormField(); | 225 |
| 209 ASSERT(pFormField != NULL); | 226 return pFormField->IsItemSelected(nIndex); |
| 210 | 227 } |
| 211 return pFormField->GetValue(); | 228 |
| 212 } | 229 int CPDFSDK_Widget::GetTopVisibleIndex() const { |
| 213 | 230 CPDF_FormField* pFormField = GetFormField(); |
| 214 CFX_WideString CPDFSDK_Widget::GetDefaultValue() const | 231 ASSERT(pFormField != NULL); |
| 215 { | 232 |
| 216 CPDF_FormField* pFormField = GetFormField(); | 233 return pFormField->GetTopVisibleIndex(); |
| 217 ASSERT(pFormField != NULL); | 234 } |
| 218 | 235 |
| 219 return pFormField->GetDefaultValue(); | 236 FX_BOOL CPDFSDK_Widget::IsChecked() const { |
| 220 } | 237 CPDF_FormControl* pFormCtrl = GetFormControl(); |
| 221 | 238 ASSERT(pFormCtrl != NULL); |
| 222 CFX_WideString CPDFSDK_Widget::GetOptionLabel(int nIndex) const | 239 |
| 223 { | 240 return pFormCtrl->IsChecked(); |
| 224 CPDF_FormField* pFormField = GetFormField(); | 241 } |
| 225 ASSERT(pFormField != NULL); | 242 |
| 226 | 243 int CPDFSDK_Widget::GetAlignment() const { |
| 227 return pFormField->GetOptionLabel(nIndex); | 244 CPDF_FormControl* pFormCtrl = GetFormControl(); |
| 228 } | 245 ASSERT(pFormCtrl != NULL); |
| 229 | 246 |
| 230 int CPDFSDK_Widget::CountOptions() const | 247 return pFormCtrl->GetControlAlignment(); |
| 231 { | 248 } |
| 232 CPDF_FormField* pFormField = GetFormField(); | 249 |
| 233 ASSERT(pFormField != NULL); | 250 int CPDFSDK_Widget::GetMaxLen() const { |
| 234 | 251 CPDF_FormField* pFormField = GetFormField(); |
| 235 return pFormField->CountOptions(); | 252 ASSERT(pFormField != NULL); |
| 236 } | 253 |
| 237 | 254 return pFormField->GetMaxLen(); |
| 238 FX_BOOL CPDFSDK_Widget::IsOptionSelected(int nIndex) const | 255 } |
| 239 { | 256 |
| 240 CPDF_FormField* pFormField = GetFormField(); | 257 void CPDFSDK_Widget::SetCheck(FX_BOOL bChecked, FX_BOOL bNotify) { |
| 241 ASSERT(pFormField != NULL); | 258 CPDF_FormControl* pFormCtrl = GetFormControl(); |
| 242 | 259 ASSERT(pFormCtrl != NULL); |
| 243 return pFormField->IsItemSelected(nIndex); | 260 |
| 244 } | 261 CPDF_FormField* pFormField = pFormCtrl->GetField(); |
| 245 | 262 ASSERT(pFormField != NULL); |
| 246 int CPDFSDK_Widget::GetTopVisibleIndex() const | 263 |
| 247 { | 264 pFormField->CheckControl(pFormField->GetControlIndex(pFormCtrl), bChecked, |
| 248 CPDF_FormField* pFormField = GetFormField(); | 265 bNotify); |
| 249 ASSERT(pFormField != NULL); | 266 } |
| 250 | 267 |
| 251 return pFormField->GetTopVisibleIndex(); | 268 void CPDFSDK_Widget::SetValue(const CFX_WideString& sValue, FX_BOOL bNotify) { |
| 252 } | 269 CPDF_FormField* pFormField = GetFormField(); |
| 253 | 270 ASSERT(pFormField != NULL); |
| 254 FX_BOOL CPDFSDK_Widget::IsChecked() const | 271 |
| 255 { | 272 pFormField->SetValue(sValue, bNotify); |
| 256 CPDF_FormControl* pFormCtrl = GetFormControl(); | 273 } |
| 257 ASSERT(pFormCtrl != NULL); | 274 |
| 258 | 275 void CPDFSDK_Widget::SetDefaultValue(const CFX_WideString& sValue) {} |
| 259 return pFormCtrl->IsChecked(); | 276 void CPDFSDK_Widget::SetOptionSelection(int index, |
| 260 } | 277 FX_BOOL bSelected, |
| 261 | 278 FX_BOOL bNotify) { |
| 262 int CPDFSDK_Widget::GetAlignment() const | 279 CPDF_FormField* pFormField = GetFormField(); |
| 263 { | 280 ASSERT(pFormField != NULL); |
| 264 CPDF_FormControl* pFormCtrl = GetFormControl(); | 281 |
| 265 ASSERT(pFormCtrl != NULL); | 282 pFormField->SetItemSelection(index, bSelected, bNotify); |
| 266 | 283 } |
| 267 return pFormCtrl->GetControlAlignment(); | 284 |
| 268 } | 285 void CPDFSDK_Widget::ClearSelection(FX_BOOL bNotify) { |
| 269 | 286 CPDF_FormField* pFormField = GetFormField(); |
| 270 int CPDFSDK_Widget::GetMaxLen() const | 287 ASSERT(pFormField != NULL); |
| 271 { | 288 |
| 272 CPDF_FormField* pFormField = GetFormField(); | 289 pFormField->ClearSelection(bNotify); |
| 273 ASSERT(pFormField != NULL); | 290 } |
| 274 | 291 |
| 275 return pFormField->GetMaxLen(); | 292 void CPDFSDK_Widget::SetTopVisibleIndex(int index) {} |
| 276 } | 293 |
| 277 | 294 void CPDFSDK_Widget::SetAppModified() { |
| 278 void CPDFSDK_Widget::SetCheck(FX_BOOL bChecked, FX_BOOL bNotify) | 295 m_bAppModified = TRUE; |
| 279 { | 296 } |
| 280 CPDF_FormControl* pFormCtrl = GetFormControl(); | 297 |
| 281 ASSERT(pFormCtrl != NULL); | 298 void CPDFSDK_Widget::ClearAppModified() { |
| 282 | 299 m_bAppModified = FALSE; |
| 283 CPDF_FormField* pFormField = pFormCtrl->GetField(); | 300 } |
| 284 ASSERT(pFormField != NULL); | 301 |
| 285 | 302 FX_BOOL CPDFSDK_Widget::IsAppModified() const { |
| 286 pFormField->CheckControl(pFormField->GetControlIndex(pFormCtrl), bChecked, b
Notify); | 303 return m_bAppModified; |
| 287 } | 304 } |
| 288 | 305 |
| 289 void CPDFSDK_Widget::SetValue(const CFX_WideString& sValue, FX_BOOL bNotify) | 306 void CPDFSDK_Widget::ResetAppearance(const FX_WCHAR* sValue, |
| 290 { | 307 FX_BOOL bValueChanged) { |
| 291 CPDF_FormField* pFormField = GetFormField(); | 308 SetAppModified(); |
| 292 ASSERT(pFormField != NULL); | 309 |
| 293 | 310 m_nAppAge++; |
| 294 pFormField->SetValue(sValue, bNotify); | 311 if (m_nAppAge > 999999) |
| 295 } | 312 m_nAppAge = 0; |
| 296 | 313 if (bValueChanged) |
| 297 void CPDFSDK_Widget::SetDefaultValue(const CFX_WideString& sValue) | 314 m_nValueAge++; |
| 298 { | 315 |
| 299 } | 316 int nFieldType = GetFieldType(); |
| 300 void CPDFSDK_Widget::SetOptionSelection(int index, FX_BOOL bSelected, FX_BOOL bN
otify) | 317 |
| 301 { | 318 switch (nFieldType) { |
| 302 CPDF_FormField* pFormField = GetFormField(); | |
| 303 ASSERT(pFormField != NULL); | |
| 304 | |
| 305 pFormField->SetItemSelection(index, bSelected, bNotify); | |
| 306 } | |
| 307 | |
| 308 void CPDFSDK_Widget::ClearSelection(FX_BOOL bNotify) | |
| 309 { | |
| 310 CPDF_FormField* pFormField = GetFormField(); | |
| 311 ASSERT(pFormField != NULL); | |
| 312 | |
| 313 pFormField->ClearSelection(bNotify); | |
| 314 } | |
| 315 | |
| 316 void CPDFSDK_Widget::SetTopVisibleIndex(int index) | |
| 317 { | |
| 318 } | |
| 319 | |
| 320 void CPDFSDK_Widget::SetAppModified() | |
| 321 { | |
| 322 m_bAppModified = TRUE; | |
| 323 } | |
| 324 | |
| 325 void CPDFSDK_Widget::ClearAppModified() | |
| 326 { | |
| 327 m_bAppModified = FALSE; | |
| 328 } | |
| 329 | |
| 330 FX_BOOL CPDFSDK_Widget::IsAppModified() const | |
| 331 { | |
| 332 return m_bAppModified; | |
| 333 } | |
| 334 | |
| 335 void CPDFSDK_Widget::ResetAppearance(const FX_WCHAR* sValue, FX_BOOL bValueChang
ed) | |
| 336 { | |
| 337 SetAppModified(); | |
| 338 | |
| 339 m_nAppAge++; | |
| 340 if (m_nAppAge > 999999) | |
| 341 m_nAppAge = 0; | |
| 342 if (bValueChanged) | |
| 343 m_nValueAge++; | |
| 344 | |
| 345 int nFieldType = GetFieldType(); | |
| 346 | |
| 347 switch (nFieldType) | |
| 348 { | |
| 349 case FIELDTYPE_PUSHBUTTON: | 319 case FIELDTYPE_PUSHBUTTON: |
| 350 ResetAppearance_PushButton(); | 320 ResetAppearance_PushButton(); |
| 321 break; |
| 322 case FIELDTYPE_CHECKBOX: |
| 323 ResetAppearance_CheckBox(); |
| 324 break; |
| 325 case FIELDTYPE_RADIOBUTTON: |
| 326 ResetAppearance_RadioButton(); |
| 327 break; |
| 328 case FIELDTYPE_COMBOBOX: |
| 329 ResetAppearance_ComboBox(sValue); |
| 330 break; |
| 331 case FIELDTYPE_LISTBOX: |
| 332 ResetAppearance_ListBox(); |
| 333 break; |
| 334 case FIELDTYPE_TEXTFIELD: |
| 335 ResetAppearance_TextField(sValue); |
| 336 break; |
| 337 } |
| 338 |
| 339 ASSERT(m_pAnnot != NULL); |
| 340 m_pAnnot->ClearCachedAP(); |
| 341 } |
| 342 |
| 343 CFX_WideString CPDFSDK_Widget::OnFormat(FX_BOOL& bFormated) { |
| 344 CPDF_FormField* pFormField = GetFormField(); |
| 345 ASSERT(pFormField != NULL); |
| 346 return m_pInterForm->OnFormat(pFormField, bFormated); |
| 347 } |
| 348 |
| 349 void CPDFSDK_Widget::ResetFieldAppearance(FX_BOOL bValueChanged) { |
| 350 CPDF_FormField* pFormField = GetFormField(); |
| 351 ASSERT(pFormField != NULL); |
| 352 |
| 353 ASSERT(m_pInterForm != NULL); |
| 354 |
| 355 m_pInterForm->ResetFieldAppearance(pFormField, NULL, bValueChanged); |
| 356 } |
| 357 |
| 358 void CPDFSDK_Widget::DrawAppearance(CFX_RenderDevice* pDevice, |
| 359 const CPDF_Matrix* pUser2Device, |
| 360 CPDF_Annot::AppearanceMode mode, |
| 361 const CPDF_RenderOptions* pOptions) { |
| 362 int nFieldType = GetFieldType(); |
| 363 |
| 364 if ((nFieldType == FIELDTYPE_CHECKBOX || |
| 365 nFieldType == FIELDTYPE_RADIOBUTTON) && |
| 366 mode == CPDF_Annot::Normal && |
| 367 !IsWidgetAppearanceValid(CPDF_Annot::Normal)) { |
| 368 CFX_PathData pathData; |
| 369 |
| 370 CPDF_Rect rcAnnot = GetRect(); |
| 371 |
| 372 pathData.AppendRect(rcAnnot.left, rcAnnot.bottom, rcAnnot.right, |
| 373 rcAnnot.top); |
| 374 |
| 375 CFX_GraphStateData gsd; |
| 376 gsd.m_LineWidth = 0.0f; |
| 377 |
| 378 pDevice->DrawPath(&pathData, pUser2Device, &gsd, 0, 0xFFAAAAAA, |
| 379 FXFILL_ALTERNATE); |
| 380 } else { |
| 381 CPDFSDK_Annot::DrawAppearance(pDevice, pUser2Device, mode, pOptions); |
| 382 } |
| 383 } |
| 384 |
| 385 void CPDFSDK_Widget::UpdateField() { |
| 386 CPDF_FormField* pFormField = GetFormField(); |
| 387 ASSERT(pFormField != NULL); |
| 388 |
| 389 ASSERT(m_pInterForm != NULL); |
| 390 m_pInterForm->UpdateField(pFormField); |
| 391 } |
| 392 |
| 393 void CPDFSDK_Widget::DrawShadow(CFX_RenderDevice* pDevice, |
| 394 CPDFSDK_PageView* pPageView) { |
| 395 ASSERT(m_pInterForm != NULL); |
| 396 |
| 397 int nFieldType = GetFieldType(); |
| 398 if (m_pInterForm->IsNeedHighLight(nFieldType)) { |
| 399 // if (nFieldType != FIELDTYPE_PUSHBUTTON) |
| 400 // { |
| 401 CPDF_Rect rc = GetRect(); |
| 402 FX_COLORREF color = m_pInterForm->GetHighlightColor(nFieldType); |
| 403 uint8_t alpha = m_pInterForm->GetHighlightAlpha(); |
| 404 |
| 405 CFX_FloatRect rcDevice; |
| 406 ASSERT(m_pInterForm->GetDocument()); |
| 407 CPDFDoc_Environment* pEnv = m_pInterForm->GetDocument()->GetEnv(); |
| 408 if (!pEnv) |
| 409 return; |
| 410 CFX_AffineMatrix page2device; |
| 411 pPageView->GetCurrentMatrix(page2device); |
| 412 page2device.Transform(((FX_FLOAT)rc.left), ((FX_FLOAT)rc.bottom), |
| 413 rcDevice.left, rcDevice.bottom); |
| 414 // pEnv->FFI_PageToDevice(m_pPageView->GetPDFPage(), rc.left, |
| 415 // rc.bottom, &rcDevice.left, &rcDevice.bottom); |
| 416 // pEnv->FFI_PageToDevice(m_pPageView->GetPDFPage(), rc.right, |
| 417 // rc.top, &rcDevice.right, &rcDevice.top); |
| 418 page2device.Transform(((FX_FLOAT)rc.right), ((FX_FLOAT)rc.top), |
| 419 rcDevice.right, rcDevice.top); |
| 420 |
| 421 rcDevice.Normalize(); |
| 422 |
| 423 FX_ARGB argb = ArgbEncode((int)alpha, color); |
| 424 FX_RECT rcDev((int)rcDevice.left, (int)rcDevice.top, (int)rcDevice.right, |
| 425 (int)rcDevice.bottom); |
| 426 pDevice->FillRect(&rcDev, argb); |
| 427 /* }*/ |
| 428 } |
| 429 } |
| 430 |
| 431 void CPDFSDK_Widget::ResetAppearance_PushButton() { |
| 432 CPDF_FormControl* pControl = GetFormControl(); |
| 433 ASSERT(pControl != NULL); |
| 434 |
| 435 CPDF_Rect rcWindow = GetRotatedRect(); |
| 436 |
| 437 int32_t nLayout = 0; |
| 438 |
| 439 switch (pControl->GetTextPosition()) { |
| 440 case TEXTPOS_ICON: |
| 441 nLayout = PPBL_ICON; |
| 442 break; |
| 443 case TEXTPOS_BELOW: |
| 444 nLayout = PPBL_ICONTOPLABELBOTTOM; |
| 445 break; |
| 446 case TEXTPOS_ABOVE: |
| 447 nLayout = PPBL_LABELTOPICONBOTTOM; |
| 448 break; |
| 449 case TEXTPOS_RIGHT: |
| 450 nLayout = PPBL_ICONLEFTLABELRIGHT; |
| 451 break; |
| 452 case TEXTPOS_LEFT: |
| 453 nLayout = PPBL_LABELLEFTICONRIGHT; |
| 454 break; |
| 455 case TEXTPOS_OVERLAID: |
| 456 nLayout = PPBL_LABELOVERICON; |
| 457 break; |
| 458 default: |
| 459 nLayout = PPBL_LABEL; |
| 460 break; |
| 461 } |
| 462 |
| 463 CPWL_Color crBackground, crBorder; |
| 464 |
| 465 int iColorType; |
| 466 FX_FLOAT fc[4]; |
| 467 |
| 468 pControl->GetOriginalBackgroundColor(iColorType, fc); |
| 469 if (iColorType > 0) |
| 470 crBackground = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]); |
| 471 |
| 472 pControl->GetOriginalBorderColor(iColorType, fc); |
| 473 if (iColorType > 0) |
| 474 crBorder = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]); |
| 475 |
| 476 FX_FLOAT fBorderWidth = (FX_FLOAT)GetBorderWidth(); |
| 477 int32_t nBorderStyle = 0; |
| 478 CPWL_Dash dsBorder(3, 0, 0); |
| 479 CPWL_Color crLeftTop, crRightBottom; |
| 480 |
| 481 switch (GetBorderStyle()) { |
| 482 case BBS_DASH: |
| 483 nBorderStyle = PBS_DASH; |
| 484 dsBorder = CPWL_Dash(3, 3, 0); |
| 485 break; |
| 486 case BBS_BEVELED: |
| 487 nBorderStyle = PBS_BEVELED; |
| 488 fBorderWidth *= 2; |
| 489 crLeftTop = CPWL_Color(COLORTYPE_GRAY, 1); |
| 490 crRightBottom = CPWL_Utils::DevideColor(crBackground, 2); |
| 491 break; |
| 492 case BBS_INSET: |
| 493 nBorderStyle = PBS_INSET; |
| 494 fBorderWidth *= 2; |
| 495 crLeftTop = CPWL_Color(COLORTYPE_GRAY, 0.5); |
| 496 crRightBottom = CPWL_Color(COLORTYPE_GRAY, 0.75); |
| 497 break; |
| 498 case BBS_UNDERLINE: |
| 499 nBorderStyle = PBS_UNDERLINED; |
| 500 break; |
| 501 default: |
| 502 nBorderStyle = PBS_SOLID; |
| 503 break; |
| 504 } |
| 505 |
| 506 CPDF_Rect rcClient = CPWL_Utils::DeflateRect(rcWindow, fBorderWidth); |
| 507 |
| 508 CPWL_Color crText(COLORTYPE_GRAY, 0); |
| 509 |
| 510 FX_FLOAT fFontSize = 12.0f; |
| 511 CFX_ByteString csNameTag; |
| 512 |
| 513 CPDF_DefaultAppearance da = pControl->GetDefaultAppearance(); |
| 514 if (da.HasColor()) { |
| 515 da.GetColor(iColorType, fc); |
| 516 crText = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]); |
| 517 } |
| 518 |
| 519 if (da.HasFont()) |
| 520 da.GetFont(csNameTag, fFontSize); |
| 521 |
| 522 CFX_WideString csWCaption; |
| 523 CFX_WideString csNormalCaption, csRolloverCaption, csDownCaption; |
| 524 |
| 525 if (pControl->HasMKEntry("CA")) { |
| 526 csNormalCaption = pControl->GetNormalCaption(); |
| 527 } |
| 528 if (pControl->HasMKEntry("RC")) { |
| 529 csRolloverCaption = pControl->GetRolloverCaption(); |
| 530 } |
| 531 if (pControl->HasMKEntry("AC")) { |
| 532 csDownCaption = pControl->GetDownCaption(); |
| 533 } |
| 534 |
| 535 CPDF_Stream* pNormalIcon = NULL; |
| 536 CPDF_Stream* pRolloverIcon = NULL; |
| 537 CPDF_Stream* pDownIcon = NULL; |
| 538 |
| 539 if (pControl->HasMKEntry("I")) { |
| 540 pNormalIcon = pControl->GetNormalIcon(); |
| 541 } |
| 542 if (pControl->HasMKEntry("RI")) { |
| 543 pRolloverIcon = pControl->GetRolloverIcon(); |
| 544 } |
| 545 if (pControl->HasMKEntry("IX")) { |
| 546 pDownIcon = pControl->GetDownIcon(); |
| 547 } |
| 548 |
| 549 if (pNormalIcon) { |
| 550 if (CPDF_Dictionary* pImageDict = pNormalIcon->GetDict()) { |
| 551 if (pImageDict->GetString("Name").IsEmpty()) |
| 552 pImageDict->SetAtString("Name", "ImgA"); |
| 553 } |
| 554 } |
| 555 |
| 556 if (pRolloverIcon) { |
| 557 if (CPDF_Dictionary* pImageDict = pRolloverIcon->GetDict()) { |
| 558 if (pImageDict->GetString("Name").IsEmpty()) |
| 559 pImageDict->SetAtString("Name", "ImgB"); |
| 560 } |
| 561 } |
| 562 |
| 563 if (pDownIcon) { |
| 564 if (CPDF_Dictionary* pImageDict = pDownIcon->GetDict()) { |
| 565 if (pImageDict->GetString("Name").IsEmpty()) |
| 566 pImageDict->SetAtString("Name", "ImgC"); |
| 567 } |
| 568 } |
| 569 |
| 570 CPDF_IconFit iconFit = pControl->GetIconFit(); |
| 571 |
| 572 CPDFSDK_Document* pDoc = m_pInterForm->GetDocument(); |
| 573 ASSERT(pDoc != NULL); |
| 574 CPDFDoc_Environment* pEnv = pDoc->GetEnv(); |
| 575 |
| 576 CBA_FontMap FontMap( |
| 577 this, |
| 578 pEnv->GetSysHandler()); //, |
| 579 //ISystemHandle::GetSystemHandler(m_pBaseForm->Ge
tEnv())); |
| 580 FontMap.Initial(); |
| 581 |
| 582 FontMap.SetAPType("N"); |
| 583 |
| 584 CFX_ByteString csAP = |
| 585 CPWL_Utils::GetRectFillAppStream(rcWindow, crBackground) + |
| 586 CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder, |
| 587 crLeftTop, crRightBottom, nBorderStyle, |
| 588 dsBorder) + |
| 589 CPWL_Utils::GetPushButtonAppStream( |
| 590 iconFit.GetFittingBounds() ? rcWindow : rcClient, &FontMap, |
| 591 pNormalIcon, iconFit, csNormalCaption, crText, fFontSize, nLayout); |
| 592 |
| 593 WriteAppearance("N", GetRotatedRect(), GetMatrix(), csAP); |
| 594 if (pNormalIcon) |
| 595 AddImageToAppearance("N", pNormalIcon); |
| 596 |
| 597 CPDF_FormControl::HighlightingMode eHLM = pControl->GetHighlightingMode(); |
| 598 if (eHLM == CPDF_FormControl::Push || eHLM == CPDF_FormControl::Toggle) { |
| 599 if (csRolloverCaption.IsEmpty() && !pRolloverIcon) { |
| 600 csRolloverCaption = csNormalCaption; |
| 601 pRolloverIcon = pNormalIcon; |
| 602 } |
| 603 |
| 604 FontMap.SetAPType("R"); |
| 605 |
| 606 csAP = CPWL_Utils::GetRectFillAppStream(rcWindow, crBackground) + |
| 607 CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder, |
| 608 crLeftTop, crRightBottom, |
| 609 nBorderStyle, dsBorder) + |
| 610 CPWL_Utils::GetPushButtonAppStream( |
| 611 iconFit.GetFittingBounds() ? rcWindow : rcClient, &FontMap, |
| 612 pRolloverIcon, iconFit, csRolloverCaption, crText, fFontSize, |
| 613 nLayout); |
| 614 |
| 615 WriteAppearance("R", GetRotatedRect(), GetMatrix(), csAP); |
| 616 if (pRolloverIcon) |
| 617 AddImageToAppearance("R", pRolloverIcon); |
| 618 |
| 619 if (csDownCaption.IsEmpty() && !pDownIcon) { |
| 620 csDownCaption = csNormalCaption; |
| 621 pDownIcon = pNormalIcon; |
| 622 } |
| 623 |
| 624 switch (nBorderStyle) { |
| 625 case PBS_BEVELED: { |
| 626 CPWL_Color crTemp = crLeftTop; |
| 627 crLeftTop = crRightBottom; |
| 628 crRightBottom = crTemp; |
| 629 } break; |
| 630 case PBS_INSET: |
| 631 crLeftTop = CPWL_Color(COLORTYPE_GRAY, 0); |
| 632 crRightBottom = CPWL_Color(COLORTYPE_GRAY, 1); |
| 351 break; | 633 break; |
| 352 case FIELDTYPE_CHECKBOX: | 634 } |
| 353 ResetAppearance_CheckBox(); | 635 |
| 636 FontMap.SetAPType("D"); |
| 637 |
| 638 csAP = CPWL_Utils::GetRectFillAppStream( |
| 639 rcWindow, CPWL_Utils::SubstractColor(crBackground, 0.25f)) + |
| 640 CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder, |
| 641 crLeftTop, crRightBottom, |
| 642 nBorderStyle, dsBorder) + |
| 643 CPWL_Utils::GetPushButtonAppStream( |
| 644 iconFit.GetFittingBounds() ? rcWindow : rcClient, &FontMap, |
| 645 pDownIcon, iconFit, csDownCaption, crText, fFontSize, nLayout); |
| 646 |
| 647 WriteAppearance("D", GetRotatedRect(), GetMatrix(), csAP); |
| 648 if (pDownIcon) |
| 649 AddImageToAppearance("D", pDownIcon); |
| 650 } else { |
| 651 RemoveAppearance("D"); |
| 652 RemoveAppearance("R"); |
| 653 } |
| 654 } |
| 655 |
| 656 void CPDFSDK_Widget::ResetAppearance_CheckBox() { |
| 657 CPDF_FormControl* pControl = GetFormControl(); |
| 658 ASSERT(pControl != NULL); |
| 659 |
| 660 CPWL_Color crBackground, crBorder, crText; |
| 661 |
| 662 int iColorType; |
| 663 FX_FLOAT fc[4]; |
| 664 |
| 665 pControl->GetOriginalBackgroundColor(iColorType, fc); |
| 666 if (iColorType > 0) |
| 667 crBackground = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]); |
| 668 |
| 669 pControl->GetOriginalBorderColor(iColorType, fc); |
| 670 if (iColorType > 0) |
| 671 crBorder = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]); |
| 672 |
| 673 FX_FLOAT fBorderWidth = (FX_FLOAT)GetBorderWidth(); |
| 674 int32_t nBorderStyle = 0; |
| 675 CPWL_Dash dsBorder(3, 0, 0); |
| 676 CPWL_Color crLeftTop, crRightBottom; |
| 677 |
| 678 switch (GetBorderStyle()) { |
| 679 case BBS_DASH: |
| 680 nBorderStyle = PBS_DASH; |
| 681 dsBorder = CPWL_Dash(3, 3, 0); |
| 682 break; |
| 683 case BBS_BEVELED: |
| 684 nBorderStyle = PBS_BEVELED; |
| 685 fBorderWidth *= 2; |
| 686 crLeftTop = CPWL_Color(COLORTYPE_GRAY, 1); |
| 687 crRightBottom = CPWL_Utils::DevideColor(crBackground, 2); |
| 688 break; |
| 689 case BBS_INSET: |
| 690 nBorderStyle = PBS_INSET; |
| 691 fBorderWidth *= 2; |
| 692 crLeftTop = CPWL_Color(COLORTYPE_GRAY, 0.5); |
| 693 crRightBottom = CPWL_Color(COLORTYPE_GRAY, 0.75); |
| 694 break; |
| 695 case BBS_UNDERLINE: |
| 696 nBorderStyle = PBS_UNDERLINED; |
| 697 break; |
| 698 default: |
| 699 nBorderStyle = PBS_SOLID; |
| 700 break; |
| 701 } |
| 702 |
| 703 CPDF_Rect rcWindow = GetRotatedRect(); |
| 704 CPDF_Rect rcClient = CPWL_Utils::DeflateRect(rcWindow, fBorderWidth); |
| 705 |
| 706 CPDF_DefaultAppearance da = pControl->GetDefaultAppearance(); |
| 707 if (da.HasColor()) { |
| 708 da.GetColor(iColorType, fc); |
| 709 crText = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]); |
| 710 } |
| 711 |
| 712 int32_t nStyle = 0; |
| 713 |
| 714 CFX_WideString csWCaption = pControl->GetNormalCaption(); |
| 715 if (csWCaption.GetLength() > 0) { |
| 716 switch (csWCaption[0]) { |
| 717 case L'l': |
| 718 nStyle = PCS_CIRCLE; |
| 354 break; | 719 break; |
| 355 case FIELDTYPE_RADIOBUTTON: | 720 case L'8': |
| 356 ResetAppearance_RadioButton(); | 721 nStyle = PCS_CROSS; |
| 357 break; | 722 break; |
| 358 case FIELDTYPE_COMBOBOX: | 723 case L'u': |
| 359 ResetAppearance_ComboBox(sValue); | 724 nStyle = PCS_DIAMOND; |
| 360 break; | 725 break; |
| 361 case FIELDTYPE_LISTBOX: | 726 case L'n': |
| 362 ResetAppearance_ListBox(); | 727 nStyle = PCS_SQUARE; |
| 363 break; | 728 break; |
| 364 case FIELDTYPE_TEXTFIELD: | 729 case L'H': |
| 365 ResetAppearance_TextField(sValue); | 730 nStyle = PCS_STAR; |
| 366 break; | 731 break; |
| 367 } | 732 default: // L'4' |
| 368 | 733 nStyle = PCS_CHECK; |
| 369 ASSERT(m_pAnnot != NULL); | |
| 370 m_pAnnot->ClearCachedAP(); | |
| 371 } | |
| 372 | |
| 373 CFX_WideString CPDFSDK_Widget::OnFormat(FX_BOOL& bFormated) | |
| 374 { | |
| 375 CPDF_FormField* pFormField = GetFormField(); | |
| 376 ASSERT(pFormField != NULL); | |
| 377 return m_pInterForm->OnFormat(pFormField, bFormated); | |
| 378 } | |
| 379 | |
| 380 void CPDFSDK_Widget::ResetFieldAppearance(FX_BOOL bValueChanged) | |
| 381 { | |
| 382 CPDF_FormField* pFormField = GetFormField(); | |
| 383 ASSERT(pFormField != NULL); | |
| 384 | |
| 385 ASSERT(m_pInterForm != NULL); | |
| 386 | |
| 387 m_pInterForm->ResetFieldAppearance(pFormField, NULL, bValueChanged); | |
| 388 } | |
| 389 | |
| 390 void CPDFSDK_Widget::DrawAppearance(CFX_RenderDevice* pDevice, const CPDF_Mat
rix* pUser2Device, | |
| 391 CPDF_Annot::AppearanceMode mode, const CPDF_RenderOptions* pOptions) | |
| 392 { | |
| 393 int nFieldType = GetFieldType(); | |
| 394 | |
| 395 if ((nFieldType == FIELDTYPE_CHECKBOX || nFieldType == FIELDTYPE_RADIOBUTTON
) && | |
| 396 mode == CPDF_Annot::Normal && | |
| 397 !IsWidgetAppearanceValid(CPDF_Annot::Normal)) | |
| 398 { | |
| 399 CFX_PathData pathData; | |
| 400 | |
| 401 CPDF_Rect rcAnnot = GetRect(); | |
| 402 | |
| 403 pathData.AppendRect(rcAnnot.left, rcAnnot.bottom, | |
| 404 rcAnnot.right, rcAnnot.top); | |
| 405 | |
| 406 CFX_GraphStateData gsd; | |
| 407 gsd.m_LineWidth = 0.0f; | |
| 408 | |
| 409 pDevice->DrawPath(&pathData, pUser2Device, &gsd, 0, 0xFFAAAAAA, FXFILL_A
LTERNATE); | |
| 410 } | |
| 411 else | |
| 412 { | |
| 413 CPDFSDK_Annot::DrawAppearance(pDevice, pUser2Device, mode, pOptions); | |
| 414 } | |
| 415 } | |
| 416 | |
| 417 void CPDFSDK_Widget::UpdateField() | |
| 418 { | |
| 419 CPDF_FormField* pFormField = GetFormField(); | |
| 420 ASSERT(pFormField != NULL); | |
| 421 | |
| 422 ASSERT(m_pInterForm != NULL); | |
| 423 m_pInterForm->UpdateField(pFormField); | |
| 424 } | |
| 425 | |
| 426 void CPDFSDK_Widget::DrawShadow(CFX_RenderDevice* pDevice, CPDFSDK_PageView* pPa
geView) | |
| 427 { | |
| 428 ASSERT(m_pInterForm != NULL); | |
| 429 | |
| 430 int nFieldType = GetFieldType(); | |
| 431 if (m_pInterForm->IsNeedHighLight(nFieldType)) | |
| 432 { | |
| 433 | |
| 434 // if (nFieldType != FIELDTYPE_PUSHBUTTON) | |
| 435 // { | |
| 436 CPDF_Rect rc = GetRect(); | |
| 437 FX_COLORREF color = m_pInterForm->GetHighlightColor(nFieldType); | |
| 438 uint8_t alpha = m_pInterForm->GetHighlightAlpha(); | |
| 439 | |
| 440 CFX_FloatRect rcDevice; | |
| 441 ASSERT(m_pInterForm->GetDocument()); | |
| 442 CPDFDoc_Environment* pEnv = m_pInterForm->GetDocument()->GetEnv(); | |
| 443 if(!pEnv) | |
| 444 return; | |
| 445 CFX_AffineMatrix page2device; | |
| 446 pPageView->GetCurrentMatrix(page2device); | |
| 447 page2device.Transform(((FX_FLOAT)rc.left), ((FX_FLOAT)rc.bottom), rc
Device.left, rcDevice.bottom); | |
| 448 // pEnv->FFI_PageToDevice(m_pPageView->GetPDFPage(), rc.left, rc.bottom
, &rcDevice.left, &rcDevice.bottom); | |
| 449 // pEnv->FFI_PageToDevice(m_pPageView->GetPDFPage(), rc.right, rc.top,
&rcDevice.right, &rcDevice.top); | |
| 450 page2device.Transform(((FX_FLOAT)rc.right), ((FX_FLOAT)rc.top), rcDe
vice.right, rcDevice.top); | |
| 451 | |
| 452 rcDevice.Normalize(); | |
| 453 | |
| 454 FX_ARGB argb = ArgbEncode((int)alpha, color); | |
| 455 FX_RECT rcDev((int)rcDevice.left,(int)rcDevice.top,(int)rcDevice.rig
ht,(int)rcDevice.bottom); | |
| 456 pDevice->FillRect(&rcDev, argb); | |
| 457 /* }*/ | |
| 458 } | |
| 459 } | |
| 460 | |
| 461 void CPDFSDK_Widget::ResetAppearance_PushButton() | |
| 462 { | |
| 463 CPDF_FormControl* pControl = GetFormControl(); | |
| 464 ASSERT(pControl != NULL); | |
| 465 | |
| 466 | |
| 467 | |
| 468 CPDF_Rect rcWindow = GetRotatedRect(); | |
| 469 | |
| 470 int32_t nLayout = 0; | |
| 471 | |
| 472 switch (pControl->GetTextPosition()) | |
| 473 { | |
| 474 case TEXTPOS_ICON: | |
| 475 nLayout = PPBL_ICON; | |
| 476 break; | 734 break; |
| 477 case TEXTPOS_BELOW: | 735 } |
| 478 nLayout = PPBL_ICONTOPLABELBOTTOM; | 736 } else { |
| 737 nStyle = PCS_CHECK; |
| 738 } |
| 739 |
| 740 CFX_ByteString csAP_N_ON = |
| 741 CPWL_Utils::GetRectFillAppStream(rcWindow, crBackground) + |
| 742 CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder, |
| 743 crLeftTop, crRightBottom, nBorderStyle, |
| 744 dsBorder); |
| 745 |
| 746 CFX_ByteString csAP_N_OFF = csAP_N_ON; |
| 747 |
| 748 switch (nBorderStyle) { |
| 749 case PBS_BEVELED: { |
| 750 CPWL_Color crTemp = crLeftTop; |
| 751 crLeftTop = crRightBottom; |
| 752 crRightBottom = crTemp; |
| 753 } break; |
| 754 case PBS_INSET: |
| 755 crLeftTop = CPWL_Color(COLORTYPE_GRAY, 0); |
| 756 crRightBottom = CPWL_Color(COLORTYPE_GRAY, 1); |
| 757 break; |
| 758 } |
| 759 |
| 760 CFX_ByteString csAP_D_ON = |
| 761 CPWL_Utils::GetRectFillAppStream( |
| 762 rcWindow, CPWL_Utils::SubstractColor(crBackground, 0.25f)) + |
| 763 CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder, |
| 764 crLeftTop, crRightBottom, nBorderStyle, |
| 765 dsBorder); |
| 766 |
| 767 CFX_ByteString csAP_D_OFF = csAP_D_ON; |
| 768 |
| 769 csAP_N_ON += CPWL_Utils::GetCheckBoxAppStream(rcClient, nStyle, crText); |
| 770 csAP_D_ON += CPWL_Utils::GetCheckBoxAppStream(rcClient, nStyle, crText); |
| 771 |
| 772 WriteAppearance("N", GetRotatedRect(), GetMatrix(), csAP_N_ON, |
| 773 pControl->GetCheckedAPState()); |
| 774 WriteAppearance("N", GetRotatedRect(), GetMatrix(), csAP_N_OFF, "Off"); |
| 775 |
| 776 WriteAppearance("D", GetRotatedRect(), GetMatrix(), csAP_D_ON, |
| 777 pControl->GetCheckedAPState()); |
| 778 WriteAppearance("D", GetRotatedRect(), GetMatrix(), csAP_D_OFF, "Off"); |
| 779 |
| 780 CFX_ByteString csAS = GetAppState(); |
| 781 if (csAS.IsEmpty()) |
| 782 SetAppState("Off"); |
| 783 } |
| 784 |
| 785 void CPDFSDK_Widget::ResetAppearance_RadioButton() { |
| 786 CPDF_FormControl* pControl = GetFormControl(); |
| 787 ASSERT(pControl != NULL); |
| 788 |
| 789 CPWL_Color crBackground, crBorder, crText; |
| 790 |
| 791 int iColorType; |
| 792 FX_FLOAT fc[4]; |
| 793 |
| 794 pControl->GetOriginalBackgroundColor(iColorType, fc); |
| 795 if (iColorType > 0) |
| 796 crBackground = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]); |
| 797 |
| 798 pControl->GetOriginalBorderColor(iColorType, fc); |
| 799 if (iColorType > 0) |
| 800 crBorder = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]); |
| 801 |
| 802 FX_FLOAT fBorderWidth = (FX_FLOAT)GetBorderWidth(); |
| 803 int32_t nBorderStyle = 0; |
| 804 CPWL_Dash dsBorder(3, 0, 0); |
| 805 CPWL_Color crLeftTop, crRightBottom; |
| 806 |
| 807 switch (GetBorderStyle()) { |
| 808 case BBS_DASH: |
| 809 nBorderStyle = PBS_DASH; |
| 810 dsBorder = CPWL_Dash(3, 3, 0); |
| 811 break; |
| 812 case BBS_BEVELED: |
| 813 nBorderStyle = PBS_BEVELED; |
| 814 fBorderWidth *= 2; |
| 815 crLeftTop = CPWL_Color(COLORTYPE_GRAY, 1); |
| 816 crRightBottom = CPWL_Utils::DevideColor(crBackground, 2); |
| 817 break; |
| 818 case BBS_INSET: |
| 819 nBorderStyle = PBS_INSET; |
| 820 fBorderWidth *= 2; |
| 821 crLeftTop = CPWL_Color(COLORTYPE_GRAY, 0.5); |
| 822 crRightBottom = CPWL_Color(COLORTYPE_GRAY, 0.75); |
| 823 break; |
| 824 case BBS_UNDERLINE: |
| 825 nBorderStyle = PBS_UNDERLINED; |
| 826 break; |
| 827 default: |
| 828 nBorderStyle = PBS_SOLID; |
| 829 break; |
| 830 } |
| 831 |
| 832 CPDF_Rect rcWindow = GetRotatedRect(); |
| 833 CPDF_Rect rcClient = CPWL_Utils::DeflateRect(rcWindow, fBorderWidth); |
| 834 |
| 835 CPDF_DefaultAppearance da = pControl->GetDefaultAppearance(); |
| 836 if (da.HasColor()) { |
| 837 da.GetColor(iColorType, fc); |
| 838 crText = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]); |
| 839 } |
| 840 |
| 841 int32_t nStyle = 0; |
| 842 |
| 843 CFX_WideString csWCaption = pControl->GetNormalCaption(); |
| 844 if (csWCaption.GetLength() > 0) { |
| 845 switch (csWCaption[0]) { |
| 846 default: // L'l': |
| 847 nStyle = PCS_CIRCLE; |
| 479 break; | 848 break; |
| 480 case TEXTPOS_ABOVE: | 849 case L'8': |
| 481 nLayout = PPBL_LABELTOPICONBOTTOM; | 850 nStyle = PCS_CROSS; |
| 482 break; | 851 break; |
| 483 case TEXTPOS_RIGHT: | 852 case L'u': |
| 484 nLayout = PPBL_ICONLEFTLABELRIGHT; | 853 nStyle = PCS_DIAMOND; |
| 485 break; | 854 break; |
| 486 case TEXTPOS_LEFT: | 855 case L'n': |
| 487 nLayout = PPBL_LABELLEFTICONRIGHT; | 856 nStyle = PCS_SQUARE; |
| 488 break; | 857 break; |
| 489 case TEXTPOS_OVERLAID: | 858 case L'H': |
| 490 nLayout = PPBL_LABELOVERICON; | 859 nStyle = PCS_STAR; |
| 491 break; | 860 break; |
| 492 default: | 861 case L'4': |
| 493 nLayout = PPBL_LABEL; | 862 nStyle = PCS_CHECK; |
| 494 break; | 863 break; |
| 495 } | 864 } |
| 496 | 865 } else { |
| 497 CPWL_Color crBackground, crBorder; | 866 nStyle = PCS_CIRCLE; |
| 498 | 867 } |
| 499 int iColorType; | 868 |
| 500 FX_FLOAT fc[4]; | 869 CFX_ByteString csAP_N_ON; |
| 501 | 870 |
| 502 pControl->GetOriginalBackgroundColor(iColorType, fc); | 871 CPDF_Rect rcCenter = |
| 503 if (iColorType > 0) | 872 CPWL_Utils::DeflateRect(CPWL_Utils::GetCenterSquare(rcWindow), 1.0f); |
| 504 crBackground = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]); | 873 |
| 505 | 874 if (nStyle == PCS_CIRCLE) { |
| 506 pControl->GetOriginalBorderColor(iColorType, fc); | 875 if (nBorderStyle == PBS_BEVELED) { |
| 507 if (iColorType > 0) | 876 crLeftTop = CPWL_Color(COLORTYPE_GRAY, 1); |
| 508 crBorder = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]); | 877 crRightBottom = CPWL_Utils::SubstractColor(crBackground, 0.25f); |
| 509 | 878 } else if (nBorderStyle == PBS_INSET) { |
| 510 FX_FLOAT fBorderWidth = (FX_FLOAT)GetBorderWidth(); | 879 crLeftTop = CPWL_Color(COLORTYPE_GRAY, 0.5f); |
| 511 int32_t nBorderStyle = 0; | 880 crRightBottom = CPWL_Color(COLORTYPE_GRAY, 0.75f); |
| 512 CPWL_Dash dsBorder(3,0,0); | 881 } |
| 513 CPWL_Color crLeftTop,crRightBottom; | 882 |
| 514 | 883 csAP_N_ON = CPWL_Utils::GetCircleFillAppStream(rcCenter, crBackground) + |
| 515 switch (GetBorderStyle()) | 884 CPWL_Utils::GetCircleBorderAppStream( |
| 516 { | 885 rcCenter, fBorderWidth, crBorder, crLeftTop, crRightBottom, |
| 517 case BBS_DASH: | 886 nBorderStyle, dsBorder); |
| 518 nBorderStyle = PBS_DASH; | 887 } else { |
| 519 dsBorder = CPWL_Dash(3, 3, 0); | 888 csAP_N_ON = CPWL_Utils::GetRectFillAppStream(rcWindow, crBackground) + |
| 520 break; | 889 CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder, |
| 521 case BBS_BEVELED: | 890 crLeftTop, crRightBottom, |
| 522 nBorderStyle = PBS_BEVELED; | 891 nBorderStyle, dsBorder); |
| 523 fBorderWidth *= 2; | 892 } |
| 524 crLeftTop = CPWL_Color(COLORTYPE_GRAY,1); | 893 |
| 525 crRightBottom = CPWL_Utils::DevideColor(crBackground,2); | 894 CFX_ByteString csAP_N_OFF = csAP_N_ON; |
| 526 break; | 895 |
| 527 case BBS_INSET: | 896 switch (nBorderStyle) { |
| 528 nBorderStyle = PBS_INSET; | 897 case PBS_BEVELED: { |
| 529 fBorderWidth *= 2; | 898 CPWL_Color crTemp = crLeftTop; |
| 530 crLeftTop = CPWL_Color(COLORTYPE_GRAY,0.5); | 899 crLeftTop = crRightBottom; |
| 531 crRightBottom = CPWL_Color(COLORTYPE_GRAY,0.75); | 900 crRightBottom = crTemp; |
| 532 break; | 901 } break; |
| 533 case BBS_UNDERLINE: | 902 case PBS_INSET: |
| 534 nBorderStyle = PBS_UNDERLINED; | 903 crLeftTop = CPWL_Color(COLORTYPE_GRAY, 0); |
| 535 break; | 904 crRightBottom = CPWL_Color(COLORTYPE_GRAY, 1); |
| 536 default: | 905 break; |
| 537 nBorderStyle = PBS_SOLID; | 906 } |
| 538 break; | 907 |
| 539 } | 908 CFX_ByteString csAP_D_ON; |
| 540 | 909 |
| 541 CPDF_Rect rcClient = CPWL_Utils::DeflateRect(rcWindow,fBorderWidth); | 910 if (nStyle == PCS_CIRCLE) { |
| 542 | 911 CPWL_Color crBK = CPWL_Utils::SubstractColor(crBackground, 0.25f); |
| 543 CPWL_Color crText(COLORTYPE_GRAY,0); | 912 if (nBorderStyle == PBS_BEVELED) { |
| 544 | 913 crLeftTop = CPWL_Utils::SubstractColor(crBackground, 0.25f); |
| 545 FX_FLOAT fFontSize = 12.0f; | 914 crRightBottom = CPWL_Color(COLORTYPE_GRAY, 1); |
| 546 CFX_ByteString csNameTag; | 915 crBK = crBackground; |
| 547 | 916 } else if (nBorderStyle == PBS_INSET) { |
| 548 CPDF_DefaultAppearance da = pControl->GetDefaultAppearance(); | 917 crLeftTop = CPWL_Color(COLORTYPE_GRAY, 0); |
| 549 if (da.HasColor()) | 918 crRightBottom = CPWL_Color(COLORTYPE_GRAY, 1); |
| 550 { | 919 } |
| 551 da.GetColor(iColorType, fc); | 920 |
| 552 crText = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]); | 921 csAP_D_ON = CPWL_Utils::GetCircleFillAppStream(rcCenter, crBK) + |
| 553 } | 922 CPWL_Utils::GetCircleBorderAppStream( |
| 554 | 923 rcCenter, fBorderWidth, crBorder, crLeftTop, crRightBottom, |
| 555 if (da.HasFont()) | 924 nBorderStyle, dsBorder); |
| 556 da.GetFont(csNameTag, fFontSize); | 925 } else { |
| 557 | 926 csAP_D_ON = CPWL_Utils::GetRectFillAppStream( |
| 558 CFX_WideString csWCaption; | 927 rcWindow, CPWL_Utils::SubstractColor(crBackground, 0.25f)) + |
| 559 CFX_WideString csNormalCaption, csRolloverCaption, csDownCaption; | 928 CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder, |
| 560 | 929 crLeftTop, crRightBottom, |
| 561 if (pControl->HasMKEntry("CA")) | 930 nBorderStyle, dsBorder); |
| 562 { | 931 } |
| 563 csNormalCaption = pControl->GetNormalCaption(); | 932 |
| 564 } | 933 CFX_ByteString csAP_D_OFF = csAP_D_ON; |
| 565 if (pControl->HasMKEntry("RC")) | 934 |
| 566 { | 935 csAP_N_ON += CPWL_Utils::GetRadioButtonAppStream(rcClient, nStyle, crText); |
| 567 csRolloverCaption = pControl->GetRolloverCaption(); | 936 csAP_D_ON += CPWL_Utils::GetRadioButtonAppStream(rcClient, nStyle, crText); |
| 568 } | 937 |
| 569 if (pControl->HasMKEntry("AC")) | 938 WriteAppearance("N", GetRotatedRect(), GetMatrix(), csAP_N_ON, |
| 570 { | 939 pControl->GetCheckedAPState()); |
| 571 csDownCaption = pControl->GetDownCaption(); | 940 WriteAppearance("N", GetRotatedRect(), GetMatrix(), csAP_N_OFF, "Off"); |
| 572 } | 941 |
| 573 | 942 WriteAppearance("D", GetRotatedRect(), GetMatrix(), csAP_D_ON, |
| 574 CPDF_Stream* pNormalIcon = NULL; | 943 pControl->GetCheckedAPState()); |
| 575 CPDF_Stream* pRolloverIcon = NULL; | 944 WriteAppearance("D", GetRotatedRect(), GetMatrix(), csAP_D_OFF, "Off"); |
| 576 CPDF_Stream* pDownIcon = NULL; | 945 |
| 577 | 946 CFX_ByteString csAS = GetAppState(); |
| 578 if (pControl->HasMKEntry("I")) | 947 if (csAS.IsEmpty()) |
| 579 { | 948 SetAppState("Off"); |
| 580 pNormalIcon = pControl->GetNormalIcon(); | 949 } |
| 581 } | 950 |
| 582 if (pControl->HasMKEntry("RI")) | 951 void CPDFSDK_Widget::ResetAppearance_ComboBox(const FX_WCHAR* sValue) { |
| 583 { | 952 CPDF_FormControl* pControl = GetFormControl(); |
| 584 pRolloverIcon = pControl->GetRolloverIcon(); | 953 ASSERT(pControl != NULL); |
| 585 } | 954 CPDF_FormField* pField = pControl->GetField(); |
| 586 if (pControl->HasMKEntry("IX")) | 955 ASSERT(pField != NULL); |
| 587 { | 956 |
| 588 pDownIcon = pControl->GetDownIcon(); | 957 CFX_ByteTextBuf sBody, sLines; |
| 589 } | 958 |
| 590 | 959 CPDF_Rect rcClient = GetClientRect(); |
| 591 if (pNormalIcon) | 960 CPDF_Rect rcButton = rcClient; |
| 592 { | 961 rcButton.left = rcButton.right - 13; |
| 593 if (CPDF_Dictionary* pImageDict = pNormalIcon->GetDict()) | 962 rcButton.Normalize(); |
| 594 { | 963 |
| 595 if (pImageDict->GetString("Name").IsEmpty()) | 964 if (IFX_Edit* pEdit = IFX_Edit::NewEdit()) { |
| 596 pImageDict->SetAtString("Name", "ImgA"); | 965 pEdit->EnableRefresh(FALSE); |
| 597 } | |
| 598 } | |
| 599 | |
| 600 if (pRolloverIcon) | |
| 601 { | |
| 602 if (CPDF_Dictionary* pImageDict = pRolloverIcon->GetDict()) | |
| 603 { | |
| 604 if (pImageDict->GetString("Name").IsEmpty()) | |
| 605 pImageDict->SetAtString("Name", "ImgB"); | |
| 606 } | |
| 607 } | |
| 608 | |
| 609 if (pDownIcon) | |
| 610 { | |
| 611 if (CPDF_Dictionary* pImageDict = pDownIcon->GetDict()) | |
| 612 { | |
| 613 if (pImageDict->GetString("Name").IsEmpty()) | |
| 614 pImageDict->SetAtString("Name", "ImgC"); | |
| 615 } | |
| 616 } | |
| 617 | |
| 618 CPDF_IconFit iconFit = pControl->GetIconFit(); | |
| 619 | 966 |
| 620 CPDFSDK_Document* pDoc = m_pInterForm->GetDocument(); | 967 CPDFSDK_Document* pDoc = m_pInterForm->GetDocument(); |
| 621 ASSERT(pDoc != NULL); | 968 ASSERT(pDoc != NULL); |
| 622 CPDFDoc_Environment* pEnv = pDoc->GetEnv(); | 969 CPDFDoc_Environment* pEnv = pDoc->GetEnv(); |
| 623 | 970 CBA_FontMap FontMap(this, pEnv->GetSysHandler()); |
| 624 CBA_FontMap FontMap(this,pEnv->GetSysHandler());//, ISystemHandle::GetSystem
Handler(m_pBaseForm->GetEnv())); | |
| 625 FontMap.Initial(); | 971 FontMap.Initial(); |
| 626 | 972 pEdit->SetFontMap(&FontMap); |
| 627 FontMap.SetAPType("N"); | 973 |
| 628 | 974 CPDF_Rect rcEdit = rcClient; |
| 629 CFX_ByteString csAP = CPWL_Utils::GetRectFillAppStream(rcWindow, crBackgroun
d) + | 975 rcEdit.right = rcButton.left; |
| 630 CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder, crLeftT
op, crRightBottom, nBorderStyle, dsBorder) + | 976 rcEdit.Normalize(); |
| 631 CPWL_Utils::GetPushButtonAppStream(iconFit.GetFittingBounds() ? rcWindow
: rcClient, &FontMap, pNormalIcon, iconFit, csNormalCaption, crText, fFontSize,
nLayout); | 977 |
| 632 | 978 pEdit->SetPlateRect(rcEdit); |
| 633 WriteAppearance("N", GetRotatedRect(), GetMatrix(), csAP); | 979 pEdit->SetAlignmentV(1); |
| 634 if (pNormalIcon) | 980 |
| 635 AddImageToAppearance("N", pNormalIcon); | 981 FX_FLOAT fFontSize = GetFontSize(); |
| 636 | 982 if (IsFloatZero(fFontSize)) |
| 637 CPDF_FormControl::HighlightingMode eHLM = pControl->GetHighlightingMode(); | 983 pEdit->SetAutoFontSize(TRUE); |
| 638 if (eHLM == CPDF_FormControl::Push || eHLM == CPDF_FormControl::Toggle) | 984 else |
| 639 { | 985 pEdit->SetFontSize(fFontSize); |
| 640 if (csRolloverCaption.IsEmpty() && !pRolloverIcon) | 986 |
| 641 { | 987 pEdit->Initialize(); |
| 642 csRolloverCaption = csNormalCaption; | 988 |
| 643 pRolloverIcon = pNormalIcon; | 989 if (sValue) |
| 990 pEdit->SetText(sValue); |
| 991 else { |
| 992 int32_t nCurSel = pField->GetSelectedIndex(0); |
| 993 |
| 994 if (nCurSel < 0) |
| 995 pEdit->SetText(pField->GetValue().c_str()); |
| 996 else |
| 997 pEdit->SetText(pField->GetOptionLabel(nCurSel).c_str()); |
| 998 } |
| 999 |
| 1000 CPDF_Rect rcContent = pEdit->GetContentRect(); |
| 1001 |
| 1002 CFX_ByteString sEdit = |
| 1003 CPWL_Utils::GetEditAppStream(pEdit, CPDF_Point(0.0f, 0.0f)); |
| 1004 if (sEdit.GetLength() > 0) { |
| 1005 sBody << "/Tx BMC\n" |
| 1006 << "q\n"; |
| 1007 if (rcContent.Width() > rcEdit.Width() || |
| 1008 rcContent.Height() > rcEdit.Height()) { |
| 1009 sBody << rcEdit.left << " " << rcEdit.bottom << " " << rcEdit.Width() |
| 1010 << " " << rcEdit.Height() << " re\nW\nn\n"; |
| 1011 } |
| 1012 |
| 1013 CPWL_Color crText = GetTextPWLColor(); |
| 1014 sBody << "BT\n" << CPWL_Utils::GetColorAppStream(crText) << sEdit |
| 1015 << "ET\n" |
| 1016 << "Q\nEMC\n"; |
| 1017 } |
| 1018 |
| 1019 IFX_Edit::DelEdit(pEdit); |
| 1020 } |
| 1021 |
| 1022 sBody << CPWL_Utils::GetDropButtonAppStream(rcButton); |
| 1023 |
| 1024 CFX_ByteString sAP = GetBackgroundAppStream() + GetBorderAppStream() + |
| 1025 sLines.GetByteString() + sBody.GetByteString(); |
| 1026 |
| 1027 WriteAppearance("N", GetRotatedRect(), GetMatrix(), sAP); |
| 1028 } |
| 1029 |
| 1030 void CPDFSDK_Widget::ResetAppearance_ListBox() { |
| 1031 CPDF_FormControl* pControl = GetFormControl(); |
| 1032 ASSERT(pControl != NULL); |
| 1033 CPDF_FormField* pField = pControl->GetField(); |
| 1034 ASSERT(pField != NULL); |
| 1035 |
| 1036 CPDF_Rect rcClient = GetClientRect(); |
| 1037 |
| 1038 CFX_ByteTextBuf sBody, sLines; |
| 1039 |
| 1040 if (IFX_Edit* pEdit = IFX_Edit::NewEdit()) { |
| 1041 pEdit->EnableRefresh(FALSE); |
| 1042 |
| 1043 CPDFSDK_Document* pDoc = m_pInterForm->GetDocument(); |
| 1044 ASSERT(pDoc != NULL); |
| 1045 CPDFDoc_Environment* pEnv = pDoc->GetEnv(); |
| 1046 |
| 1047 CBA_FontMap FontMap(this, pEnv->GetSysHandler()); |
| 1048 FontMap.Initial(); |
| 1049 pEdit->SetFontMap(&FontMap); |
| 1050 |
| 1051 pEdit->SetPlateRect(CPDF_Rect(rcClient.left, 0.0f, rcClient.right, 0.0f)); |
| 1052 |
| 1053 FX_FLOAT fFontSize = GetFontSize(); |
| 1054 |
| 1055 if (IsFloatZero(fFontSize)) |
| 1056 pEdit->SetFontSize(12.0f); |
| 1057 else |
| 1058 pEdit->SetFontSize(fFontSize); |
| 1059 |
| 1060 pEdit->Initialize(); |
| 1061 |
| 1062 CFX_ByteTextBuf sList; |
| 1063 FX_FLOAT fy = rcClient.top; |
| 1064 |
| 1065 int32_t nTop = pField->GetTopVisibleIndex(); |
| 1066 int32_t nCount = pField->CountOptions(); |
| 1067 int32_t nSelCount = pField->CountSelectedItems(); |
| 1068 |
| 1069 for (int32_t i = nTop; i < nCount; i++) { |
| 1070 FX_BOOL bSelected = FALSE; |
| 1071 for (int32_t j = 0; j < nSelCount; j++) { |
| 1072 if (pField->GetSelectedIndex(j) == i) { |
| 1073 bSelected = TRUE; |
| 1074 break; |
| 644 } | 1075 } |
| 645 | 1076 } |
| 646 FontMap.SetAPType("R"); | 1077 |
| 647 | 1078 pEdit->SetText(pField->GetOptionLabel(i).c_str()); |
| 648 csAP = CPWL_Utils::GetRectFillAppStream(rcWindow, crBackground) + | 1079 |
| 649 CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder,
crLeftTop, crRightBottom, nBorderStyle, dsBorder) + | 1080 CPDF_Rect rcContent = pEdit->GetContentRect(); |
| 650 CPWL_Utils::GetPushButtonAppStream(iconFit.GetFittingBounds() ?
rcWindow : rcClient, &FontMap, pRolloverIcon, iconFit, csRolloverCaption, crText
, fFontSize, nLayout); | 1081 FX_FLOAT fItemHeight = rcContent.Height(); |
| 651 | 1082 |
| 652 WriteAppearance("R", GetRotatedRect(), GetMatrix(), csAP); | 1083 if (bSelected) { |
| 653 if (pRolloverIcon) | 1084 CPDF_Rect rcItem = |
| 654 AddImageToAppearance("R", pRolloverIcon); | 1085 CPDF_Rect(rcClient.left, fy - fItemHeight, rcClient.right, fy); |
| 655 | 1086 sList << "q\n" << CPWL_Utils::GetColorAppStream( |
| 656 if (csDownCaption.IsEmpty() && !pDownIcon) | 1087 CPWL_Color(COLORTYPE_RGB, 0, 51.0f / 255.0f, |
| 657 { | 1088 113.0f / 255.0f), |
| 658 csDownCaption = csNormalCaption; | 1089 TRUE) |
| 659 pDownIcon = pNormalIcon; | 1090 << rcItem.left << " " << rcItem.bottom << " " << rcItem.Width() |
| 1091 << " " << rcItem.Height() << " re f\n" |
| 1092 << "Q\n"; |
| 1093 |
| 1094 sList << "BT\n" << CPWL_Utils::GetColorAppStream( |
| 1095 CPWL_Color(COLORTYPE_GRAY, 1), TRUE) |
| 1096 << CPWL_Utils::GetEditAppStream(pEdit, CPDF_Point(0.0f, fy)) |
| 1097 << "ET\n"; |
| 1098 } else { |
| 1099 CPWL_Color crText = GetTextPWLColor(); |
| 1100 sList << "BT\n" << CPWL_Utils::GetColorAppStream(crText, TRUE) |
| 1101 << CPWL_Utils::GetEditAppStream(pEdit, CPDF_Point(0.0f, fy)) |
| 1102 << "ET\n"; |
| 1103 } |
| 1104 |
| 1105 fy -= fItemHeight; |
| 1106 } |
| 1107 |
| 1108 if (sList.GetSize() > 0) { |
| 1109 sBody << "/Tx BMC\n" |
| 1110 << "q\n" << rcClient.left << " " << rcClient.bottom << " " |
| 1111 << rcClient.Width() << " " << rcClient.Height() << " re\nW\nn\n"; |
| 1112 sBody << sList << "Q\nEMC\n"; |
| 1113 } |
| 1114 |
| 1115 IFX_Edit::DelEdit(pEdit); |
| 1116 } |
| 1117 |
| 1118 CFX_ByteString sAP = GetBackgroundAppStream() + GetBorderAppStream() + |
| 1119 sLines.GetByteString() + sBody.GetByteString(); |
| 1120 |
| 1121 WriteAppearance("N", GetRotatedRect(), GetMatrix(), sAP); |
| 1122 } |
| 1123 |
| 1124 void CPDFSDK_Widget::ResetAppearance_TextField(const FX_WCHAR* sValue) { |
| 1125 CPDF_FormControl* pControl = GetFormControl(); |
| 1126 ASSERT(pControl != NULL); |
| 1127 CPDF_FormField* pField = pControl->GetField(); |
| 1128 ASSERT(pField != NULL); |
| 1129 |
| 1130 CFX_ByteTextBuf sBody, sLines; |
| 1131 |
| 1132 if (IFX_Edit* pEdit = IFX_Edit::NewEdit()) { |
| 1133 pEdit->EnableRefresh(FALSE); |
| 1134 |
| 1135 CPDFSDK_Document* pDoc = m_pInterForm->GetDocument(); |
| 1136 ASSERT(pDoc != NULL); |
| 1137 CPDFDoc_Environment* pEnv = pDoc->GetEnv(); |
| 1138 |
| 1139 CBA_FontMap FontMap( |
| 1140 this, |
| 1141 pEnv->GetSysHandler()); //, |
| 1142 //ISystemHandle::GetSystemHandler(m_pBaseForm->
GetEnv())); |
| 1143 FontMap.Initial(); |
| 1144 pEdit->SetFontMap(&FontMap); |
| 1145 |
| 1146 CPDF_Rect rcClient = GetClientRect(); |
| 1147 pEdit->SetPlateRect(rcClient); |
| 1148 pEdit->SetAlignmentH(pControl->GetControlAlignment()); |
| 1149 |
| 1150 FX_DWORD dwFieldFlags = pField->GetFieldFlags(); |
| 1151 FX_BOOL bMultiLine = (dwFieldFlags >> 12) & 1; |
| 1152 |
| 1153 if (bMultiLine) { |
| 1154 pEdit->SetMultiLine(TRUE); |
| 1155 pEdit->SetAutoReturn(TRUE); |
| 1156 } else { |
| 1157 pEdit->SetAlignmentV(1); |
| 1158 } |
| 1159 |
| 1160 FX_WORD subWord = 0; |
| 1161 if ((dwFieldFlags >> 13) & 1) { |
| 1162 subWord = '*'; |
| 1163 pEdit->SetPasswordChar(subWord); |
| 1164 } |
| 1165 |
| 1166 int nMaxLen = pField->GetMaxLen(); |
| 1167 FX_BOOL bCharArray = (dwFieldFlags >> 24) & 1; |
| 1168 FX_FLOAT fFontSize = GetFontSize(); |
| 1169 |
| 1170 if (nMaxLen > 0) { |
| 1171 if (bCharArray) { |
| 1172 pEdit->SetCharArray(nMaxLen); |
| 1173 |
| 1174 if (IsFloatZero(fFontSize)) { |
| 1175 fFontSize = CPWL_Edit::GetCharArrayAutoFontSize(FontMap.GetPDFFont(0), |
| 1176 rcClient, nMaxLen); |
| 660 } | 1177 } |
| 661 | 1178 } else { |
| 662 switch (nBorderStyle) | 1179 if (sValue) |
| 663 { | 1180 nMaxLen = wcslen((const wchar_t*)sValue); |
| 664 case PBS_BEVELED: | 1181 pEdit->SetLimitChar(nMaxLen); |
| 665 { | 1182 } |
| 666 CPWL_Color crTemp = crLeftTop; | 1183 } |
| 667 crLeftTop = crRightBottom; | 1184 |
| 668 crRightBottom = crTemp; | 1185 if (IsFloatZero(fFontSize)) |
| 1186 pEdit->SetAutoFontSize(TRUE); |
| 1187 else |
| 1188 pEdit->SetFontSize(fFontSize); |
| 1189 |
| 1190 pEdit->Initialize(); |
| 1191 |
| 1192 if (sValue) |
| 1193 pEdit->SetText(sValue); |
| 1194 else |
| 1195 pEdit->SetText(pField->GetValue().c_str()); |
| 1196 |
| 1197 CPDF_Rect rcContent = pEdit->GetContentRect(); |
| 1198 |
| 1199 CFX_ByteString sEdit = CPWL_Utils::GetEditAppStream( |
| 1200 pEdit, CPDF_Point(0.0f, 0.0f), NULL, !bCharArray, subWord); |
| 1201 |
| 1202 if (sEdit.GetLength() > 0) { |
| 1203 sBody << "/Tx BMC\n" |
| 1204 << "q\n"; |
| 1205 if (rcContent.Width() > rcClient.Width() || |
| 1206 rcContent.Height() > rcClient.Height()) { |
| 1207 sBody << rcClient.left << " " << rcClient.bottom << " " |
| 1208 << rcClient.Width() << " " << rcClient.Height() << " re\nW\nn\n"; |
| 1209 } |
| 1210 CPWL_Color crText = GetTextPWLColor(); |
| 1211 sBody << "BT\n" << CPWL_Utils::GetColorAppStream(crText) << sEdit |
| 1212 << "ET\n" |
| 1213 << "Q\nEMC\n"; |
| 1214 } |
| 1215 |
| 1216 if (bCharArray) { |
| 1217 switch (GetBorderStyle()) { |
| 1218 case BBS_SOLID: { |
| 1219 CFX_ByteString sColor = |
| 1220 CPWL_Utils::GetColorAppStream(GetBorderPWLColor(), FALSE); |
| 1221 if (sColor.GetLength() > 0) { |
| 1222 sLines << "q\n" << GetBorderWidth() << " w\n" |
| 1223 << CPWL_Utils::GetColorAppStream(GetBorderPWLColor(), FALSE) |
| 1224 << " 2 J 0 j\n"; |
| 1225 |
| 1226 for (int32_t i = 1; i < nMaxLen; i++) { |
| 1227 sLines << rcClient.left + |
| 1228 ((rcClient.right - rcClient.left) / nMaxLen) * i |
| 1229 << " " << rcClient.bottom << " m\n" |
| 1230 << rcClient.left + |
| 1231 ((rcClient.right - rcClient.left) / nMaxLen) * i |
| 1232 << " " << rcClient.top << " l S\n"; |
| 669 } | 1233 } |
| 670 break; | 1234 |
| 671 case PBS_INSET: | 1235 sLines << "Q\n"; |
| 672 crLeftTop = CPWL_Color(COLORTYPE_GRAY,0); | 1236 } |
| 673 crRightBottom = CPWL_Color(COLORTYPE_GRAY,1); | 1237 } break; |
| 674 break; | 1238 case BBS_DASH: { |
| 675 } | 1239 CFX_ByteString sColor = |
| 676 | 1240 CPWL_Utils::GetColorAppStream(GetBorderPWLColor(), FALSE); |
| 677 FontMap.SetAPType("D"); | 1241 if (sColor.GetLength() > 0) { |
| 678 | 1242 CPWL_Dash dsBorder = CPWL_Dash(3, 3, 0); |
| 679 csAP = CPWL_Utils::GetRectFillAppStream(rcWindow, CPWL_Utils::SubstractC
olor(crBackground,0.25f)) + | 1243 |
| 680 CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder, crL
eftTop, crRightBottom, nBorderStyle, dsBorder) + | 1244 sLines << "q\n" << GetBorderWidth() << " w\n" |
| 681 CPWL_Utils::GetPushButtonAppStream(iconFit.GetFittingBounds() ? rcWi
ndow : rcClient, &FontMap, pDownIcon, iconFit, csDownCaption, crText, fFontSize,
nLayout); | 1245 << CPWL_Utils::GetColorAppStream(GetBorderPWLColor(), FALSE) |
| 682 | 1246 << "[" << dsBorder.nDash << " " << dsBorder.nGap << "] " |
| 683 WriteAppearance("D", GetRotatedRect(), GetMatrix(), csAP); | 1247 << dsBorder.nPhase << " d\n"; |
| 684 if (pDownIcon) | 1248 |
| 685 AddImageToAppearance("D", pDownIcon); | 1249 for (int32_t i = 1; i < nMaxLen; i++) { |
| 686 } | 1250 sLines << rcClient.left + |
| 687 else | 1251 ((rcClient.right - rcClient.left) / nMaxLen) * i |
| 688 { | 1252 << " " << rcClient.bottom << " m\n" |
| 689 RemoveAppearance("D"); | 1253 << rcClient.left + |
| 690 RemoveAppearance("R"); | 1254 ((rcClient.right - rcClient.left) / nMaxLen) * i |
| 691 } | 1255 << " " << rcClient.top << " l S\n"; |
| 692 } | |
| 693 | |
| 694 void CPDFSDK_Widget::ResetAppearance_CheckBox() | |
| 695 { | |
| 696 CPDF_FormControl* pControl = GetFormControl(); | |
| 697 ASSERT(pControl != NULL); | |
| 698 | |
| 699 | |
| 700 | |
| 701 CPWL_Color crBackground, crBorder, crText; | |
| 702 | |
| 703 int iColorType; | |
| 704 FX_FLOAT fc[4]; | |
| 705 | |
| 706 pControl->GetOriginalBackgroundColor(iColorType, fc); | |
| 707 if (iColorType > 0) | |
| 708 crBackground = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]); | |
| 709 | |
| 710 pControl->GetOriginalBorderColor(iColorType, fc); | |
| 711 if (iColorType > 0) | |
| 712 crBorder = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]); | |
| 713 | |
| 714 FX_FLOAT fBorderWidth = (FX_FLOAT)GetBorderWidth(); | |
| 715 int32_t nBorderStyle = 0; | |
| 716 CPWL_Dash dsBorder(3,0,0); | |
| 717 CPWL_Color crLeftTop,crRightBottom; | |
| 718 | |
| 719 switch (GetBorderStyle()) | |
| 720 { | |
| 721 case BBS_DASH: | |
| 722 nBorderStyle = PBS_DASH; | |
| 723 dsBorder = CPWL_Dash(3, 3, 0); | |
| 724 break; | |
| 725 case BBS_BEVELED: | |
| 726 nBorderStyle = PBS_BEVELED; | |
| 727 fBorderWidth *= 2; | |
| 728 crLeftTop = CPWL_Color(COLORTYPE_GRAY,1); | |
| 729 crRightBottom = CPWL_Utils::DevideColor(crBackground,2); | |
| 730 break; | |
| 731 case BBS_INSET: | |
| 732 nBorderStyle = PBS_INSET; | |
| 733 fBorderWidth *= 2; | |
| 734 crLeftTop = CPWL_Color(COLORTYPE_GRAY,0.5); | |
| 735 crRightBottom = CPWL_Color(COLORTYPE_GRAY,0.75); | |
| 736 break; | |
| 737 case BBS_UNDERLINE: | |
| 738 nBorderStyle = PBS_UNDERLINED; | |
| 739 break; | |
| 740 default: | |
| 741 nBorderStyle = PBS_SOLID; | |
| 742 break; | |
| 743 } | |
| 744 | |
| 745 CPDF_Rect rcWindow = GetRotatedRect(); | |
| 746 CPDF_Rect rcClient = CPWL_Utils::DeflateRect(rcWindow,fBorderWidth); | |
| 747 | |
| 748 CPDF_DefaultAppearance da = pControl->GetDefaultAppearance(); | |
| 749 if (da.HasColor()) | |
| 750 { | |
| 751 da.GetColor(iColorType, fc); | |
| 752 crText = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]); | |
| 753 } | |
| 754 | |
| 755 int32_t nStyle = 0; | |
| 756 | |
| 757 CFX_WideString csWCaption = pControl->GetNormalCaption(); | |
| 758 if (csWCaption.GetLength() > 0) | |
| 759 { | |
| 760 switch (csWCaption[0]) | |
| 761 { | |
| 762 case L'l': | |
| 763 nStyle = PCS_CIRCLE; | |
| 764 break; | |
| 765 case L'8': | |
| 766 nStyle = PCS_CROSS; | |
| 767 break; | |
| 768 case L'u': | |
| 769 nStyle = PCS_DIAMOND; | |
| 770 break; | |
| 771 case L'n': | |
| 772 nStyle = PCS_SQUARE; | |
| 773 break; | |
| 774 case L'H': | |
| 775 nStyle = PCS_STAR; | |
| 776 break; | |
| 777 default: //L'4' | |
| 778 nStyle = PCS_CHECK; | |
| 779 break; | |
| 780 } | |
| 781 } | |
| 782 else | |
| 783 { | |
| 784 nStyle = PCS_CHECK; | |
| 785 } | |
| 786 | |
| 787 CFX_ByteString csAP_N_ON = CPWL_Utils::GetRectFillAppStream(rcWindow,crBackg
round) + | |
| 788 CPWL_Utils::GetBorderAppStream(rcWindow,fBorderWidth,crBorder,crLeftTop,
crRightBottom,nBorderStyle,dsBorder); | |
| 789 | |
| 790 CFX_ByteString csAP_N_OFF = csAP_N_ON; | |
| 791 | |
| 792 switch (nBorderStyle) | |
| 793 { | |
| 794 case PBS_BEVELED: | |
| 795 { | |
| 796 CPWL_Color crTemp = crLeftTop; | |
| 797 crLeftTop = crRightBottom; | |
| 798 crRightBottom = crTemp; | |
| 799 } | |
| 800 break; | |
| 801 case PBS_INSET: | |
| 802 crLeftTop = CPWL_Color(COLORTYPE_GRAY,0); | |
| 803 crRightBottom = CPWL_Color(COLORTYPE_GRAY,1); | |
| 804 break; | |
| 805 } | |
| 806 | |
| 807 CFX_ByteString csAP_D_ON = CPWL_Utils::GetRectFillAppStream(rcWindow,CPWL_Ut
ils::SubstractColor(crBackground,0.25f)) + | |
| 808 CPWL_Utils::GetBorderAppStream(rcWindow,fBorderWidth,crBorder,crLeftTop,
crRightBottom,nBorderStyle,dsBorder); | |
| 809 | |
| 810 CFX_ByteString csAP_D_OFF = csAP_D_ON; | |
| 811 | |
| 812 csAP_N_ON += CPWL_Utils::GetCheckBoxAppStream(rcClient,nStyle,crText); | |
| 813 csAP_D_ON += CPWL_Utils::GetCheckBoxAppStream(rcClient,nStyle,crText); | |
| 814 | |
| 815 WriteAppearance("N", GetRotatedRect(), GetMatrix(), csAP_N_ON, pControl->Get
CheckedAPState()); | |
| 816 WriteAppearance("N", GetRotatedRect(), GetMatrix(), csAP_N_OFF, "Off"); | |
| 817 | |
| 818 WriteAppearance("D", GetRotatedRect(), GetMatrix(), csAP_D_ON, pControl->Get
CheckedAPState()); | |
| 819 WriteAppearance("D", GetRotatedRect(), GetMatrix(), csAP_D_OFF, "Off"); | |
| 820 | |
| 821 CFX_ByteString csAS = GetAppState(); | |
| 822 if (csAS.IsEmpty()) | |
| 823 SetAppState("Off"); | |
| 824 } | |
| 825 | |
| 826 void CPDFSDK_Widget::ResetAppearance_RadioButton() | |
| 827 { | |
| 828 CPDF_FormControl* pControl = GetFormControl(); | |
| 829 ASSERT(pControl != NULL); | |
| 830 | |
| 831 | |
| 832 | |
| 833 CPWL_Color crBackground, crBorder, crText; | |
| 834 | |
| 835 int iColorType; | |
| 836 FX_FLOAT fc[4]; | |
| 837 | |
| 838 pControl->GetOriginalBackgroundColor(iColorType, fc); | |
| 839 if (iColorType > 0) | |
| 840 crBackground = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]); | |
| 841 | |
| 842 pControl->GetOriginalBorderColor(iColorType, fc); | |
| 843 if (iColorType > 0) | |
| 844 crBorder = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]); | |
| 845 | |
| 846 FX_FLOAT fBorderWidth = (FX_FLOAT)GetBorderWidth(); | |
| 847 int32_t nBorderStyle = 0; | |
| 848 CPWL_Dash dsBorder(3,0,0); | |
| 849 CPWL_Color crLeftTop,crRightBottom; | |
| 850 | |
| 851 switch (GetBorderStyle()) | |
| 852 { | |
| 853 case BBS_DASH: | |
| 854 nBorderStyle = PBS_DASH; | |
| 855 dsBorder = CPWL_Dash(3, 3, 0); | |
| 856 break; | |
| 857 case BBS_BEVELED: | |
| 858 nBorderStyle = PBS_BEVELED; | |
| 859 fBorderWidth *= 2; | |
| 860 crLeftTop = CPWL_Color(COLORTYPE_GRAY,1); | |
| 861 crRightBottom = CPWL_Utils::DevideColor(crBackground,2); | |
| 862 break; | |
| 863 case BBS_INSET: | |
| 864 nBorderStyle = PBS_INSET; | |
| 865 fBorderWidth *= 2; | |
| 866 crLeftTop = CPWL_Color(COLORTYPE_GRAY,0.5); | |
| 867 crRightBottom = CPWL_Color(COLORTYPE_GRAY,0.75); | |
| 868 break; | |
| 869 case BBS_UNDERLINE: | |
| 870 nBorderStyle = PBS_UNDERLINED; | |
| 871 break; | |
| 872 default: | |
| 873 nBorderStyle = PBS_SOLID; | |
| 874 break; | |
| 875 } | |
| 876 | |
| 877 CPDF_Rect rcWindow = GetRotatedRect(); | |
| 878 CPDF_Rect rcClient = CPWL_Utils::DeflateRect(rcWindow, fBorderWidth); | |
| 879 | |
| 880 CPDF_DefaultAppearance da = pControl->GetDefaultAppearance(); | |
| 881 if (da.HasColor()) | |
| 882 { | |
| 883 da.GetColor(iColorType, fc); | |
| 884 crText = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]); | |
| 885 } | |
| 886 | |
| 887 int32_t nStyle = 0; | |
| 888 | |
| 889 CFX_WideString csWCaption = pControl->GetNormalCaption(); | |
| 890 if (csWCaption.GetLength() > 0) | |
| 891 { | |
| 892 switch (csWCaption[0]) | |
| 893 { | |
| 894 default: //L'l': | |
| 895 nStyle = PCS_CIRCLE; | |
| 896 break; | |
| 897 case L'8': | |
| 898 nStyle = PCS_CROSS; | |
| 899 break; | |
| 900 case L'u': | |
| 901 nStyle = PCS_DIAMOND; | |
| 902 break; | |
| 903 case L'n': | |
| 904 nStyle = PCS_SQUARE; | |
| 905 break; | |
| 906 case L'H': | |
| 907 nStyle = PCS_STAR; | |
| 908 break; | |
| 909 case L'4': | |
| 910 nStyle = PCS_CHECK; | |
| 911 break; | |
| 912 } | |
| 913 } | |
| 914 else | |
| 915 { | |
| 916 nStyle = PCS_CIRCLE; | |
| 917 } | |
| 918 | |
| 919 CFX_ByteString csAP_N_ON; | |
| 920 | |
| 921 CPDF_Rect rcCenter = CPWL_Utils::DeflateRect(CPWL_Utils::GetCenterSquare(rcW
indow), 1.0f); | |
| 922 | |
| 923 if (nStyle == PCS_CIRCLE) | |
| 924 { | |
| 925 if (nBorderStyle == PBS_BEVELED) | |
| 926 { | |
| 927 crLeftTop = CPWL_Color(COLORTYPE_GRAY, 1); | |
| 928 crRightBottom = CPWL_Utils::SubstractColor(crBackground,0.25f); | |
| 929 } | |
| 930 else if (nBorderStyle == PBS_INSET) | |
| 931 { | |
| 932 crLeftTop = CPWL_Color(COLORTYPE_GRAY,0.5f); | |
| 933 crRightBottom = CPWL_Color(COLORTYPE_GRAY,0.75f); | |
| 934 } | |
| 935 | |
| 936 csAP_N_ON = CPWL_Utils::GetCircleFillAppStream(rcCenter,crBackground) + | |
| 937 CPWL_Utils::GetCircleBorderAppStream(rcCenter,fBorderWidth,crBorder,
crLeftTop,crRightBottom,nBorderStyle,dsBorder); | |
| 938 } | |
| 939 else | |
| 940 { | |
| 941 csAP_N_ON = CPWL_Utils::GetRectFillAppStream(rcWindow,crBackground) + | |
| 942 CPWL_Utils::GetBorderAppStream(rcWindow,fBorderWidth,crBorder,crLeft
Top,crRightBottom,nBorderStyle,dsBorder); | |
| 943 } | |
| 944 | |
| 945 CFX_ByteString csAP_N_OFF = csAP_N_ON; | |
| 946 | |
| 947 switch (nBorderStyle) | |
| 948 { | |
| 949 case PBS_BEVELED: | |
| 950 { | |
| 951 CPWL_Color crTemp = crLeftTop; | |
| 952 crLeftTop = crRightBottom; | |
| 953 crRightBottom = crTemp; | |
| 954 } | |
| 955 break; | |
| 956 case PBS_INSET: | |
| 957 crLeftTop = CPWL_Color(COLORTYPE_GRAY,0); | |
| 958 crRightBottom = CPWL_Color(COLORTYPE_GRAY,1); | |
| 959 break; | |
| 960 } | |
| 961 | |
| 962 CFX_ByteString csAP_D_ON; | |
| 963 | |
| 964 if (nStyle == PCS_CIRCLE) | |
| 965 { | |
| 966 CPWL_Color crBK = CPWL_Utils::SubstractColor(crBackground,0.25f); | |
| 967 if (nBorderStyle == PBS_BEVELED) | |
| 968 { | |
| 969 crLeftTop = CPWL_Utils::SubstractColor(crBackground,0.25f); | |
| 970 crRightBottom = CPWL_Color(COLORTYPE_GRAY, 1); | |
| 971 crBK = crBackground; | |
| 972 } | |
| 973 else if (nBorderStyle == PBS_INSET) | |
| 974 { | |
| 975 crLeftTop = CPWL_Color(COLORTYPE_GRAY,0); | |
| 976 crRightBottom = CPWL_Color(COLORTYPE_GRAY,1); | |
| 977 } | |
| 978 | |
| 979 csAP_D_ON = CPWL_Utils::GetCircleFillAppStream(rcCenter,crBK) | |
| 980 + CPWL_Utils::GetCircleBorderAppStream(rcCenter,fBorderWidth,crBorde
r,crLeftTop,crRightBottom,nBorderStyle,dsBorder); | |
| 981 } | |
| 982 else | |
| 983 { | |
| 984 csAP_D_ON = CPWL_Utils::GetRectFillAppStream(rcWindow,CPWL_Utils::Substr
actColor(crBackground,0.25f)) + | |
| 985 CPWL_Utils::GetBorderAppStream(rcWindow,fBorderWidth,crBorder,crLeft
Top,crRightBottom,nBorderStyle,dsBorder); | |
| 986 } | |
| 987 | |
| 988 CFX_ByteString csAP_D_OFF = csAP_D_ON; | |
| 989 | |
| 990 csAP_N_ON += CPWL_Utils::GetRadioButtonAppStream(rcClient,nStyle,crText); | |
| 991 csAP_D_ON += CPWL_Utils::GetRadioButtonAppStream(rcClient,nStyle,crText); | |
| 992 | |
| 993 WriteAppearance("N", GetRotatedRect(), GetMatrix(), csAP_N_ON, pControl->Get
CheckedAPState()); | |
| 994 WriteAppearance("N", GetRotatedRect(), GetMatrix(), csAP_N_OFF, "Off"); | |
| 995 | |
| 996 WriteAppearance("D", GetRotatedRect(), GetMatrix(), csAP_D_ON, pControl->Get
CheckedAPState()); | |
| 997 WriteAppearance("D", GetRotatedRect(), GetMatrix(), csAP_D_OFF, "Off"); | |
| 998 | |
| 999 CFX_ByteString csAS = GetAppState(); | |
| 1000 if (csAS.IsEmpty()) | |
| 1001 SetAppState("Off"); | |
| 1002 } | |
| 1003 | |
| 1004 void CPDFSDK_Widget::ResetAppearance_ComboBox(const FX_WCHAR* sValue) | |
| 1005 { | |
| 1006 CPDF_FormControl* pControl = GetFormControl(); | |
| 1007 ASSERT(pControl != NULL); | |
| 1008 CPDF_FormField* pField = pControl->GetField(); | |
| 1009 ASSERT(pField != NULL); | |
| 1010 | |
| 1011 CFX_ByteTextBuf sBody, sLines; | |
| 1012 | |
| 1013 CPDF_Rect rcClient = GetClientRect(); | |
| 1014 CPDF_Rect rcButton = rcClient; | |
| 1015 rcButton.left = rcButton.right - 13; | |
| 1016 rcButton.Normalize(); | |
| 1017 | |
| 1018 if (IFX_Edit * pEdit = IFX_Edit::NewEdit()) | |
| 1019 { | |
| 1020 pEdit->EnableRefresh(FALSE); | |
| 1021 | |
| 1022 CPDFSDK_Document* pDoc = m_pInterForm->GetDocument(); | |
| 1023 ASSERT(pDoc != NULL); | |
| 1024 CPDFDoc_Environment* pEnv = pDoc->GetEnv(); | |
| 1025 CBA_FontMap FontMap(this,pEnv->GetSysHandler()); | |
| 1026 FontMap.Initial(); | |
| 1027 pEdit->SetFontMap(&FontMap); | |
| 1028 | |
| 1029 CPDF_Rect rcEdit = rcClient; | |
| 1030 rcEdit.right = rcButton.left; | |
| 1031 rcEdit.Normalize(); | |
| 1032 | |
| 1033 pEdit->SetPlateRect(rcEdit); | |
| 1034 pEdit->SetAlignmentV(1); | |
| 1035 | |
| 1036 FX_FLOAT fFontSize = GetFontSize(); | |
| 1037 if (IsFloatZero(fFontSize)) | |
| 1038 pEdit->SetAutoFontSize(TRUE); | |
| 1039 else | |
| 1040 pEdit->SetFontSize(fFontSize); | |
| 1041 | |
| 1042 pEdit->Initialize(); | |
| 1043 | |
| 1044 if (sValue) | |
| 1045 pEdit->SetText(sValue); | |
| 1046 else | |
| 1047 { | |
| 1048 int32_t nCurSel = pField->GetSelectedIndex(0); | |
| 1049 | |
| 1050 if (nCurSel < 0) | |
| 1051 pEdit->SetText(pField->GetValue().c_str()); | |
| 1052 else | |
| 1053 pEdit->SetText(pField->GetOptionLabel(nCurSel).c_str()); | |
| 1054 } | |
| 1055 | |
| 1056 CPDF_Rect rcContent = pEdit->GetContentRect(); | |
| 1057 | |
| 1058 CFX_ByteString sEdit = CPWL_Utils::GetEditAppStream(pEdit,CPDF_Point(0.0
f,0.0f)); | |
| 1059 if (sEdit.GetLength() > 0) | |
| 1060 { | |
| 1061 sBody << "/Tx BMC\n" << "q\n"; | |
| 1062 if (rcContent.Width() > rcEdit.Width() || | |
| 1063 rcContent.Height() > rcEdit.Height()) | |
| 1064 { | |
| 1065 sBody << rcEdit.left << " " << rcEdit.bottom << " " | |
| 1066 << rcEdit.Width() << " " << rcEdit.Height() << " re\nW\nn\n"
; | |
| 1067 } | 1256 } |
| 1068 | 1257 |
| 1069 CPWL_Color crText = GetTextPWLColor(); | 1258 sLines << "Q\n"; |
| 1070 sBody << "BT\n" << CPWL_Utils::GetColorAppStream(crText) << sEdit <<
"ET\n" << "Q\nEMC\n"; | 1259 } |
| 1071 } | 1260 } break; |
| 1072 | 1261 } |
| 1073 IFX_Edit::DelEdit(pEdit); | 1262 } |
| 1074 } | 1263 |
| 1075 | 1264 IFX_Edit::DelEdit(pEdit); |
| 1076 sBody << CPWL_Utils::GetDropButtonAppStream(rcButton); | 1265 } |
| 1077 | 1266 |
| 1078 CFX_ByteString sAP = GetBackgroundAppStream() + GetBorderAppStream() + sLine
s.GetByteString() + sBody.GetByteString(); | 1267 CFX_ByteString sAP = GetBackgroundAppStream() + GetBorderAppStream() + |
| 1079 | 1268 sLines.GetByteString() + sBody.GetByteString(); |
| 1080 WriteAppearance("N", GetRotatedRect(), GetMatrix(), sAP); | 1269 WriteAppearance("N", GetRotatedRect(), GetMatrix(), sAP); |
| 1081 } | 1270 } |
| 1082 | 1271 |
| 1083 void CPDFSDK_Widget::ResetAppearance_ListBox() | 1272 CPDF_Rect CPDFSDK_Widget::GetClientRect() const { |
| 1084 { | 1273 CPDF_Rect rcWindow = GetRotatedRect(); |
| 1085 CPDF_FormControl* pControl = GetFormControl(); | 1274 FX_FLOAT fBorderWidth = (FX_FLOAT)GetBorderWidth(); |
| 1086 ASSERT(pControl != NULL); | 1275 switch (GetBorderStyle()) { |
| 1087 CPDF_FormField* pField = pControl->GetField(); | |
| 1088 ASSERT(pField != NULL); | |
| 1089 | |
| 1090 CPDF_Rect rcClient = GetClientRect(); | |
| 1091 | |
| 1092 CFX_ByteTextBuf sBody, sLines; | |
| 1093 | |
| 1094 if (IFX_Edit * pEdit = IFX_Edit::NewEdit()) | |
| 1095 { | |
| 1096 pEdit->EnableRefresh(FALSE); | |
| 1097 | |
| 1098 CPDFSDK_Document* pDoc = m_pInterForm->GetDocument(); | |
| 1099 ASSERT(pDoc != NULL); | |
| 1100 CPDFDoc_Environment* pEnv = pDoc->GetEnv(); | |
| 1101 | |
| 1102 CBA_FontMap FontMap(this,pEnv->GetSysHandler()); | |
| 1103 FontMap.Initial(); | |
| 1104 pEdit->SetFontMap(&FontMap); | |
| 1105 | |
| 1106 pEdit->SetPlateRect(CPDF_Rect(rcClient.left,0.0f,rcClient.right,0.0f)); | |
| 1107 | |
| 1108 FX_FLOAT fFontSize = GetFontSize(); | |
| 1109 | |
| 1110 if (IsFloatZero(fFontSize)) | |
| 1111 pEdit->SetFontSize(12.0f); | |
| 1112 else | |
| 1113 pEdit->SetFontSize(fFontSize); | |
| 1114 | |
| 1115 pEdit->Initialize(); | |
| 1116 | |
| 1117 CFX_ByteTextBuf sList; | |
| 1118 FX_FLOAT fy = rcClient.top; | |
| 1119 | |
| 1120 int32_t nTop = pField->GetTopVisibleIndex(); | |
| 1121 int32_t nCount = pField->CountOptions(); | |
| 1122 int32_t nSelCount = pField->CountSelectedItems(); | |
| 1123 | |
| 1124 for (int32_t i=nTop; i<nCount; i++) | |
| 1125 { | |
| 1126 FX_BOOL bSelected = FALSE; | |
| 1127 for (int32_t j=0; j<nSelCount; j++) | |
| 1128 { | |
| 1129 if (pField->GetSelectedIndex(j) == i) | |
| 1130 { | |
| 1131 bSelected = TRUE; | |
| 1132 break; | |
| 1133 } | |
| 1134 } | |
| 1135 | |
| 1136 pEdit->SetText(pField->GetOptionLabel(i).c_str()); | |
| 1137 | |
| 1138 CPDF_Rect rcContent = pEdit->GetContentRect(); | |
| 1139 FX_FLOAT fItemHeight = rcContent.Height(); | |
| 1140 | |
| 1141 if (bSelected) | |
| 1142 { | |
| 1143 CPDF_Rect rcItem = CPDF_Rect(rcClient.left,fy-fItemHeight,rcClie
nt.right,fy); | |
| 1144 sList << "q\n" << CPWL_Utils::GetColorAppStream(CPWL_Color(COLOR
TYPE_RGB,0,51.0f/255.0f,113.0f/255.0f),TRUE) | |
| 1145 << rcItem.left << " " << rcItem.bottom << " " << rcItem.Widt
h() << " " << rcItem.Height() << " re f\n" << "Q\n"; | |
| 1146 | |
| 1147 sList << "BT\n" << CPWL_Utils::GetColorAppStream(CPWL_Color(COLO
RTYPE_GRAY,1),TRUE) << | |
| 1148 CPWL_Utils::GetEditAppStream(pEdit,CPDF_Point(0.0f,fy)) << "
ET\n"; | |
| 1149 } | |
| 1150 else | |
| 1151 { | |
| 1152 CPWL_Color crText = GetTextPWLColor(); | |
| 1153 sList << "BT\n" << CPWL_Utils::GetColorAppStream(crText,TRUE) << | |
| 1154 CPWL_Utils::GetEditAppStream(pEdit,CPDF_Point(0.0f,fy)) << "ET\n
"; | |
| 1155 } | |
| 1156 | |
| 1157 fy -= fItemHeight; | |
| 1158 } | |
| 1159 | |
| 1160 if (sList.GetSize() > 0) | |
| 1161 { | |
| 1162 sBody << "/Tx BMC\n" << "q\n" << rcClient.left << " " << rcClient.bo
ttom << " " | |
| 1163 << rcClient.Width() << " " << rcClient.Height() << " re\nW\n
n\n"; | |
| 1164 sBody << sList << "Q\nEMC\n"; | |
| 1165 } | |
| 1166 | |
| 1167 IFX_Edit::DelEdit(pEdit); | |
| 1168 } | |
| 1169 | |
| 1170 CFX_ByteString sAP = GetBackgroundAppStream() + GetBorderAppStream() + sLine
s.GetByteString() + sBody.GetByteString(); | |
| 1171 | |
| 1172 WriteAppearance("N", GetRotatedRect(), GetMatrix(), sAP); | |
| 1173 } | |
| 1174 | |
| 1175 void CPDFSDK_Widget::ResetAppearance_TextField(const FX_WCHAR* sValue) | |
| 1176 { | |
| 1177 CPDF_FormControl* pControl = GetFormControl(); | |
| 1178 ASSERT(pControl != NULL); | |
| 1179 CPDF_FormField* pField = pControl->GetField(); | |
| 1180 ASSERT(pField != NULL); | |
| 1181 | |
| 1182 CFX_ByteTextBuf sBody, sLines; | |
| 1183 | |
| 1184 if (IFX_Edit * pEdit = IFX_Edit::NewEdit()) | |
| 1185 { | |
| 1186 pEdit->EnableRefresh(FALSE); | |
| 1187 | |
| 1188 CPDFSDK_Document* pDoc = m_pInterForm->GetDocument(); | |
| 1189 ASSERT(pDoc != NULL); | |
| 1190 CPDFDoc_Environment* pEnv = pDoc->GetEnv(); | |
| 1191 | |
| 1192 CBA_FontMap FontMap(this,pEnv->GetSysHandler());//, ISystemHandle::GetSy
stemHandler(m_pBaseForm->GetEnv())); | |
| 1193 FontMap.Initial(); | |
| 1194 pEdit->SetFontMap(&FontMap); | |
| 1195 | |
| 1196 CPDF_Rect rcClient = GetClientRect(); | |
| 1197 pEdit->SetPlateRect(rcClient); | |
| 1198 pEdit->SetAlignmentH(pControl->GetControlAlignment()); | |
| 1199 | |
| 1200 FX_DWORD dwFieldFlags = pField->GetFieldFlags(); | |
| 1201 FX_BOOL bMultiLine = (dwFieldFlags >> 12) & 1; | |
| 1202 | |
| 1203 if (bMultiLine) | |
| 1204 { | |
| 1205 pEdit->SetMultiLine(TRUE); | |
| 1206 pEdit->SetAutoReturn(TRUE); | |
| 1207 } | |
| 1208 else | |
| 1209 { | |
| 1210 pEdit->SetAlignmentV(1); | |
| 1211 } | |
| 1212 | |
| 1213 FX_WORD subWord = 0; | |
| 1214 if ((dwFieldFlags >> 13) & 1) | |
| 1215 { | |
| 1216 subWord = '*'; | |
| 1217 pEdit->SetPasswordChar(subWord); | |
| 1218 } | |
| 1219 | |
| 1220 int nMaxLen = pField->GetMaxLen(); | |
| 1221 FX_BOOL bCharArray = (dwFieldFlags >> 24) & 1; | |
| 1222 FX_FLOAT fFontSize = GetFontSize(); | |
| 1223 | |
| 1224 if (nMaxLen > 0) | |
| 1225 { | |
| 1226 if (bCharArray) | |
| 1227 { | |
| 1228 pEdit->SetCharArray(nMaxLen); | |
| 1229 | |
| 1230 if (IsFloatZero(fFontSize)) | |
| 1231 { | |
| 1232 fFontSize = CPWL_Edit::GetCharArrayAutoFontSize(FontMap.GetP
DFFont(0),rcClient,nMaxLen); | |
| 1233 } | |
| 1234 } | |
| 1235 else | |
| 1236 { | |
| 1237 if (sValue) | |
| 1238 nMaxLen = wcslen((const wchar_t*)sValue); | |
| 1239 pEdit->SetLimitChar(nMaxLen); | |
| 1240 } | |
| 1241 } | |
| 1242 | |
| 1243 if (IsFloatZero(fFontSize)) | |
| 1244 pEdit->SetAutoFontSize(TRUE); | |
| 1245 else | |
| 1246 pEdit->SetFontSize(fFontSize); | |
| 1247 | |
| 1248 pEdit->Initialize(); | |
| 1249 | |
| 1250 if (sValue) | |
| 1251 pEdit->SetText(sValue); | |
| 1252 else | |
| 1253 pEdit->SetText(pField->GetValue().c_str()); | |
| 1254 | |
| 1255 CPDF_Rect rcContent = pEdit->GetContentRect(); | |
| 1256 | |
| 1257 CFX_ByteString sEdit = CPWL_Utils::GetEditAppStream(pEdit,CPDF_Point(0.0
f,0.0f), | |
| 1258 NULL,!bCharA
rray,subWord); | |
| 1259 | |
| 1260 if (sEdit.GetLength() > 0) | |
| 1261 { | |
| 1262 sBody << "/Tx BMC\n" << "q\n"; | |
| 1263 if (rcContent.Width() > rcClient.Width() || | |
| 1264 rcContent.Height() > rcClient.Height()) | |
| 1265 { | |
| 1266 sBody << rcClient.left << " " << rcClient.bottom << " " | |
| 1267 << rcClient.Width() << " " << rcClient.Height() << " re\nW\n
n\n"; | |
| 1268 } | |
| 1269 CPWL_Color crText = GetTextPWLColor(); | |
| 1270 sBody << "BT\n" << CPWL_Utils::GetColorAppStream(crText) << sEdit <<
"ET\n" << "Q\nEMC\n"; | |
| 1271 } | |
| 1272 | |
| 1273 if (bCharArray) | |
| 1274 { | |
| 1275 switch (GetBorderStyle()) | |
| 1276 { | |
| 1277 case BBS_SOLID: | |
| 1278 { | |
| 1279 CFX_ByteString sColor = CPWL_Utils::GetColorAppStream(GetBor
derPWLColor(),FALSE); | |
| 1280 if (sColor.GetLength() > 0) | |
| 1281 { | |
| 1282 sLines << "q\n" << GetBorderWidth() << " w\n" | |
| 1283 << CPWL_Utils::GetColorAppStream(GetBorderPWLColor()
,FALSE) << " 2 J 0 j\n"; | |
| 1284 | |
| 1285 for (int32_t i=1;i<nMaxLen;i++) | |
| 1286 { | |
| 1287 sLines << rcClient.left + ((rcClient.right - rcClien
t.left)/nMaxLen)*i << " " | |
| 1288 << rcClient.bottom << " m\n" | |
| 1289 << rcClient.left + ((rcClient.right - rcClient.l
eft)/nMaxLen)*i << " " | |
| 1290 << rcClient.top << " l S\n"; | |
| 1291 } | |
| 1292 | |
| 1293 sLines << "Q\n"; | |
| 1294 } | |
| 1295 } | |
| 1296 break; | |
| 1297 case BBS_DASH: | |
| 1298 { | |
| 1299 CFX_ByteString sColor = CPWL_Utils::GetColorAppStream(GetBor
derPWLColor(),FALSE); | |
| 1300 if (sColor.GetLength() > 0) | |
| 1301 { | |
| 1302 CPWL_Dash dsBorder = CPWL_Dash(3, 3, 0); | |
| 1303 | |
| 1304 sLines << "q\n" << GetBorderWidth() << " w\n" | |
| 1305 << CPWL_Utils::GetColorAppStream(GetBorderPWLColor()
,FALSE) | |
| 1306 << "[" << dsBorder.nDash << " " | |
| 1307 << dsBorder.nGap << "] " | |
| 1308 << dsBorder.nPhase << " d\n"; | |
| 1309 | |
| 1310 for (int32_t i=1;i<nMaxLen;i++) | |
| 1311 { | |
| 1312 sLines << rcClient.left + ((rcClient.right - rcClien
t.left)/nMaxLen)*i << " " | |
| 1313 << rcClient.bottom << " m\n" | |
| 1314 << rcClient.left + ((rcClient.right - rcClient.l
eft)/nMaxLen)*i << " " | |
| 1315 << rcClient.top << " l S\n"; | |
| 1316 } | |
| 1317 | |
| 1318 sLines << "Q\n"; | |
| 1319 } | |
| 1320 } | |
| 1321 break; | |
| 1322 } | |
| 1323 } | |
| 1324 | |
| 1325 IFX_Edit::DelEdit(pEdit); | |
| 1326 } | |
| 1327 | |
| 1328 CFX_ByteString sAP = GetBackgroundAppStream() + GetBorderAppStream() + sLine
s.GetByteString() + sBody.GetByteString(); | |
| 1329 WriteAppearance("N", GetRotatedRect(), GetMatrix(), sAP); | |
| 1330 } | |
| 1331 | |
| 1332 CPDF_Rect CPDFSDK_Widget::GetClientRect() const | |
| 1333 { | |
| 1334 CPDF_Rect rcWindow = GetRotatedRect(); | |
| 1335 FX_FLOAT fBorderWidth = (FX_FLOAT)GetBorderWidth(); | |
| 1336 switch (GetBorderStyle()) | |
| 1337 { | |
| 1338 case BBS_BEVELED: | 1276 case BBS_BEVELED: |
| 1339 case BBS_INSET: | 1277 case BBS_INSET: |
| 1340 fBorderWidth *= 2.0f; | 1278 fBorderWidth *= 2.0f; |
| 1341 break; | 1279 break; |
| 1342 } | 1280 } |
| 1343 | 1281 |
| 1344 return CPWL_Utils::DeflateRect(rcWindow, fBorderWidth); | 1282 return CPWL_Utils::DeflateRect(rcWindow, fBorderWidth); |
| 1345 } | 1283 } |
| 1346 | 1284 |
| 1347 CPDF_Rect CPDFSDK_Widget::GetRotatedRect() const | 1285 CPDF_Rect CPDFSDK_Widget::GetRotatedRect() const { |
| 1348 { | 1286 CPDF_Rect rectAnnot = GetRect(); |
| 1349 CPDF_Rect rectAnnot = GetRect(); | 1287 FX_FLOAT fWidth = rectAnnot.right - rectAnnot.left; |
| 1350 FX_FLOAT fWidth = rectAnnot.right - rectAnnot.left; | 1288 FX_FLOAT fHeight = rectAnnot.top - rectAnnot.bottom; |
| 1351 FX_FLOAT fHeight = rectAnnot.top - rectAnnot.bottom; | 1289 |
| 1352 | 1290 CPDF_FormControl* pControl = GetFormControl(); |
| 1353 CPDF_FormControl* pControl = GetFormControl(); | 1291 CPDF_Rect rcPDFWindow; |
| 1354 CPDF_Rect rcPDFWindow; | 1292 switch (abs(pControl->GetRotation() % 360)) { |
| 1355 switch(abs(pControl->GetRotation() % 360)) | 1293 case 0: |
| 1356 { | 1294 case 180: |
| 1357 case 0: | 1295 default: |
| 1358 case 180: | 1296 rcPDFWindow = CPDF_Rect(0, 0, fWidth, fHeight); |
| 1359 default: | 1297 break; |
| 1360 rcPDFWindow = CPDF_Rect(0, 0, fWidth, fHeight); | 1298 case 90: |
| 1361 break; | 1299 case 270: |
| 1362 case 90: | 1300 rcPDFWindow = CPDF_Rect(0, 0, fHeight, fWidth); |
| 1363 case 270: | 1301 break; |
| 1364 rcPDFWindow = CPDF_Rect(0, 0, fHeight, fWidth); | 1302 } |
| 1365 break; | 1303 |
| 1366 } | 1304 return rcPDFWindow; |
| 1367 | 1305 } |
| 1368 return rcPDFWindow; | 1306 |
| 1369 } | 1307 CFX_ByteString CPDFSDK_Widget::GetBackgroundAppStream() const { |
| 1370 | 1308 CPWL_Color crBackground = GetFillPWLColor(); |
| 1371 CFX_ByteString CPDFSDK_Widget::GetBackgroundAppStream() const | 1309 if (crBackground.nColorType != COLORTYPE_TRANSPARENT) { |
| 1372 { | 1310 return CPWL_Utils::GetRectFillAppStream(GetRotatedRect(), crBackground); |
| 1373 CPWL_Color crBackground = GetFillPWLColor(); | 1311 } |
| 1374 if (crBackground.nColorType != COLORTYPE_TRANSPARENT) { | 1312 return ""; |
| 1375 return CPWL_Utils::GetRectFillAppStream(GetRotatedRect(), crBackground); | 1313 } |
| 1376 } | 1314 |
| 1377 return ""; | 1315 CFX_ByteString CPDFSDK_Widget::GetBorderAppStream() const { |
| 1378 } | 1316 CPDF_Rect rcWindow = GetRotatedRect(); |
| 1379 | 1317 CPWL_Color crBorder = GetBorderPWLColor(); |
| 1380 CFX_ByteString CPDFSDK_Widget::GetBorderAppStream() const | 1318 CPWL_Color crBackground = GetFillPWLColor(); |
| 1381 { | 1319 CPWL_Color crLeftTop, crRightBottom; |
| 1382 CPDF_Rect rcWindow = GetRotatedRect(); | 1320 |
| 1383 CPWL_Color crBorder = GetBorderPWLColor(); | 1321 FX_FLOAT fBorderWidth = (FX_FLOAT)GetBorderWidth(); |
| 1384 CPWL_Color crBackground = GetFillPWLColor(); | 1322 int32_t nBorderStyle = 0; |
| 1385 CPWL_Color crLeftTop, crRightBottom; | 1323 CPWL_Dash dsBorder(3, 0, 0); |
| 1386 | 1324 |
| 1387 FX_FLOAT fBorderWidth = (FX_FLOAT)GetBorderWidth(); | 1325 switch (GetBorderStyle()) { |
| 1388 int32_t nBorderStyle = 0; | |
| 1389 CPWL_Dash dsBorder(3,0,0); | |
| 1390 | |
| 1391 switch (GetBorderStyle()) | |
| 1392 { | |
| 1393 case BBS_DASH: | 1326 case BBS_DASH: |
| 1394 nBorderStyle = PBS_DASH; | 1327 nBorderStyle = PBS_DASH; |
| 1395 dsBorder = CPWL_Dash(3, 3, 0); | 1328 dsBorder = CPWL_Dash(3, 3, 0); |
| 1396 break; | 1329 break; |
| 1397 case BBS_BEVELED: | 1330 case BBS_BEVELED: |
| 1398 nBorderStyle = PBS_BEVELED; | 1331 nBorderStyle = PBS_BEVELED; |
| 1399 fBorderWidth *= 2; | 1332 fBorderWidth *= 2; |
| 1400 crLeftTop = CPWL_Color(COLORTYPE_GRAY, 1); | 1333 crLeftTop = CPWL_Color(COLORTYPE_GRAY, 1); |
| 1401 crRightBottom = CPWL_Utils::DevideColor(crBackground, 2); | 1334 crRightBottom = CPWL_Utils::DevideColor(crBackground, 2); |
| 1402 break; | 1335 break; |
| 1403 case BBS_INSET: | 1336 case BBS_INSET: |
| 1404 nBorderStyle = PBS_INSET; | 1337 nBorderStyle = PBS_INSET; |
| 1405 fBorderWidth *= 2; | 1338 fBorderWidth *= 2; |
| 1406 crLeftTop = CPWL_Color(COLORTYPE_GRAY, 0.5); | 1339 crLeftTop = CPWL_Color(COLORTYPE_GRAY, 0.5); |
| 1407 crRightBottom = CPWL_Color(COLORTYPE_GRAY, 0.75); | 1340 crRightBottom = CPWL_Color(COLORTYPE_GRAY, 0.75); |
| 1408 break; | 1341 break; |
| 1409 case BBS_UNDERLINE: | 1342 case BBS_UNDERLINE: |
| 1410 nBorderStyle = PBS_UNDERLINED; | 1343 nBorderStyle = PBS_UNDERLINED; |
| 1411 break; | 1344 break; |
| 1412 default: | 1345 default: |
| 1413 nBorderStyle = PBS_SOLID; | 1346 nBorderStyle = PBS_SOLID; |
| 1414 break; | 1347 break; |
| 1415 } | 1348 } |
| 1416 | 1349 |
| 1417 return CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder, crLe
ftTop, | 1350 return CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder, |
| 1418 crRightBottom, nBorderStyle, dsBorder); | 1351 crLeftTop, crRightBottom, nBorderStyle, |
| 1419 } | 1352 dsBorder); |
| 1420 | 1353 } |
| 1421 CPDF_Matrix CPDFSDK_Widget::GetMatrix() const | 1354 |
| 1422 { | 1355 CPDF_Matrix CPDFSDK_Widget::GetMatrix() const { |
| 1423 CPDF_Matrix mt; | 1356 CPDF_Matrix mt; |
| 1424 CPDF_FormControl* pControl = GetFormControl(); | 1357 CPDF_FormControl* pControl = GetFormControl(); |
| 1425 ASSERT(pControl != NULL); | 1358 ASSERT(pControl != NULL); |
| 1426 | 1359 |
| 1427 CPDF_Rect rcAnnot = GetRect(); | 1360 CPDF_Rect rcAnnot = GetRect(); |
| 1428 FX_FLOAT fWidth = rcAnnot.right - rcAnnot.left; | 1361 FX_FLOAT fWidth = rcAnnot.right - rcAnnot.left; |
| 1429 FX_FLOAT fHeight = rcAnnot.top - rcAnnot.bottom; | 1362 FX_FLOAT fHeight = rcAnnot.top - rcAnnot.bottom; |
| 1430 | 1363 |
| 1431 | 1364 switch (abs(pControl->GetRotation() % 360)) { |
| 1432 | 1365 case 0: |
| 1433 switch (abs(pControl->GetRotation() % 360)) | 1366 default: |
| 1434 { | 1367 mt = CPDF_Matrix(1, 0, 0, 1, 0, 0); |
| 1435 case 0: | 1368 break; |
| 1436 default: | 1369 case 90: |
| 1437 mt = CPDF_Matrix(1, 0, 0, 1, 0, 0); | 1370 mt = CPDF_Matrix(0, 1, -1, 0, fWidth, 0); |
| 1438 break; | 1371 break; |
| 1439 case 90: | 1372 case 180: |
| 1440 mt = CPDF_Matrix(0, 1, -1, 0, fWidth, 0); | 1373 mt = CPDF_Matrix(-1, 0, 0, -1, fWidth, fHeight); |
| 1441 break; | 1374 break; |
| 1442 case 180: | 1375 case 270: |
| 1443 mt = CPDF_Matrix(-1, 0, 0, -1, fWidth, fHeight); | 1376 mt = CPDF_Matrix(0, -1, 1, 0, 0, fHeight); |
| 1444 break; | 1377 break; |
| 1445 case 270: | 1378 } |
| 1446 mt = CPDF_Matrix(0, -1, 1, 0, 0, fHeight); | 1379 |
| 1447 break; | 1380 return mt; |
| 1448 } | 1381 } |
| 1449 | 1382 |
| 1450 return mt; | 1383 CPWL_Color CPDFSDK_Widget::GetTextPWLColor() const { |
| 1451 } | 1384 CPWL_Color crText = CPWL_Color(COLORTYPE_GRAY, 0); |
| 1452 | 1385 |
| 1453 CPWL_Color CPDFSDK_Widget::GetTextPWLColor() const | 1386 CPDF_FormControl* pFormCtrl = GetFormControl(); |
| 1454 { | 1387 ASSERT(pFormCtrl != NULL); |
| 1455 CPWL_Color crText = CPWL_Color(COLORTYPE_GRAY, 0); | 1388 |
| 1456 | 1389 CPDF_DefaultAppearance da = pFormCtrl->GetDefaultAppearance(); |
| 1457 CPDF_FormControl* pFormCtrl = GetFormControl(); | 1390 if (da.HasColor()) { |
| 1458 ASSERT(pFormCtrl != NULL); | |
| 1459 | |
| 1460 CPDF_DefaultAppearance da = pFormCtrl->GetDefaultAppearance(); | |
| 1461 if (da.HasColor()) | |
| 1462 { | |
| 1463 int32_t iColorType; | |
| 1464 FX_FLOAT fc[4]; | |
| 1465 da.GetColor(iColorType, fc); | |
| 1466 crText = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]); | |
| 1467 } | |
| 1468 | |
| 1469 return crText; | |
| 1470 } | |
| 1471 | |
| 1472 CPWL_Color CPDFSDK_Widget::GetBorderPWLColor() const | |
| 1473 { | |
| 1474 CPWL_Color crBorder; | |
| 1475 | |
| 1476 CPDF_FormControl* pFormCtrl = GetFormControl(); | |
| 1477 ASSERT(pFormCtrl != NULL); | |
| 1478 | |
| 1479 int32_t iColorType; | 1391 int32_t iColorType; |
| 1480 FX_FLOAT fc[4]; | 1392 FX_FLOAT fc[4]; |
| 1481 pFormCtrl->GetOriginalBorderColor(iColorType, fc); | 1393 da.GetColor(iColorType, fc); |
| 1482 if (iColorType > 0) | 1394 crText = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]); |
| 1483 crBorder = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]); | 1395 } |
| 1484 | 1396 |
| 1485 return crBorder; | 1397 return crText; |
| 1486 } | 1398 } |
| 1487 | 1399 |
| 1488 CPWL_Color CPDFSDK_Widget::GetFillPWLColor() const | 1400 CPWL_Color CPDFSDK_Widget::GetBorderPWLColor() const { |
| 1489 { | 1401 CPWL_Color crBorder; |
| 1490 CPWL_Color crFill; | 1402 |
| 1491 | 1403 CPDF_FormControl* pFormCtrl = GetFormControl(); |
| 1492 CPDF_FormControl* pFormCtrl = GetFormControl(); | 1404 ASSERT(pFormCtrl != NULL); |
| 1493 ASSERT(pFormCtrl != NULL); | 1405 |
| 1494 | 1406 int32_t iColorType; |
| 1495 int32_t iColorType; | 1407 FX_FLOAT fc[4]; |
| 1496 FX_FLOAT fc[4]; | 1408 pFormCtrl->GetOriginalBorderColor(iColorType, fc); |
| 1497 pFormCtrl->GetOriginalBackgroundColor(iColorType, fc); | 1409 if (iColorType > 0) |
| 1498 if (iColorType > 0) | 1410 crBorder = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]); |
| 1499 crFill = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]); | 1411 |
| 1500 | 1412 return crBorder; |
| 1501 return crFill; | 1413 } |
| 1502 } | 1414 |
| 1503 | 1415 CPWL_Color CPDFSDK_Widget::GetFillPWLColor() const { |
| 1504 void CPDFSDK_Widget::AddImageToAppearance(const CFX_ByteString& sAPType, CPDF_St
ream* pImage) | 1416 CPWL_Color crFill; |
| 1505 { | 1417 |
| 1506 ASSERT(pImage != NULL); | 1418 CPDF_FormControl* pFormCtrl = GetFormControl(); |
| 1507 | 1419 ASSERT(pFormCtrl != NULL); |
| 1508 CPDF_Document* pDoc = m_pPageView->GetPDFDocument();//pDocument->GetDocument
(); | 1420 |
| 1509 ASSERT(pDoc != NULL); | 1421 int32_t iColorType; |
| 1510 | 1422 FX_FLOAT fc[4]; |
| 1511 CPDF_Dictionary* pAPDict = m_pAnnot->GetAnnotDict()->GetDict("AP"); | 1423 pFormCtrl->GetOriginalBackgroundColor(iColorType, fc); |
| 1512 ASSERT(pAPDict != NULL); | 1424 if (iColorType > 0) |
| 1513 | 1425 crFill = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]); |
| 1514 CPDF_Stream* pStream = pAPDict->GetStream(sAPType); | 1426 |
| 1515 ASSERT(pStream != NULL); | 1427 return crFill; |
| 1516 | 1428 } |
| 1517 CPDF_Dictionary* pStreamDict = pStream->GetDict(); | 1429 |
| 1518 ASSERT(pStreamDict != NULL); | 1430 void CPDFSDK_Widget::AddImageToAppearance(const CFX_ByteString& sAPType, |
| 1519 | 1431 CPDF_Stream* pImage) { |
| 1520 CFX_ByteString sImageAlias = "IMG"; | 1432 ASSERT(pImage != NULL); |
| 1521 | 1433 |
| 1522 if (CPDF_Dictionary* pImageDict = pImage->GetDict()) | 1434 CPDF_Document* pDoc = |
| 1523 { | 1435 m_pPageView->GetPDFDocument(); // pDocument->GetDocument(); |
| 1524 sImageAlias = pImageDict->GetString("Name"); | 1436 ASSERT(pDoc != NULL); |
| 1525 if (sImageAlias.IsEmpty()) | 1437 |
| 1526 sImageAlias = "IMG"; | 1438 CPDF_Dictionary* pAPDict = m_pAnnot->GetAnnotDict()->GetDict("AP"); |
| 1527 } | 1439 ASSERT(pAPDict != NULL); |
| 1528 | 1440 |
| 1529 CPDF_Dictionary* pStreamResList = pStreamDict->GetDict("Resources"); | 1441 CPDF_Stream* pStream = pAPDict->GetStream(sAPType); |
| 1530 if (!pStreamResList) | 1442 ASSERT(pStream != NULL); |
| 1531 { | 1443 |
| 1532 pStreamResList = new CPDF_Dictionary(); | 1444 CPDF_Dictionary* pStreamDict = pStream->GetDict(); |
| 1533 pStreamDict->SetAt("Resources", pStreamResList); | 1445 ASSERT(pStreamDict != NULL); |
| 1534 } | 1446 |
| 1535 | 1447 CFX_ByteString sImageAlias = "IMG"; |
| 1536 if (pStreamResList) | 1448 |
| 1537 { | 1449 if (CPDF_Dictionary* pImageDict = pImage->GetDict()) { |
| 1538 CPDF_Dictionary* pXObject = new CPDF_Dictionary; | 1450 sImageAlias = pImageDict->GetString("Name"); |
| 1539 pXObject->SetAtReference(sImageAlias, pDoc, pImage); | 1451 if (sImageAlias.IsEmpty()) |
| 1540 pStreamResList->SetAt("XObject", pXObject); | 1452 sImageAlias = "IMG"; |
| 1541 } | 1453 } |
| 1542 } | 1454 |
| 1543 | 1455 CPDF_Dictionary* pStreamResList = pStreamDict->GetDict("Resources"); |
| 1544 void CPDFSDK_Widget::RemoveAppearance(const CFX_ByteString& sAPType) | 1456 if (!pStreamResList) { |
| 1545 { | 1457 pStreamResList = new CPDF_Dictionary(); |
| 1546 if (CPDF_Dictionary* pAPDict = m_pAnnot->GetAnnotDict()->GetDict("AP")) | 1458 pStreamDict->SetAt("Resources", pStreamResList); |
| 1547 { | 1459 } |
| 1548 pAPDict->RemoveAt(sAPType); | 1460 |
| 1549 } | 1461 if (pStreamResList) { |
| 1550 } | 1462 CPDF_Dictionary* pXObject = new CPDF_Dictionary; |
| 1551 | 1463 pXObject->SetAtReference(sImageAlias, pDoc, pImage); |
| 1552 FX_BOOL CPDFSDK_Widget::OnAAction(CPDF_AAction::AActionType type, PDFSDK_FieldAc
tion& data, CPDFSDK_PageView* pPageView) | 1464 pStreamResList->SetAt("XObject", pXObject); |
| 1553 { | 1465 } |
| 1554 CPDF_Action action = GetAAction(type); | 1466 } |
| 1555 | 1467 |
| 1556 if (action && action.GetType() != CPDF_Action::Unknown) | 1468 void CPDFSDK_Widget::RemoveAppearance(const CFX_ByteString& sAPType) { |
| 1557 { | 1469 if (CPDF_Dictionary* pAPDict = m_pAnnot->GetAnnotDict()->GetDict("AP")) { |
| 1558 CPDFSDK_Document* pDocument = pPageView->GetSDKDocument(); | 1470 pAPDict->RemoveAt(sAPType); |
| 1559 ASSERT(pDocument != NULL); | 1471 } |
| 1560 | 1472 } |
| 1561 CPDFDoc_Environment* pEnv = pDocument->GetEnv(); | 1473 |
| 1562 ASSERT(pEnv != NULL); | 1474 FX_BOOL CPDFSDK_Widget::OnAAction(CPDF_AAction::AActionType type, |
| 1563 | 1475 PDFSDK_FieldAction& data, |
| 1564 CPDFSDK_ActionHandler* pActionHandler = pEnv->GetActionHander();/*(CPDFS
DK_ActionHandler*)pApp->GetActionHandler();*/ | 1476 CPDFSDK_PageView* pPageView) { |
| 1565 ASSERT(pActionHandler != NULL); | 1477 CPDF_Action action = GetAAction(type); |
| 1566 | 1478 |
| 1567 return pActionHandler->DoAction_Field(action, type, pDocument, GetFormFi
eld(), data); | 1479 if (action && action.GetType() != CPDF_Action::Unknown) { |
| 1568 } | 1480 CPDFSDK_Document* pDocument = pPageView->GetSDKDocument(); |
| 1569 | 1481 ASSERT(pDocument != NULL); |
| 1570 return FALSE; | 1482 |
| 1571 } | 1483 CPDFDoc_Environment* pEnv = pDocument->GetEnv(); |
| 1572 | 1484 ASSERT(pEnv != NULL); |
| 1573 CPDF_Action CPDFSDK_Widget::GetAAction(CPDF_AAction::AActionType eAAT) | 1485 |
| 1574 { | 1486 CPDFSDK_ActionHandler* pActionHandler = |
| 1575 switch (eAAT) | 1487 pEnv->GetActionHander(); /*(CPDFSDK_ActionHandler*)pApp->GetActionHandle
r();*/ |
| 1576 { | 1488 ASSERT(pActionHandler != NULL); |
| 1489 |
| 1490 return pActionHandler->DoAction_Field(action, type, pDocument, |
| 1491 GetFormField(), data); |
| 1492 } |
| 1493 |
| 1494 return FALSE; |
| 1495 } |
| 1496 |
| 1497 CPDF_Action CPDFSDK_Widget::GetAAction(CPDF_AAction::AActionType eAAT) { |
| 1498 switch (eAAT) { |
| 1577 case CPDF_AAction::CursorEnter: | 1499 case CPDF_AAction::CursorEnter: |
| 1578 case CPDF_AAction::CursorExit: | 1500 case CPDF_AAction::CursorExit: |
| 1579 case CPDF_AAction::ButtonDown: | 1501 case CPDF_AAction::ButtonDown: |
| 1580 case CPDF_AAction::ButtonUp: | 1502 case CPDF_AAction::ButtonUp: |
| 1581 case CPDF_AAction::GetFocus: | 1503 case CPDF_AAction::GetFocus: |
| 1582 case CPDF_AAction::LoseFocus: | 1504 case CPDF_AAction::LoseFocus: |
| 1583 case CPDF_AAction::PageOpen: | 1505 case CPDF_AAction::PageOpen: |
| 1584 case CPDF_AAction::PageClose: | 1506 case CPDF_AAction::PageClose: |
| 1585 case CPDF_AAction::PageVisible: | 1507 case CPDF_AAction::PageVisible: |
| 1586 case CPDF_AAction::PageInvisible: | 1508 case CPDF_AAction::PageInvisible: |
| 1587 return CPDFSDK_Annot::GetAAction(eAAT); | 1509 return CPDFSDK_Annot::GetAAction(eAAT); |
| 1588 | 1510 |
| 1589 case CPDF_AAction::KeyStroke: | 1511 case CPDF_AAction::KeyStroke: |
| 1590 case CPDF_AAction::Format: | 1512 case CPDF_AAction::Format: |
| 1591 case CPDF_AAction::Validate: | 1513 case CPDF_AAction::Validate: |
| 1592 case CPDF_AAction::Calculate: | 1514 case CPDF_AAction::Calculate: { |
| 1593 { | 1515 CPDF_FormField* pField = GetFormField(); |
| 1594 CPDF_FormField* pField = GetFormField(); | 1516 if (CPDF_AAction aa = pField->GetAdditionalAction()) |
| 1595 if (CPDF_AAction aa = pField->GetAdditionalAction()) | 1517 return aa.GetAction(eAAT); |
| 1596 return aa.GetAction(eAAT); | 1518 |
| 1597 | 1519 return CPDFSDK_Annot::GetAAction(eAAT); |
| 1598 return CPDFSDK_Annot::GetAAction(eAAT); | 1520 } |
| 1521 default: |
| 1522 break; |
| 1523 } |
| 1524 |
| 1525 return CPDF_Action(); |
| 1526 } |
| 1527 |
| 1528 CFX_WideString CPDFSDK_Widget::GetAlternateName() const { |
| 1529 CPDF_FormField* pFormField = GetFormField(); |
| 1530 ASSERT(pFormField != NULL); |
| 1531 |
| 1532 return pFormField->GetAlternateName(); |
| 1533 } |
| 1534 |
| 1535 int32_t CPDFSDK_Widget::GetAppearanceAge() const { |
| 1536 return m_nAppAge; |
| 1537 } |
| 1538 |
| 1539 int32_t CPDFSDK_Widget::GetValueAge() const { |
| 1540 return m_nValueAge; |
| 1541 } |
| 1542 |
| 1543 FX_BOOL CPDFSDK_Widget::HitTest(FX_FLOAT pageX, FX_FLOAT pageY) { |
| 1544 CPDF_Annot* pAnnot = GetPDFAnnot(); |
| 1545 CFX_FloatRect annotRect; |
| 1546 pAnnot->GetRect(annotRect); |
| 1547 if (annotRect.Contains(pageX, pageY)) { |
| 1548 if (!IsVisible()) |
| 1549 return FALSE; |
| 1550 |
| 1551 int nFieldFlags = GetFieldFlags(); |
| 1552 if ((nFieldFlags & FIELDFLAG_READONLY) == FIELDFLAG_READONLY) |
| 1553 return FALSE; |
| 1554 |
| 1555 return TRUE; |
| 1556 } |
| 1557 return FALSE; |
| 1558 } |
| 1559 |
| 1560 CPDFSDK_InterForm::CPDFSDK_InterForm(CPDFSDK_Document* pDocument) |
| 1561 : m_pDocument(pDocument), |
| 1562 m_pInterForm(NULL), |
| 1563 m_bCalculate(TRUE), |
| 1564 m_bBusy(FALSE) { |
| 1565 ASSERT(m_pDocument != NULL); |
| 1566 m_pInterForm = new CPDF_InterForm(m_pDocument->GetDocument(), FALSE); |
| 1567 ASSERT(m_pInterForm != NULL); |
| 1568 m_pInterForm->SetFormNotify(this); |
| 1569 |
| 1570 for (int i = 0; i < 6; i++) |
| 1571 m_bNeedHightlight[i] = FALSE; |
| 1572 m_iHighlightAlpha = 0; |
| 1573 } |
| 1574 |
| 1575 CPDFSDK_InterForm::~CPDFSDK_InterForm() { |
| 1576 delete m_pInterForm; |
| 1577 m_pInterForm = nullptr; |
| 1578 m_Map.clear(); |
| 1579 } |
| 1580 |
| 1581 FX_BOOL CPDFSDK_InterForm::HighlightWidgets() { |
| 1582 return FALSE; |
| 1583 } |
| 1584 |
| 1585 CPDFSDK_Widget* CPDFSDK_InterForm::GetSibling(CPDFSDK_Widget* pWidget, |
| 1586 FX_BOOL bNext) const { |
| 1587 nonstd::unique_ptr<CBA_AnnotIterator> pIterator( |
| 1588 new CBA_AnnotIterator(pWidget->GetPageView(), "Widget", "")); |
| 1589 |
| 1590 if (bNext) { |
| 1591 return (CPDFSDK_Widget*)pIterator->GetNextAnnot(pWidget); |
| 1592 } |
| 1593 return (CPDFSDK_Widget*)pIterator->GetPrevAnnot(pWidget); |
| 1594 } |
| 1595 |
| 1596 CPDFSDK_Widget* CPDFSDK_InterForm::GetWidget(CPDF_FormControl* pControl) const { |
| 1597 if (!pControl || !m_pInterForm) |
| 1598 return nullptr; |
| 1599 |
| 1600 CPDFSDK_Widget* pWidget = nullptr; |
| 1601 const auto it = m_Map.find(pControl); |
| 1602 if (it != m_Map.end()) |
| 1603 pWidget = it->second; |
| 1604 |
| 1605 if (pWidget) |
| 1606 return pWidget; |
| 1607 |
| 1608 CPDF_Dictionary* pControlDict = pControl->GetWidget(); |
| 1609 CPDF_Document* pDocument = m_pDocument->GetDocument(); |
| 1610 CPDFSDK_PageView* pPage = nullptr; |
| 1611 |
| 1612 if (CPDF_Dictionary* pPageDict = pControlDict->GetDict("P")) { |
| 1613 int nPageIndex = pDocument->GetPageIndex(pPageDict->GetObjNum()); |
| 1614 if (nPageIndex >= 0) { |
| 1615 pPage = m_pDocument->GetPageView(nPageIndex); |
| 1616 } |
| 1617 } |
| 1618 |
| 1619 if (!pPage) { |
| 1620 int nPageIndex = GetPageIndexByAnnotDict(pDocument, pControlDict); |
| 1621 if (nPageIndex >= 0) { |
| 1622 pPage = m_pDocument->GetPageView(nPageIndex); |
| 1623 } |
| 1624 } |
| 1625 |
| 1626 if (!pPage) |
| 1627 return nullptr; |
| 1628 return (CPDFSDK_Widget*)pPage->GetAnnotByDict(pControlDict); |
| 1629 } |
| 1630 |
| 1631 void CPDFSDK_InterForm::GetWidgets(const CFX_WideString& sFieldName, |
| 1632 CFX_PtrArray& widgets) { |
| 1633 ASSERT(m_pInterForm != NULL); |
| 1634 |
| 1635 for (int i = 0, sz = m_pInterForm->CountFields(sFieldName); i < sz; i++) { |
| 1636 CPDF_FormField* pFormField = m_pInterForm->GetField(i, sFieldName); |
| 1637 ASSERT(pFormField != NULL); |
| 1638 |
| 1639 GetWidgets(pFormField, widgets); |
| 1640 } |
| 1641 } |
| 1642 |
| 1643 void CPDFSDK_InterForm::GetWidgets(CPDF_FormField* pField, |
| 1644 CFX_PtrArray& widgets) { |
| 1645 ASSERT(pField != NULL); |
| 1646 |
| 1647 for (int i = 0, isz = pField->CountControls(); i < isz; i++) { |
| 1648 CPDF_FormControl* pFormCtrl = pField->GetControl(i); |
| 1649 ASSERT(pFormCtrl != NULL); |
| 1650 |
| 1651 CPDFSDK_Widget* pWidget = GetWidget(pFormCtrl); |
| 1652 |
| 1653 if (pWidget) |
| 1654 widgets.Add(pWidget); |
| 1655 } |
| 1656 } |
| 1657 |
| 1658 int CPDFSDK_InterForm::GetPageIndexByAnnotDict( |
| 1659 CPDF_Document* pDocument, |
| 1660 CPDF_Dictionary* pAnnotDict) const { |
| 1661 ASSERT(pDocument != NULL); |
| 1662 ASSERT(pAnnotDict != NULL); |
| 1663 |
| 1664 for (int i = 0, sz = pDocument->GetPageCount(); i < sz; i++) { |
| 1665 if (CPDF_Dictionary* pPageDict = pDocument->GetPage(i)) { |
| 1666 if (CPDF_Array* pAnnots = pPageDict->GetArray("Annots")) { |
| 1667 for (int j = 0, jsz = pAnnots->GetCount(); j < jsz; j++) { |
| 1668 CPDF_Object* pDict = pAnnots->GetElementValue(j); |
| 1669 if (pAnnotDict == pDict) { |
| 1670 return i; |
| 1671 } |
| 1599 } | 1672 } |
| 1600 default: | 1673 } |
| 1601 break; | 1674 } |
| 1602 } | 1675 } |
| 1603 | 1676 |
| 1604 return CPDF_Action(); | 1677 return -1; |
| 1605 } | 1678 } |
| 1606 | 1679 |
| 1607 | 1680 void CPDFSDK_InterForm::AddMap(CPDF_FormControl* pControl, |
| 1608 CFX_WideString CPDFSDK_Widget::GetAlternateName() const | 1681 CPDFSDK_Widget* pWidget) { |
| 1609 { | 1682 m_Map[pControl] = pWidget; |
| 1610 CPDF_FormField* pFormField = GetFormField(); | 1683 } |
| 1611 ASSERT(pFormField != NULL); | 1684 |
| 1612 | 1685 void CPDFSDK_InterForm::RemoveMap(CPDF_FormControl* pControl) { |
| 1613 return pFormField->GetAlternateName(); | 1686 m_Map.erase(pControl); |
| 1614 } | 1687 } |
| 1615 | 1688 |
| 1616 int32_t CPDFSDK_Widget::GetAppearanceAge() const | 1689 void CPDFSDK_InterForm::EnableCalculate(FX_BOOL bEnabled) { |
| 1617 { | 1690 m_bCalculate = bEnabled; |
| 1618 return m_nAppAge; | 1691 } |
| 1619 } | 1692 |
| 1620 | 1693 FX_BOOL CPDFSDK_InterForm::IsCalculateEnabled() const { |
| 1621 int32_t CPDFSDK_Widget::GetValueAge() const | 1694 return m_bCalculate; |
| 1622 { | |
| 1623 return m_nValueAge; | |
| 1624 } | |
| 1625 | |
| 1626 | |
| 1627 FX_BOOL CPDFSDK_Widget::HitTest(FX_FLOAT pageX, FX_FLOAT pageY) | |
| 1628 { | |
| 1629 CPDF_Annot* pAnnot = GetPDFAnnot(); | |
| 1630 CFX_FloatRect annotRect; | |
| 1631 pAnnot->GetRect(annotRect); | |
| 1632 if(annotRect.Contains(pageX, pageY)) | |
| 1633 { | |
| 1634 if (!IsVisible()) return FALSE; | |
| 1635 | |
| 1636 int nFieldFlags = GetFieldFlags(); | |
| 1637 if ((nFieldFlags & FIELDFLAG_READONLY) == FIELDFLAG_READONLY) | |
| 1638 return FALSE; | |
| 1639 | |
| 1640 return TRUE; | |
| 1641 } | |
| 1642 return FALSE; | |
| 1643 } | |
| 1644 | |
| 1645 CPDFSDK_InterForm::CPDFSDK_InterForm(CPDFSDK_Document* pDocument) | |
| 1646 :m_pDocument(pDocument), | |
| 1647 m_pInterForm(NULL), | |
| 1648 m_bCalculate(TRUE), | |
| 1649 m_bBusy(FALSE) | |
| 1650 { | |
| 1651 ASSERT(m_pDocument != NULL); | |
| 1652 m_pInterForm = new CPDF_InterForm(m_pDocument->GetDocument(), FALSE); | |
| 1653 ASSERT(m_pInterForm != NULL); | |
| 1654 m_pInterForm->SetFormNotify(this); | |
| 1655 | |
| 1656 for(int i=0; i<6; i++) | |
| 1657 m_bNeedHightlight[i] = FALSE; | |
| 1658 m_iHighlightAlpha = 0; | |
| 1659 } | |
| 1660 | |
| 1661 CPDFSDK_InterForm::~CPDFSDK_InterForm() | |
| 1662 { | |
| 1663 delete m_pInterForm; | |
| 1664 m_pInterForm = nullptr; | |
| 1665 m_Map.clear(); | |
| 1666 } | |
| 1667 | |
| 1668 FX_BOOL CPDFSDK_InterForm::HighlightWidgets() | |
| 1669 { | |
| 1670 return FALSE; | |
| 1671 } | |
| 1672 | |
| 1673 CPDFSDK_Widget* CPDFSDK_InterForm::GetSibling(CPDFSDK_Widget* pWidget, FX_BOOL b
Next) const | |
| 1674 { | |
| 1675 nonstd::unique_ptr<CBA_AnnotIterator> pIterator( | |
| 1676 new CBA_AnnotIterator(pWidget->GetPageView(), "Widget", "")); | |
| 1677 | |
| 1678 if (bNext) { | |
| 1679 return (CPDFSDK_Widget*)pIterator->GetNextAnnot(pWidget); | |
| 1680 } | |
| 1681 return (CPDFSDK_Widget*)pIterator->GetPrevAnnot(pWidget); | |
| 1682 } | |
| 1683 | |
| 1684 CPDFSDK_Widget* CPDFSDK_InterForm::GetWidget(CPDF_FormControl* pControl) const | |
| 1685 { | |
| 1686 if (!pControl || !m_pInterForm) | |
| 1687 return nullptr; | |
| 1688 | |
| 1689 CPDFSDK_Widget* pWidget = nullptr; | |
| 1690 const auto it = m_Map.find(pControl); | |
| 1691 if (it != m_Map.end()) | |
| 1692 pWidget = it->second; | |
| 1693 | |
| 1694 if (pWidget) | |
| 1695 return pWidget; | |
| 1696 | |
| 1697 CPDF_Dictionary* pControlDict = pControl->GetWidget(); | |
| 1698 CPDF_Document* pDocument = m_pDocument->GetDocument(); | |
| 1699 CPDFSDK_PageView* pPage = nullptr; | |
| 1700 | |
| 1701 if (CPDF_Dictionary* pPageDict = pControlDict->GetDict("P")) { | |
| 1702 int nPageIndex = pDocument->GetPageIndex(pPageDict->GetObjNum()); | |
| 1703 if (nPageIndex >= 0) { | |
| 1704 pPage = m_pDocument->GetPageView(nPageIndex); | |
| 1705 } | |
| 1706 } | |
| 1707 | |
| 1708 if (!pPage) { | |
| 1709 int nPageIndex = GetPageIndexByAnnotDict(pDocument, pControlDict); | |
| 1710 if (nPageIndex >= 0) { | |
| 1711 pPage = m_pDocument->GetPageView(nPageIndex); | |
| 1712 } | |
| 1713 } | |
| 1714 | |
| 1715 if (!pPage) | |
| 1716 return nullptr; | |
| 1717 return (CPDFSDK_Widget*)pPage->GetAnnotByDict(pControlDict); | |
| 1718 } | |
| 1719 | |
| 1720 void CPDFSDK_InterForm::GetWidgets(const CFX_WideString& sFieldName, CFX_PtrArra
y& widgets) | |
| 1721 { | |
| 1722 ASSERT(m_pInterForm != NULL); | |
| 1723 | |
| 1724 for (int i=0,sz=m_pInterForm->CountFields(sFieldName); i<sz; i++) | |
| 1725 { | |
| 1726 CPDF_FormField* pFormField = m_pInterForm->GetField(i, sFieldName); | |
| 1727 ASSERT(pFormField != NULL); | |
| 1728 | |
| 1729 GetWidgets(pFormField, widgets); | |
| 1730 } | |
| 1731 } | |
| 1732 | |
| 1733 void CPDFSDK_InterForm::GetWidgets(CPDF_FormField* pField, CFX_PtrArray& widgets
) | |
| 1734 { | |
| 1735 ASSERT(pField != NULL); | |
| 1736 | |
| 1737 for (int i=0,isz=pField->CountControls(); i<isz; i++) | |
| 1738 { | |
| 1739 CPDF_FormControl* pFormCtrl = pField->GetControl(i); | |
| 1740 ASSERT(pFormCtrl != NULL); | |
| 1741 | |
| 1742 CPDFSDK_Widget* pWidget = GetWidget(pFormCtrl); | |
| 1743 | |
| 1744 if (pWidget) | |
| 1745 widgets.Add(pWidget); | |
| 1746 } | |
| 1747 } | |
| 1748 | |
| 1749 int CPDFSDK_InterForm::GetPageIndexByAnnotDict(CPDF_Document* pDocument, CPDF_Di
ctionary* pAnnotDict) const | |
| 1750 { | |
| 1751 ASSERT(pDocument != NULL); | |
| 1752 ASSERT(pAnnotDict != NULL); | |
| 1753 | |
| 1754 for (int i=0,sz=pDocument->GetPageCount(); i<sz; i++) | |
| 1755 { | |
| 1756 if (CPDF_Dictionary* pPageDict = pDocument->GetPage(i)) | |
| 1757 { | |
| 1758 if (CPDF_Array* pAnnots = pPageDict->GetArray("Annots")) | |
| 1759 { | |
| 1760 for (int j=0,jsz=pAnnots->GetCount(); j<jsz; j++) | |
| 1761 { | |
| 1762 CPDF_Object* pDict = pAnnots->GetElementValue(j); | |
| 1763 if (pAnnotDict == pDict) | |
| 1764 { | |
| 1765 return i; | |
| 1766 } | |
| 1767 } | |
| 1768 } | |
| 1769 } | |
| 1770 } | |
| 1771 | |
| 1772 return -1; | |
| 1773 } | |
| 1774 | |
| 1775 void CPDFSDK_InterForm::AddMap(CPDF_FormControl* pControl, CPDFSDK_Widget* pWidg
et) | |
| 1776 { | |
| 1777 m_Map[pControl] = pWidget; | |
| 1778 } | |
| 1779 | |
| 1780 void CPDFSDK_InterForm::RemoveMap(CPDF_FormControl* pControl) | |
| 1781 { | |
| 1782 m_Map.erase(pControl); | |
| 1783 } | |
| 1784 | |
| 1785 void CPDFSDK_InterForm::EnableCalculate(FX_BOOL bEnabled) | |
| 1786 { | |
| 1787 m_bCalculate = bEnabled; | |
| 1788 } | |
| 1789 | |
| 1790 FX_BOOL CPDFSDK_InterForm::IsCalculateEnabled() const | |
| 1791 { | |
| 1792 return m_bCalculate; | |
| 1793 } | 1695 } |
| 1794 | 1696 |
| 1795 #ifdef _WIN32 | 1697 #ifdef _WIN32 |
| 1796 CPDF_Stream* CPDFSDK_InterForm::LoadImageFromFile(const CFX_WideString& sFile) | 1698 CPDF_Stream* CPDFSDK_InterForm::LoadImageFromFile(const CFX_WideString& sFile) { |
| 1797 { | 1699 ASSERT(m_pDocument != NULL); |
| 1798 ASSERT(m_pDocument != NULL); | 1700 CPDF_Document* pDocument = m_pDocument->GetDocument(); |
| 1799 CPDF_Document* pDocument = m_pDocument->GetDocument(); | 1701 ASSERT(pDocument != NULL); |
| 1800 ASSERT(pDocument != NULL); | 1702 |
| 1801 | 1703 CPDF_Stream* pRetStream = NULL; |
| 1802 CPDF_Stream* pRetStream = NULL; | 1704 |
| 1803 | 1705 if (CFX_DIBitmap* pBmp = CFX_WindowsDIB::LoadFromFile(sFile.c_str())) { |
| 1804 if (CFX_DIBitmap* pBmp = CFX_WindowsDIB::LoadFromFile(sFile.c_str())) | 1706 int nWidth = pBmp->GetWidth(); |
| 1805 { | 1707 int nHeight = pBmp->GetHeight(); |
| 1806 int nWidth = pBmp->GetWidth(); | 1708 |
| 1807 int nHeight = pBmp->GetHeight(); | 1709 CPDF_Image Image(pDocument); |
| 1808 | 1710 Image.SetImage(pBmp, FALSE); |
| 1809 CPDF_Image Image(pDocument); | 1711 CPDF_Stream* pImageStream = Image.GetStream(); |
| 1810 Image.SetImage(pBmp, FALSE); | 1712 if (pImageStream) { |
| 1811 CPDF_Stream* pImageStream = Image.GetStream(); | 1713 if (pImageStream->GetObjNum() == 0) |
| 1812 if (pImageStream) | 1714 pDocument->AddIndirectObject(pImageStream); |
| 1813 { | 1715 |
| 1814 if (pImageStream->GetObjNum() == 0) | 1716 CPDF_Dictionary* pStreamDict = new CPDF_Dictionary(); |
| 1815 pDocument->AddIndirectObject(pImageStream); | 1717 pStreamDict->SetAtName("Subtype", "Form"); |
| 1816 | 1718 pStreamDict->SetAtName("Name", "IMG"); |
| 1817 CPDF_Dictionary* pStreamDict = new CPDF_Dictionary(); | 1719 CPDF_Array* pMatrix = new CPDF_Array(); |
| 1818 pStreamDict->SetAtName("Subtype", "Form"); | 1720 pStreamDict->SetAt("Matrix", pMatrix); |
| 1819 pStreamDict->SetAtName("Name", "IMG"); | 1721 pMatrix->AddInteger(1); |
| 1820 CPDF_Array* pMatrix = new CPDF_Array(); | 1722 pMatrix->AddInteger(0); |
| 1821 pStreamDict->SetAt("Matrix", pMatrix); | 1723 pMatrix->AddInteger(0); |
| 1822 pMatrix->AddInteger(1); | 1724 pMatrix->AddInteger(1); |
| 1823 pMatrix->AddInteger(0); | 1725 pMatrix->AddInteger(-nWidth / 2); |
| 1824 pMatrix->AddInteger(0); | 1726 pMatrix->AddInteger(-nHeight / 2); |
| 1825 pMatrix->AddInteger(1); | 1727 CPDF_Dictionary* pResource = new CPDF_Dictionary(); |
| 1826 pMatrix->AddInteger(-nWidth / 2); | 1728 pStreamDict->SetAt("Resources", pResource); |
| 1827 pMatrix->AddInteger(-nHeight / 2); | 1729 CPDF_Dictionary* pXObject = new CPDF_Dictionary(); |
| 1828 CPDF_Dictionary* pResource = new CPDF_Dictionary(); | 1730 pResource->SetAt("XObject", pXObject); |
| 1829 pStreamDict->SetAt("Resources", pResource); | 1731 pXObject->SetAtReference("Img", pDocument, pImageStream); |
| 1830 CPDF_Dictionary* pXObject = new CPDF_Dictionary(); | 1732 CPDF_Array* pProcSet = new CPDF_Array(); |
| 1831 pResource->SetAt("XObject", pXObject); | 1733 pResource->SetAt("ProcSet", pProcSet); |
| 1832 pXObject->SetAtReference("Img", pDocument, pImageStream); | 1734 pProcSet->AddName("PDF"); |
| 1833 CPDF_Array* pProcSet = new CPDF_Array(); | 1735 pProcSet->AddName("ImageC"); |
| 1834 pResource->SetAt("ProcSet", pProcSet); | 1736 pStreamDict->SetAtName("Type", "XObject"); |
| 1835 pProcSet->AddName("PDF"); | 1737 CPDF_Array* pBBox = new CPDF_Array(); |
| 1836 pProcSet->AddName("ImageC"); | 1738 pStreamDict->SetAt("BBox", pBBox); |
| 1837 pStreamDict->SetAtName("Type", "XObject"); | 1739 pBBox->AddInteger(0); |
| 1838 CPDF_Array* pBBox = new CPDF_Array(); | 1740 pBBox->AddInteger(0); |
| 1839 pStreamDict->SetAt("BBox", pBBox); | 1741 pBBox->AddInteger(nWidth); |
| 1840 pBBox->AddInteger(0); | 1742 pBBox->AddInteger(nHeight); |
| 1841 pBBox->AddInteger(0); | 1743 pStreamDict->SetAtInteger("FormType", 1); |
| 1842 pBBox->AddInteger(nWidth); | 1744 |
| 1843 pBBox->AddInteger(nHeight); | 1745 pRetStream = new CPDF_Stream(NULL, 0, NULL); |
| 1844 pStreamDict->SetAtInteger("FormType", 1); | 1746 CFX_ByteString csStream; |
| 1845 | 1747 csStream.Format("q\n%d 0 0 %d 0 0 cm\n/Img Do\nQ", nWidth, nHeight); |
| 1846 pRetStream = new CPDF_Stream(NULL, 0, NULL); | 1748 pRetStream->InitStream((uint8_t*)csStream.c_str(), csStream.GetLength(), |
| 1847 CFX_ByteString csStream; | 1749 pStreamDict); |
| 1848 csStream.Format("q\n%d 0 0 %d 0 0 cm\n/Img Do\nQ", nWidth, nHeight); | 1750 pDocument->AddIndirectObject(pRetStream); |
| 1849 pRetStream->InitStream((uint8_t*)csStream.c_str(), csStream.GetLengt
h(), pStreamDict); | 1751 } |
| 1850 pDocument->AddIndirectObject(pRetStream); | 1752 |
| 1851 } | 1753 delete pBmp; |
| 1852 | 1754 } |
| 1853 delete pBmp; | 1755 |
| 1854 } | 1756 return pRetStream; |
| 1855 | |
| 1856 return pRetStream; | |
| 1857 } | 1757 } |
| 1858 #endif | 1758 #endif |
| 1859 | 1759 |
| 1860 void CPDFSDK_InterForm::OnCalculate(CPDF_FormField* pFormField) | 1760 void CPDFSDK_InterForm::OnCalculate(CPDF_FormField* pFormField) { |
| 1861 { | 1761 ASSERT(m_pDocument != NULL); |
| 1862 ASSERT(m_pDocument != NULL); | 1762 CPDFDoc_Environment* pEnv = m_pDocument->GetEnv(); |
| 1863 CPDFDoc_Environment* pEnv = m_pDocument->GetEnv(); | 1763 ASSERT(pEnv); |
| 1864 ASSERT(pEnv); | 1764 if (!pEnv->IsJSInitiated()) |
| 1865 if(!pEnv->IsJSInitiated()) | 1765 return; |
| 1866 return; | 1766 |
| 1867 | 1767 if (m_bBusy) |
| 1868 if (m_bBusy) return; | 1768 return; |
| 1869 | 1769 |
| 1870 m_bBusy = TRUE; | 1770 m_bBusy = TRUE; |
| 1871 | 1771 |
| 1872 if (IsCalculateEnabled()) | 1772 if (IsCalculateEnabled()) { |
| 1873 { | |
| 1874 IFXJS_Runtime* pRuntime = m_pDocument->GetJsRuntime(); | |
| 1875 ASSERT(pRuntime != NULL); | |
| 1876 | |
| 1877 pRuntime->SetReaderDocument(m_pDocument); | |
| 1878 | |
| 1879 int nSize = m_pInterForm->CountFieldsInCalculationOrder(); | |
| 1880 for (int i=0; i<nSize; i++) | |
| 1881 { | |
| 1882 if(CPDF_FormField* pField = m_pInterForm->GetFieldInCalculationOrder
(i)) | |
| 1883 { | |
| 1884 // ASSERT(pField != NULL); | |
| 1885 int nType = pField->GetFieldType(); | |
| 1886 if (nType == FIELDTYPE_COMBOBOX || nType == FIELDTYPE_TEXTFIELD) | |
| 1887 { | |
| 1888 CPDF_AAction aAction = pField->GetAdditionalAction(); | |
| 1889 if (aAction && aAction.ActionExist(CPDF_AAction::Calculate)) | |
| 1890 { | |
| 1891 CPDF_Action action = aAction.GetAction(CPDF_AAction::Cal
culate); | |
| 1892 if (action) | |
| 1893 { | |
| 1894 CFX_WideString csJS = action.GetJavaScript(); | |
| 1895 if (!csJS.IsEmpty()) | |
| 1896 { | |
| 1897 IFXJS_Context* pContext = pRuntime->NewContext()
; | |
| 1898 ASSERT(pContext != NULL); | |
| 1899 | |
| 1900 CFX_WideString sOldValue = pField->GetValue(); | |
| 1901 CFX_WideString sValue = sOldValue; | |
| 1902 FX_BOOL bRC = TRUE; | |
| 1903 pContext->OnField_Calculate(pFormField, pField,
sValue, bRC); | |
| 1904 | |
| 1905 CFX_WideString sInfo; | |
| 1906 FX_BOOL bRet = pContext->RunScript(csJS, sInfo); | |
| 1907 pRuntime->ReleaseContext(pContext); | |
| 1908 | |
| 1909 if (bRet) | |
| 1910 { | |
| 1911 if (bRC) | |
| 1912 { | |
| 1913 if (sValue.Compare(sOldValue) != 0) | |
| 1914 pField->SetValue(sValue, TRUE); | |
| 1915 } | |
| 1916 } | |
| 1917 } | |
| 1918 } | |
| 1919 } | |
| 1920 } | |
| 1921 } | |
| 1922 } | |
| 1923 | |
| 1924 | |
| 1925 } | |
| 1926 | |
| 1927 m_bBusy = FALSE; | |
| 1928 } | |
| 1929 | |
| 1930 CFX_WideString CPDFSDK_InterForm::OnFormat(CPDF_FormField* pFormField, FX_BOOL&
bFormated) | |
| 1931 { | |
| 1932 ASSERT(m_pDocument != NULL); | |
| 1933 ASSERT(pFormField != NULL); | |
| 1934 | |
| 1935 CFX_WideString sValue = pFormField->GetValue(); | |
| 1936 CPDFDoc_Environment* pEnv = m_pDocument->GetEnv(); | |
| 1937 ASSERT(pEnv); | |
| 1938 if(!pEnv->IsJSInitiated()) | |
| 1939 { | |
| 1940 bFormated = FALSE; | |
| 1941 return sValue; | |
| 1942 } | |
| 1943 | |
| 1944 IFXJS_Runtime* pRuntime = m_pDocument->GetJsRuntime(); | 1773 IFXJS_Runtime* pRuntime = m_pDocument->GetJsRuntime(); |
| 1945 ASSERT(pRuntime != NULL); | 1774 ASSERT(pRuntime != NULL); |
| 1946 | 1775 |
| 1947 pRuntime->SetReaderDocument(m_pDocument); | 1776 pRuntime->SetReaderDocument(m_pDocument); |
| 1948 | 1777 |
| 1949 if (pFormField->GetFieldType() == FIELDTYPE_COMBOBOX) | 1778 int nSize = m_pInterForm->CountFieldsInCalculationOrder(); |
| 1950 { | 1779 for (int i = 0; i < nSize; i++) { |
| 1951 if (pFormField->CountSelectedItems() > 0) | 1780 if (CPDF_FormField* pField = |
| 1952 { | 1781 m_pInterForm->GetFieldInCalculationOrder(i)) { |
| 1953 int index = pFormField->GetSelectedIndex(0); | 1782 // ASSERT(pField != NULL); |
| 1954 if (index >= 0) | 1783 int nType = pField->GetFieldType(); |
| 1955 sValue = pFormField->GetOptionLabel(index); | 1784 if (nType == FIELDTYPE_COMBOBOX || nType == FIELDTYPE_TEXTFIELD) { |
| 1956 } | 1785 CPDF_AAction aAction = pField->GetAdditionalAction(); |
| 1957 } | 1786 if (aAction && aAction.ActionExist(CPDF_AAction::Calculate)) { |
| 1958 | 1787 CPDF_Action action = aAction.GetAction(CPDF_AAction::Calculate); |
| 1959 bFormated = FALSE; | 1788 if (action) { |
| 1960 | 1789 CFX_WideString csJS = action.GetJavaScript(); |
| 1961 CPDF_AAction aAction = pFormField->GetAdditionalAction(); | 1790 if (!csJS.IsEmpty()) { |
| 1962 if (aAction != NULL && aAction.ActionExist(CPDF_AAction::Format)) | |
| 1963 { | |
| 1964 CPDF_Action action = aAction.GetAction(CPDF_AAction::Format); | |
| 1965 if (action) | |
| 1966 { | |
| 1967 CFX_WideString script = action.GetJavaScript(); | |
| 1968 if (!script.IsEmpty()) | |
| 1969 { | |
| 1970 CFX_WideString Value = sValue; | |
| 1971 | |
| 1972 IFXJS_Context* pContext = pRuntime->NewContext(); | 1791 IFXJS_Context* pContext = pRuntime->NewContext(); |
| 1973 ASSERT(pContext != NULL); | 1792 ASSERT(pContext != NULL); |
| 1974 | 1793 |
| 1975 pContext->OnField_Format(pFormField, Value, TRUE); | 1794 CFX_WideString sOldValue = pField->GetValue(); |
| 1795 CFX_WideString sValue = sOldValue; |
| 1796 FX_BOOL bRC = TRUE; |
| 1797 pContext->OnField_Calculate(pFormField, pField, sValue, bRC); |
| 1976 | 1798 |
| 1977 CFX_WideString sInfo; | 1799 CFX_WideString sInfo; |
| 1978 FX_BOOL bRet = pContext->RunScript(script, sInfo); | 1800 FX_BOOL bRet = pContext->RunScript(csJS, sInfo); |
| 1979 pRuntime->ReleaseContext(pContext); | 1801 pRuntime->ReleaseContext(pContext); |
| 1980 | 1802 |
| 1981 if (bRet) | 1803 if (bRet) { |
| 1982 { | 1804 if (bRC) { |
| 1983 sValue = Value; | 1805 if (sValue.Compare(sOldValue) != 0) |
| 1984 bFormated = TRUE; | 1806 pField->SetValue(sValue, TRUE); |
| 1807 } |
| 1985 } | 1808 } |
| 1809 } |
| 1986 } | 1810 } |
| 1811 } |
| 1987 } | 1812 } |
| 1988 } | 1813 } |
| 1989 | 1814 } |
| 1815 } |
| 1816 |
| 1817 m_bBusy = FALSE; |
| 1818 } |
| 1819 |
| 1820 CFX_WideString CPDFSDK_InterForm::OnFormat(CPDF_FormField* pFormField, |
| 1821 FX_BOOL& bFormated) { |
| 1822 ASSERT(m_pDocument != NULL); |
| 1823 ASSERT(pFormField != NULL); |
| 1824 |
| 1825 CFX_WideString sValue = pFormField->GetValue(); |
| 1826 CPDFDoc_Environment* pEnv = m_pDocument->GetEnv(); |
| 1827 ASSERT(pEnv); |
| 1828 if (!pEnv->IsJSInitiated()) { |
| 1829 bFormated = FALSE; |
| 1990 return sValue; | 1830 return sValue; |
| 1991 } | 1831 } |
| 1992 | 1832 |
| 1993 void CPDFSDK_InterForm::ResetFieldAppearance(CPDF_FormField* pFormField, const F
X_WCHAR* sValue, FX_BOOL bValueChanged) | 1833 IFXJS_Runtime* pRuntime = m_pDocument->GetJsRuntime(); |
| 1994 { | 1834 ASSERT(pRuntime != NULL); |
| 1995 ASSERT(pFormField != NULL); | 1835 |
| 1996 | 1836 pRuntime->SetReaderDocument(m_pDocument); |
| 1997 for (int i=0,sz=pFormField->CountControls(); i<sz; i++) | 1837 |
| 1998 { | 1838 if (pFormField->GetFieldType() == FIELDTYPE_COMBOBOX) { |
| 1999 CPDF_FormControl* pFormCtrl = pFormField->GetControl(i); | 1839 if (pFormField->CountSelectedItems() > 0) { |
| 2000 ASSERT(pFormCtrl != NULL); | 1840 int index = pFormField->GetSelectedIndex(0); |
| 2001 | 1841 if (index >= 0) |
| 2002 ASSERT(m_pInterForm != NULL); | 1842 sValue = pFormField->GetOptionLabel(index); |
| 2003 if(CPDFSDK_Widget* pWidget = GetWidget(pFormCtrl)) | 1843 } |
| 2004 pWidget->ResetAppearance(sValue, bValueChanged); | 1844 } |
| 2005 } | 1845 |
| 2006 } | 1846 bFormated = FALSE; |
| 2007 | 1847 |
| 2008 void CPDFSDK_InterForm::UpdateField(CPDF_FormField* pFormField) | 1848 CPDF_AAction aAction = pFormField->GetAdditionalAction(); |
| 2009 { | 1849 if (aAction != NULL && aAction.ActionExist(CPDF_AAction::Format)) { |
| 2010 ASSERT(pFormField != NULL); | 1850 CPDF_Action action = aAction.GetAction(CPDF_AAction::Format); |
| 2011 | 1851 if (action) { |
| 2012 for (int i=0,sz=pFormField->CountControls(); i<sz; i++) | 1852 CFX_WideString script = action.GetJavaScript(); |
| 2013 { | 1853 if (!script.IsEmpty()) { |
| 2014 CPDF_FormControl* pFormCtrl = pFormField->GetControl(i); | 1854 CFX_WideString Value = sValue; |
| 2015 ASSERT(pFormCtrl != NULL); | 1855 |
| 2016 | 1856 IFXJS_Context* pContext = pRuntime->NewContext(); |
| 2017 if(CPDFSDK_Widget* pWidget = GetWidget(pFormCtrl)) | 1857 ASSERT(pContext != NULL); |
| 2018 { | 1858 |
| 2019 CPDFDoc_Environment * pEnv = m_pDocument->GetEnv(); | 1859 pContext->OnField_Format(pFormField, Value, TRUE); |
| 2020 CFFL_IFormFiller* pIFormFiller = pEnv->GetIFormFiller(); | 1860 |
| 2021 | 1861 CFX_WideString sInfo; |
| 2022 CPDF_Page * pPage = pWidget->GetPDFPage(); | 1862 FX_BOOL bRet = pContext->RunScript(script, sInfo); |
| 2023 CPDFSDK_PageView * pPageView = m_pDocument->GetPageView(pPage,FALSE)
; | 1863 pRuntime->ReleaseContext(pContext); |
| 2024 | 1864 |
| 2025 FX_RECT rcBBox = pIFormFiller->GetViewBBox(pPageView, pWidget); | 1865 if (bRet) { |
| 2026 | 1866 sValue = Value; |
| 2027 pEnv->FFI_Invalidate(pPage,rcBBox.left, rcBBox.top, rcBBox.right, rc
BBox.bottom); | 1867 bFormated = TRUE; |
| 2028 } | 1868 } |
| 2029 } | 1869 } |
| 2030 } | 1870 } |
| 2031 | 1871 } |
| 2032 void CPDFSDK_InterForm::OnKeyStrokeCommit(CPDF_FormField* pFormField, CFX_WideSt
ring& csValue, FX_BOOL& bRC) | 1872 |
| 2033 { | 1873 return sValue; |
| 2034 ASSERT(pFormField != NULL); | 1874 } |
| 2035 | 1875 |
| 2036 CPDF_AAction aAction = pFormField->GetAdditionalAction(); | 1876 void CPDFSDK_InterForm::ResetFieldAppearance(CPDF_FormField* pFormField, |
| 2037 if (aAction != NULL && aAction.ActionExist(CPDF_AAction::KeyStroke)) | 1877 const FX_WCHAR* sValue, |
| 2038 { | 1878 FX_BOOL bValueChanged) { |
| 2039 CPDF_Action action = aAction.GetAction(CPDF_AAction::KeyStroke); | 1879 ASSERT(pFormField != NULL); |
| 2040 if (action) | 1880 |
| 2041 { | 1881 for (int i = 0, sz = pFormField->CountControls(); i < sz; i++) { |
| 2042 ASSERT(m_pDocument != NULL); | 1882 CPDF_FormControl* pFormCtrl = pFormField->GetControl(i); |
| 2043 CPDFDoc_Environment* pEnv = m_pDocument->GetEnv(); | 1883 ASSERT(pFormCtrl != NULL); |
| 2044 ASSERT(pEnv != NULL); | 1884 |
| 2045 | 1885 ASSERT(m_pInterForm != NULL); |
| 2046 CPDFSDK_ActionHandler* pActionHandler = pEnv->GetActionHander(); | 1886 if (CPDFSDK_Widget* pWidget = GetWidget(pFormCtrl)) |
| 2047 ASSERT(pActionHandler != NULL); | 1887 pWidget->ResetAppearance(sValue, bValueChanged); |
| 2048 | 1888 } |
| 2049 PDFSDK_FieldAction fa; | 1889 } |
| 2050 fa.bModifier = pEnv->FFI_IsCTRLKeyDown(0); | 1890 |
| 2051 fa.bShift = pEnv->FFI_IsSHIFTKeyDown(0); | 1891 void CPDFSDK_InterForm::UpdateField(CPDF_FormField* pFormField) { |
| 2052 fa.sValue = csValue; | 1892 ASSERT(pFormField != NULL); |
| 2053 | 1893 |
| 2054 pActionHandler->DoAction_FieldJavaScript(action, CPDF_AAction::KeySt
roke, | 1894 for (int i = 0, sz = pFormField->CountControls(); i < sz; i++) { |
| 2055 m_pDocument, pFormField, fa); | 1895 CPDF_FormControl* pFormCtrl = pFormField->GetControl(i); |
| 2056 bRC = fa.bRC; | 1896 ASSERT(pFormCtrl != NULL); |
| 1897 |
| 1898 if (CPDFSDK_Widget* pWidget = GetWidget(pFormCtrl)) { |
| 1899 CPDFDoc_Environment* pEnv = m_pDocument->GetEnv(); |
| 1900 CFFL_IFormFiller* pIFormFiller = pEnv->GetIFormFiller(); |
| 1901 |
| 1902 CPDF_Page* pPage = pWidget->GetPDFPage(); |
| 1903 CPDFSDK_PageView* pPageView = m_pDocument->GetPageView(pPage, FALSE); |
| 1904 |
| 1905 FX_RECT rcBBox = pIFormFiller->GetViewBBox(pPageView, pWidget); |
| 1906 |
| 1907 pEnv->FFI_Invalidate(pPage, rcBBox.left, rcBBox.top, rcBBox.right, |
| 1908 rcBBox.bottom); |
| 1909 } |
| 1910 } |
| 1911 } |
| 1912 |
| 1913 void CPDFSDK_InterForm::OnKeyStrokeCommit(CPDF_FormField* pFormField, |
| 1914 CFX_WideString& csValue, |
| 1915 FX_BOOL& bRC) { |
| 1916 ASSERT(pFormField != NULL); |
| 1917 |
| 1918 CPDF_AAction aAction = pFormField->GetAdditionalAction(); |
| 1919 if (aAction != NULL && aAction.ActionExist(CPDF_AAction::KeyStroke)) { |
| 1920 CPDF_Action action = aAction.GetAction(CPDF_AAction::KeyStroke); |
| 1921 if (action) { |
| 1922 ASSERT(m_pDocument != NULL); |
| 1923 CPDFDoc_Environment* pEnv = m_pDocument->GetEnv(); |
| 1924 ASSERT(pEnv != NULL); |
| 1925 |
| 1926 CPDFSDK_ActionHandler* pActionHandler = pEnv->GetActionHander(); |
| 1927 ASSERT(pActionHandler != NULL); |
| 1928 |
| 1929 PDFSDK_FieldAction fa; |
| 1930 fa.bModifier = pEnv->FFI_IsCTRLKeyDown(0); |
| 1931 fa.bShift = pEnv->FFI_IsSHIFTKeyDown(0); |
| 1932 fa.sValue = csValue; |
| 1933 |
| 1934 pActionHandler->DoAction_FieldJavaScript(action, CPDF_AAction::KeyStroke, |
| 1935 m_pDocument, pFormField, fa); |
| 1936 bRC = fa.bRC; |
| 1937 } |
| 1938 } |
| 1939 } |
| 1940 |
| 1941 void CPDFSDK_InterForm::OnValidate(CPDF_FormField* pFormField, |
| 1942 CFX_WideString& csValue, |
| 1943 FX_BOOL& bRC) { |
| 1944 ASSERT(pFormField != NULL); |
| 1945 |
| 1946 CPDF_AAction aAction = pFormField->GetAdditionalAction(); |
| 1947 if (aAction != NULL && aAction.ActionExist(CPDF_AAction::Validate)) { |
| 1948 CPDF_Action action = aAction.GetAction(CPDF_AAction::Validate); |
| 1949 if (action) { |
| 1950 ASSERT(m_pDocument != NULL); |
| 1951 CPDFDoc_Environment* pEnv = m_pDocument->GetEnv(); |
| 1952 ASSERT(pEnv != NULL); |
| 1953 |
| 1954 CPDFSDK_ActionHandler* pActionHandler = pEnv->GetActionHander(); |
| 1955 ASSERT(pActionHandler != NULL); |
| 1956 |
| 1957 PDFSDK_FieldAction fa; |
| 1958 fa.bModifier = pEnv->FFI_IsCTRLKeyDown(0); |
| 1959 fa.bShift = pEnv->FFI_IsSHIFTKeyDown(0); |
| 1960 fa.sValue = csValue; |
| 1961 |
| 1962 pActionHandler->DoAction_FieldJavaScript(action, CPDF_AAction::Validate, |
| 1963 m_pDocument, pFormField, fa); |
| 1964 bRC = fa.bRC; |
| 1965 } |
| 1966 } |
| 1967 } |
| 1968 |
| 1969 /* ----------------------------- action ----------------------------- */ |
| 1970 |
| 1971 FX_BOOL CPDFSDK_InterForm::DoAction_Hide(const CPDF_Action& action) { |
| 1972 ASSERT(action); |
| 1973 |
| 1974 CPDF_ActionFields af = action.GetWidgets(); |
| 1975 CFX_PtrArray fieldObjects; |
| 1976 af.GetAllFields(fieldObjects); |
| 1977 CFX_PtrArray widgetArray; |
| 1978 CFX_PtrArray fields; |
| 1979 GetFieldFromObjects(fieldObjects, fields); |
| 1980 |
| 1981 FX_BOOL bHide = action.GetHideStatus(); |
| 1982 |
| 1983 FX_BOOL bChanged = FALSE; |
| 1984 |
| 1985 for (int i = 0, sz = fields.GetSize(); i < sz; i++) { |
| 1986 CPDF_FormField* pField = (CPDF_FormField*)fields[i]; |
| 1987 ASSERT(pField != NULL); |
| 1988 |
| 1989 for (int j = 0, jsz = pField->CountControls(); j < jsz; j++) { |
| 1990 CPDF_FormControl* pControl = pField->GetControl(j); |
| 1991 ASSERT(pControl != NULL); |
| 1992 |
| 1993 if (CPDFSDK_Widget* pWidget = GetWidget(pControl)) { |
| 1994 int nFlags = pWidget->GetFlags(); |
| 1995 if (bHide) { |
| 1996 nFlags &= (~ANNOTFLAG_INVISIBLE); |
| 1997 nFlags &= (~ANNOTFLAG_NOVIEW); |
| 1998 nFlags |= (ANNOTFLAG_HIDDEN); |
| 1999 } else { |
| 2000 nFlags &= (~ANNOTFLAG_INVISIBLE); |
| 2001 nFlags &= (~ANNOTFLAG_HIDDEN); |
| 2002 nFlags &= (~ANNOTFLAG_NOVIEW); |
| 2057 } | 2003 } |
| 2058 } | 2004 pWidget->SetFlags(nFlags); |
| 2059 } | 2005 |
| 2060 | 2006 CPDFSDK_PageView* pPageView = pWidget->GetPageView(); |
| 2061 void CPDFSDK_InterForm::OnValidate(CPDF_FormField* pFormField, CFX_WideString& c
sValue, FX_BOOL& bRC) | 2007 ASSERT(pPageView != NULL); |
| 2062 { | 2008 |
| 2063 ASSERT(pFormField != NULL); | 2009 pPageView->UpdateView(pWidget); |
| 2064 | 2010 |
| 2065 CPDF_AAction aAction = pFormField->GetAdditionalAction(); | 2011 bChanged = TRUE; |
| 2066 if (aAction != NULL && aAction.ActionExist(CPDF_AAction::Validate)) | 2012 } |
| 2067 { | 2013 } |
| 2068 CPDF_Action action = aAction.GetAction(CPDF_AAction::Validate); | 2014 } |
| 2069 if (action) | 2015 |
| 2070 { | 2016 return bChanged; |
| 2071 ASSERT(m_pDocument != NULL); | 2017 } |
| 2072 CPDFDoc_Environment* pEnv = m_pDocument->GetEnv(); | 2018 |
| 2073 ASSERT(pEnv != NULL); | 2019 FX_BOOL CPDFSDK_InterForm::DoAction_SubmitForm(const CPDF_Action& action) { |
| 2074 | 2020 ASSERT(m_pInterForm != NULL); |
| 2075 CPDFSDK_ActionHandler* pActionHandler = pEnv->GetActionHander(); | 2021 CFX_WideString sDestination = action.GetFilePath(); |
| 2076 ASSERT(pActionHandler != NULL); | 2022 if (sDestination.IsEmpty()) |
| 2077 | 2023 return FALSE; |
| 2078 PDFSDK_FieldAction fa; | 2024 |
| 2079 fa.bModifier = pEnv->FFI_IsCTRLKeyDown(0); | 2025 CPDF_Dictionary* pActionDict = action.GetDict(); |
| 2080 fa.bShift = pEnv->FFI_IsSHIFTKeyDown(0); | 2026 if (pActionDict->KeyExist("Fields")) { |
| 2081 fa.sValue = csValue; | |
| 2082 | |
| 2083 pActionHandler->DoAction_FieldJavaScript(action, CPDF_AAction::Valid
ate, m_pDocument, pFormField, fa); | |
| 2084 bRC = fa.bRC; | |
| 2085 | |
| 2086 } | |
| 2087 } | |
| 2088 } | |
| 2089 | |
| 2090 /* ----------------------------- action ----------------------------- */ | |
| 2091 | |
| 2092 FX_BOOL CPDFSDK_InterForm::DoAction_Hide(const CPDF_Action& action) | |
| 2093 { | |
| 2094 ASSERT(action); | |
| 2095 | |
| 2096 CPDF_ActionFields af = action.GetWidgets(); | 2027 CPDF_ActionFields af = action.GetWidgets(); |
| 2028 FX_DWORD dwFlags = action.GetFlags(); |
| 2097 CFX_PtrArray fieldObjects; | 2029 CFX_PtrArray fieldObjects; |
| 2098 af.GetAllFields(fieldObjects); | 2030 af.GetAllFields(fieldObjects); |
| 2099 CFX_PtrArray widgetArray; | 2031 |
| 2100 CFX_PtrArray fields; | 2032 CFX_PtrArray fields; |
| 2101 GetFieldFromObjects(fieldObjects, fields); | 2033 GetFieldFromObjects(fieldObjects, fields); |
| 2102 | 2034 if (fields.GetSize() != 0) { |
| 2103 FX_BOOL bHide = action.GetHideStatus(); | 2035 FX_BOOL bIncludeOrExclude = !(dwFlags & 0x01); |
| 2104 | 2036 if (m_pInterForm->CheckRequiredFields(&fields, bIncludeOrExclude)) |
| 2105 FX_BOOL bChanged = FALSE; | 2037 return FALSE; |
| 2106 | 2038 |
| 2107 for (int i=0, sz=fields.GetSize(); i<sz; i++) | 2039 return SubmitFields(sDestination, fields, bIncludeOrExclude, FALSE); |
| 2108 { | 2040 } |
| 2109 CPDF_FormField* pField = (CPDF_FormField*)fields[i]; | 2041 } |
| 2110 ASSERT(pField != NULL); | 2042 if (m_pInterForm->CheckRequiredFields()) |
| 2111 | 2043 return FALSE; |
| 2112 | 2044 |
| 2113 for (int j=0,jsz=pField->CountControls(); j<jsz; j++) | 2045 return SubmitForm(sDestination, FALSE); |
| 2114 { | 2046 } |
| 2115 CPDF_FormControl* pControl = pField->GetControl(j); | 2047 |
| 2116 ASSERT(pControl != NULL); | 2048 FX_BOOL CPDFSDK_InterForm::SubmitFields(const CFX_WideString& csDestination, |
| 2117 | 2049 const CFX_PtrArray& fields, |
| 2118 if (CPDFSDK_Widget* pWidget = GetWidget(pControl)) | 2050 FX_BOOL bIncludeOrExclude, |
| 2119 { | 2051 FX_BOOL bUrlEncoded) { |
| 2120 int nFlags = pWidget->GetFlags(); | 2052 CPDFDoc_Environment* pEnv = m_pDocument->GetEnv(); |
| 2121 if (bHide) | 2053 ASSERT(pEnv != NULL); |
| 2122 { | 2054 |
| 2123 nFlags &= (~ANNOTFLAG_INVISIBLE); | 2055 CFX_ByteTextBuf textBuf; |
| 2124 nFlags &= (~ANNOTFLAG_NOVIEW); | 2056 ExportFieldsToFDFTextBuf(fields, bIncludeOrExclude, textBuf); |
| 2125 nFlags |= (ANNOTFLAG_HIDDEN); | 2057 |
| 2126 } | 2058 uint8_t* pBuffer = textBuf.GetBuffer(); |
| 2127 else | 2059 FX_STRSIZE nBufSize = textBuf.GetLength(); |
| 2128 { | 2060 |
| 2129 nFlags &= (~ANNOTFLAG_INVISIBLE); | 2061 if (bUrlEncoded) { |
| 2130 nFlags &= (~ANNOTFLAG_HIDDEN); | 2062 if (!FDFToURLEncodedData(pBuffer, nBufSize)) |
| 2131 nFlags &= (~ANNOTFLAG_NOVIEW); | 2063 return FALSE; |
| 2132 } | 2064 } |
| 2133 pWidget->SetFlags(nFlags); | 2065 |
| 2134 | 2066 pEnv->JS_docSubmitForm(pBuffer, nBufSize, csDestination.c_str()); |
| 2135 CPDFSDK_PageView* pPageView = pWidget->GetPageView(); | 2067 |
| 2136 ASSERT(pPageView != NULL); | 2068 return TRUE; |
| 2137 | 2069 } |
| 2138 pPageView->UpdateView(pWidget); | 2070 |
| 2139 | 2071 void CPDFSDK_InterForm::DoFDFBuffer(CFX_ByteString sBuffer) { |
| 2140 bChanged = TRUE; | 2072 ASSERT(m_pDocument != NULL); |
| 2141 } | 2073 |
| 2074 if (CFDF_Document* pFDFDocument = CFDF_Document::ParseMemory( |
| 2075 (const unsigned char*)sBuffer.GetBuffer(sBuffer.GetLength()), |
| 2076 sBuffer.GetLength())) { |
| 2077 CPDF_Dictionary* pRootDic = pFDFDocument->GetRoot(); |
| 2078 if (pRootDic) { |
| 2079 CPDF_Dictionary* pFDFDict = pRootDic->GetDict("FDF"); |
| 2080 if (pFDFDict) { |
| 2081 CPDF_Dictionary* pJSDict = pFDFDict->GetDict("JavaScript"); |
| 2082 if (pJSDict) { |
| 2083 CFX_WideString csJS; |
| 2084 |
| 2085 CPDF_Object* pJS = pJSDict->GetElementValue("Before"); |
| 2086 if (pJS != NULL) { |
| 2087 int iType = pJS->GetType(); |
| 2088 if (iType == PDFOBJ_STRING) |
| 2089 csJS = pJSDict->GetUnicodeText("Before"); |
| 2090 else if (iType == PDFOBJ_STREAM) |
| 2091 csJS = pJS->GetUnicodeText(); |
| 2092 } |
| 2142 } | 2093 } |
| 2143 } | 2094 } |
| 2144 | 2095 } |
| 2145 return bChanged; | 2096 delete pFDFDocument; |
| 2146 } | 2097 } |
| 2147 | 2098 |
| 2148 FX_BOOL CPDFSDK_InterForm::DoAction_SubmitForm(const CPDF_Action& action) | 2099 sBuffer.ReleaseBuffer(); |
| 2149 { | 2100 } |
| 2150 ASSERT(m_pInterForm != NULL); | 2101 |
| 2151 CFX_WideString sDestination = action.GetFilePath(); | 2102 FX_BOOL CPDFSDK_InterForm::FDFToURLEncodedData(CFX_WideString csFDFFile, |
| 2152 if (sDestination.IsEmpty()) | 2103 CFX_WideString csTxtFile) { |
| 2153 return FALSE; | 2104 return TRUE; |
| 2154 | 2105 } |
| 2155 CPDF_Dictionary* pActionDict = action.GetDict(); | 2106 |
| 2156 if (pActionDict->KeyExist("Fields")) | 2107 FX_BOOL CPDFSDK_InterForm::FDFToURLEncodedData(uint8_t*& pBuf, |
| 2157 { | 2108 FX_STRSIZE& nBufSize) { |
| 2158 CPDF_ActionFields af = action.GetWidgets(); | 2109 CFDF_Document* pFDF = CFDF_Document::ParseMemory(pBuf, nBufSize); |
| 2159 FX_DWORD dwFlags = action.GetFlags(); | 2110 if (pFDF) { |
| 2160 CFX_PtrArray fieldObjects; | 2111 CPDF_Dictionary* pMainDict = pFDF->GetRoot()->GetDict("FDF"); |
| 2161 af.GetAllFields(fieldObjects); | 2112 if (pMainDict == NULL) |
| 2162 | 2113 return FALSE; |
| 2163 CFX_PtrArray fields; | 2114 |
| 2164 GetFieldFromObjects(fieldObjects, fields); | 2115 // Get fields |
| 2165 if (fields.GetSize() != 0) | 2116 CPDF_Array* pFields = pMainDict->GetArray("Fields"); |
| 2166 { | 2117 if (pFields == NULL) |
| 2167 FX_BOOL bIncludeOrExclude = !(dwFlags & 0x01); | 2118 return FALSE; |
| 2168 if (m_pInterForm->CheckRequiredFields(&fields, bIncludeOrExclude)) | 2119 |
| 2169 return FALSE; | 2120 CFX_ByteTextBuf fdfEncodedData; |
| 2170 | 2121 |
| 2171 return SubmitFields(sDestination, fields, bIncludeOrExclude, FALSE); | 2122 for (FX_DWORD i = 0; i < pFields->GetCount(); i++) { |
| 2172 } | 2123 CPDF_Dictionary* pField = pFields->GetDict(i); |
| 2173 } | 2124 if (pField == NULL) |
| 2174 if (m_pInterForm->CheckRequiredFields()) | 2125 continue; |
| 2175 return FALSE; | 2126 CFX_WideString name; |
| 2176 | 2127 name = pField->GetUnicodeText("T"); |
| 2177 return SubmitForm(sDestination, FALSE); | 2128 CFX_ByteString name_b = CFX_ByteString::FromUnicode(name); |
| 2178 } | 2129 CFX_ByteString csBValue = pField->GetString("V"); |
| 2179 | 2130 CFX_WideString csWValue = PDF_DecodeText(csBValue); |
| 2180 FX_BOOL CPDFSDK_InterForm::SubmitFields(const CFX_WideString& csDestination, con
st CFX_PtrArray& fields, | 2131 CFX_ByteString csValue_b = CFX_ByteString::FromUnicode(csWValue); |
| 2181 FX_BOOL bIncludeOrExclude, FX_BOOL bUrlEncod
ed) | 2132 |
| 2182 { | 2133 fdfEncodedData = fdfEncodedData << name_b.GetBuffer(name_b.GetLength()); |
| 2183 CPDFDoc_Environment* pEnv = m_pDocument->GetEnv(); | 2134 name_b.ReleaseBuffer(); |
| 2184 ASSERT(pEnv != NULL); | 2135 fdfEncodedData = fdfEncodedData << "="; |
| 2185 | 2136 fdfEncodedData = fdfEncodedData |
| 2186 CFX_ByteTextBuf textBuf; | 2137 << csValue_b.GetBuffer(csValue_b.GetLength()); |
| 2187 ExportFieldsToFDFTextBuf(fields, bIncludeOrExclude, textBuf); | 2138 csValue_b.ReleaseBuffer(); |
| 2188 | 2139 if (i != pFields->GetCount() - 1) |
| 2189 uint8_t* pBuffer = textBuf.GetBuffer(); | 2140 fdfEncodedData = fdfEncodedData << "&"; |
| 2190 FX_STRSIZE nBufSize = textBuf.GetLength(); | 2141 } |
| 2191 | 2142 |
| 2192 if (bUrlEncoded) | 2143 nBufSize = fdfEncodedData.GetLength(); |
| 2193 { | 2144 pBuf = FX_Alloc(uint8_t, nBufSize); |
| 2194 if(!FDFToURLEncodedData(pBuffer, nBufSize)) | 2145 FXSYS_memcpy(pBuf, fdfEncodedData.GetBuffer(), nBufSize); |
| 2195 return FALSE; | 2146 } |
| 2196 } | 2147 return TRUE; |
| 2197 | 2148 } |
| 2198 pEnv->JS_docSubmitForm(pBuffer, nBufSize, csDestination.c_str()); | 2149 |
| 2199 | 2150 FX_BOOL CPDFSDK_InterForm::ExportFieldsToFDFTextBuf(const CFX_PtrArray& fields, |
| 2200 return TRUE; | 2151 FX_BOOL bIncludeOrExclude, |
| 2201 } | 2152 CFX_ByteTextBuf& textBuf) { |
| 2202 | 2153 ASSERT(m_pDocument != NULL); |
| 2203 void CPDFSDK_InterForm::DoFDFBuffer(CFX_ByteString sBuffer) | 2154 ASSERT(m_pInterForm != NULL); |
| 2204 { | 2155 |
| 2205 ASSERT(m_pDocument != NULL); | 2156 CFDF_Document* pFDF = m_pInterForm->ExportToFDF( |
| 2206 | 2157 m_pDocument->GetPath(), (CFX_PtrArray&)fields, bIncludeOrExclude); |
| 2207 if (CFDF_Document *pFDFDocument = CFDF_Document::ParseMemory((const unsigned
char *)sBuffer.GetBuffer(sBuffer.GetLength()), sBuffer.GetLength())) | 2158 if (!pFDF) |
| 2208 { | |
| 2209 CPDF_Dictionary* pRootDic = pFDFDocument->GetRoot(); | |
| 2210 if(pRootDic) | |
| 2211 { | |
| 2212 CPDF_Dictionary * pFDFDict=pRootDic->GetDict("FDF"); | |
| 2213 if(pFDFDict) | |
| 2214 { | |
| 2215 CPDF_Dictionary * pJSDict = pFDFDict->GetDict("JavaScript"); | |
| 2216 if(pJSDict) | |
| 2217 { | |
| 2218 CFX_WideString csJS; | |
| 2219 | |
| 2220 CPDF_Object* pJS = pJSDict->GetElementValue("Before"); | |
| 2221 if (pJS != NULL) | |
| 2222 { | |
| 2223 int iType = pJS->GetType(); | |
| 2224 if (iType == PDFOBJ_STRING) | |
| 2225 csJS = pJSDict->GetUnicodeText("Before"); | |
| 2226 else if (iType == PDFOBJ_STREAM) | |
| 2227 csJS = pJS->GetUnicodeText(); | |
| 2228 } | |
| 2229 | |
| 2230 } | |
| 2231 } | |
| 2232 } | |
| 2233 delete pFDFDocument; | |
| 2234 } | |
| 2235 | |
| 2236 sBuffer.ReleaseBuffer(); | |
| 2237 } | |
| 2238 | |
| 2239 FX_BOOL CPDFSDK_InterForm::FDFToURLEncodedData(CFX_WideString csFDFFile, CFX_Wid
eString csTxtFile) | |
| 2240 { | |
| 2241 return TRUE; | |
| 2242 } | |
| 2243 | |
| 2244 FX_BOOL CPDFSDK_InterForm::FDFToURLEncodedData(uint8_t*& pBuf, FX_STRSIZE& nBufS
ize) | |
| 2245 { | |
| 2246 CFDF_Document* pFDF = CFDF_Document::ParseMemory(pBuf, nBufSize); | |
| 2247 if (pFDF) | |
| 2248 { | |
| 2249 CPDF_Dictionary* pMainDict = pFDF->GetRoot()->GetDict("FDF"); | |
| 2250 if (pMainDict == NULL) return FALSE; | |
| 2251 | |
| 2252 // Get fields | |
| 2253 CPDF_Array* pFields = pMainDict->GetArray("Fields"); | |
| 2254 if (pFields == NULL) return FALSE; | |
| 2255 | |
| 2256 CFX_ByteTextBuf fdfEncodedData; | |
| 2257 | |
| 2258 for (FX_DWORD i = 0; i < pFields->GetCount(); i ++) | |
| 2259 { | |
| 2260 CPDF_Dictionary* pField = pFields->GetDict(i); | |
| 2261 if (pField == NULL) continue; | |
| 2262 CFX_WideString name; | |
| 2263 name = pField->GetUnicodeText("T"); | |
| 2264 CFX_ByteString name_b = CFX_ByteString::FromUnicode(name); | |
| 2265 CFX_ByteString csBValue = pField->GetString("V"); | |
| 2266 CFX_WideString csWValue = PDF_DecodeText(csBValue); | |
| 2267 CFX_ByteString csValue_b = CFX_ByteString::FromUnicode(csWValue); | |
| 2268 | |
| 2269 fdfEncodedData = fdfEncodedData<<name_b.GetBuffer(name_b.GetLength()
); | |
| 2270 name_b.ReleaseBuffer(); | |
| 2271 fdfEncodedData = fdfEncodedData<<"="; | |
| 2272 fdfEncodedData = fdfEncodedData<<csValue_b.GetBuffer(csValue_b.GetLe
ngth()); | |
| 2273 csValue_b.ReleaseBuffer(); | |
| 2274 if(i != pFields->GetCount()-1) | |
| 2275 fdfEncodedData = fdfEncodedData<<"&"; | |
| 2276 } | |
| 2277 | |
| 2278 nBufSize = fdfEncodedData.GetLength(); | |
| 2279 pBuf = FX_Alloc(uint8_t, nBufSize); | |
| 2280 FXSYS_memcpy(pBuf, fdfEncodedData.GetBuffer(), nBufSize); | |
| 2281 } | |
| 2282 return TRUE; | |
| 2283 } | |
| 2284 | |
| 2285 FX_BOOL CPDFSDK_InterForm::ExportFieldsToFDFTextBuf(const CFX_PtrArray& fields,F
X_BOOL bIncludeOrExclude, CFX_ByteTextBuf& textBuf) | |
| 2286 { | |
| 2287 ASSERT(m_pDocument != NULL); | |
| 2288 ASSERT(m_pInterForm != NULL); | |
| 2289 | |
| 2290 CFDF_Document* pFDF = m_pInterForm->ExportToFDF(m_pDocument->GetPath(),(CFX_
PtrArray&)fields, bIncludeOrExclude); | |
| 2291 if (!pFDF) return FALSE; | |
| 2292 FX_BOOL bRet = pFDF->WriteBuf(textBuf); // = FALSE;// | |
| 2293 delete pFDF; | |
| 2294 | |
| 2295 return bRet; | |
| 2296 } | |
| 2297 | |
| 2298 CFX_WideString CPDFSDK_InterForm::GetTemporaryFileName(const CFX_WideString& sFi
leExt) | |
| 2299 { | |
| 2300 CFX_WideString sFileName; | |
| 2301 return L""; | |
| 2302 } | |
| 2303 | |
| 2304 FX_BOOL CPDFSDK_InterForm::SubmitForm(const CFX_WideString& sDestination, FX_BOO
L bUrlEncoded) | |
| 2305 { | |
| 2306 if (sDestination.IsEmpty()) return FALSE; | |
| 2307 | |
| 2308 CPDFDoc_Environment* pEnv = m_pDocument->GetEnv(); | |
| 2309 ASSERT(pEnv != NULL); | |
| 2310 | |
| 2311 if(NULL == m_pDocument) return FALSE; | |
| 2312 CFX_WideString wsPDFFilePath = m_pDocument->GetPath(); | |
| 2313 | |
| 2314 if(NULL == m_pInterForm) return FALSE; | |
| 2315 CFDF_Document* pFDFDoc = m_pInterForm->ExportToFDF(wsPDFFilePath); | |
| 2316 if (NULL == pFDFDoc) return FALSE; | |
| 2317 | |
| 2318 CFX_ByteTextBuf FdfBuffer; | |
| 2319 FX_BOOL bRet = pFDFDoc->WriteBuf(FdfBuffer); | |
| 2320 delete pFDFDoc; | |
| 2321 if (!bRet) return FALSE; | |
| 2322 | |
| 2323 uint8_t* pBuffer = FdfBuffer.GetBuffer(); | |
| 2324 FX_STRSIZE nBufSize = FdfBuffer.GetLength(); | |
| 2325 | |
| 2326 if (bUrlEncoded) | |
| 2327 { | |
| 2328 if(!FDFToURLEncodedData(pBuffer, nBufSize)) | |
| 2329 return FALSE; | |
| 2330 } | |
| 2331 | |
| 2332 pEnv->JS_docSubmitForm(pBuffer, nBufSize, sDestination.c_str()); | |
| 2333 | |
| 2334 if (bUrlEncoded && pBuffer) | |
| 2335 { | |
| 2336 FX_Free(pBuffer); | |
| 2337 pBuffer = NULL; | |
| 2338 } | |
| 2339 | |
| 2340 return TRUE; | |
| 2341 } | |
| 2342 | |
| 2343 FX_BOOL CPDFSDK_InterForm::ExportFormToFDFTextBuf(CFX_ByteTextBuf& textBuf) | |
| 2344 { | |
| 2345 | |
| 2346 ASSERT(m_pInterForm != NULL); | |
| 2347 ASSERT(m_pDocument != NULL); | |
| 2348 | |
| 2349 CFDF_Document* pFDF = m_pInterForm->ExportToFDF(m_pDocument->GetPath()); | |
| 2350 if (!pFDF) return FALSE; | |
| 2351 | |
| 2352 FX_BOOL bRet = pFDF->WriteBuf(textBuf); | |
| 2353 delete pFDF; | |
| 2354 | |
| 2355 return bRet; | |
| 2356 } | |
| 2357 | |
| 2358 | |
| 2359 FX_BOOL CPDFSDK_InterForm::DoAction_ResetForm(const CPDF_Action& action) | |
| 2360 { | |
| 2361 ASSERT(action); | |
| 2362 | |
| 2363 CPDF_Dictionary* pActionDict = action.GetDict(); | |
| 2364 if (pActionDict->KeyExist("Fields")) | |
| 2365 { | |
| 2366 CPDF_ActionFields af = action.GetWidgets(); | |
| 2367 FX_DWORD dwFlags = action.GetFlags(); | |
| 2368 | |
| 2369 CFX_PtrArray fieldObjects; | |
| 2370 af.GetAllFields(fieldObjects); | |
| 2371 CFX_PtrArray fields; | |
| 2372 GetFieldFromObjects(fieldObjects, fields); | |
| 2373 return m_pInterForm->ResetForm(fields, !(dwFlags & 0x01), TRUE); | |
| 2374 } | |
| 2375 | |
| 2376 return m_pInterForm->ResetForm(TRUE); | |
| 2377 } | |
| 2378 | |
| 2379 FX_BOOL CPDFSDK_InterForm::DoAction_ImportData(const CPDF_Action& action) | |
| 2380 { | |
| 2381 return FALSE; | 2159 return FALSE; |
| 2382 } | 2160 FX_BOOL bRet = pFDF->WriteBuf(textBuf); // = FALSE;// |
| 2383 | 2161 delete pFDF; |
| 2384 void CPDFSDK_InterForm::GetFieldFromObjects(const CFX_PtrArray& objects, CFX_Ptr
Array& fields) | 2162 |
| 2385 { | 2163 return bRet; |
| 2386 ASSERT(m_pInterForm != NULL); | 2164 } |
| 2387 | 2165 |
| 2388 int iCount = objects.GetSize(); | 2166 CFX_WideString CPDFSDK_InterForm::GetTemporaryFileName( |
| 2389 for (int i = 0; i < iCount; i ++) | 2167 const CFX_WideString& sFileExt) { |
| 2390 { | 2168 CFX_WideString sFileName; |
| 2391 CPDF_Object* pObject = (CPDF_Object*)objects[i]; | 2169 return L""; |
| 2392 if (pObject == NULL) continue; | 2170 } |
| 2393 | 2171 |
| 2394 int iType = pObject->GetType(); | 2172 FX_BOOL CPDFSDK_InterForm::SubmitForm(const CFX_WideString& sDestination, |
| 2395 if (iType == PDFOBJ_STRING) | 2173 FX_BOOL bUrlEncoded) { |
| 2396 { | 2174 if (sDestination.IsEmpty()) |
| 2397 CFX_WideString csName = pObject->GetUnicodeText(); | 2175 return FALSE; |
| 2398 CPDF_FormField* pField = m_pInterForm->GetField(0, csName); | 2176 |
| 2399 if (pField != NULL) | 2177 CPDFDoc_Environment* pEnv = m_pDocument->GetEnv(); |
| 2400 fields.Add(pField); | 2178 ASSERT(pEnv != NULL); |
| 2401 } | 2179 |
| 2402 else if (iType == PDFOBJ_DICTIONARY) | 2180 if (NULL == m_pDocument) |
| 2403 { | 2181 return FALSE; |
| 2404 if (m_pInterForm->IsValidFormField(pObject)) | 2182 CFX_WideString wsPDFFilePath = m_pDocument->GetPath(); |
| 2405 fields.Add(pObject); | 2183 |
| 2406 } | 2184 if (NULL == m_pInterForm) |
| 2407 } | 2185 return FALSE; |
| 2408 } | 2186 CFDF_Document* pFDFDoc = m_pInterForm->ExportToFDF(wsPDFFilePath); |
| 2409 | 2187 if (NULL == pFDFDoc) |
| 2410 /* ----------------------------- CPDF_FormNotify ----------------------------- *
/ | 2188 return FALSE; |
| 2411 | 2189 |
| 2412 int CPDFSDK_InterForm::BeforeValueChange(const CPDF_FormField* pField, CFX_WideS
tring& csValue) | 2190 CFX_ByteTextBuf FdfBuffer; |
| 2413 { | 2191 FX_BOOL bRet = pFDFDoc->WriteBuf(FdfBuffer); |
| 2414 CPDF_FormField* pFormField = (CPDF_FormField*)pField; | 2192 delete pFDFDoc; |
| 2415 int nType = pFormField->GetFieldType(); | 2193 if (!bRet) |
| 2416 if (nType == FIELDTYPE_COMBOBOX || nType == FIELDTYPE_TEXTFIELD) | 2194 return FALSE; |
| 2417 { | 2195 |
| 2418 FX_BOOL bRC = TRUE; | 2196 uint8_t* pBuffer = FdfBuffer.GetBuffer(); |
| 2419 OnKeyStrokeCommit(pFormField, csValue, bRC); | 2197 FX_STRSIZE nBufSize = FdfBuffer.GetLength(); |
| 2420 if (bRC) | 2198 |
| 2421 { | 2199 if (bUrlEncoded) { |
| 2422 OnValidate(pFormField, csValue, bRC); | 2200 if (!FDFToURLEncodedData(pBuffer, nBufSize)) |
| 2423 return bRC ? 1 : -1; | 2201 return FALSE; |
| 2424 } | 2202 } |
| 2425 return -1; | 2203 |
| 2426 } | 2204 pEnv->JS_docSubmitForm(pBuffer, nBufSize, sDestination.c_str()); |
| 2427 return 0; | 2205 |
| 2428 } | 2206 if (bUrlEncoded && pBuffer) { |
| 2429 | 2207 FX_Free(pBuffer); |
| 2430 int CPDFSDK_InterForm::AfterValueChange(const CPDF_FormField* pField) | 2208 pBuffer = NULL; |
| 2431 { | 2209 } |
| 2432 CPDF_FormField* pFormField = (CPDF_FormField*)pField; | 2210 |
| 2433 int nType = pFormField->GetFieldType(); | 2211 return TRUE; |
| 2434 if (nType == FIELDTYPE_COMBOBOX || nType == FIELDTYPE_TEXTFIELD) | 2212 } |
| 2435 { | 2213 |
| 2436 OnCalculate(pFormField); | 2214 FX_BOOL CPDFSDK_InterForm::ExportFormToFDFTextBuf(CFX_ByteTextBuf& textBuf) { |
| 2437 FX_BOOL bFormated = FALSE; | 2215 ASSERT(m_pInterForm != NULL); |
| 2438 CFX_WideString sValue = OnFormat(pFormField, bFormated); | 2216 ASSERT(m_pDocument != NULL); |
| 2439 if (bFormated) | 2217 |
| 2440 ResetFieldAppearance(pFormField, sValue.c_str(), TRUE); | 2218 CFDF_Document* pFDF = m_pInterForm->ExportToFDF(m_pDocument->GetPath()); |
| 2441 else | 2219 if (!pFDF) |
| 2442 ResetFieldAppearance(pFormField, NULL, TRUE); | 2220 return FALSE; |
| 2443 UpdateField(pFormField); | 2221 |
| 2444 } | 2222 FX_BOOL bRet = pFDF->WriteBuf(textBuf); |
| 2445 return 0; | 2223 delete pFDF; |
| 2446 } | 2224 |
| 2447 | 2225 return bRet; |
| 2448 int CPDFSDK_InterForm::BeforeSelectionChange(const CPDF_FormField* pField, CFX_W
ideString& csValue) | 2226 } |
| 2449 { | 2227 |
| 2450 CPDF_FormField* pFormField = (CPDF_FormField*)pField; | 2228 FX_BOOL CPDFSDK_InterForm::DoAction_ResetForm(const CPDF_Action& action) { |
| 2451 if (pFormField->GetFieldType() != FIELDTYPE_LISTBOX) | 2229 ASSERT(action); |
| 2452 return 0; | 2230 |
| 2453 | 2231 CPDF_Dictionary* pActionDict = action.GetDict(); |
| 2232 if (pActionDict->KeyExist("Fields")) { |
| 2233 CPDF_ActionFields af = action.GetWidgets(); |
| 2234 FX_DWORD dwFlags = action.GetFlags(); |
| 2235 |
| 2236 CFX_PtrArray fieldObjects; |
| 2237 af.GetAllFields(fieldObjects); |
| 2238 CFX_PtrArray fields; |
| 2239 GetFieldFromObjects(fieldObjects, fields); |
| 2240 return m_pInterForm->ResetForm(fields, !(dwFlags & 0x01), TRUE); |
| 2241 } |
| 2242 |
| 2243 return m_pInterForm->ResetForm(TRUE); |
| 2244 } |
| 2245 |
| 2246 FX_BOOL CPDFSDK_InterForm::DoAction_ImportData(const CPDF_Action& action) { |
| 2247 return FALSE; |
| 2248 } |
| 2249 |
| 2250 void CPDFSDK_InterForm::GetFieldFromObjects(const CFX_PtrArray& objects, |
| 2251 CFX_PtrArray& fields) { |
| 2252 ASSERT(m_pInterForm != NULL); |
| 2253 |
| 2254 int iCount = objects.GetSize(); |
| 2255 for (int i = 0; i < iCount; i++) { |
| 2256 CPDF_Object* pObject = (CPDF_Object*)objects[i]; |
| 2257 if (pObject == NULL) |
| 2258 continue; |
| 2259 |
| 2260 int iType = pObject->GetType(); |
| 2261 if (iType == PDFOBJ_STRING) { |
| 2262 CFX_WideString csName = pObject->GetUnicodeText(); |
| 2263 CPDF_FormField* pField = m_pInterForm->GetField(0, csName); |
| 2264 if (pField != NULL) |
| 2265 fields.Add(pField); |
| 2266 } else if (iType == PDFOBJ_DICTIONARY) { |
| 2267 if (m_pInterForm->IsValidFormField(pObject)) |
| 2268 fields.Add(pObject); |
| 2269 } |
| 2270 } |
| 2271 } |
| 2272 |
| 2273 /* ----------------------------- CPDF_FormNotify ----------------------------- |
| 2274 */ |
| 2275 |
| 2276 int CPDFSDK_InterForm::BeforeValueChange(const CPDF_FormField* pField, |
| 2277 CFX_WideString& csValue) { |
| 2278 CPDF_FormField* pFormField = (CPDF_FormField*)pField; |
| 2279 int nType = pFormField->GetFieldType(); |
| 2280 if (nType == FIELDTYPE_COMBOBOX || nType == FIELDTYPE_TEXTFIELD) { |
| 2454 FX_BOOL bRC = TRUE; | 2281 FX_BOOL bRC = TRUE; |
| 2455 OnKeyStrokeCommit(pFormField, csValue, bRC); | 2282 OnKeyStrokeCommit(pFormField, csValue, bRC); |
| 2456 if (!bRC) | 2283 if (bRC) { |
| 2457 return -1; | 2284 OnValidate(pFormField, csValue, bRC); |
| 2458 | 2285 return bRC ? 1 : -1; |
| 2459 OnValidate(pFormField, csValue, bRC); | 2286 } |
| 2460 if (!bRC) | 2287 return -1; |
| 2461 return -1; | 2288 } |
| 2462 | 2289 return 0; |
| 2290 } |
| 2291 |
| 2292 int CPDFSDK_InterForm::AfterValueChange(const CPDF_FormField* pField) { |
| 2293 CPDF_FormField* pFormField = (CPDF_FormField*)pField; |
| 2294 int nType = pFormField->GetFieldType(); |
| 2295 if (nType == FIELDTYPE_COMBOBOX || nType == FIELDTYPE_TEXTFIELD) { |
| 2296 OnCalculate(pFormField); |
| 2297 FX_BOOL bFormated = FALSE; |
| 2298 CFX_WideString sValue = OnFormat(pFormField, bFormated); |
| 2299 if (bFormated) |
| 2300 ResetFieldAppearance(pFormField, sValue.c_str(), TRUE); |
| 2301 else |
| 2302 ResetFieldAppearance(pFormField, NULL, TRUE); |
| 2303 UpdateField(pFormField); |
| 2304 } |
| 2305 return 0; |
| 2306 } |
| 2307 |
| 2308 int CPDFSDK_InterForm::BeforeSelectionChange(const CPDF_FormField* pField, |
| 2309 CFX_WideString& csValue) { |
| 2310 CPDF_FormField* pFormField = (CPDF_FormField*)pField; |
| 2311 if (pFormField->GetFieldType() != FIELDTYPE_LISTBOX) |
| 2312 return 0; |
| 2313 |
| 2314 FX_BOOL bRC = TRUE; |
| 2315 OnKeyStrokeCommit(pFormField, csValue, bRC); |
| 2316 if (!bRC) |
| 2317 return -1; |
| 2318 |
| 2319 OnValidate(pFormField, csValue, bRC); |
| 2320 if (!bRC) |
| 2321 return -1; |
| 2322 |
| 2323 return 1; |
| 2324 } |
| 2325 |
| 2326 int CPDFSDK_InterForm::AfterSelectionChange(const CPDF_FormField* pField) { |
| 2327 CPDF_FormField* pFormField = (CPDF_FormField*)pField; |
| 2328 if (pFormField->GetFieldType() == FIELDTYPE_LISTBOX) { |
| 2329 OnCalculate(pFormField); |
| 2330 ResetFieldAppearance(pFormField, NULL, TRUE); |
| 2331 UpdateField(pFormField); |
| 2332 } |
| 2333 return 0; |
| 2334 } |
| 2335 |
| 2336 int CPDFSDK_InterForm::AfterCheckedStatusChange( |
| 2337 const CPDF_FormField* pField, |
| 2338 const CFX_ByteArray& statusArray) { |
| 2339 CPDF_FormField* pFormField = (CPDF_FormField*)pField; |
| 2340 int nType = pFormField->GetFieldType(); |
| 2341 if (nType == FIELDTYPE_CHECKBOX || nType == FIELDTYPE_RADIOBUTTON) { |
| 2342 OnCalculate(pFormField); |
| 2343 UpdateField(pFormField); |
| 2344 } |
| 2345 return 0; |
| 2346 } |
| 2347 |
| 2348 int CPDFSDK_InterForm::BeforeFormReset(const CPDF_InterForm* pForm) { |
| 2349 return 0; |
| 2350 } |
| 2351 |
| 2352 int CPDFSDK_InterForm::AfterFormReset(const CPDF_InterForm* pForm) { |
| 2353 OnCalculate(nullptr); |
| 2354 return 0; |
| 2355 } |
| 2356 |
| 2357 int CPDFSDK_InterForm::BeforeFormImportData(const CPDF_InterForm* pForm) { |
| 2358 return 0; |
| 2359 } |
| 2360 |
| 2361 int CPDFSDK_InterForm::AfterFormImportData(const CPDF_InterForm* pForm) { |
| 2362 OnCalculate(nullptr); |
| 2363 return 0; |
| 2364 } |
| 2365 |
| 2366 FX_BOOL CPDFSDK_InterForm::IsNeedHighLight(int nFieldType) { |
| 2367 if (nFieldType < 1 || nFieldType > 6) |
| 2368 return FALSE; |
| 2369 return m_bNeedHightlight[nFieldType - 1]; |
| 2370 } |
| 2371 |
| 2372 void CPDFSDK_InterForm::RemoveAllHighLight() { |
| 2373 memset((void*)m_bNeedHightlight, 0, 6 * sizeof(FX_BOOL)); |
| 2374 } |
| 2375 void CPDFSDK_InterForm::SetHighlightColor(FX_COLORREF clr, int nFieldType) { |
| 2376 if (nFieldType < 0 || nFieldType > 6) |
| 2377 return; |
| 2378 switch (nFieldType) { |
| 2379 case 0: { |
| 2380 for (int i = 0; i < 6; i++) { |
| 2381 m_aHighlightColor[i] = clr; |
| 2382 m_bNeedHightlight[i] = TRUE; |
| 2383 } |
| 2384 break; |
| 2385 } |
| 2386 default: { |
| 2387 m_aHighlightColor[nFieldType - 1] = clr; |
| 2388 m_bNeedHightlight[nFieldType - 1] = TRUE; |
| 2389 break; |
| 2390 } |
| 2391 } |
| 2392 } |
| 2393 |
| 2394 FX_COLORREF CPDFSDK_InterForm::GetHighlightColor(int nFieldType) { |
| 2395 if (nFieldType < 0 || nFieldType > 6) |
| 2396 return FXSYS_RGB(255, 255, 255); |
| 2397 if (nFieldType == 0) |
| 2398 return m_aHighlightColor[0]; |
| 2399 return m_aHighlightColor[nFieldType - 1]; |
| 2400 } |
| 2401 |
| 2402 /* ------------------------- CBA_AnnotIterator ------------------------- */ |
| 2403 |
| 2404 CBA_AnnotIterator::CBA_AnnotIterator(CPDFSDK_PageView* pPageView, |
| 2405 const CFX_ByteString& sType, |
| 2406 const CFX_ByteString& sSubType) |
| 2407 : m_pPageView(pPageView), |
| 2408 m_sType(sType), |
| 2409 m_sSubType(sSubType), |
| 2410 m_nTabs(BAI_STRUCTURE) { |
| 2411 ASSERT(m_pPageView != NULL); |
| 2412 |
| 2413 CPDF_Page* pPDFPage = m_pPageView->GetPDFPage(); |
| 2414 ASSERT(pPDFPage != NULL); |
| 2415 ASSERT(pPDFPage->m_pFormDict != NULL); |
| 2416 |
| 2417 CFX_ByteString sTabs = pPDFPage->m_pFormDict->GetString("Tabs"); |
| 2418 |
| 2419 if (sTabs == "R") { |
| 2420 m_nTabs = BAI_ROW; |
| 2421 } else if (sTabs == "C") { |
| 2422 m_nTabs = BAI_COLUMN; |
| 2423 } else { |
| 2424 m_nTabs = BAI_STRUCTURE; |
| 2425 } |
| 2426 |
| 2427 GenerateResults(); |
| 2428 } |
| 2429 |
| 2430 CBA_AnnotIterator::~CBA_AnnotIterator() { |
| 2431 m_Annots.RemoveAll(); |
| 2432 } |
| 2433 |
| 2434 CPDFSDK_Annot* CBA_AnnotIterator::GetFirstAnnot() { |
| 2435 if (m_Annots.GetSize() > 0) |
| 2436 return m_Annots[0]; |
| 2437 |
| 2438 return NULL; |
| 2439 } |
| 2440 |
| 2441 CPDFSDK_Annot* CBA_AnnotIterator::GetLastAnnot() { |
| 2442 if (m_Annots.GetSize() > 0) |
| 2443 return m_Annots[m_Annots.GetSize() - 1]; |
| 2444 |
| 2445 return NULL; |
| 2446 } |
| 2447 |
| 2448 CPDFSDK_Annot* CBA_AnnotIterator::GetNextAnnot(CPDFSDK_Annot* pAnnot) { |
| 2449 for (int i = 0, sz = m_Annots.GetSize(); i < sz; ++i) { |
| 2450 if (m_Annots[i] == pAnnot) |
| 2451 return (i + 1 < sz) ? m_Annots[i + 1] : m_Annots[0]; |
| 2452 } |
| 2453 return NULL; |
| 2454 } |
| 2455 |
| 2456 CPDFSDK_Annot* CBA_AnnotIterator::GetPrevAnnot(CPDFSDK_Annot* pAnnot) { |
| 2457 for (int i = 0, sz = m_Annots.GetSize(); i < sz; ++i) { |
| 2458 if (m_Annots[i] == pAnnot) |
| 2459 return (i - 1 >= 0) ? m_Annots[i - 1] : m_Annots[sz - 1]; |
| 2460 } |
| 2461 return NULL; |
| 2462 } |
| 2463 |
| 2464 int CBA_AnnotIterator::CompareByLeft(CPDFSDK_Annot* p1, CPDFSDK_Annot* p2) { |
| 2465 ASSERT(p1); |
| 2466 ASSERT(p2); |
| 2467 |
| 2468 CPDF_Rect rcAnnot1 = GetAnnotRect(p1); |
| 2469 CPDF_Rect rcAnnot2 = GetAnnotRect(p2); |
| 2470 |
| 2471 if (rcAnnot1.left < rcAnnot2.left) |
| 2472 return -1; |
| 2473 if (rcAnnot1.left > rcAnnot2.left) |
| 2463 return 1; | 2474 return 1; |
| 2464 } | 2475 return 0; |
| 2465 | 2476 } |
| 2466 int CPDFSDK_InterForm::AfterSelectionChange(const CPDF_FormField* pField) | 2477 |
| 2467 { | 2478 int CBA_AnnotIterator::CompareByTop(CPDFSDK_Annot* p1, CPDFSDK_Annot* p2) { |
| 2468 CPDF_FormField* pFormField = (CPDF_FormField*)pField; | 2479 ASSERT(p1 != NULL); |
| 2469 if (pFormField->GetFieldType() == FIELDTYPE_LISTBOX) | 2480 ASSERT(p2 != NULL); |
| 2470 { | 2481 |
| 2471 OnCalculate(pFormField); | 2482 CPDF_Rect rcAnnot1 = GetAnnotRect(p1); |
| 2472 ResetFieldAppearance(pFormField, NULL, TRUE); | 2483 CPDF_Rect rcAnnot2 = GetAnnotRect(p2); |
| 2473 UpdateField(pFormField); | 2484 |
| 2474 } | 2485 if (rcAnnot1.top < rcAnnot2.top) |
| 2475 return 0; | 2486 return -1; |
| 2476 } | 2487 if (rcAnnot1.top > rcAnnot2.top) |
| 2477 | 2488 return 1; |
| 2478 int CPDFSDK_InterForm::AfterCheckedStatusChange(const CPDF_FormField* pField, co
nst CFX_ByteArray& statusArray) | 2489 return 0; |
| 2479 { | 2490 } |
| 2480 CPDF_FormField* pFormField = (CPDF_FormField*)pField; | 2491 |
| 2481 int nType = pFormField->GetFieldType(); | 2492 void CBA_AnnotIterator::GenerateResults() { |
| 2482 if (nType == FIELDTYPE_CHECKBOX || nType == FIELDTYPE_RADIOBUTTON) | 2493 ASSERT(m_pPageView != NULL); |
| 2483 { | 2494 |
| 2484 OnCalculate(pFormField); | 2495 switch (m_nTabs) { |
| 2485 UpdateField(pFormField); | 2496 case BAI_STRUCTURE: { |
| 2486 } | 2497 for (int i = 0, sz = m_pPageView->CountAnnots(); i < sz; i++) { |
| 2487 return 0; | 2498 CPDFSDK_Annot* pAnnot = m_pPageView->GetAnnot(i); |
| 2488 } | 2499 ASSERT(pAnnot != NULL); |
| 2489 | 2500 |
| 2490 int CPDFSDK_InterForm::BeforeFormReset(const CPDF_InterForm* pForm) | 2501 if (pAnnot->GetType() == m_sType && pAnnot->GetSubType() == m_sSubType) |
| 2491 { | 2502 m_Annots.Add(pAnnot); |
| 2492 return 0; | 2503 } |
| 2493 } | 2504 } break; |
| 2494 | 2505 case BAI_ROW: { |
| 2495 int CPDFSDK_InterForm::AfterFormReset(const CPDF_InterForm* pForm) | 2506 CPDFSDK_SortAnnots sa; |
| 2496 { | 2507 |
| 2497 OnCalculate(nullptr); | 2508 { |
| 2498 return 0; | 2509 for (int i = 0, sz = m_pPageView->CountAnnots(); i < sz; i++) { |
| 2499 } | 2510 CPDFSDK_Annot* pAnnot = m_pPageView->GetAnnot(i); |
| 2500 | 2511 ASSERT(pAnnot != NULL); |
| 2501 int CPDFSDK_InterForm::BeforeFormImportData(const CPDF_InterForm* pForm) | 2512 |
| 2502 { | 2513 if (pAnnot->GetType() == m_sType && |
| 2503 return 0; | 2514 pAnnot->GetSubType() == m_sSubType) |
| 2504 } | 2515 sa.Add(pAnnot); |
| 2505 | 2516 } |
| 2506 int CPDFSDK_InterForm::AfterFormImportData(const CPDF_InterForm* pForm) | 2517 } |
| 2507 { | 2518 |
| 2508 OnCalculate(nullptr); | 2519 if (sa.GetSize() > 0) { |
| 2509 return 0; | 2520 sa.Sort(CBA_AnnotIterator::CompareByLeft); |
| 2510 } | 2521 } |
| 2511 | 2522 |
| 2512 FX_BOOL CPDFSDK_InterForm::IsNeedHighLight(int nFieldType) | 2523 while (sa.GetSize() > 0) { |
| 2513 { | 2524 int nLeftTopIndex = -1; |
| 2514 if(nFieldType <1 || nFieldType > 6) | 2525 |
| 2515 return FALSE; | |
| 2516 return m_bNeedHightlight[nFieldType-1]; | |
| 2517 } | |
| 2518 | |
| 2519 void CPDFSDK_InterForm::RemoveAllHighLight() | |
| 2520 { | |
| 2521 memset((void*)m_bNeedHightlight, 0, 6*sizeof(FX_BOOL)); | |
| 2522 } | |
| 2523 void CPDFSDK_InterForm::SetHighlightColor(FX_COLORREF clr, int nFieldType) | |
| 2524 { | |
| 2525 if(nFieldType <0 || nFieldType > 6) return; | |
| 2526 switch(nFieldType) | |
| 2527 { | |
| 2528 case 0: | |
| 2529 { | 2526 { |
| 2530 for(int i=0; i<6; i++) | 2527 FX_FLOAT fTop = 0.0f; |
| 2531 { | 2528 |
| 2532 m_aHighlightColor[i] = clr; | 2529 for (int i = sa.GetSize() - 1; i >= 0; i--) { |
| 2533 m_bNeedHightlight[i] = TRUE; | 2530 CPDFSDK_Annot* pAnnot = sa.GetAt(i); |
| 2531 ASSERT(pAnnot != NULL); |
| 2532 |
| 2533 CPDF_Rect rcAnnot = GetAnnotRect(pAnnot); |
| 2534 |
| 2535 if (rcAnnot.top > fTop) { |
| 2536 nLeftTopIndex = i; |
| 2537 fTop = rcAnnot.top; |
| 2534 } | 2538 } |
| 2535 break; | 2539 } |
| 2536 } | 2540 } |
| 2537 default: | 2541 |
| 2542 if (nLeftTopIndex >= 0) { |
| 2543 CPDFSDK_Annot* pLeftTopAnnot = sa.GetAt(nLeftTopIndex); |
| 2544 ASSERT(pLeftTopAnnot != NULL); |
| 2545 |
| 2546 CPDF_Rect rcLeftTop = GetAnnotRect(pLeftTopAnnot); |
| 2547 |
| 2548 m_Annots.Add(pLeftTopAnnot); |
| 2549 sa.RemoveAt(nLeftTopIndex); |
| 2550 |
| 2551 CFX_ArrayTemplate<int> aSelect; |
| 2552 |
| 2553 { |
| 2554 for (int i = 0, sz = sa.GetSize(); i < sz; i++) { |
| 2555 CPDFSDK_Annot* pAnnot = sa.GetAt(i); |
| 2556 ASSERT(pAnnot != NULL); |
| 2557 |
| 2558 CPDF_Rect rcAnnot = GetAnnotRect(pAnnot); |
| 2559 |
| 2560 FX_FLOAT fCenterY = (rcAnnot.top + rcAnnot.bottom) / 2.0f; |
| 2561 |
| 2562 if (fCenterY > rcLeftTop.bottom && fCenterY < rcLeftTop.top) |
| 2563 aSelect.Add(i); |
| 2564 } |
| 2565 } |
| 2566 |
| 2567 { |
| 2568 for (int i = 0, sz = aSelect.GetSize(); i < sz; i++) { |
| 2569 m_Annots.Add(sa[aSelect[i]]); |
| 2570 } |
| 2571 } |
| 2572 |
| 2573 { |
| 2574 for (int i = aSelect.GetSize() - 1; i >= 0; i--) { |
| 2575 sa.RemoveAt(aSelect[i]); |
| 2576 } |
| 2577 } |
| 2578 |
| 2579 aSelect.RemoveAll(); |
| 2580 } |
| 2581 } |
| 2582 sa.RemoveAll(); |
| 2583 } break; |
| 2584 case BAI_COLUMN: { |
| 2585 CPDFSDK_SortAnnots sa; |
| 2586 |
| 2587 { |
| 2588 for (int i = 0, sz = m_pPageView->CountAnnots(); i < sz; i++) { |
| 2589 CPDFSDK_Annot* pAnnot = m_pPageView->GetAnnot(i); |
| 2590 ASSERT(pAnnot != NULL); |
| 2591 |
| 2592 if (pAnnot->GetType() == m_sType && |
| 2593 pAnnot->GetSubType() == m_sSubType) |
| 2594 sa.Add(pAnnot); |
| 2595 } |
| 2596 } |
| 2597 |
| 2598 if (sa.GetSize() > 0) { |
| 2599 sa.Sort(CBA_AnnotIterator::CompareByTop, FALSE); |
| 2600 } |
| 2601 |
| 2602 while (sa.GetSize() > 0) { |
| 2603 int nLeftTopIndex = -1; |
| 2604 |
| 2538 { | 2605 { |
| 2539 m_aHighlightColor[nFieldType-1] = clr; | 2606 FX_FLOAT fLeft = -1.0f; |
| 2540 m_bNeedHightlight[nFieldType-1] = TRUE; | 2607 |
| 2541 break; | 2608 for (int i = sa.GetSize() - 1; i >= 0; i--) { |
| 2609 CPDFSDK_Annot* pAnnot = sa.GetAt(i); |
| 2610 ASSERT(pAnnot != NULL); |
| 2611 |
| 2612 CPDF_Rect rcAnnot = GetAnnotRect(pAnnot); |
| 2613 |
| 2614 if (fLeft < 0) { |
| 2615 nLeftTopIndex = 0; |
| 2616 fLeft = rcAnnot.left; |
| 2617 } else if (rcAnnot.left < fLeft) { |
| 2618 nLeftTopIndex = i; |
| 2619 fLeft = rcAnnot.left; |
| 2620 } |
| 2621 } |
| 2542 } | 2622 } |
| 2543 } | 2623 |
| 2544 | 2624 if (nLeftTopIndex >= 0) { |
| 2545 } | 2625 CPDFSDK_Annot* pLeftTopAnnot = sa.GetAt(nLeftTopIndex); |
| 2546 | 2626 ASSERT(pLeftTopAnnot != NULL); |
| 2547 FX_COLORREF CPDFSDK_InterForm::GetHighlightColor(int nFieldType) | 2627 |
| 2548 { | 2628 CPDF_Rect rcLeftTop = GetAnnotRect(pLeftTopAnnot); |
| 2549 if (nFieldType < 0 || nFieldType > 6) | 2629 |
| 2550 return FXSYS_RGB(255,255,255); | 2630 m_Annots.Add(pLeftTopAnnot); |
| 2551 if (nFieldType == 0) | 2631 sa.RemoveAt(nLeftTopIndex); |
| 2552 return m_aHighlightColor[0]; | 2632 |
| 2553 return m_aHighlightColor[nFieldType-1]; | 2633 CFX_ArrayTemplate<int> aSelect; |
| 2554 } | 2634 |
| 2555 | 2635 { |
| 2556 /* ------------------------- CBA_AnnotIterator ------------------------- */ | 2636 for (int i = 0, sz = sa.GetSize(); i < sz; i++) { |
| 2557 | 2637 CPDFSDK_Annot* pAnnot = sa.GetAt(i); |
| 2558 CBA_AnnotIterator::CBA_AnnotIterator(CPDFSDK_PageView* pPageView, const CFX_Byte
String& sType, const CFX_ByteString& sSubType) | 2638 ASSERT(pAnnot != NULL); |
| 2559 :m_pPageView(pPageView), | 2639 |
| 2560 m_sType(sType), | 2640 CPDF_Rect rcAnnot = GetAnnotRect(pAnnot); |
| 2561 m_sSubType(sSubType), | 2641 |
| 2562 m_nTabs(BAI_STRUCTURE) | 2642 FX_FLOAT fCenterX = (rcAnnot.left + rcAnnot.right) / 2.0f; |
| 2563 { | 2643 |
| 2564 ASSERT(m_pPageView != NULL); | 2644 if (fCenterX > rcLeftTop.left && fCenterX < rcLeftTop.right) |
| 2565 | 2645 aSelect.Add(i); |
| 2566 CPDF_Page* pPDFPage = m_pPageView->GetPDFPage(); | |
| 2567 ASSERT(pPDFPage != NULL); | |
| 2568 ASSERT(pPDFPage->m_pFormDict != NULL); | |
| 2569 | |
| 2570 CFX_ByteString sTabs = pPDFPage->m_pFormDict->GetString("Tabs"); | |
| 2571 | |
| 2572 if (sTabs == "R") | |
| 2573 { | |
| 2574 m_nTabs = BAI_ROW; | |
| 2575 } | |
| 2576 else if (sTabs == "C") | |
| 2577 { | |
| 2578 m_nTabs = BAI_COLUMN; | |
| 2579 } | |
| 2580 else | |
| 2581 { | |
| 2582 m_nTabs = BAI_STRUCTURE; | |
| 2583 } | |
| 2584 | |
| 2585 GenerateResults(); | |
| 2586 } | |
| 2587 | |
| 2588 CBA_AnnotIterator::~CBA_AnnotIterator() | |
| 2589 { | |
| 2590 m_Annots.RemoveAll(); | |
| 2591 } | |
| 2592 | |
| 2593 CPDFSDK_Annot* CBA_AnnotIterator::GetFirstAnnot() | |
| 2594 { | |
| 2595 if (m_Annots.GetSize() > 0) | |
| 2596 return m_Annots[0]; | |
| 2597 | |
| 2598 return NULL; | |
| 2599 } | |
| 2600 | |
| 2601 CPDFSDK_Annot* CBA_AnnotIterator::GetLastAnnot() | |
| 2602 { | |
| 2603 if (m_Annots.GetSize() > 0) | |
| 2604 return m_Annots[m_Annots.GetSize() - 1]; | |
| 2605 | |
| 2606 return NULL; | |
| 2607 } | |
| 2608 | |
| 2609 CPDFSDK_Annot* CBA_AnnotIterator::GetNextAnnot(CPDFSDK_Annot* pAnnot) | |
| 2610 { | |
| 2611 for (int i = 0, sz = m_Annots.GetSize(); i < sz; ++i) { | |
| 2612 if (m_Annots[i] == pAnnot) | |
| 2613 return (i + 1 < sz) ? m_Annots[i+1] : m_Annots[0]; | |
| 2614 } | |
| 2615 return NULL; | |
| 2616 } | |
| 2617 | |
| 2618 CPDFSDK_Annot* CBA_AnnotIterator::GetPrevAnnot(CPDFSDK_Annot* pAnnot) | |
| 2619 { | |
| 2620 for (int i = 0, sz = m_Annots.GetSize(); i < sz; ++i) { | |
| 2621 if (m_Annots[i] == pAnnot) | |
| 2622 return (i - 1 >= 0) ? m_Annots[i-1] : m_Annots[sz-1]; | |
| 2623 } | |
| 2624 return NULL; | |
| 2625 } | |
| 2626 | |
| 2627 int CBA_AnnotIterator::CompareByLeft(CPDFSDK_Annot* p1, CPDFSDK_Annot* p2) | |
| 2628 { | |
| 2629 ASSERT(p1); | |
| 2630 ASSERT(p2); | |
| 2631 | |
| 2632 CPDF_Rect rcAnnot1 = GetAnnotRect(p1); | |
| 2633 CPDF_Rect rcAnnot2 = GetAnnotRect(p2); | |
| 2634 | |
| 2635 if (rcAnnot1.left < rcAnnot2.left) | |
| 2636 return -1; | |
| 2637 if (rcAnnot1.left > rcAnnot2.left) | |
| 2638 return 1; | |
| 2639 return 0; | |
| 2640 } | |
| 2641 | |
| 2642 | |
| 2643 int CBA_AnnotIterator::CompareByTop(CPDFSDK_Annot* p1, CPDFSDK_Annot* p2) | |
| 2644 { | |
| 2645 ASSERT(p1 != NULL); | |
| 2646 ASSERT(p2 != NULL); | |
| 2647 | |
| 2648 CPDF_Rect rcAnnot1 = GetAnnotRect(p1); | |
| 2649 CPDF_Rect rcAnnot2 = GetAnnotRect(p2); | |
| 2650 | |
| 2651 if (rcAnnot1.top < rcAnnot2.top) | |
| 2652 return -1; | |
| 2653 if (rcAnnot1.top > rcAnnot2.top) | |
| 2654 return 1; | |
| 2655 return 0; | |
| 2656 } | |
| 2657 | |
| 2658 void CBA_AnnotIterator::GenerateResults() | |
| 2659 { | |
| 2660 ASSERT(m_pPageView != NULL); | |
| 2661 | |
| 2662 switch (m_nTabs) | |
| 2663 { | |
| 2664 case BAI_STRUCTURE: | |
| 2665 { | |
| 2666 for (int i=0,sz=m_pPageView->CountAnnots(); i<sz; i++) | |
| 2667 { | |
| 2668 CPDFSDK_Annot* pAnnot = m_pPageView->GetAnnot(i); | |
| 2669 ASSERT(pAnnot != NULL); | |
| 2670 | |
| 2671 if (pAnnot->GetType() == m_sType | |
| 2672 && pAnnot->GetSubType() == m_sSubType) | |
| 2673 m_Annots.Add(pAnnot); | |
| 2674 } | 2646 } |
| 2647 } |
| 2648 |
| 2649 { |
| 2650 for (int i = 0, sz = aSelect.GetSize(); i < sz; i++) { |
| 2651 m_Annots.Add(sa[aSelect[i]]); |
| 2652 } |
| 2653 } |
| 2654 |
| 2655 { |
| 2656 for (int i = aSelect.GetSize() - 1; i >= 0; i--) { |
| 2657 sa.RemoveAt(aSelect[i]); |
| 2658 } |
| 2659 } |
| 2660 |
| 2661 aSelect.RemoveAll(); |
| 2675 } | 2662 } |
| 2676 break; | 2663 } |
| 2677 case BAI_ROW: | 2664 sa.RemoveAll(); |
| 2678 { | 2665 } break; |
| 2679 CPDFSDK_SortAnnots sa; | 2666 } |
| 2680 | 2667 } |
| 2681 { | 2668 |
| 2682 | 2669 CPDF_Rect CBA_AnnotIterator::GetAnnotRect(CPDFSDK_Annot* pAnnot) { |
| 2683 for (int i=0,sz=m_pPageView->CountAnnots(); i<sz; i++) | 2670 ASSERT(pAnnot != NULL); |
| 2684 { | 2671 |
| 2685 CPDFSDK_Annot* pAnnot = m_pPageView->GetAnnot(i); | 2672 CPDF_Annot* pPDFAnnot = pAnnot->GetPDFAnnot(); |
| 2686 ASSERT(pAnnot != NULL); | 2673 ASSERT(pPDFAnnot != NULL); |
| 2687 | 2674 |
| 2688 if (pAnnot->GetType() == m_sType | 2675 CPDF_Rect rcAnnot; |
| 2689 && pAnnot->GetSubType() == m_sSubType) | 2676 pPDFAnnot->GetRect(rcAnnot); |
| 2690 sa.Add(pAnnot); | 2677 |
| 2691 } | 2678 return rcAnnot; |
| 2692 } | 2679 } |
| 2693 | |
| 2694 if (sa.GetSize() > 0) | |
| 2695 { | |
| 2696 sa.Sort(CBA_AnnotIterator::CompareByLeft); | |
| 2697 } | |
| 2698 | |
| 2699 while (sa.GetSize() > 0) | |
| 2700 { | |
| 2701 int nLeftTopIndex = -1; | |
| 2702 | |
| 2703 { | |
| 2704 FX_FLOAT fTop = 0.0f; | |
| 2705 | |
| 2706 for (int i=sa.GetSize()-1; i>=0; i--) | |
| 2707 { | |
| 2708 CPDFSDK_Annot* pAnnot = sa.GetAt(i); | |
| 2709 ASSERT(pAnnot != NULL); | |
| 2710 | |
| 2711 CPDF_Rect rcAnnot = GetAnnotRect(pAnnot); | |
| 2712 | |
| 2713 if (rcAnnot.top > fTop) | |
| 2714 { | |
| 2715 nLeftTopIndex = i; | |
| 2716 fTop = rcAnnot.top; | |
| 2717 } | |
| 2718 } | |
| 2719 } | |
| 2720 | |
| 2721 if (nLeftTopIndex >= 0) | |
| 2722 { | |
| 2723 CPDFSDK_Annot* pLeftTopAnnot = sa.GetAt(nLeftTopIndex); | |
| 2724 ASSERT(pLeftTopAnnot != NULL); | |
| 2725 | |
| 2726 CPDF_Rect rcLeftTop = GetAnnotRect(pLeftTopAnnot); | |
| 2727 | |
| 2728 m_Annots.Add(pLeftTopAnnot); | |
| 2729 sa.RemoveAt(nLeftTopIndex); | |
| 2730 | |
| 2731 CFX_ArrayTemplate<int> aSelect; | |
| 2732 | |
| 2733 { | |
| 2734 for (int i=0,sz=sa.GetSize(); i<sz; i++) | |
| 2735 { | |
| 2736 CPDFSDK_Annot* pAnnot = sa.GetAt(i); | |
| 2737 ASSERT(pAnnot != NULL); | |
| 2738 | |
| 2739 CPDF_Rect rcAnnot = GetAnnotRect(pAnnot); | |
| 2740 | |
| 2741 FX_FLOAT fCenterY = (rcAnnot.top + rcAnnot.bottom) /
2.0f; | |
| 2742 | |
| 2743 if (fCenterY > rcLeftTop.bottom && fCenterY < rcLeft
Top.top) | |
| 2744 aSelect.Add(i); | |
| 2745 } | |
| 2746 } | |
| 2747 | |
| 2748 { | |
| 2749 for (int i=0,sz=aSelect.GetSize(); i<sz; i++) | |
| 2750 { | |
| 2751 m_Annots.Add(sa[aSelect[i]]); | |
| 2752 } | |
| 2753 } | |
| 2754 | |
| 2755 { | |
| 2756 for (int i=aSelect.GetSize()-1; i>=0; i--) | |
| 2757 { | |
| 2758 sa.RemoveAt(aSelect[i]); | |
| 2759 } | |
| 2760 } | |
| 2761 | |
| 2762 aSelect.RemoveAll(); | |
| 2763 } | |
| 2764 } | |
| 2765 sa.RemoveAll(); | |
| 2766 } | |
| 2767 break; | |
| 2768 case BAI_COLUMN: | |
| 2769 { | |
| 2770 CPDFSDK_SortAnnots sa; | |
| 2771 | |
| 2772 { | |
| 2773 for (int i=0,sz=m_pPageView->CountAnnots(); i<sz; i++) | |
| 2774 { | |
| 2775 CPDFSDK_Annot* pAnnot = m_pPageView->GetAnnot(i); | |
| 2776 ASSERT(pAnnot != NULL); | |
| 2777 | |
| 2778 if (pAnnot->GetType() == m_sType | |
| 2779 && pAnnot->GetSubType() == m_sSubType) | |
| 2780 sa.Add(pAnnot); | |
| 2781 } | |
| 2782 } | |
| 2783 | |
| 2784 if (sa.GetSize() > 0) | |
| 2785 { | |
| 2786 sa.Sort(CBA_AnnotIterator::CompareByTop, FALSE); | |
| 2787 } | |
| 2788 | |
| 2789 while (sa.GetSize() > 0) | |
| 2790 { | |
| 2791 int nLeftTopIndex = -1; | |
| 2792 | |
| 2793 { | |
| 2794 FX_FLOAT fLeft = -1.0f; | |
| 2795 | |
| 2796 for (int i=sa.GetSize()-1; i>=0; i--) | |
| 2797 { | |
| 2798 CPDFSDK_Annot* pAnnot = sa.GetAt(i); | |
| 2799 ASSERT(pAnnot != NULL); | |
| 2800 | |
| 2801 CPDF_Rect rcAnnot = GetAnnotRect(pAnnot); | |
| 2802 | |
| 2803 if (fLeft < 0) | |
| 2804 { | |
| 2805 nLeftTopIndex = 0; | |
| 2806 fLeft = rcAnnot.left; | |
| 2807 } | |
| 2808 else if (rcAnnot.left < fLeft) | |
| 2809 { | |
| 2810 nLeftTopIndex = i; | |
| 2811 fLeft = rcAnnot.left; | |
| 2812 } | |
| 2813 } | |
| 2814 } | |
| 2815 | |
| 2816 if (nLeftTopIndex >= 0) | |
| 2817 { | |
| 2818 CPDFSDK_Annot* pLeftTopAnnot = sa.GetAt(nLeftTopIndex); | |
| 2819 ASSERT(pLeftTopAnnot != NULL); | |
| 2820 | |
| 2821 CPDF_Rect rcLeftTop = GetAnnotRect(pLeftTopAnnot); | |
| 2822 | |
| 2823 m_Annots.Add(pLeftTopAnnot); | |
| 2824 sa.RemoveAt(nLeftTopIndex); | |
| 2825 | |
| 2826 CFX_ArrayTemplate<int> aSelect; | |
| 2827 | |
| 2828 { | |
| 2829 for (int i=0,sz=sa.GetSize(); i<sz; i++) | |
| 2830 { | |
| 2831 CPDFSDK_Annot* pAnnot = sa.GetAt(i); | |
| 2832 ASSERT(pAnnot != NULL); | |
| 2833 | |
| 2834 CPDF_Rect rcAnnot = GetAnnotRect(pAnnot); | |
| 2835 | |
| 2836 FX_FLOAT fCenterX = (rcAnnot.left + rcAnnot.right) /
2.0f; | |
| 2837 | |
| 2838 if (fCenterX > rcLeftTop.left && fCenterX < rcLeftTo
p.right) | |
| 2839 aSelect.Add(i); | |
| 2840 } | |
| 2841 } | |
| 2842 | |
| 2843 { | |
| 2844 for (int i=0,sz=aSelect.GetSize(); i<sz; i++) | |
| 2845 { | |
| 2846 m_Annots.Add(sa[aSelect[i]]); | |
| 2847 } | |
| 2848 } | |
| 2849 | |
| 2850 { | |
| 2851 for (int i=aSelect.GetSize()-1; i>=0; i--) | |
| 2852 { | |
| 2853 sa.RemoveAt(aSelect[i]); | |
| 2854 } | |
| 2855 } | |
| 2856 | |
| 2857 aSelect.RemoveAll(); | |
| 2858 } | |
| 2859 } | |
| 2860 sa.RemoveAll(); | |
| 2861 } | |
| 2862 break; | |
| 2863 } | |
| 2864 } | |
| 2865 | |
| 2866 CPDF_Rect CBA_AnnotIterator::GetAnnotRect(CPDFSDK_Annot* pAnnot) | |
| 2867 { | |
| 2868 ASSERT(pAnnot != NULL); | |
| 2869 | |
| 2870 CPDF_Annot* pPDFAnnot = pAnnot->GetPDFAnnot(); | |
| 2871 ASSERT(pPDFAnnot != NULL); | |
| 2872 | |
| 2873 CPDF_Rect rcAnnot; | |
| 2874 pPDFAnnot->GetRect(rcAnnot); | |
| 2875 | |
| 2876 return rcAnnot; | |
| 2877 } | |
| 2878 | |
| OLD | NEW |