diff options
author | Dan Sinclair <dsinclair@chromium.org> | 2016-03-14 13:51:24 -0400 |
---|---|---|
committer | Dan Sinclair <dsinclair@chromium.org> | 2016-03-14 13:51:24 -0400 |
commit | f766ad219f66543654520f6a1955836f519e26d1 (patch) | |
tree | 2edf8bc93b89503a3669f7add5b6c2a407b8a78c /fpdfsdk/src | |
parent | 54b0abed08048008498471e39b7c72b034474090 (diff) | |
download | pdfium-f766ad219f66543654520f6a1955836f519e26d1.tar.xz |
Move fpdfsdk/src up to fpdfsdk/.
This CL moves the files in fpdfsdk/src/ up one level to fpdfsdk/ and fixes
up the include paths, include guards and build files.
R=tsepez@chromium.org
Review URL: https://codereview.chromium.org/1799773002 .
Diffstat (limited to 'fpdfsdk/src')
111 files changed, 0 insertions, 53402 deletions
diff --git a/fpdfsdk/src/formfiller/FFL_CBA_Fontmap.cpp b/fpdfsdk/src/formfiller/FFL_CBA_Fontmap.cpp deleted file mode 100644 index 35c2be6319..0000000000 --- a/fpdfsdk/src/formfiller/FFL_CBA_Fontmap.cpp +++ /dev/null @@ -1,259 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "fpdfsdk/include/formfiller/FFL_CBA_Fontmap.h" - -#include "core/include/fpdfapi/cpdf_document.h" -#include "core/include/fpdfapi/cpdf_simple_parser.h" -#include "core/include/fpdfapi/fpdf_page.h" -#include "fpdfsdk/include/fsdk_baseannot.h" - -CBA_FontMap::CBA_FontMap(CPDFSDK_Annot* pAnnot, - IFX_SystemHandler* pSystemHandler) - : CPWL_FontMap(pSystemHandler), - m_pDocument(NULL), - m_pAnnotDict(NULL), - m_pDefaultFont(NULL), - m_sAPType("N") { - CPDF_Page* pPage = pAnnot->GetPDFPage(); - - m_pDocument = pPage->m_pDocument; - m_pAnnotDict = pAnnot->GetPDFAnnot()->GetAnnotDict(); - Initialize(); -} - -CBA_FontMap::~CBA_FontMap() {} - -void CBA_FontMap::Reset() { - Empty(); - m_pDefaultFont = NULL; - m_sDefaultFontName = ""; -} - -void CBA_FontMap::Initialize() { - int32_t nCharset = DEFAULT_CHARSET; - - if (!m_pDefaultFont) { - m_pDefaultFont = GetAnnotDefaultFont(m_sDefaultFontName); - if (m_pDefaultFont) { - if (const CFX_SubstFont* pSubstFont = m_pDefaultFont->GetSubstFont()) { - nCharset = pSubstFont->m_Charset; - } else { - if (m_sDefaultFontName == "Wingdings" || - m_sDefaultFontName == "Wingdings2" || - m_sDefaultFontName == "Wingdings3" || - m_sDefaultFontName == "Webdings") - nCharset = SYMBOL_CHARSET; - else - nCharset = ANSI_CHARSET; - } - AddFontData(m_pDefaultFont, m_sDefaultFontName, nCharset); - AddFontToAnnotDict(m_pDefaultFont, m_sDefaultFontName); - } - } - - if (nCharset != ANSI_CHARSET) - CPWL_FontMap::Initialize(); -} - -void CBA_FontMap::SetDefaultFont(CPDF_Font* pFont, - const CFX_ByteString& sFontName) { - ASSERT(pFont); - - if (m_pDefaultFont) - return; - - m_pDefaultFont = pFont; - m_sDefaultFontName = sFontName; - - int32_t nCharset = DEFAULT_CHARSET; - if (const CFX_SubstFont* pSubstFont = m_pDefaultFont->GetSubstFont()) - nCharset = pSubstFont->m_Charset; - AddFontData(m_pDefaultFont, m_sDefaultFontName, nCharset); -} - -CPDF_Font* CBA_FontMap::FindFontSameCharset(CFX_ByteString& sFontAlias, - int32_t nCharset) { - if (m_pAnnotDict->GetStringBy("Subtype") == "Widget") { - CPDF_Document* pDocument = GetDocument(); - CPDF_Dictionary* pRootDict = pDocument->GetRoot(); - if (!pRootDict) - return NULL; - - CPDF_Dictionary* pAcroFormDict = pRootDict->GetDictBy("AcroForm"); - if (!pAcroFormDict) - return NULL; - - CPDF_Dictionary* pDRDict = pAcroFormDict->GetDictBy("DR"); - if (!pDRDict) - return NULL; - - return FindResFontSameCharset(pDRDict, sFontAlias, nCharset); - } - - return NULL; -} - -CPDF_Document* CBA_FontMap::GetDocument() { - return m_pDocument; -} - -CPDF_Font* CBA_FontMap::FindResFontSameCharset(CPDF_Dictionary* pResDict, - CFX_ByteString& sFontAlias, - int32_t nCharset) { - if (!pResDict) - return NULL; - - CPDF_Dictionary* pFonts = pResDict->GetDictBy("Font"); - if (!pFonts) - return NULL; - - CPDF_Document* pDocument = GetDocument(); - CPDF_Font* pFind = NULL; - for (const auto& it : *pFonts) { - const CFX_ByteString& csKey = it.first; - CPDF_Object* pObj = it.second; - if (!pObj) - continue; - - CPDF_Dictionary* pElement = ToDictionary(pObj->GetDirect()); - if (!pElement) - continue; - if (pElement->GetStringBy("Type") != "Font") - continue; - - CPDF_Font* pFont = pDocument->LoadFont(pElement); - if (!pFont) - continue; - const CFX_SubstFont* pSubst = pFont->GetSubstFont(); - if (!pSubst) - continue; - if (pSubst->m_Charset == nCharset) { - sFontAlias = csKey; - pFind = pFont; - } - } - return pFind; -} - -void CBA_FontMap::AddedFont(CPDF_Font* pFont, - const CFX_ByteString& sFontAlias) { - AddFontToAnnotDict(pFont, sFontAlias); -} - -void CBA_FontMap::AddFontToAnnotDict(CPDF_Font* pFont, - const CFX_ByteString& sAlias) { - if (!pFont) - return; - - CPDF_Dictionary* pAPDict = m_pAnnotDict->GetDictBy("AP"); - - if (!pAPDict) { - pAPDict = new CPDF_Dictionary; - m_pAnnotDict->SetAt("AP", pAPDict); - } - - // to avoid checkbox and radiobutton - CPDF_Object* pObject = pAPDict->GetElement(m_sAPType); - if (ToDictionary(pObject)) - return; - - CPDF_Stream* pStream = pAPDict->GetStreamBy(m_sAPType); - if (!pStream) { - pStream = new CPDF_Stream(NULL, 0, NULL); - int32_t objnum = m_pDocument->AddIndirectObject(pStream); - pAPDict->SetAtReference(m_sAPType, m_pDocument, objnum); - } - - CPDF_Dictionary* pStreamDict = pStream->GetDict(); - - if (!pStreamDict) { - pStreamDict = new CPDF_Dictionary; - pStream->InitStream(NULL, 0, pStreamDict); - } - - if (pStreamDict) { - CPDF_Dictionary* pStreamResList = pStreamDict->GetDictBy("Resources"); - if (!pStreamResList) { - pStreamResList = new CPDF_Dictionary(); - pStreamDict->SetAt("Resources", pStreamResList); - } - - if (pStreamResList) { - CPDF_Dictionary* pStreamResFontList = pStreamResList->GetDictBy("Font"); - if (!pStreamResFontList) { - pStreamResFontList = new CPDF_Dictionary; - int32_t objnum = m_pDocument->AddIndirectObject(pStreamResFontList); - pStreamResList->SetAtReference("Font", m_pDocument, objnum); - } - if (!pStreamResFontList->KeyExist(sAlias)) - pStreamResFontList->SetAtReference(sAlias, m_pDocument, - pFont->GetFontDict()); - } - } -} - -CPDF_Font* CBA_FontMap::GetAnnotDefaultFont(CFX_ByteString& sAlias) { - CPDF_Dictionary* pAcroFormDict = NULL; - const bool bWidget = (m_pAnnotDict->GetStringBy("Subtype") == "Widget"); - if (bWidget) { - if (CPDF_Dictionary* pRootDict = m_pDocument->GetRoot()) - pAcroFormDict = pRootDict->GetDictBy("AcroForm"); - } - - CFX_ByteString sDA; - CPDF_Object* pObj; - if ((pObj = FPDF_GetFieldAttr(m_pAnnotDict, "DA"))) - sDA = pObj->GetString(); - - if (bWidget) { - if (sDA.IsEmpty()) { - pObj = FPDF_GetFieldAttr(pAcroFormDict, "DA"); - sDA = pObj ? pObj->GetString() : CFX_ByteString(); - } - } - - CPDF_Dictionary* pFontDict = NULL; - - if (!sDA.IsEmpty()) { - CPDF_SimpleParser syntax(sDA); - syntax.FindTagParamFromStart("Tf", 2); - CFX_ByteString sFontName = syntax.GetWord(); - sAlias = PDF_NameDecode(sFontName).Mid(1); - - if (CPDF_Dictionary* pDRDict = m_pAnnotDict->GetDictBy("DR")) - if (CPDF_Dictionary* pDRFontDict = pDRDict->GetDictBy("Font")) - pFontDict = pDRFontDict->GetDictBy(sAlias); - - if (!pFontDict) - if (CPDF_Dictionary* pAPDict = m_pAnnotDict->GetDictBy("AP")) - if (CPDF_Dictionary* pNormalDict = pAPDict->GetDictBy("N")) - if (CPDF_Dictionary* pNormalResDict = - pNormalDict->GetDictBy("Resources")) - if (CPDF_Dictionary* pResFontDict = - pNormalResDict->GetDictBy("Font")) - pFontDict = pResFontDict->GetDictBy(sAlias); - - if (bWidget) { - if (!pFontDict) { - if (pAcroFormDict) { - if (CPDF_Dictionary* pDRDict = pAcroFormDict->GetDictBy("DR")) - if (CPDF_Dictionary* pDRFontDict = pDRDict->GetDictBy("Font")) - pFontDict = pDRFontDict->GetDictBy(sAlias); - } - } - } - } - - return pFontDict ? m_pDocument->LoadFont(pFontDict) : nullptr; -} - -void CBA_FontMap::SetAPType(const CFX_ByteString& sAPType) { - m_sAPType = sAPType; - - Reset(); - Initialize(); -} diff --git a/fpdfsdk/src/formfiller/FFL_CheckBox.cpp b/fpdfsdk/src/formfiller/FFL_CheckBox.cpp deleted file mode 100644 index 485f86ba75..0000000000 --- a/fpdfsdk/src/formfiller/FFL_CheckBox.cpp +++ /dev/null @@ -1,116 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "fpdfsdk/include/formfiller/FFL_CheckBox.h" - -#include "fpdfsdk/include/formfiller/FFL_FormFiller.h" -#include "fpdfsdk/include/fsdk_mgr.h" -#include "fpdfsdk/include/pdfwindow/PWL_SpecialButton.h" -#include "public/fpdf_fwlevent.h" - -CFFL_CheckBox::CFFL_CheckBox(CPDFDoc_Environment* pApp, CPDFSDK_Widget* pWidget) - : CFFL_Button(pApp, pWidget) {} - -CFFL_CheckBox::~CFFL_CheckBox() {} - -CPWL_Wnd* CFFL_CheckBox::NewPDFWindow(const PWL_CREATEPARAM& cp, - CPDFSDK_PageView* pPageView) { - CPWL_CheckBox* pWnd = new CPWL_CheckBox(); - pWnd->Create(cp); - pWnd->SetCheck(m_pWidget->IsChecked()); - return pWnd; -} - -FX_BOOL CFFL_CheckBox::OnKeyDown(CPDFSDK_Annot* pAnnot, - FX_UINT nKeyCode, - FX_UINT nFlags) { - switch (nKeyCode) { - case FWL_VKEY_Return: - case FWL_VKEY_Space: - return TRUE; - default: - return CFFL_FormFiller::OnKeyDown(pAnnot, nKeyCode, nFlags); - } -} -FX_BOOL CFFL_CheckBox::OnChar(CPDFSDK_Annot* pAnnot, - FX_UINT nChar, - FX_UINT nFlags) { - switch (nChar) { - case FWL_VKEY_Return: - case FWL_VKEY_Space: { - CFFL_IFormFiller* pIFormFiller = m_pApp->GetIFormFiller(); - ASSERT(pIFormFiller); - - CPDFSDK_PageView* pPageView = pAnnot->GetPageView(); - ASSERT(pPageView); - - FX_BOOL bReset = FALSE; - FX_BOOL bExit = FALSE; - - pIFormFiller->OnButtonUp(m_pWidget, pPageView, bReset, bExit, nFlags); - - if (bReset) - return TRUE; - if (bExit) - return TRUE; - - CFFL_FormFiller::OnChar(pAnnot, nChar, nFlags); - - if (CPWL_CheckBox* pWnd = (CPWL_CheckBox*)GetPDFWindow(pPageView, TRUE)) - pWnd->SetCheck(!pWnd->IsChecked()); - - CommitData(pPageView, nFlags); - return TRUE; - } - default: - return CFFL_FormFiller::OnChar(pAnnot, nChar, nFlags); - } -} - -FX_BOOL CFFL_CheckBox::OnLButtonUp(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - FX_UINT nFlags, - const CFX_FloatPoint& point) { - CFFL_Button::OnLButtonUp(pPageView, pAnnot, nFlags, point); - - if (IsValid()) { - if (CPWL_CheckBox* pWnd = (CPWL_CheckBox*)GetPDFWindow(pPageView, TRUE)) { - CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot; - pWnd->SetCheck(!pWidget->IsChecked()); - } - - if (!CommitData(pPageView, nFlags)) - return FALSE; - } - - return TRUE; -} - -FX_BOOL CFFL_CheckBox::IsDataChanged(CPDFSDK_PageView* pPageView) { - CPWL_CheckBox* pWnd = (CPWL_CheckBox*)GetPDFWindow(pPageView, FALSE); - return pWnd && pWnd->IsChecked() != m_pWidget->IsChecked(); -} - -void CFFL_CheckBox::SaveData(CPDFSDK_PageView* pPageView) { - if (CPWL_CheckBox* pWnd = (CPWL_CheckBox*)GetPDFWindow(pPageView, FALSE)) { - bool bNewChecked = pWnd->IsChecked(); - - if (bNewChecked) { - CPDF_FormField* pField = m_pWidget->GetFormField(); - for (int32_t i = 0, sz = pField->CountControls(); i < sz; i++) { - if (CPDF_FormControl* pCtrl = pField->GetControl(i)) { - if (pCtrl->IsChecked()) { - break; - } - } - } - } - - m_pWidget->SetCheck(bNewChecked, false); - m_pWidget->UpdateField(); - SetChangeMark(); - } -} diff --git a/fpdfsdk/src/formfiller/FFL_ComboBox.cpp b/fpdfsdk/src/formfiller/FFL_ComboBox.cpp deleted file mode 100644 index 5e88a5d133..0000000000 --- a/fpdfsdk/src/formfiller/FFL_ComboBox.cpp +++ /dev/null @@ -1,302 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "fpdfsdk/include/formfiller/FFL_ComboBox.h" - -#include "fpdfsdk/include/formfiller/FFL_CBA_Fontmap.h" -#include "fpdfsdk/include/formfiller/FFL_FormFiller.h" -#include "fpdfsdk/include/formfiller/FFL_IFormFiller.h" -#include "fpdfsdk/include/fsdk_common.h" -#include "fpdfsdk/include/fsdk_mgr.h" -#include "fpdfsdk/include/pdfwindow/PWL_ComboBox.h" - -CFFL_ComboBox::CFFL_ComboBox(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pAnnot) - : CFFL_FormFiller(pApp, pAnnot), m_pFontMap(NULL) { - m_State.nIndex = 0; - m_State.nStart = 0; - m_State.nEnd = 0; -} - -CFFL_ComboBox::~CFFL_ComboBox() { - for (const auto& it : m_Maps) - it.second->InvalidateFocusHandler(this); - delete m_pFontMap; -} - -PWL_CREATEPARAM CFFL_ComboBox::GetCreateParam() { - PWL_CREATEPARAM cp = CFFL_FormFiller::GetCreateParam(); - - int nFlags = m_pWidget->GetFieldFlags(); - if (nFlags & FIELDFLAG_EDIT) { - cp.dwFlags |= PCBS_ALLOWCUSTOMTEXT; - } - - if (!m_pFontMap) - m_pFontMap = new CBA_FontMap(m_pWidget, GetSystemHandler()); - cp.pFontMap = m_pFontMap; - cp.pFocusHandler = this; - - return cp; -} - -CPWL_Wnd* CFFL_ComboBox::NewPDFWindow(const PWL_CREATEPARAM& cp, - CPDFSDK_PageView* pPageView) { - CPWL_ComboBox* pWnd = new CPWL_ComboBox(); - pWnd->AttachFFLData(this); - pWnd->Create(cp); - - CFFL_IFormFiller* pFormFiller = m_pApp->GetIFormFiller(); - pWnd->SetFillerNotify(pFormFiller); - - int32_t nCurSel = m_pWidget->GetSelectedIndex(0); - CFX_WideString swText; - if (nCurSel < 0) - swText = m_pWidget->GetValue(); - else - swText = m_pWidget->GetOptionLabel(nCurSel); - - for (int32_t i = 0, sz = m_pWidget->CountOptions(); i < sz; i++) { - pWnd->AddString(m_pWidget->GetOptionLabel(i).c_str()); - } - - pWnd->SetSelect(nCurSel); - pWnd->SetText(swText.c_str()); - return pWnd; -} - -FX_BOOL CFFL_ComboBox::OnChar(CPDFSDK_Annot* pAnnot, - FX_UINT nChar, - FX_UINT nFlags) { - return CFFL_FormFiller::OnChar(pAnnot, nChar, nFlags); -} - -FX_BOOL CFFL_ComboBox::IsDataChanged(CPDFSDK_PageView* pPageView) { - CPWL_ComboBox* pWnd = (CPWL_ComboBox*)GetPDFWindow(pPageView, FALSE); - if (!pWnd) - return FALSE; - - int32_t nCurSel = pWnd->GetSelect(); - if (!(m_pWidget->GetFieldFlags() & FIELDFLAG_EDIT)) - return nCurSel != m_pWidget->GetSelectedIndex(0); - - if (nCurSel >= 0) - return nCurSel != m_pWidget->GetSelectedIndex(0); - - return pWnd->GetText() != m_pWidget->GetValue(); -} - -void CFFL_ComboBox::SaveData(CPDFSDK_PageView* pPageView) { - CPWL_ComboBox* pWnd = - static_cast<CPWL_ComboBox*>(GetPDFWindow(pPageView, FALSE)); - if (!pWnd) - return; - - CFX_WideString swText = pWnd->GetText(); - int32_t nCurSel = pWnd->GetSelect(); - - bool bSetValue = false; - - if (m_pWidget->GetFieldFlags() & FIELDFLAG_EDIT) - bSetValue = (nCurSel < 0) || (swText != m_pWidget->GetOptionLabel(nCurSel)); - - if (bSetValue) { - m_pWidget->SetValue(swText, FALSE); - } else { - m_pWidget->GetSelectedIndex(0); - m_pWidget->SetOptionSelection(nCurSel, TRUE, FALSE); - } - - m_pWidget->ResetFieldAppearance(TRUE); - m_pWidget->UpdateField(); - SetChangeMark(); - - m_pWidget->GetPDFPage(); -} - -void CFFL_ComboBox::GetActionData(CPDFSDK_PageView* pPageView, - CPDF_AAction::AActionType type, - PDFSDK_FieldAction& fa) { - switch (type) { - case CPDF_AAction::KeyStroke: - if (CPWL_ComboBox* pComboBox = - static_cast<CPWL_ComboBox*>(GetPDFWindow(pPageView, FALSE))) { - if (CPWL_Edit* pEdit = pComboBox->GetEdit()) { - fa.bFieldFull = pEdit->IsTextFull(); - int nSelStart = 0; - int nSelEnd = 0; - pEdit->GetSel(nSelStart, nSelEnd); - fa.nSelEnd = nSelEnd; - fa.nSelStart = nSelStart; - fa.sValue = pEdit->GetText(); - fa.sChangeEx = GetSelectExportText(); - - if (fa.bFieldFull) { - fa.sChange = L""; - fa.sChangeEx = L""; - } - } - } - break; - case CPDF_AAction::Validate: - if (CPWL_ComboBox* pComboBox = - static_cast<CPWL_ComboBox*>(GetPDFWindow(pPageView, FALSE))) { - if (CPWL_Edit* pEdit = pComboBox->GetEdit()) { - fa.sValue = pEdit->GetText(); - } - } - break; - case CPDF_AAction::LoseFocus: - case CPDF_AAction::GetFocus: - fa.sValue = m_pWidget->GetValue(); - break; - default: - break; - } -} - -void CFFL_ComboBox::SetActionData(CPDFSDK_PageView* pPageView, - CPDF_AAction::AActionType type, - const PDFSDK_FieldAction& fa) { - switch (type) { - case CPDF_AAction::KeyStroke: - if (CPWL_ComboBox* pComboBox = - static_cast<CPWL_ComboBox*>(GetPDFWindow(pPageView, FALSE))) { - if (CPWL_Edit* pEdit = pComboBox->GetEdit()) { - pEdit->SetSel(fa.nSelStart, fa.nSelEnd); - pEdit->ReplaceSel(fa.sChange.c_str()); - } - } - break; - default: - break; - } -} - -FX_BOOL CFFL_ComboBox::IsActionDataChanged(CPDF_AAction::AActionType type, - const PDFSDK_FieldAction& faOld, - const PDFSDK_FieldAction& faNew) { - switch (type) { - case CPDF_AAction::KeyStroke: - return (!faOld.bFieldFull && faOld.nSelEnd != faNew.nSelEnd) || - faOld.nSelStart != faNew.nSelStart || - faOld.sChange != faNew.sChange; - default: - break; - } - - return FALSE; -} - -void CFFL_ComboBox::SaveState(CPDFSDK_PageView* pPageView) { - ASSERT(pPageView); - - if (CPWL_ComboBox* pComboBox = - static_cast<CPWL_ComboBox*>(GetPDFWindow(pPageView, FALSE))) { - m_State.nIndex = pComboBox->GetSelect(); - - if (CPWL_Edit* pEdit = pComboBox->GetEdit()) { - pEdit->GetSel(m_State.nStart, m_State.nEnd); - m_State.sValue = pEdit->GetText(); - } - } -} - -void CFFL_ComboBox::RestoreState(CPDFSDK_PageView* pPageView) { - ASSERT(pPageView); - - if (CPWL_ComboBox* pComboBox = - static_cast<CPWL_ComboBox*>(GetPDFWindow(pPageView, TRUE))) { - if (m_State.nIndex >= 0) { - pComboBox->SetSelect(m_State.nIndex); - } else { - if (CPWL_Edit* pEdit = pComboBox->GetEdit()) { - pEdit->SetText(m_State.sValue.c_str()); - pEdit->SetSel(m_State.nStart, m_State.nEnd); - } - } - } -} - -CPWL_Wnd* CFFL_ComboBox::ResetPDFWindow(CPDFSDK_PageView* pPageView, - FX_BOOL bRestoreValue) { - if (bRestoreValue) - SaveState(pPageView); - - DestroyPDFWindow(pPageView); - - CPWL_Wnd* pRet = NULL; - - if (bRestoreValue) { - RestoreState(pPageView); - pRet = GetPDFWindow(pPageView, FALSE); - } else { - pRet = GetPDFWindow(pPageView, TRUE); - } - - m_pWidget->UpdateField(); - - return pRet; -} - -#ifdef PDF_ENABLE_XFA -FX_BOOL CFFL_ComboBox::IsFieldFull(CPDFSDK_PageView* pPageView) { - if (CPWL_ComboBox* pComboBox = - static_cast<CPWL_ComboBox*>(GetPDFWindow(pPageView, FALSE))) { - if (CPWL_Edit* pEdit = pComboBox->GetEdit()) - return pEdit->IsTextFull(); - } - return FALSE; -} -#endif // PDF_ENABLE_XFA - -void CFFL_ComboBox::OnSetFocus(CPWL_Wnd* pWnd) { - ASSERT(m_pApp); - - if (pWnd->GetClassName() == PWL_CLASSNAME_EDIT) { - CPWL_Edit* pEdit = (CPWL_Edit*)pWnd; - pEdit->SetCharSet(134); - pEdit->SetCodePage(936); - - pEdit->SetReadyToInput(); - CFX_WideString wsText = pEdit->GetText(); - int nCharacters = wsText.GetLength(); - CFX_ByteString bsUTFText = wsText.UTF16LE_Encode(); - unsigned short* pBuffer = (unsigned short*)bsUTFText.c_str(); - m_pApp->FFI_OnSetFieldInputFocus(m_pWidget->GetFormField(), pBuffer, - nCharacters, TRUE); - - pEdit->SetEditNotify(this); - } -} - -void CFFL_ComboBox::OnKillFocus(CPWL_Wnd* pWnd) { - ASSERT(m_pApp); -} - -void CFFL_ComboBox::OnAddUndo(CPWL_Edit* pEdit) { - ASSERT(pEdit); -} - -CFX_WideString CFFL_ComboBox::GetSelectExportText() { - CFX_WideString swRet; - - int nExport = -1; - CPDFSDK_PageView* pPageView = GetCurPageView(); - if (CPWL_ComboBox* pComboBox = - (CPWL_ComboBox*)GetPDFWindow(pPageView, FALSE)) { - nExport = pComboBox->GetSelect(); - } - - if (nExport >= 0) { - if (CPDF_FormField* pFormField = m_pWidget->GetFormField()) { - swRet = pFormField->GetOptionValue(nExport); - if (swRet.IsEmpty()) - swRet = pFormField->GetOptionLabel(nExport); - } - } - - return swRet; -} diff --git a/fpdfsdk/src/formfiller/FFL_FormFiller.cpp b/fpdfsdk/src/formfiller/FFL_FormFiller.cpp deleted file mode 100644 index e596ba08ba..0000000000 --- a/fpdfsdk/src/formfiller/FFL_FormFiller.cpp +++ /dev/null @@ -1,727 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "fpdfsdk/include/formfiller/FFL_FormFiller.h" - -#include "fpdfsdk/include/formfiller/FFL_CBA_Fontmap.h" -#include "fpdfsdk/include/fsdk_common.h" -#include "fpdfsdk/include/fsdk_mgr.h" -#include "fpdfsdk/include/pdfwindow/PWL_Utils.h" - -#define GetRed(rgb) ((uint8_t)(rgb)) -#define GetGreen(rgb) ((uint8_t)(((FX_WORD)(rgb)) >> 8)) -#define GetBlue(rgb) ((uint8_t)((rgb) >> 16)) - -#define FFL_HINT_ELAPSE 800 - -CFFL_FormFiller::CFFL_FormFiller(CPDFDoc_Environment* pApp, - CPDFSDK_Annot* pAnnot) - : m_pApp(pApp), m_pAnnot(pAnnot), m_bValid(FALSE), m_ptOldPos(0, 0) { - m_pWidget = (CPDFSDK_Widget*)pAnnot; -} - -CFFL_FormFiller::~CFFL_FormFiller() { - for (const auto& it : m_Maps) { - CPWL_Wnd* pWnd = it.second; - CFFL_PrivateData* pData = (CFFL_PrivateData*)pWnd->GetAttachedData(); - pWnd->InvalidateProvider(this); - pWnd->Destroy(); - delete pWnd; - delete pData; - } - m_Maps.clear(); -} - -void CFFL_FormFiller::SetWindowRect(CPDFSDK_PageView* pPageView, - const CFX_FloatRect& rcWindow) { - if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, FALSE)) { - pWnd->Move(CFX_FloatRect(rcWindow), TRUE, FALSE); - } -} - -CFX_FloatRect CFFL_FormFiller::GetWindowRect(CPDFSDK_PageView* pPageView) { - if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, FALSE)) { - return pWnd->GetWindowRect(); - } - - return CFX_FloatRect(0, 0, 0, 0); -} - -FX_RECT CFFL_FormFiller::GetViewBBox(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot) { - ASSERT(pPageView); - ASSERT(pAnnot); - - CFX_FloatRect rcAnnot = m_pWidget->GetRect(); - - if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, FALSE)) { - CFX_FloatRect rcWindow = pWnd->GetWindowRect(); - rcAnnot = PWLtoFFL(rcWindow); - } - - CFX_FloatRect rcWin = rcAnnot; - - CFX_FloatRect rcFocus = GetFocusBox(pPageView); - if (!rcFocus.IsEmpty()) - rcWin.Union(rcFocus); - - CFX_FloatRect rect = CPWL_Utils::InflateRect(rcWin, 1); - - return rect.GetOutterRect(); -} - -void CFFL_FormFiller::OnDraw(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - CFX_RenderDevice* pDevice, - CFX_Matrix* pUser2Device, - FX_DWORD dwFlags) { - ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget"); - - if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, FALSE)) { - CFX_Matrix mt = GetCurMatrix(); - mt.Concat(*pUser2Device); - pWnd->DrawAppearance(pDevice, &mt); - } else { - CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot; - if (CFFL_IFormFiller::IsVisible(pWidget)) - pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL); - } -} - -void CFFL_FormFiller::OnDrawDeactive(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - CFX_RenderDevice* pDevice, - CFX_Matrix* pUser2Device, - FX_DWORD dwFlags) { - CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot; - pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL); -} - -void CFFL_FormFiller::OnCreate(CPDFSDK_Annot* pAnnot) {} - -void CFFL_FormFiller::OnLoad(CPDFSDK_Annot* pAnnot) {} - -void CFFL_FormFiller::OnDelete(CPDFSDK_Annot* pAnnot) {} - -void CFFL_FormFiller::OnMouseEnter(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot) {} - -void CFFL_FormFiller::OnMouseExit(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot) { - EndTimer(); - ASSERT(m_pWidget); -} - -FX_BOOL CFFL_FormFiller::OnLButtonDown(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - FX_UINT nFlags, - const CFX_FloatPoint& point) { - if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, TRUE)) { - m_bValid = TRUE; - FX_RECT rect = GetViewBBox(pPageView, pAnnot); - InvalidateRect(rect.left, rect.top, rect.right, rect.bottom); - - if (!rect.Contains((int)point.x, (int)point.y)) - return FALSE; - - return pWnd->OnLButtonDown(WndtoPWL(pPageView, point), nFlags); - } - - return FALSE; -} - -FX_BOOL CFFL_FormFiller::OnLButtonUp(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - FX_UINT nFlags, - const CFX_FloatPoint& point) { - if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, FALSE)) { - FX_RECT rcFFL = GetViewBBox(pPageView, pAnnot); - InvalidateRect(rcFFL.left, rcFFL.top, rcFFL.right, rcFFL.bottom); - pWnd->OnLButtonUp(WndtoPWL(pPageView, point), nFlags); - return TRUE; - } - - return FALSE; -} - -FX_BOOL CFFL_FormFiller::OnLButtonDblClk(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - FX_UINT nFlags, - const CFX_FloatPoint& point) { - if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, FALSE)) { - pWnd->OnLButtonDblClk(WndtoPWL(pPageView, point), nFlags); - return TRUE; - } - - return FALSE; -} - -FX_BOOL CFFL_FormFiller::OnMouseMove(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - FX_UINT nFlags, - const CFX_FloatPoint& point) { - if ((m_ptOldPos.x != point.x) || (m_ptOldPos.y != point.y)) { - m_ptOldPos = point; - } - - if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, FALSE)) { - pWnd->OnMouseMove(WndtoPWL(pPageView, point), nFlags); - return TRUE; - } - - return FALSE; -} - -FX_BOOL CFFL_FormFiller::OnMouseWheel(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - FX_UINT nFlags, - short zDelta, - const CFX_FloatPoint& point) { - if (!IsValid()) - return FALSE; - - if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, TRUE)) { - return pWnd->OnMouseWheel(zDelta, WndtoPWL(pPageView, point), nFlags); - } - - return FALSE; -} - -FX_BOOL CFFL_FormFiller::OnRButtonDown(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - FX_UINT nFlags, - const CFX_FloatPoint& point) { - if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, TRUE)) { - pWnd->OnRButtonDown(WndtoPWL(pPageView, point), nFlags); - return TRUE; - } - - return FALSE; -} - -FX_BOOL CFFL_FormFiller::OnRButtonUp(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - FX_UINT nFlags, - const CFX_FloatPoint& point) { - if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, FALSE)) { - pWnd->OnRButtonUp(WndtoPWL(pPageView, point), nFlags); - return TRUE; - } - - return FALSE; -} - -FX_BOOL CFFL_FormFiller::OnKeyDown(CPDFSDK_Annot* pAnnot, - FX_UINT nKeyCode, - FX_UINT nFlags) { - if (IsValid()) { - CPDFSDK_PageView* pPageView = GetCurPageView(); - ASSERT(pPageView); - - if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, FALSE)) { - return pWnd->OnKeyDown(nKeyCode, nFlags); - } - } - - return FALSE; -} - -FX_BOOL CFFL_FormFiller::OnChar(CPDFSDK_Annot* pAnnot, - FX_UINT nChar, - FX_UINT nFlags) { - if (IsValid()) { - CPDFSDK_PageView* pPageView = GetCurPageView(); - ASSERT(pPageView); - - if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, FALSE)) { - return pWnd->OnChar(nChar, nFlags); - } - } - - return FALSE; -} - -void CFFL_FormFiller::SetFocusForAnnot(CPDFSDK_Annot* pAnnot, FX_UINT nFlag) { - CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot; - UnderlyingPageType* pPage = pWidget->GetUnderlyingPage(); - CPDFSDK_Document* pDoc = m_pApp->GetSDKDocument(); - CPDFSDK_PageView* pPageView = pDoc->GetPageView(pPage); - if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, TRUE)) - pWnd->SetFocus(); - - m_bValid = TRUE; - FX_RECT rcRect = GetViewBBox(pPageView, pAnnot); - InvalidateRect(rcRect.left, rcRect.top, rcRect.right, rcRect.bottom); -} - -void CFFL_FormFiller::KillFocusForAnnot(CPDFSDK_Annot* pAnnot, FX_UINT nFlag) { - if (!IsValid()) - return; - - CPDFSDK_PageView* pPageView = GetCurPageView(); - if (!pPageView) - return; - - CommitData(pPageView, nFlag); - - if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, FALSE)) - pWnd->KillFocus(); - - FX_BOOL bDestroyPDFWindow; - switch (m_pWidget->GetFieldType()) { - case FIELDTYPE_PUSHBUTTON: - case FIELDTYPE_CHECKBOX: - case FIELDTYPE_RADIOBUTTON: - bDestroyPDFWindow = TRUE; - break; - default: - bDestroyPDFWindow = FALSE; - break; - } - EscapeFiller(pPageView, bDestroyPDFWindow); -} - -FX_BOOL CFFL_FormFiller::IsValid() const { - return m_bValid; -} - -PWL_CREATEPARAM CFFL_FormFiller::GetCreateParam() { - ASSERT(m_pApp); - - PWL_CREATEPARAM cp; - cp.pParentWnd = NULL; - cp.pProvider = this; - cp.rcRectWnd = GetPDFWindowRect(); - - FX_DWORD dwCreateFlags = PWS_BORDER | PWS_BACKGROUND | PWS_VISIBLE; - FX_DWORD dwFieldFlag = m_pWidget->GetFieldFlags(); - if (dwFieldFlag & FIELDFLAG_READONLY) { - dwCreateFlags |= PWS_READONLY; - } - - FX_COLORREF color; - if (m_pWidget->GetFillColor(color)) { - cp.sBackgroundColor = - CPWL_Color(GetRed(color), GetGreen(color), GetBlue(color)); - } - - if (m_pWidget->GetBorderColor(color)) { - cp.sBorderColor = - CPWL_Color(GetRed(color), GetGreen(color), GetBlue(color)); - } - - cp.sTextColor = CPWL_Color(COLORTYPE_GRAY, 0); - - if (m_pWidget->GetTextColor(color)) { - cp.sTextColor = CPWL_Color(GetRed(color), GetGreen(color), GetBlue(color)); - } - - cp.fFontSize = m_pWidget->GetFontSize(); - cp.dwBorderWidth = m_pWidget->GetBorderWidth(); - - int nBorderStyle = m_pWidget->GetBorderStyle(); - - switch (nBorderStyle) { - case BBS_SOLID: - cp.nBorderStyle = PBS_SOLID; - break; - case BBS_DASH: - cp.nBorderStyle = PBS_DASH; - cp.sDash = CPWL_Dash(3, 3, 0); - break; - case BBS_BEVELED: - cp.nBorderStyle = PBS_BEVELED; - cp.dwBorderWidth *= 2; - break; - case BBS_INSET: - cp.nBorderStyle = PBS_INSET; - cp.dwBorderWidth *= 2; - break; - case BBS_UNDERLINE: - cp.nBorderStyle = PBS_UNDERLINED; - break; - } - - if (cp.fFontSize <= 0) { - dwCreateFlags |= PWS_AUTOFONTSIZE; - } - - cp.dwFlags = dwCreateFlags; - cp.pSystemHandler = m_pApp->GetSysHandler(); - return cp; -} - -CPWL_Wnd* CFFL_FormFiller::GetPDFWindow(CPDFSDK_PageView* pPageView, - FX_BOOL bNew) { - ASSERT(pPageView); - - auto it = m_Maps.find(pPageView); - const bool found = it != m_Maps.end(); - CPWL_Wnd* pWnd = found ? it->second : nullptr; - if (!bNew) - return pWnd; - - if (found) { - CFFL_PrivateData* pPrivateData = (CFFL_PrivateData*)pWnd->GetAttachedData(); - if (pPrivateData->nWidgetAge != m_pWidget->GetAppearanceAge()) { - return ResetPDFWindow( - pPageView, m_pWidget->GetValueAge() == pPrivateData->nValueAge); - } - } else { - PWL_CREATEPARAM cp = GetCreateParam(); - cp.hAttachedWnd = (FX_HWND)m_pWidget; - - CFFL_PrivateData* pPrivateData = new CFFL_PrivateData; - pPrivateData->pWidget = m_pWidget; - pPrivateData->pPageView = pPageView; - pPrivateData->nWidgetAge = m_pWidget->GetAppearanceAge(); - pPrivateData->nValueAge = 0; - - cp.pAttachedData = pPrivateData; - - pWnd = NewPDFWindow(cp, pPageView); - m_Maps[pPageView] = pWnd; - } - - return pWnd; -} - -void CFFL_FormFiller::DestroyPDFWindow(CPDFSDK_PageView* pPageView) { - auto it = m_Maps.find(pPageView); - if (it == m_Maps.end()) - return; - - CPWL_Wnd* pWnd = it->second; - CFFL_PrivateData* pData = (CFFL_PrivateData*)pWnd->GetAttachedData(); - pWnd->Destroy(); - delete pWnd; - delete pData; - - m_Maps.erase(it); -} - -CFX_Matrix CFFL_FormFiller::GetWindowMatrix(void* pAttachedData) { - if (CFFL_PrivateData* pPrivateData = (CFFL_PrivateData*)pAttachedData) { - if (pPrivateData->pPageView) { - CFX_Matrix mtPageView; - pPrivateData->pPageView->GetCurrentMatrix(mtPageView); - CFX_Matrix mt = GetCurMatrix(); - mt.Concat(mtPageView); - - return mt; - } - } - return CFX_Matrix(1, 0, 0, 1, 0, 0); -} - -CFX_Matrix CFFL_FormFiller::GetCurMatrix() { - CFX_Matrix mt; - - CFX_FloatRect rcDA; - m_pWidget->GetPDFAnnot()->GetRect(rcDA); - - switch (m_pWidget->GetRotate()) { - default: - case 0: - mt = CFX_Matrix(1, 0, 0, 1, 0, 0); - break; - case 90: - mt = CFX_Matrix(0, 1, -1, 0, rcDA.right - rcDA.left, 0); - break; - case 180: - mt = CFX_Matrix(-1, 0, 0, -1, rcDA.right - rcDA.left, - rcDA.top - rcDA.bottom); - break; - case 270: - mt = CFX_Matrix(0, -1, 1, 0, 0, rcDA.top - rcDA.bottom); - break; - } - mt.e += rcDA.left; - mt.f += rcDA.bottom; - - return mt; -} - -CFX_WideString CFFL_FormFiller::LoadPopupMenuString(int nIndex) { - ASSERT(m_pApp); - - return L""; -} - -CFX_FloatRect CFFL_FormFiller::GetPDFWindowRect() const { - CFX_FloatRect rectAnnot; - m_pWidget->GetPDFAnnot()->GetRect(rectAnnot); - - FX_FLOAT fWidth = rectAnnot.right - rectAnnot.left; - FX_FLOAT fHeight = rectAnnot.top - rectAnnot.bottom; - if ((m_pWidget->GetRotate() / 90) & 0x01) - return CFX_FloatRect(0, 0, fHeight, fWidth); - - return CFX_FloatRect(0, 0, fWidth, fHeight); -} - -CPDFSDK_PageView* CFFL_FormFiller::GetCurPageView() { - UnderlyingPageType* pPage = m_pAnnot->GetUnderlyingPage(); - CPDFSDK_Document* pSDKDoc = m_pApp->GetSDKDocument(); - return pSDKDoc ? pSDKDoc->GetPageView(pPage) : nullptr; -} - -CFX_FloatRect CFFL_FormFiller::GetFocusBox(CPDFSDK_PageView* pPageView) { - if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, FALSE)) { - CFX_FloatRect rcFocus = FFLtoWnd(pPageView, PWLtoFFL(pWnd->GetFocusRect())); - CFX_FloatRect rcPage = pPageView->GetPDFPage()->GetPageBBox(); - if (rcPage.Contains(rcFocus)) - return rcFocus; - } - return CFX_FloatRect(0, 0, 0, 0); -} - -CFX_FloatRect CFFL_FormFiller::FFLtoPWL(const CFX_FloatRect& rect) { - CFX_Matrix mt; - mt.SetReverse(GetCurMatrix()); - - CFX_FloatRect temp = rect; - mt.TransformRect(temp); - - return temp; -} - -CFX_FloatRect CFFL_FormFiller::PWLtoFFL(const CFX_FloatRect& rect) { - CFX_Matrix mt = GetCurMatrix(); - - CFX_FloatRect temp = rect; - mt.TransformRect(temp); - - return temp; -} - -CFX_FloatPoint CFFL_FormFiller::FFLtoPWL(const CFX_FloatPoint& point) { - CFX_Matrix mt; - mt.SetReverse(GetCurMatrix()); - - CFX_FloatPoint pt = point; - mt.Transform(pt.x, pt.y); - - return pt; -} - -CFX_FloatPoint CFFL_FormFiller::PWLtoFFL(const CFX_FloatPoint& point) { - CFX_Matrix mt = GetCurMatrix(); - - CFX_FloatPoint pt = point; - mt.Transform(pt.x, pt.y); - - return pt; -} - -CFX_FloatPoint CFFL_FormFiller::WndtoPWL(CPDFSDK_PageView* pPageView, - const CFX_FloatPoint& pt) { - return FFLtoPWL(pt); -} - -CFX_FloatRect CFFL_FormFiller::FFLtoWnd(CPDFSDK_PageView* pPageView, - const CFX_FloatRect& rect) { - return rect; -} - -FX_BOOL CFFL_FormFiller::CommitData(CPDFSDK_PageView* pPageView, - FX_UINT nFlag) { - if (IsDataChanged(pPageView)) { - FX_BOOL bRC = TRUE; - FX_BOOL bExit = FALSE; - CFFL_IFormFiller* pIFormFiller = m_pApp->GetIFormFiller(); - pIFormFiller->OnKeyStrokeCommit(m_pWidget, pPageView, bRC, bExit, nFlag); - if (bExit) - return TRUE; - if (!bRC) { - ResetPDFWindow(pPageView, FALSE); - return TRUE; - } - - pIFormFiller->OnValidate(m_pWidget, pPageView, bRC, bExit, nFlag); - if (bExit) - return TRUE; - if (!bRC) { - ResetPDFWindow(pPageView, FALSE); - return TRUE; - } - - SaveData(pPageView); - pIFormFiller->OnCalculate(m_pWidget, pPageView, bExit, nFlag); - if (bExit) - return TRUE; - - pIFormFiller->OnFormat(m_pWidget, pPageView, bExit, nFlag); - } - return TRUE; -} - -FX_BOOL CFFL_FormFiller::IsDataChanged(CPDFSDK_PageView* pPageView) { - return FALSE; -} - -void CFFL_FormFiller::SaveData(CPDFSDK_PageView* pPageView) {} - -#ifdef PDF_ENABLE_XFA -FX_BOOL CFFL_FormFiller::IsFieldFull(CPDFSDK_PageView* pPageView) { - return FALSE; -} -#endif // PDF_ENABLE_XFA - -void CFFL_FormFiller::SetChangeMark() { - m_pApp->FFI_OnChange(); -} - -void CFFL_FormFiller::GetActionData(CPDFSDK_PageView* pPageView, - CPDF_AAction::AActionType type, - PDFSDK_FieldAction& fa) { - fa.sValue = m_pWidget->GetValue(); -} - -void CFFL_FormFiller::SetActionData(CPDFSDK_PageView* pPageView, - CPDF_AAction::AActionType type, - const PDFSDK_FieldAction& fa) {} - -FX_BOOL CFFL_FormFiller::IsActionDataChanged(CPDF_AAction::AActionType type, - const PDFSDK_FieldAction& faOld, - const PDFSDK_FieldAction& faNew) { - return FALSE; -} - -void CFFL_FormFiller::SaveState(CPDFSDK_PageView* pPageView) {} - -void CFFL_FormFiller::RestoreState(CPDFSDK_PageView* pPageView) {} - -CPWL_Wnd* CFFL_FormFiller::ResetPDFWindow(CPDFSDK_PageView* pPageView, - FX_BOOL bRestoreValue) { - return GetPDFWindow(pPageView, FALSE); -} - -void CFFL_FormFiller::TimerProc() {} - -IFX_SystemHandler* CFFL_FormFiller::GetSystemHandler() const { - return m_pApp->GetSysHandler(); -} - -void CFFL_FormFiller::EscapeFiller(CPDFSDK_PageView* pPageView, - FX_BOOL bDestroyPDFWindow) { - m_bValid = FALSE; - - FX_RECT rcRect = GetViewBBox(pPageView, m_pWidget); - InvalidateRect(rcRect.left, rcRect.top, rcRect.right, rcRect.bottom); - - if (bDestroyPDFWindow) - DestroyPDFWindow(pPageView); -} - -void CFFL_FormFiller::InvalidateRect(double left, - double top, - double right, - double bottom) { - UnderlyingPageType* pPage = m_pWidget->GetUnderlyingPage(); - m_pApp->FFI_Invalidate(pPage, left, top, right, bottom); -} - -CFFL_Button::CFFL_Button(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pWidget) - : CFFL_FormFiller(pApp, pWidget), m_bMouseIn(FALSE), m_bMouseDown(FALSE) {} - -CFFL_Button::~CFFL_Button() {} - -void CFFL_Button::OnMouseEnter(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot) { - m_bMouseIn = TRUE; - FX_RECT rect = GetViewBBox(pPageView, pAnnot); - InvalidateRect(rect.left, rect.top, rect.right, rect.bottom); -} - -void CFFL_Button::OnMouseExit(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot) { - m_bMouseIn = FALSE; - - FX_RECT rect = GetViewBBox(pPageView, pAnnot); - InvalidateRect(rect.left, rect.top, rect.right, rect.bottom); - EndTimer(); - ASSERT(m_pWidget); -} - -FX_BOOL CFFL_Button::OnLButtonDown(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - FX_UINT nFlags, - const CFX_FloatPoint& point) { - CFX_FloatRect rcAnnot = pAnnot->GetRect(); - if (!rcAnnot.Contains(point.x, point.y)) - return FALSE; - - m_bMouseDown = TRUE; - m_bValid = TRUE; - FX_RECT rect = GetViewBBox(pPageView, pAnnot); - InvalidateRect(rect.left, rect.top, rect.right, rect.bottom); - return TRUE; -} - -FX_BOOL CFFL_Button::OnLButtonUp(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - FX_UINT nFlags, - const CFX_FloatPoint& point) { - CFX_FloatRect rcAnnot = pAnnot->GetRect(); - if (!rcAnnot.Contains(point.x, point.y)) - return FALSE; - - m_bMouseDown = FALSE; - m_pWidget->GetPDFPage(); - - FX_RECT rect = GetViewBBox(pPageView, pAnnot); - InvalidateRect(rect.left, rect.top, rect.right, rect.bottom); - return TRUE; -} - -FX_BOOL CFFL_Button::OnMouseMove(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - FX_UINT nFlags, - const CFX_FloatPoint& point) { - ASSERT(m_pApp); - - return TRUE; -} - -void CFFL_Button::OnDraw(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - CFX_RenderDevice* pDevice, - CFX_Matrix* pUser2Device, - FX_DWORD dwFlags) { - ASSERT(pPageView); - CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot; - CPDF_FormControl* pCtrl = pWidget->GetFormControl(); - CPDF_FormControl::HighlightingMode eHM = pCtrl->GetHighlightingMode(); - - if (eHM != CPDF_FormControl::Push) { - pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL); - return; - } - - if (m_bMouseDown) { - if (pWidget->IsWidgetAppearanceValid(CPDF_Annot::Down)) - pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Down, NULL); - else - pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL); - } else if (m_bMouseIn) { - if (pWidget->IsWidgetAppearanceValid(CPDF_Annot::Rollover)) - pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Rollover, - NULL); - else - pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL); - } else { - pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL); - } -} - -void CFFL_Button::OnDrawDeactive(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - CFX_RenderDevice* pDevice, - CFX_Matrix* pUser2Device, - FX_DWORD dwFlags) { - OnDraw(pPageView, pAnnot, pDevice, pUser2Device, dwFlags); -} diff --git a/fpdfsdk/src/formfiller/FFL_IFormFiller.cpp b/fpdfsdk/src/formfiller/FFL_IFormFiller.cpp deleted file mode 100644 index 75f18e7c73..0000000000 --- a/fpdfsdk/src/formfiller/FFL_IFormFiller.cpp +++ /dev/null @@ -1,1015 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "fpdfsdk/include/formfiller/FFL_IFormFiller.h" - -#include "core/include/fpdfapi/cpdf_document.h" -#include "fpdfsdk/include/formfiller/FFL_CheckBox.h" -#include "fpdfsdk/include/formfiller/FFL_ComboBox.h" -#include "fpdfsdk/include/formfiller/FFL_FormFiller.h" -#include "fpdfsdk/include/formfiller/FFL_ListBox.h" -#include "fpdfsdk/include/formfiller/FFL_PushButton.h" -#include "fpdfsdk/include/formfiller/FFL_RadioButton.h" -#include "fpdfsdk/include/formfiller/FFL_TextField.h" -#include "fpdfsdk/include/fsdk_mgr.h" -#include "fpdfsdk/include/pdfwindow/PWL_Utils.h" - -#define FFL_MAXLISTBOXHEIGHT 140.0f - -CFFL_IFormFiller::CFFL_IFormFiller(CPDFDoc_Environment* pApp) - : m_pApp(pApp), m_bNotifying(FALSE) {} - -CFFL_IFormFiller::~CFFL_IFormFiller() { - for (auto& it : m_Maps) - delete it.second; - m_Maps.clear(); -} - -FX_BOOL CFFL_IFormFiller::Annot_HitTest(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - CFX_FloatPoint point) { - CFX_FloatRect rc = pAnnot->GetRect(); - if (rc.Contains(point.x, point.y)) - return TRUE; - return FALSE; -} - -FX_RECT CFFL_IFormFiller::GetViewBBox(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot) { - if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE)) - return pFormFiller->GetViewBBox(pPageView, pAnnot); - - ASSERT(pPageView); - - CPDF_Annot* pPDFAnnot = pAnnot->GetPDFAnnot(); - CFX_FloatRect rcAnnot; - pPDFAnnot->GetRect(rcAnnot); - - CFX_FloatRect rcWin = CPWL_Utils::InflateRect(rcAnnot, 1); - return rcWin.GetOutterRect(); -} - -void CFFL_IFormFiller::OnDraw(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - CFX_RenderDevice* pDevice, - CFX_Matrix* pUser2Device, - FX_DWORD dwFlags) { - ASSERT(pPageView); - CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot; - - if (IsVisible(pWidget)) { - if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE)) { - if (pFormFiller->IsValid()) { - pFormFiller->OnDraw(pPageView, pAnnot, pDevice, pUser2Device, dwFlags); - pAnnot->GetPDFPage(); - - CPDFSDK_Document* pDocument = m_pApp->GetSDKDocument(); - if (pDocument->GetFocusAnnot() == pAnnot) { - CFX_FloatRect rcFocus = pFormFiller->GetFocusBox(pPageView); - if (!rcFocus.IsEmpty()) { - CFX_PathData path; - path.SetPointCount(5); - path.SetPoint(0, rcFocus.left, rcFocus.top, FXPT_MOVETO); - path.SetPoint(1, rcFocus.left, rcFocus.bottom, FXPT_LINETO); - path.SetPoint(2, rcFocus.right, rcFocus.bottom, FXPT_LINETO); - path.SetPoint(3, rcFocus.right, rcFocus.top, FXPT_LINETO); - path.SetPoint(4, rcFocus.left, rcFocus.top, FXPT_LINETO); - - CFX_GraphStateData gsd; - gsd.SetDashCount(1); - gsd.m_DashArray[0] = 1.0f; - gsd.m_DashPhase = 0; - gsd.m_LineWidth = 1.0f; - pDevice->DrawPath(&path, pUser2Device, &gsd, 0, - ArgbEncode(255, 0, 0, 0), FXFILL_ALTERNATE); - } - } - return; - } - } - - if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE)) - pFormFiller->OnDrawDeactive(pPageView, pAnnot, pDevice, pUser2Device, - dwFlags); - else - pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL); - - if (!IsReadOnly(pWidget) && IsFillingAllowed(pWidget)) - pWidget->DrawShadow(pDevice, pPageView); - } -} - -void CFFL_IFormFiller::OnCreate(CPDFSDK_Annot* pAnnot) { - if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE)) { - pFormFiller->OnCreate(pAnnot); - } -} - -void CFFL_IFormFiller::OnLoad(CPDFSDK_Annot* pAnnot) { - if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE)) { - pFormFiller->OnLoad(pAnnot); - } -} - -void CFFL_IFormFiller::OnDelete(CPDFSDK_Annot* pAnnot) { - if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE)) { - pFormFiller->OnDelete(pAnnot); - } - - UnRegisterFormFiller(pAnnot); -} - -void CFFL_IFormFiller::OnMouseEnter(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - FX_UINT nFlag) { - ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget"); - - if (!m_bNotifying) { - CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot; - if (pWidget->GetAAction(CPDF_AAction::CursorEnter).GetDict()) { - m_bNotifying = TRUE; - - int nValueAge = pWidget->GetValueAge(); - - pWidget->ClearAppModified(); - - ASSERT(pPageView); - - PDFSDK_FieldAction fa; - fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag); - fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag); - pWidget->OnAAction(CPDF_AAction::CursorEnter, fa, pPageView); - m_bNotifying = FALSE; - - if (pWidget->IsAppModified()) { - if (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE)) { - pFormFiller->ResetPDFWindow(pPageView, - pWidget->GetValueAge() == nValueAge); - } - } - } - } - - if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, TRUE)) { - pFormFiller->OnMouseEnter(pPageView, pAnnot); - } -} - -void CFFL_IFormFiller::OnMouseExit(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - FX_UINT nFlag) { - ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget"); - - if (!m_bNotifying) { - CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot; - if (pWidget->GetAAction(CPDF_AAction::CursorExit).GetDict()) { - m_bNotifying = TRUE; - pWidget->GetAppearanceAge(); - int nValueAge = pWidget->GetValueAge(); - pWidget->ClearAppModified(); - - ASSERT(pPageView); - - PDFSDK_FieldAction fa; - fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag); - fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag); - - pWidget->OnAAction(CPDF_AAction::CursorExit, fa, pPageView); - m_bNotifying = FALSE; - - if (pWidget->IsAppModified()) { - if (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE)) { - pFormFiller->ResetPDFWindow(pPageView, - nValueAge == pWidget->GetValueAge()); - } - } - } - } - - if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE)) { - pFormFiller->OnMouseExit(pPageView, pAnnot); - } -} - -FX_BOOL CFFL_IFormFiller::OnLButtonDown(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - FX_UINT nFlags, - const CFX_FloatPoint& point) { - ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget"); - - if (!m_bNotifying) { - CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot; - if (Annot_HitTest(pPageView, pAnnot, point) && - pWidget->GetAAction(CPDF_AAction::ButtonDown).GetDict()) { - m_bNotifying = TRUE; - pWidget->GetAppearanceAge(); - int nValueAge = pWidget->GetValueAge(); - pWidget->ClearAppModified(); - - ASSERT(pPageView); - - PDFSDK_FieldAction fa; - fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlags); - fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlags); - pWidget->OnAAction(CPDF_AAction::ButtonDown, fa, pPageView); - m_bNotifying = FALSE; - - if (!IsValidAnnot(pPageView, pAnnot)) - return TRUE; - - if (pWidget->IsAppModified()) { - if (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE)) { - pFormFiller->ResetPDFWindow(pPageView, - nValueAge == pWidget->GetValueAge()); - } - } - } - } - - if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE)) { - return pFormFiller->OnLButtonDown(pPageView, pAnnot, nFlags, point); - } - - return FALSE; -} - -FX_BOOL CFFL_IFormFiller::OnLButtonUp(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - FX_UINT nFlags, - const CFX_FloatPoint& point) { - ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget"); - CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot; - CPDFSDK_Document* pDocument = m_pApp->GetSDKDocument(); - - switch (pWidget->GetFieldType()) { - case FIELDTYPE_PUSHBUTTON: - case FIELDTYPE_CHECKBOX: - case FIELDTYPE_RADIOBUTTON: - if (GetViewBBox(pPageView, pAnnot).Contains((int)point.x, (int)point.y)) - pDocument->SetFocusAnnot(pAnnot); - break; - default: - pDocument->SetFocusAnnot(pAnnot); - break; - } - - FX_BOOL bRet = FALSE; - - if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE)) { - bRet = pFormFiller->OnLButtonUp(pPageView, pAnnot, nFlags, point); - } - - if (pDocument->GetFocusAnnot() == pAnnot) { - FX_BOOL bExit = FALSE; - FX_BOOL bReset = FALSE; - OnButtonUp(pWidget, pPageView, bReset, bExit, nFlags); - if (bExit) - return TRUE; -#ifdef PDF_ENABLE_XFA - OnClick(pWidget, pPageView, bReset, bExit, nFlags); - if (bExit) - return TRUE; -#endif // PDF_ENABLE_XFA - } - return bRet; -} - -void CFFL_IFormFiller::OnButtonUp(CPDFSDK_Widget* pWidget, - CPDFSDK_PageView* pPageView, - FX_BOOL& bReset, - FX_BOOL& bExit, - FX_UINT nFlag) { - ASSERT(pWidget); - - if (!m_bNotifying) { - if (pWidget->GetAAction(CPDF_AAction::ButtonUp).GetDict()) { - m_bNotifying = TRUE; - int nAge = pWidget->GetAppearanceAge(); - int nValueAge = pWidget->GetValueAge(); - - ASSERT(pPageView); - - PDFSDK_FieldAction fa; - fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag); - fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag); - - pWidget->OnAAction(CPDF_AAction::ButtonUp, fa, pPageView); - m_bNotifying = FALSE; - - if (!IsValidAnnot(pPageView, pWidget)) { - bExit = TRUE; - return; - } - - if (nAge != pWidget->GetAppearanceAge()) { - if (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE)) { - pFormFiller->ResetPDFWindow(pPageView, - nValueAge == pWidget->GetValueAge()); - } - - bReset = TRUE; - } - } - } -} - -FX_BOOL CFFL_IFormFiller::OnLButtonDblClk(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - FX_UINT nFlags, - const CFX_FloatPoint& point) { - ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget"); - - if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE)) { - return pFormFiller->OnLButtonDblClk(pPageView, pAnnot, nFlags, point); - } - - return FALSE; -} - -FX_BOOL CFFL_IFormFiller::OnMouseMove(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - FX_UINT nFlags, - const CFX_FloatPoint& point) { - ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget"); - - // change cursor - if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, TRUE)) { - return pFormFiller->OnMouseMove(pPageView, pAnnot, nFlags, point); - } - - return FALSE; -} - -FX_BOOL CFFL_IFormFiller::OnMouseWheel(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - FX_UINT nFlags, - short zDelta, - const CFX_FloatPoint& point) { - ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget"); - - if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE)) { - return pFormFiller->OnMouseWheel(pPageView, pAnnot, nFlags, zDelta, point); - } - - return FALSE; -} - -FX_BOOL CFFL_IFormFiller::OnRButtonDown(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - FX_UINT nFlags, - const CFX_FloatPoint& point) { - ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget"); - - if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE)) { - return pFormFiller->OnRButtonDown(pPageView, pAnnot, nFlags, point); - } - - return FALSE; -} - -FX_BOOL CFFL_IFormFiller::OnRButtonUp(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - FX_UINT nFlags, - const CFX_FloatPoint& point) { - ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget"); - - if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE)) { - return pFormFiller->OnRButtonUp(pPageView, pAnnot, nFlags, point); - } - - return FALSE; -} - -FX_BOOL CFFL_IFormFiller::OnKeyDown(CPDFSDK_Annot* pAnnot, - FX_UINT nKeyCode, - FX_UINT nFlags) { - ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget"); - - if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE)) { - return pFormFiller->OnKeyDown(pAnnot, nKeyCode, nFlags); - } - - return FALSE; -} - -FX_BOOL CFFL_IFormFiller::OnChar(CPDFSDK_Annot* pAnnot, - FX_UINT nChar, - FX_UINT nFlags) { - ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget"); - if (nChar == FWL_VKEY_Tab) - return TRUE; - - if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE)) - return pFormFiller->OnChar(pAnnot, nChar, nFlags); - - return FALSE; -} - -FX_BOOL CFFL_IFormFiller::OnSetFocus(CPDFSDK_Annot* pAnnot, FX_UINT nFlag) { - if (!pAnnot) - return FALSE; - - ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget"); - - if (!m_bNotifying) { - CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot; - if (pWidget->GetAAction(CPDF_AAction::GetFocus).GetDict()) { - m_bNotifying = TRUE; - pWidget->GetAppearanceAge(); - - int nValueAge = pWidget->GetValueAge(); - pWidget->ClearAppModified(); - - CPDFSDK_PageView* pPageView = pAnnot->GetPageView(); - ASSERT(pPageView); - - PDFSDK_FieldAction fa; - fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag); - fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag); - - CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, TRUE); - if (!pFormFiller) - return FALSE; - pFormFiller->GetActionData(pPageView, CPDF_AAction::GetFocus, fa); - pWidget->OnAAction(CPDF_AAction::GetFocus, fa, pPageView); - m_bNotifying = FALSE; - - if (pWidget->IsAppModified()) { - if (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE)) { - pFormFiller->ResetPDFWindow(pPageView, - nValueAge == pWidget->GetValueAge()); - } - } - } - } - - if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, TRUE)) - pFormFiller->SetFocusForAnnot(pAnnot, nFlag); - - return TRUE; -} - -FX_BOOL CFFL_IFormFiller::OnKillFocus(CPDFSDK_Annot* pAnnot, FX_UINT nFlag) { - if (!pAnnot) - return FALSE; - ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget"); - - if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE)) { - pFormFiller->KillFocusForAnnot(pAnnot, nFlag); - - if (!m_bNotifying) { - CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot; - if (pWidget->GetAAction(CPDF_AAction::LoseFocus).GetDict()) { - m_bNotifying = TRUE; - pWidget->ClearAppModified(); - - CPDFSDK_PageView* pPageView = pWidget->GetPageView(); - ASSERT(pPageView); - - PDFSDK_FieldAction fa; - fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag); - fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag); - - pFormFiller->GetActionData(pPageView, CPDF_AAction::LoseFocus, fa); - - pWidget->OnAAction(CPDF_AAction::LoseFocus, fa, pPageView); - m_bNotifying = FALSE; - } - } - } - - return TRUE; -} - -FX_BOOL CFFL_IFormFiller::IsVisible(CPDFSDK_Widget* pWidget) { - return pWidget->IsVisible(); -} - -FX_BOOL CFFL_IFormFiller::IsReadOnly(CPDFSDK_Widget* pWidget) { - int nFieldFlags = pWidget->GetFieldFlags(); - return (nFieldFlags & FIELDFLAG_READONLY) == FIELDFLAG_READONLY; -} - -FX_BOOL CFFL_IFormFiller::IsFillingAllowed(CPDFSDK_Widget* pWidget) { - if (pWidget->GetFieldType() == FIELDTYPE_PUSHBUTTON) - return TRUE; - - CPDF_Page* pPage = pWidget->GetPDFPage(); - CPDF_Document* pDocument = pPage->m_pDocument; - FX_DWORD dwPermissions = pDocument->GetUserPermissions(); - return (dwPermissions & FPDFPERM_FILL_FORM) || - (dwPermissions & FPDFPERM_ANNOT_FORM) || - (dwPermissions & FPDFPERM_MODIFY); -} - -CFFL_FormFiller* CFFL_IFormFiller::GetFormFiller(CPDFSDK_Annot* pAnnot, - FX_BOOL bRegister) { - auto it = m_Maps.find(pAnnot); - if (it != m_Maps.end()) - return it->second; - - if (!bRegister) - return nullptr; - - CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot; - int nFieldType = pWidget->GetFieldType(); - CFFL_FormFiller* pFormFiller; - switch (nFieldType) { - case FIELDTYPE_PUSHBUTTON: - pFormFiller = new CFFL_PushButton(m_pApp, pWidget); - break; - case FIELDTYPE_CHECKBOX: - pFormFiller = new CFFL_CheckBox(m_pApp, pWidget); - break; - case FIELDTYPE_RADIOBUTTON: - pFormFiller = new CFFL_RadioButton(m_pApp, pWidget); - break; - case FIELDTYPE_TEXTFIELD: - pFormFiller = new CFFL_TextField(m_pApp, pWidget); - break; - case FIELDTYPE_LISTBOX: - pFormFiller = new CFFL_ListBox(m_pApp, pWidget); - break; - case FIELDTYPE_COMBOBOX: - pFormFiller = new CFFL_ComboBox(m_pApp, pWidget); - break; - case FIELDTYPE_UNKNOWN: - default: - pFormFiller = nullptr; - break; - } - - if (!pFormFiller) - return nullptr; - - m_Maps[pAnnot] = pFormFiller; - return pFormFiller; -} - -void CFFL_IFormFiller::RemoveFormFiller(CPDFSDK_Annot* pAnnot) { - if (pAnnot) { - UnRegisterFormFiller(pAnnot); - } -} - -void CFFL_IFormFiller::UnRegisterFormFiller(CPDFSDK_Annot* pAnnot) { - auto it = m_Maps.find(pAnnot); - if (it == m_Maps.end()) - return; - - delete it->second; - m_Maps.erase(it); -} - -void CFFL_IFormFiller::QueryWherePopup(void* pPrivateData, - FX_FLOAT fPopupMin, - FX_FLOAT fPopupMax, - int32_t& nRet, - FX_FLOAT& fPopupRet) { - CFFL_PrivateData* pData = (CFFL_PrivateData*)pPrivateData; - - CFX_FloatRect rcPageView(0, 0, 0, 0); - rcPageView.right = pData->pWidget->GetPDFPage()->GetPageWidth(); - rcPageView.bottom = pData->pWidget->GetPDFPage()->GetPageHeight(); - rcPageView.Normalize(); - - CFX_FloatRect rcAnnot = pData->pWidget->GetRect(); - - FX_FLOAT fTop = 0.0f; - FX_FLOAT fBottom = 0.0f; - - CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pData->pWidget; - switch (pWidget->GetRotate() / 90) { - default: - case 0: - fTop = rcPageView.top - rcAnnot.top; - fBottom = rcAnnot.bottom - rcPageView.bottom; - break; - case 1: - fTop = rcAnnot.left - rcPageView.left; - fBottom = rcPageView.right - rcAnnot.right; - break; - case 2: - fTop = rcAnnot.bottom - rcPageView.bottom; - fBottom = rcPageView.top - rcAnnot.top; - break; - case 3: - fTop = rcPageView.right - rcAnnot.right; - fBottom = rcAnnot.left - rcPageView.left; - break; - } - - FX_FLOAT fFactHeight = 0; - FX_BOOL bBottom = TRUE; - FX_FLOAT fMaxListBoxHeight = 0; - if (fPopupMax > FFL_MAXLISTBOXHEIGHT) { - if (fPopupMin > FFL_MAXLISTBOXHEIGHT) { - fMaxListBoxHeight = fPopupMin; - } else { - fMaxListBoxHeight = FFL_MAXLISTBOXHEIGHT; - } - } else { - fMaxListBoxHeight = fPopupMax; - } - - if (fBottom > fMaxListBoxHeight) { - fFactHeight = fMaxListBoxHeight; - bBottom = TRUE; - } else { - if (fTop > fMaxListBoxHeight) { - fFactHeight = fMaxListBoxHeight; - bBottom = FALSE; - } else { - if (fTop > fBottom) { - fFactHeight = fTop; - bBottom = FALSE; - } else { - fFactHeight = fBottom; - bBottom = TRUE; - } - } - } - - nRet = bBottom ? 0 : 1; - fPopupRet = fFactHeight; -} - -void CFFL_IFormFiller::OnKeyStrokeCommit(CPDFSDK_Widget* pWidget, - CPDFSDK_PageView* pPageView, - FX_BOOL& bRC, - FX_BOOL& bExit, - FX_DWORD nFlag) { - if (!m_bNotifying) { - if (pWidget->GetAAction(CPDF_AAction::KeyStroke).GetDict()) { - m_bNotifying = TRUE; - pWidget->ClearAppModified(); - - ASSERT(pPageView); - - PDFSDK_FieldAction fa; - fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag); - fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag); - fa.bWillCommit = TRUE; - fa.bKeyDown = TRUE; - fa.bRC = TRUE; - - CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE); - pFormFiller->GetActionData(pPageView, CPDF_AAction::KeyStroke, fa); - pFormFiller->SaveState(pPageView); - - PDFSDK_FieldAction faOld = fa; - pWidget->OnAAction(CPDF_AAction::KeyStroke, fa, pPageView); - - bRC = fa.bRC; - m_bNotifying = FALSE; - } - } -} - -void CFFL_IFormFiller::OnValidate(CPDFSDK_Widget* pWidget, - CPDFSDK_PageView* pPageView, - FX_BOOL& bRC, - FX_BOOL& bExit, - FX_DWORD nFlag) { - if (!m_bNotifying) { - if (pWidget->GetAAction(CPDF_AAction::Validate).GetDict()) { - m_bNotifying = TRUE; - pWidget->ClearAppModified(); - - ASSERT(pPageView); - - PDFSDK_FieldAction fa; - fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag); - fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag); - fa.bKeyDown = TRUE; - fa.bRC = TRUE; - - CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE); - pFormFiller->GetActionData(pPageView, CPDF_AAction::Validate, fa); - pFormFiller->SaveState(pPageView); - - PDFSDK_FieldAction faOld = fa; - pWidget->OnAAction(CPDF_AAction::Validate, fa, pPageView); - - bRC = fa.bRC; - m_bNotifying = FALSE; - } - } -} - -void CFFL_IFormFiller::OnCalculate(CPDFSDK_Widget* pWidget, - CPDFSDK_PageView* pPageView, - FX_BOOL& bExit, - FX_DWORD nFlag) { - if (!m_bNotifying) { - ASSERT(pWidget); - CPDFSDK_Document* pDocument = pPageView->GetSDKDocument(); - CPDFSDK_InterForm* pInterForm = - (CPDFSDK_InterForm*)pDocument->GetInterForm(); - pInterForm->OnCalculate(pWidget->GetFormField()); - - m_bNotifying = FALSE; - } -} - -void CFFL_IFormFiller::OnFormat(CPDFSDK_Widget* pWidget, - CPDFSDK_PageView* pPageView, - FX_BOOL& bExit, - FX_DWORD nFlag) { - if (!m_bNotifying) { - ASSERT(pWidget); - CPDFSDK_Document* pDocument = pPageView->GetSDKDocument(); - CPDFSDK_InterForm* pInterForm = - (CPDFSDK_InterForm*)pDocument->GetInterForm(); - - FX_BOOL bFormated = FALSE; - CFX_WideString sValue = - pInterForm->OnFormat(pWidget->GetFormField(), bFormated); - - if (bExit) - return; - - if (bFormated) { - pInterForm->ResetFieldAppearance(pWidget->GetFormField(), sValue.c_str(), - TRUE); - pInterForm->UpdateField(pWidget->GetFormField()); - } - - m_bNotifying = FALSE; - } -} - -#ifdef PDF_ENABLE_XFA -void CFFL_IFormFiller::OnClick(CPDFSDK_Widget* pWidget, - CPDFSDK_PageView* pPageView, - FX_BOOL& bReset, - FX_BOOL& bExit, - FX_UINT nFlag) { - if (!m_bNotifying) { - if (pWidget->HasXFAAAction(PDFSDK_XFA_Click)) { - m_bNotifying = TRUE; - int nAge = pWidget->GetAppearanceAge(); - int nValueAge = pWidget->GetValueAge(); - - PDFSDK_FieldAction fa; - fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag); - fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag); - - pWidget->OnXFAAAction(PDFSDK_XFA_Click, fa, pPageView); - m_bNotifying = FALSE; - - if (!IsValidAnnot(pPageView, pWidget)) { - bExit = TRUE; - return; - } - - if (nAge != pWidget->GetAppearanceAge()) { - if (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE)) { - pFormFiller->ResetPDFWindow(pPageView, - nValueAge == pWidget->GetValueAge()); - } - - bReset = TRUE; - } - } - } -} - -void CFFL_IFormFiller::OnFull(CPDFSDK_Widget* pWidget, - CPDFSDK_PageView* pPageView, - FX_BOOL& bReset, - FX_BOOL& bExit, - FX_UINT nFlag) { - if (!m_bNotifying) { - if (pWidget->HasXFAAAction(PDFSDK_XFA_Full)) { - m_bNotifying = TRUE; - int nAge = pWidget->GetAppearanceAge(); - int nValueAge = pWidget->GetValueAge(); - - PDFSDK_FieldAction fa; - fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag); - fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag); - - pWidget->OnXFAAAction(PDFSDK_XFA_Full, fa, pPageView); - m_bNotifying = FALSE; - - if (!IsValidAnnot(pPageView, pWidget)) { - bExit = TRUE; - return; - } - - if (nAge != pWidget->GetAppearanceAge()) { - if (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE)) { - pFormFiller->ResetPDFWindow(pPageView, - nValueAge == pWidget->GetValueAge()); - } - - bReset = TRUE; - } - } - } -} - -void CFFL_IFormFiller::OnPopupPreOpen(void* pPrivateData, - FX_BOOL& bExit, - FX_DWORD nFlag) { - CFFL_PrivateData* pData = (CFFL_PrivateData*)pPrivateData; - ASSERT(pData); - ASSERT(pData->pWidget); - - FX_BOOL bTempReset = FALSE; - FX_BOOL bTempExit = FALSE; - OnPreOpen(pData->pWidget, pData->pPageView, bTempReset, bTempExit, nFlag); - - if (bTempReset || bTempExit) { - bExit = TRUE; - } -} - -void CFFL_IFormFiller::OnPopupPostOpen(void* pPrivateData, - FX_BOOL& bExit, - FX_DWORD nFlag) { - CFFL_PrivateData* pData = (CFFL_PrivateData*)pPrivateData; - ASSERT(pData); - ASSERT(pData->pWidget); - - FX_BOOL bTempReset = FALSE; - FX_BOOL bTempExit = FALSE; - OnPostOpen(pData->pWidget, pData->pPageView, bTempReset, bTempExit, nFlag); - - if (bTempReset || bTempExit) { - bExit = TRUE; - } -} - -void CFFL_IFormFiller::OnPreOpen(CPDFSDK_Widget* pWidget, - CPDFSDK_PageView* pPageView, - FX_BOOL& bReset, - FX_BOOL& bExit, - FX_UINT nFlag) { - if (!m_bNotifying) { - if (pWidget->HasXFAAAction(PDFSDK_XFA_PreOpen)) { - m_bNotifying = TRUE; - int nAge = pWidget->GetAppearanceAge(); - int nValueAge = pWidget->GetValueAge(); - - PDFSDK_FieldAction fa; - fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag); - fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag); - - pWidget->OnXFAAAction(PDFSDK_XFA_PreOpen, fa, pPageView); - m_bNotifying = FALSE; - - if (!IsValidAnnot(pPageView, pWidget)) { - bExit = TRUE; - return; - } - - if (nAge != pWidget->GetAppearanceAge()) { - if (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE)) { - pFormFiller->ResetPDFWindow(pPageView, - nValueAge == pWidget->GetValueAge()); - } - - bReset = TRUE; - } - } - } -} - -void CFFL_IFormFiller::OnPostOpen(CPDFSDK_Widget* pWidget, - CPDFSDK_PageView* pPageView, - FX_BOOL& bReset, - FX_BOOL& bExit, - FX_UINT nFlag) { - if (!m_bNotifying) { - if (pWidget->HasXFAAAction(PDFSDK_XFA_PostOpen)) { - m_bNotifying = TRUE; - int nAge = pWidget->GetAppearanceAge(); - int nValueAge = pWidget->GetValueAge(); - - PDFSDK_FieldAction fa; - fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag); - fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag); - - pWidget->OnXFAAAction(PDFSDK_XFA_PostOpen, fa, pPageView); - m_bNotifying = FALSE; - - if (!IsValidAnnot(pPageView, pWidget)) { - bExit = TRUE; - return; - } - - if (nAge != pWidget->GetAppearanceAge()) { - if (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE)) { - pFormFiller->ResetPDFWindow(pPageView, - nValueAge == pWidget->GetValueAge()); - } - - bReset = TRUE; - } - } - } -} -#endif // PDF_ENABLE_XFA - -FX_BOOL CFFL_IFormFiller::IsValidAnnot(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot) { - if (pPageView) - return pPageView->IsValidAnnot(pAnnot->GetPDFAnnot()); - - return FALSE; -} - -void CFFL_IFormFiller::OnBeforeKeyStroke(void* pPrivateData, - CFX_WideString& strChange, - const CFX_WideString& strChangeEx, - int nSelStart, - int nSelEnd, - FX_BOOL bKeyDown, - FX_BOOL& bRC, - FX_BOOL& bExit, - FX_DWORD nFlag) { - CFFL_PrivateData* pData = (CFFL_PrivateData*)pPrivateData; - ASSERT(pData->pWidget); - - CFFL_FormFiller* pFormFiller = GetFormFiller(pData->pWidget, FALSE); - -#ifdef PDF_ENABLE_XFA - if (pFormFiller->IsFieldFull(pData->pPageView)) { - FX_BOOL bFullExit = FALSE; - FX_BOOL bFullReset = FALSE; - OnFull(pData->pWidget, pData->pPageView, bFullReset, bFullExit, nFlag); - - if (bFullReset || bFullExit) { - bExit = TRUE; - return; - } - } -#endif // PDF_ENABLE_XFA - - if (!m_bNotifying) { - if (pData->pWidget->GetAAction(CPDF_AAction::KeyStroke).GetDict()) { - m_bNotifying = TRUE; - int nAge = pData->pWidget->GetAppearanceAge(); - int nValueAge = pData->pWidget->GetValueAge(); - - CPDFSDK_Document* pDocument = pData->pPageView->GetSDKDocument(); - - PDFSDK_FieldAction fa; - fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag); - fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag); - fa.sChange = strChange; - fa.sChangeEx = strChangeEx; - fa.bKeyDown = bKeyDown; - fa.bWillCommit = FALSE; - fa.bRC = TRUE; - fa.nSelStart = nSelStart; - fa.nSelEnd = nSelEnd; - - pFormFiller->GetActionData(pData->pPageView, CPDF_AAction::KeyStroke, fa); - pFormFiller->SaveState(pData->pPageView); - - if (pData->pWidget->OnAAction(CPDF_AAction::KeyStroke, fa, - pData->pPageView)) { - if (!IsValidAnnot(pData->pPageView, pData->pWidget)) { - bExit = TRUE; - m_bNotifying = FALSE; - return; - } - - if (nAge != pData->pWidget->GetAppearanceAge()) { - CPWL_Wnd* pWnd = pFormFiller->ResetPDFWindow( - pData->pPageView, nValueAge == pData->pWidget->GetValueAge()); - pData = (CFFL_PrivateData*)pWnd->GetAttachedData(); - bExit = TRUE; - } - - if (fa.bRC) { - pFormFiller->SetActionData(pData->pPageView, CPDF_AAction::KeyStroke, - fa); - bRC = FALSE; - } else { - pFormFiller->RestoreState(pData->pPageView); - bRC = FALSE; - } - - if (pDocument->GetFocusAnnot() != pData->pWidget) { - pFormFiller->CommitData(pData->pPageView, nFlag); - bExit = TRUE; - } - } else { - if (!IsValidAnnot(pData->pPageView, pData->pWidget)) { - bExit = TRUE; - m_bNotifying = FALSE; - return; - } - } - - m_bNotifying = FALSE; - } - } -} diff --git a/fpdfsdk/src/formfiller/FFL_ListBox.cpp b/fpdfsdk/src/formfiller/FFL_ListBox.cpp deleted file mode 100644 index 638618f784..0000000000 --- a/fpdfsdk/src/formfiller/FFL_ListBox.cpp +++ /dev/null @@ -1,223 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "fpdfsdk/include/formfiller/FFL_ListBox.h" - -#include "fpdfsdk/include/formfiller/FFL_CBA_Fontmap.h" -#include "fpdfsdk/include/formfiller/FFL_FormFiller.h" -#include "fpdfsdk/include/formfiller/FFL_IFormFiller.h" -#include "fpdfsdk/include/fsdk_common.h" -#include "fpdfsdk/include/fsdk_mgr.h" -#include "fpdfsdk/include/pdfwindow/PWL_ListBox.h" - -#define FFL_DEFAULTLISTBOXFONTSIZE 12.0f - -CFFL_ListBox::CFFL_ListBox(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pWidget) - : CFFL_FormFiller(pApp, pWidget), m_pFontMap(NULL) {} - -CFFL_ListBox::~CFFL_ListBox() { - delete m_pFontMap; -} - -PWL_CREATEPARAM CFFL_ListBox::GetCreateParam() { - PWL_CREATEPARAM cp = CFFL_FormFiller::GetCreateParam(); - - FX_DWORD dwFieldFlag = m_pWidget->GetFieldFlags(); - - if (dwFieldFlag & FIELDFLAG_MULTISELECT) { - cp.dwFlags |= PLBS_MULTIPLESEL; - } - - cp.dwFlags |= PWS_VSCROLL; - - if (cp.dwFlags & PWS_AUTOFONTSIZE) - cp.fFontSize = FFL_DEFAULTLISTBOXFONTSIZE; - - if (!m_pFontMap) - m_pFontMap = new CBA_FontMap(m_pWidget, m_pApp->GetSysHandler()); - cp.pFontMap = m_pFontMap; - - return cp; -} - -CPWL_Wnd* CFFL_ListBox::NewPDFWindow(const PWL_CREATEPARAM& cp, - CPDFSDK_PageView* pPageView) { - CPWL_ListBox* pWnd = new CPWL_ListBox(); - pWnd->AttachFFLData(this); - pWnd->Create(cp); - - CFFL_IFormFiller* pIFormFiller = m_pApp->GetIFormFiller(); - pWnd->SetFillerNotify(pIFormFiller); - - for (int32_t i = 0, sz = m_pWidget->CountOptions(); i < sz; i++) - pWnd->AddString(m_pWidget->GetOptionLabel(i).c_str()); - - if (pWnd->HasFlag(PLBS_MULTIPLESEL)) { - m_OriginSelections.clear(); - - FX_BOOL bSetCaret = FALSE; - for (int32_t i = 0, sz = m_pWidget->CountOptions(); i < sz; i++) { - if (m_pWidget->IsOptionSelected(i)) { - if (!bSetCaret) { - pWnd->SetCaret(i); - bSetCaret = TRUE; - } - pWnd->Select(i); - m_OriginSelections.insert(i); - } - } - } else { - for (int i = 0, sz = m_pWidget->CountOptions(); i < sz; i++) { - if (m_pWidget->IsOptionSelected(i)) { - pWnd->Select(i); - break; - } - } - } - - pWnd->SetTopVisibleIndex(m_pWidget->GetTopVisibleIndex()); - - return pWnd; -} - -FX_BOOL CFFL_ListBox::OnChar(CPDFSDK_Annot* pAnnot, - FX_UINT nChar, - FX_UINT nFlags) { - return CFFL_FormFiller::OnChar(pAnnot, nChar, nFlags); -} - -FX_BOOL CFFL_ListBox::IsDataChanged(CPDFSDK_PageView* pPageView) { - CPWL_ListBox* pListBox = (CPWL_ListBox*)GetPDFWindow(pPageView, FALSE); - if (!pListBox) - return FALSE; - - if (m_pWidget->GetFieldFlags() & FIELDFLAG_MULTISELECT) { - size_t nSelCount = 0; - for (int32_t i = 0, sz = pListBox->GetCount(); i < sz; ++i) { - if (pListBox->IsItemSelected(i)) { - if (m_OriginSelections.count(i) == 0) - return TRUE; - - ++nSelCount; - } - } - - return nSelCount != m_OriginSelections.size(); - } - return pListBox->GetCurSel() != m_pWidget->GetSelectedIndex(0); -} - -void CFFL_ListBox::SaveData(CPDFSDK_PageView* pPageView) { - ASSERT(m_pWidget); - - if (CPWL_ListBox* pListBox = (CPWL_ListBox*)GetPDFWindow(pPageView, FALSE)) { - CFX_IntArray aOldSelect, aNewSelect; - - { - for (int i = 0, sz = m_pWidget->CountOptions(); i < sz; i++) { - if (m_pWidget->IsOptionSelected(i)) { - aOldSelect.Add(i); - } - } - } - - int32_t nNewTopIndex = pListBox->GetTopVisibleIndex(); - - m_pWidget->ClearSelection(FALSE); - - if (m_pWidget->GetFieldFlags() & FIELDFLAG_MULTISELECT) { - for (int32_t i = 0, sz = pListBox->GetCount(); i < sz; i++) { - if (pListBox->IsItemSelected(i)) { - m_pWidget->SetOptionSelection(i, TRUE, FALSE); - aNewSelect.Add(i); - } - } - } else { - m_pWidget->SetOptionSelection(pListBox->GetCurSel(), TRUE, FALSE); - aNewSelect.Add(pListBox->GetCurSel()); - } - - m_pWidget->SetTopVisibleIndex(nNewTopIndex); - m_pWidget->ResetFieldAppearance(TRUE); - m_pWidget->UpdateField(); - SetChangeMark(); - } -} - -void CFFL_ListBox::GetActionData(CPDFSDK_PageView* pPageView, - CPDF_AAction::AActionType type, - PDFSDK_FieldAction& fa) { - switch (type) { - case CPDF_AAction::Validate: - if (m_pWidget->GetFieldFlags() & FIELDFLAG_MULTISELECT) { - fa.sValue = L""; - } else { - if (CPWL_ListBox* pListBox = - (CPWL_ListBox*)GetPDFWindow(pPageView, FALSE)) { - int32_t nCurSel = pListBox->GetCurSel(); - if (nCurSel >= 0) - fa.sValue = m_pWidget->GetOptionLabel(nCurSel); - } - } - break; - case CPDF_AAction::LoseFocus: - case CPDF_AAction::GetFocus: - if (m_pWidget->GetFieldFlags() & FIELDFLAG_MULTISELECT) { - fa.sValue = L""; - } else { - int32_t nCurSel = m_pWidget->GetSelectedIndex(0); - if (nCurSel >= 0) - fa.sValue = m_pWidget->GetOptionLabel(nCurSel); - } - break; - default: - break; - } -} - -void CFFL_ListBox::SetActionData(CPDFSDK_PageView* pPageView, - CPDF_AAction::AActionType type, - const PDFSDK_FieldAction& fa) {} - -void CFFL_ListBox::SaveState(CPDFSDK_PageView* pPageView) { - ASSERT(pPageView); - - if (CPWL_ListBox* pListBox = (CPWL_ListBox*)GetPDFWindow(pPageView, FALSE)) { - for (int32_t i = 0, sz = pListBox->GetCount(); i < sz; i++) { - if (pListBox->IsItemSelected(i)) { - m_State.Add(i); - } - } - } -} - -void CFFL_ListBox::RestoreState(CPDFSDK_PageView* pPageView) { - if (CPWL_ListBox* pListBox = (CPWL_ListBox*)GetPDFWindow(pPageView, FALSE)) { - for (int i = 0, sz = m_State.GetSize(); i < sz; i++) - pListBox->Select(m_State[i]); - } -} - -CPWL_Wnd* CFFL_ListBox::ResetPDFWindow(CPDFSDK_PageView* pPageView, - FX_BOOL bRestoreValue) { - if (bRestoreValue) - SaveState(pPageView); - - DestroyPDFWindow(pPageView); - - CPWL_Wnd* pRet = NULL; - - if (bRestoreValue) { - RestoreState(pPageView); - pRet = GetPDFWindow(pPageView, FALSE); - } else { - pRet = GetPDFWindow(pPageView, TRUE); - } - - m_pWidget->UpdateField(); - - return pRet; -} diff --git a/fpdfsdk/src/formfiller/FFL_PushButton.cpp b/fpdfsdk/src/formfiller/FFL_PushButton.cpp deleted file mode 100644 index d5bd509718..0000000000 --- a/fpdfsdk/src/formfiller/FFL_PushButton.cpp +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "fpdfsdk/include/formfiller/FFL_PushButton.h" - -#include "fpdfsdk/include/formfiller/FFL_FormFiller.h" -#include "fpdfsdk/include/pdfwindow/PWL_SpecialButton.h" - -CFFL_PushButton::CFFL_PushButton(CPDFDoc_Environment* pApp, - CPDFSDK_Annot* pAnnot) - : CFFL_Button(pApp, pAnnot) {} - -CFFL_PushButton::~CFFL_PushButton() {} - -CPWL_Wnd* CFFL_PushButton::NewPDFWindow(const PWL_CREATEPARAM& cp, - CPDFSDK_PageView* pPageView) { - CPWL_PushButton* pWnd = new CPWL_PushButton(); - pWnd->Create(cp); - - return pWnd; -} - -FX_BOOL CFFL_PushButton::OnChar(CPDFSDK_Annot* pAnnot, - FX_UINT nChar, - FX_UINT nFlags) { - return CFFL_FormFiller::OnChar(pAnnot, nChar, nFlags); -} - -void CFFL_PushButton::OnDraw(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - CFX_RenderDevice* pDevice, - CFX_Matrix* pUser2Device, - FX_DWORD dwFlags) { - CFFL_Button::OnDraw(pPageView, pAnnot, pDevice, pUser2Device, dwFlags); -} diff --git a/fpdfsdk/src/formfiller/FFL_RadioButton.cpp b/fpdfsdk/src/formfiller/FFL_RadioButton.cpp deleted file mode 100644 index 029bcf1a17..0000000000 --- a/fpdfsdk/src/formfiller/FFL_RadioButton.cpp +++ /dev/null @@ -1,121 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "fpdfsdk/include/formfiller/FFL_RadioButton.h" - -#include "fpdfsdk/include/formfiller/FFL_FormFiller.h" -#include "fpdfsdk/include/fsdk_mgr.h" -#include "fpdfsdk/include/pdfwindow/PWL_SpecialButton.h" - -CFFL_RadioButton::CFFL_RadioButton(CPDFDoc_Environment* pApp, - CPDFSDK_Annot* pWidget) - : CFFL_Button(pApp, pWidget) {} - -CFFL_RadioButton::~CFFL_RadioButton() {} - -CPWL_Wnd* CFFL_RadioButton::NewPDFWindow(const PWL_CREATEPARAM& cp, - CPDFSDK_PageView* pPageView) { - CPWL_RadioButton* pWnd = new CPWL_RadioButton(); - pWnd->Create(cp); - - pWnd->SetCheck(m_pWidget->IsChecked()); - - return pWnd; -} - -FX_BOOL CFFL_RadioButton::OnKeyDown(CPDFSDK_Annot* pAnnot, - FX_UINT nKeyCode, - FX_UINT nFlags) { - switch (nKeyCode) { - case FWL_VKEY_Return: - case FWL_VKEY_Space: - return TRUE; - default: - return CFFL_FormFiller::OnKeyDown(pAnnot, nKeyCode, nFlags); - } -} - -FX_BOOL CFFL_RadioButton::OnChar(CPDFSDK_Annot* pAnnot, - FX_UINT nChar, - FX_UINT nFlags) { - switch (nChar) { - case FWL_VKEY_Return: - case FWL_VKEY_Space: { - CFFL_IFormFiller* pIFormFiller = m_pApp->GetIFormFiller(); - CPDFSDK_PageView* pPageView = pAnnot->GetPageView(); - ASSERT(pPageView); - - FX_BOOL bReset = FALSE; - FX_BOOL bExit = FALSE; - - pIFormFiller->OnButtonUp(m_pWidget, pPageView, bReset, bExit, nFlags); - - if (bReset) - return TRUE; - if (bExit) - return TRUE; - - CFFL_FormFiller::OnChar(pAnnot, nChar, nFlags); - - if (CPWL_RadioButton* pWnd = - (CPWL_RadioButton*)GetPDFWindow(pPageView, TRUE)) - pWnd->SetCheck(TRUE); - CommitData(pPageView, nFlags); - return TRUE; - } - default: - return CFFL_FormFiller::OnChar(pAnnot, nChar, nFlags); - } -} - -FX_BOOL CFFL_RadioButton::OnLButtonUp(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - FX_UINT nFlags, - const CFX_FloatPoint& point) { - CFFL_Button::OnLButtonUp(pPageView, pAnnot, nFlags, point); - - if (IsValid()) { - if (CPWL_RadioButton* pWnd = - (CPWL_RadioButton*)GetPDFWindow(pPageView, TRUE)) - pWnd->SetCheck(TRUE); - - if (!CommitData(pPageView, nFlags)) - return FALSE; - } - - return TRUE; -} - -FX_BOOL CFFL_RadioButton::IsDataChanged(CPDFSDK_PageView* pPageView) { - if (CPWL_RadioButton* pWnd = - (CPWL_RadioButton*)GetPDFWindow(pPageView, FALSE)) { - return pWnd->IsChecked() != m_pWidget->IsChecked(); - } - - return FALSE; -} - -void CFFL_RadioButton::SaveData(CPDFSDK_PageView* pPageView) { - if (CPWL_RadioButton* pWnd = - (CPWL_RadioButton*)GetPDFWindow(pPageView, FALSE)) { - bool bNewChecked = pWnd->IsChecked(); - - if (bNewChecked) { - CPDF_FormField* pField = m_pWidget->GetFormField(); - for (int32_t i = 0, sz = pField->CountControls(); i < sz; i++) { - if (CPDF_FormControl* pCtrl = pField->GetControl(i)) { - if (pCtrl->IsChecked()) { - break; - } - } - } - } - - m_pWidget->SetCheck(bNewChecked, false); - m_pWidget->UpdateField(); - SetChangeMark(); - } -} diff --git a/fpdfsdk/src/formfiller/FFL_TextField.cpp b/fpdfsdk/src/formfiller/FFL_TextField.cpp deleted file mode 100644 index 42f2aad48f..0000000000 --- a/fpdfsdk/src/formfiller/FFL_TextField.cpp +++ /dev/null @@ -1,292 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "fpdfsdk/include/formfiller/FFL_TextField.h" - -#include "fpdfsdk/include/formfiller/FFL_CBA_Fontmap.h" -#include "fpdfsdk/include/fsdk_common.h" -#include "fpdfsdk/include/fsdk_mgr.h" - -CFFL_TextField::CFFL_TextField(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pAnnot) - : CFFL_FormFiller(pApp, pAnnot), m_pFontMap(NULL) { - m_State.nStart = m_State.nEnd = 0; -} - -CFFL_TextField::~CFFL_TextField() { - for (const auto& it : m_Maps) - it.second->InvalidateFocusHandler(this); - delete m_pFontMap; -} - -PWL_CREATEPARAM CFFL_TextField::GetCreateParam() { - PWL_CREATEPARAM cp = CFFL_FormFiller::GetCreateParam(); - - int nFlags = m_pWidget->GetFieldFlags(); - - if (nFlags & FIELDFLAG_PASSWORD) { - cp.dwFlags |= PES_PASSWORD; - } - - if (!(nFlags & FIELDFLAG_DONOTSPELLCHECK)) { - } - - if (nFlags & FIELDFLAG_MULTILINE) { - cp.dwFlags |= PES_MULTILINE | PES_AUTORETURN | PES_TOP; - - if (!(nFlags & FIELDFLAG_DONOTSCROLL)) { - cp.dwFlags |= PWS_VSCROLL | PES_AUTOSCROLL; - } - } else { - cp.dwFlags |= PES_CENTER; - - if (!(nFlags & FIELDFLAG_DONOTSCROLL)) { - cp.dwFlags |= PES_AUTOSCROLL; - } - } - - if (nFlags & FIELDFLAG_COMB) { - cp.dwFlags |= PES_CHARARRAY; - } - - if (nFlags & FIELDFLAG_RICHTEXT) { - cp.dwFlags |= PES_RICH; - } - - cp.dwFlags |= PES_UNDO; - - switch (m_pWidget->GetAlignment()) { - default: - case BF_ALIGN_LEFT: - cp.dwFlags |= PES_LEFT; - break; - case BF_ALIGN_MIDDLE: - cp.dwFlags |= PES_MIDDLE; - break; - case BF_ALIGN_RIGHT: - cp.dwFlags |= PES_RIGHT; - break; - } - - if (!m_pFontMap) - m_pFontMap = new CBA_FontMap(m_pWidget, m_pApp->GetSysHandler()); - cp.pFontMap = m_pFontMap; - cp.pFocusHandler = this; - - return cp; -} - -CPWL_Wnd* CFFL_TextField::NewPDFWindow(const PWL_CREATEPARAM& cp, - CPDFSDK_PageView* pPageView) { - CPWL_Edit* pWnd = new CPWL_Edit(); - pWnd->AttachFFLData(this); - pWnd->Create(cp); - - CFFL_IFormFiller* pIFormFiller = m_pApp->GetIFormFiller(); - pWnd->SetFillerNotify(pIFormFiller); - - int32_t nMaxLen = m_pWidget->GetMaxLen(); - CFX_WideString swValue = m_pWidget->GetValue(); - - if (nMaxLen > 0) { - if (pWnd->HasFlag(PES_CHARARRAY)) { - pWnd->SetCharArray(nMaxLen); - pWnd->SetAlignFormatV(PEAV_CENTER); - } else { - pWnd->SetLimitChar(nMaxLen); - } - } - - pWnd->SetText(swValue.c_str()); - return pWnd; -} - -FX_BOOL CFFL_TextField::OnChar(CPDFSDK_Annot* pAnnot, - FX_UINT nChar, - FX_UINT nFlags) { - switch (nChar) { - case FWL_VKEY_Return: - if (!(m_pWidget->GetFieldFlags() & FIELDFLAG_MULTILINE)) { - CPDFSDK_PageView* pPageView = GetCurPageView(); - ASSERT(pPageView); - m_bValid = !m_bValid; - CFX_FloatRect rcAnnot = pAnnot->GetRect(); - m_pApp->FFI_Invalidate(pAnnot->GetUnderlyingPage(), rcAnnot.left, - rcAnnot.top, rcAnnot.right, rcAnnot.bottom); - - if (m_bValid) { - if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, TRUE)) - pWnd->SetFocus(); - } else { - if (CommitData(pPageView, nFlags)) { - DestroyPDFWindow(pPageView); - return TRUE; - } - return FALSE; - } - } - break; - case FWL_VKEY_Escape: { - CPDFSDK_PageView* pPageView = GetCurPageView(); - ASSERT(pPageView); - EscapeFiller(pPageView, TRUE); - return TRUE; - } - } - - return CFFL_FormFiller::OnChar(pAnnot, nChar, nFlags); -} - -FX_BOOL CFFL_TextField::IsDataChanged(CPDFSDK_PageView* pPageView) { - if (CPWL_Edit* pEdit = (CPWL_Edit*)GetPDFWindow(pPageView, FALSE)) - return pEdit->GetText() != m_pWidget->GetValue(); - - return FALSE; -} - -void CFFL_TextField::SaveData(CPDFSDK_PageView* pPageView) { - if (CPWL_Edit* pWnd = (CPWL_Edit*)GetPDFWindow(pPageView, FALSE)) { - CFX_WideString sOldValue = m_pWidget->GetValue(); - CFX_WideString sNewValue = pWnd->GetText(); - - m_pWidget->SetValue(sNewValue, FALSE); - m_pWidget->ResetFieldAppearance(TRUE); - m_pWidget->UpdateField(); - SetChangeMark(); - } -} - -void CFFL_TextField::GetActionData(CPDFSDK_PageView* pPageView, - CPDF_AAction::AActionType type, - PDFSDK_FieldAction& fa) { - switch (type) { - case CPDF_AAction::KeyStroke: - if (CPWL_Edit* pWnd = (CPWL_Edit*)GetPDFWindow(pPageView, FALSE)) { - fa.bFieldFull = pWnd->IsTextFull(); - - fa.sValue = pWnd->GetText(); - - if (fa.bFieldFull) { - fa.sChange = L""; - fa.sChangeEx = L""; - } - } - break; - case CPDF_AAction::Validate: - if (CPWL_Edit* pWnd = (CPWL_Edit*)GetPDFWindow(pPageView, FALSE)) { - fa.sValue = pWnd->GetText(); - } - break; - case CPDF_AAction::LoseFocus: - case CPDF_AAction::GetFocus: - fa.sValue = m_pWidget->GetValue(); - break; - default: - break; - } -} - -void CFFL_TextField::SetActionData(CPDFSDK_PageView* pPageView, - CPDF_AAction::AActionType type, - const PDFSDK_FieldAction& fa) { - switch (type) { - case CPDF_AAction::KeyStroke: - if (CPWL_Edit* pEdit = (CPWL_Edit*)GetPDFWindow(pPageView, FALSE)) { - pEdit->SetFocus(); - pEdit->SetSel(fa.nSelStart, fa.nSelEnd); - pEdit->ReplaceSel(fa.sChange.c_str()); - } - break; - default: - break; - } -} - -FX_BOOL CFFL_TextField::IsActionDataChanged(CPDF_AAction::AActionType type, - const PDFSDK_FieldAction& faOld, - const PDFSDK_FieldAction& faNew) { - switch (type) { - case CPDF_AAction::KeyStroke: - return (!faOld.bFieldFull && faOld.nSelEnd != faNew.nSelEnd) || - faOld.nSelStart != faNew.nSelStart || - faOld.sChange != faNew.sChange; - default: - break; - } - - return FALSE; -} - -void CFFL_TextField::SaveState(CPDFSDK_PageView* pPageView) { - ASSERT(pPageView); - - if (CPWL_Edit* pWnd = (CPWL_Edit*)GetPDFWindow(pPageView, FALSE)) { - pWnd->GetSel(m_State.nStart, m_State.nEnd); - m_State.sValue = pWnd->GetText(); - } -} - -void CFFL_TextField::RestoreState(CPDFSDK_PageView* pPageView) { - ASSERT(pPageView); - - if (CPWL_Edit* pWnd = (CPWL_Edit*)GetPDFWindow(pPageView, TRUE)) { - pWnd->SetText(m_State.sValue.c_str()); - pWnd->SetSel(m_State.nStart, m_State.nEnd); - } -} - -CPWL_Wnd* CFFL_TextField::ResetPDFWindow(CPDFSDK_PageView* pPageView, - FX_BOOL bRestoreValue) { - if (bRestoreValue) - SaveState(pPageView); - - DestroyPDFWindow(pPageView); - - CPWL_Wnd* pRet = NULL; - - if (bRestoreValue) { - RestoreState(pPageView); - pRet = GetPDFWindow(pPageView, FALSE); - } else { - pRet = GetPDFWindow(pPageView, TRUE); - } - - m_pWidget->UpdateField(); - - return pRet; -} - -#ifdef PDF_ENABLE_XFA -FX_BOOL CFFL_TextField::IsFieldFull(CPDFSDK_PageView* pPageView) { - if (CPWL_Edit* pWnd = (CPWL_Edit*)GetPDFWindow(pPageView, FALSE)) { - return pWnd->IsTextFull(); - } - - return FALSE; -} -#endif // PDF_ENABLE_XFA - -void CFFL_TextField::OnSetFocus(CPWL_Wnd* pWnd) { - ASSERT(m_pApp); - if (pWnd->GetClassName() == PWL_CLASSNAME_EDIT) { - CPWL_Edit* pEdit = (CPWL_Edit*)pWnd; - pEdit->SetCharSet(134); - pEdit->SetCodePage(936); - - pEdit->SetReadyToInput(); - CFX_WideString wsText = pEdit->GetText(); - int nCharacters = wsText.GetLength(); - CFX_ByteString bsUTFText = wsText.UTF16LE_Encode(); - unsigned short* pBuffer = (unsigned short*)bsUTFText.c_str(); - m_pApp->FFI_OnSetFieldInputFocus(m_pWidget->GetFormField(), pBuffer, - nCharacters, TRUE); - - pEdit->SetEditNotify(this); - } -} - -void CFFL_TextField::OnKillFocus(CPWL_Wnd* pWnd) {} - -void CFFL_TextField::OnAddUndo(CPWL_Edit* pEdit) {} diff --git a/fpdfsdk/src/fpdf_dataavail.cpp b/fpdfsdk/src/fpdf_dataavail.cpp deleted file mode 100644 index 6dc706a001..0000000000 --- a/fpdfsdk/src/fpdf_dataavail.cpp +++ /dev/null @@ -1,172 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "public/fpdf_dataavail.h" - -#include "core/include/fpdfapi/cpdf_document.h" -#include "core/include/fpdfapi/ipdf_data_avail.h" -#include "fpdfsdk/include/fsdk_define.h" -#include "public/fpdf_formfill.h" - -// These checks are here because core/ and public/ cannot depend on each other. -static_assert(IPDF_DataAvail::DataError == PDF_DATA_ERROR, - "IPDF_DataAvail::DataError value mismatch"); -static_assert(IPDF_DataAvail::DataNotAvailable == PDF_DATA_NOTAVAIL, - "IPDF_DataAvail::DataNotAvailable value mismatch"); -static_assert(IPDF_DataAvail::DataAvailable == PDF_DATA_AVAIL, - "IPDF_DataAvail::DataAvailable value mismatch"); - -static_assert(IPDF_DataAvail::LinearizationUnknown == PDF_LINEARIZATION_UNKNOWN, - "IPDF_DataAvail::LinearizationUnknown value mismatch"); -static_assert(IPDF_DataAvail::NotLinearized == PDF_NOT_LINEARIZED, - "IPDF_DataAvail::NotLinearized value mismatch"); -static_assert(IPDF_DataAvail::Linearized == PDF_LINEARIZED, - "IPDF_DataAvail::Linearized value mismatch"); - -static_assert(IPDF_DataAvail::FormError == PDF_FORM_ERROR, - "IPDF_DataAvail::FormError value mismatch"); -static_assert(IPDF_DataAvail::FormNotAvailable == PDF_FORM_NOTAVAIL, - "IPDF_DataAvail::FormNotAvailable value mismatch"); -static_assert(IPDF_DataAvail::FormAvailable == PDF_FORM_AVAIL, - "IPDF_DataAvail::FormAvailable value mismatch"); -static_assert(IPDF_DataAvail::FormNotExist == PDF_FORM_NOTEXIST, - "IPDF_DataAvail::FormNotExist value mismatch"); - -class CFPDF_FileAvailWrap : public IPDF_DataAvail::FileAvail { - public: - CFPDF_FileAvailWrap() { m_pfileAvail = NULL; } - ~CFPDF_FileAvailWrap() override {} - - void Set(FX_FILEAVAIL* pfileAvail) { m_pfileAvail = pfileAvail; } - - // IPDF_DataAvail::FileAvail: - FX_BOOL IsDataAvail(FX_FILESIZE offset, FX_DWORD size) override { - return m_pfileAvail->IsDataAvail(m_pfileAvail, offset, size); - } - - private: - FX_FILEAVAIL* m_pfileAvail; -}; - -class CFPDF_FileAccessWrap : public IFX_FileRead { - public: - CFPDF_FileAccessWrap() { m_pFileAccess = NULL; } - ~CFPDF_FileAccessWrap() override {} - - void Set(FPDF_FILEACCESS* pFile) { m_pFileAccess = pFile; } - - // IFX_FileRead - FX_FILESIZE GetSize() override { return m_pFileAccess->m_FileLen; } - - FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) override { - return m_pFileAccess->m_GetBlock(m_pFileAccess->m_Param, offset, - (uint8_t*)buffer, size); - } - - void Release() override {} - - private: - FPDF_FILEACCESS* m_pFileAccess; -}; - -class CFPDF_DownloadHintsWrap : public IPDF_DataAvail::DownloadHints { - public: - explicit CFPDF_DownloadHintsWrap(FX_DOWNLOADHINTS* pDownloadHints) { - m_pDownloadHints = pDownloadHints; - } - ~CFPDF_DownloadHintsWrap() override {} - - public: - // IFX_DownloadHints - void AddSegment(FX_FILESIZE offset, FX_DWORD size) override { - m_pDownloadHints->AddSegment(m_pDownloadHints, offset, size); - } - - private: - FX_DOWNLOADHINTS* m_pDownloadHints; -}; - -class CFPDF_DataAvail { - public: - CFPDF_DataAvail() { m_pDataAvail = NULL; } - - ~CFPDF_DataAvail() { delete m_pDataAvail; } - - IPDF_DataAvail* m_pDataAvail; - CFPDF_FileAvailWrap m_FileAvail; - CFPDF_FileAccessWrap m_FileRead; -}; - -DLLEXPORT FPDF_AVAIL STDCALL FPDFAvail_Create(FX_FILEAVAIL* file_avail, - FPDF_FILEACCESS* file) { - CFPDF_DataAvail* pAvail = new CFPDF_DataAvail; - pAvail->m_FileAvail.Set(file_avail); - pAvail->m_FileRead.Set(file); - pAvail->m_pDataAvail = - IPDF_DataAvail::Create(&pAvail->m_FileAvail, &pAvail->m_FileRead); - return pAvail; -} - -DLLEXPORT void STDCALL FPDFAvail_Destroy(FPDF_AVAIL avail) { - delete (CFPDF_DataAvail*)avail; -} - -DLLEXPORT int STDCALL -FPDFAvail_IsDocAvail(FPDF_AVAIL avail, FX_DOWNLOADHINTS* hints) { - if (!avail || !hints) - return PDF_DATA_ERROR; - CFPDF_DownloadHintsWrap hints_wrap(hints); - return ((CFPDF_DataAvail*)avail)->m_pDataAvail->IsDocAvail(&hints_wrap); -} - -DLLEXPORT FPDF_DOCUMENT STDCALL -FPDFAvail_GetDocument(FPDF_AVAIL avail, FPDF_BYTESTRING password) { - CFPDF_DataAvail* pDataAvail = static_cast<CFPDF_DataAvail*>(avail); - if (!pDataAvail) - return nullptr; - - CPDF_Parser* pParser = new CPDF_Parser; - pParser->SetPassword(password); - CPDF_Parser::Error error = - pParser->StartAsyncParse(pDataAvail->m_pDataAvail->GetFileRead()); - if (error != CPDF_Parser::SUCCESS) { - delete pParser; - ProcessParseError(error); - return nullptr; - } - pDataAvail->m_pDataAvail->SetDocument(pParser->GetDocument()); - CheckUnSupportError(pParser->GetDocument(), FPDF_ERR_SUCCESS); - return FPDFDocumentFromCPDFDocument(pParser->GetDocument()); -} - -DLLEXPORT int STDCALL FPDFAvail_GetFirstPageNum(FPDF_DOCUMENT doc) { - CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(doc); - return pDoc ? pDoc->GetParser()->GetFirstPageNo() : 0; -} - -DLLEXPORT int STDCALL FPDFAvail_IsPageAvail(FPDF_AVAIL avail, - int page_index, - FX_DOWNLOADHINTS* hints) { - if (!avail || !hints) - return PDF_DATA_ERROR; - CFPDF_DownloadHintsWrap hints_wrap(hints); - return ((CFPDF_DataAvail*)avail) - ->m_pDataAvail->IsPageAvail(page_index, &hints_wrap); -} - -DLLEXPORT int STDCALL FPDFAvail_IsFormAvail(FPDF_AVAIL avail, - FX_DOWNLOADHINTS* hints) { - if (!avail || !hints) - return PDF_FORM_ERROR; - CFPDF_DownloadHintsWrap hints_wrap(hints); - return ((CFPDF_DataAvail*)avail)->m_pDataAvail->IsFormAvail(&hints_wrap); -} - -DLLEXPORT int STDCALL FPDFAvail_IsLinearized(FPDF_AVAIL avail) { - if (!avail) - return PDF_LINEARIZATION_UNKNOWN; - return ((CFPDF_DataAvail*)avail)->m_pDataAvail->IsLinearizedPDF(); -} diff --git a/fpdfsdk/src/fpdf_dataavail_embeddertest.cpp b/fpdfsdk/src/fpdf_dataavail_embeddertest.cpp deleted file mode 100644 index 222fdc4be2..0000000000 --- a/fpdfsdk/src/fpdf_dataavail_embeddertest.cpp +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2015 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "public/fpdf_doc.h" -#include "public/fpdfview.h" -#include "testing/embedder_test.h" -#include "testing/gtest/include/gtest/gtest.h" - -class FPDFDataAvailEmbeddertest : public EmbedderTest {}; - -TEST_F(FPDFDataAvailEmbeddertest, TrailerUnterminated) { - // Document must load without crashing but is too malformed to be available. - EXPECT_FALSE(OpenDocument("trailer_unterminated.pdf")); - EXPECT_FALSE(FPDFAvail_IsDocAvail(avail_, &hints_)); -} - -TEST_F(FPDFDataAvailEmbeddertest, TrailerAsHexstring) { - // Document must load without crashing but is too malformed to be available. - EXPECT_FALSE(OpenDocument("trailer_as_hexstring.pdf")); - EXPECT_FALSE(FPDFAvail_IsDocAvail(avail_, &hints_)); -} diff --git a/fpdfsdk/src/fpdf_ext.cpp b/fpdfsdk/src/fpdf_ext.cpp deleted file mode 100644 index bf35cecd9c..0000000000 --- a/fpdfsdk/src/fpdf_ext.cpp +++ /dev/null @@ -1,221 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "public/fpdf_ext.h" - -#include "core/include/fpdfapi/cpdf_array.h" -#include "core/include/fpdfapi/cpdf_document.h" -#include "core/include/fxcrt/fx_xml.h" -#include "fpdfsdk/include/fsdk_define.h" - -#ifdef PDF_ENABLE_XFA -#include "fpdfsdk/include/fpdfxfa/fpdfxfa_doc.h" -#endif // PDF_ENABLE_XFA - -#define FPDFSDK_UNSUPPORT_CALL 100 - -class CFSDK_UnsupportInfo_Adapter { - public: - CFSDK_UnsupportInfo_Adapter(UNSUPPORT_INFO* unsp_info) { - m_unsp_info = unsp_info; - } - void ReportError(int nErrorType); - - private: - UNSUPPORT_INFO* m_unsp_info; -}; - -void CFSDK_UnsupportInfo_Adapter::ReportError(int nErrorType) { - if (m_unsp_info && m_unsp_info->FSDK_UnSupport_Handler) { - m_unsp_info->FSDK_UnSupport_Handler(m_unsp_info, nErrorType); - } -} - -void FreeUnsupportInfo(void* pData) { - CFSDK_UnsupportInfo_Adapter* pAdapter = (CFSDK_UnsupportInfo_Adapter*)pData; - delete pAdapter; -} - -FX_BOOL FPDF_UnSupportError(int nError) { - CFSDK_UnsupportInfo_Adapter* pAdapter = - (CFSDK_UnsupportInfo_Adapter*)CPDF_ModuleMgr::Get()->GetPrivateData( - (void*)FPDFSDK_UNSUPPORT_CALL); - - if (!pAdapter) - return FALSE; - pAdapter->ReportError(nError); - return TRUE; -} - -DLLEXPORT FPDF_BOOL STDCALL -FSDK_SetUnSpObjProcessHandler(UNSUPPORT_INFO* unsp_info) { - if (!unsp_info || unsp_info->version != 1) - return FALSE; - CFSDK_UnsupportInfo_Adapter* pAdapter = - new CFSDK_UnsupportInfo_Adapter(unsp_info); - - CPDF_ModuleMgr::Get()->SetPrivateData((void*)FPDFSDK_UNSUPPORT_CALL, pAdapter, - &FreeUnsupportInfo); - - return TRUE; -} - -void CheckUnSupportAnnot(CPDF_Document* pDoc, const CPDF_Annot* pPDFAnnot) { - CFX_ByteString cbSubType = pPDFAnnot->GetSubType(); - if (cbSubType.Compare("3D") == 0) { - FPDF_UnSupportError(FPDF_UNSP_ANNOT_3DANNOT); - } else if (cbSubType.Compare("Screen") == 0) { - const CPDF_Dictionary* pAnnotDict = pPDFAnnot->GetAnnotDict(); - CFX_ByteString cbString; - if (pAnnotDict->KeyExist("IT")) - cbString = pAnnotDict->GetStringBy("IT"); - if (cbString.Compare("Img") != 0) - FPDF_UnSupportError(FPDF_UNSP_ANNOT_SCREEN_MEDIA); - } else if (cbSubType.Compare("Movie") == 0) { - FPDF_UnSupportError(FPDF_UNSP_ANNOT_MOVIE); - } else if (cbSubType.Compare("Sound") == 0) { - FPDF_UnSupportError(FPDF_UNSP_ANNOT_SOUND); - } else if (cbSubType.Compare("RichMedia") == 0) { - FPDF_UnSupportError(FPDF_UNSP_ANNOT_SCREEN_RICHMEDIA); - } else if (cbSubType.Compare("FileAttachment") == 0) { - FPDF_UnSupportError(FPDF_UNSP_ANNOT_ATTACHMENT); - } else if (cbSubType.Compare("Widget") == 0) { - const CPDF_Dictionary* pAnnotDict = pPDFAnnot->GetAnnotDict(); - CFX_ByteString cbString; - if (pAnnotDict->KeyExist("FT")) { - cbString = pAnnotDict->GetStringBy("FT"); - } - if (cbString.Compare("Sig") == 0) { - FPDF_UnSupportError(FPDF_UNSP_ANNOT_SIG); - } - } -} - -FX_BOOL CheckSharedForm(const CXML_Element* pElement, CFX_ByteString cbName) { - int count = pElement->CountAttrs(); - int i = 0; - for (i = 0; i < count; i++) { - CFX_ByteString space, name; - CFX_WideString value; - pElement->GetAttrByIndex(i, space, name, value); - if (space == "xmlns" && name == "adhocwf" && - value == L"http://ns.adobe.com/AcrobatAdhocWorkflow/1.0/") { - CXML_Element* pVersion = pElement->GetElement("adhocwf", cbName); - if (!pVersion) - continue; - CFX_WideString wsContent = pVersion->GetContent(0); // == 1.1 - int nType = wsContent.GetInteger(); - switch (nType) { - case 1: - FPDF_UnSupportError(FPDF_UNSP_DOC_SHAREDFORM_ACROBAT); - break; - case 2: - FPDF_UnSupportError(FPDF_UNSP_DOC_SHAREDFORM_FILESYSTEM); - break; - case 0: - FPDF_UnSupportError(FPDF_UNSP_DOC_SHAREDFORM_EMAIL); - break; - } - } - } - - FX_DWORD nCount = pElement->CountChildren(); - for (i = 0; i < (int)nCount; i++) { - CXML_Element::ChildType childType = pElement->GetChildType(i); - if (childType == CXML_Element::Element) { - CXML_Element* pChild = pElement->GetElement(i); - if (CheckSharedForm(pChild, cbName)) - return TRUE; - } - } - return FALSE; -} - -void CheckUnSupportError(CPDF_Document* pDoc, FX_DWORD err_code) { - // Security - if (err_code == FPDF_ERR_SECURITY) { - FPDF_UnSupportError(FPDF_UNSP_DOC_SECURITY); - return; - } - if (!pDoc) - return; - - // Portfolios and Packages - CPDF_Dictionary* pRootDict = pDoc->GetRoot(); - if (pRootDict) { - CFX_ByteString cbString; - if (pRootDict->KeyExist("Collection")) { - FPDF_UnSupportError(FPDF_UNSP_DOC_PORTABLECOLLECTION); - return; - } - if (pRootDict->KeyExist("Names")) { - CPDF_Dictionary* pNameDict = pRootDict->GetDictBy("Names"); - if (pNameDict && pNameDict->KeyExist("EmbeddedFiles")) { - FPDF_UnSupportError(FPDF_UNSP_DOC_ATTACHMENT); - return; - } - if (pNameDict && pNameDict->KeyExist("JavaScript")) { - CPDF_Dictionary* pJSDict = pNameDict->GetDictBy("JavaScript"); - CPDF_Array* pArray = pJSDict ? pJSDict->GetArrayBy("Names") : NULL; - if (pArray) { - int nCount = pArray->GetCount(); - for (int i = 0; i < nCount; i++) { - CFX_ByteString cbStr = pArray->GetStringAt(i); - if (cbStr.Compare("com.adobe.acrobat.SharedReview.Register") == 0) { - FPDF_UnSupportError(FPDF_UNSP_DOC_SHAREDREVIEW); - return; - } - } - } - } - } - } - - // SharedForm - CPDF_Metadata metaData(pDoc); - const CXML_Element* pElement = metaData.GetRoot(); - if (pElement) - CheckSharedForm(pElement, "workflowType"); - -#ifndef PDF_ENABLE_XFA - // XFA Forms - CPDF_InterForm* pInterForm = new CPDF_InterForm(pDoc, FALSE); - if (pInterForm->HasXFAForm()) { - FPDF_UnSupportError(FPDF_UNSP_DOC_XFAFORM); - } - delete pInterForm; -#endif // PDF_ENABLE_XFA -} - -DLLEXPORT int FPDFDoc_GetPageMode(FPDF_DOCUMENT document) { - CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); - if (!pDoc) - return PAGEMODE_UNKNOWN; - - CPDF_Dictionary* pRoot = pDoc->GetRoot(); - if (!pRoot) - return PAGEMODE_UNKNOWN; - - CPDF_Object* pName = pRoot->GetElement("PageMode"); - if (!pName) - return PAGEMODE_USENONE; - - CFX_ByteString strPageMode = pName->GetString(); - if (strPageMode.IsEmpty() || strPageMode.EqualNoCase("UseNone")) - return PAGEMODE_USENONE; - if (strPageMode.EqualNoCase("UseOutlines")) - return PAGEMODE_USEOUTLINES; - if (strPageMode.EqualNoCase("UseThumbs")) - return PAGEMODE_USETHUMBS; - if (strPageMode.EqualNoCase("FullScreen")) - return PAGEMODE_FULLSCREEN; - if (strPageMode.EqualNoCase("UseOC")) - return PAGEMODE_USEOC; - if (strPageMode.EqualNoCase("UseAttachments")) - return PAGEMODE_USEATTACHMENTS; - - return PAGEMODE_UNKNOWN; -} diff --git a/fpdfsdk/src/fpdf_flatten.cpp b/fpdfsdk/src/fpdf_flatten.cpp deleted file mode 100644 index cca63d6b76..0000000000 --- a/fpdfsdk/src/fpdf_flatten.cpp +++ /dev/null @@ -1,518 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "public/fpdf_flatten.h" - -#include <algorithm> - -#include "core/include/fpdfapi/cpdf_array.h" -#include "core/include/fpdfapi/cpdf_document.h" -#include "core/include/fpdfapi/cpdf_number.h" -#include "fpdfsdk/include/fsdk_define.h" - -typedef CFX_ArrayTemplate<CPDF_Dictionary*> CPDF_ObjectArray; -typedef CFX_ArrayTemplate<CFX_FloatRect> CPDF_RectArray; - -enum FPDF_TYPE { MAX, MIN }; -enum FPDF_VALUE { TOP, LEFT, RIGHT, BOTTOM }; - -FX_BOOL IsValiableRect(CFX_FloatRect rect, CFX_FloatRect rcPage) { - if (rect.left - rect.right > 0.000001f || rect.bottom - rect.top > 0.000001f) - return FALSE; - - if (rect.left == 0.0f && rect.top == 0.0f && rect.right == 0.0f && - rect.bottom == 0.0f) - return FALSE; - - if (!rcPage.IsEmpty()) { - if (rect.left - rcPage.left < -10.000001f || - rect.right - rcPage.right > 10.000001f || - rect.top - rcPage.top > 10.000001f || - rect.bottom - rcPage.bottom < -10.000001f) - return FALSE; - } - - return TRUE; -} - -void GetContentsRect(CPDF_Document* pDoc, - CPDF_Dictionary* pDict, - CPDF_RectArray* pRectArray) { - std::unique_ptr<CPDF_Page> pPDFPage(new CPDF_Page); - pPDFPage->Load(pDoc, pDict, FALSE); - pPDFPage->ParseContent(nullptr); - - for (auto& pPageObject : *pPDFPage->GetPageObjectList()) { - if (!pPageObject) - continue; - - CFX_FloatRect rc; - rc.left = pPageObject->m_Left; - rc.right = pPageObject->m_Right; - rc.bottom = pPageObject->m_Bottom; - rc.top = pPageObject->m_Top; - if (IsValiableRect(rc, pDict->GetRectBy("MediaBox"))) - pRectArray->Add(rc); - } -} - -void ParserStream(CPDF_Dictionary* pPageDic, - CPDF_Dictionary* pStream, - CPDF_RectArray* pRectArray, - CPDF_ObjectArray* pObjectArray) { - if (!pStream) - return; - CFX_FloatRect rect; - if (pStream->KeyExist("Rect")) - rect = pStream->GetRectBy("Rect"); - else if (pStream->KeyExist("BBox")) - rect = pStream->GetRectBy("BBox"); - - if (IsValiableRect(rect, pPageDic->GetRectBy("MediaBox"))) - pRectArray->Add(rect); - - pObjectArray->Add(pStream); -} - -int ParserAnnots(CPDF_Document* pSourceDoc, - CPDF_Dictionary* pPageDic, - CPDF_RectArray* pRectArray, - CPDF_ObjectArray* pObjectArray, - int nUsage) { - if (!pSourceDoc || !pPageDic) - return FLATTEN_FAIL; - - GetContentsRect(pSourceDoc, pPageDic, pRectArray); - CPDF_Array* pAnnots = pPageDic->GetArrayBy("Annots"); - if (!pAnnots) - return FLATTEN_NOTHINGTODO; - - FX_DWORD dwSize = pAnnots->GetCount(); - for (int i = 0; i < (int)dwSize; i++) { - CPDF_Dictionary* pAnnotDic = ToDictionary(pAnnots->GetElementValue(i)); - if (!pAnnotDic) - continue; - - CFX_ByteString sSubtype = pAnnotDic->GetStringBy("Subtype"); - if (sSubtype == "Popup") - continue; - - int nAnnotFlag = pAnnotDic->GetIntegerBy("F"); - if (nAnnotFlag & ANNOTFLAG_HIDDEN) - continue; - - if (nUsage == FLAT_NORMALDISPLAY) { - if (nAnnotFlag & ANNOTFLAG_INVISIBLE) - continue; - - ParserStream(pPageDic, pAnnotDic, pRectArray, pObjectArray); - } else { - if (nAnnotFlag & ANNOTFLAG_PRINT) - ParserStream(pPageDic, pAnnotDic, pRectArray, pObjectArray); - } - } - return FLATTEN_SUCCESS; -} - -FX_FLOAT GetMinMaxValue(CPDF_RectArray& array, - FPDF_TYPE type, - FPDF_VALUE value) { - int nRects = array.GetSize(); - FX_FLOAT fRet = 0.0f; - - if (nRects <= 0) - return 0.0f; - - FX_FLOAT* pArray = new FX_FLOAT[nRects]; - switch (value) { - case LEFT: { - for (int i = 0; i < nRects; i++) - pArray[i] = CFX_FloatRect(array.GetAt(i)).left; - - break; - } - case TOP: { - for (int i = 0; i < nRects; i++) - pArray[i] = CFX_FloatRect(array.GetAt(i)).top; - - break; - } - case RIGHT: { - for (int i = 0; i < nRects; i++) - pArray[i] = CFX_FloatRect(array.GetAt(i)).right; - - break; - } - case BOTTOM: { - for (int i = 0; i < nRects; i++) - pArray[i] = CFX_FloatRect(array.GetAt(i)).bottom; - - break; - } - default: - break; - } - fRet = pArray[0]; - if (type == MAX) { - for (int i = 1; i < nRects; i++) - if (fRet <= pArray[i]) - fRet = pArray[i]; - } else { - for (int i = 1; i < nRects; i++) - if (fRet >= pArray[i]) - fRet = pArray[i]; - } - delete[] pArray; - return fRet; -} - -CFX_FloatRect CalculateRect(CPDF_RectArray* pRectArray) { - CFX_FloatRect rcRet; - - rcRet.left = GetMinMaxValue(*pRectArray, MIN, LEFT); - rcRet.top = GetMinMaxValue(*pRectArray, MAX, TOP); - rcRet.right = GetMinMaxValue(*pRectArray, MAX, RIGHT); - rcRet.bottom = GetMinMaxValue(*pRectArray, MIN, BOTTOM); - - return rcRet; -} - -void SetPageContents(CFX_ByteString key, - CPDF_Dictionary* pPage, - CPDF_Document* pDocument) { - CPDF_Object* pContentsObj = pPage->GetStreamBy("Contents"); - if (!pContentsObj) { - pContentsObj = pPage->GetArrayBy("Contents"); - } - - if (!pContentsObj) { - // Create a new contents dictionary - if (!key.IsEmpty()) { - CPDF_Stream* pNewContents = new CPDF_Stream(NULL, 0, new CPDF_Dictionary); - pPage->SetAtReference("Contents", pDocument, - pDocument->AddIndirectObject(pNewContents)); - - CFX_ByteString sStream; - sStream.Format("q 1 0 0 1 0 0 cm /%s Do Q", key.c_str()); - pNewContents->SetData((const uint8_t*)sStream, sStream.GetLength(), FALSE, - FALSE); - } - return; - } - - CPDF_Array* pContentsArray = NULL; - - switch (pContentsObj->GetType()) { - case CPDF_Object::STREAM: { - pContentsArray = new CPDF_Array; - CPDF_Stream* pContents = pContentsObj->AsStream(); - FX_DWORD dwObjNum = pDocument->AddIndirectObject(pContents); - CPDF_StreamAcc acc; - acc.LoadAllData(pContents); - CFX_ByteString sStream = "q\n"; - CFX_ByteString sBody = - CFX_ByteString((const FX_CHAR*)acc.GetData(), acc.GetSize()); - sStream = sStream + sBody + "\nQ"; - pContents->SetData((const uint8_t*)sStream, sStream.GetLength(), FALSE, - FALSE); - pContentsArray->AddReference(pDocument, dwObjNum); - break; - } - - case CPDF_Object::ARRAY: { - pContentsArray = pContentsObj->AsArray(); - break; - } - default: - break; - } - - if (!pContentsArray) - return; - - FX_DWORD dwObjNum = pDocument->AddIndirectObject(pContentsArray); - pPage->SetAtReference("Contents", pDocument, dwObjNum); - - if (!key.IsEmpty()) { - CPDF_Stream* pNewContents = new CPDF_Stream(NULL, 0, new CPDF_Dictionary); - dwObjNum = pDocument->AddIndirectObject(pNewContents); - pContentsArray->AddReference(pDocument, dwObjNum); - - CFX_ByteString sStream; - sStream.Format("q 1 0 0 1 0 0 cm /%s Do Q", key.c_str()); - pNewContents->SetData((const uint8_t*)sStream, sStream.GetLength(), FALSE, - FALSE); - } -} - -CFX_Matrix GetMatrix(CFX_FloatRect rcAnnot, - CFX_FloatRect rcStream, - const CFX_Matrix& matrix) { - if (rcStream.IsEmpty()) - return CFX_Matrix(); - - matrix.TransformRect(rcStream); - rcStream.Normalize(); - - FX_FLOAT a = rcAnnot.Width() / rcStream.Width(); - FX_FLOAT d = rcAnnot.Height() / rcStream.Height(); - - FX_FLOAT e = rcAnnot.left - rcStream.left * a; - FX_FLOAT f = rcAnnot.bottom - rcStream.bottom * d; - return CFX_Matrix(a, 0, 0, d, e, f); -} - -void GetOffset(FX_FLOAT& fa, - FX_FLOAT& fd, - FX_FLOAT& fe, - FX_FLOAT& ff, - CFX_FloatRect rcAnnot, - CFX_FloatRect rcStream, - const CFX_Matrix& matrix) { - FX_FLOAT fStreamWidth = 0.0f; - FX_FLOAT fStreamHeight = 0.0f; - - if (matrix.a != 0 && matrix.d != 0) { - fStreamWidth = rcStream.right - rcStream.left; - fStreamHeight = rcStream.top - rcStream.bottom; - } else { - fStreamWidth = rcStream.top - rcStream.bottom; - fStreamHeight = rcStream.right - rcStream.left; - } - - FX_FLOAT x1 = - matrix.a * rcStream.left + matrix.c * rcStream.bottom + matrix.e; - FX_FLOAT y1 = - matrix.b * rcStream.left + matrix.d * rcStream.bottom + matrix.f; - FX_FLOAT x2 = matrix.a * rcStream.left + matrix.c * rcStream.top + matrix.e; - FX_FLOAT y2 = matrix.b * rcStream.left + matrix.d * rcStream.top + matrix.f; - FX_FLOAT x3 = - matrix.a * rcStream.right + matrix.c * rcStream.bottom + matrix.e; - FX_FLOAT y3 = - matrix.b * rcStream.right + matrix.d * rcStream.bottom + matrix.f; - FX_FLOAT x4 = matrix.a * rcStream.right + matrix.c * rcStream.top + matrix.e; - FX_FLOAT y4 = matrix.b * rcStream.right + matrix.d * rcStream.top + matrix.f; - - FX_FLOAT left = std::min(std::min(x1, x2), std::min(x3, x4)); - FX_FLOAT bottom = std::min(std::min(y1, y2), std::min(y3, y4)); - - fa = (rcAnnot.right - rcAnnot.left) / fStreamWidth; - fd = (rcAnnot.top - rcAnnot.bottom) / fStreamHeight; - fe = rcAnnot.left - left * fa; - ff = rcAnnot.bottom - bottom * fd; -} - -DLLEXPORT int STDCALL FPDFPage_Flatten(FPDF_PAGE page, int nFlag) { - CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!page) { - return FLATTEN_FAIL; - } - - CPDF_Document* pDocument = pPage->m_pDocument; - CPDF_Dictionary* pPageDict = pPage->m_pFormDict; - - if (!pDocument || !pPageDict) { - return FLATTEN_FAIL; - } - - CPDF_ObjectArray ObjectArray; - CPDF_RectArray RectArray; - - int iRet = FLATTEN_FAIL; - iRet = ParserAnnots(pDocument, pPageDict, &RectArray, &ObjectArray, nFlag); - if (iRet == FLATTEN_NOTHINGTODO || iRet == FLATTEN_FAIL) - return iRet; - - CFX_FloatRect rcOriginalCB; - CFX_FloatRect rcMerger = CalculateRect(&RectArray); - CFX_FloatRect rcOriginalMB = pPageDict->GetRectBy("MediaBox"); - - if (pPageDict->KeyExist("CropBox")) - rcOriginalMB = pPageDict->GetRectBy("CropBox"); - - if (rcOriginalMB.IsEmpty()) { - rcOriginalMB = CFX_FloatRect(0.0f, 0.0f, 612.0f, 792.0f); - } - - rcMerger.left = - rcMerger.left < rcOriginalMB.left ? rcOriginalMB.left : rcMerger.left; - rcMerger.right = - rcMerger.right > rcOriginalMB.right ? rcOriginalMB.right : rcMerger.right; - rcMerger.top = - rcMerger.top > rcOriginalMB.top ? rcOriginalMB.top : rcMerger.top; - rcMerger.bottom = rcMerger.bottom < rcOriginalMB.bottom ? rcOriginalMB.bottom - : rcMerger.bottom; - - if (pPageDict->KeyExist("ArtBox")) - rcOriginalCB = pPageDict->GetRectBy("ArtBox"); - else - rcOriginalCB = rcOriginalMB; - - if (!rcOriginalMB.IsEmpty()) { - CPDF_Array* pMediaBox = new CPDF_Array(); - pMediaBox->Add(new CPDF_Number(rcOriginalMB.left)); - pMediaBox->Add(new CPDF_Number(rcOriginalMB.bottom)); - pMediaBox->Add(new CPDF_Number(rcOriginalMB.right)); - pMediaBox->Add(new CPDF_Number(rcOriginalMB.top)); - pPageDict->SetAt("MediaBox", pMediaBox); - } - - if (!rcOriginalCB.IsEmpty()) { - CPDF_Array* pCropBox = new CPDF_Array(); - pCropBox->Add(new CPDF_Number(rcOriginalCB.left)); - pCropBox->Add(new CPDF_Number(rcOriginalCB.bottom)); - pCropBox->Add(new CPDF_Number(rcOriginalCB.right)); - pCropBox->Add(new CPDF_Number(rcOriginalCB.top)); - pPageDict->SetAt("ArtBox", pCropBox); - } - - CPDF_Dictionary* pRes = pPageDict->GetDictBy("Resources"); - if (!pRes) { - pRes = new CPDF_Dictionary; - pPageDict->SetAt("Resources", pRes); - } - - CPDF_Stream* pNewXObject = new CPDF_Stream(NULL, 0, new CPDF_Dictionary); - FX_DWORD dwObjNum = pDocument->AddIndirectObject(pNewXObject); - CPDF_Dictionary* pPageXObject = pRes->GetDictBy("XObject"); - if (!pPageXObject) { - pPageXObject = new CPDF_Dictionary; - pRes->SetAt("XObject", pPageXObject); - } - - CFX_ByteString key = ""; - int nStreams = ObjectArray.GetSize(); - - if (nStreams > 0) { - for (int iKey = 0; /*iKey < 100*/; iKey++) { - char sExtend[5] = {}; - FXSYS_itoa(iKey, sExtend, 10); - key = CFX_ByteString("FFT") + CFX_ByteString(sExtend); - - if (!pPageXObject->KeyExist(key)) - break; - } - } - - SetPageContents(key, pPageDict, pDocument); - - CPDF_Dictionary* pNewXORes = NULL; - - if (!key.IsEmpty()) { - pPageXObject->SetAtReference(key, pDocument, dwObjNum); - CPDF_Dictionary* pNewOXbjectDic = pNewXObject->GetDict(); - pNewXORes = new CPDF_Dictionary; - pNewOXbjectDic->SetAt("Resources", pNewXORes); - pNewOXbjectDic->SetAtName("Type", "XObject"); - pNewOXbjectDic->SetAtName("Subtype", "Form"); - pNewOXbjectDic->SetAtInteger("FormType", 1); - pNewOXbjectDic->SetAtName("Name", "FRM"); - CFX_FloatRect rcBBox = pPageDict->GetRectBy("ArtBox"); - pNewOXbjectDic->SetAtRect("BBox", rcBBox); - } - - for (int i = 0; i < nStreams; i++) { - CPDF_Dictionary* pAnnotDic = ObjectArray.GetAt(i); - if (!pAnnotDic) - continue; - - CFX_FloatRect rcAnnot = pAnnotDic->GetRectBy("Rect"); - rcAnnot.Normalize(); - - CFX_ByteString sAnnotState = pAnnotDic->GetStringBy("AS"); - CPDF_Dictionary* pAnnotAP = pAnnotDic->GetDictBy("AP"); - if (!pAnnotAP) - continue; - - CPDF_Stream* pAPStream = pAnnotAP->GetStreamBy("N"); - if (!pAPStream) { - CPDF_Dictionary* pAPDic = pAnnotAP->GetDictBy("N"); - if (!pAPDic) - continue; - - if (!sAnnotState.IsEmpty()) { - pAPStream = pAPDic->GetStreamBy(sAnnotState); - } else { - auto it = pAPDic->begin(); - if (it != pAPDic->end()) { - CPDF_Object* pFirstObj = it->second; - if (pFirstObj) { - if (pFirstObj->IsReference()) - pFirstObj = pFirstObj->GetDirect(); - if (!pFirstObj->IsStream()) - continue; - pAPStream = pFirstObj->AsStream(); - } - } - } - } - if (!pAPStream) - continue; - - CPDF_Dictionary* pAPDic = pAPStream->GetDict(); - CFX_Matrix matrix = pAPDic->GetMatrixBy("Matrix"); - - CFX_FloatRect rcStream; - if (pAPDic->KeyExist("Rect")) - rcStream = pAPDic->GetRectBy("Rect"); - else if (pAPDic->KeyExist("BBox")) - rcStream = pAPDic->GetRectBy("BBox"); - - if (rcStream.IsEmpty()) - continue; - - CPDF_Object* pObj = pAPStream; - - if (pObj) { - CPDF_Dictionary* pObjDic = pObj->GetDict(); - if (pObjDic) { - pObjDic->SetAtName("Type", "XObject"); - pObjDic->SetAtName("Subtype", "Form"); - } - } - - CPDF_Dictionary* pXObject = pNewXORes->GetDictBy("XObject"); - if (!pXObject) { - pXObject = new CPDF_Dictionary; - pNewXORes->SetAt("XObject", pXObject); - } - - CFX_ByteString sFormName; - sFormName.Format("F%d", i); - FX_DWORD dwObjNum = pDocument->AddIndirectObject(pObj); - pXObject->SetAtReference(sFormName, pDocument, dwObjNum); - - CPDF_StreamAcc acc; - acc.LoadAllData(pNewXObject); - - const uint8_t* pData = acc.GetData(); - CFX_ByteString sStream(pData, acc.GetSize()); - CFX_ByteString sTemp; - - if (matrix.IsIdentity()) { - matrix.a = 1.0f; - matrix.b = 0.0f; - matrix.c = 0.0f; - matrix.d = 1.0f; - matrix.e = 0.0f; - matrix.f = 0.0f; - } - - CFX_Matrix m = GetMatrix(rcAnnot, rcStream, matrix); - sTemp.Format("q %f 0 0 %f %f %f cm /%s Do Q\n", m.a, m.d, m.e, m.f, - sFormName.c_str()); - sStream += sTemp; - - pNewXObject->SetData((const uint8_t*)sStream, sStream.GetLength(), FALSE, - FALSE); - } - pPageDict->RemoveAt("Annots"); - - ObjectArray.RemoveAll(); - RectArray.RemoveAll(); - - return FLATTEN_SUCCESS; -} diff --git a/fpdfsdk/src/fpdf_progressive.cpp b/fpdfsdk/src/fpdf_progressive.cpp deleted file mode 100644 index b6fd8e071e..0000000000 --- a/fpdfsdk/src/fpdf_progressive.cpp +++ /dev/null @@ -1,100 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "public/fpdf_progressive.h" - -#include "fpdfsdk/include/fsdk_define.h" -#include "fpdfsdk/include/fsdk_rendercontext.h" -#include "public/fpdfview.h" - -// These checks are here because core/ and public/ cannot depend on each other. -static_assert(CPDF_ProgressiveRenderer::Ready == FPDF_RENDER_READER, - "CPDF_ProgressiveRenderer::Ready value mismatch"); -static_assert(CPDF_ProgressiveRenderer::ToBeContinued == - FPDF_RENDER_TOBECOUNTINUED, - "CPDF_ProgressiveRenderer::ToBeContinued value mismatch"); -static_assert(CPDF_ProgressiveRenderer::Done == FPDF_RENDER_DONE, - "CPDF_ProgressiveRenderer::Done value mismatch"); -static_assert(CPDF_ProgressiveRenderer::Failed == FPDF_RENDER_FAILED, - "CPDF_ProgressiveRenderer::Failed value mismatch"); - -DLLEXPORT int STDCALL FPDF_RenderPageBitmap_Start(FPDF_BITMAP bitmap, - FPDF_PAGE page, - int start_x, - int start_y, - int size_x, - int size_y, - int rotate, - int flags, - IFSDK_PAUSE* pause) { - if (!bitmap || !pause || pause->version != 1) - return FPDF_RENDER_FAILED; - - CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!pPage) - return FPDF_RENDER_FAILED; - - CRenderContext* pContext = new CRenderContext; - pPage->SetPrivateData((void*)1, pContext, DropContext); -#ifdef _SKIA_SUPPORT_ - pContext->m_pDevice = new CFX_SkiaDevice; - if (flags & FPDF_REVERSE_BYTE_ORDER) - ((CFX_SkiaDevice*)pContext->m_pDevice) - ->Attach((CFX_DIBitmap*)bitmap, 0, TRUE); - else - ((CFX_SkiaDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)bitmap); -#else - pContext->m_pDevice = new CFX_FxgeDevice; - if (flags & FPDF_REVERSE_BYTE_ORDER) - ((CFX_FxgeDevice*)pContext->m_pDevice) - ->Attach((CFX_DIBitmap*)bitmap, 0, TRUE); - else - ((CFX_FxgeDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)bitmap); -#endif - IFSDK_PAUSE_Adapter IPauseAdapter(pause); - - FPDF_RenderPage_Retail(pContext, page, start_x, start_y, size_x, size_y, - rotate, flags, FALSE, &IPauseAdapter); - - if (pContext->m_pRenderer) { - return CPDF_ProgressiveRenderer::ToFPDFStatus( - pContext->m_pRenderer->GetStatus()); - } - return FPDF_RENDER_FAILED; -} - -DLLEXPORT int STDCALL FPDF_RenderPage_Continue(FPDF_PAGE page, - IFSDK_PAUSE* pause) { - if (!pause || pause->version != 1) - return FPDF_RENDER_FAILED; - - CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!pPage) - return FPDF_RENDER_FAILED; - - CRenderContext* pContext = (CRenderContext*)pPage->GetPrivateData((void*)1); - if (pContext && pContext->m_pRenderer) { - IFSDK_PAUSE_Adapter IPauseAdapter(pause); - pContext->m_pRenderer->Continue(&IPauseAdapter); - return CPDF_ProgressiveRenderer::ToFPDFStatus( - pContext->m_pRenderer->GetStatus()); - } - return FPDF_RENDER_FAILED; -} - -DLLEXPORT void STDCALL FPDF_RenderPage_Close(FPDF_PAGE page) { - CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!pPage) - return; - - CRenderContext* pContext = (CRenderContext*)pPage->GetPrivateData((void*)1); - if (!pContext) - return; - - pContext->m_pDevice->RestoreState(); - delete pContext; - pPage->RemovePrivateData((void*)1); -} diff --git a/fpdfsdk/src/fpdf_searchex.cpp b/fpdfsdk/src/fpdf_searchex.cpp deleted file mode 100644 index 96c5e53309..0000000000 --- a/fpdfsdk/src/fpdf_searchex.cpp +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "public/fpdf_searchex.h" - -#include "core/include/fpdftext/fpdf_text.h" - -DLLEXPORT int STDCALL -FPDFText_GetCharIndexFromTextIndex(FPDF_TEXTPAGE text_page, int nTextIndex) { - if (!text_page) - return -1; - return ((IPDF_TextPage*)text_page)->CharIndexFromTextIndex(nTextIndex); -} diff --git a/fpdfsdk/src/fpdf_sysfontinfo.cpp b/fpdfsdk/src/fpdf_sysfontinfo.cpp deleted file mode 100644 index 655c4a22bb..0000000000 --- a/fpdfsdk/src/fpdf_sysfontinfo.cpp +++ /dev/null @@ -1,189 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "public/fpdf_sysfontinfo.h" - -#include "fpdfsdk/include/fsdk_define.h" -#include "fpdfsdk/include/pdfwindow/PWL_FontMap.h" - -class CFX_ExternalFontInfo final : public IFX_SystemFontInfo { - public: - explicit CFX_ExternalFontInfo(FPDF_SYSFONTINFO* pInfo) : m_pInfo(pInfo) {} - - void Release() override { - if (m_pInfo->Release) - m_pInfo->Release(m_pInfo); - delete this; - } - - FX_BOOL EnumFontList(CFX_FontMapper* pMapper) override { - if (m_pInfo->EnumFonts) { - m_pInfo->EnumFonts(m_pInfo, pMapper); - return TRUE; - } - return FALSE; - } - - void* MapFont(int weight, - FX_BOOL bItalic, - int charset, - int pitch_family, - const FX_CHAR* family, - int& iExact) override { - if (m_pInfo->MapFont) - return m_pInfo->MapFont(m_pInfo, weight, bItalic, charset, pitch_family, - family, &iExact); - return NULL; - } - - void* GetFont(const FX_CHAR* family) override { - if (m_pInfo->GetFont) - return m_pInfo->GetFont(m_pInfo, family); - return NULL; - } - - FX_DWORD GetFontData(void* hFont, - FX_DWORD table, - uint8_t* buffer, - FX_DWORD size) override { - if (m_pInfo->GetFontData) - return m_pInfo->GetFontData(m_pInfo, hFont, table, buffer, size); - return 0; - } - - FX_BOOL GetFaceName(void* hFont, CFX_ByteString& name) override { - if (!m_pInfo->GetFaceName) - return FALSE; - FX_DWORD size = m_pInfo->GetFaceName(m_pInfo, hFont, NULL, 0); - if (size == 0) - return FALSE; - char* buffer = FX_Alloc(char, size); - size = m_pInfo->GetFaceName(m_pInfo, hFont, buffer, size); - name = CFX_ByteString(buffer, size); - FX_Free(buffer); - return TRUE; - } - - FX_BOOL GetFontCharset(void* hFont, int& charset) override { - if (m_pInfo->GetFontCharset) { - charset = m_pInfo->GetFontCharset(m_pInfo, hFont); - return TRUE; - } - return FALSE; - } - - void DeleteFont(void* hFont) override { - if (m_pInfo->DeleteFont) - m_pInfo->DeleteFont(m_pInfo, hFont); - } - - private: - ~CFX_ExternalFontInfo() override {} - - FPDF_SYSFONTINFO* const m_pInfo; -}; - -DLLEXPORT void STDCALL FPDF_AddInstalledFont(void* mapper, - const char* name, - int charset) { - ((CFX_FontMapper*)mapper)->AddInstalledFont(name, charset); -} - -DLLEXPORT void STDCALL FPDF_SetSystemFontInfo(FPDF_SYSFONTINFO* pFontInfoExt) { - if (pFontInfoExt->version != 1) - return; - - CFX_GEModule::Get()->GetFontMgr()->SetSystemFontInfo( - new CFX_ExternalFontInfo(pFontInfoExt)); -} - -DLLEXPORT const FPDF_CharsetFontMap* STDCALL FPDF_GetDefaultTTFMap() { - return CPWL_FontMap::defaultTTFMap; -} - -struct FPDF_SYSFONTINFO_DEFAULT : public FPDF_SYSFONTINFO { - IFX_SystemFontInfo* m_pFontInfo; -}; - -static void DefaultRelease(struct _FPDF_SYSFONTINFO* pThis) { - ((FPDF_SYSFONTINFO_DEFAULT*)pThis)->m_pFontInfo->Release(); -} - -static void DefaultEnumFonts(struct _FPDF_SYSFONTINFO* pThis, void* pMapper) { - ((FPDF_SYSFONTINFO_DEFAULT*)pThis) - ->m_pFontInfo->EnumFontList((CFX_FontMapper*)pMapper); -} - -static void* DefaultMapFont(struct _FPDF_SYSFONTINFO* pThis, - int weight, - int bItalic, - int charset, - int pitch_family, - const char* family, - int* bExact) { - return ((FPDF_SYSFONTINFO_DEFAULT*)pThis) - ->m_pFontInfo->MapFont(weight, bItalic, charset, pitch_family, family, - *bExact); -} - -void* DefaultGetFont(struct _FPDF_SYSFONTINFO* pThis, const char* family) { - return ((FPDF_SYSFONTINFO_DEFAULT*)pThis)->m_pFontInfo->GetFont(family); -} - -static unsigned long DefaultGetFontData(struct _FPDF_SYSFONTINFO* pThis, - void* hFont, - unsigned int table, - unsigned char* buffer, - unsigned long buf_size) { - return ((FPDF_SYSFONTINFO_DEFAULT*)pThis) - ->m_pFontInfo->GetFontData(hFont, table, buffer, buf_size); -} - -static unsigned long DefaultGetFaceName(struct _FPDF_SYSFONTINFO* pThis, - void* hFont, - char* buffer, - unsigned long buf_size) { - CFX_ByteString name; - if (!((FPDF_SYSFONTINFO_DEFAULT*)pThis) - ->m_pFontInfo->GetFaceName(hFont, name)) - return 0; - if (name.GetLength() >= (long)buf_size) - return name.GetLength() + 1; - FXSYS_strcpy(buffer, name); - return name.GetLength() + 1; -} - -static int DefaultGetFontCharset(struct _FPDF_SYSFONTINFO* pThis, void* hFont) { - int charset; - if (!((FPDF_SYSFONTINFO_DEFAULT*)pThis) - ->m_pFontInfo->GetFontCharset(hFont, charset)) - return 0; - return charset; -} - -static void DefaultDeleteFont(struct _FPDF_SYSFONTINFO* pThis, void* hFont) { - ((FPDF_SYSFONTINFO_DEFAULT*)pThis)->m_pFontInfo->DeleteFont(hFont); -} - -DLLEXPORT FPDF_SYSFONTINFO* STDCALL FPDF_GetDefaultSystemFontInfo() { - IFX_SystemFontInfo* pFontInfo = IFX_SystemFontInfo::CreateDefault(nullptr); - if (!pFontInfo) - return NULL; - - FPDF_SYSFONTINFO_DEFAULT* pFontInfoExt = - FX_Alloc(FPDF_SYSFONTINFO_DEFAULT, 1); - pFontInfoExt->DeleteFont = DefaultDeleteFont; - pFontInfoExt->EnumFonts = DefaultEnumFonts; - pFontInfoExt->GetFaceName = DefaultGetFaceName; - pFontInfoExt->GetFont = DefaultGetFont; - pFontInfoExt->GetFontCharset = DefaultGetFontCharset; - pFontInfoExt->GetFontData = DefaultGetFontData; - pFontInfoExt->MapFont = DefaultMapFont; - pFontInfoExt->Release = DefaultRelease; - pFontInfoExt->version = 1; - pFontInfoExt->m_pFontInfo = pFontInfo; - return pFontInfoExt; -} diff --git a/fpdfsdk/src/fpdf_transformpage.cpp b/fpdfsdk/src/fpdf_transformpage.cpp deleted file mode 100644 index f3c2576dd5..0000000000 --- a/fpdfsdk/src/fpdf_transformpage.cpp +++ /dev/null @@ -1,327 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "public/fpdf_transformpage.h" - -#include "core/include/fpdfapi/cpdf_array.h" -#include "core/include/fpdfapi/cpdf_document.h" -#include "core/include/fpdfapi/cpdf_number.h" -#include "core/include/fpdfapi/cpdf_reference.h" -#include "fpdfsdk/include/fsdk_define.h" - -namespace { - -void SetBoundingBox(CPDF_Page* page, - const CFX_ByteStringC& key, - float left, - float bottom, - float right, - float top) { - CPDF_Dictionary* pPageDict = page->m_pFormDict; - CPDF_Array* pBoundingBoxArray = new CPDF_Array; - pBoundingBoxArray->Add(new CPDF_Number(left)); - pBoundingBoxArray->Add(new CPDF_Number(bottom)); - pBoundingBoxArray->Add(new CPDF_Number(right)); - pBoundingBoxArray->Add(new CPDF_Number(top)); - pPageDict->SetAt(key, pBoundingBoxArray); -} - -FPDF_BOOL GetBoundingBox(CPDF_Page* page, - const CFX_ByteStringC& key, - float* left, - float* bottom, - float* right, - float* top) { - CPDF_Dictionary* pPageDict = page->m_pFormDict; - CPDF_Array* pArray = pPageDict->GetArrayBy(key); - if (!pArray) - return FALSE; - - *left = pArray->GetFloatAt(0); - *bottom = pArray->GetFloatAt(1); - *right = pArray->GetFloatAt(2); - *top = pArray->GetFloatAt(3); - return TRUE; -} - -} // namespace - -DLLEXPORT void STDCALL FPDFPage_SetMediaBox(FPDF_PAGE page, - float left, - float bottom, - float right, - float top) { - CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!pPage) - return; - - SetBoundingBox(pPage, "MediaBox", left, bottom, right, top); -} - -DLLEXPORT void STDCALL FPDFPage_SetCropBox(FPDF_PAGE page, - float left, - float bottom, - float right, - float top) { - CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!pPage) - return; - - SetBoundingBox(pPage, "CropBox", left, bottom, right, top); -} - -DLLEXPORT FPDF_BOOL STDCALL FPDFPage_GetMediaBox(FPDF_PAGE page, - float* left, - float* bottom, - float* right, - float* top) { - CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - return pPage && GetBoundingBox(pPage, "MediaBox", left, bottom, right, top); -} - -DLLEXPORT FPDF_BOOL STDCALL FPDFPage_GetCropBox(FPDF_PAGE page, - float* left, - float* bottom, - float* right, - float* top) { - CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - return pPage && GetBoundingBox(pPage, "CropBox", left, bottom, right, top); -} - -DLLEXPORT FPDF_BOOL STDCALL FPDFPage_TransFormWithClip(FPDF_PAGE page, - FS_MATRIX* matrix, - FS_RECTF* clipRect) { - CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!pPage) - return FALSE; - - CFX_ByteTextBuf textBuf; - textBuf << "q "; - CFX_FloatRect rect(clipRect->left, clipRect->bottom, clipRect->right, - clipRect->top); - rect.Normalize(); - CFX_ByteString bsClipping; - bsClipping.Format("%f %f %f %f re W* n ", rect.left, rect.bottom, - rect.Width(), rect.Height()); - textBuf << bsClipping; - - CFX_ByteString bsMatix; - bsMatix.Format("%f %f %f %f %f %f cm ", matrix->a, matrix->b, matrix->c, - matrix->d, matrix->e, matrix->f); - textBuf << bsMatix; - - CPDF_Dictionary* pPageDic = pPage->m_pFormDict; - CPDF_Object* pContentObj = - pPageDic ? pPageDic->GetElement("Contents") : nullptr; - if (!pContentObj) - pContentObj = pPageDic ? pPageDic->GetArrayBy("Contents") : nullptr; - if (!pContentObj) - return FALSE; - - CPDF_Dictionary* pDic = new CPDF_Dictionary; - CPDF_Stream* pStream = new CPDF_Stream(nullptr, 0, pDic); - pStream->SetData(textBuf.GetBuffer(), textBuf.GetSize(), FALSE, FALSE); - CPDF_Document* pDoc = pPage->m_pDocument; - if (!pDoc) - return FALSE; - pDoc->AddIndirectObject(pStream); - - pDic = new CPDF_Dictionary; - CPDF_Stream* pEndStream = new CPDF_Stream(nullptr, 0, pDic); - pEndStream->SetData((const uint8_t*)" Q", 2, FALSE, FALSE); - pDoc->AddIndirectObject(pEndStream); - - CPDF_Array* pContentArray = nullptr; - if (CPDF_Array* pArray = ToArray(pContentObj)) { - pContentArray = pArray; - CPDF_Reference* pRef = new CPDF_Reference(pDoc, pStream->GetObjNum()); - pContentArray->InsertAt(0, pRef); - pContentArray->AddReference(pDoc, pEndStream); - } else if (CPDF_Reference* pReference = ToReference(pContentObj)) { - CPDF_Object* pDirectObj = pReference->GetDirect(); - if (pDirectObj) { - if (CPDF_Array* pArray = pDirectObj->AsArray()) { - pContentArray = pArray; - CPDF_Reference* pRef = new CPDF_Reference(pDoc, pStream->GetObjNum()); - pContentArray->InsertAt(0, pRef); - pContentArray->AddReference(pDoc, pEndStream); - } else if (pDirectObj->IsStream()) { - pContentArray = new CPDF_Array(); - pContentArray->AddReference(pDoc, pStream->GetObjNum()); - pContentArray->AddReference(pDoc, pDirectObj->GetObjNum()); - pContentArray->AddReference(pDoc, pEndStream); - pPageDic->SetAtReference("Contents", pDoc, - pDoc->AddIndirectObject(pContentArray)); - } - } - } - - // Need to transform the patterns as well. - CPDF_Dictionary* pRes = pPageDic->GetDictBy("Resources"); - if (pRes) { - CPDF_Dictionary* pPattenDict = pRes->GetDictBy("Pattern"); - if (pPattenDict) { - for (const auto& it : *pPattenDict) { - CPDF_Object* pObj = it.second; - if (pObj->IsReference()) - pObj = pObj->GetDirect(); - - CPDF_Dictionary* pDict = nullptr; - if (pObj->IsDictionary()) - pDict = pObj->AsDictionary(); - else if (CPDF_Stream* pStream = pObj->AsStream()) - pDict = pStream->GetDict(); - else - continue; - - CFX_Matrix m = pDict->GetMatrixBy("Matrix"); - CFX_Matrix t = *(CFX_Matrix*)matrix; - m.Concat(t); - pDict->SetAtMatrix("Matrix", m); - } - } - } - - return TRUE; -} - -DLLEXPORT void STDCALL -FPDFPageObj_TransformClipPath(FPDF_PAGEOBJECT page_object, - double a, - double b, - double c, - double d, - double e, - double f) { - CPDF_PageObject* pPageObj = (CPDF_PageObject*)page_object; - if (!pPageObj) - return; - CFX_Matrix matrix((FX_FLOAT)a, (FX_FLOAT)b, (FX_FLOAT)c, (FX_FLOAT)d, - (FX_FLOAT)e, (FX_FLOAT)f); - - // Special treatment to shading object, because the ClipPath for shading - // object is already transformed. - if (!pPageObj->IsShading()) - pPageObj->TransformClipPath(matrix); - pPageObj->TransformGeneralState(matrix); -} - -DLLEXPORT FPDF_CLIPPATH STDCALL FPDF_CreateClipPath(float left, - float bottom, - float right, - float top) { - CPDF_ClipPath* pNewClipPath = new CPDF_ClipPath(); - pNewClipPath->GetModify(); - CPDF_Path Path; - Path.GetModify(); - Path.AppendRect(left, bottom, right, top); - pNewClipPath->AppendPath(Path, FXFILL_ALTERNATE, FALSE); - return pNewClipPath; -} - -DLLEXPORT void STDCALL FPDF_DestroyClipPath(FPDF_CLIPPATH clipPath) { - delete (CPDF_ClipPath*)clipPath; -} - -void OutputPath(CFX_ByteTextBuf& buf, CPDF_Path path) { - const CFX_PathData* pPathData = path; - if (!pPathData) - return; - - FX_PATHPOINT* pPoints = pPathData->GetPoints(); - - if (path.IsRect()) { - buf << (pPoints[0].m_PointX) << " " << (pPoints[0].m_PointY) << " " - << (pPoints[2].m_PointX - pPoints[0].m_PointX) << " " - << (pPoints[2].m_PointY - pPoints[0].m_PointY) << " re\n"; - return; - } - - CFX_ByteString temp; - for (int i = 0; i < pPathData->GetPointCount(); i++) { - buf << (pPoints[i].m_PointX) << " " << (pPoints[i].m_PointY); - int point_type = pPoints[i].m_Flag & FXPT_TYPE; - if (point_type == FXPT_MOVETO) { - buf << " m\n"; - } else if (point_type == FXPT_BEZIERTO) { - buf << " " << (pPoints[i + 1].m_PointX) << " " - << (pPoints[i + 1].m_PointY) << " " << (pPoints[i + 2].m_PointX) - << " " << (pPoints[i + 2].m_PointY); - if (pPoints[i + 2].m_Flag & FXPT_CLOSEFIGURE) - buf << " c h\n"; - else - buf << " c\n"; - i += 2; - } else if (point_type == FXPT_LINETO) { - if (pPoints[i].m_Flag & FXPT_CLOSEFIGURE) - buf << " l h\n"; - else - buf << " l\n"; - } - } -} - -DLLEXPORT void STDCALL FPDFPage_InsertClipPath(FPDF_PAGE page, - FPDF_CLIPPATH clipPath) { - CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!pPage) - return; - - CPDF_Dictionary* pPageDic = pPage->m_pFormDict; - CPDF_Object* pContentObj = - pPageDic ? pPageDic->GetElement("Contents") : nullptr; - if (!pContentObj) - pContentObj = pPageDic ? pPageDic->GetArrayBy("Contents") : nullptr; - if (!pContentObj) - return; - - CFX_ByteTextBuf strClip; - CPDF_ClipPath* pClipPath = (CPDF_ClipPath*)clipPath; - FX_DWORD i; - for (i = 0; i < pClipPath->GetPathCount(); i++) { - CPDF_Path path = pClipPath->GetPath(i); - int iClipType = pClipPath->GetClipType(i); - if (path.GetPointCount() == 0) { - // Empty clipping (totally clipped out) - strClip << "0 0 m W n "; - } else { - OutputPath(strClip, path); - if (iClipType == FXFILL_WINDING) - strClip << "W n\n"; - else - strClip << "W* n\n"; - } - } - CPDF_Dictionary* pDic = new CPDF_Dictionary; - CPDF_Stream* pStream = new CPDF_Stream(nullptr, 0, pDic); - pStream->SetData(strClip.GetBuffer(), strClip.GetSize(), FALSE, FALSE); - CPDF_Document* pDoc = pPage->m_pDocument; - if (!pDoc) - return; - pDoc->AddIndirectObject(pStream); - - CPDF_Array* pContentArray = nullptr; - if (CPDF_Array* pArray = ToArray(pContentObj)) { - pContentArray = pArray; - CPDF_Reference* pRef = new CPDF_Reference(pDoc, pStream->GetObjNum()); - pContentArray->InsertAt(0, pRef); - } else if (CPDF_Reference* pReference = ToReference(pContentObj)) { - CPDF_Object* pDirectObj = pReference->GetDirect(); - if (pDirectObj) { - if (CPDF_Array* pArray = pDirectObj->AsArray()) { - pContentArray = pArray; - CPDF_Reference* pRef = new CPDF_Reference(pDoc, pStream->GetObjNum()); - pContentArray->InsertAt(0, pRef); - } else if (pDirectObj->IsStream()) { - pContentArray = new CPDF_Array(); - pContentArray->AddReference(pDoc, pStream->GetObjNum()); - pContentArray->AddReference(pDoc, pDirectObj->GetObjNum()); - pPageDic->SetAtReference("Contents", pDoc, - pDoc->AddIndirectObject(pContentArray)); - } - } - } -} diff --git a/fpdfsdk/src/fpdfdoc.cpp b/fpdfsdk/src/fpdfdoc.cpp deleted file mode 100644 index a6d09b70cf..0000000000 --- a/fpdfsdk/src/fpdfdoc.cpp +++ /dev/null @@ -1,369 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "public/fpdf_doc.h" - -#include <set> - -#include "core/include/fpdfapi/cpdf_array.h" -#include "core/include/fpdfapi/cpdf_document.h" -#include "fpdfsdk/include/fsdk_define.h" -#include "third_party/base/stl_util.h" - -namespace { - -int THISMODULE = 0; - -CPDF_Bookmark FindBookmark(const CPDF_BookmarkTree& tree, - CPDF_Bookmark bookmark, - const CFX_WideString& title, - std::set<CPDF_Dictionary*>* visited) { - // Return if already checked to avoid circular calling. - if (pdfium::ContainsKey(*visited, bookmark.GetDict())) - return CPDF_Bookmark(); - visited->insert(bookmark.GetDict()); - - if (bookmark.GetDict() && - bookmark.GetTitle().CompareNoCase(title.c_str()) == 0) { - // First check this item. - return bookmark; - } - - // Go into children items. - CPDF_Bookmark child = tree.GetFirstChild(bookmark); - while (child.GetDict() && !pdfium::ContainsKey(*visited, child.GetDict())) { - // Check this item and its children. - CPDF_Bookmark found = FindBookmark(tree, child, title, visited); - if (found.GetDict()) - return found; - child = tree.GetNextSibling(child); - } - return CPDF_Bookmark(); -} - -void ReleaseLinkList(void* data) { - delete (CPDF_LinkList*)data; -} - -CPDF_LinkList* GetLinkList(CPDF_Page* page) { - if (!page) - return nullptr; - - // Link list is stored with the document - CPDF_Document* pDoc = page->m_pDocument; - CPDF_LinkList* pLinkList = (CPDF_LinkList*)pDoc->GetPrivateData(&THISMODULE); - if (!pLinkList) { - pLinkList = new CPDF_LinkList; - pDoc->SetPrivateData(&THISMODULE, pLinkList, ReleaseLinkList); - } - return pLinkList; -} - -} // namespace - -DLLEXPORT FPDF_BOOKMARK STDCALL -FPDFBookmark_GetFirstChild(FPDF_DOCUMENT document, FPDF_BOOKMARK pDict) { - CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); - if (!pDoc) - return nullptr; - CPDF_BookmarkTree tree(pDoc); - CPDF_Bookmark bookmark = - CPDF_Bookmark(ToDictionary(static_cast<CPDF_Object*>(pDict))); - return tree.GetFirstChild(bookmark).GetDict(); -} - -DLLEXPORT FPDF_BOOKMARK STDCALL -FPDFBookmark_GetNextSibling(FPDF_DOCUMENT document, FPDF_BOOKMARK pDict) { - if (!pDict) - return nullptr; - CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); - if (!pDoc) - return nullptr; - CPDF_BookmarkTree tree(pDoc); - CPDF_Bookmark bookmark = - CPDF_Bookmark(ToDictionary(static_cast<CPDF_Object*>(pDict))); - return tree.GetNextSibling(bookmark).GetDict(); -} - -DLLEXPORT unsigned long STDCALL FPDFBookmark_GetTitle(FPDF_BOOKMARK pDict, - void* buffer, - unsigned long buflen) { - if (!pDict) - return 0; - CPDF_Bookmark bookmark(ToDictionary(static_cast<CPDF_Object*>(pDict))); - CFX_WideString title = bookmark.GetTitle(); - CFX_ByteString encodedTitle = title.UTF16LE_Encode(); - unsigned long len = encodedTitle.GetLength(); - if (buffer && buflen >= len) { - FXSYS_memcpy(buffer, encodedTitle.c_str(), len); - } - return len; -} - -DLLEXPORT FPDF_BOOKMARK STDCALL FPDFBookmark_Find(FPDF_DOCUMENT document, - FPDF_WIDESTRING title) { - if (!title || title[0] == 0) - return nullptr; - CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); - if (!pDoc) - return nullptr; - CPDF_BookmarkTree tree(pDoc); - FX_STRSIZE len = CFX_WideString::WStringLength(title); - CFX_WideString encodedTitle = CFX_WideString::FromUTF16LE(title, len); - std::set<CPDF_Dictionary*> visited; - return FindBookmark(tree, CPDF_Bookmark(), encodedTitle, &visited).GetDict(); -} - -DLLEXPORT FPDF_DEST STDCALL FPDFBookmark_GetDest(FPDF_DOCUMENT document, - FPDF_BOOKMARK pDict) { - if (!pDict) - return nullptr; - CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); - if (!pDoc) - return nullptr; - CPDF_Bookmark bookmark(ToDictionary(static_cast<CPDF_Object*>(pDict))); - CPDF_Dest dest = bookmark.GetDest(pDoc); - if (dest.GetObject()) - return dest.GetObject(); - // If this bookmark is not directly associated with a dest, we try to get - // action - CPDF_Action action = bookmark.GetAction(); - if (!action.GetDict()) - return nullptr; - return action.GetDest(pDoc).GetObject(); -} - -DLLEXPORT FPDF_ACTION STDCALL FPDFBookmark_GetAction(FPDF_BOOKMARK pDict) { - if (!pDict) - return NULL; - CPDF_Bookmark bookmark(ToDictionary(static_cast<CPDF_Object*>(pDict))); - return bookmark.GetAction().GetDict(); -} - -DLLEXPORT unsigned long STDCALL FPDFAction_GetType(FPDF_ACTION pDict) { - if (!pDict) - return PDFACTION_UNSUPPORTED; - - CPDF_Action action(ToDictionary(static_cast<CPDF_Object*>(pDict))); - CPDF_Action::ActionType type = action.GetType(); - switch (type) { - case CPDF_Action::GoTo: - return PDFACTION_GOTO; - case CPDF_Action::GoToR: - return PDFACTION_REMOTEGOTO; - case CPDF_Action::URI: - return PDFACTION_URI; - case CPDF_Action::Launch: - return PDFACTION_LAUNCH; - default: - return PDFACTION_UNSUPPORTED; - } -} - -DLLEXPORT FPDF_DEST STDCALL FPDFAction_GetDest(FPDF_DOCUMENT document, - FPDF_ACTION pDict) { - if (!pDict) - return nullptr; - CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); - if (!pDoc) - return nullptr; - CPDF_Action action(ToDictionary(static_cast<CPDF_Object*>(pDict))); - return action.GetDest(pDoc).GetObject(); -} - -DLLEXPORT unsigned long STDCALL -FPDFAction_GetFilePath(FPDF_ACTION pDict, void* buffer, unsigned long buflen) { - unsigned long type = FPDFAction_GetType(pDict); - if (type != PDFACTION_REMOTEGOTO && type != PDFACTION_LAUNCH) - return 0; - - CPDF_Action action(ToDictionary(static_cast<CPDF_Object*>(pDict))); - CFX_ByteString path = action.GetFilePath().UTF8Encode(); - unsigned long len = path.GetLength() + 1; - if (buffer && buflen >= len) - FXSYS_memcpy(buffer, path.c_str(), len); - return len; -} - -DLLEXPORT unsigned long STDCALL FPDFAction_GetURIPath(FPDF_DOCUMENT document, - FPDF_ACTION pDict, - void* buffer, - unsigned long buflen) { - if (!pDict) - return 0; - CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); - if (!pDoc) - return 0; - CPDF_Action action(ToDictionary(static_cast<CPDF_Object*>(pDict))); - CFX_ByteString path = action.GetURI(pDoc); - unsigned long len = path.GetLength() + 1; - if (buffer && buflen >= len) - FXSYS_memcpy(buffer, path.c_str(), len); - return len; -} - -DLLEXPORT unsigned long STDCALL FPDFDest_GetPageIndex(FPDF_DOCUMENT document, - FPDF_DEST pDict) { - if (!pDict) - return 0; - CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); - if (!pDoc) - return 0; - CPDF_Dest dest(static_cast<CPDF_Array*>(pDict)); - return dest.GetPageIndex(pDoc); -} - -DLLEXPORT FPDF_LINK STDCALL -FPDFLink_GetLinkAtPoint(FPDF_PAGE page, double x, double y) { - CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!pPage) - return nullptr; - - CPDF_LinkList* pLinkList = GetLinkList(pPage); - if (!pLinkList) - return nullptr; - - return pLinkList->GetLinkAtPoint(pPage, (FX_FLOAT)x, (FX_FLOAT)y, nullptr) - .GetDict(); -} - -DLLEXPORT int STDCALL -FPDFLink_GetLinkZOrderAtPoint(FPDF_PAGE page, double x, double y) { - CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!pPage) - return -1; - - CPDF_LinkList* pLinkList = GetLinkList(pPage); - if (!pLinkList) - return -1; - - int z_order = -1; - pLinkList->GetLinkAtPoint(pPage, (FX_FLOAT)x, (FX_FLOAT)y, &z_order); - return z_order; -} - -DLLEXPORT FPDF_DEST STDCALL FPDFLink_GetDest(FPDF_DOCUMENT document, - FPDF_LINK pDict) { - if (!pDict) - return nullptr; - CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); - if (!pDoc) - return nullptr; - CPDF_Link link(ToDictionary(static_cast<CPDF_Object*>(pDict))); - FPDF_DEST dest = link.GetDest(pDoc).GetObject(); - if (dest) - return dest; - // If this link is not directly associated with a dest, we try to get action - CPDF_Action action = link.GetAction(); - if (!action.GetDict()) - return nullptr; - return action.GetDest(pDoc).GetObject(); -} - -DLLEXPORT FPDF_ACTION STDCALL FPDFLink_GetAction(FPDF_LINK pDict) { - if (!pDict) - return nullptr; - - CPDF_Link link(ToDictionary(static_cast<CPDF_Object*>(pDict))); - return link.GetAction().GetDict(); -} - -DLLEXPORT FPDF_BOOL STDCALL FPDFLink_Enumerate(FPDF_PAGE page, - int* startPos, - FPDF_LINK* linkAnnot) { - if (!startPos || !linkAnnot) - return FALSE; - CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!pPage || !pPage->m_pFormDict) - return FALSE; - CPDF_Array* pAnnots = pPage->m_pFormDict->GetArrayBy("Annots"); - if (!pAnnots) - return FALSE; - for (int i = *startPos; i < (int)pAnnots->GetCount(); i++) { - CPDF_Dictionary* pDict = - ToDictionary(static_cast<CPDF_Object*>(pAnnots->GetElementValue(i))); - if (!pDict) - continue; - if (pDict->GetStringBy("Subtype").Equal("Link")) { - *startPos = i + 1; - *linkAnnot = (FPDF_LINK)pDict; - return TRUE; - } - } - return FALSE; -} - -DLLEXPORT FPDF_BOOL STDCALL FPDFLink_GetAnnotRect(FPDF_LINK linkAnnot, - FS_RECTF* rect) { - if (!linkAnnot || !rect) - return FALSE; - CPDF_Dictionary* pAnnotDict = - ToDictionary(static_cast<CPDF_Object*>(linkAnnot)); - CFX_FloatRect rt = pAnnotDict->GetRectBy("Rect"); - rect->left = rt.left; - rect->bottom = rt.bottom; - rect->right = rt.right; - rect->top = rt.top; - return TRUE; -} - -DLLEXPORT int STDCALL FPDFLink_CountQuadPoints(FPDF_LINK linkAnnot) { - if (!linkAnnot) - return 0; - CPDF_Dictionary* pAnnotDict = - ToDictionary(static_cast<CPDF_Object*>(linkAnnot)); - CPDF_Array* pArray = pAnnotDict->GetArrayBy("QuadPoints"); - if (!pArray) - return 0; - return pArray->GetCount() / 8; -} - -DLLEXPORT FPDF_BOOL STDCALL FPDFLink_GetQuadPoints(FPDF_LINK linkAnnot, - int quadIndex, - FS_QUADPOINTSF* quadPoints) { - if (!linkAnnot || !quadPoints) - return FALSE; - CPDF_Dictionary* pAnnotDict = - ToDictionary(static_cast<CPDF_Object*>(linkAnnot)); - CPDF_Array* pArray = pAnnotDict->GetArrayBy("QuadPoints"); - if (pArray) { - if (quadIndex < 0 || quadIndex >= (int)pArray->GetCount() / 8 || - ((quadIndex * 8 + 7) >= (int)pArray->GetCount())) - return FALSE; - quadPoints->x1 = pArray->GetNumberAt(quadIndex * 8); - quadPoints->y1 = pArray->GetNumberAt(quadIndex * 8 + 1); - quadPoints->x2 = pArray->GetNumberAt(quadIndex * 8 + 2); - quadPoints->y2 = pArray->GetNumberAt(quadIndex * 8 + 3); - quadPoints->x3 = pArray->GetNumberAt(quadIndex * 8 + 4); - quadPoints->y3 = pArray->GetNumberAt(quadIndex * 8 + 5); - quadPoints->x4 = pArray->GetNumberAt(quadIndex * 8 + 6); - quadPoints->y4 = pArray->GetNumberAt(quadIndex * 8 + 7); - return TRUE; - } - return FALSE; -} - -DLLEXPORT unsigned long STDCALL FPDF_GetMetaText(FPDF_DOCUMENT doc, - FPDF_BYTESTRING tag, - void* buffer, - unsigned long buflen) { - if (!tag) - return 0; - CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(doc); - if (!pDoc) - return 0; - CPDF_Dictionary* pInfo = pDoc->GetInfo(); - if (!pInfo) - return 0; - CFX_WideString text = pInfo->GetUnicodeTextBy(tag); - // Use UTF-16LE encoding - CFX_ByteString encodedText = text.UTF16LE_Encode(); - unsigned long len = encodedText.GetLength(); - if (buffer && buflen >= len) { - FXSYS_memcpy(buffer, encodedText.c_str(), len); - } - return len; -} diff --git a/fpdfsdk/src/fpdfdoc_embeddertest.cpp b/fpdfsdk/src/fpdfdoc_embeddertest.cpp deleted file mode 100644 index 4788773982..0000000000 --- a/fpdfsdk/src/fpdfdoc_embeddertest.cpp +++ /dev/null @@ -1,140 +0,0 @@ -// Copyright 2015 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include <string> - -#include "core/include/fxcrt/fx_string.h" -#include "public/fpdf_doc.h" -#include "public/fpdfview.h" -#include "testing/embedder_test.h" -#include "testing/fx_string_testhelpers.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "testing/test_support.h" - -class FPDFDocEmbeddertest : public EmbedderTest {}; - -TEST_F(FPDFDocEmbeddertest, DestGetPageIndex) { - EXPECT_TRUE(OpenDocument("named_dests.pdf")); - - // NULL FPDF_DEST case. - EXPECT_EQ(0U, FPDFDest_GetPageIndex(document(), nullptr)); - - // Page number directly in item from Dests NameTree. - FPDF_DEST dest = FPDF_GetNamedDestByName(document(), "First"); - EXPECT_NE(nullptr, dest); - EXPECT_EQ(1U, FPDFDest_GetPageIndex(document(), dest)); - - // Page number via object reference in item from Dests NameTree. - dest = FPDF_GetNamedDestByName(document(), "Next"); - EXPECT_NE(nullptr, dest); - EXPECT_EQ(1U, FPDFDest_GetPageIndex(document(), dest)); - - // Page number directly in item from Dests dictionary. - dest = FPDF_GetNamedDestByName(document(), "FirstAlternate"); - EXPECT_NE(nullptr, dest); - EXPECT_EQ(11U, FPDFDest_GetPageIndex(document(), dest)); - - // Invalid object reference in item from Dests NameTree. - dest = FPDF_GetNamedDestByName(document(), "LastAlternate"); - EXPECT_NE(nullptr, dest); - EXPECT_EQ(0U, FPDFDest_GetPageIndex(document(), dest)); -} - -TEST_F(FPDFDocEmbeddertest, ActionGetFilePath) { - EXPECT_TRUE(OpenDocument("launch_action.pdf")); - - FPDF_PAGE page = FPDF_LoadPage(document(), 0); - ASSERT_TRUE(page); - - // The target action is nearly the size of the whole page. - FPDF_LINK link = FPDFLink_GetLinkAtPoint(page, 100, 100); - ASSERT_TRUE(link); - - FPDF_ACTION action = FPDFLink_GetAction(link); - ASSERT_TRUE(action); - - const char kExpectedResult[] = "test.pdf"; - const unsigned long kExpectedLength = sizeof(kExpectedResult); - unsigned long bufsize = FPDFAction_GetFilePath(action, nullptr, 0); - ASSERT_EQ(kExpectedLength, bufsize); - - char buf[kExpectedLength]; - EXPECT_EQ(bufsize, FPDFAction_GetFilePath(action, buf, bufsize)); - EXPECT_EQ(std::string(kExpectedResult), std::string(buf)); - - FPDF_ClosePage(page); -} - -TEST_F(FPDFDocEmbeddertest, NoBookmarks) { - // Open a file with no bookmarks. - EXPECT_TRUE(OpenDocument("named_dests.pdf")); - - // The non-existent top-level bookmark has no title. - unsigned short buf[128]; - EXPECT_EQ(0, FPDFBookmark_GetTitle(nullptr, buf, sizeof(buf))); - - // The non-existent top-level bookmark has no children. - EXPECT_EQ(nullptr, FPDFBookmark_GetFirstChild(document(), nullptr)); -} - -TEST_F(FPDFDocEmbeddertest, Bookmarks) { - // Open a file with two bookmarks. - EXPECT_TRUE(OpenDocument("bookmarks.pdf")); - - // The existent top-level bookmark has no title. - unsigned short buf[128]; - EXPECT_EQ(0, FPDFBookmark_GetTitle(nullptr, buf, sizeof(buf))); - - FPDF_BOOKMARK child = FPDFBookmark_GetFirstChild(document(), nullptr); - EXPECT_NE(nullptr, child); - EXPECT_EQ(34, FPDFBookmark_GetTitle(child, buf, sizeof(buf))); - EXPECT_EQ(CFX_WideString(L"A Good Beginning"), - CFX_WideString::FromUTF16LE(buf, 16)); - - EXPECT_EQ(nullptr, FPDFBookmark_GetFirstChild(document(), child)); - - FPDF_BOOKMARK sibling = FPDFBookmark_GetNextSibling(document(), child); - EXPECT_NE(nullptr, sibling); - EXPECT_EQ(28, FPDFBookmark_GetTitle(sibling, buf, sizeof(buf))); - EXPECT_EQ(CFX_WideString(L"A Good Ending"), - CFX_WideString::FromUTF16LE(buf, 13)); - - EXPECT_EQ(nullptr, FPDFBookmark_GetNextSibling(document(), sibling)); -} - -TEST_F(FPDFDocEmbeddertest, FindBookmarks) { - // Open a file with two bookmarks. - EXPECT_TRUE(OpenDocument("bookmarks.pdf")); - - // Find the first one, based on its known title. - std::unique_ptr<unsigned short, pdfium::FreeDeleter> title = - GetFPDFWideString(L"A Good Beginning"); - FPDF_BOOKMARK child = FPDFBookmark_Find(document(), title.get()); - EXPECT_NE(nullptr, child); - - // Check that the string matches. - unsigned short buf[128]; - EXPECT_EQ(34, FPDFBookmark_GetTitle(child, buf, sizeof(buf))); - EXPECT_EQ(CFX_WideString(L"A Good Beginning"), - CFX_WideString::FromUTF16LE(buf, 16)); - - // Check that it is them same as the one returned by GetFirstChild. - EXPECT_EQ(child, FPDFBookmark_GetFirstChild(document(), nullptr)); - - // Try to find one using a non-existent title. - std::unique_ptr<unsigned short, pdfium::FreeDeleter> bad_title = - GetFPDFWideString(L"A BAD Beginning"); - EXPECT_EQ(nullptr, FPDFBookmark_Find(document(), bad_title.get())); -} - -// Check circular bookmarks will not cause infinite loop. -TEST_F(FPDFDocEmbeddertest, FindBookmarks_bug420) { - // Open a file with circular bookmarks. - EXPECT_TRUE(OpenDocument("bookmarks_circular.pdf")); - - // Try to find a title. - std::unique_ptr<unsigned short, pdfium::FreeDeleter> title = - GetFPDFWideString(L"anything"); - EXPECT_EQ(nullptr, FPDFBookmark_Find(document(), title.get())); -} diff --git a/fpdfsdk/src/fpdfdoc_unittest.cpp b/fpdfsdk/src/fpdfdoc_unittest.cpp deleted file mode 100644 index 04f885264e..0000000000 --- a/fpdfsdk/src/fpdfdoc_unittest.cpp +++ /dev/null @@ -1,226 +0,0 @@ -// Copyright 2016 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "public/fpdf_doc.h" - -#include <memory> -#include <vector> - -#include "core/include/fpdfapi/cpdf_document.h" -#include "core/include/fpdfapi/cpdf_name.h" -#include "core/include/fpdfapi/cpdf_number.h" -#include "core/include/fpdfapi/cpdf_reference.h" -#include "core/include/fpdfapi/cpdf_string.h" -#include "core/include/fpdfapi/fpdf_module.h" -#include "core/include/fpdfdoc/fpdf_doc.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "testing/test_support.h" - -#ifdef PDF_ENABLE_XFA -#include "fpdfsdk/include/fpdfxfa/fpdfxfa_app.h" -#include "fpdfsdk/include/fpdfxfa/fpdfxfa_doc.h" -#endif // PDF_ENABLE_XFA - -class CPDF_TestDocument : public CPDF_Document { - public: - void SetRoot(CPDF_Dictionary* root) { m_pRootDict = root; } - CPDF_IndirectObjectHolder* GetHolder() { return this; } -}; - -#ifdef PDF_ENABLE_XFA -class CPDF_TestXFADocument : public CPDFXFA_Document { - public: - CPDF_TestXFADocument() - : CPDFXFA_Document(new CPDF_TestDocument(), CPDFXFA_App::GetInstance()) {} - - void SetRoot(CPDF_Dictionary* root) { - reinterpret_cast<CPDF_TestDocument*>(GetPDFDoc())->SetRoot(root); - } - - CPDF_IndirectObjectHolder* GetHolder() { return GetPDFDoc(); } -}; -using CPDF_TestPdfDocument = CPDF_TestXFADocument; -#else // PDF_ENABLE_XFA -using CPDF_TestPdfDocument = CPDF_TestDocument; -#endif // PDF_ENABLE_XFA - -class PDFDocTest : public testing::Test { - public: - struct DictObjInfo { - FX_DWORD num; - CPDF_Dictionary* obj; - }; - - void SetUp() override { - // We don't need page module or render module, but - // initialize them to keep the code sane. - CPDF_ModuleMgr::Create(); - CPDF_ModuleMgr* module_mgr = CPDF_ModuleMgr::Get(); - module_mgr->InitPageModule(); - module_mgr->InitRenderModule(); - - m_pDoc.reset(new CPDF_TestPdfDocument()); - m_pIndirectObjs = m_pDoc->GetHolder(); - // Setup the root directory. - m_pRootObj.reset(new CPDF_Dictionary()); - m_pDoc->SetRoot(m_pRootObj.get()); - } - - std::vector<DictObjInfo> CreateDictObjs(int num) { - std::vector<DictObjInfo> info; - for (int i = 0; i < num; ++i) { - // Objects created will be released by the document. - CPDF_Dictionary* obj(new CPDF_Dictionary()); - m_pIndirectObjs->AddIndirectObject(obj); - info.push_back({obj->GetObjNum(), obj}); - } - return info; - } - - protected: - std::unique_ptr<CPDF_TestPdfDocument> m_pDoc; - CPDF_IndirectObjectHolder* m_pIndirectObjs; - std::unique_ptr<CPDF_Dictionary, ReleaseDeleter<CPDF_Dictionary>> m_pRootObj; -}; - -TEST_F(PDFDocTest, FindBookmark) { - { - // No bookmark information. - std::unique_ptr<unsigned short, pdfium::FreeDeleter> title = - GetFPDFWideString(L""); - EXPECT_EQ(nullptr, FPDFBookmark_Find(m_pDoc.get(), title.get())); - - title = GetFPDFWideString(L"Preface"); - EXPECT_EQ(nullptr, FPDFBookmark_Find(m_pDoc.get(), title.get())); - } - { - // Empty bookmark tree. - m_pRootObj->SetAt("Outlines", new CPDF_Dictionary()); - std::unique_ptr<unsigned short, pdfium::FreeDeleter> title = - GetFPDFWideString(L""); - EXPECT_EQ(nullptr, FPDFBookmark_Find(m_pDoc.get(), title.get())); - - title = GetFPDFWideString(L"Preface"); - EXPECT_EQ(nullptr, FPDFBookmark_Find(m_pDoc.get(), title.get())); - } - { - // Check on a regular bookmark tree. - auto bookmarks = CreateDictObjs(3); - - bookmarks[1].obj->SetAt("Title", new CPDF_String(L"Chapter 1")); - bookmarks[1].obj->SetAt( - "Parent", new CPDF_Reference(m_pIndirectObjs, bookmarks[0].num)); - bookmarks[1].obj->SetAt( - "Next", new CPDF_Reference(m_pIndirectObjs, bookmarks[2].num)); - - bookmarks[2].obj->SetAt("Title", new CPDF_String(L"Chapter 2")); - bookmarks[2].obj->SetAt( - "Parent", new CPDF_Reference(m_pIndirectObjs, bookmarks[0].num)); - bookmarks[2].obj->SetAt( - "Prev", new CPDF_Reference(m_pIndirectObjs, bookmarks[1].num)); - - bookmarks[0].obj->SetAt("Type", new CPDF_Name("Outlines")); - bookmarks[0].obj->SetAt("Count", new CPDF_Number(2)); - bookmarks[0].obj->SetAt( - "First", new CPDF_Reference(m_pIndirectObjs, bookmarks[1].num)); - bookmarks[0].obj->SetAt( - "Last", new CPDF_Reference(m_pIndirectObjs, bookmarks[2].num)); - - m_pRootObj->SetAt("Outlines", - new CPDF_Reference(m_pIndirectObjs, bookmarks[0].num)); - - // Title with no match. - std::unique_ptr<unsigned short, pdfium::FreeDeleter> title = - GetFPDFWideString(L"Chapter 3"); - EXPECT_EQ(nullptr, FPDFBookmark_Find(m_pDoc.get(), title.get())); - - // Title with partial match only. - title = GetFPDFWideString(L"Chapter"); - EXPECT_EQ(nullptr, FPDFBookmark_Find(m_pDoc.get(), title.get())); - - // Title with a match. - title = GetFPDFWideString(L"Chapter 2"); - EXPECT_EQ(bookmarks[2].obj, FPDFBookmark_Find(m_pDoc.get(), title.get())); - - // Title match is case insensitive. - title = GetFPDFWideString(L"cHaPter 2"); - EXPECT_EQ(bookmarks[2].obj, FPDFBookmark_Find(m_pDoc.get(), title.get())); - } - { - // Circular bookmarks in depth. - auto bookmarks = CreateDictObjs(3); - - bookmarks[1].obj->SetAt("Title", new CPDF_String(L"Chapter 1")); - bookmarks[1].obj->SetAt( - "Parent", new CPDF_Reference(m_pIndirectObjs, bookmarks[0].num)); - bookmarks[1].obj->SetAt( - "First", new CPDF_Reference(m_pIndirectObjs, bookmarks[2].num)); - - bookmarks[2].obj->SetAt("Title", new CPDF_String(L"Chapter 2")); - bookmarks[2].obj->SetAt( - "Parent", new CPDF_Reference(m_pIndirectObjs, bookmarks[1].num)); - bookmarks[2].obj->SetAt( - "First", new CPDF_Reference(m_pIndirectObjs, bookmarks[1].num)); - - bookmarks[0].obj->SetAt("Type", new CPDF_Name("Outlines")); - bookmarks[0].obj->SetAt("Count", new CPDF_Number(2)); - bookmarks[0].obj->SetAt( - "First", new CPDF_Reference(m_pIndirectObjs, bookmarks[1].num)); - bookmarks[0].obj->SetAt( - "Last", new CPDF_Reference(m_pIndirectObjs, bookmarks[2].num)); - - m_pRootObj->SetAt("Outlines", - new CPDF_Reference(m_pIndirectObjs, bookmarks[0].num)); - - // Title with no match. - std::unique_ptr<unsigned short, pdfium::FreeDeleter> title = - GetFPDFWideString(L"Chapter 3"); - EXPECT_EQ(nullptr, FPDFBookmark_Find(m_pDoc.get(), title.get())); - - // Title with a match. - title = GetFPDFWideString(L"Chapter 2"); - EXPECT_EQ(bookmarks[2].obj, FPDFBookmark_Find(m_pDoc.get(), title.get())); - } - { - // Circular bookmarks in breadth. - auto bookmarks = CreateDictObjs(4); - - bookmarks[1].obj->SetAt("Title", new CPDF_String(L"Chapter 1")); - bookmarks[1].obj->SetAt( - "Parent", new CPDF_Reference(m_pIndirectObjs, bookmarks[0].num)); - bookmarks[1].obj->SetAt( - "Next", new CPDF_Reference(m_pIndirectObjs, bookmarks[2].num)); - - bookmarks[2].obj->SetAt("Title", new CPDF_String(L"Chapter 2")); - bookmarks[2].obj->SetAt( - "Parent", new CPDF_Reference(m_pIndirectObjs, bookmarks[0].num)); - bookmarks[2].obj->SetAt( - "Next", new CPDF_Reference(m_pIndirectObjs, bookmarks[3].num)); - - bookmarks[3].obj->SetAt("Title", new CPDF_String(L"Chapter 3")); - bookmarks[3].obj->SetAt( - "Parent", new CPDF_Reference(m_pIndirectObjs, bookmarks[0].num)); - bookmarks[3].obj->SetAt( - "Next", new CPDF_Reference(m_pIndirectObjs, bookmarks[1].num)); - - bookmarks[0].obj->SetAt("Type", new CPDF_Name("Outlines")); - bookmarks[0].obj->SetAt("Count", new CPDF_Number(2)); - bookmarks[0].obj->SetAt( - "First", new CPDF_Reference(m_pIndirectObjs, bookmarks[1].num)); - bookmarks[0].obj->SetAt( - "Last", new CPDF_Reference(m_pIndirectObjs, bookmarks[2].num)); - - m_pRootObj->SetAt("Outlines", - new CPDF_Reference(m_pIndirectObjs, bookmarks[0].num)); - - // Title with no match. - std::unique_ptr<unsigned short, pdfium::FreeDeleter> title = - GetFPDFWideString(L"Chapter 8"); - EXPECT_EQ(nullptr, FPDFBookmark_Find(m_pDoc.get(), title.get())); - - // Title with a match. - title = GetFPDFWideString(L"Chapter 3"); - EXPECT_EQ(bookmarks[3].obj, FPDFBookmark_Find(m_pDoc.get(), title.get())); - } -} diff --git a/fpdfsdk/src/fpdfedit_embeddertest.cpp b/fpdfsdk/src/fpdfedit_embeddertest.cpp deleted file mode 100644 index 480ef51dbd..0000000000 --- a/fpdfsdk/src/fpdfedit_embeddertest.cpp +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright 2016 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "public/fpdf_edit.h" -#include "public/fpdfview.h" -#include "testing/embedder_test.h" -#include "testing/gmock/include/gmock/gmock-matchers.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "testing/test_support.h" - -class FPDFEditEmbeddertest : public EmbedderTest, public TestSaver {}; - -TEST_F(FPDFEditEmbeddertest, EmptyCreation) { - EXPECT_TRUE(CreateEmptyDocument()); - FPDF_PAGE page = FPDFPage_New(document(), 1, 640.0, 480.0); - EXPECT_NE(nullptr, page); - EXPECT_TRUE(FPDFPage_GenerateContent(page)); - EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); - EXPECT_THAT(GetString(), - testing::MatchesRegex( - "%PDF-1.7\r\n" - "%\xA1\xB3\xC5\xD7\r\n" - "1 0 obj\r\n" - "<</Pages 2 0 R /Type/Catalog>>\r\n" - "endobj\r\n" - "2 0 obj\r\n" - "<</Count 1/Kids\\[ 4 0 R \\]/Type/Pages>>\r\n" - "endobj\r\n" - "3 0 obj\r\n" - "<</CreationDate\\(D:.*\\)/Creator\\(PDFium\\)>>\r\n" - "endobj\r\n" - "4 0 obj\r\n" - "<</Contents 5 0 R /MediaBox\\[ 0 0 640 480\\]" - "/Parent 2 0 R /Resources<<>>/Rotate 0/Type/Page" - ">>\r\n" - "endobj\r\n" - "5 0 obj\r\n" - "<</Filter/FlateDecode/Length 8>>stream\r\n" - "x\x9C\x3\0\0\0\0\x1\r\n" - "endstream\r\n" - "endobj\r\n" - "xref\r\n" - "0 6\r\n" - "0000000000 65535 f\r\n" - "0000000017 00000 n\r\n" - "0000000066 00000 n\r\n" - "0000000122 00000 n\r\n" - "0000000192 00000 n\r\n" - "0000000301 00000 n\r\n" - "trailer\r\n" - "<<\r\n" - "/Root 1 0 R\r\n" - "/Info 3 0 R\r\n" - "/Size 6/ID\\[<.*><.*>\\]>>\r\n" - "startxref\r\n" - "379\r\n" - "%%EOF\r\n")); - FPDFPage_Delete(document(), 1); -} diff --git a/fpdfsdk/src/fpdfeditimg.cpp b/fpdfsdk/src/fpdfeditimg.cpp deleted file mode 100644 index de5c72f659..0000000000 --- a/fpdfsdk/src/fpdfeditimg.cpp +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "public/fpdf_edit.h" - -#include "fpdfsdk/include/fsdk_define.h" - -DLLEXPORT FPDF_PAGEOBJECT STDCALL -FPDFPageObj_NewImgeObj(FPDF_DOCUMENT document) { - CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); - if (!pDoc) - return nullptr; - CPDF_ImageObject* pImageObj = new CPDF_ImageObject; - CPDF_Image* pImg = new CPDF_Image(pDoc); - pImageObj->m_pImage = pImg; - return pImageObj; -} - -DLLEXPORT FPDF_BOOL STDCALL -FPDFImageObj_LoadJpegFile(FPDF_PAGE* pages, - int nCount, - FPDF_PAGEOBJECT image_object, - FPDF_FILEACCESS* fileAccess) { - if (!image_object || !fileAccess || !pages) - return FALSE; - - IFX_FileRead* pFile = new CPDF_CustomAccess(fileAccess); - CPDF_ImageObject* pImgObj = (CPDF_ImageObject*)image_object; - pImgObj->m_GeneralState.GetModify(); - for (int index = 0; index < nCount; index++) { - CPDF_Page* pPage = CPDFPageFromFPDFPage(pages[index]); - if (!pPage) - continue; - pImgObj->m_pImage->ResetCache(pPage, NULL); - } - pImgObj->m_pImage->SetJpegImage(pFile); - - return TRUE; -} - -DLLEXPORT FPDF_BOOL STDCALL FPDFImageObj_SetMatrix(FPDF_PAGEOBJECT image_object, - double a, - double b, - double c, - double d, - double e, - double f) { - if (!image_object) - return FALSE; - CPDF_ImageObject* pImgObj = (CPDF_ImageObject*)image_object; - pImgObj->m_Matrix.a = (FX_FLOAT)a; - pImgObj->m_Matrix.b = (FX_FLOAT)b; - pImgObj->m_Matrix.c = (FX_FLOAT)c; - pImgObj->m_Matrix.d = (FX_FLOAT)d; - pImgObj->m_Matrix.e = (FX_FLOAT)e; - pImgObj->m_Matrix.f = (FX_FLOAT)f; - pImgObj->CalcBoundingBox(); - return TRUE; -} - -DLLEXPORT FPDF_BOOL STDCALL FPDFImageObj_SetBitmap(FPDF_PAGE* pages, - int nCount, - FPDF_PAGEOBJECT image_object, - FPDF_BITMAP bitmap) { - if (!image_object || !bitmap || !pages) - return FALSE; - CFX_DIBitmap* pBmp = NULL; - pBmp = (CFX_DIBitmap*)bitmap; - CPDF_ImageObject* pImgObj = (CPDF_ImageObject*)image_object; - pImgObj->m_GeneralState.GetModify(); - for (int index = 0; index < nCount; index++) { - CPDF_Page* pPage = CPDFPageFromFPDFPage(pages[index]); - if (!pPage) - continue; - pImgObj->m_pImage->ResetCache(pPage, NULL); - } - pImgObj->m_pImage->SetImage(pBmp, FALSE); - pImgObj->CalcBoundingBox(); - return TRUE; -} diff --git a/fpdfsdk/src/fpdfeditpage.cpp b/fpdfsdk/src/fpdfeditpage.cpp deleted file mode 100644 index 992f08eb8b..0000000000 --- a/fpdfsdk/src/fpdfeditpage.cpp +++ /dev/null @@ -1,316 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "public/fpdf_edit.h" - -#include "core/include/fpdfapi/cpdf_array.h" -#include "core/include/fpdfapi/cpdf_document.h" -#include "core/include/fpdfapi/cpdf_number.h" -#include "core/include/fpdfapi/cpdf_string.h" -#include "fpdfsdk/include/fsdk_define.h" -#include "public/fpdf_formfill.h" -#include "third_party/base/stl_util.h" - -#ifdef PDF_ENABLE_XFA -#include "fpdfsdk/include/fpdfxfa/fpdfxfa_app.h" -#include "fpdfsdk/include/fpdfxfa/fpdfxfa_doc.h" -#include "fpdfsdk/include/fpdfxfa/fpdfxfa_page.h" -#endif // PDF_ENABLE_XFA - -#if _FX_OS_ == _FX_ANDROID_ -#include "time.h" -#else -#include <ctime> -#endif - -DLLEXPORT FPDF_DOCUMENT STDCALL FPDF_CreateNewDocument() { - CPDF_Document* pDoc = new CPDF_Document; - pDoc->CreateNewDoc(); - time_t currentTime; - - CFX_ByteString DateStr; - - if (FSDK_IsSandBoxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS)) { - if (-1 != time(¤tTime)) { - tm* pTM = localtime(¤tTime); - if (pTM) { - DateStr.Format("D:%04d%02d%02d%02d%02d%02d", pTM->tm_year + 1900, - pTM->tm_mon + 1, pTM->tm_mday, pTM->tm_hour, pTM->tm_min, - pTM->tm_sec); - } - } - } - - CPDF_Dictionary* pInfoDict = NULL; - pInfoDict = pDoc->GetInfo(); - if (pInfoDict) { - if (FSDK_IsSandBoxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS)) - pInfoDict->SetAt("CreationDate", new CPDF_String(DateStr, FALSE)); - pInfoDict->SetAt("Creator", new CPDF_String(L"PDFium")); - } - - return FPDFDocumentFromCPDFDocument(pDoc); -} - -DLLEXPORT void STDCALL FPDFPage_Delete(FPDF_DOCUMENT document, int page_index) { - CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); - if (!pDoc || page_index < 0 || page_index >= pDoc->GetPageCount()) - return; - - pDoc->DeletePage(page_index); -} - -DLLEXPORT FPDF_PAGE STDCALL FPDFPage_New(FPDF_DOCUMENT document, - int page_index, - double width, - double height) { - CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); - if (!pDoc) - return nullptr; - - if (page_index < 0) - page_index = 0; - if (pDoc->GetPageCount() < page_index) - page_index = pDoc->GetPageCount(); - - CPDF_Dictionary* pPageDict = pDoc->CreateNewPage(page_index); - if (!pPageDict) - return NULL; - CPDF_Array* pMediaBoxArray = new CPDF_Array; - pMediaBoxArray->Add(new CPDF_Number(0)); - pMediaBoxArray->Add(new CPDF_Number(0)); - pMediaBoxArray->Add(new CPDF_Number(FX_FLOAT(width))); - pMediaBoxArray->Add(new CPDF_Number(FX_FLOAT(height))); - - pPageDict->SetAt("MediaBox", pMediaBoxArray); - pPageDict->SetAt("Rotate", new CPDF_Number(0)); - pPageDict->SetAt("Resources", new CPDF_Dictionary); - -#ifdef PDF_ENABLE_XFA - CPDFXFA_Page* pPage = - new CPDFXFA_Page((CPDFXFA_Document*)document, page_index); - pPage->LoadPDFPage(pPageDict); -#else // PDF_ENABLE_XFA - CPDF_Page* pPage = new CPDF_Page; - pPage->Load(pDoc, pPageDict); - pPage->ParseContent(nullptr); -#endif // PDF_ENABLE_XFA - - return pPage; -} - -DLLEXPORT int STDCALL FPDFPage_GetRotation(FPDF_PAGE page) { - CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!pPage || !pPage->m_pFormDict || !pPage->m_pFormDict->KeyExist("Type") || - !pPage->m_pFormDict->GetElement("Type")->GetDirect() || - pPage->m_pFormDict->GetElement("Type")->GetDirect()->GetString().Compare( - "Page")) { - return -1; - } - CPDF_Dictionary* pDict = pPage->m_pFormDict; - if (!pDict) - return -1; - - while (pDict) { - if (pDict->KeyExist("Rotate")) { - CPDF_Object* pRotateObj = pDict->GetElement("Rotate")->GetDirect(); - return pRotateObj ? pRotateObj->GetInteger() / 90 : 0; - } - if (!pDict->KeyExist("Parent")) - break; - - pDict = ToDictionary(pDict->GetElement("Parent")->GetDirect()); - } - - return 0; -} - -DLLEXPORT void STDCALL FPDFPage_InsertObject(FPDF_PAGE page, - FPDF_PAGEOBJECT page_obj) { - CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!pPage || !pPage->m_pFormDict || !pPage->m_pFormDict->KeyExist("Type") || - !pPage->m_pFormDict->GetElement("Type")->GetDirect() || - pPage->m_pFormDict->GetElement("Type")->GetDirect()->GetString().Compare( - "Page")) { - return; - } - CPDF_PageObject* pPageObj = (CPDF_PageObject*)page_obj; - if (!pPageObj) - return; - - pPage->GetPageObjectList()->push_back( - std::unique_ptr<CPDF_PageObject>(pPageObj)); - - switch (pPageObj->GetType()) { - case FPDF_PAGEOBJ_PATH: { - CPDF_PathObject* pPathObj = pPageObj->AsPath(); - pPathObj->CalcBoundingBox(); - break; - } - case FPDF_PAGEOBJ_TEXT: { - break; - } - case FPDF_PAGEOBJ_IMAGE: { - CPDF_ImageObject* pImageObj = pPageObj->AsImage(); - pImageObj->CalcBoundingBox(); - break; - } - case FPDF_PAGEOBJ_SHADING: { - CPDF_ShadingObject* pShadingObj = pPageObj->AsShading(); - pShadingObj->CalcBoundingBox(); - break; - } - case FPDF_PAGEOBJ_FORM: { - CPDF_FormObject* pFormObj = pPageObj->AsForm(); - pFormObj->CalcBoundingBox(); - break; - } - default: - break; - } -} - -DLLEXPORT int STDCALL FPDFPage_CountObject(FPDF_PAGE page) { - CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!pPage || !pPage->m_pFormDict || !pPage->m_pFormDict->KeyExist("Type") || - !pPage->m_pFormDict->GetElement("Type")->GetDirect() || - pPage->m_pFormDict->GetElement("Type")->GetDirect()->GetString().Compare( - "Page")) { - return -1; - } - return pdfium::CollectionSize<int>(*pPage->GetPageObjectList()); -} - -DLLEXPORT FPDF_PAGEOBJECT STDCALL FPDFPage_GetObject(FPDF_PAGE page, - int index) { - CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!pPage || !pPage->m_pFormDict || !pPage->m_pFormDict->KeyExist("Type") || - pPage->m_pFormDict->GetElement("Type")->GetDirect()->GetString().Compare( - "Page")) { - return nullptr; - } - return pPage->GetPageObjectList()->GetPageObjectByIndex(index); -} - -DLLEXPORT FPDF_BOOL STDCALL FPDFPage_HasTransparency(FPDF_PAGE page) { - CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - return pPage && pPage->BackgroundAlphaNeeded(); -} - -DLLEXPORT FPDF_BOOL STDCALL -FPDFPageObj_HasTransparency(FPDF_PAGEOBJECT pageObject) { - if (!pageObject) - return FALSE; - CPDF_PageObject* pPageObj = (CPDF_PageObject*)pageObject; - - const CPDF_GeneralStateData* pGeneralState = pPageObj->m_GeneralState; - int blend_type = - pGeneralState ? pGeneralState->m_BlendType : FXDIB_BLEND_NORMAL; - if (blend_type != FXDIB_BLEND_NORMAL) - return TRUE; - - CPDF_Dictionary* pSMaskDict = - pGeneralState ? ToDictionary(pGeneralState->m_pSoftMask) : NULL; - if (pSMaskDict) - return TRUE; - - if (pGeneralState && pGeneralState->m_FillAlpha != 1.0f) - return TRUE; - - if (pPageObj->IsPath()) { - if (pGeneralState && pGeneralState->m_StrokeAlpha != 1.0f) - return TRUE; - } - - if (pPageObj->IsForm()) { - CPDF_FormObject* pFormObj = pPageObj->AsForm(); - if (pFormObj->m_pForm && - (pFormObj->m_pForm->m_Transparency & PDFTRANS_ISOLATED)) - return TRUE; - if (pFormObj->m_pForm && - (!(pFormObj->m_pForm->m_Transparency & PDFTRANS_ISOLATED) && - (pFormObj->m_pForm->m_Transparency & PDFTRANS_GROUP))) - return TRUE; - } - return FALSE; -} - -DLLEXPORT FPDF_BOOL STDCALL FPDFPage_GenerateContent(FPDF_PAGE page) { - CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!pPage || !pPage->m_pFormDict || !pPage->m_pFormDict->KeyExist("Type") || - !pPage->m_pFormDict->GetElement("Type")->GetDirect() || - pPage->m_pFormDict->GetElement("Type")->GetDirect()->GetString().Compare( - "Page")) { - return FALSE; - } - CPDF_PageContentGenerator CG(pPage); - CG.GenerateContent(); - - return TRUE; -} - -DLLEXPORT void STDCALL FPDFPageObj_Transform(FPDF_PAGEOBJECT page_object, - double a, - double b, - double c, - double d, - double e, - double f) { - CPDF_PageObject* pPageObj = (CPDF_PageObject*)page_object; - if (!pPageObj) - return; - - CFX_Matrix matrix((FX_FLOAT)a, (FX_FLOAT)b, (FX_FLOAT)c, (FX_FLOAT)d, - (FX_FLOAT)e, (FX_FLOAT)f); - pPageObj->Transform(matrix); -} -DLLEXPORT void STDCALL FPDFPage_TransformAnnots(FPDF_PAGE page, - double a, - double b, - double c, - double d, - double e, - double f) { - CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!pPage) - return; - CPDF_AnnotList AnnotList(pPage); - for (size_t i = 0; i < AnnotList.Count(); ++i) { - CPDF_Annot* pAnnot = AnnotList.GetAt(i); - // transformAnnots Rectangle - CFX_FloatRect rect; - pAnnot->GetRect(rect); - CFX_Matrix matrix((FX_FLOAT)a, (FX_FLOAT)b, (FX_FLOAT)c, (FX_FLOAT)d, - (FX_FLOAT)e, (FX_FLOAT)f); - rect.Transform(&matrix); - CPDF_Array* pRectArray = NULL; - pRectArray = pAnnot->GetAnnotDict()->GetArrayBy("Rect"); - if (!pRectArray) - pRectArray = new CPDF_Array; - pRectArray->SetAt(0, new CPDF_Number(rect.left)); - pRectArray->SetAt(1, new CPDF_Number(rect.bottom)); - pRectArray->SetAt(2, new CPDF_Number(rect.right)); - pRectArray->SetAt(3, new CPDF_Number(rect.top)); - pAnnot->GetAnnotDict()->SetAt("Rect", pRectArray); - - // Transform AP's rectangle - // To Do - } -} - -DLLEXPORT void STDCALL FPDFPage_SetRotation(FPDF_PAGE page, int rotate) { - CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!pPage || !pPage->m_pFormDict || !pPage->m_pFormDict->KeyExist("Type") || - !pPage->m_pFormDict->GetElement("Type")->GetDirect() || - pPage->m_pFormDict->GetElement("Type")->GetDirect()->GetString().Compare( - "Page")) { - return; - } - CPDF_Dictionary* pDict = pPage->m_pFormDict; - rotate %= 4; - - pDict->SetAt("Rotate", new CPDF_Number(rotate * 90)); -} diff --git a/fpdfsdk/src/fpdfext_embeddertest.cpp b/fpdfsdk/src/fpdfext_embeddertest.cpp deleted file mode 100644 index 7c28c29a8e..0000000000 --- a/fpdfsdk/src/fpdfext_embeddertest.cpp +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2016 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "public/fpdf_ext.h" -#include "public/fpdfview.h" -#include "testing/embedder_test.h" -#include "testing/gtest/include/gtest/gtest.h" - -class FPDFExtEmbeddertest : public EmbedderTest {}; - -TEST_F(FPDFExtEmbeddertest, PageModeUnknown) { - EXPECT_EQ(PAGEMODE_UNKNOWN, FPDFDoc_GetPageMode(nullptr)); -} - -TEST_F(FPDFExtEmbeddertest, PageModeUseNone) { - EXPECT_TRUE(OpenDocument("hello_world.pdf")); - EXPECT_EQ(PAGEMODE_USENONE, FPDFDoc_GetPageMode(document())); -} - -TEST_F(FPDFExtEmbeddertest, PageModeUseOutlines) { - EXPECT_TRUE(OpenDocument("use_outlines.pdf")); - EXPECT_EQ(PAGEMODE_USEOUTLINES, FPDFDoc_GetPageMode(document())); -} diff --git a/fpdfsdk/src/fpdfformfill.cpp b/fpdfsdk/src/fpdfformfill.cpp deleted file mode 100644 index 31f5732ce5..0000000000 --- a/fpdfsdk/src/fpdfformfill.cpp +++ /dev/null @@ -1,732 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "public/fpdf_formfill.h" - -#include <memory> -#include <vector> - -#include "core/include/fpdfapi/cpdf_document.h" -#include "fpdfsdk/include/fsdk_define.h" -#include "fpdfsdk/include/fsdk_mgr.h" -#include "public/fpdfview.h" -#include "third_party/base/stl_util.h" - -#ifdef PDF_ENABLE_XFA -#include "fpdfsdk/include/fpdfxfa/fpdfxfa_app.h" -#include "fpdfsdk/include/fpdfxfa/fpdfxfa_doc.h" -#include "fpdfsdk/include/fpdfxfa/fpdfxfa_page.h" -#endif // PDF_ENABLE_XFA - -namespace { - -CPDFSDK_InterForm* FormHandleToInterForm(FPDF_FORMHANDLE hHandle) { - CPDFSDK_Document* pSDKDoc = CPDFSDK_Document::FromFPDFFormHandle(hHandle); - return pSDKDoc ? pSDKDoc->GetInterForm() : nullptr; -} - -CPDFSDK_PageView* FormHandleToPageView(FPDF_FORMHANDLE hHandle, - FPDF_PAGE page) { - UnderlyingPageType* pPage = UnderlyingFromFPDFPage(page); - if (!pPage) - return nullptr; - - CPDFSDK_Document* pSDKDoc = CPDFSDK_Document::FromFPDFFormHandle(hHandle); - return pSDKDoc ? pSDKDoc->GetPageView(pPage, TRUE) : nullptr; -} - -#ifdef PDF_ENABLE_XFA -std::vector<CFX_ByteString>* FromFPDFStringHandle(FPDF_STRINGHANDLE handle) { - return reinterpret_cast<std::vector<CFX_ByteString>*>(handle); -} - -FPDF_STRINGHANDLE ToFPDFStringHandle(std::vector<CFX_ByteString>* strings) { - return reinterpret_cast<FPDF_STRINGHANDLE>(strings); -} -#endif // PDF_ENABLE_XFA - -} // namespace - -DLLEXPORT int STDCALL FPDFPage_HasFormFieldAtPoint(FPDF_FORMHANDLE hHandle, - FPDF_PAGE page, - double page_x, - double page_y) { - if (!hHandle) - return -1; - CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (pPage) { - CPDF_InterForm interform(pPage->m_pDocument, FALSE); - CPDF_FormControl* pFormCtrl = - interform.GetControlAtPoint(pPage, static_cast<FX_FLOAT>(page_x), - static_cast<FX_FLOAT>(page_y), nullptr); - if (!pFormCtrl) - return -1; - CPDF_FormField* pFormField = pFormCtrl->GetField(); - return pFormField ? pFormField->GetFieldType() : -1; - } - -#ifdef PDF_ENABLE_XFA - CPDFXFA_Page* pXFAPage = UnderlyingFromFPDFPage(page); - if (!pXFAPage) - return -1; - - IXFA_PageView* pPageView = pXFAPage->GetXFAPageView(); - if (!pPageView) - return -1; - - IXFA_DocView* pDocView = pPageView->GetDocView(); - if (!pDocView) - return -1; - - IXFA_WidgetHandler* pWidgetHandler = pDocView->GetWidgetHandler(); - if (!pWidgetHandler) - return -1; - - std::unique_ptr<IXFA_WidgetIterator, ReleaseDeleter<IXFA_WidgetIterator>> - pWidgetIterator(pPageView->CreateWidgetIterator( - XFA_TRAVERSEWAY_Form, - XFA_WIDGETFILTER_Viewable | XFA_WIDGETFILTER_AllType)); - if (!pWidgetIterator) - return -1; - - IXFA_Widget* pXFAAnnot = pWidgetIterator->MoveToNext(); - while (pXFAAnnot) { - CFX_RectF rcBBox; - pWidgetHandler->GetBBox(pXFAAnnot, rcBBox, 0); - CFX_FloatRect rcWidget(rcBBox.left, rcBBox.top, rcBBox.left + rcBBox.width, - rcBBox.top + rcBBox.height); - rcWidget.left -= 1.0f; - rcWidget.right += 1.0f; - rcWidget.bottom -= 1.0f; - rcWidget.top += 1.0f; - - if (rcWidget.Contains(static_cast<FX_FLOAT>(page_x), - static_cast<FX_FLOAT>(page_y))) { - return FPDF_FORMFIELD_XFA; - } - pXFAAnnot = pWidgetIterator->MoveToNext(); - } -#endif // PDF_ENABLE_XFA - return -1; -} - -DLLEXPORT int STDCALL FPDPage_HasFormFieldAtPoint(FPDF_FORMHANDLE hHandle, - FPDF_PAGE page, - double page_x, - double page_y) { - return FPDFPage_HasFormFieldAtPoint(hHandle, page, page_x, page_y); -} - -DLLEXPORT int STDCALL FPDFPage_FormFieldZOrderAtPoint(FPDF_FORMHANDLE hHandle, - FPDF_PAGE page, - double page_x, - double page_y) { - if (!hHandle) - return -1; - CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!pPage) - return -1; - CPDF_InterForm interform(pPage->m_pDocument, FALSE); - int z_order = -1; - (void)interform.GetControlAtPoint(pPage, (FX_FLOAT)page_x, (FX_FLOAT)page_y, - &z_order); - return z_order; -} - -DLLEXPORT FPDF_FORMHANDLE STDCALL -FPDFDOC_InitFormFillEnvironment(FPDF_DOCUMENT document, - FPDF_FORMFILLINFO* formInfo) { -#ifdef PDF_ENABLE_XFA - const int kRequiredVersion = 2; -#else // PDF_ENABLE_XFA - const int kRequiredVersion = 1; -#endif // PDF_ENABLE_XFA - if (!formInfo || formInfo->version != kRequiredVersion) - return nullptr; - - UnderlyingDocumentType* pDocument = UnderlyingFromFPDFDocument(document); - if (!pDocument) - return nullptr; - - CPDFDoc_Environment* pEnv = new CPDFDoc_Environment(pDocument, formInfo); -#ifdef PDF_ENABLE_XFA - pEnv->SetSDKDocument(pDocument->GetSDKDocument(pEnv)); - CPDFXFA_App* pApp = CPDFXFA_App::GetInstance(); - pApp->AddFormFillEnv(pEnv); -#else // PDF_ENABLE_XFA - pEnv->SetSDKDocument(new CPDFSDK_Document(pDocument, pEnv)); -#endif // PDF_ENABLE_XFA - return pEnv; -} - -DLLEXPORT void STDCALL -FPDFDOC_ExitFormFillEnvironment(FPDF_FORMHANDLE hHandle) { - if (!hHandle) - return; - CPDFDoc_Environment* pEnv = (CPDFDoc_Environment*)hHandle; -#ifdef PDF_ENABLE_XFA - CPDFXFA_App* pApp = CPDFXFA_App::GetInstance(); - pApp->RemoveFormFillEnv(pEnv); -#else // PDF_ENABLE_XFA - if (CPDFSDK_Document* pSDKDoc = pEnv->GetSDKDocument()) { - pEnv->SetSDKDocument(NULL); - delete pSDKDoc; - } -#endif // PDF_ENABLE_XFA - delete pEnv; -} - -DLLEXPORT FPDF_BOOL STDCALL FORM_OnMouseMove(FPDF_FORMHANDLE hHandle, - FPDF_PAGE page, - int modifier, - double page_x, - double page_y) { - CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page); - if (!pPageView) - return FALSE; - - CFX_FloatPoint pt((FX_FLOAT)page_x, (FX_FLOAT)page_y); - return pPageView->OnMouseMove(pt, modifier); -} - -DLLEXPORT FPDF_BOOL STDCALL FORM_OnLButtonDown(FPDF_FORMHANDLE hHandle, - FPDF_PAGE page, - int modifier, - double page_x, - double page_y) { - CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page); - if (!pPageView) - return FALSE; - - CFX_FloatPoint pt((FX_FLOAT)page_x, (FX_FLOAT)page_y); - return pPageView->OnLButtonDown(pt, modifier); -} - -DLLEXPORT FPDF_BOOL STDCALL FORM_OnLButtonUp(FPDF_FORMHANDLE hHandle, - FPDF_PAGE page, - int modifier, - double page_x, - double page_y) { - CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page); - if (!pPageView) - return FALSE; - - CFX_FloatPoint pt((FX_FLOAT)page_x, (FX_FLOAT)page_y); - return pPageView->OnLButtonUp(pt, modifier); -} - -#ifdef PDF_ENABLE_XFA -DLLEXPORT FPDF_BOOL STDCALL FORM_OnRButtonDown(FPDF_FORMHANDLE hHandle, - FPDF_PAGE page, - int modifier, - double page_x, - double page_y) { - CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page); - if (!pPageView) - return FALSE; - - CFX_FloatPoint pt((FX_FLOAT)page_x, (FX_FLOAT)page_y); - return pPageView->OnRButtonDown(pt, modifier); -} - -DLLEXPORT FPDF_BOOL STDCALL FORM_OnRButtonUp(FPDF_FORMHANDLE hHandle, - FPDF_PAGE page, - int modifier, - double page_x, - double page_y) { - CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page); - if (!pPageView) - return FALSE; - - CFX_FloatPoint pt((FX_FLOAT)page_x, (FX_FLOAT)page_y); - return pPageView->OnRButtonUp(pt, modifier); -} -#endif // PDF_ENABLE_XFA - -DLLEXPORT FPDF_BOOL STDCALL FORM_OnKeyDown(FPDF_FORMHANDLE hHandle, - FPDF_PAGE page, - int nKeyCode, - int modifier) { - CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page); - if (!pPageView) - return FALSE; - - return pPageView->OnKeyDown(nKeyCode, modifier); -} - -DLLEXPORT FPDF_BOOL STDCALL FORM_OnKeyUp(FPDF_FORMHANDLE hHandle, - FPDF_PAGE page, - int nKeyCode, - int modifier) { - CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page); - if (!pPageView) - return FALSE; - - return pPageView->OnKeyUp(nKeyCode, modifier); -} - -DLLEXPORT FPDF_BOOL STDCALL FORM_OnChar(FPDF_FORMHANDLE hHandle, - FPDF_PAGE page, - int nChar, - int modifier) { - CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page); - if (!pPageView) - return FALSE; - - return pPageView->OnChar(nChar, modifier); -} - -DLLEXPORT FPDF_BOOL STDCALL FORM_ForceToKillFocus(FPDF_FORMHANDLE hHandle) { - CPDFSDK_Document* pSDKDoc = CPDFSDK_Document::FromFPDFFormHandle(hHandle); - if (!pSDKDoc) - return FALSE; - - return pSDKDoc->KillFocusAnnot(0); -} - -DLLEXPORT void STDCALL FPDF_FFLDraw(FPDF_FORMHANDLE hHandle, - FPDF_BITMAP bitmap, - FPDF_PAGE page, - int start_x, - int start_y, - int size_x, - int size_y, - int rotate, - int flags) { - if (!hHandle) - return; - - UnderlyingPageType* pPage = UnderlyingFromFPDFPage(page); - if (!pPage) - return; - -#ifndef PDF_ENABLE_XFA - CPDF_RenderOptions options; - if (flags & FPDF_LCD_TEXT) - options.m_Flags |= RENDER_CLEARTYPE; - else - options.m_Flags &= ~RENDER_CLEARTYPE; - // Grayscale output - if (flags & FPDF_GRAYSCALE) { - options.m_ColorMode = RENDER_COLOR_GRAY; - options.m_ForeColor = 0; - options.m_BackColor = 0xffffff; - } - options.m_AddFlags = flags >> 8; - options.m_pOCContext = new CPDF_OCContext(pPage->m_pDocument); -#else // PDF_ENABLE_XFA - CPDFXFA_Document* pDocument = pPage->GetDocument(); - if (!pDocument) - return; - CPDF_Document* pPDFDoc = pDocument->GetPDFDoc(); - if (!pPDFDoc) - return; - CPDFDoc_Environment* pEnv = (CPDFDoc_Environment*)hHandle; - CPDFSDK_Document* pFXDoc = pEnv->GetSDKDocument(); - if (!pFXDoc) - return; -#endif // PDF_ENABLE_XFA - - CFX_Matrix matrix; - pPage->GetDisplayMatrix(matrix, start_x, start_y, size_x, size_y, rotate); - - FX_RECT clip(start_x, start_y, start_x + size_x, start_y + size_y); - -#ifdef _SKIA_SUPPORT_ - std::unique_ptr<CFX_SkiaDevice> pDevice(new CFX_SkiaDevice); -#else - std::unique_ptr<CFX_FxgeDevice> pDevice(new CFX_FxgeDevice); -#endif - pDevice->Attach((CFX_DIBitmap*)bitmap); - pDevice->SaveState(); - pDevice->SetClip_Rect(clip); - -#ifndef PDF_ENABLE_XFA - if (CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, pPage)) - pPageView->PageView_OnDraw(pDevice.get(), &matrix, &options); -#else // PDF_ENABLE_XFA - CPDF_RenderOptions options; - if (flags & FPDF_LCD_TEXT) - options.m_Flags |= RENDER_CLEARTYPE; - else - options.m_Flags &= ~RENDER_CLEARTYPE; - - // Grayscale output - if (flags & FPDF_GRAYSCALE) { - options.m_ColorMode = RENDER_COLOR_GRAY; - options.m_ForeColor = 0; - options.m_BackColor = 0xffffff; - } - options.m_AddFlags = flags >> 8; - options.m_pOCContext = new CPDF_OCContext(pPDFDoc); - - if (CPDFSDK_PageView* pPageView = pFXDoc->GetPageView(pPage)) - pPageView->PageView_OnDraw(pDevice.get(), &matrix, &options, clip); -#endif // PDF_ENABLE_XFA - - pDevice->RestoreState(); - delete options.m_pOCContext; -#ifdef PDF_ENABLE_XFA - options.m_pOCContext = NULL; -#endif // PDF_ENABLE_XFA -} - -#ifdef PDF_ENABLE_XFA -DLLEXPORT void STDCALL FPDF_Widget_Undo(FPDF_DOCUMENT document, - FPDF_WIDGET hWidget) { - if (NULL == hWidget || NULL == document) - return; - - CPDFXFA_Document* pDocument = (CPDFXFA_Document*)document; - if (pDocument->GetDocType() != XFA_DOCTYPE_Dynamic && - pDocument->GetDocType() != XFA_DOCTYPE_Static) - return; - - IXFA_MenuHandler* pXFAMenuHander = - CPDFXFA_App::GetInstance()->GetXFAApp()->GetMenuHandler(); - if (pXFAMenuHander == NULL) - return; - - pXFAMenuHander->Undo((IXFA_Widget*)hWidget); -} -DLLEXPORT void STDCALL FPDF_Widget_Redo(FPDF_DOCUMENT document, - FPDF_WIDGET hWidget) { - if (NULL == hWidget || NULL == document) - return; - - CPDFXFA_Document* pDocument = (CPDFXFA_Document*)document; - if (pDocument->GetDocType() != XFA_DOCTYPE_Dynamic && - pDocument->GetDocType() != XFA_DOCTYPE_Static) - return; - - IXFA_MenuHandler* pXFAMenuHander = - CPDFXFA_App::GetInstance()->GetXFAApp()->GetMenuHandler(); - if (pXFAMenuHander == NULL) - return; - - pXFAMenuHander->Redo((IXFA_Widget*)hWidget); -} - -DLLEXPORT void STDCALL FPDF_Widget_SelectAll(FPDF_DOCUMENT document, - FPDF_WIDGET hWidget) { - if (NULL == hWidget || NULL == document) - return; - - CPDFXFA_Document* pDocument = (CPDFXFA_Document*)document; - if (pDocument->GetDocType() != XFA_DOCTYPE_Dynamic && - pDocument->GetDocType() != XFA_DOCTYPE_Static) - return; - - IXFA_MenuHandler* pXFAMenuHander = - CPDFXFA_App::GetInstance()->GetXFAApp()->GetMenuHandler(); - if (pXFAMenuHander == NULL) - return; - - pXFAMenuHander->SelectAll((IXFA_Widget*)hWidget); -} -DLLEXPORT void STDCALL FPDF_Widget_Copy(FPDF_DOCUMENT document, - FPDF_WIDGET hWidget, - FPDF_WIDESTRING wsText, - FPDF_DWORD* size) { - if (NULL == hWidget || NULL == document) - return; - - CPDFXFA_Document* pDocument = (CPDFXFA_Document*)document; - if (pDocument->GetDocType() != XFA_DOCTYPE_Dynamic && - pDocument->GetDocType() != XFA_DOCTYPE_Static) - return; - - IXFA_MenuHandler* pXFAMenuHander = - CPDFXFA_App::GetInstance()->GetXFAApp()->GetMenuHandler(); - if (pXFAMenuHander == NULL) - return; - - CFX_WideString wsCpText; - pXFAMenuHander->Copy((IXFA_Widget*)hWidget, wsCpText); - - CFX_ByteString bsCpText = wsCpText.UTF16LE_Encode(); - int len = bsCpText.GetLength() / sizeof(unsigned short); - if (wsText == NULL) { - *size = len; - return; - } - - int real_size = len < *size ? len : *size; - if (real_size > 0) { - FXSYS_memcpy((void*)wsText, - bsCpText.GetBuffer(real_size * sizeof(unsigned short)), - real_size * sizeof(unsigned short)); - bsCpText.ReleaseBuffer(real_size * sizeof(unsigned short)); - } - *size = real_size; -} - -DLLEXPORT void STDCALL FPDF_Widget_Cut(FPDF_DOCUMENT document, - FPDF_WIDGET hWidget, - FPDF_WIDESTRING wsText, - FPDF_DWORD* size) { - if (NULL == hWidget || NULL == document) - return; - CPDFXFA_Document* pDocument = (CPDFXFA_Document*)document; - if (pDocument->GetDocType() != XFA_DOCTYPE_Dynamic && - pDocument->GetDocType() != XFA_DOCTYPE_Static) - return; - - IXFA_MenuHandler* pXFAMenuHander = - CPDFXFA_App::GetInstance()->GetXFAApp()->GetMenuHandler(); - if (pXFAMenuHander == NULL) - return; - - CFX_WideString wsCpText; - pXFAMenuHander->Cut((IXFA_Widget*)hWidget, wsCpText); - - CFX_ByteString bsCpText = wsCpText.UTF16LE_Encode(); - int len = bsCpText.GetLength() / sizeof(unsigned short); - if (wsText == NULL) { - *size = len; - return; - } - - int real_size = len < *size ? len : *size; - if (real_size > 0) { - FXSYS_memcpy((void*)wsText, - bsCpText.GetBuffer(real_size * sizeof(unsigned short)), - real_size * sizeof(unsigned short)); - bsCpText.ReleaseBuffer(real_size * sizeof(unsigned short)); - } - *size = real_size; -} - -DLLEXPORT void STDCALL FPDF_Widget_Paste(FPDF_DOCUMENT document, - FPDF_WIDGET hWidget, - FPDF_WIDESTRING wsText, - FPDF_DWORD size) { - if (NULL == hWidget || NULL == document) - return; - - CPDFXFA_Document* pDocument = (CPDFXFA_Document*)document; - if (pDocument->GetDocType() != XFA_DOCTYPE_Dynamic && - pDocument->GetDocType() != XFA_DOCTYPE_Static) - return; - - IXFA_MenuHandler* pXFAMenuHander = - CPDFXFA_App::GetInstance()->GetXFAApp()->GetMenuHandler(); - if (pXFAMenuHander == NULL) - return; - - CFX_WideString wstr = CFX_WideString::FromUTF16LE(wsText, size); - pXFAMenuHander->Paste((IXFA_Widget*)hWidget, wstr); -} - -DLLEXPORT void STDCALL -FPDF_Widget_ReplaceSpellCheckWord(FPDF_DOCUMENT document, - FPDF_WIDGET hWidget, - float x, - float y, - FPDF_BYTESTRING bsText) { - if (NULL == hWidget || NULL == document) - return; - - CPDFXFA_Document* pDocument = (CPDFXFA_Document*)document; - if (pDocument->GetDocType() != XFA_DOCTYPE_Dynamic && - pDocument->GetDocType() != XFA_DOCTYPE_Static) - return; - - IXFA_MenuHandler* pXFAMenuHander = - CPDFXFA_App::GetInstance()->GetXFAApp()->GetMenuHandler(); - if (pXFAMenuHander == NULL) - return; - - CFX_PointF ptPopup; - ptPopup.x = x; - ptPopup.y = y; - CFX_ByteStringC bs(bsText); - pXFAMenuHander->ReplaceSpellCheckWord((IXFA_Widget*)hWidget, ptPopup, bs); -} - -DLLEXPORT void STDCALL -FPDF_Widget_GetSpellCheckWords(FPDF_DOCUMENT document, - FPDF_WIDGET hWidget, - float x, - float y, - FPDF_STRINGHANDLE* stringHandle) { - if (!hWidget || !document) - return; - - CPDFXFA_Document* pDocument = (CPDFXFA_Document*)document; - if (pDocument->GetDocType() != XFA_DOCTYPE_Dynamic && - pDocument->GetDocType() != XFA_DOCTYPE_Static) - return; - - IXFA_MenuHandler* pXFAMenuHander = - CPDFXFA_App::GetInstance()->GetXFAApp()->GetMenuHandler(); - if (!pXFAMenuHander) - return; - - std::vector<CFX_ByteString>* sSuggestWords = new std::vector<CFX_ByteString>; - CFX_PointF ptPopup; - ptPopup.x = x; - ptPopup.y = y; - pXFAMenuHander->GetSuggestWords(reinterpret_cast<IXFA_Widget*>(hWidget), - ptPopup, *sSuggestWords); - *stringHandle = ToFPDFStringHandle(sSuggestWords); -} - -DLLEXPORT int STDCALL FPDF_StringHandleCounts(FPDF_STRINGHANDLE sHandle) { - std::vector<CFX_ByteString>* sSuggestWords = FromFPDFStringHandle(sHandle); - return sSuggestWords ? pdfium::CollectionSize<int>(*sSuggestWords) : -1; -} - -DLLEXPORT FPDF_BOOL STDCALL -FPDF_StringHandleGetStringByIndex(FPDF_STRINGHANDLE sHandle, - int index, - FPDF_BYTESTRING bsText, - FPDF_DWORD* size) { - if (!sHandle || !size) - return FALSE; - - int count = FPDF_StringHandleCounts(sHandle); - if (index < 0 || index >= count) - return FALSE; - - std::vector<CFX_ByteString>* sSuggestWords = FromFPDFStringHandle(sHandle); - int len = (*sSuggestWords)[index].GetLength(); - if (!bsText) { - *size = len; - return TRUE; - } - - int real_size = len < *size ? len : *size; - if (real_size > 0) - FXSYS_memcpy((void*)bsText, (const FX_CHAR*)(*sSuggestWords)[index], - real_size); - *size = real_size; - return TRUE; -} - -DLLEXPORT void STDCALL -FPDF_StringHandleRelease(FPDF_STRINGHANDLE stringHandle) { - delete FromFPDFStringHandle(stringHandle); -} - -DLLEXPORT FPDF_BOOL STDCALL -FPDF_StringHandleAddString(FPDF_STRINGHANDLE stringHandle, - FPDF_BYTESTRING bsText, - FPDF_DWORD size) { - if (!stringHandle || !bsText || size == 0) - return FALSE; - - FromFPDFStringHandle(stringHandle)->push_back(CFX_ByteString(bsText, size)); - return TRUE; -} -#endif // PDF_ENABLE_XFA - -DLLEXPORT void STDCALL FPDF_SetFormFieldHighlightColor(FPDF_FORMHANDLE hHandle, - int fieldType, - unsigned long color) { - if (CPDFSDK_InterForm* pInterForm = FormHandleToInterForm(hHandle)) - pInterForm->SetHighlightColor(color, fieldType); -} - -DLLEXPORT void STDCALL FPDF_SetFormFieldHighlightAlpha(FPDF_FORMHANDLE hHandle, - unsigned char alpha) { - if (CPDFSDK_InterForm* pInterForm = FormHandleToInterForm(hHandle)) - pInterForm->SetHighlightAlpha(alpha); -} - -DLLEXPORT void STDCALL FPDF_RemoveFormFieldHighlight(FPDF_FORMHANDLE hHandle) { - if (CPDFSDK_InterForm* pInterForm = FormHandleToInterForm(hHandle)) - pInterForm->RemoveAllHighLight(); -} - -DLLEXPORT void STDCALL FORM_OnAfterLoadPage(FPDF_PAGE page, - FPDF_FORMHANDLE hHandle) { - if (CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page)) - pPageView->SetValid(TRUE); -} - -DLLEXPORT void STDCALL FORM_OnBeforeClosePage(FPDF_PAGE page, - FPDF_FORMHANDLE hHandle) { - if (!hHandle) - return; - - CPDFSDK_Document* pSDKDoc = ((CPDFDoc_Environment*)hHandle)->GetSDKDocument(); - if (!pSDKDoc) - return; - - UnderlyingPageType* pPage = UnderlyingFromFPDFPage(page); - if (!pPage) - return; - - CPDFSDK_PageView* pPageView = pSDKDoc->GetPageView(pPage, FALSE); - if (pPageView) { - pPageView->SetValid(FALSE); - // RemovePageView() takes care of the delete for us. - pSDKDoc->RemovePageView(pPage); - } -} - -DLLEXPORT void STDCALL FORM_DoDocumentJSAction(FPDF_FORMHANDLE hHandle) { - CPDFSDK_Document* pSDKDoc = CPDFSDK_Document::FromFPDFFormHandle(hHandle); - if (pSDKDoc && ((CPDFDoc_Environment*)hHandle)->IsJSInitiated()) - pSDKDoc->ProcJavascriptFun(); -} - -DLLEXPORT void STDCALL FORM_DoDocumentOpenAction(FPDF_FORMHANDLE hHandle) { - CPDFSDK_Document* pSDKDoc = CPDFSDK_Document::FromFPDFFormHandle(hHandle); - if (pSDKDoc && ((CPDFDoc_Environment*)hHandle)->IsJSInitiated()) - pSDKDoc->ProcOpenAction(); -} - -DLLEXPORT void STDCALL FORM_DoDocumentAAction(FPDF_FORMHANDLE hHandle, - int aaType) { - CPDFSDK_Document* pSDKDoc = CPDFSDK_Document::FromFPDFFormHandle(hHandle); - if (!pSDKDoc) - return; - - CPDF_Document* pDoc = pSDKDoc->GetPDFDocument(); - CPDF_Dictionary* pDic = pDoc->GetRoot(); - if (!pDic) - return; - - CPDF_AAction aa(pDic->GetDictBy("AA")); - if (aa.ActionExist((CPDF_AAction::AActionType)aaType)) { - CPDF_Action action = aa.GetAction((CPDF_AAction::AActionType)aaType); - CPDFSDK_ActionHandler* pActionHandler = - ((CPDFDoc_Environment*)hHandle)->GetActionHander(); - pActionHandler->DoAction_Document(action, (CPDF_AAction::AActionType)aaType, - pSDKDoc); - } -} - -DLLEXPORT void STDCALL FORM_DoPageAAction(FPDF_PAGE page, - FPDF_FORMHANDLE hHandle, - int aaType) { - if (!hHandle) - return; - CPDFSDK_Document* pSDKDoc = ((CPDFDoc_Environment*)hHandle)->GetSDKDocument(); - UnderlyingPageType* pPage = UnderlyingFromFPDFPage(page); - CPDF_Page* pPDFPage = CPDFPageFromFPDFPage(page); - if (!pPDFPage) - return; - if (pSDKDoc->GetPageView(pPage, FALSE)) { - CPDFDoc_Environment* pEnv = pSDKDoc->GetEnv(); - CPDFSDK_ActionHandler* pActionHandler = pEnv->GetActionHander(); - CPDF_Dictionary* pPageDict = pPDFPage->m_pFormDict; - CPDF_AAction aa(pPageDict->GetDictBy("AA")); - if (FPDFPAGE_AACTION_OPEN == aaType) { - if (aa.ActionExist(CPDF_AAction::OpenPage)) { - CPDF_Action action = aa.GetAction(CPDF_AAction::OpenPage); - pActionHandler->DoAction_Page(action, CPDF_AAction::OpenPage, pSDKDoc); - } - } else { - if (aa.ActionExist(CPDF_AAction::ClosePage)) { - CPDF_Action action = aa.GetAction(CPDF_AAction::ClosePage); - pActionHandler->DoAction_Page(action, CPDF_AAction::ClosePage, pSDKDoc); - } - } - } -} diff --git a/fpdfsdk/src/fpdfformfill_embeddertest.cpp b/fpdfsdk/src/fpdfformfill_embeddertest.cpp deleted file mode 100644 index c73dc008f7..0000000000 --- a/fpdfsdk/src/fpdfformfill_embeddertest.cpp +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright 2015 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "public/fpdf_formfill.h" -#include "testing/embedder_test.h" -#include "testing/embedder_test_mock_delegate.h" -#include "testing/embedder_test_timer_handling_delegate.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" - -using testing::_; -using testing::Return; - -class FPDFFormFillEmbeddertest : public EmbedderTest {}; - -TEST_F(FPDFFormFillEmbeddertest, FirstTest) { - EmbedderTestMockDelegate mock; - EXPECT_CALL(mock, Alert(_, _, _, _)).Times(0); - EXPECT_CALL(mock, UnsupportedHandler(_)).Times(0); - EXPECT_CALL(mock, SetTimer(_, _)).Times(0); - EXPECT_CALL(mock, KillTimer(_)).Times(0); - SetDelegate(&mock); - - EXPECT_TRUE(OpenDocument("hello_world.pdf")); - FPDF_PAGE page = LoadPage(0); - EXPECT_NE(nullptr, page); - UnloadPage(page); -} - -TEST_F(FPDFFormFillEmbeddertest, BUG_487928) { - EmbedderTestTimerHandlingDelegate delegate; - SetDelegate(&delegate); - - EXPECT_TRUE(OpenDocument("bug_487928.pdf")); - FPDF_PAGE page = LoadPage(0); - EXPECT_NE(nullptr, page); - DoOpenActions(); - delegate.AdvanceTime(5000); - UnloadPage(page); -} - -TEST_F(FPDFFormFillEmbeddertest, BUG_507316) { - EmbedderTestTimerHandlingDelegate delegate; - SetDelegate(&delegate); - - EXPECT_TRUE(OpenDocument("bug_507316.pdf")); - FPDF_PAGE page = LoadAndCachePage(2); - EXPECT_NE(nullptr, page); - DoOpenActions(); - delegate.AdvanceTime(4000); - UnloadPage(page); -} - -TEST_F(FPDFFormFillEmbeddertest, BUG_514690) { - EXPECT_TRUE(OpenDocument("hello_world.pdf")); - FPDF_PAGE page = LoadPage(0); - EXPECT_NE(nullptr, page); - - // Test that FORM_OnMouseMove() etc. permit null HANDLES and PAGES. - FORM_OnMouseMove(nullptr, page, 0, 10.0, 10.0); - FORM_OnMouseMove(form_handle(), nullptr, 0, 10.0, 10.0); - - UnloadPage(page); -} - -#ifdef PDF_ENABLE_V8 -TEST_F(FPDFFormFillEmbeddertest, BUG_551248) { - EmbedderTestTimerHandlingDelegate delegate; - SetDelegate(&delegate); - - EXPECT_TRUE(OpenDocument("bug_551248.pdf")); - FPDF_PAGE page = LoadPage(0); - EXPECT_NE(nullptr, page); - DoOpenActions(); - delegate.AdvanceTime(5000); - UnloadPage(page); - - const auto& alerts = delegate.GetAlerts(); - ASSERT_EQ(1U, alerts.size()); - - EXPECT_STREQ(L"hello world", alerts[0].message.c_str()); - EXPECT_STREQ(L"Alert", alerts[0].title.c_str()); - EXPECT_EQ(0, alerts[0].type); - EXPECT_EQ(0, alerts[0].icon); -} -#endif // PDF_ENABLE_V8 diff --git a/fpdfsdk/src/fpdfppo.cpp b/fpdfsdk/src/fpdfppo.cpp deleted file mode 100644 index 4253cc5fd9..0000000000 --- a/fpdfsdk/src/fpdfppo.cpp +++ /dev/null @@ -1,415 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "public/fpdf_ppo.h" - -#include <map> -#include <memory> -#include <vector> - -#include "core/include/fpdfapi/cpdf_array.h" -#include "core/include/fpdfapi/cpdf_document.h" -#include "core/include/fpdfapi/cpdf_name.h" -#include "core/include/fpdfapi/cpdf_number.h" -#include "core/include/fpdfapi/cpdf_reference.h" -#include "core/include/fpdfapi/cpdf_string.h" -#include "fpdfsdk/include/fsdk_define.h" -#include "third_party/base/stl_util.h" - -class CPDF_PageOrganizer { - public: - using ObjectNumberMap = std::map<FX_DWORD, FX_DWORD>; - CPDF_PageOrganizer(); - ~CPDF_PageOrganizer(); - - FX_BOOL PDFDocInit(CPDF_Document* pDestPDFDoc, CPDF_Document* pSrcPDFDoc); - FX_BOOL ExportPage(CPDF_Document* pSrcPDFDoc, - std::vector<FX_WORD>* pPageNums, - CPDF_Document* pDestPDFDoc, - int nIndex); - CPDF_Object* PageDictGetInheritableTag(CPDF_Dictionary* pDict, - CFX_ByteString nSrctag); - FX_BOOL UpdateReference(CPDF_Object* pObj, - CPDF_Document* pDoc, - ObjectNumberMap* pObjNumberMap); - FX_DWORD GetNewObjId(CPDF_Document* pDoc, - ObjectNumberMap* pObjNumberMap, - CPDF_Reference* pRef); -}; - -CPDF_PageOrganizer::CPDF_PageOrganizer() {} - -CPDF_PageOrganizer::~CPDF_PageOrganizer() {} - -FX_BOOL CPDF_PageOrganizer::PDFDocInit(CPDF_Document* pDestPDFDoc, - CPDF_Document* pSrcPDFDoc) { - if (!pDestPDFDoc || !pSrcPDFDoc) - return FALSE; - - CPDF_Dictionary* pNewRoot = pDestPDFDoc->GetRoot(); - if (!pNewRoot) - return FALSE; - - // Set the document information - CPDF_Dictionary* DInfoDict = pDestPDFDoc->GetInfo(); - if (!DInfoDict) - return FALSE; - - CFX_ByteString producerstr; - producerstr.Format("PDFium"); - DInfoDict->SetAt("Producer", new CPDF_String(producerstr, FALSE)); - - // Set type - CFX_ByteString cbRootType = pNewRoot->GetStringBy("Type", ""); - if (cbRootType.Equal("")) { - pNewRoot->SetAt("Type", new CPDF_Name("Catalog")); - } - - CPDF_Object* pElement = pNewRoot->GetElement("Pages"); - CPDF_Dictionary* pNewPages = - pElement ? ToDictionary(pElement->GetDirect()) : nullptr; - if (!pNewPages) { - pNewPages = new CPDF_Dictionary; - FX_DWORD NewPagesON = pDestPDFDoc->AddIndirectObject(pNewPages); - pNewRoot->SetAt("Pages", new CPDF_Reference(pDestPDFDoc, NewPagesON)); - } - - CFX_ByteString cbPageType = pNewPages->GetStringBy("Type", ""); - if (cbPageType.Equal("")) { - pNewPages->SetAt("Type", new CPDF_Name("Pages")); - } - - CPDF_Array* pKeysArray = pNewPages->GetArrayBy("Kids"); - if (!pKeysArray) { - CPDF_Array* pNewKids = new CPDF_Array; - FX_DWORD Kidsobjnum = -1; - Kidsobjnum = pDestPDFDoc->AddIndirectObject(pNewKids); - - pNewPages->SetAt("Kids", new CPDF_Reference(pDestPDFDoc, Kidsobjnum)); - pNewPages->SetAt("Count", new CPDF_Number(0)); - } - - return TRUE; -} - -FX_BOOL CPDF_PageOrganizer::ExportPage(CPDF_Document* pSrcPDFDoc, - std::vector<FX_WORD>* pPageNums, - CPDF_Document* pDestPDFDoc, - int nIndex) { - int curpage = nIndex; - std::unique_ptr<ObjectNumberMap> pObjNumberMap(new ObjectNumberMap); - int nSize = pdfium::CollectionSize<int>(*pPageNums); - for (int i = 0; i < nSize; ++i) { - CPDF_Dictionary* pCurPageDict = pDestPDFDoc->CreateNewPage(curpage); - CPDF_Dictionary* pSrcPageDict = pSrcPDFDoc->GetPage(pPageNums->at(i) - 1); - if (!pSrcPageDict || !pCurPageDict) - return FALSE; - - // Clone the page dictionary - for (const auto& it : *pSrcPageDict) { - const CFX_ByteString& cbSrcKeyStr = it.first; - CPDF_Object* pObj = it.second; - if (cbSrcKeyStr.Compare(("Type")) && cbSrcKeyStr.Compare(("Parent"))) { - if (pCurPageDict->KeyExist(cbSrcKeyStr)) - pCurPageDict->RemoveAt(cbSrcKeyStr); - pCurPageDict->SetAt(cbSrcKeyStr, pObj->Clone()); - } - } - - // inheritable item - CPDF_Object* pInheritable = nullptr; - // 1 MediaBox //required - if (!pCurPageDict->KeyExist("MediaBox")) { - pInheritable = PageDictGetInheritableTag(pSrcPageDict, "MediaBox"); - if (!pInheritable) { - // Search the "CropBox" from source page dictionary, - // if not exists,we take the letter size. - pInheritable = PageDictGetInheritableTag(pSrcPageDict, "CropBox"); - if (pInheritable) { - pCurPageDict->SetAt("MediaBox", pInheritable->Clone()); - } else { - // Make the default size to be letter size (8.5'x11') - CPDF_Array* pArray = new CPDF_Array; - pArray->AddNumber(0); - pArray->AddNumber(0); - pArray->AddNumber(612); - pArray->AddNumber(792); - pCurPageDict->SetAt("MediaBox", pArray); - } - } else { - pCurPageDict->SetAt("MediaBox", pInheritable->Clone()); - } - } - // 2 Resources //required - if (!pCurPageDict->KeyExist("Resources")) { - pInheritable = PageDictGetInheritableTag(pSrcPageDict, "Resources"); - if (!pInheritable) - return FALSE; - pCurPageDict->SetAt("Resources", pInheritable->Clone()); - } - // 3 CropBox //Optional - if (!pCurPageDict->KeyExist("CropBox")) { - pInheritable = PageDictGetInheritableTag(pSrcPageDict, "CropBox"); - if (pInheritable) - pCurPageDict->SetAt("CropBox", pInheritable->Clone()); - } - // 4 Rotate //Optional - if (!pCurPageDict->KeyExist("Rotate")) { - pInheritable = PageDictGetInheritableTag(pSrcPageDict, "Rotate"); - if (pInheritable) - pCurPageDict->SetAt("Rotate", pInheritable->Clone()); - } - - // Update the reference - FX_DWORD dwOldPageObj = pSrcPageDict->GetObjNum(); - FX_DWORD dwNewPageObj = pCurPageDict->GetObjNum(); - - (*pObjNumberMap)[dwOldPageObj] = dwNewPageObj; - - UpdateReference(pCurPageDict, pDestPDFDoc, pObjNumberMap.get()); - ++curpage; - } - - return TRUE; -} - -CPDF_Object* CPDF_PageOrganizer::PageDictGetInheritableTag( - CPDF_Dictionary* pDict, - CFX_ByteString nSrctag) { - if (!pDict || nSrctag.IsEmpty()) - return nullptr; - if (!pDict->KeyExist("Parent") || !pDict->KeyExist("Type")) - return nullptr; - - CPDF_Object* pType = pDict->GetElement("Type")->GetDirect(); - if (!ToName(pType)) - return nullptr; - if (pType->GetString().Compare("Page")) - return nullptr; - - CPDF_Dictionary* pp = ToDictionary(pDict->GetElement("Parent")->GetDirect()); - if (!pp) - return nullptr; - - if (pDict->KeyExist((const char*)nSrctag)) - return pDict->GetElement((const char*)nSrctag); - - while (pp) { - if (pp->KeyExist((const char*)nSrctag)) - return pp->GetElement((const char*)nSrctag); - if (!pp->KeyExist("Parent")) - break; - pp = ToDictionary(pp->GetElement("Parent")->GetDirect()); - } - return nullptr; -} - -FX_BOOL CPDF_PageOrganizer::UpdateReference(CPDF_Object* pObj, - CPDF_Document* pDoc, - ObjectNumberMap* pObjNumberMap) { - switch (pObj->GetType()) { - case CPDF_Object::REFERENCE: { - CPDF_Reference* pReference = pObj->AsReference(); - FX_DWORD newobjnum = GetNewObjId(pDoc, pObjNumberMap, pReference); - if (newobjnum == 0) - return FALSE; - pReference->SetRef(pDoc, newobjnum); - break; - } - case CPDF_Object::DICTIONARY: { - CPDF_Dictionary* pDict = pObj->AsDictionary(); - auto it = pDict->begin(); - while (it != pDict->end()) { - const CFX_ByteString& key = it->first; - CPDF_Object* pNextObj = it->second; - ++it; - if (!FXSYS_strcmp(key, "Parent") || !FXSYS_strcmp(key, "Prev") || - !FXSYS_strcmp(key, "First")) { - continue; - } - if (pNextObj) { - if (!UpdateReference(pNextObj, pDoc, pObjNumberMap)) - pDict->RemoveAt(key); - } else { - return FALSE; - } - } - break; - } - case CPDF_Object::ARRAY: { - CPDF_Array* pArray = pObj->AsArray(); - FX_DWORD count = pArray->GetCount(); - for (FX_DWORD i = 0; i < count; ++i) { - CPDF_Object* pNextObj = pArray->GetElement(i); - if (!pNextObj) - return FALSE; - if (!UpdateReference(pNextObj, pDoc, pObjNumberMap)) - return FALSE; - } - break; - } - case CPDF_Object::STREAM: { - CPDF_Stream* pStream = pObj->AsStream(); - CPDF_Dictionary* pDict = pStream->GetDict(); - if (pDict) { - if (!UpdateReference(pDict, pDoc, pObjNumberMap)) - return FALSE; - } else { - return FALSE; - } - break; - } - default: - break; - } - - return TRUE; -} - -FX_DWORD CPDF_PageOrganizer::GetNewObjId(CPDF_Document* pDoc, - ObjectNumberMap* pObjNumberMap, - CPDF_Reference* pRef) { - if (!pRef) - return 0; - - FX_DWORD dwObjnum = pRef->GetRefObjNum(); - FX_DWORD dwNewObjNum = 0; - const auto it = pObjNumberMap->find(dwObjnum); - if (it != pObjNumberMap->end()) - dwNewObjNum = it->second; - if (dwNewObjNum) - return dwNewObjNum; - - CPDF_Object* pDirect = pRef->GetDirect(); - if (!pDirect) - return 0; - - CPDF_Object* pClone = pDirect->Clone(); - if (!pClone) - return 0; - - if (CPDF_Dictionary* pDictClone = pClone->AsDictionary()) { - if (pDictClone->KeyExist("Type")) { - CFX_ByteString strType = pDictClone->GetStringBy("Type"); - if (!FXSYS_stricmp(strType, "Pages")) { - pDictClone->Release(); - return 4; - } - if (!FXSYS_stricmp(strType, "Page")) { - pDictClone->Release(); - return 0; - } - } - } - dwNewObjNum = pDoc->AddIndirectObject(pClone); - (*pObjNumberMap)[dwObjnum] = dwNewObjNum; - if (!UpdateReference(pClone, pDoc, pObjNumberMap)) { - pClone->Release(); - return 0; - } - return dwNewObjNum; -} - -FPDF_BOOL ParserPageRangeString(CFX_ByteString rangstring, - std::vector<FX_WORD>* pageArray, - int nCount) { - if (rangstring.GetLength() != 0) { - rangstring.Remove(' '); - int nLength = rangstring.GetLength(); - CFX_ByteString cbCompareString("0123456789-,"); - for (int i = 0; i < nLength; ++i) { - if (cbCompareString.Find(rangstring[i]) == -1) - return FALSE; - } - CFX_ByteString cbMidRange; - int nStringFrom = 0; - int nStringTo = 0; - while (nStringTo < nLength) { - nStringTo = rangstring.Find(',', nStringFrom); - if (nStringTo == -1) - nStringTo = nLength; - cbMidRange = rangstring.Mid(nStringFrom, nStringTo - nStringFrom); - int nMid = cbMidRange.Find('-'); - if (nMid == -1) { - long lPageNum = atol(cbMidRange); - if (lPageNum <= 0 || lPageNum > nCount) - return FALSE; - pageArray->push_back((FX_WORD)lPageNum); - } else { - int nStartPageNum = atol(cbMidRange.Mid(0, nMid)); - if (nStartPageNum == 0) - return FALSE; - - ++nMid; - int nEnd = cbMidRange.GetLength() - nMid; - if (nEnd == 0) - return FALSE; - - int nEndPageNum = atol(cbMidRange.Mid(nMid, nEnd)); - if (nStartPageNum < 0 || nStartPageNum > nEndPageNum || - nEndPageNum > nCount) { - return FALSE; - } - for (int i = nStartPageNum; i <= nEndPageNum; ++i) { - pageArray->push_back(i); - } - } - nStringFrom = nStringTo + 1; - } - } - return TRUE; -} - -DLLEXPORT FPDF_BOOL STDCALL FPDF_ImportPages(FPDF_DOCUMENT dest_doc, - FPDF_DOCUMENT src_doc, - FPDF_BYTESTRING pagerange, - int index) { - CPDF_Document* pDestDoc = CPDFDocumentFromFPDFDocument(dest_doc); - if (!dest_doc) - return FALSE; - - CPDF_Document* pSrcDoc = CPDFDocumentFromFPDFDocument(src_doc); - if (!pSrcDoc) - return FALSE; - - std::vector<FX_WORD> pageArray; - int nCount = pSrcDoc->GetPageCount(); - if (pagerange) { - if (!ParserPageRangeString(pagerange, &pageArray, nCount)) - return FALSE; - } else { - for (int i = 1; i <= nCount; ++i) { - pageArray.push_back(i); - } - } - - CPDF_PageOrganizer pageOrg; - pageOrg.PDFDocInit(pDestDoc, pSrcDoc); - return pageOrg.ExportPage(pSrcDoc, &pageArray, pDestDoc, index); -} - -DLLEXPORT FPDF_BOOL STDCALL FPDF_CopyViewerPreferences(FPDF_DOCUMENT dest_doc, - FPDF_DOCUMENT src_doc) { - CPDF_Document* pDstDoc = CPDFDocumentFromFPDFDocument(dest_doc); - if (!pDstDoc) - return FALSE; - - CPDF_Document* pSrcDoc = CPDFDocumentFromFPDFDocument(src_doc); - if (!pSrcDoc) - return FALSE; - - CPDF_Dictionary* pSrcDict = pSrcDoc->GetRoot(); - pSrcDict = pSrcDict->GetDictBy("ViewerPreferences"); - if (!pSrcDict) - return FALSE; - - CPDF_Dictionary* pDstDict = pDstDoc->GetRoot(); - if (!pDstDict) - return FALSE; - - pDstDict->SetAt("ViewerPreferences", pSrcDict->Clone(TRUE)); - return TRUE; -} diff --git a/fpdfsdk/src/fpdfsave.cpp b/fpdfsdk/src/fpdfsave.cpp deleted file mode 100644 index 81defbf0a7..0000000000 --- a/fpdfsdk/src/fpdfsave.cpp +++ /dev/null @@ -1,328 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "public/fpdf_save.h" - -#include <vector> - -#include "core/include/fpdfapi/cpdf_array.h" -#include "core/include/fpdfapi/cpdf_document.h" -#include "core/include/fpdfapi/cpdf_reference.h" -#include "core/include/fpdfapi/cpdf_string.h" -#include "core/include/fpdfapi/fpdf_serial.h" -#include "core/include/fxcrt/fx_ext.h" -#include "fpdfsdk/include/fsdk_define.h" -#include "public/fpdf_edit.h" - -#ifdef PDF_ENABLE_XFA -#include "fpdfsdk/include/fpdfxfa/fpdfxfa_app.h" -#include "fpdfsdk/include/fpdfxfa/fpdfxfa_doc.h" -#include "fpdfsdk/include/fpdfxfa/fpdfxfa_util.h" -#include "public/fpdf_formfill.h" -#endif - -#if _FX_OS_ == _FX_ANDROID_ -#include "time.h" -#else -#include <ctime> -#endif - -class CFX_IFileWrite final : public IFX_StreamWrite { - public: - CFX_IFileWrite(); - FX_BOOL Init(FPDF_FILEWRITE* pFileWriteStruct); - FX_BOOL WriteBlock(const void* pData, size_t size) override; - void Release() override; - - protected: - ~CFX_IFileWrite() override {} - - FPDF_FILEWRITE* m_pFileWriteStruct; -}; - -CFX_IFileWrite::CFX_IFileWrite() { - m_pFileWriteStruct = NULL; -} - -FX_BOOL CFX_IFileWrite::Init(FPDF_FILEWRITE* pFileWriteStruct) { - if (!pFileWriteStruct) - return FALSE; - - m_pFileWriteStruct = pFileWriteStruct; - return TRUE; -} - -FX_BOOL CFX_IFileWrite::WriteBlock(const void* pData, size_t size) { - if (!m_pFileWriteStruct) - return FALSE; - - m_pFileWriteStruct->WriteBlock(m_pFileWriteStruct, pData, size); - return TRUE; -} - -void CFX_IFileWrite::Release() { - delete this; -} - -namespace { - -#ifdef PDF_ENABLE_XFA -bool SaveXFADocumentData(CPDFXFA_Document* pDocument, - std::vector<ScopedFileStream>* fileList) { - if (!pDocument) - return false; - - if (pDocument->GetDocType() != DOCTYPE_DYNAMIC_XFA && - pDocument->GetDocType() != DOCTYPE_STATIC_XFA) - return true; - - if (!CPDFXFA_App::GetInstance()->GetXFAApp()) - return true; - - IXFA_DocView* pXFADocView = pDocument->GetXFADocView(); - if (!pXFADocView) - return true; - - IXFA_DocHandler* pXFADocHandler = - CPDFXFA_App::GetInstance()->GetXFAApp()->GetDocHandler(); - CPDF_Document* pPDFDocument = pDocument->GetPDFDoc(); - if (!pDocument) - return false; - - CPDF_Dictionary* pRoot = pPDFDocument->GetRoot(); - if (!pRoot) - return false; - - CPDF_Dictionary* pAcroForm = pRoot->GetDictBy("AcroForm"); - if (!pAcroForm) - return false; - - CPDF_Object* pXFA = pAcroForm->GetElement("XFA"); - if (!pXFA) - return true; - - if (!pXFA->IsArray()) - return false; - - CPDF_Array* pArray = pXFA->GetArray(); - if (!pArray) - return false; - - int size = pArray->GetCount(); - int iFormIndex = -1; - int iDataSetsIndex = -1; - int iTemplate = -1; - int iLast = size - 2; - for (int i = 0; i < size - 1; i++) { - CPDF_Object* pPDFObj = pArray->GetElement(i); - if (!pPDFObj->IsString()) - continue; - if (pPDFObj->GetString() == "form") - iFormIndex = i + 1; - else if (pPDFObj->GetString() == "datasets") - iDataSetsIndex = i + 1; - else if (pPDFObj->GetString() == "template") - iTemplate = i + 1; - } - std::unique_ptr<IXFA_ChecksumContext, ReleaseDeleter<IXFA_ChecksumContext>> - pContext(XFA_Checksum_Create()); - pContext->StartChecksum(); - - // template - if (iTemplate > -1) { - CPDF_Stream* pTemplateStream = pArray->GetStreamAt(iTemplate); - CPDF_StreamAcc streamAcc; - streamAcc.LoadAllData(pTemplateStream); - uint8_t* pData = (uint8_t*)streamAcc.GetData(); - FX_DWORD dwSize2 = streamAcc.GetSize(); - ScopedFileStream pTemplate(FX_CreateMemoryStream(pData, dwSize2)); - pContext->UpdateChecksum(pTemplate.get()); - } - CPDF_Stream* pFormStream = NULL; - CPDF_Stream* pDataSetsStream = NULL; - if (iFormIndex != -1) { - // Get form CPDF_Stream - CPDF_Object* pFormPDFObj = pArray->GetElement(iFormIndex); - if (pFormPDFObj->IsReference()) { - CPDF_Object* pFormDirectObj = pFormPDFObj->GetDirect(); - if (pFormDirectObj && pFormDirectObj->IsStream()) { - pFormStream = (CPDF_Stream*)pFormDirectObj; - } - } else if (pFormPDFObj->IsStream()) { - pFormStream = (CPDF_Stream*)pFormPDFObj; - } - } - - if (iDataSetsIndex != -1) { - // Get datasets CPDF_Stream - CPDF_Object* pDataSetsPDFObj = pArray->GetElement(iDataSetsIndex); - if (pDataSetsPDFObj->IsReference()) { - CPDF_Reference* pDataSetsRefObj = (CPDF_Reference*)pDataSetsPDFObj; - CPDF_Object* pDataSetsDirectObj = pDataSetsRefObj->GetDirect(); - if (pDataSetsDirectObj && pDataSetsDirectObj->IsStream()) { - pDataSetsStream = (CPDF_Stream*)pDataSetsDirectObj; - } - } else if (pDataSetsPDFObj->IsStream()) { - pDataSetsStream = (CPDF_Stream*)pDataSetsPDFObj; - } - } - // L"datasets" - { - ScopedFileStream pDsfileWrite(FX_CreateMemoryStream()); - if (pXFADocHandler->SavePackage(pXFADocView->GetDoc(), - CFX_WideStringC(L"datasets"), - pDsfileWrite.get()) && - pDsfileWrite->GetSize() > 0) { - // Datasets - pContext->UpdateChecksum(pDsfileWrite.get()); - pContext->FinishChecksum(); - CPDF_Dictionary* pDataDict = new CPDF_Dictionary; - if (iDataSetsIndex != -1) { - if (pDataSetsStream) - pDataSetsStream->InitStreamFromFile(pDsfileWrite.get(), pDataDict); - } else { - CPDF_Stream* pData = new CPDF_Stream(NULL, 0, NULL); - pData->InitStreamFromFile(pDsfileWrite.get(), pDataDict); - pPDFDocument->AddIndirectObject(pData); - iLast = pArray->GetCount() - 2; - pArray->InsertAt(iLast, new CPDF_String("datasets", FALSE)); - pArray->InsertAt(iLast + 1, pData, pPDFDocument); - } - fileList->push_back(std::move(pDsfileWrite)); - } - } - // L"form" - { - ScopedFileStream pfileWrite(FX_CreateMemoryStream()); - if (pXFADocHandler->SavePackage(pXFADocView->GetDoc(), - CFX_WideStringC(L"form"), pfileWrite.get(), - pContext.get()) && - pfileWrite->GetSize() > 0) { - CPDF_Dictionary* pDataDict = new CPDF_Dictionary; - if (iFormIndex != -1) { - if (pFormStream) - pFormStream->InitStreamFromFile(pfileWrite.get(), pDataDict); - } else { - CPDF_Stream* pData = new CPDF_Stream(NULL, 0, NULL); - pData->InitStreamFromFile(pfileWrite.get(), pDataDict); - pPDFDocument->AddIndirectObject(pData); - iLast = pArray->GetCount() - 2; - pArray->InsertAt(iLast, new CPDF_String("form", FALSE)); - pArray->InsertAt(iLast + 1, pData, pPDFDocument); - } - fileList->push_back(std::move(pfileWrite)); - } - } - return true; -} - -bool SendPostSaveToXFADoc(CPDFXFA_Document* pDocument) { - if (!pDocument) - return false; - - if (pDocument->GetDocType() != DOCTYPE_DYNAMIC_XFA && - pDocument->GetDocType() != DOCTYPE_STATIC_XFA) - return true; - - IXFA_DocView* pXFADocView = pDocument->GetXFADocView(); - if (!pXFADocView) - return false; - - IXFA_WidgetHandler* pWidgetHander = pXFADocView->GetWidgetHandler(); - CXFA_WidgetAcc* pWidgetAcc = NULL; - IXFA_WidgetAccIterator* pWidgetAccIterator = - pXFADocView->CreateWidgetAccIterator(); - pWidgetAcc = pWidgetAccIterator->MoveToNext(); - while (pWidgetAcc) { - CXFA_EventParam preParam; - preParam.m_eType = XFA_EVENT_PostSave; - pWidgetHander->ProcessEvent(pWidgetAcc, &preParam); - pWidgetAcc = pWidgetAccIterator->MoveToNext(); - } - pWidgetAccIterator->Release(); - pXFADocView->UpdateDocView(); - pDocument->_ClearChangeMark(); - return true; -} - -bool SendPreSaveToXFADoc(CPDFXFA_Document* pDocument, - std::vector<ScopedFileStream>* fileList) { - if (pDocument->GetDocType() != DOCTYPE_DYNAMIC_XFA && - pDocument->GetDocType() != DOCTYPE_STATIC_XFA) - return true; - - IXFA_DocView* pXFADocView = pDocument->GetXFADocView(); - if (!pXFADocView) - return true; - - IXFA_WidgetHandler* pWidgetHander = pXFADocView->GetWidgetHandler(); - CXFA_WidgetAcc* pWidgetAcc = NULL; - IXFA_WidgetAccIterator* pWidgetAccIterator = - pXFADocView->CreateWidgetAccIterator(); - pWidgetAcc = pWidgetAccIterator->MoveToNext(); - while (pWidgetAcc) { - CXFA_EventParam preParam; - preParam.m_eType = XFA_EVENT_PreSave; - pWidgetHander->ProcessEvent(pWidgetAcc, &preParam); - pWidgetAcc = pWidgetAccIterator->MoveToNext(); - } - pWidgetAccIterator->Release(); - pXFADocView->UpdateDocView(); - return SaveXFADocumentData(pDocument, fileList); -} -#endif // PDF_ENABLE_XFA - -bool FPDF_Doc_Save(FPDF_DOCUMENT document, - FPDF_FILEWRITE* pFileWrite, - FPDF_DWORD flags, - FPDF_BOOL bSetVersion, - int fileVerion) { - CPDF_Document* pPDFDoc = CPDFDocumentFromFPDFDocument(document); - if (!pPDFDoc) - return 0; - -#ifdef PDF_ENABLE_XFA - CPDFXFA_Document* pDoc = static_cast<CPDFXFA_Document*>(document); - std::vector<ScopedFileStream> fileList; - SendPreSaveToXFADoc(pDoc, &fileList); -#endif // PDF_ENABLE_XFA - - if (flags < FPDF_INCREMENTAL || flags > FPDF_REMOVE_SECURITY) - flags = 0; - - CPDF_Creator FileMaker(pPDFDoc); - if (bSetVersion) - FileMaker.SetFileVersion(fileVerion); - if (flags == FPDF_REMOVE_SECURITY) { - flags = 0; - FileMaker.RemoveSecurity(); - } - - CFX_IFileWrite* pStreamWrite = NULL; - pStreamWrite = new CFX_IFileWrite; - pStreamWrite->Init(pFileWrite); - bool bRet = FileMaker.Create(pStreamWrite, flags); -#ifdef PDF_ENABLE_XFA - SendPostSaveToXFADoc(pDoc); -#endif // PDF_ENABLE_XFA - pStreamWrite->Release(); - return bRet; -} - -} // namespace - -DLLEXPORT FPDF_BOOL STDCALL FPDF_SaveAsCopy(FPDF_DOCUMENT document, - FPDF_FILEWRITE* pFileWrite, - FPDF_DWORD flags) { - return FPDF_Doc_Save(document, pFileWrite, flags, FALSE, 0); -} - -DLLEXPORT FPDF_BOOL STDCALL FPDF_SaveWithVersion(FPDF_DOCUMENT document, - FPDF_FILEWRITE* pFileWrite, - FPDF_DWORD flags, - int fileVersion) { - return FPDF_Doc_Save(document, pFileWrite, flags, TRUE, fileVersion); -} diff --git a/fpdfsdk/src/fpdfsave_embeddertest.cpp b/fpdfsdk/src/fpdfsave_embeddertest.cpp deleted file mode 100644 index 1c93f4f0e1..0000000000 --- a/fpdfsdk/src/fpdfsave_embeddertest.cpp +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright 2016 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include <string.h> - -#include "core/include/fxcrt/fx_string.h" -#include "public/fpdf_save.h" -#include "public/fpdfview.h" -#include "testing/embedder_test.h" -#include "testing/fx_string_testhelpers.h" -#include "testing/gmock/include/gmock/gmock-matchers.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "testing/test_support.h" - -class FPDFSaveEmbedderTest : public EmbedderTest, public TestSaver {}; - -TEST_F(FPDFSaveEmbedderTest, SaveSimpleDoc) { - EXPECT_TRUE(OpenDocument("hello_world.pdf")); - EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); - EXPECT_THAT(GetString(), testing::StartsWith("%PDF-1.7\r\n")); - EXPECT_EQ(843, GetString().length()); -} - -TEST_F(FPDFSaveEmbedderTest, SaveSimpleDocWithVersion) { - EXPECT_TRUE(OpenDocument("hello_world.pdf")); - EXPECT_TRUE(FPDF_SaveWithVersion(document(), this, 0, 14)); - EXPECT_THAT(GetString(), testing::StartsWith("%PDF-1.4\r\n")); - EXPECT_EQ(843, GetString().length()); -} - -TEST_F(FPDFSaveEmbedderTest, SaveSimpleDocWithBadVersion) { - EXPECT_TRUE(OpenDocument("hello_world.pdf")); - EXPECT_TRUE(FPDF_SaveWithVersion(document(), this, 0, -1)); - EXPECT_THAT(GetString(), testing::StartsWith("%PDF-1.7\r\n")); - - ClearString(); - EXPECT_TRUE(FPDF_SaveWithVersion(document(), this, 0, 0)); - EXPECT_THAT(GetString(), testing::StartsWith("%PDF-1.7\r\n")); - - ClearString(); - EXPECT_TRUE(FPDF_SaveWithVersion(document(), this, 0, 18)); - EXPECT_THAT(GetString(), testing::StartsWith("%PDF-1.7\r\n")); -} - -TEST_F(FPDFSaveEmbedderTest, BUG_342) { - EXPECT_TRUE(OpenDocument("hello_world.pdf")); - EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); - EXPECT_THAT(GetString(), testing::HasSubstr("0000000000 65535 f\r\n")); - EXPECT_THAT(GetString(), - testing::Not(testing::HasSubstr("0000000000 65536 f\r\n"))); -} diff --git a/fpdfsdk/src/fpdftext.cpp b/fpdfsdk/src/fpdftext.cpp deleted file mode 100644 index 80d56920bc..0000000000 --- a/fpdfsdk/src/fpdftext.cpp +++ /dev/null @@ -1,299 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "public/fpdf_text.h" - -#include "core/include/fpdfdoc/fpdf_doc.h" -#include "core/include/fpdftext/fpdf_text.h" -#include "fpdfsdk/include/fsdk_define.h" - -#ifdef PDF_ENABLE_XFA -#include "fpdfsdk/include/fpdfxfa/fpdfxfa_doc.h" -#include "fpdfsdk/include/fpdfxfa/fpdfxfa_page.h" -#endif // PDF_ENABLE_XFA - -#ifdef _WIN32 -#include <tchar.h> -#endif - -DLLEXPORT FPDF_TEXTPAGE STDCALL FPDFText_LoadPage(FPDF_PAGE page) { - CPDF_Page* pPDFPage = CPDFPageFromFPDFPage(page); - if (!pPDFPage) - return nullptr; -#ifdef PDF_ENABLE_XFA - CPDFXFA_Page* pPage = (CPDFXFA_Page*)page; - CPDFXFA_Document* pDoc = pPage->GetDocument(); - CPDF_ViewerPreferences viewRef(pDoc->GetPDFDoc()); -#else // PDF_ENABLE_XFA - CPDF_ViewerPreferences viewRef(pPDFPage->m_pDocument); -#endif // PDF_ENABLE_XFA - IPDF_TextPage* textpage = - IPDF_TextPage::CreateTextPage(pPDFPage, viewRef.IsDirectionR2L()); - textpage->ParseTextPage(); - return textpage; -} -DLLEXPORT void STDCALL FPDFText_ClosePage(FPDF_TEXTPAGE text_page) { - delete (IPDF_TextPage*)text_page; -} -DLLEXPORT int STDCALL FPDFText_CountChars(FPDF_TEXTPAGE text_page) { - if (!text_page) - return -1; - IPDF_TextPage* textpage = (IPDF_TextPage*)text_page; - return textpage->CountChars(); -} - -DLLEXPORT unsigned int STDCALL FPDFText_GetUnicode(FPDF_TEXTPAGE text_page, - int index) { - if (!text_page) - return -1; - IPDF_TextPage* textpage = (IPDF_TextPage*)text_page; - - if (index < 0 || index >= textpage->CountChars()) - return 0; - - FPDF_CHAR_INFO charinfo; - textpage->GetCharInfo(index, &charinfo); - return charinfo.m_Unicode; -} - -DLLEXPORT double STDCALL FPDFText_GetFontSize(FPDF_TEXTPAGE text_page, - int index) { - if (!text_page) - return 0; - IPDF_TextPage* textpage = (IPDF_TextPage*)text_page; - - if (index < 0 || index >= textpage->CountChars()) - return 0; - - FPDF_CHAR_INFO charinfo; - textpage->GetCharInfo(index, &charinfo); - return charinfo.m_FontSize; -} - -DLLEXPORT void STDCALL FPDFText_GetCharBox(FPDF_TEXTPAGE text_page, - int index, - double* left, - double* right, - double* bottom, - double* top) { - if (!text_page) - return; - IPDF_TextPage* textpage = (IPDF_TextPage*)text_page; - - if (index < 0 || index >= textpage->CountChars()) - return; - FPDF_CHAR_INFO charinfo; - textpage->GetCharInfo(index, &charinfo); - *left = charinfo.m_CharBox.left; - *right = charinfo.m_CharBox.right; - *bottom = charinfo.m_CharBox.bottom; - *top = charinfo.m_CharBox.top; -} - -// select -DLLEXPORT int STDCALL FPDFText_GetCharIndexAtPos(FPDF_TEXTPAGE text_page, - double x, - double y, - double xTolerance, - double yTolerance) { - if (!text_page) - return -3; - IPDF_TextPage* textpage = (IPDF_TextPage*)text_page; - return textpage->GetIndexAtPos((FX_FLOAT)x, (FX_FLOAT)y, (FX_FLOAT)xTolerance, - (FX_FLOAT)yTolerance); -} - -DLLEXPORT int STDCALL FPDFText_GetText(FPDF_TEXTPAGE text_page, - int start, - int count, - unsigned short* result) { - if (!text_page) - return 0; - IPDF_TextPage* textpage = (IPDF_TextPage*)text_page; - - if (start >= textpage->CountChars()) - return 0; - - CFX_WideString str = textpage->GetPageText(start, count); - if (str.GetLength() > count) - str = str.Left(count); - - CFX_ByteString cbUTF16str = str.UTF16LE_Encode(); - FXSYS_memcpy(result, cbUTF16str.GetBuffer(cbUTF16str.GetLength()), - cbUTF16str.GetLength()); - cbUTF16str.ReleaseBuffer(cbUTF16str.GetLength()); - - return cbUTF16str.GetLength() / sizeof(unsigned short); -} - -DLLEXPORT int STDCALL FPDFText_CountRects(FPDF_TEXTPAGE text_page, - int start, - int count) { - if (!text_page) - return 0; - IPDF_TextPage* textpage = (IPDF_TextPage*)text_page; - return textpage->CountRects(start, count); -} -DLLEXPORT void STDCALL FPDFText_GetRect(FPDF_TEXTPAGE text_page, - int rect_index, - double* left, - double* top, - double* right, - double* bottom) { - if (!text_page) - return; - IPDF_TextPage* textpage = (IPDF_TextPage*)text_page; - CFX_FloatRect rect; - textpage->GetRect(rect_index, rect.left, rect.top, rect.right, rect.bottom); - *left = rect.left; - *top = rect.top; - *right = rect.right; - *bottom = rect.bottom; -} - -DLLEXPORT int STDCALL FPDFText_GetBoundedText(FPDF_TEXTPAGE text_page, - double left, - double top, - double right, - double bottom, - unsigned short* buffer, - int buflen) { - if (!text_page) - return 0; - IPDF_TextPage* textpage = (IPDF_TextPage*)text_page; - CFX_FloatRect rect((FX_FLOAT)left, (FX_FLOAT)bottom, (FX_FLOAT)right, - (FX_FLOAT)top); - CFX_WideString str = textpage->GetTextByRect(rect); - - if (buflen <= 0 || !buffer) { - return str.GetLength(); - } - - CFX_ByteString cbUTF16Str = str.UTF16LE_Encode(); - int len = cbUTF16Str.GetLength() / sizeof(unsigned short); - int size = buflen > len ? len : buflen; - FXSYS_memcpy(buffer, cbUTF16Str.GetBuffer(size * sizeof(unsigned short)), - size * sizeof(unsigned short)); - cbUTF16Str.ReleaseBuffer(size * sizeof(unsigned short)); - - return size; -} - -// Search -// -1 for end -DLLEXPORT FPDF_SCHHANDLE STDCALL FPDFText_FindStart(FPDF_TEXTPAGE text_page, - FPDF_WIDESTRING findwhat, - unsigned long flags, - int start_index) { - if (!text_page) - return NULL; - IPDF_TextPageFind* textpageFind = NULL; - textpageFind = IPDF_TextPageFind::CreatePageFind((IPDF_TextPage*)text_page); - FX_STRSIZE len = CFX_WideString::WStringLength(findwhat); - textpageFind->FindFirst(CFX_WideString::FromUTF16LE(findwhat, len), flags, - start_index); - return textpageFind; -} -DLLEXPORT FPDF_BOOL STDCALL FPDFText_FindNext(FPDF_SCHHANDLE handle) { - if (!handle) - return FALSE; - IPDF_TextPageFind* textpageFind = (IPDF_TextPageFind*)handle; - return textpageFind->FindNext(); -} -DLLEXPORT FPDF_BOOL STDCALL FPDFText_FindPrev(FPDF_SCHHANDLE handle) { - if (!handle) - return FALSE; - IPDF_TextPageFind* textpageFind = (IPDF_TextPageFind*)handle; - return textpageFind->FindPrev(); -} -DLLEXPORT int STDCALL FPDFText_GetSchResultIndex(FPDF_SCHHANDLE handle) { - if (!handle) - return 0; - IPDF_TextPageFind* textpageFind = (IPDF_TextPageFind*)handle; - return textpageFind->GetCurOrder(); -} -DLLEXPORT int STDCALL FPDFText_GetSchCount(FPDF_SCHHANDLE handle) { - if (!handle) - return 0; - IPDF_TextPageFind* textpageFind = (IPDF_TextPageFind*)handle; - return textpageFind->GetMatchedCount(); -} -DLLEXPORT void STDCALL FPDFText_FindClose(FPDF_SCHHANDLE handle) { - if (!handle) - return; - IPDF_TextPageFind* textpageFind = (IPDF_TextPageFind*)handle; - delete textpageFind; - handle = NULL; -} - -// web link -DLLEXPORT FPDF_PAGELINK STDCALL FPDFLink_LoadWebLinks(FPDF_TEXTPAGE text_page) { - if (!text_page) - return NULL; - IPDF_LinkExtract* pageLink = NULL; - pageLink = IPDF_LinkExtract::CreateLinkExtract(); - pageLink->ExtractLinks((IPDF_TextPage*)text_page); - return pageLink; -} -DLLEXPORT int STDCALL FPDFLink_CountWebLinks(FPDF_PAGELINK link_page) { - if (!link_page) - return 0; - IPDF_LinkExtract* pageLink = (IPDF_LinkExtract*)link_page; - return pageLink->CountLinks(); -} -DLLEXPORT int STDCALL FPDFLink_GetURL(FPDF_PAGELINK link_page, - int link_index, - unsigned short* buffer, - int buflen) { - if (!link_page) - return 0; - IPDF_LinkExtract* pageLink = (IPDF_LinkExtract*)link_page; - CFX_WideString url = pageLink->GetURL(link_index); - - CFX_ByteString cbUTF16URL = url.UTF16LE_Encode(); - int len = cbUTF16URL.GetLength() / sizeof(unsigned short); - if (!buffer || buflen <= 0) - return len; - int size = len < buflen ? len : buflen; - if (size > 0) { - FXSYS_memcpy(buffer, cbUTF16URL.GetBuffer(size * sizeof(unsigned short)), - size * sizeof(unsigned short)); - cbUTF16URL.ReleaseBuffer(size * sizeof(unsigned short)); - } - return size; -} -DLLEXPORT int STDCALL FPDFLink_CountRects(FPDF_PAGELINK link_page, - int link_index) { - if (!link_page) - return 0; - IPDF_LinkExtract* pageLink = (IPDF_LinkExtract*)link_page; - CFX_RectArray rectArray; - pageLink->GetRects(link_index, rectArray); - return rectArray.GetSize(); -} -DLLEXPORT void STDCALL FPDFLink_GetRect(FPDF_PAGELINK link_page, - int link_index, - int rect_index, - double* left, - double* top, - double* right, - double* bottom) { - if (!link_page) - return; - IPDF_LinkExtract* pageLink = (IPDF_LinkExtract*)link_page; - CFX_RectArray rectArray; - pageLink->GetRects(link_index, rectArray); - if (rect_index >= 0 && rect_index < rectArray.GetSize()) { - CFX_FloatRect rect = rectArray.GetAt(rect_index); - *left = rect.left; - *right = rect.right; - *top = rect.top; - *bottom = rect.bottom; - } -} -DLLEXPORT void STDCALL FPDFLink_CloseWebLinks(FPDF_PAGELINK link_page) { - delete (IPDF_LinkExtract*)link_page; -} diff --git a/fpdfsdk/src/fpdftext_embeddertest.cpp b/fpdfsdk/src/fpdftext_embeddertest.cpp deleted file mode 100644 index 3eaa5815d9..0000000000 --- a/fpdfsdk/src/fpdftext_embeddertest.cpp +++ /dev/null @@ -1,391 +0,0 @@ -// Copyright 2015 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "core/include/fxcrt/fx_basic.h" -#include "public/fpdf_text.h" -#include "public/fpdfview.h" -#include "testing/embedder_test.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "testing/test_support.h" - -namespace { - -bool check_unsigned_shorts(const char* expected, - const unsigned short* actual, - size_t length) { - if (length > strlen(expected) + 1) { - return false; - } - for (size_t i = 0; i < length; ++i) { - if (actual[i] != static_cast<unsigned short>(expected[i])) { - return false; - } - } - return true; -} - -} // namespace - -class FPDFTextEmbeddertest : public EmbedderTest {}; - -TEST_F(FPDFTextEmbeddertest, Text) { - EXPECT_TRUE(OpenDocument("hello_world.pdf")); - FPDF_PAGE page = LoadPage(0); - EXPECT_NE(nullptr, page); - - FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page); - EXPECT_NE(nullptr, textpage); - - static const char expected[] = "Hello, world!\r\nGoodbye, world!"; - unsigned short fixed_buffer[128]; - memset(fixed_buffer, 0xbd, sizeof(fixed_buffer)); - - // Check includes the terminating NUL that is provided. - int num_chars = FPDFText_GetText(textpage, 0, 128, fixed_buffer); - ASSERT_GE(num_chars, 0); - EXPECT_EQ(sizeof(expected), static_cast<size_t>(num_chars)); - EXPECT_TRUE(check_unsigned_shorts(expected, fixed_buffer, sizeof(expected))); - - // Count does not include the terminating NUL in the string literal. - EXPECT_EQ(sizeof(expected) - 1, FPDFText_CountChars(textpage)); - for (size_t i = 0; i < sizeof(expected) - 1; ++i) { - EXPECT_EQ(static_cast<unsigned int>(expected[i]), - FPDFText_GetUnicode(textpage, i)) - << " at " << i; - } - - EXPECT_EQ(12.0, FPDFText_GetFontSize(textpage, 0)); - EXPECT_EQ(16.0, FPDFText_GetFontSize(textpage, 15)); - - double left = 0.0; - double right = 0.0; - double bottom = 0.0; - double top = 0.0; - FPDFText_GetCharBox(textpage, 4, &left, &right, &bottom, &top); - EXPECT_NEAR(41.071, left, 0.001); - EXPECT_NEAR(46.243, right, 0.001); - EXPECT_NEAR(49.844, bottom, 0.001); - EXPECT_NEAR(55.520, top, 0.001); - - EXPECT_EQ(4, FPDFText_GetCharIndexAtPos(textpage, 42.0, 50.0, 1.0, 1.0)); - EXPECT_EQ(-1, FPDFText_GetCharIndexAtPos(textpage, 0.0, 0.0, 1.0, 1.0)); - EXPECT_EQ(-1, FPDFText_GetCharIndexAtPos(textpage, 199.0, 199.0, 1.0, 1.0)); - - // Test out of range indicies. - EXPECT_EQ(-1, - FPDFText_GetCharIndexAtPos(textpage, 42.0, 10000000.0, 1.0, 1.0)); - EXPECT_EQ(-1, FPDFText_GetCharIndexAtPos(textpage, -1.0, 50.0, 1.0, 1.0)); - - // Count does not include the terminating NUL in the string literal. - EXPECT_EQ(2, FPDFText_CountRects(textpage, 0, sizeof(expected) - 1)); - - left = 0.0; - right = 0.0; - bottom = 0.0; - top = 0.0; - FPDFText_GetRect(textpage, 1, &left, &top, &right, &bottom); - EXPECT_NEAR(20.847, left, 0.001); - EXPECT_NEAR(135.167, right, 0.001); - EXPECT_NEAR(96.655, bottom, 0.001); - EXPECT_NEAR(116.000, top, 0.001); - - // Test out of range indicies set outputs to (0.0, 0.0, 0.0, 0.0). - left = -1.0; - right = -1.0; - bottom = -1.0; - top = -1.0; - FPDFText_GetRect(textpage, -1, &left, &top, &right, &bottom); - EXPECT_EQ(0.0, left); - EXPECT_EQ(0.0, right); - EXPECT_EQ(0.0, bottom); - EXPECT_EQ(0.0, top); - - left = -2.0; - right = -2.0; - bottom = -2.0; - top = -2.0; - FPDFText_GetRect(textpage, 2, &left, &top, &right, &bottom); - EXPECT_EQ(0.0, left); - EXPECT_EQ(0.0, right); - EXPECT_EQ(0.0, bottom); - EXPECT_EQ(0.0, top); - - EXPECT_EQ(9, FPDFText_GetBoundedText(textpage, 41.0, 56.0, 82.0, 48.0, 0, 0)); - - // Extract starting at character 4 as above. - memset(fixed_buffer, 0xbd, sizeof(fixed_buffer)); - EXPECT_EQ(1, FPDFText_GetBoundedText(textpage, 41.0, 56.0, 82.0, 48.0, - fixed_buffer, 1)); - EXPECT_TRUE(check_unsigned_shorts(expected + 4, fixed_buffer, 1)); - EXPECT_EQ(0xbdbd, fixed_buffer[1]); - - memset(fixed_buffer, 0xbd, sizeof(fixed_buffer)); - EXPECT_EQ(9, FPDFText_GetBoundedText(textpage, 41.0, 56.0, 82.0, 48.0, - fixed_buffer, 9)); - EXPECT_TRUE(check_unsigned_shorts(expected + 4, fixed_buffer, 9)); - EXPECT_EQ(0xbdbd, fixed_buffer[9]); - - memset(fixed_buffer, 0xbd, sizeof(fixed_buffer)); - EXPECT_EQ(10, FPDFText_GetBoundedText(textpage, 41.0, 56.0, 82.0, 48.0, - fixed_buffer, 128)); - EXPECT_TRUE(check_unsigned_shorts(expected + 4, fixed_buffer, 9)); - EXPECT_EQ(0u, fixed_buffer[9]); - EXPECT_EQ(0xbdbd, fixed_buffer[10]); - - FPDFText_ClosePage(textpage); - UnloadPage(page); -} - -TEST_F(FPDFTextEmbeddertest, TextSearch) { - EXPECT_TRUE(OpenDocument("hello_world.pdf")); - FPDF_PAGE page = LoadPage(0); - EXPECT_NE(nullptr, page); - - FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page); - EXPECT_NE(nullptr, textpage); - - std::unique_ptr<unsigned short, pdfium::FreeDeleter> nope = - GetFPDFWideString(L"nope"); - std::unique_ptr<unsigned short, pdfium::FreeDeleter> world = - GetFPDFWideString(L"world"); - std::unique_ptr<unsigned short, pdfium::FreeDeleter> world_caps = - GetFPDFWideString(L"WORLD"); - std::unique_ptr<unsigned short, pdfium::FreeDeleter> world_substr = - GetFPDFWideString(L"orld"); - - // No occurences of "nope" in test page. - FPDF_SCHHANDLE search = FPDFText_FindStart(textpage, nope.get(), 0, 0); - EXPECT_NE(nullptr, search); - EXPECT_EQ(0, FPDFText_GetSchResultIndex(search)); - EXPECT_EQ(0, FPDFText_GetSchCount(search)); - - // Advancing finds nothing. - EXPECT_FALSE(FPDFText_FindNext(search)); - EXPECT_EQ(0, FPDFText_GetSchResultIndex(search)); - EXPECT_EQ(0, FPDFText_GetSchCount(search)); - - // Retreating finds nothing. - EXPECT_FALSE(FPDFText_FindPrev(search)); - EXPECT_EQ(0, FPDFText_GetSchResultIndex(search)); - EXPECT_EQ(0, FPDFText_GetSchCount(search)); - FPDFText_FindClose(search); - - // Two occurences of "world" in test page. - search = FPDFText_FindStart(textpage, world.get(), 0, 2); - EXPECT_NE(nullptr, search); - - // Remains not found until advanced. - EXPECT_EQ(0, FPDFText_GetSchResultIndex(search)); - EXPECT_EQ(0, FPDFText_GetSchCount(search)); - - // First occurence of "world" in this test page. - EXPECT_TRUE(FPDFText_FindNext(search)); - EXPECT_EQ(7, FPDFText_GetSchResultIndex(search)); - EXPECT_EQ(5, FPDFText_GetSchCount(search)); - - // Last occurence of "world" in this test page. - EXPECT_TRUE(FPDFText_FindNext(search)); - EXPECT_EQ(24, FPDFText_GetSchResultIndex(search)); - EXPECT_EQ(5, FPDFText_GetSchCount(search)); - - // Found position unchanged when fails to advance. - EXPECT_FALSE(FPDFText_FindNext(search)); - EXPECT_EQ(24, FPDFText_GetSchResultIndex(search)); - EXPECT_EQ(5, FPDFText_GetSchCount(search)); - - // Back to first occurence. - EXPECT_TRUE(FPDFText_FindPrev(search)); - EXPECT_EQ(7, FPDFText_GetSchResultIndex(search)); - EXPECT_EQ(5, FPDFText_GetSchCount(search)); - - // Found position unchanged when fails to retreat. - EXPECT_FALSE(FPDFText_FindPrev(search)); - EXPECT_EQ(7, FPDFText_GetSchResultIndex(search)); - EXPECT_EQ(5, FPDFText_GetSchCount(search)); - FPDFText_FindClose(search); - - // Exact search unaffected by case sensitiity and whole word flags. - search = FPDFText_FindStart(textpage, world.get(), - FPDF_MATCHCASE | FPDF_MATCHWHOLEWORD, 0); - EXPECT_NE(nullptr, search); - EXPECT_TRUE(FPDFText_FindNext(search)); - EXPECT_EQ(7, FPDFText_GetSchResultIndex(search)); - EXPECT_EQ(5, FPDFText_GetSchCount(search)); - FPDFText_FindClose(search); - - // Default is case-insensitive, so matching agaist caps works. - search = FPDFText_FindStart(textpage, world_caps.get(), 0, 0); - EXPECT_NE(nullptr, search); - EXPECT_TRUE(FPDFText_FindNext(search)); - EXPECT_EQ(7, FPDFText_GetSchResultIndex(search)); - EXPECT_EQ(5, FPDFText_GetSchCount(search)); - FPDFText_FindClose(search); - - // But can be made case sensitive, in which case this fails. - search = FPDFText_FindStart(textpage, world_caps.get(), FPDF_MATCHCASE, 0); - EXPECT_FALSE(FPDFText_FindNext(search)); - EXPECT_EQ(0, FPDFText_GetSchResultIndex(search)); - EXPECT_EQ(0, FPDFText_GetSchCount(search)); - FPDFText_FindClose(search); - - // Default is match anywhere within word, so matching substirng works. - search = FPDFText_FindStart(textpage, world_substr.get(), 0, 0); - EXPECT_TRUE(FPDFText_FindNext(search)); - EXPECT_EQ(8, FPDFText_GetSchResultIndex(search)); - EXPECT_EQ(4, FPDFText_GetSchCount(search)); - FPDFText_FindClose(search); - - // But can be made to mach word boundaries, in which case this fails. - search = - FPDFText_FindStart(textpage, world_substr.get(), FPDF_MATCHWHOLEWORD, 0); - EXPECT_FALSE(FPDFText_FindNext(search)); - // TODO(tsepez): investigate strange index/count values in this state. - FPDFText_FindClose(search); - - FPDFText_ClosePage(textpage); - UnloadPage(page); -} - -// Test that the page has characters despite a bad stream length. -TEST_F(FPDFTextEmbeddertest, StreamLengthPastEndOfFile) { - EXPECT_TRUE(OpenDocument("bug_57.pdf")); - FPDF_PAGE page = LoadPage(0); - EXPECT_NE(nullptr, page); - - FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page); - EXPECT_NE(nullptr, textpage); - EXPECT_EQ(13, FPDFText_CountChars(textpage)); - - FPDFText_ClosePage(textpage); - UnloadPage(page); -} - -TEST_F(FPDFTextEmbeddertest, WebLinks) { - EXPECT_TRUE(OpenDocument("weblinks.pdf")); - FPDF_PAGE page = LoadPage(0); - EXPECT_NE(nullptr, page); - - FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page); - EXPECT_NE(nullptr, textpage); - - FPDF_PAGELINK pagelink = FPDFLink_LoadWebLinks(textpage); - EXPECT_NE(nullptr, pagelink); - - // Page contains two HTTP-style URLs. - EXPECT_EQ(2, FPDFLink_CountWebLinks(pagelink)); - - // Only a terminating NUL required for bogus links. - EXPECT_EQ(1, FPDFLink_GetURL(pagelink, 2, nullptr, 0)); - EXPECT_EQ(1, FPDFLink_GetURL(pagelink, 1400, nullptr, 0)); - EXPECT_EQ(1, FPDFLink_GetURL(pagelink, -1, nullptr, 0)); - - // Query the number of characters required for each link (incl NUL). - EXPECT_EQ(25, FPDFLink_GetURL(pagelink, 0, nullptr, 0)); - EXPECT_EQ(26, FPDFLink_GetURL(pagelink, 1, nullptr, 0)); - - static const char expected_url[] = "http://example.com?q=foo"; - unsigned short fixed_buffer[128]; - - // Retrieve a link with too small a buffer. Buffer will not be - // NUL-terminated, but must not be modified past indicated length, - // so pre-fill with a pattern to check write bounds. - memset(fixed_buffer, 0xbd, sizeof(fixed_buffer)); - EXPECT_EQ(1, FPDFLink_GetURL(pagelink, 0, fixed_buffer, 1)); - EXPECT_TRUE(check_unsigned_shorts(expected_url, fixed_buffer, 1)); - EXPECT_EQ(0xbdbd, fixed_buffer[1]); - - // Check buffer that doesn't have space for a terminating NUL. - memset(fixed_buffer, 0xbd, sizeof(fixed_buffer)); - EXPECT_EQ( - sizeof(expected_url) - 1, - FPDFLink_GetURL(pagelink, 0, fixed_buffer, sizeof(expected_url) - 1)); - EXPECT_TRUE(check_unsigned_shorts(expected_url, fixed_buffer, - sizeof(expected_url) - 1)); - EXPECT_EQ(0xbdbd, fixed_buffer[sizeof(expected_url) - 1]); - - // Retreive link with exactly-sized buffer. - memset(fixed_buffer, 0xbd, sizeof(fixed_buffer)); - EXPECT_EQ(sizeof(expected_url), - FPDFLink_GetURL(pagelink, 0, fixed_buffer, sizeof(expected_url))); - EXPECT_TRUE( - check_unsigned_shorts(expected_url, fixed_buffer, sizeof(expected_url))); - EXPECT_EQ(0u, fixed_buffer[sizeof(expected_url) - 1]); - EXPECT_EQ(0xbdbd, fixed_buffer[sizeof(expected_url)]); - - // Retreive link with ample-sized-buffer. - memset(fixed_buffer, 0xbd, sizeof(fixed_buffer)); - EXPECT_EQ(sizeof(expected_url), - FPDFLink_GetURL(pagelink, 0, fixed_buffer, 128)); - EXPECT_TRUE( - check_unsigned_shorts(expected_url, fixed_buffer, sizeof(expected_url))); - EXPECT_EQ(0u, fixed_buffer[sizeof(expected_url) - 1]); - EXPECT_EQ(0xbdbd, fixed_buffer[sizeof(expected_url)]); - - // Each link rendered in a single rect in this test page. - EXPECT_EQ(1, FPDFLink_CountRects(pagelink, 0)); - EXPECT_EQ(1, FPDFLink_CountRects(pagelink, 1)); - - // Each link rendered in a single rect in this test page. - EXPECT_EQ(0, FPDFLink_CountRects(pagelink, -1)); - EXPECT_EQ(0, FPDFLink_CountRects(pagelink, 2)); - EXPECT_EQ(0, FPDFLink_CountRects(pagelink, 10000)); - - // Check boundary of valid link index with valid rect index. - double left = 0.0; - double right = 0.0; - double top = 0.0; - double bottom = 0.0; - FPDFLink_GetRect(pagelink, 0, 0, &left, &top, &right, &bottom); - EXPECT_NEAR(50.791, left, 0.001); - EXPECT_NEAR(187.963, right, 0.001); - EXPECT_NEAR(97.624, bottom, 0.001); - EXPECT_NEAR(108.736, top, 0.001); - - // Check that valid link with invalid rect index leaves parameters unchanged. - left = -1.0; - right = -1.0; - top = -1.0; - bottom = -1.0; - FPDFLink_GetRect(pagelink, 0, 1, &left, &top, &right, &bottom); - EXPECT_EQ(-1.0, left); - EXPECT_EQ(-1.0, right); - EXPECT_EQ(-1.0, bottom); - EXPECT_EQ(-1.0, top); - - // Check that invalid link index leaves parameters unchanged. - left = -2.0; - right = -2.0; - top = -2.0; - bottom = -2.0; - FPDFLink_GetRect(pagelink, -1, 0, &left, &top, &right, &bottom); - EXPECT_EQ(-2.0, left); - EXPECT_EQ(-2.0, right); - EXPECT_EQ(-2.0, bottom); - EXPECT_EQ(-2.0, top); - - FPDFLink_CloseWebLinks(pagelink); - FPDFText_ClosePage(textpage); - UnloadPage(page); -} - -TEST_F(FPDFTextEmbeddertest, GetFontSize) { - EXPECT_TRUE(OpenDocument("hello_world.pdf")); - FPDF_PAGE page = LoadPage(0); - EXPECT_NE(nullptr, page); - - FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page); - EXPECT_NE(nullptr, textpage); - - const double kExpectedFontsSizes[] = {12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 1, 1, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16}; - - int count = FPDFText_CountChars(textpage); - ASSERT_EQ(FX_ArraySize(kExpectedFontsSizes), count); - for (int i = 0; i < count; ++i) - EXPECT_EQ(kExpectedFontsSizes[i], FPDFText_GetFontSize(textpage, i)) << i; - - FPDFText_ClosePage(textpage); - UnloadPage(page); -} diff --git a/fpdfsdk/src/fpdfview.cpp b/fpdfsdk/src/fpdfview.cpp deleted file mode 100644 index 1f6d11d3fe..0000000000 --- a/fpdfsdk/src/fpdfview.cpp +++ /dev/null @@ -1,1145 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "public/fpdfview.h" - -#include <memory> - -#include "core/include/fpdfapi/cpdf_array.h" -#include "core/include/fpdfapi/cpdf_document.h" -#include "core/include/fxcodec/fx_codec.h" -#include "core/include/fxcrt/fx_safe_types.h" -#include "fpdfsdk/include/fsdk_define.h" -#include "fpdfsdk/include/fsdk_mgr.h" -#include "fpdfsdk/include/fsdk_rendercontext.h" -#include "fpdfsdk/include/javascript/IJavaScript.h" -#include "public/fpdf_ext.h" -#include "public/fpdf_progressive.h" -#include "third_party/base/numerics/safe_conversions_impl.h" - -#ifdef PDF_ENABLE_XFA -#include "core/include/fpdfapi/fpdf_module.h" -#include "fpdfsdk/include/fpdfxfa/fpdfxfa_app.h" -#include "fpdfsdk/include/fpdfxfa/fpdfxfa_doc.h" -#include "fpdfsdk/include/fpdfxfa/fpdfxfa_page.h" -#include "fpdfsdk/include/fpdfxfa/fpdfxfa_util.h" -#include "public/fpdf_formfill.h" -#endif // PDF_ENABLE_XFA - -UnderlyingDocumentType* UnderlyingFromFPDFDocument(FPDF_DOCUMENT doc) { - return static_cast<UnderlyingDocumentType*>(doc); -} - -FPDF_DOCUMENT FPDFDocumentFromUnderlying(UnderlyingDocumentType* doc) { - return static_cast<FPDF_DOCUMENT>(doc); -} - -UnderlyingPageType* UnderlyingFromFPDFPage(FPDF_PAGE page) { - return static_cast<UnderlyingPageType*>(page); -} - -CPDF_Document* CPDFDocumentFromFPDFDocument(FPDF_DOCUMENT doc) { -#ifdef PDF_ENABLE_XFA - return doc ? UnderlyingFromFPDFDocument(doc)->GetPDFDoc() : nullptr; -#else // PDF_ENABLE_XFA - return UnderlyingFromFPDFDocument(doc); -#endif // PDF_ENABLE_XFA -} - -FPDF_DOCUMENT FPDFDocumentFromCPDFDocument(CPDF_Document* doc) { -#ifdef PDF_ENABLE_XFA - return doc ? FPDFDocumentFromUnderlying( - new CPDFXFA_Document(doc, CPDFXFA_App::GetInstance())) - : nullptr; -#else // PDF_ENABLE_XFA - return FPDFDocumentFromUnderlying(doc); -#endif // PDF_ENABLE_XFA -} - -CPDF_Page* CPDFPageFromFPDFPage(FPDF_PAGE page) { -#ifdef PDF_ENABLE_XFA - return page ? UnderlyingFromFPDFPage(page)->GetPDFPage() : nullptr; -#else // PDF_ENABLE_XFA - return UnderlyingFromFPDFPage(page); -#endif // PDF_ENABLE_XFA -} - -#ifdef PDF_ENABLE_XFA -CFPDF_FileStream::CFPDF_FileStream(FPDF_FILEHANDLER* pFS) { - m_pFS = pFS; - m_nCurPos = 0; -} - -IFX_FileStream* CFPDF_FileStream::Retain() { - return this; -} - -void CFPDF_FileStream::Release() { - if (m_pFS && m_pFS->Release) - m_pFS->Release(m_pFS->clientData); - delete this; -} - -FX_FILESIZE CFPDF_FileStream::GetSize() { - if (m_pFS && m_pFS->GetSize) - return (FX_FILESIZE)m_pFS->GetSize(m_pFS->clientData); - return 0; -} - -FX_BOOL CFPDF_FileStream::IsEOF() { - return m_nCurPos >= GetSize(); -} - -FX_BOOL CFPDF_FileStream::ReadBlock(void* buffer, - FX_FILESIZE offset, - size_t size) { - if (!buffer || !size || !m_pFS->ReadBlock) - return FALSE; - - if (m_pFS->ReadBlock(m_pFS->clientData, (FPDF_DWORD)offset, buffer, - (FPDF_DWORD)size) == 0) { - m_nCurPos = offset + size; - return TRUE; - } - return FALSE; -} - -size_t CFPDF_FileStream::ReadBlock(void* buffer, size_t size) { - if (!buffer || !size || !m_pFS->ReadBlock) - return 0; - - FX_FILESIZE nSize = GetSize(); - if (m_nCurPos >= nSize) - return 0; - FX_FILESIZE dwAvail = nSize - m_nCurPos; - if (dwAvail < (FX_FILESIZE)size) - size = (size_t)dwAvail; - if (m_pFS->ReadBlock(m_pFS->clientData, (FPDF_DWORD)m_nCurPos, buffer, - (FPDF_DWORD)size) == 0) { - m_nCurPos += size; - return size; - } - - return 0; -} - -FX_BOOL CFPDF_FileStream::WriteBlock(const void* buffer, - FX_FILESIZE offset, - size_t size) { - if (!m_pFS || !m_pFS->WriteBlock) - return FALSE; - - if (m_pFS->WriteBlock(m_pFS->clientData, (FPDF_DWORD)offset, buffer, - (FPDF_DWORD)size) == 0) { - m_nCurPos = offset + size; - return TRUE; - } - return FALSE; -} - -FX_BOOL CFPDF_FileStream::Flush() { - if (!m_pFS || !m_pFS->Flush) - return TRUE; - - return m_pFS->Flush(m_pFS->clientData) == 0; -} -#endif // PDF_ENABLE_XFA - -CPDF_CustomAccess::CPDF_CustomAccess(FPDF_FILEACCESS* pFileAccess) { - m_FileAccess = *pFileAccess; -#ifdef PDF_ENABLE_XFA - m_BufferOffset = (FX_DWORD)-1; -#endif // PDF_ENABLE_XFA -} - -#ifdef PDF_ENABLE_XFA -FX_BOOL CPDF_CustomAccess::GetByte(FX_DWORD pos, uint8_t& ch) { - if (pos >= m_FileAccess.m_FileLen) - return FALSE; - if (m_BufferOffset == (FX_DWORD)-1 || pos < m_BufferOffset || - pos >= m_BufferOffset + 512) { - // Need to read from file access - m_BufferOffset = pos; - int size = 512; - if (pos + 512 > m_FileAccess.m_FileLen) - size = m_FileAccess.m_FileLen - pos; - if (!m_FileAccess.m_GetBlock(m_FileAccess.m_Param, m_BufferOffset, m_Buffer, - size)) - return FALSE; - } - ch = m_Buffer[pos - m_BufferOffset]; - return TRUE; -} - -FX_BOOL CPDF_CustomAccess::GetBlock(FX_DWORD pos, - uint8_t* pBuf, - FX_DWORD size) { - if (pos + size > m_FileAccess.m_FileLen) - return FALSE; - return m_FileAccess.m_GetBlock(m_FileAccess.m_Param, pos, pBuf, size); -} -#endif // PDF_ENABLE_XFA - -FX_BOOL CPDF_CustomAccess::ReadBlock(void* buffer, - FX_FILESIZE offset, - size_t size) { - if (offset < 0) { - return FALSE; - } - FX_SAFE_FILESIZE newPos = - pdfium::base::checked_cast<FX_FILESIZE, size_t>(size); - newPos += offset; - if (!newPos.IsValid() || newPos.ValueOrDie() > m_FileAccess.m_FileLen) { - return FALSE; - } - return m_FileAccess.m_GetBlock(m_FileAccess.m_Param, offset, (uint8_t*)buffer, - size); -} - -// 0 bit: FPDF_POLICY_MACHINETIME_ACCESS -static FX_DWORD foxit_sandbox_policy = 0xFFFFFFFF; - -void FSDK_SetSandBoxPolicy(FPDF_DWORD policy, FPDF_BOOL enable) { - switch (policy) { - case FPDF_POLICY_MACHINETIME_ACCESS: { - if (enable) - foxit_sandbox_policy |= 0x01; - else - foxit_sandbox_policy &= 0xFFFFFFFE; - } break; - default: - break; - } -} - -FPDF_BOOL FSDK_IsSandBoxPolicyEnabled(FPDF_DWORD policy) { - switch (policy) { - case FPDF_POLICY_MACHINETIME_ACCESS: - return !!(foxit_sandbox_policy & 0x01); - default: - return FALSE; - } -} - -CCodec_ModuleMgr* g_pCodecModule = nullptr; - -DLLEXPORT void STDCALL FPDF_InitLibrary() { - FPDF_InitLibraryWithConfig(nullptr); -} - -DLLEXPORT void STDCALL FPDF_InitLibraryWithConfig( - const FPDF_LIBRARY_CONFIG* cfg) { - g_pCodecModule = new CCodec_ModuleMgr(); - - CFX_GEModule::Create(cfg ? cfg->m_pUserFontPaths : nullptr); - CFX_GEModule::Get()->SetCodecModule(g_pCodecModule); - - CPDF_ModuleMgr::Create(); - CPDF_ModuleMgr* pModuleMgr = CPDF_ModuleMgr::Get(); - pModuleMgr->SetCodecModule(g_pCodecModule); - pModuleMgr->InitPageModule(); - pModuleMgr->InitRenderModule(); -#ifdef PDF_ENABLE_XFA - CPDFXFA_App::GetInstance()->Initialize( - (cfg && cfg->version >= 2) - ? reinterpret_cast<FXJSE_HRUNTIME>(cfg->m_pIsolate) - : nullptr); -#else // PDF_ENABLE_XFA - pModuleMgr->LoadEmbeddedGB1CMaps(); - pModuleMgr->LoadEmbeddedJapan1CMaps(); - pModuleMgr->LoadEmbeddedCNS1CMaps(); - pModuleMgr->LoadEmbeddedKorea1CMaps(); -#endif // PDF_ENABLE_XFA - if (cfg && cfg->version >= 2) - IJS_Runtime::Initialize(cfg->m_v8EmbedderSlot, cfg->m_pIsolate); -} - -DLLEXPORT void STDCALL FPDF_DestroyLibrary() { -#ifdef PDF_ENABLE_XFA - CPDFXFA_App::ReleaseInstance(); -#endif // PDF_ENABLE_XFA - CPDF_ModuleMgr::Destroy(); - CFX_GEModule::Destroy(); - - delete g_pCodecModule; - g_pCodecModule = nullptr; -} - -#ifndef _WIN32 -int g_LastError; -void SetLastError(int err) { - g_LastError = err; -} - -int GetLastError() { - return g_LastError; -} -#endif // _WIN32 - -void ProcessParseError(CPDF_Parser::Error err) { - FX_DWORD err_code; - // Translate FPDFAPI error code to FPDFVIEW error code - switch (err) { - case CPDF_Parser::SUCCESS: - err_code = FPDF_ERR_SUCCESS; - break; - case CPDF_Parser::FILE_ERROR: - err_code = FPDF_ERR_FILE; - break; - case CPDF_Parser::FORMAT_ERROR: - err_code = FPDF_ERR_FORMAT; - break; - case CPDF_Parser::PASSWORD_ERROR: - err_code = FPDF_ERR_PASSWORD; - break; - case CPDF_Parser::HANDLER_ERROR: - err_code = FPDF_ERR_SECURITY; - break; - } - SetLastError(err_code); -} - -DLLEXPORT void STDCALL FPDF_SetSandBoxPolicy(FPDF_DWORD policy, - FPDF_BOOL enable) { - return FSDK_SetSandBoxPolicy(policy, enable); -} - -DLLEXPORT FPDF_DOCUMENT STDCALL FPDF_LoadDocument(FPDF_STRING file_path, - FPDF_BYTESTRING password) { - // NOTE: the creation of the file needs to be by the embedder on the - // other side of this API. - IFX_FileRead* pFileAccess = FX_CreateFileRead((const FX_CHAR*)file_path); - if (!pFileAccess) { - return nullptr; - } - - CPDF_Parser* pParser = new CPDF_Parser; - pParser->SetPassword(password); - - CPDF_Parser::Error error = pParser->StartParse(pFileAccess); - if (error != CPDF_Parser::SUCCESS) { - delete pParser; - ProcessParseError(error); - return NULL; - } -#ifdef PDF_ENABLE_XFA - CPDF_Document* pPDFDoc = pParser->GetDocument(); - if (!pPDFDoc) - return NULL; - - CPDFXFA_App* pProvider = CPDFXFA_App::GetInstance(); - return new CPDFXFA_Document(pPDFDoc, pProvider); -#else // PDF_ENABLE_XFA - return pParser->GetDocument(); -#endif // PDF_ENABLE_XFA -} - -#ifdef PDF_ENABLE_XFA -DLLEXPORT FPDF_BOOL STDCALL FPDF_HasXFAField(FPDF_DOCUMENT document, - int* docType) { - if (!document) - return FALSE; - - CPDF_Document* pdfDoc = - (static_cast<CPDFXFA_Document*>(document))->GetPDFDoc(); - if (!pdfDoc) - return FALSE; - - CPDF_Dictionary* pRoot = pdfDoc->GetRoot(); - if (!pRoot) - return FALSE; - - CPDF_Dictionary* pAcroForm = pRoot->GetDictBy("AcroForm"); - if (!pAcroForm) - return FALSE; - - CPDF_Object* pXFA = pAcroForm->GetElement("XFA"); - if (!pXFA) - return FALSE; - - FX_BOOL bDynamicXFA = pRoot->GetBooleanBy("NeedsRendering", FALSE); - - if (bDynamicXFA) - *docType = DOCTYPE_DYNAMIC_XFA; - else - *docType = DOCTYPE_STATIC_XFA; - - return TRUE; -} - -DLLEXPORT FPDF_BOOL STDCALL FPDF_LoadXFA(FPDF_DOCUMENT document) { - return document && (static_cast<CPDFXFA_Document*>(document))->LoadXFADoc(); -} -#endif // PDF_ENABLE_XFA - -class CMemFile final : public IFX_FileRead { - public: - CMemFile(uint8_t* pBuf, FX_FILESIZE size) : m_pBuf(pBuf), m_size(size) {} - - void Release() override { delete this; } - FX_FILESIZE GetSize() override { return m_size; } - FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) override { - if (offset < 0) { - return FALSE; - } - FX_SAFE_FILESIZE newPos = - pdfium::base::checked_cast<FX_FILESIZE, size_t>(size); - newPos += offset; - if (!newPos.IsValid() || newPos.ValueOrDie() > (FX_DWORD)m_size) { - return FALSE; - } - FXSYS_memcpy(buffer, m_pBuf + offset, size); - return TRUE; - } - - private: - ~CMemFile() override {} - - uint8_t* const m_pBuf; - const FX_FILESIZE m_size; -}; - -DLLEXPORT FPDF_DOCUMENT STDCALL FPDF_LoadMemDocument(const void* data_buf, - int size, - FPDF_BYTESTRING password) { - CPDF_Parser* pParser = new CPDF_Parser; - pParser->SetPassword(password); - CMemFile* pMemFile = new CMemFile((uint8_t*)data_buf, size); - CPDF_Parser::Error error = pParser->StartParse(pMemFile); - if (error != CPDF_Parser::SUCCESS) { - delete pParser; - ProcessParseError(error); - return NULL; - } - CPDF_Document* pDoc = NULL; - pDoc = pParser ? pParser->GetDocument() : NULL; - CheckUnSupportError(pDoc, error); - return FPDFDocumentFromCPDFDocument(pParser->GetDocument()); -} - -DLLEXPORT FPDF_DOCUMENT STDCALL -FPDF_LoadCustomDocument(FPDF_FILEACCESS* pFileAccess, - FPDF_BYTESTRING password) { - CPDF_Parser* pParser = new CPDF_Parser; - pParser->SetPassword(password); - CPDF_CustomAccess* pFile = new CPDF_CustomAccess(pFileAccess); - CPDF_Parser::Error error = pParser->StartParse(pFile); - if (error != CPDF_Parser::SUCCESS) { - delete pParser; - ProcessParseError(error); - return NULL; - } - CPDF_Document* pDoc = NULL; - pDoc = pParser ? pParser->GetDocument() : NULL; - CheckUnSupportError(pDoc, error); - return FPDFDocumentFromCPDFDocument(pParser->GetDocument()); -} - -DLLEXPORT FPDF_BOOL STDCALL FPDF_GetFileVersion(FPDF_DOCUMENT doc, - int* fileVersion) { - if (!fileVersion) - return FALSE; - - *fileVersion = 0; - CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(doc); - if (!pDoc) - return FALSE; - - CPDF_Parser* pParser = pDoc->GetParser(); - if (!pParser) - return FALSE; - - *fileVersion = pParser->GetFileVersion(); - return TRUE; -} - -// jabdelmalek: changed return type from FX_DWORD to build on Linux (and match -// header). -DLLEXPORT unsigned long STDCALL FPDF_GetDocPermissions(FPDF_DOCUMENT document) { - CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); - if (!pDoc) -#ifndef PDF_ENABLE_XFA - return 0; -#else // PDF_ENABLE_XFA - return (FX_DWORD)-1; -#endif // PDF_ENABLE_XFA - - CPDF_Dictionary* pDict = pDoc->GetParser()->GetEncryptDict(); - return pDict ? pDict->GetIntegerBy("P") : (FX_DWORD)-1; -} - -DLLEXPORT int STDCALL FPDF_GetSecurityHandlerRevision(FPDF_DOCUMENT document) { - CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); - if (!pDoc) - return -1; - - CPDF_Dictionary* pDict = pDoc->GetParser()->GetEncryptDict(); - return pDict ? pDict->GetIntegerBy("R") : -1; -} - -DLLEXPORT int STDCALL FPDF_GetPageCount(FPDF_DOCUMENT document) { - UnderlyingDocumentType* pDoc = UnderlyingFromFPDFDocument(document); - return pDoc ? pDoc->GetPageCount() : 0; -} - -DLLEXPORT FPDF_PAGE STDCALL FPDF_LoadPage(FPDF_DOCUMENT document, - int page_index) { - UnderlyingDocumentType* pDoc = UnderlyingFromFPDFDocument(document); - if (!pDoc) - return nullptr; - - if (page_index < 0 || page_index >= pDoc->GetPageCount()) - return nullptr; - -#ifdef PDF_ENABLE_XFA - return pDoc->GetPage(page_index); -#else // PDF_ENABLE_XFA - CPDF_Dictionary* pDict = pDoc->GetPage(page_index); - if (!pDict) - return NULL; - CPDF_Page* pPage = new CPDF_Page; - pPage->Load(pDoc, pDict); - pPage->ParseContent(nullptr); - return pPage; -#endif // PDF_ENABLE_XFA -} - -DLLEXPORT double STDCALL FPDF_GetPageWidth(FPDF_PAGE page) { - UnderlyingPageType* pPage = UnderlyingFromFPDFPage(page); - return pPage ? pPage->GetPageWidth() : 0.0; -} - -DLLEXPORT double STDCALL FPDF_GetPageHeight(FPDF_PAGE page) { - UnderlyingPageType* pPage = UnderlyingFromFPDFPage(page); - return pPage ? pPage->GetPageHeight() : 0.0; -} - -void DropContext(void* data) { - delete (CRenderContext*)data; -} - -#if defined(_WIN32) -DLLEXPORT void STDCALL FPDF_RenderPage(HDC dc, - FPDF_PAGE page, - int start_x, - int start_y, - int size_x, - int size_y, - int rotate, - int flags) { - CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!pPage) - return; - - CRenderContext* pContext = new CRenderContext; - pPage->SetPrivateData((void*)1, pContext, DropContext); - -#if !defined(_WIN32_WCE) - CFX_DIBitmap* pBitmap = nullptr; - FX_BOOL bBackgroundAlphaNeeded = pPage->BackgroundAlphaNeeded(); - FX_BOOL bHasImageMask = pPage->HasImageMask(); - if (bBackgroundAlphaNeeded || bHasImageMask) { - pBitmap = new CFX_DIBitmap; - pBitmap->Create(size_x, size_y, FXDIB_Argb); - pBitmap->Clear(0x00ffffff); -#ifdef _SKIA_SUPPORT_ - pContext->m_pDevice = new CFX_SkiaDevice; - ((CFX_SkiaDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)pBitmap); -#else - pContext->m_pDevice = new CFX_FxgeDevice; - ((CFX_FxgeDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)pBitmap); -#endif - } else { - pContext->m_pDevice = new CFX_WindowsDevice(dc); - } - - FPDF_RenderPage_Retail(pContext, page, start_x, start_y, size_x, size_y, - rotate, flags, TRUE, NULL); - - if (bBackgroundAlphaNeeded || bHasImageMask) { - if (pBitmap) { - CFX_WindowsDevice WinDC(dc); - - if (WinDC.GetDeviceCaps(FXDC_DEVICE_CLASS) == FXDC_PRINTER) { - CFX_DIBitmap* pDst = new CFX_DIBitmap; - int pitch = pBitmap->GetPitch(); - pDst->Create(size_x, size_y, FXDIB_Rgb32); - FXSYS_memset(pDst->GetBuffer(), -1, pitch * size_y); - pDst->CompositeBitmap(0, 0, size_x, size_y, pBitmap, 0, 0, - FXDIB_BLEND_NORMAL, NULL, FALSE, NULL); - WinDC.StretchDIBits(pDst, 0, 0, size_x, size_y); - delete pDst; - } else { - WinDC.SetDIBits(pBitmap, 0, 0); - } - } - } -#else - // get clip region - RECT rect, cliprect; - rect.left = start_x; - rect.top = start_y; - rect.right = start_x + size_x; - rect.bottom = start_y + size_y; - GetClipBox(dc, &cliprect); - IntersectRect(&rect, &rect, &cliprect); - int width = rect.right - rect.left; - int height = rect.bottom - rect.top; - - // Create a DIB section - LPVOID pBuffer; - BITMAPINFOHEADER bmih; - FXSYS_memset(&bmih, 0, sizeof bmih); - bmih.biSize = sizeof bmih; - bmih.biBitCount = 24; - bmih.biHeight = -height; - bmih.biPlanes = 1; - bmih.biWidth = width; - pContext->m_hBitmap = CreateDIBSection(dc, (BITMAPINFO*)&bmih, DIB_RGB_COLORS, - &pBuffer, NULL, 0); - FXSYS_memset(pBuffer, 0xff, height * ((width * 3 + 3) / 4 * 4)); - - // Create a device with this external buffer - pContext->m_pBitmap = new CFX_DIBitmap; - pContext->m_pBitmap->Create(width, height, FXDIB_Rgb, (uint8_t*)pBuffer); - pContext->m_pDevice = new CPDF_FxgeDevice; - ((CPDF_FxgeDevice*)pContext->m_pDevice)->Attach(pContext->m_pBitmap); - - // output to bitmap device - FPDF_RenderPage_Retail(pContext, page, start_x - rect.left, - start_y - rect.top, size_x, size_y, rotate, flags); - - // Now output to real device - HDC hMemDC = CreateCompatibleDC(dc); - HGDIOBJ hOldBitmap = SelectObject(hMemDC, pContext->m_hBitmap); - - BitBlt(dc, rect.left, rect.top, width, height, hMemDC, 0, 0, SRCCOPY); - SelectObject(hMemDC, hOldBitmap); - DeleteDC(hMemDC); - -#endif // !defined(_WIN32_WCE) - if (bBackgroundAlphaNeeded || bHasImageMask) - delete pBitmap; - - delete pContext; - pPage->RemovePrivateData((void*)1); -} -#endif // defined(_WIN32) - -DLLEXPORT void STDCALL FPDF_RenderPageBitmap(FPDF_BITMAP bitmap, - FPDF_PAGE page, - int start_x, - int start_y, - int size_x, - int size_y, - int rotate, - int flags) { - if (!bitmap) - return; - CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!pPage) - return; - CRenderContext* pContext = new CRenderContext; - pPage->SetPrivateData((void*)1, pContext, DropContext); -#ifdef _SKIA_SUPPORT_ - pContext->m_pDevice = new CFX_SkiaDevice; - - if (flags & FPDF_REVERSE_BYTE_ORDER) - ((CFX_SkiaDevice*)pContext->m_pDevice) - ->Attach((CFX_DIBitmap*)bitmap, 0, TRUE); - else - ((CFX_SkiaDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)bitmap); -#else - pContext->m_pDevice = new CFX_FxgeDevice; - - if (flags & FPDF_REVERSE_BYTE_ORDER) - ((CFX_FxgeDevice*)pContext->m_pDevice) - ->Attach((CFX_DIBitmap*)bitmap, 0, TRUE); - else - ((CFX_FxgeDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)bitmap); -#endif - - FPDF_RenderPage_Retail(pContext, page, start_x, start_y, size_x, size_y, - rotate, flags, TRUE, NULL); - - delete pContext; - pPage->RemovePrivateData((void*)1); -} - -DLLEXPORT void STDCALL FPDF_ClosePage(FPDF_PAGE page) { - if (!page) - return; -#ifdef PDF_ENABLE_XFA - CPDFXFA_Page* pPage = (CPDFXFA_Page*)page; - pPage->Release(); -#else // PDF_ENABLE_XFA - CPDFSDK_PageView* pPageView = - (CPDFSDK_PageView*)(((CPDF_Page*)page))->GetPrivateData((void*)page); - if (pPageView && pPageView->IsLocked()) { - pPageView->TakeOverPage(); - return; - } - delete (CPDF_Page*)page; -#endif // PDF_ENABLE_XFA -} - -DLLEXPORT void STDCALL FPDF_CloseDocument(FPDF_DOCUMENT document) { -#ifdef PDF_ENABLE_XFA - delete UnderlyingFromFPDFDocument(document); -#else // PDF_ENABLE_XFA - CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); - if (!pDoc) - return; - CPDF_Parser* pParser = pDoc->GetParser(); - if (!pParser) { - delete pDoc; - return; - } - delete pParser; -#endif // PDF_ENABLE_XFA -} - -DLLEXPORT unsigned long STDCALL FPDF_GetLastError() { - return GetLastError(); -} - -DLLEXPORT void STDCALL FPDF_DeviceToPage(FPDF_PAGE page, - int start_x, - int start_y, - int size_x, - int size_y, - int rotate, - int device_x, - int device_y, - double* page_x, - double* page_y) { - if (!page || !page_x || !page_y) - return; - UnderlyingPageType* pPage = UnderlyingFromFPDFPage(page); -#ifdef PDF_ENABLE_XFA - pPage->DeviceToPage(start_x, start_y, size_x, size_y, rotate, device_x, - device_y, page_x, page_y); -#else // PDF_ENABLE_XFA - CFX_Matrix page2device; - pPage->GetDisplayMatrix(page2device, start_x, start_y, size_x, size_y, - rotate); - CFX_Matrix device2page; - device2page.SetReverse(page2device); - FX_FLOAT page_x_f, page_y_f; - device2page.Transform((FX_FLOAT)(device_x), (FX_FLOAT)(device_y), page_x_f, - page_y_f); - *page_x = (page_x_f); - *page_y = (page_y_f); -#endif // PDF_ENABLE_XFA -} - -DLLEXPORT void STDCALL FPDF_PageToDevice(FPDF_PAGE page, - int start_x, - int start_y, - int size_x, - int size_y, - int rotate, - double page_x, - double page_y, - int* device_x, - int* device_y) { - if (!device_x || !device_y) - return; - UnderlyingPageType* pPage = UnderlyingFromFPDFPage(page); - if (!pPage) - return; -#ifdef PDF_ENABLE_XFA - pPage->PageToDevice(start_x, start_y, size_x, size_y, rotate, page_x, page_y, - device_x, device_y); -#else // PDF_ENABLE_XFA - CFX_Matrix page2device; - pPage->GetDisplayMatrix(page2device, start_x, start_y, size_x, size_y, - rotate); - FX_FLOAT device_x_f, device_y_f; - page2device.Transform(((FX_FLOAT)page_x), ((FX_FLOAT)page_y), device_x_f, - device_y_f); - *device_x = FXSYS_round(device_x_f); - *device_y = FXSYS_round(device_y_f); -#endif // PDF_ENABLE_XFA -} - -DLLEXPORT FPDF_BITMAP STDCALL FPDFBitmap_Create(int width, - int height, - int alpha) { - std::unique_ptr<CFX_DIBitmap> pBitmap(new CFX_DIBitmap); - if (!pBitmap->Create(width, height, alpha ? FXDIB_Argb : FXDIB_Rgb32)) { - return NULL; - } - return pBitmap.release(); -} - -DLLEXPORT FPDF_BITMAP STDCALL FPDFBitmap_CreateEx(int width, - int height, - int format, - void* first_scan, - int stride) { - FXDIB_Format fx_format; - switch (format) { - case FPDFBitmap_Gray: - fx_format = FXDIB_8bppRgb; - break; - case FPDFBitmap_BGR: - fx_format = FXDIB_Rgb; - break; - case FPDFBitmap_BGRx: - fx_format = FXDIB_Rgb32; - break; - case FPDFBitmap_BGRA: - fx_format = FXDIB_Argb; - break; - default: - return NULL; - } - CFX_DIBitmap* pBitmap = new CFX_DIBitmap; - pBitmap->Create(width, height, fx_format, (uint8_t*)first_scan, stride); - return pBitmap; -} - -DLLEXPORT void STDCALL FPDFBitmap_FillRect(FPDF_BITMAP bitmap, - int left, - int top, - int width, - int height, - FPDF_DWORD color) { - if (!bitmap) - return; -#ifdef _SKIA_SUPPORT_ - CFX_SkiaDevice device; -#else - CFX_FxgeDevice device; -#endif - device.Attach((CFX_DIBitmap*)bitmap); - if (!((CFX_DIBitmap*)bitmap)->HasAlpha()) - color |= 0xFF000000; - FX_RECT rect(left, top, left + width, top + height); - device.FillRect(&rect, color); -} - -DLLEXPORT void* STDCALL FPDFBitmap_GetBuffer(FPDF_BITMAP bitmap) { - return bitmap ? ((CFX_DIBitmap*)bitmap)->GetBuffer() : nullptr; -} - -DLLEXPORT int STDCALL FPDFBitmap_GetWidth(FPDF_BITMAP bitmap) { - return bitmap ? ((CFX_DIBitmap*)bitmap)->GetWidth() : 0; -} - -DLLEXPORT int STDCALL FPDFBitmap_GetHeight(FPDF_BITMAP bitmap) { - return bitmap ? ((CFX_DIBitmap*)bitmap)->GetHeight() : 0; -} - -DLLEXPORT int STDCALL FPDFBitmap_GetStride(FPDF_BITMAP bitmap) { - return bitmap ? ((CFX_DIBitmap*)bitmap)->GetPitch() : 0; -} - -DLLEXPORT void STDCALL FPDFBitmap_Destroy(FPDF_BITMAP bitmap) { - delete (CFX_DIBitmap*)bitmap; -} - -void FPDF_RenderPage_Retail(CRenderContext* pContext, - FPDF_PAGE page, - int start_x, - int start_y, - int size_x, - int size_y, - int rotate, - int flags, - FX_BOOL bNeedToRestore, - IFSDK_PAUSE_Adapter* pause) { - CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!pPage) - return; - - if (!pContext->m_pOptions) - pContext->m_pOptions = new CPDF_RenderOptions; - - if (flags & FPDF_LCD_TEXT) - pContext->m_pOptions->m_Flags |= RENDER_CLEARTYPE; - else - pContext->m_pOptions->m_Flags &= ~RENDER_CLEARTYPE; - if (flags & FPDF_NO_NATIVETEXT) - pContext->m_pOptions->m_Flags |= RENDER_NO_NATIVETEXT; - if (flags & FPDF_RENDER_LIMITEDIMAGECACHE) - pContext->m_pOptions->m_Flags |= RENDER_LIMITEDIMAGECACHE; - if (flags & FPDF_RENDER_FORCEHALFTONE) - pContext->m_pOptions->m_Flags |= RENDER_FORCE_HALFTONE; -#ifndef PDF_ENABLE_XFA - if (flags & FPDF_RENDER_NO_SMOOTHTEXT) - pContext->m_pOptions->m_Flags |= RENDER_NOTEXTSMOOTH; - if (flags & FPDF_RENDER_NO_SMOOTHIMAGE) - pContext->m_pOptions->m_Flags |= RENDER_NOIMAGESMOOTH; - if (flags & FPDF_RENDER_NO_SMOOTHPATH) - pContext->m_pOptions->m_Flags |= RENDER_NOPATHSMOOTH; -#endif // PDF_ENABLE_XFA - // Grayscale output - if (flags & FPDF_GRAYSCALE) { - pContext->m_pOptions->m_ColorMode = RENDER_COLOR_GRAY; - pContext->m_pOptions->m_ForeColor = 0; - pContext->m_pOptions->m_BackColor = 0xffffff; - } - const CPDF_OCContext::UsageType usage = - (flags & FPDF_PRINTING) ? CPDF_OCContext::Print : CPDF_OCContext::View; - pContext->m_pOptions->m_AddFlags = flags >> 8; - pContext->m_pOptions->m_pOCContext = - new CPDF_OCContext(pPage->m_pDocument, usage); - - CFX_Matrix matrix; - pPage->GetDisplayMatrix(matrix, start_x, start_y, size_x, size_y, rotate); - - pContext->m_pDevice->SaveState(); - pContext->m_pDevice->SetClip_Rect( - FX_RECT(start_x, start_y, start_x + size_x, start_y + size_y)); - - pContext->m_pContext = new CPDF_RenderContext(pPage); - pContext->m_pContext->AppendLayer(pPage, &matrix); - - if (flags & FPDF_ANNOT) { - pContext->m_pAnnots = new CPDF_AnnotList(pPage); - FX_BOOL bPrinting = pContext->m_pDevice->GetDeviceClass() != FXDC_DISPLAY; - pContext->m_pAnnots->DisplayAnnots(pPage, pContext->m_pContext, bPrinting, - &matrix, TRUE, NULL); - } - - pContext->m_pRenderer = new CPDF_ProgressiveRenderer( - pContext->m_pContext, pContext->m_pDevice, pContext->m_pOptions); - pContext->m_pRenderer->Start(pause); - if (bNeedToRestore) - pContext->m_pDevice->RestoreState(); -} - -DLLEXPORT int STDCALL FPDF_GetPageSizeByIndex(FPDF_DOCUMENT document, - int page_index, - double* width, - double* height) { - UnderlyingDocumentType* pDoc = UnderlyingFromFPDFDocument(document); - if (!pDoc) - return FALSE; - -#ifdef PDF_ENABLE_XFA - int count = pDoc->GetPageCount(); - if (page_index < 0 || page_index >= count) - return FALSE; - CPDFXFA_Page* pPage = pDoc->GetPage(page_index); - if (!pPage) - return FALSE; - *width = pPage->GetPageWidth(); - *height = pPage->GetPageHeight(); -#else // PDF_ENABLE_XFA - CPDF_Dictionary* pDict = pDoc->GetPage(page_index); - if (!pDict) - return FALSE; - CPDF_Page page; - page.Load(pDoc, pDict); - *width = page.GetPageWidth(); - *height = page.GetPageHeight(); -#endif // PDF_ENABLE_XFA - - return TRUE; -} - -DLLEXPORT FPDF_BOOL STDCALL -FPDF_VIEWERREF_GetPrintScaling(FPDF_DOCUMENT document) { - CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); - if (!pDoc) - return TRUE; - CPDF_ViewerPreferences viewRef(pDoc); - return viewRef.PrintScaling(); -} - -DLLEXPORT int STDCALL FPDF_VIEWERREF_GetNumCopies(FPDF_DOCUMENT document) { - CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); - if (!pDoc) - return 1; - CPDF_ViewerPreferences viewRef(pDoc); - return viewRef.NumCopies(); -} - -DLLEXPORT FPDF_PAGERANGE STDCALL -FPDF_VIEWERREF_GetPrintPageRange(FPDF_DOCUMENT document) { - CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); - if (!pDoc) - return NULL; - CPDF_ViewerPreferences viewRef(pDoc); - return viewRef.PrintPageRange(); -} - -DLLEXPORT FPDF_DUPLEXTYPE STDCALL -FPDF_VIEWERREF_GetDuplex(FPDF_DOCUMENT document) { - CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); - if (!pDoc) - return DuplexUndefined; - CPDF_ViewerPreferences viewRef(pDoc); - CFX_ByteString duplex = viewRef.Duplex(); - if ("Simplex" == duplex) - return Simplex; - if ("DuplexFlipShortEdge" == duplex) - return DuplexFlipShortEdge; - if ("DuplexFlipLongEdge" == duplex) - return DuplexFlipLongEdge; - return DuplexUndefined; -} - -DLLEXPORT FPDF_DWORD STDCALL FPDF_CountNamedDests(FPDF_DOCUMENT document) { - CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); - if (!pDoc) - return 0; - - CPDF_Dictionary* pRoot = pDoc->GetRoot(); - if (!pRoot) - return 0; - - CPDF_NameTree nameTree(pDoc, "Dests"); - pdfium::base::CheckedNumeric<FPDF_DWORD> count = nameTree.GetCount(); - CPDF_Dictionary* pDest = pRoot->GetDictBy("Dests"); - if (pDest) - count += pDest->GetCount(); - - if (!count.IsValid()) - return 0; - - return count.ValueOrDie(); -} - -DLLEXPORT FPDF_DEST STDCALL FPDF_GetNamedDestByName(FPDF_DOCUMENT document, - FPDF_BYTESTRING name) { - if (!name || name[0] == 0) - return nullptr; - - CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); - if (!pDoc) - return nullptr; - - CPDF_NameTree name_tree(pDoc, "Dests"); - return name_tree.LookupNamedDest(pDoc, name); -} - -#ifdef PDF_ENABLE_XFA -FPDF_RESULT FPDF_BStr_Init(FPDF_BSTR* str) { - if (!str) - return -1; - - FXSYS_memset(str, 0, sizeof(FPDF_BSTR)); - return 0; -} - -FPDF_RESULT FPDF_BStr_Set(FPDF_BSTR* str, FPDF_LPCSTR bstr, int length) { - if (!str) - return -1; - if (!bstr || !length) - return -1; - if (length == -1) - length = FXSYS_strlen(bstr); - - if (length == 0) { - if (str->str) { - FX_Free(str->str); - str->str = NULL; - } - str->len = 0; - return 0; - } - - if (str->str && str->len < length) - str->str = FX_Realloc(char, str->str, length + 1); - else if (!str->str) - str->str = FX_Alloc(char, length + 1); - - str->str[length] = 0; - if (str->str == NULL) - return -1; - - FXSYS_memcpy(str->str, bstr, length); - str->len = length; - - return 0; -} - -FPDF_RESULT FPDF_BStr_Clear(FPDF_BSTR* str) { - if (!str) - return -1; - - if (str->str) { - FX_Free(str->str); - str->str = NULL; - } - str->len = 0; - return 0; -} -#endif // PDF_ENABLE_XFA - -DLLEXPORT FPDF_DEST STDCALL FPDF_GetNamedDest(FPDF_DOCUMENT document, - int index, - void* buffer, - long* buflen) { - if (!buffer) - *buflen = 0; - - if (index < 0) - return nullptr; - - CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); - if (!pDoc) - return nullptr; - - CPDF_Dictionary* pRoot = pDoc->GetRoot(); - if (!pRoot) - return nullptr; - - CPDF_Object* pDestObj = nullptr; - CFX_ByteString bsName; - CPDF_NameTree nameTree(pDoc, "Dests"); - int count = nameTree.GetCount(); - if (index >= count) { - CPDF_Dictionary* pDest = pRoot->GetDictBy("Dests"); - if (!pDest) - return nullptr; - - pdfium::base::CheckedNumeric<int> checked_count = count; - checked_count += pDest->GetCount(); - if (!checked_count.IsValid() || index >= checked_count.ValueOrDie()) - return nullptr; - - index -= count; - int i = 0; - for (const auto& it : *pDest) { - bsName = it.first; - pDestObj = it.second; - if (!pDestObj) - continue; - if (i == index) - break; - i++; - } - } else { - pDestObj = nameTree.LookupValue(index, bsName); - } - if (!pDestObj) - return nullptr; - if (CPDF_Dictionary* pDict = pDestObj->AsDictionary()) { - pDestObj = pDict->GetArrayBy("D"); - if (!pDestObj) - return nullptr; - } - if (!pDestObj->IsArray()) - return nullptr; - - CFX_WideString wsName = PDF_DecodeText(bsName); - CFX_ByteString utf16Name = wsName.UTF16LE_Encode(); - unsigned int len = utf16Name.GetLength(); - if (!buffer) { - *buflen = len; - } else if (*buflen >= len) { - memcpy(buffer, utf16Name.c_str(), len); - *buflen = len; - } else { - *buflen = -1; - } - return (FPDF_DEST)pDestObj; -} diff --git a/fpdfsdk/src/fpdfview_c_api_test.c b/fpdfsdk/src/fpdfview_c_api_test.c deleted file mode 100644 index 52bbd11b00..0000000000 --- a/fpdfsdk/src/fpdfview_c_api_test.c +++ /dev/null @@ -1,243 +0,0 @@ -// Copyright 2015 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// This "C" (not "C++") file ensures that the public headers compile -// and link for "C" (and not just "C++"). - -#include <stdio.h> - -#include "fpdfsdk/src/fpdfview_c_api_test.h" - -#include "public/fpdf_dataavail.h" -#include "public/fpdf_doc.h" -#include "public/fpdf_edit.h" -#include "public/fpdf_ext.h" -#include "public/fpdf_flatten.h" -#include "public/fpdf_formfill.h" -#include "public/fpdf_fwlevent.h" -#include "public/fpdf_ppo.h" -#include "public/fpdf_progressive.h" -#include "public/fpdf_save.h" -#include "public/fpdf_searchex.h" -#include "public/fpdf_sysfontinfo.h" -#include "public/fpdf_text.h" -#include "public/fpdf_transformpage.h" -#include "public/fpdfview.h" - -// Scheme for avoiding LTO out of existence, warnings, etc. -typedef void (*fnptr)(void); // Legal generic function type for casts. -fnptr g_c_api_test_fnptr = NULL; // Extern, so can't know it doesn't change. -#define CHK(x) if ((fnptr)(x) == g_c_api_test_fnptr) return 0 - -// Function to call from gtest harness to ensure linker resolution. -int CheckPDFiumCApi() { - // fpdf_dataavail.h - CHK(FPDFAvail_Create); - CHK(FPDFAvail_Destroy); - CHK(FPDFAvail_IsDocAvail); - CHK(FPDFAvail_GetDocument); - CHK(FPDFAvail_GetFirstPageNum); - CHK(FPDFAvail_IsPageAvail); - CHK(FPDFAvail_IsFormAvail); - CHK(FPDFAvail_IsLinearized); - - // fpdf_doc.h - CHK(FPDFBookmark_GetFirstChild); - CHK(FPDFBookmark_GetNextSibling); - CHK(FPDFBookmark_GetTitle); - CHK(FPDFBookmark_Find); - CHK(FPDFBookmark_GetDest); - CHK(FPDFBookmark_GetAction); - CHK(FPDFAction_GetType); - CHK(FPDFAction_GetDest); - CHK(FPDFAction_GetFilePath); - CHK(FPDFAction_GetURIPath); - CHK(FPDFDest_GetPageIndex); - CHK(FPDFLink_GetLinkAtPoint); - CHK(FPDFLink_GetLinkZOrderAtPoint); - CHK(FPDFLink_GetDest); - CHK(FPDFLink_GetAction); - CHK(FPDFLink_Enumerate); - CHK(FPDFLink_GetAnnotRect); - CHK(FPDFLink_CountQuadPoints); - CHK(FPDFLink_GetQuadPoints); - CHK(FPDF_GetMetaText); - - // fpdf_edit.h - CHK(FPDF_CreateNewDocument); - CHK(FPDFPage_New); - CHK(FPDFPage_Delete); - CHK(FPDFPage_GetRotation); - CHK(FPDFPage_SetRotation); - CHK(FPDFPage_InsertObject); - CHK(FPDFPage_CountObject); - CHK(FPDFPage_GetObject); - CHK(FPDFPage_HasTransparency); - CHK(FPDFPage_GenerateContent); - CHK(FPDFPageObj_HasTransparency); - CHK(FPDFPageObj_Transform); - CHK(FPDFPage_TransformAnnots); - CHK(FPDFPageObj_NewImgeObj); - CHK(FPDFImageObj_LoadJpegFile); - CHK(FPDFImageObj_SetMatrix); - CHK(FPDFImageObj_SetBitmap); - - // fpdf_ext.h - CHK(FSDK_SetUnSpObjProcessHandler); - CHK(FPDFDoc_GetPageMode); - - // fpdf_flatten.h - CHK(FPDFPage_Flatten); - - // fpdf_fwlevent.h - no exports. - - // fpdf_formfill.h - CHK(FPDFDOC_InitFormFillEnvironment); - CHK(FPDFDOC_ExitFormFillEnvironment); - CHK(FORM_OnAfterLoadPage); - CHK(FORM_OnBeforeClosePage); - CHK(FORM_DoDocumentJSAction); - CHK(FORM_DoDocumentOpenAction); - CHK(FORM_DoDocumentAAction); - CHK(FORM_DoPageAAction); - CHK(FORM_OnMouseMove); - CHK(FORM_OnLButtonDown); - CHK(FORM_OnLButtonUp); -#ifdef PDF_ENABLE_XFA - CHK(FORM_OnRButtonDown); - CHK(FORM_OnRButtonUp); -#endif - CHK(FORM_OnKeyDown); - CHK(FORM_OnKeyUp); - CHK(FORM_OnChar); - CHK(FORM_ForceToKillFocus); - CHK(FPDFPage_HasFormFieldAtPoint); - CHK(FPDPage_HasFormFieldAtPoint); // DEPRECATED. Remove in the future. - CHK(FPDFPage_FormFieldZOrderAtPoint); - CHK(FPDF_SetFormFieldHighlightColor); - CHK(FPDF_SetFormFieldHighlightAlpha); - CHK(FPDF_RemoveFormFieldHighlight); - CHK(FPDF_FFLDraw); -#ifdef PDF_ENABLE_XFA - CHK(FPDF_HasXFAField); - CHK(FPDF_LoadXFA); - CHK(FPDF_Widget_Undo); - CHK(FPDF_Widget_Redo); - CHK(FPDF_Widget_SelectAll); - CHK(FPDF_Widget_Copy); - CHK(FPDF_Widget_Cut); - CHK(FPDF_Widget_Paste); - CHK(FPDF_Widget_ReplaceSpellCheckWord); - CHK(FPDF_Widget_GetSpellCheckWords); - CHK(FPDF_StringHandleCounts); - CHK(FPDF_StringHandleGetStringByIndex); - CHK(FPDF_StringHandleRelease); - CHK(FPDF_StringHandleAddString); -#endif - - // fpdf_ppo.h - CHK(FPDF_ImportPages); - CHK(FPDF_CopyViewerPreferences); - - // fpdf_progressive.h - CHK(FPDF_RenderPageBitmap_Start); - CHK(FPDF_RenderPage_Continue); - CHK(FPDF_RenderPage_Close); - - // fpdf_save.h - CHK(FPDF_SaveAsCopy); - CHK(FPDF_SaveWithVersion); - - // fpdf_searchex.h - CHK(FPDFText_GetCharIndexFromTextIndex); - - // fpdf_sysfontinfo.h - CHK(FPDF_GetDefaultTTFMap); - CHK(FPDF_AddInstalledFont); - CHK(FPDF_SetSystemFontInfo); - CHK(FPDF_GetDefaultSystemFontInfo); - - // fpdf_text.h - CHK(FPDFText_LoadPage); - CHK(FPDFText_ClosePage); - CHK(FPDFText_CountChars); - CHK(FPDFText_GetUnicode); - CHK(FPDFText_GetFontSize); - CHK(FPDFText_GetCharBox); - CHK(FPDFText_GetCharIndexAtPos); - CHK(FPDFText_GetText); - CHK(FPDFText_CountRects); - CHK(FPDFText_GetRect); - CHK(FPDFText_GetBoundedText); - CHK(FPDFText_FindStart); - CHK(FPDFText_FindNext); - CHK(FPDFText_FindPrev); - CHK(FPDFText_GetSchResultIndex); - CHK(FPDFText_GetSchCount); - CHK(FPDFText_FindClose); - CHK(FPDFLink_LoadWebLinks); - CHK(FPDFLink_CountWebLinks); - CHK(FPDFLink_GetURL); - CHK(FPDFLink_CountRects); - CHK(FPDFLink_GetRect); - CHK(FPDFLink_CloseWebLinks); - - // fpdf_transformpage.h - CHK(FPDFPage_SetMediaBox); - CHK(FPDFPage_SetCropBox); - CHK(FPDFPage_GetMediaBox); - CHK(FPDFPage_GetCropBox); - CHK(FPDFPage_TransFormWithClip); - CHK(FPDFPageObj_TransformClipPath); - CHK(FPDF_CreateClipPath); - CHK(FPDF_DestroyClipPath); - CHK(FPDFPage_InsertClipPath); - - // fpdfview.h - CHK(FPDF_InitLibrary); - CHK(FPDF_InitLibraryWithConfig); - CHK(FPDF_DestroyLibrary); - CHK(FPDF_SetSandBoxPolicy); - CHK(FPDF_LoadDocument); - CHK(FPDF_LoadMemDocument); - CHK(FPDF_LoadCustomDocument); - CHK(FPDF_GetFileVersion); - CHK(FPDF_GetLastError); - CHK(FPDF_GetDocPermissions); - CHK(FPDF_GetSecurityHandlerRevision); - CHK(FPDF_GetPageCount); - CHK(FPDF_LoadPage); - CHK(FPDF_GetPageWidth); - CHK(FPDF_GetPageHeight); - CHK(FPDF_GetPageSizeByIndex); - CHK(FPDF_RenderPageBitmap); - CHK(FPDF_ClosePage); - CHK(FPDF_CloseDocument); - CHK(FPDF_DeviceToPage); - CHK(FPDF_PageToDevice); - CHK(FPDFBitmap_Create); - CHK(FPDFBitmap_CreateEx); - CHK(FPDFBitmap_FillRect); - CHK(FPDFBitmap_GetBuffer); - CHK(FPDFBitmap_GetWidth); - CHK(FPDFBitmap_GetHeight); - CHK(FPDFBitmap_GetStride); - CHK(FPDFBitmap_Destroy); - CHK(FPDF_VIEWERREF_GetPrintScaling); - CHK(FPDF_VIEWERREF_GetNumCopies); - CHK(FPDF_VIEWERREF_GetPrintPageRange); - CHK(FPDF_VIEWERREF_GetDuplex); - CHK(FPDF_CountNamedDests); - CHK(FPDF_GetNamedDestByName); - CHK(FPDF_GetNamedDest); -#ifdef PDF_ENABLE_XFA - CHK(FPDF_BStr_Init); - CHK(FPDF_BStr_Set); - CHK(FPDF_BStr_Clear); -#endif - - return 1; -} - -#undef CHK diff --git a/fpdfsdk/src/fpdfview_c_api_test.h b/fpdfsdk/src/fpdfview_c_api_test.h deleted file mode 100644 index 755d8215c9..0000000000 --- a/fpdfsdk/src/fpdfview_c_api_test.h +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2015 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef FPDFSDK_SRC_FPDFVIEW_C_API_TEST_H_ -#define FPDFSDK_SRC_FPDFVIEW_C_API_TEST_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -// Function to call from gtest harness to ensure linker resolution. Returns -// 1 on success or 0 on error. -int CheckPDFiumCApi(); - -#ifdef __cplusplus -} -#endif - -#endif // FPDFSDK_SRC_FPDFVIEW_C_API_TEST_H_ diff --git a/fpdfsdk/src/fpdfview_embeddertest.cpp b/fpdfsdk/src/fpdfview_embeddertest.cpp deleted file mode 100644 index da7313dd5f..0000000000 --- a/fpdfsdk/src/fpdfview_embeddertest.cpp +++ /dev/null @@ -1,246 +0,0 @@ -// Copyright 2015 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include <limits> -#include <string> - -#include "fpdfsdk/src/fpdfview_c_api_test.h" -#include "public/fpdfview.h" -#include "testing/embedder_test.h" -#include "testing/gtest/include/gtest/gtest.h" - -TEST(fpdf, CApiTest) { - EXPECT_TRUE(CheckPDFiumCApi()); -} - -class FPDFViewEmbeddertest : public EmbedderTest {}; - -TEST_F(FPDFViewEmbeddertest, Document) { - EXPECT_TRUE(OpenDocument("about_blank.pdf")); - EXPECT_EQ(1, GetPageCount()); - EXPECT_EQ(0, GetFirstPageNum()); - - int version; - EXPECT_TRUE(FPDF_GetFileVersion(document(), &version)); - EXPECT_EQ(14, version); - - EXPECT_EQ(0xFFFFFFFF, FPDF_GetDocPermissions(document())); - EXPECT_EQ(-1, FPDF_GetSecurityHandlerRevision(document())); -} - -TEST_F(FPDFViewEmbeddertest, Page) { - EXPECT_TRUE(OpenDocument("about_blank.pdf")); - FPDF_PAGE page = LoadPage(0); - EXPECT_NE(nullptr, page); - EXPECT_EQ(612.0, FPDF_GetPageWidth(page)); - EXPECT_EQ(792.0, FPDF_GetPageHeight(page)); - UnloadPage(page); - EXPECT_EQ(nullptr, LoadPage(1)); -} - -TEST_F(FPDFViewEmbeddertest, ViewerRef) { - EXPECT_TRUE(OpenDocument("about_blank.pdf")); - EXPECT_TRUE(FPDF_VIEWERREF_GetPrintScaling(document())); - EXPECT_EQ(1, FPDF_VIEWERREF_GetNumCopies(document())); - EXPECT_EQ(DuplexUndefined, FPDF_VIEWERREF_GetDuplex(document())); -} - -TEST_F(FPDFViewEmbeddertest, NamedDests) { - EXPECT_TRUE(OpenDocument("named_dests.pdf")); - long buffer_size; - char fixed_buffer[512]; - FPDF_DEST dest; - - // Query the size of the first item. - buffer_size = 2000000; // Absurdly large, check not used for this case. - dest = FPDF_GetNamedDest(document(), 0, nullptr, &buffer_size); - EXPECT_NE(nullptr, dest); - EXPECT_EQ(12u, buffer_size); - - // Try to retrieve the first item with too small a buffer. - buffer_size = 10; - dest = FPDF_GetNamedDest(document(), 0, fixed_buffer, &buffer_size); - EXPECT_NE(nullptr, dest); - EXPECT_EQ(-1, buffer_size); - - // Try to retrieve the first item with correctly sized buffer. Item is - // taken from Dests NameTree in named_dests.pdf. - buffer_size = 12; - dest = FPDF_GetNamedDest(document(), 0, fixed_buffer, &buffer_size); - EXPECT_NE(nullptr, dest); - EXPECT_EQ(12u, buffer_size); - EXPECT_EQ(std::string("F\0i\0r\0s\0t\0\0\0", 12), - std::string(fixed_buffer, buffer_size)); - - // Try to retrieve the second item with ample buffer. Item is taken - // from Dests NameTree but has a sub-dictionary in named_dests.pdf. - buffer_size = sizeof(fixed_buffer); - dest = FPDF_GetNamedDest(document(), 1, fixed_buffer, &buffer_size); - EXPECT_NE(nullptr, dest); - EXPECT_EQ(10u, buffer_size); - EXPECT_EQ(std::string("N\0e\0x\0t\0\0\0", 10), - std::string(fixed_buffer, buffer_size)); - - // Try to retrieve third item with ample buffer. Item is taken - // from Dests NameTree but has a bad sub-dictionary in named_dests.pdf. - // in named_dests.pdf). - buffer_size = sizeof(fixed_buffer); - dest = FPDF_GetNamedDest(document(), 2, fixed_buffer, &buffer_size); - EXPECT_EQ(nullptr, dest); - EXPECT_EQ(sizeof(fixed_buffer), buffer_size); // unmodified. - - // Try to retrieve the forth item with ample buffer. Item is taken - // from Dests NameTree but has a vale of the wrong type in named_dests.pdf. - buffer_size = sizeof(fixed_buffer); - dest = FPDF_GetNamedDest(document(), 3, fixed_buffer, &buffer_size); - EXPECT_EQ(nullptr, dest); - EXPECT_EQ(sizeof(fixed_buffer), buffer_size); // unmodified. - - // Try to retrieve fifth item with ample buffer. Item taken from the - // old-style Dests dictionary object in named_dests.pdf. - buffer_size = sizeof(fixed_buffer); - dest = FPDF_GetNamedDest(document(), 4, fixed_buffer, &buffer_size); - EXPECT_NE(nullptr, dest); - EXPECT_EQ(30u, buffer_size); - EXPECT_EQ(std::string("F\0i\0r\0s\0t\0A\0l\0t\0e\0r\0n\0a\0t\0e\0\0\0", 30), - std::string(fixed_buffer, buffer_size)); - - // Try to retrieve sixth item with ample buffer. Item istaken from the - // old-style Dests dictionary object but has a sub-dictionary in - // named_dests.pdf. - buffer_size = sizeof(fixed_buffer); - dest = FPDF_GetNamedDest(document(), 5, fixed_buffer, &buffer_size); - EXPECT_NE(nullptr, dest); - EXPECT_EQ(28u, buffer_size); - EXPECT_EQ(std::string("L\0a\0s\0t\0A\0l\0t\0e\0r\0n\0a\0t\0e\0\0\0", 28), - std::string(fixed_buffer, buffer_size)); - - // Try to retrieve non-existent item with ample buffer. - buffer_size = sizeof(fixed_buffer); - dest = FPDF_GetNamedDest(document(), 6, fixed_buffer, &buffer_size); - EXPECT_EQ(nullptr, dest); - EXPECT_EQ(sizeof(fixed_buffer), buffer_size); // unmodified. - - // Try to underflow/overflow the integer index. - buffer_size = sizeof(fixed_buffer); - dest = FPDF_GetNamedDest(document(), std::numeric_limits<int>::max(), - fixed_buffer, &buffer_size); - EXPECT_EQ(nullptr, dest); - EXPECT_EQ(sizeof(fixed_buffer), buffer_size); // unmodified. - - buffer_size = sizeof(fixed_buffer); - dest = FPDF_GetNamedDest(document(), std::numeric_limits<int>::min(), - fixed_buffer, &buffer_size); - EXPECT_EQ(nullptr, dest); - EXPECT_EQ(sizeof(fixed_buffer), buffer_size); // unmodified. - - buffer_size = sizeof(fixed_buffer); - dest = FPDF_GetNamedDest(document(), -1, fixed_buffer, &buffer_size); - EXPECT_EQ(nullptr, dest); - EXPECT_EQ(sizeof(fixed_buffer), buffer_size); // unmodified. -} - -TEST_F(FPDFViewEmbeddertest, NamedDestsByName) { - EXPECT_TRUE(OpenDocument("named_dests.pdf")); - - // Null pointer returns NULL. - FPDF_DEST dest = FPDF_GetNamedDestByName(document(), nullptr); - EXPECT_EQ(nullptr, dest); - - // Empty string returns NULL. - dest = FPDF_GetNamedDestByName(document(), ""); - EXPECT_EQ(nullptr, dest); - - // Item from Dests NameTree. - dest = FPDF_GetNamedDestByName(document(), "First"); - EXPECT_NE(nullptr, dest); - - long ignore_len = 0; - FPDF_DEST dest_by_index = - FPDF_GetNamedDest(document(), 0, nullptr, &ignore_len); - EXPECT_EQ(dest_by_index, dest); - - // Item from Dests dictionary. - dest = FPDF_GetNamedDestByName(document(), "FirstAlternate"); - EXPECT_NE(nullptr, dest); - - ignore_len = 0; - dest_by_index = FPDF_GetNamedDest(document(), 4, nullptr, &ignore_len); - EXPECT_EQ(dest_by_index, dest); - - // Bad value type for item from Dests NameTree array. - dest = FPDF_GetNamedDestByName(document(), "WrongType"); - EXPECT_EQ(nullptr, dest); - - // No such destination in either Dest NameTree or dictionary. - dest = FPDF_GetNamedDestByName(document(), "Bogus"); - EXPECT_EQ(nullptr, dest); -} - -// The following tests pass if the document opens without crashing. -TEST_F(FPDFViewEmbeddertest, Crasher_113) { - EXPECT_TRUE(OpenDocument("bug_113.pdf")); -} - -TEST_F(FPDFViewEmbeddertest, Crasher_451830) { - // Document is damaged and can't be opened. - EXPECT_FALSE(OpenDocument("bug_451830.pdf")); -} - -TEST_F(FPDFViewEmbeddertest, Crasher_452455) { - EXPECT_TRUE(OpenDocument("bug_452455.pdf")); - FPDF_PAGE page = LoadPage(0); - EXPECT_NE(nullptr, page); - UnloadPage(page); -} - -TEST_F(FPDFViewEmbeddertest, Crasher_454695) { - // Document is damaged and can't be opened. - EXPECT_FALSE(OpenDocument("bug_454695.pdf")); -} - -TEST_F(FPDFViewEmbeddertest, Crasher_572871) { - EXPECT_TRUE(OpenDocument("bug_572871.pdf")); -} - -// It tests that document can still be loaded even the trailer has no 'Size' -// field if other information is right. -TEST_F(FPDFViewEmbeddertest, Failed_213) { - EXPECT_TRUE(OpenDocument("bug_213.pdf")); -} - -// The following tests pass if the document opens without infinite looping. -TEST_F(FPDFViewEmbeddertest, Hang_298) { - EXPECT_FALSE(OpenDocument("bug_298.pdf")); -} - -// Test if the document opens without infinite looping. -// Previously this test will hang in a loop inside LoadAllCrossRefV4. After -// the fix, LoadAllCrossRefV4 will return false after detecting a cross -// reference loop. Cross references will be rebuilt successfully. -TEST_F(FPDFViewEmbeddertest, CrossRefV4Loop) { - EXPECT_TRUE(OpenDocument("bug_xrefv4_loop.pdf")); -} - -// The test should pass when circular references to ParseIndirectObject will not -// cause infinite loop. -TEST_F(FPDFViewEmbeddertest, Hang_343) { - EXPECT_FALSE(OpenDocument("bug_343.pdf")); -} - -// The test should pass when the absence of 'Contents' field in a signature -// dictionary will not cause an infinite loop in CPDF_SyntaxParser::GetObject(). -TEST_F(FPDFViewEmbeddertest, Hang_344) { - EXPECT_FALSE(OpenDocument("bug_344.pdf")); -} - -// The test should pass when there is no infinite recursion in -// CPDF_SyntaxParser::GetString(). -TEST_F(FPDFViewEmbeddertest, Hang_355) { - EXPECT_FALSE(OpenDocument("bug_355.pdf")); -} -// The test should pass even when the file has circular references to pages. -TEST_F(FPDFViewEmbeddertest, Hang_360) { - EXPECT_FALSE(OpenDocument("bug_360.pdf")); -} diff --git a/fpdfsdk/src/fpdfxfa/fpdfxfa_app.cpp b/fpdfsdk/src/fpdfxfa/fpdfxfa_app.cpp deleted file mode 100644 index 910cdc511e..0000000000 --- a/fpdfsdk/src/fpdfxfa/fpdfxfa_app.cpp +++ /dev/null @@ -1,540 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "fpdfsdk/include/fpdfxfa/fpdfxfa_app.h" -#include "fpdfsdk/include/fpdfxfa/fpdfxfa_doc.h" -#include "fpdfsdk/include/fpdfxfa/fpdfxfa_util.h" -#include "fpdfsdk/include/fsdk_define.h" -#include "fpdfsdk/include/fsdk_mgr.h" -#include "fpdfsdk/include/javascript/IJavaScript.h" -#include "public/fpdf_formfill.h" -#include "xfa/include/fxbarcode/BC_BarCode.h" - -CPDFXFA_App* CPDFXFA_App::g_pApp = NULL; - -CPDFXFA_App* CPDFXFA_App::GetInstance() { - if (!g_pApp) { - g_pApp = new CPDFXFA_App(); - } - return g_pApp; -} - -void CPDFXFA_App::ReleaseInstance() { - delete g_pApp; - g_pApp = NULL; -} - -CPDFXFA_App::CPDFXFA_App() - : m_bJavaScriptInitialized(FALSE), - m_pXFAApp(NULL), - m_pFontMgr(NULL), - m_hJSERuntime(NULL), - m_csAppType(JS_STR_VIEWERTYPE_STANDARD), - m_bOwnedRuntime(false) { - m_pEnvList.RemoveAll(); -} - -CPDFXFA_App::~CPDFXFA_App() { - delete m_pFontMgr; - m_pFontMgr = NULL; - - delete m_pXFAApp; - m_pXFAApp = NULL; - -#ifdef PDF_ENABLE_XFA - FXJSE_Runtime_Release(m_hJSERuntime, m_bOwnedRuntime); - m_hJSERuntime = NULL; - - FXJSE_Finalize(); - BC_Library_Destory(); -#endif -} - -FX_BOOL CPDFXFA_App::Initialize(FXJSE_HRUNTIME hRuntime) { -#ifdef PDF_ENABLE_XFA - BC_Library_Init(); - FXJSE_Initialize(); - - m_bOwnedRuntime = !hRuntime; - m_hJSERuntime = hRuntime ? hRuntime : FXJSE_Runtime_Create(); - if (!m_hJSERuntime) - return FALSE; - - m_pXFAApp = IXFA_App::Create(this); - if (!m_pXFAApp) - return FALSE; - - m_pFontMgr = IXFA_FontMgr::CreateDefault(); - if (!m_pFontMgr) - return FALSE; - - m_pXFAApp->SetDefaultFontMgr(m_pFontMgr); -#endif - return TRUE; -} - -FX_BOOL CPDFXFA_App::AddFormFillEnv(CPDFDoc_Environment* pEnv) { - if (!pEnv) - return FALSE; - - m_pEnvList.Add(pEnv); - return TRUE; -} - -FX_BOOL CPDFXFA_App::RemoveFormFillEnv(CPDFDoc_Environment* pEnv) { - if (!pEnv) - return FALSE; - - int nFind = m_pEnvList.Find(pEnv); - if (nFind != -1) { - m_pEnvList.RemoveAt(nFind); - return TRUE; - } - - return FALSE; -} - -void CPDFXFA_App::GetAppType(CFX_WideString& wsAppType) { - wsAppType = m_csAppType; -} - -void CPDFXFA_App::GetAppName(CFX_WideString& wsName) { - CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0); - if (pEnv) { - wsName = pEnv->FFI_GetAppName(); - } -} - -void CPDFXFA_App::SetAppType(const CFX_WideStringC& wsAppType) { - m_csAppType = wsAppType; -} - -void CPDFXFA_App::GetLanguage(CFX_WideString& wsLanguage) { - CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0); - if (pEnv) { - wsLanguage = pEnv->FFI_GetLanguage(); - } -} - -void CPDFXFA_App::GetPlatform(CFX_WideString& wsPlatform) { - CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0); - if (pEnv) { - wsPlatform = pEnv->FFI_GetPlatform(); - } -} - -void CPDFXFA_App::GetVariation(CFX_WideString& wsVariation) { - wsVariation = JS_STR_VIEWERVARIATION; -} - -void CPDFXFA_App::GetVersion(CFX_WideString& wsVersion) { - wsVersion = JS_STR_VIEWERVERSION_XFA; -} - -void CPDFXFA_App::Beep(FX_DWORD dwType) { - CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0); - if (pEnv) { - pEnv->JS_appBeep(dwType); - } -} - -int32_t CPDFXFA_App::MsgBox(const CFX_WideStringC& wsMessage, - const CFX_WideStringC& wsTitle, - FX_DWORD dwIconType, - FX_DWORD dwButtonType) { - CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0); - if (!pEnv) - return -1; - - FX_DWORD iconType = 0; - int iButtonType = 0; - switch (dwIconType) { - case XFA_MBICON_Error: - iconType |= 0; - break; - case XFA_MBICON_Warning: - iconType |= 1; - break; - case XFA_MBICON_Question: - iconType |= 2; - break; - case XFA_MBICON_Status: - iconType |= 3; - break; - } - switch (dwButtonType) { - case XFA_MB_OK: - iButtonType |= 0; - break; - case XFA_MB_OKCancel: - iButtonType |= 1; - break; - case XFA_MB_YesNo: - iButtonType |= 2; - break; - case XFA_MB_YesNoCancel: - iButtonType |= 3; - break; - } - int32_t iRet = pEnv->JS_appAlert(wsMessage.GetPtr(), wsTitle.GetPtr(), - iButtonType, iconType); - switch (iRet) { - case 1: - return XFA_IDOK; - case 2: - return XFA_IDCancel; - case 3: - return XFA_IDNo; - case 4: - return XFA_IDYes; - } - return XFA_IDYes; -} - -void CPDFXFA_App::Response(CFX_WideString& wsAnswer, - const CFX_WideStringC& wsQuestion, - const CFX_WideStringC& wsTitle, - const CFX_WideStringC& wsDefaultAnswer, - FX_BOOL bMark) { - CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0); - if (pEnv) { - int nLength = 2048; - char* pBuff = new char[nLength]; - nLength = pEnv->JS_appResponse(wsQuestion.GetPtr(), wsTitle.GetPtr(), - wsDefaultAnswer.GetPtr(), NULL, bMark, pBuff, - nLength); - if (nLength > 0) { - nLength = nLength > 2046 ? 2046 : nLength; - pBuff[nLength] = 0; - pBuff[nLength + 1] = 0; - wsAnswer = CFX_WideString::FromUTF16LE( - reinterpret_cast<const unsigned short*>(pBuff), - nLength / sizeof(unsigned short)); - } - delete[] pBuff; - } -} - -int32_t CPDFXFA_App::GetCurDocumentInBatch() { - CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0); - if (pEnv) { - return pEnv->FFI_GetCurDocument(); - } - return 0; -} - -int32_t CPDFXFA_App::GetDocumentCountInBatch() { - CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0); - if (pEnv) { - return pEnv->FFI_GetDocumentCount(); - } - - return 0; -} - -IFX_FileRead* CPDFXFA_App::DownloadURL(const CFX_WideStringC& wsURL) { - CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0); - if (pEnv) { - return pEnv->FFI_DownloadFromURL(wsURL.GetPtr()); - } - return NULL; -} - -FX_BOOL CPDFXFA_App::PostRequestURL(const CFX_WideStringC& wsURL, - const CFX_WideStringC& wsData, - const CFX_WideStringC& wsContentType, - const CFX_WideStringC& wsEncode, - const CFX_WideStringC& wsHeader, - CFX_WideString& wsResponse) { - CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0); - if (pEnv) { - wsResponse = pEnv->FFI_PostRequestURL(wsURL.GetPtr(), wsData.GetPtr(), - wsContentType.GetPtr(), - wsEncode.GetPtr(), wsHeader.GetPtr()); - return TRUE; - } - return FALSE; -} - -FX_BOOL CPDFXFA_App::PutRequestURL(const CFX_WideStringC& wsURL, - const CFX_WideStringC& wsData, - const CFX_WideStringC& wsEncode) { - CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0); - if (pEnv) { - return pEnv->FFI_PutRequestURL(wsURL.GetPtr(), wsData.GetPtr(), - wsEncode.GetPtr()); - } - return FALSE; -} - -void CPDFXFA_App::LoadString(int32_t iStringID, CFX_WideString& wsString) { - switch (iStringID) { - case XFA_IDS_ValidateFailed: - wsString = L"%s validate failed"; - return; - case XFA_IDS_CalcOverride: - wsString = L"Calculate Override"; - return; - case XFA_IDS_ModifyField: - wsString = L"Are you sure you want to modify this field?"; - return; - case XFA_IDS_NotModifyField: - wsString = L"You are not allowed to modify this field."; - return; - case XFA_IDS_AppName: - wsString = L"Foxit"; - return; - case XFA_IDS_ImageFilter: - wsString = - L"Image " - L"Files(*.bmp;*.jpg;*.png;*.gif;*.tif)|*.bmp;*.jpg;*.png;*.gif;*.tif|" - L"All Files(*.*)|*.*||"; - return; - case XFA_IDS_UNKNOW_CATCHED: - wsString = L"unknown error is catched!"; - return; - case XFA_IDS_Unable_TO_SET: - wsString = L"Unable to set "; - return; - case XFA_IDS_VALUE_EXCALMATORY: - wsString = L" value!"; - return; - case XFA_IDS_INVALID_ENUM_VALUE: - wsString = L"Invalid enumerated value: "; - return; - case XFA_IDS_UNSUPPORT_METHOD: - wsString = L"unsupport %s method."; - return; - case XFA_IDS_UNSUPPORT_PROP: - wsString = L"unsupport %s property."; - return; - case XFA_IDS_INVAlID_PROP_SET: - wsString = L"Invalid property set operation;"; - return; - case XFA_IDS_NOT_DEFAUL_VALUE: - wsString = L" doesn't have a default property"; - return; - case XFA_IDS_UNABLE_SET_LANGUAGE: - wsString = L"Unable to set language value!"; - return; - case XFA_IDS_UNABLE_SET_NUMPAGES: - wsString = L"Unable to set numPages value!"; - return; - case XFA_IDS_UNABLE_SET_PLATFORM: - wsString = L"Unable to set platform value!"; - return; - case XFA_IDS_UNABLE_SET_VALIDATIONENABLE: - wsString = L"Unable to set validationsEnabled value!"; - return; - case XFA_IDS_UNABLE_SET_VARIATION: - wsString = L"Unable to set variation value!"; - return; - case XFA_IDS_UNABLE_SET_VERSION: - wsString = L"Unable to set version value!"; - return; - case XFA_IDS_UNABLE_SET_READY: - wsString = L"Unable to set ready value!"; - return; - case XFA_IDS_NUMBER_OF_OCCUR: - wsString = - L"The element [%s] has violated its allowable number of occurrences"; - return; - case XFA_IDS_UNABLE_SET_CLASS_NAME: - wsString = L"Unable to set className value!"; - return; - case XFA_IDS_UNABLE_SET_LENGTH_VALUE: - wsString = L"Unable to set length value!"; - return; - case XFA_IDS_UNSUPPORT_CHAR: - wsString = L"unsupported char '%c'"; - return; - case XFA_IDS_BAD_SUFFIX: - wsString = L"bad suffix on number"; - return; - case XFA_IDS_EXPECTED_IDENT: - wsString = L"expected identifier instead of '%s'"; - return; - case XFA_IDS_EXPECTED_STRING: - wsString = L"expected '%s' instead of '%s'"; - return; - case XFA_IDS_INVALIDATE_CHAR: - wsString = L"invalidate char '%c'"; - return; - case XFA_IDS_REDEFINITION: - wsString = L"'%s' redefinition "; - return; - case XFA_IDS_INVALIDATE_TOKEN: - wsString = L"invalidate token '%s'"; - return; - case XFA_IDS_INVALIDATE_EXPRESSION: - wsString = L"invalidate expression '%s'"; - return; - case XFA_IDS_UNDEFINE_IDENTIFIER: - wsString = L"undefined identifier '%s'"; - return; - case XFA_IDS_INVALIDATE_LEFTVALUE: - wsString = L"invalidate left-value '%s'"; - return; - case XFA_IDS_COMPILER_ERROR: - wsString = L"compiler error"; - return; - case XFA_IDS_CANNOT_MODIFY_VALUE: - wsString = L"can't modify the '%s' value"; - return; - case XFA_IDS_ERROR_PARAMETERS: - wsString = L"function '%s' has not %d parameters"; - return; - case XFA_IDS_EXPECT_ENDIF: - wsString = L"expected 'endif' instead of '%s'"; - return; - case XFA_IDS_UNEXPECTED_EXPRESSION: - wsString = L"unexpected expression '%s'"; - return; - case XFA_IDS_CONDITION_IS_NULL: - wsString = L"condition is null"; - return; - case XFA_IDS_ILLEGALBREAK: - wsString = L"illegal break"; - return; - case XFA_IDS_ILLEGALCONTINUE: - wsString = L"illegal continue"; - return; - case XFA_IDS_EXPECTED_OPERATOR: - wsString = L"expected operator '%s' instead of '%s'"; - return; - case XFA_IDS_DIVIDE_ZERO: - wsString = L"divide by zero"; - return; - case XFA_IDS_CANNOT_COVERT_OBJECT: - wsString = L"%s.%s can not covert to object"; - return; - case XFA_IDS_NOT_FOUND_CONTAINER: - wsString = L"can not found container '%s'"; - return; - case XFA_IDS_NOT_FOUND_PROPERTY: - wsString = L"can not found property '%s'"; - return; - case XFA_IDS_NOT_FOUND_METHOD: - wsString = L"can not found method '%s'"; - return; - case XFA_IDS_NOT_FOUND_CONST: - wsString = L"can not found const '%s'"; - return; - case XFA_IDS_NOT_ASSIGN_OBJECT: - wsString = L"can not direct assign value to object"; - return; - case XFA_IDS_IVALIDATE_INSTRUCTION: - wsString = L"invalidate instruction"; - return; - case XFA_IDS_EXPECT_NUMBER: - wsString = L"expected number instead of '%s'"; - return; - case XFA_IDS_VALIDATE_OUT_ARRAY: - wsString = L"validate access index '%s' out of array"; - return; - case XFA_IDS_CANNOT_ASSIGN_IDENT: - wsString = L"can not assign to %s"; - return; - case XFA_IDS_NOT_FOUNT_FUNCTION: - wsString = L"can not found '%s' function"; - return; - case XFA_IDS_NOT_ARRAY: - wsString = L"'%s' doesn't an array"; - return; - case XFA_IDS_OUT_ARRAY: - wsString = L"out of range of '%s' array"; - return; - case XFA_IDS_NOT_SUPPORT_CALC: - wsString = L"'%s' operator can not support array calculate"; - return; - case XFA_IDS_ARGUMENT_NOT_ARRAY: - wsString = L"'%s' function's %d argument can not be array"; - return; - case XFA_IDS_ARGUMENT_EXPECT_CONTAINER: - wsString = L"'%s' argument expected a container"; - return; - case XFA_IDS_ACCESS_PROPERTY_IN_NOT_OBJECT: - wsString = - L"an attempt was made to reference property '%s' of a non-object in " - L"SOM expression %s"; - return; - case XFA_IDS_FUNCTION_IS_BUILDIN: - wsString = L"function '%s' is buildin"; - return; - case XFA_IDS_ERROR_MSG: - wsString = L"%s : %s"; - return; - case XFA_IDS_INDEX_OUT_OF_BOUNDS: - wsString = L"Index value is out of bounds"; - return; - case XFA_IDS_INCORRECT_NUMBER_OF_METHOD: - wsString = L"Incorrect number of parameters calling method '%s'"; - return; - case XFA_IDS_ARGUMENT_MISMATCH: - wsString = L"Argument mismatch in property or function argument"; - return; - case XFA_IDS_INVALID_ENUMERATE: - wsString = L"Invalid enumerated value: %s"; - return; - case XFA_IDS_INVALID_APPEND: - wsString = - L"Invalid append operation: %s cannot have a child element of %s"; - return; - case XFA_IDS_SOM_EXPECTED_LIST: - wsString = - L"SOM expression returned list when single result was expected"; - return; - case XFA_IDS_NOT_HAVE_PROPERTY: - wsString = L"'%s' doesn't have property '%s'"; - return; - case XFA_IDS_INVALID_NODE_TYPE: - wsString = L"Invalid node type : '%s'"; - return; - case XFA_IDS_VIOLATE_BOUNDARY: - wsString = - L"The element [%s] has violated its allowable number of occurrences"; - return; - case XFA_IDS_SERVER_DENY: - wsString = L"Server does not permit"; - return; - case XFA_IDS_ValidateLimit: - wsString = FX_WSTRC( - L"Message limit exceeded. Remaining %d validation errors not " - L"reported."); - return; - case XFA_IDS_ValidateNullWarning: - wsString = FX_WSTRC( - L"%s cannot be left blank. To ignore validations for %s, click " - L"Ignore."); - return; - case XFA_IDS_ValidateNullError: - wsString = FX_WSTRC(L"%s cannot be left blank."); - return; - case XFA_IDS_ValidateWarning: - wsString = FX_WSTRC( - L"The value you entered for %s is invalid. To ignore validations for " - L"%s, click Ignore."); - return; - case XFA_IDS_ValidateError: - wsString = FX_WSTRC(L"The value you entered for %s is invalid."); - return; - } -} - -FX_BOOL CPDFXFA_App::ShowFileDialog(const CFX_WideStringC& wsTitle, - const CFX_WideStringC& wsFilter, - CFX_WideStringArray& wsPathArr, - FX_BOOL bOpen) { - return FALSE; -} - -IFWL_AdapterTimerMgr* CPDFXFA_App::GetTimerMgr() { - CXFA_FWLAdapterTimerMgr* pAdapter = NULL; - CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0); - if (pEnv) - pAdapter = new CXFA_FWLAdapterTimerMgr(pEnv); - return pAdapter; -} diff --git a/fpdfsdk/src/fpdfxfa/fpdfxfa_doc.cpp b/fpdfsdk/src/fpdfxfa/fpdfxfa_doc.cpp deleted file mode 100644 index 18f3d498e7..0000000000 --- a/fpdfsdk/src/fpdfxfa/fpdfxfa_doc.cpp +++ /dev/null @@ -1,1258 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "core/include/fpdfapi/cpdf_array.h" -#include "core/include/fpdfapi/cpdf_document.h" -#include "core/include/fpdfapi/cpdf_string.h" -#include "fpdfsdk/include/fpdfxfa/fpdfxfa_app.h" -#include "fpdfsdk/include/fpdfxfa/fpdfxfa_doc.h" -#include "fpdfsdk/include/fpdfxfa/fpdfxfa_page.h" -#include "fpdfsdk/include/fpdfxfa/fpdfxfa_util.h" -#include "fpdfsdk/include/fsdk_define.h" -#include "fpdfsdk/include/fsdk_mgr.h" -#include "fpdfsdk/include/javascript/IJavaScript.h" -#include "public/fpdf_formfill.h" - -#define IDS_XFA_Validate_Input \ - "At least one required field was empty. Please fill in the required " \ - "fields\r\n(highlighted) before continuing." - -// submit -#define FXFA_CONFIG 0x00000001 -#define FXFA_TEMPLATE 0x00000010 -#define FXFA_LOCALESET 0x00000100 -#define FXFA_DATASETS 0x00001000 -#define FXFA_XMPMETA 0x00010000 -#define FXFA_XFDF 0x00100000 -#define FXFA_FORM 0x01000000 -#define FXFA_PDF 0x10000000 - -#ifndef _WIN32 -extern void SetLastError(int err); - -extern int GetLastError(); -#endif - -CPDFXFA_Document::CPDFXFA_Document(CPDF_Document* pPDFDoc, - CPDFXFA_App* pProvider) - : m_iDocType(DOCTYPE_PDF), - m_pPDFDoc(pPDFDoc), - m_pSDKDoc(nullptr), - m_pXFADoc(nullptr), - m_pXFADocView(nullptr), - m_pApp(pProvider), - m_pJSContext(nullptr) { -} - -CPDFXFA_Document::~CPDFXFA_Document() { - if (m_pXFADoc) { - IXFA_App* pApp = m_pApp->GetXFAApp(); - if (pApp) { - IXFA_DocHandler* pDocHandler = pApp->GetDocHandler(); - if (pDocHandler) { - CloseXFADoc(pDocHandler); - } - } - delete m_pXFADoc; - } - if (m_pJSContext && m_pSDKDoc && m_pSDKDoc->GetEnv()) - m_pSDKDoc->GetEnv()->GetJSRuntime()->ReleaseContext(m_pJSContext); - delete m_pSDKDoc; - if (m_pPDFDoc) { - CPDF_Parser* pParser = m_pPDFDoc->GetParser(); - if (pParser) - delete pParser; - else - delete m_pPDFDoc; - } -} - -FX_BOOL CPDFXFA_Document::LoadXFADoc() { - if (!m_pPDFDoc) - return FALSE; - - m_XFAPageList.RemoveAll(); - - IXFA_App* pApp = m_pApp->GetXFAApp(); - if (!pApp) - return FALSE; - - m_pXFADoc = pApp->CreateDoc(this, m_pPDFDoc); - if (!m_pXFADoc) { - SetLastError(FPDF_ERR_XFALOAD); - return FALSE; - } - - IXFA_DocHandler* pDocHandler = pApp->GetDocHandler(); - if (!pDocHandler) { - SetLastError(FPDF_ERR_XFALOAD); - return FALSE; - } - - pDocHandler->StartLoad(m_pXFADoc); - int iStatus = pDocHandler->DoLoad(m_pXFADoc, NULL); - if (iStatus != XFA_PARSESTATUS_Done) { - CloseXFADoc(pDocHandler); - SetLastError(FPDF_ERR_XFALOAD); - return FALSE; - } - pDocHandler->StopLoad(m_pXFADoc); - pDocHandler->SetJSERuntime(m_pXFADoc, m_pApp->GetJSERuntime()); - - if (pDocHandler->GetDocType(m_pXFADoc) == XFA_DOCTYPE_Dynamic) - m_iDocType = DOCTYPE_DYNAMIC_XFA; - else - m_iDocType = DOCTYPE_STATIC_XFA; - - m_pXFADocView = pDocHandler->CreateDocView(m_pXFADoc, XFA_DOCVIEW_View); - if (m_pXFADocView->StartLayout() < 0) { - CloseXFADoc(pDocHandler); - SetLastError(FPDF_ERR_XFALAYOUT); - return FALSE; - } - - m_pXFADocView->DoLayout(NULL); - m_pXFADocView->StopLayout(); - return TRUE; -} - -int CPDFXFA_Document::GetPageCount() { - if (!m_pPDFDoc && !m_pXFADoc) - return 0; - - switch (m_iDocType) { - case DOCTYPE_PDF: - case DOCTYPE_STATIC_XFA: - if (m_pPDFDoc) - return m_pPDFDoc->GetPageCount(); - case DOCTYPE_DYNAMIC_XFA: - if (m_pXFADoc) - return m_pXFADocView->CountPageViews(); - default: - return 0; - } - - return 0; -} - -CPDFXFA_Page* CPDFXFA_Document::GetPage(int page_index) { - if (page_index < 0) - return nullptr; - CPDFXFA_Page* pPage = nullptr; - int nCount = m_XFAPageList.GetSize(); - if (nCount > 0 && page_index < nCount) { - pPage = m_XFAPageList.GetAt(page_index); - if (pPage) - pPage->AddRef(); - } else { - m_XFAPageList.SetSize(GetPageCount()); - } - if (pPage) - return pPage; - pPage = new CPDFXFA_Page(this, page_index); - if (!pPage->LoadPage()) { - delete pPage; - return nullptr; - } - m_XFAPageList.SetAt(page_index, pPage); - return pPage; -} - -CPDFXFA_Page* CPDFXFA_Document::GetPage(IXFA_PageView* pPage) { - if (!pPage) - return NULL; - - if (!m_pXFADoc) - return NULL; - - if (m_iDocType != DOCTYPE_DYNAMIC_XFA) - return NULL; - - int nSize = m_XFAPageList.GetSize(); - for (int i = 0; i < nSize; i++) { - CPDFXFA_Page* pTempPage = m_XFAPageList.GetAt(i); - if (!pTempPage) - continue; - if (pTempPage->GetXFAPageView() && pTempPage->GetXFAPageView() == pPage) - return pTempPage; - } - - return NULL; -} - -void CPDFXFA_Document::RemovePage(CPDFXFA_Page* page) { - m_XFAPageList.SetAt(page->GetPageIndex(), NULL); -} - -CPDFSDK_Document* CPDFXFA_Document::GetSDKDocument( - CPDFDoc_Environment* pFormFillEnv) { - if (!m_pSDKDoc && pFormFillEnv) - m_pSDKDoc = new CPDFSDK_Document(this, pFormFillEnv); - return m_pSDKDoc; -} - -void CPDFXFA_Document::FXRect2PDFRect(const CFX_RectF& fxRectF, - CFX_FloatRect& pdfRect) { - pdfRect.left = fxRectF.left; - pdfRect.top = fxRectF.bottom(); - pdfRect.right = fxRectF.right(); - pdfRect.bottom = fxRectF.top; -} - -void CPDFXFA_Document::SetChangeMark(IXFA_Doc* hDoc) { - if (hDoc == m_pXFADoc && m_pSDKDoc) { - m_pSDKDoc->SetChangeMark(); - } -} - -FX_BOOL CPDFXFA_Document::GetChangeMark(IXFA_Doc* hDoc) { - if (hDoc == m_pXFADoc && m_pSDKDoc) - return m_pSDKDoc->GetChangeMark(); - return FALSE; -} - -void CPDFXFA_Document::InvalidateRect(IXFA_PageView* pPageView, - const CFX_RectF& rt, - FX_DWORD dwFlags /* = 0 */) { - if (!m_pXFADoc || !m_pSDKDoc) - return; - - if (m_iDocType != DOCTYPE_DYNAMIC_XFA) - return; - - CFX_FloatRect rcPage; - FXRect2PDFRect(rt, rcPage); - - CPDFXFA_Page* pPage = GetPage(pPageView); - - if (pPage == NULL) - return; - - CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv(); - if (!pEnv) - return; - - pEnv->FFI_Invalidate((FPDF_PAGE)pPage, rcPage.left, rcPage.bottom, - rcPage.right, rcPage.top); -} - -void CPDFXFA_Document::InvalidateRect(IXFA_Widget* hWidget, - FX_DWORD dwFlags /* = 0 */) { - if (!hWidget) - return; - - if (!m_pXFADoc || !m_pSDKDoc || !m_pXFADocView) - return; - - if (m_iDocType != DOCTYPE_DYNAMIC_XFA) - return; - - IXFA_WidgetHandler* pWidgetHandler = m_pXFADocView->GetWidgetHandler(); - if (!pWidgetHandler) - return; - - IXFA_PageView* pPageView = pWidgetHandler->GetPageView(hWidget); - if (!pPageView) - return; - - CFX_RectF rect; - pWidgetHandler->GetRect(hWidget, rect); - InvalidateRect(pPageView, rect, dwFlags); -} - -void CPDFXFA_Document::DisplayCaret(IXFA_Widget* hWidget, - FX_BOOL bVisible, - const CFX_RectF* pRtAnchor) { - if (!hWidget || pRtAnchor == NULL) - return; - - if (!m_pXFADoc || !m_pSDKDoc || !m_pXFADocView) - return; - - if (m_iDocType != DOCTYPE_DYNAMIC_XFA) - return; - - IXFA_WidgetHandler* pWidgetHandler = m_pXFADocView->GetWidgetHandler(); - if (!pWidgetHandler) - return; - - IXFA_PageView* pPageView = pWidgetHandler->GetPageView(hWidget); - if (!pPageView) - return; - - CPDFXFA_Page* pPage = GetPage(pPageView); - - if (pPage == NULL) - return; - - CFX_FloatRect rcCaret; - FXRect2PDFRect(*pRtAnchor, rcCaret); - - CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv(); - if (!pEnv) - return; - - pEnv->FFI_DisplayCaret((FPDF_PAGE)pPage, bVisible, rcCaret.left, rcCaret.top, - rcCaret.right, rcCaret.bottom); -} - -FX_BOOL CPDFXFA_Document::GetPopupPos(IXFA_Widget* hWidget, - FX_FLOAT fMinPopup, - FX_FLOAT fMaxPopup, - const CFX_RectF& rtAnchor, - CFX_RectF& rtPopup) { - if (NULL == hWidget) { - return FALSE; - } - IXFA_PageView* pXFAPageView = - m_pXFADocView->GetWidgetHandler()->GetPageView(hWidget); - if (NULL == pXFAPageView) { - return FALSE; - } - CPDFXFA_Page* pPage = GetPage(pXFAPageView); - if (pPage == NULL) - return FALSE; - - CXFA_WidgetAcc* pWidgetAcc = - m_pXFADocView->GetWidgetHandler()->GetDataAcc(hWidget); - - int nRotate = 0; -#ifdef PDF_ENABLE_XFA - nRotate = pWidgetAcc->GetRotate(); -#endif - - CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv(); - if (pEnv == NULL) - return FALSE; - FS_RECTF pageViewRect; - pEnv->FFI_GetPageViewRect(pPage, pageViewRect); - - CFX_FloatRect rcAnchor; - - rcAnchor.left = rtAnchor.left; - rcAnchor.top = rtAnchor.bottom(); - rcAnchor.right = rtAnchor.right(); - rcAnchor.bottom = rtAnchor.top; - - int t1, t2, t; - FX_DWORD dwPos; - FX_FLOAT fPoupHeight; - switch (nRotate) { - case 90: { - t1 = (int)(pageViewRect.right - rcAnchor.right); - t2 = (int)(rcAnchor.left - pageViewRect.left); - if (rcAnchor.bottom < pageViewRect.bottom) { - rtPopup.left += rcAnchor.bottom - pageViewRect.bottom; - } - - break; - } - - case 180: { - t2 = (int)(pageViewRect.top - rcAnchor.top); - t1 = (int)(rcAnchor.bottom - pageViewRect.bottom); - if (rcAnchor.left < pageViewRect.left) { - rtPopup.left += rcAnchor.left - pageViewRect.left; - } - break; - } - case 270: { - t1 = (int)(rcAnchor.left - pageViewRect.left); - t2 = (int)(pageViewRect.right - rcAnchor.right); - - if (rcAnchor.top > pageViewRect.top) { - rtPopup.left -= rcAnchor.top - pageViewRect.top; - } - break; - } - case 0: - default: { - t1 = (int)(pageViewRect.top - rcAnchor.top); - t2 = (int)(rcAnchor.bottom - pageViewRect.bottom); - if (rcAnchor.right > pageViewRect.right) { - rtPopup.left -= rcAnchor.right - pageViewRect.right; - } - break; - } - } - - if (t1 <= 0 && t2 <= 0) { - return FALSE; - } - if (t1 <= 0) { - t = t2; - dwPos = 1; - } else if (t2 <= 0) { - t = t1; - dwPos = 0; - } else if (t1 > t2) { - t = t1; - dwPos = 0; - } else { - t = t2; - dwPos = 1; - } - if (t < fMinPopup) { - fPoupHeight = fMinPopup; - } else if (t > fMaxPopup) { - fPoupHeight = fMaxPopup; - } else { - fPoupHeight = (FX_FLOAT)t; - } - - switch (nRotate) { - case 0: - case 180: { - if (dwPos == 0) { - rtPopup.top = rtAnchor.height; - rtPopup.height = fPoupHeight; - } else { - rtPopup.top = -fPoupHeight; - rtPopup.height = fPoupHeight; - } - break; - } - case 90: - case 270: { - if (dwPos == 0) { - rtPopup.top = rtAnchor.width; - rtPopup.height = fPoupHeight; - } else { - rtPopup.top = -fPoupHeight; - rtPopup.height = fPoupHeight; - } - break; - } - default: - break; - } - - return TRUE; -} - -FX_BOOL CPDFXFA_Document::PopupMenu(IXFA_Widget* hWidget, - CFX_PointF ptPopup, - const CFX_RectF* pRectExclude) { - if (NULL == hWidget) { - return FALSE; - } - IXFA_PageView* pXFAPageView = - m_pXFADocView->GetWidgetHandler()->GetPageView(hWidget); - if (pXFAPageView == NULL) - return FALSE; - CPDFXFA_Page* pPage = GetPage(pXFAPageView); - - if (pPage == NULL) - return FALSE; - - int menuFlag = 0; - - IXFA_MenuHandler* pXFAMenuHander = m_pApp->GetXFAApp()->GetMenuHandler(); - if (pXFAMenuHander->CanUndo(hWidget)) - menuFlag |= FXFA_MEMU_UNDO; - if (pXFAMenuHander->CanRedo(hWidget)) - menuFlag |= FXFA_MEMU_REDO; - if (pXFAMenuHander->CanPaste(hWidget)) - menuFlag |= FXFA_MEMU_PASTE; - if (pXFAMenuHander->CanCopy(hWidget)) - menuFlag |= FXFA_MEMU_COPY; - if (pXFAMenuHander->CanCut(hWidget)) - menuFlag |= FXFA_MEMU_CUT; - if (pXFAMenuHander->CanSelectAll(hWidget)) - menuFlag |= FXFA_MEMU_SELECTALL; - - CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv(); - if (pEnv == NULL) - return FALSE; - - return pEnv->FFI_PopupMenu(pPage, hWidget, menuFlag, ptPopup, NULL); -} - -void CPDFXFA_Document::PageViewEvent(IXFA_PageView* pPageView, - FX_DWORD dwFlags) { - if (!pPageView || (dwFlags != XFA_PAGEVIEWEVENT_PostAdded && - dwFlags != XFA_PAGEVIEWEVENT_PostRemoved)) { - return; - } - CPDFXFA_Page* pPage = nullptr; - CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv(); - if (dwFlags == XFA_PAGEVIEWEVENT_PostAdded) { - int nPageIndex = pPageView->GetPageViewIndex(); - pPage = GetPage(nPageIndex); - if (pPage) - pPage->SetXFAPageView(pPageView); - pEnv->FFI_PageEvent(nPageIndex, dwFlags); - return; - } - pPage = GetPage(pPageView); - if (!pPage) - return; - pEnv->FFI_PageEvent(pPage->GetPageIndex(), dwFlags); - pPage->Release(); -} - -void CPDFXFA_Document::WidgetEvent(IXFA_Widget* hWidget, - CXFA_WidgetAcc* pWidgetData, - FX_DWORD dwEvent, - void* pParam, - void* pAdditional) { - if (m_iDocType != DOCTYPE_DYNAMIC_XFA || !hWidget) - return; - - CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv(); - if (!pEnv) - return; - - IXFA_PageView* pPageView = - m_pXFADocView->GetWidgetHandler()->GetPageView(hWidget); - if (pPageView == NULL) - return; - - CPDFXFA_Page* pXFAPage = GetPage(pPageView); - if (pXFAPage == NULL) - return; - - CPDFSDK_PageView* pSdkPageView = m_pSDKDoc->GetPageView(pXFAPage); - if (dwEvent == XFA_WIDGETEVENT_PostAdded) { - pSdkPageView->AddAnnot(hWidget); - - } else if (dwEvent == XFA_WIDGETEVENT_PreRemoved) { - CPDFSDK_Annot* pAnnot = pSdkPageView->GetAnnotByXFAWidget(hWidget); - if (pAnnot) { - pSdkPageView->DeleteAnnot(pAnnot); - } - } -} - -int32_t CPDFXFA_Document::CountPages(IXFA_Doc* hDoc) { - if (hDoc == m_pXFADoc && m_pSDKDoc) { - return GetPageCount(); - } - return 0; -} -int32_t CPDFXFA_Document::GetCurrentPage(IXFA_Doc* hDoc) { - if (hDoc != m_pXFADoc || !m_pSDKDoc) - return -1; - if (m_iDocType != DOCTYPE_DYNAMIC_XFA) - return -1; - - CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv(); - if (pEnv == NULL) - return -1; - - return pEnv->FFI_GetCurrentPageIndex(this); -} -void CPDFXFA_Document::SetCurrentPage(IXFA_Doc* hDoc, int32_t iCurPage) { - if (hDoc != m_pXFADoc || !m_pSDKDoc || m_iDocType != DOCTYPE_DYNAMIC_XFA || - iCurPage < 0 || iCurPage >= m_pSDKDoc->GetPageCount()) { - return; - } - CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv(); - if (!pEnv) - return; - pEnv->FFI_SetCurrentPage(this, iCurPage); -} -FX_BOOL CPDFXFA_Document::IsCalculationsEnabled(IXFA_Doc* hDoc) { - if (hDoc != m_pXFADoc || !m_pSDKDoc) - return FALSE; - if (m_pSDKDoc->GetInterForm()) - return m_pSDKDoc->GetInterForm()->IsXfaCalculateEnabled(); - - return FALSE; -} -void CPDFXFA_Document::SetCalculationsEnabled(IXFA_Doc* hDoc, - FX_BOOL bEnabled) { - if (hDoc != m_pXFADoc || !m_pSDKDoc) - return; - if (m_pSDKDoc->GetInterForm()) - m_pSDKDoc->GetInterForm()->XfaEnableCalculate(bEnabled); -} - -void CPDFXFA_Document::GetTitle(IXFA_Doc* hDoc, CFX_WideString& wsTitle) { - if (hDoc != m_pXFADoc) - return; - if (m_pPDFDoc == NULL) - return; - CPDF_Dictionary* pInfoDict = m_pPDFDoc->GetInfo(); - - if (pInfoDict == NULL) - return; - - CFX_ByteString csTitle = pInfoDict->GetStringBy("Title"); - wsTitle = wsTitle.FromLocal(csTitle.GetBuffer(csTitle.GetLength())); - csTitle.ReleaseBuffer(csTitle.GetLength()); -} -void CPDFXFA_Document::SetTitle(IXFA_Doc* hDoc, - const CFX_WideStringC& wsTitle) { - if (hDoc != m_pXFADoc) - return; - if (m_pPDFDoc == NULL) - return; - CPDF_Dictionary* pInfoDict = m_pPDFDoc->GetInfo(); - - if (pInfoDict == NULL) - return; - pInfoDict->SetAt("Title", new CPDF_String(wsTitle)); -} -void CPDFXFA_Document::ExportData(IXFA_Doc* hDoc, - const CFX_WideStringC& wsFilePath, - FX_BOOL bXDP) { - if (hDoc != m_pXFADoc) - return; - if (m_iDocType != DOCTYPE_DYNAMIC_XFA && m_iDocType != DOCTYPE_STATIC_XFA) - return; - CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv(); - if (pEnv == NULL) - return; - int fileType = bXDP ? FXFA_SAVEAS_XDP : FXFA_SAVEAS_XML; - CFX_ByteString bs = CFX_WideString(wsFilePath).UTF16LE_Encode(); - - if (wsFilePath.IsEmpty()) { - if (!pEnv->GetFormFillInfo() || - pEnv->GetFormFillInfo()->m_pJsPlatform == NULL) - return; - CFX_WideString filepath = pEnv->JS_fieldBrowse(); - bs = filepath.UTF16LE_Encode(); - } - int len = bs.GetLength() / sizeof(unsigned short); - FPDF_FILEHANDLER* pFileHandler = pEnv->FFI_OpenFile( - bXDP ? FXFA_SAVEAS_XDP : FXFA_SAVEAS_XML, - (FPDF_WIDESTRING)bs.GetBuffer(len * sizeof(unsigned short)), "wb"); - bs.ReleaseBuffer(len * sizeof(unsigned short)); - - if (pFileHandler == NULL) - return; - - CFPDF_FileStream fileWrite(pFileHandler); - - IXFA_DocHandler* pXFADocHander = m_pApp->GetXFAApp()->GetDocHandler(); - CFX_ByteString content; - if (fileType == FXFA_SAVEAS_XML) { - content = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n"; - fileWrite.WriteBlock((const FX_CHAR*)content, fileWrite.GetSize(), - content.GetLength()); - CFX_WideStringC data(L"data"); - if (pXFADocHander->SavePackage(m_pXFADocView->GetDoc(), data, &fileWrite)) { - // Ignoring error. - } - } else if (fileType == FXFA_SAVEAS_XDP) { - if (m_pPDFDoc == NULL) - return; - CPDF_Dictionary* pRoot = m_pPDFDoc->GetRoot(); - if (pRoot == NULL) - return; - CPDF_Dictionary* pAcroForm = pRoot->GetDictBy("AcroForm"); - if (NULL == pAcroForm) - return; - CPDF_Object* pXFA = pAcroForm->GetElement("XFA"); - if (pXFA == NULL) - return; - if (!pXFA->IsArray()) - return; - CPDF_Array* pArray = pXFA->GetArray(); - if (NULL == pArray) - return; - int size = pArray->GetCount(); - for (int i = 1; i < size; i += 2) { - CPDF_Object* pPDFObj = pArray->GetElement(i); - CPDF_Object* pPrePDFObj = pArray->GetElement(i - 1); - if (!pPrePDFObj->IsString()) - continue; - if (!pPDFObj->IsReference()) - continue; - CPDF_Object* pDirectObj = pPDFObj->GetDirect(); - if (!pDirectObj->IsStream()) - continue; - if (pPrePDFObj->GetString() == "form") { - CFX_WideStringC form(L"form"); - pXFADocHander->SavePackage(m_pXFADocView->GetDoc(), form, &fileWrite); - } else if (pPrePDFObj->GetString() == "datasets") { - CFX_WideStringC datasets(L"datasets"); - pXFADocHander->SavePackage(m_pXFADocView->GetDoc(), datasets, - &fileWrite); - } else { - if (i == size - 1) { - CFX_WideString wPath = CFX_WideString::FromUTF16LE( - (unsigned short*)(const FX_CHAR*)bs, - bs.GetLength() / sizeof(unsigned short)); - CFX_ByteString bPath = wPath.UTF8Encode(); - CFX_ByteString szFormat = - "\n<pdf href=\"%s\" xmlns=\"http://ns.adobe.com/xdp/pdf/\"/>"; - content.Format(szFormat, (char*)(const FX_CHAR*)bPath); - fileWrite.WriteBlock((const FX_CHAR*)content, fileWrite.GetSize(), - content.GetLength()); - } - - CPDF_Stream* pStream = (CPDF_Stream*)pDirectObj; - CPDF_StreamAcc* pAcc = new CPDF_StreamAcc; - pAcc->LoadAllData(pStream); - fileWrite.WriteBlock(pAcc->GetData(), fileWrite.GetSize(), - pAcc->GetSize()); - delete pAcc; - } - } - } - if (!fileWrite.Flush()) { - // Ignoring flush error. - } -} -void CPDFXFA_Document::ImportData(IXFA_Doc* hDoc, - const CFX_WideStringC& wsFilePath) { -} - -void CPDFXFA_Document::GotoURL(IXFA_Doc* hDoc, - const CFX_WideStringC& bsURL, - FX_BOOL bAppend) { - if (hDoc != m_pXFADoc) - return; - - if (m_iDocType != DOCTYPE_DYNAMIC_XFA) - return; - - CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv(); - if (pEnv == NULL) - return; - - CFX_WideStringC str(bsURL.GetPtr()); - - pEnv->FFI_GotoURL(this, str, bAppend); -} - -FX_BOOL CPDFXFA_Document::IsValidationsEnabled(IXFA_Doc* hDoc) { - if (hDoc != m_pXFADoc || !m_pSDKDoc) - return FALSE; - if (m_pSDKDoc->GetInterForm()) - return m_pSDKDoc->GetInterForm()->IsXfaValidationsEnabled(); - - return TRUE; -} -void CPDFXFA_Document::SetValidationsEnabled(IXFA_Doc* hDoc, FX_BOOL bEnabled) { - if (hDoc != m_pXFADoc || !m_pSDKDoc) - return; - if (m_pSDKDoc->GetInterForm()) - m_pSDKDoc->GetInterForm()->XfaSetValidationsEnabled(bEnabled); -} -void CPDFXFA_Document::SetFocusWidget(IXFA_Doc* hDoc, IXFA_Widget* hWidget) { - if (hDoc != m_pXFADoc) - return; - - if (NULL == hWidget) { - m_pSDKDoc->SetFocusAnnot(NULL); - return; - } - - int pageViewCount = m_pSDKDoc->GetPageViewCount(); - for (int i = 0; i < pageViewCount; i++) { - CPDFSDK_PageView* pPageView = m_pSDKDoc->GetPageView(i); - if (pPageView == NULL) - continue; - CPDFSDK_Annot* pAnnot = pPageView->GetAnnotByXFAWidget(hWidget); - if (pAnnot) { - m_pSDKDoc->SetFocusAnnot(pAnnot); - break; - } - } -} -void CPDFXFA_Document::Print(IXFA_Doc* hDoc, - int32_t nStartPage, - int32_t nEndPage, - FX_DWORD dwOptions) { - if (hDoc != m_pXFADoc) - return; - - CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv(); - if (pEnv == NULL) - return; - - if (!pEnv->GetFormFillInfo() || - pEnv->GetFormFillInfo()->m_pJsPlatform == NULL) - return; - if (pEnv->GetFormFillInfo()->m_pJsPlatform->Doc_print == NULL) - return; - pEnv->GetFormFillInfo()->m_pJsPlatform->Doc_print( - pEnv->GetFormFillInfo()->m_pJsPlatform, - dwOptions & XFA_PRINTOPT_ShowDialog, nStartPage, nEndPage, - dwOptions & XFA_PRINTOPT_CanCancel, dwOptions & XFA_PRINTOPT_ShrinkPage, - dwOptions & XFA_PRINTOPT_AsImage, dwOptions & XFA_PRINTOPT_ReverseOrder, - dwOptions & XFA_PRINTOPT_PrintAnnot); -} - -void CPDFXFA_Document::GetURL(IXFA_Doc* hDoc, CFX_WideString& wsDocURL) { - if (hDoc != m_pXFADoc) - return; - - CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv(); - if (pEnv == NULL) - return; - - pEnv->FFI_GetURL(this, wsDocURL); -} - -FX_ARGB CPDFXFA_Document::GetHighlightColor(IXFA_Doc* hDoc) { - if (hDoc != m_pXFADoc) - return 0; - if (m_pSDKDoc) { - if (CPDFSDK_InterForm* pInterForm = m_pSDKDoc->GetInterForm()) { - FX_COLORREF color = pInterForm->GetHighlightColor(FPDF_FORMFIELD_XFA); - uint8_t alpha = pInterForm->GetHighlightAlpha(); - FX_ARGB argb = ArgbEncode((int)alpha, color); - return argb; - } - } - return 0; -} - -FX_BOOL CPDFXFA_Document::_NotifySubmit(FX_BOOL bPrevOrPost) { - if (bPrevOrPost) - return _OnBeforeNotifySumbit(); - - _OnAfterNotifySumbit(); - return TRUE; -} - -FX_BOOL CPDFXFA_Document::_OnBeforeNotifySumbit() { -#ifdef PDF_ENABLE_XFA - if (m_iDocType != DOCTYPE_DYNAMIC_XFA && m_iDocType != DOCTYPE_STATIC_XFA) - return TRUE; - if (m_pXFADocView == NULL) - return TRUE; - IXFA_WidgetHandler* pWidgetHandler = m_pXFADocView->GetWidgetHandler(); - if (pWidgetHandler == NULL) - return TRUE; - IXFA_WidgetAccIterator* pWidgetAccIterator = - m_pXFADocView->CreateWidgetAccIterator(); - if (pWidgetAccIterator) { - CXFA_EventParam Param; - Param.m_eType = XFA_EVENT_PreSubmit; - CXFA_WidgetAcc* pWidgetAcc = pWidgetAccIterator->MoveToNext(); - while (pWidgetAcc) { - pWidgetHandler->ProcessEvent(pWidgetAcc, &Param); - pWidgetAcc = pWidgetAccIterator->MoveToNext(); - } - pWidgetAccIterator->Release(); - } - pWidgetAccIterator = m_pXFADocView->CreateWidgetAccIterator(); - if (pWidgetAccIterator) { - CXFA_WidgetAcc* pWidgetAcc = pWidgetAccIterator->MoveToNext(); - pWidgetAcc = pWidgetAccIterator->MoveToNext(); - while (pWidgetAcc) { - int fRet = pWidgetAcc->ProcessValidate(-1); - if (fRet == XFA_EVENTERROR_Error) { - CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv(); - if (pEnv == NULL) - return FALSE; - CFX_WideString ws; - ws.FromLocal(IDS_XFA_Validate_Input); - CFX_ByteString bs = ws.UTF16LE_Encode(); - int len = bs.GetLength() / sizeof(unsigned short); - pEnv->FFI_Alert( - (FPDF_WIDESTRING)bs.GetBuffer(len * sizeof(unsigned short)), - (FPDF_WIDESTRING)L"", 0, 1); - bs.ReleaseBuffer(len * sizeof(unsigned short)); - pWidgetAccIterator->Release(); - return FALSE; - } - pWidgetAcc = pWidgetAccIterator->MoveToNext(); - } - pWidgetAccIterator->Release(); - m_pXFADocView->UpdateDocView(); - } -#endif - return TRUE; -} -void CPDFXFA_Document::_OnAfterNotifySumbit() { - if (m_iDocType != DOCTYPE_DYNAMIC_XFA && m_iDocType != DOCTYPE_STATIC_XFA) - return; - if (m_pXFADocView == NULL) - return; - IXFA_WidgetHandler* pWidgetHandler = m_pXFADocView->GetWidgetHandler(); - if (pWidgetHandler == NULL) - return; - IXFA_WidgetAccIterator* pWidgetAccIterator = - m_pXFADocView->CreateWidgetAccIterator(); - if (pWidgetAccIterator == NULL) - return; - CXFA_EventParam Param; - Param.m_eType = XFA_EVENT_PostSubmit; - - CXFA_WidgetAcc* pWidgetAcc = pWidgetAccIterator->MoveToNext(); - while (pWidgetAcc) { - pWidgetHandler->ProcessEvent(pWidgetAcc, &Param); - pWidgetAcc = pWidgetAccIterator->MoveToNext(); - } - pWidgetAccIterator->Release(); - m_pXFADocView->UpdateDocView(); -} - -FX_BOOL CPDFXFA_Document::SubmitData(IXFA_Doc* hDoc, CXFA_Submit submit) { - if (!_NotifySubmit(TRUE)) - return FALSE; - if (NULL == m_pXFADocView) - return FALSE; - m_pXFADocView->UpdateDocView(); - - FX_BOOL ret = _SubmitData(hDoc, submit); - _NotifySubmit(FALSE); - return ret; -} - -IFX_FileRead* CPDFXFA_Document::OpenLinkedFile(IXFA_Doc* hDoc, - const CFX_WideString& wsLink) { - CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv(); - if (pEnv == NULL) - return FALSE; - CFX_ByteString bs = wsLink.UTF16LE_Encode(); - int len = bs.GetLength() / sizeof(unsigned short); - FPDF_FILEHANDLER* pFileHandler = pEnv->FFI_OpenFile( - 0, (FPDF_WIDESTRING)bs.GetBuffer(len * sizeof(unsigned short)), "rb"); - bs.ReleaseBuffer(len * sizeof(unsigned short)); - - if (pFileHandler == NULL) - return NULL; - return new CFPDF_FileStream(pFileHandler); -} -FX_BOOL CPDFXFA_Document::_ExportSubmitFile(FPDF_FILEHANDLER* pFileHandler, - int fileType, - FPDF_DWORD encodeType, - FPDF_DWORD flag) { - if (NULL == m_pXFADocView) - return FALSE; - IXFA_DocHandler* pDocHandler = m_pApp->GetXFAApp()->GetDocHandler(); - CFX_ByteString content; - - CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv(); - if (pEnv == NULL) - return FALSE; - - CFPDF_FileStream fileStream(pFileHandler); - - if (fileType == FXFA_SAVEAS_XML) { - CFX_WideString ws; - ws.FromLocal("data"); - CFX_ByteString content = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n"; - fileStream.WriteBlock((const FX_CHAR*)content, 0, content.GetLength()); - pDocHandler->SavePackage(m_pXFADoc, ws, &fileStream); - } else if (fileType == FXFA_SAVEAS_XDP) { - if (flag == 0) - flag = FXFA_CONFIG | FXFA_TEMPLATE | FXFA_LOCALESET | FXFA_DATASETS | - FXFA_XMPMETA | FXFA_XFDF | FXFA_FORM; - if (m_pPDFDoc == NULL) { - fileStream.Flush(); - return FALSE; - } - CPDF_Dictionary* pRoot = m_pPDFDoc->GetRoot(); - if (pRoot == NULL) { - fileStream.Flush(); - return FALSE; - } - CPDF_Dictionary* pAcroForm = pRoot->GetDictBy("AcroForm"); - if (NULL == pAcroForm) { - fileStream.Flush(); - return FALSE; - } - CPDF_Object* pXFA = pAcroForm->GetElement("XFA"); - if (pXFA == NULL) { - fileStream.Flush(); - return FALSE; - } - if (!pXFA->IsArray()) { - fileStream.Flush(); - return FALSE; - } - CPDF_Array* pArray = pXFA->GetArray(); - if (NULL == pArray) { - fileStream.Flush(); - return FALSE; - } - int size = pArray->GetCount(); - for (int i = 1; i < size; i += 2) { - CPDF_Object* pPDFObj = pArray->GetElement(i); - CPDF_Object* pPrePDFObj = pArray->GetElement(i - 1); - if (!pPrePDFObj->IsString()) - continue; - if (!pPDFObj->IsReference()) - continue; - CPDF_Object* pDirectObj = pPDFObj->GetDirect(); - if (!pDirectObj->IsStream()) - continue; - if (pPrePDFObj->GetString() == "config" && !(flag & FXFA_CONFIG)) - continue; - if (pPrePDFObj->GetString() == "template" && !(flag & FXFA_TEMPLATE)) - continue; - if (pPrePDFObj->GetString() == "localeSet" && !(flag & FXFA_LOCALESET)) - continue; - if (pPrePDFObj->GetString() == "datasets" && !(flag & FXFA_DATASETS)) - continue; - if (pPrePDFObj->GetString() == "xmpmeta" && !(flag & FXFA_XMPMETA)) - continue; - if (pPrePDFObj->GetString() == "xfdf" && !(flag & FXFA_XFDF)) - continue; - if (pPrePDFObj->GetString() == "form" && !(flag & FXFA_FORM)) - continue; - if (pPrePDFObj->GetString() == "form") { - CFX_WideString ws; - ws.FromLocal("form"); - pDocHandler->SavePackage(m_pXFADoc, ws, &fileStream); - } else if (pPrePDFObj->GetString() == "datasets") { - CFX_WideString ws; - ws.FromLocal("datasets"); - pDocHandler->SavePackage(m_pXFADoc, ws, &fileStream); - } else { - // PDF,creator. - } - } - } - return TRUE; -} - -void CPDFXFA_Document::_ClearChangeMark() { - if (m_pSDKDoc) - m_pSDKDoc->ClearChangeMark(); -} - -void CPDFXFA_Document::_ToXFAContentFlags(CFX_WideString csSrcContent, - FPDF_DWORD& flag) { - if (csSrcContent.Find(L" config ", 0) != -1) - flag |= FXFA_CONFIG; - if (csSrcContent.Find(L" template ", 0) != -1) - flag |= FXFA_TEMPLATE; - if (csSrcContent.Find(L" localeSet ", 0) != -1) - flag |= FXFA_LOCALESET; - if (csSrcContent.Find(L" datasets ", 0) != -1) - flag |= FXFA_DATASETS; - if (csSrcContent.Find(L" xmpmeta ", 0) != -1) - flag |= FXFA_XMPMETA; - if (csSrcContent.Find(L" xfdf ", 0) != -1) - flag |= FXFA_XFDF; - if (csSrcContent.Find(L" form ", 0) != -1) - flag |= FXFA_FORM; - if (flag == 0) - flag = FXFA_CONFIG | FXFA_TEMPLATE | FXFA_LOCALESET | FXFA_DATASETS | - FXFA_XMPMETA | FXFA_XFDF | FXFA_FORM; -} -FX_BOOL CPDFXFA_Document::_MailToInfo(CFX_WideString& csURL, - CFX_WideString& csToAddress, - CFX_WideString& csCCAddress, - CFX_WideString& csBCCAddress, - CFX_WideString& csSubject, - CFX_WideString& csMsg) { - CFX_WideString srcURL = csURL; - srcURL.TrimLeft(); - if (0 != srcURL.Left(7).CompareNoCase(L"mailto:")) - return FALSE; - int pos = srcURL.Find(L'?', 0); - CFX_WideString tmp; - if (pos == -1) { - pos = srcURL.Find(L'@', 0); - if (pos == -1) - return FALSE; - - tmp = srcURL.Right(csURL.GetLength() - 7); - tmp.TrimLeft(); - tmp.TrimRight(); - } else { - tmp = srcURL.Left(pos); - tmp = tmp.Right(tmp.GetLength() - 7); - tmp.TrimLeft(); - tmp.TrimRight(); - } - - csToAddress = tmp; - - srcURL = srcURL.Right(srcURL.GetLength() - (pos + 1)); - while (!srcURL.IsEmpty()) { - srcURL.TrimLeft(); - srcURL.TrimRight(); - pos = srcURL.Find(L'&', 0); - if (pos == -1) - tmp = srcURL; - else - tmp = srcURL.Left(pos); - - tmp.TrimLeft(); - tmp.TrimRight(); - if (tmp.GetLength() >= 3 && 0 == tmp.Left(3).CompareNoCase(L"cc=")) { - tmp = tmp.Right(tmp.GetLength() - 3); - if (!csCCAddress.IsEmpty()) - csCCAddress += L';'; - csCCAddress += tmp; - - } else if (tmp.GetLength() >= 4 && - 0 == tmp.Left(4).CompareNoCase(L"bcc=")) { - tmp = tmp.Right(tmp.GetLength() - 4); - if (!csBCCAddress.IsEmpty()) - csBCCAddress += L';'; - csBCCAddress += tmp; - } else if (tmp.GetLength() >= 8 && - 0 == tmp.Left(8).CompareNoCase(L"subject=")) { - tmp = tmp.Right(tmp.GetLength() - 8); - csSubject += tmp; - } else if (tmp.GetLength() >= 5 && - 0 == tmp.Left(5).CompareNoCase(L"body=")) { - tmp = tmp.Right(tmp.GetLength() - 5); - csMsg += tmp; - } - if (pos == -1) - srcURL = L""; - else - srcURL = srcURL.Right(csURL.GetLength() - (pos + 1)); - } - csToAddress.Replace(L",", L";"); - csCCAddress.Replace(L",", L";"); - csBCCAddress.Replace(L",", L";"); - return TRUE; -} - -FX_BOOL CPDFXFA_Document::_SubmitData(IXFA_Doc* hDoc, CXFA_Submit submit) { -#ifdef PDF_ENABLE_XFA - CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv(); - if (!pEnv) - return FALSE; - CFX_WideStringC csURLC; - submit.GetSubmitTarget(csURLC); - CFX_WideString csURL = csURLC; - if (csURL.IsEmpty()) { - CFX_WideString ws; - ws.FromLocal("Submit cancelled."); - CFX_ByteString bs = ws.UTF16LE_Encode(); - int len = bs.GetLength() / sizeof(unsigned short); - pEnv->FFI_Alert((FPDF_WIDESTRING)bs.GetBuffer(len * sizeof(unsigned short)), - (FPDF_WIDESTRING)L"", 0, 4); - bs.ReleaseBuffer(len * sizeof(unsigned short)); - return FALSE; - } - FPDF_BOOL bRet = TRUE; - FPDF_FILEHANDLER* pFileHandler = nullptr; - int fileFlag = -1; - switch (submit.GetSubmitFormat()) { - case XFA_ATTRIBUTEENUM_Xdp: { - CFX_WideStringC csContentC; - submit.GetSubmitXDPContent(csContentC); - CFX_WideString csContent; - csContent = csContentC; - csContent.TrimLeft(); - csContent.TrimRight(); - CFX_WideString space; - space.FromLocal(" "); - csContent = space + csContent + space; - FPDF_DWORD flag = 0; - if (submit.IsSubmitEmbedPDF()) - flag |= FXFA_PDF; - _ToXFAContentFlags(csContent, flag); - pFileHandler = pEnv->FFI_OpenFile(FXFA_SAVEAS_XDP, nullptr, "wb"); - fileFlag = FXFA_SAVEAS_XDP; - _ExportSubmitFile(pFileHandler, FXFA_SAVEAS_XDP, 0, flag); - break; - } - case XFA_ATTRIBUTEENUM_Xml: - pFileHandler = pEnv->FFI_OpenFile(FXFA_SAVEAS_XML, nullptr, "wb"); - fileFlag = FXFA_SAVEAS_XML; - _ExportSubmitFile(pFileHandler, FXFA_SAVEAS_XML, 0); - break; - case XFA_ATTRIBUTEENUM_Pdf: - break; - case XFA_ATTRIBUTEENUM_Urlencoded: - pFileHandler = pEnv->FFI_OpenFile(FXFA_SAVEAS_XML, nullptr, "wb"); - fileFlag = FXFA_SAVEAS_XML; - _ExportSubmitFile(pFileHandler, FXFA_SAVEAS_XML, 0); - break; - default: - return false; - } - if (!pFileHandler) - return FALSE; - if (0 == csURL.Left(7).CompareNoCase(L"mailto:")) { - CFX_WideString csToAddress; - CFX_WideString csCCAddress; - CFX_WideString csBCCAddress; - CFX_WideString csSubject; - CFX_WideString csMsg; - bRet = _MailToInfo(csURL, csToAddress, csCCAddress, csBCCAddress, csSubject, - csMsg); - if (!bRet) - return FALSE; - CFX_ByteString bsTo = CFX_WideString(csToAddress).UTF16LE_Encode(); - CFX_ByteString bsCC = CFX_WideString(csCCAddress).UTF16LE_Encode(); - CFX_ByteString bsBcc = CFX_WideString(csBCCAddress).UTF16LE_Encode(); - CFX_ByteString bsSubject = CFX_WideString(csSubject).UTF16LE_Encode(); - CFX_ByteString bsMsg = CFX_WideString(csMsg).UTF16LE_Encode(); - FPDF_WIDESTRING pTo = (FPDF_WIDESTRING)bsTo.GetBuffer(bsTo.GetLength()); - FPDF_WIDESTRING pCC = (FPDF_WIDESTRING)bsCC.GetBuffer(bsCC.GetLength()); - FPDF_WIDESTRING pBcc = (FPDF_WIDESTRING)bsBcc.GetBuffer(bsBcc.GetLength()); - FPDF_WIDESTRING pSubject = - (FPDF_WIDESTRING)bsSubject.GetBuffer(bsSubject.GetLength()); - FPDF_WIDESTRING pMsg = (FPDF_WIDESTRING)bsMsg.GetBuffer(bsMsg.GetLength()); - pEnv->FFI_EmailTo(pFileHandler, pTo, pSubject, pCC, pBcc, pMsg); - bsTo.ReleaseBuffer(); - bsCC.ReleaseBuffer(); - bsBcc.ReleaseBuffer(); - bsSubject.ReleaseBuffer(); - bsMsg.ReleaseBuffer(); - } else { - // HTTP or FTP - CFX_WideString ws; - CFX_ByteString bs = csURL.UTF16LE_Encode(); - int len = bs.GetLength() / sizeof(unsigned short); - pEnv->FFI_UploadTo( - pFileHandler, fileFlag, - (FPDF_WIDESTRING)bs.GetBuffer(len * sizeof(unsigned short))); - bs.ReleaseBuffer(len * sizeof(unsigned short)); - } - return bRet; -#else - return TRUE; -#endif -} - -FX_BOOL CPDFXFA_Document::SetGlobalProperty(IXFA_Doc* hDoc, - const CFX_ByteStringC& szPropName, - FXJSE_HVALUE hValue) { - if (hDoc != m_pXFADoc) - return FALSE; - - if (m_pSDKDoc && m_pSDKDoc->GetEnv()->GetJSRuntime()) - return m_pSDKDoc->GetEnv()->GetJSRuntime()->SetHValueByName(szPropName, - hValue); - return FALSE; -} -FX_BOOL CPDFXFA_Document::GetPDFScriptObject(IXFA_Doc* hDoc, - const CFX_ByteStringC& utf8Name, - FXJSE_HVALUE hValue) { - if (hDoc != m_pXFADoc) - return FALSE; - - if (!m_pSDKDoc || !m_pSDKDoc->GetEnv()->GetJSRuntime()) - return FALSE; - - if (!m_pJSContext) { - m_pSDKDoc->GetEnv()->GetJSRuntime()->SetReaderDocument(m_pSDKDoc); - m_pJSContext = m_pSDKDoc->GetEnv()->GetJSRuntime()->NewContext(); - } - - return _GetHValueByName(utf8Name, hValue, - m_pSDKDoc->GetEnv()->GetJSRuntime()); -} -FX_BOOL CPDFXFA_Document::GetGlobalProperty(IXFA_Doc* hDoc, - const CFX_ByteStringC& szPropName, - FXJSE_HVALUE hValue) { - if (hDoc != m_pXFADoc) - return FALSE; - if (!m_pSDKDoc || !m_pSDKDoc->GetEnv()->GetJSRuntime()) - return FALSE; - - if (!m_pJSContext) { - m_pSDKDoc->GetEnv()->GetJSRuntime()->SetReaderDocument(m_pSDKDoc); - m_pJSContext = m_pSDKDoc->GetEnv()->GetJSRuntime()->NewContext(); - } - - return _GetHValueByName(szPropName, hValue, - m_pSDKDoc->GetEnv()->GetJSRuntime()); -} -FX_BOOL CPDFXFA_Document::_GetHValueByName(const CFX_ByteStringC& utf8Name, - FXJSE_HVALUE hValue, - IJS_Runtime* runTime) { - return runTime->GetHValueByName(utf8Name, hValue); -} diff --git a/fpdfsdk/src/fpdfxfa/fpdfxfa_page.cpp b/fpdfsdk/src/fpdfxfa/fpdfxfa_page.cpp deleted file mode 100644 index 0210ac1c08..0000000000 --- a/fpdfsdk/src/fpdfxfa/fpdfxfa_page.cpp +++ /dev/null @@ -1,248 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "core/include/fpdfapi/cpdf_document.h" -#include "fpdfsdk/include/fpdfxfa/fpdfxfa_doc.h" -#include "fpdfsdk/include/fpdfxfa/fpdfxfa_page.h" -#include "fpdfsdk/include/fpdfxfa/fpdfxfa_util.h" -#include "fpdfsdk/include/fsdk_define.h" -#include "fpdfsdk/include/fsdk_mgr.h" - -CPDFXFA_Page::CPDFXFA_Page(CPDFXFA_Document* pDoc, int page_index) - : m_pPDFPage(NULL), - m_pXFAPageView(NULL), - m_iPageIndex(page_index), - m_pDocument(pDoc), - m_iRef(1) {} - -CPDFXFA_Page::~CPDFXFA_Page() { - if (m_pPDFPage) - delete m_pPDFPage; - m_pPDFPage = NULL; - m_pXFAPageView = NULL; -} - -void CPDFXFA_Page::Release() { - m_iRef--; - if (m_iRef > 0) - return; - - if (m_pDocument) - m_pDocument->RemovePage(this); - - delete this; -} - -FX_BOOL CPDFXFA_Page::LoadPDFPage() { - if (!m_pDocument) - return FALSE; - CPDF_Document* pPDFDoc = m_pDocument->GetPDFDoc(); - if (pPDFDoc) { - CPDF_Dictionary* pDict = pPDFDoc->GetPage(m_iPageIndex); - if (pDict == NULL) - return FALSE; - if (m_pPDFPage) { - if (m_pPDFPage->m_pFormDict == pDict) - return TRUE; - - delete m_pPDFPage; - m_pPDFPage = NULL; - } - - m_pPDFPage = new CPDF_Page; - m_pPDFPage->Load(pPDFDoc, pDict); - m_pPDFPage->ParseContent(nullptr); - return TRUE; - } - - return FALSE; -} - -FX_BOOL CPDFXFA_Page::LoadXFAPageView() { - if (!m_pDocument) - return FALSE; - IXFA_Doc* pXFADoc = m_pDocument->GetXFADoc(); - if (!pXFADoc) - return FALSE; - - IXFA_DocView* pXFADocView = m_pDocument->GetXFADocView(); - if (!pXFADocView) - return FALSE; - - IXFA_PageView* pPageView = pXFADocView->GetPageView(m_iPageIndex); - if (!pPageView) - return FALSE; - - if (m_pXFAPageView == pPageView) - return TRUE; - - m_pXFAPageView = pPageView; - (void)m_pXFAPageView->LoadPageView(nullptr); - return TRUE; -} - -FX_BOOL CPDFXFA_Page::LoadPage() { - if (!m_pDocument || m_iPageIndex < 0) - return FALSE; - - int iDocType = m_pDocument->GetDocType(); - switch (iDocType) { - case DOCTYPE_PDF: - case DOCTYPE_STATIC_XFA: { - return LoadPDFPage(); - } - case DOCTYPE_DYNAMIC_XFA: { - return LoadXFAPageView(); - } - default: - return FALSE; - } - - return FALSE; -} - -FX_BOOL CPDFXFA_Page::LoadPDFPage(CPDF_Dictionary* pageDict) { - if (!m_pDocument || m_iPageIndex < 0 || !pageDict) - return FALSE; - - if (m_pPDFPage) - delete m_pPDFPage; - - m_pPDFPage = new CPDF_Page(); - m_pPDFPage->Load(m_pDocument->GetPDFDoc(), pageDict); - m_pPDFPage->ParseContent(nullptr); - - return TRUE; -} - -FX_FLOAT CPDFXFA_Page::GetPageWidth() { - if (!m_pPDFPage && !m_pXFAPageView) - return 0.0f; - - int nDocType = m_pDocument->GetDocType(); - switch (nDocType) { - case DOCTYPE_DYNAMIC_XFA: { - if (m_pXFAPageView) { - CFX_RectF rect; - m_pXFAPageView->GetPageViewRect(rect); - return rect.width; - } - } break; - case DOCTYPE_STATIC_XFA: - case DOCTYPE_PDF: { - if (m_pPDFPage) - return m_pPDFPage->GetPageWidth(); - } break; - default: - return 0.0f; - } - - return 0.0f; -} - -FX_FLOAT CPDFXFA_Page::GetPageHeight() { - if (!m_pPDFPage && !m_pXFAPageView) - return 0.0f; - - int nDocType = m_pDocument->GetDocType(); - switch (nDocType) { - case DOCTYPE_PDF: - case DOCTYPE_STATIC_XFA: { - if (m_pPDFPage) - return m_pPDFPage->GetPageHeight(); - } break; - case DOCTYPE_DYNAMIC_XFA: { - if (m_pXFAPageView) { - CFX_RectF rect; - m_pXFAPageView->GetPageViewRect(rect); - return rect.height; - } - } break; - default: - return 0.0f; - } - - return 0.0f; -} - -void CPDFXFA_Page::DeviceToPage(int start_x, - int start_y, - int size_x, - int size_y, - int rotate, - int device_x, - int device_y, - double* page_x, - double* page_y) { - if (!m_pPDFPage && !m_pXFAPageView) - return; - - CFX_Matrix page2device; - CFX_Matrix device2page; - FX_FLOAT page_x_f, page_y_f; - - GetDisplayMatrix(page2device, start_x, start_y, size_x, size_y, rotate); - - device2page.SetReverse(page2device); - device2page.Transform((FX_FLOAT)(device_x), (FX_FLOAT)(device_y), page_x_f, - page_y_f); - - *page_x = (page_x_f); - *page_y = (page_y_f); -} - -void CPDFXFA_Page::PageToDevice(int start_x, - int start_y, - int size_x, - int size_y, - int rotate, - double page_x, - double page_y, - int* device_x, - int* device_y) { - if (!m_pPDFPage && !m_pXFAPageView) - return; - - CFX_Matrix page2device; - FX_FLOAT device_x_f, device_y_f; - - GetDisplayMatrix(page2device, start_x, start_y, size_x, size_y, rotate); - - page2device.Transform(((FX_FLOAT)page_x), ((FX_FLOAT)page_y), device_x_f, - device_y_f); - - *device_x = FXSYS_round(device_x_f); - *device_y = FXSYS_round(device_y_f); -} - -void CPDFXFA_Page::GetDisplayMatrix(CFX_Matrix& matrix, - int xPos, - int yPos, - int xSize, - int ySize, - int iRotate) const { - if (!m_pPDFPage && !m_pXFAPageView) - return; - - int nDocType = m_pDocument->GetDocType(); - switch (nDocType) { - case DOCTYPE_DYNAMIC_XFA: { - if (m_pXFAPageView) { - CFX_Rect rect; - rect.Set(xPos, yPos, xSize, ySize); - m_pXFAPageView->GetDisplayMatrix(matrix, rect, iRotate); - } - } break; - case DOCTYPE_PDF: - case DOCTYPE_STATIC_XFA: { - if (m_pPDFPage) { - m_pPDFPage->GetDisplayMatrix(matrix, xPos, yPos, xSize, ySize, iRotate); - } - } break; - default: - return; - } -} diff --git a/fpdfsdk/src/fpdfxfa/fpdfxfa_util.cpp b/fpdfsdk/src/fpdfxfa/fpdfxfa_util.cpp deleted file mode 100644 index 7814d8bd8a..0000000000 --- a/fpdfsdk/src/fpdfxfa/fpdfxfa_util.cpp +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "fpdfsdk/include/fpdfxfa/fpdfxfa_util.h" - -#include <vector> - -#include "fpdfsdk/include/fsdk_define.h" -#include "fpdfsdk/include/fsdk_mgr.h" - -std::vector<CFWL_TimerInfo*>* CXFA_FWLAdapterTimerMgr::s_TimerArray = nullptr; - -FWL_ERR CXFA_FWLAdapterTimerMgr::Start(IFWL_Timer* pTimer, - FX_DWORD dwElapse, - FWL_HTIMER& hTimer, - FX_BOOL bImmediately) { - if (!m_pEnv) - return FWL_ERR_Indefinite; - - uint32_t uIDEvent = m_pEnv->FFI_SetTimer(dwElapse, TimerProc); - if (!s_TimerArray) - s_TimerArray = new std::vector<CFWL_TimerInfo*>; - s_TimerArray->push_back(new CFWL_TimerInfo(uIDEvent, pTimer)); - hTimer = reinterpret_cast<FWL_HTIMER>(s_TimerArray->back()); - return FWL_ERR_Succeeded; -} - -FWL_ERR CXFA_FWLAdapterTimerMgr::Stop(FWL_HTIMER hTimer) { - if (!hTimer || !m_pEnv) - return FWL_ERR_Indefinite; - - CFWL_TimerInfo* pInfo = reinterpret_cast<CFWL_TimerInfo*>(hTimer); - m_pEnv->FFI_KillTimer(pInfo->uIDEvent); - if (s_TimerArray) { - auto it = std::find(s_TimerArray->begin(), s_TimerArray->end(), pInfo); - if (it != s_TimerArray->end()) { - s_TimerArray->erase(it); - delete pInfo; - } - } - return FWL_ERR_Succeeded; -} - -// static -void CXFA_FWLAdapterTimerMgr::TimerProc(int32_t idEvent) { - if (!s_TimerArray) - return; - - for (CFWL_TimerInfo* pInfo : *s_TimerArray) { - if (pInfo->uIDEvent == idEvent) { - pInfo->pTimer->Run(reinterpret_cast<FWL_HTIMER>(pInfo)); - break; - } - } -} diff --git a/fpdfsdk/src/fsdk_actionhandler.cpp b/fpdfsdk/src/fsdk_actionhandler.cpp deleted file mode 100644 index 7bca1b7865..0000000000 --- a/fpdfsdk/src/fsdk_actionhandler.cpp +++ /dev/null @@ -1,640 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "fpdfsdk/include/fsdk_actionhandler.h" - -#include <set> - -#include "core/include/fpdfapi/cpdf_array.h" -#include "fpdfsdk/include/fsdk_define.h" -#include "fpdfsdk/include/fsdk_mgr.h" -#include "fpdfsdk/include/javascript/IJavaScript.h" -#include "third_party/base/stl_util.h" - -CPDFSDK_ActionHandler::CPDFSDK_ActionHandler() - : m_pFormActionHandler(new CPDFSDK_FormActionHandler) { -} - -FX_BOOL CPDFSDK_ActionHandler::DoAction_DocOpen(const CPDF_Action& action, - CPDFSDK_Document* pDocument) { - std::set<CPDF_Dictionary*> visited; - return ExecuteDocumentOpenAction(action, pDocument, &visited); -} - -FX_BOOL CPDFSDK_ActionHandler::DoAction_JavaScript( - const CPDF_Action& JsAction, - CFX_WideString csJSName, - CPDFSDK_Document* pDocument) { - if (JsAction.GetType() == CPDF_Action::JavaScript) { - CFX_WideString swJS = JsAction.GetJavaScript(); - if (!swJS.IsEmpty()) { - RunDocumentOpenJavaScript(pDocument, csJSName, swJS); - return TRUE; - } - } - - return FALSE; -} - -FX_BOOL CPDFSDK_ActionHandler::DoAction_FieldJavaScript( - const CPDF_Action& JsAction, - CPDF_AAction::AActionType type, - CPDFSDK_Document* pDocument, - CPDF_FormField* pFormField, - PDFSDK_FieldAction& data) { - CPDFDoc_Environment* pEnv = pDocument->GetEnv(); - ASSERT(pEnv); - if (pEnv->IsJSInitiated() && JsAction.GetType() == CPDF_Action::JavaScript) { - CFX_WideString swJS = JsAction.GetJavaScript(); - if (!swJS.IsEmpty()) { - RunFieldJavaScript(pDocument, pFormField, type, data, swJS); - return TRUE; - } - } - return FALSE; -} - -FX_BOOL CPDFSDK_ActionHandler::DoAction_Page( - const CPDF_Action& action, - enum CPDF_AAction::AActionType eType, - CPDFSDK_Document* pDocument) { - std::set<CPDF_Dictionary*> visited; - return ExecuteDocumentPageAction(action, eType, pDocument, &visited); -} - -FX_BOOL CPDFSDK_ActionHandler::DoAction_Document( - const CPDF_Action& action, - enum CPDF_AAction::AActionType eType, - CPDFSDK_Document* pDocument) { - std::set<CPDF_Dictionary*> visited; - return ExecuteDocumentPageAction(action, eType, pDocument, &visited); -} - -FX_BOOL CPDFSDK_ActionHandler::DoAction_BookMark(CPDF_Bookmark* pBookMark, - const CPDF_Action& action, - CPDF_AAction::AActionType type, - CPDFSDK_Document* pDocument) { - std::set<CPDF_Dictionary*> visited; - return ExecuteBookMark(action, pDocument, pBookMark, &visited); -} - -FX_BOOL CPDFSDK_ActionHandler::DoAction_Screen(const CPDF_Action& action, - CPDF_AAction::AActionType type, - CPDFSDK_Document* pDocument, - CPDFSDK_Annot* pScreen) { - std::set<CPDF_Dictionary*> visited; - return ExecuteScreenAction(action, type, pDocument, pScreen, &visited); -} - -FX_BOOL CPDFSDK_ActionHandler::DoAction_Link(const CPDF_Action& action, - CPDFSDK_Document* pDocument) { - std::set<CPDF_Dictionary*> visited; - return ExecuteLinkAction(action, pDocument, &visited); -} - -FX_BOOL CPDFSDK_ActionHandler::DoAction_Field(const CPDF_Action& action, - CPDF_AAction::AActionType type, - CPDFSDK_Document* pDocument, - CPDF_FormField* pFormField, - PDFSDK_FieldAction& data) { - std::set<CPDF_Dictionary*> visited; - return ExecuteFieldAction(action, type, pDocument, pFormField, data, - &visited); -} - -FX_BOOL CPDFSDK_ActionHandler::ExecuteDocumentOpenAction( - const CPDF_Action& action, - CPDFSDK_Document* pDocument, - std::set<CPDF_Dictionary*>* visited) { - CPDF_Dictionary* pDict = action.GetDict(); - if (pdfium::ContainsKey(*visited, pDict)) - return FALSE; - - visited->insert(pDict); - - CPDFDoc_Environment* pEnv = pDocument->GetEnv(); - ASSERT(pEnv); - if (action.GetType() == CPDF_Action::JavaScript) { - if (pEnv->IsJSInitiated()) { - CFX_WideString swJS = action.GetJavaScript(); - if (!swJS.IsEmpty()) { - RunDocumentOpenJavaScript(pDocument, L"", swJS); - } - } - } else { - DoAction_NoJs(action, pDocument); - } - - for (int32_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) { - CPDF_Action subaction = action.GetSubAction(i); - if (!ExecuteDocumentOpenAction(subaction, pDocument, visited)) - return FALSE; - } - - return TRUE; -} - -FX_BOOL CPDFSDK_ActionHandler::ExecuteLinkAction( - const CPDF_Action& action, - CPDFSDK_Document* pDocument, - std::set<CPDF_Dictionary*>* visited) { - CPDF_Dictionary* pDict = action.GetDict(); - if (pdfium::ContainsKey(*visited, pDict)) - return FALSE; - - visited->insert(pDict); - - CPDFDoc_Environment* pEnv = pDocument->GetEnv(); - ASSERT(pEnv); - if (action.GetType() == CPDF_Action::JavaScript) { - if (pEnv->IsJSInitiated()) { - CFX_WideString swJS = action.GetJavaScript(); - if (!swJS.IsEmpty()) { - IJS_Runtime* pRuntime = pDocument->GetJsRuntime(); - pRuntime->SetReaderDocument(pDocument); - - IJS_Context* pContext = pRuntime->NewContext(); - pContext->OnLink_MouseUp(pDocument); - - CFX_WideString csInfo; - FX_BOOL bRet = pContext->RunScript(swJS, &csInfo); - if (!bRet) { - // FIXME: return error. - } - - pRuntime->ReleaseContext(pContext); - } - } - } else { - DoAction_NoJs(action, pDocument); - } - - for (int32_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) { - CPDF_Action subaction = action.GetSubAction(i); - if (!ExecuteLinkAction(subaction, pDocument, visited)) - return FALSE; - } - - return TRUE; -} - -FX_BOOL CPDFSDK_ActionHandler::ExecuteDocumentPageAction( - const CPDF_Action& action, - CPDF_AAction::AActionType type, - CPDFSDK_Document* pDocument, - std::set<CPDF_Dictionary*>* visited) { - CPDF_Dictionary* pDict = action.GetDict(); - if (pdfium::ContainsKey(*visited, pDict)) - return FALSE; - - visited->insert(pDict); - - CPDFDoc_Environment* pEnv = pDocument->GetEnv(); - ASSERT(pEnv); - if (action.GetType() == CPDF_Action::JavaScript) { - if (pEnv->IsJSInitiated()) { - CFX_WideString swJS = action.GetJavaScript(); - if (!swJS.IsEmpty()) { - RunDocumentPageJavaScript(pDocument, type, swJS); - } - } - } else { - DoAction_NoJs(action, pDocument); - } - - if (!IsValidDocView(pDocument)) - return FALSE; - - for (int32_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) { - CPDF_Action subaction = action.GetSubAction(i); - if (!ExecuteDocumentPageAction(subaction, type, pDocument, visited)) - return FALSE; - } - - return TRUE; -} - -FX_BOOL CPDFSDK_ActionHandler::IsValidField(CPDFSDK_Document* pDocument, - CPDF_Dictionary* pFieldDict) { - ASSERT(pFieldDict); - - CPDFSDK_InterForm* pInterForm = pDocument->GetInterForm(); - CPDF_InterForm* pPDFInterForm = pInterForm->GetInterForm(); - return pPDFInterForm->GetFieldByDict(pFieldDict) != NULL; -} - -FX_BOOL CPDFSDK_ActionHandler::ExecuteFieldAction( - const CPDF_Action& action, - CPDF_AAction::AActionType type, - CPDFSDK_Document* pDocument, - CPDF_FormField* pFormField, - PDFSDK_FieldAction& data, - std::set<CPDF_Dictionary*>* visited) { - CPDF_Dictionary* pDict = action.GetDict(); - if (pdfium::ContainsKey(*visited, pDict)) - return FALSE; - - visited->insert(pDict); - - CPDFDoc_Environment* pEnv = pDocument->GetEnv(); - ASSERT(pEnv); - if (action.GetType() == CPDF_Action::JavaScript) { - if (pEnv->IsJSInitiated()) { - CFX_WideString swJS = action.GetJavaScript(); - if (!swJS.IsEmpty()) { - RunFieldJavaScript(pDocument, pFormField, type, data, swJS); - if (!IsValidField(pDocument, pFormField->GetFieldDict())) - return FALSE; - } - } - } else { - DoAction_NoJs(action, pDocument); - } - - for (int32_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) { - CPDF_Action subaction = action.GetSubAction(i); - if (!ExecuteFieldAction(subaction, type, pDocument, pFormField, data, - visited)) - return FALSE; - } - - return TRUE; -} - -FX_BOOL CPDFSDK_ActionHandler::ExecuteScreenAction( - const CPDF_Action& action, - CPDF_AAction::AActionType type, - CPDFSDK_Document* pDocument, - CPDFSDK_Annot* pScreen, - std::set<CPDF_Dictionary*>* visited) { - CPDF_Dictionary* pDict = action.GetDict(); - if (pdfium::ContainsKey(*visited, pDict)) - return FALSE; - - visited->insert(pDict); - - CPDFDoc_Environment* pEnv = pDocument->GetEnv(); - ASSERT(pEnv); - if (action.GetType() == CPDF_Action::JavaScript) { - if (pEnv->IsJSInitiated()) { - CFX_WideString swJS = action.GetJavaScript(); - if (!swJS.IsEmpty()) { - IJS_Runtime* pRuntime = pDocument->GetJsRuntime(); - pRuntime->SetReaderDocument(pDocument); - - IJS_Context* pContext = pRuntime->NewContext(); - CFX_WideString csInfo; - FX_BOOL bRet = pContext->RunScript(swJS, &csInfo); - if (!bRet) { - // FIXME: return error. - } - - pRuntime->ReleaseContext(pContext); - } - } - } else { - DoAction_NoJs(action, pDocument); - } - - for (int32_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) { - CPDF_Action subaction = action.GetSubAction(i); - if (!ExecuteScreenAction(subaction, type, pDocument, pScreen, visited)) - return FALSE; - } - - return TRUE; -} - -FX_BOOL CPDFSDK_ActionHandler::ExecuteBookMark( - const CPDF_Action& action, - CPDFSDK_Document* pDocument, - CPDF_Bookmark* pBookmark, - std::set<CPDF_Dictionary*>* visited) { - CPDF_Dictionary* pDict = action.GetDict(); - if (pdfium::ContainsKey(*visited, pDict)) - return FALSE; - - visited->insert(pDict); - - CPDFDoc_Environment* pEnv = pDocument->GetEnv(); - ASSERT(pEnv); - if (action.GetType() == CPDF_Action::JavaScript) { - if (pEnv->IsJSInitiated()) { - CFX_WideString swJS = action.GetJavaScript(); - if (!swJS.IsEmpty()) { - IJS_Runtime* pRuntime = pDocument->GetJsRuntime(); - pRuntime->SetReaderDocument(pDocument); - - IJS_Context* pContext = pRuntime->NewContext(); - pContext->OnBookmark_MouseUp(pBookmark); - - CFX_WideString csInfo; - FX_BOOL bRet = pContext->RunScript(swJS, &csInfo); - if (!bRet) { - // FIXME: return error. - } - - pRuntime->ReleaseContext(pContext); - } - } - } else { - DoAction_NoJs(action, pDocument); - } - - for (int32_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) { - CPDF_Action subaction = action.GetSubAction(i); - if (!ExecuteBookMark(subaction, pDocument, pBookmark, visited)) - return FALSE; - } - - return TRUE; -} - -void CPDFSDK_ActionHandler::DoAction_NoJs(const CPDF_Action& action, - CPDFSDK_Document* pDocument) { - ASSERT(pDocument); - - switch (action.GetType()) { - case CPDF_Action::GoTo: - DoAction_GoTo(pDocument, action); - break; - case CPDF_Action::GoToR: - DoAction_GoToR(pDocument, action); - break; - case CPDF_Action::GoToE: - break; - case CPDF_Action::Launch: - DoAction_Launch(pDocument, action); - break; - case CPDF_Action::Thread: - break; - case CPDF_Action::URI: - DoAction_URI(pDocument, action); - break; - case CPDF_Action::Sound: - break; - case CPDF_Action::Movie: - break; - case CPDF_Action::Hide: - if (m_pFormActionHandler) { - m_pFormActionHandler->DoAction_Hide(action, pDocument); - } - break; - case CPDF_Action::Named: - DoAction_Named(pDocument, action); - break; - case CPDF_Action::SubmitForm: - if (m_pFormActionHandler) { - m_pFormActionHandler->DoAction_SubmitForm(action, pDocument); - } - break; - case CPDF_Action::ResetForm: - if (m_pFormActionHandler) { - m_pFormActionHandler->DoAction_ResetForm(action, pDocument); - } - break; - case CPDF_Action::ImportData: - if (m_pFormActionHandler) { - m_pFormActionHandler->DoAction_ImportData(action, pDocument); - } - break; - case CPDF_Action::JavaScript: - ASSERT(FALSE); - break; - case CPDF_Action::SetOCGState: - DoAction_SetOCGState(pDocument, action); - break; - case CPDF_Action::Rendition: - break; - case CPDF_Action::Trans: - break; - case CPDF_Action::GoTo3DView: - break; - default: - break; - } -} - -FX_BOOL CPDFSDK_ActionHandler::IsValidDocView(CPDFSDK_Document* pDocument) { - ASSERT(pDocument); - return TRUE; -} - -void CPDFSDK_ActionHandler::DoAction_GoTo(CPDFSDK_Document* pDocument, - const CPDF_Action& action) { - ASSERT(action.GetDict()); - - CPDF_Document* pPDFDocument = pDocument->GetPDFDocument(); - ASSERT(pPDFDocument); - - CPDF_Dest MyDest = action.GetDest(pPDFDocument); - int nPageIndex = MyDest.GetPageIndex(pPDFDocument); - int nFitType = MyDest.GetZoomMode(); - const CPDF_Array* pMyArray = ToArray(MyDest.GetObject()); - float* pPosAry = nullptr; - int sizeOfAry = 0; - if (pMyArray) { - pPosAry = new float[pMyArray->GetCount()]; - int j = 0; - for (int i = 2; i < (int)pMyArray->GetCount(); i++) { - pPosAry[j++] = pMyArray->GetFloatAt(i); - } - sizeOfAry = j; - } - - CPDFDoc_Environment* pApp = pDocument->GetEnv(); - pApp->FFI_DoGoToAction(nPageIndex, nFitType, pPosAry, sizeOfAry); - delete[] pPosAry; -} - -void CPDFSDK_ActionHandler::DoAction_GoToR(CPDFSDK_Document* pDocument, - const CPDF_Action& action) {} - -void CPDFSDK_ActionHandler::DoAction_Launch(CPDFSDK_Document* pDocument, - const CPDF_Action& action) {} - -void CPDFSDK_ActionHandler::DoAction_URI(CPDFSDK_Document* pDocument, - const CPDF_Action& action) { - ASSERT(action.GetDict()); - - CPDFDoc_Environment* pApp = pDocument->GetEnv(); - CFX_ByteString sURI = action.GetURI(pDocument->GetPDFDocument()); - pApp->FFI_DoURIAction(sURI.c_str()); -} - -void CPDFSDK_ActionHandler::DoAction_Named(CPDFSDK_Document* pDocument, - const CPDF_Action& action) { - ASSERT(action.GetDict()); - - CFX_ByteString csName = action.GetNamedAction(); - pDocument->GetEnv()->FFI_ExecuteNamedAction(csName); -} - -void CPDFSDK_ActionHandler::DoAction_SetOCGState(CPDFSDK_Document* pDocument, - const CPDF_Action& action) {} - -void CPDFSDK_ActionHandler::RunFieldJavaScript(CPDFSDK_Document* pDocument, - CPDF_FormField* pFormField, - CPDF_AAction::AActionType type, - PDFSDK_FieldAction& data, - const CFX_WideString& script) { - ASSERT(type != CPDF_AAction::Calculate); - ASSERT(type != CPDF_AAction::Format); - - IJS_Runtime* pRuntime = pDocument->GetJsRuntime(); - pRuntime->SetReaderDocument(pDocument); - - IJS_Context* pContext = pRuntime->NewContext(); - switch (type) { - case CPDF_AAction::CursorEnter: - pContext->OnField_MouseEnter(data.bModifier, data.bShift, pFormField); - break; - case CPDF_AAction::CursorExit: - pContext->OnField_MouseExit(data.bModifier, data.bShift, pFormField); - break; - case CPDF_AAction::ButtonDown: - pContext->OnField_MouseDown(data.bModifier, data.bShift, pFormField); - break; - case CPDF_AAction::ButtonUp: - pContext->OnField_MouseUp(data.bModifier, data.bShift, pFormField); - break; - case CPDF_AAction::GetFocus: - pContext->OnField_Focus(data.bModifier, data.bShift, pFormField, - data.sValue); - break; - case CPDF_AAction::LoseFocus: - pContext->OnField_Blur(data.bModifier, data.bShift, pFormField, - data.sValue); - break; - case CPDF_AAction::KeyStroke: - pContext->OnField_Keystroke(data.sChange, data.sChangeEx, data.bKeyDown, - data.bModifier, data.nSelEnd, data.nSelStart, - data.bShift, pFormField, data.sValue, - data.bWillCommit, data.bFieldFull, data.bRC); - break; - case CPDF_AAction::Validate: - pContext->OnField_Validate(data.sChange, data.sChangeEx, data.bKeyDown, - data.bModifier, data.bShift, pFormField, - data.sValue, data.bRC); - break; - default: - ASSERT(FALSE); - break; - } - - CFX_WideString csInfo; - FX_BOOL bRet = pContext->RunScript(script, &csInfo); - if (!bRet) { - // FIXME: return error. - } - - pRuntime->ReleaseContext(pContext); -} - -void CPDFSDK_ActionHandler::RunDocumentOpenJavaScript( - CPDFSDK_Document* pDocument, - const CFX_WideString& sScriptName, - const CFX_WideString& script) { - IJS_Runtime* pRuntime = pDocument->GetJsRuntime(); - pRuntime->SetReaderDocument(pDocument); - IJS_Context* pContext = pRuntime->NewContext(); - pContext->OnDoc_Open(pDocument, sScriptName); - - CFX_WideString csInfo; - FX_BOOL bRet = pContext->RunScript(script, &csInfo); - if (!bRet) { - // FIXME: return error. - } - - pRuntime->ReleaseContext(pContext); -} - -void CPDFSDK_ActionHandler::RunDocumentPageJavaScript( - CPDFSDK_Document* pDocument, - CPDF_AAction::AActionType type, - const CFX_WideString& script) { - IJS_Runtime* pRuntime = pDocument->GetJsRuntime(); - pRuntime->SetReaderDocument(pDocument); - - IJS_Context* pContext = pRuntime->NewContext(); - switch (type) { - case CPDF_AAction::OpenPage: - pContext->OnPage_Open(pDocument); - break; - case CPDF_AAction::ClosePage: - pContext->OnPage_Close(pDocument); - break; - case CPDF_AAction::CloseDocument: - pContext->OnDoc_WillClose(pDocument); - break; - case CPDF_AAction::SaveDocument: - pContext->OnDoc_WillSave(pDocument); - break; - case CPDF_AAction::DocumentSaved: - pContext->OnDoc_DidSave(pDocument); - break; - case CPDF_AAction::PrintDocument: - pContext->OnDoc_WillPrint(pDocument); - break; - case CPDF_AAction::DocumentPrinted: - pContext->OnDoc_DidPrint(pDocument); - break; - case CPDF_AAction::PageVisible: - pContext->OnPage_InView(pDocument); - break; - case CPDF_AAction::PageInvisible: - pContext->OnPage_OutView(pDocument); - break; - default: - ASSERT(FALSE); - break; - } - - CFX_WideString csInfo; - FX_BOOL bRet = pContext->RunScript(script, &csInfo); - if (!bRet) { - // FIXME: return error. - } - - pRuntime->ReleaseContext(pContext); -} - -FX_BOOL CPDFSDK_FormActionHandler::DoAction_Hide(const CPDF_Action& action, - CPDFSDK_Document* pDocument) { - CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm(); - if (pInterForm->DoAction_Hide(action)) { - pDocument->SetChangeMark(); - return TRUE; - } - - return FALSE; -} - -FX_BOOL CPDFSDK_FormActionHandler::DoAction_SubmitForm( - const CPDF_Action& action, - CPDFSDK_Document* pDocument) { - CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm(); - return pInterForm->DoAction_SubmitForm(action); -} - -FX_BOOL CPDFSDK_FormActionHandler::DoAction_ResetForm( - const CPDF_Action& action, - CPDFSDK_Document* pDocument) { - CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm(); - return pInterForm->DoAction_ResetForm(action); -} - -FX_BOOL CPDFSDK_FormActionHandler::DoAction_ImportData( - const CPDF_Action& action, - CPDFSDK_Document* pDocument) { - CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm(); - if (pInterForm->DoAction_ImportData(action)) { - pDocument->SetChangeMark(); - return TRUE; - } - - return FALSE; -} diff --git a/fpdfsdk/src/fsdk_annothandler.cpp b/fpdfsdk/src/fsdk_annothandler.cpp deleted file mode 100644 index 989f535e50..0000000000 --- a/fpdfsdk/src/fsdk_annothandler.cpp +++ /dev/null @@ -1,1111 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "fpdfsdk/include/fsdk_annothandler.h" - -#include <algorithm> -#include <vector> - -#include "core/include/fpdfapi/cpdf_document.h" -#include "fpdfsdk/include/formfiller/FFL_FormFiller.h" -#include "fpdfsdk/include/fsdk_define.h" -#include "fpdfsdk/include/fsdk_mgr.h" - -#ifdef PDF_ENABLE_XFA -#include "fpdfsdk/include/fpdfxfa/fpdfxfa_doc.h" -#include "fpdfsdk/include/fpdfxfa/fpdfxfa_page.h" -#include "fpdfsdk/include/fpdfxfa/fpdfxfa_util.h" -#include "xfa/include/fxgraphics/fx_graphics.h" -#endif // PDF_ENABLE_XFA - -CPDFSDK_AnnotHandlerMgr::CPDFSDK_AnnotHandlerMgr(CPDFDoc_Environment* pApp) { - m_pApp = pApp; - - CPDFSDK_BFAnnotHandler* pHandler = new CPDFSDK_BFAnnotHandler(m_pApp); - pHandler->SetFormFiller(m_pApp->GetIFormFiller()); - RegisterAnnotHandler(pHandler); -#ifdef PDF_ENABLE_XFA - CPDFSDK_XFAAnnotHandler* pXFAAnnotHandler = - new CPDFSDK_XFAAnnotHandler(m_pApp); - RegisterAnnotHandler(pXFAAnnotHandler); -#endif // PDF_ENABLE_XFA -} - -CPDFSDK_AnnotHandlerMgr::~CPDFSDK_AnnotHandlerMgr() { - for (int i = 0; i < m_Handlers.GetSize(); i++) { - IPDFSDK_AnnotHandler* pHandler = m_Handlers.GetAt(i); - delete pHandler; - } - m_Handlers.RemoveAll(); - m_mapType2Handler.clear(); -} - -void CPDFSDK_AnnotHandlerMgr::RegisterAnnotHandler( - IPDFSDK_AnnotHandler* pAnnotHandler) { - ASSERT(!GetAnnotHandler(pAnnotHandler->GetType())); - - m_Handlers.Add(pAnnotHandler); - m_mapType2Handler[pAnnotHandler->GetType()] = pAnnotHandler; -} - -void CPDFSDK_AnnotHandlerMgr::UnRegisterAnnotHandler( - IPDFSDK_AnnotHandler* pAnnotHandler) { - m_mapType2Handler.erase(pAnnotHandler->GetType()); - for (int i = 0, sz = m_Handlers.GetSize(); i < sz; i++) { - if (m_Handlers.GetAt(i) == pAnnotHandler) { - m_Handlers.RemoveAt(i); - break; - } - } -} - -CPDFSDK_Annot* CPDFSDK_AnnotHandlerMgr::NewAnnot(CPDF_Annot* pAnnot, - CPDFSDK_PageView* pPageView) { - ASSERT(pPageView); - - if (IPDFSDK_AnnotHandler* pAnnotHandler = - GetAnnotHandler(pAnnot->GetSubType())) { - return pAnnotHandler->NewAnnot(pAnnot, pPageView); - } - - return new CPDFSDK_BAAnnot(pAnnot, pPageView); -} - -#ifdef PDF_ENABLE_XFA -CPDFSDK_Annot* CPDFSDK_AnnotHandlerMgr::NewAnnot(IXFA_Widget* pAnnot, - CPDFSDK_PageView* pPageView) { - ASSERT(pAnnot); - ASSERT(pPageView); - - if (IPDFSDK_AnnotHandler* pAnnotHandler = - GetAnnotHandler(FSDK_XFAWIDGET_TYPENAME)) { - return pAnnotHandler->NewAnnot(pAnnot, pPageView); - } - - return NULL; -} -#endif // PDF_ENABLE_XFA - -void CPDFSDK_AnnotHandlerMgr::ReleaseAnnot(CPDFSDK_Annot* pAnnot) { - if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) { - pAnnotHandler->OnRelease(pAnnot); - pAnnotHandler->ReleaseAnnot(pAnnot); - } else { - delete (CPDFSDK_Annot*)pAnnot; - } -} - -void CPDFSDK_AnnotHandlerMgr::Annot_OnCreate(CPDFSDK_Annot* pAnnot) { - CPDF_Annot* pPDFAnnot = pAnnot->GetPDFAnnot(); - - CPDFSDK_DateTime curTime; - pPDFAnnot->GetAnnotDict()->SetAtString("M", curTime.ToPDFDateTimeString()); - pPDFAnnot->GetAnnotDict()->SetAtNumber("F", 0); - - if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) { - pAnnotHandler->OnCreate(pAnnot); - } -} - -void CPDFSDK_AnnotHandlerMgr::Annot_OnLoad(CPDFSDK_Annot* pAnnot) { - ASSERT(pAnnot); - - if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) { - pAnnotHandler->OnLoad(pAnnot); - } -} - -IPDFSDK_AnnotHandler* CPDFSDK_AnnotHandlerMgr::GetAnnotHandler( - CPDFSDK_Annot* pAnnot) const { - CPDF_Annot* pPDFAnnot = pAnnot->GetPDFAnnot(); - if (pPDFAnnot) - return GetAnnotHandler(pPDFAnnot->GetSubType()); -#ifdef PDF_ENABLE_XFA - if (pAnnot->GetXFAWidget()) - return GetAnnotHandler(FSDK_XFAWIDGET_TYPENAME); -#endif // PDF_ENABLE_XFA - return nullptr; -} - -IPDFSDK_AnnotHandler* CPDFSDK_AnnotHandlerMgr::GetAnnotHandler( - const CFX_ByteString& sType) const { - auto it = m_mapType2Handler.find(sType); - return it != m_mapType2Handler.end() ? it->second : nullptr; -} - -void CPDFSDK_AnnotHandlerMgr::Annot_OnDraw(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - CFX_RenderDevice* pDevice, - CFX_Matrix* pUser2Device, - FX_DWORD dwFlags) { - ASSERT(pAnnot); - - if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) { - pAnnotHandler->OnDraw(pPageView, pAnnot, pDevice, pUser2Device, dwFlags); - } else { -#ifdef PDF_ENABLE_XFA - if (pAnnot->IsXFAField()) - return; -#endif // PDF_ENABLE_XFA - static_cast<CPDFSDK_BAAnnot*>(pAnnot) - ->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, nullptr); - } -} - -FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnLButtonDown( - CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - FX_DWORD nFlags, - const CFX_FloatPoint& point) { - ASSERT(pAnnot); - - if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) { - return pAnnotHandler->OnLButtonDown(pPageView, pAnnot, nFlags, point); - } - return FALSE; -} -FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnLButtonUp( - CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - FX_DWORD nFlags, - const CFX_FloatPoint& point) { - ASSERT(pAnnot); - - if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) { - return pAnnotHandler->OnLButtonUp(pPageView, pAnnot, nFlags, point); - } - return FALSE; -} -FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnLButtonDblClk( - CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - FX_DWORD nFlags, - const CFX_FloatPoint& point) { - ASSERT(pAnnot); - - if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) { - return pAnnotHandler->OnLButtonDblClk(pPageView, pAnnot, nFlags, point); - } - return FALSE; -} -FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnMouseMove( - CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - FX_DWORD nFlags, - const CFX_FloatPoint& point) { - ASSERT(pAnnot); - - if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) { - return pAnnotHandler->OnMouseMove(pPageView, pAnnot, nFlags, point); - } - return FALSE; -} -FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnMouseWheel( - CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - FX_DWORD nFlags, - short zDelta, - const CFX_FloatPoint& point) { - ASSERT(pAnnot); - - if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) { - return pAnnotHandler->OnMouseWheel(pPageView, pAnnot, nFlags, zDelta, - point); - } - return FALSE; -} -FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnRButtonDown( - CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - FX_DWORD nFlags, - const CFX_FloatPoint& point) { - ASSERT(pAnnot); - - if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) { - return pAnnotHandler->OnRButtonDown(pPageView, pAnnot, nFlags, point); - } - return FALSE; -} -FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnRButtonUp( - CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - FX_DWORD nFlags, - const CFX_FloatPoint& point) { - ASSERT(pAnnot); - - if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) { - return pAnnotHandler->OnRButtonUp(pPageView, pAnnot, nFlags, point); - } - return FALSE; -} - -void CPDFSDK_AnnotHandlerMgr::Annot_OnMouseEnter(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - FX_DWORD nFlag) { - ASSERT(pAnnot); - - if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) - pAnnotHandler->OnMouseEnter(pPageView, pAnnot, nFlag); -} - -void CPDFSDK_AnnotHandlerMgr::Annot_OnMouseExit(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - FX_DWORD nFlag) { - ASSERT(pAnnot); - - if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) - pAnnotHandler->OnMouseExit(pPageView, pAnnot, nFlag); -} - -FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnChar(CPDFSDK_Annot* pAnnot, - FX_DWORD nChar, - FX_DWORD nFlags) { - if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) { - return pAnnotHandler->OnChar(pAnnot, nChar, nFlags); - } - return FALSE; -} - -FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnKeyDown(CPDFSDK_Annot* pAnnot, - int nKeyCode, - int nFlag) { - if (!m_pApp->FFI_IsCTRLKeyDown(nFlag) && !m_pApp->FFI_IsALTKeyDown(nFlag)) { - CPDFSDK_PageView* pPage = pAnnot->GetPageView(); - CPDFSDK_Annot* pFocusAnnot = pPage->GetFocusAnnot(); - if (pFocusAnnot && (nKeyCode == FWL_VKEY_Tab)) { - CPDFSDK_Annot* pNext = - GetNextAnnot(pFocusAnnot, !m_pApp->FFI_IsSHIFTKeyDown(nFlag)); - - if (pNext && pNext != pFocusAnnot) { - CPDFSDK_Document* pDocument = pPage->GetSDKDocument(); - pDocument->SetFocusAnnot(pNext); - return TRUE; - } - } - } - - if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) { - return pAnnotHandler->OnKeyDown(pAnnot, nKeyCode, nFlag); - } - return FALSE; -} -FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnKeyUp(CPDFSDK_Annot* pAnnot, - int nKeyCode, - int nFlag) { - return FALSE; -} - -FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnSetFocus(CPDFSDK_Annot* pAnnot, - FX_DWORD nFlag) { - ASSERT(pAnnot); - - if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) { - if (pAnnotHandler->OnSetFocus(pAnnot, nFlag)) { - CPDFSDK_PageView* pPage = pAnnot->GetPageView(); - pPage->GetSDKDocument(); - return TRUE; - } - } - return FALSE; -} - -FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnKillFocus(CPDFSDK_Annot* pAnnot, - FX_DWORD nFlag) { - ASSERT(pAnnot); - if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) - return pAnnotHandler->OnKillFocus(pAnnot, nFlag); - - return FALSE; -} - -#ifdef PDF_ENABLE_XFA -FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnChangeFocus( - CPDFSDK_Annot* pSetAnnot, - CPDFSDK_Annot* pKillAnnot) { - FX_BOOL bXFA = (pSetAnnot && pSetAnnot->GetXFAWidget()) || - (pKillAnnot && pKillAnnot->GetXFAWidget()); - - if (bXFA) { - if (IPDFSDK_AnnotHandler* pXFAAnnotHandler = - GetAnnotHandler(FSDK_XFAWIDGET_TYPENAME)) - return pXFAAnnotHandler->OnXFAChangedFocus(pKillAnnot, pSetAnnot); - } - - return TRUE; -} -#endif // PDF_ENABLE_XFA - -CFX_FloatRect CPDFSDK_AnnotHandlerMgr::Annot_OnGetViewBBox( - CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot) { - ASSERT(pAnnot); - if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) - return pAnnotHandler->GetViewBBox(pPageView, pAnnot); - - return pAnnot->GetRect(); -} - -FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnHitTest(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - const CFX_FloatPoint& point) { - ASSERT(pAnnot); - if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) { - if (pAnnotHandler->CanAnswer(pAnnot)) - return pAnnotHandler->HitTest(pPageView, pAnnot, point); - } - return FALSE; -} - -CPDFSDK_Annot* CPDFSDK_AnnotHandlerMgr::GetNextAnnot(CPDFSDK_Annot* pSDKAnnot, - FX_BOOL bNext) { -#ifdef PDF_ENABLE_XFA - CPDFSDK_PageView* pPageView = pSDKAnnot->GetPageView(); - CPDFXFA_Page* pPage = pPageView->GetPDFXFAPage(); - if (pPage == NULL) - return NULL; - if (pPage->GetPDFPage()) { // for pdf annots. - CBA_AnnotIterator ai(pSDKAnnot->GetPageView(), pSDKAnnot->GetType(), ""); - CPDFSDK_Annot* pNext = - bNext ? ai.GetNextAnnot(pSDKAnnot) : ai.GetPrevAnnot(pSDKAnnot); - return pNext; - } - // for xfa annots - IXFA_WidgetIterator* pWidgetIterator = - pPage->GetXFAPageView()->CreateWidgetIterator( - XFA_TRAVERSEWAY_Tranvalse, XFA_WIDGETFILTER_Visible | - XFA_WIDGETFILTER_Viewable | - XFA_WIDGETFILTER_Field); - if (pWidgetIterator == NULL) - return NULL; - if (pWidgetIterator->GetCurrentWidget() != pSDKAnnot->GetXFAWidget()) - pWidgetIterator->SetCurrentWidget(pSDKAnnot->GetXFAWidget()); - IXFA_Widget* hNextFocus = NULL; - hNextFocus = - bNext ? pWidgetIterator->MoveToNext() : pWidgetIterator->MoveToPrevious(); - if (!hNextFocus && pSDKAnnot) - hNextFocus = pWidgetIterator->MoveToFirst(); - - pWidgetIterator->Release(); - return pPageView->GetAnnotByXFAWidget(hNextFocus); -#else // PDF_ENABLE_XFA - CBA_AnnotIterator ai(pSDKAnnot->GetPageView(), "Widget", ""); - return bNext ? ai.GetNextAnnot(pSDKAnnot) : ai.GetPrevAnnot(pSDKAnnot); -#endif // PDF_ENABLE_XFA -} - -FX_BOOL CPDFSDK_BFAnnotHandler::CanAnswer(CPDFSDK_Annot* pAnnot) { - ASSERT(pAnnot->GetType() == "Widget"); - if (pAnnot->GetSubType() == BFFT_SIGNATURE) - return FALSE; - - CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot; - if (!pWidget->IsVisible()) - return FALSE; - - int nFieldFlags = pWidget->GetFieldFlags(); - if ((nFieldFlags & FIELDFLAG_READONLY) == FIELDFLAG_READONLY) - return FALSE; - - if (pWidget->GetFieldType() == FIELDTYPE_PUSHBUTTON) - return TRUE; - - CPDF_Page* pPage = pWidget->GetPDFPage(); - CPDF_Document* pDocument = pPage->m_pDocument; - FX_DWORD dwPermissions = pDocument->GetUserPermissions(); - return (dwPermissions & FPDFPERM_FILL_FORM) || - (dwPermissions & FPDFPERM_ANNOT_FORM); -} - -CPDFSDK_Annot* CPDFSDK_BFAnnotHandler::NewAnnot(CPDF_Annot* pAnnot, - CPDFSDK_PageView* pPage) { - CPDFSDK_Document* pSDKDoc = m_pApp->GetSDKDocument(); - CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pSDKDoc->GetInterForm(); - CPDF_FormControl* pCtrl = CPDFSDK_Widget::GetFormControl( - pInterForm->GetInterForm(), pAnnot->GetAnnotDict()); - if (!pCtrl) - return nullptr; - - CPDFSDK_Widget* pWidget = new CPDFSDK_Widget(pAnnot, pPage, pInterForm); - pInterForm->AddMap(pCtrl, pWidget); - CPDF_InterForm* pPDFInterForm = pInterForm->GetInterForm(); - if (pPDFInterForm && pPDFInterForm->NeedConstructAP()) - pWidget->ResetAppearance(nullptr, FALSE); - - return pWidget; -} - -#ifdef PDF_ENABLE_XFA -CPDFSDK_Annot* CPDFSDK_BFAnnotHandler::NewAnnot(IXFA_Widget* hWidget, - CPDFSDK_PageView* pPage) { - return NULL; -} -#endif // PDF_ENABLE_XFA - -void CPDFSDK_BFAnnotHandler::ReleaseAnnot(CPDFSDK_Annot* pAnnot) { - ASSERT(pAnnot); - - if (m_pFormFiller) - m_pFormFiller->OnDelete(pAnnot); - - CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot; - CPDFSDK_InterForm* pInterForm = pWidget->GetInterForm(); - CPDF_FormControl* pCtrol = pWidget->GetFormControl(); - pInterForm->RemoveMap(pCtrol); - - delete pWidget; -} - -void CPDFSDK_BFAnnotHandler::OnDraw(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - CFX_RenderDevice* pDevice, - CFX_Matrix* pUser2Device, - FX_DWORD dwFlags) { - CFX_ByteString sSubType = pAnnot->GetSubType(); - - if (sSubType == BFFT_SIGNATURE) { - static_cast<CPDFSDK_BAAnnot*>(pAnnot) - ->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, nullptr); - } else { - if (m_pFormFiller) { - m_pFormFiller->OnDraw(pPageView, pAnnot, pDevice, pUser2Device, dwFlags); - } - } -} - -void CPDFSDK_BFAnnotHandler::OnMouseEnter(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - FX_DWORD nFlag) { - CFX_ByteString sSubType = pAnnot->GetSubType(); - - if (sSubType == BFFT_SIGNATURE) { - } else { - if (m_pFormFiller) - m_pFormFiller->OnMouseEnter(pPageView, pAnnot, nFlag); - } -} -void CPDFSDK_BFAnnotHandler::OnMouseExit(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - FX_DWORD nFlag) { - CFX_ByteString sSubType = pAnnot->GetSubType(); - - if (sSubType == BFFT_SIGNATURE) { - } else { - if (m_pFormFiller) - m_pFormFiller->OnMouseExit(pPageView, pAnnot, nFlag); - } -} -FX_BOOL CPDFSDK_BFAnnotHandler::OnLButtonDown(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - FX_DWORD nFlags, - const CFX_FloatPoint& point) { - CFX_ByteString sSubType = pAnnot->GetSubType(); - - if (sSubType == BFFT_SIGNATURE) { - } else { - if (m_pFormFiller) - return m_pFormFiller->OnLButtonDown(pPageView, pAnnot, nFlags, point); - } - - return FALSE; -} - -FX_BOOL CPDFSDK_BFAnnotHandler::OnLButtonUp(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - FX_DWORD nFlags, - const CFX_FloatPoint& point) { - CFX_ByteString sSubType = pAnnot->GetSubType(); - - if (sSubType == BFFT_SIGNATURE) { - } else { - if (m_pFormFiller) - return m_pFormFiller->OnLButtonUp(pPageView, pAnnot, nFlags, point); - } - - return FALSE; -} - -FX_BOOL CPDFSDK_BFAnnotHandler::OnLButtonDblClk(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - FX_DWORD nFlags, - const CFX_FloatPoint& point) { - CFX_ByteString sSubType = pAnnot->GetSubType(); - - if (sSubType == BFFT_SIGNATURE) { - } else { - if (m_pFormFiller) - return m_pFormFiller->OnLButtonDblClk(pPageView, pAnnot, nFlags, point); - } - - return FALSE; -} - -FX_BOOL CPDFSDK_BFAnnotHandler::OnMouseMove(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - FX_DWORD nFlags, - const CFX_FloatPoint& point) { - CFX_ByteString sSubType = pAnnot->GetSubType(); - - if (sSubType == BFFT_SIGNATURE) { - } else { - if (m_pFormFiller) - return m_pFormFiller->OnMouseMove(pPageView, pAnnot, nFlags, point); - } - - return FALSE; -} - -FX_BOOL CPDFSDK_BFAnnotHandler::OnMouseWheel(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - FX_DWORD nFlags, - short zDelta, - const CFX_FloatPoint& point) { - CFX_ByteString sSubType = pAnnot->GetSubType(); - - if (sSubType == BFFT_SIGNATURE) { - } else { - if (m_pFormFiller) - return m_pFormFiller->OnMouseWheel(pPageView, pAnnot, nFlags, zDelta, - point); - } - - return FALSE; -} - -FX_BOOL CPDFSDK_BFAnnotHandler::OnRButtonDown(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - FX_DWORD nFlags, - const CFX_FloatPoint& point) { - CFX_ByteString sSubType = pAnnot->GetSubType(); - - if (sSubType == BFFT_SIGNATURE) { - } else { - if (m_pFormFiller) - return m_pFormFiller->OnRButtonDown(pPageView, pAnnot, nFlags, point); - } - - return FALSE; -} -FX_BOOL CPDFSDK_BFAnnotHandler::OnRButtonUp(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - FX_DWORD nFlags, - const CFX_FloatPoint& point) { - CFX_ByteString sSubType = pAnnot->GetSubType(); - - if (sSubType == BFFT_SIGNATURE) { - } else { - if (m_pFormFiller) - return m_pFormFiller->OnRButtonUp(pPageView, pAnnot, nFlags, point); - } - - return FALSE; -} - -FX_BOOL CPDFSDK_BFAnnotHandler::OnChar(CPDFSDK_Annot* pAnnot, - FX_DWORD nChar, - FX_DWORD nFlags) { - CFX_ByteString sSubType = pAnnot->GetSubType(); - - if (sSubType == BFFT_SIGNATURE) { - } else { - if (m_pFormFiller) - return m_pFormFiller->OnChar(pAnnot, nChar, nFlags); - } - - return FALSE; -} - -FX_BOOL CPDFSDK_BFAnnotHandler::OnKeyDown(CPDFSDK_Annot* pAnnot, - int nKeyCode, - int nFlag) { - CFX_ByteString sSubType = pAnnot->GetSubType(); - - if (sSubType == BFFT_SIGNATURE) { - } else { - if (m_pFormFiller) - return m_pFormFiller->OnKeyDown(pAnnot, nKeyCode, nFlag); - } - - return FALSE; -} - -FX_BOOL CPDFSDK_BFAnnotHandler::OnKeyUp(CPDFSDK_Annot* pAnnot, - int nKeyCode, - int nFlag) { - return FALSE; -} -void CPDFSDK_BFAnnotHandler::OnCreate(CPDFSDK_Annot* pAnnot) { - CFX_ByteString sSubType = pAnnot->GetSubType(); - - if (sSubType == BFFT_SIGNATURE) { - } else { - if (m_pFormFiller) - m_pFormFiller->OnCreate(pAnnot); - } -} - -void CPDFSDK_BFAnnotHandler::OnLoad(CPDFSDK_Annot* pAnnot) { - if (pAnnot->GetSubType() == BFFT_SIGNATURE) - return; - - CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot; - if (!pWidget->IsAppearanceValid()) - pWidget->ResetAppearance(NULL, FALSE); - - int nFieldType = pWidget->GetFieldType(); - if (nFieldType == FIELDTYPE_TEXTFIELD || nFieldType == FIELDTYPE_COMBOBOX) { - FX_BOOL bFormated = FALSE; - CFX_WideString sValue = pWidget->OnFormat(bFormated); - if (bFormated && nFieldType == FIELDTYPE_COMBOBOX) { - pWidget->ResetAppearance(sValue.c_str(), FALSE); - } - } - -#ifdef PDF_ENABLE_XFA - CPDFSDK_PageView* pPageView = pAnnot->GetPageView(); - CPDFSDK_Document* pSDKDoc = pPageView->GetSDKDocument(); - CPDFXFA_Document* pDoc = pSDKDoc->GetXFADocument(); - if (pDoc->GetDocType() == DOCTYPE_STATIC_XFA) { - if (!pWidget->IsAppearanceValid() && !pWidget->GetValue().IsEmpty()) - pWidget->ResetAppearance(FALSE); - } -#endif // PDF_ENABLE_XFA - if (m_pFormFiller) - m_pFormFiller->OnLoad(pAnnot); -} - -FX_BOOL CPDFSDK_BFAnnotHandler::OnSetFocus(CPDFSDK_Annot* pAnnot, - FX_DWORD nFlag) { - CFX_ByteString sSubType = pAnnot->GetSubType(); - - if (sSubType == BFFT_SIGNATURE) { - } else { - if (m_pFormFiller) - return m_pFormFiller->OnSetFocus(pAnnot, nFlag); - } - - return TRUE; -} -FX_BOOL CPDFSDK_BFAnnotHandler::OnKillFocus(CPDFSDK_Annot* pAnnot, - FX_DWORD nFlag) { - CFX_ByteString sSubType = pAnnot->GetSubType(); - - if (sSubType == BFFT_SIGNATURE) { - } else { - if (m_pFormFiller) - return m_pFormFiller->OnKillFocus(pAnnot, nFlag); - } - - return TRUE; -} - -CFX_FloatRect CPDFSDK_BFAnnotHandler::GetViewBBox(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot) { - CFX_ByteString sSubType = pAnnot->GetSubType(); - if (sSubType != BFFT_SIGNATURE && m_pFormFiller) - return CFX_FloatRect(m_pFormFiller->GetViewBBox(pPageView, pAnnot)); - - return CFX_FloatRect(0, 0, 0, 0); -} - -FX_BOOL CPDFSDK_BFAnnotHandler::HitTest(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - const CFX_FloatPoint& point) { - ASSERT(pPageView); - ASSERT(pAnnot); - - CFX_FloatRect rect = GetViewBBox(pPageView, pAnnot); - return rect.Contains(point.x, point.y); -} - -#ifdef PDF_ENABLE_XFA -#define FWL_WGTHITTEST_Unknown 0 -#define FWL_WGTHITTEST_Client 1 // arrow -#define FWL_WGTHITTEST_Titlebar 11 // caption -#define FWL_WGTHITTEST_HScrollBar 15 -#define FWL_WGTHITTEST_VScrollBar 16 -#define FWL_WGTHITTEST_Border 17 -#define FWL_WGTHITTEST_Edit 19 -#define FWL_WGTHITTEST_HyperLink 20 - -CPDFSDK_XFAAnnotHandler::CPDFSDK_XFAAnnotHandler(CPDFDoc_Environment* pApp) - : m_pApp(pApp) {} - -CPDFSDK_Annot* CPDFSDK_XFAAnnotHandler::NewAnnot(IXFA_Widget* pAnnot, - CPDFSDK_PageView* pPage) { - CPDFSDK_Document* pSDKDoc = m_pApp->GetSDKDocument(); - CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pSDKDoc->GetInterForm(); - CPDFSDK_XFAWidget* pWidget = new CPDFSDK_XFAWidget(pAnnot, pPage, pInterForm); - pInterForm->AddXFAMap(pAnnot, pWidget); - return pWidget; -} - -FX_BOOL CPDFSDK_XFAAnnotHandler::CanAnswer(CPDFSDK_Annot* pAnnot) { - return pAnnot->GetXFAWidget() != NULL; -} - -void CPDFSDK_XFAAnnotHandler::OnDraw(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - CFX_RenderDevice* pDevice, - CFX_Matrix* pUser2Device, - FX_DWORD dwFlags) { - ASSERT(pPageView != NULL); - ASSERT(pAnnot != NULL); - - CPDFSDK_Document* pSDKDoc = pPageView->GetSDKDocument(); - IXFA_WidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); - - CFX_Graphics gs; - gs.Create(pDevice); - - CFX_Matrix mt; - mt = *(CFX_Matrix*)pUser2Device; - - FX_BOOL bIsHighlight = FALSE; - if (pSDKDoc->GetFocusAnnot() != pAnnot) - bIsHighlight = TRUE; - - pWidgetHandler->RenderWidget(pAnnot->GetXFAWidget(), &gs, &mt, bIsHighlight); - - // to do highlight and shadow -} - -void CPDFSDK_XFAAnnotHandler::ReleaseAnnot(CPDFSDK_Annot* pAnnot) { - CPDFSDK_XFAWidget* pWidget = (CPDFSDK_XFAWidget*)pAnnot; - CPDFSDK_InterForm* pInterForm = pWidget->GetInterForm(); - pInterForm->RemoveXFAMap(pWidget->GetXFAWidget()); - - delete pWidget; -} - -CFX_FloatRect CPDFSDK_XFAAnnotHandler::GetViewBBox(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot) { - ASSERT(pAnnot); - - IXFA_WidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); - CFX_RectF rcBBox; - XFA_ELEMENT eType = - pWidgetHandler->GetDataAcc(pAnnot->GetXFAWidget())->GetUIType(); - if (eType == XFA_ELEMENT_Signature) - pWidgetHandler->GetBBox(pAnnot->GetXFAWidget(), rcBBox, - XFA_WIDGETSTATUS_Visible, TRUE); - else - pWidgetHandler->GetBBox(pAnnot->GetXFAWidget(), rcBBox, 0); - - CFX_FloatRect rcWidget(rcBBox.left, rcBBox.top, rcBBox.left + rcBBox.width, - rcBBox.top + rcBBox.height); - rcWidget.left -= 1.0f; - rcWidget.right += 1.0f; - rcWidget.bottom -= 1.0f; - rcWidget.top += 1.0f; - - return rcWidget; -} - -FX_BOOL CPDFSDK_XFAAnnotHandler::HitTest(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - const CFX_FloatPoint& point) { - if (!pPageView || !pAnnot) - return FALSE; - - CPDFSDK_Document* pSDKDoc = pPageView->GetSDKDocument(); - if (!pSDKDoc) - return FALSE; - - CPDFXFA_Document* pDoc = pSDKDoc->GetXFADocument(); - if (!pDoc) - return FALSE; - - IXFA_DocView* pDocView = pDoc->GetXFADocView(); - if (!pDocView) - return FALSE; - - IXFA_WidgetHandler* pWidgetHandler = pDocView->GetWidgetHandler(); - if (!pWidgetHandler) - return FALSE; - - FX_DWORD dwHitTest = - pWidgetHandler->OnHitTest(pAnnot->GetXFAWidget(), point.x, point.y); - return (dwHitTest != FWL_WGTHITTEST_Unknown); -} - -void CPDFSDK_XFAAnnotHandler::OnMouseEnter(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - FX_DWORD nFlag) { - if (!pPageView || !pAnnot) - return; - IXFA_WidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); - pWidgetHandler->OnMouseEnter(pAnnot->GetXFAWidget()); -} - -void CPDFSDK_XFAAnnotHandler::OnMouseExit(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - FX_DWORD nFlag) { - if (!pPageView || !pAnnot) - return; - - IXFA_WidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); - pWidgetHandler->OnMouseExit(pAnnot->GetXFAWidget()); -} - -FX_BOOL CPDFSDK_XFAAnnotHandler::OnLButtonDown(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - FX_DWORD nFlags, - const CFX_FloatPoint& point) { - if (!pPageView || !pAnnot) - return FALSE; - - IXFA_WidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); - return pWidgetHandler->OnLButtonDown(pAnnot->GetXFAWidget(), - GetFWLFlags(nFlags), point.x, point.y); -} - -FX_BOOL CPDFSDK_XFAAnnotHandler::OnLButtonUp(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - FX_DWORD nFlags, - const CFX_FloatPoint& point) { - if (!pPageView || !pAnnot) - return FALSE; - - IXFA_WidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); - return pWidgetHandler->OnLButtonUp(pAnnot->GetXFAWidget(), - GetFWLFlags(nFlags), point.x, point.y); -} - -FX_BOOL CPDFSDK_XFAAnnotHandler::OnLButtonDblClk(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - FX_DWORD nFlags, - const CFX_FloatPoint& point) { - if (!pPageView || !pAnnot) - return FALSE; - - IXFA_WidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); - return pWidgetHandler->OnLButtonDblClk(pAnnot->GetXFAWidget(), - GetFWLFlags(nFlags), point.x, point.y); -} - -FX_BOOL CPDFSDK_XFAAnnotHandler::OnMouseMove(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - FX_DWORD nFlags, - const CFX_FloatPoint& point) { - if (!pPageView || !pAnnot) - return FALSE; - - IXFA_WidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); - return pWidgetHandler->OnMouseMove(pAnnot->GetXFAWidget(), - GetFWLFlags(nFlags), point.x, point.y); -} - -FX_BOOL CPDFSDK_XFAAnnotHandler::OnMouseWheel(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - FX_DWORD nFlags, - short zDelta, - const CFX_FloatPoint& point) { - if (!pPageView || !pAnnot) - return FALSE; - - IXFA_WidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); - return pWidgetHandler->OnMouseWheel( - pAnnot->GetXFAWidget(), GetFWLFlags(nFlags), zDelta, point.x, point.y); -} - -FX_BOOL CPDFSDK_XFAAnnotHandler::OnRButtonDown(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - FX_DWORD nFlags, - const CFX_FloatPoint& point) { - if (!pPageView || !pAnnot) - return FALSE; - - IXFA_WidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); - return pWidgetHandler->OnRButtonDown(pAnnot->GetXFAWidget(), - GetFWLFlags(nFlags), point.x, point.y); -} - -FX_BOOL CPDFSDK_XFAAnnotHandler::OnRButtonUp(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - FX_DWORD nFlags, - const CFX_FloatPoint& point) { - if (!pPageView || !pAnnot) - return FALSE; - - IXFA_WidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); - return pWidgetHandler->OnRButtonUp(pAnnot->GetXFAWidget(), - GetFWLFlags(nFlags), point.x, point.y); -} - -FX_BOOL CPDFSDK_XFAAnnotHandler::OnRButtonDblClk(CPDFSDK_PageView* pPageView, - CPDFSDK_Annot* pAnnot, - FX_DWORD nFlags, - const CFX_FloatPoint& point) { - if (!pPageView || !pAnnot) - return FALSE; - - IXFA_WidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); - return pWidgetHandler->OnRButtonDblClk(pAnnot->GetXFAWidget(), - GetFWLFlags(nFlags), point.x, point.y); -} - -FX_BOOL CPDFSDK_XFAAnnotHandler::OnChar(CPDFSDK_Annot* pAnnot, - FX_DWORD nChar, - FX_DWORD nFlags) { - if (!pAnnot) - return FALSE; - - IXFA_WidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); - return pWidgetHandler->OnChar(pAnnot->GetXFAWidget(), nChar, - GetFWLFlags(nFlags)); -} - -FX_BOOL CPDFSDK_XFAAnnotHandler::OnKeyDown(CPDFSDK_Annot* pAnnot, - int nKeyCode, - int nFlag) { - if (!pAnnot) - return FALSE; - - IXFA_WidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); - return pWidgetHandler->OnKeyDown(pAnnot->GetXFAWidget(), nKeyCode, - GetFWLFlags(nFlag)); -} - -FX_BOOL CPDFSDK_XFAAnnotHandler::OnKeyUp(CPDFSDK_Annot* pAnnot, - int nKeyCode, - int nFlag) { - if (!pAnnot) - return FALSE; - - IXFA_WidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); - return pWidgetHandler->OnKeyUp(pAnnot->GetXFAWidget(), nKeyCode, - GetFWLFlags(nFlag)); -} - -FX_BOOL CPDFSDK_XFAAnnotHandler::OnSetFocus(CPDFSDK_Annot* pAnnot, - FX_DWORD nFlag) { - return TRUE; -} - -FX_BOOL CPDFSDK_XFAAnnotHandler::OnKillFocus(CPDFSDK_Annot* pAnnot, - FX_DWORD nFlag) { - return TRUE; -} - -FX_BOOL CPDFSDK_XFAAnnotHandler::OnXFAChangedFocus(CPDFSDK_Annot* pOldAnnot, - CPDFSDK_Annot* pNewAnnot) { - IXFA_WidgetHandler* pWidgetHandler = NULL; - - if (pOldAnnot) - pWidgetHandler = GetXFAWidgetHandler(pOldAnnot); - else if (pNewAnnot) - pWidgetHandler = GetXFAWidgetHandler(pNewAnnot); - - if (pWidgetHandler) { - FX_BOOL bRet = TRUE; - IXFA_Widget* hWidget = pNewAnnot ? pNewAnnot->GetXFAWidget() : NULL; - if (hWidget) { - IXFA_PageView* pXFAPageView = pWidgetHandler->GetPageView(hWidget); - if (pXFAPageView) { - bRet = pXFAPageView->GetDocView()->SetFocus(hWidget); - if (pXFAPageView->GetDocView()->GetFocusWidget() == hWidget) - bRet = TRUE; - } - } - return bRet; - } - - return TRUE; -} - -IXFA_WidgetHandler* CPDFSDK_XFAAnnotHandler::GetXFAWidgetHandler( - CPDFSDK_Annot* pAnnot) { - if (!pAnnot) - return NULL; - - CPDFSDK_PageView* pPageView = pAnnot->GetPageView(); - if (!pPageView) - return NULL; - - CPDFSDK_Document* pSDKDoc = pPageView->GetSDKDocument(); - if (!pSDKDoc) - return NULL; - - CPDFXFA_Document* pDoc = pSDKDoc->GetXFADocument(); - if (!pDoc) - return NULL; - - IXFA_DocView* pDocView = pDoc->GetXFADocView(); - if (!pDocView) - return NULL; - - return pDocView->GetWidgetHandler(); -} - -#define FWL_KEYFLAG_Ctrl (1 << 0) -#define FWL_KEYFLAG_Alt (1 << 1) -#define FWL_KEYFLAG_Shift (1 << 2) -#define FWL_KEYFLAG_LButton (1 << 3) -#define FWL_KEYFLAG_RButton (1 << 4) -#define FWL_KEYFLAG_MButton (1 << 5) - -FX_DWORD CPDFSDK_XFAAnnotHandler::GetFWLFlags(FX_DWORD dwFlag) { - FX_DWORD dwFWLFlag = 0; - - if (dwFlag & FWL_EVENTFLAG_ControlKey) - dwFWLFlag |= FWL_KEYFLAG_Ctrl; - if (dwFlag & FWL_EVENTFLAG_LeftButtonDown) - dwFWLFlag |= FWL_KEYFLAG_LButton; - if (dwFlag & FWL_EVENTFLAG_MiddleButtonDown) - dwFWLFlag |= FWL_KEYFLAG_MButton; - if (dwFlag & FWL_EVENTFLAG_RightButtonDown) - dwFWLFlag |= FWL_KEYFLAG_RButton; - if (dwFlag & FWL_EVENTFLAG_ShiftKey) - dwFWLFlag |= FWL_KEYFLAG_Shift; - if (dwFlag & FWL_EVENTFLAG_AltKey) - dwFWLFlag |= FWL_KEYFLAG_Alt; - - return dwFWLFlag; -} -#endif // PDF_ENABLE_XFA - -CPDFSDK_AnnotIterator::CPDFSDK_AnnotIterator(CPDFSDK_PageView* pPageView, - bool bReverse) - : m_bReverse(bReverse), m_pos(0) { - const std::vector<CPDFSDK_Annot*>& annots = pPageView->GetAnnotList(); - m_iteratorAnnotList.insert(m_iteratorAnnotList.begin(), annots.rbegin(), - annots.rend()); - std::stable_sort(m_iteratorAnnotList.begin(), m_iteratorAnnotList.end(), - [](CPDFSDK_Annot* p1, CPDFSDK_Annot* p2) { - return p1->GetLayoutOrder() < p2->GetLayoutOrder(); - }); - - CPDFSDK_Annot* pTopMostAnnot = pPageView->GetFocusAnnot(); - if (!pTopMostAnnot) - return; - - auto it = std::find(m_iteratorAnnotList.begin(), m_iteratorAnnotList.end(), - pTopMostAnnot); - if (it != m_iteratorAnnotList.end()) { - CPDFSDK_Annot* pReaderAnnot = *it; - m_iteratorAnnotList.erase(it); - m_iteratorAnnotList.insert(m_iteratorAnnotList.begin(), pReaderAnnot); - } -} - -CPDFSDK_AnnotIterator::~CPDFSDK_AnnotIterator() { -} - -CPDFSDK_Annot* CPDFSDK_AnnotIterator::NextAnnot() { - if (m_pos < m_iteratorAnnotList.size()) - return m_iteratorAnnotList[m_pos++]; - return nullptr; -} - -CPDFSDK_Annot* CPDFSDK_AnnotIterator::PrevAnnot() { - if (m_pos < m_iteratorAnnotList.size()) - return m_iteratorAnnotList[m_iteratorAnnotList.size() - ++m_pos]; - return nullptr; -} - -CPDFSDK_Annot* CPDFSDK_AnnotIterator::Next() { - return m_bReverse ? PrevAnnot() : NextAnnot(); -} diff --git a/fpdfsdk/src/fsdk_baseannot.cpp b/fpdfsdk/src/fsdk_baseannot.cpp deleted file mode 100644 index 276d302bdd..0000000000 --- a/fpdfsdk/src/fsdk_baseannot.cpp +++ /dev/null @@ -1,968 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include <algorithm> - -#include "core/include/fpdfapi/cpdf_array.h" -#include "core/include/fpdfapi/cpdf_document.h" -#include "core/include/fpdfapi/cpdf_number.h" -#include "core/include/fxcrt/fx_ext.h" -#include "fpdfsdk/include/fsdk_baseannot.h" -#include "fpdfsdk/include/fsdk_define.h" -#include "fpdfsdk/include/fsdk_mgr.h" - -#ifdef PDF_ENABLE_XFA -#include "fpdfsdk/include/fpdfxfa/fpdfxfa_doc.h" -#endif // PDF_ENABLE_XFA - -int gAfxGetTimeZoneInSeconds(int8_t tzhour, uint8_t tzminute) { - return (int)tzhour * 3600 + (int)tzminute * (tzhour >= 0 ? 60 : -60); -} - -FX_BOOL _gAfxIsLeapYear(int16_t year) { - return ((year % 400 == 0) || ((year % 4 == 0) && (year % 100 != 0))); -} - -FX_WORD _gAfxGetYearDays(int16_t year) { - return (_gAfxIsLeapYear(year) == TRUE ? 366 : 365); -} - -uint8_t _gAfxGetMonthDays(int16_t year, uint8_t month) { - uint8_t mDays; - switch (month) { - case 1: - case 3: - case 5: - case 7: - case 8: - case 10: - case 12: - mDays = 31; - break; - - case 4: - case 6: - case 9: - case 11: - mDays = 30; - break; - - case 2: - if (_gAfxIsLeapYear(year) == TRUE) - mDays = 29; - else - mDays = 28; - break; - - default: - mDays = 0; - break; - } - - return mDays; -} - -CPDFSDK_DateTime::CPDFSDK_DateTime() { - ResetDateTime(); -} - -CPDFSDK_DateTime::CPDFSDK_DateTime(const CFX_ByteString& dtStr) { - ResetDateTime(); - - FromPDFDateTimeString(dtStr); -} - -CPDFSDK_DateTime::CPDFSDK_DateTime(const CPDFSDK_DateTime& datetime) { - operator=(datetime); -} - -CPDFSDK_DateTime::CPDFSDK_DateTime(const FX_SYSTEMTIME& st) { - operator=(st); -} - -void CPDFSDK_DateTime::ResetDateTime() { - tzset(); - - time_t curTime; - time(&curTime); - struct tm* newtime = localtime(&curTime); - - dt.year = newtime->tm_year + 1900; - dt.month = newtime->tm_mon + 1; - dt.day = newtime->tm_mday; - dt.hour = newtime->tm_hour; - dt.minute = newtime->tm_min; - dt.second = newtime->tm_sec; -} - -CPDFSDK_DateTime& CPDFSDK_DateTime::operator=( - const CPDFSDK_DateTime& datetime) { - FXSYS_memcpy(&dt, &datetime.dt, sizeof(FX_DATETIME)); - return *this; -} - -CPDFSDK_DateTime& CPDFSDK_DateTime::operator=(const FX_SYSTEMTIME& st) { - tzset(); - - dt.year = (int16_t)st.wYear; - dt.month = (uint8_t)st.wMonth; - dt.day = (uint8_t)st.wDay; - dt.hour = (uint8_t)st.wHour; - dt.minute = (uint8_t)st.wMinute; - dt.second = (uint8_t)st.wSecond; - return *this; -} - -bool CPDFSDK_DateTime::operator==(const CPDFSDK_DateTime& datetime) const { - return (FXSYS_memcmp(&dt, &datetime.dt, sizeof(FX_DATETIME)) == 0); -} - -bool CPDFSDK_DateTime::operator!=(const CPDFSDK_DateTime& datetime) const { - return !(*this == datetime); -} - -bool CPDFSDK_DateTime::operator>(const CPDFSDK_DateTime& datetime) const { - CPDFSDK_DateTime dt1 = ToGMT(); - CPDFSDK_DateTime dt2 = datetime.ToGMT(); - int d1 = - (((int)dt1.dt.year) << 16) | (((int)dt1.dt.month) << 8) | (int)dt1.dt.day; - int d2 = (((int)dt1.dt.hour) << 16) | (((int)dt1.dt.minute) << 8) | - (int)dt1.dt.second; - int d3 = - (((int)dt2.dt.year) << 16) | (((int)dt2.dt.month) << 8) | (int)dt2.dt.day; - int d4 = (((int)dt2.dt.hour) << 16) | (((int)dt2.dt.minute) << 8) | - (int)dt2.dt.second; - - return d1 > d3 || d2 > d4; -} - -bool CPDFSDK_DateTime::operator>=(const CPDFSDK_DateTime& datetime) const { - CPDFSDK_DateTime dt1 = ToGMT(); - CPDFSDK_DateTime dt2 = datetime.ToGMT(); - int d1 = - (((int)dt1.dt.year) << 16) | (((int)dt1.dt.month) << 8) | (int)dt1.dt.day; - int d2 = (((int)dt1.dt.hour) << 16) | (((int)dt1.dt.minute) << 8) | - (int)dt1.dt.second; - int d3 = - (((int)dt2.dt.year) << 16) | (((int)dt2.dt.month) << 8) | (int)dt2.dt.day; - int d4 = (((int)dt2.dt.hour) << 16) | (((int)dt2.dt.minute) << 8) | - (int)dt2.dt.second; - - return d1 >= d3 || d2 >= d4; -} - -bool CPDFSDK_DateTime::operator<(const CPDFSDK_DateTime& datetime) const { - CPDFSDK_DateTime dt1 = ToGMT(); - CPDFSDK_DateTime dt2 = datetime.ToGMT(); - int d1 = - (((int)dt1.dt.year) << 16) | (((int)dt1.dt.month) << 8) | (int)dt1.dt.day; - int d2 = (((int)dt1.dt.hour) << 16) | (((int)dt1.dt.minute) << 8) | - (int)dt1.dt.second; - int d3 = - (((int)dt2.dt.year) << 16) | (((int)dt2.dt.month) << 8) | (int)dt2.dt.day; - int d4 = (((int)dt2.dt.hour) << 16) | (((int)dt2.dt.minute) << 8) | - (int)dt2.dt.second; - - return d1 < d3 || d2 < d4; -} - -bool CPDFSDK_DateTime::operator<=(const CPDFSDK_DateTime& datetime) const { - CPDFSDK_DateTime dt1 = ToGMT(); - CPDFSDK_DateTime dt2 = datetime.ToGMT(); - int d1 = - (((int)dt1.dt.year) << 16) | (((int)dt1.dt.month) << 8) | (int)dt1.dt.day; - int d2 = (((int)dt1.dt.hour) << 16) | (((int)dt1.dt.minute) << 8) | - (int)dt1.dt.second; - int d3 = - (((int)dt2.dt.year) << 16) | (((int)dt2.dt.month) << 8) | (int)dt2.dt.day; - int d4 = (((int)dt2.dt.hour) << 16) | (((int)dt2.dt.minute) << 8) | - (int)dt2.dt.second; - - return d1 <= d3 || d2 <= d4; -} - -CPDFSDK_DateTime::operator time_t() { - struct tm newtime; - - newtime.tm_year = dt.year - 1900; - newtime.tm_mon = dt.month - 1; - newtime.tm_mday = dt.day; - newtime.tm_hour = dt.hour; - newtime.tm_min = dt.minute; - newtime.tm_sec = dt.second; - - return mktime(&newtime); -} - -CPDFSDK_DateTime& CPDFSDK_DateTime::FromPDFDateTimeString( - const CFX_ByteString& dtStr) { - int strLength = dtStr.GetLength(); - if (strLength > 0) { - int i = 0; - int j, k; - FX_CHAR ch; - while (i < strLength && !std::isdigit(dtStr[i])) - ++i; - - if (i >= strLength) - return *this; - - j = 0; - k = 0; - while (i < strLength && j < 4) { - ch = dtStr[i]; - k = k * 10 + FXSYS_toDecimalDigit(ch); - j++; - if (!std::isdigit(ch)) - break; - i++; - } - dt.year = (int16_t)k; - if (i >= strLength || j < 4) - return *this; - - j = 0; - k = 0; - while (i < strLength && j < 2) { - ch = dtStr[i]; - k = k * 10 + FXSYS_toDecimalDigit(ch); - j++; - if (!std::isdigit(ch)) - break; - i++; - } - dt.month = (uint8_t)k; - if (i >= strLength || j < 2) - return *this; - - j = 0; - k = 0; - while (i < strLength && j < 2) { - ch = dtStr[i]; - k = k * 10 + FXSYS_toDecimalDigit(ch); - j++; - if (!std::isdigit(ch)) - break; - i++; - } - dt.day = (uint8_t)k; - if (i >= strLength || j < 2) - return *this; - - j = 0; - k = 0; - while (i < strLength && j < 2) { - ch = dtStr[i]; - k = k * 10 + FXSYS_toDecimalDigit(ch); - j++; - if (!std::isdigit(ch)) - break; - i++; - } - dt.hour = (uint8_t)k; - if (i >= strLength || j < 2) - return *this; - - j = 0; - k = 0; - while (i < strLength && j < 2) { - ch = dtStr[i]; - k = k * 10 + FXSYS_toDecimalDigit(ch); - j++; - if (!std::isdigit(ch)) - break; - i++; - } - dt.minute = (uint8_t)k; - if (i >= strLength || j < 2) - return *this; - - j = 0; - k = 0; - while (i < strLength && j < 2) { - ch = dtStr[i]; - k = k * 10 + FXSYS_toDecimalDigit(ch); - j++; - if (!std::isdigit(ch)) - break; - i++; - } - dt.second = (uint8_t)k; - if (i >= strLength || j < 2) - return *this; - - ch = dtStr[i++]; - if (ch != '-' && ch != '+') - return *this; - if (ch == '-') - dt.tzHour = -1; - else - dt.tzHour = 1; - j = 0; - k = 0; - while (i < strLength && j < 2) { - ch = dtStr[i]; - k = k * 10 + FXSYS_toDecimalDigit(ch); - j++; - if (!std::isdigit(ch)) - break; - i++; - } - dt.tzHour *= (FX_CHAR)k; - if (i >= strLength || j < 2) - return *this; - - ch = dtStr[i++]; - if (ch != '\'') - return *this; - j = 0; - k = 0; - while (i < strLength && j < 2) { - ch = dtStr[i]; - k = k * 10 + FXSYS_toDecimalDigit(ch); - j++; - if (!std::isdigit(ch)) - break; - i++; - } - dt.tzMinute = (uint8_t)k; - if (i >= strLength || j < 2) - return *this; - } - - return *this; -} - -CFX_ByteString CPDFSDK_DateTime::ToCommonDateTimeString() { - CFX_ByteString str1; - str1.Format("%04d-%02d-%02d %02d:%02d:%02d ", dt.year, dt.month, dt.day, - dt.hour, dt.minute, dt.second); - if (dt.tzHour < 0) - str1 += "-"; - else - str1 += "+"; - CFX_ByteString str2; - str2.Format("%02d:%02d", abs(dt.tzHour), dt.tzMinute); - return str1 + str2; -} - -CFX_ByteString CPDFSDK_DateTime::ToPDFDateTimeString() { - CFX_ByteString dtStr; - char tempStr[32]; - memset(tempStr, 0, sizeof(tempStr)); - FXSYS_snprintf(tempStr, sizeof(tempStr) - 1, "D:%04d%02d%02d%02d%02d%02d", - dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second); - dtStr = CFX_ByteString(tempStr); - if (dt.tzHour < 0) - dtStr += CFX_ByteString("-"); - else - dtStr += CFX_ByteString("+"); - memset(tempStr, 0, sizeof(tempStr)); - FXSYS_snprintf(tempStr, sizeof(tempStr) - 1, "%02d'%02d'", abs(dt.tzHour), - dt.tzMinute); - dtStr += CFX_ByteString(tempStr); - return dtStr; -} - -void CPDFSDK_DateTime::ToSystemTime(FX_SYSTEMTIME& st) { - CPDFSDK_DateTime dt = *this; - time_t t = (time_t)dt; - struct tm* pTime = localtime(&t); - if (pTime) { - st.wYear = (FX_WORD)pTime->tm_year + 1900; - st.wMonth = (FX_WORD)pTime->tm_mon + 1; - st.wDay = (FX_WORD)pTime->tm_mday; - st.wDayOfWeek = (FX_WORD)pTime->tm_wday; - st.wHour = (FX_WORD)pTime->tm_hour; - st.wMinute = (FX_WORD)pTime->tm_min; - st.wSecond = (FX_WORD)pTime->tm_sec; - st.wMilliseconds = 0; - } -} - -CPDFSDK_DateTime CPDFSDK_DateTime::ToGMT() const { - CPDFSDK_DateTime dt = *this; - dt.AddSeconds(-gAfxGetTimeZoneInSeconds(dt.dt.tzHour, dt.dt.tzMinute)); - dt.dt.tzHour = 0; - dt.dt.tzMinute = 0; - return dt; -} - -CPDFSDK_DateTime& CPDFSDK_DateTime::AddDays(short days) { - if (days == 0) - return *this; - - int16_t y = dt.year, yy; - uint8_t m = dt.month; - uint8_t d = dt.day; - int mdays, ydays, ldays; - - ldays = days; - if (ldays > 0) { - yy = y; - if (((FX_WORD)m * 100 + d) > 300) - yy++; - ydays = _gAfxGetYearDays(yy); - while (ldays >= ydays) { - y++; - ldays -= ydays; - yy++; - mdays = _gAfxGetMonthDays(y, m); - if (d > mdays) { - m++; - d -= mdays; - } - ydays = _gAfxGetYearDays(yy); - } - mdays = _gAfxGetMonthDays(y, m) - d + 1; - while (ldays >= mdays) { - ldays -= mdays; - m++; - d = 1; - mdays = _gAfxGetMonthDays(y, m); - } - d += ldays; - } else { - ldays *= -1; - yy = y; - if (((FX_WORD)m * 100 + d) < 300) - yy--; - ydays = _gAfxGetYearDays(yy); - while (ldays >= ydays) { - y--; - ldays -= ydays; - yy--; - mdays = _gAfxGetMonthDays(y, m); - if (d > mdays) { - m++; - d -= mdays; - } - ydays = _gAfxGetYearDays(yy); - } - while (ldays >= d) { - ldays -= d; - m--; - mdays = _gAfxGetMonthDays(y, m); - d = mdays; - } - d -= ldays; - } - - dt.year = y; - dt.month = m; - dt.day = d; - - return *this; -} - -CPDFSDK_DateTime& CPDFSDK_DateTime::AddSeconds(int seconds) { - if (seconds == 0) - return *this; - - int n; - int days; - - n = dt.hour * 3600 + dt.minute * 60 + dt.second + seconds; - if (n < 0) { - days = (n - 86399) / 86400; - n -= days * 86400; - } else { - days = n / 86400; - n %= 86400; - } - dt.hour = (uint8_t)(n / 3600); - dt.hour %= 24; - n %= 3600; - dt.minute = (uint8_t)(n / 60); - dt.second = (uint8_t)(n % 60); - if (days != 0) - AddDays(days); - - return *this; -} - -CPDFSDK_Annot::CPDFSDK_Annot(CPDFSDK_PageView* pPageView) - : m_pPageView(pPageView), m_bSelected(FALSE), m_nTabOrder(-1) { -} - -CPDFSDK_BAAnnot::CPDFSDK_BAAnnot(CPDF_Annot* pAnnot, - CPDFSDK_PageView* pPageView) - : CPDFSDK_Annot(pPageView), m_pAnnot(pAnnot) { -} - -CPDF_Annot* CPDFSDK_BAAnnot::GetPDFAnnot() const { - return m_pAnnot; -} - -FX_BOOL CPDFSDK_Annot::IsSelected() { - return m_bSelected; -} - -void CPDFSDK_Annot::SetSelected(FX_BOOL bSelected) { - m_bSelected = bSelected; -} - -// Tab Order -int CPDFSDK_Annot::GetTabOrder() { - return m_nTabOrder; -} - -void CPDFSDK_Annot::SetTabOrder(int iTabOrder) { - m_nTabOrder = iTabOrder; -} - -CPDF_Dictionary* CPDFSDK_BAAnnot::GetAnnotDict() const { - return m_pAnnot->GetAnnotDict(); -} - -void CPDFSDK_BAAnnot::SetRect(const CFX_FloatRect& rect) { - ASSERT(rect.right - rect.left >= GetMinWidth()); - ASSERT(rect.top - rect.bottom >= GetMinHeight()); - - m_pAnnot->GetAnnotDict()->SetAtRect("Rect", rect); -} - -CFX_FloatRect CPDFSDK_BAAnnot::GetRect() const { - CFX_FloatRect rect; - m_pAnnot->GetRect(rect); - return rect; -} - -CFX_ByteString CPDFSDK_BAAnnot::GetType() const { - return m_pAnnot->GetSubType(); -} - -CFX_ByteString CPDFSDK_BAAnnot::GetSubType() const { - return ""; -} - -void CPDFSDK_BAAnnot::DrawAppearance(CFX_RenderDevice* pDevice, - const CFX_Matrix* pUser2Device, - CPDF_Annot::AppearanceMode mode, - const CPDF_RenderOptions* pOptions) { - m_pAnnot->DrawAppearance(m_pPageView->GetPDFPage(), pDevice, pUser2Device, - mode, pOptions); -} - -FX_BOOL CPDFSDK_BAAnnot::IsAppearanceValid() { - return m_pAnnot->GetAnnotDict()->GetDictBy("AP") != NULL; -} - -FX_BOOL CPDFSDK_BAAnnot::IsAppearanceValid(CPDF_Annot::AppearanceMode mode) { - CPDF_Dictionary* pAP = m_pAnnot->GetAnnotDict()->GetDictBy("AP"); - if (!pAP) - return FALSE; - - // Choose the right sub-ap - const FX_CHAR* ap_entry = "N"; - if (mode == CPDF_Annot::Down) - ap_entry = "D"; - else if (mode == CPDF_Annot::Rollover) - ap_entry = "R"; - if (!pAP->KeyExist(ap_entry)) - ap_entry = "N"; - - // Get the AP stream or subdirectory - CPDF_Object* psub = pAP->GetElementValue(ap_entry); - return !!psub; -} - -void CPDFSDK_BAAnnot::DrawBorder(CFX_RenderDevice* pDevice, - const CFX_Matrix* pUser2Device, - const CPDF_RenderOptions* pOptions) { - m_pAnnot->DrawBorder(pDevice, pUser2Device, pOptions); -} - -void CPDFSDK_BAAnnot::ClearCachedAP() { - m_pAnnot->ClearCachedAP(); -} - -void CPDFSDK_BAAnnot::SetContents(const CFX_WideString& sContents) { - if (sContents.IsEmpty()) - m_pAnnot->GetAnnotDict()->RemoveAt("Contents"); - else - m_pAnnot->GetAnnotDict()->SetAtString("Contents", - PDF_EncodeText(sContents)); -} - -CFX_WideString CPDFSDK_BAAnnot::GetContents() const { - return m_pAnnot->GetAnnotDict()->GetUnicodeTextBy("Contents"); -} - -void CPDFSDK_BAAnnot::SetAnnotName(const CFX_WideString& sName) { - if (sName.IsEmpty()) - m_pAnnot->GetAnnotDict()->RemoveAt("NM"); - else - m_pAnnot->GetAnnotDict()->SetAtString("NM", PDF_EncodeText(sName)); -} - -CFX_WideString CPDFSDK_BAAnnot::GetAnnotName() const { - return m_pAnnot->GetAnnotDict()->GetUnicodeTextBy("NM"); -} - -void CPDFSDK_BAAnnot::SetModifiedDate(const FX_SYSTEMTIME& st) { - CPDFSDK_DateTime dt(st); - CFX_ByteString str = dt.ToPDFDateTimeString(); - - if (str.IsEmpty()) - m_pAnnot->GetAnnotDict()->RemoveAt("M"); - else - m_pAnnot->GetAnnotDict()->SetAtString("M", str); -} - -FX_SYSTEMTIME CPDFSDK_BAAnnot::GetModifiedDate() const { - FX_SYSTEMTIME systime; - CFX_ByteString str = m_pAnnot->GetAnnotDict()->GetStringBy("M"); - - CPDFSDK_DateTime dt(str); - dt.ToSystemTime(systime); - - return systime; -} - -void CPDFSDK_BAAnnot::SetFlags(FX_DWORD nFlags) { - m_pAnnot->GetAnnotDict()->SetAtInteger("F", nFlags); -} - -FX_DWORD CPDFSDK_BAAnnot::GetFlags() const { - return m_pAnnot->GetAnnotDict()->GetIntegerBy("F"); -} - -void CPDFSDK_BAAnnot::SetAppState(const CFX_ByteString& str) { - if (str.IsEmpty()) - m_pAnnot->GetAnnotDict()->RemoveAt("AS"); - else - m_pAnnot->GetAnnotDict()->SetAtString("AS", str); -} - -CFX_ByteString CPDFSDK_BAAnnot::GetAppState() const { - return m_pAnnot->GetAnnotDict()->GetStringBy("AS"); -} - -void CPDFSDK_BAAnnot::SetStructParent(int key) { - m_pAnnot->GetAnnotDict()->SetAtInteger("StructParent", key); -} - -int CPDFSDK_BAAnnot::GetStructParent() const { - return m_pAnnot->GetAnnotDict()->GetIntegerBy("StructParent"); -} - -// border -void CPDFSDK_BAAnnot::SetBorderWidth(int nWidth) { - CPDF_Array* pBorder = m_pAnnot->GetAnnotDict()->GetArrayBy("Border"); - - if (pBorder) { - pBorder->SetAt(2, new CPDF_Number(nWidth)); - } else { - CPDF_Dictionary* pBSDict = m_pAnnot->GetAnnotDict()->GetDictBy("BS"); - - if (!pBSDict) { - pBSDict = new CPDF_Dictionary; - m_pAnnot->GetAnnotDict()->SetAt("BS", pBSDict); - } - - pBSDict->SetAtInteger("W", nWidth); - } -} - -int CPDFSDK_BAAnnot::GetBorderWidth() const { - if (CPDF_Array* pBorder = m_pAnnot->GetAnnotDict()->GetArrayBy("Border")) { - return pBorder->GetIntegerAt(2); - } - if (CPDF_Dictionary* pBSDict = m_pAnnot->GetAnnotDict()->GetDictBy("BS")) { - return pBSDict->GetIntegerBy("W", 1); - } - return 1; -} - -void CPDFSDK_BAAnnot::SetBorderStyle(int nStyle) { - CPDF_Dictionary* pBSDict = m_pAnnot->GetAnnotDict()->GetDictBy("BS"); - if (!pBSDict) { - pBSDict = new CPDF_Dictionary; - m_pAnnot->GetAnnotDict()->SetAt("BS", pBSDict); - } - - switch (nStyle) { - case BBS_SOLID: - pBSDict->SetAtName("S", "S"); - break; - case BBS_DASH: - pBSDict->SetAtName("S", "D"); - break; - case BBS_BEVELED: - pBSDict->SetAtName("S", "B"); - break; - case BBS_INSET: - pBSDict->SetAtName("S", "I"); - break; - case BBS_UNDERLINE: - pBSDict->SetAtName("S", "U"); - break; - } -} - -int CPDFSDK_BAAnnot::GetBorderStyle() const { - CPDF_Dictionary* pBSDict = m_pAnnot->GetAnnotDict()->GetDictBy("BS"); - if (pBSDict) { - CFX_ByteString sBorderStyle = pBSDict->GetStringBy("S", "S"); - if (sBorderStyle == "S") - return BBS_SOLID; - if (sBorderStyle == "D") - return BBS_DASH; - if (sBorderStyle == "B") - return BBS_BEVELED; - if (sBorderStyle == "I") - return BBS_INSET; - if (sBorderStyle == "U") - return BBS_UNDERLINE; - } - - CPDF_Array* pBorder = m_pAnnot->GetAnnotDict()->GetArrayBy("Border"); - if (pBorder) { - if (pBorder->GetCount() >= 4) { - CPDF_Array* pDP = pBorder->GetArrayAt(3); - if (pDP && pDP->GetCount() > 0) - return BBS_DASH; - } - } - - return BBS_SOLID; -} - -void CPDFSDK_BAAnnot::SetBorderDash(const CFX_IntArray& array) { - CPDF_Dictionary* pBSDict = m_pAnnot->GetAnnotDict()->GetDictBy("BS"); - if (!pBSDict) { - pBSDict = new CPDF_Dictionary; - m_pAnnot->GetAnnotDict()->SetAt("BS", pBSDict); - } - - CPDF_Array* pArray = new CPDF_Array; - for (int i = 0, sz = array.GetSize(); i < sz; i++) { - pArray->AddInteger(array[i]); - } - - pBSDict->SetAt("D", pArray); -} - -void CPDFSDK_BAAnnot::GetBorderDash(CFX_IntArray& array) const { - CPDF_Array* pDash = NULL; - - CPDF_Array* pBorder = m_pAnnot->GetAnnotDict()->GetArrayBy("Border"); - if (pBorder) { - pDash = pBorder->GetArrayAt(3); - } else { - CPDF_Dictionary* pBSDict = m_pAnnot->GetAnnotDict()->GetDictBy("BS"); - if (pBSDict) { - pDash = pBSDict->GetArrayBy("D"); - } - } - - if (pDash) { - for (int i = 0, sz = pDash->GetCount(); i < sz; i++) { - array.Add(pDash->GetIntegerAt(i)); - } - } -} - -void CPDFSDK_BAAnnot::SetColor(FX_COLORREF color) { - CPDF_Array* pArray = new CPDF_Array; - pArray->AddNumber((FX_FLOAT)FXSYS_GetRValue(color) / 255.0f); - pArray->AddNumber((FX_FLOAT)FXSYS_GetGValue(color) / 255.0f); - pArray->AddNumber((FX_FLOAT)FXSYS_GetBValue(color) / 255.0f); - m_pAnnot->GetAnnotDict()->SetAt("C", pArray); -} - -void CPDFSDK_BAAnnot::RemoveColor() { - m_pAnnot->GetAnnotDict()->RemoveAt("C"); -} - -FX_BOOL CPDFSDK_BAAnnot::GetColor(FX_COLORREF& color) const { - if (CPDF_Array* pEntry = m_pAnnot->GetAnnotDict()->GetArrayBy("C")) { - int nCount = pEntry->GetCount(); - if (nCount == 1) { - FX_FLOAT g = pEntry->GetNumberAt(0) * 255; - - color = FXSYS_RGB((int)g, (int)g, (int)g); - - return TRUE; - } else if (nCount == 3) { - FX_FLOAT r = pEntry->GetNumberAt(0) * 255; - FX_FLOAT g = pEntry->GetNumberAt(1) * 255; - FX_FLOAT b = pEntry->GetNumberAt(2) * 255; - - color = FXSYS_RGB((int)r, (int)g, (int)b); - - return TRUE; - } else if (nCount == 4) { - FX_FLOAT c = pEntry->GetNumberAt(0); - FX_FLOAT m = pEntry->GetNumberAt(1); - FX_FLOAT y = pEntry->GetNumberAt(2); - FX_FLOAT k = pEntry->GetNumberAt(3); - - FX_FLOAT r = 1.0f - std::min(1.0f, c + k); - FX_FLOAT g = 1.0f - std::min(1.0f, m + k); - FX_FLOAT b = 1.0f - std::min(1.0f, y + k); - - color = FXSYS_RGB((int)(r * 255), (int)(g * 255), (int)(b * 255)); - - return TRUE; - } - } - - return FALSE; -} - -void CPDFSDK_BAAnnot::WriteAppearance(const CFX_ByteString& sAPType, - const CFX_FloatRect& rcBBox, - const CFX_Matrix& matrix, - const CFX_ByteString& sContents, - const CFX_ByteString& sAPState) { - CPDF_Dictionary* pAPDict = m_pAnnot->GetAnnotDict()->GetDictBy("AP"); - - if (!pAPDict) { - pAPDict = new CPDF_Dictionary; - m_pAnnot->GetAnnotDict()->SetAt("AP", pAPDict); - } - - CPDF_Stream* pStream = nullptr; - CPDF_Dictionary* pParentDict = nullptr; - - if (sAPState.IsEmpty()) { - pParentDict = pAPDict; - pStream = pAPDict->GetStreamBy(sAPType); - } else { - CPDF_Dictionary* pAPTypeDict = pAPDict->GetDictBy(sAPType); - if (!pAPTypeDict) { - pAPTypeDict = new CPDF_Dictionary; - pAPDict->SetAt(sAPType, pAPTypeDict); - } - - pParentDict = pAPTypeDict; - pStream = pAPTypeDict->GetStreamBy(sAPState); - } - - if (!pStream) { - pStream = new CPDF_Stream(nullptr, 0, nullptr); - - CPDF_Document* pDoc = m_pPageView->GetPDFDocument(); - int32_t objnum = pDoc->AddIndirectObject(pStream); - pParentDict->SetAtReference(sAPType, pDoc, objnum); - } - - CPDF_Dictionary* pStreamDict = pStream->GetDict(); - if (!pStreamDict) { - pStreamDict = new CPDF_Dictionary; - pStreamDict->SetAtName("Type", "XObject"); - pStreamDict->SetAtName("Subtype", "Form"); - pStreamDict->SetAtInteger("FormType", 1); - pStream->InitStream(nullptr, 0, pStreamDict); - } - - if (pStreamDict) { - pStreamDict->SetAtMatrix("Matrix", matrix); - pStreamDict->SetAtRect("BBox", rcBBox); - } - - pStream->SetData((uint8_t*)sContents.c_str(), sContents.GetLength(), FALSE, - FALSE); -} - -#define BA_ANNOT_MINWIDTH 1 -#define BA_ANNOT_MINHEIGHT 1 - -FX_FLOAT CPDFSDK_Annot::GetMinWidth() const { - return BA_ANNOT_MINWIDTH; -} - -FX_FLOAT CPDFSDK_Annot::GetMinHeight() const { - return BA_ANNOT_MINHEIGHT; -} - -FX_BOOL CPDFSDK_BAAnnot::CreateFormFiller() { - return TRUE; -} -FX_BOOL CPDFSDK_BAAnnot::IsVisible() const { - FX_DWORD nFlags = GetFlags(); - return !((nFlags & ANNOTFLAG_INVISIBLE) || (nFlags & ANNOTFLAG_HIDDEN) || - (nFlags & ANNOTFLAG_NOVIEW)); -} - -CPDF_Action CPDFSDK_BAAnnot::GetAction() const { - return CPDF_Action(m_pAnnot->GetAnnotDict()->GetDictBy("A")); -} - -void CPDFSDK_BAAnnot::SetAction(const CPDF_Action& action) { - ASSERT(action.GetDict()); - if (action.GetDict() != m_pAnnot->GetAnnotDict()->GetDictBy("A")) { - CPDF_Document* pDoc = m_pPageView->GetPDFDocument(); - CPDF_Dictionary* pDict = action.GetDict(); - if (pDict && pDict->GetObjNum() == 0) { - pDoc->AddIndirectObject(pDict); - } - m_pAnnot->GetAnnotDict()->SetAtReference("A", pDoc, pDict->GetObjNum()); - } -} - -void CPDFSDK_BAAnnot::RemoveAction() { - m_pAnnot->GetAnnotDict()->RemoveAt("A"); -} - -CPDF_AAction CPDFSDK_BAAnnot::GetAAction() const { - return CPDF_AAction(m_pAnnot->GetAnnotDict()->GetDictBy("AA")); -} - -void CPDFSDK_BAAnnot::SetAAction(const CPDF_AAction& aa) { - if (aa.GetDict() != m_pAnnot->GetAnnotDict()->GetDictBy("AA")) - m_pAnnot->GetAnnotDict()->SetAt("AA", aa.GetDict()); -} - -void CPDFSDK_BAAnnot::RemoveAAction() { - m_pAnnot->GetAnnotDict()->RemoveAt("AA"); -} - -CPDF_Action CPDFSDK_BAAnnot::GetAAction(CPDF_AAction::AActionType eAAT) { - CPDF_AAction AAction = GetAAction(); - - if (AAction.ActionExist(eAAT)) - return AAction.GetAction(eAAT); - - if (eAAT == CPDF_AAction::ButtonUp) - return GetAction(); - - return CPDF_Action(); -} - -#ifdef PDF_ENABLE_XFA -FX_BOOL CPDFSDK_BAAnnot::IsXFAField() { - return FALSE; -} -#endif // PDF_ENABLE_XFA - -void CPDFSDK_BAAnnot::Annot_OnDraw(CFX_RenderDevice* pDevice, - CFX_Matrix* pUser2Device, - CPDF_RenderOptions* pOptions) { - m_pAnnot->GetAPForm(m_pPageView->GetPDFPage(), CPDF_Annot::Normal); - m_pAnnot->DrawAppearance(m_pPageView->GetPDFPage(), pDevice, pUser2Device, - CPDF_Annot::Normal, NULL); -} - -UnderlyingPageType* CPDFSDK_Annot::GetUnderlyingPage() { -#ifdef PDF_ENABLE_XFA - return GetPDFXFAPage(); -#else // PDF_ENABLE_XFA - return GetPDFPage(); -#endif // PDF_ENABLE_XFA -} - -CPDF_Page* CPDFSDK_Annot::GetPDFPage() { - return m_pPageView ? m_pPageView->GetPDFPage() : nullptr; -} - -#ifdef PDF_ENABLE_XFA -CPDFXFA_Page* CPDFSDK_Annot::GetPDFXFAPage() { - return m_pPageView ? m_pPageView->GetPDFXFAPage() : nullptr; -} -#endif // PDF_ENABLE_XFA diff --git a/fpdfsdk/src/fsdk_baseform.cpp b/fpdfsdk/src/fsdk_baseform.cpp deleted file mode 100644 index 89d27726e8..0000000000 --- a/fpdfsdk/src/fsdk_baseform.cpp +++ /dev/null @@ -1,2872 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "fpdfsdk/include/fsdk_baseform.h" - -#include <algorithm> -#include <memory> -#include <vector> - -#include "core/include/fpdfapi/cfdf_document.h" -#include "core/include/fpdfapi/cpdf_array.h" -#include "core/include/fpdfapi/cpdf_document.h" -#include "fpdfsdk/include/formfiller/FFL_FormFiller.h" -#include "fpdfsdk/include/fsdk_actionhandler.h" -#include "fpdfsdk/include/fsdk_baseannot.h" -#include "fpdfsdk/include/fsdk_define.h" -#include "fpdfsdk/include/fsdk_mgr.h" -#include "fpdfsdk/include/javascript/IJavaScript.h" -#include "fpdfsdk/include/pdfwindow/PWL_Utils.h" - -#ifdef PDF_ENABLE_XFA -#include "fpdfsdk/include/fpdfxfa/fpdfxfa_doc.h" -#include "fpdfsdk/include/fpdfxfa/fpdfxfa_util.h" -#endif // PDF_ENABLE_XFA - -#define IsFloatZero(f) ((f) < 0.01 && (f) > -0.01) -#define IsFloatBigger(fa, fb) ((fa) > (fb) && !IsFloatZero((fa) - (fb))) -#define IsFloatSmaller(fa, fb) ((fa) < (fb) && !IsFloatZero((fa) - (fb))) -#define IsFloatEqual(fa, fb) IsFloatZero((fa) - (fb)) - -CPDFSDK_Widget::CPDFSDK_Widget(CPDF_Annot* pAnnot, - CPDFSDK_PageView* pPageView, - CPDFSDK_InterForm* pInterForm) - : CPDFSDK_BAAnnot(pAnnot, pPageView), - m_pInterForm(pInterForm), - m_nAppAge(0), - m_nValueAge(0) -#ifdef PDF_ENABLE_XFA - , - m_hMixXFAWidget(NULL), - m_pWidgetHandler(NULL) -#endif // PDF_ENABLE_XFA -{ -} - -CPDFSDK_Widget::~CPDFSDK_Widget() {} - -#ifdef PDF_ENABLE_XFA -IXFA_Widget* CPDFSDK_Widget::GetMixXFAWidget() const { - CPDFSDK_Document* pSDKDoc = m_pPageView->GetSDKDocument(); - CPDFXFA_Document* pDoc = pSDKDoc->GetXFADocument(); - if (pDoc->GetDocType() == DOCTYPE_STATIC_XFA) { - if (!m_hMixXFAWidget) { - if (IXFA_DocView* pDocView = pDoc->GetXFADocView()) { - CFX_WideString sName; - if (GetFieldType() == FIELDTYPE_RADIOBUTTON) { - sName = GetAnnotName(); - if (sName.IsEmpty()) - sName = GetName(); - } else { - sName = GetName(); - } - - if (!sName.IsEmpty()) - m_hMixXFAWidget = pDocView->GetWidgetByName(sName); - } - } - return m_hMixXFAWidget; - } - - return NULL; -} - -IXFA_Widget* CPDFSDK_Widget::GetGroupMixXFAWidget() { - CPDFSDK_Document* pSDKDoc = m_pPageView->GetSDKDocument(); - CPDFXFA_Document* pDoc = pSDKDoc->GetXFADocument(); - if (pDoc->GetDocType() == DOCTYPE_STATIC_XFA) { - if (IXFA_DocView* pDocView = pDoc->GetXFADocView()) { - CFX_WideString sName = GetName(); - if (!sName.IsEmpty()) - return pDocView->GetWidgetByName(sName); - } - } - - return nullptr; -} - -IXFA_WidgetHandler* CPDFSDK_Widget::GetXFAWidgetHandler() const { - CPDFSDK_Document* pSDKDoc = m_pPageView->GetSDKDocument(); - CPDFXFA_Document* pDoc = pSDKDoc->GetXFADocument(); - if (pDoc->GetDocType() == DOCTYPE_STATIC_XFA) { - if (!m_pWidgetHandler) { - if (IXFA_DocView* pDocView = pDoc->GetXFADocView()) { - m_pWidgetHandler = pDocView->GetWidgetHandler(); - } - } - return m_pWidgetHandler; - } - - return NULL; -} - -static XFA_EVENTTYPE GetXFAEventType(PDFSDK_XFAAActionType eXFAAAT) { - XFA_EVENTTYPE eEventType = XFA_EVENT_Unknown; - - switch (eXFAAAT) { - case PDFSDK_XFA_Click: - eEventType = XFA_EVENT_Click; - break; - case PDFSDK_XFA_Full: - eEventType = XFA_EVENT_Full; - break; - case PDFSDK_XFA_PreOpen: - eEventType = XFA_EVENT_PreOpen; - break; - case PDFSDK_XFA_PostOpen: - eEventType = XFA_EVENT_PostOpen; - break; - } - - return eEventType; -} - -static XFA_EVENTTYPE GetXFAEventType(CPDF_AAction::AActionType eAAT, - FX_BOOL bWillCommit) { - XFA_EVENTTYPE eEventType = XFA_EVENT_Unknown; - - switch (eAAT) { - case CPDF_AAction::CursorEnter: - eEventType = XFA_EVENT_MouseEnter; - break; - case CPDF_AAction::CursorExit: - eEventType = XFA_EVENT_MouseExit; - break; - case CPDF_AAction::ButtonDown: - eEventType = XFA_EVENT_MouseDown; - break; - case CPDF_AAction::ButtonUp: - eEventType = XFA_EVENT_MouseUp; - break; - case CPDF_AAction::GetFocus: - eEventType = XFA_EVENT_Enter; - break; - case CPDF_AAction::LoseFocus: - eEventType = XFA_EVENT_Exit; - break; - case CPDF_AAction::PageOpen: - break; - case CPDF_AAction::PageClose: - break; - case CPDF_AAction::PageVisible: - break; - case CPDF_AAction::PageInvisible: - break; - case CPDF_AAction::KeyStroke: - if (!bWillCommit) { - eEventType = XFA_EVENT_Change; - } - break; - case CPDF_AAction::Validate: - eEventType = XFA_EVENT_Validate; - break; - case CPDF_AAction::OpenPage: - case CPDF_AAction::ClosePage: - case CPDF_AAction::Format: - case CPDF_AAction::Calculate: - case CPDF_AAction::CloseDocument: - case CPDF_AAction::SaveDocument: - case CPDF_AAction::DocumentSaved: - case CPDF_AAction::PrintDocument: - case CPDF_AAction::DocumentPrinted: - break; - } - - return eEventType; -} - -FX_BOOL CPDFSDK_Widget::HasXFAAAction(PDFSDK_XFAAActionType eXFAAAT) { - if (IXFA_Widget* hWidget = GetMixXFAWidget()) { - if (IXFA_WidgetHandler* pXFAWidgetHandler = GetXFAWidgetHandler()) { - XFA_EVENTTYPE eEventType = GetXFAEventType(eXFAAAT); - - if ((eEventType == XFA_EVENT_Click || eEventType == XFA_EVENT_Change) && - GetFieldType() == FIELDTYPE_RADIOBUTTON) { - if (IXFA_Widget* hGroupWidget = GetGroupMixXFAWidget()) { - CXFA_WidgetAcc* pAcc = pXFAWidgetHandler->GetDataAcc(hGroupWidget); - if (pXFAWidgetHandler->HasEvent(pAcc, eEventType)) - return TRUE; - } - } - - { - CXFA_WidgetAcc* pAcc = pXFAWidgetHandler->GetDataAcc(hWidget); - return pXFAWidgetHandler->HasEvent(pAcc, eEventType); - } - } - } - - return FALSE; -} - -FX_BOOL CPDFSDK_Widget::OnXFAAAction(PDFSDK_XFAAActionType eXFAAAT, - PDFSDK_FieldAction& data, - CPDFSDK_PageView* pPageView) { - CPDFSDK_Document* pSDKDoc = m_pPageView->GetSDKDocument(); - CPDFXFA_Document* pDoc = pSDKDoc->GetXFADocument(); - if (IXFA_Widget* hWidget = GetMixXFAWidget()) { - XFA_EVENTTYPE eEventType = GetXFAEventType(eXFAAAT); - - if (eEventType != XFA_EVENT_Unknown) { - if (IXFA_WidgetHandler* pXFAWidgetHandler = GetXFAWidgetHandler()) { - CXFA_EventParam param; - param.m_eType = eEventType; - param.m_wsChange = data.sChange; - param.m_iCommitKey = data.nCommitKey; - param.m_bShift = data.bShift; - param.m_iSelStart = data.nSelStart; - param.m_iSelEnd = data.nSelEnd; - param.m_wsFullText = data.sValue; - param.m_bKeyDown = data.bKeyDown; - param.m_bModifier = data.bModifier; - param.m_wsNewText = data.sValue; - if (data.nSelEnd > data.nSelStart) - param.m_wsNewText.Delete(data.nSelStart, - data.nSelEnd - data.nSelStart); - for (int i = 0; i < data.sChange.GetLength(); i++) - param.m_wsNewText.Insert(data.nSelStart, data.sChange[i]); - param.m_wsPrevText = data.sValue; - - if ((eEventType == XFA_EVENT_Click || eEventType == XFA_EVENT_Change) && - GetFieldType() == FIELDTYPE_RADIOBUTTON) { - if (IXFA_Widget* hGroupWidget = GetGroupMixXFAWidget()) { - CXFA_WidgetAcc* pAcc = pXFAWidgetHandler->GetDataAcc(hGroupWidget); - param.m_pTarget = pAcc; - pXFAWidgetHandler->ProcessEvent(pAcc, ¶m); - } - - { - CXFA_WidgetAcc* pAcc = pXFAWidgetHandler->GetDataAcc(hWidget); - param.m_pTarget = pAcc; - int32_t nRet = pXFAWidgetHandler->ProcessEvent(pAcc, ¶m); - return nRet == XFA_EVENTERROR_Sucess; - } - } else { - CXFA_WidgetAcc* pAcc = pXFAWidgetHandler->GetDataAcc(hWidget); - param.m_pTarget = pAcc; - int32_t nRet = pXFAWidgetHandler->ProcessEvent(pAcc, ¶m); - return nRet == XFA_EVENTERROR_Sucess; - } - - if (IXFA_DocView* pDocView = pDoc->GetXFADocView()) { - pDocView->UpdateDocView(); - } - } - } - } - - return FALSE; -} - -void CPDFSDK_Widget::Synchronize(FX_BOOL bSynchronizeElse) { - if (IXFA_Widget* hWidget = GetMixXFAWidget()) { - if (IXFA_WidgetHandler* pXFAWidgetHandler = GetXFAWidgetHandler()) { - CPDF_FormField* pFormField = GetFormField(); - if (CXFA_WidgetAcc* pWidgetAcc = pXFAWidgetHandler->GetDataAcc(hWidget)) { - switch (GetFieldType()) { - case FIELDTYPE_CHECKBOX: - case FIELDTYPE_RADIOBUTTON: { - CPDF_FormControl* pFormCtrl = GetFormControl(); - XFA_CHECKSTATE eCheckState = - pFormCtrl->IsChecked() ? XFA_CHECKSTATE_On : XFA_CHECKSTATE_Off; - pWidgetAcc->SetCheckState(eCheckState); - } break; - case FIELDTYPE_TEXTFIELD: - pWidgetAcc->SetValue(pFormField->GetValue(), XFA_VALUEPICTURE_Edit); - break; - case FIELDTYPE_LISTBOX: { - pWidgetAcc->ClearAllSelections(); - - for (int i = 0, sz = pFormField->CountSelectedItems(); i < sz; - i++) { - int nIndex = pFormField->GetSelectedIndex(i); - if (nIndex > -1 && nIndex < pWidgetAcc->CountChoiceListItems()) - pWidgetAcc->SetItemState(nIndex, TRUE, FALSE); - } - } break; - case FIELDTYPE_COMBOBOX: { - pWidgetAcc->ClearAllSelections(); - - for (int i = 0, sz = pFormField->CountSelectedItems(); i < sz; - i++) { - int nIndex = pFormField->GetSelectedIndex(i); - if (nIndex > -1 && nIndex < pWidgetAcc->CountChoiceListItems()) - pWidgetAcc->SetItemState(nIndex, TRUE, FALSE); - } - } - - pWidgetAcc->SetValue(pFormField->GetValue(), XFA_VALUEPICTURE_Edit); - break; - } - - if (bSynchronizeElse) - pWidgetAcc->ProcessValueChanged(); - } - } - } -} - -void CPDFSDK_Widget::SynchronizeXFAValue() { - CPDFSDK_Document* pSDKDoc = m_pPageView->GetSDKDocument(); - CPDFXFA_Document* pDoc = pSDKDoc->GetXFADocument(); - IXFA_DocView* pXFADocView = pDoc->GetXFADocView(); - if (!pXFADocView) - return; - - if (IXFA_Widget* hWidget = GetMixXFAWidget()) { - if (GetXFAWidgetHandler()) { - CPDFSDK_Widget::SynchronizeXFAValue(pXFADocView, hWidget, GetFormField(), - GetFormControl()); - } - } -} - -void CPDFSDK_Widget::SynchronizeXFAItems() { - CPDFSDK_Document* pSDKDoc = m_pPageView->GetSDKDocument(); - CPDFXFA_Document* pDoc = pSDKDoc->GetXFADocument(); - IXFA_DocView* pXFADocView = pDoc->GetXFADocView(); - if (!pXFADocView) - return; - - if (IXFA_Widget* hWidget = GetMixXFAWidget()) { - if (GetXFAWidgetHandler()) - SynchronizeXFAItems(pXFADocView, hWidget, GetFormField(), nullptr); - } -} - -void CPDFSDK_Widget::SynchronizeXFAValue(IXFA_DocView* pXFADocView, - IXFA_Widget* hWidget, - CPDF_FormField* pFormField, - CPDF_FormControl* pFormControl) { - ASSERT(hWidget); - - if (IXFA_WidgetHandler* pXFAWidgetHandler = pXFADocView->GetWidgetHandler()) { - ASSERT(pFormControl); - - switch (pFormField->GetFieldType()) { - case FIELDTYPE_CHECKBOX: { - if (CXFA_WidgetAcc* pWidgetAcc = - pXFAWidgetHandler->GetDataAcc(hWidget)) { - FX_BOOL bChecked = pWidgetAcc->GetCheckState() == XFA_CHECKSTATE_On; - - pFormField->CheckControl(pFormField->GetControlIndex(pFormControl), - bChecked, TRUE); - } - } break; - case FIELDTYPE_RADIOBUTTON: { - if (CXFA_WidgetAcc* pWidgetAcc = - pXFAWidgetHandler->GetDataAcc(hWidget)) { - FX_BOOL bChecked = pWidgetAcc->GetCheckState() == XFA_CHECKSTATE_On; - - pFormField->CheckControl(pFormField->GetControlIndex(pFormControl), - bChecked, TRUE); - } - } break; - case FIELDTYPE_TEXTFIELD: { - if (CXFA_WidgetAcc* pWidgetAcc = - pXFAWidgetHandler->GetDataAcc(hWidget)) { - CFX_WideString sValue; - pWidgetAcc->GetValue(sValue, XFA_VALUEPICTURE_Display); - pFormField->SetValue(sValue, TRUE); - } - } break; - case FIELDTYPE_LISTBOX: { - pFormField->ClearSelection(FALSE); - - if (CXFA_WidgetAcc* pWidgetAcc = - pXFAWidgetHandler->GetDataAcc(hWidget)) { - for (int i = 0, sz = pWidgetAcc->CountSelectedItems(); i < sz; i++) { - int nIndex = pWidgetAcc->GetSelectedItem(i); - - if (nIndex > -1 && nIndex < pFormField->CountOptions()) { - pFormField->SetItemSelection(nIndex, TRUE, TRUE); - } - } - } - } break; - case FIELDTYPE_COMBOBOX: { - pFormField->ClearSelection(FALSE); - - if (CXFA_WidgetAcc* pWidgetAcc = - pXFAWidgetHandler->GetDataAcc(hWidget)) { - for (int i = 0, sz = pWidgetAcc->CountSelectedItems(); i < sz; i++) { - int nIndex = pWidgetAcc->GetSelectedItem(i); - - if (nIndex > -1 && nIndex < pFormField->CountOptions()) { - pFormField->SetItemSelection(nIndex, TRUE, TRUE); - } - } - - CFX_WideString sValue; - pWidgetAcc->GetValue(sValue, XFA_VALUEPICTURE_Display); - pFormField->SetValue(sValue, TRUE); - } - } break; - } - } -} - -void CPDFSDK_Widget::SynchronizeXFAItems(IXFA_DocView* pXFADocView, - IXFA_Widget* hWidget, - CPDF_FormField* pFormField, - CPDF_FormControl* pFormControl) { - ASSERT(hWidget); - - if (IXFA_WidgetHandler* pXFAWidgetHandler = pXFADocView->GetWidgetHandler()) { - switch (pFormField->GetFieldType()) { - case FIELDTYPE_LISTBOX: { - pFormField->ClearSelection(FALSE); - pFormField->ClearOptions(TRUE); - - if (CXFA_WidgetAcc* pWidgetAcc = - pXFAWidgetHandler->GetDataAcc(hWidget)) { - for (int i = 0, sz = pWidgetAcc->CountChoiceListItems(); i < sz; - i++) { - CFX_WideString swText; - pWidgetAcc->GetChoiceListItem(swText, i); - - pFormField->InsertOption(swText, i, TRUE); - } - } - } break; - case FIELDTYPE_COMBOBOX: { - pFormField->ClearSelection(FALSE); - pFormField->ClearOptions(FALSE); - - if (CXFA_WidgetAcc* pWidgetAcc = - pXFAWidgetHandler->GetDataAcc(hWidget)) { - for (int i = 0, sz = pWidgetAcc->CountChoiceListItems(); i < sz; - i++) { - CFX_WideString swText; - pWidgetAcc->GetChoiceListItem(swText, i); - - pFormField->InsertOption(swText, i, FALSE); - } - } - - pFormField->SetValue(L"", TRUE); - } break; - } - } -} -#endif // PDF_ENABLE_XFA - -FX_BOOL CPDFSDK_Widget::IsWidgetAppearanceValid( - CPDF_Annot::AppearanceMode mode) { - CPDF_Dictionary* pAP = m_pAnnot->GetAnnotDict()->GetDictBy("AP"); - if (!pAP) - return FALSE; - - // Choose the right sub-ap - const FX_CHAR* ap_entry = "N"; - if (mode == CPDF_Annot::Down) - ap_entry = "D"; - else if (mode == CPDF_Annot::Rollover) - ap_entry = "R"; - if (!pAP->KeyExist(ap_entry)) - ap_entry = "N"; - - // Get the AP stream or subdirectory - CPDF_Object* psub = pAP->GetElementValue(ap_entry); - if (!psub) - return FALSE; - - int nFieldType = GetFieldType(); - switch (nFieldType) { - case FIELDTYPE_PUSHBUTTON: - case FIELDTYPE_COMBOBOX: - case FIELDTYPE_LISTBOX: - case FIELDTYPE_TEXTFIELD: - case FIELDTYPE_SIGNATURE: - return psub->IsStream(); - case FIELDTYPE_CHECKBOX: - case FIELDTYPE_RADIOBUTTON: - if (CPDF_Dictionary* pSubDict = psub->AsDictionary()) { - return pSubDict->GetStreamBy(GetAppState()) != NULL; - } - return FALSE; - } - return TRUE; -} - -int CPDFSDK_Widget::GetFieldType() const { - return GetFormField()->GetFieldType(); -} - -FX_BOOL CPDFSDK_Widget::IsAppearanceValid() { -#ifdef PDF_ENABLE_XFA - CPDFSDK_Document* pSDKDoc = m_pPageView->GetSDKDocument(); - CPDFXFA_Document* pDoc = pSDKDoc->GetXFADocument(); - int nDocType = pDoc->GetDocType(); - if (nDocType != DOCTYPE_PDF && nDocType != DOCTYPE_STATIC_XFA) - return TRUE; -#endif // PDF_ENABLE_XFA - return CPDFSDK_BAAnnot::IsAppearanceValid(); -} - -int CPDFSDK_Widget::GetFieldFlags() const { - CPDF_InterForm* pPDFInterForm = m_pInterForm->GetInterForm(); - CPDF_FormControl* pFormControl = - pPDFInterForm->GetControlByDict(m_pAnnot->GetAnnotDict()); - CPDF_FormField* pFormField = pFormControl->GetField(); - return pFormField->GetFieldFlags(); -} - -CFX_ByteString CPDFSDK_Widget::GetSubType() const { - int nType = GetFieldType(); - - if (nType == FIELDTYPE_SIGNATURE) - return BFFT_SIGNATURE; - return CPDFSDK_Annot::GetSubType(); -} - -CPDF_FormField* CPDFSDK_Widget::GetFormField() const { - return GetFormControl()->GetField(); -} - -CPDF_FormControl* CPDFSDK_Widget::GetFormControl() const { - CPDF_InterForm* pPDFInterForm = m_pInterForm->GetInterForm(); - return pPDFInterForm->GetControlByDict(GetAnnotDict()); -} - -CPDF_FormControl* CPDFSDK_Widget::GetFormControl( - CPDF_InterForm* pInterForm, - const CPDF_Dictionary* pAnnotDict) { - ASSERT(pAnnotDict); - return pInterForm->GetControlByDict(pAnnotDict); -} - -int CPDFSDK_Widget::GetRotate() const { - CPDF_FormControl* pCtrl = GetFormControl(); - return pCtrl->GetRotation() % 360; -} - -#ifdef PDF_ENABLE_XFA -CFX_WideString CPDFSDK_Widget::GetName() const { - CPDF_FormField* pFormField = GetFormField(); - return pFormField->GetFullName(); -} -#endif // PDF_ENABLE_XFA - -FX_BOOL CPDFSDK_Widget::GetFillColor(FX_COLORREF& color) const { - CPDF_FormControl* pFormCtrl = GetFormControl(); - int iColorType = 0; - color = FX_ARGBTOCOLORREF(pFormCtrl->GetBackgroundColor(iColorType)); - - return iColorType != COLORTYPE_TRANSPARENT; -} - -FX_BOOL CPDFSDK_Widget::GetBorderColor(FX_COLORREF& color) const { - CPDF_FormControl* pFormCtrl = GetFormControl(); - int iColorType = 0; - color = FX_ARGBTOCOLORREF(pFormCtrl->GetBorderColor(iColorType)); - - return iColorType != COLORTYPE_TRANSPARENT; -} - -FX_BOOL CPDFSDK_Widget::GetTextColor(FX_COLORREF& color) const { - CPDF_FormControl* pFormCtrl = GetFormControl(); - CPDF_DefaultAppearance da = pFormCtrl->GetDefaultAppearance(); - if (da.HasColor()) { - FX_ARGB argb; - int iColorType = COLORTYPE_TRANSPARENT; - da.GetColor(argb, iColorType); - color = FX_ARGBTOCOLORREF(argb); - - return iColorType != COLORTYPE_TRANSPARENT; - } - - return FALSE; -} - -FX_FLOAT CPDFSDK_Widget::GetFontSize() const { - CPDF_FormControl* pFormCtrl = GetFormControl(); - CPDF_DefaultAppearance pDa = pFormCtrl->GetDefaultAppearance(); - CFX_ByteString csFont = ""; - FX_FLOAT fFontSize = 0.0f; - pDa.GetFont(csFont, fFontSize); - - return fFontSize; -} - -int CPDFSDK_Widget::GetSelectedIndex(int nIndex) const { -#ifdef PDF_ENABLE_XFA - if (IXFA_Widget* hWidget = GetMixXFAWidget()) { - if (IXFA_WidgetHandler* pXFAWidgetHandler = GetXFAWidgetHandler()) { - if (CXFA_WidgetAcc* pWidgetAcc = pXFAWidgetHandler->GetDataAcc(hWidget)) { - if (nIndex < pWidgetAcc->CountSelectedItems()) - return pWidgetAcc->GetSelectedItem(nIndex); - } - } - } -#endif // PDF_ENABLE_XFA - CPDF_FormField* pFormField = GetFormField(); - return pFormField->GetSelectedIndex(nIndex); -} - -#ifdef PDF_ENABLE_XFA -CFX_WideString CPDFSDK_Widget::GetValue(FX_BOOL bDisplay) const { - if (IXFA_Widget* hWidget = GetMixXFAWidget()) { - if (IXFA_WidgetHandler* pXFAWidgetHandler = GetXFAWidgetHandler()) { - if (CXFA_WidgetAcc* pWidgetAcc = pXFAWidgetHandler->GetDataAcc(hWidget)) { - CFX_WideString sValue; - pWidgetAcc->GetValue(sValue, bDisplay ? XFA_VALUEPICTURE_Display - : XFA_VALUEPICTURE_Edit); - return sValue; - } - } - } -#else -CFX_WideString CPDFSDK_Widget::GetValue() const { -#endif // PDF_ENABLE_XFA - CPDF_FormField* pFormField = GetFormField(); - return pFormField->GetValue(); -} - -CFX_WideString CPDFSDK_Widget::GetDefaultValue() const { - CPDF_FormField* pFormField = GetFormField(); - return pFormField->GetDefaultValue(); -} - -CFX_WideString CPDFSDK_Widget::GetOptionLabel(int nIndex) const { - CPDF_FormField* pFormField = GetFormField(); - return pFormField->GetOptionLabel(nIndex); -} - -int CPDFSDK_Widget::CountOptions() const { - CPDF_FormField* pFormField = GetFormField(); - return pFormField->CountOptions(); -} - -FX_BOOL CPDFSDK_Widget::IsOptionSelected(int nIndex) const { -#ifdef PDF_ENABLE_XFA - if (IXFA_Widget* hWidget = GetMixXFAWidget()) { - if (IXFA_WidgetHandler* pXFAWidgetHandler = GetXFAWidgetHandler()) { - if (CXFA_WidgetAcc* pWidgetAcc = pXFAWidgetHandler->GetDataAcc(hWidget)) { - if (nIndex > -1 && nIndex < pWidgetAcc->CountChoiceListItems()) - return pWidgetAcc->GetItemState(nIndex); - - return FALSE; - } - } - } -#endif // PDF_ENABLE_XFA - CPDF_FormField* pFormField = GetFormField(); - return pFormField->IsItemSelected(nIndex); -} - -int CPDFSDK_Widget::GetTopVisibleIndex() const { - CPDF_FormField* pFormField = GetFormField(); - return pFormField->GetTopVisibleIndex(); -} - -bool CPDFSDK_Widget::IsChecked() const { -#ifdef PDF_ENABLE_XFA - if (IXFA_WidgetHandler* pXFAWidgetHandler = GetXFAWidgetHandler()) { - if (IXFA_Widget* hWidget = GetMixXFAWidget()) { - if (CXFA_WidgetAcc* pWidgetAcc = pXFAWidgetHandler->GetDataAcc(hWidget)) - return pWidgetAcc->GetCheckState() == XFA_CHECKSTATE_On; - } - } -#endif // PDF_ENABLE_XFA - CPDF_FormControl* pFormCtrl = GetFormControl(); - return pFormCtrl->IsChecked(); -} - -int CPDFSDK_Widget::GetAlignment() const { - CPDF_FormControl* pFormCtrl = GetFormControl(); - return pFormCtrl->GetControlAlignment(); -} - -int CPDFSDK_Widget::GetMaxLen() const { - CPDF_FormField* pFormField = GetFormField(); - return pFormField->GetMaxLen(); -} - -void CPDFSDK_Widget::SetCheck(bool bChecked, bool bNotify) { - CPDF_FormControl* pFormCtrl = GetFormControl(); - CPDF_FormField* pFormField = pFormCtrl->GetField(); - pFormField->CheckControl(pFormField->GetControlIndex(pFormCtrl), bChecked, - bNotify); -#ifdef PDF_ENABLE_XFA - if (!IsWidgetAppearanceValid(CPDF_Annot::Normal)) - ResetAppearance(TRUE); - if (!bNotify) - Synchronize(TRUE); -#endif // PDF_ENABLE_XFA -} - -void CPDFSDK_Widget::SetValue(const CFX_WideString& sValue, FX_BOOL bNotify) { - CPDF_FormField* pFormField = GetFormField(); - pFormField->SetValue(sValue, bNotify); -#ifdef PDF_ENABLE_XFA - if (!bNotify) - Synchronize(TRUE); -#endif // PDF_ENABLE_XFA -} - -void CPDFSDK_Widget::SetDefaultValue(const CFX_WideString& sValue) {} -void CPDFSDK_Widget::SetOptionSelection(int index, - FX_BOOL bSelected, - FX_BOOL bNotify) { - CPDF_FormField* pFormField = GetFormField(); - pFormField->SetItemSelection(index, bSelected, bNotify); -#ifdef PDF_ENABLE_XFA - if (!bNotify) - Synchronize(TRUE); -#endif // PDF_ENABLE_XFA -} - -void CPDFSDK_Widget::ClearSelection(FX_BOOL bNotify) { - CPDF_FormField* pFormField = GetFormField(); - pFormField->ClearSelection(bNotify); -#ifdef PDF_ENABLE_XFA - if (!bNotify) - Synchronize(TRUE); -#endif // PDF_ENABLE_XFA -} - -void CPDFSDK_Widget::SetTopVisibleIndex(int index) {} - -void CPDFSDK_Widget::SetAppModified() { - m_bAppModified = TRUE; -} - -void CPDFSDK_Widget::ClearAppModified() { - m_bAppModified = FALSE; -} - -FX_BOOL CPDFSDK_Widget::IsAppModified() const { - return m_bAppModified; -} - -#ifdef PDF_ENABLE_XFA -void CPDFSDK_Widget::ResetAppearance(FX_BOOL bValueChanged) { - switch (GetFieldType()) { - case FIELDTYPE_TEXTFIELD: - case FIELDTYPE_COMBOBOX: { - FX_BOOL bFormated = FALSE; - CFX_WideString sValue = OnFormat(bFormated); - ResetAppearance(bFormated ? sValue : nullptr, TRUE); - } break; - default: - ResetAppearance(nullptr, FALSE); - break; - } -} -#endif // PDF_ENABLE_XFA - -void CPDFSDK_Widget::ResetAppearance(const FX_WCHAR* sValue, - FX_BOOL bValueChanged) { - SetAppModified(); - - m_nAppAge++; - if (m_nAppAge > 999999) - m_nAppAge = 0; - if (bValueChanged) - m_nValueAge++; - - int nFieldType = GetFieldType(); - - switch (nFieldType) { - case FIELDTYPE_PUSHBUTTON: - ResetAppearance_PushButton(); - break; - case FIELDTYPE_CHECKBOX: - ResetAppearance_CheckBox(); - break; - case FIELDTYPE_RADIOBUTTON: - ResetAppearance_RadioButton(); - break; - case FIELDTYPE_COMBOBOX: - ResetAppearance_ComboBox(sValue); - break; - case FIELDTYPE_LISTBOX: - ResetAppearance_ListBox(); - break; - case FIELDTYPE_TEXTFIELD: - ResetAppearance_TextField(sValue); - break; - } - - m_pAnnot->ClearCachedAP(); -} - -CFX_WideString CPDFSDK_Widget::OnFormat(FX_BOOL& bFormated) { - CPDF_FormField* pFormField = GetFormField(); - ASSERT(pFormField); - return m_pInterForm->OnFormat(pFormField, bFormated); -} - -void CPDFSDK_Widget::ResetFieldAppearance(FX_BOOL bValueChanged) { - CPDF_FormField* pFormField = GetFormField(); - ASSERT(pFormField); - m_pInterForm->ResetFieldAppearance(pFormField, NULL, bValueChanged); -} - -void CPDFSDK_Widget::DrawAppearance(CFX_RenderDevice* pDevice, - const CFX_Matrix* pUser2Device, - CPDF_Annot::AppearanceMode mode, - const CPDF_RenderOptions* pOptions) { - int nFieldType = GetFieldType(); - - if ((nFieldType == FIELDTYPE_CHECKBOX || - nFieldType == FIELDTYPE_RADIOBUTTON) && - mode == CPDF_Annot::Normal && - !IsWidgetAppearanceValid(CPDF_Annot::Normal)) { - CFX_PathData pathData; - - CFX_FloatRect rcAnnot = GetRect(); - - pathData.AppendRect(rcAnnot.left, rcAnnot.bottom, rcAnnot.right, - rcAnnot.top); - - CFX_GraphStateData gsd; - gsd.m_LineWidth = 0.0f; - - pDevice->DrawPath(&pathData, pUser2Device, &gsd, 0, 0xFFAAAAAA, - FXFILL_ALTERNATE); - } else { - CPDFSDK_BAAnnot::DrawAppearance(pDevice, pUser2Device, mode, pOptions); - } -} - -void CPDFSDK_Widget::UpdateField() { - CPDF_FormField* pFormField = GetFormField(); - ASSERT(pFormField); - m_pInterForm->UpdateField(pFormField); -} - -void CPDFSDK_Widget::DrawShadow(CFX_RenderDevice* pDevice, - CPDFSDK_PageView* pPageView) { - int nFieldType = GetFieldType(); - if (m_pInterForm->IsNeedHighLight(nFieldType)) { - CFX_FloatRect rc = GetRect(); - FX_COLORREF color = m_pInterForm->GetHighlightColor(nFieldType); - uint8_t alpha = m_pInterForm->GetHighlightAlpha(); - - CFX_FloatRect rcDevice; - ASSERT(m_pInterForm->GetDocument()); - CPDFDoc_Environment* pEnv = m_pInterForm->GetDocument()->GetEnv(); - if (!pEnv) - return; - CFX_Matrix page2device; - pPageView->GetCurrentMatrix(page2device); - page2device.Transform(((FX_FLOAT)rc.left), ((FX_FLOAT)rc.bottom), - rcDevice.left, rcDevice.bottom); - page2device.Transform(((FX_FLOAT)rc.right), ((FX_FLOAT)rc.top), - rcDevice.right, rcDevice.top); - - rcDevice.Normalize(); - - FX_ARGB argb = ArgbEncode((int)alpha, color); - FX_RECT rcDev((int)rcDevice.left, (int)rcDevice.top, (int)rcDevice.right, - (int)rcDevice.bottom); - pDevice->FillRect(&rcDev, argb); - } -} - -void CPDFSDK_Widget::ResetAppearance_PushButton() { - CPDF_FormControl* pControl = GetFormControl(); - CFX_FloatRect rcWindow = GetRotatedRect(); - int32_t nLayout = 0; - switch (pControl->GetTextPosition()) { - case TEXTPOS_ICON: - nLayout = PPBL_ICON; - break; - case TEXTPOS_BELOW: - nLayout = PPBL_ICONTOPLABELBOTTOM; - break; - case TEXTPOS_ABOVE: - nLayout = PPBL_LABELTOPICONBOTTOM; - break; - case TEXTPOS_RIGHT: - nLayout = PPBL_ICONLEFTLABELRIGHT; - break; - case TEXTPOS_LEFT: - nLayout = PPBL_LABELLEFTICONRIGHT; - break; - case TEXTPOS_OVERLAID: - nLayout = PPBL_LABELOVERICON; - break; - default: - nLayout = PPBL_LABEL; - break; - } - - CPWL_Color crBackground, crBorder; - - int iColorType; - FX_FLOAT fc[4]; - - pControl->GetOriginalBackgroundColor(iColorType, fc); - if (iColorType > 0) - crBackground = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]); - - pControl->GetOriginalBorderColor(iColorType, fc); - if (iColorType > 0) - crBorder = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]); - - FX_FLOAT fBorderWidth = (FX_FLOAT)GetBorderWidth(); - int32_t nBorderStyle = 0; - CPWL_Dash dsBorder(3, 0, 0); - CPWL_Color crLeftTop, crRightBottom; - - switch (GetBorderStyle()) { - case BBS_DASH: - nBorderStyle = PBS_DASH; - dsBorder = CPWL_Dash(3, 3, 0); - break; - case BBS_BEVELED: - nBorderStyle = PBS_BEVELED; - fBorderWidth *= 2; - crLeftTop = CPWL_Color(COLORTYPE_GRAY, 1); - crRightBottom = CPWL_Utils::DevideColor(crBackground, 2); - break; - case BBS_INSET: - nBorderStyle = PBS_INSET; - fBorderWidth *= 2; - crLeftTop = CPWL_Color(COLORTYPE_GRAY, 0.5); - crRightBottom = CPWL_Color(COLORTYPE_GRAY, 0.75); - break; - case BBS_UNDERLINE: - nBorderStyle = PBS_UNDERLINED; - break; - default: - nBorderStyle = PBS_SOLID; - break; - } - - CFX_FloatRect rcClient = CPWL_Utils::DeflateRect(rcWindow, fBorderWidth); - - CPWL_Color crText(COLORTYPE_GRAY, 0); - - FX_FLOAT fFontSize = 12.0f; - CFX_ByteString csNameTag; - - CPDF_DefaultAppearance da = pControl->GetDefaultAppearance(); - if (da.HasColor()) { - da.GetColor(iColorType, fc); - crText = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]); - } - - if (da.HasFont()) - da.GetFont(csNameTag, fFontSize); - - CFX_WideString csWCaption; - CFX_WideString csNormalCaption, csRolloverCaption, csDownCaption; - - if (pControl->HasMKEntry("CA")) { - csNormalCaption = pControl->GetNormalCaption(); - } - if (pControl->HasMKEntry("RC")) { - csRolloverCaption = pControl->GetRolloverCaption(); - } - if (pControl->HasMKEntry("AC")) { - csDownCaption = pControl->GetDownCaption(); - } - - CPDF_Stream* pNormalIcon = NULL; - CPDF_Stream* pRolloverIcon = NULL; - CPDF_Stream* pDownIcon = NULL; - - if (pControl->HasMKEntry("I")) { - pNormalIcon = pControl->GetNormalIcon(); - } - if (pControl->HasMKEntry("RI")) { - pRolloverIcon = pControl->GetRolloverIcon(); - } - if (pControl->HasMKEntry("IX")) { - pDownIcon = pControl->GetDownIcon(); - } - - if (pNormalIcon) { - if (CPDF_Dictionary* pImageDict = pNormalIcon->GetDict()) { - if (pImageDict->GetStringBy("Name").IsEmpty()) - pImageDict->SetAtString("Name", "ImgA"); - } - } - - if (pRolloverIcon) { - if (CPDF_Dictionary* pImageDict = pRolloverIcon->GetDict()) { - if (pImageDict->GetStringBy("Name").IsEmpty()) - pImageDict->SetAtString("Name", "ImgB"); - } - } - - if (pDownIcon) { - if (CPDF_Dictionary* pImageDict = pDownIcon->GetDict()) { - if (pImageDict->GetStringBy("Name").IsEmpty()) - pImageDict->SetAtString("Name", "ImgC"); - } - } - - CPDF_IconFit iconFit = pControl->GetIconFit(); - - CPDFSDK_Document* pDoc = m_pInterForm->GetDocument(); - CPDFDoc_Environment* pEnv = pDoc->GetEnv(); - - CBA_FontMap font_map(this, pEnv->GetSysHandler()); - font_map.SetAPType("N"); - - CFX_ByteString csAP = - CPWL_Utils::GetRectFillAppStream(rcWindow, crBackground) + - CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder, - crLeftTop, crRightBottom, nBorderStyle, - dsBorder) + - CPWL_Utils::GetPushButtonAppStream( - iconFit.GetFittingBounds() ? rcWindow : rcClient, &font_map, - pNormalIcon, iconFit, csNormalCaption, crText, fFontSize, nLayout); - - WriteAppearance("N", GetRotatedRect(), GetMatrix(), csAP); - if (pNormalIcon) - AddImageToAppearance("N", pNormalIcon); - - CPDF_FormControl::HighlightingMode eHLM = pControl->GetHighlightingMode(); - if (eHLM == CPDF_FormControl::Push || eHLM == CPDF_FormControl::Toggle) { - if (csRolloverCaption.IsEmpty() && !pRolloverIcon) { - csRolloverCaption = csNormalCaption; - pRolloverIcon = pNormalIcon; - } - - font_map.SetAPType("R"); - - csAP = CPWL_Utils::GetRectFillAppStream(rcWindow, crBackground) + - CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder, - crLeftTop, crRightBottom, - nBorderStyle, dsBorder) + - CPWL_Utils::GetPushButtonAppStream( - iconFit.GetFittingBounds() ? rcWindow : rcClient, &font_map, - pRolloverIcon, iconFit, csRolloverCaption, crText, fFontSize, - nLayout); - - WriteAppearance("R", GetRotatedRect(), GetMatrix(), csAP); - if (pRolloverIcon) - AddImageToAppearance("R", pRolloverIcon); - - if (csDownCaption.IsEmpty() && !pDownIcon) { - csDownCaption = csNormalCaption; - pDownIcon = pNormalIcon; - } - - switch (nBorderStyle) { - case PBS_BEVELED: { - CPWL_Color crTemp = crLeftTop; - crLeftTop = crRightBottom; - crRightBottom = crTemp; - } break; - case PBS_INSET: - crLeftTop = CPWL_Color(COLORTYPE_GRAY, 0); - crRightBottom = CPWL_Color(COLORTYPE_GRAY, 1); - break; - } - - font_map.SetAPType("D"); - - csAP = CPWL_Utils::GetRectFillAppStream( - rcWindow, CPWL_Utils::SubstractColor(crBackground, 0.25f)) + - CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder, - crLeftTop, crRightBottom, - nBorderStyle, dsBorder) + - CPWL_Utils::GetPushButtonAppStream( - iconFit.GetFittingBounds() ? rcWindow : rcClient, &font_map, - pDownIcon, iconFit, csDownCaption, crText, fFontSize, nLayout); - - WriteAppearance("D", GetRotatedRect(), GetMatrix(), csAP); - if (pDownIcon) - AddImageToAppearance("D", pDownIcon); - } else { - RemoveAppearance("D"); - RemoveAppearance("R"); - } -} - -void CPDFSDK_Widget::ResetAppearance_CheckBox() { - CPDF_FormControl* pControl = GetFormControl(); - CPWL_Color crBackground, crBorder, crText; - int iColorType; - FX_FLOAT fc[4]; - - pControl->GetOriginalBackgroundColor(iColorType, fc); - if (iColorType > 0) - crBackground = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]); - - pControl->GetOriginalBorderColor(iColorType, fc); - if (iColorType > 0) - crBorder = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]); - - FX_FLOAT fBorderWidth = (FX_FLOAT)GetBorderWidth(); - int32_t nBorderStyle = 0; - CPWL_Dash dsBorder(3, 0, 0); - CPWL_Color crLeftTop, crRightBottom; - - switch (GetBorderStyle()) { - case BBS_DASH: - nBorderStyle = PBS_DASH; - dsBorder = CPWL_Dash(3, 3, 0); - break; - case BBS_BEVELED: - nBorderStyle = PBS_BEVELED; - fBorderWidth *= 2; - crLeftTop = CPWL_Color(COLORTYPE_GRAY, 1); - crRightBottom = CPWL_Utils::DevideColor(crBackground, 2); - break; - case BBS_INSET: - nBorderStyle = PBS_INSET; - fBorderWidth *= 2; - crLeftTop = CPWL_Color(COLORTYPE_GRAY, 0.5); - crRightBottom = CPWL_Color(COLORTYPE_GRAY, 0.75); - break; - case BBS_UNDERLINE: - nBorderStyle = PBS_UNDERLINED; - break; - default: - nBorderStyle = PBS_SOLID; - break; - } - - CFX_FloatRect rcWindow = GetRotatedRect(); - CFX_FloatRect rcClient = CPWL_Utils::DeflateRect(rcWindow, fBorderWidth); - - CPDF_DefaultAppearance da = pControl->GetDefaultAppearance(); - if (da.HasColor()) { - da.GetColor(iColorType, fc); - crText = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]); - } - - int32_t nStyle = 0; - - CFX_WideString csWCaption = pControl->GetNormalCaption(); - if (csWCaption.GetLength() > 0) { - switch (csWCaption[0]) { - case L'l': - nStyle = PCS_CIRCLE; - break; - case L'8': - nStyle = PCS_CROSS; - break; - case L'u': - nStyle = PCS_DIAMOND; - break; - case L'n': - nStyle = PCS_SQUARE; - break; - case L'H': - nStyle = PCS_STAR; - break; - default: // L'4' - nStyle = PCS_CHECK; - break; - } - } else { - nStyle = PCS_CHECK; - } - - CFX_ByteString csAP_N_ON = - CPWL_Utils::GetRectFillAppStream(rcWindow, crBackground) + - CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder, - crLeftTop, crRightBottom, nBorderStyle, - dsBorder); - - CFX_ByteString csAP_N_OFF = csAP_N_ON; - - switch (nBorderStyle) { - case PBS_BEVELED: { - CPWL_Color crTemp = crLeftTop; - crLeftTop = crRightBottom; - crRightBottom = crTemp; - } break; - case PBS_INSET: - crLeftTop = CPWL_Color(COLORTYPE_GRAY, 0); - crRightBottom = CPWL_Color(COLORTYPE_GRAY, 1); - break; - } - - CFX_ByteString csAP_D_ON = - CPWL_Utils::GetRectFillAppStream( - rcWindow, CPWL_Utils::SubstractColor(crBackground, 0.25f)) + - CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder, - crLeftTop, crRightBottom, nBorderStyle, - dsBorder); - - CFX_ByteString csAP_D_OFF = csAP_D_ON; - - csAP_N_ON += CPWL_Utils::GetCheckBoxAppStream(rcClient, nStyle, crText); - csAP_D_ON += CPWL_Utils::GetCheckBoxAppStream(rcClient, nStyle, crText); - - WriteAppearance("N", GetRotatedRect(), GetMatrix(), csAP_N_ON, - pControl->GetCheckedAPState()); - WriteAppearance("N", GetRotatedRect(), GetMatrix(), csAP_N_OFF, "Off"); - - WriteAppearance("D", GetRotatedRect(), GetMatrix(), csAP_D_ON, - pControl->GetCheckedAPState()); - WriteAppearance("D", GetRotatedRect(), GetMatrix(), csAP_D_OFF, "Off"); - - CFX_ByteString csAS = GetAppState(); - if (csAS.IsEmpty()) - SetAppState("Off"); -} - -void CPDFSDK_Widget::ResetAppearance_RadioButton() { - CPDF_FormControl* pControl = GetFormControl(); - CPWL_Color crBackground, crBorder, crText; - int iColorType; - FX_FLOAT fc[4]; - - pControl->GetOriginalBackgroundColor(iColorType, fc); - if (iColorType > 0) - crBackground = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]); - - pControl->GetOriginalBorderColor(iColorType, fc); - if (iColorType > 0) - crBorder = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]); - - FX_FLOAT fBorderWidth = (FX_FLOAT)GetBorderWidth(); - int32_t nBorderStyle = 0; - CPWL_Dash dsBorder(3, 0, 0); - CPWL_Color crLeftTop, crRightBottom; - - switch (GetBorderStyle()) { - case BBS_DASH: - nBorderStyle = PBS_DASH; - dsBorder = CPWL_Dash(3, 3, 0); - break; - case BBS_BEVELED: - nBorderStyle = PBS_BEVELED; - fBorderWidth *= 2; - crLeftTop = CPWL_Color(COLORTYPE_GRAY, 1); - crRightBottom = CPWL_Utils::DevideColor(crBackground, 2); - break; - case BBS_INSET: - nBorderStyle = PBS_INSET; - fBorderWidth *= 2; - crLeftTop = CPWL_Color(COLORTYPE_GRAY, 0.5); - crRightBottom = CPWL_Color(COLORTYPE_GRAY, 0.75); - break; - case BBS_UNDERLINE: - nBorderStyle = PBS_UNDERLINED; - break; - default: - nBorderStyle = PBS_SOLID; - break; - } - - CFX_FloatRect rcWindow = GetRotatedRect(); - CFX_FloatRect rcClient = CPWL_Utils::DeflateRect(rcWindow, fBorderWidth); - - CPDF_DefaultAppearance da = pControl->GetDefaultAppearance(); - if (da.HasColor()) { - da.GetColor(iColorType, fc); - crText = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]); - } - - int32_t nStyle = 0; - - CFX_WideString csWCaption = pControl->GetNormalCaption(); - if (csWCaption.GetLength() > 0) { - switch (csWCaption[0]) { - default: // L'l': - nStyle = PCS_CIRCLE; - break; - case L'8': - nStyle = PCS_CROSS; - break; - case L'u': - nStyle = PCS_DIAMOND; - break; - case L'n': - nStyle = PCS_SQUARE; - break; - case L'H': - nStyle = PCS_STAR; - break; - case L'4': - nStyle = PCS_CHECK; - break; - } - } else { - nStyle = PCS_CIRCLE; - } - - CFX_ByteString csAP_N_ON; - - CFX_FloatRect rcCenter = - CPWL_Utils::DeflateRect(CPWL_Utils::GetCenterSquare(rcWindow), 1.0f); - - if (nStyle == PCS_CIRCLE) { - if (nBorderStyle == PBS_BEVELED) { - crLeftTop = CPWL_Color(COLORTYPE_GRAY, 1); - crRightBottom = CPWL_Utils::SubstractColor(crBackground, 0.25f); - } else if (nBorderStyle == PBS_INSET) { - crLeftTop = CPWL_Color(COLORTYPE_GRAY, 0.5f); - crRightBottom = CPWL_Color(COLORTYPE_GRAY, 0.75f); - } - - csAP_N_ON = CPWL_Utils::GetCircleFillAppStream(rcCenter, crBackground) + - CPWL_Utils::GetCircleBorderAppStream( - rcCenter, fBorderWidth, crBorder, crLeftTop, crRightBottom, - nBorderStyle, dsBorder); - } else { - csAP_N_ON = CPWL_Utils::GetRectFillAppStream(rcWindow, crBackground) + - CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder, - crLeftTop, crRightBottom, - nBorderStyle, dsBorder); - } - - CFX_ByteString csAP_N_OFF = csAP_N_ON; - - switch (nBorderStyle) { - case PBS_BEVELED: { - CPWL_Color crTemp = crLeftTop; - crLeftTop = crRightBottom; - crRightBottom = crTemp; - } break; - case PBS_INSET: - crLeftTop = CPWL_Color(COLORTYPE_GRAY, 0); - crRightBottom = CPWL_Color(COLORTYPE_GRAY, 1); - break; - } - - CFX_ByteString csAP_D_ON; - - if (nStyle == PCS_CIRCLE) { - CPWL_Color crBK = CPWL_Utils::SubstractColor(crBackground, 0.25f); - if (nBorderStyle == PBS_BEVELED) { - crLeftTop = CPWL_Utils::SubstractColor(crBackground, 0.25f); - crRightBottom = CPWL_Color(COLORTYPE_GRAY, 1); - crBK = crBackground; - } else if (nBorderStyle == PBS_INSET) { - crLeftTop = CPWL_Color(COLORTYPE_GRAY, 0); - crRightBottom = CPWL_Color(COLORTYPE_GRAY, 1); - } - - csAP_D_ON = CPWL_Utils::GetCircleFillAppStream(rcCenter, crBK) + - CPWL_Utils::GetCircleBorderAppStream( - rcCenter, fBorderWidth, crBorder, crLeftTop, crRightBottom, - nBorderStyle, dsBorder); - } else { - csAP_D_ON = CPWL_Utils::GetRectFillAppStream( - rcWindow, CPWL_Utils::SubstractColor(crBackground, 0.25f)) + - CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder, - crLeftTop, crRightBottom, - nBorderStyle, dsBorder); - } - - CFX_ByteString csAP_D_OFF = csAP_D_ON; - - csAP_N_ON += CPWL_Utils::GetRadioButtonAppStream(rcClient, nStyle, crText); - csAP_D_ON += CPWL_Utils::GetRadioButtonAppStream(rcClient, nStyle, crText); - - WriteAppearance("N", GetRotatedRect(), GetMatrix(), csAP_N_ON, - pControl->GetCheckedAPState()); - WriteAppearance("N", GetRotatedRect(), GetMatrix(), csAP_N_OFF, "Off"); - - WriteAppearance("D", GetRotatedRect(), GetMatrix(), csAP_D_ON, - pControl->GetCheckedAPState()); - WriteAppearance("D", GetRotatedRect(), GetMatrix(), csAP_D_OFF, "Off"); - - CFX_ByteString csAS = GetAppState(); - if (csAS.IsEmpty()) - SetAppState("Off"); -} - -void CPDFSDK_Widget::ResetAppearance_ComboBox(const FX_WCHAR* sValue) { - CPDF_FormControl* pControl = GetFormControl(); - CPDF_FormField* pField = pControl->GetField(); - CFX_ByteTextBuf sBody, sLines; - - CFX_FloatRect rcClient = GetClientRect(); - CFX_FloatRect rcButton = rcClient; - rcButton.left = rcButton.right - 13; - rcButton.Normalize(); - - if (IFX_Edit* pEdit = IFX_Edit::NewEdit()) { - pEdit->EnableRefresh(FALSE); - - CPDFSDK_Document* pDoc = m_pInterForm->GetDocument(); - CPDFDoc_Environment* pEnv = pDoc->GetEnv(); - CBA_FontMap font_map(this, pEnv->GetSysHandler()); - pEdit->SetFontMap(&font_map); - - CFX_FloatRect rcEdit = rcClient; - rcEdit.right = rcButton.left; - rcEdit.Normalize(); - - pEdit->SetPlateRect(rcEdit); - pEdit->SetAlignmentV(1); - - FX_FLOAT fFontSize = GetFontSize(); - if (IsFloatZero(fFontSize)) - pEdit->SetAutoFontSize(TRUE); - else - pEdit->SetFontSize(fFontSize); - - pEdit->Initialize(); - - if (sValue) { - pEdit->SetText(sValue); - } else { - int32_t nCurSel = pField->GetSelectedIndex(0); - - if (nCurSel < 0) - pEdit->SetText(pField->GetValue().c_str()); - else - pEdit->SetText(pField->GetOptionLabel(nCurSel).c_str()); - } - - CFX_FloatRect rcContent = pEdit->GetContentRect(); - - CFX_ByteString sEdit = - CPWL_Utils::GetEditAppStream(pEdit, CFX_FloatPoint(0.0f, 0.0f)); - if (sEdit.GetLength() > 0) { - sBody << "/Tx BMC\n" - << "q\n"; - if (rcContent.Width() > rcEdit.Width() || - rcContent.Height() > rcEdit.Height()) { - sBody << rcEdit.left << " " << rcEdit.bottom << " " << rcEdit.Width() - << " " << rcEdit.Height() << " re\nW\nn\n"; - } - - CPWL_Color crText = GetTextPWLColor(); - sBody << "BT\n" << CPWL_Utils::GetColorAppStream(crText) << sEdit - << "ET\n" - << "Q\nEMC\n"; - } - - IFX_Edit::DelEdit(pEdit); - } - - sBody << CPWL_Utils::GetDropButtonAppStream(rcButton); - - CFX_ByteString sAP = GetBackgroundAppStream() + GetBorderAppStream() + - sLines.GetByteString() + sBody.GetByteString(); - - WriteAppearance("N", GetRotatedRect(), GetMatrix(), sAP); -} - -void CPDFSDK_Widget::ResetAppearance_ListBox() { - CPDF_FormControl* pControl = GetFormControl(); - CPDF_FormField* pField = pControl->GetField(); - CFX_FloatRect rcClient = GetClientRect(); - CFX_ByteTextBuf sBody, sLines; - - if (IFX_Edit* pEdit = IFX_Edit::NewEdit()) { - pEdit->EnableRefresh(FALSE); - - CPDFSDK_Document* pDoc = m_pInterForm->GetDocument(); - CPDFDoc_Environment* pEnv = pDoc->GetEnv(); - - CBA_FontMap font_map(this, pEnv->GetSysHandler()); - pEdit->SetFontMap(&font_map); - - pEdit->SetPlateRect( - CFX_FloatRect(rcClient.left, 0.0f, rcClient.right, 0.0f)); - - FX_FLOAT fFontSize = GetFontSize(); - - if (IsFloatZero(fFontSize)) - pEdit->SetFontSize(12.0f); - else - pEdit->SetFontSize(fFontSize); - - pEdit->Initialize(); - - CFX_ByteTextBuf sList; - FX_FLOAT fy = rcClient.top; - - int32_t nTop = pField->GetTopVisibleIndex(); - int32_t nCount = pField->CountOptions(); - int32_t nSelCount = pField->CountSelectedItems(); - - for (int32_t i = nTop; i < nCount; i++) { - FX_BOOL bSelected = FALSE; - for (int32_t j = 0; j < nSelCount; j++) { - if (pField->GetSelectedIndex(j) == i) { - bSelected = TRUE; - break; - } - } - - pEdit->SetText(pField->GetOptionLabel(i).c_str()); - - CFX_FloatRect rcContent = pEdit->GetContentRect(); - FX_FLOAT fItemHeight = rcContent.Height(); - - if (bSelected) { - CFX_FloatRect rcItem = - CFX_FloatRect(rcClient.left, fy - fItemHeight, rcClient.right, fy); - sList << "q\n" << CPWL_Utils::GetColorAppStream( - CPWL_Color(COLORTYPE_RGB, 0, 51.0f / 255.0f, - 113.0f / 255.0f), - TRUE) - << rcItem.left << " " << rcItem.bottom << " " << rcItem.Width() - << " " << rcItem.Height() << " re f\n" - << "Q\n"; - - sList << "BT\n" << CPWL_Utils::GetColorAppStream( - CPWL_Color(COLORTYPE_GRAY, 1), TRUE) - << CPWL_Utils::GetEditAppStream(pEdit, CFX_FloatPoint(0.0f, fy)) - << "ET\n"; - } else { - CPWL_Color crText = GetTextPWLColor(); - sList << "BT\n" << CPWL_Utils::GetColorAppStream(crText, TRUE) - << CPWL_Utils::GetEditAppStream(pEdit, CFX_FloatPoint(0.0f, fy)) - << "ET\n"; - } - - fy -= fItemHeight; - } - - if (sList.GetSize() > 0) { - sBody << "/Tx BMC\n" - << "q\n" << rcClient.left << " " << rcClient.bottom << " " - << rcClient.Width() << " " << rcClient.Height() << " re\nW\nn\n"; - sBody << sList << "Q\nEMC\n"; - } - - IFX_Edit::DelEdit(pEdit); - } - - CFX_ByteString sAP = GetBackgroundAppStream() + GetBorderAppStream() + - sLines.GetByteString() + sBody.GetByteString(); - - WriteAppearance("N", GetRotatedRect(), GetMatrix(), sAP); -} - -void CPDFSDK_Widget::ResetAppearance_TextField(const FX_WCHAR* sValue) { - CPDF_FormControl* pControl = GetFormControl(); - CPDF_FormField* pField = pControl->GetField(); - CFX_ByteTextBuf sBody, sLines; - - if (IFX_Edit* pEdit = IFX_Edit::NewEdit()) { - pEdit->EnableRefresh(FALSE); - - CPDFSDK_Document* pDoc = m_pInterForm->GetDocument(); - CPDFDoc_Environment* pEnv = pDoc->GetEnv(); - - CBA_FontMap font_map(this, pEnv->GetSysHandler()); - pEdit->SetFontMap(&font_map); - - CFX_FloatRect rcClient = GetClientRect(); - pEdit->SetPlateRect(rcClient); - pEdit->SetAlignmentH(pControl->GetControlAlignment()); - - FX_DWORD dwFieldFlags = pField->GetFieldFlags(); - FX_BOOL bMultiLine = (dwFieldFlags >> 12) & 1; - - if (bMultiLine) { - pEdit->SetMultiLine(TRUE); - pEdit->SetAutoReturn(TRUE); - } else { - pEdit->SetAlignmentV(1); - } - - FX_WORD subWord = 0; - if ((dwFieldFlags >> 13) & 1) { - subWord = '*'; - pEdit->SetPasswordChar(subWord); - } - - int nMaxLen = pField->GetMaxLen(); - FX_BOOL bCharArray = (dwFieldFlags >> 24) & 1; - FX_FLOAT fFontSize = GetFontSize(); - -#ifdef PDF_ENABLE_XFA - CFX_WideString sValueTmp; - if (!sValue && GetMixXFAWidget()) { - sValueTmp = GetValue(TRUE); - sValue = sValueTmp; - } -#endif // PDF_ENABLE_XFA - - if (nMaxLen > 0) { - if (bCharArray) { - pEdit->SetCharArray(nMaxLen); - - if (IsFloatZero(fFontSize)) { - fFontSize = CPWL_Edit::GetCharArrayAutoFontSize( - font_map.GetPDFFont(0), rcClient, nMaxLen); - } - } else { - if (sValue) - nMaxLen = wcslen((const wchar_t*)sValue); - pEdit->SetLimitChar(nMaxLen); - } - } - - if (IsFloatZero(fFontSize)) - pEdit->SetAutoFontSize(TRUE); - else - pEdit->SetFontSize(fFontSize); - - pEdit->Initialize(); - - if (sValue) - pEdit->SetText(sValue); - else - pEdit->SetText(pField->GetValue().c_str()); - - CFX_FloatRect rcContent = pEdit->GetContentRect(); - - CFX_ByteString sEdit = CPWL_Utils::GetEditAppStream( - pEdit, CFX_FloatPoint(0.0f, 0.0f), NULL, !bCharArray, subWord); - - if (sEdit.GetLength() > 0) { - sBody << "/Tx BMC\n" - << "q\n"; - if (rcContent.Width() > rcClient.Width() || - rcContent.Height() > rcClient.Height()) { - sBody << rcClient.left << " " << rcClient.bottom << " " - << rcClient.Width() << " " << rcClient.Height() << " re\nW\nn\n"; - } - CPWL_Color crText = GetTextPWLColor(); - sBody << "BT\n" << CPWL_Utils::GetColorAppStream(crText) << sEdit - << "ET\n" - << "Q\nEMC\n"; - } - - if (bCharArray) { - switch (GetBorderStyle()) { - case BBS_SOLID: { - CFX_ByteString sColor = - CPWL_Utils::GetColorAppStream(GetBorderPWLColor(), FALSE); - if (sColor.GetLength() > 0) { - sLines << "q\n" << GetBorderWidth() << " w\n" - << CPWL_Utils::GetColorAppStream(GetBorderPWLColor(), FALSE) - << " 2 J 0 j\n"; - - for (int32_t i = 1; i < nMaxLen; i++) { - sLines << rcClient.left + - ((rcClient.right - rcClient.left) / nMaxLen) * i - << " " << rcClient.bottom << " m\n" - << rcClient.left + - ((rcClient.right - rcClient.left) / nMaxLen) * i - << " " << rcClient.top << " l S\n"; - } - - sLines << "Q\n"; - } - } break; - case BBS_DASH: { - CFX_ByteString sColor = - CPWL_Utils::GetColorAppStream(GetBorderPWLColor(), FALSE); - if (sColor.GetLength() > 0) { - CPWL_Dash dsBorder = CPWL_Dash(3, 3, 0); - - sLines << "q\n" << GetBorderWidth() << " w\n" - << CPWL_Utils::GetColorAppStream(GetBorderPWLColor(), FALSE) - << "[" << dsBorder.nDash << " " << dsBorder.nGap << "] " - << dsBorder.nPhase << " d\n"; - - for (int32_t i = 1; i < nMaxLen; i++) { - sLines << rcClient.left + - ((rcClient.right - rcClient.left) / nMaxLen) * i - << " " << rcClient.bottom << " m\n" - << rcClient.left + - ((rcClient.right - rcClient.left) / nMaxLen) * i - << " " << rcClient.top << " l S\n"; - } - - sLines << "Q\n"; - } - } break; - } - } - - IFX_Edit::DelEdit(pEdit); - } - - CFX_ByteString sAP = GetBackgroundAppStream() + GetBorderAppStream() + - sLines.GetByteString() + sBody.GetByteString(); - WriteAppearance("N", GetRotatedRect(), GetMatrix(), sAP); -} - -CFX_FloatRect CPDFSDK_Widget::GetClientRect() const { - CFX_FloatRect rcWindow = GetRotatedRect(); - FX_FLOAT fBorderWidth = (FX_FLOAT)GetBorderWidth(); - switch (GetBorderStyle()) { - case BBS_BEVELED: - case BBS_INSET: - fBorderWidth *= 2.0f; - break; - } - - return CPWL_Utils::DeflateRect(rcWindow, fBorderWidth); -} - -CFX_FloatRect CPDFSDK_Widget::GetRotatedRect() const { - CFX_FloatRect rectAnnot = GetRect(); - FX_FLOAT fWidth = rectAnnot.right - rectAnnot.left; - FX_FLOAT fHeight = rectAnnot.top - rectAnnot.bottom; - - CPDF_FormControl* pControl = GetFormControl(); - CFX_FloatRect rcPDFWindow; - switch (abs(pControl->GetRotation() % 360)) { - case 0: - case 180: - default: - rcPDFWindow = CFX_FloatRect(0, 0, fWidth, fHeight); - break; - case 90: - case 270: - rcPDFWindow = CFX_FloatRect(0, 0, fHeight, fWidth); - break; - } - - return rcPDFWindow; -} - -CFX_ByteString CPDFSDK_Widget::GetBackgroundAppStream() const { - CPWL_Color crBackground = GetFillPWLColor(); - if (crBackground.nColorType != COLORTYPE_TRANSPARENT) { - return CPWL_Utils::GetRectFillAppStream(GetRotatedRect(), crBackground); - } - return ""; -} - -CFX_ByteString CPDFSDK_Widget::GetBorderAppStream() const { - CFX_FloatRect rcWindow = GetRotatedRect(); - CPWL_Color crBorder = GetBorderPWLColor(); - CPWL_Color crBackground = GetFillPWLColor(); - CPWL_Color crLeftTop, crRightBottom; - - FX_FLOAT fBorderWidth = (FX_FLOAT)GetBorderWidth(); - int32_t nBorderStyle = 0; - CPWL_Dash dsBorder(3, 0, 0); - - switch (GetBorderStyle()) { - case BBS_DASH: - nBorderStyle = PBS_DASH; - dsBorder = CPWL_Dash(3, 3, 0); - break; - case BBS_BEVELED: - nBorderStyle = PBS_BEVELED; - fBorderWidth *= 2; - crLeftTop = CPWL_Color(COLORTYPE_GRAY, 1); - crRightBottom = CPWL_Utils::DevideColor(crBackground, 2); - break; - case BBS_INSET: - nBorderStyle = PBS_INSET; - fBorderWidth *= 2; - crLeftTop = CPWL_Color(COLORTYPE_GRAY, 0.5); - crRightBottom = CPWL_Color(COLORTYPE_GRAY, 0.75); - break; - case BBS_UNDERLINE: - nBorderStyle = PBS_UNDERLINED; - break; - default: - nBorderStyle = PBS_SOLID; - break; - } - - return CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder, - crLeftTop, crRightBottom, nBorderStyle, - dsBorder); -} - -CFX_Matrix CPDFSDK_Widget::GetMatrix() const { - CFX_Matrix mt; - CPDF_FormControl* pControl = GetFormControl(); - CFX_FloatRect rcAnnot = GetRect(); - FX_FLOAT fWidth = rcAnnot.right - rcAnnot.left; - FX_FLOAT fHeight = rcAnnot.top - rcAnnot.bottom; - - switch (abs(pControl->GetRotation() % 360)) { - case 0: - default: - mt = CFX_Matrix(1, 0, 0, 1, 0, 0); - break; - case 90: - mt = CFX_Matrix(0, 1, -1, 0, fWidth, 0); - break; - case 180: - mt = CFX_Matrix(-1, 0, 0, -1, fWidth, fHeight); - break; - case 270: - mt = CFX_Matrix(0, -1, 1, 0, 0, fHeight); - break; - } - - return mt; -} - -CPWL_Color CPDFSDK_Widget::GetTextPWLColor() const { - CPWL_Color crText = CPWL_Color(COLORTYPE_GRAY, 0); - - CPDF_FormControl* pFormCtrl = GetFormControl(); - CPDF_DefaultAppearance da = pFormCtrl->GetDefaultAppearance(); - if (da.HasColor()) { - int32_t iColorType; - FX_FLOAT fc[4]; - da.GetColor(iColorType, fc); - crText = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]); - } - - return crText; -} - -CPWL_Color CPDFSDK_Widget::GetBorderPWLColor() const { - CPWL_Color crBorder; - - CPDF_FormControl* pFormCtrl = GetFormControl(); - int32_t iColorType; - FX_FLOAT fc[4]; - pFormCtrl->GetOriginalBorderColor(iColorType, fc); - if (iColorType > 0) - crBorder = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]); - - return crBorder; -} - -CPWL_Color CPDFSDK_Widget::GetFillPWLColor() const { - CPWL_Color crFill; - - CPDF_FormControl* pFormCtrl = GetFormControl(); - int32_t iColorType; - FX_FLOAT fc[4]; - pFormCtrl->GetOriginalBackgroundColor(iColorType, fc); - if (iColorType > 0) - crFill = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]); - - return crFill; -} - -void CPDFSDK_Widget::AddImageToAppearance(const CFX_ByteString& sAPType, - CPDF_Stream* pImage) { - CPDF_Document* pDoc = m_pPageView->GetPDFDocument(); - ASSERT(pDoc); - - CPDF_Dictionary* pAPDict = m_pAnnot->GetAnnotDict()->GetDictBy("AP"); - CPDF_Stream* pStream = pAPDict->GetStreamBy(sAPType); - CPDF_Dictionary* pStreamDict = pStream->GetDict(); - CFX_ByteString sImageAlias = "IMG"; - - if (CPDF_Dictionary* pImageDict = pImage->GetDict()) { - sImageAlias = pImageDict->GetStringBy("Name"); - if (sImageAlias.IsEmpty()) - sImageAlias = "IMG"; - } - - CPDF_Dictionary* pStreamResList = pStreamDict->GetDictBy("Resources"); - if (!pStreamResList) { - pStreamResList = new CPDF_Dictionary(); - pStreamDict->SetAt("Resources", pStreamResList); - } - - if (pStreamResList) { - CPDF_Dictionary* pXObject = new CPDF_Dictionary; - pXObject->SetAtReference(sImageAlias, pDoc, pImage); - pStreamResList->SetAt("XObject", pXObject); - } -} - -void CPDFSDK_Widget::RemoveAppearance(const CFX_ByteString& sAPType) { - if (CPDF_Dictionary* pAPDict = m_pAnnot->GetAnnotDict()->GetDictBy("AP")) { - pAPDict->RemoveAt(sAPType); - } -} - -FX_BOOL CPDFSDK_Widget::OnAAction(CPDF_AAction::AActionType type, - PDFSDK_FieldAction& data, - CPDFSDK_PageView* pPageView) { - CPDFSDK_Document* pDocument = pPageView->GetSDKDocument(); - CPDFDoc_Environment* pEnv = pDocument->GetEnv(); - -#ifdef PDF_ENABLE_XFA - CPDFXFA_Document* pDoc = pDocument->GetXFADocument(); - if (IXFA_Widget* hWidget = GetMixXFAWidget()) { - XFA_EVENTTYPE eEventType = GetXFAEventType(type, data.bWillCommit); - - if (eEventType != XFA_EVENT_Unknown) { - if (IXFA_WidgetHandler* pXFAWidgetHandler = GetXFAWidgetHandler()) { - CXFA_EventParam param; - param.m_eType = eEventType; - param.m_wsChange = data.sChange; - param.m_iCommitKey = data.nCommitKey; - param.m_bShift = data.bShift; - param.m_iSelStart = data.nSelStart; - param.m_iSelEnd = data.nSelEnd; - param.m_wsFullText = data.sValue; - param.m_bKeyDown = data.bKeyDown; - param.m_bModifier = data.bModifier; - param.m_wsNewText = data.sValue; - if (data.nSelEnd > data.nSelStart) - param.m_wsNewText.Delete(data.nSelStart, - data.nSelEnd - data.nSelStart); - for (int i = data.sChange.GetLength() - 1; i >= 0; i--) - param.m_wsNewText.Insert(data.nSelStart, data.sChange[i]); - param.m_wsPrevText = data.sValue; - - CXFA_WidgetAcc* pAcc = pXFAWidgetHandler->GetDataAcc(hWidget); - param.m_pTarget = pAcc; - int32_t nRet = pXFAWidgetHandler->ProcessEvent(pAcc, ¶m); - - if (IXFA_DocView* pDocView = pDoc->GetXFADocView()) { - pDocView->UpdateDocView(); - } - - if (nRet == XFA_EVENTERROR_Sucess) - return TRUE; - } - } - } -#endif // PDF_ENABLE_XFA - - CPDF_Action action = GetAAction(type); - if (action.GetDict() && action.GetType() != CPDF_Action::Unknown) { - CPDFSDK_ActionHandler* pActionHandler = pEnv->GetActionHander(); - return pActionHandler->DoAction_Field(action, type, pDocument, - GetFormField(), data); - } - return FALSE; -} - -CPDF_Action CPDFSDK_Widget::GetAAction(CPDF_AAction::AActionType eAAT) { - switch (eAAT) { - case CPDF_AAction::CursorEnter: - case CPDF_AAction::CursorExit: - case CPDF_AAction::ButtonDown: - case CPDF_AAction::ButtonUp: - case CPDF_AAction::GetFocus: - case CPDF_AAction::LoseFocus: - case CPDF_AAction::PageOpen: - case CPDF_AAction::PageClose: - case CPDF_AAction::PageVisible: - case CPDF_AAction::PageInvisible: - return CPDFSDK_BAAnnot::GetAAction(eAAT); - - case CPDF_AAction::KeyStroke: - case CPDF_AAction::Format: - case CPDF_AAction::Validate: - case CPDF_AAction::Calculate: { - CPDF_FormField* pField = GetFormField(); - if (pField->GetAdditionalAction().GetDict()) - return pField->GetAdditionalAction().GetAction(eAAT); - return CPDFSDK_BAAnnot::GetAAction(eAAT); - } - default: - break; - } - - return CPDF_Action(); -} - -CFX_WideString CPDFSDK_Widget::GetAlternateName() const { - CPDF_FormField* pFormField = GetFormField(); - return pFormField->GetAlternateName(); -} - -int32_t CPDFSDK_Widget::GetAppearanceAge() const { - return m_nAppAge; -} - -int32_t CPDFSDK_Widget::GetValueAge() const { - return m_nValueAge; -} - -FX_BOOL CPDFSDK_Widget::HitTest(FX_FLOAT pageX, FX_FLOAT pageY) { - CPDF_Annot* pAnnot = GetPDFAnnot(); - CFX_FloatRect annotRect; - pAnnot->GetRect(annotRect); - if (annotRect.Contains(pageX, pageY)) { - if (!IsVisible()) - return FALSE; - - int nFieldFlags = GetFieldFlags(); - if ((nFieldFlags & FIELDFLAG_READONLY) == FIELDFLAG_READONLY) - return FALSE; - - return TRUE; - } - return FALSE; -} - -#ifdef PDF_ENABLE_XFA -CPDFSDK_XFAWidget::CPDFSDK_XFAWidget(IXFA_Widget* pAnnot, - CPDFSDK_PageView* pPageView, - CPDFSDK_InterForm* pInterForm) - : CPDFSDK_Annot(pPageView), m_pInterForm(pInterForm), m_hXFAWidget(pAnnot) { -} - -FX_BOOL CPDFSDK_XFAWidget::IsXFAField() { - return TRUE; -} - -CFX_ByteString CPDFSDK_XFAWidget::GetType() const { - return FSDK_XFAWIDGET_TYPENAME; -} - -CFX_FloatRect CPDFSDK_XFAWidget::GetRect() const { - CPDFSDK_PageView* pPageView = GetPageView(); - CPDFSDK_Document* pDocument = pPageView->GetSDKDocument(); - CPDFXFA_Document* pDoc = pDocument->GetXFADocument(); - IXFA_DocView* pDocView = pDoc->GetXFADocView(); - IXFA_WidgetHandler* pWidgetHandler = pDocView->GetWidgetHandler(); - - CFX_RectF rcBBox; - pWidgetHandler->GetRect(GetXFAWidget(), rcBBox); - - return CFX_FloatRect(rcBBox.left, rcBBox.top, rcBBox.left + rcBBox.width, - rcBBox.top + rcBBox.height); -} -#endif // PDF_ENABLE_XFA - -CPDFSDK_InterForm::CPDFSDK_InterForm(CPDFSDK_Document* pDocument) - : m_pDocument(pDocument), - m_pInterForm(NULL), -#ifdef PDF_ENABLE_XFA - m_bXfaCalculate(TRUE), - m_bXfaValidationsEnabled(TRUE), -#endif // PDF_ENABLE_XFA - m_bCalculate(TRUE), - m_bBusy(FALSE) { - m_pInterForm = new CPDF_InterForm(m_pDocument->GetPDFDocument(), FALSE); - m_pInterForm->SetFormNotify(this); - - for (int i = 0; i < kNumFieldTypes; ++i) - m_bNeedHightlight[i] = FALSE; - m_iHighlightAlpha = 0; -} - -CPDFSDK_InterForm::~CPDFSDK_InterForm() { - delete m_pInterForm; - m_pInterForm = nullptr; - m_Map.clear(); -#ifdef PDF_ENABLE_XFA - m_XFAMap.RemoveAll(); -#endif // PDF_ENABLE_XFA -} - -FX_BOOL CPDFSDK_InterForm::HighlightWidgets() { - return FALSE; -} - -CPDFSDK_Widget* CPDFSDK_InterForm::GetSibling(CPDFSDK_Widget* pWidget, - FX_BOOL bNext) const { - std::unique_ptr<CBA_AnnotIterator> pIterator( - new CBA_AnnotIterator(pWidget->GetPageView(), "Widget", "")); - - if (bNext) { - return (CPDFSDK_Widget*)pIterator->GetNextAnnot(pWidget); - } - return (CPDFSDK_Widget*)pIterator->GetPrevAnnot(pWidget); -} - -CPDFSDK_Widget* CPDFSDK_InterForm::GetWidget(CPDF_FormControl* pControl) const { - if (!pControl || !m_pInterForm) - return nullptr; - - CPDFSDK_Widget* pWidget = nullptr; - const auto it = m_Map.find(pControl); - if (it != m_Map.end()) - pWidget = it->second; - - if (pWidget) - return pWidget; - - CPDF_Dictionary* pControlDict = pControl->GetWidget(); - CPDF_Document* pDocument = m_pDocument->GetPDFDocument(); - CPDFSDK_PageView* pPage = nullptr; - - if (CPDF_Dictionary* pPageDict = pControlDict->GetDictBy("P")) { - int nPageIndex = pDocument->GetPageIndex(pPageDict->GetObjNum()); - if (nPageIndex >= 0) { - pPage = m_pDocument->GetPageView(nPageIndex); - } - } - - if (!pPage) { - int nPageIndex = GetPageIndexByAnnotDict(pDocument, pControlDict); - if (nPageIndex >= 0) { - pPage = m_pDocument->GetPageView(nPageIndex); - } - } - - if (!pPage) - return nullptr; - return (CPDFSDK_Widget*)pPage->GetAnnotByDict(pControlDict); -} - -void CPDFSDK_InterForm::GetWidgets( - const CFX_WideString& sFieldName, - std::vector<CPDFSDK_Widget*>* widgets) const { - for (int i = 0, sz = m_pInterForm->CountFields(sFieldName); i < sz; ++i) { - CPDF_FormField* pFormField = m_pInterForm->GetField(i, sFieldName); - ASSERT(pFormField); - GetWidgets(pFormField, widgets); - } -} - -void CPDFSDK_InterForm::GetWidgets( - CPDF_FormField* pField, - std::vector<CPDFSDK_Widget*>* widgets) const { - for (int i = 0, sz = pField->CountControls(); i < sz; ++i) { - CPDF_FormControl* pFormCtrl = pField->GetControl(i); - ASSERT(pFormCtrl); - CPDFSDK_Widget* pWidget = GetWidget(pFormCtrl); - if (pWidget) - widgets->push_back(pWidget); - } -} - -int CPDFSDK_InterForm::GetPageIndexByAnnotDict( - CPDF_Document* pDocument, - CPDF_Dictionary* pAnnotDict) const { - ASSERT(pAnnotDict); - - for (int i = 0, sz = pDocument->GetPageCount(); i < sz; i++) { - if (CPDF_Dictionary* pPageDict = pDocument->GetPage(i)) { - if (CPDF_Array* pAnnots = pPageDict->GetArrayBy("Annots")) { - for (int j = 0, jsz = pAnnots->GetCount(); j < jsz; j++) { - CPDF_Object* pDict = pAnnots->GetElementValue(j); - if (pAnnotDict == pDict) { - return i; - } - } - } - } - } - - return -1; -} - -void CPDFSDK_InterForm::AddMap(CPDF_FormControl* pControl, - CPDFSDK_Widget* pWidget) { - m_Map[pControl] = pWidget; -} - -void CPDFSDK_InterForm::RemoveMap(CPDF_FormControl* pControl) { - m_Map.erase(pControl); -} - -void CPDFSDK_InterForm::EnableCalculate(FX_BOOL bEnabled) { - m_bCalculate = bEnabled; -} - -FX_BOOL CPDFSDK_InterForm::IsCalculateEnabled() const { - return m_bCalculate; -} - -#ifdef PDF_ENABLE_XFA -void CPDFSDK_InterForm::AddXFAMap(IXFA_Widget* hWidget, - CPDFSDK_XFAWidget* pWidget) { - m_XFAMap.SetAt(hWidget, pWidget); -} - -void CPDFSDK_InterForm::RemoveXFAMap(IXFA_Widget* hWidget) { - m_XFAMap.RemoveKey(hWidget); -} - -CPDFSDK_XFAWidget* CPDFSDK_InterForm::GetXFAWidget(IXFA_Widget* hWidget) { - CPDFSDK_XFAWidget* pWidget = NULL; - m_XFAMap.Lookup(hWidget, pWidget); - - return pWidget; -} - -void CPDFSDK_InterForm::XfaEnableCalculate(FX_BOOL bEnabled) { - m_bXfaCalculate = bEnabled; -} -FX_BOOL CPDFSDK_InterForm::IsXfaCalculateEnabled() const { - return m_bXfaCalculate; -} - -FX_BOOL CPDFSDK_InterForm::IsXfaValidationsEnabled() { - return m_bXfaValidationsEnabled; -} -void CPDFSDK_InterForm::XfaSetValidationsEnabled(FX_BOOL bEnabled) { - m_bXfaValidationsEnabled = bEnabled; -} -#endif // PDF_ENABLE_XFA - -void CPDFSDK_InterForm::OnCalculate(CPDF_FormField* pFormField) { - CPDFDoc_Environment* pEnv = m_pDocument->GetEnv(); - ASSERT(pEnv); - if (!pEnv->IsJSInitiated()) - return; - - if (m_bBusy) - return; - - m_bBusy = TRUE; - - if (IsCalculateEnabled()) { - IJS_Runtime* pRuntime = m_pDocument->GetJsRuntime(); - pRuntime->SetReaderDocument(m_pDocument); - - int nSize = m_pInterForm->CountFieldsInCalculationOrder(); - for (int i = 0; i < nSize; i++) { - if (CPDF_FormField* pField = - m_pInterForm->GetFieldInCalculationOrder(i)) { - int nType = pField->GetFieldType(); - if (nType == FIELDTYPE_COMBOBOX || nType == FIELDTYPE_TEXTFIELD) { - CPDF_AAction aAction = pField->GetAdditionalAction(); - if (aAction.GetDict() && - aAction.ActionExist(CPDF_AAction::Calculate)) { - CPDF_Action action = aAction.GetAction(CPDF_AAction::Calculate); - if (action.GetDict()) { - CFX_WideString csJS = action.GetJavaScript(); - if (!csJS.IsEmpty()) { - IJS_Context* pContext = pRuntime->NewContext(); - CFX_WideString sOldValue = pField->GetValue(); - CFX_WideString sValue = sOldValue; - FX_BOOL bRC = TRUE; - pContext->OnField_Calculate(pFormField, pField, sValue, bRC); - - CFX_WideString sInfo; - FX_BOOL bRet = pContext->RunScript(csJS, &sInfo); - pRuntime->ReleaseContext(pContext); - - if (bRet) { - if (bRC) { - if (sValue.Compare(sOldValue) != 0) - pField->SetValue(sValue, TRUE); - } - } - } - } - } - } - } - } - } - - m_bBusy = FALSE; -} - -CFX_WideString CPDFSDK_InterForm::OnFormat(CPDF_FormField* pFormField, - FX_BOOL& bFormated) { - CFX_WideString sValue = pFormField->GetValue(); - CPDFDoc_Environment* pEnv = m_pDocument->GetEnv(); - ASSERT(pEnv); - if (!pEnv->IsJSInitiated()) { - bFormated = FALSE; - return sValue; - } - - IJS_Runtime* pRuntime = m_pDocument->GetJsRuntime(); - pRuntime->SetReaderDocument(m_pDocument); - - if (pFormField->GetFieldType() == FIELDTYPE_COMBOBOX) { - if (pFormField->CountSelectedItems() > 0) { - int index = pFormField->GetSelectedIndex(0); - if (index >= 0) - sValue = pFormField->GetOptionLabel(index); - } - } - - bFormated = FALSE; - - CPDF_AAction aAction = pFormField->GetAdditionalAction(); - if (aAction.GetDict() && aAction.ActionExist(CPDF_AAction::Format)) { - CPDF_Action action = aAction.GetAction(CPDF_AAction::Format); - if (action.GetDict()) { - CFX_WideString script = action.GetJavaScript(); - if (!script.IsEmpty()) { - CFX_WideString Value = sValue; - - IJS_Context* pContext = pRuntime->NewContext(); - pContext->OnField_Format(pFormField, Value, TRUE); - - CFX_WideString sInfo; - FX_BOOL bRet = pContext->RunScript(script, &sInfo); - pRuntime->ReleaseContext(pContext); - - if (bRet) { - sValue = Value; - bFormated = TRUE; - } - } - } - } - - return sValue; -} - -void CPDFSDK_InterForm::ResetFieldAppearance(CPDF_FormField* pFormField, - const FX_WCHAR* sValue, - FX_BOOL bValueChanged) { - for (int i = 0, sz = pFormField->CountControls(); i < sz; i++) { - CPDF_FormControl* pFormCtrl = pFormField->GetControl(i); - ASSERT(pFormCtrl); - if (CPDFSDK_Widget* pWidget = GetWidget(pFormCtrl)) - pWidget->ResetAppearance(sValue, bValueChanged); - } -} - -void CPDFSDK_InterForm::UpdateField(CPDF_FormField* pFormField) { - for (int i = 0, sz = pFormField->CountControls(); i < sz; i++) { - CPDF_FormControl* pFormCtrl = pFormField->GetControl(i); - ASSERT(pFormCtrl); - - if (CPDFSDK_Widget* pWidget = GetWidget(pFormCtrl)) { - CPDFDoc_Environment* pEnv = m_pDocument->GetEnv(); - CFFL_IFormFiller* pIFormFiller = pEnv->GetIFormFiller(); - UnderlyingPageType* pPage = pWidget->GetUnderlyingPage(); - CPDFSDK_PageView* pPageView = m_pDocument->GetPageView(pPage, FALSE); - FX_RECT rcBBox = pIFormFiller->GetViewBBox(pPageView, pWidget); - - pEnv->FFI_Invalidate(pPage, rcBBox.left, rcBBox.top, rcBBox.right, - rcBBox.bottom); - } - } -} - -FX_BOOL CPDFSDK_InterForm::OnKeyStrokeCommit(CPDF_FormField* pFormField, - const CFX_WideString& csValue) { - CPDF_AAction aAction = pFormField->GetAdditionalAction(); - if (!aAction.GetDict() || !aAction.ActionExist(CPDF_AAction::KeyStroke)) - return TRUE; - - CPDF_Action action = aAction.GetAction(CPDF_AAction::KeyStroke); - if (!action.GetDict()) - return TRUE; - - CPDFDoc_Environment* pEnv = m_pDocument->GetEnv(); - CPDFSDK_ActionHandler* pActionHandler = pEnv->GetActionHander(); - PDFSDK_FieldAction fa; - fa.bModifier = pEnv->FFI_IsCTRLKeyDown(0); - fa.bShift = pEnv->FFI_IsSHIFTKeyDown(0); - fa.sValue = csValue; - pActionHandler->DoAction_FieldJavaScript(action, CPDF_AAction::KeyStroke, - m_pDocument, pFormField, fa); - return fa.bRC; -} - -FX_BOOL CPDFSDK_InterForm::OnValidate(CPDF_FormField* pFormField, - const CFX_WideString& csValue) { - CPDF_AAction aAction = pFormField->GetAdditionalAction(); - if (!aAction.GetDict() || !aAction.ActionExist(CPDF_AAction::Validate)) - return TRUE; - - CPDF_Action action = aAction.GetAction(CPDF_AAction::Validate); - if (!action.GetDict()) - return TRUE; - - CPDFDoc_Environment* pEnv = m_pDocument->GetEnv(); - CPDFSDK_ActionHandler* pActionHandler = pEnv->GetActionHander(); - PDFSDK_FieldAction fa; - fa.bModifier = pEnv->FFI_IsCTRLKeyDown(0); - fa.bShift = pEnv->FFI_IsSHIFTKeyDown(0); - fa.sValue = csValue; - pActionHandler->DoAction_FieldJavaScript(action, CPDF_AAction::Validate, - m_pDocument, pFormField, fa); - return fa.bRC; -} - -FX_BOOL CPDFSDK_InterForm::DoAction_Hide(const CPDF_Action& action) { - ASSERT(action.GetDict()); - - CPDF_ActionFields af(&action); - std::vector<CPDF_Object*> fieldObjects = af.GetAllFields(); - std::vector<CPDF_FormField*> fields = GetFieldFromObjects(fieldObjects); - - FX_BOOL bHide = action.GetHideStatus(); - FX_BOOL bChanged = FALSE; - - for (CPDF_FormField* pField : fields) { - for (int i = 0, sz = pField->CountControls(); i < sz; ++i) { - CPDF_FormControl* pControl = pField->GetControl(i); - ASSERT(pControl); - - if (CPDFSDK_Widget* pWidget = GetWidget(pControl)) { - FX_DWORD nFlags = pWidget->GetFlags(); - nFlags &= ~ANNOTFLAG_INVISIBLE; - nFlags &= ~ANNOTFLAG_NOVIEW; - if (bHide) - nFlags |= ANNOTFLAG_HIDDEN; - else - nFlags &= ~ANNOTFLAG_HIDDEN; - pWidget->SetFlags(nFlags); - pWidget->GetPageView()->UpdateView(pWidget); - bChanged = TRUE; - } - } - } - - return bChanged; -} - -FX_BOOL CPDFSDK_InterForm::DoAction_SubmitForm(const CPDF_Action& action) { - CFX_WideString sDestination = action.GetFilePath(); - if (sDestination.IsEmpty()) - return FALSE; - - CPDF_Dictionary* pActionDict = action.GetDict(); - if (pActionDict->KeyExist("Fields")) { - CPDF_ActionFields af(&action); - FX_DWORD dwFlags = action.GetFlags(); - std::vector<CPDF_Object*> fieldObjects = af.GetAllFields(); - std::vector<CPDF_FormField*> fields = GetFieldFromObjects(fieldObjects); - if (!fields.empty()) { - bool bIncludeOrExclude = !(dwFlags & 0x01); - if (m_pInterForm->CheckRequiredFields(&fields, bIncludeOrExclude)) - return FALSE; - - return SubmitFields(sDestination, fields, bIncludeOrExclude, false); - } - } - if (m_pInterForm->CheckRequiredFields(nullptr, true)) - return FALSE; - - return SubmitForm(sDestination, FALSE); -} - -FX_BOOL CPDFSDK_InterForm::SubmitFields( - const CFX_WideString& csDestination, - const std::vector<CPDF_FormField*>& fields, - bool bIncludeOrExclude, - bool bUrlEncoded) { - CPDFDoc_Environment* pEnv = m_pDocument->GetEnv(); - - CFX_ByteTextBuf textBuf; - ExportFieldsToFDFTextBuf(fields, bIncludeOrExclude, textBuf); - - uint8_t* pBuffer = textBuf.GetBuffer(); - FX_STRSIZE nBufSize = textBuf.GetLength(); - - if (bUrlEncoded && !FDFToURLEncodedData(pBuffer, nBufSize)) - return FALSE; - - pEnv->JS_docSubmitForm(pBuffer, nBufSize, csDestination.c_str()); - return TRUE; -} - -FX_BOOL CPDFSDK_InterForm::FDFToURLEncodedData(CFX_WideString csFDFFile, - CFX_WideString csTxtFile) { - return TRUE; -} - -FX_BOOL CPDFSDK_InterForm::FDFToURLEncodedData(uint8_t*& pBuf, - FX_STRSIZE& nBufSize) { - CFDF_Document* pFDF = CFDF_Document::ParseMemory(pBuf, nBufSize); - if (pFDF) { - CPDF_Dictionary* pMainDict = pFDF->GetRoot()->GetDictBy("FDF"); - if (!pMainDict) - return FALSE; - - // Get fields - CPDF_Array* pFields = pMainDict->GetArrayBy("Fields"); - if (!pFields) - return FALSE; - - CFX_ByteTextBuf fdfEncodedData; - for (FX_DWORD i = 0; i < pFields->GetCount(); i++) { - CPDF_Dictionary* pField = pFields->GetDictAt(i); - if (!pField) - continue; - CFX_WideString name; - name = pField->GetUnicodeTextBy("T"); - CFX_ByteString name_b = CFX_ByteString::FromUnicode(name); - CFX_ByteString csBValue = pField->GetStringBy("V"); - CFX_WideString csWValue = PDF_DecodeText(csBValue); - CFX_ByteString csValue_b = CFX_ByteString::FromUnicode(csWValue); - - fdfEncodedData << name_b.GetBuffer(name_b.GetLength()); - name_b.ReleaseBuffer(); - fdfEncodedData << "="; - fdfEncodedData << csValue_b.GetBuffer(csValue_b.GetLength()); - csValue_b.ReleaseBuffer(); - if (i != pFields->GetCount() - 1) - fdfEncodedData << "&"; - } - - nBufSize = fdfEncodedData.GetLength(); - pBuf = FX_Alloc(uint8_t, nBufSize); - FXSYS_memcpy(pBuf, fdfEncodedData.GetBuffer(), nBufSize); - } - return TRUE; -} - -FX_BOOL CPDFSDK_InterForm::ExportFieldsToFDFTextBuf( - const std::vector<CPDF_FormField*>& fields, - bool bIncludeOrExclude, - CFX_ByteTextBuf& textBuf) { - std::unique_ptr<CFDF_Document> pFDF(m_pInterForm->ExportToFDF( - m_pDocument->GetPath(), fields, bIncludeOrExclude)); - return pFDF ? pFDF->WriteBuf(textBuf) : FALSE; -} - -#ifdef PDF_ENABLE_XFA -void CPDFSDK_InterForm::SynchronizeField(CPDF_FormField* pFormField, - FX_BOOL bSynchronizeElse) { - int x = 0; - if (m_FieldSynchronizeMap.Lookup(pFormField, x)) - return; - - for (int i = 0, sz = pFormField->CountControls(); i < sz; i++) { - CPDF_FormControl* pFormCtrl = pFormField->GetControl(i); - ASSERT(pFormCtrl); - ASSERT(m_pInterForm); - if (CPDFSDK_Widget* pWidget = GetWidget(pFormCtrl)) { - pWidget->Synchronize(bSynchronizeElse); - } - } -} -#endif // PDF_ENABLE_XFA - -CFX_WideString CPDFSDK_InterForm::GetTemporaryFileName( - const CFX_WideString& sFileExt) { - CFX_WideString sFileName; - return L""; -} - -FX_BOOL CPDFSDK_InterForm::SubmitForm(const CFX_WideString& sDestination, - FX_BOOL bUrlEncoded) { - if (sDestination.IsEmpty()) - return FALSE; - - if (!m_pDocument || !m_pInterForm) - return FALSE; - - CPDFDoc_Environment* pEnv = m_pDocument->GetEnv(); - CFX_WideString wsPDFFilePath = m_pDocument->GetPath(); - CFDF_Document* pFDFDoc = m_pInterForm->ExportToFDF(wsPDFFilePath); - if (!pFDFDoc) - return FALSE; - - CFX_ByteTextBuf FdfBuffer; - FX_BOOL bRet = pFDFDoc->WriteBuf(FdfBuffer); - delete pFDFDoc; - if (!bRet) - return FALSE; - - uint8_t* pBuffer = FdfBuffer.GetBuffer(); - FX_STRSIZE nBufSize = FdfBuffer.GetLength(); - - if (bUrlEncoded) { - if (!FDFToURLEncodedData(pBuffer, nBufSize)) - return FALSE; - } - - pEnv->JS_docSubmitForm(pBuffer, nBufSize, sDestination.c_str()); - - if (bUrlEncoded) { - FX_Free(pBuffer); - pBuffer = NULL; - } - - return TRUE; -} - -FX_BOOL CPDFSDK_InterForm::ExportFormToFDFTextBuf(CFX_ByteTextBuf& textBuf) { - CFDF_Document* pFDF = m_pInterForm->ExportToFDF(m_pDocument->GetPath()); - if (!pFDF) - return FALSE; - - FX_BOOL bRet = pFDF->WriteBuf(textBuf); - delete pFDF; - - return bRet; -} - -FX_BOOL CPDFSDK_InterForm::DoAction_ResetForm(const CPDF_Action& action) { - ASSERT(action.GetDict()); - - CPDF_Dictionary* pActionDict = action.GetDict(); - if (!pActionDict->KeyExist("Fields")) - return m_pInterForm->ResetForm(true); - - CPDF_ActionFields af(&action); - FX_DWORD dwFlags = action.GetFlags(); - - std::vector<CPDF_Object*> fieldObjects = af.GetAllFields(); - std::vector<CPDF_FormField*> fields = GetFieldFromObjects(fieldObjects); - return m_pInterForm->ResetForm(fields, !(dwFlags & 0x01), true); -} - -FX_BOOL CPDFSDK_InterForm::DoAction_ImportData(const CPDF_Action& action) { - return FALSE; -} - -std::vector<CPDF_FormField*> CPDFSDK_InterForm::GetFieldFromObjects( - const std::vector<CPDF_Object*>& objects) const { - std::vector<CPDF_FormField*> fields; - for (CPDF_Object* pObject : objects) { - if (pObject && pObject->IsString()) { - CFX_WideString csName = pObject->GetUnicodeText(); - CPDF_FormField* pField = m_pInterForm->GetField(0, csName); - if (pField) - fields.push_back(pField); - } - } - return fields; -} - -int CPDFSDK_InterForm::BeforeValueChange(CPDF_FormField* pField, - const CFX_WideString& csValue) { - int nType = pField->GetFieldType(); - if (nType != FIELDTYPE_COMBOBOX && nType != FIELDTYPE_TEXTFIELD) - return 0; - - if (!OnKeyStrokeCommit(pField, csValue)) - return -1; - - if (!OnValidate(pField, csValue)) - return -1; - - return 1; -} - -void CPDFSDK_InterForm::AfterValueChange(CPDF_FormField* pField) { -#ifdef PDF_ENABLE_XFA - SynchronizeField(pField, FALSE); -#endif // PDF_ENABLE_XFA - int nType = pField->GetFieldType(); - if (nType == FIELDTYPE_COMBOBOX || nType == FIELDTYPE_TEXTFIELD) { - OnCalculate(pField); - FX_BOOL bFormated = FALSE; - CFX_WideString sValue = OnFormat(pField, bFormated); - ResetFieldAppearance(pField, bFormated ? sValue.c_str() : nullptr, TRUE); - UpdateField(pField); - } -} - -int CPDFSDK_InterForm::BeforeSelectionChange(CPDF_FormField* pField, - const CFX_WideString& csValue) { - if (pField->GetFieldType() != FIELDTYPE_LISTBOX) - return 0; - - if (!OnKeyStrokeCommit(pField, csValue)) - return -1; - - if (!OnValidate(pField, csValue)) - return -1; - - return 1; -} - -void CPDFSDK_InterForm::AfterSelectionChange(CPDF_FormField* pField) { - if (pField->GetFieldType() == FIELDTYPE_LISTBOX) { - OnCalculate(pField); - ResetFieldAppearance(pField, NULL, TRUE); - UpdateField(pField); - } -} - -void CPDFSDK_InterForm::AfterCheckedStatusChange(CPDF_FormField* pField) { - int nType = pField->GetFieldType(); - if (nType == FIELDTYPE_CHECKBOX || nType == FIELDTYPE_RADIOBUTTON) { - OnCalculate(pField); - UpdateField(pField); - } -} - -int CPDFSDK_InterForm::BeforeFormReset(CPDF_InterForm* pForm) { - return 0; -} - -void CPDFSDK_InterForm::AfterFormReset(CPDF_InterForm* pForm) { - OnCalculate(nullptr); -} - -int CPDFSDK_InterForm::BeforeFormImportData(CPDF_InterForm* pForm) { - return 0; -} - -void CPDFSDK_InterForm::AfterFormImportData(CPDF_InterForm* pForm) { - OnCalculate(nullptr); -} - -FX_BOOL CPDFSDK_InterForm::IsNeedHighLight(int nFieldType) { - if (nFieldType < 1 || nFieldType > kNumFieldTypes) - return FALSE; - return m_bNeedHightlight[nFieldType - 1]; -} - -void CPDFSDK_InterForm::RemoveAllHighLight() { - for (int i = 0; i < kNumFieldTypes; ++i) - m_bNeedHightlight[i] = FALSE; -} - -void CPDFSDK_InterForm::SetHighlightColor(FX_COLORREF clr, int nFieldType) { - if (nFieldType < 0 || nFieldType > kNumFieldTypes) - return; - switch (nFieldType) { - case 0: { - for (int i = 0; i < kNumFieldTypes; ++i) { - m_aHighlightColor[i] = clr; - m_bNeedHightlight[i] = TRUE; - } - break; - } - default: { - m_aHighlightColor[nFieldType - 1] = clr; - m_bNeedHightlight[nFieldType - 1] = TRUE; - break; - } - } -} - -FX_COLORREF CPDFSDK_InterForm::GetHighlightColor(int nFieldType) { - if (nFieldType < 0 || nFieldType > kNumFieldTypes) - return FXSYS_RGB(255, 255, 255); - if (nFieldType == 0) - return m_aHighlightColor[0]; - return m_aHighlightColor[nFieldType - 1]; -} - -CBA_AnnotIterator::CBA_AnnotIterator(CPDFSDK_PageView* pPageView, - const CFX_ByteString& sType, - const CFX_ByteString& sSubType) - : m_eTabOrder(STRUCTURE), - m_pPageView(pPageView), - m_sType(sType), - m_sSubType(sSubType) { - CPDF_Page* pPDFPage = m_pPageView->GetPDFPage(); - CFX_ByteString sTabs = pPDFPage->m_pFormDict->GetStringBy("Tabs"); - if (sTabs == "R") - m_eTabOrder = ROW; - else if (sTabs == "C") - m_eTabOrder = COLUMN; - - GenerateResults(); -} - -CBA_AnnotIterator::~CBA_AnnotIterator() { -} - -CPDFSDK_Annot* CBA_AnnotIterator::GetFirstAnnot() { - return m_Annots.empty() ? nullptr : m_Annots.front(); -} - -CPDFSDK_Annot* CBA_AnnotIterator::GetLastAnnot() { - return m_Annots.empty() ? nullptr : m_Annots.back(); -} - -CPDFSDK_Annot* CBA_AnnotIterator::GetNextAnnot(CPDFSDK_Annot* pAnnot) { - auto iter = std::find(m_Annots.begin(), m_Annots.end(), pAnnot); - if (iter == m_Annots.end()) - return nullptr; - ++iter; - if (iter == m_Annots.end()) - iter = m_Annots.begin(); - return *iter; -} - -CPDFSDK_Annot* CBA_AnnotIterator::GetPrevAnnot(CPDFSDK_Annot* pAnnot) { - auto iter = std::find(m_Annots.begin(), m_Annots.end(), pAnnot); - if (iter == m_Annots.end()) - return nullptr; - if (iter == m_Annots.begin()) - iter = m_Annots.end(); - return *(--iter); -} - -// static -bool CBA_AnnotIterator::CompareByLeftAscending(const CPDFSDK_Annot* p1, - const CPDFSDK_Annot* p2) { - return GetAnnotRect(p1).left < GetAnnotRect(p2).left; -} - -// static -bool CBA_AnnotIterator::CompareByTopDescending(const CPDFSDK_Annot* p1, - const CPDFSDK_Annot* p2) { - return GetAnnotRect(p1).top > GetAnnotRect(p2).top; -} - -void CBA_AnnotIterator::GenerateResults() { - switch (m_eTabOrder) { - case STRUCTURE: { - for (size_t i = 0; i < m_pPageView->CountAnnots(); ++i) { - CPDFSDK_Annot* pAnnot = m_pPageView->GetAnnot(i); - if (pAnnot->GetType() == m_sType && pAnnot->GetSubType() == m_sSubType) - m_Annots.push_back(pAnnot); - } - } break; - case ROW: { - std::vector<CPDFSDK_Annot*> sa; - for (size_t i = 0; i < m_pPageView->CountAnnots(); ++i) { - CPDFSDK_Annot* pAnnot = m_pPageView->GetAnnot(i); - if (pAnnot->GetType() == m_sType && pAnnot->GetSubType() == m_sSubType) - sa.push_back(pAnnot); - } - - std::sort(sa.begin(), sa.end(), CompareByLeftAscending); - while (!sa.empty()) { - int nLeftTopIndex = -1; - FX_FLOAT fTop = 0.0f; - for (int i = sa.size() - 1; i >= 0; i--) { - CFX_FloatRect rcAnnot = GetAnnotRect(sa[i]); - if (rcAnnot.top > fTop) { - nLeftTopIndex = i; - fTop = rcAnnot.top; - } - } - if (nLeftTopIndex >= 0) { - CPDFSDK_Annot* pLeftTopAnnot = sa[nLeftTopIndex]; - CFX_FloatRect rcLeftTop = GetAnnotRect(pLeftTopAnnot); - m_Annots.push_back(pLeftTopAnnot); - sa.erase(sa.begin() + nLeftTopIndex); - - std::vector<int> aSelect; - for (int i = 0; i < sa.size(); ++i) { - CFX_FloatRect rcAnnot = GetAnnotRect(sa[i]); - FX_FLOAT fCenterY = (rcAnnot.top + rcAnnot.bottom) / 2.0f; - if (fCenterY > rcLeftTop.bottom && fCenterY < rcLeftTop.top) - aSelect.push_back(i); - } - for (int i = 0; i < aSelect.size(); ++i) - m_Annots.push_back(sa[aSelect[i]]); - - for (int i = aSelect.size() - 1; i >= 0; --i) - sa.erase(sa.begin() + aSelect[i]); - } - } - } break; - case COLUMN: { - std::vector<CPDFSDK_Annot*> sa; - for (size_t i = 0; i < m_pPageView->CountAnnots(); ++i) { - CPDFSDK_Annot* pAnnot = m_pPageView->GetAnnot(i); - if (pAnnot->GetType() == m_sType && pAnnot->GetSubType() == m_sSubType) - sa.push_back(pAnnot); - } - - std::sort(sa.begin(), sa.end(), CompareByTopDescending); - while (!sa.empty()) { - int nLeftTopIndex = -1; - FX_FLOAT fLeft = -1.0f; - for (int i = sa.size() - 1; i >= 0; --i) { - CFX_FloatRect rcAnnot = GetAnnotRect(sa[i]); - if (fLeft < 0) { - nLeftTopIndex = 0; - fLeft = rcAnnot.left; - } else if (rcAnnot.left < fLeft) { - nLeftTopIndex = i; - fLeft = rcAnnot.left; - } - } - - if (nLeftTopIndex >= 0) { - CPDFSDK_Annot* pLeftTopAnnot = sa[nLeftTopIndex]; - CFX_FloatRect rcLeftTop = GetAnnotRect(pLeftTopAnnot); - m_Annots.push_back(pLeftTopAnnot); - sa.erase(sa.begin() + nLeftTopIndex); - - std::vector<int> aSelect; - for (int i = 0; i < sa.size(); ++i) { - CFX_FloatRect rcAnnot = GetAnnotRect(sa[i]); - FX_FLOAT fCenterX = (rcAnnot.left + rcAnnot.right) / 2.0f; - if (fCenterX > rcLeftTop.left && fCenterX < rcLeftTop.right) - aSelect.push_back(i); - } - for (int i = 0; i < aSelect.size(); ++i) - m_Annots.push_back(sa[aSelect[i]]); - - for (int i = aSelect.size() - 1; i >= 0; --i) - sa.erase(sa.begin() + aSelect[i]); - } - } - break; - } - } -} - -CFX_FloatRect CBA_AnnotIterator::GetAnnotRect(const CPDFSDK_Annot* pAnnot) { - CFX_FloatRect rcAnnot; - pAnnot->GetPDFAnnot()->GetRect(rcAnnot); - return rcAnnot; -} diff --git a/fpdfsdk/src/fsdk_baseform_embeddertest.cpp b/fpdfsdk/src/fsdk_baseform_embeddertest.cpp deleted file mode 100644 index 4fd3bb785c..0000000000 --- a/fpdfsdk/src/fsdk_baseform_embeddertest.cpp +++ /dev/null @@ -1,115 +0,0 @@ -// Copyright 2016 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "fpdfsdk/include/fsdk_baseform.h" -#include "fpdfsdk/include/fsdk_define.h" -#include "fpdfsdk/include/fsdk_mgr.h" -#include "testing/embedder_test.h" -#include "testing/embedder_test_mock_delegate.h" -#include "testing/embedder_test_timer_handling_delegate.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace { - -void CheckRect(const CFX_FloatRect& actual, const CFX_FloatRect& expected) { - EXPECT_EQ(expected.left, actual.left); - EXPECT_EQ(expected.bottom, actual.bottom); - EXPECT_EQ(expected.right, actual.right); - EXPECT_EQ(expected.top, actual.top); -} - -} // namespace - -class FSDKBaseFormEmbeddertest : public EmbedderTest {}; - -TEST_F(FSDKBaseFormEmbeddertest, CBA_AnnotIterator) { - EXPECT_TRUE(OpenDocument("annotiter.pdf")); - EXPECT_TRUE(LoadPage(0)); - EXPECT_TRUE(LoadPage(1)); - EXPECT_TRUE(LoadPage(2)); - - CFX_FloatRect LeftBottom(200, 200, 220, 220); - CFX_FloatRect RightBottom(400, 201, 420, 221); - CFX_FloatRect LeftTop(201, 400, 221, 420); - CFX_FloatRect RightTop(401, 401, 421, 421); - - CPDFSDK_Document* pSDKDoc = - CPDFSDK_Document::FromFPDFFormHandle(form_handle()); - { - // Page 0 specifies "row order". - CBA_AnnotIterator iter(pSDKDoc->GetPageView(0), "Widget", ""); - CPDFSDK_Annot* pAnnot = iter.GetFirstAnnot(); - CheckRect(pAnnot->GetRect(), RightTop); - pAnnot = iter.GetNextAnnot(pAnnot); - CheckRect(pAnnot->GetRect(), LeftTop); - pAnnot = iter.GetNextAnnot(pAnnot); - CheckRect(pAnnot->GetRect(), RightBottom); - pAnnot = iter.GetNextAnnot(pAnnot); - CheckRect(pAnnot->GetRect(), LeftBottom); - pAnnot = iter.GetNextAnnot(pAnnot); - EXPECT_EQ(iter.GetFirstAnnot(), pAnnot); - - pAnnot = iter.GetLastAnnot(); - CheckRect(pAnnot->GetRect(), LeftBottom); - pAnnot = iter.GetPrevAnnot(pAnnot); - CheckRect(pAnnot->GetRect(), RightBottom); - pAnnot = iter.GetPrevAnnot(pAnnot); - CheckRect(pAnnot->GetRect(), LeftTop); - pAnnot = iter.GetPrevAnnot(pAnnot); - CheckRect(pAnnot->GetRect(), RightTop); - pAnnot = iter.GetPrevAnnot(pAnnot); - EXPECT_EQ(iter.GetLastAnnot(), pAnnot); - } - { - // Page 1 specifies "column order" - CBA_AnnotIterator iter(pSDKDoc->GetPageView(1), "Widget", ""); - CPDFSDK_Annot* pAnnot = iter.GetFirstAnnot(); - CheckRect(pAnnot->GetRect(), RightTop); - pAnnot = iter.GetNextAnnot(pAnnot); - CheckRect(pAnnot->GetRect(), RightBottom); - pAnnot = iter.GetNextAnnot(pAnnot); - CheckRect(pAnnot->GetRect(), LeftTop); - pAnnot = iter.GetNextAnnot(pAnnot); - CheckRect(pAnnot->GetRect(), LeftBottom); - pAnnot = iter.GetNextAnnot(pAnnot); - EXPECT_EQ(iter.GetFirstAnnot(), pAnnot); - - pAnnot = iter.GetLastAnnot(); - CheckRect(pAnnot->GetRect(), LeftBottom); - pAnnot = iter.GetPrevAnnot(pAnnot); - CheckRect(pAnnot->GetRect(), LeftTop); - pAnnot = iter.GetPrevAnnot(pAnnot); - CheckRect(pAnnot->GetRect(), RightBottom); - pAnnot = iter.GetPrevAnnot(pAnnot); - CheckRect(pAnnot->GetRect(), RightTop); - pAnnot = iter.GetPrevAnnot(pAnnot); - EXPECT_EQ(iter.GetLastAnnot(), pAnnot); - } - { - // Page 2 specifies "struct order" - CBA_AnnotIterator iter(pSDKDoc->GetPageView(2), "Widget", ""); - CPDFSDK_Annot* pAnnot = iter.GetFirstAnnot(); - CheckRect(pAnnot->GetRect(), LeftBottom); - pAnnot = iter.GetNextAnnot(pAnnot); - CheckRect(pAnnot->GetRect(), RightTop); - pAnnot = iter.GetNextAnnot(pAnnot); - CheckRect(pAnnot->GetRect(), LeftTop); - pAnnot = iter.GetNextAnnot(pAnnot); - CheckRect(pAnnot->GetRect(), RightBottom); - pAnnot = iter.GetNextAnnot(pAnnot); - EXPECT_EQ(iter.GetFirstAnnot(), pAnnot); - - pAnnot = iter.GetLastAnnot(); - CheckRect(pAnnot->GetRect(), RightBottom); - pAnnot = iter.GetPrevAnnot(pAnnot); - CheckRect(pAnnot->GetRect(), LeftTop); - pAnnot = iter.GetPrevAnnot(pAnnot); - CheckRect(pAnnot->GetRect(), RightTop); - pAnnot = iter.GetPrevAnnot(pAnnot); - CheckRect(pAnnot->GetRect(), LeftBottom); - pAnnot = iter.GetPrevAnnot(pAnnot); - EXPECT_EQ(iter.GetLastAnnot(), pAnnot); - } -} diff --git a/fpdfsdk/src/fsdk_mgr.cpp b/fpdfsdk/src/fsdk_mgr.cpp deleted file mode 100644 index 519aa06945..0000000000 --- a/fpdfsdk/src/fsdk_mgr.cpp +++ /dev/null @@ -1,1201 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "fpdfsdk/include/fsdk_mgr.h" - -#include <algorithm> -#include <memory> - -#include "core/include/fpdfapi/cpdf_array.h" -#include "core/include/fpdfapi/cpdf_document.h" -#include "fpdfsdk/include/formfiller/FFL_FormFiller.h" -#include "fpdfsdk/include/fsdk_define.h" -#include "fpdfsdk/include/javascript/IJavaScript.h" -#include "public/fpdf_ext.h" -#include "third_party/base/stl_util.h" - -#ifdef PDF_ENABLE_XFA -#include "fpdfsdk/include/fpdfxfa/fpdfxfa_app.h" -#include "fpdfsdk/include/fpdfxfa/fpdfxfa_doc.h" -#include "fpdfsdk/include/fpdfxfa/fpdfxfa_page.h" -#include "fpdfsdk/include/fpdfxfa/fpdfxfa_util.h" -#include "xfa/include/fxgraphics/fx_graphics.h" -#endif // PDF_ENABLE_XFA - -#if _FX_OS_ == _FX_ANDROID_ -#include "time.h" -#else -#include <ctime> -#endif - -namespace { - -int CharSet2CP(int charset) { - if (charset == 128) - return 932; - if (charset == 134) - return 936; - if (charset == 129) - return 949; - if (charset == 136) - return 950; - return 0; -} - -} // namespace - -FPDF_WIDESTRING AsFPDFWideString(CFX_ByteString* bsUTF16LE) { - return reinterpret_cast<FPDF_WIDESTRING>( - bsUTF16LE->GetBuffer(bsUTF16LE->GetLength())); -} - -class CFX_SystemHandler : public IFX_SystemHandler { - public: - explicit CFX_SystemHandler(CPDFDoc_Environment* pEnv) - : m_pEnv(pEnv), m_nCharSet(-1) {} - ~CFX_SystemHandler() override {} - - public: - // IFX_SystemHandler - void InvalidateRect(FX_HWND hWnd, FX_RECT rect) override; - void OutputSelectedRect(void* pFormFiller, CFX_FloatRect& rect) override; - FX_BOOL IsSelectionImplemented() override; - CFX_WideString GetClipboardText(FX_HWND hWnd) override { return L""; } - FX_BOOL SetClipboardText(FX_HWND hWnd, CFX_WideString str) override { - return FALSE; - } - void ClientToScreen(FX_HWND hWnd, int32_t& x, int32_t& y) override {} - void ScreenToClient(FX_HWND hWnd, int32_t& x, int32_t& y) override {} - void SetCursor(int32_t nCursorType) override; - FX_HMENU CreatePopupMenu() override { return NULL; } - FX_BOOL AppendMenuItem(FX_HMENU hMenu, - int32_t nIDNewItem, - CFX_WideString str) override { - return FALSE; - } - FX_BOOL EnableMenuItem(FX_HMENU hMenu, - int32_t nIDItem, - FX_BOOL bEnabled) override { - return FALSE; - } - int32_t TrackPopupMenu(FX_HMENU hMenu, - int32_t x, - int32_t y, - FX_HWND hParent) override { - return -1; - } - void DestroyMenu(FX_HMENU hMenu) override {} - CFX_ByteString GetNativeTrueTypeFont(int32_t nCharset) override; - FX_BOOL FindNativeTrueTypeFont(int32_t nCharset, - CFX_ByteString sFontFaceName) override; - CPDF_Font* AddNativeTrueTypeFontToPDF(CPDF_Document* pDoc, - CFX_ByteString sFontFaceName, - uint8_t nCharset) override; - int32_t SetTimer(int32_t uElapse, TimerCallback lpTimerFunc) override; - void KillTimer(int32_t nID) override; - FX_BOOL IsSHIFTKeyDown(FX_DWORD nFlag) override { - return m_pEnv->FFI_IsSHIFTKeyDown(nFlag); - } - FX_BOOL IsCTRLKeyDown(FX_DWORD nFlag) override { - return m_pEnv->FFI_IsCTRLKeyDown(nFlag); - } - FX_BOOL IsALTKeyDown(FX_DWORD nFlag) override { - return m_pEnv->FFI_IsALTKeyDown(nFlag); - } - FX_BOOL IsINSERTKeyDown(FX_DWORD nFlag) override { - return m_pEnv->FFI_IsINSERTKeyDown(nFlag); - } - FX_SYSTEMTIME GetLocalTime() override; - int32_t GetCharSet() override { return m_nCharSet; } - void SetCharSet(int32_t nCharSet) override { m_nCharSet = nCharSet; } - - private: - CPDFDoc_Environment* m_pEnv; - int m_nCharSet; -}; - -void CFX_SystemHandler::SetCursor(int32_t nCursorType) { - m_pEnv->FFI_SetCursor(nCursorType); -} - -void CFX_SystemHandler::InvalidateRect(FX_HWND hWnd, FX_RECT rect) { - CPDFSDK_Annot* pSDKAnnot = (CPDFSDK_Annot*)hWnd; - CPDFSDK_PageView* pPageView = pSDKAnnot->GetPageView(); - UnderlyingPageType* pPage = pSDKAnnot->GetUnderlyingPage(); - if (!pPage || !pPageView) - return; - CFX_Matrix page2device; - pPageView->GetCurrentMatrix(page2device); - CFX_Matrix device2page; - device2page.SetReverse(page2device); - FX_FLOAT left, top, right, bottom; - device2page.Transform((FX_FLOAT)rect.left, (FX_FLOAT)rect.top, left, top); - device2page.Transform((FX_FLOAT)rect.right, (FX_FLOAT)rect.bottom, right, - bottom); - CFX_FloatRect rcPDF(left, bottom, right, top); - rcPDF.Normalize(); - - m_pEnv->FFI_Invalidate(pPage, rcPDF.left, rcPDF.top, rcPDF.right, - rcPDF.bottom); -} -void CFX_SystemHandler::OutputSelectedRect(void* pFormFiller, - CFX_FloatRect& rect) { - CFFL_FormFiller* pFFL = (CFFL_FormFiller*)pFormFiller; - if (pFFL) { - CFX_FloatPoint leftbottom = CFX_FloatPoint(rect.left, rect.bottom); - CFX_FloatPoint righttop = CFX_FloatPoint(rect.right, rect.top); - CFX_FloatPoint ptA = pFFL->PWLtoFFL(leftbottom); - CFX_FloatPoint ptB = pFFL->PWLtoFFL(righttop); - CPDFSDK_Annot* pAnnot = pFFL->GetSDKAnnot(); - UnderlyingPageType* pPage = pAnnot->GetUnderlyingPage(); - ASSERT(pPage); - m_pEnv->FFI_OutputSelectedRect(pPage, ptA.x, ptB.y, ptB.x, ptA.y); - } -} - -FX_BOOL CFX_SystemHandler::IsSelectionImplemented() { - if (m_pEnv) { - FPDF_FORMFILLINFO* pInfo = m_pEnv->GetFormFillInfo(); - if (pInfo && pInfo->FFI_OutputSelectedRect) - return TRUE; - } - return FALSE; -} - -CFX_ByteString CFX_SystemHandler::GetNativeTrueTypeFont(int32_t nCharset) { - return ""; -} - -FX_BOOL CFX_SystemHandler::FindNativeTrueTypeFont( - int32_t nCharset, - CFX_ByteString sFontFaceName) { - CFX_FontMgr* pFontMgr = CFX_GEModule::Get()->GetFontMgr(); - if (!pFontMgr) - return FALSE; - - CFX_FontMapper* pFontMapper = pFontMgr->GetBuiltinMapper(); - if (!pFontMapper) - return FALSE; - - if (pFontMapper->m_InstalledTTFonts.empty()) - pFontMapper->LoadInstalledFonts(); - - for (const auto& font : pFontMapper->m_InstalledTTFonts) { - if (font.Compare(sFontFaceName)) - return TRUE; - } - - return FALSE; -} - -CPDF_Font* CFX_SystemHandler::AddNativeTrueTypeFontToPDF( - CPDF_Document* pDoc, - CFX_ByteString sFontFaceName, - uint8_t nCharset) { - if (pDoc) { - CFX_Font* pFXFont = new CFX_Font(); - pFXFont->LoadSubst(sFontFaceName, TRUE, 0, 0, 0, CharSet2CP(nCharset), - FALSE); - CPDF_Font* pFont = pDoc->AddFont(pFXFont, nCharset, FALSE); - delete pFXFont; - return pFont; - } - - return NULL; -} - -int32_t CFX_SystemHandler::SetTimer(int32_t uElapse, - TimerCallback lpTimerFunc) { - return m_pEnv->FFI_SetTimer(uElapse, lpTimerFunc); -} -void CFX_SystemHandler::KillTimer(int32_t nID) { - m_pEnv->FFI_KillTimer(nID); -} - -FX_SYSTEMTIME CFX_SystemHandler::GetLocalTime() { - return m_pEnv->FFI_GetLocalTime(); -} - -CPDFDoc_Environment::CPDFDoc_Environment(UnderlyingDocumentType* pDoc, - FPDF_FORMFILLINFO* pFFinfo) - : m_pInfo(pFFinfo), m_pSDKDoc(NULL), m_pUnderlyingDoc(pDoc) { - m_pSysHandler.reset(new CFX_SystemHandler(this)); -} - -CPDFDoc_Environment::~CPDFDoc_Environment() { -#ifdef PDF_ENABLE_XFA - CPDFXFA_App* pProvider = CPDFXFA_App::GetInstance(); - if (pProvider->m_pEnvList.GetSize() == 0) - pProvider->SetJavaScriptInitialized(FALSE); -#endif // PDF_ENABLE_XFA -} - -int CPDFDoc_Environment::JS_appAlert(const FX_WCHAR* Msg, - const FX_WCHAR* Title, - FX_UINT Type, - FX_UINT Icon) { - if (!m_pInfo || !m_pInfo->m_pJsPlatform || - !m_pInfo->m_pJsPlatform->app_alert) { - return -1; - } - CFX_ByteString bsMsg = CFX_WideString(Msg).UTF16LE_Encode(); - CFX_ByteString bsTitle = CFX_WideString(Title).UTF16LE_Encode(); - return m_pInfo->m_pJsPlatform->app_alert( - m_pInfo->m_pJsPlatform, AsFPDFWideString(&bsMsg), - AsFPDFWideString(&bsTitle), Type, Icon); -} - -int CPDFDoc_Environment::JS_appResponse(const FX_WCHAR* Question, - const FX_WCHAR* Title, - const FX_WCHAR* Default, - const FX_WCHAR* cLabel, - FPDF_BOOL bPassword, - void* response, - int length) { - if (!m_pInfo || !m_pInfo->m_pJsPlatform || - !m_pInfo->m_pJsPlatform->app_response) { - return -1; - } - CFX_ByteString bsQuestion = CFX_WideString(Question).UTF16LE_Encode(); - CFX_ByteString bsTitle = CFX_WideString(Title).UTF16LE_Encode(); - CFX_ByteString bsDefault = CFX_WideString(Default).UTF16LE_Encode(); - CFX_ByteString bsLabel = CFX_WideString(cLabel).UTF16LE_Encode(); - return m_pInfo->m_pJsPlatform->app_response( - m_pInfo->m_pJsPlatform, AsFPDFWideString(&bsQuestion), - AsFPDFWideString(&bsTitle), AsFPDFWideString(&bsDefault), - AsFPDFWideString(&bsLabel), bPassword, response, length); -} - -void CPDFDoc_Environment::JS_appBeep(int nType) { - if (!m_pInfo || !m_pInfo->m_pJsPlatform || - !m_pInfo->m_pJsPlatform->app_beep) { - return; - } - m_pInfo->m_pJsPlatform->app_beep(m_pInfo->m_pJsPlatform, nType); -} - -CFX_WideString CPDFDoc_Environment::JS_fieldBrowse() { - if (!m_pInfo || !m_pInfo->m_pJsPlatform || - !m_pInfo->m_pJsPlatform->Field_browse) { - return CFX_WideString(); - } - const int nRequiredLen = - m_pInfo->m_pJsPlatform->Field_browse(m_pInfo->m_pJsPlatform, nullptr, 0); - if (nRequiredLen <= 0) - return CFX_WideString(); - - std::unique_ptr<char[]> pBuff(new char[nRequiredLen]); - memset(pBuff.get(), 0, nRequiredLen); - const int nActualLen = m_pInfo->m_pJsPlatform->Field_browse( - m_pInfo->m_pJsPlatform, pBuff.get(), nRequiredLen); - if (nActualLen <= 0 || nActualLen > nRequiredLen) - return CFX_WideString(); - - return CFX_WideString::FromLocal(CFX_ByteString(pBuff.get(), nActualLen)); -} - -CFX_WideString CPDFDoc_Environment::JS_docGetFilePath() { - if (!m_pInfo || !m_pInfo->m_pJsPlatform || - !m_pInfo->m_pJsPlatform->Doc_getFilePath) { - return CFX_WideString(); - } - const int nRequiredLen = m_pInfo->m_pJsPlatform->Doc_getFilePath( - m_pInfo->m_pJsPlatform, nullptr, 0); - if (nRequiredLen <= 0) - return CFX_WideString(); - - std::unique_ptr<char[]> pBuff(new char[nRequiredLen]); - memset(pBuff.get(), 0, nRequiredLen); - const int nActualLen = m_pInfo->m_pJsPlatform->Doc_getFilePath( - m_pInfo->m_pJsPlatform, pBuff.get(), nRequiredLen); - if (nActualLen <= 0 || nActualLen > nRequiredLen) - return CFX_WideString(); - - return CFX_WideString::FromLocal(CFX_ByteString(pBuff.get(), nActualLen)); -} - -void CPDFDoc_Environment::JS_docSubmitForm(void* formData, - int length, - const FX_WCHAR* URL) { - if (!m_pInfo || !m_pInfo->m_pJsPlatform || - !m_pInfo->m_pJsPlatform->Doc_submitForm) { - return; - } - CFX_ByteString bsDestination = CFX_WideString(URL).UTF16LE_Encode(); - m_pInfo->m_pJsPlatform->Doc_submitForm(m_pInfo->m_pJsPlatform, formData, - length, - AsFPDFWideString(&bsDestination)); -} - -void CPDFDoc_Environment::JS_docmailForm(void* mailData, - int length, - FPDF_BOOL bUI, - const FX_WCHAR* To, - const FX_WCHAR* Subject, - const FX_WCHAR* CC, - const FX_WCHAR* BCC, - const FX_WCHAR* Msg) { - if (!m_pInfo || !m_pInfo->m_pJsPlatform || - !m_pInfo->m_pJsPlatform->Doc_mail) { - return; - } - CFX_ByteString bsTo = CFX_WideString(To).UTF16LE_Encode(); - CFX_ByteString bsSubject = CFX_WideString(Subject).UTF16LE_Encode(); - CFX_ByteString bsCC = CFX_WideString(CC).UTF16LE_Encode(); - CFX_ByteString bsBcc = CFX_WideString(BCC).UTF16LE_Encode(); - CFX_ByteString bsMsg = CFX_WideString(Msg).UTF16LE_Encode(); - m_pInfo->m_pJsPlatform->Doc_mail( - m_pInfo->m_pJsPlatform, mailData, length, bUI, AsFPDFWideString(&bsTo), - AsFPDFWideString(&bsSubject), AsFPDFWideString(&bsCC), - AsFPDFWideString(&bsBcc), AsFPDFWideString(&bsMsg)); -} - -void CPDFDoc_Environment::JS_docprint(FPDF_BOOL bUI, - int nStart, - int nEnd, - FPDF_BOOL bSilent, - FPDF_BOOL bShrinkToFit, - FPDF_BOOL bPrintAsImage, - FPDF_BOOL bReverse, - FPDF_BOOL bAnnotations) { - if (!m_pInfo || !m_pInfo->m_pJsPlatform || - !m_pInfo->m_pJsPlatform->Doc_print) { - return; - } - m_pInfo->m_pJsPlatform->Doc_print(m_pInfo->m_pJsPlatform, bUI, nStart, nEnd, - bSilent, bShrinkToFit, bPrintAsImage, - bReverse, bAnnotations); -} - -void CPDFDoc_Environment::JS_docgotoPage(int nPageNum) { - if (!m_pInfo || !m_pInfo->m_pJsPlatform || - !m_pInfo->m_pJsPlatform->Doc_gotoPage) { - return; - } - m_pInfo->m_pJsPlatform->Doc_gotoPage(m_pInfo->m_pJsPlatform, nPageNum); -} - -IJS_Runtime* CPDFDoc_Environment::GetJSRuntime() { - if (!IsJSInitiated()) - return NULL; - if (!m_pJSRuntime) - m_pJSRuntime.reset(IJS_Runtime::Create(this)); - return m_pJSRuntime.get(); -} - -CPDFSDK_AnnotHandlerMgr* CPDFDoc_Environment::GetAnnotHandlerMgr() { - if (!m_pAnnotHandlerMgr) - m_pAnnotHandlerMgr.reset(new CPDFSDK_AnnotHandlerMgr(this)); - return m_pAnnotHandlerMgr.get(); -} - -CPDFSDK_ActionHandler* CPDFDoc_Environment::GetActionHander() { - if (!m_pActionHandler) - m_pActionHandler.reset(new CPDFSDK_ActionHandler()); - return m_pActionHandler.get(); -} - -CFFL_IFormFiller* CPDFDoc_Environment::GetIFormFiller() { - if (!m_pIFormFiller) - m_pIFormFiller.reset(new CFFL_IFormFiller(this)); - return m_pIFormFiller.get(); -} - -// static -CPDFSDK_Document* CPDFSDK_Document::FromFPDFFormHandle( - FPDF_FORMHANDLE hHandle) { - CPDFDoc_Environment* pEnv = static_cast<CPDFDoc_Environment*>(hHandle); - return pEnv ? pEnv->GetSDKDocument() : nullptr; -} - -CPDFSDK_Document::CPDFSDK_Document(UnderlyingDocumentType* pDoc, - CPDFDoc_Environment* pEnv) - : m_pDoc(pDoc), - m_pFocusAnnot(nullptr), - m_pEnv(pEnv), - m_bChangeMask(FALSE), - m_bBeingDestroyed(FALSE) {} - -CPDFSDK_Document::~CPDFSDK_Document() { - m_bBeingDestroyed = TRUE; - - for (auto& it : m_pageMap) - it.second->KillFocusAnnotIfNeeded(); - - for (auto& it : m_pageMap) - delete it.second; - m_pageMap.clear(); -} - -CPDFSDK_PageView* CPDFSDK_Document::GetPageView( - UnderlyingPageType* pUnderlyingPage, - FX_BOOL ReNew) { - auto it = m_pageMap.find(pUnderlyingPage); - if (it != m_pageMap.end()) - return it->second; - - if (!ReNew) - return nullptr; - - CPDFSDK_PageView* pPageView = new CPDFSDK_PageView(this, pUnderlyingPage); - m_pageMap[pUnderlyingPage] = pPageView; - // Delay to load all the annotations, to avoid endless loop. - pPageView->LoadFXAnnots(); - return pPageView; -} - -CPDFSDK_PageView* CPDFSDK_Document::GetCurrentView() { - UnderlyingPageType* pPage = - UnderlyingFromFPDFPage(m_pEnv->FFI_GetCurrentPage(m_pDoc)); - return pPage ? GetPageView(pPage, TRUE) : nullptr; -} - -CPDFSDK_PageView* CPDFSDK_Document::GetPageView(int nIndex) { - UnderlyingPageType* pTempPage = - UnderlyingFromFPDFPage(m_pEnv->FFI_GetPage(m_pDoc, nIndex)); - if (!pTempPage) - return nullptr; - - auto it = m_pageMap.find(pTempPage); - return it->second; -} - -void CPDFSDK_Document::ProcJavascriptFun() { - CPDF_Document* pPDFDoc = GetPDFDocument(); - CPDF_DocJSActions docJS(pPDFDoc); - int iCount = docJS.CountJSActions(); - if (iCount < 1) - return; - for (int i = 0; i < iCount; i++) { - CFX_ByteString csJSName; - CPDF_Action jsAction = docJS.GetJSAction(i, csJSName); - if (m_pEnv->GetActionHander()) - m_pEnv->GetActionHander()->DoAction_JavaScript( - jsAction, CFX_WideString::FromLocal(csJSName), this); - } -} - -FX_BOOL CPDFSDK_Document::ProcOpenAction() { - if (!m_pDoc) - return FALSE; - - CPDF_Dictionary* pRoot = GetPDFDocument()->GetRoot(); - if (!pRoot) - return FALSE; - - CPDF_Object* pOpenAction = pRoot->GetDictBy("OpenAction"); - if (!pOpenAction) - pOpenAction = pRoot->GetArrayBy("OpenAction"); - - if (!pOpenAction) - return FALSE; - - if (pOpenAction->IsArray()) - return TRUE; - - if (CPDF_Dictionary* pDict = pOpenAction->AsDictionary()) { - CPDF_Action action(pDict); - if (m_pEnv->GetActionHander()) - m_pEnv->GetActionHander()->DoAction_DocOpen(action, this); - return TRUE; - } - return FALSE; -} - -CPDF_OCContext* CPDFSDK_Document::GetOCContext() { - if (!m_pOccontent) - m_pOccontent.reset(new CPDF_OCContext(GetPDFDocument())); - return m_pOccontent.get(); -} - -void CPDFSDK_Document::RemovePageView(UnderlyingPageType* pUnderlyingPage) { - auto it = m_pageMap.find(pUnderlyingPage); - if (it == m_pageMap.end()) - return; - - CPDFSDK_PageView* pPageView = it->second; - if (pPageView->IsLocked()) - return; - - pPageView->KillFocusAnnotIfNeeded(); - delete pPageView; - m_pageMap.erase(it); -} - -UnderlyingPageType* CPDFSDK_Document::GetPage(int nIndex) { - return UnderlyingFromFPDFPage(m_pEnv->FFI_GetPage(m_pDoc, nIndex)); -} - -CPDFSDK_InterForm* CPDFSDK_Document::GetInterForm() { - if (!m_pInterForm) - m_pInterForm.reset(new CPDFSDK_InterForm(this)); - return m_pInterForm.get(); -} - -void CPDFSDK_Document::UpdateAllViews(CPDFSDK_PageView* pSender, - CPDFSDK_Annot* pAnnot) { - for (const auto& it : m_pageMap) { - CPDFSDK_PageView* pPageView = it.second; - if (pPageView != pSender) { - pPageView->UpdateView(pAnnot); - } - } -} - -CPDFSDK_Annot* CPDFSDK_Document::GetFocusAnnot() { - return m_pFocusAnnot; -} - -FX_BOOL CPDFSDK_Document::SetFocusAnnot(CPDFSDK_Annot* pAnnot, FX_UINT nFlag) { - if (m_bBeingDestroyed) - return FALSE; - - if (m_pFocusAnnot == pAnnot) - return TRUE; - - if (m_pFocusAnnot) { - if (!KillFocusAnnot(nFlag)) - return FALSE; - } - - if (!pAnnot) - return FALSE; - -#ifdef PDF_ENABLE_XFA - CPDFSDK_Annot* pLastFocusAnnot = m_pFocusAnnot; -#endif // PDF_ENABLE_XFA - CPDFSDK_PageView* pPageView = pAnnot->GetPageView(); - if (pPageView && pPageView->IsValid()) { - CPDFSDK_AnnotHandlerMgr* pAnnotHandler = m_pEnv->GetAnnotHandlerMgr(); - if (!m_pFocusAnnot) { -#ifdef PDF_ENABLE_XFA - if (!pAnnotHandler->Annot_OnChangeFocus(pAnnot, pLastFocusAnnot)) - return FALSE; -#endif // PDF_ENABLE_XFA - if (!pAnnotHandler->Annot_OnSetFocus(pAnnot, nFlag)) - return FALSE; - if (!m_pFocusAnnot) { - m_pFocusAnnot = pAnnot; - return TRUE; - } - } - } - return FALSE; -} - -FX_BOOL CPDFSDK_Document::KillFocusAnnot(FX_UINT nFlag) { - if (m_pFocusAnnot) { - CPDFSDK_AnnotHandlerMgr* pAnnotHandler = m_pEnv->GetAnnotHandlerMgr(); - CPDFSDK_Annot* pFocusAnnot = m_pFocusAnnot; - m_pFocusAnnot = nullptr; - -#ifdef PDF_ENABLE_XFA - if (!pAnnotHandler->Annot_OnChangeFocus(nullptr, pFocusAnnot)) - return FALSE; -#endif // PDF_ENABLE_XFA - - if (pAnnotHandler->Annot_OnKillFocus(pFocusAnnot, nFlag)) { - if (pFocusAnnot->GetType() == "Widget") { - CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pFocusAnnot; - int nFieldType = pWidget->GetFieldType(); - if (FIELDTYPE_TEXTFIELD == nFieldType || - FIELDTYPE_COMBOBOX == nFieldType) { - m_pEnv->FFI_OnSetFieldInputFocus(NULL, NULL, 0, FALSE); - } - } - - if (!m_pFocusAnnot) - return TRUE; - } else { - m_pFocusAnnot = pFocusAnnot; - } - } - return FALSE; -} - -void CPDFSDK_Document::OnCloseDocument() { - KillFocusAnnot(); -} - -FX_BOOL CPDFSDK_Document::GetPermissions(int nFlag) { - return GetPDFDocument()->GetUserPermissions() & nFlag; -} - -IJS_Runtime* CPDFSDK_Document::GetJsRuntime() { - return m_pEnv->GetJSRuntime(); -} - -CFX_WideString CPDFSDK_Document::GetPath() { - return m_pEnv->JS_docGetFilePath(); -} - -CPDFSDK_PageView::CPDFSDK_PageView(CPDFSDK_Document* pSDKDoc, - UnderlyingPageType* page) - : m_page(page), - m_pSDKDoc(pSDKDoc), - m_CaptureWidget(nullptr), -#ifndef PDF_ENABLE_XFA - m_bTakeOverPage(FALSE), -#endif // PDF_ENABLE_XFA - m_bEnterWidget(FALSE), - m_bExitWidget(FALSE), - m_bOnWidget(FALSE), - m_bValid(FALSE), - m_bLocked(FALSE) { - CPDFSDK_InterForm* pInterForm = pSDKDoc->GetInterForm(); - if (pInterForm) { - CPDF_InterForm* pPDFInterForm = pInterForm->GetInterForm(); -#ifdef PDF_ENABLE_XFA - if (page->GetPDFPage()) - pPDFInterForm->FixPageFields(page->GetPDFPage()); -#else // PDF_ENABLE_XFA - pPDFInterForm->FixPageFields(page); -#endif // PDF_ENABLE_XFA - } -#ifndef PDF_ENABLE_XFA - m_page->SetPrivateData((void*)m_page, (void*)this, nullptr); -#endif // PDF_ENABLE_XFA -} - -CPDFSDK_PageView::~CPDFSDK_PageView() { - CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv(); - CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr(); - for (CPDFSDK_Annot* pAnnot : m_fxAnnotArray) - pAnnotHandlerMgr->ReleaseAnnot(pAnnot); - - m_fxAnnotArray.clear(); - m_pAnnotList.reset(); -#ifndef PDF_ENABLE_XFA - m_page->RemovePrivateData((void*)m_page); - if (m_bTakeOverPage) { - delete m_page; - } -#endif // PDF_ENABLE_XFA -} - -void CPDFSDK_PageView::PageView_OnDraw(CFX_RenderDevice* pDevice, - CFX_Matrix* pUser2Device, -#ifdef PDF_ENABLE_XFA - CPDF_RenderOptions* pOptions, - const FX_RECT& pClip) { -#else - CPDF_RenderOptions* pOptions) { -#endif // PDF_ENABLE_XFA - m_curMatrix = *pUser2Device; - CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv(); - -#ifdef PDF_ENABLE_XFA - CPDFXFA_Page* pPage = GetPDFXFAPage(); - if (!pPage) - return; - - if (pPage->GetDocument()->GetDocType() == DOCTYPE_DYNAMIC_XFA) { - CFX_Graphics gs; - gs.Create(pDevice); - CFX_RectF rectClip; - rectClip.Set(static_cast<FX_FLOAT>(pClip.left), - static_cast<FX_FLOAT>(pClip.top), - static_cast<FX_FLOAT>(pClip.Width()), - static_cast<FX_FLOAT>(pClip.Height())); - gs.SetClipRect(rectClip); - IXFA_RenderContext* pRenderContext = XFA_RenderContext_Create(); - if (!pRenderContext) - return; - CXFA_RenderOptions renderOptions; - renderOptions.m_bHighlight = TRUE; - IXFA_PageView* xfaView = pPage->GetXFAPageView(); - pRenderContext->StartRender(xfaView, &gs, *pUser2Device, renderOptions); - pRenderContext->DoRender(); - pRenderContext->StopRender(); - pRenderContext->Release(); - IXFA_DocView* docView = xfaView->GetDocView(); - if (!docView) - return; - CPDFSDK_Annot* annot = GetFocusAnnot(); - if (!annot) - return; - // Render the focus widget - docView->GetWidgetHandler()->RenderWidget(annot->GetXFAWidget(), &gs, - pUser2Device, FALSE); - return; - } -#endif // PDF_ENABLE_XFA - - // for pdf/static xfa. - CPDFSDK_AnnotIterator annotIterator(this, true); - while (CPDFSDK_Annot* pSDKAnnot = annotIterator.Next()) { - CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr(); - pAnnotHandlerMgr->Annot_OnDraw(this, pSDKAnnot, pDevice, pUser2Device, 0); - } -} - -const CPDF_Annot* CPDFSDK_PageView::GetPDFAnnotAtPoint(FX_FLOAT pageX, - FX_FLOAT pageY) { - for (const CPDF_Annot* pAnnot : m_pAnnotList->All()) { - CFX_FloatRect annotRect; - pAnnot->GetRect(annotRect); - if (annotRect.Contains(pageX, pageY)) - return pAnnot; - } - return nullptr; -} - -const CPDF_Annot* CPDFSDK_PageView::GetPDFWidgetAtPoint(FX_FLOAT pageX, - FX_FLOAT pageY) { - for (const CPDF_Annot* pAnnot : m_pAnnotList->All()) { - if (pAnnot->GetSubType() == "Widget") { - CFX_FloatRect annotRect; - pAnnot->GetRect(annotRect); - if (annotRect.Contains(pageX, pageY)) - return pAnnot; - } - } - return nullptr; -} - -CPDFSDK_Annot* CPDFSDK_PageView::GetFXAnnotAtPoint(FX_FLOAT pageX, - FX_FLOAT pageY) { - CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv(); - CPDFSDK_AnnotHandlerMgr* pAnnotMgr = pEnv->GetAnnotHandlerMgr(); - CPDFSDK_AnnotIterator annotIterator(this, false); - while (CPDFSDK_Annot* pSDKAnnot = annotIterator.Next()) { - CFX_FloatRect rc = pAnnotMgr->Annot_OnGetViewBBox(this, pSDKAnnot); - if (rc.Contains(pageX, pageY)) - return pSDKAnnot; - } - - return nullptr; -} - -CPDFSDK_Annot* CPDFSDK_PageView::GetFXWidgetAtPoint(FX_FLOAT pageX, - FX_FLOAT pageY) { - CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv(); - CPDFSDK_AnnotHandlerMgr* pAnnotMgr = pEnv->GetAnnotHandlerMgr(); - CPDFSDK_AnnotIterator annotIterator(this, false); - while (CPDFSDK_Annot* pSDKAnnot = annotIterator.Next()) { - bool bHitTest = pSDKAnnot->GetType() == "Widget"; -#ifdef PDF_ENABLE_XFA - bHitTest = bHitTest || pSDKAnnot->GetType() == FSDK_XFAWIDGET_TYPENAME; -#endif // PDF_ENABLE_XFA - if (bHitTest) { - pAnnotMgr->Annot_OnGetViewBBox(this, pSDKAnnot); - CFX_FloatPoint point(pageX, pageY); - if (pAnnotMgr->Annot_OnHitTest(this, pSDKAnnot, point)) - return pSDKAnnot; - } - } - - return nullptr; -} - -void CPDFSDK_PageView::KillFocusAnnotIfNeeded() { - // if there is a focused annot on the page, we should kill the focus first. - if (CPDFSDK_Annot* focusedAnnot = m_pSDKDoc->GetFocusAnnot()) { - if (pdfium::ContainsValue(m_fxAnnotArray, focusedAnnot)) - KillFocusAnnot(); - } -} - -FX_BOOL CPDFSDK_PageView::Annot_HasAppearance(CPDF_Annot* pAnnot) { - CPDF_Dictionary* pAnnotDic = pAnnot->GetAnnotDict(); - if (pAnnotDic) - return pAnnotDic->KeyExist("AS"); - return FALSE; -} - -CPDFSDK_Annot* CPDFSDK_PageView::AddAnnot(CPDF_Annot* pPDFAnnot) { - CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv(); - ASSERT(pEnv); - CPDFSDK_AnnotHandlerMgr* pAnnotHandler = pEnv->GetAnnotHandlerMgr(); - CPDFSDK_Annot* pSDKAnnot = pAnnotHandler->NewAnnot(pPDFAnnot, this); - if (!pSDKAnnot) - return nullptr; - - m_fxAnnotArray.push_back(pSDKAnnot); - pAnnotHandler->Annot_OnCreate(pSDKAnnot); - return pSDKAnnot; -} - -#ifdef PDF_ENABLE_XFA -CPDFSDK_Annot* CPDFSDK_PageView::AddAnnot(IXFA_Widget* pPDFAnnot) { - if (!pPDFAnnot) - return nullptr; - - CPDFSDK_Annot* pSDKAnnot = GetAnnotByXFAWidget(pPDFAnnot); - if (pSDKAnnot) - return pSDKAnnot; - - CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv(); - CPDFSDK_AnnotHandlerMgr* pAnnotHandler = pEnv->GetAnnotHandlerMgr(); - pSDKAnnot = pAnnotHandler->NewAnnot(pPDFAnnot, this); - if (!pSDKAnnot) - return nullptr; - - m_fxAnnotArray.push_back(pSDKAnnot); - return pSDKAnnot; -} -#endif // PDF_ENABLE_XFA - -CPDFSDK_Annot* CPDFSDK_PageView::AddAnnot(CPDF_Dictionary* pDict) { - return pDict ? AddAnnot(pDict->GetStringBy("Subtype"), pDict) : nullptr; -} - -CPDFSDK_Annot* CPDFSDK_PageView::AddAnnot(const FX_CHAR* lpSubType, - CPDF_Dictionary* pDict) { - return NULL; -} - -FX_BOOL CPDFSDK_PageView::DeleteAnnot(CPDFSDK_Annot* pAnnot) { -#ifdef PDF_ENABLE_XFA - if (!pAnnot) - return FALSE; - CPDFXFA_Page* pPage = pAnnot->GetPDFXFAPage(); - if (!pPage || (pPage->GetDocument()->GetDocType() != DOCTYPE_STATIC_XFA && - pPage->GetDocument()->GetDocType() != DOCTYPE_DYNAMIC_XFA)) - return FALSE; - - auto it = std::find(m_fxAnnotArray.begin(), m_fxAnnotArray.end(), pAnnot); - if (it != m_fxAnnotArray.end()) - m_fxAnnotArray.erase(it); - if (m_CaptureWidget == pAnnot) - m_CaptureWidget = nullptr; - - return TRUE; -#else // PDF_ENABLE_XFA - return FALSE; -#endif // PDF_ENABLE_XFA -} - -CPDF_Document* CPDFSDK_PageView::GetPDFDocument() { - if (m_page) { -#ifdef PDF_ENABLE_XFA - return m_page->GetDocument()->GetPDFDoc(); -#else // PDF_ENABLE_XFA - return m_page->m_pDocument; -#endif // PDF_ENABLE_XFA - } - return NULL; -} - -#ifdef PDF_ENABLE_XFA -CPDF_Page* CPDFSDK_PageView::GetPDFPage() { - if (m_page) { - return m_page->GetPDFPage(); - } - return NULL; -} -#endif // PDF_ENABLE_XFA - -size_t CPDFSDK_PageView::CountAnnots() const { - return m_fxAnnotArray.size(); -} - -CPDFSDK_Annot* CPDFSDK_PageView::GetAnnot(size_t nIndex) { - return nIndex < m_fxAnnotArray.size() ? m_fxAnnotArray[nIndex] : nullptr; -} - -CPDFSDK_Annot* CPDFSDK_PageView::GetAnnotByDict(CPDF_Dictionary* pDict) { - for (CPDFSDK_Annot* pAnnot : m_fxAnnotArray) { - if (pAnnot->GetPDFAnnot()->GetAnnotDict() == pDict) - return pAnnot; - } - return nullptr; -} - -#ifdef PDF_ENABLE_XFA -CPDFSDK_Annot* CPDFSDK_PageView::GetAnnotByXFAWidget(IXFA_Widget* hWidget) { - if (!hWidget) - return nullptr; - - for (CPDFSDK_Annot* pAnnot : m_fxAnnotArray) { - if (pAnnot->GetXFAWidget() == hWidget) - return pAnnot; - } - return nullptr; -} -#endif // PDF_ENABLE_XFA - -FX_BOOL CPDFSDK_PageView::OnLButtonDown(const CFX_FloatPoint& point, - FX_UINT nFlag) { - CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv(); - ASSERT(pEnv); - CPDFSDK_Annot* pFXAnnot = GetFXWidgetAtPoint(point.x, point.y); - if (!pFXAnnot) { - KillFocusAnnot(nFlag); - return FALSE; - } - - CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr(); - FX_BOOL bRet = - pAnnotHandlerMgr->Annot_OnLButtonDown(this, pFXAnnot, nFlag, point); - if (bRet) - SetFocusAnnot(pFXAnnot); - return bRet; -} - -#ifdef PDF_ENABLE_XFA -FX_BOOL CPDFSDK_PageView::OnRButtonDown(const CFX_FloatPoint& point, - FX_UINT nFlag) { - CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv(); - ASSERT(pEnv); - CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr(); - ASSERT(pAnnotHandlerMgr); - - CPDFSDK_Annot* pFXAnnot = GetFXWidgetAtPoint(point.x, point.y); - - if (pFXAnnot == NULL) - return FALSE; - - FX_BOOL bRet = - pAnnotHandlerMgr->Annot_OnRButtonDown(this, pFXAnnot, nFlag, point); - if (bRet) { - SetFocusAnnot(pFXAnnot); - } - return TRUE; -} - -FX_BOOL CPDFSDK_PageView::OnRButtonUp(const CFX_FloatPoint& point, - FX_UINT nFlag) { - CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv(); - ASSERT(pEnv); - CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr(); - - CPDFSDK_Annot* pFXAnnot = GetFXWidgetAtPoint(point.x, point.y); - - if (pFXAnnot == NULL) - return FALSE; - - FX_BOOL bRet = - pAnnotHandlerMgr->Annot_OnRButtonUp(this, pFXAnnot, nFlag, point); - if (bRet) { - SetFocusAnnot(pFXAnnot); - } - return TRUE; -} -#endif // PDF_ENABLE_XFA - -FX_BOOL CPDFSDK_PageView::OnLButtonUp(const CFX_FloatPoint& point, - FX_UINT nFlag) { - CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv(); - ASSERT(pEnv); - CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr(); - CPDFSDK_Annot* pFXAnnot = GetFXWidgetAtPoint(point.x, point.y); - CPDFSDK_Annot* pFocusAnnot = GetFocusAnnot(); - FX_BOOL bRet = FALSE; - if (pFocusAnnot && pFocusAnnot != pFXAnnot) { - // Last focus Annot gets a chance to handle the event. - bRet = pAnnotHandlerMgr->Annot_OnLButtonUp(this, pFocusAnnot, nFlag, point); - } - if (pFXAnnot && !bRet) - bRet = pAnnotHandlerMgr->Annot_OnLButtonUp(this, pFXAnnot, nFlag, point); - return bRet; -} - -FX_BOOL CPDFSDK_PageView::OnMouseMove(const CFX_FloatPoint& point, int nFlag) { - CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv(); - CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr(); - if (CPDFSDK_Annot* pFXAnnot = GetFXWidgetAtPoint(point.x, point.y)) { - if (m_CaptureWidget && m_CaptureWidget != pFXAnnot) { - m_bExitWidget = TRUE; - m_bEnterWidget = FALSE; - pAnnotHandlerMgr->Annot_OnMouseExit(this, m_CaptureWidget, nFlag); - } - m_CaptureWidget = (CPDFSDK_Widget*)pFXAnnot; - m_bOnWidget = TRUE; - if (!m_bEnterWidget) { - m_bEnterWidget = TRUE; - m_bExitWidget = FALSE; - pAnnotHandlerMgr->Annot_OnMouseEnter(this, pFXAnnot, nFlag); - } - pAnnotHandlerMgr->Annot_OnMouseMove(this, pFXAnnot, nFlag, point); - return TRUE; - } - if (m_bOnWidget) { - m_bOnWidget = FALSE; - m_bExitWidget = TRUE; - m_bEnterWidget = FALSE; - if (m_CaptureWidget) { - pAnnotHandlerMgr->Annot_OnMouseExit(this, m_CaptureWidget, nFlag); - m_CaptureWidget = NULL; - } - } - return FALSE; -} - -FX_BOOL CPDFSDK_PageView::OnMouseWheel(double deltaX, - double deltaY, - const CFX_FloatPoint& point, - int nFlag) { - if (CPDFSDK_Annot* pAnnot = GetFXWidgetAtPoint(point.x, point.y)) { - CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv(); - CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr(); - return pAnnotHandlerMgr->Annot_OnMouseWheel(this, pAnnot, nFlag, - (int)deltaY, point); - } - return FALSE; -} - -FX_BOOL CPDFSDK_PageView::OnChar(int nChar, FX_UINT nFlag) { - if (CPDFSDK_Annot* pAnnot = GetFocusAnnot()) { - CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv(); - CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr(); - return pAnnotHandlerMgr->Annot_OnChar(pAnnot, nChar, nFlag); - } - - return FALSE; -} - -FX_BOOL CPDFSDK_PageView::OnKeyDown(int nKeyCode, int nFlag) { - if (CPDFSDK_Annot* pAnnot = GetFocusAnnot()) { - CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv(); - CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr(); - return pAnnotHandlerMgr->Annot_OnKeyDown(pAnnot, nKeyCode, nFlag); - } - return FALSE; -} - -FX_BOOL CPDFSDK_PageView::OnKeyUp(int nKeyCode, int nFlag) { - return FALSE; -} - -void CPDFSDK_PageView::LoadFXAnnots() { - CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv(); -#ifdef PDF_ENABLE_XFA - CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr(); -#else - FX_BOOL enableAPUpdate = CPDF_InterForm::UpdatingAPEnabled(); - // Disable the default AP construction. - CPDF_InterForm::EnableUpdateAP(FALSE); - m_pAnnotList.reset(new CPDF_AnnotList(m_page)); - CPDF_InterForm::EnableUpdateAP(enableAPUpdate); - const size_t nCount = m_pAnnotList->Count(); -#endif // PDF_ENABLE_XFA - - SetLock(TRUE); - -#ifdef PDF_ENABLE_XFA - m_page->AddRef(); - if (m_pSDKDoc->GetXFADocument()->GetDocType() == DOCTYPE_DYNAMIC_XFA) { - IXFA_PageView* pageView = m_page->GetXFAPageView(); - IXFA_WidgetIterator* pWidgetHander = pageView->CreateWidgetIterator( - XFA_TRAVERSEWAY_Form, XFA_WIDGETFILTER_Visible | - XFA_WIDGETFILTER_Viewable | - XFA_WIDGETFILTER_AllType); - if (!pWidgetHander) { - m_page->Release(); - SetLock(FALSE); - return; - } - - while (IXFA_Widget* pXFAAnnot = pWidgetHander->MoveToNext()) { - CPDFSDK_Annot* pAnnot = pAnnotHandlerMgr->NewAnnot(pXFAAnnot, this); - if (!pAnnot) - continue; - - m_fxAnnotArray.push_back(pAnnot); - pAnnotHandlerMgr->Annot_OnLoad(pAnnot); - } - pWidgetHander->Release(); - } else { - CPDF_Page* pPage = m_page->GetPDFPage(); - ASSERT(pPage); - FX_BOOL enableAPUpdate = CPDF_InterForm::UpdatingAPEnabled(); - // Disable the default AP construction. - CPDF_InterForm::EnableUpdateAP(FALSE); - m_pAnnotList.reset(new CPDF_AnnotList(pPage)); - CPDF_InterForm::EnableUpdateAP(enableAPUpdate); - - const size_t nCount = m_pAnnotList->Count(); - for (size_t i = 0; i < nCount; ++i) { - CPDF_Annot* pPDFAnnot = m_pAnnotList->GetAt(i); - CheckUnSupportAnnot(GetPDFDocument(), pPDFAnnot); - - CPDFSDK_Annot* pAnnot = pAnnotHandlerMgr->NewAnnot(pPDFAnnot, this); - if (!pAnnot) - continue; - m_fxAnnotArray.push_back(pAnnot); - pAnnotHandlerMgr->Annot_OnLoad(pAnnot); - } - } - m_page->Release(); -#else // PDF_ENABLE_XFA - for (size_t i = 0; i < nCount; ++i) { - CPDF_Annot* pPDFAnnot = m_pAnnotList->GetAt(i); - CPDF_Document* pDoc = GetPDFDocument(); - CheckUnSupportAnnot(pDoc, pPDFAnnot); - CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr(); - CPDFSDK_Annot* pAnnot = pAnnotHandlerMgr->NewAnnot(pPDFAnnot, this); - if (!pAnnot) - continue; - m_fxAnnotArray.push_back(pAnnot); - pAnnotHandlerMgr->Annot_OnLoad(pAnnot); - } -#endif // PDF_ENABLE_XFA - - SetLock(FALSE); -} - -void CPDFSDK_PageView::ClearFXAnnots() { - SetLock(TRUE); - if (m_pSDKDoc && GetFocusAnnot()) - m_pSDKDoc->SetFocusAnnot(nullptr); - m_CaptureWidget = nullptr; - for (CPDFSDK_Annot* pAnnot : m_fxAnnotArray) - m_pSDKDoc->GetEnv()->GetAnnotHandlerMgr()->ReleaseAnnot(pAnnot); - m_fxAnnotArray.clear(); - m_pAnnotList.reset(); - SetLock(FALSE); -} - -void CPDFSDK_PageView::UpdateRects(CFX_RectArray& rects) { - for (int i = 0; i < rects.GetSize(); i++) { - CFX_FloatRect rc = rects.GetAt(i); - CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv(); - pEnv->FFI_Invalidate(m_page, rc.left, rc.top, rc.right, rc.bottom); - } -} - -void CPDFSDK_PageView::UpdateView(CPDFSDK_Annot* pAnnot) { - CFX_FloatRect rcWindow = pAnnot->GetRect(); - CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv(); - pEnv->FFI_Invalidate(m_page, rcWindow.left, rcWindow.top, rcWindow.right, - rcWindow.bottom); -} - -int CPDFSDK_PageView::GetPageIndex() { - if (m_page) { -#ifdef PDF_ENABLE_XFA - CPDF_Dictionary* pDic = m_page->GetPDFPage()->m_pFormDict; -#else // PDF_ENABLE_XFA - CPDF_Dictionary* pDic = m_page->m_pFormDict; -#endif // PDF_ENABLE_XFA - CPDF_Document* pDoc = m_pSDKDoc->GetPDFDocument(); - if (pDoc && pDic) { - return pDoc->GetPageIndex(pDic->GetObjNum()); - } - } - return -1; -} - -bool CPDFSDK_PageView::IsValidAnnot(const CPDF_Annot* p) const { - if (!p) - return false; - - const auto& annots = m_pAnnotList->All(); - return pdfium::ContainsValue(annots, p); -} - -CPDFSDK_Annot* CPDFSDK_PageView::GetFocusAnnot() { - CPDFSDK_Annot* pFocusAnnot = m_pSDKDoc->GetFocusAnnot(); - if (!pFocusAnnot) - return nullptr; - - for (CPDFSDK_Annot* pAnnot : m_fxAnnotArray) { - if (pAnnot == pFocusAnnot) - return pAnnot; - } - return nullptr; -} diff --git a/fpdfsdk/src/fsdk_rendercontext.cpp b/fpdfsdk/src/fsdk_rendercontext.cpp deleted file mode 100644 index 3b671caea6..0000000000 --- a/fpdfsdk/src/fsdk_rendercontext.cpp +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "fpdfsdk/include/fsdk_rendercontext.h" - -void CRenderContext::Clear() { - m_pDevice = NULL; - m_pContext = NULL; - m_pRenderer = NULL; - m_pAnnots = NULL; - m_pOptions = NULL; -#ifdef _WIN32_WCE - m_pBitmap = NULL; - m_hBitmap = NULL; -#endif -} - -CRenderContext::~CRenderContext() { - delete m_pRenderer; - delete m_pContext; - delete m_pDevice; - delete m_pAnnots; - delete m_pOptions->m_pOCContext; - delete m_pOptions; -#ifdef _WIN32_WCE - delete m_pBitmap; - if (m_hBitmap) - DeleteObject(m_hBitmap); -#endif -} - -IFSDK_PAUSE_Adapter::IFSDK_PAUSE_Adapter(IFSDK_PAUSE* IPause) { - m_IPause = IPause; -} - -IFSDK_PAUSE_Adapter::~IFSDK_PAUSE_Adapter() { -} - -FX_BOOL IFSDK_PAUSE_Adapter::NeedToPauseNow() { - if (m_IPause->NeedToPauseNow) { - return m_IPause->NeedToPauseNow(m_IPause); - } - return FALSE; -} diff --git a/fpdfsdk/src/fxedit/fxet_ap.cpp b/fpdfsdk/src/fxedit/fxet_ap.cpp deleted file mode 100644 index 22f200d753..0000000000 --- a/fpdfsdk/src/fxedit/fxet_ap.cpp +++ /dev/null @@ -1,206 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "core/include/fpdfapi/fpdf_parser_decode.h" -#include "core/include/fpdfapi/fpdf_resource.h" -#include "fpdfsdk/include/fxedit/fx_edit.h" -#include "fpdfsdk/include/fxedit/fxet_edit.h" - -CFX_ByteString GetPDFWordString(IFX_Edit_FontMap* pFontMap, - int32_t nFontIndex, - FX_WORD Word, - FX_WORD SubWord) { - CFX_ByteString sWord; - if (CPDF_Font* pPDFFont = pFontMap->GetPDFFont(nFontIndex)) { - if (SubWord > 0) { - Word = SubWord; - } else { - FX_DWORD dwCharCode = -1; - - if (pPDFFont->IsUnicodeCompatible()) - dwCharCode = pPDFFont->CharCodeFromUnicode(Word); - else - dwCharCode = pFontMap->CharCodeFromUnicode(nFontIndex, Word); - - if (dwCharCode > 0) { - pPDFFont->AppendChar(sWord, dwCharCode); - return sWord; - } - } - - pPDFFont->AppendChar(sWord, Word); - } - - return sWord; -} - -static CFX_ByteString GetWordRenderString(const CFX_ByteString& strWords) { - if (strWords.GetLength() > 0) - return PDF_EncodeString(strWords) + " Tj\n"; - - return ""; -} - -static CFX_ByteString GetFontSetString(IFX_Edit_FontMap* pFontMap, - int32_t nFontIndex, - FX_FLOAT fFontSize) { - CFX_ByteTextBuf sRet; - - if (pFontMap) { - CFX_ByteString sFontAlias = pFontMap->GetPDFFontAlias(nFontIndex); - - if (sFontAlias.GetLength() > 0 && fFontSize > 0) - sRet << "/" << sFontAlias << " " << fFontSize << " Tf\n"; - } - - return sRet.GetByteString(); -} - -CFX_ByteString IFX_Edit::GetEditAppearanceStream( - IFX_Edit* pEdit, - const CFX_FloatPoint& ptOffset, - const CPVT_WordRange* pRange /* = NULL*/, - FX_BOOL bContinuous /* = TRUE*/, - FX_WORD SubWord /* = 0*/) { - CFX_ByteTextBuf sEditStream, sWords; - - CFX_FloatPoint ptOld(0.0f, 0.0f), ptNew(0.0f, 0.0f); - int32_t nCurFontIndex = -1; - - if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator()) { - if (pRange) - pIterator->SetAt(pRange->BeginPos); - else - pIterator->SetAt(0); - - CPVT_WordPlace oldplace; - - while (pIterator->NextWord()) { - CPVT_WordPlace place = pIterator->GetAt(); - - if (pRange && place.WordCmp(pRange->EndPos) > 0) - break; - - if (bContinuous) { - if (place.LineCmp(oldplace) != 0) { - if (sWords.GetSize() > 0) { - sEditStream << GetWordRenderString(sWords.GetByteString()); - sWords.Clear(); - } - - CPVT_Word word; - if (pIterator->GetWord(word)) { - ptNew = CFX_FloatPoint(word.ptWord.x + ptOffset.x, - word.ptWord.y + ptOffset.y); - } else { - CPVT_Line line; - pIterator->GetLine(line); - ptNew = CFX_FloatPoint(line.ptLine.x + ptOffset.x, - line.ptLine.y + ptOffset.y); - } - - if (ptNew.x != ptOld.x || ptNew.y != ptOld.y) { - sEditStream << ptNew.x - ptOld.x << " " << ptNew.y - ptOld.y - << " Td\n"; - - ptOld = ptNew; - } - } - - CPVT_Word word; - if (pIterator->GetWord(word)) { - if (word.nFontIndex != nCurFontIndex) { - if (sWords.GetSize() > 0) { - sEditStream << GetWordRenderString(sWords.GetByteString()); - sWords.Clear(); - } - sEditStream << GetFontSetString(pEdit->GetFontMap(), - word.nFontIndex, word.fFontSize); - nCurFontIndex = word.nFontIndex; - } - - sWords << GetPDFWordString(pEdit->GetFontMap(), nCurFontIndex, - word.Word, SubWord); - } - - oldplace = place; - } else { - CPVT_Word word; - if (pIterator->GetWord(word)) { - ptNew = CFX_FloatPoint(word.ptWord.x + ptOffset.x, - word.ptWord.y + ptOffset.y); - - if (ptNew.x != ptOld.x || ptNew.y != ptOld.y) { - sEditStream << ptNew.x - ptOld.x << " " << ptNew.y - ptOld.y - << " Td\n"; - ptOld = ptNew; - } - - if (word.nFontIndex != nCurFontIndex) { - sEditStream << GetFontSetString(pEdit->GetFontMap(), - word.nFontIndex, word.fFontSize); - nCurFontIndex = word.nFontIndex; - } - - sEditStream << GetWordRenderString(GetPDFWordString( - pEdit->GetFontMap(), nCurFontIndex, word.Word, SubWord)); - } - } - } - - if (sWords.GetSize() > 0) { - sEditStream << GetWordRenderString(sWords.GetByteString()); - sWords.Clear(); - } - } - - CFX_ByteTextBuf sAppStream; - if (sEditStream.GetSize() > 0) { - int32_t nHorzScale = pEdit->GetHorzScale(); - if (nHorzScale != 100) { - sAppStream << nHorzScale << " Tz\n"; - } - - FX_FLOAT fCharSpace = pEdit->GetCharSpace(); - if (!FX_EDIT_IsFloatZero(fCharSpace)) { - sAppStream << fCharSpace << " Tc\n"; - } - - sAppStream << sEditStream; - } - - return sAppStream.GetByteString(); -} - -CFX_ByteString IFX_Edit::GetSelectAppearanceStream( - IFX_Edit* pEdit, - const CFX_FloatPoint& ptOffset, - const CPVT_WordRange* pRange) { - CFX_ByteTextBuf sRet; - - if (pRange && pRange->IsExist()) { - if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator()) { - pIterator->SetAt(pRange->BeginPos); - - while (pIterator->NextWord()) { - CPVT_WordPlace place = pIterator->GetAt(); - - if (pRange && place.WordCmp(pRange->EndPos) > 0) - break; - - CPVT_Word word; - CPVT_Line line; - if (pIterator->GetWord(word) && pIterator->GetLine(line)) { - sRet << word.ptWord.x + ptOffset.x << " " - << line.ptLine.y + line.fLineDescent << " " << word.fWidth << " " - << line.fLineAscent - line.fLineDescent << " re\nf\n"; - } - } - } - } - - return sRet.GetByteString(); -} diff --git a/fpdfsdk/src/fxedit/fxet_edit.cpp b/fpdfsdk/src/fxedit/fxet_edit.cpp deleted file mode 100644 index 1b68dc0510..0000000000 --- a/fpdfsdk/src/fxedit/fxet_edit.cpp +++ /dev/null @@ -1,3034 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "fpdfsdk/include/fxedit/fxet_edit.h" - -#include <algorithm> - -#include "core/include/fpdfapi/fpdf_resource.h" - -#define FX_EDIT_UNDO_MAXITEM 10000 - -CFX_Edit_Iterator::CFX_Edit_Iterator(CFX_Edit* pEdit, - IPDF_VariableText_Iterator* pVTIterator) - : m_pEdit(pEdit), m_pVTIterator(pVTIterator) {} - -CFX_Edit_Iterator::~CFX_Edit_Iterator() {} - -FX_BOOL CFX_Edit_Iterator::NextWord() { - return m_pVTIterator->NextWord(); -} - -FX_BOOL CFX_Edit_Iterator::NextLine() { - return m_pVTIterator->NextLine(); -} - -FX_BOOL CFX_Edit_Iterator::NextSection() { - return m_pVTIterator->NextSection(); -} - -FX_BOOL CFX_Edit_Iterator::PrevWord() { - return m_pVTIterator->PrevWord(); -} - -FX_BOOL CFX_Edit_Iterator::PrevLine() { - return m_pVTIterator->PrevLine(); -} - -FX_BOOL CFX_Edit_Iterator::PrevSection() { - return m_pVTIterator->PrevSection(); -} - -FX_BOOL CFX_Edit_Iterator::GetWord(CPVT_Word& word) const { - ASSERT(m_pEdit); - - if (m_pVTIterator->GetWord(word)) { - word.ptWord = m_pEdit->VTToEdit(word.ptWord); - return TRUE; - } - return FALSE; -} - -FX_BOOL CFX_Edit_Iterator::GetLine(CPVT_Line& line) const { - ASSERT(m_pEdit); - - if (m_pVTIterator->GetLine(line)) { - line.ptLine = m_pEdit->VTToEdit(line.ptLine); - return TRUE; - } - return FALSE; -} - -FX_BOOL CFX_Edit_Iterator::GetSection(CPVT_Section& section) const { - ASSERT(m_pEdit); - - if (m_pVTIterator->GetSection(section)) { - section.rcSection = m_pEdit->VTToEdit(section.rcSection); - return TRUE; - } - return FALSE; -} - -void CFX_Edit_Iterator::SetAt(int32_t nWordIndex) { - m_pVTIterator->SetAt(nWordIndex); -} - -void CFX_Edit_Iterator::SetAt(const CPVT_WordPlace& place) { - m_pVTIterator->SetAt(place); -} - -const CPVT_WordPlace& CFX_Edit_Iterator::GetAt() const { - return m_pVTIterator->GetAt(); -} - -IFX_Edit* CFX_Edit_Iterator::GetEdit() const { - return m_pEdit; -} - -CFX_Edit_Provider::CFX_Edit_Provider(IFX_Edit_FontMap* pFontMap) - : m_pFontMap(pFontMap) { - ASSERT(m_pFontMap); -} - -CFX_Edit_Provider::~CFX_Edit_Provider() {} - -IFX_Edit_FontMap* CFX_Edit_Provider::GetFontMap() { - return m_pFontMap; -} - -int32_t CFX_Edit_Provider::GetCharWidth(int32_t nFontIndex, - FX_WORD word, - int32_t nWordStyle) { - if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex)) { - FX_DWORD charcode = word; - - if (pPDFFont->IsUnicodeCompatible()) - charcode = pPDFFont->CharCodeFromUnicode(word); - else - charcode = m_pFontMap->CharCodeFromUnicode(nFontIndex, word); - - if (charcode != -1) - return pPDFFont->GetCharWidthF(charcode); - } - - return 0; -} - -int32_t CFX_Edit_Provider::GetTypeAscent(int32_t nFontIndex) { - if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex)) - return pPDFFont->GetTypeAscent(); - - return 0; -} - -int32_t CFX_Edit_Provider::GetTypeDescent(int32_t nFontIndex) { - if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex)) - return pPDFFont->GetTypeDescent(); - - return 0; -} - -int32_t CFX_Edit_Provider::GetWordFontIndex(FX_WORD word, - int32_t charset, - int32_t nFontIndex) { - return m_pFontMap->GetWordFontIndex(word, charset, nFontIndex); -} - -int32_t CFX_Edit_Provider::GetDefaultFontIndex() { - return 0; -} - -FX_BOOL CFX_Edit_Provider::IsLatinWord(FX_WORD word) { - return FX_EDIT_ISLATINWORD(word); -} - -CFX_Edit_Refresh::CFX_Edit_Refresh() {} - -CFX_Edit_Refresh::~CFX_Edit_Refresh() {} - -void CFX_Edit_Refresh::BeginRefresh() { - m_RefreshRects.Empty(); - m_OldLineRects = m_NewLineRects; -} - -void CFX_Edit_Refresh::Push(const CPVT_WordRange& linerange, - const CFX_FloatRect& rect) { - m_NewLineRects.Add(linerange, rect); -} - -void CFX_Edit_Refresh::NoAnalyse() { - { - for (int32_t i = 0, sz = m_OldLineRects.GetSize(); i < sz; i++) - if (CFX_Edit_LineRect* pOldRect = m_OldLineRects.GetAt(i)) - m_RefreshRects.Add(pOldRect->m_rcLine); - } - - { - for (int32_t i = 0, sz = m_NewLineRects.GetSize(); i < sz; i++) - if (CFX_Edit_LineRect* pNewRect = m_NewLineRects.GetAt(i)) - m_RefreshRects.Add(pNewRect->m_rcLine); - } -} - -void CFX_Edit_Refresh::Analyse(int32_t nAlignment) { - FX_BOOL bLineTopChanged = FALSE; - CFX_FloatRect rcResult; - FX_FLOAT fWidthDiff; - - int32_t szMax = std::max(m_OldLineRects.GetSize(), m_NewLineRects.GetSize()); - int32_t i = 0; - - while (i < szMax) { - CFX_Edit_LineRect* pOldRect = m_OldLineRects.GetAt(i); - CFX_Edit_LineRect* pNewRect = m_NewLineRects.GetAt(i); - - if (pOldRect) { - if (pNewRect) { - if (bLineTopChanged) { - rcResult = pOldRect->m_rcLine; - rcResult.Union(pNewRect->m_rcLine); - m_RefreshRects.Add(rcResult); - } else { - if (*pNewRect != *pOldRect) { - if (!pNewRect->IsSameTop(*pOldRect) || - !pNewRect->IsSameHeight(*pOldRect)) { - bLineTopChanged = TRUE; - continue; - } - - if (nAlignment == 0) { - if (pNewRect->m_wrLine.BeginPos != pOldRect->m_wrLine.BeginPos) { - rcResult = pOldRect->m_rcLine; - rcResult.Union(pNewRect->m_rcLine); - m_RefreshRects.Add(rcResult); - } else { - if (!pNewRect->IsSameLeft(*pOldRect)) { - rcResult = pOldRect->m_rcLine; - rcResult.Union(pNewRect->m_rcLine); - } else { - fWidthDiff = - pNewRect->m_rcLine.Width() - pOldRect->m_rcLine.Width(); - rcResult = pNewRect->m_rcLine; - if (fWidthDiff > 0.0f) { - rcResult.left = rcResult.right - fWidthDiff; - } else { - rcResult.left = rcResult.right; - rcResult.right += (-fWidthDiff); - } - } - m_RefreshRects.Add(rcResult); - } - } else { - rcResult = pOldRect->m_rcLine; - rcResult.Union(pNewRect->m_rcLine); - m_RefreshRects.Add(rcResult); - } - } - } - } else { - m_RefreshRects.Add(pOldRect->m_rcLine); - } - } else { - if (pNewRect) { - m_RefreshRects.Add(pNewRect->m_rcLine); - } - } - i++; - } -} - -void CFX_Edit_Refresh::AddRefresh(const CFX_FloatRect& rect) { - m_RefreshRects.Add(rect); -} - -const CFX_Edit_RectArray* CFX_Edit_Refresh::GetRefreshRects() const { - return &m_RefreshRects; -} - -void CFX_Edit_Refresh::EndRefresh() { - m_RefreshRects.Empty(); -} - -CFX_Edit_Undo::CFX_Edit_Undo(int32_t nBufsize) - : m_nCurUndoPos(0), - m_nBufSize(nBufsize), - m_bModified(FALSE), - m_bVirgin(TRUE), - m_bWorking(FALSE) {} - -CFX_Edit_Undo::~CFX_Edit_Undo() { - Reset(); -} - -FX_BOOL CFX_Edit_Undo::CanUndo() const { - return m_nCurUndoPos > 0; -} - -void CFX_Edit_Undo::Undo() { - m_bWorking = TRUE; - - if (m_nCurUndoPos > 0) { - IFX_Edit_UndoItem* pItem = m_UndoItemStack.GetAt(m_nCurUndoPos - 1); - pItem->Undo(); - - m_nCurUndoPos--; - m_bModified = (m_nCurUndoPos != 0); - } - - m_bWorking = FALSE; -} - -FX_BOOL CFX_Edit_Undo::CanRedo() const { - return m_nCurUndoPos < m_UndoItemStack.GetSize(); -} - -void CFX_Edit_Undo::Redo() { - m_bWorking = TRUE; - - int32_t nStackSize = m_UndoItemStack.GetSize(); - - if (m_nCurUndoPos < nStackSize) { - IFX_Edit_UndoItem* pItem = m_UndoItemStack.GetAt(m_nCurUndoPos); - pItem->Redo(); - - m_nCurUndoPos++; - m_bModified = (m_nCurUndoPos != 0); - } - - m_bWorking = FALSE; -} - -FX_BOOL CFX_Edit_Undo::IsWorking() const { - return m_bWorking; -} - -void CFX_Edit_Undo::AddItem(IFX_Edit_UndoItem* pItem) { - ASSERT(!m_bWorking); - ASSERT(pItem); - ASSERT(m_nBufSize > 1); - - if (m_nCurUndoPos < m_UndoItemStack.GetSize()) - RemoveTails(); - - if (m_UndoItemStack.GetSize() >= m_nBufSize) { - RemoveHeads(); - m_bVirgin = FALSE; - } - - m_UndoItemStack.Add(pItem); - m_nCurUndoPos = m_UndoItemStack.GetSize(); - - m_bModified = (m_nCurUndoPos != 0); -} - -FX_BOOL CFX_Edit_Undo::IsModified() const { - return m_bVirgin ? m_bModified : TRUE; -} - -IFX_Edit_UndoItem* CFX_Edit_Undo::GetItem(int32_t nIndex) { - if (nIndex >= 0 && nIndex < m_UndoItemStack.GetSize()) - return m_UndoItemStack.GetAt(nIndex); - - return NULL; -} - -void CFX_Edit_Undo::RemoveHeads() { - ASSERT(m_UndoItemStack.GetSize() > 1); - - delete m_UndoItemStack.GetAt(0); - m_UndoItemStack.RemoveAt(0); -} - -void CFX_Edit_Undo::RemoveTails() { - for (int32_t i = m_UndoItemStack.GetSize() - 1; i >= m_nCurUndoPos; i--) { - delete m_UndoItemStack.GetAt(i); - m_UndoItemStack.RemoveAt(i); - } -} - -void CFX_Edit_Undo::Reset() { - for (int32_t i = 0, sz = m_UndoItemStack.GetSize(); i < sz; i++) { - delete m_UndoItemStack.GetAt(i); - } - m_nCurUndoPos = 0; - m_UndoItemStack.RemoveAll(); -} - -CFX_Edit_GroupUndoItem::CFX_Edit_GroupUndoItem(const CFX_WideString& sTitle) - : m_sTitle(sTitle) {} - -CFX_Edit_GroupUndoItem::~CFX_Edit_GroupUndoItem() { - for (int i = 0, sz = m_Items.GetSize(); i < sz; i++) { - delete m_Items[i]; - } - - m_Items.RemoveAll(); -} - -void CFX_Edit_GroupUndoItem::AddUndoItem(CFX_Edit_UndoItem* pUndoItem) { - pUndoItem->SetFirst(FALSE); - pUndoItem->SetLast(FALSE); - - m_Items.Add(pUndoItem); - - if (m_sTitle.IsEmpty()) - m_sTitle = pUndoItem->GetUndoTitle(); -} - -void CFX_Edit_GroupUndoItem::UpdateItems() { - if (m_Items.GetSize() > 0) { - CFX_Edit_UndoItem* pFirstItem = m_Items[0]; - pFirstItem->SetFirst(TRUE); - - CFX_Edit_UndoItem* pLastItem = m_Items[m_Items.GetSize() - 1]; - pLastItem->SetLast(TRUE); - } -} - -void CFX_Edit_GroupUndoItem::Undo() { - for (int i = m_Items.GetSize() - 1; i >= 0; i--) { - CFX_Edit_UndoItem* pUndoItem = m_Items[i]; - pUndoItem->Undo(); - } -} - -void CFX_Edit_GroupUndoItem::Redo() { - for (int i = 0, sz = m_Items.GetSize(); i < sz; i++) { - CFX_Edit_UndoItem* pUndoItem = m_Items[i]; - pUndoItem->Redo(); - } -} - -CFX_WideString CFX_Edit_GroupUndoItem::GetUndoTitle() { - return m_sTitle; -} - -CFXEU_InsertWord::CFXEU_InsertWord(CFX_Edit* pEdit, - const CPVT_WordPlace& wpOldPlace, - const CPVT_WordPlace& wpNewPlace, - FX_WORD word, - int32_t charset, - const CPVT_WordProps* pWordProps) - : m_pEdit(pEdit), - m_wpOld(wpOldPlace), - m_wpNew(wpNewPlace), - m_Word(word), - m_nCharset(charset), - m_WordProps() { - if (pWordProps) - m_WordProps = *pWordProps; -} - -CFXEU_InsertWord::~CFXEU_InsertWord() {} - -void CFXEU_InsertWord::Redo() { - if (m_pEdit) { - m_pEdit->SelectNone(); - m_pEdit->SetCaret(m_wpOld); - m_pEdit->InsertWord(m_Word, m_nCharset, &m_WordProps, FALSE, TRUE); - } -} - -void CFXEU_InsertWord::Undo() { - if (m_pEdit) { - m_pEdit->SelectNone(); - m_pEdit->SetCaret(m_wpNew); - m_pEdit->Backspace(FALSE, TRUE); - } -} - -CFXEU_InsertReturn::CFXEU_InsertReturn(CFX_Edit* pEdit, - const CPVT_WordPlace& wpOldPlace, - const CPVT_WordPlace& wpNewPlace, - const CPVT_SecProps* pSecProps, - const CPVT_WordProps* pWordProps) - : m_pEdit(pEdit), - m_wpOld(wpOldPlace), - m_wpNew(wpNewPlace), - m_SecProps(), - m_WordProps() { - if (pSecProps) - m_SecProps = *pSecProps; - if (pWordProps) - m_WordProps = *pWordProps; -} - -CFXEU_InsertReturn::~CFXEU_InsertReturn() {} - -void CFXEU_InsertReturn::Redo() { - if (m_pEdit) { - m_pEdit->SelectNone(); - m_pEdit->SetCaret(m_wpOld); - m_pEdit->InsertReturn(&m_SecProps, &m_WordProps, FALSE, TRUE); - } -} - -void CFXEU_InsertReturn::Undo() { - if (m_pEdit) { - m_pEdit->SelectNone(); - m_pEdit->SetCaret(m_wpNew); - m_pEdit->Backspace(FALSE, TRUE); - } -} - -CFXEU_Backspace::CFXEU_Backspace(CFX_Edit* pEdit, - const CPVT_WordPlace& wpOldPlace, - const CPVT_WordPlace& wpNewPlace, - FX_WORD word, - int32_t charset, - const CPVT_SecProps& SecProps, - const CPVT_WordProps& WordProps) - : m_pEdit(pEdit), - m_wpOld(wpOldPlace), - m_wpNew(wpNewPlace), - m_Word(word), - m_nCharset(charset), - m_SecProps(SecProps), - m_WordProps(WordProps) {} - -CFXEU_Backspace::~CFXEU_Backspace() {} - -void CFXEU_Backspace::Redo() { - if (m_pEdit) { - m_pEdit->SelectNone(); - m_pEdit->SetCaret(m_wpOld); - m_pEdit->Backspace(FALSE, TRUE); - } -} - -void CFXEU_Backspace::Undo() { - if (m_pEdit) { - m_pEdit->SelectNone(); - m_pEdit->SetCaret(m_wpNew); - if (m_wpNew.SecCmp(m_wpOld) != 0) { - m_pEdit->InsertReturn(&m_SecProps, &m_WordProps, FALSE, TRUE); - } else { - m_pEdit->InsertWord(m_Word, m_nCharset, &m_WordProps, FALSE, TRUE); - } - } -} - -CFXEU_Delete::CFXEU_Delete(CFX_Edit* pEdit, - const CPVT_WordPlace& wpOldPlace, - const CPVT_WordPlace& wpNewPlace, - FX_WORD word, - int32_t charset, - const CPVT_SecProps& SecProps, - const CPVT_WordProps& WordProps, - FX_BOOL bSecEnd) - : m_pEdit(pEdit), - m_wpOld(wpOldPlace), - m_wpNew(wpNewPlace), - m_Word(word), - m_nCharset(charset), - m_SecProps(SecProps), - m_WordProps(WordProps), - m_bSecEnd(bSecEnd) {} - -CFXEU_Delete::~CFXEU_Delete() {} - -void CFXEU_Delete::Redo() { - if (m_pEdit) { - m_pEdit->SelectNone(); - m_pEdit->SetCaret(m_wpOld); - m_pEdit->Delete(FALSE, TRUE); - } -} - -void CFXEU_Delete::Undo() { - if (m_pEdit) { - m_pEdit->SelectNone(); - m_pEdit->SetCaret(m_wpNew); - if (m_bSecEnd) { - m_pEdit->InsertReturn(&m_SecProps, &m_WordProps, FALSE, TRUE); - } else { - m_pEdit->InsertWord(m_Word, m_nCharset, &m_WordProps, FALSE, TRUE); - } - } -} - -CFXEU_Clear::CFXEU_Clear(CFX_Edit* pEdit, - const CPVT_WordRange& wrSel, - const CFX_WideString& swText) - : m_pEdit(pEdit), m_wrSel(wrSel), m_swText(swText) {} - -CFXEU_Clear::~CFXEU_Clear() {} - -void CFXEU_Clear::Redo() { - if (m_pEdit) { - m_pEdit->SelectNone(); - m_pEdit->SetSel(m_wrSel.BeginPos, m_wrSel.EndPos); - m_pEdit->Clear(FALSE, TRUE); - } -} - -void CFXEU_Clear::Undo() { - if (m_pEdit) { - m_pEdit->SelectNone(); - m_pEdit->SetCaret(m_wrSel.BeginPos); - m_pEdit->InsertText(m_swText.c_str(), DEFAULT_CHARSET, NULL, NULL, FALSE, - TRUE); - m_pEdit->SetSel(m_wrSel.BeginPos, m_wrSel.EndPos); - } -} - -CFXEU_ClearRich::CFXEU_ClearRich(CFX_Edit* pEdit, - const CPVT_WordPlace& wpOldPlace, - const CPVT_WordPlace& wpNewPlace, - const CPVT_WordRange& wrSel, - FX_WORD word, - int32_t charset, - const CPVT_SecProps& SecProps, - const CPVT_WordProps& WordProps) - : m_pEdit(pEdit), - m_wpOld(wpOldPlace), - m_wpNew(wpNewPlace), - m_wrSel(wrSel), - m_Word(word), - m_nCharset(charset), - m_SecProps(SecProps), - m_WordProps(WordProps) {} - -CFXEU_ClearRich::~CFXEU_ClearRich() {} - -void CFXEU_ClearRich::Redo() { - if (m_pEdit && IsLast()) { - m_pEdit->SelectNone(); - m_pEdit->SetSel(m_wrSel.BeginPos, m_wrSel.EndPos); - m_pEdit->Clear(FALSE, TRUE); - } -} - -void CFXEU_ClearRich::Undo() { - if (m_pEdit) { - m_pEdit->SelectNone(); - m_pEdit->SetCaret(m_wpOld); - if (m_wpNew.SecCmp(m_wpOld) != 0) { - m_pEdit->InsertReturn(&m_SecProps, &m_WordProps, FALSE, FALSE); - } else { - m_pEdit->InsertWord(m_Word, m_nCharset, &m_WordProps, FALSE, FALSE); - } - - if (IsFirst()) { - m_pEdit->PaintInsertText(m_wrSel.BeginPos, m_wrSel.EndPos); - m_pEdit->SetSel(m_wrSel.BeginPos, m_wrSel.EndPos); - } - } -} -CFXEU_InsertText::CFXEU_InsertText(CFX_Edit* pEdit, - const CPVT_WordPlace& wpOldPlace, - const CPVT_WordPlace& wpNewPlace, - const CFX_WideString& swText, - int32_t charset, - const CPVT_SecProps* pSecProps, - const CPVT_WordProps* pWordProps) - : m_pEdit(pEdit), - m_wpOld(wpOldPlace), - m_wpNew(wpNewPlace), - m_swText(swText), - m_nCharset(charset), - m_SecProps(), - m_WordProps() { - if (pSecProps) - m_SecProps = *pSecProps; - if (pWordProps) - m_WordProps = *pWordProps; -} - -CFXEU_InsertText::~CFXEU_InsertText() {} - -void CFXEU_InsertText::Redo() { - if (m_pEdit && IsLast()) { - m_pEdit->SelectNone(); - m_pEdit->SetCaret(m_wpOld); - m_pEdit->InsertText(m_swText.c_str(), m_nCharset, &m_SecProps, &m_WordProps, - FALSE, TRUE); - } -} - -void CFXEU_InsertText::Undo() { - if (m_pEdit) { - m_pEdit->SelectNone(); - m_pEdit->SetSel(m_wpOld, m_wpNew); - m_pEdit->Clear(FALSE, TRUE); - } -} - -CFXEU_SetSecProps::CFXEU_SetSecProps(CFX_Edit* pEdit, - const CPVT_WordPlace& place, - EDIT_PROPS_E ep, - const CPVT_SecProps& oldsecprops, - const CPVT_WordProps& oldwordprops, - const CPVT_SecProps& newsecprops, - const CPVT_WordProps& newwordprops, - const CPVT_WordRange& range) - : m_pEdit(pEdit), - m_wpPlace(place), - m_wrPlace(range), - m_eProps(ep), - m_OldSecProps(oldsecprops), - m_NewSecProps(newsecprops), - m_OldWordProps(oldwordprops), - m_NewWordProps(newwordprops) {} - -CFXEU_SetSecProps::~CFXEU_SetSecProps() {} - -void CFXEU_SetSecProps::Redo() { - if (m_pEdit) { - m_pEdit->SetSecProps(m_eProps, m_wpPlace, &m_NewSecProps, &m_NewWordProps, - m_wrPlace, FALSE); - if (IsLast()) { - m_pEdit->SelectNone(); - m_pEdit->PaintSetProps(m_eProps, m_wrPlace); - m_pEdit->SetSel(m_wrPlace.BeginPos, m_wrPlace.EndPos); - } - } -} - -void CFXEU_SetSecProps::Undo() { - if (m_pEdit) { - m_pEdit->SetSecProps(m_eProps, m_wpPlace, &m_OldSecProps, &m_OldWordProps, - m_wrPlace, FALSE); - if (IsFirst()) { - m_pEdit->SelectNone(); - m_pEdit->PaintSetProps(m_eProps, m_wrPlace); - m_pEdit->SetSel(m_wrPlace.BeginPos, m_wrPlace.EndPos); - } - } -} - -CFXEU_SetWordProps::CFXEU_SetWordProps(CFX_Edit* pEdit, - const CPVT_WordPlace& place, - EDIT_PROPS_E ep, - const CPVT_WordProps& oldprops, - const CPVT_WordProps& newprops, - const CPVT_WordRange& range) - : m_pEdit(pEdit), - m_wpPlace(place), - m_wrPlace(range), - m_eProps(ep), - m_OldWordProps(oldprops), - m_NewWordProps(newprops) {} - -CFXEU_SetWordProps::~CFXEU_SetWordProps() {} - -void CFXEU_SetWordProps::Redo() { - if (m_pEdit) { - m_pEdit->SetWordProps(m_eProps, m_wpPlace, &m_NewWordProps, m_wrPlace, - FALSE); - if (IsLast()) { - m_pEdit->SelectNone(); - m_pEdit->PaintSetProps(m_eProps, m_wrPlace); - m_pEdit->SetSel(m_wrPlace.BeginPos, m_wrPlace.EndPos); - } - } -} - -void CFXEU_SetWordProps::Undo() { - if (m_pEdit) { - m_pEdit->SetWordProps(m_eProps, m_wpPlace, &m_OldWordProps, m_wrPlace, - FALSE); - if (IsFirst()) { - m_pEdit->SelectNone(); - m_pEdit->PaintSetProps(m_eProps, m_wrPlace); - m_pEdit->SetSel(m_wrPlace.BeginPos, m_wrPlace.EndPos); - } - } -} - -CFX_Edit::CFX_Edit(IPDF_VariableText* pVT) - : m_pVT(pVT), - m_pNotify(NULL), - m_pOprNotify(NULL), - m_pVTProvide(NULL), - m_wpCaret(-1, -1, -1), - m_wpOldCaret(-1, -1, -1), - m_SelState(), - m_ptScrollPos(0, 0), - m_ptRefreshScrollPos(0, 0), - m_bEnableScroll(FALSE), - m_pIterator(NULL), - m_ptCaret(0.0f, 0.0f), - m_Undo(FX_EDIT_UNDO_MAXITEM), - m_nAlignment(0), - m_bNotifyFlag(FALSE), - m_bEnableOverflow(FALSE), - m_bEnableRefresh(TRUE), - m_rcOldContent(0.0f, 0.0f, 0.0f, 0.0f), - m_bEnableUndo(TRUE), - m_bNotify(TRUE), - m_bOprNotify(FALSE), - m_pGroupUndoItem(NULL) { - ASSERT(pVT); -} - -CFX_Edit::~CFX_Edit() { - delete m_pVTProvide; - m_pVTProvide = NULL; - delete m_pIterator; - m_pIterator = NULL; - ASSERT(!m_pGroupUndoItem); -} - -void CFX_Edit::Initialize() { - m_pVT->Initialize(); - SetCaret(m_pVT->GetBeginWordPlace()); - SetCaretOrigin(); -} - -void CFX_Edit::SetFontMap(IFX_Edit_FontMap* pFontMap) { - delete m_pVTProvide; - m_pVT->SetProvider(m_pVTProvide = new CFX_Edit_Provider(pFontMap)); -} - -void CFX_Edit::SetVTProvider(IPDF_VariableText_Provider* pProvider) { - m_pVT->SetProvider(pProvider); -} - -void CFX_Edit::SetNotify(IFX_Edit_Notify* pNotify) { - m_pNotify = pNotify; -} - -void CFX_Edit::SetOprNotify(IFX_Edit_OprNotify* pOprNotify) { - m_pOprNotify = pOprNotify; -} - -IFX_Edit_Iterator* CFX_Edit::GetIterator() { - if (!m_pIterator) - m_pIterator = new CFX_Edit_Iterator(this, m_pVT->GetIterator()); - - return m_pIterator; -} - -IPDF_VariableText* CFX_Edit::GetVariableText() { - return m_pVT; -} - -IFX_Edit_FontMap* CFX_Edit::GetFontMap() { - if (m_pVTProvide) - return m_pVTProvide->GetFontMap(); - - return NULL; -} - -void CFX_Edit::SetPlateRect(const CFX_FloatRect& rect, FX_BOOL bPaint) { - m_pVT->SetPlateRect(rect); - m_ptScrollPos = CFX_FloatPoint(rect.left, rect.top); - if (bPaint) - Paint(); -} - -void CFX_Edit::SetAlignmentH(int32_t nFormat, FX_BOOL bPaint) { - m_pVT->SetAlignment(nFormat); - if (bPaint) - Paint(); -} - -void CFX_Edit::SetAlignmentV(int32_t nFormat, FX_BOOL bPaint) { - m_nAlignment = nFormat; - if (bPaint) - Paint(); -} - -void CFX_Edit::SetPasswordChar(FX_WORD wSubWord, FX_BOOL bPaint) { - m_pVT->SetPasswordChar(wSubWord); - if (bPaint) - Paint(); -} - -void CFX_Edit::SetLimitChar(int32_t nLimitChar, FX_BOOL bPaint) { - m_pVT->SetLimitChar(nLimitChar); - if (bPaint) - Paint(); -} - -void CFX_Edit::SetCharArray(int32_t nCharArray, FX_BOOL bPaint) { - m_pVT->SetCharArray(nCharArray); - if (bPaint) - Paint(); -} - -void CFX_Edit::SetCharSpace(FX_FLOAT fCharSpace, FX_BOOL bPaint) { - m_pVT->SetCharSpace(fCharSpace); - if (bPaint) - Paint(); -} - -void CFX_Edit::SetHorzScale(int32_t nHorzScale, FX_BOOL bPaint) { - m_pVT->SetHorzScale(nHorzScale); - if (bPaint) - Paint(); -} - -void CFX_Edit::SetMultiLine(FX_BOOL bMultiLine, FX_BOOL bPaint) { - m_pVT->SetMultiLine(bMultiLine); - if (bPaint) - Paint(); -} - -void CFX_Edit::SetAutoReturn(FX_BOOL bAuto, FX_BOOL bPaint) { - m_pVT->SetAutoReturn(bAuto); - if (bPaint) - Paint(); -} - -void CFX_Edit::SetLineLeading(FX_FLOAT fLineLeading, FX_BOOL bPaint) { - m_pVT->SetLineLeading(fLineLeading); - if (bPaint) - Paint(); -} - -void CFX_Edit::SetAutoFontSize(FX_BOOL bAuto, FX_BOOL bPaint) { - m_pVT->SetAutoFontSize(bAuto); - if (bPaint) - Paint(); -} - -void CFX_Edit::SetFontSize(FX_FLOAT fFontSize, FX_BOOL bPaint) { - m_pVT->SetFontSize(fFontSize); - if (bPaint) - Paint(); -} - -void CFX_Edit::SetAutoScroll(FX_BOOL bAuto, FX_BOOL bPaint) { - m_bEnableScroll = bAuto; - if (bPaint) - Paint(); -} - -void CFX_Edit::SetTextOverflow(FX_BOOL bAllowed, FX_BOOL bPaint) { - m_bEnableOverflow = bAllowed; - if (bPaint) - Paint(); -} - -void CFX_Edit::SetSel(int32_t nStartChar, int32_t nEndChar) { - if (m_pVT->IsValid()) { - if (nStartChar == 0 && nEndChar < 0) { - SelectAll(); - } else if (nStartChar < 0) { - SelectNone(); - } else { - if (nStartChar < nEndChar) { - SetSel(m_pVT->WordIndexToWordPlace(nStartChar), - m_pVT->WordIndexToWordPlace(nEndChar)); - } else { - SetSel(m_pVT->WordIndexToWordPlace(nEndChar), - m_pVT->WordIndexToWordPlace(nStartChar)); - } - } - } -} - -void CFX_Edit::SetSel(const CPVT_WordPlace& begin, const CPVT_WordPlace& end) { - if (m_pVT->IsValid()) { - SelectNone(); - - m_SelState.Set(begin, end); - - SetCaret(m_SelState.EndPos); - - if (m_SelState.IsExist()) { - ScrollToCaret(); - CPVT_WordRange wr(m_SelState.BeginPos, m_SelState.EndPos); - Refresh(RP_OPTIONAL, &wr); - SetCaretInfo(); - } else { - ScrollToCaret(); - SetCaretInfo(); - } - } -} - -void CFX_Edit::GetSel(int32_t& nStartChar, int32_t& nEndChar) const { - nStartChar = -1; - nEndChar = -1; - - if (m_pVT->IsValid()) { - if (m_SelState.IsExist()) { - if (m_SelState.BeginPos.WordCmp(m_SelState.EndPos) < 0) { - nStartChar = m_pVT->WordPlaceToWordIndex(m_SelState.BeginPos); - nEndChar = m_pVT->WordPlaceToWordIndex(m_SelState.EndPos); - } else { - nStartChar = m_pVT->WordPlaceToWordIndex(m_SelState.EndPos); - nEndChar = m_pVT->WordPlaceToWordIndex(m_SelState.BeginPos); - } - } else { - nStartChar = m_pVT->WordPlaceToWordIndex(m_wpCaret); - nEndChar = m_pVT->WordPlaceToWordIndex(m_wpCaret); - } - } -} - -int32_t CFX_Edit::GetCaret() const { - if (m_pVT->IsValid()) - return m_pVT->WordPlaceToWordIndex(m_wpCaret); - - return -1; -} - -CPVT_WordPlace CFX_Edit::GetCaretWordPlace() const { - return m_wpCaret; -} - -CFX_WideString CFX_Edit::GetText() const { - CFX_WideString swRet; - - if (m_pVT->IsValid()) { - if (IPDF_VariableText_Iterator* pIterator = m_pVT->GetIterator()) { - FX_BOOL bRich = m_pVT->IsRichText(); - - pIterator->SetAt(0); - - CPVT_Word wordinfo; - CPVT_WordPlace oldplace = pIterator->GetAt(); - while (pIterator->NextWord()) { - CPVT_WordPlace place = pIterator->GetAt(); - - if (pIterator->GetWord(wordinfo)) { - if (bRich) { - swRet += wordinfo.Word; - } else { - swRet += wordinfo.Word; - } - } - - if (oldplace.SecCmp(place) != 0) { - swRet += 0x0D; - swRet += 0x0A; - } - - oldplace = place; - } - } - } - - return swRet; -} - -CFX_WideString CFX_Edit::GetRangeText(const CPVT_WordRange& range) const { - CFX_WideString swRet; - - if (m_pVT->IsValid()) { - FX_BOOL bRich = m_pVT->IsRichText(); - - if (IPDF_VariableText_Iterator* pIterator = m_pVT->GetIterator()) { - CPVT_WordRange wrTemp = range; - m_pVT->UpdateWordPlace(wrTemp.BeginPos); - m_pVT->UpdateWordPlace(wrTemp.EndPos); - pIterator->SetAt(wrTemp.BeginPos); - - CPVT_Word wordinfo; - CPVT_WordPlace oldplace = wrTemp.BeginPos; - while (pIterator->NextWord()) { - CPVT_WordPlace place = pIterator->GetAt(); - if (place.WordCmp(wrTemp.EndPos) > 0) - break; - - if (pIterator->GetWord(wordinfo)) { - if (bRich) { - swRet += wordinfo.Word; - } else { - swRet += wordinfo.Word; - } - } - - if (oldplace.SecCmp(place) != 0) { - swRet += 0x0D; - swRet += 0x0A; - } - - oldplace = place; - } - } - } - - return swRet; -} - -CFX_WideString CFX_Edit::GetSelText() const { - return GetRangeText(m_SelState.ConvertToWordRange()); -} - -int32_t CFX_Edit::GetTotalWords() const { - return m_pVT->GetTotalWords(); -} - -int32_t CFX_Edit::GetTotalLines() const { - int32_t nLines = 0; - - if (IPDF_VariableText_Iterator* pIterator = m_pVT->GetIterator()) { - pIterator->SetAt(0); - while (pIterator->NextLine()) - nLines++; - } - - return nLines + 1; -} - -CPVT_WordRange CFX_Edit::GetSelectWordRange() const { - return m_SelState.ConvertToWordRange(); -} - -CPVT_WordRange CFX_Edit::CombineWordRange(const CPVT_WordRange& wr1, - const CPVT_WordRange& wr2) { - CPVT_WordRange wrRet; - - if (wr1.BeginPos.WordCmp(wr2.BeginPos) < 0) { - wrRet.BeginPos = wr1.BeginPos; - } else { - wrRet.BeginPos = wr2.BeginPos; - } - - if (wr1.EndPos.WordCmp(wr2.EndPos) < 0) { - wrRet.EndPos = wr2.EndPos; - } else { - wrRet.EndPos = wr1.EndPos; - } - - return wrRet; -} - -FX_BOOL CFX_Edit::IsRichText() const { - return m_pVT->IsRichText(); -} - -void CFX_Edit::SetRichText(FX_BOOL bRichText, FX_BOOL bPaint) { - m_pVT->SetRichText(bRichText); - if (bPaint) - Paint(); -} - -FX_BOOL CFX_Edit::SetRichFontIndex(int32_t nFontIndex) { - CPVT_WordProps WordProps; - WordProps.nFontIndex = nFontIndex; - return SetRichTextProps(EP_FONTINDEX, NULL, &WordProps); -} - -FX_BOOL CFX_Edit::SetRichFontSize(FX_FLOAT fFontSize) { - CPVT_WordProps WordProps; - WordProps.fFontSize = fFontSize; - return SetRichTextProps(EP_FONTSIZE, NULL, &WordProps); -} - -FX_BOOL CFX_Edit::SetRichTextColor(FX_COLORREF dwColor) { - CPVT_WordProps WordProps; - WordProps.dwWordColor = dwColor; - return SetRichTextProps(EP_WORDCOLOR, NULL, &WordProps); -} - -FX_BOOL CFX_Edit::SetRichTextScript(int32_t nScriptType) { - CPVT_WordProps WordProps; - WordProps.nScriptType = nScriptType; - return SetRichTextProps(EP_SCRIPTTYPE, NULL, &WordProps); -} - -FX_BOOL CFX_Edit::SetRichTextBold(FX_BOOL bBold) { - CPVT_WordProps WordProps; - if (bBold) - WordProps.nWordStyle |= PVTWORD_STYLE_BOLD; - return SetRichTextProps(EP_BOLD, NULL, &WordProps); -} - -FX_BOOL CFX_Edit::SetRichTextItalic(FX_BOOL bItalic) { - CPVT_WordProps WordProps; - if (bItalic) - WordProps.nWordStyle |= PVTWORD_STYLE_ITALIC; - return SetRichTextProps(EP_ITALIC, NULL, &WordProps); -} - -FX_BOOL CFX_Edit::SetRichTextUnderline(FX_BOOL bUnderline) { - CPVT_WordProps WordProps; - if (bUnderline) - WordProps.nWordStyle |= PVTWORD_STYLE_UNDERLINE; - return SetRichTextProps(EP_UNDERLINE, NULL, &WordProps); -} - -FX_BOOL CFX_Edit::SetRichTextCrossout(FX_BOOL bCrossout) { - CPVT_WordProps WordProps; - if (bCrossout) - WordProps.nWordStyle |= PVTWORD_STYLE_CROSSOUT; - return SetRichTextProps(EP_CROSSOUT, NULL, &WordProps); -} - -FX_BOOL CFX_Edit::SetRichTextCharSpace(FX_FLOAT fCharSpace) { - CPVT_WordProps WordProps; - WordProps.fCharSpace = fCharSpace; - return SetRichTextProps(EP_CHARSPACE, NULL, &WordProps); -} - -FX_BOOL CFX_Edit::SetRichTextHorzScale(int32_t nHorzScale) { - CPVT_WordProps WordProps; - WordProps.nHorzScale = nHorzScale; - return SetRichTextProps(EP_HORZSCALE, NULL, &WordProps); -} - -FX_BOOL CFX_Edit::SetRichTextLineLeading(FX_FLOAT fLineLeading) { - CPVT_SecProps SecProps; - SecProps.fLineLeading = fLineLeading; - return SetRichTextProps(EP_LINELEADING, &SecProps, NULL); -} - -FX_BOOL CFX_Edit::SetRichTextLineIndent(FX_FLOAT fLineIndent) { - CPVT_SecProps SecProps; - SecProps.fLineIndent = fLineIndent; - return SetRichTextProps(EP_LINEINDENT, &SecProps, NULL); -} - -FX_BOOL CFX_Edit::SetRichTextAlignment(int32_t nAlignment) { - CPVT_SecProps SecProps; - SecProps.nAlignment = nAlignment; - return SetRichTextProps(EP_ALIGNMENT, &SecProps, NULL); -} - -FX_BOOL CFX_Edit::SetRichTextProps(EDIT_PROPS_E eProps, - const CPVT_SecProps* pSecProps, - const CPVT_WordProps* pWordProps) { - FX_BOOL bSet = FALSE; - FX_BOOL bSet1, bSet2; - if (m_pVT->IsValid() && m_pVT->IsRichText()) { - if (IPDF_VariableText_Iterator* pIterator = m_pVT->GetIterator()) { - CPVT_WordRange wrTemp = m_SelState.ConvertToWordRange(); - - m_pVT->UpdateWordPlace(wrTemp.BeginPos); - m_pVT->UpdateWordPlace(wrTemp.EndPos); - pIterator->SetAt(wrTemp.BeginPos); - - BeginGroupUndo(L""); - bSet = SetSecProps(eProps, wrTemp.BeginPos, pSecProps, pWordProps, wrTemp, - TRUE); - - while (pIterator->NextWord()) { - CPVT_WordPlace place = pIterator->GetAt(); - if (place.WordCmp(wrTemp.EndPos) > 0) - break; - bSet1 = SetSecProps(eProps, place, pSecProps, pWordProps, wrTemp, TRUE); - bSet2 = SetWordProps(eProps, place, pWordProps, wrTemp, TRUE); - - if (!bSet) - bSet = (bSet1 || bSet2); - } - - EndGroupUndo(); - - if (bSet) { - PaintSetProps(eProps, wrTemp); - } - } - } - - return bSet; -} - -void CFX_Edit::PaintSetProps(EDIT_PROPS_E eProps, const CPVT_WordRange& wr) { - switch (eProps) { - case EP_LINELEADING: - case EP_LINEINDENT: - case EP_ALIGNMENT: - RearrangePart(wr); - ScrollToCaret(); - Refresh(RP_ANALYSE); - SetCaretOrigin(); - SetCaretInfo(); - break; - case EP_WORDCOLOR: - case EP_UNDERLINE: - case EP_CROSSOUT: - Refresh(RP_OPTIONAL, &wr); - break; - case EP_FONTINDEX: - case EP_FONTSIZE: - case EP_SCRIPTTYPE: - case EP_CHARSPACE: - case EP_HORZSCALE: - case EP_BOLD: - case EP_ITALIC: - RearrangePart(wr); - ScrollToCaret(); - - CPVT_WordRange wrRefresh(m_pVT->GetSectionBeginPlace(wr.BeginPos), - m_pVT->GetSectionEndPlace(wr.EndPos)); - Refresh(RP_ANALYSE, &wrRefresh); - - SetCaretOrigin(); - SetCaretInfo(); - break; - } -} - -FX_BOOL CFX_Edit::SetSecProps(EDIT_PROPS_E eProps, - const CPVT_WordPlace& place, - const CPVT_SecProps* pSecProps, - const CPVT_WordProps* pWordProps, - const CPVT_WordRange& wr, - FX_BOOL bAddUndo) { - if (m_pVT->IsValid() && m_pVT->IsRichText()) { - if (IPDF_VariableText_Iterator* pIterator = m_pVT->GetIterator()) { - FX_BOOL bSet = FALSE; - CPVT_Section secinfo; - CPVT_Section OldSecinfo; - - CPVT_WordPlace oldplace = pIterator->GetAt(); - - if (eProps == EP_LINELEADING || eProps == EP_LINEINDENT || - eProps == EP_ALIGNMENT) { - if (pSecProps) { - pIterator->SetAt(place); - if (pIterator->GetSection(secinfo)) { - if (bAddUndo) - OldSecinfo = secinfo; - - switch (eProps) { - case EP_LINELEADING: - if (!FX_EDIT_IsFloatEqual(secinfo.SecProps.fLineLeading, - pSecProps->fLineLeading)) { - secinfo.SecProps.fLineLeading = pSecProps->fLineLeading; - bSet = TRUE; - } - break; - case EP_LINEINDENT: - if (!FX_EDIT_IsFloatEqual(secinfo.SecProps.fLineIndent, - pSecProps->fLineIndent)) { - secinfo.SecProps.fLineIndent = pSecProps->fLineIndent; - bSet = TRUE; - } - break; - case EP_ALIGNMENT: - if (secinfo.SecProps.nAlignment != pSecProps->nAlignment) { - secinfo.SecProps.nAlignment = pSecProps->nAlignment; - bSet = TRUE; - } - break; - default: - break; - } - } - } - } else { - if (pWordProps && place == m_pVT->GetSectionBeginPlace(place)) { - pIterator->SetAt(place); - if (pIterator->GetSection(secinfo)) { - if (bAddUndo) - OldSecinfo = secinfo; - - switch (eProps) { - case EP_FONTINDEX: - if (secinfo.WordProps.nFontIndex != pWordProps->nFontIndex) { - secinfo.WordProps.nFontIndex = pWordProps->nFontIndex; - bSet = TRUE; - } - break; - case EP_FONTSIZE: - if (!FX_EDIT_IsFloatEqual(secinfo.WordProps.fFontSize, - pWordProps->fFontSize)) { - secinfo.WordProps.fFontSize = pWordProps->fFontSize; - bSet = TRUE; - } - break; - case EP_WORDCOLOR: - if (secinfo.WordProps.dwWordColor != pWordProps->dwWordColor) { - secinfo.WordProps.dwWordColor = pWordProps->dwWordColor; - bSet = TRUE; - } - break; - case EP_SCRIPTTYPE: - if (secinfo.WordProps.nScriptType != pWordProps->nScriptType) { - secinfo.WordProps.nScriptType = pWordProps->nScriptType; - bSet = TRUE; - } - break; - case EP_CHARSPACE: - if (!FX_EDIT_IsFloatEqual(secinfo.WordProps.fCharSpace, - pWordProps->fCharSpace)) { - secinfo.WordProps.fCharSpace = pWordProps->fCharSpace; - bSet = TRUE; - } - break; - case EP_HORZSCALE: - if (secinfo.WordProps.nHorzScale != pWordProps->nHorzScale) { - secinfo.WordProps.nHorzScale = pWordProps->nHorzScale; - bSet = TRUE; - } - break; - case EP_UNDERLINE: - if (pWordProps->nWordStyle & PVTWORD_STYLE_UNDERLINE) { - if ((secinfo.WordProps.nWordStyle & - PVTWORD_STYLE_UNDERLINE) == 0) { - secinfo.WordProps.nWordStyle |= PVTWORD_STYLE_UNDERLINE; - bSet = TRUE; - } - } else { - if ((secinfo.WordProps.nWordStyle & - PVTWORD_STYLE_UNDERLINE) != 0) { - secinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_UNDERLINE; - bSet = TRUE; - } - } - break; - case EP_CROSSOUT: - if (pWordProps->nWordStyle & PVTWORD_STYLE_CROSSOUT) { - if ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_CROSSOUT) == - 0) { - secinfo.WordProps.nWordStyle |= PVTWORD_STYLE_CROSSOUT; - bSet = TRUE; - } - } else { - if ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_CROSSOUT) != - 0) { - secinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_CROSSOUT; - bSet = TRUE; - } - } - break; - case EP_BOLD: - if (pWordProps->nWordStyle & PVTWORD_STYLE_BOLD) { - if ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_BOLD) == - 0) { - secinfo.WordProps.nWordStyle |= PVTWORD_STYLE_BOLD; - bSet = TRUE; - } - } else { - if ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_BOLD) != - 0) { - secinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_BOLD; - bSet = TRUE; - } - } - break; - case EP_ITALIC: - if (pWordProps->nWordStyle & PVTWORD_STYLE_ITALIC) { - if ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_ITALIC) == - 0) { - secinfo.WordProps.nWordStyle |= PVTWORD_STYLE_ITALIC; - bSet = TRUE; - } - } else { - if ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_ITALIC) != - 0) { - secinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_ITALIC; - bSet = TRUE; - } - } - break; - default: - break; - } - } - } - } - - if (bSet) { - pIterator->SetSection(secinfo); - - if (bAddUndo && m_bEnableUndo) { - AddEditUndoItem(new CFXEU_SetSecProps( - this, place, eProps, OldSecinfo.SecProps, OldSecinfo.WordProps, - secinfo.SecProps, secinfo.WordProps, wr)); - } - } - - pIterator->SetAt(oldplace); - - return bSet; - } - } - - return FALSE; -} - -FX_BOOL CFX_Edit::SetWordProps(EDIT_PROPS_E eProps, - const CPVT_WordPlace& place, - const CPVT_WordProps* pWordProps, - const CPVT_WordRange& wr, - FX_BOOL bAddUndo) { - if (m_pVT->IsValid() && m_pVT->IsRichText()) { - if (IPDF_VariableText_Iterator* pIterator = m_pVT->GetIterator()) { - FX_BOOL bSet = FALSE; - CPVT_Word wordinfo; - CPVT_Word OldWordinfo; - - CPVT_WordPlace oldplace = pIterator->GetAt(); - - if (pWordProps) { - pIterator->SetAt(place); - if (pIterator->GetWord(wordinfo)) { - if (bAddUndo) - OldWordinfo = wordinfo; - - switch (eProps) { - case EP_FONTINDEX: - if (wordinfo.WordProps.nFontIndex != pWordProps->nFontIndex) { - if (IFX_Edit_FontMap* pFontMap = GetFontMap()) { - wordinfo.WordProps.nFontIndex = pFontMap->GetWordFontIndex( - wordinfo.Word, wordinfo.nCharset, pWordProps->nFontIndex); - } - bSet = TRUE; - } - break; - case EP_FONTSIZE: - if (!FX_EDIT_IsFloatEqual(wordinfo.WordProps.fFontSize, - pWordProps->fFontSize)) { - wordinfo.WordProps.fFontSize = pWordProps->fFontSize; - bSet = TRUE; - } - break; - case EP_WORDCOLOR: - if (wordinfo.WordProps.dwWordColor != pWordProps->dwWordColor) { - wordinfo.WordProps.dwWordColor = pWordProps->dwWordColor; - bSet = TRUE; - } - break; - case EP_SCRIPTTYPE: - if (wordinfo.WordProps.nScriptType != pWordProps->nScriptType) { - wordinfo.WordProps.nScriptType = pWordProps->nScriptType; - bSet = TRUE; - } - break; - case EP_CHARSPACE: - if (!FX_EDIT_IsFloatEqual(wordinfo.WordProps.fCharSpace, - pWordProps->fCharSpace)) { - wordinfo.WordProps.fCharSpace = pWordProps->fCharSpace; - bSet = TRUE; - } - break; - case EP_HORZSCALE: - if (wordinfo.WordProps.nHorzScale != pWordProps->nHorzScale) { - wordinfo.WordProps.nHorzScale = pWordProps->nHorzScale; - bSet = TRUE; - } - break; - case EP_UNDERLINE: - if (pWordProps->nWordStyle & PVTWORD_STYLE_UNDERLINE) { - if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_UNDERLINE) == - 0) { - wordinfo.WordProps.nWordStyle |= PVTWORD_STYLE_UNDERLINE; - bSet = TRUE; - } - } else { - if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_UNDERLINE) != - 0) { - wordinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_UNDERLINE; - bSet = TRUE; - } - } - break; - case EP_CROSSOUT: - if (pWordProps->nWordStyle & PVTWORD_STYLE_CROSSOUT) { - if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_CROSSOUT) == - 0) { - wordinfo.WordProps.nWordStyle |= PVTWORD_STYLE_CROSSOUT; - bSet = TRUE; - } - } else { - if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_CROSSOUT) != - 0) { - wordinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_CROSSOUT; - bSet = TRUE; - } - } - break; - case EP_BOLD: - if (pWordProps->nWordStyle & PVTWORD_STYLE_BOLD) { - if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_BOLD) == 0) { - wordinfo.WordProps.nWordStyle |= PVTWORD_STYLE_BOLD; - bSet = TRUE; - } - } else { - if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_BOLD) != 0) { - wordinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_BOLD; - bSet = TRUE; - } - } - break; - case EP_ITALIC: - if (pWordProps->nWordStyle & PVTWORD_STYLE_ITALIC) { - if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_ITALIC) == - 0) { - wordinfo.WordProps.nWordStyle |= PVTWORD_STYLE_ITALIC; - bSet = TRUE; - } - } else { - if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_ITALIC) != - 0) { - wordinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_ITALIC; - bSet = TRUE; - } - } - break; - default: - break; - } - } - } - - if (bSet) { - pIterator->SetWord(wordinfo); - - if (bAddUndo && m_bEnableUndo) { - AddEditUndoItem(new CFXEU_SetWordProps(this, place, eProps, - OldWordinfo.WordProps, - wordinfo.WordProps, wr)); - } - } - - pIterator->SetAt(oldplace); - return bSet; - } - } - - return FALSE; -} - -void CFX_Edit::SetText(const FX_WCHAR* text, - int32_t charset, - const CPVT_SecProps* pSecProps, - const CPVT_WordProps* pWordProps) { - SetText(text, charset, pSecProps, pWordProps, TRUE, TRUE); -} - -FX_BOOL CFX_Edit::InsertWord(FX_WORD word, - int32_t charset, - const CPVT_WordProps* pWordProps) { - return InsertWord(word, charset, pWordProps, TRUE, TRUE); -} - -FX_BOOL CFX_Edit::InsertReturn(const CPVT_SecProps* pSecProps, - const CPVT_WordProps* pWordProps) { - return InsertReturn(pSecProps, pWordProps, TRUE, TRUE); -} - -FX_BOOL CFX_Edit::Backspace() { - return Backspace(TRUE, TRUE); -} - -FX_BOOL CFX_Edit::Delete() { - return Delete(TRUE, TRUE); -} - -FX_BOOL CFX_Edit::Clear() { - return Clear(TRUE, TRUE); -} - -FX_BOOL CFX_Edit::InsertText(const FX_WCHAR* text, - int32_t charset, - const CPVT_SecProps* pSecProps, - const CPVT_WordProps* pWordProps) { - return InsertText(text, charset, pSecProps, pWordProps, TRUE, TRUE); -} - -FX_FLOAT CFX_Edit::GetFontSize() const { - return m_pVT->GetFontSize(); -} - -FX_WORD CFX_Edit::GetPasswordChar() const { - return m_pVT->GetPasswordChar(); -} - -int32_t CFX_Edit::GetCharArray() const { - return m_pVT->GetCharArray(); -} - -CFX_FloatRect CFX_Edit::GetPlateRect() const { - return m_pVT->GetPlateRect(); -} - -CFX_FloatRect CFX_Edit::GetContentRect() const { - return VTToEdit(m_pVT->GetContentRect()); -} - -int32_t CFX_Edit::GetHorzScale() const { - return m_pVT->GetHorzScale(); -} - -FX_FLOAT CFX_Edit::GetCharSpace() const { - return m_pVT->GetCharSpace(); -} - -CPVT_WordRange CFX_Edit::GetWholeWordRange() const { - if (m_pVT->IsValid()) - return CPVT_WordRange(m_pVT->GetBeginWordPlace(), m_pVT->GetEndWordPlace()); - - return CPVT_WordRange(); -} - -CPVT_WordRange CFX_Edit::GetVisibleWordRange() const { - if (m_bEnableOverflow) - return GetWholeWordRange(); - - if (m_pVT->IsValid()) { - CFX_FloatRect rcPlate = m_pVT->GetPlateRect(); - - CPVT_WordPlace place1 = m_pVT->SearchWordPlace( - EditToVT(CFX_FloatPoint(rcPlate.left, rcPlate.top))); - CPVT_WordPlace place2 = m_pVT->SearchWordPlace( - EditToVT(CFX_FloatPoint(rcPlate.right, rcPlate.bottom))); - - return CPVT_WordRange(place1, place2); - } - - return CPVT_WordRange(); -} - -CPVT_WordPlace CFX_Edit::SearchWordPlace(const CFX_FloatPoint& point) const { - if (m_pVT->IsValid()) { - return m_pVT->SearchWordPlace(EditToVT(point)); - } - - return CPVT_WordPlace(); -} - -void CFX_Edit::Paint() { - if (m_pVT->IsValid()) { - RearrangeAll(); - ScrollToCaret(); - Refresh(RP_NOANALYSE); - SetCaretOrigin(); - SetCaretInfo(); - } -} - -void CFX_Edit::RearrangeAll() { - if (m_pVT->IsValid()) { - m_pVT->UpdateWordPlace(m_wpCaret); - m_pVT->RearrangeAll(); - m_pVT->UpdateWordPlace(m_wpCaret); - SetScrollInfo(); - SetContentChanged(); - } -} - -void CFX_Edit::RearrangePart(const CPVT_WordRange& range) { - if (m_pVT->IsValid()) { - m_pVT->UpdateWordPlace(m_wpCaret); - m_pVT->RearrangePart(range); - m_pVT->UpdateWordPlace(m_wpCaret); - SetScrollInfo(); - SetContentChanged(); - } -} - -void CFX_Edit::SetContentChanged() { - if (m_bNotify && m_pNotify) { - CFX_FloatRect rcContent = m_pVT->GetContentRect(); - if (rcContent.Width() != m_rcOldContent.Width() || - rcContent.Height() != m_rcOldContent.Height()) { - if (!m_bNotifyFlag) { - m_bNotifyFlag = TRUE; - m_pNotify->IOnContentChange(rcContent); - m_bNotifyFlag = FALSE; - } - m_rcOldContent = rcContent; - } - } -} - -void CFX_Edit::SelectAll() { - if (m_pVT->IsValid()) { - m_SelState = CFX_Edit_Select(GetWholeWordRange()); - SetCaret(m_SelState.EndPos); - - ScrollToCaret(); - CPVT_WordRange wrVisible = GetVisibleWordRange(); - Refresh(RP_OPTIONAL, &wrVisible); - SetCaretInfo(); - } -} - -void CFX_Edit::SelectNone() { - if (m_pVT->IsValid()) { - if (m_SelState.IsExist()) { - CPVT_WordRange wrTemp = m_SelState.ConvertToWordRange(); - m_SelState.Default(); - Refresh(RP_OPTIONAL, &wrTemp); - } - } -} - -FX_BOOL CFX_Edit::IsSelected() const { - return m_SelState.IsExist(); -} - -CFX_FloatPoint CFX_Edit::VTToEdit(const CFX_FloatPoint& point) const { - CFX_FloatRect rcContent = m_pVT->GetContentRect(); - CFX_FloatRect rcPlate = m_pVT->GetPlateRect(); - - FX_FLOAT fPadding = 0.0f; - - switch (m_nAlignment) { - case 0: - fPadding = 0.0f; - break; - case 1: - fPadding = (rcPlate.Height() - rcContent.Height()) * 0.5f; - break; - case 2: - fPadding = rcPlate.Height() - rcContent.Height(); - break; - } - - return CFX_FloatPoint(point.x - (m_ptScrollPos.x - rcPlate.left), - point.y - (m_ptScrollPos.y + fPadding - rcPlate.top)); -} - -CFX_FloatPoint CFX_Edit::EditToVT(const CFX_FloatPoint& point) const { - CFX_FloatRect rcContent = m_pVT->GetContentRect(); - CFX_FloatRect rcPlate = m_pVT->GetPlateRect(); - - FX_FLOAT fPadding = 0.0f; - - switch (m_nAlignment) { - case 0: - fPadding = 0.0f; - break; - case 1: - fPadding = (rcPlate.Height() - rcContent.Height()) * 0.5f; - break; - case 2: - fPadding = rcPlate.Height() - rcContent.Height(); - break; - } - - return CFX_FloatPoint(point.x + (m_ptScrollPos.x - rcPlate.left), - point.y + (m_ptScrollPos.y + fPadding - rcPlate.top)); -} - -CFX_FloatRect CFX_Edit::VTToEdit(const CFX_FloatRect& rect) const { - CFX_FloatPoint ptLeftBottom = - VTToEdit(CFX_FloatPoint(rect.left, rect.bottom)); - CFX_FloatPoint ptRightTop = VTToEdit(CFX_FloatPoint(rect.right, rect.top)); - - return CFX_FloatRect(ptLeftBottom.x, ptLeftBottom.y, ptRightTop.x, - ptRightTop.y); -} - -CFX_FloatRect CFX_Edit::EditToVT(const CFX_FloatRect& rect) const { - CFX_FloatPoint ptLeftBottom = - EditToVT(CFX_FloatPoint(rect.left, rect.bottom)); - CFX_FloatPoint ptRightTop = EditToVT(CFX_FloatPoint(rect.right, rect.top)); - - return CFX_FloatRect(ptLeftBottom.x, ptLeftBottom.y, ptRightTop.x, - ptRightTop.y); -} - -void CFX_Edit::SetScrollInfo() { - if (m_bNotify && m_pNotify) { - CFX_FloatRect rcPlate = m_pVT->GetPlateRect(); - CFX_FloatRect rcContent = m_pVT->GetContentRect(); - - if (!m_bNotifyFlag) { - m_bNotifyFlag = TRUE; - m_pNotify->IOnSetScrollInfoX(rcPlate.left, rcPlate.right, rcContent.left, - rcContent.right, rcPlate.Width() / 3, - rcPlate.Width()); - - m_pNotify->IOnSetScrollInfoY(rcPlate.bottom, rcPlate.top, - rcContent.bottom, rcContent.top, - rcPlate.Height() / 3, rcPlate.Height()); - m_bNotifyFlag = FALSE; - } - } -} - -void CFX_Edit::SetScrollPosX(FX_FLOAT fx) { - if (!m_bEnableScroll) - return; - - if (m_pVT->IsValid()) { - if (!FX_EDIT_IsFloatEqual(m_ptScrollPos.x, fx)) { - m_ptScrollPos.x = fx; - Refresh(RP_NOANALYSE); - - if (m_bNotify && m_pNotify) { - if (!m_bNotifyFlag) { - m_bNotifyFlag = TRUE; - m_pNotify->IOnSetScrollPosX(fx); - m_bNotifyFlag = FALSE; - } - } - } - } -} - -void CFX_Edit::SetScrollPosY(FX_FLOAT fy) { - if (!m_bEnableScroll) - return; - - if (m_pVT->IsValid()) { - if (!FX_EDIT_IsFloatEqual(m_ptScrollPos.y, fy)) { - m_ptScrollPos.y = fy; - Refresh(RP_NOANALYSE); - - if (m_bNotify && m_pNotify) { - if (!m_bNotifyFlag) { - m_bNotifyFlag = TRUE; - m_pNotify->IOnSetScrollPosY(fy); - m_bNotifyFlag = FALSE; - } - } - } - } -} - -void CFX_Edit::SetScrollPos(const CFX_FloatPoint& point) { - SetScrollPosX(point.x); - SetScrollPosY(point.y); - SetScrollLimit(); - SetCaretInfo(); -} - -CFX_FloatPoint CFX_Edit::GetScrollPos() const { - return m_ptScrollPos; -} - -void CFX_Edit::SetScrollLimit() { - if (m_pVT->IsValid()) { - CFX_FloatRect rcContent = m_pVT->GetContentRect(); - CFX_FloatRect rcPlate = m_pVT->GetPlateRect(); - - if (rcPlate.Width() > rcContent.Width()) { - SetScrollPosX(rcPlate.left); - } else { - if (FX_EDIT_IsFloatSmaller(m_ptScrollPos.x, rcContent.left)) { - SetScrollPosX(rcContent.left); - } else if (FX_EDIT_IsFloatBigger(m_ptScrollPos.x, - rcContent.right - rcPlate.Width())) { - SetScrollPosX(rcContent.right - rcPlate.Width()); - } - } - - if (rcPlate.Height() > rcContent.Height()) { - SetScrollPosY(rcPlate.top); - } else { - if (FX_EDIT_IsFloatSmaller(m_ptScrollPos.y, - rcContent.bottom + rcPlate.Height())) { - SetScrollPosY(rcContent.bottom + rcPlate.Height()); - } else if (FX_EDIT_IsFloatBigger(m_ptScrollPos.y, rcContent.top)) { - SetScrollPosY(rcContent.top); - } - } - } -} - -void CFX_Edit::ScrollToCaret() { - SetScrollLimit(); - - if (m_pVT->IsValid()) { - CFX_FloatPoint ptHead(0, 0); - CFX_FloatPoint ptFoot(0, 0); - - if (IPDF_VariableText_Iterator* pIterator = m_pVT->GetIterator()) { - pIterator->SetAt(m_wpCaret); - - CPVT_Word word; - CPVT_Line line; - if (pIterator->GetWord(word)) { - ptHead.x = word.ptWord.x + word.fWidth; - ptHead.y = word.ptWord.y + word.fAscent; - ptFoot.x = word.ptWord.x + word.fWidth; - ptFoot.y = word.ptWord.y + word.fDescent; - } else if (pIterator->GetLine(line)) { - ptHead.x = line.ptLine.x; - ptHead.y = line.ptLine.y + line.fLineAscent; - ptFoot.x = line.ptLine.x; - ptFoot.y = line.ptLine.y + line.fLineDescent; - } - } - - CFX_FloatPoint ptHeadEdit = VTToEdit(ptHead); - CFX_FloatPoint ptFootEdit = VTToEdit(ptFoot); - - CFX_FloatRect rcPlate = m_pVT->GetPlateRect(); - - if (!FX_EDIT_IsFloatEqual(rcPlate.left, rcPlate.right)) { - if (FX_EDIT_IsFloatSmaller(ptHeadEdit.x, rcPlate.left) || - FX_EDIT_IsFloatEqual(ptHeadEdit.x, rcPlate.left)) { - SetScrollPosX(ptHead.x); - } else if (FX_EDIT_IsFloatBigger(ptHeadEdit.x, rcPlate.right)) { - SetScrollPosX(ptHead.x - rcPlate.Width()); - } - } - - if (!FX_EDIT_IsFloatEqual(rcPlate.top, rcPlate.bottom)) { - if (FX_EDIT_IsFloatSmaller(ptFootEdit.y, rcPlate.bottom) || - FX_EDIT_IsFloatEqual(ptFootEdit.y, rcPlate.bottom)) { - if (FX_EDIT_IsFloatSmaller(ptHeadEdit.y, rcPlate.top)) { - SetScrollPosY(ptFoot.y + rcPlate.Height()); - } - } else if (FX_EDIT_IsFloatBigger(ptHeadEdit.y, rcPlate.top)) { - if (FX_EDIT_IsFloatBigger(ptFootEdit.y, rcPlate.bottom)) { - SetScrollPosY(ptHead.y); - } - } - } - } -} - -void CFX_Edit::Refresh(REFRESH_PLAN_E ePlan, - const CPVT_WordRange* pRange1, - const CPVT_WordRange* pRange2) { - if (m_bEnableRefresh && m_pVT->IsValid()) { - m_Refresh.BeginRefresh(); - RefreshPushLineRects(GetVisibleWordRange()); - - m_Refresh.NoAnalyse(); - m_ptRefreshScrollPos = m_ptScrollPos; - - if (m_bNotify && m_pNotify) { - if (!m_bNotifyFlag) { - m_bNotifyFlag = TRUE; - if (const CFX_Edit_RectArray* pRects = m_Refresh.GetRefreshRects()) { - for (int32_t i = 0, sz = pRects->GetSize(); i < sz; i++) - m_pNotify->IOnInvalidateRect(pRects->GetAt(i)); - } - m_bNotifyFlag = FALSE; - } - } - - m_Refresh.EndRefresh(); - } -} - -void CFX_Edit::RefreshPushLineRects(const CPVT_WordRange& wr) { - if (m_pVT->IsValid()) { - if (IPDF_VariableText_Iterator* pIterator = m_pVT->GetIterator()) { - CPVT_WordPlace wpBegin = wr.BeginPos; - m_pVT->UpdateWordPlace(wpBegin); - CPVT_WordPlace wpEnd = wr.EndPos; - m_pVT->UpdateWordPlace(wpEnd); - pIterator->SetAt(wpBegin); - - CPVT_Line lineinfo; - do { - if (!pIterator->GetLine(lineinfo)) - break; - if (lineinfo.lineplace.LineCmp(wpEnd) > 0) - break; - - CFX_FloatRect rcLine(lineinfo.ptLine.x, - lineinfo.ptLine.y + lineinfo.fLineDescent, - lineinfo.ptLine.x + lineinfo.fLineWidth, - lineinfo.ptLine.y + lineinfo.fLineAscent); - - m_Refresh.Push(CPVT_WordRange(lineinfo.lineplace, lineinfo.lineEnd), - VTToEdit(rcLine)); - } while (pIterator->NextLine()); - } - } -} - -void CFX_Edit::RefreshPushRandomRects(const CPVT_WordRange& wr) { - if (m_pVT->IsValid()) { - if (IPDF_VariableText_Iterator* pIterator = m_pVT->GetIterator()) { - CPVT_WordRange wrTemp = wr; - - m_pVT->UpdateWordPlace(wrTemp.BeginPos); - m_pVT->UpdateWordPlace(wrTemp.EndPos); - pIterator->SetAt(wrTemp.BeginPos); - - CPVT_Word wordinfo; - CPVT_Line lineinfo; - CPVT_WordPlace place; - - while (pIterator->NextWord()) { - place = pIterator->GetAt(); - if (place.WordCmp(wrTemp.EndPos) > 0) - break; - - pIterator->GetWord(wordinfo); - pIterator->GetLine(lineinfo); - - if (place.LineCmp(wrTemp.BeginPos) == 0 || - place.LineCmp(wrTemp.EndPos) == 0) { - CFX_FloatRect rcWord(wordinfo.ptWord.x, - lineinfo.ptLine.y + lineinfo.fLineDescent, - wordinfo.ptWord.x + wordinfo.fWidth, - lineinfo.ptLine.y + lineinfo.fLineAscent); - - m_Refresh.AddRefresh(VTToEdit(rcWord)); - } else { - CFX_FloatRect rcLine(lineinfo.ptLine.x, - lineinfo.ptLine.y + lineinfo.fLineDescent, - lineinfo.ptLine.x + lineinfo.fLineWidth, - lineinfo.ptLine.y + lineinfo.fLineAscent); - - m_Refresh.AddRefresh(VTToEdit(rcLine)); - - pIterator->NextLine(); - } - } - } - } -} - -void CFX_Edit::RefreshWordRange(const CPVT_WordRange& wr) { - if (IPDF_VariableText_Iterator* pIterator = m_pVT->GetIterator()) { - CPVT_WordRange wrTemp = wr; - - m_pVT->UpdateWordPlace(wrTemp.BeginPos); - m_pVT->UpdateWordPlace(wrTemp.EndPos); - pIterator->SetAt(wrTemp.BeginPos); - - CPVT_Word wordinfo; - CPVT_Line lineinfo; - CPVT_WordPlace place; - - while (pIterator->NextWord()) { - place = pIterator->GetAt(); - if (place.WordCmp(wrTemp.EndPos) > 0) - break; - - pIterator->GetWord(wordinfo); - pIterator->GetLine(lineinfo); - - if (place.LineCmp(wrTemp.BeginPos) == 0 || - place.LineCmp(wrTemp.EndPos) == 0) { - CFX_FloatRect rcWord(wordinfo.ptWord.x, - lineinfo.ptLine.y + lineinfo.fLineDescent, - wordinfo.ptWord.x + wordinfo.fWidth, - lineinfo.ptLine.y + lineinfo.fLineAscent); - - if (m_bNotify && m_pNotify) { - if (!m_bNotifyFlag) { - m_bNotifyFlag = TRUE; - CFX_FloatRect rcRefresh = VTToEdit(rcWord); - m_pNotify->IOnInvalidateRect(&rcRefresh); - m_bNotifyFlag = FALSE; - } - } - } else { - CFX_FloatRect rcLine(lineinfo.ptLine.x, - lineinfo.ptLine.y + lineinfo.fLineDescent, - lineinfo.ptLine.x + lineinfo.fLineWidth, - lineinfo.ptLine.y + lineinfo.fLineAscent); - - if (m_bNotify && m_pNotify) { - if (!m_bNotifyFlag) { - m_bNotifyFlag = TRUE; - CFX_FloatRect rcRefresh = VTToEdit(rcLine); - m_pNotify->IOnInvalidateRect(&rcRefresh); - m_bNotifyFlag = FALSE; - } - } - - pIterator->NextLine(); - } - } - } -} - -void CFX_Edit::SetCaret(const CPVT_WordPlace& place) { - m_wpOldCaret = m_wpCaret; - m_wpCaret = place; -} - -void CFX_Edit::SetCaretInfo() { - if (m_bNotify && m_pNotify) { - if (!m_bNotifyFlag) { - CFX_FloatPoint ptHead(0.0f, 0.0f), ptFoot(0.0f, 0.0f); - - if (IPDF_VariableText_Iterator* pIterator = m_pVT->GetIterator()) { - pIterator->SetAt(m_wpCaret); - CPVT_Word word; - CPVT_Line line; - if (pIterator->GetWord(word)) { - ptHead.x = word.ptWord.x + word.fWidth; - ptHead.y = word.ptWord.y + word.fAscent; - ptFoot.x = word.ptWord.x + word.fWidth; - ptFoot.y = word.ptWord.y + word.fDescent; - } else if (pIterator->GetLine(line)) { - ptHead.x = line.ptLine.x; - ptHead.y = line.ptLine.y + line.fLineAscent; - ptFoot.x = line.ptLine.x; - ptFoot.y = line.ptLine.y + line.fLineDescent; - } - } - - m_bNotifyFlag = TRUE; - m_pNotify->IOnSetCaret(!m_SelState.IsExist(), VTToEdit(ptHead), - VTToEdit(ptFoot), m_wpCaret); - m_bNotifyFlag = FALSE; - } - } - - SetCaretChange(); -} - -void CFX_Edit::SetCaretChange() { - if (m_wpCaret == m_wpOldCaret) - return; - - if (m_bNotify && m_pVT->IsRichText() && m_pNotify) { - CPVT_SecProps SecProps; - CPVT_WordProps WordProps; - - if (IPDF_VariableText_Iterator* pIterator = m_pVT->GetIterator()) { - pIterator->SetAt(m_wpCaret); - CPVT_Word word; - CPVT_Section section; - - if (pIterator->GetSection(section)) { - SecProps = section.SecProps; - WordProps = section.WordProps; - } - - if (pIterator->GetWord(word)) { - WordProps = word.WordProps; - } - } - - if (!m_bNotifyFlag) { - m_bNotifyFlag = TRUE; - m_pNotify->IOnCaretChange(SecProps, WordProps); - m_bNotifyFlag = FALSE; - } - } -} - -void CFX_Edit::SetCaret(int32_t nPos) { - if (m_pVT->IsValid()) { - SelectNone(); - SetCaret(m_pVT->WordIndexToWordPlace(nPos)); - m_SelState.Set(m_wpCaret, m_wpCaret); - - ScrollToCaret(); - SetCaretOrigin(); - SetCaretInfo(); - } -} - -void CFX_Edit::OnMouseDown(const CFX_FloatPoint& point, - FX_BOOL bShift, - FX_BOOL bCtrl) { - if (m_pVT->IsValid()) { - SelectNone(); - SetCaret(m_pVT->SearchWordPlace(EditToVT(point))); - m_SelState.Set(m_wpCaret, m_wpCaret); - - ScrollToCaret(); - SetCaretOrigin(); - SetCaretInfo(); - } -} - -void CFX_Edit::OnMouseMove(const CFX_FloatPoint& point, - FX_BOOL bShift, - FX_BOOL bCtrl) { - if (m_pVT->IsValid()) { - SetCaret(m_pVT->SearchWordPlace(EditToVT(point))); - - if (m_wpCaret != m_wpOldCaret) { - m_SelState.SetEndPos(m_wpCaret); - - ScrollToCaret(); - CPVT_WordRange wr(m_wpOldCaret, m_wpCaret); - Refresh(RP_OPTIONAL, &wr); - SetCaretOrigin(); - SetCaretInfo(); - } - } -} - -void CFX_Edit::OnVK_UP(FX_BOOL bShift, FX_BOOL bCtrl) { - if (m_pVT->IsValid()) { - SetCaret(m_pVT->GetUpWordPlace(m_wpCaret, m_ptCaret)); - - if (bShift) { - if (m_SelState.IsExist()) - m_SelState.SetEndPos(m_wpCaret); - else - m_SelState.Set(m_wpOldCaret, m_wpCaret); - - if (m_wpOldCaret != m_wpCaret) { - ScrollToCaret(); - CPVT_WordRange wr(m_wpOldCaret, m_wpCaret); - Refresh(RP_OPTIONAL, &wr); - SetCaretInfo(); - } - } else { - SelectNone(); - - ScrollToCaret(); - SetCaretInfo(); - } - } -} - -void CFX_Edit::OnVK_DOWN(FX_BOOL bShift, FX_BOOL bCtrl) { - if (m_pVT->IsValid()) { - SetCaret(m_pVT->GetDownWordPlace(m_wpCaret, m_ptCaret)); - - if (bShift) { - if (m_SelState.IsExist()) - m_SelState.SetEndPos(m_wpCaret); - else - m_SelState.Set(m_wpOldCaret, m_wpCaret); - - if (m_wpOldCaret != m_wpCaret) { - ScrollToCaret(); - CPVT_WordRange wr(m_wpOldCaret, m_wpCaret); - Refresh(RP_OPTIONAL, &wr); - SetCaretInfo(); - } - } else { - SelectNone(); - - ScrollToCaret(); - SetCaretInfo(); - } - } -} - -void CFX_Edit::OnVK_LEFT(FX_BOOL bShift, FX_BOOL bCtrl) { - if (m_pVT->IsValid()) { - if (bShift) { - if (m_wpCaret == m_pVT->GetLineBeginPlace(m_wpCaret) && - m_wpCaret != m_pVT->GetSectionBeginPlace(m_wpCaret)) - SetCaret(m_pVT->GetPrevWordPlace(m_wpCaret)); - - SetCaret(m_pVT->GetPrevWordPlace(m_wpCaret)); - - if (m_SelState.IsExist()) - m_SelState.SetEndPos(m_wpCaret); - else - m_SelState.Set(m_wpOldCaret, m_wpCaret); - - if (m_wpOldCaret != m_wpCaret) { - ScrollToCaret(); - CPVT_WordRange wr(m_wpOldCaret, m_wpCaret); - Refresh(RP_OPTIONAL, &wr); - SetCaretInfo(); - } - } else { - if (m_SelState.IsExist()) { - if (m_SelState.BeginPos.WordCmp(m_SelState.EndPos) < 0) - SetCaret(m_SelState.BeginPos); - else - SetCaret(m_SelState.EndPos); - - SelectNone(); - ScrollToCaret(); - SetCaretInfo(); - } else { - if (m_wpCaret == m_pVT->GetLineBeginPlace(m_wpCaret) && - m_wpCaret != m_pVT->GetSectionBeginPlace(m_wpCaret)) - SetCaret(m_pVT->GetPrevWordPlace(m_wpCaret)); - - SetCaret(m_pVT->GetPrevWordPlace(m_wpCaret)); - - ScrollToCaret(); - SetCaretOrigin(); - SetCaretInfo(); - } - } - } -} - -void CFX_Edit::OnVK_RIGHT(FX_BOOL bShift, FX_BOOL bCtrl) { - if (m_pVT->IsValid()) { - if (bShift) { - SetCaret(m_pVT->GetNextWordPlace(m_wpCaret)); - - if (m_wpCaret == m_pVT->GetLineEndPlace(m_wpCaret) && - m_wpCaret != m_pVT->GetSectionEndPlace(m_wpCaret)) - SetCaret(m_pVT->GetNextWordPlace(m_wpCaret)); - - if (m_SelState.IsExist()) - m_SelState.SetEndPos(m_wpCaret); - else - m_SelState.Set(m_wpOldCaret, m_wpCaret); - - if (m_wpOldCaret != m_wpCaret) { - ScrollToCaret(); - CPVT_WordRange wr(m_wpOldCaret, m_wpCaret); - Refresh(RP_OPTIONAL, &wr); - SetCaretInfo(); - } - } else { - if (m_SelState.IsExist()) { - if (m_SelState.BeginPos.WordCmp(m_SelState.EndPos) > 0) - SetCaret(m_SelState.BeginPos); - else - SetCaret(m_SelState.EndPos); - - SelectNone(); - ScrollToCaret(); - SetCaretInfo(); - } else { - SetCaret(m_pVT->GetNextWordPlace(m_wpCaret)); - - if (m_wpCaret == m_pVT->GetLineEndPlace(m_wpCaret) && - m_wpCaret != m_pVT->GetSectionEndPlace(m_wpCaret)) - SetCaret(m_pVT->GetNextWordPlace(m_wpCaret)); - - ScrollToCaret(); - SetCaretOrigin(); - SetCaretInfo(); - } - } - } -} - -void CFX_Edit::OnVK_HOME(FX_BOOL bShift, FX_BOOL bCtrl) { - if (m_pVT->IsValid()) { - if (bShift) { - if (bCtrl) - SetCaret(m_pVT->GetBeginWordPlace()); - else - SetCaret(m_pVT->GetLineBeginPlace(m_wpCaret)); - - if (m_SelState.IsExist()) - m_SelState.SetEndPos(m_wpCaret); - else - m_SelState.Set(m_wpOldCaret, m_wpCaret); - - ScrollToCaret(); - CPVT_WordRange wr(m_wpOldCaret, m_wpCaret); - Refresh(RP_OPTIONAL, &wr); - SetCaretInfo(); - } else { - if (m_SelState.IsExist()) { - if (m_SelState.BeginPos.WordCmp(m_SelState.EndPos) < 0) - SetCaret(m_SelState.BeginPos); - else - SetCaret(m_SelState.EndPos); - - SelectNone(); - ScrollToCaret(); - SetCaretInfo(); - } else { - if (bCtrl) - SetCaret(m_pVT->GetBeginWordPlace()); - else - SetCaret(m_pVT->GetLineBeginPlace(m_wpCaret)); - - ScrollToCaret(); - SetCaretOrigin(); - SetCaretInfo(); - } - } - } -} - -void CFX_Edit::OnVK_END(FX_BOOL bShift, FX_BOOL bCtrl) { - if (m_pVT->IsValid()) { - if (bShift) { - if (bCtrl) - SetCaret(m_pVT->GetEndWordPlace()); - else - SetCaret(m_pVT->GetLineEndPlace(m_wpCaret)); - - if (m_SelState.IsExist()) - m_SelState.SetEndPos(m_wpCaret); - else - m_SelState.Set(m_wpOldCaret, m_wpCaret); - - ScrollToCaret(); - CPVT_WordRange wr(m_wpOldCaret, m_wpCaret); - Refresh(RP_OPTIONAL, &wr); - SetCaretInfo(); - } else { - if (m_SelState.IsExist()) { - if (m_SelState.BeginPos.WordCmp(m_SelState.EndPos) > 0) - SetCaret(m_SelState.BeginPos); - else - SetCaret(m_SelState.EndPos); - - SelectNone(); - ScrollToCaret(); - SetCaretInfo(); - } else { - if (bCtrl) - SetCaret(m_pVT->GetEndWordPlace()); - else - SetCaret(m_pVT->GetLineEndPlace(m_wpCaret)); - - ScrollToCaret(); - SetCaretOrigin(); - SetCaretInfo(); - } - } - } -} - -void CFX_Edit::SetText(const FX_WCHAR* text, - int32_t charset, - const CPVT_SecProps* pSecProps, - const CPVT_WordProps* pWordProps, - FX_BOOL bAddUndo, - FX_BOOL bPaint) { - Empty(); - DoInsertText(CPVT_WordPlace(0, 0, -1), text, charset, pSecProps, pWordProps); - if (bPaint) - Paint(); - if (m_bOprNotify && m_pOprNotify) - m_pOprNotify->OnSetText(m_wpCaret, m_wpOldCaret); -} - -FX_BOOL CFX_Edit::InsertWord(FX_WORD word, - int32_t charset, - const CPVT_WordProps* pWordProps, - FX_BOOL bAddUndo, - FX_BOOL bPaint) { - if (IsTextOverflow()) - return FALSE; - - if (m_pVT->IsValid()) { - m_pVT->UpdateWordPlace(m_wpCaret); - - SetCaret(m_pVT->InsertWord( - m_wpCaret, word, GetCharSetFromUnicode(word, charset), pWordProps)); - m_SelState.Set(m_wpCaret, m_wpCaret); - - if (m_wpCaret != m_wpOldCaret) { - if (bAddUndo && m_bEnableUndo) { - AddEditUndoItem(new CFXEU_InsertWord(this, m_wpOldCaret, m_wpCaret, - word, charset, pWordProps)); - } - - if (bPaint) - PaintInsertText(m_wpOldCaret, m_wpCaret); - - if (m_bOprNotify && m_pOprNotify) - m_pOprNotify->OnInsertWord(m_wpCaret, m_wpOldCaret); - - return TRUE; - } - } - - return FALSE; -} - -FX_BOOL CFX_Edit::InsertReturn(const CPVT_SecProps* pSecProps, - const CPVT_WordProps* pWordProps, - FX_BOOL bAddUndo, - FX_BOOL bPaint) { - if (IsTextOverflow()) - return FALSE; - - if (m_pVT->IsValid()) { - m_pVT->UpdateWordPlace(m_wpCaret); - SetCaret(m_pVT->InsertSection(m_wpCaret, pSecProps, pWordProps)); - m_SelState.Set(m_wpCaret, m_wpCaret); - - if (m_wpCaret != m_wpOldCaret) { - if (bAddUndo && m_bEnableUndo) { - AddEditUndoItem(new CFXEU_InsertReturn(this, m_wpOldCaret, m_wpCaret, - pSecProps, pWordProps)); - } - - if (bPaint) { - RearrangePart(CPVT_WordRange(m_wpOldCaret, m_wpCaret)); - ScrollToCaret(); - CPVT_WordRange wr(m_wpOldCaret, GetVisibleWordRange().EndPos); - Refresh(RP_ANALYSE, &wr); - SetCaretOrigin(); - SetCaretInfo(); - } - - if (m_bOprNotify && m_pOprNotify) - m_pOprNotify->OnInsertReturn(m_wpCaret, m_wpOldCaret); - - return TRUE; - } - } - - return FALSE; -} - -FX_BOOL CFX_Edit::Backspace(FX_BOOL bAddUndo, FX_BOOL bPaint) { - if (m_pVT->IsValid()) { - if (m_wpCaret == m_pVT->GetBeginWordPlace()) - return FALSE; - - CPVT_Section section; - CPVT_Word word; - - if (bAddUndo) { - if (IPDF_VariableText_Iterator* pIterator = m_pVT->GetIterator()) { - pIterator->SetAt(m_wpCaret); - pIterator->GetSection(section); - pIterator->GetWord(word); - } - } - - m_pVT->UpdateWordPlace(m_wpCaret); - SetCaret(m_pVT->BackSpaceWord(m_wpCaret)); - m_SelState.Set(m_wpCaret, m_wpCaret); - - if (m_wpCaret != m_wpOldCaret) { - if (bAddUndo && m_bEnableUndo) { - if (m_wpCaret.SecCmp(m_wpOldCaret) != 0) - AddEditUndoItem(new CFXEU_Backspace( - this, m_wpOldCaret, m_wpCaret, word.Word, word.nCharset, - section.SecProps, section.WordProps)); - else - AddEditUndoItem(new CFXEU_Backspace( - this, m_wpOldCaret, m_wpCaret, word.Word, word.nCharset, - section.SecProps, word.WordProps)); - } - - if (bPaint) { - RearrangePart(CPVT_WordRange(m_wpCaret, m_wpOldCaret)); - ScrollToCaret(); - - CPVT_WordRange wr; - if (m_wpCaret.SecCmp(m_wpOldCaret) != 0) - wr = CPVT_WordRange(m_pVT->GetPrevWordPlace(m_wpCaret), - GetVisibleWordRange().EndPos); - else if (m_wpCaret.LineCmp(m_wpOldCaret) != 0) - wr = CPVT_WordRange(m_pVT->GetLineBeginPlace(m_wpCaret), - m_pVT->GetSectionEndPlace(m_wpCaret)); - else - wr = CPVT_WordRange(m_pVT->GetPrevWordPlace(m_wpCaret), - m_pVT->GetSectionEndPlace(m_wpCaret)); - - Refresh(RP_ANALYSE, &wr); - - SetCaretOrigin(); - SetCaretInfo(); - } - - if (m_bOprNotify && m_pOprNotify) - m_pOprNotify->OnBackSpace(m_wpCaret, m_wpOldCaret); - - return TRUE; - } - } - - return FALSE; -} - -FX_BOOL CFX_Edit::Delete(FX_BOOL bAddUndo, FX_BOOL bPaint) { - if (m_pVT->IsValid()) { - if (m_wpCaret == m_pVT->GetEndWordPlace()) - return FALSE; - - CPVT_Section section; - CPVT_Word word; - - if (bAddUndo) { - if (IPDF_VariableText_Iterator* pIterator = m_pVT->GetIterator()) { - pIterator->SetAt(m_pVT->GetNextWordPlace(m_wpCaret)); - pIterator->GetSection(section); - pIterator->GetWord(word); - } - } - - m_pVT->UpdateWordPlace(m_wpCaret); - FX_BOOL bSecEnd = (m_wpCaret == m_pVT->GetSectionEndPlace(m_wpCaret)); - - SetCaret(m_pVT->DeleteWord(m_wpCaret)); - m_SelState.Set(m_wpCaret, m_wpCaret); - - if (bAddUndo && m_bEnableUndo) { - if (bSecEnd) - AddEditUndoItem(new CFXEU_Delete( - this, m_wpOldCaret, m_wpCaret, word.Word, word.nCharset, - section.SecProps, section.WordProps, bSecEnd)); - else - AddEditUndoItem(new CFXEU_Delete( - this, m_wpOldCaret, m_wpCaret, word.Word, word.nCharset, - section.SecProps, word.WordProps, bSecEnd)); - } - - if (bPaint) { - RearrangePart(CPVT_WordRange(m_wpOldCaret, m_wpCaret)); - ScrollToCaret(); - - CPVT_WordRange wr; - if (bSecEnd) - wr = CPVT_WordRange(m_pVT->GetPrevWordPlace(m_wpOldCaret), - GetVisibleWordRange().EndPos); - else if (m_wpCaret.LineCmp(m_wpOldCaret) != 0) - wr = CPVT_WordRange(m_pVT->GetLineBeginPlace(m_wpCaret), - m_pVT->GetSectionEndPlace(m_wpCaret)); - else - wr = CPVT_WordRange(m_pVT->GetPrevWordPlace(m_wpOldCaret), - m_pVT->GetSectionEndPlace(m_wpCaret)); - - Refresh(RP_ANALYSE, &wr); - - SetCaretOrigin(); - SetCaretInfo(); - } - - if (m_bOprNotify && m_pOprNotify) - m_pOprNotify->OnDelete(m_wpCaret, m_wpOldCaret); - - return TRUE; - } - - return FALSE; -} - -FX_BOOL CFX_Edit::Empty() { - if (m_pVT->IsValid()) { - m_pVT->DeleteWords(GetWholeWordRange()); - SetCaret(m_pVT->GetBeginWordPlace()); - - return TRUE; - } - - return FALSE; -} - -FX_BOOL CFX_Edit::Clear(FX_BOOL bAddUndo, FX_BOOL bPaint) { - if (m_pVT->IsValid()) { - if (m_SelState.IsExist()) { - CPVT_WordRange range = m_SelState.ConvertToWordRange(); - - if (bAddUndo && m_bEnableUndo) { - if (m_pVT->IsRichText()) { - BeginGroupUndo(L""); - - if (IPDF_VariableText_Iterator* pIterator = m_pVT->GetIterator()) { - pIterator->SetAt(range.EndPos); - - CPVT_Word wordinfo; - CPVT_Section secinfo; - do { - CPVT_WordPlace place = pIterator->GetAt(); - if (place.WordCmp(range.BeginPos) <= 0) - break; - - CPVT_WordPlace oldplace = m_pVT->GetPrevWordPlace(place); - - if (oldplace.SecCmp(place) != 0) { - if (pIterator->GetSection(secinfo)) { - AddEditUndoItem(new CFXEU_ClearRich( - this, oldplace, place, range, wordinfo.Word, - wordinfo.nCharset, secinfo.SecProps, secinfo.WordProps)); - } - } else { - if (pIterator->GetWord(wordinfo)) { - oldplace = m_pVT->AdjustLineHeader(oldplace, TRUE); - place = m_pVT->AdjustLineHeader(place, TRUE); - - AddEditUndoItem(new CFXEU_ClearRich( - this, oldplace, place, range, wordinfo.Word, - wordinfo.nCharset, secinfo.SecProps, wordinfo.WordProps)); - } - } - } while (pIterator->PrevWord()); - } - EndGroupUndo(); - } else { - AddEditUndoItem(new CFXEU_Clear(this, range, GetSelText())); - } - } - - SelectNone(); - SetCaret(m_pVT->DeleteWords(range)); - m_SelState.Set(m_wpCaret, m_wpCaret); - - if (bPaint) { - RearrangePart(range); - ScrollToCaret(); - - CPVT_WordRange wr(m_wpOldCaret, GetVisibleWordRange().EndPos); - Refresh(RP_ANALYSE, &wr); - - SetCaretOrigin(); - SetCaretInfo(); - } - - if (m_bOprNotify && m_pOprNotify) - m_pOprNotify->OnClear(m_wpCaret, m_wpOldCaret); - - return TRUE; - } - } - - return FALSE; -} - -FX_BOOL CFX_Edit::InsertText(const FX_WCHAR* text, - int32_t charset, - const CPVT_SecProps* pSecProps, - const CPVT_WordProps* pWordProps, - FX_BOOL bAddUndo, - FX_BOOL bPaint) { - if (IsTextOverflow()) - return FALSE; - - m_pVT->UpdateWordPlace(m_wpCaret); - SetCaret(DoInsertText(m_wpCaret, text, charset, pSecProps, pWordProps)); - m_SelState.Set(m_wpCaret, m_wpCaret); - - if (m_wpCaret != m_wpOldCaret) { - if (bAddUndo && m_bEnableUndo) { - AddEditUndoItem(new CFXEU_InsertText(this, m_wpOldCaret, m_wpCaret, text, - charset, pSecProps, pWordProps)); - } - - if (bPaint) - PaintInsertText(m_wpOldCaret, m_wpCaret); - - if (m_bOprNotify && m_pOprNotify) - m_pOprNotify->OnInsertText(m_wpCaret, m_wpOldCaret); - - return TRUE; - } - return FALSE; -} - -void CFX_Edit::PaintInsertText(const CPVT_WordPlace& wpOld, - const CPVT_WordPlace& wpNew) { - if (m_pVT->IsValid()) { - RearrangePart(CPVT_WordRange(wpOld, wpNew)); - ScrollToCaret(); - - CPVT_WordRange wr; - if (m_wpCaret.LineCmp(wpOld) != 0) - wr = CPVT_WordRange(m_pVT->GetLineBeginPlace(wpOld), - m_pVT->GetSectionEndPlace(wpNew)); - else - wr = CPVT_WordRange(wpOld, m_pVT->GetSectionEndPlace(wpNew)); - Refresh(RP_ANALYSE, &wr); - SetCaretOrigin(); - SetCaretInfo(); - } -} - -FX_BOOL CFX_Edit::Redo() { - if (m_bEnableUndo) { - if (m_Undo.CanRedo()) { - m_Undo.Redo(); - return TRUE; - } - } - - return FALSE; -} - -FX_BOOL CFX_Edit::Undo() { - if (m_bEnableUndo) { - if (m_Undo.CanUndo()) { - m_Undo.Undo(); - return TRUE; - } - } - - return FALSE; -} - -void CFX_Edit::SetCaretOrigin() { - if (m_pVT->IsValid()) { - if (IPDF_VariableText_Iterator* pIterator = m_pVT->GetIterator()) { - pIterator->SetAt(m_wpCaret); - CPVT_Word word; - CPVT_Line line; - if (pIterator->GetWord(word)) { - m_ptCaret.x = word.ptWord.x + word.fWidth; - m_ptCaret.y = word.ptWord.y; - } else if (pIterator->GetLine(line)) { - m_ptCaret.x = line.ptLine.x; - m_ptCaret.y = line.ptLine.y; - } - } - } -} - -int32_t CFX_Edit::WordPlaceToWordIndex(const CPVT_WordPlace& place) const { - if (m_pVT->IsValid()) - return m_pVT->WordPlaceToWordIndex(place); - - return -1; -} - -CPVT_WordPlace CFX_Edit::WordIndexToWordPlace(int32_t index) const { - if (m_pVT->IsValid()) - return m_pVT->WordIndexToWordPlace(index); - - return CPVT_WordPlace(); -} - -FX_BOOL CFX_Edit::IsTextFull() const { - int32_t nTotalWords = m_pVT->GetTotalWords(); - int32_t nLimitChar = m_pVT->GetLimitChar(); - int32_t nCharArray = m_pVT->GetCharArray(); - - return IsTextOverflow() || (nLimitChar > 0 && nTotalWords >= nLimitChar) || - (nCharArray > 0 && nTotalWords >= nCharArray); -} - -FX_BOOL CFX_Edit::IsTextOverflow() const { - if (!m_bEnableScroll && !m_bEnableOverflow) { - CFX_FloatRect rcPlate = m_pVT->GetPlateRect(); - CFX_FloatRect rcContent = m_pVT->GetContentRect(); - - if (m_pVT->IsMultiLine() && GetTotalLines() > 1) { - if (FX_EDIT_IsFloatBigger(rcContent.Height(), rcPlate.Height())) - return TRUE; - } - - if (FX_EDIT_IsFloatBigger(rcContent.Width(), rcPlate.Width())) - return TRUE; - } - - return FALSE; -} - -CPVT_WordPlace CFX_Edit::GetLineBeginPlace(const CPVT_WordPlace& place) const { - return m_pVT->GetLineBeginPlace(place); -} - -CPVT_WordPlace CFX_Edit::GetLineEndPlace(const CPVT_WordPlace& place) const { - return m_pVT->GetLineEndPlace(place); -} - -CPVT_WordPlace CFX_Edit::GetSectionBeginPlace( - const CPVT_WordPlace& place) const { - return m_pVT->GetSectionBeginPlace(place); -} - -CPVT_WordPlace CFX_Edit::GetSectionEndPlace(const CPVT_WordPlace& place) const { - return m_pVT->GetSectionEndPlace(place); -} - -FX_BOOL CFX_Edit::CanUndo() const { - if (m_bEnableUndo) { - return m_Undo.CanUndo(); - } - - return FALSE; -} - -FX_BOOL CFX_Edit::CanRedo() const { - if (m_bEnableUndo) { - return m_Undo.CanRedo(); - } - - return FALSE; -} - -FX_BOOL CFX_Edit::IsModified() const { - if (m_bEnableUndo) { - return m_Undo.IsModified(); - } - - return FALSE; -} - -void CFX_Edit::EnableRefresh(FX_BOOL bRefresh) { - m_bEnableRefresh = bRefresh; -} - -void CFX_Edit::EnableUndo(FX_BOOL bUndo) { - m_bEnableUndo = bUndo; -} - -void CFX_Edit::EnableNotify(FX_BOOL bNotify) { - m_bNotify = bNotify; -} - -void CFX_Edit::EnableOprNotify(FX_BOOL bNotify) { - m_bOprNotify = bNotify; -} - -FX_FLOAT CFX_Edit::GetLineTop(const CPVT_WordPlace& place) const { - if (IPDF_VariableText_Iterator* pIterator = m_pVT->GetIterator()) { - CPVT_WordPlace wpOld = pIterator->GetAt(); - - pIterator->SetAt(place); - CPVT_Line line; - pIterator->GetLine(line); - - pIterator->SetAt(wpOld); - - return line.ptLine.y + line.fLineAscent; - } - - return 0.0f; -} - -FX_FLOAT CFX_Edit::GetLineBottom(const CPVT_WordPlace& place) const { - if (IPDF_VariableText_Iterator* pIterator = m_pVT->GetIterator()) { - CPVT_WordPlace wpOld = pIterator->GetAt(); - - pIterator->SetAt(place); - CPVT_Line line; - pIterator->GetLine(line); - - pIterator->SetAt(wpOld); - - return line.ptLine.y + line.fLineDescent; - } - - return 0.0f; -} - -CPVT_WordPlace CFX_Edit::DoInsertText(const CPVT_WordPlace& place, - const FX_WCHAR* text, - int32_t charset, - const CPVT_SecProps* pSecProps, - const CPVT_WordProps* pWordProps) { - CPVT_WordPlace wp = place; - - if (m_pVT->IsValid()) { - CFX_WideString sText = text; - - for (int32_t i = 0, sz = sText.GetLength(); i < sz; i++) { - FX_WORD word = sText[i]; - switch (word) { - case 0x0D: - wp = m_pVT->InsertSection(wp, pSecProps, pWordProps); - if (sText[i + 1] == 0x0A) - i++; - break; - case 0x0A: - wp = m_pVT->InsertSection(wp, pSecProps, pWordProps); - if (sText[i + 1] == 0x0D) - i++; - break; - case 0x09: - word = 0x20; - default: - wp = m_pVT->InsertWord(wp, word, GetCharSetFromUnicode(word, charset), - pWordProps); - break; - } - } - } - - return wp; -} - -int32_t CFX_Edit::GetCharSetFromUnicode(FX_WORD word, int32_t nOldCharset) { - if (IFX_Edit_FontMap* pFontMap = GetFontMap()) - return pFontMap->CharSetFromUnicode(word, nOldCharset); - return nOldCharset; -} - -void CFX_Edit::BeginGroupUndo(const CFX_WideString& sTitle) { - ASSERT(!m_pGroupUndoItem); - - m_pGroupUndoItem = new CFX_Edit_GroupUndoItem(sTitle); -} - -void CFX_Edit::EndGroupUndo() { - m_pGroupUndoItem->UpdateItems(); - m_Undo.AddItem(m_pGroupUndoItem); - if (m_bOprNotify && m_pOprNotify) - m_pOprNotify->OnAddUndo(m_pGroupUndoItem); - m_pGroupUndoItem = NULL; -} - -void CFX_Edit::AddEditUndoItem(CFX_Edit_UndoItem* pEditUndoItem) { - if (m_pGroupUndoItem) { - m_pGroupUndoItem->AddUndoItem(pEditUndoItem); - } else { - m_Undo.AddItem(pEditUndoItem); - if (m_bOprNotify && m_pOprNotify) - m_pOprNotify->OnAddUndo(pEditUndoItem); - } -} - -void CFX_Edit::AddUndoItem(IFX_Edit_UndoItem* pUndoItem) { - m_Undo.AddItem(pUndoItem); - if (m_bOprNotify && m_pOprNotify) - m_pOprNotify->OnAddUndo(pUndoItem); -} diff --git a/fpdfsdk/src/fxedit/fxet_list.cpp b/fpdfsdk/src/fxedit/fxet_list.cpp deleted file mode 100644 index cc9696030e..0000000000 --- a/fpdfsdk/src/fxedit/fxet_list.cpp +++ /dev/null @@ -1,822 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "fpdfsdk/include/fxedit/fxet_list.h" - -#include "fpdfsdk/include/fxedit/fxet_edit.h" - -CFX_ListItem::CFX_ListItem() - : m_pEdit(NULL), - m_bSelected(FALSE), - m_bCaret(FALSE), - m_rcListItem(0.0f, 0.0f, 0.0f, 0.0f) { - m_pEdit = IFX_Edit::NewEdit(); - m_pEdit->SetAlignmentV(1); - m_pEdit->Initialize(); -} - -CFX_ListItem::~CFX_ListItem() { - IFX_Edit::DelEdit(m_pEdit); -} - -void CFX_ListItem::SetFontMap(IFX_Edit_FontMap* pFontMap) { - if (m_pEdit) - m_pEdit->SetFontMap(pFontMap); -} - -IFX_Edit* CFX_ListItem::GetEdit() const { - return m_pEdit; -} - -IFX_Edit_Iterator* CFX_ListItem::GetIterator() const { - if (m_pEdit) - return m_pEdit->GetIterator(); - - return NULL; -} - -void CFX_ListItem::SetRect(const CLST_Rect& rect) { - m_rcListItem = rect; -} - -CLST_Rect CFX_ListItem::GetRect() const { - return m_rcListItem; -} - -FX_BOOL CFX_ListItem::IsSelected() const { - return m_bSelected; -} - -void CFX_ListItem::SetSelect(FX_BOOL bSelected) { - m_bSelected = bSelected; -} - -FX_BOOL CFX_ListItem::IsCaret() const { - return m_bCaret; -} - -void CFX_ListItem::SetCaret(FX_BOOL bCaret) { - m_bCaret = bCaret; -} - -void CFX_ListItem::SetText(const FX_WCHAR* text) { - if (m_pEdit) - m_pEdit->SetText(text); -} - -void CFX_ListItem::SetFontSize(FX_FLOAT fFontSize) { - if (m_pEdit) - m_pEdit->SetFontSize(fFontSize); -} - -FX_FLOAT CFX_ListItem::GetItemHeight() const { - if (m_pEdit) - return m_pEdit->GetContentRect().Height(); - - return 0.0f; -} - -FX_WORD CFX_ListItem::GetFirstChar() const { - CPVT_Word word; - - if (IFX_Edit_Iterator* pIterator = GetIterator()) { - pIterator->SetAt(1); - pIterator->GetWord(word); - } - - return word.Word; -} - -CFX_WideString CFX_ListItem::GetText() const { - if (m_pEdit) - return m_pEdit->GetText(); - - return L""; -} - -CFX_List::CFX_List() - : m_fFontSize(0.0f), m_pFontMap(NULL), m_bMultiple(FALSE) {} - -CFX_List::~CFX_List() { - Empty(); -} - -void CFX_List::Empty() { - for (int32_t i = 0, sz = m_aListItems.GetSize(); i < sz; i++) - delete m_aListItems.GetAt(i); - - m_aListItems.RemoveAll(); -} - -void CFX_List::SetFontMap(IFX_Edit_FontMap* pFontMap) { - m_pFontMap = pFontMap; -} - -void CFX_List::SetFontSize(FX_FLOAT fFontSize) { - m_fFontSize = fFontSize; -} - -void CFX_List::AddItem(const FX_WCHAR* str) { - CFX_ListItem* pListItem = new CFX_ListItem(); - pListItem->SetFontMap(m_pFontMap); - pListItem->SetFontSize(m_fFontSize); - pListItem->SetText(str); - m_aListItems.Add(pListItem); -} - -void CFX_List::ReArrange(int32_t nItemIndex) { - FX_FLOAT fPosY = 0.0f; - - if (CFX_ListItem* pPrevItem = m_aListItems.GetAt(nItemIndex - 1)) - fPosY = pPrevItem->GetRect().bottom; - - for (int32_t i = nItemIndex, sz = m_aListItems.GetSize(); i < sz; i++) { - if (CFX_ListItem* pListItem = m_aListItems.GetAt(i)) { - FX_FLOAT fListItemHeight = pListItem->GetItemHeight(); - pListItem->SetRect(CLST_Rect(0.0f, fPosY, 0.0f, fPosY + fListItemHeight)); - fPosY += fListItemHeight; - } - } - - SetContentRect(CLST_Rect(0.0f, 0.0f, 0.0f, fPosY)); -} - -IFX_Edit* CFX_List::GetItemEdit(int32_t nIndex) const { - if (CFX_ListItem* pListItem = m_aListItems.GetAt(nIndex)) { - return pListItem->GetEdit(); - } - - return NULL; -} - -int32_t CFX_List::GetCount() const { - return m_aListItems.GetSize(); -} - -CFX_FloatRect CFX_List::GetPlateRect() const { - return CFX_ListContainer::GetPlateRect(); -} - -CFX_FloatRect CFX_List::GetContentRect() const { - return InnerToOuter(CFX_ListContainer::GetContentRect()); -} - -FX_FLOAT CFX_List::GetFontSize() const { - return m_fFontSize; -} - -int32_t CFX_List::GetItemIndex(const CFX_FloatPoint& point) const { - CFX_FloatPoint pt = OuterToInner(point); - - FX_BOOL bFirst = TRUE; - FX_BOOL bLast = TRUE; - - for (int32_t i = 0, sz = m_aListItems.GetSize(); i < sz; i++) { - if (CFX_ListItem* pListItem = m_aListItems.GetAt(i)) { - CLST_Rect rcListItem = pListItem->GetRect(); - - if (FX_EDIT_IsFloatBigger(pt.y, rcListItem.top)) { - bFirst = FALSE; - } - - if (FX_EDIT_IsFloatSmaller(pt.y, rcListItem.bottom)) { - bLast = FALSE; - } - - if (pt.y >= rcListItem.top && pt.y < rcListItem.bottom) { - return i; - } - } - } - - if (bFirst) - return 0; - if (bLast) - return m_aListItems.GetSize() - 1; - - return -1; -} - -FX_FLOAT CFX_List::GetFirstHeight() const { - if (CFX_ListItem* pListItem = m_aListItems.GetAt(0)) { - return pListItem->GetItemHeight(); - } - - return 1.0f; -} - -int32_t CFX_List::GetFirstSelected() const { - for (int32_t i = 0, sz = m_aListItems.GetSize(); i < sz; i++) { - if (CFX_ListItem* pListItem = m_aListItems.GetAt(i)) { - if (pListItem->IsSelected()) - return i; - } - } - return -1; -} - -int32_t CFX_List::GetLastSelected() const { - for (int32_t i = m_aListItems.GetSize() - 1; i >= 0; i--) { - if (CFX_ListItem* pListItem = m_aListItems.GetAt(i)) { - if (pListItem->IsSelected()) - return i; - } - } - return -1; -} - -FX_WCHAR CFX_List::Toupper(FX_WCHAR c) const { - if ((c >= 'a') && (c <= 'z')) - c = c - ('a' - 'A'); - return c; -} - -int32_t CFX_List::FindNext(int32_t nIndex, FX_WCHAR nChar) const { - int32_t nCircleIndex = nIndex; - - for (int32_t i = 0, sz = m_aListItems.GetSize(); i < sz; i++) { - nCircleIndex++; - if (nCircleIndex >= sz) - nCircleIndex = 0; - - if (CFX_ListItem* pListItem = m_aListItems.GetAt(nCircleIndex)) { - if (Toupper(pListItem->GetFirstChar()) == Toupper(nChar)) - return nCircleIndex; - } - } - - return nCircleIndex; -} - -CFX_FloatRect CFX_List::GetItemRect(int32_t nIndex) const { - if (CFX_ListItem* pListItem = m_aListItems.GetAt(nIndex)) { - CFX_FloatRect rcItem = pListItem->GetRect(); - rcItem.left = 0.0f; - rcItem.right = GetPlateRect().Width(); - return InnerToOuter(rcItem); - } - - return CFX_FloatRect(); -} - -FX_BOOL CFX_List::IsItemSelected(int32_t nIndex) const { - if (CFX_ListItem* pListItem = m_aListItems.GetAt(nIndex)) { - return pListItem->IsSelected(); - } - - return FALSE; -} - -void CFX_List::SetItemSelect(int32_t nItemIndex, FX_BOOL bSelected) { - if (CFX_ListItem* pListItem = m_aListItems.GetAt(nItemIndex)) { - pListItem->SetSelect(bSelected); - } -} - -void CFX_List::SetItemCaret(int32_t nItemIndex, FX_BOOL bCaret) { - if (CFX_ListItem* pListItem = m_aListItems.GetAt(nItemIndex)) { - pListItem->SetCaret(bCaret); - } -} - -void CFX_List::SetMultipleSel(FX_BOOL bMultiple) { - m_bMultiple = bMultiple; -} - -FX_BOOL CFX_List::IsMultipleSel() const { - return m_bMultiple; -} - -FX_BOOL CFX_List::IsValid(int32_t nItemIndex) const { - return nItemIndex >= 0 && nItemIndex < m_aListItems.GetSize(); -} - -CFX_WideString CFX_List::GetItemText(int32_t nIndex) const { - if (CFX_ListItem* pListItem = m_aListItems.GetAt(nIndex)) { - return pListItem->GetText(); - } - - return L""; -} - -CPLST_Select::CPLST_Select() {} - -CPLST_Select::~CPLST_Select() { - for (int32_t i = 0, sz = m_aItems.GetSize(); i < sz; i++) - delete m_aItems.GetAt(i); - - m_aItems.RemoveAll(); -} - -void CPLST_Select::Add(int32_t nItemIndex) { - int32_t nIndex = Find(nItemIndex); - - if (nIndex < 0) { - m_aItems.Add(new CPLST_Select_Item(nItemIndex, 1)); - } else { - if (CPLST_Select_Item* pItem = m_aItems.GetAt(nIndex)) { - pItem->nState = 1; - } - } -} - -void CPLST_Select::Add(int32_t nBeginIndex, int32_t nEndIndex) { - if (nBeginIndex > nEndIndex) { - int32_t nTemp = nEndIndex; - nEndIndex = nBeginIndex; - nBeginIndex = nTemp; - } - - for (int32_t i = nBeginIndex; i <= nEndIndex; i++) - Add(i); -} - -void CPLST_Select::Sub(int32_t nItemIndex) { - for (int32_t i = m_aItems.GetSize() - 1; i >= 0; i--) { - if (CPLST_Select_Item* pItem = m_aItems.GetAt(i)) - if (pItem->nItemIndex == nItemIndex) - pItem->nState = -1; - } -} - -void CPLST_Select::Sub(int32_t nBeginIndex, int32_t nEndIndex) { - if (nBeginIndex > nEndIndex) { - int32_t nTemp = nEndIndex; - nEndIndex = nBeginIndex; - nBeginIndex = nTemp; - } - - for (int32_t i = nBeginIndex; i <= nEndIndex; i++) - Sub(i); -} - -int32_t CPLST_Select::Find(int32_t nItemIndex) const { - for (int32_t i = 0, sz = m_aItems.GetSize(); i < sz; i++) { - if (CPLST_Select_Item* pItem = m_aItems.GetAt(i)) { - if (pItem->nItemIndex == nItemIndex) - return i; - } - } - - return -1; -} - -FX_BOOL CPLST_Select::IsExist(int32_t nItemIndex) const { - return Find(nItemIndex) >= 0; -} - -int32_t CPLST_Select::GetCount() const { - return m_aItems.GetSize(); -} - -int32_t CPLST_Select::GetItemIndex(int32_t nIndex) const { - if (nIndex >= 0 && nIndex < m_aItems.GetSize()) - if (CPLST_Select_Item* pItem = m_aItems.GetAt(nIndex)) - return pItem->nItemIndex; - - return -1; -} - -int32_t CPLST_Select::GetState(int32_t nIndex) const { - if (nIndex >= 0 && nIndex < m_aItems.GetSize()) - if (CPLST_Select_Item* pItem = m_aItems.GetAt(nIndex)) - return pItem->nState; - - return 0; -} - -void CPLST_Select::DeselectAll() { - for (int32_t i = 0, sz = m_aItems.GetSize(); i < sz; i++) { - if (CPLST_Select_Item* pItem = m_aItems.GetAt(i)) { - pItem->nState = -1; - } - } -} - -void CPLST_Select::Done() { - for (int32_t i = m_aItems.GetSize() - 1; i >= 0; i--) { - if (CPLST_Select_Item* pItem = m_aItems.GetAt(i)) { - if (pItem->nState == -1) { - delete pItem; - m_aItems.RemoveAt(i); - } else { - pItem->nState = 0; - } - } - } -} - -CFX_ListCtrl::CFX_ListCtrl() - : m_pNotify(NULL), - m_bNotifyFlag(FALSE), - m_ptScrollPos(0.0f, 0.0f), - m_nSelItem(-1), - m_nFootIndex(-1), - m_bCtrlSel(FALSE), - m_nCaretIndex(-1) {} - -CFX_ListCtrl::~CFX_ListCtrl() {} - -void CFX_ListCtrl::SetNotify(IFX_List_Notify* pNotify) { - m_pNotify = pNotify; -} - -CFX_FloatPoint CFX_ListCtrl::InToOut(const CFX_FloatPoint& point) const { - CFX_FloatRect rcPlate = GetPlateRect(); - - return CFX_FloatPoint(point.x - (m_ptScrollPos.x - rcPlate.left), - point.y - (m_ptScrollPos.y - rcPlate.top)); -} - -CFX_FloatPoint CFX_ListCtrl::OutToIn(const CFX_FloatPoint& point) const { - CFX_FloatRect rcPlate = GetPlateRect(); - - return CFX_FloatPoint(point.x + (m_ptScrollPos.x - rcPlate.left), - point.y + (m_ptScrollPos.y - rcPlate.top)); -} - -CFX_FloatRect CFX_ListCtrl::InToOut(const CFX_FloatRect& rect) const { - CFX_FloatPoint ptLeftBottom = InToOut(CFX_FloatPoint(rect.left, rect.bottom)); - CFX_FloatPoint ptRightTop = InToOut(CFX_FloatPoint(rect.right, rect.top)); - - return CFX_FloatRect(ptLeftBottom.x, ptLeftBottom.y, ptRightTop.x, - ptRightTop.y); -} - -CFX_FloatRect CFX_ListCtrl::OutToIn(const CFX_FloatRect& rect) const { - CFX_FloatPoint ptLeftBottom = OutToIn(CFX_FloatPoint(rect.left, rect.bottom)); - CFX_FloatPoint ptRightTop = OutToIn(CFX_FloatPoint(rect.right, rect.top)); - - return CFX_FloatRect(ptLeftBottom.x, ptLeftBottom.y, ptRightTop.x, - ptRightTop.y); -} - -void CFX_ListCtrl::OnMouseDown(const CFX_FloatPoint& point, - FX_BOOL bShift, - FX_BOOL bCtrl) { - int32_t nHitIndex = GetItemIndex(point); - - if (IsMultipleSel()) { - if (bCtrl) { - if (IsItemSelected(nHitIndex)) { - m_aSelItems.Sub(nHitIndex); - SelectItems(); - m_bCtrlSel = FALSE; - } else { - m_aSelItems.Add(nHitIndex); - SelectItems(); - m_bCtrlSel = TRUE; - } - - m_nFootIndex = nHitIndex; - } else if (bShift) { - m_aSelItems.DeselectAll(); - m_aSelItems.Add(m_nFootIndex, nHitIndex); - SelectItems(); - } else { - m_aSelItems.DeselectAll(); - m_aSelItems.Add(nHitIndex); - SelectItems(); - - m_nFootIndex = nHitIndex; - } - - SetCaret(nHitIndex); - } else { - SetSingleSelect(nHitIndex); - } - - if (!IsItemVisible(nHitIndex)) - ScrollToListItem(nHitIndex); -} - -void CFX_ListCtrl::OnMouseMove(const CFX_FloatPoint& point, - FX_BOOL bShift, - FX_BOOL bCtrl) { - int32_t nHitIndex = GetItemIndex(point); - - if (IsMultipleSel()) { - if (bCtrl) { - if (m_bCtrlSel) - m_aSelItems.Add(m_nFootIndex, nHitIndex); - else - m_aSelItems.Sub(m_nFootIndex, nHitIndex); - - SelectItems(); - } else { - m_aSelItems.DeselectAll(); - m_aSelItems.Add(m_nFootIndex, nHitIndex); - SelectItems(); - } - - SetCaret(nHitIndex); - } else { - SetSingleSelect(nHitIndex); - } - - if (!IsItemVisible(nHitIndex)) - ScrollToListItem(nHitIndex); -} - -void CFX_ListCtrl::OnVK(int32_t nItemIndex, FX_BOOL bShift, FX_BOOL bCtrl) { - if (IsMultipleSel()) { - if (nItemIndex >= 0 && nItemIndex < GetCount()) { - if (bCtrl) { - } else if (bShift) { - m_aSelItems.DeselectAll(); - m_aSelItems.Add(m_nFootIndex, nItemIndex); - SelectItems(); - } else { - m_aSelItems.DeselectAll(); - m_aSelItems.Add(nItemIndex); - SelectItems(); - m_nFootIndex = nItemIndex; - } - - SetCaret(nItemIndex); - } - } else { - SetSingleSelect(nItemIndex); - } - - if (!IsItemVisible(nItemIndex)) - ScrollToListItem(nItemIndex); -} - -void CFX_ListCtrl::OnVK_UP(FX_BOOL bShift, FX_BOOL bCtrl) { - OnVK(IsMultipleSel() ? GetCaret() - 1 : GetSelect() - 1, bShift, bCtrl); -} - -void CFX_ListCtrl::OnVK_DOWN(FX_BOOL bShift, FX_BOOL bCtrl) { - OnVK(IsMultipleSel() ? GetCaret() + 1 : GetSelect() + 1, bShift, bCtrl); -} - -void CFX_ListCtrl::OnVK_LEFT(FX_BOOL bShift, FX_BOOL bCtrl) { - OnVK(0, bShift, bCtrl); -} - -void CFX_ListCtrl::OnVK_RIGHT(FX_BOOL bShift, FX_BOOL bCtrl) { - OnVK(GetCount() - 1, bShift, bCtrl); -} - -void CFX_ListCtrl::OnVK_HOME(FX_BOOL bShift, FX_BOOL bCtrl) { - OnVK(0, bShift, bCtrl); -} - -void CFX_ListCtrl::OnVK_END(FX_BOOL bShift, FX_BOOL bCtrl) { - OnVK(GetCount() - 1, bShift, bCtrl); -} - -FX_BOOL CFX_ListCtrl::OnChar(FX_WORD nChar, FX_BOOL bShift, FX_BOOL bCtrl) { - int32_t nIndex = GetLastSelected(); - int32_t nFindIndex = FindNext(nIndex, nChar); - - if (nFindIndex != nIndex) { - OnVK(nFindIndex, bShift, bCtrl); - return TRUE; - } - return FALSE; -} - -void CFX_ListCtrl::SetPlateRect(const CFX_FloatRect& rect) { - CFX_ListContainer::SetPlateRect(rect); - m_ptScrollPos.x = rect.left; - SetScrollPos(CFX_FloatPoint(rect.left, rect.top)); - ReArrange(0); - InvalidateItem(-1); -} - -CFX_FloatRect CFX_ListCtrl::GetItemRect(int32_t nIndex) const { - return InToOut(CFX_List::GetItemRect(nIndex)); -} - -void CFX_ListCtrl::AddString(const FX_WCHAR* str) { - AddItem(str); - ReArrange(GetCount() - 1); -} - -void CFX_ListCtrl::SetMultipleSelect(int32_t nItemIndex, FX_BOOL bSelected) { - if (!IsValid(nItemIndex)) - return; - - if (bSelected != IsItemSelected(nItemIndex)) { - if (bSelected) { - SetItemSelect(nItemIndex, TRUE); - InvalidateItem(nItemIndex); - } else { - SetItemSelect(nItemIndex, FALSE); - InvalidateItem(nItemIndex); - } - } -} - -void CFX_ListCtrl::SetSingleSelect(int32_t nItemIndex) { - if (!IsValid(nItemIndex)) - return; - - if (m_nSelItem != nItemIndex) { - if (m_nSelItem >= 0) { - SetItemSelect(m_nSelItem, FALSE); - InvalidateItem(m_nSelItem); - } - - SetItemSelect(nItemIndex, TRUE); - InvalidateItem(nItemIndex); - m_nSelItem = nItemIndex; - } -} - -void CFX_ListCtrl::SetCaret(int32_t nItemIndex) { - if (!IsValid(nItemIndex)) - return; - - if (IsMultipleSel()) { - int32_t nOldIndex = m_nCaretIndex; - - if (nOldIndex != nItemIndex) { - m_nCaretIndex = nItemIndex; - - SetItemCaret(nOldIndex, FALSE); - SetItemCaret(nItemIndex, TRUE); - - InvalidateItem(nOldIndex); - InvalidateItem(nItemIndex); - } - } -} - -void CFX_ListCtrl::InvalidateItem(int32_t nItemIndex) { - if (m_pNotify) { - if (nItemIndex == -1) { - if (!m_bNotifyFlag) { - m_bNotifyFlag = TRUE; - CFX_FloatRect rcRefresh = GetPlateRect(); - m_pNotify->IOnInvalidateRect(&rcRefresh); - m_bNotifyFlag = FALSE; - } - } else { - if (!m_bNotifyFlag) { - m_bNotifyFlag = TRUE; - CFX_FloatRect rcRefresh = GetItemRect(nItemIndex); - rcRefresh.left -= 1.0f; - rcRefresh.right += 1.0f; - rcRefresh.bottom -= 1.0f; - rcRefresh.top += 1.0f; - - m_pNotify->IOnInvalidateRect(&rcRefresh); - m_bNotifyFlag = FALSE; - } - } - } -} - -void CFX_ListCtrl::SelectItems() { - for (int32_t i = 0, sz = m_aSelItems.GetCount(); i < sz; i++) { - int32_t nItemIndex = m_aSelItems.GetItemIndex(i); - int32_t nState = m_aSelItems.GetState(i); - - switch (nState) { - case 1: - SetMultipleSelect(nItemIndex, TRUE); - break; - case -1: - SetMultipleSelect(nItemIndex, FALSE); - break; - } - } - - m_aSelItems.Done(); -} - -void CFX_ListCtrl::Select(int32_t nItemIndex) { - if (!IsValid(nItemIndex)) - return; - - if (IsMultipleSel()) { - m_aSelItems.Add(nItemIndex); - SelectItems(); - } else { - SetSingleSelect(nItemIndex); - } -} - -FX_BOOL CFX_ListCtrl::IsItemVisible(int32_t nItemIndex) const { - CFX_FloatRect rcPlate = GetPlateRect(); - CFX_FloatRect rcItem = GetItemRect(nItemIndex); - - return rcItem.bottom >= rcPlate.bottom && rcItem.top <= rcPlate.top; -} - -void CFX_ListCtrl::ScrollToListItem(int32_t nItemIndex) { - if (!IsValid(nItemIndex)) - return; - - CFX_FloatRect rcPlate = GetPlateRect(); - CFX_FloatRect rcItem = CFX_List::GetItemRect(nItemIndex); - CFX_FloatRect rcItemCtrl = GetItemRect(nItemIndex); - - if (FX_EDIT_IsFloatSmaller(rcItemCtrl.bottom, rcPlate.bottom)) { - if (FX_EDIT_IsFloatSmaller(rcItemCtrl.top, rcPlate.top)) { - SetScrollPosY(rcItem.bottom + rcPlate.Height()); - } - } else if (FX_EDIT_IsFloatBigger(rcItemCtrl.top, rcPlate.top)) { - if (FX_EDIT_IsFloatBigger(rcItemCtrl.bottom, rcPlate.bottom)) { - SetScrollPosY(rcItem.top); - } - } -} - -void CFX_ListCtrl::SetScrollInfo() { - if (m_pNotify) { - CFX_FloatRect rcPlate = GetPlateRect(); - CFX_FloatRect rcContent = CFX_List::GetContentRect(); - - if (!m_bNotifyFlag) { - m_bNotifyFlag = TRUE; - m_pNotify->IOnSetScrollInfoY(rcPlate.bottom, rcPlate.top, - rcContent.bottom, rcContent.top, - GetFirstHeight(), rcPlate.Height()); - m_bNotifyFlag = FALSE; - } - } -} - -void CFX_ListCtrl::SetScrollPos(const CFX_FloatPoint& point) { - SetScrollPosY(point.y); -} - -void CFX_ListCtrl::SetScrollPosY(FX_FLOAT fy) { - if (!FX_EDIT_IsFloatEqual(m_ptScrollPos.y, fy)) { - CFX_FloatRect rcPlate = GetPlateRect(); - CFX_FloatRect rcContent = CFX_List::GetContentRect(); - - if (rcPlate.Height() > rcContent.Height()) { - fy = rcPlate.top; - } else { - if (FX_EDIT_IsFloatSmaller(fy - rcPlate.Height(), rcContent.bottom)) { - fy = rcContent.bottom + rcPlate.Height(); - } else if (FX_EDIT_IsFloatBigger(fy, rcContent.top)) { - fy = rcContent.top; - } - } - - m_ptScrollPos.y = fy; - InvalidateItem(-1); - - if (m_pNotify) { - if (!m_bNotifyFlag) { - m_bNotifyFlag = TRUE; - m_pNotify->IOnSetScrollPosY(fy); - m_bNotifyFlag = FALSE; - } - } - } -} - -CFX_FloatRect CFX_ListCtrl::GetContentRect() const { - return InToOut(CFX_List::GetContentRect()); -} - -void CFX_ListCtrl::ReArrange(int32_t nItemIndex) { - CFX_List::ReArrange(nItemIndex); - SetScrollInfo(); -} - -void CFX_ListCtrl::SetTopItem(int32_t nIndex) { - if (IsValid(nIndex)) { - GetPlateRect(); - CFX_FloatRect rcItem = CFX_List::GetItemRect(nIndex); - SetScrollPosY(rcItem.top); - } -} - -int32_t CFX_ListCtrl::GetTopItem() const { - int32_t nItemIndex = GetItemIndex(GetBTPoint()); - - if (!IsItemVisible(nItemIndex) && IsItemVisible(nItemIndex + 1)) - nItemIndex += 1; - - return nItemIndex; -} - -void CFX_ListCtrl::Empty() { - CFX_List::Empty(); - InvalidateItem(-1); -} - -void CFX_ListCtrl::Cancel() { - m_aSelItems.DeselectAll(); -} - -int32_t CFX_ListCtrl::GetItemIndex(const CFX_FloatPoint& point) const { - return CFX_List::GetItemIndex(OutToIn(point)); -} - -CFX_WideString CFX_ListCtrl::GetText() const { - if (IsMultipleSel()) - return GetItemText(m_nCaretIndex); - return GetItemText(m_nSelItem); -} diff --git a/fpdfsdk/src/fxedit/fxet_module.cpp b/fpdfsdk/src/fxedit/fxet_module.cpp deleted file mode 100644 index 889b0f81a6..0000000000 --- a/fpdfsdk/src/fxedit/fxet_module.cpp +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "fpdfsdk/include/fxedit/fxet_edit.h" -#include "fpdfsdk/include/fxedit/fxet_list.h" - -IFX_Edit* IFX_Edit::NewEdit() { - if (IPDF_VariableText* pVT = IPDF_VariableText::NewVariableText()) { - return new CFX_Edit(pVT); - } - - return NULL; -} - -void IFX_Edit::DelEdit(IFX_Edit* pEdit) { - IPDF_VariableText::DelVariableText(pEdit->GetVariableText()); - - delete (CFX_Edit*)pEdit; -} - -IFX_List* IFX_List::NewList() { - return new CFX_ListCtrl(); -} - -void IFX_List::DelList(IFX_List* pList) { - ASSERT(pList); - delete (CFX_ListCtrl*)pList; -} diff --git a/fpdfsdk/src/fxedit/fxet_pageobjs.cpp b/fpdfsdk/src/fxedit/fxet_pageobjs.cpp deleted file mode 100644 index 6d091b7c19..0000000000 --- a/fpdfsdk/src/fxedit/fxet_pageobjs.cpp +++ /dev/null @@ -1,640 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "core/include/fpdfapi/fpdf_pageobj.h" -#include "core/include/fpdfapi/fpdf_render.h" -#include "fpdfsdk/include/fx_systemhandler.h" -#include "fpdfsdk/include/fxedit/fx_edit.h" -#include "fpdfsdk/include/fxedit/fxet_edit.h" - -#define FX_EDIT_UNDERLINEHALFWIDTH 0.5f -#define FX_EDIT_CROSSOUTHALFWIDTH 0.5f - -CFX_FloatRect GetUnderLineRect(const CPVT_Word& word) { - return CFX_FloatRect(word.ptWord.x, word.ptWord.y + word.fDescent * 0.5f, - word.ptWord.x + word.fWidth, - word.ptWord.y + word.fDescent * 0.25f); -} - -CFX_FloatRect GetCrossoutRect(const CPVT_Word& word) { - return CFX_FloatRect(word.ptWord.x, - word.ptWord.y + (word.fAscent + word.fDescent) * 0.5f + - word.fDescent * 0.25f, - word.ptWord.x + word.fWidth, - word.ptWord.y + (word.fAscent + word.fDescent) * 0.5f); -} - -static void DrawTextString(CFX_RenderDevice* pDevice, - const CFX_FloatPoint& pt, - CPDF_Font* pFont, - FX_FLOAT fFontSize, - CFX_Matrix* pUser2Device, - const CFX_ByteString& str, - FX_ARGB crTextFill, - FX_ARGB crTextStroke, - int32_t nHorzScale) { - FX_FLOAT x = pt.x, y = pt.y; - pUser2Device->Transform(x, y); - - if (pFont) { - if (nHorzScale != 100) { - CFX_Matrix mt(nHorzScale / 100.0f, 0, 0, 1, 0, 0); - mt.Concat(*pUser2Device); - - CPDF_RenderOptions ro; - ro.m_Flags = RENDER_CLEARTYPE; - ro.m_ColorMode = RENDER_COLOR_NORMAL; - - if (crTextStroke != 0) { - CFX_FloatPoint pt1(0, 0), pt2(1, 0); - pUser2Device->Transform(pt1.x, pt1.y); - pUser2Device->Transform(pt2.x, pt2.y); - CFX_GraphStateData gsd; - gsd.m_LineWidth = - (FX_FLOAT)FXSYS_fabs((pt2.x + pt2.y) - (pt1.x + pt1.y)); - - CPDF_TextRenderer::DrawTextString(pDevice, x, y, pFont, fFontSize, &mt, - str, crTextFill, crTextStroke, &gsd, - &ro); - } else { - CPDF_TextRenderer::DrawTextString(pDevice, x, y, pFont, fFontSize, &mt, - str, crTextFill, 0, NULL, &ro); - } - } else { - CPDF_RenderOptions ro; - ro.m_Flags = RENDER_CLEARTYPE; - ro.m_ColorMode = RENDER_COLOR_NORMAL; - - if (crTextStroke != 0) { - CFX_FloatPoint pt1(0, 0), pt2(1, 0); - pUser2Device->Transform(pt1.x, pt1.y); - pUser2Device->Transform(pt2.x, pt2.y); - CFX_GraphStateData gsd; - gsd.m_LineWidth = - (FX_FLOAT)FXSYS_fabs((pt2.x + pt2.y) - (pt1.x + pt1.y)); - - CPDF_TextRenderer::DrawTextString(pDevice, x, y, pFont, fFontSize, - pUser2Device, str, crTextFill, - crTextStroke, &gsd, &ro); - } else { - CPDF_TextRenderer::DrawTextString(pDevice, x, y, pFont, fFontSize, - pUser2Device, str, crTextFill, 0, - NULL, &ro); - } - } - } -} - -void IFX_Edit::DrawUnderline(CFX_RenderDevice* pDevice, - CFX_Matrix* pUser2Device, - IFX_Edit* pEdit, - FX_COLORREF color, - const CFX_FloatRect& rcClip, - const CFX_FloatPoint& ptOffset, - const CPVT_WordRange* pRange) { - pDevice->SaveState(); - - if (!rcClip.IsEmpty()) { - CFX_FloatRect rcTemp = rcClip; - pUser2Device->TransformRect(rcTemp); - pDevice->SetClip_Rect(rcTemp.ToFxRect()); - } - - if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator()) { - if (pEdit->GetFontMap()) { - if (pRange) - pIterator->SetAt(pRange->BeginPos); - else - pIterator->SetAt(0); - - while (pIterator->NextWord()) { - CPVT_WordPlace place = pIterator->GetAt(); - if (pRange && place.WordCmp(pRange->EndPos) > 0) - break; - - CPVT_Word word; - if (pIterator->GetWord(word)) { - CFX_PathData pathUnderline; - CFX_FloatRect rcUnderline = GetUnderLineRect(word); - rcUnderline.left += ptOffset.x; - rcUnderline.right += ptOffset.x; - rcUnderline.top += ptOffset.y; - rcUnderline.bottom += ptOffset.y; - pathUnderline.AppendRect(rcUnderline.left, rcUnderline.bottom, - rcUnderline.right, rcUnderline.top); - - pDevice->DrawPath(&pathUnderline, pUser2Device, NULL, color, 0, - FXFILL_WINDING); - } - } - } - } - - pDevice->RestoreState(); -} - -void IFX_Edit::DrawEdit(CFX_RenderDevice* pDevice, - CFX_Matrix* pUser2Device, - IFX_Edit* pEdit, - FX_COLORREF crTextFill, - FX_COLORREF crTextStroke, - const CFX_FloatRect& rcClip, - const CFX_FloatPoint& ptOffset, - const CPVT_WordRange* pRange, - IFX_SystemHandler* pSystemHandler, - void* pFFLData) { - const bool bContinuous = - pEdit->GetCharArray() == 0 && pEdit->GetCharSpace() <= 0.0f; - FX_WORD SubWord = pEdit->GetPasswordChar(); - FX_FLOAT fFontSize = pEdit->GetFontSize(); - CPVT_WordRange wrSelect = pEdit->GetSelectWordRange(); - int32_t nHorzScale = pEdit->GetHorzScale(); - - FX_COLORREF crCurFill = crTextFill; - FX_COLORREF crOldFill = crCurFill; - - FX_BOOL bSelect = FALSE; - const FX_COLORREF crWhite = ArgbEncode(255, 255, 255, 255); - const FX_COLORREF crSelBK = ArgbEncode(255, 0, 51, 113); - - CFX_ByteTextBuf sTextBuf; - int32_t nFontIndex = -1; - CFX_FloatPoint ptBT(0.0f, 0.0f); - - pDevice->SaveState(); - - if (!rcClip.IsEmpty()) { - CFX_FloatRect rcTemp = rcClip; - pUser2Device->TransformRect(rcTemp); - pDevice->SetClip_Rect(rcTemp.ToFxRect()); - } - - if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator()) { - if (IFX_Edit_FontMap* pFontMap = pEdit->GetFontMap()) { - if (pRange) - pIterator->SetAt(pRange->BeginPos); - else - pIterator->SetAt(0); - - CPVT_WordPlace oldplace; - - while (pIterator->NextWord()) { - CPVT_WordPlace place = pIterator->GetAt(); - if (pRange && place.WordCmp(pRange->EndPos) > 0) - break; - - if (wrSelect.IsExist()) { - bSelect = place.WordCmp(wrSelect.BeginPos) > 0 && - place.WordCmp(wrSelect.EndPos) <= 0; - if (bSelect) { - crCurFill = crWhite; - } else { - crCurFill = crTextFill; - } - } - if (pSystemHandler && pSystemHandler->IsSelectionImplemented()) { - crCurFill = crTextFill; - crOldFill = crCurFill; - } - CPVT_Word word; - if (pIterator->GetWord(word)) { - if (bSelect) { - CPVT_Line line; - pIterator->GetLine(line); - - if (pSystemHandler && pSystemHandler->IsSelectionImplemented()) { - CFX_FloatRect rc(word.ptWord.x, line.ptLine.y + line.fLineDescent, - word.ptWord.x + word.fWidth, - line.ptLine.y + line.fLineAscent); - rc.Intersect(rcClip); - pSystemHandler->OutputSelectedRect(pFFLData, rc); - } else { - CFX_PathData pathSelBK; - pathSelBK.AppendRect(word.ptWord.x, - line.ptLine.y + line.fLineDescent, - word.ptWord.x + word.fWidth, - line.ptLine.y + line.fLineAscent); - - pDevice->DrawPath(&pathSelBK, pUser2Device, NULL, crSelBK, 0, - FXFILL_WINDING); - } - } - - if (bContinuous) { - if (place.LineCmp(oldplace) != 0 || word.nFontIndex != nFontIndex || - crOldFill != crCurFill) { - if (sTextBuf.GetLength() > 0) { - DrawTextString(pDevice, CFX_FloatPoint(ptBT.x + ptOffset.x, - ptBT.y + ptOffset.y), - pFontMap->GetPDFFont(nFontIndex), fFontSize, - pUser2Device, sTextBuf.GetByteString(), - crOldFill, crTextStroke, nHorzScale); - - sTextBuf.Clear(); - } - nFontIndex = word.nFontIndex; - ptBT = word.ptWord; - crOldFill = crCurFill; - } - - sTextBuf << GetPDFWordString(pFontMap, word.nFontIndex, word.Word, - SubWord); - } else { - DrawTextString( - pDevice, CFX_FloatPoint(word.ptWord.x + ptOffset.x, - word.ptWord.y + ptOffset.y), - pFontMap->GetPDFFont(word.nFontIndex), fFontSize, pUser2Device, - GetPDFWordString(pFontMap, word.nFontIndex, word.Word, SubWord), - crCurFill, crTextStroke, nHorzScale); - } - oldplace = place; - } - } - - if (sTextBuf.GetLength() > 0) { - DrawTextString( - pDevice, CFX_FloatPoint(ptBT.x + ptOffset.x, ptBT.y + ptOffset.y), - pFontMap->GetPDFFont(nFontIndex), fFontSize, pUser2Device, - sTextBuf.GetByteString(), crOldFill, crTextStroke, nHorzScale); - } - } - } - - pDevice->RestoreState(); -} - -void IFX_Edit::DrawRichEdit(CFX_RenderDevice* pDevice, - CFX_Matrix* pUser2Device, - IFX_Edit* pEdit, - const CFX_FloatRect& rcClip, - const CFX_FloatPoint& ptOffset, - const CPVT_WordRange* pRange) { - CPVT_WordRange wrSelect = pEdit->GetSelectWordRange(); - - FX_COLORREF crCurText = ArgbEncode(255, 0, 0, 0); - FX_COLORREF crOld = crCurText; - FX_BOOL bSelect = FALSE; - const FX_COLORREF crWhite = ArgbEncode(255, 255, 255, 255); - const FX_COLORREF crSelBK = ArgbEncode(255, 0, 51, 113); - - CFX_ByteTextBuf sTextBuf; - CPVT_WordProps wp; - CFX_FloatPoint ptBT(0.0f, 0.0f); - - pDevice->SaveState(); - - if (!rcClip.IsEmpty()) { - CFX_FloatRect rcTemp = rcClip; - pUser2Device->TransformRect(rcTemp); - pDevice->SetClip_Rect(rcTemp.ToFxRect()); - } - - if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator()) { - if (IFX_Edit_FontMap* pFontMap = pEdit->GetFontMap()) { - if (pRange) - pIterator->SetAt(pRange->BeginPos); - else - pIterator->SetAt(0); - - CPVT_WordPlace oldplace; - - while (pIterator->NextWord()) { - CPVT_WordPlace place = pIterator->GetAt(); - if (pRange && place.WordCmp(pRange->EndPos) > 0) - break; - - CPVT_Word word; - if (pIterator->GetWord(word)) { - word.WordProps.fFontSize = word.fFontSize; - - crCurText = ArgbEncode(255, word.WordProps.dwWordColor); - - if (wrSelect.IsExist()) { - bSelect = place.WordCmp(wrSelect.BeginPos) > 0 && - place.WordCmp(wrSelect.EndPos) <= 0; - if (bSelect) { - crCurText = crWhite; - } - } - - if (bSelect) { - CPVT_Line line; - pIterator->GetLine(line); - - CFX_PathData pathSelBK; - pathSelBK.AppendRect(word.ptWord.x + ptOffset.x, - line.ptLine.y + line.fLineDescent + ptOffset.y, - word.ptWord.x + word.fWidth + ptOffset.x, - line.ptLine.y + line.fLineAscent + ptOffset.y); - - pDevice->DrawPath(&pathSelBK, pUser2Device, NULL, crSelBK, 0, - FXFILL_WINDING); - } - - if (place.LineCmp(oldplace) != 0 || - word.WordProps.fCharSpace > 0.0f || - word.WordProps.nHorzScale != 100 || - FXSYS_memcmp(&word.WordProps, &wp, sizeof(CPVT_WordProps)) != 0 || - crOld != crCurText) { - if (sTextBuf.GetLength() > 0) { - DrawTextString(pDevice, CFX_FloatPoint(ptBT.x + ptOffset.x, - ptBT.y + ptOffset.y), - pFontMap->GetPDFFont(wp.nFontIndex), wp.fFontSize, - pUser2Device, sTextBuf.GetByteString(), crOld, 0, - wp.nHorzScale); - - sTextBuf.Clear(); - } - wp = word.WordProps; - ptBT = word.ptWord; - crOld = crCurText; - } - - sTextBuf << GetPDFWordString(pFontMap, word.WordProps.nFontIndex, - word.Word, 0); - - if (word.WordProps.nWordStyle & PVTWORD_STYLE_UNDERLINE) { - CFX_PathData pathUnderline; - CFX_FloatRect rcUnderline = GetUnderLineRect(word); - pathUnderline.AppendRect(rcUnderline.left, rcUnderline.bottom, - rcUnderline.right, rcUnderline.top); - - pDevice->DrawPath(&pathUnderline, pUser2Device, NULL, crCurText, 0, - FXFILL_WINDING); - } - - if (word.WordProps.nWordStyle & PVTWORD_STYLE_CROSSOUT) { - CFX_PathData pathCrossout; - CFX_FloatRect rcCrossout = GetCrossoutRect(word); - pathCrossout.AppendRect(rcCrossout.left, rcCrossout.bottom, - rcCrossout.right, rcCrossout.top); - - pDevice->DrawPath(&pathCrossout, pUser2Device, NULL, crCurText, 0, - FXFILL_WINDING); - } - - oldplace = place; - } - } - - if (sTextBuf.GetLength() > 0) { - DrawTextString( - pDevice, CFX_FloatPoint(ptBT.x + ptOffset.x, ptBT.y + ptOffset.y), - pFontMap->GetPDFFont(wp.nFontIndex), wp.fFontSize, pUser2Device, - sTextBuf.GetByteString(), crOld, 0, wp.nHorzScale); - } - } - } - - pDevice->RestoreState(); -} - -static void AddRectToPageObjects(CPDF_PageObjectHolder* pObjectHolder, - FX_COLORREF crFill, - const CFX_FloatRect& rcFill) { - std::unique_ptr<CPDF_PathObject> pPathObj(new CPDF_PathObject); - CFX_PathData* pPathData = pPathObj->m_Path.GetModify(); - pPathData->AppendRect(rcFill.left, rcFill.bottom, rcFill.right, rcFill.top); - - FX_FLOAT rgb[3]; - rgb[0] = FXARGB_R(crFill) / 255.0f; - rgb[1] = FXARGB_G(crFill) / 255.0f; - rgb[2] = FXARGB_B(crFill) / 255.0f; - pPathObj->m_ColorState.SetFillColor( - CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB), rgb, 3); - - pPathObj->m_FillType = FXFILL_ALTERNATE; - pPathObj->m_bStroke = FALSE; - pObjectHolder->GetPageObjectList()->push_back(std::move(pPathObj)); -} - -static CPDF_TextObject* AddTextObjToPageObjects( - CPDF_PageObjectHolder* pObjectHolder, - FX_COLORREF crText, - CPDF_Font* pFont, - FX_FLOAT fFontSize, - FX_FLOAT fCharSpace, - int32_t nHorzScale, - const CFX_FloatPoint& point, - const CFX_ByteString& text) { - std::unique_ptr<CPDF_TextObject> pTxtObj(new CPDF_TextObject); - CPDF_TextStateData* pTextStateData = pTxtObj->m_TextState.GetModify(); - pTextStateData->m_pFont = pFont; - pTextStateData->m_FontSize = fFontSize; - pTextStateData->m_CharSpace = fCharSpace; - pTextStateData->m_WordSpace = 0; - pTextStateData->m_TextMode = 0; - pTextStateData->m_Matrix[0] = nHorzScale / 100.0f; - pTextStateData->m_Matrix[1] = 0; - pTextStateData->m_Matrix[2] = 0; - pTextStateData->m_Matrix[3] = 1; - - FX_FLOAT rgb[3]; - rgb[0] = FXARGB_R(crText) / 255.0f; - rgb[1] = FXARGB_G(crText) / 255.0f; - rgb[2] = FXARGB_B(crText) / 255.0f; - pTxtObj->m_ColorState.SetFillColor( - CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB), rgb, 3); - pTxtObj->m_ColorState.SetStrokeColor( - CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB), rgb, 3); - - pTxtObj->SetPosition(point.x, point.y); - pTxtObj->SetText(text); - - CPDF_TextObject* pRet = pTxtObj.get(); - pObjectHolder->GetPageObjectList()->push_back(std::move(pTxtObj)); - return pRet; -} - -void IFX_Edit::GeneratePageObjects( - CPDF_PageObjectHolder* pObjectHolder, - IFX_Edit* pEdit, - const CFX_FloatPoint& ptOffset, - const CPVT_WordRange* pRange, - FX_COLORREF crText, - CFX_ArrayTemplate<CPDF_TextObject*>& ObjArray) { - FX_FLOAT fFontSize = pEdit->GetFontSize(); - - int32_t nOldFontIndex = -1; - - CFX_ByteTextBuf sTextBuf; - CFX_FloatPoint ptBT(0.0f, 0.0f); - - ObjArray.RemoveAll(); - - if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator()) { - if (IFX_Edit_FontMap* pFontMap = pEdit->GetFontMap()) { - if (pRange) - pIterator->SetAt(pRange->BeginPos); - else - pIterator->SetAt(0); - - CPVT_WordPlace oldplace; - - while (pIterator->NextWord()) { - CPVT_WordPlace place = pIterator->GetAt(); - if (pRange && place.WordCmp(pRange->EndPos) > 0) - break; - - CPVT_Word word; - if (pIterator->GetWord(word)) { - if (place.LineCmp(oldplace) != 0 || - nOldFontIndex != word.nFontIndex) { - if (sTextBuf.GetLength() > 0) { - ObjArray.Add(AddTextObjToPageObjects( - pObjectHolder, crText, pFontMap->GetPDFFont(nOldFontIndex), - fFontSize, 0.0f, 100, - CFX_FloatPoint(ptBT.x + ptOffset.x, ptBT.y + ptOffset.y), - sTextBuf.GetByteString())); - - sTextBuf.Clear(); - } - - ptBT = word.ptWord; - nOldFontIndex = word.nFontIndex; - } - - sTextBuf << GetPDFWordString(pFontMap, word.nFontIndex, word.Word, 0); - oldplace = place; - } - } - - if (sTextBuf.GetLength() > 0) { - ObjArray.Add(AddTextObjToPageObjects( - pObjectHolder, crText, pFontMap->GetPDFFont(nOldFontIndex), - fFontSize, 0.0f, 100, - CFX_FloatPoint(ptBT.x + ptOffset.x, ptBT.y + ptOffset.y), - sTextBuf.GetByteString())); - } - } - } -} - -void IFX_Edit::GenerateRichPageObjects( - CPDF_PageObjectHolder* pObjectHolder, - IFX_Edit* pEdit, - const CFX_FloatPoint& ptOffset, - const CPVT_WordRange* pRange, - CFX_ArrayTemplate<CPDF_TextObject*>& ObjArray) { - FX_COLORREF crCurText = ArgbEncode(255, 0, 0, 0); - FX_COLORREF crOld = crCurText; - - CFX_ByteTextBuf sTextBuf; - CPVT_WordProps wp; - CFX_FloatPoint ptBT(0.0f, 0.0f); - - ObjArray.RemoveAll(); - - if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator()) { - if (IFX_Edit_FontMap* pFontMap = pEdit->GetFontMap()) { - if (pRange) - pIterator->SetAt(pRange->BeginPos); - else - pIterator->SetAt(0); - - CPVT_WordPlace oldplace; - - while (pIterator->NextWord()) { - CPVT_WordPlace place = pIterator->GetAt(); - if (pRange && place.WordCmp(pRange->EndPos) > 0) - break; - - CPVT_Word word; - if (pIterator->GetWord(word)) { - word.WordProps.fFontSize = word.fFontSize; - - crCurText = ArgbEncode(255, word.WordProps.dwWordColor); - - if (place.LineCmp(oldplace) != 0 || - word.WordProps.fCharSpace > 0.0f || - word.WordProps.nHorzScale != 100 || - FXSYS_memcmp(&word.WordProps, &wp, sizeof(CPVT_WordProps)) != 0 || - crOld != crCurText) { - if (sTextBuf.GetLength() > 0) { - ObjArray.Add(AddTextObjToPageObjects( - pObjectHolder, crOld, pFontMap->GetPDFFont(wp.nFontIndex), - wp.fFontSize, wp.fCharSpace, wp.nHorzScale, - CFX_FloatPoint(ptBT.x + ptOffset.x, ptBT.y + ptOffset.y), - sTextBuf.GetByteString())); - - sTextBuf.Clear(); - } - - wp = word.WordProps; - ptBT = word.ptWord; - crOld = crCurText; - } - - sTextBuf << GetPDFWordString(pFontMap, word.WordProps.nFontIndex, - word.Word, 0); - - if (word.WordProps.nWordStyle & PVTWORD_STYLE_UNDERLINE) { - CFX_FloatRect rcUnderline = GetUnderLineRect(word); - rcUnderline.left += ptOffset.x; - rcUnderline.right += ptOffset.x; - rcUnderline.top += ptOffset.y; - rcUnderline.bottom += ptOffset.y; - - AddRectToPageObjects(pObjectHolder, crCurText, rcUnderline); - } - - if (word.WordProps.nWordStyle & PVTWORD_STYLE_CROSSOUT) { - CFX_FloatRect rcCrossout = GetCrossoutRect(word); - rcCrossout.left += ptOffset.x; - rcCrossout.right += ptOffset.x; - rcCrossout.top += ptOffset.y; - rcCrossout.bottom += ptOffset.y; - - AddRectToPageObjects(pObjectHolder, crCurText, rcCrossout); - } - - oldplace = place; - } - } - - if (sTextBuf.GetLength() > 0) { - ObjArray.Add(AddTextObjToPageObjects( - pObjectHolder, crOld, pFontMap->GetPDFFont(wp.nFontIndex), - wp.fFontSize, wp.fCharSpace, wp.nHorzScale, - CFX_FloatPoint(ptBT.x + ptOffset.x, ptBT.y + ptOffset.y), - sTextBuf.GetByteString())); - } - } - } -} - -void IFX_Edit::GenerateUnderlineObjects(CPDF_PageObjectHolder* pObjectHolder, - IFX_Edit* pEdit, - const CFX_FloatPoint& ptOffset, - const CPVT_WordRange* pRange, - FX_COLORREF color) { - if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator()) { - if (pEdit->GetFontMap()) { - if (pRange) - pIterator->SetAt(pRange->BeginPos); - else - pIterator->SetAt(0); - - CPVT_WordPlace oldplace; - - while (pIterator->NextWord()) { - CPVT_WordPlace place = pIterator->GetAt(); - if (pRange && place.WordCmp(pRange->EndPos) > 0) - break; - - CPVT_Word word; - if (pIterator->GetWord(word)) { - CFX_FloatRect rcUnderline = GetUnderLineRect(word); - rcUnderline.left += ptOffset.x; - rcUnderline.right += ptOffset.x; - rcUnderline.top += ptOffset.y; - rcUnderline.bottom += ptOffset.y; - AddRectToPageObjects(pObjectHolder, color, rcUnderline); - } - } - } - } -} diff --git a/fpdfsdk/src/javascript/Consts.cpp b/fpdfsdk/src/javascript/Consts.cpp deleted file mode 100644 index b7cc2d0a46..0000000000 --- a/fpdfsdk/src/javascript/Consts.cpp +++ /dev/null @@ -1,206 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "fpdfsdk/src/javascript/Consts.h" - -#include "fpdfsdk/include/javascript/IJavaScript.h" -#include "fpdfsdk/src/javascript/JS_Define.h" -#include "fpdfsdk/src/javascript/JS_Object.h" -#include "fpdfsdk/src/javascript/JS_Value.h" - -BEGIN_JS_STATIC_CONST(CJS_Border) -JS_STATIC_CONST_ENTRY_STRING(L"s", L"solid") -JS_STATIC_CONST_ENTRY_STRING(L"b", L"beveled") -JS_STATIC_CONST_ENTRY_STRING(L"d", L"dashed") -JS_STATIC_CONST_ENTRY_STRING(L"i", L"inset") -JS_STATIC_CONST_ENTRY_STRING(L"u", L"underline") -END_JS_STATIC_CONST() -IMPLEMENT_JS_CLASS_CONST(CJS_Border, border) - -BEGIN_JS_STATIC_CONST(CJS_Display) -JS_STATIC_CONST_ENTRY_NUMBER(L"visible", 0) -JS_STATIC_CONST_ENTRY_NUMBER(L"hidden", 1) -JS_STATIC_CONST_ENTRY_NUMBER(L"noPrint", 2) -JS_STATIC_CONST_ENTRY_NUMBER(L"noView", 3) -END_JS_STATIC_CONST() -IMPLEMENT_JS_CLASS_CONST(CJS_Display, display) - -BEGIN_JS_STATIC_CONST(CJS_Font) -JS_STATIC_CONST_ENTRY_STRING(L"Times", L"Times-Roman") -JS_STATIC_CONST_ENTRY_STRING(L"TimesB", L"Times-Bold") -JS_STATIC_CONST_ENTRY_STRING(L"TimesI", L"Times-Italic") -JS_STATIC_CONST_ENTRY_STRING(L"TimesBI", L"Times-BoldItalic") -JS_STATIC_CONST_ENTRY_STRING(L"Helv", L"Helvetica") -JS_STATIC_CONST_ENTRY_STRING(L"HelvB", L"Helvetica-Bold") -JS_STATIC_CONST_ENTRY_STRING(L"HelvI", L"Helvetica-Oblique") -JS_STATIC_CONST_ENTRY_STRING(L"HelvBI", L"Helvetica-BoldOblique") -JS_STATIC_CONST_ENTRY_STRING(L"Cour", L"Courier") -JS_STATIC_CONST_ENTRY_STRING(L"CourB", L"Courier-Bold") -JS_STATIC_CONST_ENTRY_STRING(L"CourI", L"Courier-Oblique") -JS_STATIC_CONST_ENTRY_STRING(L"CourBI", L"Courier-BoldOblique") -JS_STATIC_CONST_ENTRY_STRING(L"Symbol", L"Symbol") -JS_STATIC_CONST_ENTRY_STRING(L"ZapfD", L"ZapfDingbats") -END_JS_STATIC_CONST() -IMPLEMENT_JS_CLASS_CONST(CJS_Font, font) - -BEGIN_JS_STATIC_CONST(CJS_Highlight) -JS_STATIC_CONST_ENTRY_STRING(L"n", L"none") -JS_STATIC_CONST_ENTRY_STRING(L"i", L"invert") -JS_STATIC_CONST_ENTRY_STRING(L"p", L"push") -JS_STATIC_CONST_ENTRY_STRING(L"o", L"outline") -END_JS_STATIC_CONST() -IMPLEMENT_JS_CLASS_CONST(CJS_Highlight, highlight) - -BEGIN_JS_STATIC_CONST(CJS_Position) -JS_STATIC_CONST_ENTRY_NUMBER(L"textOnly", 0) -JS_STATIC_CONST_ENTRY_NUMBER(L"iconOnly", 1) -JS_STATIC_CONST_ENTRY_NUMBER(L"iconTextV", 2) -JS_STATIC_CONST_ENTRY_NUMBER(L"textIconV", 3) -JS_STATIC_CONST_ENTRY_NUMBER(L"iconTextH", 4) -JS_STATIC_CONST_ENTRY_NUMBER(L"textIconH", 5) -JS_STATIC_CONST_ENTRY_NUMBER(L"overlay", 6) -END_JS_STATIC_CONST() -IMPLEMENT_JS_CLASS_CONST(CJS_Position, position) - -BEGIN_JS_STATIC_CONST(CJS_ScaleHow) -JS_STATIC_CONST_ENTRY_NUMBER(L"proportional", 0) -JS_STATIC_CONST_ENTRY_NUMBER(L"anamorphic", 1) -END_JS_STATIC_CONST() -IMPLEMENT_JS_CLASS_CONST(CJS_ScaleHow, scaleHow) - -BEGIN_JS_STATIC_CONST(CJS_ScaleWhen) -JS_STATIC_CONST_ENTRY_NUMBER(L"always", 0) -JS_STATIC_CONST_ENTRY_NUMBER(L"never", 1) -JS_STATIC_CONST_ENTRY_NUMBER(L"tooBig", 2) -JS_STATIC_CONST_ENTRY_NUMBER(L"tooSmall", 3) -END_JS_STATIC_CONST() -IMPLEMENT_JS_CLASS_CONST(CJS_ScaleWhen, scaleWhen) - -BEGIN_JS_STATIC_CONST(CJS_Style) -JS_STATIC_CONST_ENTRY_STRING(L"ch", L"check") -JS_STATIC_CONST_ENTRY_STRING(L"cr", L"cross") -JS_STATIC_CONST_ENTRY_STRING(L"di", L"diamond") -JS_STATIC_CONST_ENTRY_STRING(L"ci", L"circle") -JS_STATIC_CONST_ENTRY_STRING(L"st", L"star") -JS_STATIC_CONST_ENTRY_STRING(L"sq", L"square") -END_JS_STATIC_CONST() -IMPLEMENT_JS_CLASS_CONST(CJS_Style, style) - -BEGIN_JS_STATIC_CONST(CJS_Zoomtype) -JS_STATIC_CONST_ENTRY_STRING(L"none", L"NoVary") -JS_STATIC_CONST_ENTRY_STRING(L"fitP", L"FitPage") -JS_STATIC_CONST_ENTRY_STRING(L"fitW", L"FitWidth") -JS_STATIC_CONST_ENTRY_STRING(L"fitH", L"FitHeight") -JS_STATIC_CONST_ENTRY_STRING(L"fitV", L"FitVisibleWidth") -JS_STATIC_CONST_ENTRY_STRING(L"pref", L"Preferred") -JS_STATIC_CONST_ENTRY_STRING(L"refW", L"ReflowWidth") -END_JS_STATIC_CONST() -IMPLEMENT_JS_CLASS_CONST(CJS_Zoomtype, zoomtype) - -#define GLOBAL_STRING(rt, name, value) \ - FXJS_DefineGlobalConst( \ - (rt)->GetIsolate(), (name), \ - [](const v8::FunctionCallbackInfo<v8::Value>& info) { \ - info.GetReturnValue().Set(FXJS_NewString(info.GetIsolate(), (value))); \ - }) - -void CJS_GlobalConsts::DefineJSObjects(CJS_Runtime* pRuntime) { - GLOBAL_STRING(pRuntime, L"IDS_GREATER_THAN", - L"Invalid value: must be greater than or equal to % s."); - - GLOBAL_STRING(pRuntime, L"IDS_GT_AND_LT", - L"Invalid value: must be greater than or equal to % s " - L"and less than or equal to % s."); - - GLOBAL_STRING(pRuntime, L"IDS_LESS_THAN", - L"Invalid value: must be less than or equal to % s."); - - GLOBAL_STRING(pRuntime, L"IDS_INVALID_MONTH", L"**Invalid**"); - GLOBAL_STRING( - pRuntime, L"IDS_INVALID_DATE", - L"Invalid date / time: please ensure that the date / time exists.Field"); - - GLOBAL_STRING(pRuntime, L"IDS_INVALID_VALUE", - L"The value entered does not match the format of the field"); - - GLOBAL_STRING(pRuntime, L"IDS_AM", L"am"); - GLOBAL_STRING(pRuntime, L"IDS_PM", L"pm"); - GLOBAL_STRING(pRuntime, L"IDS_MONTH_INFO", - L"January[1] February[2] March[3] April[4] May[5] " - L"June[6] July[7] August[8] September[9] October[10] " - L"November[11] December[12] Sept[9] Jan[1] Feb[2] Mar[3] " - L"Apr[4] Jun[6] Jul[7] Aug[8] Sep[9] Oct[10] Nov[11] " - L"Dec[12]"); - - GLOBAL_STRING(pRuntime, L"IDS_STARTUP_CONSOLE_MSG", L"** ^ _ ^ **"); -} - -#define GLOBAL_ARRAY(rt, name, ...) \ - { \ - const FX_WCHAR* values[] = {__VA_ARGS__}; \ - v8::Local<v8::Array> array = FXJS_NewArray((rt)->GetIsolate()); \ - for (size_t i = 0; i < FX_ArraySize(values); ++i) \ - array->Set(i, FXJS_NewString((rt)->GetIsolate(), values[i])); \ - rt->SetConstArray(name, array); \ - FXJS_DefineGlobalConst( \ - (rt)->GetIsolate(), (name), \ - [](const v8::FunctionCallbackInfo<v8::Value>& info) { \ - CJS_Runtime* pRuntime = static_cast<CJS_Runtime*>( \ - FXJS_GetRuntimeFromIsolate(info.GetIsolate())); \ - if (pRuntime) \ - info.GetReturnValue().Set(pRuntime->GetConstArray(name)); \ - }); \ - } - -void CJS_GlobalArrays::DefineJSObjects(CJS_Runtime* pRuntime) { - GLOBAL_ARRAY(pRuntime, L"RE_NUMBER_ENTRY_DOT_SEP", L"[+-]?\\d*\\.?\\d*"); - GLOBAL_ARRAY(pRuntime, L"RE_NUMBER_COMMIT_DOT_SEP", - L"[+-]?\\d+(\\.\\d+)?", // -1.0 or -1 - L"[+-]?\\.\\d+", // -.1 - L"[+-]?\\d+\\."); // -1. - - GLOBAL_ARRAY(pRuntime, L"RE_NUMBER_ENTRY_COMMA_SEP", L"[+-]?\\d*,?\\d*"); - GLOBAL_ARRAY(pRuntime, L"RE_NUMBER_COMMIT_COMMA_SEP", - L"[+-]?\\d+([.,]\\d+)?", // -1,0 or -1 - L"[+-]?[.,]\\d+", // -,1 - L"[+-]?\\d+[.,]"); // -1, - - GLOBAL_ARRAY(pRuntime, L"RE_ZIP_ENTRY", L"\\d{0,5}"); - GLOBAL_ARRAY(pRuntime, L"RE_ZIP_COMMIT", L"\\d{5}"); - GLOBAL_ARRAY(pRuntime, L"RE_ZIP4_ENTRY", L"\\d{0,5}(\\.|[- ])?\\d{0,4}"); - GLOBAL_ARRAY(pRuntime, L"RE_ZIP4_COMMIT", L"\\d{5}(\\.|[- ])?\\d{4}"); - GLOBAL_ARRAY(pRuntime, L"RE_PHONE_ENTRY", - // 555-1234 or 408 555-1234 - L"\\d{0,3}(\\.|[- ])?\\d{0,3}(\\.|[- ])?\\d{0,4}", - - // (408 - L"\\(\\d{0,3}", - - // (408) 555-1234 - // (allow the addition of parens as an afterthought) - L"\\(\\d{0,3}\\)(\\.|[- ])?\\d{0,3}(\\.|[- ])?\\d{0,4}", - - // (408 555-1234 - L"\\(\\d{0,3}(\\.|[- ])?\\d{0,3}(\\.|[- ])?\\d{0,4}", - - // 408) 555-1234 - L"\\d{0,3}\\)(\\.|[- ])?\\d{0,3}(\\.|[- ])?\\d{0,4}", - - // international - L"011(\\.|[- \\d])*"); - - GLOBAL_ARRAY( - pRuntime, L"RE_PHONE_COMMIT", L"\\d{3}(\\.|[- ])?\\d{4}", // 555-1234 - L"\\d{3}(\\.|[- ])?\\d{3}(\\.|[- ])?\\d{4}", // 408 555-1234 - L"\\(\\d{3}\\)(\\.|[- ])?\\d{3}(\\.|[- ])?\\d{4}", // (408) 555-1234 - L"011(\\.|[- \\d])*"); // international - - GLOBAL_ARRAY(pRuntime, L"RE_SSN_ENTRY", - L"\\d{0,3}(\\.|[- ])?\\d{0,2}(\\.|[- ])?\\d{0,4}"); - - GLOBAL_ARRAY(pRuntime, L"RE_SSN_COMMIT", - L"\\d{3}(\\.|[- ])?\\d{2}(\\.|[- ])?\\d{4}"); -} diff --git a/fpdfsdk/src/javascript/Consts.h b/fpdfsdk/src/javascript/Consts.h deleted file mode 100644 index 6cd1d1d809..0000000000 --- a/fpdfsdk/src/javascript/Consts.h +++ /dev/null @@ -1,116 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef FPDFSDK_SRC_JAVASCRIPT_CONSTS_H_ -#define FPDFSDK_SRC_JAVASCRIPT_CONSTS_H_ - -#include "fpdfsdk/src/javascript/JS_Define.h" - -/* ------------------------------ border ------------------------------ */ - -class CJS_Border : public CJS_Object { - public: - explicit CJS_Border(v8::Local<v8::Object> pObject) : CJS_Object(pObject) {} - ~CJS_Border() override {} - - DECLARE_JS_CLASS_CONST(); -}; - -/* ------------------------------ display ------------------------------ */ - -class CJS_Display : public CJS_Object { - public: - explicit CJS_Display(v8::Local<v8::Object> pObject) : CJS_Object(pObject) {} - ~CJS_Display() override {} - - DECLARE_JS_CLASS_CONST(); -}; - -/* ------------------------------ font ------------------------------ */ - -class CJS_Font : public CJS_Object { - public: - explicit CJS_Font(v8::Local<v8::Object> pObject) : CJS_Object(pObject) {} - ~CJS_Font() override {} - - DECLARE_JS_CLASS_CONST(); -}; - -/* ------------------------------ highlight ------------------------------ */ - -class CJS_Highlight : public CJS_Object { - public: - explicit CJS_Highlight(v8::Local<v8::Object> pObject) : CJS_Object(pObject) {} - ~CJS_Highlight() override {} - - DECLARE_JS_CLASS_CONST(); -}; - -/* ------------------------------ position ------------------------------ */ - -class CJS_Position : public CJS_Object { - public: - explicit CJS_Position(v8::Local<v8::Object> pObject) : CJS_Object(pObject) {} - ~CJS_Position() override {} - - DECLARE_JS_CLASS_CONST(); -}; - -/* ------------------------------ scaleHow ------------------------------ */ - -class CJS_ScaleHow : public CJS_Object { - public: - explicit CJS_ScaleHow(v8::Local<v8::Object> pObject) : CJS_Object(pObject) {} - ~CJS_ScaleHow() override {} - - DECLARE_JS_CLASS_CONST(); -}; - -/* ------------------------------ scaleWhen ------------------------------ */ - -class CJS_ScaleWhen : public CJS_Object { - public: - explicit CJS_ScaleWhen(v8::Local<v8::Object> pObject) : CJS_Object(pObject) {} - ~CJS_ScaleWhen() override {} - - DECLARE_JS_CLASS_CONST(); -}; - -/* ------------------------------ style ------------------------------ */ - -class CJS_Style : public CJS_Object { - public: - explicit CJS_Style(v8::Local<v8::Object> pObject) : CJS_Object(pObject) {} - ~CJS_Style() override {} - - DECLARE_JS_CLASS_CONST(); -}; - -/* ------------------------------ zoomtype ------------------------------ */ - -class CJS_Zoomtype : public CJS_Object { - public: - explicit CJS_Zoomtype(v8::Local<v8::Object> pObject) : CJS_Object(pObject) {} - ~CJS_Zoomtype() override {} - - DECLARE_JS_CLASS_CONST(); -}; - -/* ------------------------------ CJS_GlobalConsts -------------------------- */ - -class CJS_GlobalConsts : public CJS_Object { - public: - static void DefineJSObjects(CJS_Runtime* pRuntime); -}; - -/* ------------------------------ CJS_GlobalArrays -------------------------- */ - -class CJS_GlobalArrays : public CJS_Object { - public: - static void DefineJSObjects(CJS_Runtime* pRuntmie); -}; - -#endif // FPDFSDK_SRC_JAVASCRIPT_CONSTS_H_ diff --git a/fpdfsdk/src/javascript/Document.cpp b/fpdfsdk/src/javascript/Document.cpp deleted file mode 100644 index 672a3a3874..0000000000 --- a/fpdfsdk/src/javascript/Document.cpp +++ /dev/null @@ -1,1633 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "fpdfsdk/src/javascript/Document.h" - -#include <vector> - -#include "core/include/fpdfapi/cpdf_document.h" -#include "fpdfsdk/include/fsdk_mgr.h" -#include "fpdfsdk/include/javascript/IJavaScript.h" -#include "fpdfsdk/src/javascript/Field.h" -#include "fpdfsdk/src/javascript/Icon.h" -#include "fpdfsdk/src/javascript/JS_Context.h" -#include "fpdfsdk/src/javascript/JS_Define.h" -#include "fpdfsdk/src/javascript/JS_EventHandler.h" -#include "fpdfsdk/src/javascript/JS_Object.h" -#include "fpdfsdk/src/javascript/JS_Runtime.h" -#include "fpdfsdk/src/javascript/JS_Value.h" -#include "fpdfsdk/src/javascript/app.h" -#include "fpdfsdk/src/javascript/resource.h" -#include "third_party/base/numerics/safe_math.h" - -static v8::Isolate* GetIsolate(IJS_Context* cc) { - CJS_Context* pContext = (CJS_Context*)cc; - CJS_Runtime* pRuntime = pContext->GetJSRuntime(); - return pRuntime->GetIsolate(); -} - -BEGIN_JS_STATIC_CONST(CJS_PrintParamsObj) -END_JS_STATIC_CONST() - -BEGIN_JS_STATIC_PROP(CJS_PrintParamsObj) -END_JS_STATIC_PROP() - -BEGIN_JS_STATIC_METHOD(CJS_PrintParamsObj) -END_JS_STATIC_METHOD() - -IMPLEMENT_JS_CLASS(CJS_PrintParamsObj, PrintParamsObj) - -PrintParamsObj::PrintParamsObj(CJS_Object* pJSObject) - : CJS_EmbedObj(pJSObject) { - bUI = TRUE; - nStart = 0; - nEnd = 0; - bSilent = FALSE; - bShrinkToFit = FALSE; - bPrintAsImage = FALSE; - bReverse = FALSE; - bAnnotations = TRUE; -} - -/* ---------------------- Document ---------------------- */ - -#define MINWIDTH 5.0f -#define MINHEIGHT 5.0f - -BEGIN_JS_STATIC_CONST(CJS_Document) -END_JS_STATIC_CONST() - -BEGIN_JS_STATIC_PROP(CJS_Document) -JS_STATIC_PROP_ENTRY(ADBE) -JS_STATIC_PROP_ENTRY(author) -JS_STATIC_PROP_ENTRY(baseURL) -JS_STATIC_PROP_ENTRY(bookmarkRoot) -JS_STATIC_PROP_ENTRY(calculate) -JS_STATIC_PROP_ENTRY(Collab) -JS_STATIC_PROP_ENTRY(creationDate) -JS_STATIC_PROP_ENTRY(creator) -JS_STATIC_PROP_ENTRY(delay) -JS_STATIC_PROP_ENTRY(dirty) -JS_STATIC_PROP_ENTRY(documentFileName) -JS_STATIC_PROP_ENTRY(external) -JS_STATIC_PROP_ENTRY(filesize) -JS_STATIC_PROP_ENTRY(icons) -JS_STATIC_PROP_ENTRY(info) -JS_STATIC_PROP_ENTRY(keywords) -JS_STATIC_PROP_ENTRY(layout) -JS_STATIC_PROP_ENTRY(media) -JS_STATIC_PROP_ENTRY(modDate) -JS_STATIC_PROP_ENTRY(mouseX) -JS_STATIC_PROP_ENTRY(mouseY) -JS_STATIC_PROP_ENTRY(numFields) -JS_STATIC_PROP_ENTRY(numPages) -JS_STATIC_PROP_ENTRY(pageNum) -JS_STATIC_PROP_ENTRY(pageWindowRect) -JS_STATIC_PROP_ENTRY(path) -JS_STATIC_PROP_ENTRY(producer) -JS_STATIC_PROP_ENTRY(subject) -JS_STATIC_PROP_ENTRY(title) -JS_STATIC_PROP_ENTRY(zoom) -JS_STATIC_PROP_ENTRY(zoomType) -END_JS_STATIC_PROP() - -BEGIN_JS_STATIC_METHOD(CJS_Document) -JS_STATIC_METHOD_ENTRY(addAnnot) -JS_STATIC_METHOD_ENTRY(addField) -JS_STATIC_METHOD_ENTRY(addLink) -JS_STATIC_METHOD_ENTRY(addIcon) -JS_STATIC_METHOD_ENTRY(calculateNow) -JS_STATIC_METHOD_ENTRY(closeDoc) -JS_STATIC_METHOD_ENTRY(createDataObject) -JS_STATIC_METHOD_ENTRY(deletePages) -JS_STATIC_METHOD_ENTRY(exportAsText) -JS_STATIC_METHOD_ENTRY(exportAsFDF) -JS_STATIC_METHOD_ENTRY(exportAsXFDF) -JS_STATIC_METHOD_ENTRY(extractPages) -JS_STATIC_METHOD_ENTRY(getAnnot) -JS_STATIC_METHOD_ENTRY(getAnnots) -JS_STATIC_METHOD_ENTRY(getAnnot3D) -JS_STATIC_METHOD_ENTRY(getAnnots3D) -JS_STATIC_METHOD_ENTRY(getField) -JS_STATIC_METHOD_ENTRY(getIcon) -JS_STATIC_METHOD_ENTRY(getLinks) -JS_STATIC_METHOD_ENTRY(getNthFieldName) -JS_STATIC_METHOD_ENTRY(getOCGs) -JS_STATIC_METHOD_ENTRY(getPageBox) -JS_STATIC_METHOD_ENTRY(getPageNthWord) -JS_STATIC_METHOD_ENTRY(getPageNthWordQuads) -JS_STATIC_METHOD_ENTRY(getPageNumWords) -JS_STATIC_METHOD_ENTRY(getPrintParams) -JS_STATIC_METHOD_ENTRY(getURL) -JS_STATIC_METHOD_ENTRY(importAnFDF) -JS_STATIC_METHOD_ENTRY(importAnXFDF) -JS_STATIC_METHOD_ENTRY(importTextData) -JS_STATIC_METHOD_ENTRY(insertPages) -JS_STATIC_METHOD_ENTRY(mailForm) -JS_STATIC_METHOD_ENTRY(print) -JS_STATIC_METHOD_ENTRY(removeField) -JS_STATIC_METHOD_ENTRY(replacePages) -JS_STATIC_METHOD_ENTRY(resetForm) -JS_STATIC_METHOD_ENTRY(removeIcon) -JS_STATIC_METHOD_ENTRY(saveAs) -JS_STATIC_METHOD_ENTRY(submitForm) -JS_STATIC_METHOD_ENTRY(mailDoc) -END_JS_STATIC_METHOD() - -IMPLEMENT_JS_CLASS(CJS_Document, Document) - -void CJS_Document::InitInstance(IJS_Runtime* pIRuntime) { - CJS_Runtime* pRuntime = static_cast<CJS_Runtime*>(pIRuntime); - Document* pDoc = static_cast<Document*>(GetEmbedObject()); - pDoc->AttachDoc(pRuntime->GetReaderDocument()); - pDoc->SetIsolate(pRuntime->GetIsolate()); -} - -/* --------------------------------- Document --------------------------------- - */ - -Document::Document(CJS_Object* pJSObject) - : CJS_EmbedObj(pJSObject), - m_isolate(NULL), - m_pDocument(NULL), - m_cwBaseURL(L""), - m_bDelay(FALSE) {} - -Document::~Document() { - for (int i = 0; i < m_DelayData.GetSize(); i++) { - delete m_DelayData.GetAt(i); - } - - m_DelayData.RemoveAll(); -} - -// the total number of fileds in document. -FX_BOOL Document::numFields(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - if (vp.IsSetting()) { - CJS_Context* pContext = static_cast<CJS_Context*>(cc); - sError = JSGetStringFromID(pContext, IDS_STRING_JSREADONLY); - return FALSE; - } - CPDFSDK_InterForm* pInterForm = m_pDocument->GetInterForm(); - CPDF_InterForm* pPDFForm = pInterForm->GetInterForm(); - vp << (int)pPDFForm->CountFields(); - return TRUE; -} - -FX_BOOL Document::dirty(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - if (vp.IsGetting()) { - if (m_pDocument->GetChangeMark()) - vp << true; - else - vp << false; - } else { - bool bChanged = false; - - vp >> bChanged; - - if (bChanged) - m_pDocument->SetChangeMark(); - else - m_pDocument->ClearChangeMark(); - } - - return TRUE; -} - -FX_BOOL Document::ADBE(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - if (vp.IsGetting()) { - vp.SetNull(); - } else { - } - - return TRUE; -} - -FX_BOOL Document::pageNum(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - if (vp.IsGetting()) { - if (CPDFSDK_PageView* pPageView = m_pDocument->GetCurrentView()) { - vp << pPageView->GetPageIndex(); - } - } else { - int iPageCount = m_pDocument->GetPageCount(); - int iPageNum = 0; - vp >> iPageNum; - - CPDFDoc_Environment* pEnv = m_pDocument->GetEnv(); - if (iPageNum >= 0 && iPageNum < iPageCount) { - pEnv->JS_docgotoPage(iPageNum); - } else if (iPageNum >= iPageCount) { - pEnv->JS_docgotoPage(iPageCount - 1); - } else if (iPageNum < 0) { - pEnv->JS_docgotoPage(0); - } - } - - return TRUE; -} - -FX_BOOL Document::addAnnot(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - // Not supported. - return TRUE; -} - -FX_BOOL Document::addField(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - // Not supported. - return TRUE; -} - -FX_BOOL Document::exportAsText(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - // Unsafe, not supported. - return TRUE; -} - -FX_BOOL Document::exportAsFDF(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - // Unsafe, not supported. - return TRUE; -} - -FX_BOOL Document::exportAsXFDF(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - // Unsafe, not supported. - return TRUE; -} - -// Maps a field object in PDF document to a JavaScript variable -// comment: -// note: the paremter cName, this is clue how to treat if the cName is not a -// valiable filed name in this document - -FX_BOOL Document::getField(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - CJS_Context* pContext = (CJS_Context*)cc; - if (params.size() < 1) { - sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR); - return FALSE; - } - - CFX_WideString wideName = params[0].ToCFXWideString(); - - CPDFSDK_InterForm* pInterForm = m_pDocument->GetInterForm(); - CPDF_InterForm* pPDFForm = pInterForm->GetInterForm(); - if (pPDFForm->CountFields(wideName) <= 0) { - vRet.SetNull(); - return TRUE; - } - - CJS_Runtime* pRuntime = pContext->GetJSRuntime(); - v8::Local<v8::Object> pFieldObj = FXJS_NewFxDynamicObj( - pRuntime->GetIsolate(), pRuntime, CJS_Field::g_nObjDefnID); - - v8::Isolate* isolate = GetIsolate(cc); - CJS_Field* pJSField = (CJS_Field*)FXJS_GetPrivate(isolate, pFieldObj); - Field* pField = (Field*)pJSField->GetEmbedObject(); - pField->AttachField(this, wideName); - - vRet = pJSField; - return TRUE; -} - -// Gets the name of the nth field in the document -FX_BOOL Document::getNthFieldName(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - CJS_Context* pContext = (CJS_Context*)cc; - if (params.size() != 1) { - sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR); - return FALSE; - } - - int nIndex = params[0].ToInt(); - if (nIndex < 0) { - sError = JSGetStringFromID(pContext, IDS_STRING_JSVALUEERROR); - return FALSE; - } - - CPDFSDK_InterForm* pInterForm = m_pDocument->GetInterForm(); - CPDF_InterForm* pPDFForm = pInterForm->GetInterForm(); - CPDF_FormField* pField = pPDFForm->GetField(nIndex); - if (!pField) - return FALSE; - - vRet = pField->GetFullName().c_str(); - return TRUE; -} - -FX_BOOL Document::importAnFDF(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - // Unsafe, not supported. - return TRUE; -} - -FX_BOOL Document::importAnXFDF(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - // Unsafe, not supported. - return TRUE; -} - -FX_BOOL Document::importTextData(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - // Unsafe, not supported. - return TRUE; -} - -// exports the form data and mails the resulting fdf file as an attachment to -// all recipients. -// comment: need reader supports -// note: -// int CPDFSDK_Document::mailForm(FX_BOOL bUI,String cto,string ccc,string -// cbcc,string cSubject,string cms); - -FX_BOOL Document::mailForm(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - if (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS)) - return FALSE; - - int iLength = params.size(); - - FX_BOOL bUI = iLength > 0 ? params[0].ToBool() : TRUE; - CFX_WideString cTo = iLength > 1 ? params[1].ToCFXWideString() : L""; - CFX_WideString cCc = iLength > 2 ? params[2].ToCFXWideString() : L""; - CFX_WideString cBcc = iLength > 3 ? params[3].ToCFXWideString() : L""; - CFX_WideString cSubject = iLength > 4 ? params[4].ToCFXWideString() : L""; - CFX_WideString cMsg = iLength > 5 ? params[5].ToCFXWideString() : L""; - - CPDFSDK_InterForm* pInterForm = - (CPDFSDK_InterForm*)m_pDocument->GetInterForm(); - CFX_ByteTextBuf textBuf; - if (!pInterForm->ExportFormToFDFTextBuf(textBuf)) - return FALSE; - - CJS_Context* pContext = (CJS_Context*)cc; - CPDFDoc_Environment* pEnv = pContext->GetReaderApp(); - CJS_Runtime* pRuntime = pContext->GetJSRuntime(); - - pRuntime->BeginBlock(); - pEnv->JS_docmailForm(textBuf.GetBuffer(), textBuf.GetLength(), bUI, - cTo.c_str(), cSubject.c_str(), cCc.c_str(), cBcc.c_str(), - cMsg.c_str()); - pRuntime->EndBlock(); - return TRUE; -} - -FX_BOOL Document::print(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - FX_BOOL bUI = TRUE; - int nStart = 0; - int nEnd = 0; - FX_BOOL bSilent = FALSE; - FX_BOOL bShrinkToFit = FALSE; - FX_BOOL bPrintAsImage = FALSE; - FX_BOOL bReverse = FALSE; - FX_BOOL bAnnotations = FALSE; - - int nlength = params.size(); - if (nlength == 9) { - if (params[8].GetType() == CJS_Value::VT_fxobject) { - v8::Local<v8::Object> pObj = params[8].ToV8Object(); - { - if (FXJS_GetObjDefnID(pObj) == CJS_PrintParamsObj::g_nObjDefnID) { - if (CJS_Object* pJSObj = params[8].ToCJSObject()) { - if (PrintParamsObj* pprintparamsObj = - (PrintParamsObj*)pJSObj->GetEmbedObject()) { - bUI = pprintparamsObj->bUI; - nStart = pprintparamsObj->nStart; - nEnd = pprintparamsObj->nEnd; - bSilent = pprintparamsObj->bSilent; - bShrinkToFit = pprintparamsObj->bShrinkToFit; - bPrintAsImage = pprintparamsObj->bPrintAsImage; - bReverse = pprintparamsObj->bReverse; - bAnnotations = pprintparamsObj->bAnnotations; - } - } - } - } - } - } else { - if (nlength >= 1) - bUI = params[0].ToBool(); - if (nlength >= 2) - nStart = params[1].ToInt(); - if (nlength >= 3) - nEnd = params[2].ToInt(); - if (nlength >= 4) - bSilent = params[3].ToBool(); - if (nlength >= 5) - bShrinkToFit = params[4].ToBool(); - if (nlength >= 6) - bPrintAsImage = params[5].ToBool(); - if (nlength >= 7) - bReverse = params[6].ToBool(); - if (nlength >= 8) - bAnnotations = params[7].ToBool(); - } - - if (CPDFDoc_Environment* pEnv = m_pDocument->GetEnv()) { - pEnv->JS_docprint(bUI, nStart, nEnd, bSilent, bShrinkToFit, bPrintAsImage, - bReverse, bAnnotations); - return TRUE; - } - return FALSE; -} - -// removes the specified field from the document. -// comment: -// note: if the filed name is not retional, adobe is dumb for it. - -FX_BOOL Document::removeField(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - if (!(m_pDocument->GetPermissions(FPDFPERM_MODIFY) || - m_pDocument->GetPermissions(FPDFPERM_ANNOT_FORM))) - return FALSE; - - CJS_Context* pContext = (CJS_Context*)cc; - if (params.size() != 1) { - sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR); - return FALSE; - } - - CFX_WideString sFieldName = params[0].ToCFXWideString(); - CPDFSDK_InterForm* pInterForm = - (CPDFSDK_InterForm*)m_pDocument->GetInterForm(); - - std::vector<CPDFSDK_Widget*> widgets; - pInterForm->GetWidgets(sFieldName, &widgets); - - if (widgets.empty()) - return TRUE; - - for (CPDFSDK_Widget* pWidget : widgets) { - CFX_FloatRect rcAnnot = pWidget->GetRect(); - --rcAnnot.left; - --rcAnnot.bottom; - ++rcAnnot.right; - ++rcAnnot.top; - - CFX_RectArray aRefresh; - aRefresh.Add(rcAnnot); - - UnderlyingPageType* pPage = pWidget->GetUnderlyingPage(); - ASSERT(pPage); - - CPDFSDK_PageView* pPageView = m_pDocument->GetPageView(pPage); - pPageView->DeleteAnnot(pWidget); - pPageView->UpdateRects(aRefresh); - } - m_pDocument->SetChangeMark(); - - return TRUE; -} - -// reset filed values within a document. -// comment: -// note: if the fields names r not rational, aodbe is dumb for it. - -FX_BOOL Document::resetForm(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - if (!(m_pDocument->GetPermissions(FPDFPERM_MODIFY) || - m_pDocument->GetPermissions(FPDFPERM_ANNOT_FORM) || - m_pDocument->GetPermissions(FPDFPERM_FILL_FORM))) - return FALSE; - - CPDFSDK_InterForm* pInterForm = - (CPDFSDK_InterForm*)m_pDocument->GetInterForm(); - CPDF_InterForm* pPDFForm = pInterForm->GetInterForm(); - CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc); - CJS_Array aName(pRuntime); - - if (params.empty()) { - pPDFForm->ResetForm(TRUE); - m_pDocument->SetChangeMark(); - return TRUE; - } - - switch (params[0].GetType()) { - default: - aName.Attach(params[0].ToV8Array()); - break; - case CJS_Value::VT_string: - aName.SetElement(0, params[0]); - break; - } - - std::vector<CPDF_FormField*> aFields; - for (int i = 0, isz = aName.GetLength(); i < isz; ++i) { - CJS_Value valElement(pRuntime); - aName.GetElement(i, valElement); - CFX_WideString swVal = valElement.ToCFXWideString(); - for (int j = 0, jsz = pPDFForm->CountFields(swVal); j < jsz; ++j) - aFields.push_back(pPDFForm->GetField(j, swVal)); - } - - if (!aFields.empty()) { - pPDFForm->ResetForm(aFields, TRUE, TRUE); - m_pDocument->SetChangeMark(); - } - - return TRUE; -} - -FX_BOOL Document::saveAs(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - // Unsafe, not supported. - return TRUE; -} - -FX_BOOL Document::submitForm(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - CJS_Context* pContext = (CJS_Context*)cc; - int nSize = params.size(); - if (nSize < 1) { - sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR); - return FALSE; - } - - CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc); - v8::Isolate* isolate = pRuntime->GetIsolate(); - CJS_Array aFields(pRuntime); - CFX_WideString strURL; - FX_BOOL bFDF = TRUE; - FX_BOOL bEmpty = FALSE; - - CJS_Value v = params[0]; - if (v.GetType() == CJS_Value::VT_string) { - strURL = params[0].ToCFXWideString(); - if (nSize > 1) - bFDF = params[1].ToBool(); - if (nSize > 2) - bEmpty = params[2].ToBool(); - if (nSize > 3) - aFields.Attach(params[3].ToV8Array()); - } else if (v.GetType() == CJS_Value::VT_object) { - v8::Local<v8::Object> pObj = params[0].ToV8Object(); - v8::Local<v8::Value> pValue = FXJS_GetObjectElement(isolate, pObj, L"cURL"); - if (!pValue.IsEmpty()) - strURL = - CJS_Value(pRuntime, pValue, GET_VALUE_TYPE(pValue)).ToCFXWideString(); - - pValue = FXJS_GetObjectElement(isolate, pObj, L"bFDF"); - bFDF = CJS_Value(pRuntime, pValue, GET_VALUE_TYPE(pValue)).ToBool(); - - pValue = FXJS_GetObjectElement(isolate, pObj, L"bEmpty"); - bEmpty = CJS_Value(pRuntime, pValue, GET_VALUE_TYPE(pValue)).ToBool(); - - pValue = FXJS_GetObjectElement(isolate, pObj, L"aFields"); - aFields.Attach( - CJS_Value(pRuntime, pValue, GET_VALUE_TYPE(pValue)).ToV8Array()); - } - - CPDFSDK_InterForm* pInterForm = - (CPDFSDK_InterForm*)m_pDocument->GetInterForm(); - CPDF_InterForm* pPDFInterForm = pInterForm->GetInterForm(); - if (aFields.GetLength() == 0 && bEmpty) { - if (pPDFInterForm->CheckRequiredFields(nullptr, true)) { - pRuntime->BeginBlock(); - pInterForm->SubmitForm(strURL, FALSE); - pRuntime->EndBlock(); - } - return TRUE; - } - - std::vector<CPDF_FormField*> fieldObjects; - for (int i = 0, sz = aFields.GetLength(); i < sz; ++i) { - CJS_Value valName(pRuntime); - aFields.GetElement(i, valName); - - CFX_WideString sName = valName.ToCFXWideString(); - CPDF_InterForm* pPDFForm = pInterForm->GetInterForm(); - for (int j = 0, jsz = pPDFForm->CountFields(sName); j < jsz; ++j) { - CPDF_FormField* pField = pPDFForm->GetField(j, sName); - if (!bEmpty && pField->GetValue().IsEmpty()) - continue; - - fieldObjects.push_back(pField); - } - } - - if (pPDFInterForm->CheckRequiredFields(&fieldObjects, true)) { - pRuntime->BeginBlock(); - pInterForm->SubmitFields(strURL, fieldObjects, true, !bFDF); - pRuntime->EndBlock(); - } - return TRUE; -} - -void Document::AttachDoc(CPDFSDK_Document* pDoc) { - m_pDocument = pDoc; -} - -CPDFSDK_Document* Document::GetReaderDoc() { - return m_pDocument; -} - -FX_BOOL Document::bookmarkRoot(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - return TRUE; -} - -FX_BOOL Document::mailDoc(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - FX_BOOL bUI = TRUE; - CFX_WideString cTo = L""; - CFX_WideString cCc = L""; - CFX_WideString cBcc = L""; - CFX_WideString cSubject = L""; - CFX_WideString cMsg = L""; - - if (params.size() >= 1) - bUI = params[0].ToBool(); - if (params.size() >= 2) - cTo = params[1].ToCFXWideString(); - if (params.size() >= 3) - cCc = params[2].ToCFXWideString(); - if (params.size() >= 4) - cBcc = params[3].ToCFXWideString(); - if (params.size() >= 5) - cSubject = params[4].ToCFXWideString(); - if (params.size() >= 6) - cMsg = params[5].ToCFXWideString(); - - CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc); - v8::Isolate* isolate = pRuntime->GetIsolate(); - - if (params.size() >= 1 && params[0].GetType() == CJS_Value::VT_object) { - v8::Local<v8::Object> pObj = params[0].ToV8Object(); - - v8::Local<v8::Value> pValue = FXJS_GetObjectElement(isolate, pObj, L"bUI"); - bUI = CJS_Value(pRuntime, pValue, GET_VALUE_TYPE(pValue)).ToInt(); - - pValue = FXJS_GetObjectElement(isolate, pObj, L"cTo"); - cTo = CJS_Value(pRuntime, pValue, GET_VALUE_TYPE(pValue)).ToCFXWideString(); - - pValue = FXJS_GetObjectElement(isolate, pObj, L"cCc"); - cCc = CJS_Value(pRuntime, pValue, GET_VALUE_TYPE(pValue)).ToCFXWideString(); - - pValue = FXJS_GetObjectElement(isolate, pObj, L"cBcc"); - cBcc = - CJS_Value(pRuntime, pValue, GET_VALUE_TYPE(pValue)).ToCFXWideString(); - - pValue = FXJS_GetObjectElement(isolate, pObj, L"cSubject"); - cSubject = - CJS_Value(pRuntime, pValue, GET_VALUE_TYPE(pValue)).ToCFXWideString(); - - pValue = FXJS_GetObjectElement(isolate, pObj, L"cMsg"); - cMsg = - CJS_Value(pRuntime, pValue, GET_VALUE_TYPE(pValue)).ToCFXWideString(); - } - - pRuntime->BeginBlock(); - CPDFDoc_Environment* pEnv = pRuntime->GetReaderApp(); - pEnv->JS_docmailForm(NULL, 0, bUI, cTo.c_str(), cSubject.c_str(), cCc.c_str(), - cBcc.c_str(), cMsg.c_str()); - pRuntime->EndBlock(); - - return TRUE; -} - -FX_BOOL Document::author(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - CPDF_Dictionary* pDictionary = m_pDocument->GetPDFDocument()->GetInfo(); - if (!pDictionary) - return FALSE; - - if (vp.IsGetting()) { - vp << pDictionary->GetUnicodeTextBy("Author"); - return TRUE; - } else { - if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY)) - return FALSE; - - CFX_WideString csAuthor; - vp >> csAuthor; - pDictionary->SetAtString("Author", PDF_EncodeText(csAuthor)); - m_pDocument->SetChangeMark(); - return TRUE; - } -} - -FX_BOOL Document::info(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - CPDF_Dictionary* pDictionary = m_pDocument->GetPDFDocument()->GetInfo(); - if (!pDictionary) - return FALSE; - - CFX_WideString cwAuthor = pDictionary->GetUnicodeTextBy("Author"); - CFX_WideString cwTitle = pDictionary->GetUnicodeTextBy("Title"); - CFX_WideString cwSubject = pDictionary->GetUnicodeTextBy("Subject"); - CFX_WideString cwKeywords = pDictionary->GetUnicodeTextBy("Keywords"); - CFX_WideString cwCreator = pDictionary->GetUnicodeTextBy("Creator"); - CFX_WideString cwProducer = pDictionary->GetUnicodeTextBy("Producer"); - CFX_WideString cwCreationDate = pDictionary->GetUnicodeTextBy("CreationDate"); - CFX_WideString cwModDate = pDictionary->GetUnicodeTextBy("ModDate"); - CFX_WideString cwTrapped = pDictionary->GetUnicodeTextBy("Trapped"); - - v8::Isolate* isolate = GetIsolate(cc); - if (vp.IsGetting()) { - CJS_Context* pContext = (CJS_Context*)cc; - CJS_Runtime* pRuntime = pContext->GetJSRuntime(); - v8::Local<v8::Object> pObj = - FXJS_NewFxDynamicObj(pRuntime->GetIsolate(), pRuntime, -1); - FXJS_PutObjectString(isolate, pObj, L"Author", cwAuthor.c_str()); - FXJS_PutObjectString(isolate, pObj, L"Title", cwTitle.c_str()); - FXJS_PutObjectString(isolate, pObj, L"Subject", cwSubject.c_str()); - FXJS_PutObjectString(isolate, pObj, L"Keywords", cwKeywords.c_str()); - FXJS_PutObjectString(isolate, pObj, L"Creator", cwCreator.c_str()); - FXJS_PutObjectString(isolate, pObj, L"Producer", cwProducer.c_str()); - FXJS_PutObjectString(isolate, pObj, L"CreationDate", - cwCreationDate.c_str()); - FXJS_PutObjectString(isolate, pObj, L"ModDate", cwModDate.c_str()); - FXJS_PutObjectString(isolate, pObj, L"Trapped", cwTrapped.c_str()); - - // It's to be compatible to non-standard info dictionary. - for (const auto& it : *pDictionary) { - const CFX_ByteString& bsKey = it.first; - CPDF_Object* pValueObj = it.second; - CFX_WideString wsKey = CFX_WideString::FromUTF8(bsKey, bsKey.GetLength()); - - if (pValueObj->IsString() || pValueObj->IsName()) { - FXJS_PutObjectString(isolate, pObj, wsKey.c_str(), - pValueObj->GetUnicodeText().c_str()); - } else if (pValueObj->IsNumber()) { - FXJS_PutObjectNumber(isolate, pObj, wsKey.c_str(), - (float)pValueObj->GetNumber()); - } else if (pValueObj->IsBoolean()) { - FXJS_PutObjectBoolean(isolate, pObj, wsKey.c_str(), - !!pValueObj->GetInteger()); - } - } - vp << pObj; - } - return TRUE; -} - -FX_BOOL Document::creationDate(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - CPDF_Dictionary* pDictionary = m_pDocument->GetPDFDocument()->GetInfo(); - if (!pDictionary) - return FALSE; - - if (vp.IsGetting()) { - vp << pDictionary->GetUnicodeTextBy("CreationDate"); - } else { - if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY)) - return FALSE; - - CFX_WideString csCreationDate; - vp >> csCreationDate; - pDictionary->SetAtString("CreationDate", PDF_EncodeText(csCreationDate)); - m_pDocument->SetChangeMark(); - } - return TRUE; -} - -FX_BOOL Document::creator(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - CPDF_Dictionary* pDictionary = m_pDocument->GetPDFDocument()->GetInfo(); - if (!pDictionary) - return FALSE; - - if (vp.IsGetting()) { - vp << pDictionary->GetUnicodeTextBy("Creator"); - } else { - if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY)) - return FALSE; - - CFX_WideString csCreator; - vp >> csCreator; - pDictionary->SetAtString("Creator", PDF_EncodeText(csCreator)); - m_pDocument->SetChangeMark(); - } - return TRUE; -} - -FX_BOOL Document::delay(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - if (vp.IsGetting()) { - vp << m_bDelay; - } else { - if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY)) - return FALSE; - - vp >> m_bDelay; - if (m_bDelay) { - for (int i = 0, sz = m_DelayData.GetSize(); i < sz; i++) - delete m_DelayData.GetAt(i); - - m_DelayData.RemoveAll(); - } else { - CFX_ArrayTemplate<CJS_DelayData*> DelayDataToProcess; - for (int i = 0, sz = m_DelayData.GetSize(); i < sz; i++) { - if (CJS_DelayData* pData = m_DelayData.GetAt(i)) { - DelayDataToProcess.Add(pData); - m_DelayData.SetAt(i, NULL); - } - } - m_DelayData.RemoveAll(); - for (int i = 0, sz = DelayDataToProcess.GetSize(); i < sz; i++) { - CJS_DelayData* pData = DelayDataToProcess.GetAt(i); - Field::DoDelay(m_pDocument, pData); - DelayDataToProcess.SetAt(i, NULL); - delete pData; - } - } - } - return TRUE; -} - -FX_BOOL Document::keywords(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - CPDF_Dictionary* pDictionary = m_pDocument->GetPDFDocument()->GetInfo(); - if (!pDictionary) - return FALSE; - - if (vp.IsGetting()) { - vp << pDictionary->GetUnicodeTextBy("Keywords"); - } else { - if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY)) - return FALSE; - - CFX_WideString csKeywords; - vp >> csKeywords; - pDictionary->SetAtString("Keywords", PDF_EncodeText(csKeywords)); - m_pDocument->SetChangeMark(); - } - return TRUE; -} - -FX_BOOL Document::modDate(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - CPDF_Dictionary* pDictionary = m_pDocument->GetPDFDocument()->GetInfo(); - if (!pDictionary) - return FALSE; - - if (vp.IsGetting()) { - vp << pDictionary->GetUnicodeTextBy("ModDate"); - } else { - if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY)) - return FALSE; - - CFX_WideString csmodDate; - vp >> csmodDate; - pDictionary->SetAtString("ModDate", PDF_EncodeText(csmodDate)); - m_pDocument->SetChangeMark(); - } - return TRUE; -} - -FX_BOOL Document::producer(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - CPDF_Dictionary* pDictionary = m_pDocument->GetPDFDocument()->GetInfo(); - if (!pDictionary) - return FALSE; - - if (vp.IsGetting()) { - vp << pDictionary->GetUnicodeTextBy("Producer"); - } else { - if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY)) - return FALSE; - - CFX_WideString csproducer; - vp >> csproducer; - pDictionary->SetAtString("Producer", PDF_EncodeText(csproducer)); - m_pDocument->SetChangeMark(); - } - return TRUE; -} - -FX_BOOL Document::subject(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - CPDF_Dictionary* pDictionary = m_pDocument->GetPDFDocument()->GetInfo(); - if (!pDictionary) - return FALSE; - - if (vp.IsGetting()) { - vp << pDictionary->GetUnicodeTextBy("Subject"); - } else { - if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY)) - return FALSE; - - CFX_WideString cssubject; - vp >> cssubject; - pDictionary->SetAtString("Subject", PDF_EncodeText(cssubject)); - m_pDocument->SetChangeMark(); - } - return TRUE; -} - -FX_BOOL Document::title(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - if (!m_pDocument || !m_pDocument->GetUnderlyingDocument()) - return FALSE; - - CPDF_Dictionary* pDictionary = m_pDocument->GetPDFDocument()->GetInfo(); - if (!pDictionary) - return FALSE; - - if (vp.IsGetting()) { - vp << pDictionary->GetUnicodeTextBy("Title"); - } else { - if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY)) - return FALSE; - - CFX_WideString cstitle; - vp >> cstitle; - pDictionary->SetAtString("Title", PDF_EncodeText(cstitle)); - m_pDocument->SetChangeMark(); - } - return TRUE; -} - -FX_BOOL Document::numPages(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - if (vp.IsSetting()) { - CJS_Context* pContext = static_cast<CJS_Context*>(cc); - sError = JSGetStringFromID(pContext, IDS_STRING_JSREADONLY); - return FALSE; - } - vp << m_pDocument->GetPageCount(); - return TRUE; -} - -FX_BOOL Document::external(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - // In Chrome case,should always return true. - if (vp.IsGetting()) { - vp << true; - } - return TRUE; -} - -FX_BOOL Document::filesize(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - if (vp.IsSetting()) { - CJS_Context* pContext = static_cast<CJS_Context*>(cc); - sError = JSGetStringFromID(pContext, IDS_STRING_JSREADONLY); - return FALSE; - } - vp << 0; - return TRUE; -} - -FX_BOOL Document::mouseX(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - return TRUE; -} - -FX_BOOL Document::mouseY(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - return TRUE; -} - -FX_BOOL Document::baseURL(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - if (vp.IsGetting()) { - vp << m_cwBaseURL; - } else { - vp >> m_cwBaseURL; - } - return TRUE; -} - -FX_BOOL Document::calculate(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - CPDFSDK_InterForm* pInterForm = - (CPDFSDK_InterForm*)m_pDocument->GetInterForm(); - - if (vp.IsGetting()) { - if (pInterForm->IsCalculateEnabled()) - vp << true; - else - vp << false; - } else { - bool bCalculate; - vp >> bCalculate; - - pInterForm->EnableCalculate(bCalculate); - } - - return TRUE; -} - -FX_BOOL Document::documentFileName(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - if (vp.IsSetting()) { - CJS_Context* pContext = static_cast<CJS_Context*>(cc); - sError = JSGetStringFromID(pContext, IDS_STRING_JSREADONLY); - return FALSE; - } - CFX_WideString wsFilePath = m_pDocument->GetPath(); - int32_t i = wsFilePath.GetLength() - 1; - for (; i >= 0; i--) { - if (wsFilePath.GetAt(i) == L'\\' || wsFilePath.GetAt(i) == L'/') - break; - } - if (i >= 0 && i < wsFilePath.GetLength() - 1) { - vp << (wsFilePath.GetBuffer(wsFilePath.GetLength()) + i + 1); - } else { - vp << L""; - } - return TRUE; -} - -FX_BOOL Document::path(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - if (vp.IsSetting()) { - CJS_Context* pContext = static_cast<CJS_Context*>(cc); - sError = JSGetStringFromID(pContext, IDS_STRING_JSREADONLY); - return FALSE; - } - vp << app::SysPathToPDFPath(m_pDocument->GetPath()); - return TRUE; -} - -FX_BOOL Document::pageWindowRect(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - return TRUE; -} - -FX_BOOL Document::layout(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - return TRUE; -} - -FX_BOOL Document::addLink(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - return TRUE; -} - -FX_BOOL Document::closeDoc(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - return TRUE; -} - -FX_BOOL Document::getPageBox(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - return TRUE; -} - -FX_BOOL Document::getAnnot(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - return TRUE; -} - -FX_BOOL Document::getAnnots(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - vRet.SetNull(); - return TRUE; -} - -FX_BOOL Document::getAnnot3D(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - vRet.SetNull(); - return TRUE; -} - -FX_BOOL Document::getAnnots3D(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - vRet = CJS_Value::VT_undefined; - return TRUE; -} - -FX_BOOL Document::getOCGs(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - return TRUE; -} - -FX_BOOL Document::getLinks(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - return TRUE; -} - -bool Document::IsEnclosedInRect(CFX_FloatRect rect, CFX_FloatRect LinkRect) { - return (rect.left <= LinkRect.left && rect.top <= LinkRect.top && - rect.right >= LinkRect.right && rect.bottom >= LinkRect.bottom); -} - -FX_BOOL Document::addIcon(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - CJS_Context* pContext = (CJS_Context*)cc; - if (params.size() != 2) { - sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR); - return FALSE; - } - CFX_WideString swIconName = params[0].ToCFXWideString(); - - if (params[1].GetType() != CJS_Value::VT_object) { - sError = JSGetStringFromID(pContext, IDS_STRING_JSTYPEERROR); - return FALSE; - } - - v8::Local<v8::Object> pJSIcon = params[1].ToV8Object(); - if (FXJS_GetObjDefnID(pJSIcon) != CJS_Icon::g_nObjDefnID) { - sError = JSGetStringFromID(pContext, IDS_STRING_JSTYPEERROR); - return FALSE; - } - - CJS_EmbedObj* pEmbedObj = params[1].ToCJSObject()->GetEmbedObject(); - if (!pEmbedObj) { - sError = JSGetStringFromID(pContext, IDS_STRING_JSTYPEERROR); - return FALSE; - } - - m_IconList.push_back(std::unique_ptr<IconElement>( - new IconElement(swIconName, (Icon*)pEmbedObj))); - return TRUE; -} - -FX_BOOL Document::icons(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - if (vp.IsSetting()) { - CJS_Context* pContext = static_cast<CJS_Context*>(cc); - sError = JSGetStringFromID(pContext, IDS_STRING_JSREADONLY); - return FALSE; - } - - if (m_IconList.empty()) { - vp.SetNull(); - return TRUE; - } - - CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc); - CJS_Array Icons(pRuntime); - - int i = 0; - for (const auto& pIconElement : m_IconList) { - v8::Local<v8::Object> pObj = FXJS_NewFxDynamicObj( - pRuntime->GetIsolate(), pRuntime, CJS_Icon::g_nObjDefnID); - if (pObj.IsEmpty()) - return FALSE; - - CJS_Icon* pJS_Icon = (CJS_Icon*)FXJS_GetPrivate(m_isolate, pObj); - if (!pJS_Icon) - return FALSE; - - Icon* pIcon = (Icon*)pJS_Icon->GetEmbedObject(); - if (!pIcon) - return FALSE; - - pIcon->SetStream(pIconElement->IconStream->GetStream()); - pIcon->SetIconName(pIconElement->IconName); - Icons.SetElement(i++, CJS_Value(pRuntime, pJS_Icon)); - } - - vp << Icons; - return TRUE; -} - -FX_BOOL Document::getIcon(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - CJS_Context* pContext = (CJS_Context*)cc; - if (params.size() != 1) { - sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR); - return FALSE; - } - - if (m_IconList.empty()) - return FALSE; - - CFX_WideString swIconName = params[0].ToCFXWideString(); - CJS_Runtime* pRuntime = pContext->GetJSRuntime(); - - for (const auto& pIconElement : m_IconList) { - if (pIconElement->IconName == swIconName) { - Icon* pRetIcon = pIconElement->IconStream; - - v8::Local<v8::Object> pObj = FXJS_NewFxDynamicObj( - pRuntime->GetIsolate(), pRuntime, CJS_Icon::g_nObjDefnID); - if (pObj.IsEmpty()) - return FALSE; - - CJS_Icon* pJS_Icon = (CJS_Icon*)FXJS_GetPrivate(m_isolate, pObj); - if (!pJS_Icon) - return FALSE; - - Icon* pIcon = (Icon*)pJS_Icon->GetEmbedObject(); - if (!pIcon) - return FALSE; - - pIcon->SetIconName(swIconName); - pIcon->SetStream(pRetIcon->GetStream()); - vRet = pJS_Icon; - return TRUE; - } - } - - return FALSE; -} - -FX_BOOL Document::removeIcon(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - // Unsafe, no supported. - return TRUE; -} - -FX_BOOL Document::createDataObject(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - // Unsafe, not implemented. - return TRUE; -} - -FX_BOOL Document::media(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - return TRUE; -} - -FX_BOOL Document::calculateNow(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - if (!(m_pDocument->GetPermissions(FPDFPERM_MODIFY) || - m_pDocument->GetPermissions(FPDFPERM_ANNOT_FORM) || - m_pDocument->GetPermissions(FPDFPERM_FILL_FORM))) - return FALSE; - - CPDFSDK_InterForm* pInterForm = - (CPDFSDK_InterForm*)m_pDocument->GetInterForm(); - pInterForm->OnCalculate(); - return TRUE; -} - -FX_BOOL Document::Collab(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - return TRUE; -} - -FX_BOOL Document::getPageNthWord(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - if (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS)) - return FALSE; - - int nPageNo = params.size() > 0 ? params[0].ToInt() : 0; - int nWordNo = params.size() > 1 ? params[1].ToInt() : 0; - bool bStrip = params.size() > 2 ? params[2].ToBool() : true; - - CPDF_Document* pDocument = m_pDocument->GetPDFDocument(); - if (!pDocument) - return FALSE; - - CJS_Context* pContext = static_cast<CJS_Context*>(cc); - if (nPageNo < 0 || nPageNo >= pDocument->GetPageCount()) { - sError = JSGetStringFromID(pContext, IDS_STRING_JSVALUEERROR); - return FALSE; - } - - CPDF_Dictionary* pPageDict = pDocument->GetPage(nPageNo); - if (!pPageDict) - return FALSE; - - CPDF_Page page; - page.Load(pDocument, pPageDict); - page.ParseContent(nullptr); - - int nWords = 0; - CFX_WideString swRet; - for (auto& pPageObj : *page.GetPageObjectList()) { - if (pPageObj->IsText()) { - CPDF_TextObject* pTextObj = pPageObj->AsText(); - int nObjWords = CountWords(pTextObj); - if (nWords + nObjWords >= nWordNo) { - swRet = GetObjWordStr(pTextObj, nWordNo - nWords); - break; - } - nWords += nObjWords; - } - } - - if (bStrip) { - swRet.TrimLeft(); - swRet.TrimRight(); - } - - vRet = swRet.c_str(); - return TRUE; -} - -FX_BOOL Document::getPageNthWordQuads(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - if (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS)) - return FALSE; - - return FALSE; -} - -FX_BOOL Document::getPageNumWords(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - if (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS)) - return FALSE; - - int nPageNo = params.size() > 0 ? params[0].ToInt() : 0; - CPDF_Document* pDocument = m_pDocument->GetPDFDocument(); - CJS_Context* pContext = static_cast<CJS_Context*>(cc); - if (nPageNo < 0 || nPageNo >= pDocument->GetPageCount()) { - sError = JSGetStringFromID(pContext, IDS_STRING_JSVALUEERROR); - return FALSE; - } - - CPDF_Dictionary* pPageDict = pDocument->GetPage(nPageNo); - if (!pPageDict) - return FALSE; - - CPDF_Page page; - page.Load(pDocument, pPageDict); - page.ParseContent(nullptr); - - int nWords = 0; - for (auto& pPageObj : *page.GetPageObjectList()) { - if (pPageObj->IsText()) - nWords += CountWords(pPageObj->AsText()); - } - - vRet = nWords; - return TRUE; -} - -FX_BOOL Document::getPrintParams(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - CJS_Context* pContext = (CJS_Context*)cc; - CJS_Runtime* pRuntime = pContext->GetJSRuntime(); - v8::Local<v8::Object> pRetObj = FXJS_NewFxDynamicObj( - pRuntime->GetIsolate(), pRuntime, CJS_PrintParamsObj::g_nObjDefnID); - - // Not implemented yet. - - vRet = pRetObj; - return TRUE; -} - -#define ISLATINWORD(u) (u != 0x20 && u <= 0x28FF) - -int Document::CountWords(CPDF_TextObject* pTextObj) { - if (!pTextObj) - return 0; - - int nWords = 0; - - CPDF_Font* pFont = pTextObj->GetFont(); - if (!pFont) - return 0; - - FX_BOOL bIsLatin = FALSE; - - for (int i = 0, sz = pTextObj->CountChars(); i < sz; i++) { - FX_DWORD charcode = -1; - FX_FLOAT kerning; - - pTextObj->GetCharInfo(i, charcode, kerning); - CFX_WideString swUnicode = pFont->UnicodeFromCharCode(charcode); - - FX_WORD unicode = 0; - if (swUnicode.GetLength() > 0) - unicode = swUnicode[0]; - - if (ISLATINWORD(unicode) && bIsLatin) - continue; - - bIsLatin = ISLATINWORD(unicode); - if (unicode != 0x20) - nWords++; - } - - return nWords; -} - -CFX_WideString Document::GetObjWordStr(CPDF_TextObject* pTextObj, - int nWordIndex) { - CFX_WideString swRet; - - CPDF_Font* pFont = pTextObj->GetFont(); - if (!pFont) - return L""; - - int nWords = 0; - FX_BOOL bIsLatin = FALSE; - - for (int i = 0, sz = pTextObj->CountChars(); i < sz; i++) { - FX_DWORD charcode = -1; - FX_FLOAT kerning; - - pTextObj->GetCharInfo(i, charcode, kerning); - CFX_WideString swUnicode = pFont->UnicodeFromCharCode(charcode); - - FX_WORD unicode = 0; - if (swUnicode.GetLength() > 0) - unicode = swUnicode[0]; - - if (ISLATINWORD(unicode) && bIsLatin) { - } else { - bIsLatin = ISLATINWORD(unicode); - if (unicode != 0x20) - nWords++; - } - - if (nWords - 1 == nWordIndex) - swRet += unicode; - } - - return swRet; -} - -FX_BOOL Document::zoom(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - return TRUE; -} - -/** -(none, NoVary) -(fitP, FitPage) -(fitW, FitWidth) -(fitH, FitHeight) -(fitV, FitVisibleWidth) -(pref, Preferred) -(refW, ReflowWidth) -*/ - -FX_BOOL Document::zoomType(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - return TRUE; -} - -FX_BOOL Document::deletePages(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - // Unsafe, no supported. - return TRUE; -} - -FX_BOOL Document::extractPages(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - // Unsafe, not supported. - return TRUE; -} - -FX_BOOL Document::insertPages(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - // Unsafe, not supported. - return TRUE; -} - -FX_BOOL Document::replacePages(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - // Unsafe, not supported. - return TRUE; -} - -FX_BOOL Document::getURL(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - // Unsafe, not supported. - return TRUE; -} - -void Document::AddDelayData(CJS_DelayData* pData) { - m_DelayData.Add(pData); -} - -void Document::DoFieldDelay(const CFX_WideString& sFieldName, - int nControlIndex) { - CFX_DWordArray DelArray; - CFX_ArrayTemplate<CJS_DelayData*> DelayDataForFieldAndControlIndex; - - for (int i = 0, sz = m_DelayData.GetSize(); i < sz; i++) { - if (CJS_DelayData* pData = m_DelayData.GetAt(i)) { - if (pData->sFieldName == sFieldName && - pData->nControlIndex == nControlIndex) { - DelayDataForFieldAndControlIndex.Add(pData); - m_DelayData.SetAt(i, NULL); - DelArray.Add(i); - } - } - } - - for (int j = DelArray.GetSize() - 1; j >= 0; j--) { - m_DelayData.RemoveAt(DelArray[j]); - } - - for (int i = 0, sz = DelayDataForFieldAndControlIndex.GetSize(); i < sz; - i++) { - CJS_DelayData* pData = DelayDataForFieldAndControlIndex.GetAt(i); - Field::DoDelay(m_pDocument, pData); - DelayDataForFieldAndControlIndex.SetAt(i, NULL); - delete pData; - } -} - -CJS_Document* Document::GetCJSDoc() const { - return static_cast<CJS_Document*>(m_pJSObject); -} diff --git a/fpdfsdk/src/javascript/Document.h b/fpdfsdk/src/javascript/Document.h deleted file mode 100644 index 06c4121510..0000000000 --- a/fpdfsdk/src/javascript/Document.h +++ /dev/null @@ -1,365 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef FPDFSDK_SRC_JAVASCRIPT_DOCUMENT_H_ -#define FPDFSDK_SRC_JAVASCRIPT_DOCUMENT_H_ - -#include <list> -#include <memory> -#include <vector> - -#include "fpdfsdk/src/javascript/JS_Define.h" - -class PrintParamsObj : public CJS_EmbedObj { - public: - PrintParamsObj(CJS_Object* pJSObject); - ~PrintParamsObj() override {} - - public: - FX_BOOL bUI; - int nStart; - int nEnd; - FX_BOOL bSilent; - FX_BOOL bShrinkToFit; - FX_BOOL bPrintAsImage; - FX_BOOL bReverse; - FX_BOOL bAnnotations; -}; - -class CJS_PrintParamsObj : public CJS_Object { - public: - CJS_PrintParamsObj(v8::Local<v8::Object> pObject) : CJS_Object(pObject) {} - ~CJS_PrintParamsObj() override {} - - DECLARE_JS_CLASS(); -}; - -class Icon; -class Field; - -struct IconElement { - IconElement(const CFX_WideString& name, Icon* stream) - : IconName(name), IconStream(stream) {} - - CFX_WideString IconName; - Icon* IconStream; -}; - -struct CJS_DelayData; -struct CJS_DelayAnnot; -struct CJS_AnnotObj; - -class Document : public CJS_EmbedObj { - public: - Document(CJS_Object* pJSObject); - ~Document() override; - - FX_BOOL ADBE(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL author(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL baseURL(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL bookmarkRoot(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError); - FX_BOOL calculate(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL Collab(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL creationDate(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError); - FX_BOOL creator(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL delay(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL dirty(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL documentFileName(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError); - FX_BOOL external(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL filesize(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL icons(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL info(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL keywords(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL layout(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL media(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL modDate(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL mouseX(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL mouseY(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL numFields(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL numPages(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL pageNum(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL pageWindowRect(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError); - FX_BOOL path(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL producer(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL subject(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL title(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL zoom(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL zoomType(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - - FX_BOOL addAnnot(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL addField(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL addLink(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL addIcon(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL calculateNow(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL closeDoc(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL createDataObject(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL deletePages(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL exportAsText(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL exportAsFDF(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL exportAsXFDF(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL extractPages(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL getAnnot(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL getAnnots(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL getAnnot3D(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL getAnnots3D(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL getField(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL getIcon(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL getLinks(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL getNthFieldName(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL getOCGs(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL getPageBox(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL getPageNthWord(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL getPageNthWordQuads(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL getPageNumWords(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL getPrintParams(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL getURL(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL importAnFDF(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL importAnXFDF(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL importTextData(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL insertPages(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL mailForm(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL print(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL removeField(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL replacePages(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL resetForm(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL saveAs(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL submitForm(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL mailDoc(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL removeIcon(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - - void AttachDoc(CPDFSDK_Document* pDoc); - CPDFSDK_Document* GetReaderDoc(); - void AddDelayData(CJS_DelayData* pData); - void DoFieldDelay(const CFX_WideString& sFieldName, int nControlIndex); - void SetIsolate(v8::Isolate* isolate) { m_isolate = isolate; } - CJS_Document* GetCJSDoc() const; - - private: - bool IsEnclosedInRect(CFX_FloatRect rect, CFX_FloatRect LinkRect); - int CountWords(CPDF_TextObject* pTextObj); - CFX_WideString GetObjWordStr(CPDF_TextObject* pTextObj, int nWordIndex); - - v8::Isolate* m_isolate; - std::list<std::unique_ptr<IconElement>> m_IconList; - CPDFSDK_Document* m_pDocument; - CFX_WideString m_cwBaseURL; - bool m_bDelay; - CFX_ArrayTemplate<CJS_DelayData*> m_DelayData; -}; - -class CJS_Document : public CJS_Object { - public: - explicit CJS_Document(v8::Local<v8::Object> pObject) : CJS_Object(pObject) {} - ~CJS_Document() override {} - - // CJS_Object - void InitInstance(IJS_Runtime* pIRuntime) override; - - DECLARE_JS_CLASS(); - - JS_STATIC_PROP(ADBE, Document); - JS_STATIC_PROP(author, Document); - JS_STATIC_PROP(baseURL, Document); - JS_STATIC_PROP(bookmarkRoot, Document); - JS_STATIC_PROP(calculate, Document); - JS_STATIC_PROP(Collab, Document); - JS_STATIC_PROP(creationDate, Document); - JS_STATIC_PROP(creator, Document); - JS_STATIC_PROP(delay, Document); - JS_STATIC_PROP(dirty, Document); - JS_STATIC_PROP(documentFileName, Document); - JS_STATIC_PROP(external, Document); - JS_STATIC_PROP(filesize, Document); - JS_STATIC_PROP(icons, Document); - JS_STATIC_PROP(info, Document); - JS_STATIC_PROP(keywords, Document); - JS_STATIC_PROP(layout, Document); - JS_STATIC_PROP(media, Document); - JS_STATIC_PROP(modDate, Document); - JS_STATIC_PROP(mouseX, Document); - JS_STATIC_PROP(mouseY, Document); - JS_STATIC_PROP(numFields, Document); - JS_STATIC_PROP(numPages, Document); - JS_STATIC_PROP(pageNum, Document); - JS_STATIC_PROP(pageWindowRect, Document); - JS_STATIC_PROP(path, Document); - JS_STATIC_PROP(producer, Document); - JS_STATIC_PROP(subject, Document); - JS_STATIC_PROP(title, Document); - JS_STATIC_PROP(zoom, Document); - JS_STATIC_PROP(zoomType, Document); - - JS_STATIC_METHOD(addAnnot, Document); - JS_STATIC_METHOD(addField, Document); - JS_STATIC_METHOD(addLink, Document); - JS_STATIC_METHOD(addIcon, Document); - JS_STATIC_METHOD(calculateNow, Document); - JS_STATIC_METHOD(closeDoc, Document); - JS_STATIC_METHOD(createDataObject, Document); - JS_STATIC_METHOD(deletePages, Document); - JS_STATIC_METHOD(exportAsText, Document); - JS_STATIC_METHOD(exportAsFDF, Document); - JS_STATIC_METHOD(exportAsXFDF, Document); - JS_STATIC_METHOD(extractPages, Document); - JS_STATIC_METHOD(getAnnot, Document); - JS_STATIC_METHOD(getAnnots, Document); - JS_STATIC_METHOD(getAnnot3D, Document); - JS_STATIC_METHOD(getAnnots3D, Document); - JS_STATIC_METHOD(getField, Document); - JS_STATIC_METHOD(getIcon, Document); - JS_STATIC_METHOD(getLinks, Document); - JS_STATIC_METHOD(getNthFieldName, Document); - JS_STATIC_METHOD(getOCGs, Document); - JS_STATIC_METHOD(getPageBox, Document); - JS_STATIC_METHOD(getPageNthWord, Document); - JS_STATIC_METHOD(getPageNthWordQuads, Document); - JS_STATIC_METHOD(getPageNumWords, Document); - JS_STATIC_METHOD(getPrintParams, Document); - JS_STATIC_METHOD(getURL, Document); - JS_STATIC_METHOD(importAnFDF, Document); - JS_STATIC_METHOD(importAnXFDF, Document); - JS_STATIC_METHOD(importTextData, Document); - JS_STATIC_METHOD(insertPages, Document); - JS_STATIC_METHOD(mailForm, Document); - JS_STATIC_METHOD(print, Document); - JS_STATIC_METHOD(removeField, Document); - JS_STATIC_METHOD(replacePages, Document); - JS_STATIC_METHOD(removeIcon, Document); - JS_STATIC_METHOD(resetForm, Document); - JS_STATIC_METHOD(saveAs, Document); - JS_STATIC_METHOD(submitForm, Document); - JS_STATIC_METHOD(mailDoc, Document); -}; - -#endif // FPDFSDK_SRC_JAVASCRIPT_DOCUMENT_H_ diff --git a/fpdfsdk/src/javascript/Field.cpp b/fpdfsdk/src/javascript/Field.cpp deleted file mode 100644 index 0c0dfd17bf..0000000000 --- a/fpdfsdk/src/javascript/Field.cpp +++ /dev/null @@ -1,3600 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "fpdfsdk/src/javascript/Field.h" - -#include <algorithm> -#include <memory> -#include <string> -#include <vector> - -#include "fpdfsdk/include/fsdk_mgr.h" // For CPDFDoc_Environment. -#include "fpdfsdk/include/javascript/IJavaScript.h" -#include "fpdfsdk/src/javascript/Document.h" -#include "fpdfsdk/src/javascript/Icon.h" -#include "fpdfsdk/src/javascript/JS_Context.h" -#include "fpdfsdk/src/javascript/JS_Define.h" -#include "fpdfsdk/src/javascript/JS_EventHandler.h" -#include "fpdfsdk/src/javascript/JS_Object.h" -#include "fpdfsdk/src/javascript/JS_Runtime.h" -#include "fpdfsdk/src/javascript/JS_Value.h" -#include "fpdfsdk/src/javascript/PublicMethods.h" -#include "fpdfsdk/src/javascript/color.h" - -BEGIN_JS_STATIC_CONST(CJS_Field) -END_JS_STATIC_CONST() - -BEGIN_JS_STATIC_PROP(CJS_Field) -JS_STATIC_PROP_ENTRY(alignment) -JS_STATIC_PROP_ENTRY(borderStyle) -JS_STATIC_PROP_ENTRY(buttonAlignX) -JS_STATIC_PROP_ENTRY(buttonAlignY) -JS_STATIC_PROP_ENTRY(buttonFitBounds) -JS_STATIC_PROP_ENTRY(buttonPosition) -JS_STATIC_PROP_ENTRY(buttonScaleHow) -JS_STATIC_PROP_ENTRY(buttonScaleWhen) -JS_STATIC_PROP_ENTRY(calcOrderIndex) -JS_STATIC_PROP_ENTRY(charLimit) -JS_STATIC_PROP_ENTRY(comb) -JS_STATIC_PROP_ENTRY(commitOnSelChange) -JS_STATIC_PROP_ENTRY(currentValueIndices) -JS_STATIC_PROP_ENTRY(defaultStyle) -JS_STATIC_PROP_ENTRY(defaultValue) -JS_STATIC_PROP_ENTRY(doNotScroll) -JS_STATIC_PROP_ENTRY(doNotSpellCheck) -JS_STATIC_PROP_ENTRY(delay) -JS_STATIC_PROP_ENTRY(display) -JS_STATIC_PROP_ENTRY(doc) -JS_STATIC_PROP_ENTRY(editable) -JS_STATIC_PROP_ENTRY(exportValues) -JS_STATIC_PROP_ENTRY(hidden) -JS_STATIC_PROP_ENTRY(fileSelect) -JS_STATIC_PROP_ENTRY(fillColor) -JS_STATIC_PROP_ENTRY(lineWidth) -JS_STATIC_PROP_ENTRY(highlight) -JS_STATIC_PROP_ENTRY(multiline) -JS_STATIC_PROP_ENTRY(multipleSelection) -JS_STATIC_PROP_ENTRY(name) -JS_STATIC_PROP_ENTRY(numItems) -JS_STATIC_PROP_ENTRY(page) -JS_STATIC_PROP_ENTRY(password) -JS_STATIC_PROP_ENTRY(print) -JS_STATIC_PROP_ENTRY(radiosInUnison) -JS_STATIC_PROP_ENTRY(readonly) -JS_STATIC_PROP_ENTRY(rect) -JS_STATIC_PROP_ENTRY(required) -JS_STATIC_PROP_ENTRY(richText) -JS_STATIC_PROP_ENTRY(richValue) -JS_STATIC_PROP_ENTRY(rotation) -JS_STATIC_PROP_ENTRY(strokeColor) -JS_STATIC_PROP_ENTRY(style) -JS_STATIC_PROP_ENTRY(submitName) -JS_STATIC_PROP_ENTRY(textColor) -JS_STATIC_PROP_ENTRY(textFont) -JS_STATIC_PROP_ENTRY(textSize) -JS_STATIC_PROP_ENTRY(type) -JS_STATIC_PROP_ENTRY(userName) -JS_STATIC_PROP_ENTRY(value) -JS_STATIC_PROP_ENTRY(valueAsString) -JS_STATIC_PROP_ENTRY(source) -END_JS_STATIC_PROP() - -BEGIN_JS_STATIC_METHOD(CJS_Field) -JS_STATIC_METHOD_ENTRY(browseForFileToSubmit) -JS_STATIC_METHOD_ENTRY(buttonGetCaption) -JS_STATIC_METHOD_ENTRY(buttonGetIcon) -JS_STATIC_METHOD_ENTRY(buttonImportIcon) -JS_STATIC_METHOD_ENTRY(buttonSetCaption) -JS_STATIC_METHOD_ENTRY(buttonSetIcon) -JS_STATIC_METHOD_ENTRY(checkThisBox) -JS_STATIC_METHOD_ENTRY(clearItems) -JS_STATIC_METHOD_ENTRY(defaultIsChecked) -JS_STATIC_METHOD_ENTRY(deleteItemAt) -JS_STATIC_METHOD_ENTRY(getArray) -JS_STATIC_METHOD_ENTRY(getItemAt) -JS_STATIC_METHOD_ENTRY(getLock) -JS_STATIC_METHOD_ENTRY(insertItemAt) -JS_STATIC_METHOD_ENTRY(isBoxChecked) -JS_STATIC_METHOD_ENTRY(isDefaultChecked) -JS_STATIC_METHOD_ENTRY(setAction) -JS_STATIC_METHOD_ENTRY(setFocus) -JS_STATIC_METHOD_ENTRY(setItems) -JS_STATIC_METHOD_ENTRY(setLock) -JS_STATIC_METHOD_ENTRY(signatureGetModifications) -JS_STATIC_METHOD_ENTRY(signatureGetSeedValue) -JS_STATIC_METHOD_ENTRY(signatureInfo) -JS_STATIC_METHOD_ENTRY(signatureSetSeedValue) -JS_STATIC_METHOD_ENTRY(signatureSign) -JS_STATIC_METHOD_ENTRY(signatureValidate) -END_JS_STATIC_METHOD() - -IMPLEMENT_JS_CLASS(CJS_Field, Field) - -void CJS_Field::InitInstance(IJS_Runtime* pIRuntime) { - CJS_Runtime* pRuntime = static_cast<CJS_Runtime*>(pIRuntime); - Field* pField = static_cast<Field*>(GetEmbedObject()); - pField->SetIsolate(pRuntime->GetIsolate()); -} - -Field::Field(CJS_Object* pJSObject) - : CJS_EmbedObj(pJSObject), - m_pJSDoc(NULL), - m_pDocument(NULL), - m_nFormControlIndex(-1), - m_bCanSet(FALSE), - m_bDelay(FALSE), - m_isolate(NULL) {} - -Field::~Field() {} - -// note: iControlNo = -1, means not a widget. -void Field::ParseFieldName(const std::wstring& strFieldNameParsed, - std::wstring& strFieldName, - int& iControlNo) { - int iStart = strFieldNameParsed.find_last_of(L'.'); - if (iStart == -1) { - strFieldName = strFieldNameParsed; - iControlNo = -1; - return; - } - std::wstring suffixal = strFieldNameParsed.substr(iStart + 1); - iControlNo = FXSYS_wtoi(suffixal.c_str()); - if (iControlNo == 0) { - int iStart; - while ((iStart = suffixal.find_last_of(L" ")) != -1) { - suffixal.erase(iStart, 1); - } - - if (suffixal.compare(L"0") != 0) { - strFieldName = strFieldNameParsed; - iControlNo = -1; - return; - } - } - strFieldName = strFieldNameParsed.substr(0, iStart); -} - -FX_BOOL Field::AttachField(Document* pDocument, - const CFX_WideString& csFieldName) { - m_pJSDoc = pDocument; - m_pDocument = pDocument->GetReaderDoc(); - m_bCanSet = m_pDocument->GetPermissions(FPDFPERM_FILL_FORM) || - m_pDocument->GetPermissions(FPDFPERM_ANNOT_FORM) || - m_pDocument->GetPermissions(FPDFPERM_MODIFY); - - CPDFSDK_InterForm* pRDInterForm = m_pDocument->GetInterForm(); - CPDF_InterForm* pInterForm = pRDInterForm->GetInterForm(); - CFX_WideString swFieldNameTemp = csFieldName; - swFieldNameTemp.Replace(L"..", L"."); - - if (pInterForm->CountFields(swFieldNameTemp) <= 0) { - std::wstring strFieldName; - int iControlNo = -1; - ParseFieldName(swFieldNameTemp.c_str(), strFieldName, iControlNo); - if (iControlNo == -1) - return FALSE; - - m_FieldName = strFieldName.c_str(); - m_nFormControlIndex = iControlNo; - return TRUE; - } - - m_FieldName = swFieldNameTemp; - m_nFormControlIndex = -1; - - return TRUE; -} - -std::vector<CPDF_FormField*> Field::GetFormFields( - CPDFSDK_Document* pDocument, - const CFX_WideString& csFieldName) { - std::vector<CPDF_FormField*> fields; - CPDFSDK_InterForm* pReaderInterForm = pDocument->GetInterForm(); - CPDF_InterForm* pInterForm = pReaderInterForm->GetInterForm(); - for (int i = 0, sz = pInterForm->CountFields(csFieldName); i < sz; ++i) { - if (CPDF_FormField* pFormField = pInterForm->GetField(i, csFieldName)) - fields.push_back(pFormField); - } - return fields; -} - -std::vector<CPDF_FormField*> Field::GetFormFields( - const CFX_WideString& csFieldName) const { - return Field::GetFormFields(m_pDocument, csFieldName); -} - -void Field::UpdateFormField(CPDFSDK_Document* pDocument, - CPDF_FormField* pFormField, - FX_BOOL bChangeMark, - FX_BOOL bResetAP, - FX_BOOL bRefresh) { - std::vector<CPDFSDK_Widget*> widgets; - CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm(); - pInterForm->GetWidgets(pFormField, &widgets); - - if (bResetAP) { - int nFieldType = pFormField->GetFieldType(); - if (nFieldType == FIELDTYPE_COMBOBOX || nFieldType == FIELDTYPE_TEXTFIELD) { - for (CPDFSDK_Widget* pWidget : widgets) { - FX_BOOL bFormatted = FALSE; - CFX_WideString sValue = pWidget->OnFormat(bFormatted); - pWidget->ResetAppearance(bFormatted ? sValue.c_str() : nullptr, FALSE); - } - } else { - for (CPDFSDK_Widget* pWidget : widgets) { - pWidget->ResetAppearance(nullptr, FALSE); - } - } - } - - if (bRefresh) { - for (CPDFSDK_Widget* pWidget : widgets) { - CPDFSDK_Document* pDoc = pWidget->GetInterForm()->GetDocument(); - pDoc->UpdateAllViews(nullptr, pWidget); - } - } - - if (bChangeMark) - pDocument->SetChangeMark(); -} - -void Field::UpdateFormControl(CPDFSDK_Document* pDocument, - CPDF_FormControl* pFormControl, - FX_BOOL bChangeMark, - FX_BOOL bResetAP, - FX_BOOL bRefresh) { - ASSERT(pFormControl); - - CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm(); - CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl); - - if (pWidget) { - if (bResetAP) { - int nFieldType = pWidget->GetFieldType(); - if (nFieldType == FIELDTYPE_COMBOBOX || - nFieldType == FIELDTYPE_TEXTFIELD) { - FX_BOOL bFormated = FALSE; - CFX_WideString sValue = pWidget->OnFormat(bFormated); - if (bFormated) - pWidget->ResetAppearance(sValue.c_str(), FALSE); - else - pWidget->ResetAppearance(NULL, FALSE); - } else { - pWidget->ResetAppearance(NULL, FALSE); - } - } - - if (bRefresh) { - CPDFSDK_InterForm* pInterForm = pWidget->GetInterForm(); - CPDFSDK_Document* pDoc = pInterForm->GetDocument(); - pDoc->UpdateAllViews(NULL, pWidget); - } - } - - if (bChangeMark) - pDocument->SetChangeMark(); -} - -CPDFSDK_Widget* Field::GetWidget(CPDFSDK_Document* pDocument, - CPDF_FormControl* pFormControl) { - CPDFSDK_InterForm* pInterForm = - static_cast<CPDFSDK_InterForm*>(pDocument->GetInterForm()); - return pInterForm ? pInterForm->GetWidget(pFormControl) : nullptr; -} - -FX_BOOL Field::ValueIsOccur(CPDF_FormField* pFormField, - CFX_WideString csOptLabel) { - for (int i = 0, sz = pFormField->CountOptions(); i < sz; i++) { - if (csOptLabel.Compare(pFormField->GetOptionLabel(i)) == 0) - return TRUE; - } - - return FALSE; -} - -CPDF_FormControl* Field::GetSmartFieldControl(CPDF_FormField* pFormField) { - if (!pFormField->CountControls() || - m_nFormControlIndex >= pFormField->CountControls()) - return NULL; - - if (m_nFormControlIndex < 0) - return pFormField->GetControl(0); - - return pFormField->GetControl(m_nFormControlIndex); -} - -FX_BOOL Field::alignment(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - ASSERT(m_pDocument); - - if (vp.IsSetting()) { - if (!m_bCanSet) - return FALSE; - - CFX_ByteString alignStr; - vp >> alignStr; - - if (m_bDelay) { - AddDelay_String(FP_ALIGNMENT, alignStr); - } else { - Field::SetAlignment(m_pDocument, m_FieldName, m_nFormControlIndex, - alignStr); - } - } else { - std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); - if (FieldArray.empty()) - return FALSE; - - CPDF_FormField* pFormField = FieldArray[0]; - if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD) - return FALSE; - - CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField); - if (!pFormControl) - return FALSE; - - switch (pFormControl->GetControlAlignment()) { - case 1: - vp << L"center"; - break; - case 0: - vp << L"left"; - break; - case 2: - vp << L"right"; - break; - default: - vp << L""; - } - } - - return TRUE; -} - -void Field::SetAlignment(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - const CFX_ByteString& string) { - // Not supported. -} - -FX_BOOL Field::borderStyle(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - ASSERT(m_pDocument); - - if (vp.IsSetting()) { - if (!m_bCanSet) - return FALSE; - - CFX_ByteString strType = ""; - vp >> strType; - - if (m_bDelay) { - AddDelay_String(FP_BORDERSTYLE, strType); - } else { - Field::SetBorderStyle(m_pDocument, m_FieldName, m_nFormControlIndex, - strType); - } - } else { - std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); - if (FieldArray.empty()) - return FALSE; - - CPDF_FormField* pFormField = FieldArray[0]; - if (!pFormField) - return FALSE; - - CPDFSDK_Widget* pWidget = - GetWidget(m_pDocument, GetSmartFieldControl(pFormField)); - if (!pWidget) - return FALSE; - - int nBorderstyle = pWidget->GetBorderStyle(); - - switch (nBorderstyle) { - case BBS_SOLID: - vp << L"solid"; - break; - case BBS_DASH: - vp << L"dashed"; - break; - case BBS_BEVELED: - vp << L"beveled"; - break; - case BBS_INSET: - vp << L"inset"; - break; - case BBS_UNDERLINE: - vp << L"underline"; - break; - default: - vp << L""; - break; - } - } - - return TRUE; -} - -void Field::SetBorderStyle(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - const CFX_ByteString& string) { - ASSERT(pDocument); - - int nBorderStyle = 0; - - if (string == "solid") - nBorderStyle = BBS_SOLID; - else if (string == "beveled") - nBorderStyle = BBS_BEVELED; - else if (string == "dashed") - nBorderStyle = BBS_DASH; - else if (string == "inset") - nBorderStyle = BBS_INSET; - else if (string == "underline") - nBorderStyle = BBS_UNDERLINE; - else - return; - - std::vector<CPDF_FormField*> FieldArray = - GetFormFields(pDocument, swFieldName); - for (CPDF_FormField* pFormField : FieldArray) { - if (nControlIndex < 0) { - FX_BOOL bSet = FALSE; - for (int i = 0, sz = pFormField->CountControls(); i < sz; ++i) { - if (CPDFSDK_Widget* pWidget = - GetWidget(pDocument, pFormField->GetControl(i))) { - if (pWidget->GetBorderStyle() != nBorderStyle) { - pWidget->SetBorderStyle(nBorderStyle); - bSet = TRUE; - } - } - } - if (bSet) - UpdateFormField(pDocument, pFormField, TRUE, TRUE, TRUE); - } else { - if (nControlIndex >= pFormField->CountControls()) - return; - if (CPDF_FormControl* pFormControl = - pFormField->GetControl(nControlIndex)) { - if (CPDFSDK_Widget* pWidget = GetWidget(pDocument, pFormControl)) { - if (pWidget->GetBorderStyle() != nBorderStyle) { - pWidget->SetBorderStyle(nBorderStyle); - UpdateFormControl(pDocument, pFormControl, TRUE, TRUE, TRUE); - } - } - } - } - } -} - -FX_BOOL Field::buttonAlignX(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - ASSERT(m_pDocument); - - if (vp.IsSetting()) { - if (!m_bCanSet) - return FALSE; - - int nVP; - vp >> nVP; - - if (m_bDelay) { - AddDelay_Int(FP_BUTTONALIGNX, nVP); - } else { - Field::SetButtonAlignX(m_pDocument, m_FieldName, m_nFormControlIndex, - nVP); - } - } else { - std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); - if (FieldArray.empty()) - return FALSE; - - CPDF_FormField* pFormField = FieldArray[0]; - if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON) - return FALSE; - - CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField); - if (!pFormControl) - return FALSE; - - CPDF_IconFit IconFit = pFormControl->GetIconFit(); - - FX_FLOAT fLeft, fBottom; - IconFit.GetIconPosition(fLeft, fBottom); - - vp << (int32_t)fLeft; - } - - return TRUE; -} - -void Field::SetButtonAlignX(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - int number) { - // Not supported. -} - -FX_BOOL Field::buttonAlignY(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - ASSERT(m_pDocument); - - if (vp.IsSetting()) { - if (!m_bCanSet) - return FALSE; - - int nVP; - vp >> nVP; - - if (m_bDelay) { - AddDelay_Int(FP_BUTTONALIGNY, nVP); - } else { - Field::SetButtonAlignY(m_pDocument, m_FieldName, m_nFormControlIndex, - nVP); - } - } else { - std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); - if (FieldArray.empty()) - return FALSE; - - CPDF_FormField* pFormField = FieldArray[0]; - if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON) - return FALSE; - - CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField); - if (!pFormControl) - return FALSE; - - CPDF_IconFit IconFit = pFormControl->GetIconFit(); - - FX_FLOAT fLeft, fBottom; - IconFit.GetIconPosition(fLeft, fBottom); - - vp << (int32_t)fBottom; - } - - return TRUE; -} - -void Field::SetButtonAlignY(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - int number) { - // Not supported. -} - -FX_BOOL Field::buttonFitBounds(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - ASSERT(m_pDocument); - - if (vp.IsSetting()) { - if (!m_bCanSet) - return FALSE; - - bool bVP; - vp >> bVP; - - if (m_bDelay) { - AddDelay_Bool(FP_BUTTONFITBOUNDS, bVP); - } else { - Field::SetButtonFitBounds(m_pDocument, m_FieldName, m_nFormControlIndex, - bVP); - } - } else { - std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); - if (FieldArray.empty()) - return FALSE; - - CPDF_FormField* pFormField = FieldArray[0]; - if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON) - return FALSE; - - CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField); - if (!pFormControl) - return FALSE; - - CPDF_IconFit IconFit = pFormControl->GetIconFit(); - vp << IconFit.GetFittingBounds(); - } - - return TRUE; -} - -void Field::SetButtonFitBounds(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - bool b) { - // Not supported. -} - -FX_BOOL Field::buttonPosition(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - ASSERT(m_pDocument); - - if (vp.IsSetting()) { - if (!m_bCanSet) - return FALSE; - - int nVP; - vp >> nVP; - - if (m_bDelay) { - AddDelay_Int(FP_BUTTONPOSITION, nVP); - } else { - Field::SetButtonPosition(m_pDocument, m_FieldName, m_nFormControlIndex, - nVP); - } - } else { - std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); - if (FieldArray.empty()) - return FALSE; - - CPDF_FormField* pFormField = FieldArray[0]; - if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON) - return FALSE; - - CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField); - if (!pFormControl) - return FALSE; - - vp << pFormControl->GetTextPosition(); - } - return TRUE; -} - -void Field::SetButtonPosition(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - int number) { - // Not supported. -} - -FX_BOOL Field::buttonScaleHow(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - ASSERT(m_pDocument); - - if (vp.IsSetting()) { - if (!m_bCanSet) - return FALSE; - - int nVP; - vp >> nVP; - - if (m_bDelay) { - AddDelay_Int(FP_BUTTONSCALEHOW, nVP); - } else { - Field::SetButtonScaleHow(m_pDocument, m_FieldName, m_nFormControlIndex, - nVP); - } - } else { - std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); - if (FieldArray.empty()) - return FALSE; - - CPDF_FormField* pFormField = FieldArray[0]; - if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON) - return FALSE; - - CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField); - if (!pFormControl) - return FALSE; - - CPDF_IconFit IconFit = pFormControl->GetIconFit(); - if (IconFit.IsProportionalScale()) - vp << (int32_t)0; - else - vp << (int32_t)1; - } - - return TRUE; -} - -void Field::SetButtonScaleHow(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - int number) { - // Not supported. -} - -FX_BOOL Field::buttonScaleWhen(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - ASSERT(m_pDocument); - - if (vp.IsSetting()) { - if (!m_bCanSet) - return FALSE; - - int nVP; - vp >> nVP; - - if (m_bDelay) { - AddDelay_Int(FP_BUTTONSCALEWHEN, nVP); - } else { - Field::SetButtonScaleWhen(m_pDocument, m_FieldName, m_nFormControlIndex, - nVP); - } - } else { - std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); - if (FieldArray.empty()) - return FALSE; - - CPDF_FormField* pFormField = FieldArray[0]; - if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON) - return FALSE; - - CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField); - if (!pFormControl) - return FALSE; - - CPDF_IconFit IconFit = pFormControl->GetIconFit(); - int ScaleM = IconFit.GetScaleMethod(); - switch (ScaleM) { - case CPDF_IconFit::Always: - vp << (int32_t)CPDF_IconFit::Always; - break; - case CPDF_IconFit::Bigger: - vp << (int32_t)CPDF_IconFit::Bigger; - break; - case CPDF_IconFit::Never: - vp << (int32_t)CPDF_IconFit::Never; - break; - case CPDF_IconFit::Smaller: - vp << (int32_t)CPDF_IconFit::Smaller; - break; - } - } - - return TRUE; -} - -void Field::SetButtonScaleWhen(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - int number) { - // Not supported. -} - -FX_BOOL Field::calcOrderIndex(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - ASSERT(m_pDocument); - - if (vp.IsSetting()) { - if (!m_bCanSet) - return FALSE; - - int nVP; - vp >> nVP; - - if (m_bDelay) { - AddDelay_Int(FP_CALCORDERINDEX, nVP); - } else { - Field::SetCalcOrderIndex(m_pDocument, m_FieldName, m_nFormControlIndex, - nVP); - } - } else { - std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); - if (FieldArray.empty()) - return FALSE; - - CPDF_FormField* pFormField = FieldArray[0]; - if (pFormField->GetFieldType() != FIELDTYPE_COMBOBOX && - pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD) { - return FALSE; - } - - CPDFSDK_InterForm* pRDInterForm = m_pDocument->GetInterForm(); - CPDF_InterForm* pInterForm = pRDInterForm->GetInterForm(); - vp << (int32_t)pInterForm->FindFieldInCalculationOrder(pFormField); - } - - return TRUE; -} - -void Field::SetCalcOrderIndex(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - int number) { - // Not supported. -} - -FX_BOOL Field::charLimit(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - ASSERT(m_pDocument); - - if (vp.IsSetting()) { - if (!m_bCanSet) - return FALSE; - - int nVP; - vp >> nVP; - - if (m_bDelay) { - AddDelay_Int(FP_CHARLIMIT, nVP); - } else { - Field::SetCharLimit(m_pDocument, m_FieldName, m_nFormControlIndex, nVP); - } - } else { - std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); - if (FieldArray.empty()) - return FALSE; - - CPDF_FormField* pFormField = FieldArray[0]; - if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD) - return FALSE; - - vp << (int32_t)pFormField->GetMaxLen(); - } - return TRUE; -} - -void Field::SetCharLimit(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - int number) { - // Not supported. -} - -FX_BOOL Field::comb(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - ASSERT(m_pDocument); - - if (vp.IsSetting()) { - if (!m_bCanSet) - return FALSE; - - bool bVP; - vp >> bVP; - - if (m_bDelay) { - AddDelay_Bool(FP_COMB, bVP); - } else { - Field::SetComb(m_pDocument, m_FieldName, m_nFormControlIndex, bVP); - } - } else { - std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); - if (FieldArray.empty()) - return FALSE; - - CPDF_FormField* pFormField = FieldArray[0]; - if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD) - return FALSE; - - if (pFormField->GetFieldFlags() & FIELDFLAG_COMB) - vp << true; - else - vp << false; - } - - return TRUE; -} - -void Field::SetComb(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - bool b) { - // Not supported. -} - -FX_BOOL Field::commitOnSelChange(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - ASSERT(m_pDocument); - - if (vp.IsSetting()) { - if (!m_bCanSet) - return FALSE; - - bool bVP; - vp >> bVP; - - if (m_bDelay) { - AddDelay_Bool(FP_COMMITONSELCHANGE, bVP); - } else { - Field::SetCommitOnSelChange(m_pDocument, m_FieldName, m_nFormControlIndex, - bVP); - } - } else { - std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); - if (FieldArray.empty()) - return FALSE; - - CPDF_FormField* pFormField = FieldArray[0]; - if (pFormField->GetFieldType() != FIELDTYPE_COMBOBOX && - pFormField->GetFieldType() != FIELDTYPE_LISTBOX) { - return FALSE; - } - - if (pFormField->GetFieldFlags() & FIELDFLAG_COMMITONSELCHANGE) - vp << true; - else - vp << false; - } - - return TRUE; -} - -void Field::SetCommitOnSelChange(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - bool b) { - // Not supported. -} - -FX_BOOL Field::currentValueIndices(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc); - - if (vp.IsSetting()) { - if (!m_bCanSet) - return FALSE; - - CFX_DWordArray array; - - if (vp.GetType() == CJS_Value::VT_number) { - int iSelecting = 0; - vp >> iSelecting; - array.Add(iSelecting); - } else if (vp.IsArrayObject()) { - CJS_Array SelArray(pRuntime); - CJS_Value SelValue(pRuntime); - int iSelecting; - vp >> SelArray; - for (int i = 0, sz = SelArray.GetLength(); i < sz; i++) { - SelArray.GetElement(i, SelValue); - iSelecting = SelValue.ToInt(); - array.Add(iSelecting); - } - } - - if (m_bDelay) { - AddDelay_WordArray(FP_CURRENTVALUEINDICES, array); - } else { - Field::SetCurrentValueIndices(m_pDocument, m_FieldName, - m_nFormControlIndex, array); - } - } else { - std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); - if (FieldArray.empty()) - return FALSE; - - CPDF_FormField* pFormField = FieldArray[0]; - if (pFormField->GetFieldType() != FIELDTYPE_COMBOBOX && - pFormField->GetFieldType() != FIELDTYPE_LISTBOX) { - return FALSE; - } - - if (pFormField->CountSelectedItems() == 1) { - vp << pFormField->GetSelectedIndex(0); - } else if (pFormField->CountSelectedItems() > 1) { - CJS_Array SelArray(pRuntime); - for (int i = 0, sz = pFormField->CountSelectedItems(); i < sz; i++) { - SelArray.SetElement( - i, CJS_Value(pRuntime, pFormField->GetSelectedIndex(i))); - } - vp << SelArray; - } else { - vp << -1; - } - } - - return TRUE; -} - -void Field::SetCurrentValueIndices(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - const CFX_DWordArray& array) { - ASSERT(pDocument); - - std::vector<CPDF_FormField*> FieldArray = - GetFormFields(pDocument, swFieldName); - for (CPDF_FormField* pFormField : FieldArray) { - int nFieldType = pFormField->GetFieldType(); - if (nFieldType == FIELDTYPE_COMBOBOX || nFieldType == FIELDTYPE_LISTBOX) { - FX_DWORD dwFieldFlags = pFormField->GetFieldFlags(); - pFormField->ClearSelection(TRUE); - - for (int i = 0, sz = array.GetSize(); i < sz; i++) { - if (i > 0 && !(dwFieldFlags & (1 << 21))) { - break; - } - - int iSelecting = (int32_t)array.GetAt(i); - if (iSelecting < pFormField->CountOptions() && - !pFormField->IsItemSelected(iSelecting)) - pFormField->SetItemSelection(iSelecting, TRUE); - } - UpdateFormField(pDocument, pFormField, TRUE, TRUE, TRUE); - } - } -} - -FX_BOOL Field::defaultStyle(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - return FALSE; -} - -void Field::SetDefaultStyle(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex) { - // Not supported. -} - -FX_BOOL Field::defaultValue(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - ASSERT(m_pDocument); - - if (vp.IsSetting()) { - if (!m_bCanSet) - return FALSE; - - CFX_WideString WideStr; - vp >> WideStr; - - if (m_bDelay) { - AddDelay_WideString(FP_DEFAULTVALUE, WideStr); - } else { - Field::SetDefaultValue(m_pDocument, m_FieldName, m_nFormControlIndex, - WideStr); - } - } else { - std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); - if (FieldArray.empty()) - return FALSE; - - CPDF_FormField* pFormField = FieldArray[0]; - if (pFormField->GetFieldType() == FIELDTYPE_PUSHBUTTON || - pFormField->GetFieldType() == FIELDTYPE_SIGNATURE) { - return FALSE; - } - - vp << pFormField->GetDefaultValue(); - } - return TRUE; -} - -void Field::SetDefaultValue(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - const CFX_WideString& string) { - // Not supported. -} - -FX_BOOL Field::doNotScroll(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - ASSERT(m_pDocument); - - if (vp.IsSetting()) { - if (!m_bCanSet) - return FALSE; - - bool bVP; - vp >> bVP; - - if (m_bDelay) { - AddDelay_Bool(FP_DONOTSCROLL, bVP); - } else { - Field::SetDoNotScroll(m_pDocument, m_FieldName, m_nFormControlIndex, bVP); - } - } else { - std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); - if (FieldArray.empty()) - return FALSE; - - CPDF_FormField* pFormField = FieldArray[0]; - if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD) - return FALSE; - - if (pFormField->GetFieldFlags() & FIELDFLAG_DONOTSCROLL) - vp << true; - else - vp << false; - } - - return TRUE; -} - -void Field::SetDoNotScroll(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - bool b) { - // Not supported. -} - -FX_BOOL Field::doNotSpellCheck(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - ASSERT(m_pDocument); - - if (vp.IsSetting()) { - if (!m_bCanSet) - return FALSE; - - bool bVP; - vp >> bVP; - } else { - std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); - if (FieldArray.empty()) - return FALSE; - - CPDF_FormField* pFormField = FieldArray[0]; - if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD && - pFormField->GetFieldType() != FIELDTYPE_COMBOBOX) { - return FALSE; - } - - if (pFormField->GetFieldFlags() & FIELDFLAG_DONOTSPELLCHECK) - vp << true; - else - vp << false; - } - - return TRUE; -} - -void Field::SetDelay(FX_BOOL bDelay) { - m_bDelay = bDelay; - - if (!m_bDelay) { - if (m_pJSDoc) - m_pJSDoc->DoFieldDelay(m_FieldName, m_nFormControlIndex); - } -} - -FX_BOOL Field::delay(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - if (vp.IsSetting()) { - if (!m_bCanSet) - return FALSE; - - bool bVP; - vp >> bVP; - - SetDelay(bVP); - } else { - vp << m_bDelay; - } - return TRUE; -} - -FX_BOOL Field::display(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - if (vp.IsSetting()) { - if (!m_bCanSet) - return FALSE; - - int nVP; - vp >> nVP; - - if (m_bDelay) { - AddDelay_Int(FP_DISPLAY, nVP); - } else { - Field::SetDisplay(m_pDocument, m_FieldName, m_nFormControlIndex, nVP); - } - } else { - std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); - if (FieldArray.empty()) - return FALSE; - - CPDF_FormField* pFormField = FieldArray[0]; - ASSERT(pFormField); - CPDFSDK_InterForm* pInterForm = - (CPDFSDK_InterForm*)m_pDocument->GetInterForm(); - CPDFSDK_Widget* pWidget = - pInterForm->GetWidget(GetSmartFieldControl(pFormField)); - if (!pWidget) - return FALSE; - - FX_DWORD dwFlag = pWidget->GetFlags(); - - if (ANNOTFLAG_INVISIBLE & dwFlag || ANNOTFLAG_HIDDEN & dwFlag) { - vp << (int32_t)1; - } else { - if (ANNOTFLAG_PRINT & dwFlag) { - if (ANNOTFLAG_NOVIEW & dwFlag) { - vp << (int32_t)3; - } else { - vp << (int32_t)0; - } - } else { - vp << (int32_t)2; - } - } - } - - return TRUE; -} - -void Field::SetDisplay(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - int number) { - CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm(); - std::vector<CPDF_FormField*> FieldArray = - GetFormFields(pDocument, swFieldName); - for (CPDF_FormField* pFormField : FieldArray) { - if (nControlIndex < 0) { - FX_BOOL bSet = FALSE; - for (int i = 0, sz = pFormField->CountControls(); i < sz; ++i) { - CPDF_FormControl* pFormControl = pFormField->GetControl(i); - ASSERT(pFormControl); - - if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl)) { - FX_DWORD dwFlag = pWidget->GetFlags(); - switch (number) { - case 0: - dwFlag &= (~ANNOTFLAG_INVISIBLE); - dwFlag &= (~ANNOTFLAG_HIDDEN); - dwFlag &= (~ANNOTFLAG_NOVIEW); - dwFlag |= ANNOTFLAG_PRINT; - break; - case 1: - dwFlag &= (~ANNOTFLAG_INVISIBLE); - dwFlag &= (~ANNOTFLAG_NOVIEW); - dwFlag |= (ANNOTFLAG_HIDDEN | ANNOTFLAG_PRINT); - break; - case 2: - dwFlag &= (~ANNOTFLAG_INVISIBLE); - dwFlag &= (~ANNOTFLAG_PRINT); - dwFlag &= (~ANNOTFLAG_HIDDEN); - dwFlag &= (~ANNOTFLAG_NOVIEW); - break; - case 3: - dwFlag |= ANNOTFLAG_NOVIEW; - dwFlag |= ANNOTFLAG_PRINT; - dwFlag &= (~ANNOTFLAG_HIDDEN); - break; - } - - if (dwFlag != pWidget->GetFlags()) { - pWidget->SetFlags(dwFlag); - bSet = TRUE; - } - } - } - - if (bSet) - UpdateFormField(pDocument, pFormField, TRUE, FALSE, TRUE); - } else { - if (nControlIndex >= pFormField->CountControls()) - return; - if (CPDF_FormControl* pFormControl = - pFormField->GetControl(nControlIndex)) { - if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl)) { - FX_DWORD dwFlag = pWidget->GetFlags(); - switch (number) { - case 0: - dwFlag &= (~ANNOTFLAG_INVISIBLE); - dwFlag &= (~ANNOTFLAG_HIDDEN); - dwFlag &= (~ANNOTFLAG_NOVIEW); - dwFlag |= ANNOTFLAG_PRINT; - break; - case 1: - dwFlag &= (~ANNOTFLAG_INVISIBLE); - dwFlag &= (~ANNOTFLAG_NOVIEW); - dwFlag |= (ANNOTFLAG_HIDDEN | ANNOTFLAG_PRINT); - break; - case 2: - dwFlag &= (~ANNOTFLAG_INVISIBLE); - dwFlag &= (~ANNOTFLAG_PRINT); - dwFlag &= (~ANNOTFLAG_HIDDEN); - dwFlag &= (~ANNOTFLAG_NOVIEW); - break; - case 3: - dwFlag |= ANNOTFLAG_NOVIEW; - dwFlag |= ANNOTFLAG_PRINT; - dwFlag &= (~ANNOTFLAG_HIDDEN); - break; - } - if (dwFlag != pWidget->GetFlags()) { - pWidget->SetFlags(dwFlag); - UpdateFormControl(pDocument, pFormControl, TRUE, FALSE, TRUE); - } - } - } - } - } -} - -FX_BOOL Field::doc(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError) { - if (!vp.IsGetting()) { - return FALSE; - } - vp << m_pJSDoc->GetCJSDoc(); - return TRUE; -} - -FX_BOOL Field::editable(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - if (vp.IsSetting()) { - if (!m_bCanSet) - return FALSE; - - bool bVP; - vp >> bVP; - } else { - std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); - if (FieldArray.empty()) - return FALSE; - - CPDF_FormField* pFormField = FieldArray[0]; - if (pFormField->GetFieldType() != FIELDTYPE_COMBOBOX) - return FALSE; - - if (pFormField->GetFieldFlags() & FIELDFLAG_EDIT) - vp << true; - else - vp << false; - } - - return TRUE; -} - -FX_BOOL Field::exportValues(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); - if (FieldArray.empty()) - return FALSE; - - CPDF_FormField* pFormField = FieldArray[0]; - if (pFormField->GetFieldType() != FIELDTYPE_CHECKBOX && - pFormField->GetFieldType() != FIELDTYPE_RADIOBUTTON) { - return FALSE; - } - - if (vp.IsSetting()) { - if (!m_bCanSet) - return FALSE; - - if (!vp.IsArrayObject()) - return FALSE; - } else { - CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc); - CJS_Array ExportValusArray(pRuntime); - if (m_nFormControlIndex < 0) { - for (int i = 0, sz = pFormField->CountControls(); i < sz; i++) { - CPDF_FormControl* pFormControl = pFormField->GetControl(i); - ExportValusArray.SetElement( - i, CJS_Value(pRuntime, pFormControl->GetExportValue().c_str())); - } - } else { - if (m_nFormControlIndex >= pFormField->CountControls()) - return FALSE; - - CPDF_FormControl* pFormControl = - pFormField->GetControl(m_nFormControlIndex); - if (!pFormControl) - return FALSE; - - ExportValusArray.SetElement( - 0, CJS_Value(pRuntime, pFormControl->GetExportValue().c_str())); - } - vp << ExportValusArray; - } - return TRUE; -} - -FX_BOOL Field::fileSelect(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); - if (FieldArray.empty()) - return FALSE; - - CPDF_FormField* pFormField = FieldArray[0]; - if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD) - return FALSE; - - if (vp.IsSetting()) { - if (!m_bCanSet) - return FALSE; - - bool bVP; - vp >> bVP; - } else { - if (pFormField->GetFieldFlags() & FIELDFLAG_FILESELECT) - vp << true; - else - vp << false; - } - return TRUE; -} - -FX_BOOL Field::fillColor(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc); - CJS_Array crArray(pRuntime); - std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); - if (FieldArray.empty()) - return FALSE; - - if (vp.IsSetting()) { - if (!m_bCanSet) - return FALSE; - - if (!vp.IsArrayObject()) - return FALSE; - - vp >> crArray; - - CPWL_Color color; - color::ConvertArrayToPWLColor(crArray, color); - if (m_bDelay) { - AddDelay_Color(FP_FILLCOLOR, color); - } else { - Field::SetFillColor(m_pDocument, m_FieldName, m_nFormControlIndex, color); - } - } else { - CPDF_FormField* pFormField = FieldArray[0]; - ASSERT(pFormField); - CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField); - if (!pFormControl) - return FALSE; - - int iColorType; - pFormControl->GetBackgroundColor(iColorType); - - CPWL_Color color; - if (iColorType == COLORTYPE_TRANSPARENT) { - color = CPWL_Color(COLORTYPE_TRANSPARENT); - } else if (iColorType == COLORTYPE_GRAY) { - color = CPWL_Color(COLORTYPE_GRAY, - pFormControl->GetOriginalBackgroundColor(0)); - } else if (iColorType == COLORTYPE_RGB) { - color = - CPWL_Color(COLORTYPE_RGB, pFormControl->GetOriginalBackgroundColor(0), - pFormControl->GetOriginalBackgroundColor(1), - pFormControl->GetOriginalBackgroundColor(2)); - } else if (iColorType == COLORTYPE_CMYK) { - color = CPWL_Color(COLORTYPE_CMYK, - pFormControl->GetOriginalBackgroundColor(0), - pFormControl->GetOriginalBackgroundColor(1), - pFormControl->GetOriginalBackgroundColor(2), - pFormControl->GetOriginalBackgroundColor(3)); - } else { - return FALSE; - } - - color::ConvertPWLColorToArray(color, crArray); - vp << crArray; - } - - return TRUE; -} - -void Field::SetFillColor(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - const CPWL_Color& color) { - // Not supported. -} - -FX_BOOL Field::hidden(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - if (vp.IsSetting()) { - if (!m_bCanSet) - return FALSE; - - bool bVP; - vp >> bVP; - - if (m_bDelay) { - AddDelay_Bool(FP_HIDDEN, bVP); - } else { - Field::SetHidden(m_pDocument, m_FieldName, m_nFormControlIndex, bVP); - } - } else { - std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); - if (FieldArray.empty()) - return FALSE; - - CPDF_FormField* pFormField = FieldArray[0]; - ASSERT(pFormField); - CPDFSDK_InterForm* pInterForm = - (CPDFSDK_InterForm*)m_pDocument->GetInterForm(); - CPDFSDK_Widget* pWidget = - pInterForm->GetWidget(GetSmartFieldControl(pFormField)); - if (!pWidget) - return FALSE; - - FX_DWORD dwFlags = pWidget->GetFlags(); - - if (ANNOTFLAG_INVISIBLE & dwFlags || ANNOTFLAG_HIDDEN & dwFlags) - vp << true; - else - vp << false; - } - - return TRUE; -} - -void Field::SetHidden(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - bool b) { - CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm(); - std::vector<CPDF_FormField*> FieldArray = - GetFormFields(pDocument, swFieldName); - for (CPDF_FormField* pFormField : FieldArray) { - if (nControlIndex < 0) { - FX_BOOL bSet = FALSE; - for (int i = 0, sz = pFormField->CountControls(); i < sz; ++i) { - if (CPDFSDK_Widget* pWidget = - pInterForm->GetWidget(pFormField->GetControl(i))) { - FX_DWORD dwFlags = pWidget->GetFlags(); - - if (b) { - dwFlags &= (~ANNOTFLAG_INVISIBLE); - dwFlags &= (~ANNOTFLAG_NOVIEW); - dwFlags |= (ANNOTFLAG_HIDDEN | ANNOTFLAG_PRINT); - } else { - dwFlags &= (~ANNOTFLAG_INVISIBLE); - dwFlags &= (~ANNOTFLAG_HIDDEN); - dwFlags &= (~ANNOTFLAG_NOVIEW); - dwFlags |= ANNOTFLAG_PRINT; - } - - if (dwFlags != pWidget->GetFlags()) { - pWidget->SetFlags(dwFlags); - bSet = TRUE; - } - } - } - - if (bSet) - UpdateFormField(pDocument, pFormField, TRUE, FALSE, TRUE); - } else { - if (nControlIndex >= pFormField->CountControls()) - return; - if (CPDF_FormControl* pFormControl = - pFormField->GetControl(nControlIndex)) { - if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl)) { - FX_DWORD dwFlags = pWidget->GetFlags(); - - if (b) { - dwFlags &= (~ANNOTFLAG_INVISIBLE); - dwFlags &= (~ANNOTFLAG_NOVIEW); - dwFlags |= (ANNOTFLAG_HIDDEN | ANNOTFLAG_PRINT); - } else { - dwFlags &= (~ANNOTFLAG_INVISIBLE); - dwFlags &= (~ANNOTFLAG_HIDDEN); - dwFlags &= (~ANNOTFLAG_NOVIEW); - dwFlags |= ANNOTFLAG_PRINT; - } - - if (dwFlags != pWidget->GetFlags()) { - pWidget->SetFlags(dwFlags); - UpdateFormControl(pDocument, pFormControl, TRUE, FALSE, TRUE); - } - } - } - } - } -} - -FX_BOOL Field::highlight(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - ASSERT(m_pDocument); - - if (vp.IsSetting()) { - if (!m_bCanSet) - return FALSE; - - CFX_ByteString strMode; - vp >> strMode; - - if (m_bDelay) { - AddDelay_String(FP_HIGHLIGHT, strMode); - } else { - Field::SetHighlight(m_pDocument, m_FieldName, m_nFormControlIndex, - strMode); - } - } else { - std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); - if (FieldArray.empty()) - return FALSE; - - CPDF_FormField* pFormField = FieldArray[0]; - if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON) - return FALSE; - - CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField); - if (!pFormControl) - return FALSE; - - int eHM = pFormControl->GetHighlightingMode(); - switch (eHM) { - case CPDF_FormControl::None: - vp << L"none"; - break; - case CPDF_FormControl::Push: - vp << L"push"; - break; - case CPDF_FormControl::Invert: - vp << L"invert"; - break; - case CPDF_FormControl::Outline: - vp << L"outline"; - break; - case CPDF_FormControl::Toggle: - vp << L"toggle"; - break; - } - } - - return TRUE; -} - -void Field::SetHighlight(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - const CFX_ByteString& string) { - // Not supported. -} - -FX_BOOL Field::lineWidth(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - if (vp.IsSetting()) { - if (!m_bCanSet) - return FALSE; - - int iWidth; - vp >> iWidth; - - if (m_bDelay) { - AddDelay_Int(FP_LINEWIDTH, iWidth); - } else { - Field::SetLineWidth(m_pDocument, m_FieldName, m_nFormControlIndex, - iWidth); - } - } else { - std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); - if (FieldArray.empty()) - return FALSE; - - CPDF_FormField* pFormField = FieldArray[0]; - ASSERT(pFormField); - CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField); - if (!pFormControl) - return FALSE; - - CPDFSDK_InterForm* pInterForm = - (CPDFSDK_InterForm*)m_pDocument->GetInterForm(); - if (!pFormField->CountControls()) - return FALSE; - - CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormField->GetControl(0)); - if (!pWidget) - return FALSE; - - vp << (int32_t)pWidget->GetBorderWidth(); - } - - return TRUE; -} - -void Field::SetLineWidth(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - int number) { - CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm(); - - std::vector<CPDF_FormField*> FieldArray = - GetFormFields(pDocument, swFieldName); - for (CPDF_FormField* pFormField : FieldArray) { - if (nControlIndex < 0) { - FX_BOOL bSet = FALSE; - for (int i = 0, sz = pFormField->CountControls(); i < sz; ++i) { - CPDF_FormControl* pFormControl = pFormField->GetControl(i); - ASSERT(pFormControl); - - if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl)) { - if (number != pWidget->GetBorderWidth()) { - pWidget->SetBorderWidth(number); - bSet = TRUE; - } - } - } - if (bSet) - UpdateFormField(pDocument, pFormField, TRUE, TRUE, TRUE); - } else { - if (nControlIndex >= pFormField->CountControls()) - return; - if (CPDF_FormControl* pFormControl = - pFormField->GetControl(nControlIndex)) { - if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl)) { - if (number != pWidget->GetBorderWidth()) { - pWidget->SetBorderWidth(number); - UpdateFormControl(pDocument, pFormControl, TRUE, TRUE, TRUE); - } - } - } - } - } -} - -FX_BOOL Field::multiline(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - ASSERT(m_pDocument); - - if (vp.IsSetting()) { - if (!m_bCanSet) - return FALSE; - - bool bVP; - vp >> bVP; - - if (m_bDelay) { - AddDelay_Bool(FP_MULTILINE, bVP); - } else { - Field::SetMultiline(m_pDocument, m_FieldName, m_nFormControlIndex, bVP); - } - } else { - std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); - if (FieldArray.empty()) - return FALSE; - - CPDF_FormField* pFormField = FieldArray[0]; - if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD) - return FALSE; - - if (pFormField->GetFieldFlags() & FIELDFLAG_MULTILINE) - vp << true; - else - vp << false; - } - - return TRUE; -} - -void Field::SetMultiline(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - bool b) { - // Not supported. -} - -FX_BOOL Field::multipleSelection(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - ASSERT(m_pDocument); - - if (vp.IsSetting()) { - if (!m_bCanSet) - return FALSE; - - bool bVP; - vp >> bVP; - - if (m_bDelay) { - AddDelay_Bool(FP_MULTIPLESELECTION, bVP); - } else { - Field::SetMultipleSelection(m_pDocument, m_FieldName, m_nFormControlIndex, - bVP); - } - } else { - std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); - if (FieldArray.empty()) - return FALSE; - - CPDF_FormField* pFormField = FieldArray[0]; - if (pFormField->GetFieldType() != FIELDTYPE_LISTBOX) - return FALSE; - - if (pFormField->GetFieldFlags() & FIELDFLAG_MULTISELECT) - vp << true; - else - vp << false; - } - - return TRUE; -} - -void Field::SetMultipleSelection(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - bool b) { - // Not supported. -} - -FX_BOOL Field::name(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - if (!vp.IsGetting()) - return FALSE; - - std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); - if (FieldArray.empty()) - return FALSE; - - vp << m_FieldName; - - return TRUE; -} - -FX_BOOL Field::numItems(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - if (!vp.IsGetting()) - return FALSE; - - std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); - if (FieldArray.empty()) - return FALSE; - - CPDF_FormField* pFormField = FieldArray[0]; - if (pFormField->GetFieldType() != FIELDTYPE_COMBOBOX && - pFormField->GetFieldType() != FIELDTYPE_LISTBOX) { - return FALSE; - } - - vp << (int32_t)pFormField->CountOptions(); - return TRUE; -} - -FX_BOOL Field::page(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - if (!vp.IsGetting()) - return FALSE; - - std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); - if (FieldArray.empty()) - return FALSE; - - CPDF_FormField* pFormField = FieldArray[0]; - if (!pFormField) - return FALSE; - - std::vector<CPDFSDK_Widget*> widgets; - m_pDocument->GetInterForm()->GetWidgets(pFormField, &widgets); - - if (widgets.empty()) { - vp << (int32_t)-1; - return TRUE; - } - - CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc); - CJS_Array PageArray(pRuntime); - for (size_t i = 0; i < widgets.size(); ++i) { - CPDFSDK_PageView* pPageView = widgets[i]->GetPageView(); - if (!pPageView) - return FALSE; - - PageArray.SetElement( - i, CJS_Value(pRuntime, (int32_t)pPageView->GetPageIndex())); - } - - vp << PageArray; - return TRUE; -} - -FX_BOOL Field::password(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - ASSERT(m_pDocument); - - if (vp.IsSetting()) { - if (!m_bCanSet) - return FALSE; - - bool bVP; - vp >> bVP; - - if (m_bDelay) { - AddDelay_Bool(FP_PASSWORD, bVP); - } else { - Field::SetPassword(m_pDocument, m_FieldName, m_nFormControlIndex, bVP); - } - } else { - std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); - if (FieldArray.empty()) - return FALSE; - - CPDF_FormField* pFormField = FieldArray[0]; - if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD) - return FALSE; - - if (pFormField->GetFieldFlags() & FIELDFLAG_PASSWORD) - vp << true; - else - vp << false; - } - - return TRUE; -} - -void Field::SetPassword(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - bool b) { - // Not supported. -} - -FX_BOOL Field::print(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - CPDFSDK_InterForm* pInterForm = - (CPDFSDK_InterForm*)m_pDocument->GetInterForm(); - std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); - if (FieldArray.empty()) - return FALSE; - - if (vp.IsSetting()) { - if (!m_bCanSet) - return FALSE; - - bool bVP; - vp >> bVP; - - for (CPDF_FormField* pFormField : FieldArray) { - if (m_nFormControlIndex < 0) { - FX_BOOL bSet = FALSE; - for (int i = 0, sz = pFormField->CountControls(); i < sz; ++i) { - if (CPDFSDK_Widget* pWidget = - pInterForm->GetWidget(pFormField->GetControl(i))) { - FX_DWORD dwFlags = pWidget->GetFlags(); - if (bVP) - dwFlags |= ANNOTFLAG_PRINT; - else - dwFlags &= ~ANNOTFLAG_PRINT; - - if (dwFlags != pWidget->GetFlags()) { - pWidget->SetFlags(dwFlags); - bSet = TRUE; - } - } - } - - if (bSet) - UpdateFormField(m_pDocument, pFormField, TRUE, FALSE, TRUE); - } else { - if (m_nFormControlIndex >= pFormField->CountControls()) - return FALSE; - if (CPDF_FormControl* pFormControl = - pFormField->GetControl(m_nFormControlIndex)) { - if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl)) { - FX_DWORD dwFlags = pWidget->GetFlags(); - if (bVP) - dwFlags |= ANNOTFLAG_PRINT; - else - dwFlags &= ~ANNOTFLAG_PRINT; - - if (dwFlags != pWidget->GetFlags()) { - pWidget->SetFlags(dwFlags); - UpdateFormControl(m_pDocument, - pFormField->GetControl(m_nFormControlIndex), - TRUE, FALSE, TRUE); - } - } - } - } - } - } else { - CPDF_FormField* pFormField = FieldArray[0]; - CPDFSDK_Widget* pWidget = - pInterForm->GetWidget(GetSmartFieldControl(pFormField)); - if (!pWidget) - return FALSE; - - if (pWidget->GetFlags() & ANNOTFLAG_PRINT) - vp << true; - else - vp << false; - } - - return TRUE; -} - -FX_BOOL Field::radiosInUnison(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); - if (FieldArray.empty()) - return FALSE; - - if (vp.IsSetting()) { - if (!m_bCanSet) - return FALSE; - - bool bVP; - vp >> bVP; - - } else { - CPDF_FormField* pFormField = FieldArray[0]; - if (pFormField->GetFieldType() != FIELDTYPE_RADIOBUTTON) - return FALSE; - - if (pFormField->GetFieldFlags() & FIELDFLAG_RADIOSINUNISON) - vp << true; - else - vp << false; - } - - return TRUE; -} - -FX_BOOL Field::readonly(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); - if (FieldArray.empty()) - return FALSE; - - if (vp.IsSetting()) { - if (!m_bCanSet) - return FALSE; - - bool bVP; - vp >> bVP; - - } else { - CPDF_FormField* pFormField = FieldArray[0]; - if (pFormField->GetFieldFlags() & FIELDFLAG_READONLY) - vp << true; - else - vp << false; - } - - return TRUE; -} - -FX_BOOL Field::rect(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc); - CJS_Value Upper_Leftx(pRuntime); - CJS_Value Upper_Lefty(pRuntime); - CJS_Value Lower_Rightx(pRuntime); - CJS_Value Lower_Righty(pRuntime); - - if (vp.IsSetting()) { - if (!m_bCanSet) - return FALSE; - if (!vp.IsArrayObject()) - return FALSE; - - CJS_Array rcArray(pRuntime); - vp >> rcArray; - rcArray.GetElement(0, Upper_Leftx); - rcArray.GetElement(1, Upper_Lefty); - rcArray.GetElement(2, Lower_Rightx); - rcArray.GetElement(3, Lower_Righty); - - FX_FLOAT pArray[4] = {0.0f, 0.0f, 0.0f, 0.0f}; - pArray[0] = (FX_FLOAT)Upper_Leftx.ToInt(); - pArray[1] = (FX_FLOAT)Lower_Righty.ToInt(); - pArray[2] = (FX_FLOAT)Lower_Rightx.ToInt(); - pArray[3] = (FX_FLOAT)Upper_Lefty.ToInt(); - - CFX_FloatRect crRect(pArray); - if (m_bDelay) { - AddDelay_Rect(FP_RECT, crRect); - } else { - Field::SetRect(m_pDocument, m_FieldName, m_nFormControlIndex, crRect); - } - } else { - std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); - if (FieldArray.empty()) - return FALSE; - - CPDF_FormField* pFormField = FieldArray[0]; - CPDFSDK_InterForm* pInterForm = - (CPDFSDK_InterForm*)m_pDocument->GetInterForm(); - CPDFSDK_Widget* pWidget = - pInterForm->GetWidget(GetSmartFieldControl(pFormField)); - if (!pWidget) - return FALSE; - - CFX_FloatRect crRect = pWidget->GetRect(); - Upper_Leftx = (int32_t)crRect.left; - Upper_Lefty = (int32_t)crRect.top; - Lower_Rightx = (int32_t)crRect.right; - Lower_Righty = (int32_t)crRect.bottom; - - CJS_Array rcArray(pRuntime); - rcArray.SetElement(0, Upper_Leftx); - rcArray.SetElement(1, Upper_Lefty); - rcArray.SetElement(2, Lower_Rightx); - rcArray.SetElement(3, Lower_Righty); - vp << rcArray; - } - return TRUE; -} - -void Field::SetRect(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - const CFX_FloatRect& rect) { - CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm(); - - std::vector<CPDF_FormField*> FieldArray = - GetFormFields(pDocument, swFieldName); - for (CPDF_FormField* pFormField : FieldArray) { - if (nControlIndex < 0) { - FX_BOOL bSet = FALSE; - for (int i = 0, sz = pFormField->CountControls(); i < sz; ++i) { - CPDF_FormControl* pFormControl = pFormField->GetControl(i); - ASSERT(pFormControl); - - if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl)) { - CFX_FloatRect crRect = rect; - - CPDF_Page* pPDFPage = pWidget->GetPDFPage(); - crRect.Intersect(pPDFPage->GetPageBBox()); - - if (!crRect.IsEmpty()) { - CFX_FloatRect rcOld = pWidget->GetRect(); - if (crRect.left != rcOld.left || crRect.right != rcOld.right || - crRect.top != rcOld.top || crRect.bottom != rcOld.bottom) { - pWidget->SetRect(crRect); - bSet = TRUE; - } - } - } - } - - if (bSet) - UpdateFormField(pDocument, pFormField, TRUE, TRUE, TRUE); - } else { - if (nControlIndex >= pFormField->CountControls()) - return; - if (CPDF_FormControl* pFormControl = - pFormField->GetControl(nControlIndex)) { - if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl)) { - CFX_FloatRect crRect = rect; - - CPDF_Page* pPDFPage = pWidget->GetPDFPage(); - crRect.Intersect(pPDFPage->GetPageBBox()); - - if (!crRect.IsEmpty()) { - CFX_FloatRect rcOld = pWidget->GetRect(); - if (crRect.left != rcOld.left || crRect.right != rcOld.right || - crRect.top != rcOld.top || crRect.bottom != rcOld.bottom) { - pWidget->SetRect(crRect); - UpdateFormControl(pDocument, pFormControl, TRUE, TRUE, TRUE); - } - } - } - } - } - } -} - -FX_BOOL Field::required(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); - if (FieldArray.empty()) - return FALSE; - - if (vp.IsSetting()) { - if (!m_bCanSet) - return FALSE; - - bool bVP; - vp >> bVP; - - } else { - CPDF_FormField* pFormField = FieldArray[0]; - if (pFormField->GetFieldType() == FIELDTYPE_PUSHBUTTON) - return FALSE; - - if (pFormField->GetFieldFlags() & FIELDFLAG_REQUIRED) - vp << true; - else - vp << false; - } - - return TRUE; -} - -FX_BOOL Field::richText(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - ASSERT(m_pDocument); - - if (vp.IsSetting()) { - if (!m_bCanSet) - return FALSE; - - bool bVP; - vp >> bVP; - - if (m_bDelay) { - AddDelay_Bool(FP_RICHTEXT, bVP); - } else { - Field::SetRichText(m_pDocument, m_FieldName, m_nFormControlIndex, bVP); - } - } else { - std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); - if (FieldArray.empty()) - return FALSE; - - CPDF_FormField* pFormField = FieldArray[0]; - if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD) - return FALSE; - - if (pFormField->GetFieldFlags() & FIELDFLAG_RICHTEXT) - vp << true; - else - vp << false; - } - - return TRUE; -} - -void Field::SetRichText(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - bool b) { - // Not supported. -} - -FX_BOOL Field::richValue(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - return TRUE; -} - -void Field::SetRichValue(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex) { - // Not supported. -} - -FX_BOOL Field::rotation(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - ASSERT(m_pDocument); - - if (vp.IsSetting()) { - if (!m_bCanSet) - return FALSE; - - int nVP; - vp >> nVP; - - if (m_bDelay) { - AddDelay_Int(FP_ROTATION, nVP); - } else { - Field::SetRotation(m_pDocument, m_FieldName, m_nFormControlIndex, nVP); - } - } else { - std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); - if (FieldArray.empty()) - return FALSE; - - CPDF_FormField* pFormField = FieldArray[0]; - CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField); - if (!pFormControl) - return FALSE; - - vp << (int32_t)pFormControl->GetRotation(); - } - - return TRUE; -} - -void Field::SetRotation(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - int number) { - // Not supported. -} - -FX_BOOL Field::strokeColor(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc); - CJS_Array crArray(pRuntime); - - if (vp.IsSetting()) { - if (!m_bCanSet) - return FALSE; - - if (!vp.IsArrayObject()) - return FALSE; - - vp >> crArray; - - CPWL_Color color; - color::ConvertArrayToPWLColor(crArray, color); - - if (m_bDelay) { - AddDelay_Color(FP_STROKECOLOR, color); - } else { - Field::SetStrokeColor(m_pDocument, m_FieldName, m_nFormControlIndex, - color); - } - } else { - std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); - if (FieldArray.empty()) - return FALSE; - - CPDF_FormField* pFormField = FieldArray[0]; - CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField); - if (!pFormControl) - return FALSE; - - int iColorType; - pFormControl->GetBorderColor(iColorType); - - CPWL_Color color; - if (iColorType == COLORTYPE_TRANSPARENT) { - color = CPWL_Color(COLORTYPE_TRANSPARENT); - } else if (iColorType == COLORTYPE_GRAY) { - color = - CPWL_Color(COLORTYPE_GRAY, pFormControl->GetOriginalBorderColor(0)); - } else if (iColorType == COLORTYPE_RGB) { - color = CPWL_Color(COLORTYPE_RGB, pFormControl->GetOriginalBorderColor(0), - pFormControl->GetOriginalBorderColor(1), - pFormControl->GetOriginalBorderColor(2)); - } else if (iColorType == COLORTYPE_CMYK) { - color = - CPWL_Color(COLORTYPE_CMYK, pFormControl->GetOriginalBorderColor(0), - pFormControl->GetOriginalBorderColor(1), - pFormControl->GetOriginalBorderColor(2), - pFormControl->GetOriginalBorderColor(3)); - } else { - return FALSE; - } - - color::ConvertPWLColorToArray(color, crArray); - vp << crArray; - } - return TRUE; -} - -void Field::SetStrokeColor(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - const CPWL_Color& color) { - // Not supported. -} - -FX_BOOL Field::style(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - ASSERT(m_pDocument); - - if (vp.IsSetting()) { - if (!m_bCanSet) - return FALSE; - - CFX_ByteString csBCaption; - vp >> csBCaption; - - if (m_bDelay) { - AddDelay_String(FP_STYLE, csBCaption); - } else { - Field::SetStyle(m_pDocument, m_FieldName, m_nFormControlIndex, - csBCaption); - } - } else { - std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); - if (FieldArray.empty()) - return FALSE; - - CPDF_FormField* pFormField = FieldArray[0]; - if (pFormField->GetFieldType() != FIELDTYPE_RADIOBUTTON && - pFormField->GetFieldType() != FIELDTYPE_CHECKBOX) { - return FALSE; - } - - CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField); - if (!pFormControl) - return FALSE; - - CFX_WideString csWCaption = pFormControl->GetNormalCaption(); - CFX_ByteString csBCaption; - - switch (csWCaption[0]) { - case L'l': - csBCaption = "circle"; - break; - case L'8': - csBCaption = "cross"; - break; - case L'u': - csBCaption = "diamond"; - break; - case L'n': - csBCaption = "square"; - break; - case L'H': - csBCaption = "star"; - break; - default: // L'4' - csBCaption = "check"; - break; - } - vp << csBCaption; - } - - return TRUE; -} - -void Field::SetStyle(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - const CFX_ByteString& string) { - // Not supported. -} - -FX_BOOL Field::submitName(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - return TRUE; -} - -FX_BOOL Field::textColor(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc); - CJS_Array crArray(pRuntime); - - if (vp.IsSetting()) { - if (!m_bCanSet) - return FALSE; - - if (!vp.IsArrayObject()) - return FALSE; - - vp >> crArray; - - CPWL_Color color; - color::ConvertArrayToPWLColor(crArray, color); - - if (m_bDelay) { - AddDelay_Color(FP_TEXTCOLOR, color); - } else { - Field::SetTextColor(m_pDocument, m_FieldName, m_nFormControlIndex, color); - } - } else { - std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); - if (FieldArray.empty()) - return FALSE; - - CPDF_FormField* pFormField = FieldArray[0]; - CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField); - if (!pFormControl) - return FALSE; - - int iColorType; - FX_ARGB color; - CPDF_DefaultAppearance FieldAppearance = - pFormControl->GetDefaultAppearance(); - FieldAppearance.GetColor(color, iColorType); - int32_t a, r, g, b; - ArgbDecode(color, a, r, g, b); - - CPWL_Color crRet = - CPWL_Color(COLORTYPE_RGB, r / 255.0f, g / 255.0f, b / 255.0f); - - if (iColorType == COLORTYPE_TRANSPARENT) - crRet = CPWL_Color(COLORTYPE_TRANSPARENT); - - color::ConvertPWLColorToArray(crRet, crArray); - vp << crArray; - } - return TRUE; -} - -void Field::SetTextColor(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - const CPWL_Color& color) { - // Not supported. -} - -FX_BOOL Field::textFont(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - ASSERT(m_pDocument); - - if (vp.IsSetting()) { - if (!m_bCanSet) - return FALSE; - - CFX_ByteString csFontName; - vp >> csFontName; - if (csFontName.IsEmpty()) - return FALSE; - - if (m_bDelay) { - AddDelay_String(FP_TEXTFONT, csFontName); - } else { - Field::SetTextFont(m_pDocument, m_FieldName, m_nFormControlIndex, - csFontName); - } - } else { - std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); - if (FieldArray.empty()) - return FALSE; - - CPDF_FormField* pFormField = FieldArray[0]; - ASSERT(pFormField); - CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField); - if (!pFormControl) - return FALSE; - - int nFieldType = pFormField->GetFieldType(); - - if (nFieldType == FIELDTYPE_PUSHBUTTON || - nFieldType == FIELDTYPE_COMBOBOX || nFieldType == FIELDTYPE_LISTBOX || - nFieldType == FIELDTYPE_TEXTFIELD) { - CPDF_Font* pFont = pFormControl->GetDefaultControlFont(); - if (!pFont) - return FALSE; - - vp << pFont->GetBaseFont(); - } else { - return FALSE; - } - } - - return TRUE; -} - -void Field::SetTextFont(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - const CFX_ByteString& string) { - // Not supported. -} - -FX_BOOL Field::textSize(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - ASSERT(m_pDocument); - - if (vp.IsSetting()) { - if (!m_bCanSet) - return FALSE; - - int nVP; - vp >> nVP; - - if (m_bDelay) { - AddDelay_Int(FP_TEXTSIZE, nVP); - } else { - Field::SetTextSize(m_pDocument, m_FieldName, m_nFormControlIndex, nVP); - } - } else { - std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); - if (FieldArray.empty()) - return FALSE; - - CPDF_FormField* pFormField = FieldArray[0]; - ASSERT(pFormField); - CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField); - if (!pFormControl) - return FALSE; - - CPDF_DefaultAppearance FieldAppearance = - pFormControl->GetDefaultAppearance(); - - CFX_ByteString csFontNameTag; - FX_FLOAT fFontSize; - FieldAppearance.GetFont(csFontNameTag, fFontSize); - - vp << (int)fFontSize; - } - - return TRUE; -} - -void Field::SetTextSize(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - int number) { - // Not supported. -} - -FX_BOOL Field::type(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - if (!vp.IsGetting()) - return FALSE; - - std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); - if (FieldArray.empty()) - return FALSE; - - CPDF_FormField* pFormField = FieldArray[0]; - switch (pFormField->GetFieldType()) { - case FIELDTYPE_UNKNOWN: - vp << L"unknown"; - break; - case FIELDTYPE_PUSHBUTTON: - vp << L"button"; - break; - case FIELDTYPE_CHECKBOX: - vp << L"checkbox"; - break; - case FIELDTYPE_RADIOBUTTON: - vp << L"radiobutton"; - break; - case FIELDTYPE_COMBOBOX: - vp << L"combobox"; - break; - case FIELDTYPE_LISTBOX: - vp << L"listbox"; - break; - case FIELDTYPE_TEXTFIELD: - vp << L"text"; - break; - case FIELDTYPE_SIGNATURE: - vp << L"signature"; - break; - default: - vp << L"unknown"; - break; - } - - return TRUE; -} - -FX_BOOL Field::userName(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - ASSERT(m_pDocument); - - if (vp.IsSetting()) { - if (!m_bCanSet) - return FALSE; - - CFX_WideString swName; - vp >> swName; - - if (m_bDelay) { - AddDelay_WideString(FP_USERNAME, swName); - } else { - Field::SetUserName(m_pDocument, m_FieldName, m_nFormControlIndex, swName); - } - } else { - std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); - if (FieldArray.empty()) - return FALSE; - - CPDF_FormField* pFormField = FieldArray[0]; - vp << (CFX_WideString)pFormField->GetAlternateName(); - } - - return TRUE; -} - -void Field::SetUserName(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - const CFX_WideString& string) { - // Not supported. -} - -FX_BOOL Field::value(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc); - - if (vp.IsSetting()) { - if (!m_bCanSet) - return FALSE; - - CJS_WideStringArray strArray; - - if (vp.IsArrayObject()) { - CJS_Array ValueArray(pRuntime); - vp.ConvertToArray(ValueArray); - for (int i = 0, sz = ValueArray.GetLength(); i < sz; i++) { - CJS_Value ElementValue(pRuntime); - ValueArray.GetElement(i, ElementValue); - strArray.Add(ElementValue.ToCFXWideString()); - } - } else { - CFX_WideString swValue; - vp >> swValue; - strArray.Add(swValue); - } - - if (m_bDelay) { - AddDelay_WideStringArray(FP_VALUE, strArray); - } else { - Field::SetValue(m_pDocument, m_FieldName, m_nFormControlIndex, strArray); - } - } else { - std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); - if (FieldArray.empty()) - return FALSE; - - CPDF_FormField* pFormField = FieldArray[0]; - switch (pFormField->GetFieldType()) { - case FIELDTYPE_PUSHBUTTON: - return FALSE; - case FIELDTYPE_COMBOBOX: - case FIELDTYPE_TEXTFIELD: { - vp << pFormField->GetValue(); - } break; - case FIELDTYPE_LISTBOX: { - if (pFormField->CountSelectedItems() > 1) { - CJS_Array ValueArray(pRuntime); - CJS_Value ElementValue(pRuntime); - int iIndex; - for (int i = 0, sz = pFormField->CountSelectedItems(); i < sz; i++) { - iIndex = pFormField->GetSelectedIndex(i); - ElementValue = pFormField->GetOptionValue(iIndex).c_str(); - if (FXSYS_wcslen(ElementValue.ToCFXWideString().c_str()) == 0) - ElementValue = pFormField->GetOptionLabel(iIndex).c_str(); - ValueArray.SetElement(i, ElementValue); - } - vp << ValueArray; - } else { - vp << pFormField->GetValue(); - } - } break; - case FIELDTYPE_CHECKBOX: - case FIELDTYPE_RADIOBUTTON: { - bool bFind = false; - for (int i = 0, sz = pFormField->CountControls(); i < sz; i++) { - if (pFormField->GetControl(i)->IsChecked()) { - vp << pFormField->GetControl(i)->GetExportValue(); - bFind = true; - break; - } - } - if (!bFind) - vp << L"Off"; - } break; - default: - vp << pFormField->GetValue(); - break; - } - } - vp.MaybeCoerceToNumber(); - return TRUE; -} - -void Field::SetValue(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - const CJS_WideStringArray& strArray) { - ASSERT(pDocument); - - if (strArray.GetSize() < 1) - return; - - std::vector<CPDF_FormField*> FieldArray = - GetFormFields(pDocument, swFieldName); - - for (CPDF_FormField* pFormField : FieldArray) { - if (pFormField->GetFullName().Compare(swFieldName) != 0) - continue; - - switch (pFormField->GetFieldType()) { - case FIELDTYPE_TEXTFIELD: - case FIELDTYPE_COMBOBOX: - if (pFormField->GetValue() != strArray.GetAt(0)) { - CFX_WideString WideString = strArray.GetAt(0); - pFormField->SetValue(strArray.GetAt(0), TRUE); - UpdateFormField(pDocument, pFormField, TRUE, FALSE, TRUE); - } - break; - case FIELDTYPE_CHECKBOX: // mantis: 0004493 - case FIELDTYPE_RADIOBUTTON: { - if (pFormField->GetValue() != strArray.GetAt(0)) { - pFormField->SetValue(strArray.GetAt(0), TRUE); - UpdateFormField(pDocument, pFormField, TRUE, FALSE, TRUE); - } - } break; - case FIELDTYPE_LISTBOX: { - FX_BOOL bModified = FALSE; - - for (int i = 0, sz = strArray.GetSize(); i < sz; i++) { - int iIndex = pFormField->FindOption(strArray.GetAt(i)); - - if (!pFormField->IsItemSelected(iIndex)) { - bModified = TRUE; - break; - } - } - - if (bModified) { - pFormField->ClearSelection(TRUE); - for (int i = 0, sz = strArray.GetSize(); i < sz; i++) { - int iIndex = pFormField->FindOption(strArray.GetAt(i)); - pFormField->SetItemSelection(iIndex, TRUE, TRUE); - } - - UpdateFormField(pDocument, pFormField, TRUE, FALSE, TRUE); - } - } break; - default: - break; - } - } -} - -FX_BOOL Field::valueAsString(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - if (!vp.IsGetting()) - return FALSE; - - std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); - if (FieldArray.empty()) - return FALSE; - - CPDF_FormField* pFormField = FieldArray[0]; - if (pFormField->GetFieldType() == FIELDTYPE_PUSHBUTTON) - return FALSE; - - if (pFormField->GetFieldType() == FIELDTYPE_CHECKBOX) { - if (!pFormField->CountControls()) - return FALSE; - - if (pFormField->GetControl(0)->IsChecked()) - vp << L"Yes"; - else - vp << L"Off"; - } else if (pFormField->GetFieldType() == FIELDTYPE_RADIOBUTTON && - !(pFormField->GetFieldFlags() & FIELDFLAG_RADIOSINUNISON)) { - for (int i = 0, sz = pFormField->CountControls(); i < sz; i++) { - if (pFormField->GetControl(i)->IsChecked()) { - vp << pFormField->GetControl(i)->GetExportValue().c_str(); - break; - } else { - vp << L"Off"; - } - } - } else if (pFormField->GetFieldType() == FIELDTYPE_LISTBOX && - (pFormField->CountSelectedItems() > 1)) { - vp << L""; - } else { - vp << pFormField->GetValue().c_str(); - } - - return TRUE; -} - -FX_BOOL Field::browseForFileToSubmit(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); - if (FieldArray.empty()) - return FALSE; - - CPDF_FormField* pFormField = FieldArray[0]; - CPDFDoc_Environment* pApp = m_pDocument->GetEnv(); - if ((pFormField->GetFieldFlags() & FIELDFLAG_FILESELECT) && - (pFormField->GetFieldType() == FIELDTYPE_TEXTFIELD)) { - CFX_WideString wsFileName = pApp->JS_fieldBrowse(); - if (!wsFileName.IsEmpty()) { - pFormField->SetValue(wsFileName); - UpdateFormField(m_pDocument, pFormField, TRUE, TRUE, TRUE); - } - return TRUE; - } - return FALSE; -} - -FX_BOOL Field::buttonGetCaption(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - int nface = 0; - int iSize = params.size(); - if (iSize >= 1) - nface = params[0].ToInt(); - - std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); - if (FieldArray.empty()) - return FALSE; - - CPDF_FormField* pFormField = FieldArray[0]; - if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON) - return FALSE; - - CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField); - if (!pFormControl) - return FALSE; - - if (nface == 0) - vRet = pFormControl->GetNormalCaption().c_str(); - else if (nface == 1) - vRet = pFormControl->GetDownCaption().c_str(); - else if (nface == 2) - vRet = pFormControl->GetRolloverCaption().c_str(); - else - return FALSE; - - return TRUE; -} - -FX_BOOL Field::buttonGetIcon(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - int nface = 0; - int iSize = params.size(); - if (iSize >= 1) - nface = params[0].ToInt(); - - std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); - if (FieldArray.empty()) - return FALSE; - - CPDF_FormField* pFormField = FieldArray[0]; - if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON) - return FALSE; - - CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField); - if (!pFormControl) - return FALSE; - - CJS_Context* pContext = (CJS_Context*)cc; - CJS_Runtime* pRuntime = pContext->GetJSRuntime(); - v8::Local<v8::Object> pObj = FXJS_NewFxDynamicObj( - pRuntime->GetIsolate(), pRuntime, CJS_Icon::g_nObjDefnID); - ASSERT(pObj.IsEmpty() == FALSE); - - CJS_Icon* pJS_Icon = (CJS_Icon*)FXJS_GetPrivate(pRuntime->GetIsolate(), pObj); - Icon* pIcon = (Icon*)pJS_Icon->GetEmbedObject(); - - CPDF_Stream* pIconStream = NULL; - if (nface == 0) - pIconStream = pFormControl->GetNormalIcon(); - else if (nface == 1) - pIconStream = pFormControl->GetDownIcon(); - else if (nface == 2) - pIconStream = pFormControl->GetRolloverIcon(); - else - return FALSE; - - pIcon->SetStream(pIconStream); - vRet = pJS_Icon; - - return TRUE; -} - -FX_BOOL Field::buttonImportIcon(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - return TRUE; -} - -FX_BOOL Field::buttonSetCaption(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - return FALSE; -} - -FX_BOOL Field::buttonSetIcon(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - return FALSE; -} - -FX_BOOL Field::checkThisBox(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - ASSERT(m_pDocument); - - if (!m_bCanSet) - return FALSE; - - int iSize = params.size(); - if (iSize < 1) - return FALSE; - - int nWidget = params[0].ToInt(); - - bool bCheckit = true; - if (iSize >= 2) - bCheckit = params[1].ToBool(); - - std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); - if (FieldArray.empty()) - return FALSE; - - CPDF_FormField* pFormField = FieldArray[0]; - if (pFormField->GetFieldType() != FIELDTYPE_CHECKBOX && - pFormField->GetFieldType() != FIELDTYPE_RADIOBUTTON) - return FALSE; - if (nWidget < 0 || nWidget >= pFormField->CountControls()) - return FALSE; - // TODO(weili): Check whether anything special needed for radio button, - // otherwise merge these branches. - if (pFormField->GetFieldType() == FIELDTYPE_RADIOBUTTON) - pFormField->CheckControl(nWidget, bCheckit, true); - else - pFormField->CheckControl(nWidget, bCheckit, true); - - UpdateFormField(m_pDocument, pFormField, TRUE, TRUE, TRUE); - return TRUE; -} - -FX_BOOL Field::clearItems(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - return TRUE; -} - -FX_BOOL Field::defaultIsChecked(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - if (!m_bCanSet) - return FALSE; - - int iSize = params.size(); - if (iSize < 1) - return FALSE; - - int nWidget = params[0].ToInt(); - - std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); - if (FieldArray.empty()) - return FALSE; - - CPDF_FormField* pFormField = FieldArray[0]; - if (nWidget < 0 || nWidget >= pFormField->CountControls()) { - vRet = FALSE; - return FALSE; - } - vRet = pFormField->GetFieldType() == FIELDTYPE_CHECKBOX || - pFormField->GetFieldType() == FIELDTYPE_RADIOBUTTON; - - return TRUE; -} - -FX_BOOL Field::deleteItemAt(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - return TRUE; -} - -FX_BOOL Field::getArray(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); - if (FieldArray.empty()) - return FALSE; - - std::vector<std::unique_ptr<CFX_WideString>> swSort; - for (CPDF_FormField* pFormField : FieldArray) { - swSort.push_back(std::unique_ptr<CFX_WideString>( - new CFX_WideString(pFormField->GetFullName()))); - } - - std::sort( - swSort.begin(), swSort.end(), - [](const std::unique_ptr<CFX_WideString>& p1, - const std::unique_ptr<CFX_WideString>& p2) { return *p1 < *p2; }); - - CJS_Context* pContext = (CJS_Context*)cc; - CJS_Runtime* pRuntime = pContext->GetJSRuntime(); - CJS_Array FormFieldArray(pRuntime); - - int j = 0; - for (const auto& pStr : swSort) { - v8::Local<v8::Object> pObj = FXJS_NewFxDynamicObj( - pRuntime->GetIsolate(), pRuntime, CJS_Field::g_nObjDefnID); - ASSERT(!pObj.IsEmpty()); - - CJS_Field* pJSField = - static_cast<CJS_Field*>(FXJS_GetPrivate(pRuntime->GetIsolate(), pObj)); - Field* pField = static_cast<Field*>(pJSField->GetEmbedObject()); - pField->AttachField(m_pJSDoc, *pStr); - - CJS_Value FormFieldValue(pRuntime); - FormFieldValue = pJSField; - FormFieldArray.SetElement(j++, FormFieldValue); - } - - vRet = FormFieldArray; - return TRUE; -} - -FX_BOOL Field::getItemAt(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - int iSize = params.size(); - - int nIdx = -1; - if (iSize >= 1) - nIdx = params[0].ToInt(); - - FX_BOOL bExport = TRUE; - if (iSize >= 2) - bExport = params[1].ToBool(); - - std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); - if (FieldArray.empty()) - return FALSE; - - CPDF_FormField* pFormField = FieldArray[0]; - if ((pFormField->GetFieldType() == FIELDTYPE_LISTBOX) || - (pFormField->GetFieldType() == FIELDTYPE_COMBOBOX)) { - if (nIdx == -1 || nIdx > pFormField->CountOptions()) - nIdx = pFormField->CountOptions() - 1; - if (bExport) { - CFX_WideString strval = pFormField->GetOptionValue(nIdx); - if (strval.IsEmpty()) - vRet = pFormField->GetOptionLabel(nIdx).c_str(); - else - vRet = strval.c_str(); - } else { - vRet = pFormField->GetOptionLabel(nIdx).c_str(); - } - } else { - return FALSE; - } - - return TRUE; -} - -FX_BOOL Field::getLock(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - return FALSE; -} - -FX_BOOL Field::insertItemAt(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - return TRUE; -} - -FX_BOOL Field::isBoxChecked(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - int nIndex = -1; - if (params.size() >= 1) - nIndex = params[0].ToInt(); - - std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); - if (FieldArray.empty()) - return FALSE; - - CPDF_FormField* pFormField = FieldArray[0]; - if (nIndex < 0 || nIndex >= pFormField->CountControls()) { - vRet = FALSE; - return FALSE; - } - - if ((pFormField->GetFieldType() == FIELDTYPE_CHECKBOX) || - (pFormField->GetFieldType() == FIELDTYPE_RADIOBUTTON)) { - if (pFormField->GetControl(nIndex)->IsChecked() != 0) - vRet = TRUE; - else - vRet = FALSE; - } else { - vRet = FALSE; - } - - return TRUE; -} - -FX_BOOL Field::isDefaultChecked(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - int nIndex = -1; - if (params.size() >= 1) - nIndex = params[0].ToInt(); - - std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); - if (FieldArray.empty()) - return FALSE; - - CPDF_FormField* pFormField = FieldArray[0]; - if (nIndex < 0 || nIndex >= pFormField->CountControls()) { - vRet = FALSE; - return FALSE; - } - if ((pFormField->GetFieldType() == FIELDTYPE_CHECKBOX) || - (pFormField->GetFieldType() == FIELDTYPE_RADIOBUTTON)) { - if (pFormField->GetControl(nIndex)->IsDefaultChecked() != 0) - vRet = TRUE; - else - vRet = FALSE; - } else { - vRet = FALSE; - } - - return TRUE; -} - -FX_BOOL Field::setAction(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - return TRUE; -} - -FX_BOOL Field::setFocus(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); - if (FieldArray.empty()) - return FALSE; - - CPDF_FormField* pFormField = FieldArray[0]; - int32_t nCount = pFormField->CountControls(); - if (nCount < 1) - return FALSE; - - CPDFSDK_InterForm* pInterForm = - (CPDFSDK_InterForm*)m_pDocument->GetInterForm(); - CPDFSDK_Widget* pWidget = NULL; - if (nCount == 1) { - pWidget = pInterForm->GetWidget(pFormField->GetControl(0)); - } else { - CPDFDoc_Environment* pEnv = m_pDocument->GetEnv(); - UnderlyingPageType* pPage = UnderlyingFromFPDFPage( - pEnv->FFI_GetCurrentPage(m_pDocument->GetUnderlyingDocument())); - if (!pPage) - return FALSE; - if (CPDFSDK_PageView* pCurPageView = m_pDocument->GetPageView(pPage)) { - for (int32_t i = 0; i < nCount; i++) { - if (CPDFSDK_Widget* pTempWidget = - pInterForm->GetWidget(pFormField->GetControl(i))) { - if (pTempWidget->GetPDFPage() == pCurPageView->GetPDFPage()) { - pWidget = pTempWidget; - break; - } - } - } - } - } - - if (pWidget) { - m_pDocument->SetFocusAnnot(pWidget); - } - - return TRUE; -} - -FX_BOOL Field::setItems(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - return TRUE; -} - -FX_BOOL Field::setLock(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - return FALSE; -} - -FX_BOOL Field::signatureGetModifications(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - return FALSE; -} - -FX_BOOL Field::signatureGetSeedValue(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - return FALSE; -} - -FX_BOOL Field::signatureInfo(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - return FALSE; -} - -FX_BOOL Field::signatureSetSeedValue(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - return FALSE; -} - -FX_BOOL Field::signatureSign(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - return FALSE; -} - -FX_BOOL Field::signatureValidate(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - return FALSE; -} - -FX_BOOL Field::source(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - if (vp.IsGetting()) { - vp << (CJS_Object*)NULL; - } - - return TRUE; -} - -void Field::AddDelay_Int(enum FIELD_PROP prop, int32_t n) { - CJS_DelayData* pNewData = new CJS_DelayData; - pNewData->sFieldName = m_FieldName; - pNewData->nControlIndex = m_nFormControlIndex; - pNewData->eProp = prop; - pNewData->num = n; - - m_pJSDoc->AddDelayData(pNewData); -} - -void Field::AddDelay_Bool(enum FIELD_PROP prop, bool b) { - CJS_DelayData* pNewData = new CJS_DelayData; - pNewData->sFieldName = m_FieldName; - pNewData->nControlIndex = m_nFormControlIndex; - pNewData->eProp = prop; - pNewData->b = b; - - m_pJSDoc->AddDelayData(pNewData); -} - -void Field::AddDelay_String(enum FIELD_PROP prop, - const CFX_ByteString& string) { - CJS_DelayData* pNewData = new CJS_DelayData; - pNewData->sFieldName = m_FieldName; - pNewData->nControlIndex = m_nFormControlIndex; - pNewData->eProp = prop; - pNewData->string = string; - - m_pJSDoc->AddDelayData(pNewData); -} - -void Field::AddDelay_WideString(enum FIELD_PROP prop, - const CFX_WideString& string) { - CJS_DelayData* pNewData = new CJS_DelayData; - pNewData->sFieldName = m_FieldName; - pNewData->nControlIndex = m_nFormControlIndex; - pNewData->eProp = prop; - pNewData->widestring = string; - - m_pJSDoc->AddDelayData(pNewData); -} - -void Field::AddDelay_Rect(enum FIELD_PROP prop, const CFX_FloatRect& rect) { - CJS_DelayData* pNewData = new CJS_DelayData; - pNewData->sFieldName = m_FieldName; - pNewData->nControlIndex = m_nFormControlIndex; - pNewData->eProp = prop; - pNewData->rect = rect; - - m_pJSDoc->AddDelayData(pNewData); -} - -void Field::AddDelay_Color(enum FIELD_PROP prop, const CPWL_Color& color) { - CJS_DelayData* pNewData = new CJS_DelayData; - pNewData->sFieldName = m_FieldName; - pNewData->nControlIndex = m_nFormControlIndex; - pNewData->eProp = prop; - pNewData->color = color; - - m_pJSDoc->AddDelayData(pNewData); -} - -void Field::AddDelay_WordArray(enum FIELD_PROP prop, - const CFX_DWordArray& array) { - CJS_DelayData* pNewData = new CJS_DelayData; - pNewData->sFieldName = m_FieldName; - pNewData->nControlIndex = m_nFormControlIndex; - pNewData->eProp = prop; - - for (int i = 0, sz = array.GetSize(); i < sz; i++) - pNewData->wordarray.Add(array.GetAt(i)); - - m_pJSDoc->AddDelayData(pNewData); -} - -void Field::AddDelay_WideStringArray(enum FIELD_PROP prop, - const CJS_WideStringArray& array) { - CJS_DelayData* pNewData = new CJS_DelayData; - pNewData->sFieldName = m_FieldName; - pNewData->nControlIndex = m_nFormControlIndex; - pNewData->eProp = prop; - for (int i = 0, sz = array.GetSize(); i < sz; i++) - pNewData->widestringarray.Add(array.GetAt(i)); - - m_pJSDoc->AddDelayData(pNewData); -} - -void Field::DoDelay(CPDFSDK_Document* pDocument, CJS_DelayData* pData) { - ASSERT(pDocument); - - switch (pData->eProp) { - case FP_ALIGNMENT: - Field::SetAlignment(pDocument, pData->sFieldName, pData->nControlIndex, - pData->string); - break; - case FP_BORDERSTYLE: - Field::SetBorderStyle(pDocument, pData->sFieldName, pData->nControlIndex, - pData->string); - break; - case FP_BUTTONALIGNX: - Field::SetButtonAlignX(pDocument, pData->sFieldName, pData->nControlIndex, - pData->num); - break; - case FP_BUTTONALIGNY: - Field::SetButtonAlignY(pDocument, pData->sFieldName, pData->nControlIndex, - pData->num); - break; - case FP_BUTTONFITBOUNDS: - Field::SetButtonFitBounds(pDocument, pData->sFieldName, - pData->nControlIndex, pData->b); - break; - case FP_BUTTONPOSITION: - Field::SetButtonPosition(pDocument, pData->sFieldName, - pData->nControlIndex, pData->num); - break; - case FP_BUTTONSCALEHOW: - Field::SetButtonScaleHow(pDocument, pData->sFieldName, - pData->nControlIndex, pData->num); - break; - case FP_BUTTONSCALEWHEN: - Field::SetButtonScaleWhen(pDocument, pData->sFieldName, - pData->nControlIndex, pData->num); - break; - case FP_CALCORDERINDEX: - Field::SetCalcOrderIndex(pDocument, pData->sFieldName, - pData->nControlIndex, pData->num); - break; - case FP_CHARLIMIT: - Field::SetCharLimit(pDocument, pData->sFieldName, pData->nControlIndex, - pData->num); - break; - case FP_COMB: - Field::SetComb(pDocument, pData->sFieldName, pData->nControlIndex, - pData->b); - break; - case FP_COMMITONSELCHANGE: - Field::SetCommitOnSelChange(pDocument, pData->sFieldName, - pData->nControlIndex, pData->b); - break; - case FP_CURRENTVALUEINDICES: - Field::SetCurrentValueIndices(pDocument, pData->sFieldName, - pData->nControlIndex, pData->wordarray); - break; - case FP_DEFAULTVALUE: - Field::SetDefaultValue(pDocument, pData->sFieldName, pData->nControlIndex, - pData->widestring); - break; - case FP_DONOTSCROLL: - Field::SetDoNotScroll(pDocument, pData->sFieldName, pData->nControlIndex, - pData->b); - break; - case FP_DISPLAY: - Field::SetDisplay(pDocument, pData->sFieldName, pData->nControlIndex, - pData->num); - break; - case FP_FILLCOLOR: - Field::SetFillColor(pDocument, pData->sFieldName, pData->nControlIndex, - pData->color); - break; - case FP_HIDDEN: - Field::SetHidden(pDocument, pData->sFieldName, pData->nControlIndex, - pData->b); - break; - case FP_HIGHLIGHT: - Field::SetHighlight(pDocument, pData->sFieldName, pData->nControlIndex, - pData->string); - break; - case FP_LINEWIDTH: - Field::SetLineWidth(pDocument, pData->sFieldName, pData->nControlIndex, - pData->num); - break; - case FP_MULTILINE: - Field::SetMultiline(pDocument, pData->sFieldName, pData->nControlIndex, - pData->b); - break; - case FP_MULTIPLESELECTION: - Field::SetMultipleSelection(pDocument, pData->sFieldName, - pData->nControlIndex, pData->b); - break; - case FP_PASSWORD: - Field::SetPassword(pDocument, pData->sFieldName, pData->nControlIndex, - pData->b); - break; - case FP_RECT: - Field::SetRect(pDocument, pData->sFieldName, pData->nControlIndex, - pData->rect); - break; - case FP_RICHTEXT: - Field::SetRichText(pDocument, pData->sFieldName, pData->nControlIndex, - pData->b); - break; - case FP_RICHVALUE: - break; - case FP_ROTATION: - Field::SetRotation(pDocument, pData->sFieldName, pData->nControlIndex, - pData->num); - break; - case FP_STROKECOLOR: - Field::SetStrokeColor(pDocument, pData->sFieldName, pData->nControlIndex, - pData->color); - break; - case FP_STYLE: - Field::SetStyle(pDocument, pData->sFieldName, pData->nControlIndex, - pData->string); - break; - case FP_TEXTCOLOR: - Field::SetTextColor(pDocument, pData->sFieldName, pData->nControlIndex, - pData->color); - break; - case FP_TEXTFONT: - Field::SetTextFont(pDocument, pData->sFieldName, pData->nControlIndex, - pData->string); - break; - case FP_TEXTSIZE: - Field::SetTextSize(pDocument, pData->sFieldName, pData->nControlIndex, - pData->num); - break; - case FP_USERNAME: - Field::SetUserName(pDocument, pData->sFieldName, pData->nControlIndex, - pData->widestring); - break; - case FP_VALUE: - Field::SetValue(pDocument, pData->sFieldName, pData->nControlIndex, - pData->widestringarray); - break; - } -} - -void Field::AddField(CPDFSDK_Document* pDocument, - int nPageIndex, - int nFieldType, - const CFX_WideString& sName, - const CFX_FloatRect& rcCoords) { - // Not supported. -} diff --git a/fpdfsdk/src/javascript/Field.h b/fpdfsdk/src/javascript/Field.h deleted file mode 100644 index 49103c8284..0000000000 --- a/fpdfsdk/src/javascript/Field.h +++ /dev/null @@ -1,585 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef FPDFSDK_SRC_JAVASCRIPT_FIELD_H_ -#define FPDFSDK_SRC_JAVASCRIPT_FIELD_H_ - -#include <string> -#include <vector> - -#include "fpdfsdk/include/pdfwindow/PWL_Wnd.h" // For CPWL_Color. -#include "fpdfsdk/src/javascript/JS_Define.h" - -class CPDFSDK_Widget; -class Document; - -enum FIELD_PROP { - FP_ALIGNMENT, - FP_BORDERSTYLE, - FP_BUTTONALIGNX, - FP_BUTTONALIGNY, - FP_BUTTONFITBOUNDS, - FP_BUTTONPOSITION, - FP_BUTTONSCALEHOW, - FP_BUTTONSCALEWHEN, - FP_CALCORDERINDEX, - FP_CHARLIMIT, - FP_COMB, - FP_COMMITONSELCHANGE, - FP_CURRENTVALUEINDICES, - FP_DEFAULTVALUE, - FP_DONOTSCROLL, - FP_DISPLAY, - FP_FILLCOLOR, - FP_HIDDEN, - FP_HIGHLIGHT, - FP_LINEWIDTH, - FP_MULTILINE, - FP_MULTIPLESELECTION, - FP_PASSWORD, - FP_RECT, - FP_RICHTEXT, - FP_RICHVALUE, - FP_ROTATION, - FP_STROKECOLOR, - FP_STYLE, - FP_TEXTCOLOR, - FP_TEXTFONT, - FP_TEXTSIZE, - FP_USERNAME, - FP_VALUE -}; - -class CJS_WideStringArray { - public: - CJS_WideStringArray() {} - virtual ~CJS_WideStringArray() { - for (int i = 0, sz = m_Data.GetSize(); i < sz; i++) - delete m_Data.GetAt(i); - m_Data.RemoveAll(); - } - - void Add(const CFX_WideString& string) { - m_Data.Add(new CFX_WideString(string)); - } - - int GetSize() const { return m_Data.GetSize(); } - - CFX_WideString GetAt(int i) const { return *m_Data.GetAt(i); } - - private: - CFX_ArrayTemplate<CFX_WideString*> m_Data; -}; - -struct CJS_DelayData { - CFX_WideString sFieldName; - int nControlIndex; - enum FIELD_PROP eProp; - int32_t num; - bool b; - CFX_ByteString string; - CFX_WideString widestring; - CFX_FloatRect rect; - CPWL_Color color; - CFX_DWordArray wordarray; - CJS_WideStringArray widestringarray; -}; - -class Field : public CJS_EmbedObj { - public: - explicit Field(CJS_Object* pJSObject); - ~Field() override; - - FX_BOOL alignment(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL borderStyle(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError); - FX_BOOL buttonAlignX(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError); - FX_BOOL buttonAlignY(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError); - FX_BOOL buttonFitBounds(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError); - FX_BOOL buttonPosition(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError); - FX_BOOL buttonScaleHow(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError); - FX_BOOL buttonScaleWhen(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError); - FX_BOOL calcOrderIndex(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError); - FX_BOOL charLimit(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL comb(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL commitOnSelChange(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError); - FX_BOOL currentValueIndices(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError); - FX_BOOL defaultStyle(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError); - FX_BOOL defaultValue(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError); - FX_BOOL doNotScroll(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError); - FX_BOOL doNotSpellCheck(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError); - FX_BOOL delay(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL display(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL doc(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL editable(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL exportValues(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError); - FX_BOOL fileSelect(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError); - FX_BOOL fillColor(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL hidden(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL highlight(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL lineWidth(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL multiline(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL multipleSelection(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError); - FX_BOOL name(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL numItems(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL page(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL password(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL print(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL radiosInUnison(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError); - FX_BOOL readonly(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL rect(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL required(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL richText(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL richValue(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL rotation(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL strokeColor(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError); - FX_BOOL style(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL submitName(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError); - FX_BOOL textColor(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL textFont(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL textSize(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL type(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL userName(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL value(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL valueAsString(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError); - FX_BOOL source(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - - FX_BOOL browseForFileToSubmit(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL buttonGetCaption(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL buttonGetIcon(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL buttonImportIcon(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL buttonSetCaption(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL buttonSetIcon(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL checkThisBox(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL clearItems(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL defaultIsChecked(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL deleteItemAt(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL getArray(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL getItemAt(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL getLock(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL insertItemAt(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL isBoxChecked(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL isDefaultChecked(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL setAction(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL setFocus(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL setItems(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL setLock(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL signatureGetModifications(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL signatureGetSeedValue(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL signatureInfo(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL signatureSetSeedValue(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL signatureSign(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL signatureValidate(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - - static void SetAlignment(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - const CFX_ByteString& string); - static void SetBorderStyle(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - const CFX_ByteString& string); - static void SetButtonAlignX(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - int number); - static void SetButtonAlignY(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - int number); - static void SetButtonFitBounds(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - bool b); - static void SetButtonPosition(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - int number); - static void SetButtonScaleHow(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - int number); - static void SetButtonScaleWhen(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - int number); - static void SetCalcOrderIndex(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - int number); - static void SetCharLimit(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - int number); - static void SetComb(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - bool b); - static void SetCommitOnSelChange(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - bool b); - static void SetCurrentValueIndices(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - const CFX_DWordArray& array); - static void SetDefaultStyle(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex); - static void SetDefaultValue(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - const CFX_WideString& string); - static void SetDoNotScroll(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - bool b); - static void SetDisplay(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - int number); - static void SetFillColor(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - const CPWL_Color& color); - static void SetHidden(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - bool b); - static void SetHighlight(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - const CFX_ByteString& string); - static void SetLineWidth(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - int number); - static void SetMultiline(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - bool b); - static void SetMultipleSelection(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - bool b); - static void SetPassword(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - bool b); - static void SetRect(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - const CFX_FloatRect& rect); - static void SetRichText(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - bool b); - static void SetRichValue(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex); - static void SetRotation(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - int number); - static void SetStrokeColor(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - const CPWL_Color& color); - static void SetStyle(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - const CFX_ByteString& string); - static void SetTextColor(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - const CPWL_Color& color); - static void SetTextFont(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - const CFX_ByteString& string); - static void SetTextSize(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - int number); - static void SetUserName(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - const CFX_WideString& string); - static void SetValue(CPDFSDK_Document* pDocument, - const CFX_WideString& swFieldName, - int nControlIndex, - const CJS_WideStringArray& strArray); - - static void AddField(CPDFSDK_Document* pDocument, - int nPageIndex, - int nFieldType, - const CFX_WideString& sName, - const CFX_FloatRect& rcCoords); - - static void UpdateFormField(CPDFSDK_Document* pDocument, - CPDF_FormField* pFormField, - FX_BOOL bChangeMark, - FX_BOOL bResetAP, - FX_BOOL bRefresh); - static void UpdateFormControl(CPDFSDK_Document* pDocument, - CPDF_FormControl* pFormControl, - FX_BOOL bChangeMark, - FX_BOOL bResetAP, - FX_BOOL bRefresh); - - static CPDFSDK_Widget* GetWidget(CPDFSDK_Document* pDocument, - CPDF_FormControl* pFormControl); - static std::vector<CPDF_FormField*> GetFormFields( - CPDFSDK_Document* pDocument, - const CFX_WideString& csFieldName); - - static void DoDelay(CPDFSDK_Document* pDocument, CJS_DelayData* pData); - - FX_BOOL AttachField(Document* pDocument, const CFX_WideString& csFieldName); - void SetDelay(FX_BOOL bDelay); - void SetIsolate(v8::Isolate* isolate) { m_isolate = isolate; } - - protected: - void ParseFieldName(const std::wstring& strFieldNameParsed, - std::wstring& strFieldName, - int& iControlNo); - std::vector<CPDF_FormField*> GetFormFields( - const CFX_WideString& csFieldName) const; - CPDF_FormControl* GetSmartFieldControl(CPDF_FormField* pFormField); - FX_BOOL ValueIsOccur(CPDF_FormField* pFormField, CFX_WideString csOptLabel); - - void AddDelay_Int(enum FIELD_PROP prop, int32_t n); - void AddDelay_Bool(enum FIELD_PROP prop, bool b); - void AddDelay_String(enum FIELD_PROP prop, const CFX_ByteString& string); - void AddDelay_WideString(enum FIELD_PROP prop, const CFX_WideString& string); - void AddDelay_Rect(enum FIELD_PROP prop, const CFX_FloatRect& rect); - void AddDelay_Color(enum FIELD_PROP prop, const CPWL_Color& color); - void AddDelay_WordArray(enum FIELD_PROP prop, const CFX_DWordArray& array); - void AddDelay_WideStringArray(enum FIELD_PROP prop, - const CJS_WideStringArray& array); - - void DoDelay(); - - public: - Document* m_pJSDoc; - CPDFSDK_Document* m_pDocument; - CFX_WideString m_FieldName; - int m_nFormControlIndex; - FX_BOOL m_bCanSet; - - FX_BOOL m_bDelay; - v8::Isolate* m_isolate; -}; - -class CJS_Field : public CJS_Object { - public: - explicit CJS_Field(v8::Local<v8::Object> pObject) : CJS_Object(pObject) {} - ~CJS_Field(void) override {} - - void InitInstance(IJS_Runtime* pIRuntime) override; - - DECLARE_JS_CLASS(); - JS_STATIC_PROP(alignment, Field); - JS_STATIC_PROP(borderStyle, Field); - JS_STATIC_PROP(buttonAlignX, Field); - JS_STATIC_PROP(buttonAlignY, Field); - JS_STATIC_PROP(buttonFitBounds, Field); - JS_STATIC_PROP(buttonPosition, Field); - JS_STATIC_PROP(buttonScaleHow, Field); - JS_STATIC_PROP(buttonScaleWhen, Field); - JS_STATIC_PROP(calcOrderIndex, Field); - JS_STATIC_PROP(charLimit, Field); - JS_STATIC_PROP(comb, Field); - JS_STATIC_PROP(commitOnSelChange, Field); - JS_STATIC_PROP(currentValueIndices, Field); - JS_STATIC_PROP(defaultStyle, Field); - JS_STATIC_PROP(defaultValue, Field); - JS_STATIC_PROP(doNotScroll, Field); - JS_STATIC_PROP(doNotSpellCheck, Field); - JS_STATIC_PROP(delay, Field); - JS_STATIC_PROP(display, Field); - JS_STATIC_PROP(doc, Field); - JS_STATIC_PROP(editable, Field); - JS_STATIC_PROP(exportValues, Field); - JS_STATIC_PROP(fileSelect, Field); - JS_STATIC_PROP(fillColor, Field); - JS_STATIC_PROP(hidden, Field); - JS_STATIC_PROP(highlight, Field); - JS_STATIC_PROP(lineWidth, Field); - JS_STATIC_PROP(multiline, Field); - JS_STATIC_PROP(multipleSelection, Field); - JS_STATIC_PROP(name, Field); - JS_STATIC_PROP(numItems, Field); - JS_STATIC_PROP(page, Field); - JS_STATIC_PROP(password, Field); - JS_STATIC_PROP(print, Field); - JS_STATIC_PROP(radiosInUnison, Field); - JS_STATIC_PROP(readonly, Field); - JS_STATIC_PROP(rect, Field); - JS_STATIC_PROP(required, Field); - JS_STATIC_PROP(richText, Field); - JS_STATIC_PROP(richValue, Field); - JS_STATIC_PROP(rotation, Field); - JS_STATIC_PROP(strokeColor, Field); - JS_STATIC_PROP(style, Field); - JS_STATIC_PROP(submitName, Field); - JS_STATIC_PROP(textColor, Field); - JS_STATIC_PROP(textFont, Field); - JS_STATIC_PROP(textSize, Field); - JS_STATIC_PROP(type, Field); - JS_STATIC_PROP(userName, Field); - JS_STATIC_PROP(value, Field); - JS_STATIC_PROP(valueAsString, Field); - JS_STATIC_PROP(source, Field); - - JS_STATIC_METHOD(browseForFileToSubmit, Field); - JS_STATIC_METHOD(buttonGetCaption, Field); - JS_STATIC_METHOD(buttonGetIcon, Field); - JS_STATIC_METHOD(buttonImportIcon, Field); - JS_STATIC_METHOD(buttonSetCaption, Field); - JS_STATIC_METHOD(buttonSetIcon, Field); - JS_STATIC_METHOD(checkThisBox, Field); - JS_STATIC_METHOD(clearItems, Field); - JS_STATIC_METHOD(defaultIsChecked, Field); - JS_STATIC_METHOD(deleteItemAt, Field); - JS_STATIC_METHOD(getArray, Field); - JS_STATIC_METHOD(getItemAt, Field); - JS_STATIC_METHOD(getLock, Field); - JS_STATIC_METHOD(insertItemAt, Field); - JS_STATIC_METHOD(isBoxChecked, Field); - JS_STATIC_METHOD(isDefaultChecked, Field); - JS_STATIC_METHOD(setAction, Field); - JS_STATIC_METHOD(setFocus, Field); - JS_STATIC_METHOD(setItems, Field); - JS_STATIC_METHOD(setLock, Field); - JS_STATIC_METHOD(signatureGetModifications, Field); - JS_STATIC_METHOD(signatureGetSeedValue, Field); - JS_STATIC_METHOD(signatureInfo, Field); - JS_STATIC_METHOD(signatureSetSeedValue, Field); - JS_STATIC_METHOD(signatureSign, Field); - JS_STATIC_METHOD(signatureValidate, Field); -}; - -#endif // FPDFSDK_SRC_JAVASCRIPT_FIELD_H_ diff --git a/fpdfsdk/src/javascript/Icon.cpp b/fpdfsdk/src/javascript/Icon.cpp deleted file mode 100644 index 0bad2c5656..0000000000 --- a/fpdfsdk/src/javascript/Icon.cpp +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "fpdfsdk/src/javascript/Icon.h" - -#include "fpdfsdk/include/javascript/IJavaScript.h" -#include "fpdfsdk/src/javascript/JS_Define.h" -#include "fpdfsdk/src/javascript/JS_Object.h" -#include "fpdfsdk/src/javascript/JS_Value.h" - -/* ---------------------- Icon ---------------------- */ - -BEGIN_JS_STATIC_CONST(CJS_Icon) -END_JS_STATIC_CONST() - -BEGIN_JS_STATIC_PROP(CJS_Icon) -JS_STATIC_PROP_ENTRY(name) -END_JS_STATIC_PROP() - -BEGIN_JS_STATIC_METHOD(CJS_Icon) -END_JS_STATIC_METHOD() - -IMPLEMENT_JS_CLASS(CJS_Icon, Icon) - -Icon::Icon(CJS_Object* pJSObject) - : CJS_EmbedObj(pJSObject), m_pIconStream(NULL), m_swIconName(L"") {} - -Icon::~Icon() {} - -void Icon::SetStream(CPDF_Stream* pIconStream) { - if (pIconStream) - m_pIconStream = pIconStream; -} - -CPDF_Stream* Icon::GetStream() { - return m_pIconStream; -} - -void Icon::SetIconName(CFX_WideString name) { - m_swIconName = name; -} - -CFX_WideString Icon::GetIconName() { - return m_swIconName; -} - -FX_BOOL Icon::name(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError) { - if (!vp.IsGetting()) - return FALSE; - - vp << m_swIconName; - return TRUE; -} diff --git a/fpdfsdk/src/javascript/Icon.h b/fpdfsdk/src/javascript/Icon.h deleted file mode 100644 index 512002dce1..0000000000 --- a/fpdfsdk/src/javascript/Icon.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef FPDFSDK_SRC_JAVASCRIPT_ICON_H_ -#define FPDFSDK_SRC_JAVASCRIPT_ICON_H_ - -#include "fpdfsdk/src/javascript/JS_Define.h" - -class Icon : public CJS_EmbedObj { - public: - Icon(CJS_Object* pJSObject); - ~Icon() override; - - FX_BOOL name(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - void SetStream(CPDF_Stream* pIconStream); - CPDF_Stream* GetStream(); - void SetIconName(CFX_WideString name); - CFX_WideString GetIconName(); - - private: - CPDF_Stream* m_pIconStream; - CFX_WideString m_swIconName; -}; - -class CJS_Icon : public CJS_Object { - public: - CJS_Icon(v8::Local<v8::Object> pObject) : CJS_Object(pObject) {} - ~CJS_Icon() override {} - - DECLARE_JS_CLASS(); - JS_STATIC_PROP(name, Icon); -}; - -#endif // FPDFSDK_SRC_JAVASCRIPT_ICON_H_ diff --git a/fpdfsdk/src/javascript/JS_Context.cpp b/fpdfsdk/src/javascript/JS_Context.cpp deleted file mode 100644 index 304abfaae2..0000000000 --- a/fpdfsdk/src/javascript/JS_Context.cpp +++ /dev/null @@ -1,284 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "fpdfsdk/src/javascript/JS_Context.h" - -#include "fpdfsdk/include/javascript/IJavaScript.h" -#include "fpdfsdk/src/javascript/JS_EventHandler.h" -#include "fpdfsdk/src/javascript/JS_Runtime.h" -#include "fpdfsdk/src/javascript/resource.h" - -/* -------------------------- CJS_Context -------------------------- */ - -CJS_Context::CJS_Context(CJS_Runtime* pRuntime) - : m_pRuntime(pRuntime), m_bBusy(FALSE), m_bMsgBoxEnable(TRUE) { - m_pEventHandler = new CJS_EventHandler(this); -} - -CJS_Context::~CJS_Context() { - delete m_pEventHandler; -} - -CPDFSDK_Document* CJS_Context::GetReaderDocument() { - return m_pRuntime->GetReaderDocument(); -} - -CPDFDoc_Environment* CJS_Context::GetReaderApp() { - return m_pRuntime->GetReaderApp(); -} - -FX_BOOL CJS_Context::RunScript(const CFX_WideString& script, - CFX_WideString* info) { - v8::Isolate::Scope isolate_scope(m_pRuntime->GetIsolate()); -#ifdef PDF_ENABLE_XFA - v8::Locker locker(m_pRuntime->GetIsolate()); -#endif // PDF_ENABLE_XFA - v8::HandleScope handle_scope(m_pRuntime->GetIsolate()); - v8::Local<v8::Context> context = m_pRuntime->NewJSContext(); - v8::Context::Scope context_scope(context); - - if (m_bBusy) { - *info = JSGetStringFromID(this, IDS_STRING_JSBUSY); - return FALSE; - } - m_bBusy = TRUE; - - ASSERT(m_pEventHandler->IsValid()); - CJS_Runtime::FieldEvent event(m_pEventHandler->TargetName(), - m_pEventHandler->EventType()); - if (!m_pRuntime->AddEventToSet(event)) { - *info = JSGetStringFromID(this, IDS_STRING_JSEVENT); - return FALSE; - } - - CFX_WideString sErrorMessage; - int nRet = 0; - if (script.GetLength() > 0) { - nRet = m_pRuntime->Execute(this, script.c_str(), &sErrorMessage); - } - - if (nRet < 0) { - *info += sErrorMessage; - } else { - *info = JSGetStringFromID(this, IDS_STRING_RUN); - } - - m_pRuntime->RemoveEventFromSet(event); - m_pEventHandler->Destroy(); - m_bBusy = FALSE; - - return nRet >= 0; -} - -void CJS_Context::OnApp_Init() { - m_pEventHandler->OnApp_Init(); -} - -void CJS_Context::OnDoc_Open(CPDFSDK_Document* pDoc, - const CFX_WideString& strTargetName) { - m_pEventHandler->OnDoc_Open(pDoc, strTargetName); -} - -void CJS_Context::OnDoc_WillPrint(CPDFSDK_Document* pDoc) { - m_pEventHandler->OnDoc_WillPrint(pDoc); -} - -void CJS_Context::OnDoc_DidPrint(CPDFSDK_Document* pDoc) { - m_pEventHandler->OnDoc_DidPrint(pDoc); -} - -void CJS_Context::OnDoc_WillSave(CPDFSDK_Document* pDoc) { - m_pEventHandler->OnDoc_WillSave(pDoc); -} - -void CJS_Context::OnDoc_DidSave(CPDFSDK_Document* pDoc) { - m_pEventHandler->OnDoc_DidSave(pDoc); -} - -void CJS_Context::OnDoc_WillClose(CPDFSDK_Document* pDoc) { - m_pEventHandler->OnDoc_WillClose(pDoc); -} - -void CJS_Context::OnPage_Open(CPDFSDK_Document* pTarget) { - m_pEventHandler->OnPage_Open(pTarget); -} - -void CJS_Context::OnPage_Close(CPDFSDK_Document* pTarget) { - m_pEventHandler->OnPage_Close(pTarget); -} - -void CJS_Context::OnPage_InView(CPDFSDK_Document* pTarget) { - m_pEventHandler->OnPage_InView(pTarget); -} - -void CJS_Context::OnPage_OutView(CPDFSDK_Document* pTarget) { - m_pEventHandler->OnPage_OutView(pTarget); -} - -void CJS_Context::OnField_MouseDown(FX_BOOL bModifier, - FX_BOOL bShift, - CPDF_FormField* pTarget) { - m_pEventHandler->OnField_MouseDown(bModifier, bShift, pTarget); -} - -void CJS_Context::OnField_MouseEnter(FX_BOOL bModifier, - FX_BOOL bShift, - CPDF_FormField* pTarget) { - m_pEventHandler->OnField_MouseEnter(bModifier, bShift, pTarget); -} - -void CJS_Context::OnField_MouseExit(FX_BOOL bModifier, - FX_BOOL bShift, - CPDF_FormField* pTarget) { - m_pEventHandler->OnField_MouseExit(bModifier, bShift, pTarget); -} - -void CJS_Context::OnField_MouseUp(FX_BOOL bModifier, - FX_BOOL bShift, - CPDF_FormField* pTarget) { - m_pEventHandler->OnField_MouseUp(bModifier, bShift, pTarget); -} - -void CJS_Context::OnField_Focus(FX_BOOL bModifier, - FX_BOOL bShift, - CPDF_FormField* pTarget, - const CFX_WideString& Value) { - m_pEventHandler->OnField_Focus(bModifier, bShift, pTarget, Value); -} - -void CJS_Context::OnField_Blur(FX_BOOL bModifier, - FX_BOOL bShift, - CPDF_FormField* pTarget, - const CFX_WideString& Value) { - m_pEventHandler->OnField_Blur(bModifier, bShift, pTarget, Value); -} - -void CJS_Context::OnField_Calculate(CPDF_FormField* pSource, - CPDF_FormField* pTarget, - CFX_WideString& Value, - FX_BOOL& bRc) { - m_pEventHandler->OnField_Calculate(pSource, pTarget, Value, bRc); -} - -void CJS_Context::OnField_Format(CPDF_FormField* pTarget, - CFX_WideString& Value, - FX_BOOL bWillCommit) { - m_pEventHandler->OnField_Format(pTarget, Value, bWillCommit); -} - -void CJS_Context::OnField_Keystroke(CFX_WideString& strChange, - const CFX_WideString& strChangeEx, - FX_BOOL bKeyDown, - FX_BOOL bModifier, - int& nSelEnd, - int& nSelStart, - FX_BOOL bShift, - CPDF_FormField* pTarget, - CFX_WideString& Value, - FX_BOOL bWillCommit, - FX_BOOL bFieldFull, - FX_BOOL& bRc) { - m_pEventHandler->OnField_Keystroke( - strChange, strChangeEx, bKeyDown, bModifier, nSelEnd, nSelStart, bShift, - pTarget, Value, bWillCommit, bFieldFull, bRc); -} - -void CJS_Context::OnField_Validate(CFX_WideString& strChange, - const CFX_WideString& strChangeEx, - FX_BOOL bKeyDown, - FX_BOOL bModifier, - FX_BOOL bShift, - CPDF_FormField* pTarget, - CFX_WideString& Value, - FX_BOOL& bRc) { - m_pEventHandler->OnField_Validate(strChange, strChangeEx, bKeyDown, bModifier, - bShift, pTarget, Value, bRc); -} - -void CJS_Context::OnScreen_Focus(FX_BOOL bModifier, - FX_BOOL bShift, - CPDFSDK_Annot* pScreen) { - m_pEventHandler->OnScreen_Focus(bModifier, bShift, pScreen); -} - -void CJS_Context::OnScreen_Blur(FX_BOOL bModifier, - FX_BOOL bShift, - CPDFSDK_Annot* pScreen) { - m_pEventHandler->OnScreen_Blur(bModifier, bShift, pScreen); -} - -void CJS_Context::OnScreen_Open(FX_BOOL bModifier, - FX_BOOL bShift, - CPDFSDK_Annot* pScreen) { - m_pEventHandler->OnScreen_Open(bModifier, bShift, pScreen); -} - -void CJS_Context::OnScreen_Close(FX_BOOL bModifier, - FX_BOOL bShift, - CPDFSDK_Annot* pScreen) { - m_pEventHandler->OnScreen_Close(bModifier, bShift, pScreen); -} - -void CJS_Context::OnScreen_MouseDown(FX_BOOL bModifier, - FX_BOOL bShift, - CPDFSDK_Annot* pScreen) { - m_pEventHandler->OnScreen_MouseDown(bModifier, bShift, pScreen); -} - -void CJS_Context::OnScreen_MouseUp(FX_BOOL bModifier, - FX_BOOL bShift, - CPDFSDK_Annot* pScreen) { - m_pEventHandler->OnScreen_MouseUp(bModifier, bShift, pScreen); -} - -void CJS_Context::OnScreen_MouseEnter(FX_BOOL bModifier, - FX_BOOL bShift, - CPDFSDK_Annot* pScreen) { - m_pEventHandler->OnScreen_MouseEnter(bModifier, bShift, pScreen); -} - -void CJS_Context::OnScreen_MouseExit(FX_BOOL bModifier, - FX_BOOL bShift, - CPDFSDK_Annot* pScreen) { - m_pEventHandler->OnScreen_MouseExit(bModifier, bShift, pScreen); -} - -void CJS_Context::OnScreen_InView(FX_BOOL bModifier, - FX_BOOL bShift, - CPDFSDK_Annot* pScreen) { - m_pEventHandler->OnScreen_InView(bModifier, bShift, pScreen); -} - -void CJS_Context::OnScreen_OutView(FX_BOOL bModifier, - FX_BOOL bShift, - CPDFSDK_Annot* pScreen) { - m_pEventHandler->OnScreen_OutView(bModifier, bShift, pScreen); -} - -void CJS_Context::OnBookmark_MouseUp(CPDF_Bookmark* pBookMark) { - m_pEventHandler->OnBookmark_MouseUp(pBookMark); -} - -void CJS_Context::OnLink_MouseUp(CPDFSDK_Document* pTarget) { - m_pEventHandler->OnLink_MouseUp(pTarget); -} - -void CJS_Context::OnConsole_Exec() { - m_pEventHandler->OnConsole_Exec(); -} - -void CJS_Context::OnExternal_Exec() { - m_pEventHandler->OnExternal_Exec(); -} - -void CJS_Context::OnBatchExec(CPDFSDK_Document* pTarget) { - m_pEventHandler->OnBatchExec(pTarget); -} - -void CJS_Context::OnMenu_Exec(CPDFSDK_Document* pTarget, - const CFX_WideString& strTargetName) { - m_pEventHandler->OnMenu_Exec(pTarget, strTargetName); -} diff --git a/fpdfsdk/src/javascript/JS_Context.h b/fpdfsdk/src/javascript/JS_Context.h deleted file mode 100644 index 93ef1523a3..0000000000 --- a/fpdfsdk/src/javascript/JS_Context.h +++ /dev/null @@ -1,137 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef FPDFSDK_SRC_JAVASCRIPT_JS_CONTEXT_H_ -#define FPDFSDK_SRC_JAVASCRIPT_JS_CONTEXT_H_ - -#include "core/include/fxcrt/fx_string.h" -#include "core/include/fxcrt/fx_system.h" -#include "fpdfsdk/include/javascript/IJavaScript.h" - -class CJS_EventHandler; -class CJS_Runtime; - -class CJS_Context : public IJS_Context { - public: - explicit CJS_Context(CJS_Runtime* pRuntime); - ~CJS_Context() override; - - // IJS_Context - FX_BOOL RunScript(const CFX_WideString& script, - CFX_WideString* info) override; - void OnApp_Init() override; - void OnDoc_Open(CPDFSDK_Document* pDoc, - const CFX_WideString& strTargetName) override; - void OnDoc_WillPrint(CPDFSDK_Document* pDoc) override; - void OnDoc_DidPrint(CPDFSDK_Document* pDoc) override; - void OnDoc_WillSave(CPDFSDK_Document* pDoc) override; - void OnDoc_DidSave(CPDFSDK_Document* pDoc) override; - void OnDoc_WillClose(CPDFSDK_Document* pDoc) override; - void OnPage_Open(CPDFSDK_Document* pTarget) override; - void OnPage_Close(CPDFSDK_Document* pTarget) override; - void OnPage_InView(CPDFSDK_Document* pTarget) override; - void OnPage_OutView(CPDFSDK_Document* pTarget) override; - void OnField_MouseDown(FX_BOOL bModifier, - FX_BOOL bShift, - CPDF_FormField* pTarget) override; - void OnField_MouseEnter(FX_BOOL bModifier, - FX_BOOL bShift, - CPDF_FormField* pTarget) override; - void OnField_MouseExit(FX_BOOL bModifier, - FX_BOOL bShift, - CPDF_FormField* pTarget) override; - void OnField_MouseUp(FX_BOOL bModifier, - FX_BOOL bShift, - CPDF_FormField* pTarget) override; - void OnField_Focus(FX_BOOL bModifier, - FX_BOOL bShift, - CPDF_FormField* pTarget, - const CFX_WideString& Value) override; - void OnField_Blur(FX_BOOL bModifier, - FX_BOOL bShift, - CPDF_FormField* pTarget, - const CFX_WideString& Value) override; - void OnField_Calculate(CPDF_FormField* pSource, - CPDF_FormField* pTarget, - CFX_WideString& Value, - FX_BOOL& bRc) override; - void OnField_Format(CPDF_FormField* pTarget, - CFX_WideString& Value, - FX_BOOL bWillCommit) override; - void OnField_Keystroke(CFX_WideString& strChange, - const CFX_WideString& strChangeEx, - FX_BOOL bKeyDown, - FX_BOOL bModifier, - int& nSelEnd, - int& nSelStart, - FX_BOOL bShift, - CPDF_FormField* pTarget, - CFX_WideString& Value, - FX_BOOL bWillCommit, - FX_BOOL bFieldFull, - FX_BOOL& bRc) override; - void OnField_Validate(CFX_WideString& strChange, - const CFX_WideString& strChangeEx, - FX_BOOL bKeyDown, - FX_BOOL bModifier, - FX_BOOL bShift, - CPDF_FormField* pTarget, - CFX_WideString& Value, - FX_BOOL& bRc) override; - void OnScreen_Focus(FX_BOOL bModifier, - FX_BOOL bShift, - CPDFSDK_Annot* pScreen) override; - void OnScreen_Blur(FX_BOOL bModifier, - FX_BOOL bShift, - CPDFSDK_Annot* pScreen) override; - void OnScreen_Open(FX_BOOL bModifier, - FX_BOOL bShift, - CPDFSDK_Annot* pScreen) override; - void OnScreen_Close(FX_BOOL bModifier, - FX_BOOL bShift, - CPDFSDK_Annot* pScreen) override; - void OnScreen_MouseDown(FX_BOOL bModifier, - FX_BOOL bShift, - CPDFSDK_Annot* pScreen) override; - void OnScreen_MouseUp(FX_BOOL bModifier, - FX_BOOL bShift, - CPDFSDK_Annot* pScreen) override; - void OnScreen_MouseEnter(FX_BOOL bModifier, - FX_BOOL bShift, - CPDFSDK_Annot* pScreen) override; - void OnScreen_MouseExit(FX_BOOL bModifier, - FX_BOOL bShift, - CPDFSDK_Annot* pScreen) override; - void OnScreen_InView(FX_BOOL bModifier, - FX_BOOL bShift, - CPDFSDK_Annot* pScreen) override; - void OnScreen_OutView(FX_BOOL bModifier, - FX_BOOL bShift, - CPDFSDK_Annot* pScreen) override; - void OnBookmark_MouseUp(CPDF_Bookmark* pBookMark) override; - void OnLink_MouseUp(CPDFSDK_Document* pTarget) override; - void OnMenu_Exec(CPDFSDK_Document* pTarget, - const CFX_WideString& strTargetName) override; - void OnBatchExec(CPDFSDK_Document* pTarget) override; - void OnConsole_Exec() override; - void OnExternal_Exec() override; - void EnableMessageBox(FX_BOOL bEnable) override { m_bMsgBoxEnable = bEnable; } - - FX_BOOL IsMsgBoxEnabled() const { return m_bMsgBoxEnable; } - - CPDFDoc_Environment* GetReaderApp(); - CJS_Runtime* GetJSRuntime() const { return m_pRuntime; } - CJS_EventHandler* GetEventHandler() const { return m_pEventHandler; } - CPDFSDK_Document* GetReaderDocument(); - - private: - CJS_Runtime* m_pRuntime; - CJS_EventHandler* m_pEventHandler; - FX_BOOL m_bBusy; - FX_BOOL m_bMsgBoxEnable; -}; - -#endif // FPDFSDK_SRC_JAVASCRIPT_JS_CONTEXT_H_ diff --git a/fpdfsdk/src/javascript/JS_Define.h b/fpdfsdk/src/javascript/JS_Define.h deleted file mode 100644 index e16c5a097a..0000000000 --- a/fpdfsdk/src/javascript/JS_Define.h +++ /dev/null @@ -1,493 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef FPDFSDK_SRC_JAVASCRIPT_JS_DEFINE_H_ -#define FPDFSDK_SRC_JAVASCRIPT_JS_DEFINE_H_ - -#include <vector> - -#include "fpdfsdk/include/jsapi/fxjs_v8.h" -#include "fpdfsdk/src/javascript/JS_Object.h" -#include "fpdfsdk/src/javascript/JS_Value.h" -#include "fpdfsdk/src/javascript/resource.h" - -struct JSConstSpec { - const wchar_t* pName; - double number; - const wchar_t* string; // NOLINT - uint8_t t; // 0:double 1:str -}; - -struct JSPropertySpec { - const wchar_t* pName; - v8::AccessorGetterCallback pPropGet; - v8::AccessorSetterCallback pPropPut; -}; - -struct JSMethodSpec { - const wchar_t* pName; - v8::FunctionCallback pMethodCall; -}; - -#define JS_WIDESTRING(widestring) L## #widestring -#define BEGIN_JS_STATIC_CONST(js_class_name) \ - JSConstSpec js_class_name::JS_Class_Consts[] = { -#define JS_STATIC_CONST_ENTRY_NUMBER(const_name, pValue) \ - { const_name, pValue, L"", 0 } \ - , - -#define JS_STATIC_CONST_ENTRY_STRING(const_name, pValue) \ - { const_name, 0, pValue, 1 } \ - , - -#define END_JS_STATIC_CONST() \ - { 0, 0, 0, 0 } \ - } \ - ; // NOLINT - -#define BEGIN_JS_STATIC_PROP(js_class_name) \ - JSPropertySpec js_class_name::JS_Class_Properties[] = { -#define JS_STATIC_PROP_ENTRY(prop_name) \ - { \ - JS_WIDESTRING(prop_name), get_##prop_name##_static, \ - set_##prop_name##_static \ - } \ - , - -#define END_JS_STATIC_PROP() \ - { 0, 0, 0 } \ - } \ - ; // NOLINT - -#define BEGIN_JS_STATIC_METHOD(js_class_name) \ - JSMethodSpec js_class_name::JS_Class_Methods[] = { -#define JS_STATIC_METHOD_ENTRY(method_name) \ - { JS_WIDESTRING(method_name), method_name##_static } \ - , - -#define END_JS_STATIC_METHOD() \ - { 0, 0 } \ - } \ - ; // NOLINT - -template <class C, - FX_BOOL (C::*M)(IJS_Context*, CJS_PropValue&, CFX_WideString&)> -void JSPropGetter(const char* prop_name_string, - const char* class_name_string, - v8::Local<v8::String> property, - const v8::PropertyCallbackInfo<v8::Value>& info) { - v8::Isolate* isolate = info.GetIsolate(); - CJS_Runtime* pRuntime = - static_cast<CJS_Runtime*>(FXJS_GetRuntimeFromIsolate(isolate)); - if (!pRuntime) - return; - IJS_Context* pContext = pRuntime->GetCurrentContext(); - CJS_Object* pJSObj = (CJS_Object*)FXJS_GetPrivate(isolate, info.Holder()); - C* pObj = reinterpret_cast<C*>(pJSObj->GetEmbedObject()); - CFX_WideString sError; - CJS_PropValue value(pRuntime); - value.StartGetting(); - if (!(pObj->*M)(pContext, value, sError)) { - FXJS_Error(isolate, JSFormatErrorString(class_name_string, prop_name_string, - sError)); - return; - } - info.GetReturnValue().Set((v8::Local<v8::Value>)value); -} - -template <class C, - FX_BOOL (C::*M)(IJS_Context*, CJS_PropValue&, CFX_WideString&)> -void JSPropSetter(const char* prop_name_string, - const char* class_name_string, - v8::Local<v8::String> property, - v8::Local<v8::Value> value, - const v8::PropertyCallbackInfo<void>& info) { - v8::Isolate* isolate = info.GetIsolate(); - CJS_Runtime* pRuntime = - static_cast<CJS_Runtime*>(FXJS_GetRuntimeFromIsolate(isolate)); - if (!pRuntime) - return; - IJS_Context* pContext = pRuntime->GetCurrentContext(); - CJS_Object* pJSObj = (CJS_Object*)FXJS_GetPrivate(isolate, info.Holder()); - C* pObj = reinterpret_cast<C*>(pJSObj->GetEmbedObject()); - CFX_WideString sError; - CJS_PropValue propValue(CJS_Value(pRuntime, value, CJS_Value::VT_unknown)); - propValue.StartSetting(); - if (!(pObj->*M)(pContext, propValue, sError)) { - FXJS_Error(isolate, JSFormatErrorString(class_name_string, prop_name_string, - sError)); - } -} - -#define JS_STATIC_PROP(prop_name, class_name) \ - static void get_##prop_name##_static( \ - v8::Local<v8::String> property, \ - const v8::PropertyCallbackInfo<v8::Value>& info) { \ - JSPropGetter<class_name, &class_name::prop_name>(#prop_name, #class_name, \ - property, info); \ - } \ - static void set_##prop_name##_static( \ - v8::Local<v8::String> property, v8::Local<v8::Value> value, \ - const v8::PropertyCallbackInfo<void>& info) { \ - JSPropSetter<class_name, &class_name::prop_name>(#prop_name, #class_name, \ - property, value, info); \ - } - -template <class C, - FX_BOOL (C::*M)(IJS_Context*, - const std::vector<CJS_Value>&, - CJS_Value&, - CFX_WideString&)> -void JSMethod(const char* method_name_string, - const char* class_name_string, - const v8::FunctionCallbackInfo<v8::Value>& info) { - v8::Isolate* isolate = info.GetIsolate(); - CJS_Runtime* pRuntime = - static_cast<CJS_Runtime*>(FXJS_GetRuntimeFromIsolate(isolate)); - if (!pRuntime) - return; - IJS_Context* pContext = pRuntime->GetCurrentContext(); - std::vector<CJS_Value> parameters; - for (unsigned int i = 0; i < (unsigned int)info.Length(); i++) { - parameters.push_back(CJS_Value(pRuntime, info[i], CJS_Value::VT_unknown)); - } - CJS_Value valueRes(pRuntime); - CJS_Object* pJSObj = (CJS_Object*)FXJS_GetPrivate(isolate, info.Holder()); - C* pObj = reinterpret_cast<C*>(pJSObj->GetEmbedObject()); - CFX_WideString sError; - if (!(pObj->*M)(pContext, parameters, valueRes, sError)) { - FXJS_Error(isolate, JSFormatErrorString(class_name_string, - method_name_string, sError)); - return; - } - info.GetReturnValue().Set(valueRes.ToV8Value()); -} - -#define JS_STATIC_METHOD(method_name, class_name) \ - static void method_name##_static( \ - const v8::FunctionCallbackInfo<v8::Value>& info) { \ - JSMethod<class_name, &class_name::method_name>(#method_name, #class_name, \ - info); \ - } - -#define JS_SPECIAL_STATIC_METHOD(method_name, class_alternate, class_name) \ - static void method_name##_static( \ - const v8::FunctionCallbackInfo<v8::Value>& info) { \ - JSMethod<class_alternate, &class_alternate::method_name>( \ - #method_name, #class_name, info); \ - } - -// All JS classes have a name, an object defintion ID, and the ability to -// register themselves with FXJS_V8. We never make a BASE class on its own -// because it can't really do anything. -#define DECLARE_JS_CLASS_BASE_PART() \ - static const wchar_t* g_pClassName; \ - static int g_nObjDefnID; \ - static void DefineJSObjects(v8::Isolate* pIsolate, FXJSOBJTYPE eObjType); - -#define IMPLEMENT_JS_CLASS_BASE_PART(js_class_name, class_name) \ - const wchar_t* js_class_name::g_pClassName = JS_WIDESTRING(class_name); \ - int js_class_name::g_nObjDefnID = -1; - -// CONST classes provide constants, but not constructors, methods, or props. -#define DECLARE_JS_CLASS_CONST() \ - DECLARE_JS_CLASS_BASE_PART() \ - DECLARE_JS_CLASS_CONST_PART() - -#define IMPLEMENT_JS_CLASS_CONST(js_class_name, class_name) \ - IMPLEMENT_JS_CLASS_BASE_PART(js_class_name, class_name) \ - IMPLEMENT_JS_CLASS_CONST_PART(js_class_name, class_name) \ - void js_class_name::DefineJSObjects(v8::Isolate* pIsolate, \ - FXJSOBJTYPE eObjType) { \ - g_nObjDefnID = FXJS_DefineObj(pIsolate, js_class_name::g_pClassName, \ - eObjType, nullptr, nullptr); \ - DefineConsts(pIsolate); \ - } - -#define DECLARE_JS_CLASS_CONST_PART() \ - static JSConstSpec JS_Class_Consts[]; \ - static void DefineConsts(v8::Isolate* pIsolate); - -#define IMPLEMENT_JS_CLASS_CONST_PART(js_class_name, class_name) \ - void js_class_name::DefineConsts(v8::Isolate* pIsolate) { \ - for (size_t i = 0; i < FX_ArraySize(JS_Class_Consts) - 1; ++i) { \ - FXJS_DefineObjConst( \ - pIsolate, g_nObjDefnID, JS_Class_Consts[i].pName, \ - JS_Class_Consts[i].t == 0 \ - ? FXJS_NewNumber(pIsolate, JS_Class_Consts[i].number) \ - : FXJS_NewString(pIsolate, JS_Class_Consts[i].string)); \ - } \ - } - -// Convenience macros for declaring classes without an alternate. -#define DECLARE_JS_CLASS() DECLARE_JS_CLASS_RICH() -#define IMPLEMENT_JS_CLASS(js_class_name, class_name) \ - IMPLEMENT_JS_CLASS_RICH(js_class_name, class_name, class_name) - -// Rich JS classes provide constants, methods, properties, and the ability -// to construct native object state. -#define DECLARE_JS_CLASS_RICH() \ - DECLARE_JS_CLASS_BASE_PART() \ - DECLARE_JS_CLASS_CONST_PART() \ - DECLARE_JS_CLASS_RICH_PART() - -#define IMPLEMENT_JS_CLASS_RICH(js_class_name, class_alternate, class_name) \ - IMPLEMENT_JS_CLASS_BASE_PART(js_class_name, class_name) \ - IMPLEMENT_JS_CLASS_CONST_PART(js_class_name, class_name) \ - IMPLEMENT_JS_CLASS_RICH_PART(js_class_name, class_alternate, class_name) \ - void js_class_name::DefineJSObjects(v8::Isolate* pIsolate, \ - FXJSOBJTYPE eObjType) { \ - g_nObjDefnID = FXJS_DefineObj(pIsolate, js_class_name::g_pClassName, \ - eObjType, JSConstructor, JSDestructor); \ - DefineConsts(pIsolate); \ - DefineProps(pIsolate); \ - DefineMethods(pIsolate); \ - } - -#define DECLARE_JS_CLASS_RICH_PART() \ - static void JSConstructor(IJS_Runtime* pRuntime, v8::Local<v8::Object> obj); \ - static void JSDestructor(v8::Local<v8::Object> obj); \ - static void DefineProps(v8::Isolate* pIsoalte); \ - static void DefineMethods(v8::Isolate* pIsoalte); \ - static JSPropertySpec JS_Class_Properties[]; \ - static JSMethodSpec JS_Class_Methods[]; - -#define IMPLEMENT_JS_CLASS_RICH_PART(js_class_name, class_alternate, \ - class_name) \ - void js_class_name::JSConstructor(IJS_Runtime* pIRuntime, \ - v8::Local<v8::Object> obj) { \ - CJS_Object* pObj = new js_class_name(obj); \ - pObj->SetEmbedObject(new class_alternate(pObj)); \ - FXJS_SetPrivate(nullptr, obj, (void*)pObj); \ - pObj->InitInstance(pIRuntime); \ - } \ - void js_class_name::JSDestructor(v8::Local<v8::Object> obj) { \ - js_class_name* pObj = (js_class_name*)FXJS_GetPrivate(nullptr, obj); \ - pObj->ExitInstance(); \ - delete pObj; \ - } \ - void js_class_name::DefineProps(v8::Isolate* pIsolate) { \ - for (size_t i = 0; i < FX_ArraySize(JS_Class_Properties) - 1; ++i) { \ - FXJS_DefineObjProperty( \ - pIsolate, g_nObjDefnID, JS_Class_Properties[i].pName, \ - JS_Class_Properties[i].pPropGet, JS_Class_Properties[i].pPropPut); \ - } \ - } \ - void js_class_name::DefineMethods(v8::Isolate* pIsolate) { \ - for (size_t i = 0; i < FX_ArraySize(JS_Class_Methods) - 1; ++i) { \ - FXJS_DefineObjMethod(pIsolate, g_nObjDefnID, JS_Class_Methods[i].pName, \ - JS_Class_Methods[i].pMethodCall); \ - } \ - } - -// Special JS classes implement methods, props, and queries, but not consts. -#define DECLARE_SPECIAL_JS_CLASS() \ - DECLARE_JS_CLASS_BASE_PART() \ - DECLARE_JS_CLASS_CONST_PART() \ - DECLARE_JS_CLASS_RICH_PART() \ - DECLARE_SPECIAL_JS_CLASS_PART() - -#define IMPLEMENT_SPECIAL_JS_CLASS(js_class_name, class_alternate, class_name) \ - IMPLEMENT_JS_CLASS_BASE_PART(js_class_name, class_name) \ - IMPLEMENT_JS_CLASS_CONST_PART(js_class_name, class_name) \ - IMPLEMENT_JS_CLASS_RICH_PART(js_class_name, class_alternate, class_name) \ - IMPLEMENT_SPECIAL_JS_CLASS_PART(js_class_name, class_alternate, class_name) \ - void js_class_name::DefineJSObjects(v8::Isolate* pIsolate, \ - FXJSOBJTYPE eObjType) { \ - g_nObjDefnID = FXJS_DefineObj(pIsolate, js_class_name::g_pClassName, \ - eObjType, JSConstructor, JSDestructor); \ - DefineConsts(pIsolate); \ - DefineProps(pIsolate); \ - DefineMethods(pIsolate); \ - DefineAllProperties(pIsolate); \ - } - -#define DECLARE_SPECIAL_JS_CLASS_PART() \ - static void queryprop_static( \ - v8::Local<v8::String> property, \ - const v8::PropertyCallbackInfo<v8::Integer>& info); \ - static void getprop_static(v8::Local<v8::String> property, \ - const v8::PropertyCallbackInfo<v8::Value>& info); \ - static void putprop_static(v8::Local<v8::String> property, \ - v8::Local<v8::Value> value, \ - const v8::PropertyCallbackInfo<v8::Value>& info); \ - static void delprop_static( \ - v8::Local<v8::String> property, \ - const v8::PropertyCallbackInfo<v8::Boolean>& info); \ - static void DefineAllProperties(v8::Isolate* pIsolate); - -#define IMPLEMENT_SPECIAL_JS_CLASS_PART(js_class_name, class_alternate, \ - class_name) \ - void js_class_name::queryprop_static( \ - v8::Local<v8::String> property, \ - const v8::PropertyCallbackInfo<v8::Integer>& info) { \ - JSSpecialPropQuery<class_alternate>(#class_name, property, info); \ - } \ - void js_class_name::getprop_static( \ - v8::Local<v8::String> property, \ - const v8::PropertyCallbackInfo<v8::Value>& info) { \ - JSSpecialPropGet<class_alternate>(#class_name, property, info); \ - } \ - void js_class_name::putprop_static( \ - v8::Local<v8::String> property, v8::Local<v8::Value> value, \ - const v8::PropertyCallbackInfo<v8::Value>& info) { \ - JSSpecialPropPut<class_alternate>(#class_name, property, value, info); \ - } \ - void js_class_name::delprop_static( \ - v8::Local<v8::String> property, \ - const v8::PropertyCallbackInfo<v8::Boolean>& info) { \ - JSSpecialPropDel<class_alternate>(#class_name, property, info); \ - } \ - void js_class_name::DefineAllProperties(v8::Isolate* pIsolate) { \ - FXJS_DefineObjAllProperties( \ - pIsolate, g_nObjDefnID, js_class_name::queryprop_static, \ - js_class_name::getprop_static, js_class_name::putprop_static, \ - js_class_name::delprop_static); \ - } - -template <class Alt> -void JSSpecialPropQuery(const char*, - v8::Local<v8::String> property, - const v8::PropertyCallbackInfo<v8::Integer>& info) { - v8::Isolate* isolate = info.GetIsolate(); - v8::String::Utf8Value utf8_value(property); - CFX_WideString propname = - CFX_WideString::FromUTF8(*utf8_value, utf8_value.length()); - CJS_Object* pJSObj = - reinterpret_cast<CJS_Object*>(FXJS_GetPrivate(isolate, info.Holder())); - Alt* pObj = reinterpret_cast<Alt*>(pJSObj->GetEmbedObject()); - FX_BOOL bRet = pObj->QueryProperty(propname.c_str()); - info.GetReturnValue().Set(bRet ? 4 : 0); -} - -template <class Alt> -void JSSpecialPropGet(const char* class_name, - v8::Local<v8::String> property, - const v8::PropertyCallbackInfo<v8::Value>& info) { - v8::Isolate* isolate = info.GetIsolate(); - CJS_Runtime* pRuntime = - static_cast<CJS_Runtime*>(FXJS_GetRuntimeFromIsolate(isolate)); - if (!pRuntime) - return; - IJS_Context* pContext = pRuntime->GetCurrentContext(); - CJS_Object* pJSObj = - reinterpret_cast<CJS_Object*>(FXJS_GetPrivate(isolate, info.Holder())); - Alt* pObj = reinterpret_cast<Alt*>(pJSObj->GetEmbedObject()); - v8::String::Utf8Value utf8_value(property); - CFX_WideString propname = - CFX_WideString::FromUTF8(*utf8_value, utf8_value.length()); - CFX_WideString sError; - CJS_PropValue value(pRuntime); - value.StartGetting(); - if (!pObj->DoProperty(pContext, propname.c_str(), value, sError)) { - FXJS_Error(isolate, JSFormatErrorString(class_name, "GetProperty", sError)); - return; - } - info.GetReturnValue().Set((v8::Local<v8::Value>)value); -} - -template <class Alt> -void JSSpecialPropPut(const char* class_name, - v8::Local<v8::String> property, - v8::Local<v8::Value> value, - const v8::PropertyCallbackInfo<v8::Value>& info) { - v8::Isolate* isolate = info.GetIsolate(); - CJS_Runtime* pRuntime = - static_cast<CJS_Runtime*>(FXJS_GetRuntimeFromIsolate(isolate)); - if (!pRuntime) - return; - IJS_Context* pContext = pRuntime->GetCurrentContext(); - CJS_Object* pJSObj = - reinterpret_cast<CJS_Object*>(FXJS_GetPrivate(isolate, info.Holder())); - Alt* pObj = reinterpret_cast<Alt*>(pJSObj->GetEmbedObject()); - v8::String::Utf8Value utf8_value(property); - CFX_WideString propname = - CFX_WideString::FromUTF8(*utf8_value, utf8_value.length()); - CFX_WideString sError; - CJS_PropValue PropValue(CJS_Value(pRuntime, value, CJS_Value::VT_unknown)); - PropValue.StartSetting(); - if (!pObj->DoProperty(pContext, propname.c_str(), PropValue, sError)) { - FXJS_Error(isolate, JSFormatErrorString(class_name, "PutProperty", sError)); - } -} - -template <class Alt> -void JSSpecialPropDel(const char* class_name, - v8::Local<v8::String> property, - const v8::PropertyCallbackInfo<v8::Boolean>& info) { - v8::Isolate* isolate = info.GetIsolate(); - IJS_Runtime* pRuntime = FXJS_GetRuntimeFromIsolate(isolate); - if (!pRuntime) - return; - IJS_Context* pContext = pRuntime->GetCurrentContext(); - CJS_Object* pJSObj = - reinterpret_cast<CJS_Object*>(FXJS_GetPrivate(isolate, info.Holder())); - Alt* pObj = reinterpret_cast<Alt*>(pJSObj->GetEmbedObject()); - v8::String::Utf8Value utf8_value(property); - CFX_WideString propname = - CFX_WideString::FromUTF8(*utf8_value, utf8_value.length()); - CFX_WideString sError; - if (!pObj->DelProperty(pContext, propname.c_str(), sError)) { - CFX_ByteString cbName; - cbName.Format("%s.%s", class_name, "DelProperty"); - // Probably a missing call to JSFX_Error(). - } -} - -template <FX_BOOL (*F)(IJS_Context*, - const std::vector<CJS_Value>&, - CJS_Value&, - CFX_WideString&)> -void JSGlobalFunc(const char* func_name_string, - const v8::FunctionCallbackInfo<v8::Value>& info) { - CJS_Runtime* pRuntime = - static_cast<CJS_Runtime*>(FXJS_GetRuntimeFromIsolate(info.GetIsolate())); - if (!pRuntime) - return; - IJS_Context* pContext = pRuntime->GetCurrentContext(); - std::vector<CJS_Value> parameters; - for (unsigned int i = 0; i < (unsigned int)info.Length(); i++) { - parameters.push_back(CJS_Value(pRuntime, info[i], CJS_Value::VT_unknown)); - } - CJS_Value valueRes(pRuntime); - CFX_WideString sError; - if (!(*F)(pContext, parameters, valueRes, sError)) { - FXJS_Error(pRuntime->GetIsolate(), - JSFormatErrorString(func_name_string, nullptr, sError)); - return; - } - info.GetReturnValue().Set(valueRes.ToV8Value()); -} - -#define JS_STATIC_GLOBAL_FUN(fun_name) \ - static void fun_name##_static( \ - const v8::FunctionCallbackInfo<v8::Value>& info) { \ - JSGlobalFunc<fun_name>(#fun_name, info); \ - } - -#define JS_STATIC_DECLARE_GLOBAL_FUN() \ - static JSMethodSpec global_methods[]; \ - static void DefineJSObjects(v8::Isolate* pIsolate) - -#define BEGIN_JS_STATIC_GLOBAL_FUN(js_class_name) \ - JSMethodSpec js_class_name::global_methods[] = { -#define JS_STATIC_GLOBAL_FUN_ENTRY(method_name) \ - JS_STATIC_METHOD_ENTRY(method_name) - -#define END_JS_STATIC_GLOBAL_FUN() END_JS_STATIC_METHOD() - -#define IMPLEMENT_JS_STATIC_GLOBAL_FUN(js_class_name) \ - void js_class_name::DefineJSObjects(v8::Isolate* pIsolate) { \ - for (size_t i = 0; i < FX_ArraySize(global_methods) - 1; ++i) { \ - FXJS_DefineGlobalMethod(pIsolate, \ - js_class_name::global_methods[i].pName, \ - js_class_name::global_methods[i].pMethodCall); \ - } \ - } - -CJS_Value::Type GET_VALUE_TYPE(v8::Local<v8::Value> p); - -#endif // FPDFSDK_SRC_JAVASCRIPT_JS_DEFINE_H_ diff --git a/fpdfsdk/src/javascript/JS_EventHandler.cpp b/fpdfsdk/src/javascript/JS_EventHandler.cpp deleted file mode 100644 index e11cfa39ae..0000000000 --- a/fpdfsdk/src/javascript/JS_EventHandler.cpp +++ /dev/null @@ -1,659 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "fpdfsdk/src/javascript/JS_EventHandler.h" - -#include "fpdfsdk/include/javascript/IJavaScript.h" -#include "fpdfsdk/src/javascript/Document.h" -#include "fpdfsdk/src/javascript/Field.h" -#include "fpdfsdk/src/javascript/JS_Context.h" -#include "fpdfsdk/src/javascript/JS_Define.h" -#include "fpdfsdk/src/javascript/JS_Object.h" -#include "fpdfsdk/src/javascript/JS_Runtime.h" -#include "fpdfsdk/src/javascript/JS_Value.h" - -/* ---------------------------- CJS_EventHandler ---------------------------- */ - -CJS_EventHandler::CJS_EventHandler(CJS_Context* pContext) - : m_pJSContext(pContext), - m_eEventType(JET_UNKNOWN), - m_bValid(FALSE), - m_pWideStrChange(NULL), - m_nCommitKey(-1), - m_bKeyDown(FALSE), - m_bModifier(FALSE), - m_bShift(FALSE), - m_pISelEnd(NULL), - m_nSelEndDu(0), - m_pISelStart(NULL), - m_nSelStartDu(0), - m_bWillCommit(FALSE), - m_pValue(NULL), - m_bFieldFull(FALSE), - m_pbRc(NULL), - m_bRcDu(FALSE), - m_pSourceDoc(NULL), - m_pTargetBookMark(NULL), - m_pTargetDoc(NULL), - m_pTargetAnnot(NULL) {} - -CJS_EventHandler::~CJS_EventHandler() {} - -void CJS_EventHandler::OnApp_Init() { - Initial(JET_APP_INIT); -} - -void CJS_EventHandler::OnDoc_Open(CPDFSDK_Document* pDoc, - const CFX_WideString& strTargetName) { - Initial(JET_DOC_OPEN); - - m_pTargetDoc = pDoc; - m_strTargetName = strTargetName; -} - -void CJS_EventHandler::OnDoc_WillPrint(CPDFSDK_Document* pDoc) { - Initial(JET_DOC_WILLPRINT); - - m_pTargetDoc = pDoc; -} - -void CJS_EventHandler::OnDoc_DidPrint(CPDFSDK_Document* pDoc) { - Initial(JET_DOC_DIDPRINT); - - m_pTargetDoc = pDoc; -} - -void CJS_EventHandler::OnDoc_WillSave(CPDFSDK_Document* pDoc) { - Initial(JET_DOC_WILLSAVE); - m_pTargetDoc = pDoc; -} - -void CJS_EventHandler::OnDoc_DidSave(CPDFSDK_Document* pDoc) { - Initial(JET_DOC_DIDSAVE); - - m_pTargetDoc = pDoc; -} - -void CJS_EventHandler::OnDoc_WillClose(CPDFSDK_Document* pDoc) { - Initial(JET_DOC_WILLCLOSE); - - m_pTargetDoc = pDoc; -} - -void CJS_EventHandler::OnPage_Open(CPDFSDK_Document* pDoc) { - Initial(JET_PAGE_OPEN); - - m_pTargetDoc = pDoc; -} - -void CJS_EventHandler::OnPage_Close(CPDFSDK_Document* pDoc) { - Initial(JET_PAGE_CLOSE); - - m_pTargetDoc = pDoc; -} - -void CJS_EventHandler::OnPage_InView(CPDFSDK_Document* pDoc) { - Initial(JET_PAGE_INVIEW); - - m_pTargetDoc = pDoc; -} - -void CJS_EventHandler::OnPage_OutView(CPDFSDK_Document* pDoc) { - Initial(JET_PAGE_OUTVIEW); - - m_pTargetDoc = pDoc; -} - -void CJS_EventHandler::OnField_MouseEnter(FX_BOOL bModifier, - FX_BOOL bShift, - CPDF_FormField* pTarget) { - Initial(JET_FIELD_MOUSEENTER); - - m_bModifier = bModifier; - m_bShift = bShift; - - m_strTargetName = pTarget->GetFullName(); -} - -void CJS_EventHandler::OnField_MouseExit(FX_BOOL bModifier, - FX_BOOL bShift, - CPDF_FormField* pTarget) { - Initial(JET_FIELD_MOUSEEXIT); - - m_bModifier = bModifier; - m_bShift = bShift; - m_strTargetName = pTarget->GetFullName(); -} - -void CJS_EventHandler::OnField_MouseDown(FX_BOOL bModifier, - FX_BOOL bShift, - CPDF_FormField* pTarget) { - Initial(JET_FIELD_MOUSEDOWN); - m_eEventType = JET_FIELD_MOUSEDOWN; - - m_bModifier = bModifier; - m_bShift = bShift; - m_strTargetName = pTarget->GetFullName(); -} - -void CJS_EventHandler::OnField_MouseUp(FX_BOOL bModifier, - FX_BOOL bShift, - CPDF_FormField* pTarget) { - Initial(JET_FIELD_MOUSEUP); - - m_bModifier = bModifier; - m_bShift = bShift; - m_strTargetName = pTarget->GetFullName(); -} - -void CJS_EventHandler::OnField_Focus(FX_BOOL bModifier, - FX_BOOL bShift, - CPDF_FormField* pTarget, - const CFX_WideString& Value) { - Initial(JET_FIELD_FOCUS); - - m_bModifier = bModifier; - m_bShift = bShift; - m_strTargetName = pTarget->GetFullName(); - m_pValue = (CFX_WideString*)&Value; -} - -void CJS_EventHandler::OnField_Blur(FX_BOOL bModifier, - FX_BOOL bShift, - CPDF_FormField* pTarget, - const CFX_WideString& Value) { - Initial(JET_FIELD_BLUR); - - m_bModifier = bModifier; - m_bShift = bShift; - m_strTargetName = pTarget->GetFullName(); - m_pValue = (CFX_WideString*)&Value; -} - -void CJS_EventHandler::OnField_Keystroke(CFX_WideString& strChange, - const CFX_WideString& strChangeEx, - FX_BOOL KeyDown, - FX_BOOL bModifier, - int& nSelEnd, - int& nSelStart, - FX_BOOL bShift, - CPDF_FormField* pTarget, - CFX_WideString& Value, - FX_BOOL bWillCommit, - FX_BOOL bFieldFull, - FX_BOOL& bRc) { - Initial(JET_FIELD_KEYSTROKE); - - m_nCommitKey = 0; - m_pWideStrChange = &strChange; - m_WideStrChangeEx = strChangeEx; - m_bKeyDown = KeyDown; - m_bModifier = bModifier; - m_pISelEnd = &nSelEnd; - m_pISelStart = &nSelStart; - m_bShift = bShift; - m_strTargetName = pTarget->GetFullName(); - m_pValue = &Value; - m_bWillCommit = bWillCommit; - m_pbRc = &bRc; - m_bFieldFull = bFieldFull; -} - -void CJS_EventHandler::OnField_Validate(CFX_WideString& strChange, - const CFX_WideString& strChangeEx, - FX_BOOL bKeyDown, - FX_BOOL bModifier, - FX_BOOL bShift, - CPDF_FormField* pTarget, - CFX_WideString& Value, - FX_BOOL& bRc) { - Initial(JET_FIELD_VALIDATE); - - m_pWideStrChange = &strChange; - m_WideStrChangeEx = strChangeEx; - m_bKeyDown = bKeyDown; - m_bModifier = bModifier; - m_bShift = bShift; - m_strTargetName = pTarget->GetFullName(); - m_pValue = &Value; - m_pbRc = &bRc; -} - -void CJS_EventHandler::OnField_Calculate(CPDF_FormField* pSource, - CPDF_FormField* pTarget, - CFX_WideString& Value, - FX_BOOL& bRc) { - Initial(JET_FIELD_CALCULATE); - - if (pSource) - m_strSourceName = pSource->GetFullName(); - m_strTargetName = pTarget->GetFullName(); - m_pValue = &Value; - m_pbRc = &bRc; -} - -void CJS_EventHandler::OnField_Format(CPDF_FormField* pTarget, - CFX_WideString& Value, - FX_BOOL bWillCommit) { - Initial(JET_FIELD_FORMAT); - - m_nCommitKey = 0; - m_strTargetName = pTarget->GetFullName(); - m_pValue = &Value; - m_bWillCommit = bWillCommit; -} - -void CJS_EventHandler::OnScreen_Focus(FX_BOOL bModifier, - FX_BOOL bShift, - CPDFSDK_Annot* pScreen) { - Initial(JET_SCREEN_FOCUS); - - m_bModifier = bModifier; - m_bShift = bShift; - m_pTargetAnnot = pScreen; -} - -void CJS_EventHandler::OnScreen_Blur(FX_BOOL bModifier, - FX_BOOL bShift, - CPDFSDK_Annot* pScreen) { - Initial(JET_SCREEN_BLUR); - - m_bModifier = bModifier; - m_bShift = bShift; - m_pTargetAnnot = pScreen; -} - -void CJS_EventHandler::OnScreen_Open(FX_BOOL bModifier, - FX_BOOL bShift, - CPDFSDK_Annot* pScreen) { - Initial(JET_SCREEN_OPEN); - - m_bModifier = bModifier; - m_bShift = bShift; - m_pTargetAnnot = pScreen; -} - -void CJS_EventHandler::OnScreen_Close(FX_BOOL bModifier, - FX_BOOL bShift, - CPDFSDK_Annot* pScreen) { - Initial(JET_SCREEN_CLOSE); - - m_bModifier = bModifier; - m_bShift = bShift; - m_pTargetAnnot = pScreen; -} - -void CJS_EventHandler::OnScreen_MouseDown(FX_BOOL bModifier, - FX_BOOL bShift, - CPDFSDK_Annot* pScreen) { - Initial(JET_SCREEN_MOUSEDOWN); - - m_bModifier = bModifier; - m_bShift = bShift; - m_pTargetAnnot = pScreen; -} - -void CJS_EventHandler::OnScreen_MouseUp(FX_BOOL bModifier, - FX_BOOL bShift, - CPDFSDK_Annot* pScreen) { - Initial(JET_SCREEN_MOUSEUP); - - m_bModifier = bModifier; - m_bShift = bShift; - m_pTargetAnnot = pScreen; -} - -void CJS_EventHandler::OnScreen_MouseEnter(FX_BOOL bModifier, - FX_BOOL bShift, - CPDFSDK_Annot* pScreen) { - Initial(JET_SCREEN_MOUSEENTER); - - m_bModifier = bModifier; - m_bShift = bShift; - m_pTargetAnnot = pScreen; -} - -void CJS_EventHandler::OnScreen_MouseExit(FX_BOOL bModifier, - FX_BOOL bShift, - CPDFSDK_Annot* pScreen) { - Initial(JET_SCREEN_MOUSEEXIT); - - m_bModifier = bModifier; - m_bShift = bShift; - m_pTargetAnnot = pScreen; -} - -void CJS_EventHandler::OnScreen_InView(FX_BOOL bModifier, - FX_BOOL bShift, - CPDFSDK_Annot* pScreen) { - Initial(JET_SCREEN_INVIEW); - - m_bModifier = bModifier; - m_bShift = bShift; - m_pTargetAnnot = pScreen; -} - -void CJS_EventHandler::OnScreen_OutView(FX_BOOL bModifier, - FX_BOOL bShift, - CPDFSDK_Annot* pScreen) { - Initial(JET_SCREEN_OUTVIEW); - - m_bModifier = bModifier; - m_bShift = bShift; - m_pTargetAnnot = pScreen; -} - -void CJS_EventHandler::OnLink_MouseUp(CPDFSDK_Document* pTarget) { - Initial(JET_LINK_MOUSEUP); - - m_pTargetDoc = pTarget; -} - -void CJS_EventHandler::OnBookmark_MouseUp(CPDF_Bookmark* pBookMark) { - Initial(JET_BOOKMARK_MOUSEUP); - - m_pTargetBookMark = pBookMark; -} - -void CJS_EventHandler::OnMenu_Exec(CPDFSDK_Document* pTarget, - const CFX_WideString& strTargetName) { - Initial(JET_MENU_EXEC); - - m_pTargetDoc = pTarget; - m_strTargetName = strTargetName; -} - -void CJS_EventHandler::OnExternal_Exec() { - Initial(JET_EXTERNAL_EXEC); -} - -void CJS_EventHandler::OnBatchExec(CPDFSDK_Document* pTarget) { - Initial(JET_BATCH_EXEC); - - m_pTargetDoc = pTarget; -} - -void CJS_EventHandler::OnConsole_Exec() { - Initial(JET_CONSOLE_EXEC); -} - -void CJS_EventHandler::Initial(JS_EVENT_T type) { - m_eEventType = type; - - m_strTargetName = L""; - m_strSourceName = L""; - m_pWideStrChange = NULL; - m_WideStrChangeDu = L""; - m_WideStrChangeEx = L""; - m_nCommitKey = -1; - m_bKeyDown = FALSE; - m_bModifier = FALSE; - m_bShift = FALSE; - m_pISelEnd = NULL; - m_nSelEndDu = 0; - m_pISelStart = NULL; - m_nSelStartDu = 0; - m_bWillCommit = FALSE; - m_pValue = NULL; - m_bFieldFull = FALSE; - m_pbRc = NULL; - m_bRcDu = FALSE; - - m_pSourceDoc = NULL; - m_pTargetBookMark = NULL; - m_pTargetDoc = NULL; - m_pTargetAnnot = NULL; - - m_bValid = TRUE; -} - -void CJS_EventHandler::Destroy() { - m_bValid = FALSE; -} - -FX_BOOL CJS_EventHandler::IsValid() { - return m_bValid; -} - -CFX_WideString& CJS_EventHandler::Change() { - if (m_pWideStrChange) { - return *m_pWideStrChange; - } - return m_WideStrChangeDu; -} - -CFX_WideString CJS_EventHandler::ChangeEx() { - return m_WideStrChangeEx; -} - -int CJS_EventHandler::CommitKey() { - return m_nCommitKey; -} - -FX_BOOL CJS_EventHandler::FieldFull() { - return m_bFieldFull; -} - -FX_BOOL CJS_EventHandler::KeyDown() { - return m_bKeyDown; -} - -FX_BOOL CJS_EventHandler::Modifier() { - return m_bModifier; -} - -const FX_WCHAR* CJS_EventHandler::Name() { - switch (m_eEventType) { - case JET_APP_INIT: - return L"Init"; - case JET_BATCH_EXEC: - return L"Exec"; - case JET_BOOKMARK_MOUSEUP: - return L"Mouse Up"; - case JET_CONSOLE_EXEC: - return L"Exec"; - case JET_DOC_DIDPRINT: - return L"DidPrint"; - case JET_DOC_DIDSAVE: - return L"DidSave"; - case JET_DOC_OPEN: - return L"Open"; - case JET_DOC_WILLCLOSE: - return L"WillClose"; - case JET_DOC_WILLPRINT: - return L"WillPrint"; - case JET_DOC_WILLSAVE: - return L"WillSave"; - case JET_EXTERNAL_EXEC: - return L"Exec"; - case JET_FIELD_FOCUS: - case JET_SCREEN_FOCUS: - return L"Focus"; - case JET_FIELD_BLUR: - case JET_SCREEN_BLUR: - return L"Blur"; - case JET_FIELD_MOUSEDOWN: - case JET_SCREEN_MOUSEDOWN: - return L"Mouse Down"; - case JET_FIELD_MOUSEUP: - case JET_SCREEN_MOUSEUP: - return L"Mouse Up"; - case JET_FIELD_MOUSEENTER: - case JET_SCREEN_MOUSEENTER: - return L"Mouse Enter"; - case JET_FIELD_MOUSEEXIT: - case JET_SCREEN_MOUSEEXIT: - return L"Mouse Exit"; - case JET_FIELD_CALCULATE: - return L"Calculate"; - case JET_FIELD_FORMAT: - return L"Format"; - case JET_FIELD_KEYSTROKE: - return L"Keystroke"; - case JET_FIELD_VALIDATE: - return L"Validate"; - case JET_LINK_MOUSEUP: - return L"Mouse Up"; - case JET_MENU_EXEC: - return L"Exec"; - case JET_PAGE_OPEN: - case JET_SCREEN_OPEN: - return L"Open"; - case JET_PAGE_CLOSE: - case JET_SCREEN_CLOSE: - return L"Close"; - case JET_SCREEN_INVIEW: - case JET_PAGE_INVIEW: - return L"InView"; - case JET_PAGE_OUTVIEW: - case JET_SCREEN_OUTVIEW: - return L"OutView"; - default: - return L""; - } - - return L""; -} - -const FX_WCHAR* CJS_EventHandler::Type() { - switch (m_eEventType) { - case JET_APP_INIT: - return L"App"; - case JET_BATCH_EXEC: - return L"Batch"; - case JET_BOOKMARK_MOUSEUP: - return L"BookMark"; - case JET_CONSOLE_EXEC: - return L"Console"; - case JET_DOC_DIDPRINT: - case JET_DOC_DIDSAVE: - case JET_DOC_OPEN: - case JET_DOC_WILLCLOSE: - case JET_DOC_WILLPRINT: - case JET_DOC_WILLSAVE: - return L"Doc"; - case JET_EXTERNAL_EXEC: - return L"External"; - case JET_FIELD_BLUR: - case JET_FIELD_FOCUS: - case JET_FIELD_MOUSEDOWN: - case JET_FIELD_MOUSEENTER: - case JET_FIELD_MOUSEEXIT: - case JET_FIELD_MOUSEUP: - case JET_FIELD_CALCULATE: - case JET_FIELD_FORMAT: - case JET_FIELD_KEYSTROKE: - case JET_FIELD_VALIDATE: - return L"Field"; - case JET_SCREEN_FOCUS: - case JET_SCREEN_BLUR: - case JET_SCREEN_OPEN: - case JET_SCREEN_CLOSE: - case JET_SCREEN_MOUSEDOWN: - case JET_SCREEN_MOUSEUP: - case JET_SCREEN_MOUSEENTER: - case JET_SCREEN_MOUSEEXIT: - case JET_SCREEN_INVIEW: - case JET_SCREEN_OUTVIEW: - return L"Screen"; - case JET_LINK_MOUSEUP: - return L"Link"; - case JET_MENU_EXEC: - return L"Menu"; - case JET_PAGE_OPEN: - case JET_PAGE_CLOSE: - case JET_PAGE_INVIEW: - case JET_PAGE_OUTVIEW: - return L"Page"; - default: - return L""; - } - - return L""; -} - -FX_BOOL& CJS_EventHandler::Rc() { - if (m_pbRc) { - return *m_pbRc; - } - return m_bRcDu; -} - -int& CJS_EventHandler::SelEnd() { - if (m_pISelEnd) { - return *m_pISelEnd; - } - return m_nSelEndDu; -} - -int& CJS_EventHandler::SelStart() { - if (m_pISelStart) { - return *m_pISelStart; - } - return m_nSelStartDu; -} - -FX_BOOL CJS_EventHandler::Shift() { - return m_bShift; -} - -Field* CJS_EventHandler::Source() { - CJS_Runtime* pRuntime = m_pJSContext->GetJSRuntime(); - v8::Local<v8::Object> pDocObj = FXJS_NewFxDynamicObj( - pRuntime->GetIsolate(), pRuntime, CJS_Document::g_nObjDefnID); - ASSERT(!pDocObj.IsEmpty()); - - v8::Local<v8::Object> pFieldObj = FXJS_NewFxDynamicObj( - pRuntime->GetIsolate(), pRuntime, CJS_Field::g_nObjDefnID); - ASSERT(!pFieldObj.IsEmpty()); - - CJS_Document* pJSDocument = - (CJS_Document*)FXJS_GetPrivate(pRuntime->GetIsolate(), pDocObj); - Document* pDocument = (Document*)pJSDocument->GetEmbedObject(); - pDocument->AttachDoc(m_pTargetDoc ? m_pTargetDoc - : m_pJSContext->GetReaderDocument()); - - CJS_Field* pJSField = - (CJS_Field*)FXJS_GetPrivate(pRuntime->GetIsolate(), pFieldObj); - Field* pField = (Field*)pJSField->GetEmbedObject(); - pField->AttachField(pDocument, m_strSourceName); - return pField; -} - -Field* CJS_EventHandler::Target_Field() { - CJS_Runtime* pRuntime = m_pJSContext->GetJSRuntime(); - v8::Local<v8::Object> pDocObj = FXJS_NewFxDynamicObj( - pRuntime->GetIsolate(), pRuntime, CJS_Document::g_nObjDefnID); - ASSERT(!pDocObj.IsEmpty()); - - v8::Local<v8::Object> pFieldObj = FXJS_NewFxDynamicObj( - pRuntime->GetIsolate(), pRuntime, CJS_Field::g_nObjDefnID); - ASSERT(!pFieldObj.IsEmpty()); - - CJS_Document* pJSDocument = - (CJS_Document*)FXJS_GetPrivate(pRuntime->GetIsolate(), pDocObj); - Document* pDocument = (Document*)pJSDocument->GetEmbedObject(); - pDocument->AttachDoc(m_pTargetDoc ? m_pTargetDoc - : m_pJSContext->GetReaderDocument()); - - CJS_Field* pJSField = - (CJS_Field*)FXJS_GetPrivate(pRuntime->GetIsolate(), pFieldObj); - Field* pField = (Field*)pJSField->GetEmbedObject(); - pField->AttachField(pDocument, m_strTargetName); - return pField; -} - -CFX_WideString& CJS_EventHandler::Value() { - return *m_pValue; -} - -FX_BOOL CJS_EventHandler::WillCommit() { - return m_bWillCommit; -} - -CFX_WideString CJS_EventHandler::TargetName() { - return m_strTargetName; -} diff --git a/fpdfsdk/src/javascript/JS_EventHandler.h b/fpdfsdk/src/javascript/JS_EventHandler.h deleted file mode 100644 index 2af19d9ad5..0000000000 --- a/fpdfsdk/src/javascript/JS_EventHandler.h +++ /dev/null @@ -1,220 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef FPDFSDK_SRC_JAVASCRIPT_JS_EVENTHANDLER_H_ -#define FPDFSDK_SRC_JAVASCRIPT_JS_EVENTHANDLER_H_ - -#include "core/include/fxcrt/fx_string.h" -#include "core/include/fxcrt/fx_system.h" - -class CJS_Context; -class CPDFSDK_Annot; -class CPDFSDK_Document; -class CPDF_Bookmark; -class CPDF_FormField; -class Field; - -enum JS_EVENT_T { - JET_UNKNOWN, - JET_APP_INIT, - JET_DOC_OPEN, - JET_DOC_WILLPRINT, - JET_DOC_DIDPRINT, - JET_DOC_WILLSAVE, - JET_DOC_DIDSAVE, - JET_DOC_WILLCLOSE, - JET_PAGE_OPEN, - JET_PAGE_CLOSE, - JET_PAGE_INVIEW, - JET_PAGE_OUTVIEW, - JET_FIELD_MOUSEDOWN, - JET_FIELD_MOUSEUP, - JET_FIELD_MOUSEENTER, - JET_FIELD_MOUSEEXIT, - JET_FIELD_FOCUS, - JET_FIELD_BLUR, - JET_FIELD_KEYSTROKE, - JET_FIELD_VALIDATE, - JET_FIELD_CALCULATE, - JET_FIELD_FORMAT, - JET_SCREEN_FOCUS, - JET_SCREEN_BLUR, - JET_SCREEN_OPEN, - JET_SCREEN_CLOSE, - JET_SCREEN_MOUSEDOWN, - JET_SCREEN_MOUSEUP, - JET_SCREEN_MOUSEENTER, - JET_SCREEN_MOUSEEXIT, - JET_SCREEN_INVIEW, - JET_SCREEN_OUTVIEW, - JET_BATCH_EXEC, - JET_MENU_EXEC, - JET_CONSOLE_EXEC, - JET_EXTERNAL_EXEC, - JET_BOOKMARK_MOUSEUP, - JET_LINK_MOUSEUP -}; - -class CJS_EventHandler { - public: - CJS_EventHandler(CJS_Context* pContext); - virtual ~CJS_EventHandler(); - - void OnApp_Init(); - - void OnDoc_Open(CPDFSDK_Document* pDoc, const CFX_WideString& strTargetName); - void OnDoc_WillPrint(CPDFSDK_Document* pDoc); - void OnDoc_DidPrint(CPDFSDK_Document* pDoc); - void OnDoc_WillSave(CPDFSDK_Document* pDoc); - void OnDoc_DidSave(CPDFSDK_Document* pDoc); - void OnDoc_WillClose(CPDFSDK_Document* pDoc); - - void OnPage_Open(CPDFSDK_Document* pDoc); - void OnPage_Close(CPDFSDK_Document* pDoc); - void OnPage_InView(CPDFSDK_Document* pTarget); - void OnPage_OutView(CPDFSDK_Document* pTarget); - - void OnField_Calculate(CPDF_FormField* pSource, - CPDF_FormField* pTarget, - CFX_WideString& Value, - FX_BOOL& bRc); - void OnField_Format(CPDF_FormField* pTarget, - CFX_WideString& Value, - FX_BOOL bWillCommit); - void OnField_Keystroke(CFX_WideString& strChange, - const CFX_WideString& strChangeEx, - FX_BOOL KeyDown, - FX_BOOL bModifier, - int& nSelEnd, - int& nSelStart, - FX_BOOL bShift, - CPDF_FormField* pTarget, - CFX_WideString& Value, - FX_BOOL bWillCommit, - FX_BOOL bFieldFull, - FX_BOOL& bRc); - void OnField_Validate(CFX_WideString& strChange, - const CFX_WideString& strChangeEx, - FX_BOOL bKeyDown, - FX_BOOL bModifier, - FX_BOOL bShift, - CPDF_FormField* pTarget, - CFX_WideString& Value, - FX_BOOL& bRc); - - void OnField_MouseDown(FX_BOOL bModifier, - FX_BOOL bShift, - CPDF_FormField* pTarget); - void OnField_MouseEnter(FX_BOOL bModifier, - FX_BOOL bShift, - CPDF_FormField* pTarget); - void OnField_MouseExit(FX_BOOL bModifier, - FX_BOOL bShift, - CPDF_FormField* pTarget); - void OnField_MouseUp(FX_BOOL bModifier, - FX_BOOL bShift, - CPDF_FormField* pTarget); - void OnField_Blur(FX_BOOL bModifier, - FX_BOOL bShift, - CPDF_FormField* pTarget, - const CFX_WideString& Value); - void OnField_Focus(FX_BOOL bModifier, - FX_BOOL bShift, - CPDF_FormField* pTarget, - const CFX_WideString& Value); - - void OnScreen_Focus(FX_BOOL bModifier, - FX_BOOL bShift, - CPDFSDK_Annot* pScreen); - void OnScreen_Blur(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen); - void OnScreen_Open(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen); - void OnScreen_Close(FX_BOOL bModifier, - FX_BOOL bShift, - CPDFSDK_Annot* pScreen); - void OnScreen_MouseDown(FX_BOOL bModifier, - FX_BOOL bShift, - CPDFSDK_Annot* pScreen); - void OnScreen_MouseUp(FX_BOOL bModifier, - FX_BOOL bShift, - CPDFSDK_Annot* pScreen); - void OnScreen_MouseEnter(FX_BOOL bModifier, - FX_BOOL bShift, - CPDFSDK_Annot* pScreen); - void OnScreen_MouseExit(FX_BOOL bModifier, - FX_BOOL bShift, - CPDFSDK_Annot* pScreen); - void OnScreen_InView(FX_BOOL bModifier, - FX_BOOL bShift, - CPDFSDK_Annot* pScreen); - void OnScreen_OutView(FX_BOOL bModifier, - FX_BOOL bShift, - CPDFSDK_Annot* pScreen); - - void OnBookmark_MouseUp(CPDF_Bookmark* pBookMark); - void OnLink_MouseUp(CPDFSDK_Document* pTarget); - - void OnMenu_Exec(CPDFSDK_Document* pTarget, - const CFX_WideString& strTargetName); - void OnBatchExec(CPDFSDK_Document* pTarget); - void OnConsole_Exec(); - void OnExternal_Exec(); - - public: - void Initial(JS_EVENT_T type); - void Destroy(); - FX_BOOL IsValid(); - - CFX_WideString& Change(); - CFX_WideString ChangeEx(); - int CommitKey(); - FX_BOOL FieldFull(); - FX_BOOL KeyDown(); - FX_BOOL Modifier(); - const FX_WCHAR* Name(); - const FX_WCHAR* Type(); - FX_BOOL& Rc(); - int& SelEnd(); - int& SelStart(); - FX_BOOL Shift(); - Field* Source(); - Field* Target_Field(); - CFX_WideString& Value(); - FX_BOOL WillCommit(); - CFX_WideString TargetName(); - - JS_EVENT_T EventType() { return m_eEventType; } - - public: - CJS_Context* m_pJSContext; - JS_EVENT_T m_eEventType; - FX_BOOL m_bValid; - - CFX_WideString m_strTargetName; - CFX_WideString m_strSourceName; - CFX_WideString* m_pWideStrChange; - CFX_WideString m_WideStrChangeDu; - CFX_WideString m_WideStrChangeEx; - int m_nCommitKey; - FX_BOOL m_bKeyDown; - FX_BOOL m_bModifier; - FX_BOOL m_bShift; - int* m_pISelEnd; - int m_nSelEndDu; - int* m_pISelStart; - int m_nSelStartDu; - FX_BOOL m_bWillCommit; - CFX_WideString* m_pValue; - FX_BOOL m_bFieldFull; - FX_BOOL* m_pbRc; - FX_BOOL m_bRcDu; - - CPDFSDK_Document* m_pSourceDoc; - CPDF_Bookmark* m_pTargetBookMark; - CPDFSDK_Document* m_pTargetDoc; - CPDFSDK_Annot* m_pTargetAnnot; -}; - -#endif // FPDFSDK_SRC_JAVASCRIPT_JS_EVENTHANDLER_H_ diff --git a/fpdfsdk/src/javascript/JS_GlobalData.cpp b/fpdfsdk/src/javascript/JS_GlobalData.cpp deleted file mode 100644 index 1491d018e7..0000000000 --- a/fpdfsdk/src/javascript/JS_GlobalData.cpp +++ /dev/null @@ -1,490 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "fpdfsdk/src/javascript/JS_GlobalData.h" - -#include "core/include/fdrm/fx_crypt.h" -#include "fpdfsdk/include/javascript/IJavaScript.h" - -#define JS_MAXGLOBALDATA (1024 * 4 - 8) - -/* --------------------- CJS_GlobalVariableArray --------------------- */ - -CJS_GlobalVariableArray::CJS_GlobalVariableArray() {} - -CJS_GlobalVariableArray::~CJS_GlobalVariableArray() { - Empty(); -} - -void CJS_GlobalVariableArray::Copy(const CJS_GlobalVariableArray& array) { - Empty(); - for (int i = 0, sz = array.Count(); i < sz; i++) { - CJS_KeyValue* pOldObjData = array.GetAt(i); - switch (pOldObjData->nType) { - case JS_GLOBALDATA_TYPE_NUMBER: { - CJS_KeyValue* pNewObjData = new CJS_KeyValue; - pNewObjData->sKey = pOldObjData->sKey; - pNewObjData->nType = pOldObjData->nType; - pNewObjData->dData = pOldObjData->dData; - Add(pNewObjData); - } break; - case JS_GLOBALDATA_TYPE_BOOLEAN: { - CJS_KeyValue* pNewObjData = new CJS_KeyValue; - pNewObjData->sKey = pOldObjData->sKey; - pNewObjData->nType = pOldObjData->nType; - pNewObjData->bData = pOldObjData->bData; - Add(pNewObjData); - } break; - case JS_GLOBALDATA_TYPE_STRING: { - CJS_KeyValue* pNewObjData = new CJS_KeyValue; - pNewObjData->sKey = pOldObjData->sKey; - pNewObjData->nType = pOldObjData->nType; - pNewObjData->sData = pOldObjData->sData; - Add(pNewObjData); - } break; - case JS_GLOBALDATA_TYPE_OBJECT: { - CJS_KeyValue* pNewObjData = new CJS_KeyValue; - pNewObjData->sKey = pOldObjData->sKey; - pNewObjData->nType = pOldObjData->nType; - pNewObjData->objData.Copy(pOldObjData->objData); - Add(pNewObjData); - } break; - case JS_GLOBALDATA_TYPE_NULL: { - CJS_KeyValue* pNewObjData = new CJS_KeyValue; - pNewObjData->sKey = pOldObjData->sKey; - pNewObjData->nType = pOldObjData->nType; - Add(pNewObjData); - } break; - } - } -} - -void CJS_GlobalVariableArray::Add(CJS_KeyValue* p) { - array.Add(p); -} - -int CJS_GlobalVariableArray::Count() const { - return array.GetSize(); -} - -CJS_KeyValue* CJS_GlobalVariableArray::GetAt(int index) const { - return array.GetAt(index); -} - -void CJS_GlobalVariableArray::Empty() { - for (int i = 0, sz = array.GetSize(); i < sz; i++) - delete array.GetAt(i); - array.RemoveAll(); -} - -/* -------------------------- CJS_GlobalData -------------------------- */ - -#define READER_JS_GLOBALDATA_FILENAME L"Reader_JsGlobal.Data" -#define PHANTOM_JS_GLOBALDATA_FILENAME L"Phantom_JsGlobal.Data" -#define SDK_JS_GLOBALDATA_FILENAME L"SDK_JsGlobal.Data" - -static const uint8_t JS_RC4KEY[] = { - 0x19, 0xa8, 0xe8, 0x01, 0xf6, 0xa8, 0xb6, 0x4d, 0x82, 0x04, 0x45, 0x6d, - 0xb4, 0xcf, 0xd7, 0x77, 0x67, 0xf9, 0x75, 0x9f, 0xf0, 0xe0, 0x1e, 0x51, - 0xee, 0x46, 0xfd, 0x0b, 0xc9, 0x93, 0x25, 0x55, 0x4a, 0xee, 0xe0, 0x16, - 0xd0, 0xdf, 0x8c, 0xfa, 0x2a, 0xa9, 0x49, 0xfd, 0x97, 0x1c, 0x0e, 0x22, - 0x13, 0x28, 0x7c, 0xaf, 0xc4, 0xfc, 0x9c, 0x12, 0x65, 0x8c, 0x4e, 0x5b, - 0x04, 0x75, 0x89, 0xc9, 0xb1, 0xed, 0x50, 0xca, 0x96, 0x6f, 0x1a, 0x7a, - 0xfe, 0x58, 0x5d, 0xec, 0x19, 0x4a, 0xf6, 0x35, 0x6a, 0x97, 0x14, 0x00, - 0x0e, 0xd0, 0x6b, 0xbb, 0xd5, 0x75, 0x55, 0x8b, 0x6e, 0x6b, 0x19, 0xa0, - 0xf8, 0x77, 0xd5, 0xa3}; - -CJS_GlobalData* CJS_GlobalData::g_Instance = nullptr; - -// static -CJS_GlobalData* CJS_GlobalData::GetRetainedInstance(CPDFDoc_Environment* pApp) { - if (!g_Instance) { - g_Instance = new CJS_GlobalData(); - } - ++g_Instance->m_RefCount; - return g_Instance; -} - -void CJS_GlobalData::Release() { - if (!--m_RefCount) { - delete g_Instance; - g_Instance = nullptr; - } -} - -CJS_GlobalData::CJS_GlobalData() : m_RefCount(0) { - m_sFilePath += SDK_JS_GLOBALDATA_FILENAME; - LoadGlobalPersistentVariables(); -} - -CJS_GlobalData::~CJS_GlobalData() { - SaveGlobalPersisitentVariables(); - for (int i = 0, sz = m_arrayGlobalData.GetSize(); i < sz; i++) - delete m_arrayGlobalData.GetAt(i); - - m_arrayGlobalData.RemoveAll(); -} - -int CJS_GlobalData::FindGlobalVariable(const FX_CHAR* propname) { - for (int i = 0, sz = m_arrayGlobalData.GetSize(); i < sz; i++) { - CJS_GlobalData_Element* pTemp = m_arrayGlobalData.GetAt(i); - if (pTemp->data.sKey[0] == *propname && pTemp->data.sKey == propname) - return i; - } - return -1; -} - -CJS_GlobalData_Element* CJS_GlobalData::GetGlobalVariable( - const FX_CHAR* propname) { - ASSERT(propname); - - int nFind = FindGlobalVariable(propname); - return nFind >= 0 ? m_arrayGlobalData.GetAt(nFind) : nullptr; -} - -void CJS_GlobalData::SetGlobalVariableNumber(const FX_CHAR* propname, - double dData) { - ASSERT(propname); - CFX_ByteString sPropName = propname; - sPropName.TrimLeft(); - sPropName.TrimRight(); - if (sPropName.GetLength() == 0) - return; - - if (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName)) { - pData->data.nType = JS_GLOBALDATA_TYPE_NUMBER; - pData->data.dData = dData; - } else { - CJS_GlobalData_Element* pNewData = new CJS_GlobalData_Element; - pNewData->data.sKey = sPropName; - pNewData->data.nType = JS_GLOBALDATA_TYPE_NUMBER; - pNewData->data.dData = dData; - m_arrayGlobalData.Add(pNewData); - } -} - -void CJS_GlobalData::SetGlobalVariableBoolean(const FX_CHAR* propname, - bool bData) { - ASSERT(propname); - CFX_ByteString sPropName = propname; - - sPropName.TrimLeft(); - sPropName.TrimRight(); - - if (sPropName.GetLength() == 0) - return; - - if (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName)) { - pData->data.nType = JS_GLOBALDATA_TYPE_BOOLEAN; - pData->data.bData = bData; - } else { - CJS_GlobalData_Element* pNewData = new CJS_GlobalData_Element; - pNewData->data.sKey = sPropName; - pNewData->data.nType = JS_GLOBALDATA_TYPE_BOOLEAN; - pNewData->data.bData = bData; - - m_arrayGlobalData.Add(pNewData); - } -} - -void CJS_GlobalData::SetGlobalVariableString(const FX_CHAR* propname, - const CFX_ByteString& sData) { - ASSERT(propname); - CFX_ByteString sPropName = propname; - - sPropName.TrimLeft(); - sPropName.TrimRight(); - - if (sPropName.GetLength() == 0) - return; - - if (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName)) { - pData->data.nType = JS_GLOBALDATA_TYPE_STRING; - pData->data.sData = sData; - } else { - CJS_GlobalData_Element* pNewData = new CJS_GlobalData_Element; - pNewData->data.sKey = sPropName; - pNewData->data.nType = JS_GLOBALDATA_TYPE_STRING; - pNewData->data.sData = sData; - - m_arrayGlobalData.Add(pNewData); - } -} - -void CJS_GlobalData::SetGlobalVariableObject( - const FX_CHAR* propname, - const CJS_GlobalVariableArray& array) { - ASSERT(propname); - CFX_ByteString sPropName = propname; - - sPropName.TrimLeft(); - sPropName.TrimRight(); - - if (sPropName.GetLength() == 0) - return; - - if (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName)) { - pData->data.nType = JS_GLOBALDATA_TYPE_OBJECT; - pData->data.objData.Copy(array); - } else { - CJS_GlobalData_Element* pNewData = new CJS_GlobalData_Element; - pNewData->data.sKey = sPropName; - pNewData->data.nType = JS_GLOBALDATA_TYPE_OBJECT; - pNewData->data.objData.Copy(array); - - m_arrayGlobalData.Add(pNewData); - } -} - -void CJS_GlobalData::SetGlobalVariableNull(const FX_CHAR* propname) { - ASSERT(propname); - CFX_ByteString sPropName = propname; - - sPropName.TrimLeft(); - sPropName.TrimRight(); - - if (sPropName.GetLength() == 0) - return; - - if (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName)) { - pData->data.nType = JS_GLOBALDATA_TYPE_NULL; - } else { - CJS_GlobalData_Element* pNewData = new CJS_GlobalData_Element; - pNewData->data.sKey = sPropName; - pNewData->data.nType = JS_GLOBALDATA_TYPE_NULL; - - m_arrayGlobalData.Add(pNewData); - } -} - -FX_BOOL CJS_GlobalData::SetGlobalVariablePersistent(const FX_CHAR* propname, - FX_BOOL bPersistent) { - ASSERT(propname); - CFX_ByteString sPropName = propname; - - sPropName.TrimLeft(); - sPropName.TrimRight(); - - if (sPropName.GetLength() == 0) - return FALSE; - - if (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName)) { - pData->bPersistent = bPersistent; - return TRUE; - } - - return FALSE; -} - -FX_BOOL CJS_GlobalData::DeleteGlobalVariable(const FX_CHAR* propname) { - ASSERT(propname); - CFX_ByteString sPropName = propname; - - sPropName.TrimLeft(); - sPropName.TrimRight(); - - if (sPropName.GetLength() == 0) - return FALSE; - - int nFind = FindGlobalVariable(sPropName); - - if (nFind >= 0) { - delete m_arrayGlobalData.GetAt(nFind); - m_arrayGlobalData.RemoveAt(nFind); - return TRUE; - } - - return FALSE; -} - -int32_t CJS_GlobalData::GetSize() const { - return m_arrayGlobalData.GetSize(); -} - -CJS_GlobalData_Element* CJS_GlobalData::GetAt(int index) const { - return m_arrayGlobalData.GetAt(index); -} - -void CJS_GlobalData::LoadGlobalPersistentVariables() { - uint8_t* pBuffer = NULL; - int32_t nLength = 0; - - LoadFileBuffer(m_sFilePath.c_str(), pBuffer, nLength); - CRYPT_ArcFourCryptBlock(pBuffer, nLength, JS_RC4KEY, sizeof(JS_RC4KEY)); - - if (pBuffer) { - uint8_t* p = pBuffer; - FX_WORD wType = *((FX_WORD*)p); - p += sizeof(FX_WORD); - - // FX_WORD wTemp = (FX_WORD)(('X' << 8) | 'F'); - - if (wType == (FX_WORD)(('X' << 8) | 'F')) { - FX_WORD wVersion = *((FX_WORD*)p); - p += sizeof(FX_WORD); - - ASSERT(wVersion <= 2); - - FX_DWORD dwCount = *((FX_DWORD*)p); - p += sizeof(FX_DWORD); - - FX_DWORD dwSize = *((FX_DWORD*)p); - p += sizeof(FX_DWORD); - - if (dwSize == nLength - sizeof(FX_WORD) * 2 - sizeof(FX_DWORD) * 2) { - for (int32_t i = 0, sz = dwCount; i < sz; i++) { - if (p > pBuffer + nLength) - break; - - FX_DWORD dwNameLen = *((FX_DWORD*)p); - p += sizeof(FX_DWORD); - - if (p + dwNameLen > pBuffer + nLength) - break; - - CFX_ByteString sEntry = CFX_ByteString(p, dwNameLen); - p += sizeof(char) * dwNameLen; - - FX_WORD wDataType = *((FX_WORD*)p); - p += sizeof(FX_WORD); - - switch (wDataType) { - case JS_GLOBALDATA_TYPE_NUMBER: { - double dData = 0; - switch (wVersion) { - case 1: { - FX_DWORD dwData = *((FX_DWORD*)p); - p += sizeof(FX_DWORD); - dData = dwData; - } break; - case 2: { - dData = *((double*)p); - p += sizeof(double); - } break; - } - SetGlobalVariableNumber(sEntry, dData); - SetGlobalVariablePersistent(sEntry, TRUE); - } break; - case JS_GLOBALDATA_TYPE_BOOLEAN: { - FX_WORD wData = *((FX_WORD*)p); - p += sizeof(FX_WORD); - SetGlobalVariableBoolean(sEntry, (bool)(wData == 1)); - SetGlobalVariablePersistent(sEntry, TRUE); - } break; - case JS_GLOBALDATA_TYPE_STRING: { - FX_DWORD dwLength = *((FX_DWORD*)p); - p += sizeof(FX_DWORD); - - if (p + dwLength > pBuffer + nLength) - break; - - SetGlobalVariableString(sEntry, CFX_ByteString(p, dwLength)); - SetGlobalVariablePersistent(sEntry, TRUE); - p += sizeof(char) * dwLength; - } break; - case JS_GLOBALDATA_TYPE_NULL: { - SetGlobalVariableNull(sEntry); - SetGlobalVariablePersistent(sEntry, TRUE); - } - } - } - } - } - FX_Free(pBuffer); - } -} - -void CJS_GlobalData::SaveGlobalPersisitentVariables() { - FX_DWORD nCount = 0; - CFX_BinaryBuf sData; - - for (int i = 0, sz = m_arrayGlobalData.GetSize(); i < sz; i++) { - CJS_GlobalData_Element* pElement = m_arrayGlobalData.GetAt(i); - if (pElement->bPersistent) { - CFX_BinaryBuf sElement; - MakeByteString(pElement->data.sKey, &pElement->data, sElement); - - if (sData.GetSize() + sElement.GetSize() > JS_MAXGLOBALDATA) - break; - - sData.AppendBlock(sElement.GetBuffer(), sElement.GetSize()); - nCount++; - } - } - - CFX_BinaryBuf sFile; - - FX_WORD wType = (FX_WORD)(('X' << 8) | 'F'); - sFile.AppendBlock(&wType, sizeof(FX_WORD)); - FX_WORD wVersion = 2; - sFile.AppendBlock(&wVersion, sizeof(FX_WORD)); - sFile.AppendBlock(&nCount, sizeof(FX_DWORD)); - FX_DWORD dwSize = sData.GetSize(); - sFile.AppendBlock(&dwSize, sizeof(FX_DWORD)); - - sFile.AppendBlock(sData.GetBuffer(), sData.GetSize()); - - CRYPT_ArcFourCryptBlock(sFile.GetBuffer(), sFile.GetSize(), JS_RC4KEY, - sizeof(JS_RC4KEY)); - WriteFileBuffer(m_sFilePath.c_str(), (const FX_CHAR*)sFile.GetBuffer(), - sFile.GetSize()); -} - -void CJS_GlobalData::LoadFileBuffer(const FX_WCHAR* sFilePath, - uint8_t*& pBuffer, - int32_t& nLength) { - // UnSupport. -} - -void CJS_GlobalData::WriteFileBuffer(const FX_WCHAR* sFilePath, - const FX_CHAR* pBuffer, - int32_t nLength) { - // UnSupport. -} - -void CJS_GlobalData::MakeByteString(const CFX_ByteString& name, - CJS_KeyValue* pData, - CFX_BinaryBuf& sData) { - FX_WORD wType = (FX_WORD)pData->nType; - switch (wType) { - case JS_GLOBALDATA_TYPE_NUMBER: { - FX_DWORD dwNameLen = (FX_DWORD)name.GetLength(); - sData.AppendBlock(&dwNameLen, sizeof(FX_DWORD)); - sData.AppendString(name); - sData.AppendBlock(&wType, sizeof(FX_WORD)); - - double dData = pData->dData; - sData.AppendBlock(&dData, sizeof(double)); - } break; - case JS_GLOBALDATA_TYPE_BOOLEAN: { - FX_DWORD dwNameLen = (FX_DWORD)name.GetLength(); - sData.AppendBlock(&dwNameLen, sizeof(FX_DWORD)); - sData.AppendString(name); - sData.AppendBlock(&wType, sizeof(FX_WORD)); - - FX_WORD wData = (FX_WORD)pData->bData; - sData.AppendBlock(&wData, sizeof(FX_WORD)); - } break; - case JS_GLOBALDATA_TYPE_STRING: { - FX_DWORD dwNameLen = (FX_DWORD)name.GetLength(); - sData.AppendBlock(&dwNameLen, sizeof(FX_DWORD)); - sData.AppendString(name); - sData.AppendBlock(&wType, sizeof(FX_WORD)); - - FX_DWORD dwDataLen = (FX_DWORD)pData->sData.GetLength(); - sData.AppendBlock(&dwDataLen, sizeof(FX_DWORD)); - sData.AppendString(pData->sData); - } break; - case JS_GLOBALDATA_TYPE_NULL: { - FX_DWORD dwNameLen = (FX_DWORD)name.GetLength(); - sData.AppendBlock(&dwNameLen, sizeof(FX_DWORD)); - sData.AppendString(name); - sData.AppendBlock(&wType, sizeof(FX_DWORD)); - } break; - default: - break; - } -} diff --git a/fpdfsdk/src/javascript/JS_GlobalData.h b/fpdfsdk/src/javascript/JS_GlobalData.h deleted file mode 100644 index 6a07fa84e4..0000000000 --- a/fpdfsdk/src/javascript/JS_GlobalData.h +++ /dev/null @@ -1,106 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef FPDFSDK_SRC_JAVASCRIPT_JS_GLOBALDATA_H_ -#define FPDFSDK_SRC_JAVASCRIPT_JS_GLOBALDATA_H_ - -#include "core/include/fxcrt/fx_basic.h" - -#define JS_GLOBALDATA_TYPE_NUMBER 0 -#define JS_GLOBALDATA_TYPE_BOOLEAN 1 -#define JS_GLOBALDATA_TYPE_STRING 2 -#define JS_GLOBALDATA_TYPE_OBJECT 3 -#define JS_GLOBALDATA_TYPE_NULL 4 - -class CJS_KeyValue; -class CPDFDoc_Environment; - -class CJS_GlobalVariableArray { - public: - CJS_GlobalVariableArray(); - virtual ~CJS_GlobalVariableArray(); - - void Add(CJS_KeyValue* p); - int Count() const; - CJS_KeyValue* GetAt(int index) const; - void Copy(const CJS_GlobalVariableArray& array); - - void Empty(); - - private: - CFX_ArrayTemplate<CJS_KeyValue*> array; -}; - -class CJS_KeyValue { - public: - CJS_KeyValue() {} - virtual ~CJS_KeyValue() {} - - CFX_ByteString sKey; - int nType; // 0:int 1:bool 2:string 3:obj - double dData; - bool bData; - CFX_ByteString sData; - CJS_GlobalVariableArray objData; -}; - -class CJS_GlobalData_Element { - public: - CJS_GlobalData_Element() {} - virtual ~CJS_GlobalData_Element() {} - - CJS_KeyValue data; - FX_BOOL bPersistent; -}; - -class CJS_GlobalData { - public: - static CJS_GlobalData* GetRetainedInstance(CPDFDoc_Environment* pApp); - void Release(); - - void SetGlobalVariableNumber(const FX_CHAR* propname, double dData); - void SetGlobalVariableBoolean(const FX_CHAR* propname, bool bData); - void SetGlobalVariableString(const FX_CHAR* propname, - const CFX_ByteString& sData); - void SetGlobalVariableObject(const FX_CHAR* propname, - const CJS_GlobalVariableArray& array); - void SetGlobalVariableNull(const FX_CHAR* propname); - - FX_BOOL SetGlobalVariablePersistent(const FX_CHAR* propname, - FX_BOOL bPersistent); - FX_BOOL DeleteGlobalVariable(const FX_CHAR* propname); - - int32_t GetSize() const; - CJS_GlobalData_Element* GetAt(int index) const; - - private: - static CJS_GlobalData* g_Instance; - - CJS_GlobalData(); - ~CJS_GlobalData(); - - void LoadGlobalPersistentVariables(); - void SaveGlobalPersisitentVariables(); - - CJS_GlobalData_Element* GetGlobalVariable(const FX_CHAR* propname); - int FindGlobalVariable(const FX_CHAR* propname); - - void LoadFileBuffer(const FX_WCHAR* sFilePath, - uint8_t*& pBuffer, - int32_t& nLength); - void WriteFileBuffer(const FX_WCHAR* sFilePath, - const FX_CHAR* pBuffer, - int32_t nLength); - void MakeByteString(const CFX_ByteString& name, - CJS_KeyValue* pData, - CFX_BinaryBuf& sData); - - size_t m_RefCount; - CFX_ArrayTemplate<CJS_GlobalData_Element*> m_arrayGlobalData; - CFX_WideString m_sFilePath; -}; - -#endif // FPDFSDK_SRC_JAVASCRIPT_JS_GLOBALDATA_H_ diff --git a/fpdfsdk/src/javascript/JS_Object.cpp b/fpdfsdk/src/javascript/JS_Object.cpp deleted file mode 100644 index 3f0fe8cb48..0000000000 --- a/fpdfsdk/src/javascript/JS_Object.cpp +++ /dev/null @@ -1,159 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "fpdfsdk/src/javascript/JS_Object.h" - -#include "fpdfsdk/include/fsdk_mgr.h" // For CPDFDoc_Environment. -#include "fpdfsdk/include/javascript/IJavaScript.h" -#include "fpdfsdk/src/javascript/JS_Context.h" -#include "fpdfsdk/src/javascript/JS_Define.h" - -namespace { - -int FXJS_MsgBox(CPDFDoc_Environment* pApp, - const FX_WCHAR* swMsg, - const FX_WCHAR* swTitle, - FX_UINT nType, - FX_UINT nIcon) { - if (!pApp) - return 0; - - if (CPDFSDK_Document* pDoc = pApp->GetSDKDocument()) - pDoc->KillFocusAnnot(); - - return pApp->JS_appAlert(swMsg, swTitle, nType, nIcon); -} - -} // namespace - -CJS_EmbedObj::CJS_EmbedObj(CJS_Object* pJSObject) : m_pJSObject(pJSObject) {} - -CJS_EmbedObj::~CJS_EmbedObj() { - m_pJSObject = NULL; -} - -int CJS_EmbedObj::MsgBox(CPDFDoc_Environment* pApp, - const FX_WCHAR* swMsg, - const FX_WCHAR* swTitle, - FX_UINT nType, - FX_UINT nIcon) { - return FXJS_MsgBox(pApp, swMsg, swTitle, nType, nIcon); -} - -void CJS_EmbedObj::Alert(CJS_Context* pContext, const FX_WCHAR* swMsg) { - CJS_Object::Alert(pContext, swMsg); -} - -void FreeObject(const v8::WeakCallbackInfo<CJS_Object>& data) { - CJS_Object* pJSObj = data.GetParameter(); - pJSObj->ExitInstance(); - delete pJSObj; - FXJS_FreePrivate(data.GetInternalField(0)); -} - -void DisposeObject(const v8::WeakCallbackInfo<CJS_Object>& data) { - CJS_Object* pJSObj = data.GetParameter(); - pJSObj->Dispose(); - data.SetSecondPassCallback(FreeObject); -} - -CJS_Object::CJS_Object(v8::Local<v8::Object> pObject) { - m_pIsolate = pObject->GetIsolate(); - m_pV8Object.Reset(m_pIsolate, pObject); -} - -CJS_Object::~CJS_Object() { -} - -void CJS_Object::MakeWeak() { - m_pV8Object.SetWeak(this, DisposeObject, - v8::WeakCallbackType::kInternalFields); -} - -void CJS_Object::Dispose() { - m_pV8Object.Reset(); -} - -int CJS_Object::MsgBox(CPDFDoc_Environment* pApp, - const FX_WCHAR* swMsg, - const FX_WCHAR* swTitle, - FX_UINT nType, - FX_UINT nIcon) { - return FXJS_MsgBox(pApp, swMsg, swTitle, nType, nIcon); -} - -void CJS_Object::Alert(CJS_Context* pContext, const FX_WCHAR* swMsg) { - if (pContext->IsMsgBoxEnabled()) { - CPDFDoc_Environment* pApp = pContext->GetReaderApp(); - if (pApp) - pApp->JS_appAlert(swMsg, NULL, 0, 3); - } -} - -CJS_Timer::CJS_Timer(CJS_EmbedObj* pObj, - CPDFDoc_Environment* pApp, - CJS_Runtime* pRuntime, - int nType, - const CFX_WideString& script, - FX_DWORD dwElapse, - FX_DWORD dwTimeOut) - : m_nTimerID(0), - m_pEmbedObj(pObj), - m_bProcessing(false), - m_bValid(true), - m_nType(nType), - m_dwTimeOut(dwTimeOut), - m_swJScript(script), - m_pRuntime(pRuntime), - m_pApp(pApp) { - IFX_SystemHandler* pHandler = m_pApp->GetSysHandler(); - m_nTimerID = pHandler->SetTimer(dwElapse, TimerProc); - (*GetGlobalTimerMap())[m_nTimerID] = this; - m_pRuntime->AddObserver(this); -} - -CJS_Timer::~CJS_Timer() { - CJS_Runtime* pRuntime = GetRuntime(); - if (pRuntime) - pRuntime->RemoveObserver(this); - KillJSTimer(); -} - -void CJS_Timer::KillJSTimer() { - if (m_nTimerID) { - if (m_bValid) { - IFX_SystemHandler* pHandler = m_pApp->GetSysHandler(); - pHandler->KillTimer(m_nTimerID); - } - GetGlobalTimerMap()->erase(m_nTimerID); - m_nTimerID = 0; - } -} - -// static -void CJS_Timer::TimerProc(int idEvent) { - const auto it = GetGlobalTimerMap()->find(idEvent); - if (it != GetGlobalTimerMap()->end()) { - CJS_Timer* pTimer = it->second; - if (!pTimer->m_bProcessing) { - CFX_AutoRestorer<bool> scoped_processing(&pTimer->m_bProcessing); - pTimer->m_bProcessing = true; - if (pTimer->m_pEmbedObj) - pTimer->m_pEmbedObj->TimerProc(pTimer); - } - } -} - -// static -CJS_Timer::TimerMap* CJS_Timer::GetGlobalTimerMap() { - // Leak the timer array at shutdown. - static auto* s_TimerMap = new TimerMap; - return s_TimerMap; -} - -void CJS_Timer::OnDestroyed() { - m_bValid = false; -} diff --git a/fpdfsdk/src/javascript/JS_Object.h b/fpdfsdk/src/javascript/JS_Object.h deleted file mode 100644 index deae2d2a8f..0000000000 --- a/fpdfsdk/src/javascript/JS_Object.h +++ /dev/null @@ -1,116 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef FPDFSDK_SRC_JAVASCRIPT_JS_OBJECT_H_ -#define FPDFSDK_SRC_JAVASCRIPT_JS_OBJECT_H_ - -#include <map> -#include <memory> - -#include "fpdfsdk/include/fsdk_define.h" // For FX_UINT -#include "fpdfsdk/include/jsapi/fxjs_v8.h" -#include "fpdfsdk/src/javascript/JS_Runtime.h" - -class CJS_Context; -class CJS_Object; -class CJS_Timer; -class CPDFDoc_Environment; -class CJS_EmbedObj { - public: - explicit CJS_EmbedObj(CJS_Object* pJSObject); - virtual ~CJS_EmbedObj(); - - virtual void TimerProc(CJS_Timer* pTimer) {} - - CJS_Object* GetJSObject() const { return m_pJSObject; } - - int MsgBox(CPDFDoc_Environment* pApp, - const FX_WCHAR* swMsg, - const FX_WCHAR* swTitle, - FX_UINT nType, - FX_UINT nIcon); - void Alert(CJS_Context* pContext, const FX_WCHAR* swMsg); - - protected: - CJS_Object* m_pJSObject; -}; - -class CJS_Object { - public: - explicit CJS_Object(v8::Local<v8::Object> pObject); - virtual ~CJS_Object(); - - void MakeWeak(); - void Dispose(); - - virtual FX_BOOL IsType(const FX_CHAR* sClassName) { return TRUE; } - virtual CFX_ByteString GetClassName() { return ""; } - - virtual void InitInstance(IJS_Runtime* pIRuntime) {} - virtual void ExitInstance() {} - - v8::Local<v8::Object> ToV8Object() { return m_pV8Object.Get(m_pIsolate); } - - // Takes ownership of |pObj|. - void SetEmbedObject(CJS_EmbedObj* pObj) { m_pEmbedObj.reset(pObj); } - CJS_EmbedObj* GetEmbedObject() const { return m_pEmbedObj.get(); } - - static int MsgBox(CPDFDoc_Environment* pApp, - const FX_WCHAR* swMsg, - const FX_WCHAR* swTitle, - FX_UINT nType, - FX_UINT nIcon); - static void Alert(CJS_Context* pContext, const FX_WCHAR* swMsg); - - v8::Isolate* GetIsolate() { return m_pIsolate; } - - protected: - std::unique_ptr<CJS_EmbedObj> m_pEmbedObj; - v8::Global<v8::Object> m_pV8Object; - v8::Isolate* m_pIsolate; -}; - -class CJS_Timer : public CJS_Runtime::Observer { - public: - CJS_Timer(CJS_EmbedObj* pObj, - CPDFDoc_Environment* pApp, - CJS_Runtime* pRuntime, - int nType, - const CFX_WideString& script, - FX_DWORD dwElapse, - FX_DWORD dwTimeOut); - ~CJS_Timer() override; - - void KillJSTimer(); - - int GetType() const { return m_nType; } - FX_DWORD GetTimeOut() const { return m_dwTimeOut; } - CJS_Runtime* GetRuntime() const { return m_bValid ? m_pRuntime : nullptr; } - CFX_WideString GetJScript() const { return m_swJScript; } - - static void TimerProc(int idEvent); - - private: - using TimerMap = std::map<FX_UINT, CJS_Timer*>; - static TimerMap* GetGlobalTimerMap(); - - // CJS_Runtime::Observer - void OnDestroyed() override; - - FX_DWORD m_nTimerID; - CJS_EmbedObj* const m_pEmbedObj; - bool m_bProcessing; - bool m_bValid; - - // data - const int m_nType; // 0:Interval; 1:TimeOut - const FX_DWORD m_dwTimeOut; - const CFX_WideString m_swJScript; - CJS_Runtime* const m_pRuntime; - CPDFDoc_Environment* const m_pApp; -}; - -#endif // FPDFSDK_SRC_JAVASCRIPT_JS_OBJECT_H_ diff --git a/fpdfsdk/src/javascript/JS_Runtime.cpp b/fpdfsdk/src/javascript/JS_Runtime.cpp deleted file mode 100644 index dd7ef0f09d..0000000000 --- a/fpdfsdk/src/javascript/JS_Runtime.cpp +++ /dev/null @@ -1,345 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "fpdfsdk/src/javascript/JS_Runtime.h" - -#include "fpdfsdk/include/fsdk_mgr.h" // For CPDFDoc_Environment. -#include "fpdfsdk/include/javascript/IJavaScript.h" -#include "fpdfsdk/src/javascript/Consts.h" -#include "fpdfsdk/src/javascript/Document.h" -#include "fpdfsdk/src/javascript/Field.h" -#include "fpdfsdk/src/javascript/Icon.h" -#include "fpdfsdk/src/javascript/JS_Context.h" -#include "fpdfsdk/src/javascript/JS_Define.h" -#include "fpdfsdk/src/javascript/JS_EventHandler.h" -#include "fpdfsdk/src/javascript/JS_GlobalData.h" -#include "fpdfsdk/src/javascript/JS_Object.h" -#include "fpdfsdk/src/javascript/JS_Value.h" -#include "fpdfsdk/src/javascript/PublicMethods.h" -#include "fpdfsdk/src/javascript/app.h" -#include "fpdfsdk/src/javascript/color.h" -#include "fpdfsdk/src/javascript/console.h" -#include "fpdfsdk/src/javascript/event.h" -#include "fpdfsdk/src/javascript/global.h" -#include "fpdfsdk/src/javascript/report.h" -#include "fpdfsdk/src/javascript/util.h" -#include "third_party/base/stl_util.h" - -#ifdef PDF_ENABLE_XFA -#include "fpdfsdk/include/fpdfxfa/fpdfxfa_app.h" -#include "xfa/src/fxjse/value.h" -#endif // PDF_ENABLE_XFA - -// static -void IJS_Runtime::Initialize(unsigned int slot, void* isolate) { - FXJS_Initialize(slot, reinterpret_cast<v8::Isolate*>(isolate)); -} - -// static -IJS_Runtime* IJS_Runtime::Create(CPDFDoc_Environment* pEnv) { - return new CJS_Runtime(pEnv); -} - -// static -CJS_Runtime* CJS_Runtime::FromContext(const IJS_Context* cc) { - const CJS_Context* pContext = static_cast<const CJS_Context*>(cc); - return pContext->GetJSRuntime(); -} - -CJS_Runtime::CJS_Runtime(CPDFDoc_Environment* pApp) - : m_pApp(pApp), - m_pDocument(NULL), - m_bBlocking(FALSE), - m_isolate(NULL), - m_isolateManaged(false) { -#ifndef PDF_ENABLE_XFA - IPDF_JSPLATFORM* pPlatform = m_pApp->GetFormFillInfo()->m_pJsPlatform; - if (pPlatform->version <= 2) { - unsigned int embedderDataSlot = 0; - v8::Isolate* pExternalIsolate = nullptr; - if (pPlatform->version == 2) { - pExternalIsolate = reinterpret_cast<v8::Isolate*>(pPlatform->m_isolate); - embedderDataSlot = pPlatform->m_v8EmbedderSlot; -#else - if (CPDFXFA_App::GetInstance()->GetJSERuntime()) { - // TODO(tsepez): CPDFXFA_App should also use the embedder provided isolate. - m_isolate = (v8::Isolate*)CPDFXFA_App::GetInstance()->GetJSERuntime(); - } else { - IPDF_JSPLATFORM* pPlatform = m_pApp->GetFormFillInfo()->m_pJsPlatform; - if (pPlatform->version <= 2) { - unsigned int embedderDataSlot = 0; - v8::Isolate* pExternalIsolate = nullptr; - if (pPlatform->version == 2) { - pExternalIsolate = reinterpret_cast<v8::Isolate*>(pPlatform->m_isolate); - embedderDataSlot = pPlatform->m_v8EmbedderSlot; - } - FXJS_Initialize(embedderDataSlot, pExternalIsolate); -#endif - } -#ifndef PDF_ENABLE_XFA - FXJS_Initialize(embedderDataSlot, pExternalIsolate); -#else - m_isolateManaged = FXJS_GetIsolate(&m_isolate); - } - - v8::Isolate* isolate = m_isolate; - v8::Isolate::Scope isolate_scope(isolate); - v8::Locker locker(isolate); - v8::HandleScope handle_scope(isolate); - if (CPDFXFA_App::GetInstance()->IsJavaScriptInitialized()) { - CJS_Context* pContext = (CJS_Context*)NewContext(); - FXJS_InitializeRuntime(GetIsolate(), this, &m_context, &m_StaticObjects); - ReleaseContext(pContext); - return; -#endif - } -#ifndef PDF_ENABLE_XFA - m_isolateManaged = FXJS_GetIsolate(&m_isolate); -#else - -#endif - if (m_isolateManaged || FXJS_GlobalIsolateRefCount() == 0) - DefineJSObjects(); - -#ifdef PDF_ENABLE_XFA - CPDFXFA_App::GetInstance()->SetJavaScriptInitialized(TRUE); - -#endif - CJS_Context* pContext = (CJS_Context*)NewContext(); - FXJS_InitializeRuntime(GetIsolate(), this, &m_context, &m_StaticObjects); - ReleaseContext(pContext); -} - -CJS_Runtime::~CJS_Runtime() { - for (auto* obs : m_observers) - obs->OnDestroyed(); - - for (int i = 0, sz = m_ContextArray.GetSize(); i < sz; i++) - delete m_ContextArray.GetAt(i); - - m_ContextArray.RemoveAll(); - m_ConstArrays.clear(); - FXJS_ReleaseRuntime(GetIsolate(), &m_context, &m_StaticObjects); - - m_pApp = NULL; - m_pDocument = NULL; - m_context.Reset(); - - if (m_isolateManaged) - m_isolate->Dispose(); -} - -void CJS_Runtime::DefineJSObjects() { - v8::Isolate::Scope isolate_scope(GetIsolate()); -#ifdef PDF_ENABLE_XFA - v8::Locker locker(GetIsolate()); -#endif - v8::HandleScope handle_scope(GetIsolate()); - v8::Local<v8::Context> context = v8::Context::New(GetIsolate()); - v8::Context::Scope context_scope(context); - - // The call order determines the "ObjDefID" assigned to each class. - // ObjDefIDs 0 - 2 - CJS_Border::DefineJSObjects(GetIsolate(), FXJSOBJTYPE_STATIC); - CJS_Display::DefineJSObjects(GetIsolate(), FXJSOBJTYPE_STATIC); - CJS_Font::DefineJSObjects(GetIsolate(), FXJSOBJTYPE_STATIC); - - // ObjDefIDs 3 - 5 - CJS_Highlight::DefineJSObjects(GetIsolate(), FXJSOBJTYPE_STATIC); - CJS_Position::DefineJSObjects(GetIsolate(), FXJSOBJTYPE_STATIC); - CJS_ScaleHow::DefineJSObjects(GetIsolate(), FXJSOBJTYPE_STATIC); - - // ObjDefIDs 6 - 8 - CJS_ScaleWhen::DefineJSObjects(GetIsolate(), FXJSOBJTYPE_STATIC); - CJS_Style::DefineJSObjects(GetIsolate(), FXJSOBJTYPE_STATIC); - CJS_Zoomtype::DefineJSObjects(GetIsolate(), FXJSOBJTYPE_STATIC); - - // ObjDefIDs 9 - 11 - CJS_App::DefineJSObjects(GetIsolate(), FXJSOBJTYPE_STATIC); - CJS_Color::DefineJSObjects(GetIsolate(), FXJSOBJTYPE_STATIC); - CJS_Console::DefineJSObjects(GetIsolate(), FXJSOBJTYPE_STATIC); - - // ObjDefIDs 12 - 14 - CJS_Document::DefineJSObjects(GetIsolate(), FXJSOBJTYPE_GLOBAL); - CJS_Event::DefineJSObjects(GetIsolate(), FXJSOBJTYPE_STATIC); - CJS_Field::DefineJSObjects(GetIsolate(), FXJSOBJTYPE_DYNAMIC); - - // ObjDefIDs 15 - 17 - CJS_Global::DefineJSObjects(GetIsolate(), FXJSOBJTYPE_STATIC); - CJS_Icon::DefineJSObjects(GetIsolate(), FXJSOBJTYPE_DYNAMIC); - CJS_Util::DefineJSObjects(GetIsolate(), FXJSOBJTYPE_STATIC); - - // ObjDefIDs 18 - 20 (these can't fail, return void). - CJS_PublicMethods::DefineJSObjects(GetIsolate()); - CJS_GlobalConsts::DefineJSObjects(this); - CJS_GlobalArrays::DefineJSObjects(this); - - // ObjDefIDs 21 - 22. - CJS_TimerObj::DefineJSObjects(GetIsolate(), FXJSOBJTYPE_DYNAMIC); - CJS_PrintParamsObj::DefineJSObjects(GetIsolate(), FXJSOBJTYPE_DYNAMIC); -} - -IJS_Context* CJS_Runtime::NewContext() { - CJS_Context* p = new CJS_Context(this); - m_ContextArray.Add(p); - return p; -} - -void CJS_Runtime::ReleaseContext(IJS_Context* pContext) { - CJS_Context* pJSContext = (CJS_Context*)pContext; - - for (int i = 0, sz = m_ContextArray.GetSize(); i < sz; i++) { - if (pJSContext == m_ContextArray.GetAt(i)) { - delete pJSContext; - m_ContextArray.RemoveAt(i); - break; - } - } -} - -IJS_Context* CJS_Runtime::GetCurrentContext() { - if (!m_ContextArray.GetSize()) - return NULL; - return m_ContextArray.GetAt(m_ContextArray.GetSize() - 1); -} - -void CJS_Runtime::SetReaderDocument(CPDFSDK_Document* pReaderDoc) { - if (m_pDocument != pReaderDoc) { - v8::Isolate::Scope isolate_scope(m_isolate); -#ifdef PDF_ENABLE_XFA - v8::Locker locker(m_isolate); -#endif - v8::HandleScope handle_scope(m_isolate); - v8::Local<v8::Context> context = - v8::Local<v8::Context>::New(m_isolate, m_context); - v8::Context::Scope context_scope(context); - - m_pDocument = pReaderDoc; - if (pReaderDoc) { - v8::Local<v8::Object> pThis = FXJS_GetThisObj(GetIsolate()); - if (!pThis.IsEmpty()) { - if (FXJS_GetObjDefnID(pThis) == CJS_Document::g_nObjDefnID) { - if (CJS_Document* pJSDocument = - (CJS_Document*)FXJS_GetPrivate(GetIsolate(), pThis)) { - if (Document* pDocument = (Document*)pJSDocument->GetEmbedObject()) - pDocument->AttachDoc(pReaderDoc); - } - } - } - } - } -} - -int CJS_Runtime::Execute(IJS_Context* cc, - const wchar_t* script, - CFX_WideString* info) { - FXJSErr error = {}; - int nRet = FXJS_Execute(m_isolate, cc, script, &error); - if (nRet < 0) { - info->Format(L"[ Line: %05d { %s } ] : %s", error.linnum - 1, error.srcline, - error.message); - } - return nRet; -} - -bool CJS_Runtime::AddEventToSet(const FieldEvent& event) { - return m_FieldEventSet.insert(event).second; -} - -void CJS_Runtime::RemoveEventFromSet(const FieldEvent& event) { - m_FieldEventSet.erase(event); -} - -v8::Local<v8::Context> CJS_Runtime::NewJSContext() { - return v8::Local<v8::Context>::New(m_isolate, m_context); -} - -void CJS_Runtime::SetConstArray(const CFX_WideString& name, - v8::Local<v8::Array> array) { - m_ConstArrays[name] = v8::Global<v8::Array>(m_isolate, array); -} - -v8::Local<v8::Array> CJS_Runtime::GetConstArray(const CFX_WideString& name) { - return v8::Local<v8::Array>::New(m_isolate, m_ConstArrays[name]); -} - -#ifdef PDF_ENABLE_XFA -CFX_WideString ChangeObjName(const CFX_WideString& str) { - CFX_WideString sRet = str; - sRet.Replace(L"_", L"."); - return sRet; -} -FX_BOOL CJS_Runtime::GetHValueByName(const CFX_ByteStringC& utf8Name, - FXJSE_HVALUE hValue) { -#ifdef PDF_ENABLE_XFA - const FX_CHAR* name = utf8Name.GetCStr(); - - v8::Locker lock(GetIsolate()); - v8::Isolate::Scope isolate_scope(GetIsolate()); - v8::HandleScope handle_scope(GetIsolate()); - v8::Local<v8::Context> old_context = GetIsolate()->GetCurrentContext(); - v8::Local<v8::Context> context = - v8::Local<v8::Context>::New(GetIsolate(), m_context); - v8::Context::Scope context_scope(context); - - // Caution: We're about to hand to XFA an object that in order to invoke - // methods will require that the current v8::Context always has a pointer - // to a CJS_Runtime in its embedder data slot. Unfortunately, XFA creates - // its own v8::Context which has not initialized the embedder data slot. - // Do so now. - // TODO(tsepez): redesign PDF-side objects to not rely on v8::Context's - // embedder data slots, and/or to always use the right context. - FXJS_SetRuntimeForV8Context(old_context, this); - - v8::Local<v8::Value> propvalue = - context->Global()->Get(v8::String::NewFromUtf8( - GetIsolate(), name, v8::String::kNormalString, utf8Name.GetLength())); - - if (propvalue.IsEmpty()) { - FXJSE_Value_SetUndefined(hValue); - return FALSE; - } - ((CFXJSE_Value*)hValue)->ForceSetValue(propvalue); -#endif - - return TRUE; -} -FX_BOOL CJS_Runtime::SetHValueByName(const CFX_ByteStringC& utf8Name, - FXJSE_HVALUE hValue) { -#ifdef PDF_ENABLE_XFA - if (utf8Name.IsEmpty() || hValue == NULL) - return FALSE; - const FX_CHAR* name = utf8Name.GetCStr(); - v8::Isolate* pIsolate = GetIsolate(); - v8::Locker lock(pIsolate); - v8::Isolate::Scope isolate_scope(pIsolate); - v8::HandleScope handle_scope(pIsolate); - v8::Local<v8::Context> context = - v8::Local<v8::Context>::New(pIsolate, m_context); - v8::Context::Scope context_scope(context); - - // v8::Local<v8::Context> tmpCotext = - // v8::Local<v8::Context>::New(GetIsolate(), m_context); - v8::Local<v8::Value> propvalue = v8::Local<v8::Value>::New( - GetIsolate(), ((CFXJSE_Value*)hValue)->DirectGetValue()); - context->Global()->Set( - v8::String::NewFromUtf8(pIsolate, name, v8::String::kNormalString, - utf8Name.GetLength()), - propvalue); -#endif - return TRUE; -} - -#endif -void CJS_Runtime::AddObserver(Observer* observer) { - ASSERT(!pdfium::ContainsKey(m_observers, observer)); - m_observers.insert(observer); -} - -void CJS_Runtime::RemoveObserver(Observer* observer) { - ASSERT(pdfium::ContainsKey(m_observers, observer)); - m_observers.erase(observer); -} diff --git a/fpdfsdk/src/javascript/JS_Runtime.h b/fpdfsdk/src/javascript/JS_Runtime.h deleted file mode 100644 index c7b0009ccb..0000000000 --- a/fpdfsdk/src/javascript/JS_Runtime.h +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef FPDFSDK_SRC_JAVASCRIPT_JS_RUNTIME_H_ -#define FPDFSDK_SRC_JAVASCRIPT_JS_RUNTIME_H_ - -#include <set> -#include <map> -#include <utility> -#include <vector> - -#include "core/include/fxcrt/fx_basic.h" -#include "fpdfsdk/include/javascript/IJavaScript.h" -#include "fpdfsdk/include/jsapi/fxjs_v8.h" -#include "fpdfsdk/src/javascript/JS_EventHandler.h" - -class CJS_Context; - -class CJS_Runtime : public IJS_Runtime { - public: - class Observer { - public: - virtual void OnDestroyed() = 0; - - protected: - virtual ~Observer() {} - }; - - using FieldEvent = std::pair<CFX_WideString, JS_EVENT_T>; - - static CJS_Runtime* FromContext(const IJS_Context* cc); - - explicit CJS_Runtime(CPDFDoc_Environment* pApp); - ~CJS_Runtime() override; - - // IJS_Runtime - IJS_Context* NewContext() override; - void ReleaseContext(IJS_Context* pContext) override; - IJS_Context* GetCurrentContext() override; - void SetReaderDocument(CPDFSDK_Document* pReaderDoc) override; - CPDFSDK_Document* GetReaderDocument() override { return m_pDocument; } - int Execute(IJS_Context* cc, - const wchar_t* script, - CFX_WideString* info) override; - - CPDFDoc_Environment* GetReaderApp() const { return m_pApp; } - - // Returns true if the event isn't already found in the set. - bool AddEventToSet(const FieldEvent& event); - void RemoveEventFromSet(const FieldEvent& event); - - void BeginBlock() { m_bBlocking = TRUE; } - void EndBlock() { m_bBlocking = FALSE; } - FX_BOOL IsBlocking() const { return m_bBlocking; } - - v8::Isolate* GetIsolate() const { return m_isolate; } - v8::Local<v8::Context> NewJSContext(); - - void SetConstArray(const CFX_WideString& name, v8::Local<v8::Array> array); - v8::Local<v8::Array> GetConstArray(const CFX_WideString& name); - -#ifdef PDF_ENABLE_XFA - FX_BOOL GetHValueByName(const CFX_ByteStringC& utf8Name, - FXJSE_HVALUE hValue) override; - FX_BOOL SetHValueByName(const CFX_ByteStringC& utf8Name, - FXJSE_HVALUE hValue) override; -#endif // PDF_ENABLE_XFA - - void AddObserver(Observer* observer); - void RemoveObserver(Observer* observer); - - private: - void DefineJSObjects(); - - CFX_ArrayTemplate<CJS_Context*> m_ContextArray; - CPDFDoc_Environment* m_pApp; - CPDFSDK_Document* m_pDocument; - FX_BOOL m_bBlocking; - std::set<FieldEvent> m_FieldEventSet; - v8::Isolate* m_isolate; - bool m_isolateManaged; - v8::Global<v8::Context> m_context; - std::vector<v8::Global<v8::Object>*> m_StaticObjects; - std::map<CFX_WideString, v8::Global<v8::Array>> m_ConstArrays; - std::set<Observer*> m_observers; -}; - -#endif // FPDFSDK_SRC_JAVASCRIPT_JS_RUNTIME_H_ diff --git a/fpdfsdk/src/javascript/JS_Runtime_Stub.cpp b/fpdfsdk/src/javascript/JS_Runtime_Stub.cpp deleted file mode 100644 index ab20e0e365..0000000000 --- a/fpdfsdk/src/javascript/JS_Runtime_Stub.cpp +++ /dev/null @@ -1,168 +0,0 @@ -// Copyright 2015 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include <memory> - -#include "fpdfsdk/include/fsdk_mgr.h" // For CPDFDoc_Environment. -#include "fpdfsdk/include/javascript/IJavaScript.h" - -class CJS_ContextStub final : public IJS_Context { - public: - CJS_ContextStub() {} - ~CJS_ContextStub() override {} - - // IJS_Context: - FX_BOOL RunScript(const CFX_WideString& script, - CFX_WideString* info) override { - return FALSE; - } - - void OnApp_Init() override {} - void OnDoc_Open(CPDFSDK_Document* pDoc, - const CFX_WideString& strTargetName) override {} - void OnDoc_WillPrint(CPDFSDK_Document* pDoc) override {} - void OnDoc_DidPrint(CPDFSDK_Document* pDoc) override {} - void OnDoc_WillSave(CPDFSDK_Document* pDoc) override {} - void OnDoc_DidSave(CPDFSDK_Document* pDoc) override {} - void OnDoc_WillClose(CPDFSDK_Document* pDoc) override {} - void OnPage_Open(CPDFSDK_Document* pTarget) override {} - void OnPage_Close(CPDFSDK_Document* pTarget) override {} - void OnPage_InView(CPDFSDK_Document* pTarget) override {} - void OnPage_OutView(CPDFSDK_Document* pTarget) override {} - void OnField_MouseDown(FX_BOOL bModifier, - FX_BOOL bShift, - CPDF_FormField* pTarget) override {} - void OnField_MouseEnter(FX_BOOL bModifier, - FX_BOOL bShift, - CPDF_FormField* pTarget) override {} - void OnField_MouseExit(FX_BOOL bModifier, - FX_BOOL bShift, - CPDF_FormField* pTarget) override {} - void OnField_MouseUp(FX_BOOL bModifier, - FX_BOOL bShift, - CPDF_FormField* pTarget) override {} - void OnField_Focus(FX_BOOL bModifier, - FX_BOOL bShift, - CPDF_FormField* pTarget, - const CFX_WideString& Value) override {} - void OnField_Blur(FX_BOOL bModifier, - FX_BOOL bShift, - CPDF_FormField* pTarget, - const CFX_WideString& Value) override {} - void OnField_Calculate(CPDF_FormField* pSource, - CPDF_FormField* pTarget, - CFX_WideString& Value, - FX_BOOL& bRc) override {} - void OnField_Format(CPDF_FormField* pTarget, - CFX_WideString& Value, - FX_BOOL bWillCommit) override {} - void OnField_Keystroke(CFX_WideString& strChange, - const CFX_WideString& strChangeEx, - FX_BOOL KeyDown, - FX_BOOL bModifier, - int& nSelEnd, - int& nSelStart, - FX_BOOL bShift, - CPDF_FormField* pTarget, - CFX_WideString& Value, - FX_BOOL bWillCommit, - FX_BOOL bFieldFull, - FX_BOOL& bRc) override {} - void OnField_Validate(CFX_WideString& strChange, - const CFX_WideString& strChangeEx, - FX_BOOL bKeyDown, - FX_BOOL bModifier, - FX_BOOL bShift, - CPDF_FormField* pTarget, - CFX_WideString& Value, - FX_BOOL& bRc) override {} - void OnScreen_Focus(FX_BOOL bModifier, - FX_BOOL bShift, - CPDFSDK_Annot* pScreen) override {} - void OnScreen_Blur(FX_BOOL bModifier, - FX_BOOL bShift, - CPDFSDK_Annot* pScreen) override {} - void OnScreen_Open(FX_BOOL bModifier, - FX_BOOL bShift, - CPDFSDK_Annot* pScreen) override {} - void OnScreen_Close(FX_BOOL bModifier, - FX_BOOL bShift, - CPDFSDK_Annot* pScreen) override {} - void OnScreen_MouseDown(FX_BOOL bModifier, - FX_BOOL bShift, - CPDFSDK_Annot* pScreen) override {} - void OnScreen_MouseUp(FX_BOOL bModifier, - FX_BOOL bShift, - CPDFSDK_Annot* pScreen) override {} - void OnScreen_MouseEnter(FX_BOOL bModifier, - FX_BOOL bShift, - CPDFSDK_Annot* pScreen) override {} - void OnScreen_MouseExit(FX_BOOL bModifier, - FX_BOOL bShift, - CPDFSDK_Annot* pScreen) override {} - void OnScreen_InView(FX_BOOL bModifier, - FX_BOOL bShift, - CPDFSDK_Annot* pScreen) override {} - void OnScreen_OutView(FX_BOOL bModifier, - FX_BOOL bShift, - CPDFSDK_Annot* pScreen) override {} - void OnBookmark_MouseUp(CPDF_Bookmark* pBookMark) override {} - void OnLink_MouseUp(CPDFSDK_Document* pTarget) override {} - void OnMenu_Exec(CPDFSDK_Document* pTarget, const CFX_WideString&) override {} - void OnBatchExec(CPDFSDK_Document* pTarget) override {} - void OnConsole_Exec() override {} - void OnExternal_Exec() override {} - void EnableMessageBox(FX_BOOL bEnable) override {} -}; - -class CJS_RuntimeStub final : public IJS_Runtime { - public: - CJS_RuntimeStub() : m_pDoc(nullptr) {} - ~CJS_RuntimeStub() override {} - - IJS_Context* NewContext() override { - if (!m_pContext) - m_pContext.reset(new CJS_ContextStub()); - return GetCurrentContext(); - } - - IJS_Context* GetCurrentContext() override { return m_pContext.get(); } - void ReleaseContext(IJS_Context* pContext) override {} - - void SetReaderDocument(CPDFSDK_Document* pReaderDoc) override { - m_pDoc = pReaderDoc; - } - CPDFSDK_Document* GetReaderDocument() override { return m_pDoc; } - -#ifdef PDF_ENABLE_XFA - FX_BOOL GetHValueByName(const CFX_ByteStringC&, FXJSE_HVALUE) override { - return FALSE; - } - - FX_BOOL SetHValueByName(const CFX_ByteStringC&, FXJSE_HVALUE) override { - return FALSE; - } -#endif // PDF_ENABLE_XFA - - int Execute(IJS_Context* cc, - const wchar_t* script, - CFX_WideString* info) override { - return 0; - } - - protected: - CPDFSDK_Document* m_pDoc; - std::unique_ptr<CJS_ContextStub> m_pContext; -}; - -// static -void IJS_Runtime::Initialize(unsigned int slot, void* isolate) { -} - -// static -IJS_Runtime* IJS_Runtime::Create(CPDFDoc_Environment* pEnv) { - return new CJS_RuntimeStub; -} diff --git a/fpdfsdk/src/javascript/JS_Value.cpp b/fpdfsdk/src/javascript/JS_Value.cpp deleted file mode 100644 index 70ccdb5e97..0000000000 --- a/fpdfsdk/src/javascript/JS_Value.cpp +++ /dev/null @@ -1,911 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "fpdfsdk/src/javascript/JS_Value.h" - -#include <time.h> - -#include <algorithm> -#include <cmath> -#include <limits> -#include <vector> - -#include "fpdfsdk/src/javascript/Document.h" -#include "fpdfsdk/src/javascript/JS_Define.h" -#include "fpdfsdk/src/javascript/JS_Object.h" - -static const FX_DWORD g_nan[2] = {0, 0x7FF80000}; -static double GetNan() { - return *(double*)g_nan; -} - -CJS_Value::CJS_Value(CJS_Runtime* pRuntime) - : m_eType(VT_unknown), m_pJSRuntime(pRuntime) { -} - -CJS_Value::CJS_Value(CJS_Runtime* pRuntime, v8::Local<v8::Value> pValue, Type t) - : m_eType(t), m_pValue(pValue), m_pJSRuntime(pRuntime) { -} - -CJS_Value::CJS_Value(CJS_Runtime* pRuntime, const int& iValue) - : m_pJSRuntime(pRuntime) { - operator=(iValue); -} - -CJS_Value::CJS_Value(CJS_Runtime* pRuntime, const bool& bValue) - : m_pJSRuntime(pRuntime) { - operator=(bValue); -} - -CJS_Value::CJS_Value(CJS_Runtime* pRuntime, const float& fValue) - : m_pJSRuntime(pRuntime) { - operator=(fValue); -} - -CJS_Value::CJS_Value(CJS_Runtime* pRuntime, const double& dValue) - : m_pJSRuntime(pRuntime) { - operator=(dValue); -} - -CJS_Value::CJS_Value(CJS_Runtime* pRuntime, v8::Local<v8::Object> pJsObj) - : m_pJSRuntime(pRuntime) { - operator=(pJsObj); -} - -CJS_Value::CJS_Value(CJS_Runtime* pRuntime, CJS_Object* pJsObj) - : m_pJSRuntime(pRuntime) { - operator=(pJsObj); -} - -CJS_Value::CJS_Value(CJS_Runtime* pRuntime, CJS_Document* pJsDoc) - : m_pJSRuntime(pRuntime) { - m_eType = VT_object; - if (pJsDoc) - m_pValue = pJsDoc->ToV8Object(); -} - -CJS_Value::CJS_Value(CJS_Runtime* pRuntime, const FX_WCHAR* pWstr) - : m_pJSRuntime(pRuntime) { - operator=(pWstr); -} - -CJS_Value::CJS_Value(CJS_Runtime* pRuntime, const FX_CHAR* pStr) - : m_pJSRuntime(pRuntime) { - operator=(pStr); -} - -CJS_Value::CJS_Value(CJS_Runtime* pRuntime, CJS_Array& array) - : m_pJSRuntime(pRuntime) { - operator=(array); -} - -CJS_Value::~CJS_Value() {} - -void CJS_Value::Attach(v8::Local<v8::Value> pValue, Type t) { - m_pValue = pValue; - m_eType = t; -} - -void CJS_Value::Attach(CJS_Value* pValue) { - if (pValue) - Attach(pValue->ToV8Value(), pValue->GetType()); -} - -void CJS_Value::Detach() { - m_pValue = v8::Local<v8::Value>(); - m_eType = VT_unknown; -} - -int CJS_Value::ToInt() const { - return FXJS_ToInt32(m_pJSRuntime->GetIsolate(), m_pValue); -} - -bool CJS_Value::ToBool() const { - return FXJS_ToBoolean(m_pJSRuntime->GetIsolate(), m_pValue); -} - -double CJS_Value::ToDouble() const { - return FXJS_ToNumber(m_pJSRuntime->GetIsolate(), m_pValue); -} - -float CJS_Value::ToFloat() const { - return (float)ToDouble(); -} - -CJS_Object* CJS_Value::ToCJSObject() const { - v8::Local<v8::Object> pObj = - FXJS_ToObject(m_pJSRuntime->GetIsolate(), m_pValue); - return (CJS_Object*)FXJS_GetPrivate(m_pJSRuntime->GetIsolate(), pObj); -} - -v8::Local<v8::Object> CJS_Value::ToV8Object() const { - return FXJS_ToObject(m_pJSRuntime->GetIsolate(), m_pValue); -} - -CFX_WideString CJS_Value::ToCFXWideString() const { - return FXJS_ToString(m_pJSRuntime->GetIsolate(), m_pValue); -} - -CFX_ByteString CJS_Value::ToCFXByteString() const { - return CFX_ByteString::FromUnicode(ToCFXWideString()); -} - -v8::Local<v8::Value> CJS_Value::ToV8Value() const { - return m_pValue; -} - -v8::Local<v8::Array> CJS_Value::ToV8Array() const { - if (IsArrayObject()) - return v8::Local<v8::Array>::Cast( - FXJS_ToObject(m_pJSRuntime->GetIsolate(), m_pValue)); - return v8::Local<v8::Array>(); -} - -void CJS_Value::MaybeCoerceToNumber() { - bool bAllowNaN = false; - if (m_eType == VT_string) { - CFX_ByteString bstr = ToCFXByteString(); - if (bstr.GetLength() == 0) - return; - if (bstr == "NaN") - bAllowNaN = true; - } - v8::TryCatch(m_pJSRuntime->GetIsolate()); - v8::MaybeLocal<v8::Number> maybeNum = - m_pValue->ToNumber(m_pJSRuntime->GetIsolate()->GetCurrentContext()); - if (maybeNum.IsEmpty()) - return; - v8::Local<v8::Number> num = maybeNum.ToLocalChecked(); - if (std::isnan(num->Value()) && !bAllowNaN) - return; - m_pValue = num; - m_eType = VT_number; -} - -void CJS_Value::operator=(int iValue) { - m_pValue = FXJS_NewNumber(m_pJSRuntime->GetIsolate(), iValue); - m_eType = VT_number; -} - -void CJS_Value::operator=(bool bValue) { - m_pValue = FXJS_NewBoolean(m_pJSRuntime->GetIsolate(), bValue); - m_eType = VT_boolean; -} - -void CJS_Value::operator=(double dValue) { - m_pValue = FXJS_NewNumber(m_pJSRuntime->GetIsolate(), dValue); - m_eType = VT_number; -} - -void CJS_Value::operator=(float fValue) { - m_pValue = FXJS_NewNumber(m_pJSRuntime->GetIsolate(), fValue); - m_eType = VT_number; -} - -void CJS_Value::operator=(v8::Local<v8::Object> pObj) { - m_pValue = FXJS_NewObject(m_pJSRuntime->GetIsolate(), pObj); - m_eType = VT_fxobject; -} - -void CJS_Value::operator=(CJS_Object* pObj) { - if (pObj) - operator=(pObj->ToV8Object()); -} - -void CJS_Value::operator=(CJS_Document* pJsDoc) { - m_eType = VT_object; - if (pJsDoc) { - m_pValue = pJsDoc->ToV8Object(); - } -} - -void CJS_Value::operator=(const FX_WCHAR* pWstr) { - m_pValue = FXJS_NewString(m_pJSRuntime->GetIsolate(), (wchar_t*)pWstr); - m_eType = VT_string; -} - -void CJS_Value::SetNull() { - m_pValue = FXJS_NewNull(); - m_eType = VT_null; -} - -void CJS_Value::operator=(const FX_CHAR* pStr) { - operator=(CFX_WideString::FromLocal(pStr).c_str()); -} - -void CJS_Value::operator=(CJS_Array& array) { - m_pValue = - FXJS_NewObject2(m_pJSRuntime->GetIsolate(), (v8::Local<v8::Array>)array); - m_eType = VT_object; -} - -void CJS_Value::operator=(CJS_Date& date) { - m_pValue = FXJS_NewDate(m_pJSRuntime->GetIsolate(), (double)date); - m_eType = VT_date; -} - -void CJS_Value::operator=(CJS_Value value) { - m_pValue = value.ToV8Value(); - m_eType = value.m_eType; - m_pJSRuntime = value.m_pJSRuntime; -} - -CJS_Value::Type CJS_Value::GetType() const { - if (m_pValue.IsEmpty()) - return VT_unknown; - if (m_pValue->IsString()) - return VT_string; - if (m_pValue->IsNumber()) - return VT_number; - if (m_pValue->IsBoolean()) - return VT_boolean; - if (m_pValue->IsDate()) - return VT_date; - if (m_pValue->IsObject()) - return VT_object; - if (m_pValue->IsNull()) - return VT_null; - if (m_pValue->IsUndefined()) - return VT_undefined; - return VT_unknown; -} - -FX_BOOL CJS_Value::IsArrayObject() const { - if (m_pValue.IsEmpty()) - return FALSE; - return m_pValue->IsArray(); -} - -FX_BOOL CJS_Value::IsDateObject() const { - if (m_pValue.IsEmpty()) - return FALSE; - return m_pValue->IsDate(); -} - -// CJS_Value::operator CJS_Array() -FX_BOOL CJS_Value::ConvertToArray(CJS_Array& array) const { - if (IsArrayObject()) { - array.Attach(FXJS_ToArray(m_pJSRuntime->GetIsolate(), m_pValue)); - return TRUE; - } - - return FALSE; -} - -FX_BOOL CJS_Value::ConvertToDate(CJS_Date& date) const { - if (IsDateObject()) { - date.Attach(m_pValue); - return TRUE; - } - - return FALSE; -} - -/* ---------------------------- CJS_PropValue ---------------------------- */ - -CJS_PropValue::CJS_PropValue(const CJS_Value& value) - : CJS_Value(value), m_bIsSetting(0) {} - -CJS_PropValue::CJS_PropValue(CJS_Runtime* pRuntime) - : CJS_Value(pRuntime), m_bIsSetting(0) { -} - -CJS_PropValue::~CJS_PropValue() { -} - -void CJS_PropValue::operator<<(int iValue) { - ASSERT(!m_bIsSetting); - CJS_Value::operator=(iValue); -} - -void CJS_PropValue::operator>>(int& iValue) const { - ASSERT(m_bIsSetting); - iValue = CJS_Value::ToInt(); -} - -void CJS_PropValue::operator<<(bool bValue) { - ASSERT(!m_bIsSetting); - CJS_Value::operator=(bValue); -} - -void CJS_PropValue::operator>>(bool& bValue) const { - ASSERT(m_bIsSetting); - bValue = CJS_Value::ToBool(); -} - -void CJS_PropValue::operator<<(double dValue) { - ASSERT(!m_bIsSetting); - CJS_Value::operator=(dValue); -} - -void CJS_PropValue::operator>>(double& dValue) const { - ASSERT(m_bIsSetting); - dValue = CJS_Value::ToDouble(); -} - -void CJS_PropValue::operator<<(CJS_Object* pObj) { - ASSERT(!m_bIsSetting); - CJS_Value::operator=(pObj); -} - -void CJS_PropValue::operator>>(CJS_Object*& ppObj) const { - ASSERT(m_bIsSetting); - ppObj = CJS_Value::ToCJSObject(); -} - -void CJS_PropValue::operator<<(CJS_Document* pJsDoc) { - ASSERT(!m_bIsSetting); - CJS_Value::operator=(pJsDoc); -} - -void CJS_PropValue::operator>>(CJS_Document*& ppJsDoc) const { - ASSERT(m_bIsSetting); - ppJsDoc = static_cast<CJS_Document*>(CJS_Value::ToCJSObject()); -} - -void CJS_PropValue::operator<<(v8::Local<v8::Object> pObj) { - ASSERT(!m_bIsSetting); - CJS_Value::operator=(pObj); -} - -void CJS_PropValue::operator>>(v8::Local<v8::Object>& ppObj) const { - ASSERT(m_bIsSetting); - ppObj = CJS_Value::ToV8Object(); -} - -void CJS_PropValue::StartSetting() { - m_bIsSetting = 1; -} - -void CJS_PropValue::StartGetting() { - m_bIsSetting = 0; -} -void CJS_PropValue::operator<<(CFX_ByteString str) { - ASSERT(!m_bIsSetting); - CJS_Value::operator=(str.c_str()); -} - -void CJS_PropValue::operator>>(CFX_ByteString& str) const { - ASSERT(m_bIsSetting); - str = CJS_Value::ToCFXByteString(); -} - -void CJS_PropValue::operator<<(const FX_WCHAR* c_string) { - ASSERT(!m_bIsSetting); - CJS_Value::operator=(c_string); -} - -void CJS_PropValue::operator>>(CFX_WideString& wide_string) const { - ASSERT(m_bIsSetting); - wide_string = CJS_Value::ToCFXWideString(); -} - -void CJS_PropValue::operator<<(CFX_WideString wide_string) { - ASSERT(!m_bIsSetting); - CJS_Value::operator=(wide_string.c_str()); -} - -void CJS_PropValue::operator>>(CJS_Array& array) const { - ASSERT(m_bIsSetting); - ConvertToArray(array); -} - -void CJS_PropValue::operator<<(CJS_Array& array) { - ASSERT(!m_bIsSetting); - CJS_Value::operator=(array); -} - -void CJS_PropValue::operator>>(CJS_Date& date) const { - ASSERT(m_bIsSetting); - ConvertToDate(date); -} - -void CJS_PropValue::operator<<(CJS_Date& date) { - ASSERT(!m_bIsSetting); - CJS_Value::operator=(date); -} - -CJS_PropValue::operator v8::Local<v8::Value>() const { - return m_pValue; -} - -CJS_Array::CJS_Array(CJS_Runtime* pRuntime) : m_pJSRuntime(pRuntime) { -} - -CJS_Array::~CJS_Array() {} - -void CJS_Array::Attach(v8::Local<v8::Array> pArray) { - m_pArray = pArray; -} - -FX_BOOL CJS_Array::IsAttached() { - return FALSE; -} - -void CJS_Array::GetElement(unsigned index, CJS_Value& value) { - if (m_pArray.IsEmpty()) - return; - v8::Local<v8::Value> p = - FXJS_GetArrayElement(m_pJSRuntime->GetIsolate(), m_pArray, index); - value.Attach(p, CJS_Value::VT_object); -} - -void CJS_Array::SetElement(unsigned index, CJS_Value value) { - if (m_pArray.IsEmpty()) - m_pArray = FXJS_NewArray(m_pJSRuntime->GetIsolate()); - - FXJS_PutArrayElement(m_pJSRuntime->GetIsolate(), m_pArray, index, - value.ToV8Value()); -} - -int CJS_Array::GetLength() { - if (m_pArray.IsEmpty()) - return 0; - return FXJS_GetArrayLength(m_pArray); -} - -CJS_Array::operator v8::Local<v8::Array>() { - if (m_pArray.IsEmpty()) - m_pArray = FXJS_NewArray(m_pJSRuntime->GetIsolate()); - - return m_pArray; -} - -CJS_Date::CJS_Date(CJS_Runtime* pRuntime) : m_pJSRuntime(pRuntime) { -} - -CJS_Date::CJS_Date(CJS_Runtime* pRuntime, double dMsecTime) - : m_pJSRuntime(pRuntime) { - m_pDate = FXJS_NewDate(pRuntime->GetIsolate(), dMsecTime); -} - -CJS_Date::CJS_Date(CJS_Runtime* pRuntime, - int year, - int mon, - int day, - int hour, - int min, - int sec) - : m_pJSRuntime(pRuntime) { - m_pDate = FXJS_NewDate(pRuntime->GetIsolate(), - MakeDate(year, mon, day, hour, min, sec, 0)); -} - -double CJS_Date::MakeDate(int year, - int mon, - int day, - int hour, - int min, - int sec, - int ms) { - return JS_MakeDate(JS_MakeDay(year, mon, day), - JS_MakeTime(hour, min, sec, ms)); -} - -CJS_Date::~CJS_Date() {} - -FX_BOOL CJS_Date::IsValidDate() { - if (m_pDate.IsEmpty()) - return FALSE; - return !JS_PortIsNan(FXJS_ToNumber(m_pJSRuntime->GetIsolate(), m_pDate)); -} - -void CJS_Date::Attach(v8::Local<v8::Value> pDate) { - m_pDate = pDate; -} - -int CJS_Date::GetYear() { - if (IsValidDate()) - return JS_GetYearFromTime( - JS_LocalTime(FXJS_ToNumber(m_pJSRuntime->GetIsolate(), m_pDate))); - - return 0; -} - -void CJS_Date::SetYear(int iYear) { - double date = MakeDate(iYear, GetMonth(), GetDay(), GetHours(), GetMinutes(), - GetSeconds(), 0); - FXJS_ValueCopy(m_pDate, FXJS_NewDate(m_pJSRuntime->GetIsolate(), date)); -} - -int CJS_Date::GetMonth() { - if (IsValidDate()) - return JS_GetMonthFromTime( - JS_LocalTime(FXJS_ToNumber(m_pJSRuntime->GetIsolate(), m_pDate))); - - return 0; -} - -void CJS_Date::SetMonth(int iMonth) { - double date = MakeDate(GetYear(), iMonth, GetDay(), GetHours(), GetMinutes(), - GetSeconds(), 0); - FXJS_ValueCopy(m_pDate, FXJS_NewDate(m_pJSRuntime->GetIsolate(), date)); -} - -int CJS_Date::GetDay() { - if (IsValidDate()) - return JS_GetDayFromTime( - JS_LocalTime(FXJS_ToNumber(m_pJSRuntime->GetIsolate(), m_pDate))); - - return 0; -} - -void CJS_Date::SetDay(int iDay) { - double date = MakeDate(GetYear(), GetMonth(), iDay, GetHours(), GetMinutes(), - GetSeconds(), 0); - FXJS_ValueCopy(m_pDate, FXJS_NewDate(m_pJSRuntime->GetIsolate(), date)); -} - -int CJS_Date::GetHours() { - if (IsValidDate()) - return JS_GetHourFromTime( - JS_LocalTime(FXJS_ToNumber(m_pJSRuntime->GetIsolate(), m_pDate))); - - return 0; -} - -void CJS_Date::SetHours(int iHours) { - double date = MakeDate(GetYear(), GetMonth(), GetDay(), iHours, GetMinutes(), - GetSeconds(), 0); - FXJS_ValueCopy(m_pDate, FXJS_NewDate(m_pJSRuntime->GetIsolate(), date)); -} - -int CJS_Date::GetMinutes() { - if (IsValidDate()) - return JS_GetMinFromTime( - JS_LocalTime(FXJS_ToNumber(m_pJSRuntime->GetIsolate(), m_pDate))); - - return 0; -} - -void CJS_Date::SetMinutes(int minutes) { - double date = MakeDate(GetYear(), GetMonth(), GetDay(), GetHours(), minutes, - GetSeconds(), 0); - FXJS_ValueCopy(m_pDate, FXJS_NewDate(m_pJSRuntime->GetIsolate(), date)); -} - -int CJS_Date::GetSeconds() { - if (IsValidDate()) - return JS_GetSecFromTime( - JS_LocalTime(FXJS_ToNumber(m_pJSRuntime->GetIsolate(), m_pDate))); - - return 0; -} - -void CJS_Date::SetSeconds(int seconds) { - double date = MakeDate(GetYear(), GetMonth(), GetDay(), GetHours(), - GetMinutes(), seconds, 0); - FXJS_ValueCopy(m_pDate, FXJS_NewDate(m_pJSRuntime->GetIsolate(), date)); -} - -CJS_Date::operator v8::Local<v8::Value>() { - return m_pDate; -} - -CJS_Date::operator double() const { - if (m_pDate.IsEmpty()) - return 0.0; - return FXJS_ToNumber(m_pJSRuntime->GetIsolate(), m_pDate); -} - -CFX_WideString CJS_Date::ToString() const { - if (m_pDate.IsEmpty()) - return L""; - return FXJS_ToString(m_pJSRuntime->GetIsolate(), m_pDate); -} - -double _getLocalTZA() { - if (!FSDK_IsSandBoxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS)) - return 0; - time_t t = 0; - time(&t); - localtime(&t); -#if _MSC_VER >= 1900 - // In gcc and in Visual Studio prior to VS 2015 'timezone' is a global - // variable declared in time.h. That variable was deprecated and in VS 2015 - // is removed, with _get_timezone replacing it. - long timezone = 0; - _get_timezone(&timezone); -#endif - return (double)(-(timezone * 1000)); -} - -int _getDaylightSavingTA(double d) { - if (!FSDK_IsSandBoxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS)) - return 0; - time_t t = (time_t)(d / 1000); - struct tm* tmp = localtime(&t); - if (!tmp) - return 0; - if (tmp->tm_isdst > 0) - // One hour. - return (int)60 * 60 * 1000; - return 0; -} - -double _Mod(double x, double y) { - double r = fmod(x, y); - if (r < 0) - r += y; - return r; -} - -int _isfinite(double v) { -#if _MSC_VER - return ::_finite(v); -#else - return std::fabs(v) < std::numeric_limits<double>::max(); -#endif -} - -double _toInteger(double n) { - return (n >= 0) ? FXSYS_floor(n) : -FXSYS_floor(-n); -} - -bool _isLeapYear(int year) { - return (year % 4 == 0) && ((year % 100 != 0) || (year % 400 != 0)); -} - -int _DayFromYear(int y) { - return (int)(365 * (y - 1970.0) + FXSYS_floor((y - 1969.0) / 4) - - FXSYS_floor((y - 1901.0) / 100) + - FXSYS_floor((y - 1601.0) / 400)); -} - -double _TimeFromYear(int y) { - return 86400000.0 * _DayFromYear(y); -} - -double _TimeFromYearMonth(int y, int m) { - static int daysMonth[12] = { - 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}; - static int leapDaysMonth[12] = { - 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335}; - int* pMonth = daysMonth; - if (_isLeapYear(y)) - pMonth = leapDaysMonth; - return _TimeFromYear(y) + ((double)pMonth[m]) * 86400000; -} - -int _Day(double t) { - return (int)FXSYS_floor(t / 86400000); -} - -int _YearFromTime(double t) { - // estimate the time. - int y = 1970 + static_cast<int>(t / (365.2425 * 86400000)); - if (_TimeFromYear(y) <= t) { - while (_TimeFromYear(y + 1) <= t) - y++; - } else { - while (_TimeFromYear(y) > t) - y--; - } - return y; -} - -int _DayWithinYear(double t) { - int year = _YearFromTime(t); - int day = _Day(t); - return day - _DayFromYear(year); -} - -int _MonthFromTime(double t) { - int day = _DayWithinYear(t); - int year = _YearFromTime(t); - if (0 <= day && day < 31) - return 0; - if (31 <= day && day < 59 + _isLeapYear(year)) - return 1; - if ((59 + _isLeapYear(year)) <= day && day < (90 + _isLeapYear(year))) - return 2; - if ((90 + _isLeapYear(year)) <= day && day < (120 + _isLeapYear(year))) - return 3; - if ((120 + _isLeapYear(year)) <= day && day < (151 + _isLeapYear(year))) - return 4; - if ((151 + _isLeapYear(year)) <= day && day < (181 + _isLeapYear(year))) - return 5; - if ((181 + _isLeapYear(year)) <= day && day < (212 + _isLeapYear(year))) - return 6; - if ((212 + _isLeapYear(year)) <= day && day < (243 + _isLeapYear(year))) - return 7; - if ((243 + _isLeapYear(year)) <= day && day < (273 + _isLeapYear(year))) - return 8; - if ((273 + _isLeapYear(year)) <= day && day < (304 + _isLeapYear(year))) - return 9; - if ((304 + _isLeapYear(year)) <= day && day < (334 + _isLeapYear(year))) - return 10; - if ((334 + _isLeapYear(year)) <= day && day < (365 + _isLeapYear(year))) - return 11; - - return -1; -} - -int _DateFromTime(double t) { - int day = _DayWithinYear(t); - int year = _YearFromTime(t); - bool leap = _isLeapYear(year); - int month = _MonthFromTime(t); - switch (month) { - case 0: - return day + 1; - case 1: - return day - 30; - case 2: - return day - 58 - leap; - case 3: - return day - 89 - leap; - case 4: - return day - 119 - leap; - case 5: - return day - 150 - leap; - case 6: - return day - 180 - leap; - case 7: - return day - 211 - leap; - case 8: - return day - 242 - leap; - case 9: - return day - 272 - leap; - case 10: - return day - 303 - leap; - case 11: - return day - 333 - leap; - default: - return 0; - } -} - -double JS_GetDateTime() { - if (!FSDK_IsSandBoxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS)) - return 0; - time_t t = time(NULL); - struct tm* pTm = localtime(&t); - - int year = pTm->tm_year + 1900; - double t1 = _TimeFromYear(year); - - return t1 + pTm->tm_yday * 86400000.0 + pTm->tm_hour * 3600000.0 + - pTm->tm_min * 60000.0 + pTm->tm_sec * 1000.0; -} - -int JS_GetYearFromTime(double dt) { - return _YearFromTime(dt); -} - -int JS_GetMonthFromTime(double dt) { - return _MonthFromTime(dt); -} - -int JS_GetDayFromTime(double dt) { - return _DateFromTime(dt); -} - -int JS_GetHourFromTime(double dt) { - return (int)_Mod(FXSYS_floor((double)(dt / (60 * 60 * 1000))), 24); -} - -int JS_GetMinFromTime(double dt) { - return (int)_Mod(FXSYS_floor((double)(dt / (60 * 1000))), 60); -} - -int JS_GetSecFromTime(double dt) { - return (int)_Mod(FXSYS_floor((double)(dt / 1000)), 60); -} - -double JS_DateParse(const wchar_t* str) { - v8::Isolate* pIsolate = v8::Isolate::GetCurrent(); - v8::Isolate::Scope isolate_scope(pIsolate); - v8::HandleScope scope(pIsolate); - - v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); - - // Use the built-in object method. - v8::Local<v8::Value> v = - context->Global() - ->Get(context, v8::String::NewFromUtf8(pIsolate, "Date", - v8::NewStringType::kNormal) - .ToLocalChecked()) - .ToLocalChecked(); - if (v->IsObject()) { - v8::Local<v8::Object> o = v->ToObject(context).ToLocalChecked(); - v = o->Get(context, v8::String::NewFromUtf8(pIsolate, "parse", - v8::NewStringType::kNormal) - .ToLocalChecked()).ToLocalChecked(); - if (v->IsFunction()) { - v8::Local<v8::Function> funC = v8::Local<v8::Function>::Cast(v); - - const int argc = 1; - v8::Local<v8::String> timeStr = FXJS_WSToJSString(pIsolate, str); - v8::Local<v8::Value> argv[argc] = {timeStr}; - v = funC->Call(context, context->Global(), argc, argv).ToLocalChecked(); - if (v->IsNumber()) { - double date = v->ToNumber(context).ToLocalChecked()->Value(); - if (!_isfinite(date)) - return date; - return date + _getLocalTZA() + _getDaylightSavingTA(date); - } - } - } - return 0; -} - -double JS_MakeDay(int nYear, int nMonth, int nDate) { - if (!_isfinite(nYear) || !_isfinite(nMonth) || !_isfinite(nDate)) - return GetNan(); - double y = _toInteger(nYear); - double m = _toInteger(nMonth); - double dt = _toInteger(nDate); - double ym = y + FXSYS_floor((double)m / 12); - double mn = _Mod(m, 12); - - double t = _TimeFromYearMonth((int)ym, (int)mn); - - if (_YearFromTime(t) != ym || _MonthFromTime(t) != mn || - _DateFromTime(t) != 1) - return GetNan(); - return _Day(t) + dt - 1; -} - -double JS_MakeTime(int nHour, int nMin, int nSec, int nMs) { - if (!_isfinite(nHour) || !_isfinite(nMin) || !_isfinite(nSec) || - !_isfinite(nMs)) - return GetNan(); - - double h = _toInteger(nHour); - double m = _toInteger(nMin); - double s = _toInteger(nSec); - double milli = _toInteger(nMs); - - return h * 3600000 + m * 60000 + s * 1000 + milli; -} - -double JS_MakeDate(double day, double time) { - if (!_isfinite(day) || !_isfinite(time)) - return GetNan(); - - return day * 86400000 + time; -} - -bool JS_PortIsNan(double d) { - return d != d; -} - -double JS_LocalTime(double d) { - return JS_GetDateTime() + _getDaylightSavingTA(d); -} - -std::vector<CJS_Value> JS_ExpandKeywordParams( - CJS_Runtime* pRuntime, - const std::vector<CJS_Value>& originals, - size_t nKeywords, - ...) { - ASSERT(nKeywords); - - std::vector<CJS_Value> result(nKeywords, CJS_Value(pRuntime)); - size_t size = std::min(originals.size(), nKeywords); - for (size_t i = 0; i < size; ++i) - result[i] = originals[i]; - - if (originals.size() != 1 || originals[0].GetType() != CJS_Value::VT_object || - originals[0].IsArrayObject()) { - return result; - } - v8::Local<v8::Object> pObj = originals[0].ToV8Object(); - result[0] = CJS_Value(pRuntime); // Make unknown. - - va_list ap; - va_start(ap, nKeywords); - for (int i = 0; i < nKeywords; ++i) { - const wchar_t* property = va_arg(ap, const wchar_t*); - v8::Local<v8::Value> v8Value = - FXJS_GetObjectElement(pRuntime->GetIsolate(), pObj, property); - if (!v8Value->IsUndefined()) - result[i] = CJS_Value(pRuntime, v8Value, CJS_Value::VT_unknown); - } - va_end(ap); - return result; -} diff --git a/fpdfsdk/src/javascript/JS_Value.h b/fpdfsdk/src/javascript/JS_Value.h deleted file mode 100644 index f6c1c360ca..0000000000 --- a/fpdfsdk/src/javascript/JS_Value.h +++ /dev/null @@ -1,230 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef FPDFSDK_SRC_JAVASCRIPT_JS_VALUE_H_ -#define FPDFSDK_SRC_JAVASCRIPT_JS_VALUE_H_ - -#include <vector> - -#include "core/include/fxcrt/fx_basic.h" -#include "fpdfsdk/include/jsapi/fxjs_v8.h" - -class CJS_Array; -class CJS_Date; -class CJS_Document; -class CJS_Object; -class CJS_Runtime; - -class CJS_Value { - public: - enum Type { - VT_unknown, - VT_string, - VT_number, - VT_boolean, - VT_date, - VT_object, - VT_fxobject, - VT_null, - VT_undefined - }; - - CJS_Value(CJS_Runtime* pRuntime); - CJS_Value(CJS_Runtime* pRuntime, v8::Local<v8::Value> pValue, Type t); - CJS_Value(CJS_Runtime* pRuntime, const int& iValue); - CJS_Value(CJS_Runtime* pRuntime, const double& dValue); - CJS_Value(CJS_Runtime* pRuntime, const float& fValue); - CJS_Value(CJS_Runtime* pRuntime, const bool& bValue); - CJS_Value(CJS_Runtime* pRuntime, v8::Local<v8::Object>); - CJS_Value(CJS_Runtime* pRuntime, CJS_Object*); - CJS_Value(CJS_Runtime* pRuntime, CJS_Document*); - CJS_Value(CJS_Runtime* pRuntime, const FX_CHAR* pStr); - CJS_Value(CJS_Runtime* pRuntime, const FX_WCHAR* pWstr); - CJS_Value(CJS_Runtime* pRuntime, CJS_Array& array); - - ~CJS_Value(); - - void SetNull(); - void Attach(v8::Local<v8::Value> pValue, Type t); - void Attach(CJS_Value* pValue); - void Detach(); - - Type GetType() const; - int ToInt() const; - bool ToBool() const; - double ToDouble() const; - float ToFloat() const; - CJS_Object* ToCJSObject() const; - CFX_WideString ToCFXWideString() const; - CFX_ByteString ToCFXByteString() const; - v8::Local<v8::Object> ToV8Object() const; - v8::Local<v8::Array> ToV8Array() const; - v8::Local<v8::Value> ToV8Value() const; - - // Replace the current |m_pValue| with a v8::Number if possible - // to make one from the current |m_pValue|, updating |m_eType| - // as appropriate to indicate the result. - void MaybeCoerceToNumber(); - - void operator=(int iValue); - void operator=(bool bValue); - void operator=(double val); - void operator=(float val); - void operator=(CJS_Object* val); - void operator=(CJS_Document* val); - void operator=(v8::Local<v8::Object> val); - void operator=(CJS_Array& val); - void operator=(CJS_Date& val); - void operator=(const FX_WCHAR* pWstr); - void operator=(const FX_CHAR* pStr); - void operator=(CJS_Value value); - - FX_BOOL IsArrayObject() const; - FX_BOOL IsDateObject() const; - FX_BOOL ConvertToArray(CJS_Array&) const; - FX_BOOL ConvertToDate(CJS_Date&) const; - - CJS_Runtime* GetJSRuntime() const { return m_pJSRuntime; } - - protected: - Type m_eType; - v8::Local<v8::Value> m_pValue; - CJS_Runtime* m_pJSRuntime; -}; - -class CJS_PropValue : public CJS_Value { - public: - CJS_PropValue(const CJS_Value&); - CJS_PropValue(CJS_Runtime* pRuntime); - ~CJS_PropValue(); - - FX_BOOL IsSetting() const { return m_bIsSetting; } - FX_BOOL IsGetting() const { return !m_bIsSetting; } - - void operator<<(int val); - void operator>>(int&) const; - void operator<<(bool val); - void operator>>(bool&) const; - void operator<<(double val); - void operator>>(double&) const; - void operator<<(CJS_Object* pObj); - void operator>>(CJS_Object*& ppObj) const; - void operator<<(CJS_Document* pJsDoc); - void operator>>(CJS_Document*& ppJsDoc) const; - void operator<<(CFX_ByteString); - void operator>>(CFX_ByteString&) const; - void operator<<(CFX_WideString); - void operator>>(CFX_WideString&) const; - void operator<<(const FX_WCHAR* c_string); - void operator<<(v8::Local<v8::Object>); - void operator>>(v8::Local<v8::Object>&) const; - void operator>>(CJS_Array& array) const; - void operator<<(CJS_Array& array); - void operator<<(CJS_Date& date); - void operator>>(CJS_Date& date) const; - operator v8::Local<v8::Value>() const; - void StartSetting(); - void StartGetting(); - - private: - FX_BOOL m_bIsSetting; -}; - -class CJS_Array { - public: - CJS_Array(CJS_Runtime* pRuntime); - virtual ~CJS_Array(); - - void Attach(v8::Local<v8::Array> pArray); - void GetElement(unsigned index, CJS_Value& value); - void SetElement(unsigned index, CJS_Value value); - int GetLength(); - FX_BOOL IsAttached(); - operator v8::Local<v8::Array>(); - - CJS_Runtime* GetJSRuntime() const { return m_pJSRuntime; } - - private: - v8::Local<v8::Array> m_pArray; - CJS_Runtime* m_pJSRuntime; -}; - -class CJS_Date { - friend class CJS_Value; - - public: - CJS_Date(CJS_Runtime* pRuntime); - CJS_Date(CJS_Runtime* pRuntime, double dMsec_time); - CJS_Date(CJS_Runtime* pRuntime, - int year, - int mon, - int day, - int hour, - int min, - int sec); - virtual ~CJS_Date(); - void Attach(v8::Local<v8::Value> pDate); - - int GetYear(); - void SetYear(int iYear); - - int GetMonth(); - void SetMonth(int iMonth); - - int GetDay(); - void SetDay(int iDay); - - int GetHours(); - void SetHours(int iHours); - - int GetMinutes(); - void SetMinutes(int minutes); - - int GetSeconds(); - void SetSeconds(int seconds); - - operator v8::Local<v8::Value>(); - operator double() const; - - CFX_WideString ToString() const; - - static double - MakeDate(int year, int mon, int mday, int hour, int min, int sec, int ms); - - FX_BOOL IsValidDate(); - - protected: - v8::Local<v8::Value> m_pDate; - CJS_Runtime* m_pJSRuntime; -}; - -double JS_GetDateTime(); -int JS_GetYearFromTime(double dt); -int JS_GetMonthFromTime(double dt); -int JS_GetDayFromTime(double dt); -int JS_GetHourFromTime(double dt); -int JS_GetMinFromTime(double dt); -int JS_GetSecFromTime(double dt); -double JS_DateParse(const wchar_t* str); -double JS_MakeDay(int nYear, int nMonth, int nDay); -double JS_MakeTime(int nHour, int nMin, int nSec, int nMs); -double JS_MakeDate(double day, double time); -bool JS_PortIsNan(double d); -double JS_LocalTime(double d); - -// Some JS methods have the bizarre convention that they may also be called -// with a single argument which is an object containing the actual arguments -// as its properties. The varying arguments to this method are the property -// names as wchar_t string literals corresponding to each positional argument. -// The result will always contain |nKeywords| value, with unspecified ones -// being set to type VT_unknown. -std::vector<CJS_Value> JS_ExpandKeywordParams( - CJS_Runtime* pRuntime, - const std::vector<CJS_Value>& originals, - size_t nKeywords, - ...); - -#endif // FPDFSDK_SRC_JAVASCRIPT_JS_VALUE_H_ diff --git a/fpdfsdk/src/javascript/PublicMethods.cpp b/fpdfsdk/src/javascript/PublicMethods.cpp deleted file mode 100644 index 014dea2d6a..0000000000 --- a/fpdfsdk/src/javascript/PublicMethods.cpp +++ /dev/null @@ -1,1916 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "fpdfsdk/src/javascript/PublicMethods.h" - -#include <algorithm> -#include <string> -#include <vector> - -#include "core/include/fxcrt/fx_ext.h" -#include "fpdfsdk/include/fsdk_mgr.h" // For CPDFDoc_Environment. -#include "fpdfsdk/include/javascript/IJavaScript.h" -#include "fpdfsdk/src/javascript/Field.h" -#include "fpdfsdk/src/javascript/JS_Context.h" -#include "fpdfsdk/src/javascript/JS_Define.h" -#include "fpdfsdk/src/javascript/JS_EventHandler.h" -#include "fpdfsdk/src/javascript/JS_Object.h" -#include "fpdfsdk/src/javascript/JS_Runtime.h" -#include "fpdfsdk/src/javascript/JS_Value.h" -#include "fpdfsdk/src/javascript/color.h" -#include "fpdfsdk/src/javascript/resource.h" -#include "fpdfsdk/src/javascript/util.h" - -#define DOUBLE_CORRECT 0.000000000000001 - -BEGIN_JS_STATIC_GLOBAL_FUN(CJS_PublicMethods) -JS_STATIC_GLOBAL_FUN_ENTRY(AFNumber_Format) -JS_STATIC_GLOBAL_FUN_ENTRY(AFNumber_Keystroke) -JS_STATIC_GLOBAL_FUN_ENTRY(AFPercent_Format) -JS_STATIC_GLOBAL_FUN_ENTRY(AFPercent_Keystroke) -JS_STATIC_GLOBAL_FUN_ENTRY(AFDate_FormatEx) -JS_STATIC_GLOBAL_FUN_ENTRY(AFDate_KeystrokeEx) -JS_STATIC_GLOBAL_FUN_ENTRY(AFDate_Format) -JS_STATIC_GLOBAL_FUN_ENTRY(AFDate_Keystroke) -JS_STATIC_GLOBAL_FUN_ENTRY(AFTime_FormatEx) -JS_STATIC_GLOBAL_FUN_ENTRY(AFTime_KeystrokeEx) -JS_STATIC_GLOBAL_FUN_ENTRY(AFTime_Format) -JS_STATIC_GLOBAL_FUN_ENTRY(AFTime_Keystroke) -JS_STATIC_GLOBAL_FUN_ENTRY(AFSpecial_Format) -JS_STATIC_GLOBAL_FUN_ENTRY(AFSpecial_Keystroke) -JS_STATIC_GLOBAL_FUN_ENTRY(AFSpecial_KeystrokeEx) -JS_STATIC_GLOBAL_FUN_ENTRY(AFSimple) -JS_STATIC_GLOBAL_FUN_ENTRY(AFMakeNumber) -JS_STATIC_GLOBAL_FUN_ENTRY(AFSimple_Calculate) -JS_STATIC_GLOBAL_FUN_ENTRY(AFRange_Validate) -JS_STATIC_GLOBAL_FUN_ENTRY(AFMergeChange) -JS_STATIC_GLOBAL_FUN_ENTRY(AFParseDateEx) -JS_STATIC_GLOBAL_FUN_ENTRY(AFExtractNums) -END_JS_STATIC_GLOBAL_FUN() - -IMPLEMENT_JS_STATIC_GLOBAL_FUN(CJS_PublicMethods) - -static const FX_WCHAR* const months[] = {L"Jan", - L"Feb", - L"Mar", - L"Apr", - L"May", - L"Jun", - L"Jul", - L"Aug", - L"Sep", - L"Oct", - L"Nov", - L"Dec"}; - -static const FX_WCHAR* const fullmonths[] = {L"January", - L"February", - L"March", - L"April", - L"May", - L"June", - L"July", - L"August", - L"September", - L"October", - L"November", - L"December"}; - -FX_BOOL CJS_PublicMethods::IsNumber(const FX_WCHAR* str) { - CFX_WideString sTrim = StrTrim(str); - const FX_WCHAR* pTrim = sTrim.c_str(); - const FX_WCHAR* p = pTrim; - - FX_BOOL bDot = FALSE; - FX_BOOL bKXJS = FALSE; - - wchar_t c; - while ((c = *p)) { - if (c == '.' || c == ',') { - if (bDot) - return FALSE; - bDot = TRUE; - } else if (c == '-' || c == '+') { - if (p != pTrim) - return FALSE; - } else if (c == 'e' || c == 'E') { - if (bKXJS) - return FALSE; - - p++; - c = *p; - if (c == '+' || c == '-') { - bKXJS = TRUE; - } else { - return FALSE; - } - } else if (!FXSYS_iswdigit(c)) { - return FALSE; - } - p++; - } - - return TRUE; -} - -FX_BOOL CJS_PublicMethods::maskSatisfied(wchar_t c_Change, wchar_t c_Mask) { - switch (c_Mask) { - case L'9': - return FXSYS_iswdigit(c_Change); - case L'A': - return FXSYS_iswalpha(c_Change); - case L'O': - return FXSYS_iswalnum(c_Change); - case L'X': - return TRUE; - default: - return (c_Change == c_Mask); - } -} - -FX_BOOL CJS_PublicMethods::isReservedMaskChar(wchar_t ch) { - return ch == L'9' || ch == L'A' || ch == L'O' || ch == L'X'; -} - -double CJS_PublicMethods::AF_Simple(const FX_WCHAR* sFuction, - double dValue1, - double dValue2) { - if (FXSYS_wcsicmp(sFuction, L"AVG") == 0 || - FXSYS_wcsicmp(sFuction, L"SUM") == 0) { - return dValue1 + dValue2; - } - if (FXSYS_wcsicmp(sFuction, L"PRD") == 0) { - return dValue1 * dValue2; - } - if (FXSYS_wcsicmp(sFuction, L"MIN") == 0) { - return std::min(dValue1, dValue2); - } - if (FXSYS_wcsicmp(sFuction, L"MAX") == 0) { - return std::max(dValue1, dValue2); - } - return dValue1; -} - -CFX_WideString CJS_PublicMethods::StrLTrim(const FX_WCHAR* pStr) { - while (*pStr && *pStr == L' ') - pStr++; - - return pStr; -} - -CFX_WideString CJS_PublicMethods::StrRTrim(const FX_WCHAR* pStr) { - const FX_WCHAR* p = pStr; - while (*p) - p++; - while (p > pStr && *(p - 1) == L' ') - p--; - - return CFX_WideString(pStr, p - pStr); -} - -CFX_WideString CJS_PublicMethods::StrTrim(const FX_WCHAR* pStr) { - return StrRTrim(StrLTrim(pStr).c_str()); -} - -CFX_ByteString CJS_PublicMethods::StrLTrim(const FX_CHAR* pStr) { - while (*pStr && *pStr == ' ') - pStr++; - - return pStr; -} - -CFX_ByteString CJS_PublicMethods::StrRTrim(const FX_CHAR* pStr) { - const FX_CHAR* p = pStr; - while (*p) - p++; - while (p > pStr && *(p - 1) == L' ') - p--; - - return CFX_ByteString(pStr, p - pStr); -} - -CFX_ByteString CJS_PublicMethods::StrTrim(const FX_CHAR* pStr) { - return StrRTrim(StrLTrim(pStr)); -} - -CJS_Array CJS_PublicMethods::AF_MakeArrayFromList(CJS_Runtime* pRuntime, - CJS_Value val) { - CJS_Array StrArray(pRuntime); - if (val.IsArrayObject()) { - val.ConvertToArray(StrArray); - return StrArray; - } - CFX_WideString wsStr = val.ToCFXWideString(); - CFX_ByteString t = CFX_ByteString::FromUnicode(wsStr); - const char* p = (const char*)t; - - int ch = ','; - int nIndex = 0; - - while (*p) { - const char* pTemp = strchr(p, ch); - if (!pTemp) { - StrArray.SetElement(nIndex, CJS_Value(pRuntime, StrTrim(p).c_str())); - break; - } - - char* pSub = new char[pTemp - p + 1]; - strncpy(pSub, p, pTemp - p); - *(pSub + (pTemp - p)) = '\0'; - - StrArray.SetElement(nIndex, CJS_Value(pRuntime, StrTrim(pSub).c_str())); - delete[] pSub; - - nIndex++; - p = ++pTemp; - } - return StrArray; -} - -int CJS_PublicMethods::ParseStringInteger(const CFX_WideString& str, - int nStart, - int& nSkip, - int nMaxStep) { - int nRet = 0; - nSkip = 0; - for (int i = nStart, sz = str.GetLength(); i < sz; i++) { - if (i - nStart > 10) - break; - - FX_WCHAR c = str.GetAt(i); - if (!FXSYS_iswdigit(c)) - break; - - nRet = nRet * 10 + FXSYS_toDecimalDigit(c); - nSkip = i - nStart + 1; - if (nSkip >= nMaxStep) - break; - } - - return nRet; -} - -CFX_WideString CJS_PublicMethods::ParseStringString(const CFX_WideString& str, - int nStart, - int& nSkip) { - CFX_WideString swRet; - nSkip = 0; - for (int i = nStart, sz = str.GetLength(); i < sz; i++) { - FX_WCHAR c = str.GetAt(i); - if (!FXSYS_iswdigit(c)) - break; - - swRet += c; - nSkip = i - nStart + 1; - } - - return swRet; -} - -double CJS_PublicMethods::ParseNormalDate(const CFX_WideString& value, - bool* bWrongFormat) { - double dt = JS_GetDateTime(); - - int nYear = JS_GetYearFromTime(dt); - int nMonth = JS_GetMonthFromTime(dt) + 1; - int nDay = JS_GetDayFromTime(dt); - int nHour = JS_GetHourFromTime(dt); - int nMin = JS_GetMinFromTime(dt); - int nSec = JS_GetSecFromTime(dt); - - int number[3]; - - int nSkip = 0; - int nLen = value.GetLength(); - int nIndex = 0; - int i = 0; - while (i < nLen) { - if (nIndex > 2) - break; - - FX_WCHAR c = value.GetAt(i); - if (FXSYS_iswdigit(c)) { - number[nIndex++] = ParseStringInteger(value, i, nSkip, 4); - i += nSkip; - } else { - i++; - } - } - - if (nIndex == 2) { - // case2: month/day - // case3: day/month - if ((number[0] >= 1 && number[0] <= 12) && - (number[1] >= 1 && number[1] <= 31)) { - nMonth = number[0]; - nDay = number[1]; - } else if ((number[0] >= 1 && number[0] <= 31) && - (number[1] >= 1 && number[1] <= 12)) { - nDay = number[0]; - nMonth = number[1]; - } - - if (bWrongFormat) - *bWrongFormat = false; - } else if (nIndex == 3) { - // case1: year/month/day - // case2: month/day/year - // case3: day/month/year - - if (number[0] > 12 && (number[1] >= 1 && number[1] <= 12) && - (number[2] >= 1 && number[2] <= 31)) { - nYear = number[0]; - nMonth = number[1]; - nDay = number[2]; - } else if ((number[0] >= 1 && number[0] <= 12) && - (number[1] >= 1 && number[1] <= 31) && number[2] > 31) { - nMonth = number[0]; - nDay = number[1]; - nYear = number[2]; - } else if ((number[0] >= 1 && number[0] <= 31) && - (number[1] >= 1 && number[1] <= 12) && number[2] > 31) { - nDay = number[0]; - nMonth = number[1]; - nYear = number[2]; - } - - if (bWrongFormat) - *bWrongFormat = false; - } else { - if (bWrongFormat) - *bWrongFormat = true; - return dt; - } - - CFX_WideString swTemp; - swTemp.Format(L"%d/%d/%d %d:%d:%d", nMonth, nDay, nYear, nHour, nMin, nSec); - return JS_DateParse(swTemp.c_str()); -} - -double CJS_PublicMethods::MakeRegularDate(const CFX_WideString& value, - const CFX_WideString& format, - bool* bWrongFormat) { - double dt = JS_GetDateTime(); - - if (format.IsEmpty() || value.IsEmpty()) - return dt; - - int nYear = JS_GetYearFromTime(dt); - int nMonth = JS_GetMonthFromTime(dt) + 1; - int nDay = JS_GetDayFromTime(dt); - int nHour = JS_GetHourFromTime(dt); - int nMin = JS_GetMinFromTime(dt); - int nSec = JS_GetSecFromTime(dt); - - int nYearSub = 99; // nYear - 2000; - - FX_BOOL bPm = FALSE; - FX_BOOL bExit = FALSE; - bool bBadFormat = false; - - int i = 0; - int j = 0; - - while (i < format.GetLength()) { - if (bExit) - break; - - FX_WCHAR c = format.GetAt(i); - switch (c) { - case ':': - case '.': - case '-': - case '\\': - case '/': - i++; - j++; - break; - - case 'y': - case 'm': - case 'd': - case 'H': - case 'h': - case 'M': - case 's': - case 't': { - int oldj = j; - int nSkip = 0; - int remaining = format.GetLength() - i - 1; - - if (remaining == 0 || format.GetAt(i + 1) != c) { - switch (c) { - case 'y': - i++; - j++; - break; - case 'm': - nMonth = ParseStringInteger(value, j, nSkip, 2); - i++; - j += nSkip; - break; - case 'd': - nDay = ParseStringInteger(value, j, nSkip, 2); - i++; - j += nSkip; - break; - case 'H': - nHour = ParseStringInteger(value, j, nSkip, 2); - i++; - j += nSkip; - break; - case 'h': - nHour = ParseStringInteger(value, j, nSkip, 2); - i++; - j += nSkip; - break; - case 'M': - nMin = ParseStringInteger(value, j, nSkip, 2); - i++; - j += nSkip; - break; - case 's': - nSec = ParseStringInteger(value, j, nSkip, 2); - i++; - j += nSkip; - break; - case 't': - bPm = (j < value.GetLength() && value.GetAt(j) == 'p'); - i++; - j++; - break; - } - } else if (remaining == 1 || format.GetAt(i + 2) != c) { - switch (c) { - case 'y': - nYear = ParseStringInteger(value, j, nSkip, 4); - i += 2; - j += nSkip; - break; - case 'm': - nMonth = ParseStringInteger(value, j, nSkip, 2); - i += 2; - j += nSkip; - break; - case 'd': - nDay = ParseStringInteger(value, j, nSkip, 2); - i += 2; - j += nSkip; - break; - case 'H': - nHour = ParseStringInteger(value, j, nSkip, 2); - i += 2; - j += nSkip; - break; - case 'h': - nHour = ParseStringInteger(value, j, nSkip, 2); - i += 2; - j += nSkip; - break; - case 'M': - nMin = ParseStringInteger(value, j, nSkip, 2); - i += 2; - j += nSkip; - break; - case 's': - nSec = ParseStringInteger(value, j, nSkip, 2); - i += 2; - j += nSkip; - break; - case 't': - bPm = (j + 1 < value.GetLength() && value.GetAt(j) == 'p' && - value.GetAt(j + 1) == 'm'); - i += 2; - j += 2; - break; - } - } else if (remaining == 2 || format.GetAt(i + 3) != c) { - switch (c) { - case 'm': { - CFX_WideString sMonth = ParseStringString(value, j, nSkip); - FX_BOOL bFind = FALSE; - for (int m = 0; m < 12; m++) { - if (sMonth.CompareNoCase(months[m]) == 0) { - nMonth = m + 1; - i += 3; - j += nSkip; - bFind = TRUE; - break; - } - } - - if (!bFind) { - nMonth = ParseStringInteger(value, j, nSkip, 3); - i += 3; - j += nSkip; - } - } break; - case 'y': - break; - default: - i += 3; - j += 3; - break; - } - } else if (remaining == 3 || format.GetAt(i + 4) != c) { - switch (c) { - case 'y': - nYear = ParseStringInteger(value, j, nSkip, 4); - j += nSkip; - i += 4; - break; - case 'm': { - FX_BOOL bFind = FALSE; - - CFX_WideString sMonth = ParseStringString(value, j, nSkip); - sMonth.MakeLower(); - - for (int m = 0; m < 12; m++) { - CFX_WideString sFullMonths = fullmonths[m]; - sFullMonths.MakeLower(); - - if (sFullMonths.Find(sMonth.c_str(), 0) != -1) { - nMonth = m + 1; - i += 4; - j += nSkip; - bFind = TRUE; - break; - } - } - - if (!bFind) { - nMonth = ParseStringInteger(value, j, nSkip, 4); - i += 4; - j += nSkip; - } - } break; - default: - i += 4; - j += 4; - break; - } - } else { - if (j >= value.GetLength() || format.GetAt(i) != value.GetAt(j)) { - bBadFormat = true; - bExit = TRUE; - } - i++; - j++; - } - - if (oldj == j) { - bBadFormat = true; - bExit = TRUE; - } - } - - break; - default: - if (value.GetLength() <= j) { - bExit = TRUE; - } else if (format.GetAt(i) != value.GetAt(j)) { - bBadFormat = true; - bExit = TRUE; - } - - i++; - j++; - break; - } - } - - if (bPm) - nHour += 12; - - if (nYear >= 0 && nYear <= nYearSub) - nYear += 2000; - - if (nMonth < 1 || nMonth > 12) - bBadFormat = true; - - if (nDay < 1 || nDay > 31) - bBadFormat = true; - - if (nHour < 0 || nHour > 24) - bBadFormat = true; - - if (nMin < 0 || nMin > 60) - bBadFormat = true; - - if (nSec < 0 || nSec > 60) - bBadFormat = true; - - double dRet = 0; - - if (bBadFormat) { - dRet = ParseNormalDate(value, &bBadFormat); - } else { - dRet = JS_MakeDate(JS_MakeDay(nYear, nMonth - 1, nDay), - JS_MakeTime(nHour, nMin, nSec, 0)); - - if (JS_PortIsNan(dRet)) { - dRet = JS_DateParse(value.c_str()); - } - } - - if (JS_PortIsNan(dRet)) { - dRet = ParseNormalDate(value, &bBadFormat); - } - - if (bWrongFormat) - *bWrongFormat = bBadFormat; - return dRet; -} - -CFX_WideString CJS_PublicMethods::MakeFormatDate(double dDate, - const CFX_WideString& format) { - CFX_WideString sRet = L"", sPart = L""; - - int nYear = JS_GetYearFromTime(dDate); - int nMonth = JS_GetMonthFromTime(dDate) + 1; - int nDay = JS_GetDayFromTime(dDate); - int nHour = JS_GetHourFromTime(dDate); - int nMin = JS_GetMinFromTime(dDate); - int nSec = JS_GetSecFromTime(dDate); - - int i = 0; - while (i < format.GetLength()) { - FX_WCHAR c = format.GetAt(i); - int remaining = format.GetLength() - i - 1; - sPart = L""; - switch (c) { - case 'y': - case 'm': - case 'd': - case 'H': - case 'h': - case 'M': - case 's': - case 't': - if (remaining == 0 || format.GetAt(i + 1) != c) { - switch (c) { - case 'y': - sPart += c; - break; - case 'm': - sPart.Format(L"%d", nMonth); - break; - case 'd': - sPart.Format(L"%d", nDay); - break; - case 'H': - sPart.Format(L"%d", nHour); - break; - case 'h': - sPart.Format(L"%d", nHour > 12 ? nHour - 12 : nHour); - break; - case 'M': - sPart.Format(L"%d", nMin); - break; - case 's': - sPart.Format(L"%d", nSec); - break; - case 't': - sPart += nHour > 12 ? 'p' : 'a'; - break; - } - i++; - } else if (remaining == 1 || format.GetAt(i + 2) != c) { - switch (c) { - case 'y': - sPart.Format(L"%02d", nYear - (nYear / 100) * 100); - break; - case 'm': - sPart.Format(L"%02d", nMonth); - break; - case 'd': - sPart.Format(L"%02d", nDay); - break; - case 'H': - sPart.Format(L"%02d", nHour); - break; - case 'h': - sPart.Format(L"%02d", nHour > 12 ? nHour - 12 : nHour); - break; - case 'M': - sPart.Format(L"%02d", nMin); - break; - case 's': - sPart.Format(L"%02d", nSec); - break; - case 't': - sPart = nHour > 12 ? L"pm" : L"am"; - break; - } - i += 2; - } else if (remaining == 2 || format.GetAt(i + 3) != c) { - switch (c) { - case 'm': - i += 3; - if (nMonth > 0 && nMonth <= 12) - sPart += months[nMonth - 1]; - break; - default: - i += 3; - sPart += c; - sPart += c; - sPart += c; - break; - } - } else if (remaining == 3 || format.GetAt(i + 4) != c) { - switch (c) { - case 'y': - sPart.Format(L"%04d", nYear); - i += 4; - break; - case 'm': - i += 4; - if (nMonth > 0 && nMonth <= 12) - sPart += fullmonths[nMonth - 1]; - break; - default: - i += 4; - sPart += c; - sPart += c; - sPart += c; - sPart += c; - break; - } - } else { - i++; - sPart += c; - } - break; - default: - i++; - sPart += c; - break; - } - - sRet += sPart; - } - - return sRet; -} - -/* -------------------------------------------------------------------------- */ - -// function AFNumber_Format(nDec, sepStyle, negStyle, currStyle, strCurrency, -// bCurrencyPrepend) -FX_BOOL CJS_PublicMethods::AFNumber_Format(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { -#if _FX_OS_ != _FX_ANDROID_ - CJS_Context* pContext = (CJS_Context*)cc; - if (params.size() != 6) { - sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR); - return FALSE; - } - - CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc); - CJS_EventHandler* pEvent = pContext->GetEventHandler(); - if (!pEvent->m_pValue) - return FALSE; - - CFX_WideString& Value = pEvent->Value(); - CFX_ByteString strValue = StrTrim(CFX_ByteString::FromUnicode(Value)); - if (strValue.IsEmpty()) - return TRUE; - - int iDec = params[0].ToInt(); - int iSepStyle = params[1].ToInt(); - int iNegStyle = params[2].ToInt(); - // params[3] is iCurrStyle, it's not used. - std::wstring wstrCurrency(params[4].ToCFXWideString().c_str()); - FX_BOOL bCurrencyPrepend = params[5].ToBool(); - - if (iDec < 0) - iDec = -iDec; - - if (iSepStyle < 0 || iSepStyle > 3) - iSepStyle = 0; - - if (iNegStyle < 0 || iNegStyle > 3) - iNegStyle = 0; - - ////////////////////////////////////////////////////// - // for processing decimal places - strValue.Replace(",", "."); - double dValue = atof(strValue); - if (iDec > 0) - dValue += DOUBLE_CORRECT; - - int iDec2; - int iNegative = 0; - - strValue = fcvt(dValue, iDec, &iDec2, &iNegative); - if (strValue.IsEmpty()) { - dValue = 0; - strValue = fcvt(dValue, iDec, &iDec2, &iNegative); - if (strValue.IsEmpty()) { - strValue = "0"; - iDec2 = 1; - } - } - - if (iDec2 < 0) { - for (int iNum = 0; iNum < abs(iDec2); iNum++) { - strValue = "0" + strValue; - } - iDec2 = 0; - } - int iMax = strValue.GetLength(); - if (iDec2 > iMax) { - for (int iNum = 0; iNum <= iDec2 - iMax; iNum++) { - strValue += "0"; - } - iMax = iDec2 + 1; - } - /////////////////////////////////////////////////////// - // for processing seperator style - if (iDec2 < iMax) { - if (iSepStyle == 0 || iSepStyle == 1) { - strValue.Insert(iDec2, '.'); - iMax++; - } else if (iSepStyle == 2 || iSepStyle == 3) { - strValue.Insert(iDec2, ','); - iMax++; - } - - if (iDec2 == 0) - strValue.Insert(iDec2, '0'); - } - if (iSepStyle == 0 || iSepStyle == 2) { - char cSeperator; - if (iSepStyle == 0) - cSeperator = ','; - else - cSeperator = '.'; - - for (int iDecPositive = iDec2 - 3; iDecPositive > 0; iDecPositive -= 3) { - strValue.Insert(iDecPositive, cSeperator); - iMax++; - } - } - - ////////////////////////////////////////////////////////////////////// - // for processing currency string - - Value = CFX_WideString::FromLocal(strValue); - std::wstring strValue2 = Value.c_str(); - - if (bCurrencyPrepend) - strValue2 = wstrCurrency + strValue2; - else - strValue2 = strValue2 + wstrCurrency; - - ///////////////////////////////////////////////////////////////////////// - // for processing negative style - if (iNegative) { - if (iNegStyle == 0) { - strValue2.insert(0, L"-"); - } - if (iNegStyle == 2 || iNegStyle == 3) { - strValue2.insert(0, L"("); - strValue2.insert(strValue2.length(), L")"); - } - if (iNegStyle == 1 || iNegStyle == 3) { - if (Field* fTarget = pEvent->Target_Field()) { - CJS_Array arColor(pRuntime); - CJS_Value vColElm(pRuntime); - vColElm = L"RGB"; - arColor.SetElement(0, vColElm); - vColElm = 1; - arColor.SetElement(1, vColElm); - vColElm = 0; - arColor.SetElement(2, vColElm); - - arColor.SetElement(3, vColElm); - - CJS_PropValue vProp(pRuntime); - vProp.StartGetting(); - vProp << arColor; - vProp.StartSetting(); - fTarget->textColor(cc, vProp, sError); // red - } - } - } else { - if (iNegStyle == 1 || iNegStyle == 3) { - if (Field* fTarget = pEvent->Target_Field()) { - CJS_Array arColor(pRuntime); - CJS_Value vColElm(pRuntime); - vColElm = L"RGB"; - arColor.SetElement(0, vColElm); - vColElm = 0; - arColor.SetElement(1, vColElm); - arColor.SetElement(2, vColElm); - arColor.SetElement(3, vColElm); - - CJS_PropValue vProp(pRuntime); - vProp.StartGetting(); - fTarget->textColor(cc, vProp, sError); - - CJS_Array aProp(pRuntime); - vProp.ConvertToArray(aProp); - - CPWL_Color crProp; - CPWL_Color crColor; - color::ConvertArrayToPWLColor(aProp, crProp); - color::ConvertArrayToPWLColor(arColor, crColor); - - if (crColor != crProp) { - CJS_PropValue vProp2(pRuntime); - vProp2.StartGetting(); - vProp2 << arColor; - vProp2.StartSetting(); - fTarget->textColor(cc, vProp2, sError); - } - } - } - } - Value = strValue2.c_str(); -#endif - return TRUE; -} - -// function AFNumber_Keystroke(nDec, sepStyle, negStyle, currStyle, strCurrency, -// bCurrencyPrepend) -FX_BOOL CJS_PublicMethods::AFNumber_Keystroke( - IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - CJS_Context* pContext = (CJS_Context*)cc; - CJS_EventHandler* pEvent = pContext->GetEventHandler(); - - if (params.size() < 2) - return FALSE; - int iSepStyle = params[1].ToInt(); - - if (iSepStyle < 0 || iSepStyle > 3) - iSepStyle = 0; - if (!pEvent->m_pValue) - return FALSE; - CFX_WideString& val = pEvent->Value(); - CFX_WideString& w_strChange = pEvent->Change(); - CFX_WideString w_strValue = val; - - if (pEvent->WillCommit()) { - CFX_WideString wstrChange = w_strChange; - CFX_WideString wstrValue = StrLTrim(w_strValue.c_str()); - if (wstrValue.IsEmpty()) - return TRUE; - - CFX_WideString swTemp = wstrValue; - swTemp.Replace(L",", L"."); - if (!IsNumber(swTemp.c_str())) { - pEvent->Rc() = FALSE; - sError = JSGetStringFromID(pContext, IDS_STRING_JSAFNUMBER_KEYSTROKE); - Alert(pContext, sError.c_str()); - return TRUE; - } - return TRUE; // it happens after the last keystroke and before validating, - } - - std::wstring w_strValue2 = w_strValue.c_str(); - std::wstring w_strChange2 = w_strChange.c_str(); - std::wstring w_strSelected; - if (-1 != pEvent->SelStart()) - w_strSelected = w_strValue2.substr(pEvent->SelStart(), - (pEvent->SelEnd() - pEvent->SelStart())); - bool bHasSign = (w_strValue2.find('-') != std::wstring::npos) && - (w_strSelected.find('-') == std::wstring::npos); - if (bHasSign) { - // can't insert "change" in front to sign postion. - if (pEvent->SelStart() == 0) { - FX_BOOL& bRc = pEvent->Rc(); - bRc = FALSE; - return TRUE; - } - } - - char cSep = L'.'; - - switch (iSepStyle) { - case 0: - case 1: - cSep = L'.'; - break; - case 2: - case 3: - cSep = L','; - break; - } - - bool bHasSep = (w_strValue2.find(cSep) != std::wstring::npos); - for (std::wstring::iterator it = w_strChange2.begin(); - it != w_strChange2.end(); it++) { - if (*it == cSep) { - if (bHasSep) { - FX_BOOL& bRc = pEvent->Rc(); - bRc = FALSE; - return TRUE; - } - bHasSep = TRUE; - continue; - } - if (*it == L'-') { - if (bHasSign) { - FX_BOOL& bRc = pEvent->Rc(); - bRc = FALSE; - return TRUE; - } - // sign's position is not correct - if (it != w_strChange2.begin()) { - FX_BOOL& bRc = pEvent->Rc(); - bRc = FALSE; - return TRUE; - } - if (pEvent->SelStart() != 0) { - FX_BOOL& bRc = pEvent->Rc(); - bRc = FALSE; - return TRUE; - } - bHasSign = TRUE; - continue; - } - - if (!FXSYS_iswdigit(*it)) { - FX_BOOL& bRc = pEvent->Rc(); - bRc = FALSE; - return TRUE; - } - } - - std::wstring w_prefix = w_strValue2.substr(0, pEvent->SelStart()); - std::wstring w_postfix; - if (pEvent->SelEnd() < (int)w_strValue2.length()) - w_postfix = w_strValue2.substr(pEvent->SelEnd()); - w_strValue2 = w_prefix + w_strChange2 + w_postfix; - w_strValue = w_strValue2.c_str(); - val = w_strValue; - return TRUE; -} - -// function AFPercent_Format(nDec, sepStyle) -FX_BOOL CJS_PublicMethods::AFPercent_Format( - IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { -#if _FX_OS_ != _FX_ANDROID_ - CJS_Context* pContext = (CJS_Context*)cc; - CJS_EventHandler* pEvent = pContext->GetEventHandler(); - - if (params.size() != 2) { - sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR); - return FALSE; - } - if (!pEvent->m_pValue) - return FALSE; - - CFX_WideString& Value = pEvent->Value(); - CFX_ByteString strValue = StrTrim(CFX_ByteString::FromUnicode(Value)); - if (strValue.IsEmpty()) - return TRUE; - - int iDec = params[0].ToInt(); - if (iDec < 0) - iDec = -iDec; - - int iSepStyle = params[1].ToInt(); - if (iSepStyle < 0 || iSepStyle > 3) - iSepStyle = 0; - - ////////////////////////////////////////////////////// - // for processing decimal places - double dValue = atof(strValue); - dValue *= 100; - if (iDec > 0) - dValue += DOUBLE_CORRECT; - - int iDec2; - int iNegative = 0; - strValue = fcvt(dValue, iDec, &iDec2, &iNegative); - if (strValue.IsEmpty()) { - dValue = 0; - strValue = fcvt(dValue, iDec, &iDec2, &iNegative); - } - - if (iDec2 < 0) { - for (int iNum = 0; iNum < abs(iDec2); iNum++) { - strValue = "0" + strValue; - } - iDec2 = 0; - } - int iMax = strValue.GetLength(); - if (iDec2 > iMax) { - for (int iNum = 0; iNum <= iDec2 - iMax; iNum++) { - strValue += "0"; - } - iMax = iDec2 + 1; - } - /////////////////////////////////////////////////////// - // for processing seperator style - if (iDec2 < iMax) { - if (iSepStyle == 0 || iSepStyle == 1) { - strValue.Insert(iDec2, '.'); - iMax++; - } else if (iSepStyle == 2 || iSepStyle == 3) { - strValue.Insert(iDec2, ','); - iMax++; - } - - if (iDec2 == 0) - strValue.Insert(iDec2, '0'); - } - if (iSepStyle == 0 || iSepStyle == 2) { - char cSeperator; - if (iSepStyle == 0) - cSeperator = ','; - else - cSeperator = '.'; - - for (int iDecPositive = iDec2 - 3; iDecPositive > 0; iDecPositive -= 3) { - strValue.Insert(iDecPositive, cSeperator); - iMax++; - } - } - //////////////////////////////////////////////////////////////////// - // negative mark - if (iNegative) - strValue = "-" + strValue; - strValue += "%"; - Value = CFX_WideString::FromLocal(strValue); -#endif - return TRUE; -} -// AFPercent_Keystroke(nDec, sepStyle) -FX_BOOL CJS_PublicMethods::AFPercent_Keystroke( - IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - return AFNumber_Keystroke(cc, params, vRet, sError); -} - -// function AFDate_FormatEx(cFormat) -FX_BOOL CJS_PublicMethods::AFDate_FormatEx(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - CJS_Context* pContext = (CJS_Context*)cc; - CJS_EventHandler* pEvent = pContext->GetEventHandler(); - - if (params.size() != 1) { - sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR); - return FALSE; - } - if (!pEvent->m_pValue) - return FALSE; - - CFX_WideString& val = pEvent->Value(); - CFX_WideString strValue = val; - if (strValue.IsEmpty()) - return TRUE; - - CFX_WideString sFormat = params[0].ToCFXWideString(); - double dDate = 0.0f; - - if (strValue.Find(L"GMT") != -1) { - // for GMT format time - // such as "Tue Aug 11 14:24:16 GMT+08002009" - dDate = MakeInterDate(strValue); - } else { - dDate = MakeRegularDate(strValue, sFormat, nullptr); - } - - if (JS_PortIsNan(dDate)) { - CFX_WideString swMsg; - swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSPARSEDATE).c_str(), - sFormat.c_str()); - Alert(pContext, swMsg.c_str()); - return FALSE; - } - - val = MakeFormatDate(dDate, sFormat); - return TRUE; -} - -double CJS_PublicMethods::MakeInterDate(CFX_WideString strValue) { - std::vector<CFX_WideString> wsArray; - CFX_WideString sTemp = L""; - for (int i = 0; i < strValue.GetLength(); ++i) { - FX_WCHAR c = strValue.GetAt(i); - if (c == L' ' || c == L':') { - wsArray.push_back(sTemp); - sTemp = L""; - continue; - } - sTemp += c; - } - wsArray.push_back(sTemp); - if (wsArray.size() != 8) - return 0; - - int nMonth = 1; - sTemp = wsArray[1]; - if (sTemp.Compare(L"Jan") == 0) - nMonth = 1; - else if (sTemp.Compare(L"Feb") == 0) - nMonth = 2; - else if (sTemp.Compare(L"Mar") == 0) - nMonth = 3; - else if (sTemp.Compare(L"Apr") == 0) - nMonth = 4; - else if (sTemp.Compare(L"May") == 0) - nMonth = 5; - else if (sTemp.Compare(L"Jun") == 0) - nMonth = 6; - else if (sTemp.Compare(L"Jul") == 0) - nMonth = 7; - else if (sTemp.Compare(L"Aug") == 0) - nMonth = 8; - else if (sTemp.Compare(L"Sep") == 0) - nMonth = 9; - else if (sTemp.Compare(L"Oct") == 0) - nMonth = 10; - else if (sTemp.Compare(L"Nov") == 0) - nMonth = 11; - else if (sTemp.Compare(L"Dec") == 0) - nMonth = 12; - - int nDay = FX_atof(wsArray[2]); - int nHour = FX_atof(wsArray[3]); - int nMin = FX_atof(wsArray[4]); - int nSec = FX_atof(wsArray[5]); - int nYear = FX_atof(wsArray[7]); - double dRet = JS_MakeDate(JS_MakeDay(nYear, nMonth - 1, nDay), - JS_MakeTime(nHour, nMin, nSec, 0)); - if (JS_PortIsNan(dRet)) - dRet = JS_DateParse(strValue.c_str()); - - return dRet; -} - -// AFDate_KeystrokeEx(cFormat) -FX_BOOL CJS_PublicMethods::AFDate_KeystrokeEx( - IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - CJS_Context* pContext = (CJS_Context*)cc; - CJS_EventHandler* pEvent = pContext->GetEventHandler(); - - if (params.size() != 1) { - sError = L"AFDate_KeystrokeEx's parameters' size r not correct"; - return FALSE; - } - - if (pEvent->WillCommit()) { - if (!pEvent->m_pValue) - return FALSE; - CFX_WideString strValue = pEvent->Value(); - if (strValue.IsEmpty()) - return TRUE; - - CFX_WideString sFormat = params[0].ToCFXWideString(); - bool bWrongFormat = FALSE; - double dRet = MakeRegularDate(strValue, sFormat, &bWrongFormat); - if (bWrongFormat || JS_PortIsNan(dRet)) { - CFX_WideString swMsg; - swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSPARSEDATE).c_str(), - sFormat.c_str()); - Alert(pContext, swMsg.c_str()); - pEvent->Rc() = FALSE; - return TRUE; - } - } - return TRUE; -} - -FX_BOOL CJS_PublicMethods::AFDate_Format(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - CJS_Context* pContext = (CJS_Context*)cc; - if (params.size() != 1) { - sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR); - return FALSE; - } - - int iIndex = params[0].ToInt(); - const FX_WCHAR* cFormats[] = {L"m/d", - L"m/d/yy", - L"mm/dd/yy", - L"mm/yy", - L"d-mmm", - L"d-mmm-yy", - L"dd-mmm-yy", - L"yy-mm-dd", - L"mmm-yy", - L"mmmm-yy", - L"mmm d, yyyy", - L"mmmm d, yyyy", - L"m/d/yy h:MM tt", - L"m/d/yy HH:MM"}; - - if (iIndex < 0 || (static_cast<size_t>(iIndex) >= FX_ArraySize(cFormats))) - iIndex = 0; - - std::vector<CJS_Value> newParams; - newParams.push_back( - CJS_Value(CJS_Runtime::FromContext(cc), cFormats[iIndex])); - return AFDate_FormatEx(cc, newParams, vRet, sError); -} - -// AFDate_KeystrokeEx(cFormat) -FX_BOOL CJS_PublicMethods::AFDate_Keystroke( - IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - CJS_Context* pContext = (CJS_Context*)cc; - if (params.size() != 1) { - sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR); - return FALSE; - } - - int iIndex = params[0].ToInt(); - const FX_WCHAR* cFormats[] = {L"m/d", - L"m/d/yy", - L"mm/dd/yy", - L"mm/yy", - L"d-mmm", - L"d-mmm-yy", - L"dd-mmm-yy", - L"yy-mm-dd", - L"mmm-yy", - L"mmmm-yy", - L"mmm d, yyyy", - L"mmmm d, yyyy", - L"m/d/yy h:MM tt", - L"m/d/yy HH:MM"}; - - if (iIndex < 0 || (static_cast<size_t>(iIndex) >= FX_ArraySize(cFormats))) - iIndex = 0; - - std::vector<CJS_Value> newParams; - newParams.push_back( - CJS_Value(CJS_Runtime::FromContext(cc), cFormats[iIndex])); - return AFDate_KeystrokeEx(cc, newParams, vRet, sError); -} - -// function AFTime_Format(ptf) -FX_BOOL CJS_PublicMethods::AFTime_Format(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - CJS_Context* pContext = (CJS_Context*)cc; - if (params.size() != 1) { - sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR); - return FALSE; - } - - int iIndex = params[0].ToInt(); - const FX_WCHAR* cFormats[] = {L"HH:MM", L"h:MM tt", L"HH:MM:ss", - L"h:MM:ss tt"}; - - if (iIndex < 0 || (static_cast<size_t>(iIndex) >= FX_ArraySize(cFormats))) - iIndex = 0; - - std::vector<CJS_Value> newParams; - newParams.push_back( - CJS_Value(CJS_Runtime::FromContext(cc), cFormats[iIndex])); - return AFDate_FormatEx(cc, newParams, vRet, sError); -} - -FX_BOOL CJS_PublicMethods::AFTime_Keystroke( - IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - CJS_Context* pContext = (CJS_Context*)cc; - if (params.size() != 1) { - sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR); - return FALSE; - } - - int iIndex = params[0].ToInt(); - const FX_WCHAR* cFormats[] = {L"HH:MM", L"h:MM tt", L"HH:MM:ss", - L"h:MM:ss tt"}; - - if (iIndex < 0 || (static_cast<size_t>(iIndex) >= FX_ArraySize(cFormats))) - iIndex = 0; - - std::vector<CJS_Value> newParams; - newParams.push_back( - CJS_Value(CJS_Runtime::FromContext(cc), cFormats[iIndex])); - return AFDate_KeystrokeEx(cc, newParams, vRet, sError); -} - -FX_BOOL CJS_PublicMethods::AFTime_FormatEx(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - return AFDate_FormatEx(cc, params, vRet, sError); -} - -FX_BOOL CJS_PublicMethods::AFTime_KeystrokeEx( - IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - return AFDate_KeystrokeEx(cc, params, vRet, sError); -} - -// function AFSpecial_Format(psf) -FX_BOOL CJS_PublicMethods::AFSpecial_Format( - IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - CJS_Context* pContext = (CJS_Context*)cc; - - if (params.size() != 1) { - sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR); - return FALSE; - } - - std::string cFormat; - int iIndex = params[0].ToInt(); - - CJS_EventHandler* pEvent = pContext->GetEventHandler(); - if (!pEvent->m_pValue) - return FALSE; - CFX_WideString& Value = pEvent->Value(); - std::string strSrc = CFX_ByteString::FromUnicode(Value).c_str(); - - switch (iIndex) { - case 0: - cFormat = "99999"; - break; - case 1: - cFormat = "99999-9999"; - break; - case 2: { - std::string NumberStr; - util::printx("9999999999", strSrc, NumberStr); - if (NumberStr.length() >= 10) - cFormat = "(999) 999-9999"; - else - cFormat = "999-9999"; - break; - } - case 3: - cFormat = "999-99-9999"; - break; - } - - std::string strDes; - util::printx(cFormat, strSrc, strDes); - Value = CFX_WideString::FromLocal(strDes.c_str()); - return TRUE; -} - -// function AFSpecial_KeystrokeEx(mask) -FX_BOOL CJS_PublicMethods::AFSpecial_KeystrokeEx( - IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - CJS_Context* pContext = (CJS_Context*)cc; - CJS_EventHandler* pEvent = pContext->GetEventHandler(); - - if (params.size() < 1) { - sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR); - return FALSE; - } - - if (!pEvent->m_pValue) - return FALSE; - CFX_WideString& valEvent = pEvent->Value(); - - CFX_WideString wstrMask = params[0].ToCFXWideString(); - if (wstrMask.IsEmpty()) - return TRUE; - - const size_t wstrMaskLen = wstrMask.GetLength(); - const std::wstring wstrValue = valEvent.c_str(); - - if (pEvent->WillCommit()) { - if (wstrValue.empty()) - return TRUE; - size_t iIndexMask = 0; - for (const auto& w_Value : wstrValue) { - if (!maskSatisfied(w_Value, wstrMask[iIndexMask])) - break; - iIndexMask++; - } - - if (iIndexMask != wstrMaskLen || - (iIndexMask != wstrValue.size() && wstrMaskLen != 0)) { - Alert( - pContext, - JSGetStringFromID(pContext, IDS_STRING_JSAFNUMBER_KEYSTROKE).c_str()); - pEvent->Rc() = FALSE; - } - return TRUE; - } - - CFX_WideString& wideChange = pEvent->Change(); - std::wstring wChange = wideChange.c_str(); - if (wChange.empty()) - return TRUE; - - int iIndexMask = pEvent->SelStart(); - - size_t combined_len = wstrValue.length() + wChange.length() - - (pEvent->SelEnd() - pEvent->SelStart()); - if (combined_len > wstrMaskLen) { - Alert(pContext, - JSGetStringFromID(pContext, IDS_STRING_JSPARAM_TOOLONG).c_str()); - pEvent->Rc() = FALSE; - return TRUE; - } - - if (iIndexMask >= wstrMaskLen && (!wChange.empty())) { - Alert(pContext, - JSGetStringFromID(pContext, IDS_STRING_JSPARAM_TOOLONG).c_str()); - pEvent->Rc() = FALSE; - return TRUE; - } - - for (std::wstring::iterator it = wChange.begin(); it != wChange.end(); it++) { - if (iIndexMask >= wstrMaskLen) { - Alert(pContext, - JSGetStringFromID(pContext, IDS_STRING_JSPARAM_TOOLONG).c_str()); - pEvent->Rc() = FALSE; - return TRUE; - } - wchar_t w_Mask = wstrMask[iIndexMask]; - if (!isReservedMaskChar(w_Mask)) { - *it = w_Mask; - } - wchar_t w_Change = *it; - if (!maskSatisfied(w_Change, w_Mask)) { - pEvent->Rc() = FALSE; - return TRUE; - } - iIndexMask++; - } - - wideChange = wChange.c_str(); - return TRUE; -} - -// function AFSpecial_Keystroke(psf) -FX_BOOL CJS_PublicMethods::AFSpecial_Keystroke( - IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - CJS_Context* pContext = (CJS_Context*)cc; - if (params.size() != 1) { - sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR); - return FALSE; - } - - CJS_EventHandler* pEvent = pContext->GetEventHandler(); - if (!pEvent->m_pValue) - return FALSE; - - std::string cFormat; - int iIndex = params[0].ToInt(); - CFX_WideString& val = pEvent->Value(); - std::string strSrc = CFX_ByteString::FromUnicode(val).c_str(); - std::wstring wstrChange = pEvent->Change().c_str(); - - switch (iIndex) { - case 0: - cFormat = "99999"; - break; - case 1: - // cFormat = "99999-9999"; - cFormat = "999999999"; - break; - case 2: { - std::string NumberStr; - util::printx("9999999999", strSrc, NumberStr); - if (strSrc.length() + wstrChange.length() > 7) - // cFormat = "(999) 999-9999"; - cFormat = "9999999999"; - else - // cFormat = "999-9999"; - cFormat = "9999999"; - break; - } - case 3: - // cFormat = "999-99-9999"; - cFormat = "999999999"; - break; - } - - std::vector<CJS_Value> params2; - params2.push_back(CJS_Value(CJS_Runtime::FromContext(cc), cFormat.c_str())); - return AFSpecial_KeystrokeEx(cc, params2, vRet, sError); -} - -FX_BOOL CJS_PublicMethods::AFMergeChange(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - CJS_Context* pContext = (CJS_Context*)cc; - CJS_EventHandler* pEventHandler = pContext->GetEventHandler(); - - if (params.size() != 1) { - sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR); - return FALSE; - } - - CFX_WideString swValue; - if (pEventHandler->m_pValue) - swValue = pEventHandler->Value(); - - if (pEventHandler->WillCommit()) { - vRet = swValue.c_str(); - return TRUE; - } - - CFX_WideString prefix, postfix; - - if (pEventHandler->SelStart() >= 0) - prefix = swValue.Mid(0, pEventHandler->SelStart()); - else - prefix = L""; - - if (pEventHandler->SelEnd() >= 0 && - pEventHandler->SelEnd() <= swValue.GetLength()) - postfix = swValue.Mid(pEventHandler->SelEnd(), - swValue.GetLength() - pEventHandler->SelEnd()); - else - postfix = L""; - - vRet = (prefix + pEventHandler->Change() + postfix).c_str(); - - return TRUE; -} - -FX_BOOL CJS_PublicMethods::AFParseDateEx(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - CJS_Context* pContext = (CJS_Context*)cc; - ASSERT(pContext); - - if (params.size() != 2) { - sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR); - return FALSE; - } - - CFX_WideString sValue = params[0].ToCFXWideString(); - CFX_WideString sFormat = params[1].ToCFXWideString(); - - double dDate = MakeRegularDate(sValue, sFormat, nullptr); - - if (JS_PortIsNan(dDate)) { - CFX_WideString swMsg; - swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSPARSEDATE).c_str(), - sFormat.c_str()); - Alert((CJS_Context*)cc, swMsg.c_str()); - return FALSE; - } - - vRet = dDate; - return TRUE; -} - -FX_BOOL CJS_PublicMethods::AFSimple(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - if (params.size() != 3) { - CJS_Context* pContext = (CJS_Context*)cc; - ASSERT(pContext); - - sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR); - return FALSE; - } - - vRet = (double)AF_Simple(params[0].ToCFXWideString().c_str(), - params[1].ToDouble(), params[2].ToDouble()); - return TRUE; -} - -FX_BOOL CJS_PublicMethods::AFMakeNumber(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - CJS_Context* pContext = (CJS_Context*)cc; - if (params.size() != 1) { - sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR); - return FALSE; - } - CFX_WideString ws = params[0].ToCFXWideString(); - ws.Replace(L",", L"."); - vRet = ws; - vRet.MaybeCoerceToNumber(); - if (vRet.GetType() != CJS_Value::VT_number) - vRet = 0; - return TRUE; -} - -FX_BOOL CJS_PublicMethods::AFSimple_Calculate( - IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - CJS_Context* pContext = (CJS_Context*)cc; - if (params.size() != 2) { - sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR); - return FALSE; - } - - CJS_Value params1 = params[1]; - if (!params1.IsArrayObject() && params1.GetType() != CJS_Value::VT_string) { - sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR); - return FALSE; - } - - CPDFSDK_Document* pReaderDoc = pContext->GetReaderDocument(); - CPDFSDK_InterForm* pReaderInterForm = pReaderDoc->GetInterForm(); - CPDF_InterForm* pInterForm = pReaderInterForm->GetInterForm(); - - CFX_WideString sFunction = params[0].ToCFXWideString(); - double dValue = wcscmp(sFunction.c_str(), L"PRD") == 0 ? 1.0 : 0.0; - - CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc); - CJS_Array FieldNameArray = AF_MakeArrayFromList(pRuntime, params1); - int nFieldsCount = 0; - - for (int i = 0, isz = FieldNameArray.GetLength(); i < isz; i++) { - CJS_Value jsValue(pRuntime); - FieldNameArray.GetElement(i, jsValue); - CFX_WideString wsFieldName = jsValue.ToCFXWideString(); - - for (int j = 0, jsz = pInterForm->CountFields(wsFieldName); j < jsz; j++) { - if (CPDF_FormField* pFormField = pInterForm->GetField(j, wsFieldName)) { - double dTemp = 0.0; - switch (pFormField->GetFieldType()) { - case FIELDTYPE_TEXTFIELD: - case FIELDTYPE_COMBOBOX: { - CFX_WideString trimmed = pFormField->GetValue(); - trimmed.TrimRight(); - trimmed.TrimLeft(); - dTemp = FX_atof(trimmed); - } break; - case FIELDTYPE_PUSHBUTTON: { - dTemp = 0.0; - } break; - case FIELDTYPE_CHECKBOX: - case FIELDTYPE_RADIOBUTTON: { - dTemp = 0.0; - for (int c = 0, csz = pFormField->CountControls(); c < csz; c++) { - if (CPDF_FormControl* pFormCtrl = pFormField->GetControl(c)) { - if (pFormCtrl->IsChecked()) { - CFX_WideString trimmed = pFormCtrl->GetExportValue(); - trimmed.TrimRight(); - trimmed.TrimLeft(); - dTemp = FX_atof(trimmed); - break; - } - } - } - } break; - case FIELDTYPE_LISTBOX: { - if (pFormField->CountSelectedItems() <= 1) { - CFX_WideString trimmed = pFormField->GetValue(); - trimmed.TrimRight(); - trimmed.TrimLeft(); - dTemp = FX_atof(trimmed); - } - } break; - default: - break; - } - - if (i == 0 && j == 0 && (wcscmp(sFunction.c_str(), L"MIN") == 0 || - wcscmp(sFunction.c_str(), L"MAX") == 0)) - dValue = dTemp; - - dValue = AF_Simple(sFunction.c_str(), dValue, dTemp); - - nFieldsCount++; - } - } - } - - if (wcscmp(sFunction.c_str(), L"AVG") == 0 && nFieldsCount > 0) - dValue /= nFieldsCount; - - dValue = (double)floor(dValue * FXSYS_pow((double)10, (double)6) + 0.49) / - FXSYS_pow((double)10, (double)6); - CJS_Value jsValue(pRuntime, dValue); - if (pContext->GetEventHandler()->m_pValue) - pContext->GetEventHandler()->Value() = jsValue.ToCFXWideString(); - - return TRUE; -} - -/* This function validates the current event to ensure that its value is -** within the specified range. */ - -FX_BOOL CJS_PublicMethods::AFRange_Validate( - IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - CJS_Context* pContext = (CJS_Context*)cc; - CJS_EventHandler* pEvent = pContext->GetEventHandler(); - - if (params.size() != 4) { - sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR); - return FALSE; - } - - if (!pEvent->m_pValue) - return FALSE; - if (pEvent->Value().IsEmpty()) - return TRUE; - double dEentValue = atof(CFX_ByteString::FromUnicode(pEvent->Value())); - FX_BOOL bGreaterThan = params[0].ToBool(); - double dGreaterThan = params[1].ToDouble(); - FX_BOOL bLessThan = params[2].ToBool(); - double dLessThan = params[3].ToDouble(); - CFX_WideString swMsg; - - if (bGreaterThan && bLessThan) { - if (dEentValue < dGreaterThan || dEentValue > dLessThan) - swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSRANGE1).c_str(), - params[1].ToCFXWideString().c_str(), - params[3].ToCFXWideString().c_str()); - } else if (bGreaterThan) { - if (dEentValue < dGreaterThan) - swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSRANGE2).c_str(), - params[1].ToCFXWideString().c_str()); - } else if (bLessThan) { - if (dEentValue > dLessThan) - swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSRANGE3).c_str(), - params[3].ToCFXWideString().c_str()); - } - - if (!swMsg.IsEmpty()) { - Alert(pContext, swMsg.c_str()); - pEvent->Rc() = FALSE; - } - return TRUE; -} - -FX_BOOL CJS_PublicMethods::AFExtractNums(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - CJS_Context* pContext = (CJS_Context*)cc; - if (params.size() != 1) { - sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR); - return FALSE; - } - - CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc); - CJS_Array nums(pRuntime); - - CFX_WideString str = params[0].ToCFXWideString(); - CFX_WideString sPart; - - if (str.GetAt(0) == L'.' || str.GetAt(0) == L',') - str = L"0" + str; - - int nIndex = 0; - for (int i = 0, sz = str.GetLength(); i < sz; i++) { - FX_WCHAR wc = str.GetAt(i); - if (FXSYS_iswdigit(wc)) { - sPart += wc; - } else { - if (sPart.GetLength() > 0) { - nums.SetElement(nIndex, CJS_Value(pRuntime, sPart.c_str())); - sPart = L""; - nIndex++; - } - } - } - - if (sPart.GetLength() > 0) { - nums.SetElement(nIndex, CJS_Value(pRuntime, sPart.c_str())); - } - - if (nums.GetLength() > 0) - vRet = nums; - else - vRet.SetNull(); - - return TRUE; -} diff --git a/fpdfsdk/src/javascript/PublicMethods.h b/fpdfsdk/src/javascript/PublicMethods.h deleted file mode 100644 index d0c81e03e3..0000000000 --- a/fpdfsdk/src/javascript/PublicMethods.h +++ /dev/null @@ -1,175 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef FPDFSDK_SRC_JAVASCRIPT_PUBLICMETHODS_H_ -#define FPDFSDK_SRC_JAVASCRIPT_PUBLICMETHODS_H_ - -#include <string> -#include <vector> - -#include "fpdfsdk/src/javascript/JS_Define.h" - -class CJS_PublicMethods : public CJS_Object { - public: - explicit CJS_PublicMethods(v8::Local<v8::Object> pObject) - : CJS_Object(pObject) {} - ~CJS_PublicMethods() override {} - - public: - static FX_BOOL AFNumber_Format(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - static FX_BOOL AFNumber_Keystroke(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - static FX_BOOL AFPercent_Format(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - static FX_BOOL AFPercent_Keystroke(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - static FX_BOOL AFDate_FormatEx(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - static FX_BOOL AFDate_KeystrokeEx(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - static FX_BOOL AFDate_Format(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - static FX_BOOL AFDate_Keystroke(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - static FX_BOOL AFTime_FormatEx(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); // - static FX_BOOL AFTime_KeystrokeEx(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - static FX_BOOL AFTime_Format(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - static FX_BOOL AFTime_Keystroke(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - static FX_BOOL AFSpecial_Format(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - static FX_BOOL AFSpecial_Keystroke(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - static FX_BOOL AFSpecial_KeystrokeEx(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); // - static FX_BOOL AFSimple(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - static FX_BOOL AFMakeNumber(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - static FX_BOOL AFSimple_Calculate(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - static FX_BOOL AFRange_Validate(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - static FX_BOOL AFMergeChange(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - static FX_BOOL AFParseDateEx(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - static FX_BOOL AFExtractNums(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - - public: - JS_STATIC_GLOBAL_FUN(AFNumber_Format); - JS_STATIC_GLOBAL_FUN(AFNumber_Keystroke); - JS_STATIC_GLOBAL_FUN(AFPercent_Format); - JS_STATIC_GLOBAL_FUN(AFPercent_Keystroke); - JS_STATIC_GLOBAL_FUN(AFDate_FormatEx); - JS_STATIC_GLOBAL_FUN(AFDate_KeystrokeEx); - JS_STATIC_GLOBAL_FUN(AFDate_Format); - JS_STATIC_GLOBAL_FUN(AFDate_Keystroke); - JS_STATIC_GLOBAL_FUN(AFTime_FormatEx); - JS_STATIC_GLOBAL_FUN(AFTime_KeystrokeEx); - JS_STATIC_GLOBAL_FUN(AFTime_Format); - JS_STATIC_GLOBAL_FUN(AFTime_Keystroke); - JS_STATIC_GLOBAL_FUN(AFSpecial_Format); - JS_STATIC_GLOBAL_FUN(AFSpecial_Keystroke); - JS_STATIC_GLOBAL_FUN(AFSpecial_KeystrokeEx); - JS_STATIC_GLOBAL_FUN(AFSimple); - JS_STATIC_GLOBAL_FUN(AFMakeNumber); - JS_STATIC_GLOBAL_FUN(AFSimple_Calculate); - JS_STATIC_GLOBAL_FUN(AFRange_Validate); - JS_STATIC_GLOBAL_FUN(AFMergeChange); - JS_STATIC_GLOBAL_FUN(AFParseDateEx); - JS_STATIC_GLOBAL_FUN(AFExtractNums); - - JS_STATIC_DECLARE_GLOBAL_FUN(); - - public: - static int ParseStringInteger(const CFX_WideString& string, - int nStart, - int& nSkip, - int nMaxStep); - static CFX_WideString ParseStringString(const CFX_WideString& string, - int nStart, - int& nSkip); - static double MakeRegularDate(const CFX_WideString& value, - const CFX_WideString& format, - bool* bWrongFormat); - static CFX_WideString MakeFormatDate(double dDate, - const CFX_WideString& format); - static double ParseNormalDate(const CFX_WideString& value, - bool* bWrongFormat); - static double MakeInterDate(CFX_WideString strValue); - - public: - static CFX_WideString StrLTrim(const FX_WCHAR* pStr); - static CFX_WideString StrRTrim(const FX_WCHAR* pStr); - static CFX_WideString StrTrim(const FX_WCHAR* pStr); - - static CFX_ByteString StrLTrim(const FX_CHAR* pStr); - static CFX_ByteString StrRTrim(const FX_CHAR* pStr); - static CFX_ByteString StrTrim(const FX_CHAR* pStr); - - static FX_BOOL IsNumber(const FX_CHAR* string); - static FX_BOOL IsNumber(const FX_WCHAR* string); - - static FX_BOOL maskSatisfied(wchar_t c_Change, wchar_t c_Mask); - static FX_BOOL isReservedMaskChar(wchar_t ch); - - static double AF_Simple(const FX_WCHAR* sFuction, - double dValue1, - double dValue2); - static CJS_Array AF_MakeArrayFromList(CJS_Runtime* pRuntime, CJS_Value val); -}; - -#endif // FPDFSDK_SRC_JAVASCRIPT_PUBLICMETHODS_H_ diff --git a/fpdfsdk/src/javascript/app.cpp b/fpdfsdk/src/javascript/app.cpp deleted file mode 100644 index 767555ff3b..0000000000 --- a/fpdfsdk/src/javascript/app.cpp +++ /dev/null @@ -1,750 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "fpdfsdk/src/javascript/app.h" - -#include <memory> -#include <vector> - -#include "fpdfsdk/include/fsdk_mgr.h" -#include "fpdfsdk/include/javascript/IJavaScript.h" -#include "fpdfsdk/src/javascript/Document.h" -#include "fpdfsdk/src/javascript/JS_Context.h" -#include "fpdfsdk/src/javascript/JS_Define.h" -#include "fpdfsdk/src/javascript/JS_EventHandler.h" -#include "fpdfsdk/src/javascript/JS_Object.h" -#include "fpdfsdk/src/javascript/JS_Runtime.h" -#include "fpdfsdk/src/javascript/JS_Value.h" -#include "fpdfsdk/src/javascript/resource.h" - -BEGIN_JS_STATIC_CONST(CJS_TimerObj) -END_JS_STATIC_CONST() - -BEGIN_JS_STATIC_PROP(CJS_TimerObj) -END_JS_STATIC_PROP() - -BEGIN_JS_STATIC_METHOD(CJS_TimerObj) -END_JS_STATIC_METHOD() - -IMPLEMENT_JS_CLASS(CJS_TimerObj, TimerObj) - -TimerObj::TimerObj(CJS_Object* pJSObject) - : CJS_EmbedObj(pJSObject), m_pTimer(NULL) {} - -TimerObj::~TimerObj() {} - -void TimerObj::SetTimer(CJS_Timer* pTimer) { - m_pTimer = pTimer; -} - -CJS_Timer* TimerObj::GetTimer() const { - return m_pTimer; -} - -#define JS_STR_VIEWERTYPE L"pdfium" -#define JS_STR_VIEWERVARIATION L"Full" -#define JS_STR_PLATFORM L"WIN" -#define JS_STR_LANGUANGE L"ENU" -#define JS_NUM_VIEWERVERSION 8 -#ifdef PDF_ENABLE_XFA -#define JS_NUM_VIEWERVERSION_XFA 11 -#endif // PDF_ENABLE_XFA -#define JS_NUM_FORMSVERSION 7 - -BEGIN_JS_STATIC_CONST(CJS_App) -END_JS_STATIC_CONST() - -BEGIN_JS_STATIC_PROP(CJS_App) -JS_STATIC_PROP_ENTRY(activeDocs) -JS_STATIC_PROP_ENTRY(calculate) -JS_STATIC_PROP_ENTRY(formsVersion) -JS_STATIC_PROP_ENTRY(fs) -JS_STATIC_PROP_ENTRY(fullscreen) -JS_STATIC_PROP_ENTRY(language) -JS_STATIC_PROP_ENTRY(media) -JS_STATIC_PROP_ENTRY(platform) -JS_STATIC_PROP_ENTRY(runtimeHighlight) -JS_STATIC_PROP_ENTRY(viewerType) -JS_STATIC_PROP_ENTRY(viewerVariation) -JS_STATIC_PROP_ENTRY(viewerVersion) -END_JS_STATIC_PROP() - -BEGIN_JS_STATIC_METHOD(CJS_App) -JS_STATIC_METHOD_ENTRY(alert) -JS_STATIC_METHOD_ENTRY(beep) -JS_STATIC_METHOD_ENTRY(browseForDoc) -JS_STATIC_METHOD_ENTRY(clearInterval) -JS_STATIC_METHOD_ENTRY(clearTimeOut) -JS_STATIC_METHOD_ENTRY(execDialog) -JS_STATIC_METHOD_ENTRY(execMenuItem) -JS_STATIC_METHOD_ENTRY(findComponent) -JS_STATIC_METHOD_ENTRY(goBack) -JS_STATIC_METHOD_ENTRY(goForward) -JS_STATIC_METHOD_ENTRY(launchURL) -JS_STATIC_METHOD_ENTRY(mailMsg) -JS_STATIC_METHOD_ENTRY(newFDF) -JS_STATIC_METHOD_ENTRY(newDoc) -JS_STATIC_METHOD_ENTRY(openDoc) -JS_STATIC_METHOD_ENTRY(openFDF) -JS_STATIC_METHOD_ENTRY(popUpMenuEx) -JS_STATIC_METHOD_ENTRY(popUpMenu) -JS_STATIC_METHOD_ENTRY(response) -JS_STATIC_METHOD_ENTRY(setInterval) -JS_STATIC_METHOD_ENTRY(setTimeOut) -END_JS_STATIC_METHOD() - -IMPLEMENT_JS_CLASS(CJS_App, app) - -app::app(CJS_Object* pJSObject) - : CJS_EmbedObj(pJSObject), m_bCalculate(true), m_bRuntimeHighLight(false) {} - -app::~app() { - for (int i = 0, sz = m_aTimer.GetSize(); i < sz; i++) - delete m_aTimer[i]; - - m_aTimer.RemoveAll(); -} - -FX_BOOL app::activeDocs(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - if (!vp.IsGetting()) - return FALSE; - - CJS_Context* pContext = (CJS_Context*)cc; - CPDFDoc_Environment* pApp = pContext->GetReaderApp(); - CJS_Runtime* pRuntime = pContext->GetJSRuntime(); - CPDFSDK_Document* pCurDoc = pContext->GetReaderDocument(); - CJS_Array aDocs(pRuntime); - if (CPDFSDK_Document* pDoc = pApp->GetSDKDocument()) { - CJS_Document* pJSDocument = NULL; - if (pDoc == pCurDoc) { - v8::Local<v8::Object> pObj = FXJS_GetThisObj(pRuntime->GetIsolate()); - if (FXJS_GetObjDefnID(pObj) == CJS_Document::g_nObjDefnID) - pJSDocument = - (CJS_Document*)FXJS_GetPrivate(pRuntime->GetIsolate(), pObj); - } else { - v8::Local<v8::Object> pObj = FXJS_NewFxDynamicObj( - pRuntime->GetIsolate(), pRuntime, CJS_Document::g_nObjDefnID); - pJSDocument = - (CJS_Document*)FXJS_GetPrivate(pRuntime->GetIsolate(), pObj); - ASSERT(pJSDocument); - } - aDocs.SetElement(0, CJS_Value(pRuntime, pJSDocument)); - } - if (aDocs.GetLength() > 0) - vp << aDocs; - else - vp.SetNull(); - - return TRUE; -} - -FX_BOOL app::calculate(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - if (vp.IsSetting()) { - bool bVP; - vp >> bVP; - m_bCalculate = (FX_BOOL)bVP; - - CJS_Context* pContext = (CJS_Context*)cc; - CPDFDoc_Environment* pApp = pContext->GetReaderApp(); - CJS_Runtime* pRuntime = pContext->GetJSRuntime(); - CJS_Array aDocs(pRuntime); - if (CPDFSDK_Document* pDoc = pApp->GetSDKDocument()) - pDoc->GetInterForm()->EnableCalculate((FX_BOOL)m_bCalculate); - } else { - vp << (bool)m_bCalculate; - } - return TRUE; -} - -FX_BOOL app::formsVersion(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - if (vp.IsGetting()) { - vp << JS_NUM_FORMSVERSION; - return TRUE; - } - - return FALSE; -} - -FX_BOOL app::viewerType(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - if (vp.IsGetting()) { - vp << JS_STR_VIEWERTYPE; - return TRUE; - } - - return FALSE; -} - -FX_BOOL app::viewerVariation(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - if (vp.IsGetting()) { - vp << JS_STR_VIEWERVARIATION; - return TRUE; - } - - return FALSE; -} - -FX_BOOL app::viewerVersion(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - if (!vp.IsGetting()) - return FALSE; -#ifdef PDF_ENABLE_XFA - CJS_Context* pContext = (CJS_Context*)cc; - CPDFSDK_Document* pCurDoc = pContext->GetReaderDocument(); - CPDFXFA_Document* pDoc = pCurDoc->GetXFADocument(); - if (pDoc->GetDocType() == 1 || pDoc->GetDocType() == 2) { - vp << JS_NUM_VIEWERVERSION_XFA; - return TRUE; - } -#endif // PDF_ENABLE_XFA - vp << JS_NUM_VIEWERVERSION; - return TRUE; -} - -FX_BOOL app::platform(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - if (!vp.IsGetting()) - return FALSE; -#ifdef PDF_ENABLE_XFA - CPDFDoc_Environment* pEnv = - static_cast<CJS_Context*>(cc)->GetJSRuntime()->GetReaderApp(); - if (!pEnv) - return FALSE; - CFX_WideString platfrom = pEnv->FFI_GetPlatform(); - if (!platfrom.IsEmpty()) { - vp << platfrom; - return TRUE; - } -#endif - vp << JS_STR_PLATFORM; - return TRUE; -} - -FX_BOOL app::language(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - if (!vp.IsGetting()) - return FALSE; -#ifdef PDF_ENABLE_XFA - CPDFDoc_Environment* pEnv = - static_cast<CJS_Context*>(cc)->GetJSRuntime()->GetReaderApp(); - if (!pEnv) - return FALSE; - CFX_WideString language = pEnv->FFI_GetLanguage(); - if (!language.IsEmpty()) { - vp << language; - return TRUE; - } -#endif - vp << JS_STR_LANGUANGE; - return TRUE; -} - -// creates a new fdf object that contains no data -// comment: need reader support -// note: -// CFDF_Document * CPDFDoc_Environment::NewFDF(); -FX_BOOL app::newFDF(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - return TRUE; -} -// opens a specified pdf document and returns its document object -// comment:need reader support -// note: as defined in js reference, the proto of this function's fourth -// parmeters, how old an fdf document while do not show it. -// CFDF_Document * CPDFDoc_Environment::OpenFDF(string strPath,bool bUserConv); - -FX_BOOL app::openFDF(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - return TRUE; -} - -FX_BOOL app::alert(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - CJS_Context* pContext = static_cast<CJS_Context*>(cc); - CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc); - std::vector<CJS_Value> newParams = JS_ExpandKeywordParams( - pRuntime, params, 4, L"cMsg", L"nIcon", L"nType", L"cTitle"); - - if (newParams[0].GetType() == CJS_Value::VT_unknown) { - sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR); - return FALSE; - } - - CFX_WideString swMsg; - if (newParams[0].GetType() == CJS_Value::VT_object) { - CJS_Array carray(pRuntime); - if (newParams[0].ConvertToArray(carray)) { - swMsg = L"["; - CJS_Value element(pRuntime); - for (int i = 0; i < carray.GetLength(); ++i) { - if (i) - swMsg += L", "; - carray.GetElement(i, element); - swMsg += element.ToCFXWideString(); - } - swMsg += L"]"; - } else { - swMsg = newParams[0].ToCFXWideString(); - } - } else { - swMsg = newParams[0].ToCFXWideString(); - } - - int iIcon = 0; - if (newParams[1].GetType() != CJS_Value::VT_unknown) - iIcon = newParams[1].ToInt(); - - int iType = 0; - if (newParams[2].GetType() != CJS_Value::VT_unknown) - iType = newParams[2].ToInt(); - - CFX_WideString swTitle; - if (newParams[3].GetType() != CJS_Value::VT_unknown) - swTitle = newParams[3].ToCFXWideString(); - else - swTitle = JSGetStringFromID(pContext, IDS_STRING_JSALERT); - - pRuntime->BeginBlock(); - vRet = MsgBox(pRuntime->GetReaderApp(), swMsg.c_str(), swTitle.c_str(), iType, - iIcon); - pRuntime->EndBlock(); - return TRUE; -} - -FX_BOOL app::beep(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - if (params.size() == 1) { - CJS_Context* pContext = (CJS_Context*)cc; - CJS_Runtime* pRuntime = pContext->GetJSRuntime(); - CPDFDoc_Environment* pEnv = pRuntime->GetReaderApp(); - pEnv->JS_appBeep(params[0].ToInt()); - return TRUE; - } - - sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPARAMERROR); - return FALSE; -} - -FX_BOOL app::findComponent(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - return TRUE; -} - -FX_BOOL app::popUpMenuEx(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - return FALSE; -} - -FX_BOOL app::fs(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError) { - return FALSE; -} - -FX_BOOL app::setInterval(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - CJS_Context* pContext = (CJS_Context*)cc; - if (params.size() > 2 || params.size() == 0) { - sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR); - return FALSE; - } - - CFX_WideString script = params.size() > 0 ? params[0].ToCFXWideString() : L""; - if (script.IsEmpty()) { - sError = JSGetStringFromID(pContext, IDS_STRING_JSAFNUMBER_KEYSTROKE); - return TRUE; - } - - CJS_Runtime* pRuntime = pContext->GetJSRuntime(); - FX_DWORD dwInterval = params.size() > 1 ? params[1].ToInt() : 1000; - - CPDFDoc_Environment* pApp = pRuntime->GetReaderApp(); - ASSERT(pApp); - CJS_Timer* pTimer = - new CJS_Timer(this, pApp, pRuntime, 0, script, dwInterval, 0); - m_aTimer.Add(pTimer); - - v8::Local<v8::Object> pRetObj = FXJS_NewFxDynamicObj( - pRuntime->GetIsolate(), pRuntime, CJS_TimerObj::g_nObjDefnID); - CJS_TimerObj* pJS_TimerObj = - (CJS_TimerObj*)FXJS_GetPrivate(pRuntime->GetIsolate(), pRetObj); - TimerObj* pTimerObj = (TimerObj*)pJS_TimerObj->GetEmbedObject(); - pTimerObj->SetTimer(pTimer); - - vRet = pRetObj; - return TRUE; -} - -FX_BOOL app::setTimeOut(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - if (params.size() > 2 || params.size() == 0) { - sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPARAMERROR); - return FALSE; - } - - CJS_Context* pContext = (CJS_Context*)cc; - CJS_Runtime* pRuntime = pContext->GetJSRuntime(); - - CFX_WideString script = params.size() > 0 ? params[0].ToCFXWideString() : L""; - if (script.IsEmpty()) { - sError = - JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSAFNUMBER_KEYSTROKE); - return TRUE; - } - - FX_DWORD dwTimeOut = params.size() > 1 ? params[1].ToInt() : 1000; - - CPDFDoc_Environment* pApp = pRuntime->GetReaderApp(); - ASSERT(pApp); - - CJS_Timer* pTimer = - new CJS_Timer(this, pApp, pRuntime, 1, script, dwTimeOut, dwTimeOut); - m_aTimer.Add(pTimer); - - v8::Local<v8::Object> pRetObj = FXJS_NewFxDynamicObj( - pRuntime->GetIsolate(), pRuntime, CJS_TimerObj::g_nObjDefnID); - CJS_TimerObj* pJS_TimerObj = - (CJS_TimerObj*)FXJS_GetPrivate(pRuntime->GetIsolate(), pRetObj); - TimerObj* pTimerObj = (TimerObj*)pJS_TimerObj->GetEmbedObject(); - pTimerObj->SetTimer(pTimer); - - vRet = pRetObj; - return TRUE; -} - -FX_BOOL app::clearTimeOut(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - CJS_Context* pContext = (CJS_Context*)cc; - if (params.size() != 1) { - sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR); - return FALSE; - } - - if (params[0].GetType() == CJS_Value::VT_fxobject) { - v8::Local<v8::Object> pObj = params[0].ToV8Object(); - if (FXJS_GetObjDefnID(pObj) == CJS_TimerObj::g_nObjDefnID) { - if (CJS_Object* pJSObj = params[0].ToCJSObject()) { - if (TimerObj* pTimerObj = (TimerObj*)pJSObj->GetEmbedObject()) { - if (CJS_Timer* pTimer = pTimerObj->GetTimer()) { - pTimer->KillJSTimer(); - - for (int i = 0, sz = m_aTimer.GetSize(); i < sz; i++) { - if (m_aTimer[i] == pTimer) { - m_aTimer.RemoveAt(i); - break; - } - } - - delete pTimer; - pTimerObj->SetTimer(NULL); - } - } - } - } - } - - return TRUE; -} - -FX_BOOL app::clearInterval(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - CJS_Context* pContext = (CJS_Context*)cc; - if (params.size() != 1) { - sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR); - return FALSE; - } - - if (params[0].GetType() == CJS_Value::VT_fxobject) { - v8::Local<v8::Object> pObj = params[0].ToV8Object(); - if (FXJS_GetObjDefnID(pObj) == CJS_TimerObj::g_nObjDefnID) { - if (CJS_Object* pJSObj = params[0].ToCJSObject()) { - if (TimerObj* pTimerObj = (TimerObj*)pJSObj->GetEmbedObject()) { - if (CJS_Timer* pTimer = pTimerObj->GetTimer()) { - pTimer->KillJSTimer(); - - for (int i = 0, sz = m_aTimer.GetSize(); i < sz; i++) { - if (m_aTimer[i] == pTimer) { - m_aTimer.RemoveAt(i); - break; - } - } - - delete pTimer; - pTimerObj->SetTimer(NULL); - } - } - } - } - } - - return TRUE; -} - -FX_BOOL app::execMenuItem(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - return FALSE; -} - -void app::TimerProc(CJS_Timer* pTimer) { - CJS_Runtime* pRuntime = pTimer->GetRuntime(); - - switch (pTimer->GetType()) { - case 0: // interval - if (pRuntime) - RunJsScript(pRuntime, pTimer->GetJScript()); - break; - case 1: - if (pTimer->GetTimeOut() > 0) { - if (pRuntime) - RunJsScript(pRuntime, pTimer->GetJScript()); - pTimer->KillJSTimer(); - } - break; - } -} - -void app::RunJsScript(CJS_Runtime* pRuntime, const CFX_WideString& wsScript) { - if (!pRuntime->IsBlocking()) { - IJS_Context* pContext = pRuntime->NewContext(); - pContext->OnExternal_Exec(); - CFX_WideString wtInfo; - pContext->RunScript(wsScript, &wtInfo); - pRuntime->ReleaseContext(pContext); - } -} - -FX_BOOL app::goBack(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - // Not supported. - return TRUE; -} - -FX_BOOL app::goForward(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - // Not supported. - return TRUE; -} - -FX_BOOL app::mailMsg(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - CJS_Context* pContext = static_cast<CJS_Context*>(cc); - CJS_Runtime* pRuntime = pContext->GetJSRuntime(); - std::vector<CJS_Value> newParams = - JS_ExpandKeywordParams(pRuntime, params, 6, L"bUI", L"cTo", L"cCc", - L"cBcc", L"cSubject", L"cMsg"); - - if (newParams[0].GetType() == CJS_Value::VT_unknown) { - sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR); - return FALSE; - } - bool bUI = newParams[0].ToBool(); - - CFX_WideString cTo; - if (newParams[1].GetType() != CJS_Value::VT_unknown) { - cTo = newParams[1].ToCFXWideString(); - } else { - if (!bUI) { - // cTo parameter required when UI not invoked. - sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR); - return FALSE; - } - } - - CFX_WideString cCc; - if (newParams[2].GetType() != CJS_Value::VT_unknown) - cCc = newParams[2].ToCFXWideString(); - - CFX_WideString cBcc; - if (newParams[3].GetType() != CJS_Value::VT_unknown) - cBcc = newParams[3].ToCFXWideString(); - - CFX_WideString cSubject; - if (newParams[4].GetType() != CJS_Value::VT_unknown) - cSubject = newParams[4].ToCFXWideString(); - - CFX_WideString cMsg; - if (newParams[5].GetType() != CJS_Value::VT_unknown) - cMsg = newParams[5].ToCFXWideString(); - - pRuntime->BeginBlock(); - pContext->GetReaderApp()->JS_docmailForm(nullptr, 0, bUI, cTo.c_str(), - cSubject.c_str(), cCc.c_str(), - cBcc.c_str(), cMsg.c_str()); - pRuntime->EndBlock(); - return TRUE; -} - -FX_BOOL app::launchURL(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - // Unsafe, not supported. - return TRUE; -} - -FX_BOOL app::runtimeHighlight(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - if (vp.IsSetting()) { - vp >> m_bRuntimeHighLight; - } else { - vp << m_bRuntimeHighLight; - } - return TRUE; -} - -FX_BOOL app::fullscreen(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - return FALSE; -} - -FX_BOOL app::popUpMenu(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - return FALSE; -} - -FX_BOOL app::browseForDoc(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - // Unsafe, not supported. - return TRUE; -} - -CFX_WideString app::SysPathToPDFPath(const CFX_WideString& sOldPath) { - CFX_WideString sRet = L"/"; - - for (int i = 0, sz = sOldPath.GetLength(); i < sz; i++) { - wchar_t c = sOldPath.GetAt(i); - if (c == L':') { - } else { - if (c == L'\\') { - sRet += L"/"; - } else { - sRet += c; - } - } - } - - return sRet; -} - -FX_BOOL app::newDoc(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - return FALSE; -} - -FX_BOOL app::openDoc(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - return FALSE; -} - -FX_BOOL app::response(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - CJS_Context* pContext = static_cast<CJS_Context*>(cc); - CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc); - std::vector<CJS_Value> newParams = - JS_ExpandKeywordParams(pRuntime, params, 5, L"cQuestion", L"cTitle", - L"cDefault", L"bPassword", L"cLabel"); - - if (newParams[0].GetType() == CJS_Value::VT_unknown) { - sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR); - return FALSE; - } - CFX_WideString swQuestion = newParams[0].ToCFXWideString(); - - CFX_WideString swTitle = L"PDF"; - if (newParams[1].GetType() != CJS_Value::VT_unknown) - swTitle = newParams[1].ToCFXWideString(); - - CFX_WideString swDefault; - if (newParams[2].GetType() != CJS_Value::VT_unknown) - swDefault = newParams[2].ToCFXWideString(); - - bool bPassword = false; - if (newParams[3].GetType() != CJS_Value::VT_unknown) - bPassword = newParams[3].ToBool(); - - CFX_WideString swLabel; - if (newParams[4].GetType() != CJS_Value::VT_unknown) - swLabel = newParams[4].ToCFXWideString(); - - const int MAX_INPUT_BYTES = 2048; - std::unique_ptr<char[]> pBuff(new char[MAX_INPUT_BYTES + 2]); - memset(pBuff.get(), 0, MAX_INPUT_BYTES + 2); - - int nLengthBytes = pContext->GetReaderApp()->JS_appResponse( - swQuestion.c_str(), swTitle.c_str(), swDefault.c_str(), swLabel.c_str(), - bPassword, pBuff.get(), MAX_INPUT_BYTES); - - if (nLengthBytes < 0 || nLengthBytes > MAX_INPUT_BYTES) { - sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAM_TOOLONG); - return FALSE; - } - - vRet = CFX_WideString::FromUTF16LE(reinterpret_cast<uint16_t*>(pBuff.get()), - nLengthBytes / sizeof(uint16_t)) - .c_str(); - return TRUE; -} - -FX_BOOL app::media(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError) { - return FALSE; -} - -FX_BOOL app::execDialog(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - return TRUE; -} diff --git a/fpdfsdk/src/javascript/app.h b/fpdfsdk/src/javascript/app.h deleted file mode 100644 index faebcbd5ce..0000000000 --- a/fpdfsdk/src/javascript/app.h +++ /dev/null @@ -1,211 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef FPDFSDK_SRC_JAVASCRIPT_APP_H_ -#define FPDFSDK_SRC_JAVASCRIPT_APP_H_ - -#include <vector> - -#include "fpdfsdk/src/javascript/JS_Define.h" - -class CJS_Runtime; -class CJS_Timer; - -class TimerObj : public CJS_EmbedObj { - public: - TimerObj(CJS_Object* pJSObject); - ~TimerObj() override; - - public: - void SetTimer(CJS_Timer* pTimer); - CJS_Timer* GetTimer() const; - - private: - CJS_Timer* m_pTimer; -}; - -class CJS_TimerObj : public CJS_Object { - public: - CJS_TimerObj(v8::Local<v8::Object> pObject) : CJS_Object(pObject) {} - ~CJS_TimerObj() override {} - - DECLARE_JS_CLASS(); -}; - -class app : public CJS_EmbedObj { - public: - app(CJS_Object* pJSObject); - ~app() override; - - public: - FX_BOOL activeDocs(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError); - FX_BOOL calculate(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL formsVersion(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError); - FX_BOOL fs(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL fullscreen(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError); - FX_BOOL language(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL media(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL platform(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL runtimeHighlight(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError); - FX_BOOL viewerType(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError); - FX_BOOL viewerVariation(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError); - FX_BOOL viewerVersion(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError); - - FX_BOOL alert(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL beep(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL browseForDoc(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL clearInterval(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL clearTimeOut(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL execDialog(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL execMenuItem(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL findComponent(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL goBack(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL goForward(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL launchURL(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL mailMsg(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL newFDF(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL newDoc(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL openDoc(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL openFDF(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL popUpMenuEx(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL popUpMenu(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL response(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL setInterval(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL setTimeOut(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - - static CFX_WideString SysPathToPDFPath(const CFX_WideString& sOldPath); - - private: - // CJS_EmbedObj - void TimerProc(CJS_Timer* pTimer) override; - void RunJsScript(CJS_Runtime* pRuntime, const CFX_WideString& wsScript); - - bool m_bCalculate; - bool m_bRuntimeHighLight; - CFX_ArrayTemplate<CJS_Timer*> m_aTimer; -}; - -class CJS_App : public CJS_Object { - public: - explicit CJS_App(v8::Local<v8::Object> pObject) : CJS_Object(pObject) {} - ~CJS_App() override {} - - DECLARE_JS_CLASS(); - - JS_STATIC_PROP(activeDocs, app); - JS_STATIC_PROP(calculate, app); - JS_STATIC_PROP(formsVersion, app); - JS_STATIC_PROP(fs, app); - JS_STATIC_PROP(fullscreen, app); - JS_STATIC_PROP(language, app); - JS_STATIC_PROP(media, app); - JS_STATIC_PROP(platform, app); - JS_STATIC_PROP(runtimeHighlight, app); - JS_STATIC_PROP(viewerType, app); - JS_STATIC_PROP(viewerVariation, app); - JS_STATIC_PROP(viewerVersion, app); - - JS_STATIC_METHOD(alert, app); - JS_STATIC_METHOD(beep, app); - JS_STATIC_METHOD(browseForDoc, app); - JS_STATIC_METHOD(clearInterval, app); - JS_STATIC_METHOD(clearTimeOut, app); - JS_STATIC_METHOD(execDialog, app); - JS_STATIC_METHOD(execMenuItem, app); - JS_STATIC_METHOD(findComponent, app); - JS_STATIC_METHOD(goBack, app); - JS_STATIC_METHOD(goForward, app); - JS_STATIC_METHOD(launchURL, app); - JS_STATIC_METHOD(mailMsg, app); - JS_STATIC_METHOD(newFDF, app); - JS_STATIC_METHOD(newDoc, app); - JS_STATIC_METHOD(openDoc, app); - JS_STATIC_METHOD(openFDF, app); - JS_STATIC_METHOD(popUpMenuEx, app); - JS_STATIC_METHOD(popUpMenu, app); - JS_STATIC_METHOD(response, app); - JS_STATIC_METHOD(setInterval, app); - JS_STATIC_METHOD(setTimeOut, app); -}; - -#endif // FPDFSDK_SRC_JAVASCRIPT_APP_H_ diff --git a/fpdfsdk/src/javascript/color.cpp b/fpdfsdk/src/javascript/color.cpp deleted file mode 100644 index 4339b4eccf..0000000000 --- a/fpdfsdk/src/javascript/color.cpp +++ /dev/null @@ -1,224 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "fpdfsdk/src/javascript/color.h" - -#include <vector> - -#include "fpdfsdk/include/javascript/IJavaScript.h" -#include "fpdfsdk/src/javascript/JS_Context.h" -#include "fpdfsdk/src/javascript/JS_Define.h" -#include "fpdfsdk/src/javascript/JS_EventHandler.h" -#include "fpdfsdk/src/javascript/JS_Object.h" -#include "fpdfsdk/src/javascript/JS_Runtime.h" -#include "fpdfsdk/src/javascript/JS_Value.h" - -/* -------------------------- color -------------------------- */ - -BEGIN_JS_STATIC_CONST(CJS_Color) -END_JS_STATIC_CONST() - -BEGIN_JS_STATIC_PROP(CJS_Color) -JS_STATIC_PROP_ENTRY(black) -JS_STATIC_PROP_ENTRY(blue) -JS_STATIC_PROP_ENTRY(cyan) -JS_STATIC_PROP_ENTRY(dkGray) -JS_STATIC_PROP_ENTRY(gray) -JS_STATIC_PROP_ENTRY(green) -JS_STATIC_PROP_ENTRY(ltGray) -JS_STATIC_PROP_ENTRY(magenta) -JS_STATIC_PROP_ENTRY(red) -JS_STATIC_PROP_ENTRY(transparent) -JS_STATIC_PROP_ENTRY(white) -JS_STATIC_PROP_ENTRY(yellow) -END_JS_STATIC_PROP() - -BEGIN_JS_STATIC_METHOD(CJS_Color) -JS_STATIC_METHOD_ENTRY(convert) -JS_STATIC_METHOD_ENTRY(equal) -END_JS_STATIC_METHOD() - -IMPLEMENT_JS_CLASS(CJS_Color, color) - -color::color(CJS_Object* pJSObject) : CJS_EmbedObj(pJSObject) { - m_crTransparent = CPWL_Color(COLORTYPE_TRANSPARENT); - m_crBlack = CPWL_Color(COLORTYPE_GRAY, 0); - m_crWhite = CPWL_Color(COLORTYPE_GRAY, 1); - m_crRed = CPWL_Color(COLORTYPE_RGB, 1, 0, 0); - m_crGreen = CPWL_Color(COLORTYPE_RGB, 0, 1, 0); - m_crBlue = CPWL_Color(COLORTYPE_RGB, 0, 0, 1); - m_crCyan = CPWL_Color(COLORTYPE_CMYK, 1, 0, 0, 0); - m_crMagenta = CPWL_Color(COLORTYPE_CMYK, 0, 1, 0, 0); - m_crYellow = CPWL_Color(COLORTYPE_CMYK, 0, 0, 1, 0); - m_crDKGray = CPWL_Color(COLORTYPE_GRAY, 0.25); - m_crGray = CPWL_Color(COLORTYPE_GRAY, 0.5); - m_crLTGray = CPWL_Color(COLORTYPE_GRAY, 0.75); -} - -color::~color() { -} - -void color::ConvertPWLColorToArray(const CPWL_Color& color, CJS_Array& array) { - switch (color.nColorType) { - case COLORTYPE_TRANSPARENT: - array.SetElement(0, CJS_Value(array.GetJSRuntime(), "T")); - break; - case COLORTYPE_GRAY: - array.SetElement(0, CJS_Value(array.GetJSRuntime(), "G")); - array.SetElement(1, CJS_Value(array.GetJSRuntime(), color.fColor1)); - break; - case COLORTYPE_RGB: - array.SetElement(0, CJS_Value(array.GetJSRuntime(), "RGB")); - array.SetElement(1, CJS_Value(array.GetJSRuntime(), color.fColor1)); - array.SetElement(2, CJS_Value(array.GetJSRuntime(), color.fColor2)); - array.SetElement(3, CJS_Value(array.GetJSRuntime(), color.fColor3)); - break; - case COLORTYPE_CMYK: - array.SetElement(0, CJS_Value(array.GetJSRuntime(), "CMYK")); - array.SetElement(1, CJS_Value(array.GetJSRuntime(), color.fColor1)); - array.SetElement(2, CJS_Value(array.GetJSRuntime(), color.fColor2)); - array.SetElement(3, CJS_Value(array.GetJSRuntime(), color.fColor3)); - array.SetElement(4, CJS_Value(array.GetJSRuntime(), color.fColor4)); - break; - } -} - -void color::ConvertArrayToPWLColor(CJS_Array& array, CPWL_Color& color) { - int nArrayLen = array.GetLength(); - if (nArrayLen < 1) - return; - - CJS_Value value(array.GetJSRuntime()); - array.GetElement(0, value); - CFX_ByteString sSpace = value.ToCFXByteString(); - - double d1 = 0; - double d2 = 0; - double d3 = 0; - double d4 = 0; - - if (nArrayLen > 1) { - array.GetElement(1, value); - d1 = value.ToDouble(); - } - - if (nArrayLen > 2) { - array.GetElement(2, value); - d2 = value.ToDouble(); - } - - if (nArrayLen > 3) { - array.GetElement(3, value); - d3 = value.ToDouble(); - } - - if (nArrayLen > 4) { - array.GetElement(4, value); - d4 = value.ToDouble(); - } - - if (sSpace == "T") { - color = CPWL_Color(COLORTYPE_TRANSPARENT); - } else if (sSpace == "G") { - color = CPWL_Color(COLORTYPE_GRAY, (FX_FLOAT)d1); - } else if (sSpace == "RGB") { - color = CPWL_Color(COLORTYPE_RGB, (FX_FLOAT)d1, (FX_FLOAT)d2, (FX_FLOAT)d3); - } else if (sSpace == "CMYK") { - color = CPWL_Color(COLORTYPE_CMYK, (FX_FLOAT)d1, (FX_FLOAT)d2, (FX_FLOAT)d3, - (FX_FLOAT)d4); - } -} - -#define JS_IMPLEMENT_COLORPROP(prop, var) \ - FX_BOOL color::prop(IJS_Context* cc, CJS_PropValue& vp, \ - CFX_WideString& sError) { \ - CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc); \ - CJS_Array array(pRuntime); \ - if (vp.IsGetting()) { \ - ConvertPWLColorToArray(var, array); \ - vp << array; \ - } else { \ - if (!vp.ConvertToArray(array)) \ - return FALSE; \ - ConvertArrayToPWLColor(array, var); \ - } \ - return TRUE; \ - } - -JS_IMPLEMENT_COLORPROP(transparent, m_crTransparent) -JS_IMPLEMENT_COLORPROP(black, m_crBlack) -JS_IMPLEMENT_COLORPROP(white, m_crWhite) -JS_IMPLEMENT_COLORPROP(red, m_crRed) -JS_IMPLEMENT_COLORPROP(green, m_crGreen) -JS_IMPLEMENT_COLORPROP(blue, m_crBlue) -JS_IMPLEMENT_COLORPROP(cyan, m_crCyan) -JS_IMPLEMENT_COLORPROP(magenta, m_crMagenta) -JS_IMPLEMENT_COLORPROP(yellow, m_crYellow) -JS_IMPLEMENT_COLORPROP(dkGray, m_crDKGray) -JS_IMPLEMENT_COLORPROP(gray, m_crGray) -JS_IMPLEMENT_COLORPROP(ltGray, m_crLTGray) - -FX_BOOL color::convert(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - int iSize = params.size(); - if (iSize < 2) - return FALSE; - - CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc); - CJS_Array aSource(pRuntime); - if (!params[0].ConvertToArray(aSource)) - return FALSE; - - CPWL_Color crSource; - ConvertArrayToPWLColor(aSource, crSource); - - CFX_ByteString sDestSpace = params[1].ToCFXByteString(); - int nColorType = COLORTYPE_TRANSPARENT; - - if (sDestSpace == "T") { - nColorType = COLORTYPE_TRANSPARENT; - } else if (sDestSpace == "G") { - nColorType = COLORTYPE_GRAY; - } else if (sDestSpace == "RGB") { - nColorType = COLORTYPE_RGB; - } else if (sDestSpace == "CMYK") { - nColorType = COLORTYPE_CMYK; - } - - CJS_Array aDest(pRuntime); - CPWL_Color crDest = crSource; - crDest.ConvertColorType(nColorType); - ConvertPWLColorToArray(crDest, aDest); - vRet = aDest; - - return TRUE; -} - -FX_BOOL color::equal(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - if (params.size() < 2) - return FALSE; - - CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc); - CJS_Array array1(pRuntime); - CJS_Array array2(pRuntime); - if (!params[0].ConvertToArray(array1)) - return FALSE; - if (!params[1].ConvertToArray(array2)) - return FALSE; - - CPWL_Color color1; - CPWL_Color color2; - ConvertArrayToPWLColor(array1, color1); - ConvertArrayToPWLColor(array2, color2); - color1.ConvertColorType(color2.nColorType); - vRet = color1 == color2; - return TRUE; -} diff --git a/fpdfsdk/src/javascript/color.h b/fpdfsdk/src/javascript/color.h deleted file mode 100644 index 616337414d..0000000000 --- a/fpdfsdk/src/javascript/color.h +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef FPDFSDK_SRC_JAVASCRIPT_COLOR_H_ -#define FPDFSDK_SRC_JAVASCRIPT_COLOR_H_ - -#include <vector> - -#include "fpdfsdk/include/pdfwindow/PWL_Wnd.h" -#include "fpdfsdk/src/javascript/JS_Define.h" - -class color : public CJS_EmbedObj { - public: - color(CJS_Object* pJSObject); - ~color() override; - - FX_BOOL black(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL blue(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL cyan(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL dkGray(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL gray(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL green(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL ltGray(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL magenta(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL red(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL transparent(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError); - FX_BOOL white(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL yellow(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - - FX_BOOL convert(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL equal(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - - public: - static void ConvertPWLColorToArray(const CPWL_Color& color, CJS_Array& array); - static void ConvertArrayToPWLColor(CJS_Array& array, CPWL_Color& color); - - private: - CPWL_Color m_crTransparent; - CPWL_Color m_crBlack; - CPWL_Color m_crWhite; - CPWL_Color m_crRed; - CPWL_Color m_crGreen; - CPWL_Color m_crBlue; - CPWL_Color m_crCyan; - CPWL_Color m_crMagenta; - CPWL_Color m_crYellow; - CPWL_Color m_crDKGray; - CPWL_Color m_crGray; - CPWL_Color m_crLTGray; -}; - -class CJS_Color : public CJS_Object { - public: - CJS_Color(v8::Local<v8::Object> pObject) : CJS_Object(pObject) {} - ~CJS_Color() override {} - - DECLARE_JS_CLASS(); - - JS_STATIC_PROP(black, color); - JS_STATIC_PROP(blue, color); - JS_STATIC_PROP(cyan, color); - JS_STATIC_PROP(dkGray, color); - JS_STATIC_PROP(gray, color); - JS_STATIC_PROP(green, color); - JS_STATIC_PROP(ltGray, color); - JS_STATIC_PROP(magenta, color); - JS_STATIC_PROP(red, color); - JS_STATIC_PROP(transparent, color); - JS_STATIC_PROP(white, color); - JS_STATIC_PROP(yellow, color); - - JS_STATIC_METHOD(convert, color); - JS_STATIC_METHOD(equal, color); -}; - -#endif // FPDFSDK_SRC_JAVASCRIPT_COLOR_H_ diff --git a/fpdfsdk/src/javascript/console.cpp b/fpdfsdk/src/javascript/console.cpp deleted file mode 100644 index 8beb083f1e..0000000000 --- a/fpdfsdk/src/javascript/console.cpp +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "fpdfsdk/src/javascript/console.h" - -#include <vector> - -#include "fpdfsdk/include/javascript/IJavaScript.h" -#include "fpdfsdk/src/javascript/JS_Context.h" -#include "fpdfsdk/src/javascript/JS_Define.h" -#include "fpdfsdk/src/javascript/JS_EventHandler.h" -#include "fpdfsdk/src/javascript/JS_Object.h" -#include "fpdfsdk/src/javascript/JS_Value.h" - -/* ------------------------ console ------------------------ */ - -BEGIN_JS_STATIC_CONST(CJS_Console) -END_JS_STATIC_CONST() - -BEGIN_JS_STATIC_PROP(CJS_Console) -END_JS_STATIC_PROP() - -BEGIN_JS_STATIC_METHOD(CJS_Console) -JS_STATIC_METHOD_ENTRY(clear) -JS_STATIC_METHOD_ENTRY(hide) -JS_STATIC_METHOD_ENTRY(println) -JS_STATIC_METHOD_ENTRY(show) -END_JS_STATIC_METHOD() - -IMPLEMENT_JS_CLASS(CJS_Console, console) - -console::console(CJS_Object* pJSObject) : CJS_EmbedObj(pJSObject) {} - -console::~console() {} - -FX_BOOL console::clear(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - return TRUE; -} - -FX_BOOL console::hide(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - return TRUE; -} - -FX_BOOL console::println(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - if (params.size() < 1) { - return FALSE; - } - return TRUE; -} - -FX_BOOL console::show(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - return TRUE; -} diff --git a/fpdfsdk/src/javascript/console.h b/fpdfsdk/src/javascript/console.h deleted file mode 100644 index 651899bf4c..0000000000 --- a/fpdfsdk/src/javascript/console.h +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef FPDFSDK_SRC_JAVASCRIPT_CONSOLE_H_ -#define FPDFSDK_SRC_JAVASCRIPT_CONSOLE_H_ - -#include <vector> - -#include "fpdfsdk/src/javascript/JS_Define.h" - -class console : public CJS_EmbedObj { - public: - console(CJS_Object* pJSObject); - ~console() override; - - public: - FX_BOOL clear(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL hide(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL println(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL show(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); -}; - -class CJS_Console : public CJS_Object { - public: - CJS_Console(v8::Local<v8::Object> pObject) : CJS_Object(pObject) {} - ~CJS_Console() override {} - - DECLARE_JS_CLASS(); - - JS_STATIC_METHOD(clear, console); - JS_STATIC_METHOD(hide, console); - JS_STATIC_METHOD(println, console); - JS_STATIC_METHOD(show, console); -}; - -#endif // FPDFSDK_SRC_JAVASCRIPT_CONSOLE_H_ diff --git a/fpdfsdk/src/javascript/event.cpp b/fpdfsdk/src/javascript/event.cpp deleted file mode 100644 index f964908b9b..0000000000 --- a/fpdfsdk/src/javascript/event.cpp +++ /dev/null @@ -1,327 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "fpdfsdk/src/javascript/event.h" - -#include "fpdfsdk/include/javascript/IJavaScript.h" -#include "fpdfsdk/src/javascript/Field.h" -#include "fpdfsdk/src/javascript/JS_Context.h" -#include "fpdfsdk/src/javascript/JS_Define.h" -#include "fpdfsdk/src/javascript/JS_EventHandler.h" -#include "fpdfsdk/src/javascript/JS_Object.h" -#include "fpdfsdk/src/javascript/JS_Value.h" - -/* -------------------------- event -------------------------- */ - -BEGIN_JS_STATIC_CONST(CJS_Event) -END_JS_STATIC_CONST() - -BEGIN_JS_STATIC_PROP(CJS_Event) -JS_STATIC_PROP_ENTRY(change) -JS_STATIC_PROP_ENTRY(changeEx) -JS_STATIC_PROP_ENTRY(commitKey) -JS_STATIC_PROP_ENTRY(fieldFull) -JS_STATIC_PROP_ENTRY(keyDown) -JS_STATIC_PROP_ENTRY(modifier) -JS_STATIC_PROP_ENTRY(name) -JS_STATIC_PROP_ENTRY(rc) -JS_STATIC_PROP_ENTRY(richChange) -JS_STATIC_PROP_ENTRY(richChangeEx) -JS_STATIC_PROP_ENTRY(richValue) -JS_STATIC_PROP_ENTRY(selEnd) -JS_STATIC_PROP_ENTRY(selStart) -JS_STATIC_PROP_ENTRY(shift) -JS_STATIC_PROP_ENTRY(source) -JS_STATIC_PROP_ENTRY(target) -JS_STATIC_PROP_ENTRY(targetName) -JS_STATIC_PROP_ENTRY(type) -JS_STATIC_PROP_ENTRY(value) -JS_STATIC_PROP_ENTRY(willCommit) -END_JS_STATIC_PROP() - -BEGIN_JS_STATIC_METHOD(CJS_Event) -END_JS_STATIC_METHOD() - -IMPLEMENT_JS_CLASS(CJS_Event, event) - -event::event(CJS_Object* pJsObject) : CJS_EmbedObj(pJsObject) {} - -event::~event() { -} - -FX_BOOL event::change(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - CJS_Context* pContext = (CJS_Context*)cc; - CJS_EventHandler* pEvent = pContext->GetEventHandler(); - CFX_WideString& wChange = pEvent->Change(); - if (vp.IsSetting()) { - if (vp.GetType() == CJS_Value::VT_string) - vp >> wChange; - } else { - vp << wChange; - } - return TRUE; -} - -FX_BOOL event::changeEx(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - if (!vp.IsGetting()) - return FALSE; - - CJS_Context* pContext = (CJS_Context*)cc; - CJS_EventHandler* pEvent = pContext->GetEventHandler(); - - vp << pEvent->ChangeEx(); - return TRUE; -} - -FX_BOOL event::commitKey(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - if (!vp.IsGetting()) - return FALSE; - - CJS_Context* pContext = (CJS_Context*)cc; - CJS_EventHandler* pEvent = pContext->GetEventHandler(); - - vp << pEvent->CommitKey(); - return TRUE; -} - -FX_BOOL event::fieldFull(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - CJS_Context* pContext = (CJS_Context*)cc; - CJS_EventHandler* pEvent = pContext->GetEventHandler(); - - if (!vp.IsGetting() && - wcscmp((const wchar_t*)pEvent->Name(), L"Keystroke") != 0) - return FALSE; - - if (pEvent->FieldFull()) - vp << TRUE; - else - vp << FALSE; - return TRUE; -} - -FX_BOOL event::keyDown(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - if (!vp.IsGetting()) - return FALSE; - - CJS_Context* pContext = (CJS_Context*)cc; - CJS_EventHandler* pEvent = pContext->GetEventHandler(); - - if (pEvent->KeyDown()) - vp << TRUE; - else - vp << FALSE; - return TRUE; -} - -FX_BOOL event::modifier(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - if (!vp.IsGetting()) - return FALSE; - - CJS_Context* pContext = (CJS_Context*)cc; - CJS_EventHandler* pEvent = pContext->GetEventHandler(); - - if (pEvent->Modifier()) - vp << TRUE; - else - vp << FALSE; - return TRUE; -} - -FX_BOOL event::name(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - if (!vp.IsGetting()) - return FALSE; - - CJS_Context* pContext = (CJS_Context*)cc; - CJS_EventHandler* pEvent = pContext->GetEventHandler(); - - vp << pEvent->Name(); - return TRUE; -} - -FX_BOOL event::rc(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError) { - CJS_Context* pContext = (CJS_Context*)cc; - CJS_EventHandler* pEvent = pContext->GetEventHandler(); - - FX_BOOL& bRc = pEvent->Rc(); - if (vp.IsSetting()) { - vp >> bRc; - } else { - vp << bRc; - } - return TRUE; -} - -FX_BOOL event::richChange(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - return TRUE; -} - -FX_BOOL event::richChangeEx(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - return TRUE; -} - -FX_BOOL event::richValue(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - return TRUE; -} - -FX_BOOL event::selEnd(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - CJS_Context* pContext = (CJS_Context*)cc; - CJS_EventHandler* pEvent = pContext->GetEventHandler(); - - if (wcscmp((const wchar_t*)pEvent->Name(), L"Keystroke") != 0) { - return TRUE; - } - - int& iSelEnd = pEvent->SelEnd(); - if (vp.IsSetting()) { - vp >> iSelEnd; - } else { - vp << iSelEnd; - } - return TRUE; -} - -FX_BOOL event::selStart(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - CJS_Context* pContext = (CJS_Context*)cc; - CJS_EventHandler* pEvent = pContext->GetEventHandler(); - - if (wcscmp((const wchar_t*)pEvent->Name(), L"Keystroke") != 0) { - return TRUE; - } - int& iSelStart = pEvent->SelStart(); - if (vp.IsSetting()) { - vp >> iSelStart; - } else { - vp << iSelStart; - } - return TRUE; -} - -FX_BOOL event::shift(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - if (!vp.IsGetting()) - return FALSE; - - CJS_Context* pContext = (CJS_Context*)cc; - CJS_EventHandler* pEvent = pContext->GetEventHandler(); - - if (pEvent->Shift()) - vp << TRUE; - else - vp << FALSE; - return TRUE; -} - -FX_BOOL event::source(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - if (!vp.IsGetting()) - return FALSE; - - CJS_Context* pContext = (CJS_Context*)cc; - CJS_EventHandler* pEvent = pContext->GetEventHandler(); - - vp << pEvent->Source()->GetJSObject(); - return TRUE; -} - -FX_BOOL event::target(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - if (!vp.IsGetting()) - return FALSE; - - CJS_Context* pContext = (CJS_Context*)cc; - CJS_EventHandler* pEvent = pContext->GetEventHandler(); - - vp << pEvent->Target_Field()->GetJSObject(); - return TRUE; -} - -FX_BOOL event::targetName(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - if (!vp.IsGetting()) - return FALSE; - - CJS_Context* pContext = (CJS_Context*)cc; - CJS_EventHandler* pEvent = pContext->GetEventHandler(); - - vp << pEvent->TargetName(); - return TRUE; -} - -FX_BOOL event::type(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - if (!vp.IsGetting()) - return FALSE; - - CJS_Context* pContext = (CJS_Context*)cc; - CJS_EventHandler* pEvent = pContext->GetEventHandler(); - - vp << pEvent->Type(); - return TRUE; -} - -FX_BOOL event::value(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - CJS_Context* pContext = (CJS_Context*)cc; - CJS_EventHandler* pEvent = pContext->GetEventHandler(); - - if (wcscmp((const wchar_t*)pEvent->Type(), L"Field") != 0) - return FALSE; - if (!pEvent->m_pValue) - return FALSE; - CFX_WideString& val = pEvent->Value(); - if (vp.IsSetting()) { - vp >> val; - } else { - vp << val; - } - return TRUE; -} - -FX_BOOL event::willCommit(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError) { - if (!vp.IsGetting()) - return FALSE; - - CJS_Context* pContext = (CJS_Context*)cc; - CJS_EventHandler* pEvent = pContext->GetEventHandler(); - - if (pEvent->WillCommit()) - vp << TRUE; - else - vp << FALSE; - return TRUE; -} diff --git a/fpdfsdk/src/javascript/event.h b/fpdfsdk/src/javascript/event.h deleted file mode 100644 index cf37bf6b08..0000000000 --- a/fpdfsdk/src/javascript/event.h +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef FPDFSDK_SRC_JAVASCRIPT_EVENT_H_ -#define FPDFSDK_SRC_JAVASCRIPT_EVENT_H_ - -#include "fpdfsdk/src/javascript/JS_Define.h" - -class event : public CJS_EmbedObj { - public: - event(CJS_Object* pJSObject); - ~event() override; - - public: - FX_BOOL change(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL changeEx(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL commitKey(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL fieldFull(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL keyDown(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL modifier(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL name(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL rc(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL richChange(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError); - FX_BOOL richChangeEx(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError); - FX_BOOL richValue(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL selEnd(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL selStart(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL shift(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL source(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL target(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL targetName(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError); - FX_BOOL type(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL value(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError); - FX_BOOL willCommit(IJS_Context* cc, - CJS_PropValue& vp, - CFX_WideString& sError); -}; - -class CJS_Event : public CJS_Object { - public: - CJS_Event(v8::Local<v8::Object> pObject) : CJS_Object(pObject) {} - ~CJS_Event() override {} - - DECLARE_JS_CLASS(); - JS_STATIC_PROP(change, event); - JS_STATIC_PROP(changeEx, event); - JS_STATIC_PROP(commitKey, event); - JS_STATIC_PROP(fieldFull, event); - JS_STATIC_PROP(keyDown, event); - JS_STATIC_PROP(modifier, event); - JS_STATIC_PROP(name, event); - JS_STATIC_PROP(rc, event); - JS_STATIC_PROP(richChange, event); - JS_STATIC_PROP(richChangeEx, event); - JS_STATIC_PROP(richValue, event); - JS_STATIC_PROP(selEnd, event); - JS_STATIC_PROP(selStart, event); - JS_STATIC_PROP(shift, event); - JS_STATIC_PROP(source, event); - JS_STATIC_PROP(target, event); - JS_STATIC_PROP(targetName, event); - JS_STATIC_PROP(type, event); - JS_STATIC_PROP(value, event); - JS_STATIC_PROP(willCommit, event); -}; - -#endif // FPDFSDK_SRC_JAVASCRIPT_EVENT_H_ diff --git a/fpdfsdk/src/javascript/global.cpp b/fpdfsdk/src/javascript/global.cpp deleted file mode 100644 index 234e132d46..0000000000 --- a/fpdfsdk/src/javascript/global.cpp +++ /dev/null @@ -1,520 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "fpdfsdk/src/javascript/global.h" - -#include <vector> - -#include "core/include/fxcrt/fx_ext.h" -#include "fpdfsdk/include/javascript/IJavaScript.h" -#include "fpdfsdk/src/javascript/JS_Context.h" -#include "fpdfsdk/src/javascript/JS_Define.h" -#include "fpdfsdk/src/javascript/JS_EventHandler.h" -#include "fpdfsdk/src/javascript/JS_GlobalData.h" -#include "fpdfsdk/src/javascript/JS_Object.h" -#include "fpdfsdk/src/javascript/JS_Value.h" -#include "fpdfsdk/src/javascript/resource.h" - -/* ---------------------------- global ---------------------------- */ - -// Helper class for compile-time calculation of hash values in order to -// avoid having global object initializers. -template <unsigned ACC, wchar_t... Ns> -struct CHash; - -// Only needed to hash single-character strings. -template <wchar_t N> -struct CHash<N> { - static const unsigned value = N; -}; - -template <unsigned ACC, wchar_t N> -struct CHash<ACC, N> { - static const unsigned value = (ACC * 1313LLU + N) & 0xFFFFFFFF; -}; - -template <unsigned ACC, wchar_t N, wchar_t... Ns> -struct CHash<ACC, N, Ns...> { - static const unsigned value = CHash<CHash<ACC, N>::value, Ns...>::value; -}; - -const unsigned int JSCONST_nStringHash = - CHash<'s', 't', 'r', 'i', 'n', 'g'>::value; -const unsigned int JSCONST_nNumberHash = - CHash<'n', 'u', 'm', 'b', 'e', 'r'>::value; -const unsigned int JSCONST_nBoolHash = - CHash<'b', 'o', 'o', 'l', 'e', 'a', 'n'>::value; -const unsigned int JSCONST_nDateHash = CHash<'d', 'a', 't', 'e'>::value; -const unsigned int JSCONST_nObjectHash = - CHash<'o', 'b', 'j', 'e', 'c', 't'>::value; -const unsigned int JSCONST_nFXobjHash = CHash<'f', 'x', 'o', 'b', 'j'>::value; -const unsigned int JSCONST_nNullHash = CHash<'n', 'u', 'l', 'l'>::value; -const unsigned int JSCONST_nUndefHash = - CHash<'u', 'n', 'd', 'e', 'f', 'i', 'n', 'e', 'd'>::value; - -static unsigned JS_CalcHash(const wchar_t* main) { - return (unsigned)FX_HashCode_String_GetW(main, FXSYS_wcslen(main)); -} - -#ifndef NDEBUG -class HashVerify { - public: - HashVerify(); -} g_hashVerify; - -HashVerify::HashVerify() { - ASSERT(JSCONST_nStringHash == JS_CalcHash(kFXJSValueNameString)); - ASSERT(JSCONST_nNumberHash == JS_CalcHash(kFXJSValueNameNumber)); - ASSERT(JSCONST_nBoolHash == JS_CalcHash(kFXJSValueNameBoolean)); - ASSERT(JSCONST_nDateHash == JS_CalcHash(kFXJSValueNameDate)); - ASSERT(JSCONST_nObjectHash == JS_CalcHash(kFXJSValueNameObject)); - ASSERT(JSCONST_nFXobjHash == JS_CalcHash(kFXJSValueNameFxobj)); - ASSERT(JSCONST_nNullHash == JS_CalcHash(kFXJSValueNameNull)); - ASSERT(JSCONST_nUndefHash == JS_CalcHash(kFXJSValueNameUndefined)); -} -#endif - -BEGIN_JS_STATIC_CONST(CJS_Global) -END_JS_STATIC_CONST() - -BEGIN_JS_STATIC_PROP(CJS_Global) -END_JS_STATIC_PROP() - -BEGIN_JS_STATIC_METHOD(CJS_Global) -JS_STATIC_METHOD_ENTRY(setPersistent) -END_JS_STATIC_METHOD() - -IMPLEMENT_SPECIAL_JS_CLASS(CJS_Global, JSGlobalAlternate, global); - -void CJS_Global::InitInstance(IJS_Runtime* pIRuntime) { - CJS_Runtime* pRuntime = static_cast<CJS_Runtime*>(pIRuntime); - JSGlobalAlternate* pGlobal = - static_cast<JSGlobalAlternate*>(GetEmbedObject()); - pGlobal->Initial(pRuntime->GetReaderApp()); -} - -JSGlobalAlternate::JSGlobalAlternate(CJS_Object* pJSObject) - : CJS_EmbedObj(pJSObject), m_pApp(NULL) { -} - -JSGlobalAlternate::~JSGlobalAlternate() { - DestroyGlobalPersisitentVariables(); - m_pGlobalData->Release(); -} - -void JSGlobalAlternate::Initial(CPDFDoc_Environment* pApp) { - m_pApp = pApp; - m_pGlobalData = CJS_GlobalData::GetRetainedInstance(pApp); - UpdateGlobalPersistentVariables(); -} - -FX_BOOL JSGlobalAlternate::QueryProperty(const FX_WCHAR* propname) { - return CFX_WideString(propname) != L"setPersistent"; -} - -FX_BOOL JSGlobalAlternate::DelProperty(IJS_Context* cc, - const FX_WCHAR* propname, - CFX_WideString& sError) { - auto it = m_mapGlobal.find(CFX_ByteString::FromUnicode(propname)); - if (it == m_mapGlobal.end()) - return FALSE; - - it->second->bDeleted = TRUE; - return TRUE; -} - -FX_BOOL JSGlobalAlternate::DoProperty(IJS_Context* cc, - const FX_WCHAR* propname, - CJS_PropValue& vp, - CFX_WideString& sError) { - if (vp.IsSetting()) { - CFX_ByteString sPropName = CFX_ByteString::FromUnicode(propname); - switch (vp.GetType()) { - case CJS_Value::VT_number: { - double dData; - vp >> dData; - return SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_NUMBER, dData, - false, "", v8::Local<v8::Object>(), FALSE); - } - case CJS_Value::VT_boolean: { - bool bData; - vp >> bData; - return SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_BOOLEAN, 0, - bData, "", v8::Local<v8::Object>(), FALSE); - } - case CJS_Value::VT_string: { - CFX_ByteString sData; - vp >> sData; - return SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_STRING, 0, - false, sData, v8::Local<v8::Object>(), FALSE); - } - case CJS_Value::VT_object: { - v8::Local<v8::Object> pData; - vp >> pData; - return SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_OBJECT, 0, - false, "", pData, FALSE); - } - case CJS_Value::VT_null: { - return SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_NULL, 0, false, - "", v8::Local<v8::Object>(), FALSE); - } - case CJS_Value::VT_undefined: { - DelProperty(cc, propname, sError); - return TRUE; - } - default: - break; - } - } else { - auto it = m_mapGlobal.find(CFX_ByteString::FromUnicode(propname)); - if (it == m_mapGlobal.end()) { - vp.SetNull(); - return TRUE; - } - JSGlobalData* pData = it->second; - if (pData->bDeleted) { - vp.SetNull(); - return TRUE; - } - switch (pData->nType) { - case JS_GLOBALDATA_TYPE_NUMBER: - vp << pData->dData; - return TRUE; - case JS_GLOBALDATA_TYPE_BOOLEAN: - vp << pData->bData; - return TRUE; - case JS_GLOBALDATA_TYPE_STRING: - vp << pData->sData; - return TRUE; - case JS_GLOBALDATA_TYPE_OBJECT: { - v8::Local<v8::Object> obj = v8::Local<v8::Object>::New( - vp.GetJSRuntime()->GetIsolate(), pData->pData); - vp << obj; - return TRUE; - } - case JS_GLOBALDATA_TYPE_NULL: - vp.SetNull(); - return TRUE; - default: - break; - } - } - return FALSE; -} - -FX_BOOL JSGlobalAlternate::setPersistent(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - CJS_Context* pContext = static_cast<CJS_Context*>(cc); - if (params.size() != 2) { - sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR); - return FALSE; - } - - auto it = m_mapGlobal.find(params[0].ToCFXByteString()); - if (it != m_mapGlobal.end()) { - JSGlobalData* pData = it->second; - if (!pData->bDeleted) { - pData->bPersistent = params[1].ToBool(); - return TRUE; - } - } - - sError = JSGetStringFromID(pContext, IDS_STRING_JSNOGLOBAL); - return FALSE; -} - -void JSGlobalAlternate::UpdateGlobalPersistentVariables() { - for (int i = 0, sz = m_pGlobalData->GetSize(); i < sz; i++) { - CJS_GlobalData_Element* pData = m_pGlobalData->GetAt(i); - switch (pData->data.nType) { - case JS_GLOBALDATA_TYPE_NUMBER: - SetGlobalVariables(pData->data.sKey, JS_GLOBALDATA_TYPE_NUMBER, - pData->data.dData, false, "", - v8::Local<v8::Object>(), pData->bPersistent == 1); - FXJS_PutObjectNumber(NULL, m_pJSObject->ToV8Object(), - pData->data.sKey.UTF8Decode().c_str(), - pData->data.dData); - break; - case JS_GLOBALDATA_TYPE_BOOLEAN: - SetGlobalVariables(pData->data.sKey, JS_GLOBALDATA_TYPE_BOOLEAN, 0, - (bool)(pData->data.bData == 1), "", - v8::Local<v8::Object>(), pData->bPersistent == 1); - FXJS_PutObjectBoolean(NULL, m_pJSObject->ToV8Object(), - pData->data.sKey.UTF8Decode().c_str(), - (bool)(pData->data.bData == 1)); - break; - case JS_GLOBALDATA_TYPE_STRING: - SetGlobalVariables(pData->data.sKey, JS_GLOBALDATA_TYPE_STRING, 0, - false, pData->data.sData, v8::Local<v8::Object>(), - pData->bPersistent == 1); - FXJS_PutObjectString(NULL, m_pJSObject->ToV8Object(), - pData->data.sKey.UTF8Decode().c_str(), - pData->data.sData.UTF8Decode().c_str()); - break; - case JS_GLOBALDATA_TYPE_OBJECT: { - v8::Isolate* pRuntime = m_pJSObject->ToV8Object()->GetIsolate(); - v8::Local<v8::Object> pObj = FXJS_NewFxDynamicObj(pRuntime, NULL, -1); - - PutObjectProperty(pObj, &pData->data); - - SetGlobalVariables(pData->data.sKey, JS_GLOBALDATA_TYPE_OBJECT, 0, - false, "", pObj, pData->bPersistent == 1); - FXJS_PutObjectObject(NULL, m_pJSObject->ToV8Object(), - pData->data.sKey.UTF8Decode().c_str(), pObj); - } break; - case JS_GLOBALDATA_TYPE_NULL: - SetGlobalVariables(pData->data.sKey, JS_GLOBALDATA_TYPE_NULL, 0, false, - "", v8::Local<v8::Object>(), - pData->bPersistent == 1); - FXJS_PutObjectNull(NULL, m_pJSObject->ToV8Object(), - pData->data.sKey.UTF8Decode().c_str()); - break; - } - } -} - -void JSGlobalAlternate::CommitGlobalPersisitentVariables(IJS_Context* cc) { - for (auto it = m_mapGlobal.begin(); it != m_mapGlobal.end(); ++it) { - CFX_ByteString name = it->first; - JSGlobalData* pData = it->second; - if (pData->bDeleted) { - m_pGlobalData->DeleteGlobalVariable(name); - } else { - switch (pData->nType) { - case JS_GLOBALDATA_TYPE_NUMBER: - m_pGlobalData->SetGlobalVariableNumber(name, pData->dData); - m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent); - break; - case JS_GLOBALDATA_TYPE_BOOLEAN: - m_pGlobalData->SetGlobalVariableBoolean(name, pData->bData); - m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent); - break; - case JS_GLOBALDATA_TYPE_STRING: - m_pGlobalData->SetGlobalVariableString(name, pData->sData); - m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent); - break; - case JS_GLOBALDATA_TYPE_OBJECT: - { - CJS_GlobalVariableArray array; - v8::Local<v8::Object> obj = v8::Local<v8::Object>::New( - GetJSObject()->GetIsolate(), pData->pData); - ObjectToArray(cc, obj, array); - m_pGlobalData->SetGlobalVariableObject(name, array); - m_pGlobalData->SetGlobalVariablePersistent(name, - pData->bPersistent); - } - break; - case JS_GLOBALDATA_TYPE_NULL: - m_pGlobalData->SetGlobalVariableNull(name); - m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent); - break; - } - } - } -} - -void JSGlobalAlternate::ObjectToArray(IJS_Context* cc, - v8::Local<v8::Object> pObj, - CJS_GlobalVariableArray& array) { - v8::Isolate* isolate = pObj->GetIsolate(); - CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc); - - v8::Local<v8::Array> pKeyList = FXJS_GetObjectElementNames(isolate, pObj); - int nObjElements = pKeyList->Length(); - for (int i = 0; i < nObjElements; i++) { - CFX_WideString ws = - FXJS_ToString(isolate, FXJS_GetArrayElement(isolate, pKeyList, i)); - CFX_ByteString sKey = ws.UTF8Encode(); - - v8::Local<v8::Value> v = FXJS_GetObjectElement(isolate, pObj, ws.c_str()); - switch (GET_VALUE_TYPE(v)) { - case CJS_Value::VT_number: { - CJS_KeyValue* pObjElement = new CJS_KeyValue; - pObjElement->nType = JS_GLOBALDATA_TYPE_NUMBER; - pObjElement->sKey = sKey; - pObjElement->dData = FXJS_ToNumber(isolate, v); - array.Add(pObjElement); - } break; - case CJS_Value::VT_boolean: { - CJS_KeyValue* pObjElement = new CJS_KeyValue; - pObjElement->nType = JS_GLOBALDATA_TYPE_BOOLEAN; - pObjElement->sKey = sKey; - pObjElement->dData = FXJS_ToBoolean(isolate, v); - array.Add(pObjElement); - } break; - case CJS_Value::VT_string: { - CFX_ByteString sValue = - CJS_Value(pRuntime, v, CJS_Value::VT_string).ToCFXByteString(); - CJS_KeyValue* pObjElement = new CJS_KeyValue; - pObjElement->nType = JS_GLOBALDATA_TYPE_STRING; - pObjElement->sKey = sKey; - pObjElement->sData = sValue; - array.Add(pObjElement); - } break; - case CJS_Value::VT_object: { - CJS_KeyValue* pObjElement = new CJS_KeyValue; - pObjElement->nType = JS_GLOBALDATA_TYPE_OBJECT; - pObjElement->sKey = sKey; - ObjectToArray(cc, FXJS_ToObject(isolate, v), pObjElement->objData); - array.Add(pObjElement); - } break; - case CJS_Value::VT_null: { - CJS_KeyValue* pObjElement = new CJS_KeyValue; - pObjElement->nType = JS_GLOBALDATA_TYPE_NULL; - pObjElement->sKey = sKey; - array.Add(pObjElement); - } break; - default: - break; - } - } -} - -void JSGlobalAlternate::PutObjectProperty(v8::Local<v8::Object> pObj, - CJS_KeyValue* pData) { - for (int i = 0, sz = pData->objData.Count(); i < sz; i++) { - CJS_KeyValue* pObjData = pData->objData.GetAt(i); - switch (pObjData->nType) { - case JS_GLOBALDATA_TYPE_NUMBER: - FXJS_PutObjectNumber(NULL, pObj, pObjData->sKey.UTF8Decode().c_str(), - pObjData->dData); - break; - case JS_GLOBALDATA_TYPE_BOOLEAN: - FXJS_PutObjectBoolean(NULL, pObj, pObjData->sKey.UTF8Decode().c_str(), - pObjData->bData == 1); - break; - case JS_GLOBALDATA_TYPE_STRING: - FXJS_PutObjectString(NULL, pObj, pObjData->sKey.UTF8Decode().c_str(), - pObjData->sData.UTF8Decode().c_str()); - break; - case JS_GLOBALDATA_TYPE_OBJECT: { - v8::Isolate* pRuntime = m_pJSObject->ToV8Object()->GetIsolate(); - v8::Local<v8::Object> pNewObj = - FXJS_NewFxDynamicObj(pRuntime, NULL, -1); - PutObjectProperty(pNewObj, pObjData); - FXJS_PutObjectObject(NULL, pObj, pObjData->sKey.UTF8Decode().c_str(), - pNewObj); - } break; - case JS_GLOBALDATA_TYPE_NULL: - FXJS_PutObjectNull(NULL, pObj, pObjData->sKey.UTF8Decode().c_str()); - break; - } - } -} - -void JSGlobalAlternate::DestroyGlobalPersisitentVariables() { - for (const auto& pair : m_mapGlobal) { - delete pair.second; - } - m_mapGlobal.clear(); -} - -FX_BOOL JSGlobalAlternate::SetGlobalVariables(const FX_CHAR* propname, - int nType, - double dData, - bool bData, - const CFX_ByteString& sData, - v8::Local<v8::Object> pData, - bool bDefaultPersistent) { - if (!propname) - return FALSE; - - auto it = m_mapGlobal.find(propname); - if (it != m_mapGlobal.end()) { - JSGlobalData* pTemp = it->second; - if (pTemp->bDeleted || pTemp->nType != nType) { - pTemp->dData = 0; - pTemp->bData = 0; - pTemp->sData = ""; - pTemp->nType = nType; - } - - pTemp->bDeleted = FALSE; - switch (nType) { - case JS_GLOBALDATA_TYPE_NUMBER: { - pTemp->dData = dData; - } break; - case JS_GLOBALDATA_TYPE_BOOLEAN: { - pTemp->bData = bData; - } break; - case JS_GLOBALDATA_TYPE_STRING: { - pTemp->sData = sData; - } break; - case JS_GLOBALDATA_TYPE_OBJECT: { - pTemp->pData.Reset(pData->GetIsolate(), pData); - } break; - case JS_GLOBALDATA_TYPE_NULL: - break; - default: - return FALSE; - } - return TRUE; - } - - JSGlobalData* pNewData = NULL; - - switch (nType) { - case JS_GLOBALDATA_TYPE_NUMBER: { - pNewData = new JSGlobalData; - pNewData->nType = JS_GLOBALDATA_TYPE_NUMBER; - pNewData->dData = dData; - pNewData->bPersistent = bDefaultPersistent; - } break; - case JS_GLOBALDATA_TYPE_BOOLEAN: { - pNewData = new JSGlobalData; - pNewData->nType = JS_GLOBALDATA_TYPE_BOOLEAN; - pNewData->bData = bData; - pNewData->bPersistent = bDefaultPersistent; - } break; - case JS_GLOBALDATA_TYPE_STRING: { - pNewData = new JSGlobalData; - pNewData->nType = JS_GLOBALDATA_TYPE_STRING; - pNewData->sData = sData; - pNewData->bPersistent = bDefaultPersistent; - } break; - case JS_GLOBALDATA_TYPE_OBJECT: { - pNewData = new JSGlobalData; - pNewData->nType = JS_GLOBALDATA_TYPE_OBJECT; - pNewData->pData.Reset(pData->GetIsolate(), pData); - pNewData->bPersistent = bDefaultPersistent; - } break; - case JS_GLOBALDATA_TYPE_NULL: { - pNewData = new JSGlobalData; - pNewData->nType = JS_GLOBALDATA_TYPE_NULL; - pNewData->bPersistent = bDefaultPersistent; - } break; - default: - return FALSE; - } - - m_mapGlobal[propname] = pNewData; - return TRUE; -} - -CJS_Value::Type GET_VALUE_TYPE(v8::Local<v8::Value> p) { - const unsigned int nHash = JS_CalcHash(FXJS_GetTypeof(p)); - - if (nHash == JSCONST_nUndefHash) - return CJS_Value::VT_undefined; - if (nHash == JSCONST_nNullHash) - return CJS_Value::VT_null; - if (nHash == JSCONST_nStringHash) - return CJS_Value::VT_string; - if (nHash == JSCONST_nNumberHash) - return CJS_Value::VT_number; - if (nHash == JSCONST_nBoolHash) - return CJS_Value::VT_boolean; - if (nHash == JSCONST_nDateHash) - return CJS_Value::VT_date; - if (nHash == JSCONST_nObjectHash) - return CJS_Value::VT_object; - if (nHash == JSCONST_nFXobjHash) - return CJS_Value::VT_fxobject; - - return CJS_Value::VT_unknown; -} diff --git a/fpdfsdk/src/javascript/global.h b/fpdfsdk/src/javascript/global.h deleted file mode 100644 index e8172e691e..0000000000 --- a/fpdfsdk/src/javascript/global.h +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef FPDFSDK_SRC_JAVASCRIPT_GLOBAL_H_ -#define FPDFSDK_SRC_JAVASCRIPT_GLOBAL_H_ - -#include <map> -#include <vector> - -#include "fpdfsdk/src/javascript/JS_Define.h" - -class CJS_GlobalData; -class CJS_GlobalVariableArray; -class CJS_KeyValue; - -struct JSGlobalData { - JSGlobalData() { - nType = 0; - dData = 0; - bData = FALSE; - sData = ""; - bPersistent = FALSE; - bDeleted = FALSE; - } - - ~JSGlobalData() { pData.Reset(); } - int nType; // 0:int 1:bool 2:string 3:obj - double dData; - bool bData; - CFX_ByteString sData; - v8::Global<v8::Object> pData; - bool bPersistent; - bool bDeleted; -}; - -class JSGlobalAlternate : public CJS_EmbedObj { - public: - JSGlobalAlternate(CJS_Object* pJSObject); - ~JSGlobalAlternate() override; - - FX_BOOL setPersistent(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL QueryProperty(const FX_WCHAR* propname); - FX_BOOL DoProperty(IJS_Context* cc, - const FX_WCHAR* propname, - CJS_PropValue& vp, - CFX_WideString& sError); - FX_BOOL DelProperty(IJS_Context* cc, - const FX_WCHAR* propname, - CFX_WideString& sError); - void Initial(CPDFDoc_Environment* pApp); - - private: - void UpdateGlobalPersistentVariables(); - void CommitGlobalPersisitentVariables(IJS_Context* cc); - void DestroyGlobalPersisitentVariables(); - FX_BOOL SetGlobalVariables(const FX_CHAR* propname, - int nType, - double dData, - bool bData, - const CFX_ByteString& sData, - v8::Local<v8::Object> pData, - bool bDefaultPersistent); - void ObjectToArray(IJS_Context* cc, - v8::Local<v8::Object> pObj, - CJS_GlobalVariableArray& array); - void PutObjectProperty(v8::Local<v8::Object> obj, CJS_KeyValue* pData); - - std::map<CFX_ByteString, JSGlobalData*> m_mapGlobal; - CFX_WideString m_sFilePath; - CJS_GlobalData* m_pGlobalData; - CPDFDoc_Environment* m_pApp; -}; - -class CJS_Global : public CJS_Object { - public: - explicit CJS_Global(v8::Local<v8::Object> pObject) : CJS_Object(pObject) {} - ~CJS_Global() override {} - - // CJS_Object - void InitInstance(IJS_Runtime* pIRuntime) override; - - DECLARE_SPECIAL_JS_CLASS(); - JS_SPECIAL_STATIC_METHOD(setPersistent, JSGlobalAlternate, global); -}; - -#endif // FPDFSDK_SRC_JAVASCRIPT_GLOBAL_H_ diff --git a/fpdfsdk/src/javascript/public_methods_embeddertest.cpp b/fpdfsdk/src/javascript/public_methods_embeddertest.cpp deleted file mode 100644 index cf6f96802b..0000000000 --- a/fpdfsdk/src/javascript/public_methods_embeddertest.cpp +++ /dev/null @@ -1,168 +0,0 @@ -// Copyright 2015 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include <cmath> - -#include "core/include/fxcrt/fx_string.h" -#include "fpdfsdk/src/javascript/PublicMethods.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "testing/js_embedder_test.h" - -namespace { - -double RoundDownDate(double date) { - return date - fmod(date, 86400000); -} - -} // namespace - -class PublicMethodsEmbedderTest : public JSEmbedderTest {}; - -TEST_F(PublicMethodsEmbedderTest, MakeRegularDate) { - v8::Isolate::Scope isolate_scope(isolate()); -#ifdef PDF_ENABLE_XFA - v8::Locker locker(isolate()); -#endif // PDF_ENABLE_XFA - v8::HandleScope handle_scope(isolate()); - v8::Context::Scope context_scope(GetV8Context()); - bool bWrongFormat; - double date; - - // 1968 - bWrongFormat = false; - date = CJS_PublicMethods::MakeRegularDate(L"06/25/1968", L"mm/dd/yyyy", - &bWrongFormat); - date = RoundDownDate(date); - EXPECT_DOUBLE_EQ(-47865600000, date); - EXPECT_FALSE(bWrongFormat); - - // 1968 - bWrongFormat = false; - date = CJS_PublicMethods::MakeRegularDate(L"25061968", L"ddmmyyyy", - &bWrongFormat); - date = RoundDownDate(date); - EXPECT_DOUBLE_EQ(-47865600000, date); - EXPECT_FALSE(bWrongFormat); - - // 1968 - bWrongFormat = false; - date = CJS_PublicMethods::MakeRegularDate(L"19680625", L"yyyymmdd", - &bWrongFormat); - date = RoundDownDate(date); - EXPECT_DOUBLE_EQ(-47865600000, date); - EXPECT_FALSE(bWrongFormat); - - // 1985 - bWrongFormat = false; - date = CJS_PublicMethods::MakeRegularDate(L"31121985", L"ddmmyyyy", - &bWrongFormat); - date = RoundDownDate(date); - EXPECT_DOUBLE_EQ(504835200000.0, date); - EXPECT_FALSE(bWrongFormat); - - // 2085, the other '85. - bWrongFormat = false; - date = - CJS_PublicMethods::MakeRegularDate(L"311285", L"ddmmyy", &bWrongFormat); - date = RoundDownDate(date); - EXPECT_DOUBLE_EQ(3660595200000.0, date); - EXPECT_FALSE(bWrongFormat); - - // 1995 - bWrongFormat = false; - date = CJS_PublicMethods::MakeRegularDate(L"01021995", L"ddmmyyyy", - &bWrongFormat); - date = RoundDownDate(date); - EXPECT_DOUBLE_EQ(791596800000.0, date); - EXPECT_FALSE(bWrongFormat); - - // 2095, the other '95. - bWrongFormat = false; - date = - CJS_PublicMethods::MakeRegularDate(L"010295", L"ddmmyy", &bWrongFormat); - date = RoundDownDate(date); - EXPECT_DOUBLE_EQ(3947356800000.0, date); - EXPECT_FALSE(bWrongFormat); - - // 2005 - bWrongFormat = false; - date = CJS_PublicMethods::MakeRegularDate(L"01022005", L"ddmmyyyy", - &bWrongFormat); - date = RoundDownDate(date); - EXPECT_DOUBLE_EQ(1107216000000.0, date); - EXPECT_FALSE(bWrongFormat); - - // 2005 - bWrongFormat = false; - date = - CJS_PublicMethods::MakeRegularDate(L"010205", L"ddmmyy", &bWrongFormat); - date = RoundDownDate(date); - EXPECT_DOUBLE_EQ(1107216000000.0, date); - EXPECT_FALSE(bWrongFormat); -} - -TEST_F(PublicMethodsEmbedderTest, MakeFormatDate) { - v8::Isolate::Scope isolate_scope(isolate()); -#ifdef PDF_ENABLE_XFA - v8::Locker locker(isolate()); -#endif // PDF_ENABLE_XFA - v8::HandleScope handle_scope(isolate()); - v8::Context::Scope context_scope(GetV8Context()); - CFX_WideString formatted_date; - - // 1968-06-25 - formatted_date = CJS_PublicMethods::MakeFormatDate(-47952000000, L"ddmmyy"); - EXPECT_STREQ(L"250668", formatted_date); - formatted_date = CJS_PublicMethods::MakeFormatDate(-47952000000, L"yy/mm/dd"); - EXPECT_STREQ(L"68/06/25", formatted_date); - - // 1969-12-31 - formatted_date = CJS_PublicMethods::MakeFormatDate(-0.0001, L"ddmmyy"); - EXPECT_STREQ(L"311269", formatted_date); - formatted_date = CJS_PublicMethods::MakeFormatDate(-0.0001, L"yy!mmdd"); - EXPECT_STREQ(L"69!1231", formatted_date); - - // 1970-01-01 - formatted_date = CJS_PublicMethods::MakeFormatDate(0, L"ddmmyy"); - EXPECT_STREQ(L"010170", formatted_date); - formatted_date = CJS_PublicMethods::MakeFormatDate(0, L"mm-yyyy-dd"); - EXPECT_STREQ(L"01-1970-01", formatted_date); - - // 1985-12-31 - formatted_date = CJS_PublicMethods::MakeFormatDate(504835200000.0, L"ddmmyy"); - EXPECT_STREQ(L"311285", formatted_date); - formatted_date = CJS_PublicMethods::MakeFormatDate(504835200000.0, L"yymmdd"); - EXPECT_STREQ(L"851231", formatted_date); - - // 1995-02-01 - formatted_date = CJS_PublicMethods::MakeFormatDate(791596800000.0, L"ddmmyy"); - EXPECT_STREQ(L"010295", formatted_date); - formatted_date = - CJS_PublicMethods::MakeFormatDate(791596800000.0, L"yyyymmdd"); - EXPECT_STREQ(L"19950201", formatted_date); - - // 2005-02-01 - formatted_date = - CJS_PublicMethods::MakeFormatDate(1107216000000.0, L"ddmmyy"); - EXPECT_STREQ(L"010205", formatted_date); - formatted_date = - CJS_PublicMethods::MakeFormatDate(1107216000000.0, L"yyyyddmm"); - EXPECT_STREQ(L"20050102", formatted_date); - - // 2085-12-31 - formatted_date = - CJS_PublicMethods::MakeFormatDate(3660595200000.0, L"ddmmyy"); - EXPECT_STREQ(L"311285", formatted_date); - formatted_date = - CJS_PublicMethods::MakeFormatDate(3660595200000.0, L"yyyydd"); - EXPECT_STREQ(L"208531", formatted_date); - - // 2095-02-01 - formatted_date = - CJS_PublicMethods::MakeFormatDate(3947356800000.0, L"ddmmyy"); - EXPECT_STREQ(L"010295", formatted_date); - formatted_date = - CJS_PublicMethods::MakeFormatDate(3947356800000.0, L"mmddyyyy"); - EXPECT_STREQ(L"02012095", formatted_date); -} diff --git a/fpdfsdk/src/javascript/report.cpp b/fpdfsdk/src/javascript/report.cpp deleted file mode 100644 index 8374f3c2c8..0000000000 --- a/fpdfsdk/src/javascript/report.cpp +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "fpdfsdk/src/javascript/report.h" - -#include <vector> - -#include "fpdfsdk/include/javascript/IJavaScript.h" -#include "fpdfsdk/src/javascript/JS_Define.h" -#include "fpdfsdk/src/javascript/JS_Object.h" -#include "fpdfsdk/src/javascript/JS_Value.h" - -/* ---------------------- report ---------------------- */ - -BEGIN_JS_STATIC_CONST(CJS_Report) -END_JS_STATIC_CONST() - -BEGIN_JS_STATIC_PROP(CJS_Report) -END_JS_STATIC_PROP() - -BEGIN_JS_STATIC_METHOD(CJS_Report) -JS_STATIC_METHOD_ENTRY(save) -JS_STATIC_METHOD_ENTRY(writeText) -END_JS_STATIC_METHOD() - -IMPLEMENT_JS_CLASS(CJS_Report, Report) - -Report::Report(CJS_Object* pJSObject) : CJS_EmbedObj(pJSObject) {} - -Report::~Report() {} - -FX_BOOL Report::writeText(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - // Unsafe, not supported. - return TRUE; -} - -FX_BOOL Report::save(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - // Unsafe, not supported. - return TRUE; -} diff --git a/fpdfsdk/src/javascript/report.h b/fpdfsdk/src/javascript/report.h deleted file mode 100644 index 55d74648fc..0000000000 --- a/fpdfsdk/src/javascript/report.h +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef FPDFSDK_SRC_JAVASCRIPT_REPORT_H_ -#define FPDFSDK_SRC_JAVASCRIPT_REPORT_H_ - -#include <vector> - -#include "fpdfsdk/src/javascript/JS_Define.h" - -class Report : public CJS_EmbedObj { - public: - Report(CJS_Object* pJSObject); - ~Report() override; - - public: - FX_BOOL save(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL writeText(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); -}; - -class CJS_Report : public CJS_Object { - public: - CJS_Report(v8::Local<v8::Object> pObject) : CJS_Object(pObject) {} - ~CJS_Report() override {} - - DECLARE_JS_CLASS(); - - JS_STATIC_METHOD(save, Report) - JS_STATIC_METHOD(writeText, Report); -}; - -#endif // FPDFSDK_SRC_JAVASCRIPT_REPORT_H_ diff --git a/fpdfsdk/src/javascript/resource.cpp b/fpdfsdk/src/javascript/resource.cpp deleted file mode 100644 index 7031da34d1..0000000000 --- a/fpdfsdk/src/javascript/resource.cpp +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "fpdfsdk/src/javascript/resource.h" - -CFX_WideString JSGetStringFromID(CJS_Context* pContext, FX_UINT id) { - switch (id) { - case IDS_STRING_JSALERT: - return L"Alert"; - case IDS_STRING_JSPARAMERROR: - return L"Incorrect number of parameters passed to function."; - case IDS_STRING_JSAFNUMBER_KEYSTROKE: - return L"The input value is invalid."; - case IDS_STRING_JSPARAM_TOOLONG: - return L"The input value is too long."; - case IDS_STRING_JSPARSEDATE: - return L"The input value can't be parsed as a valid date/time (%s)."; - case IDS_STRING_JSRANGE1: - return L"The input value must be greater than or equal to %s" - L" and less than or equal to %s."; - case IDS_STRING_JSRANGE2: - return L"The input value must be greater than or equal to %s."; - case IDS_STRING_JSRANGE3: - return L"The input value must be less than or equal to %s."; - case IDS_STRING_NOTSUPPORT: - return L"Operation not supported."; - case IDS_STRING_JSBUSY: - return L"System is busy."; - case IDS_STRING_JSEVENT: - return L"Duplicate formfield event found."; - case IDS_STRING_RUN: - return L"Script ran successfully."; - case IDS_STRING_JSPRINT1: - return L"The second parameter can't be converted to a Date."; - case IDS_STRING_JSPRINT2: - return L"The second parameter is an invalid Date!"; - case IDS_STRING_JSNOGLOBAL: - return L"Global value not found."; - case IDS_STRING_JSREADONLY: - return L"Cannot assign to readonly property."; - case IDS_STRING_JSTYPEERROR: - return L"Incorrect parameter type."; - case IDS_STRING_JSVALUEERROR: - return L"Incorrect parameter value."; - default: - return L""; - } -} - -CFX_WideString JSFormatErrorString(const char* class_name, - const char* property_name, - const CFX_WideString& details) { - CFX_WideString result = CFX_WideString::FromLocal(class_name); - if (property_name) { - result += L"."; - result += CFX_WideString::FromLocal(property_name); - } - result += L": "; - result += details; - return result; -} diff --git a/fpdfsdk/src/javascript/resource.h b/fpdfsdk/src/javascript/resource.h deleted file mode 100644 index be3ae13d90..0000000000 --- a/fpdfsdk/src/javascript/resource.h +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef FPDFSDK_SRC_JAVASCRIPT_RESOURCE_H_ -#define FPDFSDK_SRC_JAVASCRIPT_RESOURCE_H_ - -#include "core/include/fxcrt/fx_string.h" // For CFX_WideString. -#include "fpdfsdk/include/fsdk_define.h" // For FX_UINT. - -class CJS_Context; - -#define IDS_STRING_JSALERT 25613 -#define IDS_STRING_JSPARAMERROR 25614 -#define IDS_STRING_JSAFNUMBER_KEYSTROKE 25615 -#define IDS_STRING_JSPARAM_TOOLONG 25617 -#define IDS_STRING_JSPARSEDATE 25618 -#define IDS_STRING_JSRANGE1 25619 -#define IDS_STRING_JSRANGE2 25620 -#define IDS_STRING_JSRANGE3 25621 -#define IDS_STRING_NOTSUPPORT 25627 -#define IDS_STRING_JSBUSY 25628 -#define IDS_STRING_JSEVENT 25629 -#define IDS_STRING_RUN 25630 -#define IDS_STRING_JSPRINT1 25632 -#define IDS_STRING_JSPRINT2 25633 -#define IDS_STRING_JSNOGLOBAL 25635 -#define IDS_STRING_JSREADONLY 25636 -#define IDS_STRING_JSTYPEERROR 25637 -#define IDS_STRING_JSVALUEERROR 25638 - -CFX_WideString JSGetStringFromID(CJS_Context* pContext, FX_UINT id); -CFX_WideString JSFormatErrorString(const char* class_name, - const char* property_name, - const CFX_WideString& details); - -#endif // FPDFSDK_SRC_JAVASCRIPT_RESOURCE_H_ diff --git a/fpdfsdk/src/javascript/util.cpp b/fpdfsdk/src/javascript/util.cpp deleted file mode 100644 index 52a93625b9..0000000000 --- a/fpdfsdk/src/javascript/util.cpp +++ /dev/null @@ -1,531 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "fpdfsdk/src/javascript/util.h" - -#include <time.h> - -#include <string> -#include <vector> - -#include "core/include/fxcrt/fx_ext.h" -#include "fpdfsdk/include/javascript/IJavaScript.h" -#include "fpdfsdk/src/javascript/JS_Context.h" -#include "fpdfsdk/src/javascript/JS_Define.h" -#include "fpdfsdk/src/javascript/JS_EventHandler.h" -#include "fpdfsdk/src/javascript/JS_Object.h" -#include "fpdfsdk/src/javascript/JS_Runtime.h" -#include "fpdfsdk/src/javascript/JS_Value.h" -#include "fpdfsdk/src/javascript/PublicMethods.h" -#include "fpdfsdk/src/javascript/resource.h" - -#if _FX_OS_ == _FX_ANDROID_ -#include <ctype.h> -#endif - -BEGIN_JS_STATIC_CONST(CJS_Util) -END_JS_STATIC_CONST() - -BEGIN_JS_STATIC_PROP(CJS_Util) -END_JS_STATIC_PROP() - -BEGIN_JS_STATIC_METHOD(CJS_Util) -JS_STATIC_METHOD_ENTRY(printd) -JS_STATIC_METHOD_ENTRY(printf) -JS_STATIC_METHOD_ENTRY(printx) -JS_STATIC_METHOD_ENTRY(scand) -JS_STATIC_METHOD_ENTRY(byteToChar) -END_JS_STATIC_METHOD() - -IMPLEMENT_JS_CLASS(CJS_Util, util) - -util::util(CJS_Object* pJSObject) : CJS_EmbedObj(pJSObject) {} - -util::~util() { -} - -struct stru_TbConvert { - const FX_WCHAR* lpszJSMark; - const FX_WCHAR* lpszCppMark; -}; - -const stru_TbConvert fcTable[] = { - {L"mmmm", L"%B"}, - {L"mmm", L"%b"}, - {L"mm", L"%m"}, - // "m" - {L"dddd", L"%A"}, - {L"ddd", L"%a"}, - {L"dd", L"%d"}, - // "d", "%w", - {L"yyyy", L"%Y"}, - {L"yy", L"%y"}, - {L"HH", L"%H"}, - // "H" - {L"hh", L"%I"}, - // "h" - {L"MM", L"%M"}, - // "M" - {L"ss", L"%S"}, - // "s - {L"TT", L"%p"}, -// "t" -#if defined(_WIN32) - {L"tt", L"%p"}, - {L"h", L"%#I"}, -#else - {L"tt", L"%P"}, - {L"h", L"%l"}, -#endif -}; - -#define UTIL_INT 0 -#define UTIL_DOUBLE 1 -#define UTIL_STRING 2 - -int util::ParstDataType(std::wstring* sFormat) { - bool bPercent = FALSE; - for (size_t i = 0; i < sFormat->length(); ++i) { - wchar_t c = (*sFormat)[i]; - if (c == L'%') { - bPercent = true; - continue; - } - - if (bPercent) { - if (c == L'c' || c == L'C' || c == L'd' || c == L'i' || c == L'o' || - c == L'u' || c == L'x' || c == L'X') { - return UTIL_INT; - } - if (c == L'e' || c == L'E' || c == L'f' || c == L'g' || c == L'G') { - return UTIL_DOUBLE; - } - if (c == L's' || c == L'S') { - // Map s to S since we always deal internally - // with wchar_t strings. - (*sFormat)[i] = L'S'; - return UTIL_STRING; - } - if (c == L'.' || c == L'+' || c == L'-' || c == L'#' || c == L' ' || - FXSYS_iswdigit(c)) { - continue; - } - break; - } - } - - return -1; -} - -FX_BOOL util::printf(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - int iSize = params.size(); - if (iSize < 1) - return FALSE; - std::wstring c_ConvChar(params[0].ToCFXWideString().c_str()); - std::vector<std::wstring> c_strConvers; - int iOffset = 0; - int iOffend = 0; - c_ConvChar.insert(c_ConvChar.begin(), L'S'); - while (iOffset != -1) { - iOffend = c_ConvChar.find(L"%", iOffset + 1); - std::wstring strSub; - if (iOffend == -1) - strSub = c_ConvChar.substr(iOffset); - else - strSub = c_ConvChar.substr(iOffset, iOffend - iOffset); - c_strConvers.push_back(strSub); - iOffset = iOffend; - } - - std::wstring c_strResult; - - // for(int iIndex = 1;iIndex < params.size();iIndex++) - std::wstring c_strFormat; - for (int iIndex = 0; iIndex < (int)c_strConvers.size(); iIndex++) { - c_strFormat = c_strConvers[iIndex]; - if (iIndex == 0) { - c_strResult = c_strFormat; - continue; - } - - CFX_WideString strSegment; - if (iIndex >= iSize) { - c_strResult += c_strFormat; - continue; - } - - switch (ParstDataType(&c_strFormat)) { - case UTIL_INT: - strSegment.Format(c_strFormat.c_str(), params[iIndex].ToInt()); - break; - case UTIL_DOUBLE: - strSegment.Format(c_strFormat.c_str(), params[iIndex].ToDouble()); - break; - case UTIL_STRING: - strSegment.Format(c_strFormat.c_str(), - params[iIndex].ToCFXWideString().c_str()); - break; - default: - strSegment.Format(L"%S", c_strFormat.c_str()); - break; - } - c_strResult += strSegment.GetBuffer(strSegment.GetLength() + 1); - } - - c_strResult.erase(c_strResult.begin()); - vRet = c_strResult.c_str(); - return TRUE; -} - -FX_BOOL util::printd(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - int iSize = params.size(); - if (iSize < 2) - return FALSE; - - CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc); - CJS_Value p1(pRuntime); - p1 = params[0]; - - CJS_Value p2 = params[1]; - CJS_Date jsDate(pRuntime); - if (!p2.ConvertToDate(jsDate)) { - sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPRINT1); - return FALSE; - } - - if (!jsDate.IsValidDate()) { - sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPRINT2); - return FALSE; - } - - if (p1.GetType() == CJS_Value::VT_number) { - int nFormat = p1.ToInt(); - CFX_WideString swResult; - - switch (nFormat) { - case 0: - swResult.Format(L"D:%04d%02d%02d%02d%02d%02d", jsDate.GetYear(), - jsDate.GetMonth() + 1, jsDate.GetDay(), - jsDate.GetHours(), jsDate.GetMinutes(), - jsDate.GetSeconds()); - break; - case 1: - swResult.Format(L"%04d.%02d.%02d %02d:%02d:%02d", jsDate.GetYear(), - jsDate.GetMonth() + 1, jsDate.GetDay(), - jsDate.GetHours(), jsDate.GetMinutes(), - jsDate.GetSeconds()); - break; - case 2: - swResult.Format(L"%04d/%02d/%02d %02d:%02d:%02d", jsDate.GetYear(), - jsDate.GetMonth() + 1, jsDate.GetDay(), - jsDate.GetHours(), jsDate.GetMinutes(), - jsDate.GetSeconds()); - break; - default: - return FALSE; - } - - vRet = swResult.c_str(); - return TRUE; - } - if (p1.GetType() == CJS_Value::VT_string) { - std::basic_string<wchar_t> cFormat = p1.ToCFXWideString().c_str(); - - bool bXFAPicture = false; - if (iSize > 2) { - bXFAPicture = params[2].ToBool(); - } - - if (bXFAPicture) { - return FALSE; // currently, it doesn't support XFAPicture. - } - - for (size_t i = 0; i < sizeof(fcTable) / sizeof(stru_TbConvert); ++i) { - int iStart = 0; - int iEnd; - while ((iEnd = cFormat.find(fcTable[i].lpszJSMark, iStart)) != -1) { - cFormat.replace(iEnd, FXSYS_wcslen(fcTable[i].lpszJSMark), - fcTable[i].lpszCppMark); - iStart = iEnd; - } - } - - int iYear, iMonth, iDay, iHour, iMin, iSec; - iYear = jsDate.GetYear(); - iMonth = jsDate.GetMonth(); - iDay = jsDate.GetDay(); - iHour = jsDate.GetHours(); - iMin = jsDate.GetMinutes(); - iSec = jsDate.GetSeconds(); - - struct tm time = {}; - time.tm_year = iYear - 1900; - time.tm_mon = iMonth; - time.tm_mday = iDay; - time.tm_hour = iHour; - time.tm_min = iMin; - time.tm_sec = iSec; - - struct stru_TbConvertAd { - const FX_WCHAR* lpszJSMark; - int iValue; - }; - - stru_TbConvertAd cTableAd[] = { - {L"m", iMonth + 1}, {L"d", iDay}, - {L"H", iHour}, {L"h", iHour > 12 ? iHour - 12 : iHour}, - {L"M", iMin}, {L"s", iSec}, - }; - - for (size_t i = 0; i < sizeof(cTableAd) / sizeof(stru_TbConvertAd); ++i) { - wchar_t tszValue[10]; - CFX_WideString sValue; - sValue.Format(L"%d", cTableAd[i].iValue); - memcpy(tszValue, (wchar_t*)sValue.GetBuffer(sValue.GetLength() + 1), - (sValue.GetLength() + 1) * sizeof(wchar_t)); - - int iStart = 0; - int iEnd; - while ((iEnd = cFormat.find(cTableAd[i].lpszJSMark, iStart)) != -1) { - if (iEnd > 0) { - if (cFormat[iEnd - 1] == L'%') { - iStart = iEnd + 1; - continue; - } - } - cFormat.replace(iEnd, FXSYS_wcslen(cTableAd[i].lpszJSMark), tszValue); - iStart = iEnd; - } - } - - CFX_WideString strFormat; - wchar_t buf[64] = {}; - strFormat = wcsftime(buf, 64, cFormat.c_str(), &time); - cFormat = buf; - vRet = cFormat.c_str(); - return TRUE; - } - return FALSE; -} - -void util::printd(const std::wstring& cFormat2, - CJS_Date jsDate, - bool bXFAPicture, - std::wstring& cPurpose) { - std::wstring cFormat = cFormat2; - - if (bXFAPicture) { - return; // currently, it doesn't support XFAPicture. - } - - for (size_t i = 0; i < sizeof(fcTable) / sizeof(stru_TbConvert); ++i) { - int iStart = 0; - int iEnd; - while ((iEnd = cFormat.find(fcTable[i].lpszJSMark, iStart)) != -1) { - cFormat.replace(iEnd, FXSYS_wcslen(fcTable[i].lpszJSMark), - fcTable[i].lpszCppMark); - iStart = iEnd; - } - } - - int iYear, iMonth, iDay, iHour, iMin, iSec; - iYear = jsDate.GetYear(); - iMonth = jsDate.GetMonth(); - iDay = jsDate.GetDay(); - iHour = jsDate.GetHours(); - iMin = jsDate.GetMinutes(); - iSec = jsDate.GetSeconds(); - - struct tm time = {}; - time.tm_year = iYear - 1900; - time.tm_mon = iMonth; - time.tm_mday = iDay; - time.tm_hour = iHour; - time.tm_min = iMin; - time.tm_sec = iSec; - // COleDateTime cppTm(iYear,iMonth+1,iDay,iHour,iMin,iSec); - // CString strFormat = cppTm.Format(cFormat.c_str()); - - struct stru_TbConvertAd { - const FX_WCHAR* lpszJSMark; - int iValue; - }; - - stru_TbConvertAd cTableAd[] = { - {L"m", iMonth + 1}, {L"d", iDay}, - {L"H", iHour}, {L"h", iHour > 12 ? iHour - 12 : iHour}, - {L"M", iMin}, {L"s", iSec}, - }; - - // cFormat = strFormat.GetBuffer(strFormat.GetLength()+1); - for (size_t i = 0; i < sizeof(cTableAd) / sizeof(stru_TbConvertAd); ++i) { - wchar_t tszValue[10]; - CFX_WideString sValue; - sValue.Format(L"%d", cTableAd[i].iValue); - memcpy(tszValue, (wchar_t*)sValue.GetBuffer(sValue.GetLength() + 1), - sValue.GetLength() * sizeof(wchar_t)); - - int iStart = 0; - int iEnd; - while ((iEnd = cFormat.find(cTableAd[i].lpszJSMark, iStart)) != -1) { - if (iEnd > 0) { - if (cFormat[iEnd - 1] == L'%') { - iStart = iEnd + 1; - continue; - } - } - cFormat.replace(iEnd, FXSYS_wcslen(cTableAd[i].lpszJSMark), tszValue); - iStart = iEnd; - } - } - - CFX_WideString strFormat; - wchar_t buf[64] = {}; - strFormat = wcsftime(buf, 64, cFormat.c_str(), &time); - cFormat = buf; - cPurpose = cFormat; -} - -FX_BOOL util::printx(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - int iSize = params.size(); - if (iSize < 2) - return FALSE; - CFX_WideString sFormat = params[0].ToCFXWideString(); - CFX_WideString sSource = params[1].ToCFXWideString(); - std::string cFormat = CFX_ByteString::FromUnicode(sFormat).c_str(); - std::string cSource = CFX_ByteString::FromUnicode(sSource).c_str(); - std::string cDest; - printx(cFormat, cSource, cDest); - vRet = cDest.c_str(); - return TRUE; -} - -void util::printx(const std::string& cFormat, - const std::string& cSource2, - std::string& cPurpose) { - std::string cSource(cSource2); - if (!cPurpose.empty()) - // cPurpose.clear(); - cPurpose.erase(); - int itSource = 0; - int iSize = cSource.size(); - for (int iIndex = 0; iIndex < (int)cFormat.size() && itSource < iSize; - iIndex++) { - char letter = cFormat[iIndex]; - switch (letter) { - case '?': - cPurpose += cSource[itSource]; - itSource++; - break; - case 'X': { - while (itSource < iSize) { - if (std::isdigit(cSource[itSource]) || - (cSource[itSource] >= 'a' && cSource[itSource] <= 'z') || - (cSource[itSource] >= 'A' && cSource[itSource] <= 'Z')) { - cPurpose += cSource[itSource]; - itSource++; - break; - } - itSource++; - } - break; - } break; - case 'A': { - while (itSource < iSize) { - if ((cSource[itSource] >= 'a' && cSource[itSource] <= 'z') || - (cSource[itSource] >= 'A' && cSource[itSource] <= 'Z')) { - cPurpose += cSource[itSource]; - itSource++; - break; - } - itSource++; - } - break; - } break; - case '9': { - while (itSource < iSize) { - if (std::isdigit(cSource[itSource])) { - cPurpose += cSource[itSource]; - itSource++; - break; - } - itSource++; - } - break; - } - case '*': { - cPurpose.append(cSource, itSource, iSize - itSource); - itSource = iSize - 1; - break; - } - case '\\': - break; - case '>': { - for (char& c : cSource) - c = toupper(c); - break; - } - case '<': { - for (char& c : cSource) - c = tolower(c); - break; - } - case '=': - break; - default: - cPurpose += letter; - break; - } - } -} - -FX_BOOL util::scand(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - int iSize = params.size(); - if (iSize < 2) - return FALSE; - - CFX_WideString sFormat = params[0].ToCFXWideString(); - CFX_WideString sDate = params[1].ToCFXWideString(); - double dDate = JS_GetDateTime(); - if (sDate.GetLength() > 0) { - dDate = CJS_PublicMethods::MakeRegularDate(sDate, sFormat, nullptr); - } - - if (!JS_PortIsNan(dDate)) { - vRet = CJS_Date(CJS_Runtime::FromContext(cc), dDate); - } else { - vRet.SetNull(); - } - - return TRUE; -} - -FX_BOOL util::byteToChar(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError) { - int iSize = params.size(); - if (iSize == 0) - return FALSE; - int nByte = params[0].ToInt(); - unsigned char cByte = (unsigned char)nByte; - CFX_WideString csValue; - csValue.Format(L"%c", cByte); - vRet = csValue.c_str(); - return TRUE; -} diff --git a/fpdfsdk/src/javascript/util.h b/fpdfsdk/src/javascript/util.h deleted file mode 100644 index 6e3a5d2901..0000000000 --- a/fpdfsdk/src/javascript/util.h +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef FPDFSDK_SRC_JAVASCRIPT_UTIL_H_ -#define FPDFSDK_SRC_JAVASCRIPT_UTIL_H_ - -#include <string> -#include <vector> - -#include "fpdfsdk/src/javascript/JS_Define.h" - -class util : public CJS_EmbedObj { - public: - util(CJS_Object* pJSObject); - ~util() override; - - public: - FX_BOOL printd(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL printf(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL printx(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL scand(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - FX_BOOL byteToChar(IJS_Context* cc, - const std::vector<CJS_Value>& params, - CJS_Value& vRet, - CFX_WideString& sError); - - public: - static void printd(const std::wstring& cFormat, - CJS_Date Date, - bool bXFAPicture, - std::wstring& cPurpose); - static void printx(const std::string& cFormat, - const std::string& cSource, - std::string& cPurpose); - static int ParstDataType(std::wstring* sFormat); -}; - -class CJS_Util : public CJS_Object { - public: - CJS_Util(v8::Local<v8::Object> pObject) : CJS_Object(pObject) {} - ~CJS_Util() override {} - - DECLARE_JS_CLASS(); - - JS_STATIC_METHOD(printd, util); - JS_STATIC_METHOD(printf, util); - JS_STATIC_METHOD(printx, util); - JS_STATIC_METHOD(scand, util); - JS_STATIC_METHOD(byteToChar, util); -}; - -#endif // FPDFSDK_SRC_JAVASCRIPT_UTIL_H_ diff --git a/fpdfsdk/src/jsapi/fxjs_v8.cpp b/fpdfsdk/src/jsapi/fxjs_v8.cpp deleted file mode 100644 index 86f6ced198..0000000000 --- a/fpdfsdk/src/jsapi/fxjs_v8.cpp +++ /dev/null @@ -1,812 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "fpdfsdk/include/jsapi/fxjs_v8.h" - -#include <vector> - -#include "core/include/fxcrt/fx_basic.h" - -const wchar_t kFXJSValueNameString[] = L"string"; -const wchar_t kFXJSValueNameNumber[] = L"number"; -const wchar_t kFXJSValueNameBoolean[] = L"boolean"; -const wchar_t kFXJSValueNameDate[] = L"date"; -const wchar_t kFXJSValueNameObject[] = L"object"; -const wchar_t kFXJSValueNameFxobj[] = L"fxobj"; -const wchar_t kFXJSValueNameNull[] = L"null"; -const wchar_t kFXJSValueNameUndefined[] = L"undefined"; - -// Keep this consistent with the values defined in gin/public/context_holder.h -// (without actually requiring a dependency on gin itself for the standalone -// embedders of PDFIum). The value we want to use is: -// kPerContextDataStartIndex + kEmbedderPDFium, which is 3. -static const unsigned int kPerContextDataIndex = 3u; -static unsigned int g_embedderDataSlot = 1u; -static v8::Isolate* g_isolate = nullptr; -static size_t g_isolate_ref_count = 0; -static FXJS_ArrayBufferAllocator* g_arrayBufferAllocator = nullptr; -static v8::Global<v8::ObjectTemplate>* g_DefaultGlobalObjectTemplate = nullptr; - -class CFXJS_PerObjectData { - public: - explicit CFXJS_PerObjectData(int nObjDefID) - : m_ObjDefID(nObjDefID), m_pPrivate(nullptr) {} - - const int m_ObjDefID; - void* m_pPrivate; -}; - -class CFXJS_ObjDefinition { - public: - static int MaxID(v8::Isolate* pIsolate) { - return FXJS_PerIsolateData::Get(pIsolate)->m_ObjectDefnArray.size(); - } - - static CFXJS_ObjDefinition* ForID(v8::Isolate* pIsolate, int id) { - // Note: GetAt() halts if out-of-range even in release builds. - return FXJS_PerIsolateData::Get(pIsolate)->m_ObjectDefnArray[id]; - } - - CFXJS_ObjDefinition(v8::Isolate* isolate, - const wchar_t* sObjName, - FXJSOBJTYPE eObjType, - FXJS_CONSTRUCTOR pConstructor, - FXJS_DESTRUCTOR pDestructor) - : m_ObjName(sObjName), - m_ObjType(eObjType), - m_pConstructor(pConstructor), - m_pDestructor(pDestructor), - m_pIsolate(isolate) { - v8::Isolate::Scope isolate_scope(isolate); - v8::HandleScope handle_scope(isolate); - - v8::Local<v8::FunctionTemplate> fun = v8::FunctionTemplate::New(isolate); - fun->InstanceTemplate()->SetInternalFieldCount(2); - m_FunctionTemplate.Reset(isolate, fun); - - v8::Local<v8::Signature> sig = v8::Signature::New(isolate, fun); - m_Signature.Reset(isolate, sig); - } - - int AssignID() { - FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(m_pIsolate); - pData->m_ObjectDefnArray.push_back(this); - return pData->m_ObjectDefnArray.size() - 1; - } - - v8::Local<v8::ObjectTemplate> GetInstanceTemplate() { - v8::EscapableHandleScope scope(m_pIsolate); - v8::Local<v8::FunctionTemplate> function = - m_FunctionTemplate.Get(m_pIsolate); - return scope.Escape(function->InstanceTemplate()); - } - - v8::Local<v8::Signature> GetSignature() { - v8::EscapableHandleScope scope(m_pIsolate); - return scope.Escape(m_Signature.Get(m_pIsolate)); - } - - const wchar_t* const m_ObjName; - const FXJSOBJTYPE m_ObjType; - const FXJS_CONSTRUCTOR m_pConstructor; - const FXJS_DESTRUCTOR m_pDestructor; - - v8::Isolate* m_pIsolate; - v8::Global<v8::FunctionTemplate> m_FunctionTemplate; - v8::Global<v8::Signature> m_Signature; -}; - -static v8::Local<v8::ObjectTemplate> GetGlobalObjectTemplate( - v8::Isolate* pIsolate) { - int maxID = CFXJS_ObjDefinition::MaxID(pIsolate); - for (int i = 0; i < maxID; ++i) { - CFXJS_ObjDefinition* pObjDef = CFXJS_ObjDefinition::ForID(pIsolate, i); - if (pObjDef->m_ObjType == FXJSOBJTYPE_GLOBAL) - return pObjDef->GetInstanceTemplate(); - } - if (!g_DefaultGlobalObjectTemplate) { - g_DefaultGlobalObjectTemplate = new v8::Global<v8::ObjectTemplate>; - g_DefaultGlobalObjectTemplate->Reset(pIsolate, - v8::ObjectTemplate::New(pIsolate)); - } - return g_DefaultGlobalObjectTemplate->Get(pIsolate); -} - -void* FXJS_ArrayBufferAllocator::Allocate(size_t length) { - return calloc(1, length); -} - -void* FXJS_ArrayBufferAllocator::AllocateUninitialized(size_t length) { - return malloc(length); -} - -void FXJS_ArrayBufferAllocator::Free(void* data, size_t length) { - free(data); -} - -void V8TemplateMapTraits::Dispose(v8::Isolate* isolate, - v8::Global<v8::Object> value, - void* key) { - v8::Local<v8::Object> obj = value.Get(isolate); - if (obj.IsEmpty()) - return; - int id = FXJS_GetObjDefnID(obj); - if (id == -1) - return; - - CFXJS_ObjDefinition* pObjDef = CFXJS_ObjDefinition::ForID(isolate, id); - if (!pObjDef) - return; - if (pObjDef->m_pDestructor) - pObjDef->m_pDestructor(obj); - FXJS_FreePrivate(obj); -} - -V8TemplateMapTraits::MapType* V8TemplateMapTraits::MapFromWeakCallbackInfo( - const v8::WeakCallbackInfo<WeakCallbackDataType>& data) { - V8TemplateMap* pMap = - (FXJS_PerIsolateData::Get(data.GetIsolate()))->m_pDynamicObjsMap; - return pMap ? &pMap->m_map : nullptr; -} - -void FXJS_Initialize(unsigned int embedderDataSlot, v8::Isolate* pIsolate) { - if (g_isolate) { - ASSERT(g_embedderDataSlot == embedderDataSlot); - ASSERT(g_isolate == pIsolate); - return; - } - g_embedderDataSlot = embedderDataSlot; - g_isolate = pIsolate; -} - -void FXJS_Release() { - ASSERT(!g_isolate || g_isolate_ref_count == 0); - delete g_DefaultGlobalObjectTemplate; - g_DefaultGlobalObjectTemplate = nullptr; - g_isolate = nullptr; - - delete g_arrayBufferAllocator; - g_arrayBufferAllocator = nullptr; -} - -bool FXJS_GetIsolate(v8::Isolate** pResultIsolate) { - if (g_isolate) { - *pResultIsolate = g_isolate; - return false; - } - // Provide backwards compatibility when no external isolate. - if (!g_arrayBufferAllocator) - g_arrayBufferAllocator = new FXJS_ArrayBufferAllocator(); - v8::Isolate::CreateParams params; - params.array_buffer_allocator = g_arrayBufferAllocator; - *pResultIsolate = v8::Isolate::New(params); - return true; -} - -size_t FXJS_GlobalIsolateRefCount() { - return g_isolate_ref_count; -} - -// static -void FXJS_PerIsolateData::SetUp(v8::Isolate* pIsolate) { - if (!pIsolate->GetData(g_embedderDataSlot)) - pIsolate->SetData(g_embedderDataSlot, new FXJS_PerIsolateData()); -} - -// static -FXJS_PerIsolateData* FXJS_PerIsolateData::Get(v8::Isolate* pIsolate) { - return static_cast<FXJS_PerIsolateData*>( - pIsolate->GetData(g_embedderDataSlot)); -} - -int FXJS_DefineObj(v8::Isolate* pIsolate, - const wchar_t* sObjName, - FXJSOBJTYPE eObjType, - FXJS_CONSTRUCTOR pConstructor, - FXJS_DESTRUCTOR pDestructor) { - v8::Isolate::Scope isolate_scope(pIsolate); - v8::HandleScope handle_scope(pIsolate); - - FXJS_PerIsolateData::SetUp(pIsolate); - CFXJS_ObjDefinition* pObjDef = new CFXJS_ObjDefinition( - pIsolate, sObjName, eObjType, pConstructor, pDestructor); - return pObjDef->AssignID(); -} - -void FXJS_DefineObjMethod(v8::Isolate* pIsolate, - int nObjDefnID, - const wchar_t* sMethodName, - v8::FunctionCallback pMethodCall) { - v8::Isolate::Scope isolate_scope(pIsolate); - v8::HandleScope handle_scope(pIsolate); - CFX_ByteString bsMethodName = CFX_WideString(sMethodName).UTF8Encode(); - CFXJS_ObjDefinition* pObjDef = - CFXJS_ObjDefinition::ForID(pIsolate, nObjDefnID); - pObjDef->GetInstanceTemplate()->Set( - v8::String::NewFromUtf8(pIsolate, bsMethodName.c_str(), - v8::NewStringType::kNormal).ToLocalChecked(), - v8::FunctionTemplate::New(pIsolate, pMethodCall, v8::Local<v8::Value>(), - pObjDef->GetSignature()), - v8::ReadOnly); -} - -void FXJS_DefineObjProperty(v8::Isolate* pIsolate, - int nObjDefnID, - const wchar_t* sPropName, - v8::AccessorGetterCallback pPropGet, - v8::AccessorSetterCallback pPropPut) { - v8::Isolate::Scope isolate_scope(pIsolate); - v8::HandleScope handle_scope(pIsolate); - CFX_ByteString bsPropertyName = CFX_WideString(sPropName).UTF8Encode(); - CFXJS_ObjDefinition* pObjDef = - CFXJS_ObjDefinition::ForID(pIsolate, nObjDefnID); - pObjDef->GetInstanceTemplate()->SetAccessor( - v8::String::NewFromUtf8(pIsolate, bsPropertyName.c_str(), - v8::NewStringType::kNormal).ToLocalChecked(), - pPropGet, pPropPut); -} - -void FXJS_DefineObjAllProperties(v8::Isolate* pIsolate, - int nObjDefnID, - v8::NamedPropertyQueryCallback pPropQurey, - v8::NamedPropertyGetterCallback pPropGet, - v8::NamedPropertySetterCallback pPropPut, - v8::NamedPropertyDeleterCallback pPropDel) { - v8::Isolate::Scope isolate_scope(pIsolate); - v8::HandleScope handle_scope(pIsolate); - CFXJS_ObjDefinition* pObjDef = - CFXJS_ObjDefinition::ForID(pIsolate, nObjDefnID); - pObjDef->GetInstanceTemplate()->SetNamedPropertyHandler(pPropGet, pPropPut, - pPropQurey, pPropDel); -} - -void FXJS_DefineObjConst(v8::Isolate* pIsolate, - int nObjDefnID, - const wchar_t* sConstName, - v8::Local<v8::Value> pDefault) { - v8::Isolate::Scope isolate_scope(pIsolate); - v8::HandleScope handle_scope(pIsolate); - CFX_ByteString bsConstName = CFX_WideString(sConstName).UTF8Encode(); - CFXJS_ObjDefinition* pObjDef = - CFXJS_ObjDefinition::ForID(pIsolate, nObjDefnID); - pObjDef->GetInstanceTemplate()->Set(pIsolate, bsConstName.c_str(), pDefault); -} - -void FXJS_DefineGlobalMethod(v8::Isolate* pIsolate, - const wchar_t* sMethodName, - v8::FunctionCallback pMethodCall) { - v8::Isolate::Scope isolate_scope(pIsolate); - v8::HandleScope handle_scope(pIsolate); - CFX_ByteString bsMethodName = CFX_WideString(sMethodName).UTF8Encode(); - GetGlobalObjectTemplate(pIsolate)->Set( - v8::String::NewFromUtf8(pIsolate, bsMethodName.c_str(), - v8::NewStringType::kNormal).ToLocalChecked(), - v8::FunctionTemplate::New(pIsolate, pMethodCall), v8::ReadOnly); -} - -void FXJS_DefineGlobalConst(v8::Isolate* pIsolate, - const wchar_t* sConstName, - v8::FunctionCallback pConstGetter) { - v8::Isolate::Scope isolate_scope(pIsolate); - v8::HandleScope handle_scope(pIsolate); - CFX_ByteString bsConst = CFX_WideString(sConstName).UTF8Encode(); - GetGlobalObjectTemplate(pIsolate) - ->SetAccessorProperty(v8::String::NewFromUtf8(pIsolate, bsConst.c_str(), - v8::NewStringType::kNormal) - .ToLocalChecked(), - v8::FunctionTemplate::New(pIsolate, pConstGetter)); -} - -void FXJS_InitializeRuntime( - v8::Isolate* pIsolate, - IJS_Runtime* pIRuntime, - v8::Global<v8::Context>* pV8PersistentContext, - std::vector<v8::Global<v8::Object>*>* pStaticObjects) { - if (pIsolate == g_isolate) - ++g_isolate_ref_count; - - v8::Isolate::Scope isolate_scope(pIsolate); -#ifdef PDF_ENABLE_XFA - v8::Locker locker(pIsolate); -#endif // PDF_ENABLE_XFA - v8::HandleScope handle_scope(pIsolate); - v8::Local<v8::Context> v8Context = - v8::Context::New(pIsolate, NULL, GetGlobalObjectTemplate(pIsolate)); - v8::Context::Scope context_scope(v8Context); - - FXJS_PerIsolateData::SetUp(pIsolate); - FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(pIsolate); - if (!pData) - return; - pData->CreateDynamicObjsMap(pIsolate); - v8Context->SetAlignedPointerInEmbedderData(kPerContextDataIndex, pIRuntime); - - int maxID = CFXJS_ObjDefinition::MaxID(pIsolate); - pStaticObjects->resize(maxID + 1); - for (int i = 0; i < maxID; ++i) { - CFXJS_ObjDefinition* pObjDef = CFXJS_ObjDefinition::ForID(pIsolate, i); - if (pObjDef->m_ObjType == FXJSOBJTYPE_GLOBAL) { - v8Context->Global() - ->GetPrototype() - ->ToObject(v8Context) - .ToLocalChecked() - ->SetAlignedPointerInInternalField(0, new CFXJS_PerObjectData(i)); - - if (pObjDef->m_pConstructor) - pObjDef->m_pConstructor(pIRuntime, v8Context->Global() - ->GetPrototype() - ->ToObject(v8Context) - .ToLocalChecked()); - } else if (pObjDef->m_ObjType == FXJSOBJTYPE_STATIC) { - CFX_ByteString bs = CFX_WideString(pObjDef->m_ObjName).UTF8Encode(); - v8::Local<v8::String> m_ObjName = - v8::String::NewFromUtf8(pIsolate, bs.c_str(), - v8::NewStringType::kNormal, - bs.GetLength()).ToLocalChecked(); - - v8::Local<v8::Object> obj = - FXJS_NewFxDynamicObj(pIsolate, pIRuntime, i, true); - v8Context->Global()->Set(v8Context, m_ObjName, obj).FromJust(); - pStaticObjects->at(i) = new v8::Global<v8::Object>(pIsolate, obj); - } - } - pV8PersistentContext->Reset(pIsolate, v8Context); -} - -void FXJS_ReleaseRuntime(v8::Isolate* pIsolate, - v8::Global<v8::Context>* pV8PersistentContext, - std::vector<v8::Global<v8::Object>*>* pStaticObjects) { - v8::Isolate::Scope isolate_scope(pIsolate); -#ifdef PDF_ENABLE_XFA - v8::Locker locker(pIsolate); -#endif // PDF_ENABLE_XFA - v8::HandleScope handle_scope(pIsolate); - v8::Local<v8::Context> context = - v8::Local<v8::Context>::New(pIsolate, *pV8PersistentContext); - v8::Context::Scope context_scope(context); - - FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(pIsolate); - if (!pData) - return; - pData->ReleaseDynamicObjsMap(); - - int maxID = CFXJS_ObjDefinition::MaxID(pIsolate); - for (int i = 0; i < maxID; ++i) { - CFXJS_ObjDefinition* pObjDef = CFXJS_ObjDefinition::ForID(pIsolate, i); - v8::Local<v8::Object> pObj; - if (pObjDef->m_ObjType == FXJSOBJTYPE_GLOBAL) { - pObj = - context->Global()->GetPrototype()->ToObject(context).ToLocalChecked(); - } else if (pStaticObjects->at(i) && !pStaticObjects->at(i)->IsEmpty()) { - pObj = v8::Local<v8::Object>::New(pIsolate, *pStaticObjects->at(i)); - delete pStaticObjects->at(i); - pStaticObjects->at(i) = nullptr; - } - - if (!pObj.IsEmpty()) { - if (pObjDef->m_pDestructor) - pObjDef->m_pDestructor(pObj); - FXJS_FreePrivate(pObj); - } - } - - if (pIsolate == g_isolate && --g_isolate_ref_count > 0) - return; - - for (int i = 0; i < maxID; ++i) - delete CFXJS_ObjDefinition::ForID(pIsolate, i); - - pIsolate->SetData(g_embedderDataSlot, nullptr); - delete pData; -} - -IJS_Runtime* FXJS_GetRuntimeFromIsolate(v8::Isolate* pIsolate) { - v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); - return static_cast<IJS_Runtime*>( - context->GetAlignedPointerFromEmbedderData(kPerContextDataIndex)); -} - -#ifdef PDF_ENABLE_XFA -void FXJS_SetRuntimeForV8Context(v8::Local<v8::Context> v8Context, - IJS_Runtime* pIRuntime) { - v8Context->SetAlignedPointerInEmbedderData(kPerContextDataIndex, pIRuntime); -} -#endif // PDF_ENABLE_XFA - -int FXJS_Execute(v8::Isolate* pIsolate, - IJS_Context* pJSContext, - const wchar_t* script, - FXJSErr* pError) { - v8::Isolate::Scope isolate_scope(pIsolate); - v8::TryCatch try_catch(pIsolate); - CFX_ByteString bsScript = CFX_WideString(script).UTF8Encode(); - v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); - v8::Local<v8::Script> compiled_script; - if (!v8::Script::Compile( - context, v8::String::NewFromUtf8( - pIsolate, bsScript.c_str(), v8::NewStringType::kNormal, - bsScript.GetLength()).ToLocalChecked()) - .ToLocal(&compiled_script)) { - v8::String::Utf8Value error(try_catch.Exception()); - // TODO(tsepez): return error via pError->message. - return -1; - } - - v8::Local<v8::Value> result; - if (!compiled_script->Run(context).ToLocal(&result)) { - v8::String::Utf8Value error(try_catch.Exception()); - // TODO(tsepez): return error via pError->message. - return -1; - } - return 0; -} - -v8::Local<v8::Object> FXJS_NewFxDynamicObj(v8::Isolate* pIsolate, - IJS_Runtime* pIRuntime, - int nObjDefnID, - bool bStatic) { - v8::Isolate::Scope isolate_scope(pIsolate); - v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); - if (nObjDefnID == -1) { - v8::Local<v8::ObjectTemplate> objTempl = v8::ObjectTemplate::New(pIsolate); - v8::Local<v8::Object> obj; - if (!objTempl->NewInstance(context).ToLocal(&obj)) - return v8::Local<v8::Object>(); - return obj; - } - - FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(pIsolate); - if (!pData) - return v8::Local<v8::Object>(); - - if (nObjDefnID < 0 || nObjDefnID >= CFXJS_ObjDefinition::MaxID(pIsolate)) - return v8::Local<v8::Object>(); - - CFXJS_ObjDefinition* pObjDef = - CFXJS_ObjDefinition::ForID(pIsolate, nObjDefnID); - v8::Local<v8::Object> obj; - if (!pObjDef->GetInstanceTemplate()->NewInstance(context).ToLocal(&obj)) - return v8::Local<v8::Object>(); - - CFXJS_PerObjectData* pPerObjData = new CFXJS_PerObjectData(nObjDefnID); - obj->SetAlignedPointerInInternalField(0, pPerObjData); - if (pObjDef->m_pConstructor) - pObjDef->m_pConstructor(pIRuntime, obj); - - if (!bStatic && FXJS_PerIsolateData::Get(pIsolate)->m_pDynamicObjsMap) { - FXJS_PerIsolateData::Get(pIsolate) - ->m_pDynamicObjsMap->set(pPerObjData, obj); - } - return obj; -} - -v8::Local<v8::Object> FXJS_GetThisObj(v8::Isolate* pIsolate) { - v8::Isolate::Scope isolate_scope(pIsolate); - if (!FXJS_PerIsolateData::Get(pIsolate)) - return v8::Local<v8::Object>(); - - // Return the global object. - v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); - return context->Global()->GetPrototype()->ToObject(context).ToLocalChecked(); -} - -int FXJS_GetObjDefnID(v8::Local<v8::Object> pObj) { - if (pObj.IsEmpty() || !pObj->InternalFieldCount()) - return -1; - CFXJS_PerObjectData* pPerObjectData = static_cast<CFXJS_PerObjectData*>( - pObj->GetAlignedPointerFromInternalField(0)); - if (pPerObjectData) - return pPerObjectData->m_ObjDefID; - return -1; -} - -void FXJS_Error(v8::Isolate* pIsolate, const CFX_WideString& message) { - // Conversion from pdfium's wchar_t wide-strings to v8's uint16_t - // wide-strings isn't handled by v8, so use UTF8 as a common - // intermediate format. - CFX_ByteString utf8_message = message.UTF8Encode(); - pIsolate->ThrowException( - v8::String::NewFromUtf8(pIsolate, utf8_message.c_str(), - v8::NewStringType::kNormal).ToLocalChecked()); -} - -const wchar_t* FXJS_GetTypeof(v8::Local<v8::Value> pObj) { - if (pObj.IsEmpty()) - return NULL; - if (pObj->IsString()) - return kFXJSValueNameString; - if (pObj->IsNumber()) - return kFXJSValueNameNumber; - if (pObj->IsBoolean()) - return kFXJSValueNameBoolean; - if (pObj->IsDate()) - return kFXJSValueNameDate; - if (pObj->IsObject()) - return kFXJSValueNameObject; - if (pObj->IsNull()) - return kFXJSValueNameNull; - if (pObj->IsUndefined()) - return kFXJSValueNameUndefined; - return NULL; -} - -void FXJS_SetPrivate(v8::Isolate* pIsolate, - v8::Local<v8::Object> pObj, - void* p) { - if (pObj.IsEmpty() || !pObj->InternalFieldCount()) - return; - CFXJS_PerObjectData* pPerObjectData = static_cast<CFXJS_PerObjectData*>( - pObj->GetAlignedPointerFromInternalField(0)); - if (!pPerObjectData) - return; - pPerObjectData->m_pPrivate = p; -} - -void* FXJS_GetPrivate(v8::Isolate* pIsolate, v8::Local<v8::Object> pObj) { - if (pObj.IsEmpty()) - return nullptr; - CFXJS_PerObjectData* pPerObjectData = nullptr; - if (pObj->InternalFieldCount()) { - pPerObjectData = static_cast<CFXJS_PerObjectData*>( - pObj->GetAlignedPointerFromInternalField(0)); - } else { - // It could be a global proxy object. - v8::Local<v8::Value> v = pObj->GetPrototype(); - v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); - if (v->IsObject()) { - pPerObjectData = static_cast<CFXJS_PerObjectData*>( - v->ToObject(context) - .ToLocalChecked() - ->GetAlignedPointerFromInternalField(0)); - } - } - return pPerObjectData ? pPerObjectData->m_pPrivate : nullptr; -} - -void FXJS_FreePrivate(void* pPerObjectData) { - delete static_cast<CFXJS_PerObjectData*>(pPerObjectData); -} - -void FXJS_FreePrivate(v8::Local<v8::Object> pObj) { - if (pObj.IsEmpty() || !pObj->InternalFieldCount()) - return; - FXJS_FreePrivate(pObj->GetAlignedPointerFromInternalField(0)); - pObj->SetAlignedPointerInInternalField(0, NULL); -} - -v8::Local<v8::String> FXJS_WSToJSString(v8::Isolate* pIsolate, - const wchar_t* PropertyName, - int Len) { - CFX_WideString ws = CFX_WideString(PropertyName, Len); - CFX_ByteString bs = ws.UTF8Encode(); - if (!pIsolate) - pIsolate = v8::Isolate::GetCurrent(); - return v8::String::NewFromUtf8(pIsolate, bs.c_str(), - v8::NewStringType::kNormal).ToLocalChecked(); -} - -v8::Local<v8::Value> FXJS_GetObjectElement(v8::Isolate* pIsolate, - v8::Local<v8::Object> pObj, - const wchar_t* PropertyName) { - if (pObj.IsEmpty()) - return v8::Local<v8::Value>(); - v8::Local<v8::Value> val; - if (!pObj->Get(pIsolate->GetCurrentContext(), - FXJS_WSToJSString(pIsolate, PropertyName)).ToLocal(&val)) - return v8::Local<v8::Value>(); - return val; -} - -v8::Local<v8::Array> FXJS_GetObjectElementNames(v8::Isolate* pIsolate, - v8::Local<v8::Object> pObj) { - if (pObj.IsEmpty()) - return v8::Local<v8::Array>(); - v8::Local<v8::Array> val; - if (!pObj->GetPropertyNames(pIsolate->GetCurrentContext()).ToLocal(&val)) - return v8::Local<v8::Array>(); - return val; -} - -void FXJS_PutObjectString(v8::Isolate* pIsolate, - v8::Local<v8::Object> pObj, - const wchar_t* PropertyName, - const wchar_t* sValue) { - if (pObj.IsEmpty()) - return; - pObj->Set(pIsolate->GetCurrentContext(), - FXJS_WSToJSString(pIsolate, PropertyName), - FXJS_WSToJSString(pIsolate, sValue)).FromJust(); -} - -void FXJS_PutObjectNumber(v8::Isolate* pIsolate, - v8::Local<v8::Object> pObj, - const wchar_t* PropertyName, - int nValue) { - if (pObj.IsEmpty()) - return; - pObj->Set(pIsolate->GetCurrentContext(), - FXJS_WSToJSString(pIsolate, PropertyName), - v8::Int32::New(pIsolate, nValue)).FromJust(); -} - -void FXJS_PutObjectNumber(v8::Isolate* pIsolate, - v8::Local<v8::Object> pObj, - const wchar_t* PropertyName, - float fValue) { - if (pObj.IsEmpty()) - return; - pObj->Set(pIsolate->GetCurrentContext(), - FXJS_WSToJSString(pIsolate, PropertyName), - v8::Number::New(pIsolate, (double)fValue)).FromJust(); -} - -void FXJS_PutObjectNumber(v8::Isolate* pIsolate, - v8::Local<v8::Object> pObj, - const wchar_t* PropertyName, - double dValue) { - if (pObj.IsEmpty()) - return; - pObj->Set(pIsolate->GetCurrentContext(), - FXJS_WSToJSString(pIsolate, PropertyName), - v8::Number::New(pIsolate, (double)dValue)).FromJust(); -} - -void FXJS_PutObjectBoolean(v8::Isolate* pIsolate, - v8::Local<v8::Object> pObj, - const wchar_t* PropertyName, - bool bValue) { - if (pObj.IsEmpty()) - return; - pObj->Set(pIsolate->GetCurrentContext(), - FXJS_WSToJSString(pIsolate, PropertyName), - v8::Boolean::New(pIsolate, bValue)).FromJust(); -} - -void FXJS_PutObjectObject(v8::Isolate* pIsolate, - v8::Local<v8::Object> pObj, - const wchar_t* PropertyName, - v8::Local<v8::Object> pPut) { - if (pObj.IsEmpty()) - return; - pObj->Set(pIsolate->GetCurrentContext(), - FXJS_WSToJSString(pIsolate, PropertyName), pPut).FromJust(); -} - -void FXJS_PutObjectNull(v8::Isolate* pIsolate, - v8::Local<v8::Object> pObj, - const wchar_t* PropertyName) { - if (pObj.IsEmpty()) - return; - pObj->Set(pIsolate->GetCurrentContext(), - FXJS_WSToJSString(pIsolate, PropertyName), - v8::Local<v8::Object>()).FromJust(); -} - -v8::Local<v8::Array> FXJS_NewArray(v8::Isolate* pIsolate) { - return v8::Array::New(pIsolate); -} - -unsigned FXJS_PutArrayElement(v8::Isolate* pIsolate, - v8::Local<v8::Array> pArray, - unsigned index, - v8::Local<v8::Value> pValue) { - if (pArray.IsEmpty()) - return 0; - if (pArray->Set(pIsolate->GetCurrentContext(), index, pValue).IsNothing()) - return 0; - return 1; -} - -v8::Local<v8::Value> FXJS_GetArrayElement(v8::Isolate* pIsolate, - v8::Local<v8::Array> pArray, - unsigned index) { - if (pArray.IsEmpty()) - return v8::Local<v8::Value>(); - v8::Local<v8::Value> val; - if (!pArray->Get(pIsolate->GetCurrentContext(), index).ToLocal(&val)) - return v8::Local<v8::Value>(); - return val; -} - -unsigned FXJS_GetArrayLength(v8::Local<v8::Array> pArray) { - if (pArray.IsEmpty()) - return 0; - return pArray->Length(); -} - -v8::Local<v8::Value> FXJS_NewNumber(v8::Isolate* pIsolate, int number) { - return v8::Int32::New(pIsolate, number); -} - -v8::Local<v8::Value> FXJS_NewNumber(v8::Isolate* pIsolate, double number) { - return v8::Number::New(pIsolate, number); -} - -v8::Local<v8::Value> FXJS_NewNumber(v8::Isolate* pIsolate, float number) { - return v8::Number::New(pIsolate, (float)number); -} - -v8::Local<v8::Value> FXJS_NewBoolean(v8::Isolate* pIsolate, bool b) { - return v8::Boolean::New(pIsolate, b); -} - -v8::Local<v8::Value> FXJS_NewObject(v8::Isolate* pIsolate, - v8::Local<v8::Object> pObj) { - if (pObj.IsEmpty()) - return v8::Local<v8::Value>(); - return pObj->Clone(); -} - -v8::Local<v8::Value> FXJS_NewObject2(v8::Isolate* pIsolate, - v8::Local<v8::Array> pObj) { - if (pObj.IsEmpty()) - return v8::Local<v8::Value>(); - return pObj->Clone(); -} - -v8::Local<v8::Value> FXJS_NewString(v8::Isolate* pIsolate, const wchar_t* str) { - return FXJS_WSToJSString(pIsolate, str); -} - -v8::Local<v8::Value> FXJS_NewNull() { - return v8::Local<v8::Value>(); -} - -v8::Local<v8::Value> FXJS_NewDate(v8::Isolate* pIsolate, double d) { - return v8::Date::New(pIsolate->GetCurrentContext(), d).ToLocalChecked(); -} - -int FXJS_ToInt32(v8::Isolate* pIsolate, v8::Local<v8::Value> pValue) { - if (pValue.IsEmpty()) - return 0; - v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); - return pValue->ToInt32(context).ToLocalChecked()->Value(); -} - -bool FXJS_ToBoolean(v8::Isolate* pIsolate, v8::Local<v8::Value> pValue) { - if (pValue.IsEmpty()) - return false; - v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); - return pValue->ToBoolean(context).ToLocalChecked()->Value(); -} - -double FXJS_ToNumber(v8::Isolate* pIsolate, v8::Local<v8::Value> pValue) { - if (pValue.IsEmpty()) - return 0.0; - v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); - return pValue->ToNumber(context).ToLocalChecked()->Value(); -} - -v8::Local<v8::Object> FXJS_ToObject(v8::Isolate* pIsolate, - v8::Local<v8::Value> pValue) { - if (pValue.IsEmpty()) - return v8::Local<v8::Object>(); - v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); - return pValue->ToObject(context).ToLocalChecked(); -} - -CFX_WideString FXJS_ToString(v8::Isolate* pIsolate, - v8::Local<v8::Value> pValue) { - if (pValue.IsEmpty()) - return L""; - v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); - v8::String::Utf8Value s(pValue->ToString(context).ToLocalChecked()); - return CFX_WideString::FromUTF8(*s, s.length()); -} - -v8::Local<v8::Array> FXJS_ToArray(v8::Isolate* pIsolate, - v8::Local<v8::Value> pValue) { - if (pValue.IsEmpty()) - return v8::Local<v8::Array>(); - v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); - return v8::Local<v8::Array>::Cast(pValue->ToObject(context).ToLocalChecked()); -} - -void FXJS_ValueCopy(v8::Local<v8::Value>& pTo, v8::Local<v8::Value> pFrom) { - pTo = pFrom; -} - - diff --git a/fpdfsdk/src/jsapi/fxjs_v8_embeddertest.cpp b/fpdfsdk/src/jsapi/fxjs_v8_embeddertest.cpp deleted file mode 100644 index b7700c8b60..0000000000 --- a/fpdfsdk/src/jsapi/fxjs_v8_embeddertest.cpp +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2015 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "testing/gtest/include/gtest/gtest.h" -#include "testing/js_embedder_test.h" - -namespace { - -const wchar_t kScript[] = L"fred = 7"; - -} // namespace - -class FXJSV8EmbedderTest : public JSEmbedderTest {}; - -TEST_F(FXJSV8EmbedderTest, Getters) { - v8::Isolate::Scope isolate_scope(isolate()); -#ifdef PDF_ENABLE_XFA - v8::Locker locker(isolate()); -#endif // PDF_ENABLE_XFA - v8::HandleScope handle_scope(isolate()); - v8::Context::Scope context_scope(GetV8Context()); - - FXJSErr error; - int sts = FXJS_Execute(isolate(), nullptr, kScript, &error); - EXPECT_EQ(0, sts); - - v8::Local<v8::Object> This = FXJS_GetThisObj(isolate()); - v8::Local<v8::Value> fred = FXJS_GetObjectElement(isolate(), This, L"fred"); - EXPECT_TRUE(fred->IsNumber()); -} diff --git a/fpdfsdk/src/pdfwindow/PWL_Button.cpp b/fpdfsdk/src/pdfwindow/PWL_Button.cpp deleted file mode 100644 index 2c6c36c047..0000000000 --- a/fpdfsdk/src/pdfwindow/PWL_Button.cpp +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "fpdfsdk/include/pdfwindow/PWL_Button.h" -#include "fpdfsdk/include/pdfwindow/PWL_Utils.h" -#include "fpdfsdk/include/pdfwindow/PWL_Wnd.h" - -CPWL_Button::CPWL_Button() : m_bMouseDown(FALSE) {} - -CPWL_Button::~CPWL_Button() { -} - -CFX_ByteString CPWL_Button::GetClassName() const { - return "CPWL_Button"; -} - -void CPWL_Button::OnCreate(PWL_CREATEPARAM& cp) { - cp.eCursorType = FXCT_HAND; -} - -FX_BOOL CPWL_Button::OnLButtonDown(const CFX_FloatPoint& point, - FX_DWORD nFlag) { - CPWL_Wnd::OnLButtonDown(point, nFlag); - - m_bMouseDown = TRUE; - SetCapture(); - - return TRUE; -} - -FX_BOOL CPWL_Button::OnLButtonUp(const CFX_FloatPoint& point, FX_DWORD nFlag) { - CPWL_Wnd::OnLButtonUp(point, nFlag); - - ReleaseCapture(); - m_bMouseDown = FALSE; - - return TRUE; -} diff --git a/fpdfsdk/src/pdfwindow/PWL_Caret.cpp b/fpdfsdk/src/pdfwindow/PWL_Caret.cpp deleted file mode 100644 index 320b2bf62f..0000000000 --- a/fpdfsdk/src/pdfwindow/PWL_Caret.cpp +++ /dev/null @@ -1,160 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "fpdfsdk/include/pdfwindow/PWL_Caret.h" -#include "fpdfsdk/include/pdfwindow/PWL_Utils.h" -#include "fpdfsdk/include/pdfwindow/PWL_Wnd.h" - -#define PWL_CARET_FLASHINTERVAL 500 - -CPWL_Caret::CPWL_Caret() - : m_bFlash(FALSE), - m_ptHead(0, 0), - m_ptFoot(0, 0), - m_fWidth(0.4f), - m_nDelay(0) {} - -CPWL_Caret::~CPWL_Caret() {} - -CFX_ByteString CPWL_Caret::GetClassName() const { - return "CPWL_Caret"; -} - -void CPWL_Caret::GetThisAppearanceStream(CFX_ByteTextBuf& sAppStream) { - GetCaretApp(sAppStream, CFX_FloatPoint(0.0f, 0.0f)); -} - -void CPWL_Caret::DrawThisAppearance(CFX_RenderDevice* pDevice, - CFX_Matrix* pUser2Device) { - if (IsVisible() && m_bFlash) { - CFX_FloatRect rcRect = GetCaretRect(); - CFX_FloatRect rcClip = GetClipRect(); - - CFX_PathData path; - - path.SetPointCount(2); - - FX_FLOAT fCaretX = rcRect.left + m_fWidth * 0.5f; - FX_FLOAT fCaretTop = rcRect.top; - FX_FLOAT fCaretBottom = rcRect.bottom; - - if (!rcClip.IsEmpty()) { - rcRect.Intersect(rcClip); - if (!rcRect.IsEmpty()) { - fCaretTop = rcRect.top; - fCaretBottom = rcRect.bottom; - path.SetPoint(0, fCaretX, fCaretBottom, FXPT_MOVETO); - path.SetPoint(1, fCaretX, fCaretTop, FXPT_LINETO); - } else { - return; - } - } else { - path.SetPoint(0, fCaretX, fCaretBottom, FXPT_MOVETO); - path.SetPoint(1, fCaretX, fCaretTop, FXPT_LINETO); - } - - CFX_GraphStateData gsd; - gsd.m_LineWidth = m_fWidth; - - pDevice->DrawPath(&path, pUser2Device, &gsd, 0, ArgbEncode(255, 0, 0, 0), - FXFILL_ALTERNATE); - } -} - -void CPWL_Caret::GetCaretApp(CFX_ByteTextBuf& sAppStream, - const CFX_FloatPoint& ptOffset) { - if (IsVisible() && m_bFlash) { - CFX_ByteTextBuf sCaret; - - CFX_FloatRect rcRect = GetCaretRect(); - CFX_FloatRect rcClip = GetClipRect(); - - rcRect = CPWL_Utils::OffsetRect(rcRect, ptOffset.x, ptOffset.y); - rcClip = CPWL_Utils::OffsetRect(rcClip, ptOffset.x, ptOffset.y); - - sCaret << "q\n"; - if (!rcClip.IsEmpty()) { - sCaret << rcClip.left << " " << rcClip.bottom + 2.5f << " " - << rcClip.right - rcClip.left << " " - << rcClip.top - rcClip.bottom - 4.5f << " re W n\n"; - } - sCaret << m_fWidth << " w\n0 G\n"; - sCaret << rcRect.left + m_fWidth / 2 << " " << rcRect.bottom << " m\n"; - sCaret << rcRect.left + m_fWidth / 2 << " " << rcRect.top << " l S\nQ\n"; - - sAppStream << sCaret; - } -} - -CFX_ByteString CPWL_Caret::GetCaretAppearanceStream( - const CFX_FloatPoint& ptOffset) { - CFX_ByteTextBuf sCaret; - GetCaretApp(sCaret, ptOffset); - return sCaret.GetByteString(); -} - -void CPWL_Caret::TimerProc() { - if (m_nDelay > 0) { - m_nDelay--; - } else { - m_bFlash = !m_bFlash; - InvalidateRect(); - } -} - -CFX_FloatRect CPWL_Caret::GetCaretRect() const { - return CFX_FloatRect(m_ptFoot.x, m_ptFoot.y, m_ptHead.x + m_fWidth, - m_ptHead.y); -} - -void CPWL_Caret::SetCaret(FX_BOOL bVisible, - const CFX_FloatPoint& ptHead, - const CFX_FloatPoint& ptFoot) { - if (bVisible) { - if (IsVisible()) { - if (m_ptHead.x != ptHead.x || m_ptHead.y != ptHead.y || - m_ptFoot.x != ptFoot.x || m_ptFoot.y != ptFoot.y) { - m_ptHead = ptHead; - m_ptFoot = ptFoot; - - m_bFlash = TRUE; - Move(m_rcInvalid, FALSE, TRUE); - } - } else { - m_ptHead = ptHead; - m_ptFoot = ptFoot; - - EndTimer(); - BeginTimer(PWL_CARET_FLASHINTERVAL); - - CPWL_Wnd::SetVisible(TRUE); - m_bFlash = TRUE; - - Move(m_rcInvalid, FALSE, TRUE); - } - } else { - m_ptHead = CFX_FloatPoint(0, 0); - m_ptFoot = CFX_FloatPoint(0, 0); - - m_bFlash = FALSE; - if (IsVisible()) { - EndTimer(); - CPWL_Wnd::SetVisible(FALSE); - } - } -} - -void CPWL_Caret::InvalidateRect(CFX_FloatRect* pRect) { - if (pRect) { - CFX_FloatRect rcRefresh = CPWL_Utils::InflateRect(*pRect, 0.5f); - rcRefresh.top += 1; - rcRefresh.bottom -= 1; - - CPWL_Wnd::InvalidateRect(&rcRefresh); - } else { - CPWL_Wnd::InvalidateRect(pRect); - } -} diff --git a/fpdfsdk/src/pdfwindow/PWL_ComboBox.cpp b/fpdfsdk/src/pdfwindow/PWL_ComboBox.cpp deleted file mode 100644 index 6edd6bdd85..0000000000 --- a/fpdfsdk/src/pdfwindow/PWL_ComboBox.cpp +++ /dev/null @@ -1,651 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "fpdfsdk/include/pdfwindow/PWL_ComboBox.h" - -#include "fpdfsdk/include/pdfwindow/PWL_Edit.h" -#include "fpdfsdk/include/pdfwindow/PWL_EditCtrl.h" -#include "fpdfsdk/include/pdfwindow/PWL_ListBox.h" -#include "fpdfsdk/include/pdfwindow/PWL_Utils.h" -#include "fpdfsdk/include/pdfwindow/PWL_Wnd.h" -#include "public/fpdf_fwlevent.h" - -#define PWLCB_DEFAULTFONTSIZE 12.0f - -#define IsFloatZero(f) ((f) < 0.0001 && (f) > -0.0001) -#define IsFloatBigger(fa, fb) ((fa) > (fb) && !IsFloatZero((fa) - (fb))) -#define IsFloatSmaller(fa, fb) ((fa) < (fb) && !IsFloatZero((fa) - (fb))) -#define IsFloatEqual(fa, fb) IsFloatZero((fa) - (fb)) - -FX_BOOL CPWL_CBListBox::OnLButtonUp(const CFX_FloatPoint& point, - FX_DWORD nFlag) { - CPWL_Wnd::OnLButtonUp(point, nFlag); - - if (m_bMouseDown) { - ReleaseCapture(); - m_bMouseDown = FALSE; - - if (ClientHitTest(point)) { - if (CPWL_Wnd* pParent = GetParentWindow()) { - pParent->OnNotify(this, PNM_LBUTTONUP, 0, - PWL_MAKEDWORD(point.x, point.y)); - } - - FX_BOOL bExit = FALSE; - OnNotifySelChanged(FALSE, bExit, nFlag); - if (bExit) - return FALSE; - } - } - - return TRUE; -} - -FX_BOOL CPWL_CBListBox::OnKeyDownWithExit(FX_WORD nChar, - FX_BOOL& bExit, - FX_DWORD nFlag) { - if (!m_pList) - return FALSE; - - switch (nChar) { - default: - return FALSE; - case FWL_VKEY_Up: - case FWL_VKEY_Down: - case FWL_VKEY_Home: - case FWL_VKEY_Left: - case FWL_VKEY_End: - case FWL_VKEY_Right: - break; - } - - switch (nChar) { - case FWL_VKEY_Up: - m_pList->OnVK_UP(IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); - break; - case FWL_VKEY_Down: - m_pList->OnVK_DOWN(IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); - break; - case FWL_VKEY_Home: - m_pList->OnVK_HOME(IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); - break; - case FWL_VKEY_Left: - m_pList->OnVK_LEFT(IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); - break; - case FWL_VKEY_End: - m_pList->OnVK_END(IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); - break; - case FWL_VKEY_Right: - m_pList->OnVK_RIGHT(IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); - break; - case FWL_VKEY_Delete: - break; - } - - OnNotifySelChanged(TRUE, bExit, nFlag); - - return TRUE; -} - -FX_BOOL CPWL_CBListBox::OnCharWithExit(FX_WORD nChar, - FX_BOOL& bExit, - FX_DWORD nFlag) { - if (!m_pList) - return FALSE; - - if (!m_pList->OnChar(nChar, IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag))) - return FALSE; - - if (CPWL_ComboBox* pComboBox = (CPWL_ComboBox*)GetParentWindow()) { - pComboBox->SetSelectText(); - } - - OnNotifySelChanged(TRUE, bExit, nFlag); - - return TRUE; -} - -void CPWL_CBButton::GetThisAppearanceStream(CFX_ByteTextBuf& sAppStream) { - CPWL_Wnd::GetThisAppearanceStream(sAppStream); - - CFX_FloatRect rectWnd = CPWL_Wnd::GetWindowRect(); - - if (IsVisible() && !rectWnd.IsEmpty()) { - CFX_ByteTextBuf sButton; - - CFX_FloatPoint ptCenter = GetCenterPoint(); - - CFX_FloatPoint pt1(ptCenter.x - PWL_CBBUTTON_TRIANGLE_HALFLEN, - ptCenter.y + PWL_CBBUTTON_TRIANGLE_HALFLEN * 0.5f); - CFX_FloatPoint pt2(ptCenter.x + PWL_CBBUTTON_TRIANGLE_HALFLEN, - ptCenter.y + PWL_CBBUTTON_TRIANGLE_HALFLEN * 0.5f); - CFX_FloatPoint pt3(ptCenter.x, - ptCenter.y - PWL_CBBUTTON_TRIANGLE_HALFLEN * 0.5f); - - if (IsFloatBigger(rectWnd.right - rectWnd.left, - PWL_CBBUTTON_TRIANGLE_HALFLEN * 2) && - IsFloatBigger(rectWnd.top - rectWnd.bottom, - PWL_CBBUTTON_TRIANGLE_HALFLEN)) { - sButton << "0 g\n"; - sButton << pt1.x << " " << pt1.y << " m\n"; - sButton << pt2.x << " " << pt2.y << " l\n"; - sButton << pt3.x << " " << pt3.y << " l\n"; - sButton << pt1.x << " " << pt1.y << " l f\n"; - - sAppStream << "q\n" << sButton << "Q\n"; - } - } -} - -void CPWL_CBButton::DrawThisAppearance(CFX_RenderDevice* pDevice, - CFX_Matrix* pUser2Device) { - CPWL_Wnd::DrawThisAppearance(pDevice, pUser2Device); - - CFX_FloatRect rectWnd = CPWL_Wnd::GetWindowRect(); - - if (IsVisible() && !rectWnd.IsEmpty()) { - CFX_FloatPoint ptCenter = GetCenterPoint(); - - CFX_FloatPoint pt1(ptCenter.x - PWL_CBBUTTON_TRIANGLE_HALFLEN, - ptCenter.y + PWL_CBBUTTON_TRIANGLE_HALFLEN * 0.5f); - CFX_FloatPoint pt2(ptCenter.x + PWL_CBBUTTON_TRIANGLE_HALFLEN, - ptCenter.y + PWL_CBBUTTON_TRIANGLE_HALFLEN * 0.5f); - CFX_FloatPoint pt3(ptCenter.x, - ptCenter.y - PWL_CBBUTTON_TRIANGLE_HALFLEN * 0.5f); - - if (IsFloatBigger(rectWnd.right - rectWnd.left, - PWL_CBBUTTON_TRIANGLE_HALFLEN * 2) && - IsFloatBigger(rectWnd.top - rectWnd.bottom, - PWL_CBBUTTON_TRIANGLE_HALFLEN)) { - CFX_PathData path; - - path.SetPointCount(4); - path.SetPoint(0, pt1.x, pt1.y, FXPT_MOVETO); - path.SetPoint(1, pt2.x, pt2.y, FXPT_LINETO); - path.SetPoint(2, pt3.x, pt3.y, FXPT_LINETO); - path.SetPoint(3, pt1.x, pt1.y, FXPT_LINETO); - - pDevice->DrawPath(&path, pUser2Device, NULL, - CPWL_Utils::PWLColorToFXColor(PWL_DEFAULT_BLACKCOLOR, - GetTransparency()), - 0, FXFILL_ALTERNATE); - } - } -} - -FX_BOOL CPWL_CBButton::OnLButtonDown(const CFX_FloatPoint& point, - FX_DWORD nFlag) { - CPWL_Wnd::OnLButtonDown(point, nFlag); - - SetCapture(); - - if (CPWL_Wnd* pParent = GetParentWindow()) { - pParent->OnNotify(this, PNM_LBUTTONDOWN, 0, - PWL_MAKEDWORD(point.x, point.y)); - } - - return TRUE; -} - -FX_BOOL CPWL_CBButton::OnLButtonUp(const CFX_FloatPoint& point, - FX_DWORD nFlag) { - CPWL_Wnd::OnLButtonUp(point, nFlag); - - ReleaseCapture(); - - return TRUE; -} - -CPWL_ComboBox::CPWL_ComboBox() - : m_pEdit(NULL), - m_pButton(NULL), - m_pList(NULL), - m_bPopup(FALSE), - m_nPopupWhere(0), - m_nSelectItem(-1), - m_pFillerNotify(NULL) {} - -CFX_ByteString CPWL_ComboBox::GetClassName() const { - return "CPWL_ComboBox"; -} - -void CPWL_ComboBox::OnCreate(PWL_CREATEPARAM& cp) { - cp.dwFlags &= ~PWS_HSCROLL; - cp.dwFlags &= ~PWS_VSCROLL; -} - -void CPWL_ComboBox::SetFocus() { - if (m_pEdit) - m_pEdit->SetFocus(); -} - -void CPWL_ComboBox::KillFocus() { - SetPopup(FALSE); - CPWL_Wnd::KillFocus(); -} - -CFX_WideString CPWL_ComboBox::GetText() const { - if (m_pEdit) { - return m_pEdit->GetText(); - } - return CFX_WideString(); -} - -void CPWL_ComboBox::SetText(const FX_WCHAR* text) { - if (m_pEdit) - m_pEdit->SetText(text); -} - -void CPWL_ComboBox::AddString(const FX_WCHAR* str) { - if (m_pList) - m_pList->AddString(str); -} - -int32_t CPWL_ComboBox::GetSelect() const { - return m_nSelectItem; -} - -void CPWL_ComboBox::SetSelect(int32_t nItemIndex) { - if (m_pList) - m_pList->Select(nItemIndex); - - m_pEdit->SetText(m_pList->GetText().c_str()); - - m_nSelectItem = nItemIndex; -} - -void CPWL_ComboBox::SetEditSel(int32_t nStartChar, int32_t nEndChar) { - if (m_pEdit) { - m_pEdit->SetSel(nStartChar, nEndChar); - } -} - -void CPWL_ComboBox::GetEditSel(int32_t& nStartChar, int32_t& nEndChar) const { - nStartChar = -1; - nEndChar = -1; - - if (m_pEdit) { - m_pEdit->GetSel(nStartChar, nEndChar); - } -} - -void CPWL_ComboBox::Clear() { - if (m_pEdit) { - m_pEdit->Clear(); - } -} - -void CPWL_ComboBox::CreateChildWnd(const PWL_CREATEPARAM& cp) { - CreateEdit(cp); - CreateButton(cp); - CreateListBox(cp); -} - -void CPWL_ComboBox::CreateEdit(const PWL_CREATEPARAM& cp) { - if (!m_pEdit) { - m_pEdit = new CPWL_CBEdit; - m_pEdit->AttachFFLData(m_pFormFiller); - - PWL_CREATEPARAM ecp = cp; - ecp.pParentWnd = this; - ecp.dwFlags = PWS_VISIBLE | PWS_CHILD | PWS_BORDER | PES_CENTER | - PES_AUTOSCROLL | PES_UNDO; - - if (HasFlag(PWS_AUTOFONTSIZE)) - ecp.dwFlags |= PWS_AUTOFONTSIZE; - - if (!HasFlag(PCBS_ALLOWCUSTOMTEXT)) - ecp.dwFlags |= PWS_READONLY; - - ecp.rcRectWnd = CFX_FloatRect(0, 0, 0, 0); - ecp.dwBorderWidth = 0; - ecp.nBorderStyle = PBS_SOLID; - - m_pEdit->Create(ecp); - } -} - -void CPWL_ComboBox::CreateButton(const PWL_CREATEPARAM& cp) { - if (!m_pButton) { - m_pButton = new CPWL_CBButton; - - PWL_CREATEPARAM bcp = cp; - bcp.pParentWnd = this; - bcp.dwFlags = PWS_VISIBLE | PWS_CHILD | PWS_BORDER | PWS_BACKGROUND; - bcp.sBackgroundColor = PWL_SCROLLBAR_BKCOLOR; - bcp.sBorderColor = PWL_DEFAULT_BLACKCOLOR; - bcp.dwBorderWidth = 2; - bcp.nBorderStyle = PBS_BEVELED; - bcp.eCursorType = FXCT_ARROW; - - m_pButton->Create(bcp); - } -} - -void CPWL_ComboBox::CreateListBox(const PWL_CREATEPARAM& cp) { - if (!m_pList) { - m_pList = new CPWL_CBListBox; - m_pList->AttachFFLData(m_pFormFiller); - PWL_CREATEPARAM lcp = cp; - lcp.pParentWnd = this; - lcp.dwFlags = - PWS_CHILD | PWS_BORDER | PWS_BACKGROUND | PLBS_HOVERSEL | PWS_VSCROLL; - lcp.nBorderStyle = PBS_SOLID; - lcp.dwBorderWidth = 1; - lcp.eCursorType = FXCT_ARROW; - lcp.rcRectWnd = CFX_FloatRect(0, 0, 0, 0); - - if (cp.dwFlags & PWS_AUTOFONTSIZE) - lcp.fFontSize = PWLCB_DEFAULTFONTSIZE; - else - lcp.fFontSize = cp.fFontSize; - - if (cp.sBorderColor.nColorType == COLORTYPE_TRANSPARENT) - lcp.sBorderColor = PWL_DEFAULT_BLACKCOLOR; - - if (cp.sBackgroundColor.nColorType == COLORTYPE_TRANSPARENT) - lcp.sBackgroundColor = PWL_DEFAULT_WHITECOLOR; - - m_pList->Create(lcp); - } -} - -void CPWL_ComboBox::RePosChildWnd() { - CFX_FloatRect rcClient = GetClientRect(); - - if (m_bPopup) { - CFX_FloatRect rclient = GetClientRect(); - CFX_FloatRect rcButton = rclient; - CFX_FloatRect rcEdit = rcClient; - CFX_FloatRect rcList = CPWL_Wnd::GetWindowRect(); - - FX_FLOAT fOldWindowHeight = m_rcOldWindow.Height(); - FX_FLOAT fOldClientHeight = fOldWindowHeight - GetBorderWidth() * 2; - - switch (m_nPopupWhere) { - case 0: - rcButton.left = rcButton.right - PWL_COMBOBOX_BUTTON_WIDTH; - - if (rcButton.left < rclient.left) - rcButton.left = rclient.left; - - rcButton.bottom = rcButton.top - fOldClientHeight; - - rcEdit.right = rcButton.left - 1.0f; - - if (rcEdit.left < rclient.left) - rcEdit.left = rclient.left; - - if (rcEdit.right < rcEdit.left) - rcEdit.right = rcEdit.left; - - rcEdit.bottom = rcEdit.top - fOldClientHeight; - - rcList.top -= fOldWindowHeight; - - break; - case 1: - rcButton.left = rcButton.right - PWL_COMBOBOX_BUTTON_WIDTH; - - if (rcButton.left < rclient.left) - rcButton.left = rclient.left; - - rcButton.top = rcButton.bottom + fOldClientHeight; - - rcEdit.right = rcButton.left - 1.0f; - - if (rcEdit.left < rclient.left) - rcEdit.left = rclient.left; - - if (rcEdit.right < rcEdit.left) - rcEdit.right = rcEdit.left; - - rcEdit.top = rcEdit.bottom + fOldClientHeight; - - rcList.bottom += fOldWindowHeight; - - break; - } - - if (m_pButton) - m_pButton->Move(rcButton, TRUE, FALSE); - - if (m_pEdit) - m_pEdit->Move(rcEdit, TRUE, FALSE); - - if (m_pList) { - m_pList->SetVisible(TRUE); - m_pList->Move(rcList, TRUE, FALSE); - m_pList->ScrollToListItem(m_nSelectItem); - } - } else { - CFX_FloatRect rcButton = rcClient; - - rcButton.left = rcButton.right - PWL_COMBOBOX_BUTTON_WIDTH; - - if (rcButton.left < rcClient.left) - rcButton.left = rcClient.left; - - if (m_pButton) - m_pButton->Move(rcButton, TRUE, FALSE); - - CFX_FloatRect rcEdit = rcClient; - rcEdit.right = rcButton.left - 1.0f; - - if (rcEdit.left < rcClient.left) - rcEdit.left = rcClient.left; - - if (rcEdit.right < rcEdit.left) - rcEdit.right = rcEdit.left; - - if (m_pEdit) - m_pEdit->Move(rcEdit, TRUE, FALSE); - - if (m_pList) - m_pList->SetVisible(FALSE); - } -} - -void CPWL_ComboBox::SelectAll() { - if (m_pEdit && HasFlag(PCBS_ALLOWCUSTOMTEXT)) - m_pEdit->SelectAll(); -} - -CFX_FloatRect CPWL_ComboBox::GetFocusRect() const { - return CFX_FloatRect(); -} - -void CPWL_ComboBox::SetPopup(FX_BOOL bPopup) { - if (!m_pList) - return; - if (bPopup == m_bPopup) - return; - FX_FLOAT fListHeight = m_pList->GetContentRect().Height(); - if (!IsFloatBigger(fListHeight, 0.0f)) - return; - - if (bPopup) { - if (m_pFillerNotify) { -#ifdef PDF_ENABLE_XFA - FX_BOOL bExit = FALSE; - m_pFillerNotify->OnPopupPreOpen(GetAttachedData(), bExit, 0); - if (bExit) - return; -#endif // PDF_ENABLE_XFA - int32_t nWhere = 0; - FX_FLOAT fPopupRet = 0.0f; - FX_FLOAT fPopupMin = 0.0f; - if (m_pList->GetCount() > 3) - fPopupMin = - m_pList->GetFirstHeight() * 3 + m_pList->GetBorderWidth() * 2; - FX_FLOAT fPopupMax = fListHeight + m_pList->GetBorderWidth() * 2; - m_pFillerNotify->QueryWherePopup(GetAttachedData(), fPopupMin, fPopupMax, - nWhere, fPopupRet); - - if (IsFloatBigger(fPopupRet, 0.0f)) { - m_bPopup = bPopup; - - CFX_FloatRect rcWindow = CPWL_Wnd::GetWindowRect(); - m_rcOldWindow = rcWindow; - switch (nWhere) { - default: - case 0: - rcWindow.bottom -= fPopupRet; - break; - case 1: - rcWindow.top += fPopupRet; - break; - } - - m_nPopupWhere = nWhere; - Move(rcWindow, TRUE, TRUE); -#ifdef PDF_ENABLE_XFA - bExit = FALSE; - m_pFillerNotify->OnPopupPostOpen(GetAttachedData(), bExit, 0); - if (bExit) - return; -#endif // PDF_ENABLE_XFA - } - } - } else { - m_bPopup = bPopup; - Move(m_rcOldWindow, TRUE, TRUE); - } -} - -FX_BOOL CPWL_ComboBox::OnKeyDown(FX_WORD nChar, FX_DWORD nFlag) { - if (!m_pList) - return FALSE; - if (!m_pEdit) - return FALSE; - - m_nSelectItem = -1; - - switch (nChar) { - case FWL_VKEY_Up: - if (m_pList->GetCurSel() > 0) { - FX_BOOL bExit = FALSE; -#ifdef PDF_ENABLE_XFA - if (m_pFillerNotify) { - m_pFillerNotify->OnPopupPreOpen(GetAttachedData(), bExit, nFlag); - if (bExit) - return FALSE; - bExit = FALSE; - m_pFillerNotify->OnPopupPostOpen(GetAttachedData(), bExit, nFlag); - if (bExit) - return FALSE; - } -#endif // PDF_ENABLE_XFA - if (m_pList->OnKeyDownWithExit(nChar, bExit, nFlag)) { - if (bExit) - return FALSE; - SetSelectText(); - } - } - return TRUE; - case FWL_VKEY_Down: - if (m_pList->GetCurSel() < m_pList->GetCount() - 1) { - FX_BOOL bExit = FALSE; -#ifdef PDF_ENABLE_XFA - if (m_pFillerNotify) { - m_pFillerNotify->OnPopupPreOpen(GetAttachedData(), bExit, nFlag); - if (bExit) - return FALSE; - bExit = FALSE; - m_pFillerNotify->OnPopupPostOpen(GetAttachedData(), bExit, nFlag); - if (bExit) - return FALSE; - } -#endif // PDF_ENABLE_XFA - if (m_pList->OnKeyDownWithExit(nChar, bExit, nFlag)) { - if (bExit) - return FALSE; - SetSelectText(); - } - } - return TRUE; - } - - if (HasFlag(PCBS_ALLOWCUSTOMTEXT)) - return m_pEdit->OnKeyDown(nChar, nFlag); - - return FALSE; -} - -FX_BOOL CPWL_ComboBox::OnChar(FX_WORD nChar, FX_DWORD nFlag) { - if (!m_pList) - return FALSE; - - if (!m_pEdit) - return FALSE; - - m_nSelectItem = -1; - if (HasFlag(PCBS_ALLOWCUSTOMTEXT)) - return m_pEdit->OnChar(nChar, nFlag); - - FX_BOOL bExit = FALSE; -#ifdef PDF_ENABLE_XFA - if (m_pFillerNotify) { - m_pFillerNotify->OnPopupPreOpen(GetAttachedData(), bExit, nFlag); - if (bExit) - return FALSE; - - m_pFillerNotify->OnPopupPostOpen(GetAttachedData(), bExit, nFlag); - if (bExit) - return FALSE; - } -#endif // PDF_ENABLE_XFA - return m_pList->OnCharWithExit(nChar, bExit, nFlag) ? bExit : FALSE; -} - -void CPWL_ComboBox::OnNotify(CPWL_Wnd* pWnd, - FX_DWORD msg, - intptr_t wParam, - intptr_t lParam) { - switch (msg) { - case PNM_LBUTTONDOWN: - if (pWnd == m_pButton) { - SetPopup(!m_bPopup); - return; - } - break; - case PNM_LBUTTONUP: - if (m_pEdit && m_pList) { - if (pWnd == m_pList) { - SetSelectText(); - SelectAll(); - m_pEdit->SetFocus(); - SetPopup(FALSE); - return; - } - } - } - - CPWL_Wnd::OnNotify(pWnd, msg, wParam, lParam); -} - -FX_BOOL CPWL_ComboBox::IsPopup() const { - return m_bPopup; -} - -void CPWL_ComboBox::SetSelectText() { - CFX_WideString swText = m_pList->GetText(); - m_pEdit->SelectAll(); - m_pEdit->ReplaceSel(m_pList->GetText().c_str()); - m_pEdit->SelectAll(); - - m_nSelectItem = m_pList->GetCurSel(); -} - -void CPWL_ComboBox::SetFillerNotify(IPWL_Filler_Notify* pNotify) { - m_pFillerNotify = pNotify; - - if (m_pEdit) - m_pEdit->SetFillerNotify(pNotify); - - if (m_pList) - m_pList->SetFillerNotify(pNotify); -} diff --git a/fpdfsdk/src/pdfwindow/PWL_Edit.cpp b/fpdfsdk/src/pdfwindow/PWL_Edit.cpp deleted file mode 100644 index c4a5bf03fd..0000000000 --- a/fpdfsdk/src/pdfwindow/PWL_Edit.cpp +++ /dev/null @@ -1,1190 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "fpdfsdk/include/pdfwindow/PWL_Edit.h" - -#include <vector> - -#include "core/include/fxcrt/fx_safe_types.h" -#include "core/include/fxcrt/fx_xml.h" -#include "fpdfsdk/include/pdfwindow/PWL_Caret.h" -#include "fpdfsdk/include/pdfwindow/PWL_EditCtrl.h" -#include "fpdfsdk/include/pdfwindow/PWL_FontMap.h" -#include "fpdfsdk/include/pdfwindow/PWL_ScrollBar.h" -#include "fpdfsdk/include/pdfwindow/PWL_Utils.h" -#include "fpdfsdk/include/pdfwindow/PWL_Wnd.h" -#include "public/fpdf_fwlevent.h" -#include "third_party/base/stl_util.h" - -CPWL_Edit::CPWL_Edit() - : m_pFillerNotify(NULL), m_pSpellCheck(NULL), m_bFocus(FALSE) { - m_pFormFiller = NULL; -} - -CPWL_Edit::~CPWL_Edit() { - ASSERT(m_bFocus == FALSE); -} - -CFX_ByteString CPWL_Edit::GetClassName() const { - return PWL_CLASSNAME_EDIT; -} - -void CPWL_Edit::OnDestroy() {} - -void CPWL_Edit::SetText(const FX_WCHAR* csText) { - CFX_WideString swText = csText; - - if (HasFlag(PES_RICH)) { - CFX_ByteString sValue = CFX_ByteString::FromUnicode(swText); - - if (CXML_Element* pXML = - CXML_Element::Parse(sValue.c_str(), sValue.GetLength())) { - int32_t nCount = pXML->CountChildren(); - FX_BOOL bFirst = TRUE; - - swText.Empty(); - - for (int32_t i = 0; i < nCount; i++) { - if (CXML_Element* pSubElement = pXML->GetElement(i)) { - CFX_ByteString tag = pSubElement->GetTagName(); - if (tag.EqualNoCase("p")) { - int nChild = pSubElement->CountChildren(); - CFX_WideString swSection; - for (int32_t j = 0; j < nChild; j++) { - swSection += pSubElement->GetContent(j); - } - - if (bFirst) - bFirst = FALSE; - else - swText += FWL_VKEY_Return; - swText += swSection; - } - } - } - - delete pXML; - } - } - - m_pEdit->SetText(swText.c_str()); -} - -void CPWL_Edit::RePosChildWnd() { - if (CPWL_ScrollBar* pVSB = GetVScrollBar()) { - CFX_FloatRect rcWindow = m_rcOldWindow; - CFX_FloatRect rcVScroll = - CFX_FloatRect(rcWindow.right, rcWindow.bottom, - rcWindow.right + PWL_SCROLLBAR_WIDTH, rcWindow.top); - pVSB->Move(rcVScroll, TRUE, FALSE); - } - - if (m_pEditCaret && !HasFlag(PES_TEXTOVERFLOW)) - m_pEditCaret->SetClipRect(CPWL_Utils::InflateRect( - GetClientRect(), 1.0f)); // +1 for caret beside border - - CPWL_EditCtrl::RePosChildWnd(); -} - -CFX_FloatRect CPWL_Edit::GetClientRect() const { - CFX_FloatRect rcClient = CPWL_Utils::DeflateRect( - GetWindowRect(), (FX_FLOAT)(GetBorderWidth() + GetInnerBorderWidth())); - - if (CPWL_ScrollBar* pVSB = GetVScrollBar()) { - if (pVSB->IsVisible()) { - rcClient.right -= PWL_SCROLLBAR_WIDTH; - } - } - - return rcClient; -} - -void CPWL_Edit::SetAlignFormatH(PWL_EDIT_ALIGNFORMAT_H nFormat, - FX_BOOL bPaint) { - m_pEdit->SetAlignmentH((int32_t)nFormat, bPaint); -} - -void CPWL_Edit::SetAlignFormatV(PWL_EDIT_ALIGNFORMAT_V nFormat, - FX_BOOL bPaint) { - m_pEdit->SetAlignmentV((int32_t)nFormat, bPaint); -} - -FX_BOOL CPWL_Edit::CanSelectAll() const { - return GetSelectWordRange() != m_pEdit->GetWholeWordRange(); -} - -FX_BOOL CPWL_Edit::CanClear() const { - return !IsReadOnly() && m_pEdit->IsSelected(); -} - -FX_BOOL CPWL_Edit::CanCopy() const { - return !HasFlag(PES_PASSWORD) && !HasFlag(PES_NOREAD) && - m_pEdit->IsSelected(); -} - -FX_BOOL CPWL_Edit::CanCut() const { - return CanCopy() && !IsReadOnly(); -} - -FX_BOOL CPWL_Edit::CanPaste() const { - if (IsReadOnly()) - return FALSE; - - CFX_WideString swClipboard; - if (IFX_SystemHandler* pSH = GetSystemHandler()) - swClipboard = pSH->GetClipboardText(GetAttachedHWnd()); - - return !swClipboard.IsEmpty(); -} - -void CPWL_Edit::CopyText() { - if (!CanCopy()) - return; - - CFX_WideString str = m_pEdit->GetSelText(); - - if (IFX_SystemHandler* pSH = GetSystemHandler()) - pSH->SetClipboardText(GetAttachedHWnd(), str); -} - -void CPWL_Edit::PasteText() { - if (!CanPaste()) - return; - - CFX_WideString swClipboard; - if (IFX_SystemHandler* pSH = GetSystemHandler()) - swClipboard = pSH->GetClipboardText(GetAttachedHWnd()); - - if (m_pFillerNotify) { - FX_BOOL bRC = TRUE; - FX_BOOL bExit = FALSE; - CFX_WideString strChangeEx; - int nSelStart = 0; - int nSelEnd = 0; - GetSel(nSelStart, nSelEnd); - m_pFillerNotify->OnBeforeKeyStroke(GetAttachedData(), swClipboard, - strChangeEx, nSelStart, nSelEnd, TRUE, - bRC, bExit, 0); - if (!bRC) - return; - if (bExit) - return; - } - - if (swClipboard.GetLength() > 0) { - Clear(); - InsertText(swClipboard.c_str()); - } -} - -void CPWL_Edit::CutText() { - if (!CanCut()) - return; - - CFX_WideString str = m_pEdit->GetSelText(); - - if (IFX_SystemHandler* pSH = GetSystemHandler()) - pSH->SetClipboardText(GetAttachedHWnd(), str); - - m_pEdit->Clear(); -} - -void CPWL_Edit::OnCreated() { - CPWL_EditCtrl::OnCreated(); - - if (CPWL_ScrollBar* pScroll = GetVScrollBar()) { - pScroll->RemoveFlag(PWS_AUTOTRANSPARENT); - pScroll->SetTransparency(255); - } - - SetParamByFlag(); - - m_rcOldWindow = GetWindowRect(); - - m_pEdit->SetOprNotify(this); - m_pEdit->EnableOprNotify(TRUE); -} - -void CPWL_Edit::SetParamByFlag() { - if (HasFlag(PES_RIGHT)) { - m_pEdit->SetAlignmentH(2, FALSE); - } else if (HasFlag(PES_MIDDLE)) { - m_pEdit->SetAlignmentH(1, FALSE); - } else { - m_pEdit->SetAlignmentH(0, FALSE); - } - - if (HasFlag(PES_BOTTOM)) { - m_pEdit->SetAlignmentV(2, FALSE); - } else if (HasFlag(PES_CENTER)) { - m_pEdit->SetAlignmentV(1, FALSE); - } else { - m_pEdit->SetAlignmentV(0, FALSE); - } - - if (HasFlag(PES_PASSWORD)) { - m_pEdit->SetPasswordChar('*', FALSE); - } - - m_pEdit->SetMultiLine(HasFlag(PES_MULTILINE), FALSE); - m_pEdit->SetAutoReturn(HasFlag(PES_AUTORETURN), FALSE); - m_pEdit->SetAutoFontSize(HasFlag(PWS_AUTOFONTSIZE), FALSE); - m_pEdit->SetAutoScroll(HasFlag(PES_AUTOSCROLL), FALSE); - m_pEdit->EnableUndo(HasFlag(PES_UNDO)); - - if (HasFlag(PES_TEXTOVERFLOW)) { - SetClipRect(CFX_FloatRect(0.0f, 0.0f, 0.0f, 0.0f)); - m_pEdit->SetTextOverflow(TRUE, FALSE); - } else { - if (m_pEditCaret) { - m_pEditCaret->SetClipRect(CPWL_Utils::InflateRect( - GetClientRect(), 1.0f)); // +1 for caret beside border - } - } - - if (HasFlag(PES_SPELLCHECK)) { - m_pSpellCheck = GetCreationParam().pSpellCheck; - } -} - -void CPWL_Edit::GetThisAppearanceStream(CFX_ByteTextBuf& sAppStream) { - CPWL_Wnd::GetThisAppearanceStream(sAppStream); - - CFX_FloatRect rcClient = GetClientRect(); - CFX_ByteTextBuf sLine; - - int32_t nCharArray = m_pEdit->GetCharArray(); - - if (nCharArray > 0) { - switch (GetBorderStyle()) { - case PBS_SOLID: { - sLine << "q\n" << GetBorderWidth() << " w\n" - << CPWL_Utils::GetColorAppStream(GetBorderColor(), FALSE) - << " 2 J 0 j\n"; - - for (int32_t i = 1; i < nCharArray; i++) { - sLine << rcClient.left + - ((rcClient.right - rcClient.left) / nCharArray) * i - << " " << rcClient.bottom << " m\n" - << rcClient.left + - ((rcClient.right - rcClient.left) / nCharArray) * i - << " " << rcClient.top << " l S\n"; - } - - sLine << "Q\n"; - } break; - case PBS_DASH: { - sLine << "q\n" << GetBorderWidth() << " w\n" - << CPWL_Utils::GetColorAppStream(GetBorderColor(), FALSE) - << " 2 J 0 j\n" - << "[" << GetBorderDash().nDash << " " << GetBorderDash().nGap - << "] " << GetBorderDash().nPhase << " d\n"; - - for (int32_t i = 1; i < nCharArray; i++) { - sLine << rcClient.left + - ((rcClient.right - rcClient.left) / nCharArray) * i - << " " << rcClient.bottom << " m\n" - << rcClient.left + - ((rcClient.right - rcClient.left) / nCharArray) * i - << " " << rcClient.top << " l S\n"; - } - - sLine << "Q\n"; - } break; - } - } - - sAppStream << sLine; - - CFX_ByteTextBuf sText; - - CFX_FloatPoint ptOffset = CFX_FloatPoint(0.0f, 0.0f); - - CPVT_WordRange wrWhole = m_pEdit->GetWholeWordRange(); - CPVT_WordRange wrSelect = GetSelectWordRange(); - CPVT_WordRange wrVisible = - (HasFlag(PES_TEXTOVERFLOW) ? wrWhole : m_pEdit->GetVisibleWordRange()); - CPVT_WordRange wrSelBefore(wrWhole.BeginPos, wrSelect.BeginPos); - CPVT_WordRange wrSelAfter(wrSelect.EndPos, wrWhole.EndPos); - - CPVT_WordRange wrTemp = - CPWL_Utils::OverlapWordRange(GetSelectWordRange(), wrVisible); - CFX_ByteString sEditSel = - CPWL_Utils::GetEditSelAppStream(m_pEdit, ptOffset, &wrTemp); - - if (sEditSel.GetLength() > 0) - sText << CPWL_Utils::GetColorAppStream(PWL_DEFAULT_SELBACKCOLOR) - << sEditSel; - - wrTemp = CPWL_Utils::OverlapWordRange(wrVisible, wrSelBefore); - CFX_ByteString sEditBefore = CPWL_Utils::GetEditAppStream( - m_pEdit, ptOffset, &wrTemp, !HasFlag(PES_CHARARRAY), - m_pEdit->GetPasswordChar()); - - if (sEditBefore.GetLength() > 0) - sText << "BT\n" << CPWL_Utils::GetColorAppStream(GetTextColor()) - << sEditBefore << "ET\n"; - - wrTemp = CPWL_Utils::OverlapWordRange(wrVisible, wrSelect); - CFX_ByteString sEditMid = CPWL_Utils::GetEditAppStream( - m_pEdit, ptOffset, &wrTemp, !HasFlag(PES_CHARARRAY), - m_pEdit->GetPasswordChar()); - - if (sEditMid.GetLength() > 0) - sText << "BT\n" - << CPWL_Utils::GetColorAppStream(CPWL_Color(COLORTYPE_GRAY, 1)) - << sEditMid << "ET\n"; - - wrTemp = CPWL_Utils::OverlapWordRange(wrVisible, wrSelAfter); - CFX_ByteString sEditAfter = CPWL_Utils::GetEditAppStream( - m_pEdit, ptOffset, &wrTemp, !HasFlag(PES_CHARARRAY), - m_pEdit->GetPasswordChar()); - - if (sEditAfter.GetLength() > 0) - sText << "BT\n" << CPWL_Utils::GetColorAppStream(GetTextColor()) - << sEditAfter << "ET\n"; - - if (HasFlag(PES_SPELLCHECK)) { - CFX_ByteString sSpellCheck = CPWL_Utils::GetSpellCheckAppStream( - m_pEdit, m_pSpellCheck, ptOffset, &wrVisible); - if (sSpellCheck.GetLength() > 0) - sText << CPWL_Utils::GetColorAppStream(CPWL_Color(COLORTYPE_RGB, 1, 0, 0), - FALSE) - << sSpellCheck; - } - - if (sText.GetLength() > 0) { - CFX_FloatRect rcClient = GetClientRect(); - sAppStream << "q\n/Tx BMC\n"; - - if (!HasFlag(PES_TEXTOVERFLOW)) - sAppStream << rcClient.left << " " << rcClient.bottom << " " - << rcClient.right - rcClient.left << " " - << rcClient.top - rcClient.bottom << " re W n\n"; - - sAppStream << sText; - - sAppStream << "EMC\nQ\n"; - } -} - -void CPWL_Edit::DrawThisAppearance(CFX_RenderDevice* pDevice, - CFX_Matrix* pUser2Device) { - CPWL_Wnd::DrawThisAppearance(pDevice, pUser2Device); - - CFX_FloatRect rcClient = GetClientRect(); - CFX_ByteTextBuf sLine; - - int32_t nCharArray = m_pEdit->GetCharArray(); - FX_SAFE_INT32 nCharArraySafe = nCharArray; - nCharArraySafe -= 1; - nCharArraySafe *= 2; - - if (nCharArray > 0 && nCharArraySafe.IsValid()) { - switch (GetBorderStyle()) { - case PBS_SOLID: { - CFX_GraphStateData gsd; - gsd.m_LineWidth = (FX_FLOAT)GetBorderWidth(); - - CFX_PathData path; - path.SetPointCount(nCharArraySafe.ValueOrDie()); - - for (int32_t i = 0; i < nCharArray - 1; i++) { - path.SetPoint( - i * 2, - rcClient.left + - ((rcClient.right - rcClient.left) / nCharArray) * (i + 1), - rcClient.bottom, FXPT_MOVETO); - path.SetPoint( - i * 2 + 1, - rcClient.left + - ((rcClient.right - rcClient.left) / nCharArray) * (i + 1), - rcClient.top, FXPT_LINETO); - } - if (path.GetPointCount() > 0) - pDevice->DrawPath( - &path, pUser2Device, &gsd, 0, - CPWL_Utils::PWLColorToFXColor(GetBorderColor(), 255), - FXFILL_ALTERNATE); - } break; - case PBS_DASH: { - CFX_GraphStateData gsd; - gsd.m_LineWidth = (FX_FLOAT)GetBorderWidth(); - - gsd.SetDashCount(2); - gsd.m_DashArray[0] = (FX_FLOAT)GetBorderDash().nDash; - gsd.m_DashArray[1] = (FX_FLOAT)GetBorderDash().nGap; - gsd.m_DashPhase = (FX_FLOAT)GetBorderDash().nPhase; - - CFX_PathData path; - path.SetPointCount(nCharArraySafe.ValueOrDie()); - - for (int32_t i = 0; i < nCharArray - 1; i++) { - path.SetPoint( - i * 2, - rcClient.left + - ((rcClient.right - rcClient.left) / nCharArray) * (i + 1), - rcClient.bottom, FXPT_MOVETO); - path.SetPoint( - i * 2 + 1, - rcClient.left + - ((rcClient.right - rcClient.left) / nCharArray) * (i + 1), - rcClient.top, FXPT_LINETO); - } - if (path.GetPointCount() > 0) - pDevice->DrawPath( - &path, pUser2Device, &gsd, 0, - CPWL_Utils::PWLColorToFXColor(GetBorderColor(), 255), - FXFILL_ALTERNATE); - } break; - } - } - - CFX_FloatRect rcClip; - CPVT_WordRange wrRange = m_pEdit->GetVisibleWordRange(); - CPVT_WordRange* pRange = NULL; - - if (!HasFlag(PES_TEXTOVERFLOW)) { - rcClip = GetClientRect(); - pRange = &wrRange; - } - IFX_SystemHandler* pSysHandler = GetSystemHandler(); - IFX_Edit::DrawEdit( - pDevice, pUser2Device, m_pEdit, - CPWL_Utils::PWLColorToFXColor(GetTextColor(), GetTransparency()), - CPWL_Utils::PWLColorToFXColor(GetTextStrokeColor(), GetTransparency()), - rcClip, CFX_FloatPoint(0.0f, 0.0f), pRange, pSysHandler, m_pFormFiller); - - if (HasFlag(PES_SPELLCHECK)) { - CPWL_Utils::DrawEditSpellCheck(pDevice, pUser2Device, m_pEdit, rcClip, - CFX_FloatPoint(0.0f, 0.0f), pRange, - GetCreationParam().pSpellCheck); - } -} - -FX_BOOL CPWL_Edit::OnLButtonDown(const CFX_FloatPoint& point, FX_DWORD nFlag) { - CPWL_Wnd::OnLButtonDown(point, nFlag); - - if (HasFlag(PES_TEXTOVERFLOW) || ClientHitTest(point)) { - if (m_bMouseDown) - InvalidateRect(); - - m_bMouseDown = TRUE; - SetCapture(); - - m_pEdit->OnMouseDown(point, IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); - } - - return TRUE; -} - -FX_BOOL CPWL_Edit::OnLButtonDblClk(const CFX_FloatPoint& point, - FX_DWORD nFlag) { - CPWL_Wnd::OnLButtonDblClk(point, nFlag); - - if (HasFlag(PES_TEXTOVERFLOW) || ClientHitTest(point)) { - m_pEdit->SelectAll(); - } - - return TRUE; -} - -#define WM_PWLEDIT_UNDO 0x01 -#define WM_PWLEDIT_REDO 0x02 -#define WM_PWLEDIT_CUT 0x03 -#define WM_PWLEDIT_COPY 0x04 -#define WM_PWLEDIT_PASTE 0x05 -#define WM_PWLEDIT_DELETE 0x06 -#define WM_PWLEDIT_SELECTALL 0x07 -#define WM_PWLEDIT_SUGGEST 0x08 - -FX_BOOL CPWL_Edit::OnRButtonUp(const CFX_FloatPoint& point, FX_DWORD nFlag) { - if (m_bMouseDown) - return FALSE; - - CPWL_Wnd::OnRButtonUp(point, nFlag); - - if (!HasFlag(PES_TEXTOVERFLOW) && !ClientHitTest(point)) - return TRUE; - - IFX_SystemHandler* pSH = GetSystemHandler(); - if (!pSH) - return FALSE; - - SetFocus(); - - CPVT_WordRange wrLatin = GetLatinWordsRange(point); - CFX_WideString swLatin = m_pEdit->GetRangeText(wrLatin); - - FX_HMENU hPopup = pSH->CreatePopupMenu(); - if (!hPopup) - return FALSE; - - std::vector<CFX_ByteString> sSuggestWords; - CFX_FloatPoint ptPopup = point; - - if (!IsReadOnly()) { - if (HasFlag(PES_SPELLCHECK) && !swLatin.IsEmpty()) { - if (m_pSpellCheck) { - CFX_ByteString sLatin = CFX_ByteString::FromUnicode(swLatin); - if (!m_pSpellCheck->CheckWord(sLatin)) { - m_pSpellCheck->SuggestWords(sLatin, sSuggestWords); - - int32_t nSuggest = pdfium::CollectionSize<int32_t>(sSuggestWords); - for (int32_t nWord = 0; nWord < nSuggest; nWord++) { - pSH->AppendMenuItem(hPopup, WM_PWLEDIT_SUGGEST + nWord, - sSuggestWords[nWord].UTF8Decode()); - } - if (nSuggest > 0) - pSH->AppendMenuItem(hPopup, 0, L""); - - ptPopup = GetWordRightBottomPoint(wrLatin.EndPos); - } - } - } - } - - IPWL_Provider* pProvider = GetProvider(); - - if (HasFlag(PES_UNDO)) { - pSH->AppendMenuItem( - hPopup, WM_PWLEDIT_UNDO, - pProvider ? pProvider->LoadPopupMenuString(0) : L"&Undo"); - pSH->AppendMenuItem( - hPopup, WM_PWLEDIT_REDO, - pProvider ? pProvider->LoadPopupMenuString(1) : L"&Redo"); - pSH->AppendMenuItem(hPopup, 0, L""); - - if (!m_pEdit->CanUndo()) - pSH->EnableMenuItem(hPopup, WM_PWLEDIT_UNDO, FALSE); - if (!m_pEdit->CanRedo()) - pSH->EnableMenuItem(hPopup, WM_PWLEDIT_REDO, FALSE); - } - - pSH->AppendMenuItem(hPopup, WM_PWLEDIT_CUT, - pProvider ? pProvider->LoadPopupMenuString(2) : L"Cu&t"); - pSH->AppendMenuItem(hPopup, WM_PWLEDIT_COPY, - pProvider ? pProvider->LoadPopupMenuString(3) : L"&Copy"); - pSH->AppendMenuItem( - hPopup, WM_PWLEDIT_PASTE, - pProvider ? pProvider->LoadPopupMenuString(4) : L"&Paste"); - pSH->AppendMenuItem( - hPopup, WM_PWLEDIT_DELETE, - pProvider ? pProvider->LoadPopupMenuString(5) : L"&Delete"); - - CFX_WideString swText = pSH->GetClipboardText(GetAttachedHWnd()); - if (swText.IsEmpty()) - pSH->EnableMenuItem(hPopup, WM_PWLEDIT_PASTE, FALSE); - - if (!m_pEdit->IsSelected()) { - pSH->EnableMenuItem(hPopup, WM_PWLEDIT_CUT, FALSE); - pSH->EnableMenuItem(hPopup, WM_PWLEDIT_COPY, FALSE); - pSH->EnableMenuItem(hPopup, WM_PWLEDIT_DELETE, FALSE); - } - - if (IsReadOnly()) { - pSH->EnableMenuItem(hPopup, WM_PWLEDIT_CUT, FALSE); - pSH->EnableMenuItem(hPopup, WM_PWLEDIT_DELETE, FALSE); - pSH->EnableMenuItem(hPopup, WM_PWLEDIT_PASTE, FALSE); - } - - if (HasFlag(PES_PASSWORD)) { - pSH->EnableMenuItem(hPopup, WM_PWLEDIT_CUT, FALSE); - pSH->EnableMenuItem(hPopup, WM_PWLEDIT_COPY, FALSE); - } - - if (HasFlag(PES_NOREAD)) { - pSH->EnableMenuItem(hPopup, WM_PWLEDIT_CUT, FALSE); - pSH->EnableMenuItem(hPopup, WM_PWLEDIT_COPY, FALSE); - } - - pSH->AppendMenuItem(hPopup, 0, L""); - pSH->AppendMenuItem( - hPopup, WM_PWLEDIT_SELECTALL, - pProvider ? pProvider->LoadPopupMenuString(6) : L"&Select All"); - - if (m_pEdit->GetTotalWords() == 0) { - pSH->EnableMenuItem(hPopup, WM_PWLEDIT_SELECTALL, FALSE); - } - - int32_t x, y; - PWLtoWnd(ptPopup, x, y); - pSH->ClientToScreen(GetAttachedHWnd(), x, y); - pSH->SetCursor(FXCT_ARROW); - int32_t nCmd = pSH->TrackPopupMenu(hPopup, x, y, GetAttachedHWnd()); - - switch (nCmd) { - case WM_PWLEDIT_UNDO: - Undo(); - break; - case WM_PWLEDIT_REDO: - Redo(); - break; - case WM_PWLEDIT_CUT: - CutText(); - break; - case WM_PWLEDIT_COPY: - CopyText(); - break; - case WM_PWLEDIT_PASTE: - PasteText(); - break; - case WM_PWLEDIT_DELETE: - Clear(); - break; - case WM_PWLEDIT_SELECTALL: - SelectAll(); - break; - case WM_PWLEDIT_SUGGEST + 0: - SetSel(m_pEdit->WordPlaceToWordIndex(wrLatin.BeginPos), - m_pEdit->WordPlaceToWordIndex(wrLatin.EndPos)); - ReplaceSel(sSuggestWords[0].UTF8Decode().c_str()); - break; - case WM_PWLEDIT_SUGGEST + 1: - SetSel(m_pEdit->WordPlaceToWordIndex(wrLatin.BeginPos), - m_pEdit->WordPlaceToWordIndex(wrLatin.EndPos)); - ReplaceSel(sSuggestWords[1].UTF8Decode().c_str()); - break; - case WM_PWLEDIT_SUGGEST + 2: - SetSel(m_pEdit->WordPlaceToWordIndex(wrLatin.BeginPos), - m_pEdit->WordPlaceToWordIndex(wrLatin.EndPos)); - ReplaceSel(sSuggestWords[2].UTF8Decode().c_str()); - break; - case WM_PWLEDIT_SUGGEST + 3: - SetSel(m_pEdit->WordPlaceToWordIndex(wrLatin.BeginPos), - m_pEdit->WordPlaceToWordIndex(wrLatin.EndPos)); - ReplaceSel(sSuggestWords[3].UTF8Decode().c_str()); - break; - case WM_PWLEDIT_SUGGEST + 4: - SetSel(m_pEdit->WordPlaceToWordIndex(wrLatin.BeginPos), - m_pEdit->WordPlaceToWordIndex(wrLatin.EndPos)); - ReplaceSel(sSuggestWords[4].UTF8Decode().c_str()); - break; - default: - break; - } - - pSH->DestroyMenu(hPopup); - - return TRUE; -} - -void CPWL_Edit::OnSetFocus() { - SetEditCaret(TRUE); - - if (!IsReadOnly()) { - if (IPWL_FocusHandler* pFocusHandler = GetFocusHandler()) - pFocusHandler->OnSetFocus(this); - } - - m_bFocus = TRUE; -} - -void CPWL_Edit::OnKillFocus() { - ShowVScrollBar(FALSE); - - m_pEdit->SelectNone(); - SetCaret(FALSE, CFX_FloatPoint(0.0f, 0.0f), CFX_FloatPoint(0.0f, 0.0f)); - - SetCharSet(0); - - if (!IsReadOnly()) { - if (IPWL_FocusHandler* pFocusHandler = GetFocusHandler()) - pFocusHandler->OnKillFocus(this); - } - - m_bFocus = FALSE; -} - -void CPWL_Edit::SetHorzScale(int32_t nHorzScale, FX_BOOL bPaint /* = TRUE*/) { - m_pEdit->SetHorzScale(nHorzScale, bPaint); -} - -void CPWL_Edit::SetCharSpace(FX_FLOAT fCharSpace, FX_BOOL bPaint /* = TRUE*/) { - m_pEdit->SetCharSpace(fCharSpace, bPaint); -} - -void CPWL_Edit::SetLineLeading(FX_FLOAT fLineLeading, - FX_BOOL bPaint /* = TRUE*/) { - m_pEdit->SetLineLeading(fLineLeading, bPaint); -} - -CFX_ByteString CPWL_Edit::GetSelectAppearanceStream( - const CFX_FloatPoint& ptOffset) const { - CPVT_WordRange wr = GetSelectWordRange(); - return CPWL_Utils::GetEditSelAppStream(m_pEdit, ptOffset, &wr); -} - -CPVT_WordRange CPWL_Edit::GetSelectWordRange() const { - if (m_pEdit->IsSelected()) { - int32_t nStart = -1; - int32_t nEnd = -1; - - m_pEdit->GetSel(nStart, nEnd); - - CPVT_WordPlace wpStart = m_pEdit->WordIndexToWordPlace(nStart); - CPVT_WordPlace wpEnd = m_pEdit->WordIndexToWordPlace(nEnd); - - return CPVT_WordRange(wpStart, wpEnd); - } - - return CPVT_WordRange(); -} - -CFX_ByteString CPWL_Edit::GetTextAppearanceStream( - const CFX_FloatPoint& ptOffset) const { - CFX_ByteTextBuf sRet; - CFX_ByteString sEdit = CPWL_Utils::GetEditAppStream(m_pEdit, ptOffset); - - if (sEdit.GetLength() > 0) { - sRet << "BT\n" << CPWL_Utils::GetColorAppStream(GetTextColor()) << sEdit - << "ET\n"; - } - - return sRet.GetByteString(); -} - -CFX_ByteString CPWL_Edit::GetCaretAppearanceStream( - const CFX_FloatPoint& ptOffset) const { - if (m_pEditCaret) - return m_pEditCaret->GetCaretAppearanceStream(ptOffset); - - return CFX_ByteString(); -} - -CFX_FloatPoint CPWL_Edit::GetWordRightBottomPoint( - const CPVT_WordPlace& wpWord) { - CFX_FloatPoint pt(0.0f, 0.0f); - - if (IFX_Edit_Iterator* pIterator = m_pEdit->GetIterator()) { - CPVT_WordPlace wpOld = pIterator->GetAt(); - pIterator->SetAt(wpWord); - CPVT_Word word; - if (pIterator->GetWord(word)) { - pt = CFX_FloatPoint(word.ptWord.x + word.fWidth, - word.ptWord.y + word.fDescent); - } - - pIterator->SetAt(wpOld); - } - - return pt; -} - -FX_BOOL CPWL_Edit::IsTextFull() const { - return m_pEdit->IsTextFull(); -} - -FX_FLOAT CPWL_Edit::GetCharArrayAutoFontSize(CPDF_Font* pFont, - const CFX_FloatRect& rcPlate, - int32_t nCharArray) { - if (pFont && !pFont->IsStandardFont()) { - FX_RECT rcBBox; - pFont->GetFontBBox(rcBBox); - - CFX_FloatRect rcCell = rcPlate; - FX_FLOAT xdiv = rcCell.Width() / nCharArray * 1000.0f / rcBBox.Width(); - FX_FLOAT ydiv = -rcCell.Height() * 1000.0f / rcBBox.Height(); - - return xdiv < ydiv ? xdiv : ydiv; - } - - return 0.0f; -} - -void CPWL_Edit::SetCharArray(int32_t nCharArray) { - if (HasFlag(PES_CHARARRAY) && nCharArray > 0) { - m_pEdit->SetCharArray(nCharArray); - m_pEdit->SetTextOverflow(TRUE); - - if (HasFlag(PWS_AUTOFONTSIZE)) { - if (IFX_Edit_FontMap* pFontMap = GetFontMap()) { - FX_FLOAT fFontSize = GetCharArrayAutoFontSize( - pFontMap->GetPDFFont(0), GetClientRect(), nCharArray); - if (fFontSize > 0.0f) { - m_pEdit->SetAutoFontSize(FALSE); - m_pEdit->SetFontSize(fFontSize); - } - } - } - } -} - -void CPWL_Edit::SetLimitChar(int32_t nLimitChar) { - m_pEdit->SetLimitChar(nLimitChar); -} - -void CPWL_Edit::ReplaceSel(const FX_WCHAR* csText) { - m_pEdit->Clear(); - m_pEdit->InsertText(csText); -} - -CFX_FloatRect CPWL_Edit::GetFocusRect() const { - return CFX_FloatRect(); -} - -void CPWL_Edit::ShowVScrollBar(FX_BOOL bShow) { - if (CPWL_ScrollBar* pScroll = GetVScrollBar()) { - if (bShow) { - if (!pScroll->IsVisible()) { - pScroll->SetVisible(TRUE); - CFX_FloatRect rcWindow = GetWindowRect(); - m_rcOldWindow = rcWindow; - rcWindow.right += PWL_SCROLLBAR_WIDTH; - Move(rcWindow, TRUE, TRUE); - } - } else { - if (pScroll->IsVisible()) { - pScroll->SetVisible(FALSE); - Move(m_rcOldWindow, TRUE, TRUE); - } - } - } -} - -FX_BOOL CPWL_Edit::IsVScrollBarVisible() const { - if (CPWL_ScrollBar* pScroll = GetVScrollBar()) { - return pScroll->IsVisible(); - } - - return FALSE; -} - -void CPWL_Edit::EnableSpellCheck(FX_BOOL bEnabled) { - if (bEnabled) - AddFlag(PES_SPELLCHECK); - else - RemoveFlag(PES_SPELLCHECK); -} - -FX_BOOL CPWL_Edit::OnKeyDown(FX_WORD nChar, FX_DWORD nFlag) { - if (m_bMouseDown) - return TRUE; - - if (nChar == FWL_VKEY_Delete) { - if (m_pFillerNotify) { - FX_BOOL bRC = TRUE; - FX_BOOL bExit = FALSE; - CFX_WideString strChange; - CFX_WideString strChangeEx; - - int nSelStart = 0; - int nSelEnd = 0; - GetSel(nSelStart, nSelEnd); - - if (nSelStart == nSelEnd) - nSelEnd = nSelStart + 1; - m_pFillerNotify->OnBeforeKeyStroke(GetAttachedData(), strChange, - strChangeEx, nSelStart, nSelEnd, TRUE, - bRC, bExit, nFlag); - if (!bRC) - return FALSE; - if (bExit) - return FALSE; - } - } - - FX_BOOL bRet = CPWL_EditCtrl::OnKeyDown(nChar, nFlag); - - // In case of implementation swallow the OnKeyDown event. - if (IsProceedtoOnChar(nChar, nFlag)) - return TRUE; - - return bRet; -} - -/** -*In case of implementation swallow the OnKeyDown event. -*If the event is swallowed, implementation may do other unexpected things, which -*is not the control means to do. -*/ -FX_BOOL CPWL_Edit::IsProceedtoOnChar(FX_WORD nKeyCode, FX_DWORD nFlag) { - FX_BOOL bCtrl = IsCTRLpressed(nFlag); - FX_BOOL bAlt = IsALTpressed(nFlag); - if (bCtrl && !bAlt) { - // hot keys for edit control. - switch (nKeyCode) { - case 'C': - case 'V': - case 'X': - case 'A': - case 'Z': - return TRUE; - default: - break; - } - } - // control characters. - switch (nKeyCode) { - case FWL_VKEY_Escape: - case FWL_VKEY_Back: - case FWL_VKEY_Return: - case FWL_VKEY_Space: - return TRUE; - default: - return FALSE; - } -} - -FX_BOOL CPWL_Edit::OnChar(FX_WORD nChar, FX_DWORD nFlag) { - if (m_bMouseDown) - return TRUE; - - FX_BOOL bRC = TRUE; - FX_BOOL bExit = FALSE; - - if (!IsCTRLpressed(nFlag)) { - if (m_pFillerNotify) { - CFX_WideString swChange; - - int nSelStart = 0; - int nSelEnd = 0; - GetSel(nSelStart, nSelEnd); - - switch (nChar) { - case FWL_VKEY_Back: - if (nSelStart == nSelEnd) - nSelStart = nSelEnd - 1; - break; - case FWL_VKEY_Return: - break; - default: - swChange += nChar; - break; - } - - CFX_WideString strChangeEx; - m_pFillerNotify->OnBeforeKeyStroke(GetAttachedData(), swChange, - strChangeEx, nSelStart, nSelEnd, TRUE, - bRC, bExit, nFlag); - } - } - - if (!bRC) - return TRUE; - if (bExit) - return FALSE; - - if (IFX_Edit_FontMap* pFontMap = GetFontMap()) { - int32_t nOldCharSet = GetCharSet(); - int32_t nNewCharSet = pFontMap->CharSetFromUnicode(nChar, DEFAULT_CHARSET); - if (nOldCharSet != nNewCharSet) { - SetCharSet(nNewCharSet); - } - } - - return CPWL_EditCtrl::OnChar(nChar, nFlag); -} - -FX_BOOL CPWL_Edit::OnMouseWheel(short zDelta, - const CFX_FloatPoint& point, - FX_DWORD nFlag) { - if (HasFlag(PES_MULTILINE)) { - CFX_FloatPoint ptScroll = GetScrollPos(); - - if (zDelta > 0) { - ptScroll.y += GetFontSize(); - } else { - ptScroll.y -= GetFontSize(); - } - SetScrollPos(ptScroll); - - return TRUE; - } - - return FALSE; -} - -void CPWL_Edit::OnInsertReturn(const CPVT_WordPlace& place, - const CPVT_WordPlace& oldplace) { - if (HasFlag(PES_SPELLCHECK)) { - m_pEdit->RefreshWordRange(CombineWordRange(GetLatinWordsRange(oldplace), - GetLatinWordsRange(place))); - } - - if (m_pEditNotify) { - m_pEditNotify->OnInsertReturn(place, oldplace); - } -} - -void CPWL_Edit::OnBackSpace(const CPVT_WordPlace& place, - const CPVT_WordPlace& oldplace) { - if (HasFlag(PES_SPELLCHECK)) { - m_pEdit->RefreshWordRange(CombineWordRange(GetLatinWordsRange(oldplace), - GetLatinWordsRange(place))); - } - - if (m_pEditNotify) { - m_pEditNotify->OnBackSpace(place, oldplace); - } -} - -void CPWL_Edit::OnDelete(const CPVT_WordPlace& place, - const CPVT_WordPlace& oldplace) { - if (HasFlag(PES_SPELLCHECK)) { - m_pEdit->RefreshWordRange(CombineWordRange(GetLatinWordsRange(oldplace), - GetLatinWordsRange(place))); - } - - if (m_pEditNotify) { - m_pEditNotify->OnDelete(place, oldplace); - } -} - -void CPWL_Edit::OnClear(const CPVT_WordPlace& place, - const CPVT_WordPlace& oldplace) { - if (HasFlag(PES_SPELLCHECK)) { - m_pEdit->RefreshWordRange(CombineWordRange(GetLatinWordsRange(oldplace), - GetLatinWordsRange(place))); - } - - if (m_pEditNotify) { - m_pEditNotify->OnClear(place, oldplace); - } -} - -void CPWL_Edit::OnInsertWord(const CPVT_WordPlace& place, - const CPVT_WordPlace& oldplace) { - if (HasFlag(PES_SPELLCHECK)) { - m_pEdit->RefreshWordRange(CombineWordRange(GetLatinWordsRange(oldplace), - GetLatinWordsRange(place))); - } - - if (m_pEditNotify) { - m_pEditNotify->OnInsertWord(place, oldplace); - } -} - -void CPWL_Edit::OnSetText(const CPVT_WordPlace& place, - const CPVT_WordPlace& oldplace) {} - -void CPWL_Edit::OnInsertText(const CPVT_WordPlace& place, - const CPVT_WordPlace& oldplace) { - if (HasFlag(PES_SPELLCHECK)) { - m_pEdit->RefreshWordRange(CombineWordRange(GetLatinWordsRange(oldplace), - GetLatinWordsRange(place))); - } - - if (m_pEditNotify) { - m_pEditNotify->OnInsertText(place, oldplace); - } -} - -void CPWL_Edit::OnAddUndo(IFX_Edit_UndoItem* pUndoItem) { - if (m_pEditNotify) { - m_pEditNotify->OnAddUndo(this); - } -} - -CPVT_WordRange CPWL_Edit::CombineWordRange(const CPVT_WordRange& wr1, - const CPVT_WordRange& wr2) { - CPVT_WordRange wrRet; - - if (wr1.BeginPos.WordCmp(wr2.BeginPos) < 0) { - wrRet.BeginPos = wr1.BeginPos; - } else { - wrRet.BeginPos = wr2.BeginPos; - } - - if (wr1.EndPos.WordCmp(wr2.EndPos) < 0) { - wrRet.EndPos = wr2.EndPos; - } else { - wrRet.EndPos = wr1.EndPos; - } - - return wrRet; -} - -CPVT_WordRange CPWL_Edit::GetLatinWordsRange( - const CFX_FloatPoint& point) const { - return GetSameWordsRange(m_pEdit->SearchWordPlace(point), TRUE, FALSE); -} - -CPVT_WordRange CPWL_Edit::GetLatinWordsRange( - const CPVT_WordPlace& place) const { - return GetSameWordsRange(place, TRUE, FALSE); -} - -CPVT_WordRange CPWL_Edit::GetArabicWordsRange( - const CPVT_WordPlace& place) const { - return GetSameWordsRange(place, FALSE, TRUE); -} - -#define PWL_ISARABICWORD(word) \ - ((word >= 0x0600 && word <= 0x06FF) || (word >= 0xFB50 && word <= 0xFEFC)) - -CPVT_WordRange CPWL_Edit::GetSameWordsRange(const CPVT_WordPlace& place, - FX_BOOL bLatin, - FX_BOOL bArabic) const { - CPVT_WordRange range; - - if (IFX_Edit_Iterator* pIterator = m_pEdit->GetIterator()) { - CPVT_Word wordinfo; - CPVT_WordPlace wpStart(place), wpEnd(place); - pIterator->SetAt(place); - - if (bLatin) { - while (pIterator->NextWord()) { - if (!pIterator->GetWord(wordinfo) || - !FX_EDIT_ISLATINWORD(wordinfo.Word)) { - break; - } - - wpEnd = pIterator->GetAt(); - } - } else if (bArabic) { - while (pIterator->NextWord()) { - if (!pIterator->GetWord(wordinfo) || !PWL_ISARABICWORD(wordinfo.Word)) - break; - - wpEnd = pIterator->GetAt(); - } - } - - pIterator->SetAt(place); - - if (bLatin) { - do { - if (!pIterator->GetWord(wordinfo) || - !FX_EDIT_ISLATINWORD(wordinfo.Word)) { - break; - } - - wpStart = pIterator->GetAt(); - } while (pIterator->PrevWord()); - } else if (bArabic) { - do { - if (!pIterator->GetWord(wordinfo) || !PWL_ISARABICWORD(wordinfo.Word)) - break; - - wpStart = pIterator->GetAt(); - } while (pIterator->PrevWord()); - } - - range.Set(wpStart, wpEnd); - } - - return range; -} - -void CPWL_Edit::GeneratePageObjects( - CPDF_PageObjectHolder* pObjectHolder, - const CFX_FloatPoint& ptOffset, - CFX_ArrayTemplate<CPDF_TextObject*>& ObjArray) { - IFX_Edit::GeneratePageObjects( - pObjectHolder, m_pEdit, ptOffset, NULL, - CPWL_Utils::PWLColorToFXColor(GetTextColor(), GetTransparency()), - ObjArray); -} - -void CPWL_Edit::GeneratePageObjects(CPDF_PageObjectHolder* pObjectHolder, - const CFX_FloatPoint& ptOffset) { - CFX_ArrayTemplate<CPDF_TextObject*> ObjArray; - IFX_Edit::GeneratePageObjects( - pObjectHolder, m_pEdit, ptOffset, NULL, - CPWL_Utils::PWLColorToFXColor(GetTextColor(), GetTransparency()), - ObjArray); -} diff --git a/fpdfsdk/src/pdfwindow/PWL_EditCtrl.cpp b/fpdfsdk/src/pdfwindow/PWL_EditCtrl.cpp deleted file mode 100644 index 10b5d6c04f..0000000000 --- a/fpdfsdk/src/pdfwindow/PWL_EditCtrl.cpp +++ /dev/null @@ -1,629 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "fpdfsdk/include/pdfwindow/PWL_EditCtrl.h" - -#include "fpdfsdk/include/pdfwindow/PWL_Caret.h" -#include "fpdfsdk/include/pdfwindow/PWL_FontMap.h" -#include "fpdfsdk/include/pdfwindow/PWL_ScrollBar.h" -#include "fpdfsdk/include/pdfwindow/PWL_Utils.h" -#include "fpdfsdk/include/pdfwindow/PWL_Wnd.h" -#include "public/fpdf_fwlevent.h" - -#define IsFloatZero(f) ((f) < 0.0001 && (f) > -0.0001) -#define IsFloatBigger(fa, fb) ((fa) > (fb) && !IsFloatZero((fa) - (fb))) -#define IsFloatSmaller(fa, fb) ((fa) < (fb) && !IsFloatZero((fa) - (fb))) -#define IsFloatEqual(fa, fb) IsFloatZero((fa) - (fb)) - -CPWL_EditCtrl::CPWL_EditCtrl() - : m_pEdit(NULL), - m_pEditCaret(NULL), - m_bMouseDown(FALSE), - m_pEditNotify(NULL), - m_nCharSet(DEFAULT_CHARSET), - m_nCodePage(0) { - m_pEdit = IFX_Edit::NewEdit(); - ASSERT(m_pEdit); -} - -CPWL_EditCtrl::~CPWL_EditCtrl() { - IFX_Edit::DelEdit(m_pEdit); -} - -void CPWL_EditCtrl::OnCreate(PWL_CREATEPARAM& cp) { - cp.eCursorType = FXCT_VBEAM; -} - -void CPWL_EditCtrl::OnCreated() { - SetFontSize(GetCreationParam().fFontSize); - - m_pEdit->SetFontMap(GetFontMap()); - m_pEdit->SetNotify(this); - m_pEdit->Initialize(); -} - -FX_BOOL CPWL_EditCtrl::IsWndHorV() { - CFX_Matrix mt = GetWindowMatrix(); - CFX_FloatPoint point1(0, 1); - CFX_FloatPoint point2(1, 1); - - mt.Transform(point1.x, point1.y); - mt.Transform(point2.x, point2.y); - - return point2.y == point1.y; -} - -void CPWL_EditCtrl::SetCursor() { - if (IsValid()) { - if (IFX_SystemHandler* pSH = GetSystemHandler()) { - if (IsWndHorV()) - pSH->SetCursor(FXCT_VBEAM); - else - pSH->SetCursor(FXCT_HBEAM); - } - } -} - -void CPWL_EditCtrl::RePosChildWnd() { - m_pEdit->SetPlateRect(GetClientRect()); -} - -void CPWL_EditCtrl::OnNotify(CPWL_Wnd* pWnd, - FX_DWORD msg, - intptr_t wParam, - intptr_t lParam) { - CPWL_Wnd::OnNotify(pWnd, msg, wParam, lParam); - - switch (msg) { - case PNM_SETSCROLLINFO: - switch (wParam) { - case SBT_VSCROLL: - if (CPWL_Wnd* pChild = GetVScrollBar()) { - pChild->OnNotify(pWnd, PNM_SETSCROLLINFO, wParam, lParam); - } - break; - } - break; - case PNM_SETSCROLLPOS: - switch (wParam) { - case SBT_VSCROLL: - if (CPWL_Wnd* pChild = GetVScrollBar()) { - pChild->OnNotify(pWnd, PNM_SETSCROLLPOS, wParam, lParam); - } - break; - } - break; - case PNM_SCROLLWINDOW: { - FX_FLOAT fPos = *(FX_FLOAT*)lParam; - switch (wParam) { - case SBT_VSCROLL: - m_pEdit->SetScrollPos( - CFX_FloatPoint(m_pEdit->GetScrollPos().x, fPos)); - break; - } - } break; - case PNM_SETCARETINFO: { - if (PWL_CARET_INFO* pCaretInfo = (PWL_CARET_INFO*)wParam) { - SetCaret(pCaretInfo->bVisible, pCaretInfo->ptHead, pCaretInfo->ptFoot); - } - } break; - } -} - -void CPWL_EditCtrl::CreateChildWnd(const PWL_CREATEPARAM& cp) { - if (!IsReadOnly()) - CreateEditCaret(cp); -} - -void CPWL_EditCtrl::CreateEditCaret(const PWL_CREATEPARAM& cp) { - if (!m_pEditCaret) { - m_pEditCaret = new CPWL_Caret; - m_pEditCaret->SetInvalidRect(GetClientRect()); - - PWL_CREATEPARAM ecp = cp; - ecp.pParentWnd = this; - ecp.dwFlags = PWS_CHILD | PWS_NOREFRESHCLIP; - ecp.dwBorderWidth = 0; - ecp.nBorderStyle = PBS_SOLID; - ecp.rcRectWnd = CFX_FloatRect(0, 0, 0, 0); - - m_pEditCaret->Create(ecp); - } -} - -void CPWL_EditCtrl::SetFontSize(FX_FLOAT fFontSize) { - m_pEdit->SetFontSize(fFontSize); -} - -FX_FLOAT CPWL_EditCtrl::GetFontSize() const { - return m_pEdit->GetFontSize(); -} - -FX_BOOL CPWL_EditCtrl::OnKeyDown(FX_WORD nChar, FX_DWORD nFlag) { - if (m_bMouseDown) - return TRUE; - - FX_BOOL bRet = CPWL_Wnd::OnKeyDown(nChar, nFlag); - - // FILTER - switch (nChar) { - default: - return FALSE; - case FWL_VKEY_Delete: - case FWL_VKEY_Up: - case FWL_VKEY_Down: - case FWL_VKEY_Left: - case FWL_VKEY_Right: - case FWL_VKEY_Home: - case FWL_VKEY_End: - case FWL_VKEY_Insert: - case 'C': - case 'V': - case 'X': - case 'A': - case 'Z': - case 'c': - case 'v': - case 'x': - case 'a': - case 'z': - break; - } - - if (nChar == FWL_VKEY_Delete) { - if (m_pEdit->IsSelected()) - nChar = FWL_VKEY_Unknown; - } - - switch (nChar) { - case FWL_VKEY_Delete: - Delete(); - return TRUE; - case FWL_VKEY_Insert: - if (IsSHIFTpressed(nFlag)) - PasteText(); - return TRUE; - case FWL_VKEY_Up: - m_pEdit->OnVK_UP(IsSHIFTpressed(nFlag), FALSE); - return TRUE; - case FWL_VKEY_Down: - m_pEdit->OnVK_DOWN(IsSHIFTpressed(nFlag), FALSE); - return TRUE; - case FWL_VKEY_Left: - m_pEdit->OnVK_LEFT(IsSHIFTpressed(nFlag), FALSE); - return TRUE; - case FWL_VKEY_Right: - m_pEdit->OnVK_RIGHT(IsSHIFTpressed(nFlag), FALSE); - return TRUE; - case FWL_VKEY_Home: - m_pEdit->OnVK_HOME(IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); - return TRUE; - case FWL_VKEY_End: - m_pEdit->OnVK_END(IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); - return TRUE; - case FWL_VKEY_Unknown: - if (!IsSHIFTpressed(nFlag)) - Clear(); - else - CutText(); - return TRUE; - default: - break; - } - - return bRet; -} - -FX_BOOL CPWL_EditCtrl::OnChar(FX_WORD nChar, FX_DWORD nFlag) { - if (m_bMouseDown) - return TRUE; - - CPWL_Wnd::OnChar(nChar, nFlag); - - // FILTER - switch (nChar) { - case 0x0A: - case 0x1B: - return FALSE; - default: - break; - } - - FX_BOOL bCtrl = IsCTRLpressed(nFlag); - FX_BOOL bAlt = IsALTpressed(nFlag); - FX_BOOL bShift = IsSHIFTpressed(nFlag); - - FX_WORD word = nChar; - - if (bCtrl && !bAlt) { - switch (nChar) { - case 'C' - 'A' + 1: - CopyText(); - return TRUE; - case 'V' - 'A' + 1: - PasteText(); - return TRUE; - case 'X' - 'A' + 1: - CutText(); - return TRUE; - case 'A' - 'A' + 1: - SelectAll(); - return TRUE; - case 'Z' - 'A' + 1: - if (bShift) - Redo(); - else - Undo(); - return TRUE; - default: - if (nChar < 32) - return FALSE; - } - } - - if (IsReadOnly()) - return TRUE; - - if (m_pEdit->IsSelected() && word == FWL_VKEY_Back) - word = FWL_VKEY_Unknown; - - Clear(); - - switch (word) { - case FWL_VKEY_Back: - Backspace(); - break; - case FWL_VKEY_Return: - InsertReturn(); - break; - case FWL_VKEY_Unknown: - break; - default: - if (IsINSERTpressed(nFlag)) - Delete(); - InsertWord(word, GetCharSet()); - break; - } - - return TRUE; -} - -FX_BOOL CPWL_EditCtrl::OnLButtonDown(const CFX_FloatPoint& point, - FX_DWORD nFlag) { - CPWL_Wnd::OnLButtonDown(point, nFlag); - - if (ClientHitTest(point)) { - if (m_bMouseDown) - InvalidateRect(); - - m_bMouseDown = TRUE; - SetCapture(); - - m_pEdit->OnMouseDown(point, IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); - } - - return TRUE; -} - -FX_BOOL CPWL_EditCtrl::OnLButtonUp(const CFX_FloatPoint& point, - FX_DWORD nFlag) { - CPWL_Wnd::OnLButtonUp(point, nFlag); - - if (m_bMouseDown) { - // can receive keybord message - if (ClientHitTest(point) && !IsFocused()) - SetFocus(); - - ReleaseCapture(); - m_bMouseDown = FALSE; - } - - return TRUE; -} - -FX_BOOL CPWL_EditCtrl::OnMouseMove(const CFX_FloatPoint& point, - FX_DWORD nFlag) { - CPWL_Wnd::OnMouseMove(point, nFlag); - - if (m_bMouseDown) - m_pEdit->OnMouseMove(point, FALSE, FALSE); - - return TRUE; -} - -CFX_FloatRect CPWL_EditCtrl::GetContentRect() const { - return m_pEdit->GetContentRect(); -} - -void CPWL_EditCtrl::SetEditCaret(FX_BOOL bVisible) { - CFX_FloatPoint ptHead(0, 0), ptFoot(0, 0); - - if (bVisible) { - GetCaretInfo(ptHead, ptFoot); - } - - CPVT_WordPlace wpTemp = m_pEdit->GetCaretWordPlace(); - IOnSetCaret(bVisible, ptHead, ptFoot, wpTemp); -} - -void CPWL_EditCtrl::GetCaretInfo(CFX_FloatPoint& ptHead, - CFX_FloatPoint& ptFoot) const { - if (IFX_Edit_Iterator* pIterator = m_pEdit->GetIterator()) { - pIterator->SetAt(m_pEdit->GetCaret()); - CPVT_Word word; - CPVT_Line line; - if (pIterator->GetWord(word)) { - ptHead.x = word.ptWord.x + word.fWidth; - ptHead.y = word.ptWord.y + word.fAscent; - ptFoot.x = word.ptWord.x + word.fWidth; - ptFoot.y = word.ptWord.y + word.fDescent; - } else if (pIterator->GetLine(line)) { - ptHead.x = line.ptLine.x; - ptHead.y = line.ptLine.y + line.fLineAscent; - ptFoot.x = line.ptLine.x; - ptFoot.y = line.ptLine.y + line.fLineDescent; - } - } -} - -void CPWL_EditCtrl::GetCaretPos(int32_t& x, int32_t& y) const { - CFX_FloatPoint ptHead(0, 0), ptFoot(0, 0); - - GetCaretInfo(ptHead, ptFoot); - - PWLtoWnd(ptHead, x, y); -} - -void CPWL_EditCtrl::SetCaret(FX_BOOL bVisible, - const CFX_FloatPoint& ptHead, - const CFX_FloatPoint& ptFoot) { - if (m_pEditCaret) { - if (!IsFocused() || m_pEdit->IsSelected()) - bVisible = FALSE; - - m_pEditCaret->SetCaret(bVisible, ptHead, ptFoot); - } -} - -CFX_WideString CPWL_EditCtrl::GetText() const { - return m_pEdit->GetText(); -} - -void CPWL_EditCtrl::SetSel(int32_t nStartChar, int32_t nEndChar) { - m_pEdit->SetSel(nStartChar, nEndChar); -} - -void CPWL_EditCtrl::GetSel(int32_t& nStartChar, int32_t& nEndChar) const { - m_pEdit->GetSel(nStartChar, nEndChar); -} - -void CPWL_EditCtrl::Clear() { - if (!IsReadOnly()) - m_pEdit->Clear(); -} - -void CPWL_EditCtrl::SelectAll() { - m_pEdit->SelectAll(); -} - -void CPWL_EditCtrl::Paint() { - if (m_pEdit) - m_pEdit->Paint(); -} - -void CPWL_EditCtrl::EnableRefresh(FX_BOOL bRefresh) { - if (m_pEdit) - m_pEdit->EnableRefresh(bRefresh); -} - -int32_t CPWL_EditCtrl::GetCaret() const { - if (m_pEdit) - return m_pEdit->GetCaret(); - - return -1; -} - -void CPWL_EditCtrl::SetCaret(int32_t nPos) { - if (m_pEdit) - m_pEdit->SetCaret(nPos); -} - -int32_t CPWL_EditCtrl::GetTotalWords() const { - if (m_pEdit) - return m_pEdit->GetTotalWords(); - - return 0; -} - -void CPWL_EditCtrl::SetScrollPos(const CFX_FloatPoint& point) { - if (m_pEdit) - m_pEdit->SetScrollPos(point); -} - -CFX_FloatPoint CPWL_EditCtrl::GetScrollPos() const { - if (m_pEdit) - return m_pEdit->GetScrollPos(); - - return CFX_FloatPoint(0.0f, 0.0f); -} - -CPDF_Font* CPWL_EditCtrl::GetCaretFont() const { - int32_t nFontIndex = 0; - - if (IFX_Edit_Iterator* pIterator = m_pEdit->GetIterator()) { - pIterator->SetAt(m_pEdit->GetCaret()); - CPVT_Word word; - CPVT_Section section; - if (pIterator->GetWord(word)) { - nFontIndex = word.nFontIndex; - } else if (HasFlag(PES_RICH)) { - if (pIterator->GetSection(section)) { - nFontIndex = section.WordProps.nFontIndex; - } - } - } - - if (IFX_Edit_FontMap* pFontMap = GetFontMap()) - return pFontMap->GetPDFFont(nFontIndex); - - return NULL; -} - -FX_FLOAT CPWL_EditCtrl::GetCaretFontSize() const { - FX_FLOAT fFontSize = GetFontSize(); - - if (IFX_Edit_Iterator* pIterator = m_pEdit->GetIterator()) { - pIterator->SetAt(m_pEdit->GetCaret()); - CPVT_Word word; - CPVT_Section section; - if (pIterator->GetWord(word)) { - fFontSize = word.fFontSize; - } else if (HasFlag(PES_RICH)) { - if (pIterator->GetSection(section)) { - fFontSize = section.WordProps.fFontSize; - } - } - } - - return fFontSize; -} - -void CPWL_EditCtrl::SetText(const FX_WCHAR* csText) { - m_pEdit->SetText(csText); -} - -void CPWL_EditCtrl::CopyText() {} - -void CPWL_EditCtrl::PasteText() {} - -void CPWL_EditCtrl::CutText() {} - -void CPWL_EditCtrl::ShowVScrollBar(FX_BOOL bShow) {} - -void CPWL_EditCtrl::InsertText(const FX_WCHAR* csText) { - if (!IsReadOnly()) - m_pEdit->InsertText(csText); -} - -void CPWL_EditCtrl::InsertWord(FX_WORD word, int32_t nCharset) { - if (!IsReadOnly()) - m_pEdit->InsertWord(word, nCharset); -} - -void CPWL_EditCtrl::InsertReturn() { - if (!IsReadOnly()) - m_pEdit->InsertReturn(); -} - -void CPWL_EditCtrl::Delete() { - if (!IsReadOnly()) - m_pEdit->Delete(); -} - -void CPWL_EditCtrl::Backspace() { - if (!IsReadOnly()) - m_pEdit->Backspace(); -} - -FX_BOOL CPWL_EditCtrl::CanUndo() const { - return !IsReadOnly() && m_pEdit->CanUndo(); -} - -FX_BOOL CPWL_EditCtrl::CanRedo() const { - return !IsReadOnly() && m_pEdit->CanRedo(); -} - -void CPWL_EditCtrl::Redo() { - if (CanRedo()) - m_pEdit->Redo(); -} - -void CPWL_EditCtrl::Undo() { - if (CanUndo()) - m_pEdit->Undo(); -} - -void CPWL_EditCtrl::IOnSetScrollInfoY(FX_FLOAT fPlateMin, - FX_FLOAT fPlateMax, - FX_FLOAT fContentMin, - FX_FLOAT fContentMax, - FX_FLOAT fSmallStep, - FX_FLOAT fBigStep) { - PWL_SCROLL_INFO Info; - - Info.fPlateWidth = fPlateMax - fPlateMin; - Info.fContentMin = fContentMin; - Info.fContentMax = fContentMax; - Info.fSmallStep = fSmallStep; - Info.fBigStep = fBigStep; - - OnNotify(this, PNM_SETSCROLLINFO, SBT_VSCROLL, (intptr_t)&Info); - - if (IsFloatBigger(Info.fPlateWidth, Info.fContentMax - Info.fContentMin) || - IsFloatEqual(Info.fPlateWidth, Info.fContentMax - Info.fContentMin)) { - ShowVScrollBar(FALSE); - } else { - ShowVScrollBar(TRUE); - } -} - -void CPWL_EditCtrl::IOnSetScrollPosY(FX_FLOAT fy) { - OnNotify(this, PNM_SETSCROLLPOS, SBT_VSCROLL, (intptr_t)&fy); -} - -void CPWL_EditCtrl::IOnSetCaret(FX_BOOL bVisible, - const CFX_FloatPoint& ptHead, - const CFX_FloatPoint& ptFoot, - const CPVT_WordPlace& place) { - PWL_CARET_INFO cInfo; - cInfo.bVisible = bVisible; - cInfo.ptHead = ptHead; - cInfo.ptFoot = ptFoot; - - OnNotify(this, PNM_SETCARETINFO, (intptr_t)&cInfo, (intptr_t)NULL); -} - -void CPWL_EditCtrl::IOnCaretChange(const CPVT_SecProps& secProps, - const CPVT_WordProps& wordProps) {} - -void CPWL_EditCtrl::IOnContentChange(const CFX_FloatRect& rcContent) { - if (IsValid()) { - if (m_pEditNotify) { - m_pEditNotify->OnContentChange(rcContent); - } - } -} - -void CPWL_EditCtrl::IOnInvalidateRect(CFX_FloatRect* pRect) { - InvalidateRect(pRect); -} - -int32_t CPWL_EditCtrl::GetCharSet() const { - return m_nCharSet < 0 ? DEFAULT_CHARSET : m_nCharSet; -} - -void CPWL_EditCtrl::GetTextRange(const CFX_FloatRect& rect, - int32_t& nStartChar, - int32_t& nEndChar) const { - nStartChar = m_pEdit->WordPlaceToWordIndex( - m_pEdit->SearchWordPlace(CFX_FloatPoint(rect.left, rect.top))); - nEndChar = m_pEdit->WordPlaceToWordIndex( - m_pEdit->SearchWordPlace(CFX_FloatPoint(rect.right, rect.bottom))); -} - -CFX_WideString CPWL_EditCtrl::GetText(int32_t& nStartChar, - int32_t& nEndChar) const { - CPVT_WordPlace wpStart = m_pEdit->WordIndexToWordPlace(nStartChar); - CPVT_WordPlace wpEnd = m_pEdit->WordIndexToWordPlace(nEndChar); - return m_pEdit->GetRangeText(CPVT_WordRange(wpStart, wpEnd)); -} - -void CPWL_EditCtrl::SetReadyToInput() { - if (m_bMouseDown) { - ReleaseCapture(); - m_bMouseDown = FALSE; - } -} diff --git a/fpdfsdk/src/pdfwindow/PWL_FontMap.cpp b/fpdfsdk/src/pdfwindow/PWL_FontMap.cpp deleted file mode 100644 index 0a70357efd..0000000000 --- a/fpdfsdk/src/pdfwindow/PWL_FontMap.cpp +++ /dev/null @@ -1,499 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "fpdfsdk/include/pdfwindow/PWL_FontMap.h" - -#include "core/include/fpdfapi/cpdf_document.h" -#include "core/include/fpdfapi/fpdf_module.h" -#include "fpdfsdk/include/pdfwindow/PWL_Wnd.h" - -namespace { - -const char kDefaultFontName[] = "Helvetica"; - -const char* const g_sDEStandardFontName[] = {"Courier", - "Courier-Bold", - "Courier-BoldOblique", - "Courier-Oblique", - "Helvetica", - "Helvetica-Bold", - "Helvetica-BoldOblique", - "Helvetica-Oblique", - "Times-Roman", - "Times-Bold", - "Times-Italic", - "Times-BoldItalic", - "Symbol", - "ZapfDingbats"}; - -} // namespace - -CPWL_FontMap::CPWL_FontMap(IFX_SystemHandler* pSystemHandler) - : m_pPDFDoc(NULL), m_pSystemHandler(pSystemHandler) { - ASSERT(m_pSystemHandler); -} - -CPWL_FontMap::~CPWL_FontMap() { - delete m_pPDFDoc; - m_pPDFDoc = NULL; - - Empty(); -} - -void CPWL_FontMap::SetSystemHandler(IFX_SystemHandler* pSystemHandler) { - m_pSystemHandler = pSystemHandler; -} - -CPDF_Document* CPWL_FontMap::GetDocument() { - if (!m_pPDFDoc) { - if (CPDF_ModuleMgr::Get()) { - m_pPDFDoc = new CPDF_Document; - m_pPDFDoc->CreateNewDoc(); - } - } - - return m_pPDFDoc; -} - -CPDF_Font* CPWL_FontMap::GetPDFFont(int32_t nFontIndex) { - if (nFontIndex >= 0 && nFontIndex < m_aData.GetSize()) { - if (CPWL_FontMap_Data* pData = m_aData.GetAt(nFontIndex)) { - return pData->pFont; - } - } - - return NULL; -} - -CFX_ByteString CPWL_FontMap::GetPDFFontAlias(int32_t nFontIndex) { - if (nFontIndex >= 0 && nFontIndex < m_aData.GetSize()) { - if (CPWL_FontMap_Data* pData = m_aData.GetAt(nFontIndex)) { - return pData->sFontName; - } - } - - return ""; -} - -FX_BOOL CPWL_FontMap::KnowWord(int32_t nFontIndex, FX_WORD word) { - if (nFontIndex >= 0 && nFontIndex < m_aData.GetSize()) { - if (m_aData.GetAt(nFontIndex)) { - return CharCodeFromUnicode(nFontIndex, word) >= 0; - } - } - - return FALSE; -} - -int32_t CPWL_FontMap::GetWordFontIndex(FX_WORD word, - int32_t nCharset, - int32_t nFontIndex) { - if (nFontIndex > 0) { - if (KnowWord(nFontIndex, word)) - return nFontIndex; - } else { - if (const CPWL_FontMap_Data* pData = GetFontMapData(0)) { - if (nCharset == DEFAULT_CHARSET || pData->nCharset == SYMBOL_CHARSET || - nCharset == pData->nCharset) { - if (KnowWord(0, word)) - return 0; - } - } - } - - int32_t nNewFontIndex = - GetFontIndex(GetNativeFontName(nCharset), nCharset, TRUE); - if (nNewFontIndex >= 0) { - if (KnowWord(nNewFontIndex, word)) - return nNewFontIndex; - } - nNewFontIndex = GetFontIndex("Arial Unicode MS", DEFAULT_CHARSET, FALSE); - if (nNewFontIndex >= 0) { - if (KnowWord(nNewFontIndex, word)) - return nNewFontIndex; - } - return -1; -} - -int32_t CPWL_FontMap::CharCodeFromUnicode(int32_t nFontIndex, FX_WORD word) { - if (CPWL_FontMap_Data* pData = m_aData.GetAt(nFontIndex)) { - if (pData->pFont) { - if (pData->pFont->IsUnicodeCompatible()) { - int nCharCode = pData->pFont->CharCodeFromUnicode(word); - pData->pFont->GlyphFromCharCode(nCharCode); - return nCharCode; - } - if (word < 0xFF) - return word; - } - } - return -1; -} - -CFX_ByteString CPWL_FontMap::GetNativeFontName(int32_t nCharset) { - // searching native font is slow, so we must save time - for (int32_t i = 0, sz = m_aNativeFont.GetSize(); i < sz; i++) { - if (CPWL_FontMap_Native* pData = m_aNativeFont.GetAt(i)) { - if (pData->nCharset == nCharset) - return pData->sFontName; - } - } - - CFX_ByteString sNew = GetNativeFont(nCharset); - - if (!sNew.IsEmpty()) { - CPWL_FontMap_Native* pNewData = new CPWL_FontMap_Native; - pNewData->nCharset = nCharset; - pNewData->sFontName = sNew; - - m_aNativeFont.Add(pNewData); - } - - return sNew; -} - -void CPWL_FontMap::Empty() { - { - for (int32_t i = 0, sz = m_aData.GetSize(); i < sz; i++) - delete m_aData.GetAt(i); - - m_aData.RemoveAll(); - } - { - for (int32_t i = 0, sz = m_aNativeFont.GetSize(); i < sz; i++) - delete m_aNativeFont.GetAt(i); - - m_aNativeFont.RemoveAll(); - } -} - -void CPWL_FontMap::Initialize() { - GetFontIndex(kDefaultFontName, ANSI_CHARSET, FALSE); -} - -FX_BOOL CPWL_FontMap::IsStandardFont(const CFX_ByteString& sFontName) { - for (int32_t i = 0; i < FX_ArraySize(g_sDEStandardFontName); ++i) { - if (sFontName == g_sDEStandardFontName[i]) - return TRUE; - } - - return FALSE; -} - -int32_t CPWL_FontMap::FindFont(const CFX_ByteString& sFontName, - int32_t nCharset) { - for (int32_t i = 0, sz = m_aData.GetSize(); i < sz; i++) { - if (CPWL_FontMap_Data* pData = m_aData.GetAt(i)) { - if (nCharset == DEFAULT_CHARSET || nCharset == pData->nCharset) { - if (sFontName.IsEmpty() || pData->sFontName == sFontName) - return i; - } - } - } - - return -1; -} - -int32_t CPWL_FontMap::GetFontIndex(const CFX_ByteString& sFontName, - int32_t nCharset, - FX_BOOL bFind) { - int32_t nFontIndex = FindFont(EncodeFontAlias(sFontName, nCharset), nCharset); - if (nFontIndex >= 0) - return nFontIndex; - - CFX_ByteString sAlias; - CPDF_Font* pFont = NULL; - if (bFind) - pFont = FindFontSameCharset(sAlias, nCharset); - - if (!pFont) { - CFX_ByteString sTemp = sFontName; - pFont = AddFontToDocument(GetDocument(), sTemp, nCharset); - sAlias = EncodeFontAlias(sTemp, nCharset); - } - AddedFont(pFont, sAlias); - return AddFontData(pFont, sAlias, nCharset); -} - -int32_t CPWL_FontMap::GetPWLFontIndex(FX_WORD word, int32_t nCharset) { - int32_t nFind = -1; - - for (int32_t i = 0, sz = m_aData.GetSize(); i < sz; i++) { - if (CPWL_FontMap_Data* pData = m_aData.GetAt(i)) { - if (pData->nCharset == nCharset) { - nFind = i; - break; - } - } - } - - CPDF_Font* pNewFont = GetPDFFont(nFind); - - if (!pNewFont) - return -1; - - CFX_ByteString sAlias = EncodeFontAlias("Arial_Chrome", nCharset); - AddedFont(pNewFont, sAlias); - - return AddFontData(pNewFont, sAlias, nCharset); -} - -CPDF_Font* CPWL_FontMap::FindFontSameCharset(CFX_ByteString& sFontAlias, - int32_t nCharset) { - return NULL; -} - -int32_t CPWL_FontMap::AddFontData(CPDF_Font* pFont, - const CFX_ByteString& sFontAlias, - int32_t nCharset) { - CPWL_FontMap_Data* pNewData = new CPWL_FontMap_Data; - pNewData->pFont = pFont; - pNewData->sFontName = sFontAlias; - pNewData->nCharset = nCharset; - - m_aData.Add(pNewData); - - return m_aData.GetSize() - 1; -} - -void CPWL_FontMap::AddedFont(CPDF_Font* pFont, - const CFX_ByteString& sFontAlias) {} - -CFX_ByteString CPWL_FontMap::GetFontName(int32_t nFontIndex) { - if (nFontIndex >= 0 && nFontIndex < m_aData.GetSize()) { - if (CPWL_FontMap_Data* pData = m_aData.GetAt(nFontIndex)) { - return pData->sFontName; - } - } - - return ""; -} - -CFX_ByteString CPWL_FontMap::GetNativeFont(int32_t nCharset) { - if (nCharset == DEFAULT_CHARSET) - nCharset = GetNativeCharset(); - - CFX_ByteString sFontName = GetDefaultFontByCharset(nCharset); - if (m_pSystemHandler) { - if (m_pSystemHandler->FindNativeTrueTypeFont(nCharset, sFontName)) - return sFontName; - - sFontName = m_pSystemHandler->GetNativeTrueTypeFont(nCharset); - } - return sFontName; -} - -CPDF_Font* CPWL_FontMap::AddFontToDocument(CPDF_Document* pDoc, - CFX_ByteString& sFontName, - uint8_t nCharset) { - if (IsStandardFont(sFontName)) - return AddStandardFont(pDoc, sFontName); - - return AddSystemFont(pDoc, sFontName, nCharset); -} - -CPDF_Font* CPWL_FontMap::AddStandardFont(CPDF_Document* pDoc, - CFX_ByteString& sFontName) { - if (!pDoc) - return NULL; - - CPDF_Font* pFont = NULL; - - if (sFontName == "ZapfDingbats") { - pFont = pDoc->AddStandardFont(sFontName, NULL); - } else { - CPDF_FontEncoding fe(PDFFONT_ENCODING_WINANSI); - pFont = pDoc->AddStandardFont(sFontName, &fe); - } - - return pFont; -} - -CPDF_Font* CPWL_FontMap::AddSystemFont(CPDF_Document* pDoc, - CFX_ByteString& sFontName, - uint8_t nCharset) { - if (!pDoc) - return NULL; - - if (sFontName.IsEmpty()) - sFontName = GetNativeFont(nCharset); - if (nCharset == DEFAULT_CHARSET) - nCharset = GetNativeCharset(); - - if (m_pSystemHandler) - return m_pSystemHandler->AddNativeTrueTypeFontToPDF(pDoc, sFontName, - nCharset); - - return NULL; -} - -CFX_ByteString CPWL_FontMap::EncodeFontAlias(const CFX_ByteString& sFontName, - int32_t nCharset) { - CFX_ByteString sPostfix; - sPostfix.Format("_%02X", nCharset); - return EncodeFontAlias(sFontName) + sPostfix; -} - -CFX_ByteString CPWL_FontMap::EncodeFontAlias(const CFX_ByteString& sFontName) { - CFX_ByteString sRet = sFontName; - sRet.Remove(' '); - return sRet; -} - -int32_t CPWL_FontMap::GetFontMapCount() const { - return m_aData.GetSize(); -} - -const CPWL_FontMap_Data* CPWL_FontMap::GetFontMapData(int32_t nIndex) const { - if (nIndex >= 0 && nIndex < m_aData.GetSize()) { - return m_aData.GetAt(nIndex); - } - - return NULL; -} - -int32_t CPWL_FontMap::GetNativeCharset() { - uint8_t nCharset = ANSI_CHARSET; - int32_t iCodePage = FXSYS_GetACP(); - switch (iCodePage) { - case 932: // Japan - nCharset = SHIFTJIS_CHARSET; - break; - case 936: // Chinese (PRC, Singapore) - nCharset = GB2312_CHARSET; - break; - case 950: // Chinese (Taiwan; Hong Kong SAR, PRC) - nCharset = GB2312_CHARSET; - break; - case 1252: // Windows 3.1 Latin 1 (US, Western Europe) - nCharset = ANSI_CHARSET; - break; - case 874: // Thai - nCharset = THAI_CHARSET; - break; - case 949: // Korean - nCharset = HANGUL_CHARSET; - break; - case 1200: // Unicode (BMP of ISO 10646) - nCharset = ANSI_CHARSET; - break; - case 1250: // Windows 3.1 Eastern European - nCharset = EASTEUROPE_CHARSET; - break; - case 1251: // Windows 3.1 Cyrillic - nCharset = RUSSIAN_CHARSET; - break; - case 1253: // Windows 3.1 Greek - nCharset = GREEK_CHARSET; - break; - case 1254: // Windows 3.1 Turkish - nCharset = TURKISH_CHARSET; - break; - case 1255: // Hebrew - nCharset = HEBREW_CHARSET; - break; - case 1256: // Arabic - nCharset = ARABIC_CHARSET; - break; - case 1257: // Baltic - nCharset = BALTIC_CHARSET; - break; - case 1258: // Vietnamese - nCharset = VIETNAMESE_CHARSET; - break; - case 1361: // Korean(Johab) - nCharset = JOHAB_CHARSET; - break; - } - return nCharset; -} - -const CPWL_FontMap::CharsetFontMap CPWL_FontMap::defaultTTFMap[] = { - {ANSI_CHARSET, "Helvetica"}, {GB2312_CHARSET, "SimSun"}, - {CHINESEBIG5_CHARSET, "MingLiU"}, {SHIFTJIS_CHARSET, "MS Gothic"}, - {HANGUL_CHARSET, "Batang"}, {RUSSIAN_CHARSET, "Arial"}, -#if _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_ || \ - _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ - {EASTEUROPE_CHARSET, "Arial"}, -#else - {EASTEUROPE_CHARSET, "Tahoma"}, -#endif - {ARABIC_CHARSET, "Arial"}, {-1, NULL}}; - -CFX_ByteString CPWL_FontMap::GetDefaultFontByCharset(int32_t nCharset) { - int i = 0; - while (defaultTTFMap[i].charset != -1) { - if (nCharset == defaultTTFMap[i].charset) - return defaultTTFMap[i].fontname; - ++i; - } - return ""; -} - -int32_t CPWL_FontMap::CharSetFromUnicode(FX_WORD word, int32_t nOldCharset) { - if (m_pSystemHandler && (-1 != m_pSystemHandler->GetCharSet())) - return m_pSystemHandler->GetCharSet(); - // to avoid CJK Font to show ASCII - if (word < 0x7F) - return ANSI_CHARSET; - // follow the old charset - if (nOldCharset != DEFAULT_CHARSET) - return nOldCharset; - - // find new charset - if ((word >= 0x4E00 && word <= 0x9FA5) || - (word >= 0xE7C7 && word <= 0xE7F3) || - (word >= 0x3000 && word <= 0x303F) || - (word >= 0x2000 && word <= 0x206F)) { - return GB2312_CHARSET; - } - - if (((word >= 0x3040) && (word <= 0x309F)) || - ((word >= 0x30A0) && (word <= 0x30FF)) || - ((word >= 0x31F0) && (word <= 0x31FF)) || - ((word >= 0xFF00) && (word <= 0xFFEF))) { - return SHIFTJIS_CHARSET; - } - - if (((word >= 0xAC00) && (word <= 0xD7AF)) || - ((word >= 0x1100) && (word <= 0x11FF)) || - ((word >= 0x3130) && (word <= 0x318F))) { - return HANGUL_CHARSET; - } - - if (word >= 0x0E00 && word <= 0x0E7F) - return THAI_CHARSET; - - if ((word >= 0x0370 && word <= 0x03FF) || (word >= 0x1F00 && word <= 0x1FFF)) - return GREEK_CHARSET; - - if ((word >= 0x0600 && word <= 0x06FF) || (word >= 0xFB50 && word <= 0xFEFC)) - return ARABIC_CHARSET; - - if (word >= 0x0590 && word <= 0x05FF) - return HEBREW_CHARSET; - - if (word >= 0x0400 && word <= 0x04FF) - return RUSSIAN_CHARSET; - - if (word >= 0x0100 && word <= 0x024F) - return EASTEUROPE_CHARSET; - - if (word >= 0x1E00 && word <= 0x1EFF) - return VIETNAMESE_CHARSET; - - return ANSI_CHARSET; -} - -CPWL_DocFontMap::CPWL_DocFontMap(IFX_SystemHandler* pSystemHandler, - CPDF_Document* pAttachedDoc) - : CPWL_FontMap(pSystemHandler), m_pAttachedDoc(pAttachedDoc) {} - -CPWL_DocFontMap::~CPWL_DocFontMap() {} - -CPDF_Document* CPWL_DocFontMap::GetDocument() { - return m_pAttachedDoc; -} diff --git a/fpdfsdk/src/pdfwindow/PWL_Icon.cpp b/fpdfsdk/src/pdfwindow/PWL_Icon.cpp deleted file mode 100644 index 2a33b96cf9..0000000000 --- a/fpdfsdk/src/pdfwindow/PWL_Icon.cpp +++ /dev/null @@ -1,223 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "core/include/fpdfapi/cpdf_array.h" -#include "fpdfsdk/include/pdfwindow/PWL_Icon.h" -#include "fpdfsdk/include/pdfwindow/PWL_Utils.h" -#include "fpdfsdk/include/pdfwindow/PWL_Wnd.h" - -CPWL_Image::CPWL_Image() : m_pPDFStream(NULL) {} - -CPWL_Image::~CPWL_Image() {} - -CFX_ByteString CPWL_Image::GetImageAppStream() { - CFX_ByteTextBuf sAppStream; - - CFX_ByteString sAlias = GetImageAlias(); - CFX_FloatRect rcPlate = GetClientRect(); - CFX_Matrix mt; - mt.SetReverse(GetImageMatrix()); - - FX_FLOAT fHScale = 1.0f; - FX_FLOAT fVScale = 1.0f; - GetScale(fHScale, fVScale); - - FX_FLOAT fx = 0.0f; - FX_FLOAT fy = 0.0f; - GetImageOffset(fx, fy); - - if (m_pPDFStream && sAlias.GetLength() > 0) { - sAppStream << "q\n"; - sAppStream << rcPlate.left << " " << rcPlate.bottom << " " - << rcPlate.right - rcPlate.left << " " - << rcPlate.top - rcPlate.bottom << " re W n\n"; - - sAppStream << fHScale << " 0 0 " << fVScale << " " << rcPlate.left + fx - << " " << rcPlate.bottom + fy << " cm\n"; - sAppStream << mt.GetA() << " " << mt.GetB() << " " << mt.GetC() << " " - << mt.GetD() << " " << mt.GetE() << " " << mt.GetF() << " cm\n"; - - sAppStream << "0 g 0 G 1 w /" << sAlias << " Do\n" - << "Q\n"; - } - - return sAppStream.GetByteString(); -} - -void CPWL_Image::SetPDFStream(CPDF_Stream* pStream) { - m_pPDFStream = pStream; -} - -CPDF_Stream* CPWL_Image::GetPDFStream() { - return m_pPDFStream; -} - -void CPWL_Image::GetImageSize(FX_FLOAT& fWidth, FX_FLOAT& fHeight) { - fWidth = 0.0f; - fHeight = 0.0f; - - if (m_pPDFStream) { - if (CPDF_Dictionary* pDict = m_pPDFStream->GetDict()) { - CFX_FloatRect rect = pDict->GetRectBy("BBox"); - - fWidth = rect.right - rect.left; - fHeight = rect.top - rect.bottom; - } - } -} - -CFX_Matrix CPWL_Image::GetImageMatrix() { - if (m_pPDFStream) { - if (CPDF_Dictionary* pDict = m_pPDFStream->GetDict()) { - return pDict->GetMatrixBy("Matrix"); - } - } - - return CFX_Matrix(); -} - -CFX_ByteString CPWL_Image::GetImageAlias() { - if (!m_sImageAlias.IsEmpty()) - return m_sImageAlias; - - if (m_pPDFStream) { - if (CPDF_Dictionary* pDict = m_pPDFStream->GetDict()) { - return pDict->GetStringBy("Name"); - } - } - - return CFX_ByteString(); -} - -void CPWL_Image::SetImageAlias(const FX_CHAR* sImageAlias) { - m_sImageAlias = sImageAlias; -} - -void CPWL_Image::GetScale(FX_FLOAT& fHScale, FX_FLOAT& fVScale) { - fHScale = 1.0f; - fVScale = 1.0f; -} - -void CPWL_Image::GetImageOffset(FX_FLOAT& x, FX_FLOAT& y) { - x = 0.0f; - y = 0.0f; -} - -CPWL_Icon::CPWL_Icon() : m_pIconFit(NULL) {} - -CPWL_Icon::~CPWL_Icon() {} - -int32_t CPWL_Icon::GetScaleMethod() { - if (m_pIconFit) - return m_pIconFit->GetScaleMethod(); - - return 0; -} - -FX_BOOL CPWL_Icon::IsProportionalScale() { - if (m_pIconFit) - return m_pIconFit->IsProportionalScale(); - - return FALSE; -} - -void CPWL_Icon::GetIconPosition(FX_FLOAT& fLeft, FX_FLOAT& fBottom) { - if (m_pIconFit) { - fLeft = 0.0f; - fBottom = 0.0f; - CPDF_Array* pA = - m_pIconFit->GetDict() ? m_pIconFit->GetDict()->GetArrayBy("A") : NULL; - if (pA) { - FX_DWORD dwCount = pA->GetCount(); - if (dwCount > 0) - fLeft = pA->GetNumberAt(0); - if (dwCount > 1) - fBottom = pA->GetNumberAt(1); - } - } else { - fLeft = 0.0f; - fBottom = 0.0f; - } -} - -FX_BOOL CPWL_Icon::GetFittingBounds() { - if (m_pIconFit) - return m_pIconFit->GetFittingBounds(); - - return FALSE; -} - -void CPWL_Icon::GetScale(FX_FLOAT& fHScale, FX_FLOAT& fVScale) { - fHScale = 1.0f; - fVScale = 1.0f; - - if (m_pPDFStream) { - FX_FLOAT fImageWidth, fImageHeight; - FX_FLOAT fPlateWidth, fPlateHeight; - - CFX_FloatRect rcPlate = GetClientRect(); - fPlateWidth = rcPlate.right - rcPlate.left; - fPlateHeight = rcPlate.top - rcPlate.bottom; - - GetImageSize(fImageWidth, fImageHeight); - - int32_t nScaleMethod = GetScaleMethod(); - - switch (nScaleMethod) { - default: - case 0: - fHScale = fPlateWidth / PWL_MAX(fImageWidth, 1.0f); - fVScale = fPlateHeight / PWL_MAX(fImageHeight, 1.0f); - break; - case 1: - if (fPlateWidth < fImageWidth) - fHScale = fPlateWidth / PWL_MAX(fImageWidth, 1.0f); - if (fPlateHeight < fImageHeight) - fVScale = fPlateHeight / PWL_MAX(fImageHeight, 1.0f); - break; - case 2: - if (fPlateWidth > fImageWidth) - fHScale = fPlateWidth / PWL_MAX(fImageWidth, 1.0f); - if (fPlateHeight > fImageHeight) - fVScale = fPlateHeight / PWL_MAX(fImageHeight, 1.0f); - break; - case 3: - break; - } - - FX_FLOAT fMinScale; - if (IsProportionalScale()) { - fMinScale = PWL_MIN(fHScale, fVScale); - fHScale = fMinScale; - fVScale = fMinScale; - } - } -} - -void CPWL_Icon::GetImageOffset(FX_FLOAT& x, FX_FLOAT& y) { - FX_FLOAT fLeft, fBottom; - - GetIconPosition(fLeft, fBottom); - x = 0.0f; - y = 0.0f; - - FX_FLOAT fImageWidth, fImageHeight; - GetImageSize(fImageWidth, fImageHeight); - - FX_FLOAT fHScale, fVScale; - GetScale(fHScale, fVScale); - - FX_FLOAT fImageFactWidth = fImageWidth * fHScale; - FX_FLOAT fImageFactHeight = fImageHeight * fVScale; - - FX_FLOAT fPlateWidth, fPlateHeight; - CFX_FloatRect rcPlate = GetClientRect(); - fPlateWidth = rcPlate.right - rcPlate.left; - fPlateHeight = rcPlate.top - rcPlate.bottom; - - x = (fPlateWidth - fImageFactWidth) * fLeft; - y = (fPlateHeight - fImageFactHeight) * fBottom; -} diff --git a/fpdfsdk/src/pdfwindow/PWL_IconList.cpp b/fpdfsdk/src/pdfwindow/PWL_IconList.cpp deleted file mode 100644 index 7dc8ba9f44..0000000000 --- a/fpdfsdk/src/pdfwindow/PWL_IconList.cpp +++ /dev/null @@ -1,501 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "fpdfsdk/include/pdfwindow/PWL_IconList.h" - -#include "fpdfsdk/include/pdfwindow/PWL_Label.h" -#include "fpdfsdk/include/pdfwindow/PWL_ListCtrl.h" -#include "fpdfsdk/include/pdfwindow/PWL_ScrollBar.h" -#include "fpdfsdk/include/pdfwindow/PWL_Utils.h" -#include "fpdfsdk/include/pdfwindow/PWL_Wnd.h" -#include "public/fpdf_fwlevent.h" - -#define PWL_IconList_ITEM_ICON_LEFTMARGIN 10.0f -#define PWL_IconList_ITEM_WIDTH 20.0f -#define PWL_IconList_ITEM_HEIGHT 20.0f -#define PWL_IconList_ITEM_SPACE 4.0f - -CPWL_IconList_Item::CPWL_IconList_Item() - : m_nIconIndex(-1), m_pData(NULL), m_bSelected(FALSE), m_pText(NULL) {} - -CPWL_IconList_Item::~CPWL_IconList_Item() {} - -CFX_ByteString CPWL_IconList_Item::GetClassName() const { - return "CPWL_IconList_Item"; -} - -FX_FLOAT CPWL_IconList_Item::GetItemHeight(FX_FLOAT fLimitWidth) { - return PWL_IconList_ITEM_HEIGHT; -} - -void CPWL_IconList_Item::DrawThisAppearance(CFX_RenderDevice* pDevice, - CFX_Matrix* pUser2Device) { - CFX_FloatRect rcClient = GetClientRect(); - - if (m_bSelected) { - if (IsEnabled()) { - CPWL_Utils::DrawFillRect( - pDevice, pUser2Device, rcClient, - CPWL_Utils::PWLColorToFXColor(PWL_DEFAULT_SELBACKCOLOR, - GetTransparency())); - } else { - CPWL_Utils::DrawFillRect( - pDevice, pUser2Device, rcClient, - CPWL_Utils::PWLColorToFXColor(PWL_DEFAULT_LIGHTGRAYCOLOR, - GetTransparency())); - } - } - - CFX_FloatRect rcIcon = rcClient; - rcIcon.left += PWL_IconList_ITEM_ICON_LEFTMARGIN; - rcIcon.right = rcIcon.left + PWL_IconList_ITEM_WIDTH; - - CPWL_Utils::DrawIconAppStream(pDevice, pUser2Device, m_nIconIndex, rcIcon, - m_crIcon, m_pText->GetTextColor(), - GetTransparency()); -} - -void CPWL_IconList_Item::SetSelect(FX_BOOL bSelected) { - m_bSelected = bSelected; - - if (bSelected) - m_pText->SetTextColor(PWL_DEFAULT_WHITECOLOR); - else - m_pText->SetTextColor(PWL_DEFAULT_BLACKCOLOR); -} - -FX_BOOL CPWL_IconList_Item::IsSelected() const { - return m_bSelected; -} - -void CPWL_IconList_Item::CreateChildWnd(const PWL_CREATEPARAM& cp) { - m_pText = new CPWL_Label; - - PWL_CREATEPARAM lcp = cp; - lcp.pParentWnd = this; - lcp.dwFlags = PWS_CHILD | PWS_VISIBLE | PES_LEFT | PES_CENTER; - lcp.sTextColor = PWL_DEFAULT_BLACKCOLOR; - lcp.fFontSize = 12; - m_pText->Create(lcp); -} - -void CPWL_IconList_Item::SetData(void* pData) { - m_pData = pData; -} - -void CPWL_IconList_Item::SetIcon(int32_t nIconIndex) { - m_nIconIndex = nIconIndex; -} - -void CPWL_IconList_Item::SetText(const CFX_WideString& str) { - m_pText->SetText(str.c_str()); -} - -CFX_WideString CPWL_IconList_Item::GetText() const { - return m_pText->GetText(); -} - -void CPWL_IconList_Item::RePosChildWnd() { - CFX_FloatRect rcClient = GetClientRect(); - - rcClient.left += - (PWL_IconList_ITEM_ICON_LEFTMARGIN + PWL_IconList_ITEM_WIDTH + - PWL_IconList_ITEM_ICON_LEFTMARGIN); - - m_pText->Move(rcClient, TRUE, FALSE); -} - -void CPWL_IconList_Item::SetIconFillColor(const CPWL_Color& color) { - m_crIcon = color; -} - -void CPWL_IconList_Item::OnEnabled() { - if (m_bSelected) - m_pText->SetTextColor(PWL_DEFAULT_WHITECOLOR); - else - m_pText->SetTextColor(PWL_DEFAULT_BLACKCOLOR); - - InvalidateRect(); -} - -void CPWL_IconList_Item::OnDisabled() { - m_pText->SetTextColor(PWL_DEFAULT_HEAVYGRAYCOLOR); - - InvalidateRect(); -} - -CPWL_IconList_Content::CPWL_IconList_Content(int32_t nListCount) - : m_nSelectIndex(-1), - m_pNotify(NULL), - m_bEnableNotify(TRUE), - m_bMouseDown(FALSE), - m_nListCount(nListCount) {} - -CPWL_IconList_Content::~CPWL_IconList_Content() {} - -void CPWL_IconList_Content::CreateChildWnd(const PWL_CREATEPARAM& cp) { - for (int32_t i = 0; i < m_nListCount; i++) { - CPWL_IconList_Item* pNewItem = new CPWL_IconList_Item(); - - PWL_CREATEPARAM icp = cp; - icp.pParentWnd = this; - icp.dwFlags = PWS_CHILD | PWS_VISIBLE | PWS_NOREFRESHCLIP; - pNewItem->Create(icp); - } - - SetItemSpace(PWL_IconList_ITEM_SPACE); - ResetContent(0); - - if (CPWL_Wnd* pParent = GetParentWindow()) { - CFX_FloatRect rcScroll = GetScrollArea(); - GetScrollPos(); - - PWL_SCROLL_INFO sInfo; - sInfo.fContentMin = rcScroll.bottom; - sInfo.fContentMax = rcScroll.top; - sInfo.fPlateWidth = GetClientRect().Height(); - sInfo.fSmallStep = 13.0f; - sInfo.fBigStep = sInfo.fPlateWidth; - - pParent->OnNotify(this, PNM_SETSCROLLINFO, SBT_VSCROLL, (intptr_t)&sInfo); - } -} - -FX_BOOL CPWL_IconList_Content::OnLButtonDown(const CFX_FloatPoint& point, - FX_DWORD nFlag) { - SetFocus(); - - SetCapture(); - m_bMouseDown = TRUE; - - int32_t nItemIndex = FindItemIndex(point); - SetSelect(nItemIndex); - ScrollToItem(nItemIndex); - - return TRUE; -} - -FX_BOOL CPWL_IconList_Content::OnLButtonUp(const CFX_FloatPoint& point, - FX_DWORD nFlag) { - m_bMouseDown = FALSE; - ReleaseCapture(); - - return TRUE; -} - -FX_BOOL CPWL_IconList_Content::OnMouseMove(const CFX_FloatPoint& point, - FX_DWORD nFlag) { - if (m_bMouseDown) { - int32_t nItemIndex = FindItemIndex(point); - SetSelect(nItemIndex); - ScrollToItem(nItemIndex); - } - - return TRUE; -} - -FX_BOOL CPWL_IconList_Content::OnKeyDown(FX_WORD nChar, FX_DWORD nFlag) { - switch (nChar) { - case FWL_VKEY_Up: - if (m_nSelectIndex > 0) { - int32_t nItemIndex = m_nSelectIndex - 1; - SetSelect(nItemIndex); - ScrollToItem(nItemIndex); - } - return TRUE; - case FWL_VKEY_Down: - if (m_nSelectIndex < m_nListCount - 1) { - int32_t nItemIndex = m_nSelectIndex + 1; - SetSelect(nItemIndex); - ScrollToItem(nItemIndex); - } - return TRUE; - } - - return FALSE; -} - -int32_t CPWL_IconList_Content::FindItemIndex(const CFX_FloatPoint& point) { - int32_t nIndex = 0; - for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) { - if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) { - CFX_FloatRect rcWnd = pChild->ChildToParent(pChild->GetWindowRect()); - - if (point.y < rcWnd.top) { - nIndex = i; - } - } - } - - return nIndex; -} - -void CPWL_IconList_Content::ScrollToItem(int32_t nItemIndex) { - CFX_FloatRect rcClient = GetClientRect(); - - if (CPWL_IconList_Item* pItem = GetListItem(nItemIndex)) { - CFX_FloatRect rcOrigin = pItem->GetWindowRect(); - CFX_FloatRect rcWnd = pItem->ChildToParent(rcOrigin); - - if (!(rcWnd.bottom > rcClient.bottom && rcWnd.top < rcClient.top)) { - CFX_FloatPoint ptScroll = GetScrollPos(); - - if (rcWnd.top > rcClient.top) { - ptScroll.y = rcOrigin.top; - } else if (rcWnd.bottom < rcClient.bottom) { - ptScroll.y = rcOrigin.bottom + rcClient.Height(); - } - - SetScrollPos(ptScroll); - ResetFace(); - InvalidateRect(); - if (CPWL_Wnd* pParent = GetParentWindow()) { - pParent->OnNotify(this, PNM_SETSCROLLPOS, SBT_VSCROLL, - (intptr_t)&ptScroll.y); - } - } - } -} - -void CPWL_IconList_Content::SetSelect(int32_t nIndex) { - if (m_nSelectIndex != nIndex) { - SelectItem(m_nSelectIndex, FALSE); - SelectItem(nIndex, TRUE); - m_nSelectIndex = nIndex; - - if (IPWL_IconList_Notify* pNotify = GetNotify()) - pNotify->OnNoteListSelChanged(nIndex); - } -} - -int32_t CPWL_IconList_Content::GetSelect() const { - return m_nSelectIndex; -} - -IPWL_IconList_Notify* CPWL_IconList_Content::GetNotify() const { - if (m_bEnableNotify) - return m_pNotify; - return NULL; -} - -void CPWL_IconList_Content::SetNotify(IPWL_IconList_Notify* pNotify) { - m_pNotify = pNotify; -} - -void CPWL_IconList_Content::EnableNotify(FX_BOOL bNotify) { - m_bEnableNotify = bNotify; -} - -void CPWL_IconList_Content::SelectItem(int32_t nItemIndex, FX_BOOL bSelect) { - if (CPWL_IconList_Item* pItem = GetListItem(nItemIndex)) { - pItem->SetSelect(bSelect); - pItem->InvalidateRect(); - } -} - -CPWL_IconList_Item* CPWL_IconList_Content::GetListItem( - int32_t nItemIndex) const { - if (nItemIndex >= 0 && nItemIndex < m_aChildren.GetSize()) { - if (CPWL_Wnd* pChild = m_aChildren.GetAt(nItemIndex)) { - if (pChild->GetClassName() == "CPWL_IconList_Item") { - return (CPWL_IconList_Item*)pChild; - } - } - } - - return NULL; -} - -void CPWL_IconList_Content::SetListData(int32_t nItemIndex, void* pData) { - if (CPWL_IconList_Item* pItem = GetListItem(nItemIndex)) - pItem->SetData(pData); -} - -void CPWL_IconList_Content::SetListIcon(int32_t nItemIndex, - int32_t nIconIndex) { - if (CPWL_IconList_Item* pItem = GetListItem(nItemIndex)) - pItem->SetIcon(nIconIndex); -} - -void CPWL_IconList_Content::SetListString(int32_t nItemIndex, - const CFX_WideString& str) { - if (CPWL_IconList_Item* pItem = GetListItem(nItemIndex)) - pItem->SetText(str); -} - -CFX_WideString CPWL_IconList_Content::GetListString(int32_t nItemIndex) const { - if (CPWL_IconList_Item* pItem = GetListItem(nItemIndex)) - return pItem->GetText(); - - return L""; -} - -void CPWL_IconList_Content::SetIconFillColor(const CPWL_Color& color) { - for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) { - if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) { - if (pChild->GetClassName() == "CPWL_IconList_Item") { - CPWL_IconList_Item* pItem = (CPWL_IconList_Item*)pChild; - pItem->SetIconFillColor(color); - pItem->InvalidateRect(); - } - } - } -} - -CPWL_IconList::CPWL_IconList(int32_t nListCount) - : m_pListContent(NULL), m_nListCount(nListCount) {} - -CPWL_IconList::~CPWL_IconList() {} - -void CPWL_IconList::RePosChildWnd() { - CPWL_Wnd::RePosChildWnd(); - - if (m_pListContent) - m_pListContent->Move(GetClientRect(), TRUE, FALSE); -} - -void CPWL_IconList::CreateChildWnd(const PWL_CREATEPARAM& cp) { - m_pListContent = new CPWL_IconList_Content(m_nListCount); - - PWL_CREATEPARAM ccp = cp; - ccp.pParentWnd = this; - ccp.dwFlags = PWS_CHILD | PWS_VISIBLE; - m_pListContent->Create(ccp); -} - -void CPWL_IconList::OnCreated() { - if (CPWL_ScrollBar* pScrollBar = GetVScrollBar()) { - pScrollBar->RemoveFlag(PWS_AUTOTRANSPARENT); - pScrollBar->SetTransparency(255); - pScrollBar->SetNotifyForever(TRUE); - } -} - -void CPWL_IconList::OnNotify(CPWL_Wnd* pWnd, - FX_DWORD msg, - intptr_t wParam, - intptr_t lParam) { - CPWL_Wnd::OnNotify(pWnd, msg, wParam, lParam); - - if (wParam == SBT_VSCROLL) { - switch (msg) { - case PNM_SETSCROLLINFO: - if (PWL_SCROLL_INFO* pInfo = (PWL_SCROLL_INFO*)lParam) { - if (CPWL_ScrollBar* pScrollBar = GetVScrollBar()) { - if (pInfo->fContentMax - pInfo->fContentMin > pInfo->fPlateWidth) { - if (!pScrollBar->IsVisible()) { - pScrollBar->SetVisible(TRUE); - RePosChildWnd(); - } else { - } - } else { - if (pScrollBar->IsVisible()) { - pScrollBar->SetVisible(FALSE); - RePosChildWnd(); - } - - if (m_pListContent) - m_pListContent->SetScrollPos(CFX_FloatPoint(0.0f, 0.0f)); - } - - pScrollBar->OnNotify(pWnd, PNM_SETSCROLLINFO, wParam, lParam); - } - } - return; - case PNM_SCROLLWINDOW: - if (m_pListContent) { - m_pListContent->SetScrollPos( - CFX_FloatPoint(0.0f, *(FX_FLOAT*)lParam)); - m_pListContent->ResetFace(); - m_pListContent->InvalidateRect(NULL); - } - return; - case PNM_SETSCROLLPOS: - if (CPWL_ScrollBar* pScrollBar = GetVScrollBar()) - pScrollBar->OnNotify(pWnd, PNM_SETSCROLLPOS, wParam, lParam); - return; - } - } -} - -void CPWL_IconList::SetSelect(int32_t nIndex) { - m_pListContent->SetSelect(nIndex); -} - -void CPWL_IconList::SetTopItem(int32_t nIndex) { - m_pListContent->ScrollToItem(nIndex); -} - -int32_t CPWL_IconList::GetSelect() const { - return m_pListContent->GetSelect(); -} - -void CPWL_IconList::SetNotify(IPWL_IconList_Notify* pNotify) { - m_pListContent->SetNotify(pNotify); -} - -void CPWL_IconList::EnableNotify(FX_BOOL bNotify) { - m_pListContent->EnableNotify(bNotify); -} - -void CPWL_IconList::SetListData(int32_t nItemIndex, void* pData) { - m_pListContent->SetListData(nItemIndex, pData); -} - -void CPWL_IconList::SetListIcon(int32_t nItemIndex, int32_t nIconIndex) { - m_pListContent->SetListIcon(nItemIndex, nIconIndex); -} - -void CPWL_IconList::SetListString(int32_t nItemIndex, - const CFX_WideString& str) { - m_pListContent->SetListString(nItemIndex, str); -} - -CFX_WideString CPWL_IconList::GetListString(int32_t nItemIndex) const { - return m_pListContent->GetListString(nItemIndex); -} - -void CPWL_IconList::SetIconFillColor(const CPWL_Color& color) { - m_pListContent->SetIconFillColor(color); -} - -FX_BOOL CPWL_IconList::OnMouseWheel(short zDelta, - const CFX_FloatPoint& point, - FX_DWORD nFlag) { - CFX_FloatPoint ptScroll = m_pListContent->GetScrollPos(); - CFX_FloatRect rcScroll = m_pListContent->GetScrollArea(); - CFX_FloatRect rcContents = m_pListContent->GetClientRect(); - - if (rcScroll.top - rcScroll.bottom > rcContents.Height()) { - CFX_FloatPoint ptNew = ptScroll; - - if (zDelta > 0) - ptNew.y += 30; - else - ptNew.y -= 30; - - if (ptNew.y > rcScroll.top) - ptNew.y = rcScroll.top; - if (ptNew.y < rcScroll.bottom + rcContents.Height()) - ptNew.y = rcScroll.bottom + rcContents.Height(); - if (ptNew.y < rcScroll.bottom) - ptNew.y = rcScroll.bottom; - - if (ptNew.y != ptScroll.y) { - m_pListContent->SetScrollPos(ptNew); - m_pListContent->ResetFace(); - m_pListContent->InvalidateRect(NULL); - - if (CPWL_ScrollBar* pScrollBar = GetVScrollBar()) - pScrollBar->OnNotify(this, PNM_SETSCROLLPOS, SBT_VSCROLL, - (intptr_t)&ptNew.y); - - return TRUE; - } - } - - return FALSE; -} diff --git a/fpdfsdk/src/pdfwindow/PWL_Label.cpp b/fpdfsdk/src/pdfwindow/PWL_Label.cpp deleted file mode 100644 index 5f8d2d8685..0000000000 --- a/fpdfsdk/src/pdfwindow/PWL_Label.cpp +++ /dev/null @@ -1,150 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "fpdfsdk/include/pdfwindow/PWL_Label.h" -#include "fpdfsdk/include/pdfwindow/PWL_Utils.h" -#include "fpdfsdk/include/pdfwindow/PWL_Wnd.h" - -CPWL_Label::CPWL_Label() : m_pEdit(NULL) { - m_pEdit = IFX_Edit::NewEdit(); - ASSERT(m_pEdit); -} - -CPWL_Label::~CPWL_Label() { - IFX_Edit::DelEdit(m_pEdit); -} - -CFX_ByteString CPWL_Label::GetClassName() const { - return "CPWL_Label"; -} - -void CPWL_Label::OnCreated() { - SetParamByFlag(); - SetFontSize(GetCreationParam().fFontSize); - - m_pEdit->SetFontMap(GetFontMap()); - m_pEdit->Initialize(); - - if (HasFlag(PES_TEXTOVERFLOW)) { - SetClipRect(CFX_FloatRect(0.0f, 0.0f, 0.0f, 0.0f)); - m_pEdit->SetTextOverflow(TRUE); - } -} - -void CPWL_Label::SetText(const FX_WCHAR* csText) { - m_pEdit->SetText(csText); -} - -void CPWL_Label::RePosChildWnd() { - m_pEdit->SetPlateRect(GetClientRect()); -} - -void CPWL_Label::SetFontSize(FX_FLOAT fFontSize) { - m_pEdit->SetFontSize(fFontSize); -} - -FX_FLOAT CPWL_Label::GetFontSize() const { - return m_pEdit->GetFontSize(); -} - -void CPWL_Label::SetParamByFlag() { - if (HasFlag(PES_LEFT)) { - m_pEdit->SetAlignmentH(0); - } else if (HasFlag(PES_MIDDLE)) { - m_pEdit->SetAlignmentH(1); - } else if (HasFlag(PES_RIGHT)) { - m_pEdit->SetAlignmentH(2); - } else { - m_pEdit->SetAlignmentH(0); - } - - if (HasFlag(PES_TOP)) { - m_pEdit->SetAlignmentV(0); - } else if (HasFlag(PES_CENTER)) { - m_pEdit->SetAlignmentV(1); - } else if (HasFlag(PES_BOTTOM)) { - m_pEdit->SetAlignmentV(2); - } else { - m_pEdit->SetAlignmentV(0); - } - - if (HasFlag(PES_PASSWORD)) { - m_pEdit->SetPasswordChar('*'); - } - - m_pEdit->SetMultiLine(HasFlag(PES_MULTILINE)); - m_pEdit->SetAutoReturn(HasFlag(PES_AUTORETURN)); - m_pEdit->SetAutoFontSize(HasFlag(PWS_AUTOFONTSIZE)); - m_pEdit->SetAutoScroll(HasFlag(PES_AUTOSCROLL)); -} - -void CPWL_Label::DrawThisAppearance(CFX_RenderDevice* pDevice, - CFX_Matrix* pUser2Device) { - CPWL_Wnd::DrawThisAppearance(pDevice, pUser2Device); - - GetClientRect(); - - CFX_FloatRect rcClip; - CPVT_WordRange wrRange = m_pEdit->GetVisibleWordRange(); - CPVT_WordRange* pRange = NULL; - - if (!HasFlag(PES_TEXTOVERFLOW)) { - rcClip = GetClientRect(); - pRange = &wrRange; - } - IFX_SystemHandler* pSysHandler = GetSystemHandler(); - IFX_Edit::DrawEdit( - pDevice, pUser2Device, m_pEdit, - CPWL_Utils::PWLColorToFXColor(GetTextColor(), GetTransparency()), - CPWL_Utils::PWLColorToFXColor(GetTextStrokeColor(), GetTransparency()), - rcClip, CFX_FloatPoint(0.0f, 0.0f), pRange, pSysHandler, NULL); -} - -void CPWL_Label::SetHorzScale(int32_t nHorzScale) { - m_pEdit->SetHorzScale(nHorzScale); -} - -void CPWL_Label::SetCharSpace(FX_FLOAT fCharSpace) { - m_pEdit->SetCharSpace(fCharSpace); -} - -CFX_FloatRect CPWL_Label::GetContentRect() const { - return m_pEdit->GetContentRect(); -} - -void CPWL_Label::GetThisAppearanceStream(CFX_ByteTextBuf& sAppStream) { - CPWL_Wnd::GetThisAppearanceStream(sAppStream); - - sAppStream << GetTextAppearanceStream(CFX_FloatPoint(0.0f, 0.0f)); -} - -CFX_ByteString CPWL_Label::GetTextAppearanceStream( - const CFX_FloatPoint& ptOffset) const { - CFX_ByteTextBuf sRet; - CFX_ByteString sEdit = CPWL_Utils::GetEditAppStream(m_pEdit, ptOffset); - - if (sEdit.GetLength() > 0) { - sRet << "BT\n" << CPWL_Utils::GetColorAppStream(GetTextColor()) << sEdit - << "ET\n"; - } - - return sRet.GetByteString(); -} - -CFX_WideString CPWL_Label::GetText() const { - return m_pEdit->GetText(); -} - -void CPWL_Label::SetLimitChar(int32_t nLimitChar) { - m_pEdit->SetLimitChar(nLimitChar); -} - -int32_t CPWL_Label::GetTotalWords() { - if (m_pEdit) - return m_pEdit->GetTotalWords(); - - return 0; -} diff --git a/fpdfsdk/src/pdfwindow/PWL_ListBox.cpp b/fpdfsdk/src/pdfwindow/PWL_ListBox.cpp deleted file mode 100644 index 2c0b79d2f1..0000000000 --- a/fpdfsdk/src/pdfwindow/PWL_ListBox.cpp +++ /dev/null @@ -1,533 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "fpdfsdk/include/pdfwindow/PWL_ListBox.h" - -#include "fpdfsdk/include/pdfwindow/PWL_Edit.h" -#include "fpdfsdk/include/pdfwindow/PWL_EditCtrl.h" -#include "fpdfsdk/include/pdfwindow/PWL_ScrollBar.h" -#include "fpdfsdk/include/pdfwindow/PWL_Utils.h" -#include "fpdfsdk/include/pdfwindow/PWL_Wnd.h" -#include "public/fpdf_fwlevent.h" - -#define IsFloatZero(f) ((f) < 0.0001 && (f) > -0.0001) -#define IsFloatBigger(fa, fb) ((fa) > (fb) && !IsFloatZero((fa) - (fb))) -#define IsFloatSmaller(fa, fb) ((fa) < (fb) && !IsFloatZero((fa) - (fb))) -#define IsFloatEqual(fa, fb) IsFloatZero((fa) - (fb)) - -CPWL_List_Notify::CPWL_List_Notify(CPWL_ListBox* pList) : m_pList(pList) { - ASSERT(m_pList); -} - -CPWL_List_Notify::~CPWL_List_Notify() {} - -void CPWL_List_Notify::IOnSetScrollInfoY(FX_FLOAT fPlateMin, - FX_FLOAT fPlateMax, - FX_FLOAT fContentMin, - FX_FLOAT fContentMax, - FX_FLOAT fSmallStep, - FX_FLOAT fBigStep) { - PWL_SCROLL_INFO Info; - - Info.fPlateWidth = fPlateMax - fPlateMin; - Info.fContentMin = fContentMin; - Info.fContentMax = fContentMax; - Info.fSmallStep = fSmallStep; - Info.fBigStep = fBigStep; - - m_pList->OnNotify(m_pList, PNM_SETSCROLLINFO, SBT_VSCROLL, (intptr_t)&Info); - - if (CPWL_ScrollBar* pScroll = m_pList->GetVScrollBar()) { - if (IsFloatBigger(Info.fPlateWidth, Info.fContentMax - Info.fContentMin) || - IsFloatEqual(Info.fPlateWidth, Info.fContentMax - Info.fContentMin)) { - if (pScroll->IsVisible()) { - pScroll->SetVisible(FALSE); - m_pList->RePosChildWnd(); - } - } else { - if (!pScroll->IsVisible()) { - pScroll->SetVisible(TRUE); - m_pList->RePosChildWnd(); - } - } - } -} - -void CPWL_List_Notify::IOnSetScrollPosY(FX_FLOAT fy) { - m_pList->OnNotify(m_pList, PNM_SETSCROLLPOS, SBT_VSCROLL, (intptr_t)&fy); -} - -void CPWL_List_Notify::IOnInvalidateRect(CFX_FloatRect* pRect) { - m_pList->InvalidateRect(pRect); -} - -CPWL_ListBox::CPWL_ListBox() - : m_pList(NULL), - m_pListNotify(NULL), - m_bMouseDown(FALSE), - m_bHoverSel(FALSE), - m_pFillerNotify(NULL) { - m_pList = IFX_List::NewList(); -} - -CPWL_ListBox::~CPWL_ListBox() { - IFX_List::DelList(m_pList); - delete m_pListNotify; - m_pListNotify = NULL; -} - -CFX_ByteString CPWL_ListBox::GetClassName() const { - return "CPWL_ListBox"; -} - -void CPWL_ListBox::OnCreated() { - if (m_pList) { - delete m_pListNotify; - - m_pList->SetFontMap(GetFontMap()); - m_pList->SetNotify(m_pListNotify = new CPWL_List_Notify(this)); - - SetHoverSel(HasFlag(PLBS_HOVERSEL)); - m_pList->SetMultipleSel(HasFlag(PLBS_MULTIPLESEL)); - m_pList->SetFontSize(GetCreationParam().fFontSize); - - m_bHoverSel = HasFlag(PLBS_HOVERSEL); - } -} - -void CPWL_ListBox::OnDestroy() { - delete m_pListNotify; - m_pListNotify = NULL; -} - -void CPWL_ListBox::GetThisAppearanceStream(CFX_ByteTextBuf& sAppStream) { - CPWL_Wnd::GetThisAppearanceStream(sAppStream); - - CFX_ByteTextBuf sListItems; - - if (m_pList) { - CFX_FloatRect rcPlate = m_pList->GetPlateRect(); - for (int32_t i = 0, sz = m_pList->GetCount(); i < sz; i++) { - CFX_FloatRect rcItem = m_pList->GetItemRect(i); - - if (rcItem.bottom > rcPlate.top || rcItem.top < rcPlate.bottom) - continue; - - CFX_FloatPoint ptOffset(rcItem.left, (rcItem.top + rcItem.bottom) * 0.5f); - if (m_pList->IsItemSelected(i)) { - sListItems << CPWL_Utils::GetRectFillAppStream( - rcItem, PWL_DEFAULT_SELBACKCOLOR); - CFX_ByteString sItem = - CPWL_Utils::GetEditAppStream(m_pList->GetItemEdit(i), ptOffset); - if (sItem.GetLength() > 0) { - sListItems << "BT\n" - << CPWL_Utils::GetColorAppStream(PWL_DEFAULT_SELTEXTCOLOR) - << sItem << "ET\n"; - } - } else { - CFX_ByteString sItem = - CPWL_Utils::GetEditAppStream(m_pList->GetItemEdit(i), ptOffset); - if (sItem.GetLength() > 0) { - sListItems << "BT\n" << CPWL_Utils::GetColorAppStream(GetTextColor()) - << sItem << "ET\n"; - } - } - } - } - - if (sListItems.GetLength() > 0) { - CFX_ByteTextBuf sClip; - CFX_FloatRect rcClient = GetClientRect(); - - sClip << "q\n"; - sClip << rcClient.left << " " << rcClient.bottom << " " - << rcClient.right - rcClient.left << " " - << rcClient.top - rcClient.bottom << " re W n\n"; - - sClip << sListItems << "Q\n"; - - sAppStream << "/Tx BMC\n" << sClip << "EMC\n"; - } -} - -void CPWL_ListBox::DrawThisAppearance(CFX_RenderDevice* pDevice, - CFX_Matrix* pUser2Device) { - CPWL_Wnd::DrawThisAppearance(pDevice, pUser2Device); - - if (m_pList) { - CFX_FloatRect rcPlate = m_pList->GetPlateRect(); - CFX_FloatRect rcList = GetListRect(); - CFX_FloatRect rcClient = GetClientRect(); - - for (int32_t i = 0, sz = m_pList->GetCount(); i < sz; i++) { - CFX_FloatRect rcItem = m_pList->GetItemRect(i); - if (rcItem.bottom > rcPlate.top || rcItem.top < rcPlate.bottom) - continue; - - CFX_FloatPoint ptOffset(rcItem.left, (rcItem.top + rcItem.bottom) * 0.5f); - if (IFX_Edit* pEdit = m_pList->GetItemEdit(i)) { - CFX_FloatRect rcContent = pEdit->GetContentRect(); - if (rcContent.Width() > rcClient.Width()) - rcItem.Intersect(rcList); - else - rcItem.Intersect(rcClient); - } - - if (m_pList->IsItemSelected(i)) { - IFX_SystemHandler* pSysHandler = GetSystemHandler(); - if (pSysHandler && pSysHandler->IsSelectionImplemented()) { - IFX_Edit::DrawEdit( - pDevice, pUser2Device, m_pList->GetItemEdit(i), - CPWL_Utils::PWLColorToFXColor(GetTextColor()), - CPWL_Utils::PWLColorToFXColor(GetTextStrokeColor()), rcList, - ptOffset, NULL, pSysHandler, m_pFormFiller); - pSysHandler->OutputSelectedRect(m_pFormFiller, rcItem); - } else { - CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcItem, - ArgbEncode(255, 0, 51, 113)); - IFX_Edit::DrawEdit(pDevice, pUser2Device, m_pList->GetItemEdit(i), - ArgbEncode(255, 255, 255, 255), 0, rcList, - ptOffset, NULL, pSysHandler, m_pFormFiller); - } - } else { - IFX_SystemHandler* pSysHandler = GetSystemHandler(); - IFX_Edit::DrawEdit(pDevice, pUser2Device, m_pList->GetItemEdit(i), - CPWL_Utils::PWLColorToFXColor(GetTextColor()), - CPWL_Utils::PWLColorToFXColor(GetTextStrokeColor()), - rcList, ptOffset, NULL, pSysHandler, NULL); - } - } - } -} - -FX_BOOL CPWL_ListBox::OnKeyDown(FX_WORD nChar, FX_DWORD nFlag) { - CPWL_Wnd::OnKeyDown(nChar, nFlag); - - if (!m_pList) - return FALSE; - - switch (nChar) { - default: - return FALSE; - case FWL_VKEY_Up: - case FWL_VKEY_Down: - case FWL_VKEY_Home: - case FWL_VKEY_Left: - case FWL_VKEY_End: - case FWL_VKEY_Right: - break; - } - - switch (nChar) { - case FWL_VKEY_Up: - m_pList->OnVK_UP(IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); - break; - case FWL_VKEY_Down: - m_pList->OnVK_DOWN(IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); - break; - case FWL_VKEY_Home: - m_pList->OnVK_HOME(IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); - break; - case FWL_VKEY_Left: - m_pList->OnVK_LEFT(IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); - break; - case FWL_VKEY_End: - m_pList->OnVK_END(IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); - break; - case FWL_VKEY_Right: - m_pList->OnVK_RIGHT(IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); - break; - case FWL_VKEY_Delete: - break; - } - - FX_BOOL bExit = FALSE; - OnNotifySelChanged(TRUE, bExit, nFlag); - - return TRUE; -} - -FX_BOOL CPWL_ListBox::OnChar(FX_WORD nChar, FX_DWORD nFlag) { - CPWL_Wnd::OnChar(nChar, nFlag); - - if (!m_pList) - return FALSE; - - if (!m_pList->OnChar(nChar, IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag))) - return FALSE; - - FX_BOOL bExit = FALSE; - OnNotifySelChanged(TRUE, bExit, nFlag); - - return TRUE; -} - -FX_BOOL CPWL_ListBox::OnLButtonDown(const CFX_FloatPoint& point, - FX_DWORD nFlag) { - CPWL_Wnd::OnLButtonDown(point, nFlag); - - if (ClientHitTest(point)) { - m_bMouseDown = TRUE; - SetFocus(); - SetCapture(); - - if (m_pList) - m_pList->OnMouseDown(point, IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); - } - - return TRUE; -} - -FX_BOOL CPWL_ListBox::OnLButtonUp(const CFX_FloatPoint& point, FX_DWORD nFlag) { - CPWL_Wnd::OnLButtonUp(point, nFlag); - - if (m_bMouseDown) { - ReleaseCapture(); - m_bMouseDown = FALSE; - } - - FX_BOOL bExit = FALSE; - OnNotifySelChanged(FALSE, bExit, nFlag); - - return TRUE; -} - -void CPWL_ListBox::SetHoverSel(FX_BOOL bHoverSel) { - m_bHoverSel = bHoverSel; -} - -FX_BOOL CPWL_ListBox::OnMouseMove(const CFX_FloatPoint& point, FX_DWORD nFlag) { - CPWL_Wnd::OnMouseMove(point, nFlag); - - if (m_bHoverSel && !IsCaptureMouse() && ClientHitTest(point)) { - if (m_pList) - m_pList->Select(m_pList->GetItemIndex(point)); - } - - if (m_bMouseDown) { - if (m_pList) - m_pList->OnMouseMove(point, IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); - } - - return TRUE; -} - -void CPWL_ListBox::OnNotify(CPWL_Wnd* pWnd, - FX_DWORD msg, - intptr_t wParam, - intptr_t lParam) { - CPWL_Wnd::OnNotify(pWnd, msg, wParam, lParam); - - FX_FLOAT fPos; - - switch (msg) { - case PNM_SETSCROLLINFO: - switch (wParam) { - case SBT_VSCROLL: - if (CPWL_Wnd* pChild = GetVScrollBar()) { - pChild->OnNotify(pWnd, PNM_SETSCROLLINFO, wParam, lParam); - } - break; - } - break; - case PNM_SETSCROLLPOS: - switch (wParam) { - case SBT_VSCROLL: - if (CPWL_Wnd* pChild = GetVScrollBar()) { - pChild->OnNotify(pWnd, PNM_SETSCROLLPOS, wParam, lParam); - } - break; - } - break; - case PNM_SCROLLWINDOW: - fPos = *(FX_FLOAT*)lParam; - switch (wParam) { - case SBT_VSCROLL: - if (m_pList) - m_pList->SetScrollPos(CFX_FloatPoint(0, fPos)); - break; - } - break; - } -} - -void CPWL_ListBox::KillFocus() { - CPWL_Wnd::KillFocus(); -} - -void CPWL_ListBox::RePosChildWnd() { - CPWL_Wnd::RePosChildWnd(); - - if (m_pList) - m_pList->SetPlateRect(GetListRect()); -} - -void CPWL_ListBox::OnNotifySelChanged(FX_BOOL bKeyDown, - FX_BOOL& bExit, - FX_DWORD nFlag) { - if (!m_pFillerNotify) - return; - - FX_BOOL bRC = TRUE; - CFX_WideString swChange = GetText(); - CFX_WideString strChangeEx; - int nSelStart = 0; - int nSelEnd = swChange.GetLength(); - m_pFillerNotify->OnBeforeKeyStroke(GetAttachedData(), swChange, strChangeEx, - nSelStart, nSelEnd, bKeyDown, bRC, bExit, - nFlag); -} - -CFX_FloatRect CPWL_ListBox::GetFocusRect() const { - if (m_pList && m_pList->IsMultipleSel()) { - CFX_FloatRect rcCaret = m_pList->GetItemRect(m_pList->GetCaret()); - rcCaret.Intersect(GetClientRect()); - return rcCaret; - } - - return CPWL_Wnd::GetFocusRect(); -} - -void CPWL_ListBox::AddString(const FX_WCHAR* str) { - if (m_pList) { - m_pList->AddString(str); - } -} - -CFX_WideString CPWL_ListBox::GetText() const { - if (m_pList) - return m_pList->GetText(); - - return L""; -} - -void CPWL_ListBox::SetFontSize(FX_FLOAT fFontSize) { - if (m_pList) - m_pList->SetFontSize(fFontSize); -} - -FX_FLOAT CPWL_ListBox::GetFontSize() const { - if (m_pList) - return m_pList->GetFontSize(); - return 0.0f; -} - -void CPWL_ListBox::Select(int32_t nItemIndex) { - if (m_pList) - m_pList->Select(nItemIndex); -} - -void CPWL_ListBox::SetCaret(int32_t nItemIndex) { - if (m_pList) - m_pList->SetCaret(nItemIndex); -} - -void CPWL_ListBox::SetTopVisibleIndex(int32_t nItemIndex) { - if (m_pList) - m_pList->SetTopItem(nItemIndex); -} - -void CPWL_ListBox::ScrollToListItem(int32_t nItemIndex) { - if (m_pList) - m_pList->ScrollToListItem(nItemIndex); -} - -void CPWL_ListBox::ResetContent() { - if (m_pList) - m_pList->Empty(); -} - -void CPWL_ListBox::Reset() { - if (m_pList) - m_pList->Cancel(); -} - -FX_BOOL CPWL_ListBox::IsMultipleSel() const { - if (m_pList) - return m_pList->IsMultipleSel(); - - return FALSE; -} - -int32_t CPWL_ListBox::GetCaretIndex() const { - if (m_pList) - return m_pList->GetCaret(); - - return -1; -} - -int32_t CPWL_ListBox::GetCurSel() const { - if (m_pList) - return m_pList->GetSelect(); - - return -1; -} - -FX_BOOL CPWL_ListBox::IsItemSelected(int32_t nItemIndex) const { - if (m_pList) - return m_pList->IsItemSelected(nItemIndex); - - return FALSE; -} - -int32_t CPWL_ListBox::GetTopVisibleIndex() const { - if (m_pList) { - m_pList->ScrollToListItem(m_pList->GetFirstSelected()); - return m_pList->GetTopItem(); - } - - return -1; -} - -int32_t CPWL_ListBox::GetCount() const { - if (m_pList) - return m_pList->GetCount(); - - return 0; -} - -int32_t CPWL_ListBox::FindNext(int32_t nIndex, FX_WCHAR nChar) const { - if (m_pList) - return m_pList->FindNext(nIndex, nChar); - - return nIndex; -} - -CFX_FloatRect CPWL_ListBox::GetContentRect() const { - if (m_pList) - return m_pList->GetContentRect(); - - return CFX_FloatRect(); -} - -FX_FLOAT CPWL_ListBox::GetFirstHeight() const { - if (m_pList) - return m_pList->GetFirstHeight(); - - return 0.0f; -} - -CFX_FloatRect CPWL_ListBox::GetListRect() const { - return CPWL_Utils::DeflateRect( - GetWindowRect(), (FX_FLOAT)(GetBorderWidth() + GetInnerBorderWidth())); -} - -FX_BOOL CPWL_ListBox::OnMouseWheel(short zDelta, - const CFX_FloatPoint& point, - FX_DWORD nFlag) { - if (!m_pList) - return FALSE; - - if (zDelta < 0) { - m_pList->OnVK_DOWN(IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); - } else { - m_pList->OnVK_UP(IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); - } - - FX_BOOL bExit = FALSE; - OnNotifySelChanged(FALSE, bExit, nFlag); - return TRUE; -} diff --git a/fpdfsdk/src/pdfwindow/PWL_ListCtrl.cpp b/fpdfsdk/src/pdfwindow/PWL_ListCtrl.cpp deleted file mode 100644 index 7c2c1f4d17..0000000000 --- a/fpdfsdk/src/pdfwindow/PWL_ListCtrl.cpp +++ /dev/null @@ -1,204 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "fpdfsdk/include/pdfwindow/PWL_ListCtrl.h" -#include "fpdfsdk/include/pdfwindow/PWL_Wnd.h" - -CPWL_ListCtrl::CPWL_ListCtrl() - : m_rcContent(0, 0, 0, 0), - m_ptScroll(0, 0), - m_fItemSpace(0.0f), - m_fTopSpace(0.0f), - m_fBottomSpace(0.0f) {} - -CPWL_ListCtrl::~CPWL_ListCtrl() {} - -void CPWL_ListCtrl::SetScrollPos(const CFX_FloatPoint& point) { - m_ptScroll = point; - - if (m_ptScroll.x < m_rcContent.left) - m_ptScroll.x = m_rcContent.left; - - if (m_ptScroll.x > m_rcContent.right) - m_ptScroll.x = m_rcContent.right; - - if (m_ptScroll.y > m_rcContent.top) - m_ptScroll.y = m_rcContent.top; - - if (m_ptScroll.y < m_rcContent.bottom) - m_ptScroll.y = m_rcContent.bottom; -} - -CFX_FloatPoint CPWL_ListCtrl::GetScrollPos() const { - return m_ptScroll; -} - -CFX_FloatRect CPWL_ListCtrl::GetScrollArea() const { - return m_rcContent; -} - -void CPWL_ListCtrl::ResetFace() { - ResetAll(FALSE, 0); -} - -void CPWL_ListCtrl::ResetContent(int32_t nStart) { - if (nStart < 0) - nStart = 0; - if (nStart >= 0 && nStart < m_aChildren.GetSize()) - ResetAll(TRUE, nStart); -} - -FX_FLOAT CPWL_ListCtrl::GetContentsHeight(FX_FLOAT fLimitWidth) { - FX_FLOAT fRet = m_fTopSpace; - - FX_FLOAT fBorderWidth = (FX_FLOAT)GetBorderWidth(); - - if (fLimitWidth > fBorderWidth * 2) { - for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) { - if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) { - FX_FLOAT fLeft = pChild->GetItemLeftMargin(); - FX_FLOAT fRight = pChild->GetItemRightMargin(); - - fRet += pChild->GetItemHeight(fLimitWidth - fBorderWidth * 2 - fLeft - - fRight); - fRet += m_fItemSpace; - } - } - - fRet -= m_fItemSpace; - } - - fRet += m_fBottomSpace; - - return fRet; -} - -void CPWL_ListCtrl::ResetAll(FX_BOOL bMove, int32_t nStart) { - CFX_FloatRect rcClient = GetClientRect(); - - FX_FLOAT fWidth = rcClient.Width(); - - FX_FLOAT fy = 0.0f - m_fTopSpace; - - if (nStart - 1 >= 0 && nStart - 1 < m_aChildren.GetSize()) - if (CPWL_Wnd* pChild = m_aChildren.GetAt(nStart - 1)) - fy = pChild->GetWindowRect().bottom - m_fItemSpace; - - for (int32_t i = nStart, sz = m_aChildren.GetSize(); i < sz; i++) { - if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) { - FX_FLOAT fLeft = pChild->GetItemLeftMargin(); - FX_FLOAT fRight = pChild->GetItemRightMargin(); - - pChild->SetChildMatrix(CFX_Matrix(1, 0, 0, 1, - rcClient.left - m_ptScroll.x, - rcClient.top - m_ptScroll.y)); - - if (bMove) { - FX_FLOAT fItemHeight = pChild->GetItemHeight(fWidth - fLeft - fRight); - pChild->Move( - CFX_FloatRect(fLeft, fy - fItemHeight, fWidth - fRight, fy), TRUE, - FALSE); - fy -= fItemHeight; - fy -= m_fItemSpace; - } - } - } - - fy += m_fItemSpace; - - fy -= m_fBottomSpace; - - if (bMove) { - m_rcContent.left = 0; - m_rcContent.top = 0; - m_rcContent.right = fWidth; - m_rcContent.bottom = fy; - } -} - -void CPWL_ListCtrl::SetItemSpace(FX_FLOAT fSpace) { - m_fItemSpace = fSpace; -} - -void CPWL_ListCtrl::SetTopSpace(FX_FLOAT fSpace) { - m_fTopSpace = fSpace; -} - -void CPWL_ListCtrl::SetBottomSpace(FX_FLOAT fSpace) { - m_fBottomSpace = fSpace; -} - -void CPWL_ListCtrl::RePosChildWnd() { - ResetFace(); -} - -void CPWL_ListCtrl::DrawChildAppearance(CFX_RenderDevice* pDevice, - CFX_Matrix* pUser2Device) { - pDevice->SaveState(); - CFX_FloatRect rcClient = GetClientRect(); - CFX_FloatRect rcTemp = rcClient; - pUser2Device->TransformRect(rcTemp); - pDevice->SetClip_Rect(FX_RECT((int32_t)rcTemp.left, (int32_t)rcTemp.bottom, - (int32_t)rcTemp.right, (int32_t)rcTemp.top)); - - for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) { - if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) { - CFX_FloatRect rcChild = pChild->ChildToParent(pChild->GetWindowRect()); - if (!(rcChild.top < rcClient.bottom || rcChild.bottom > rcClient.top)) { - CFX_Matrix mt = pChild->GetChildMatrix(); - if (mt.IsIdentity()) { - pChild->DrawAppearance(pDevice, pUser2Device); - } else { - mt.Concat(*pUser2Device); - pChild->DrawAppearance(pDevice, &mt); - } - } - } - } - - pDevice->RestoreState(); -} - -int32_t CPWL_ListCtrl::GetItemIndex(CPWL_Wnd* pItem) { - for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) { - if (pItem == m_aChildren.GetAt(i)) - return i; - } - - return -1; -} - -CFX_FloatPoint CPWL_ListCtrl::InToOut(const CFX_FloatPoint& point) const { - CFX_FloatRect rcClient = GetClientRect(); - - return CFX_FloatPoint(point.x + rcClient.left - m_ptScroll.x, - point.y + rcClient.top - m_ptScroll.y); -} - -CFX_FloatPoint CPWL_ListCtrl::OutToIn(const CFX_FloatPoint& point) const { - CFX_FloatRect rcClient = GetClientRect(); - - return CFX_FloatPoint(point.x - rcClient.left + m_ptScroll.x, - point.y - rcClient.top + m_ptScroll.y); -} - -CFX_FloatRect CPWL_ListCtrl::InToOut(const CFX_FloatRect& rect) const { - CFX_FloatRect rcClient = GetClientRect(); - - return CFX_FloatRect(rect.left + rcClient.left - m_ptScroll.x, - rect.bottom + rcClient.top - m_ptScroll.y, - rect.right + rcClient.left - m_ptScroll.x, - rect.top + rcClient.top - m_ptScroll.y); -} - -CFX_FloatRect CPWL_ListCtrl::OutToIn(const CFX_FloatRect& rect) const { - CFX_FloatRect rcClient = GetClientRect(); - - return CFX_FloatRect(rect.left - rcClient.left + m_ptScroll.x, - rect.bottom - rcClient.top + m_ptScroll.y, - rect.right - rcClient.left + m_ptScroll.x, - rect.top - rcClient.top + m_ptScroll.y); -} diff --git a/fpdfsdk/src/pdfwindow/PWL_Note.cpp b/fpdfsdk/src/pdfwindow/PWL_Note.cpp deleted file mode 100644 index 7ba6f6ad66..0000000000 --- a/fpdfsdk/src/pdfwindow/PWL_Note.cpp +++ /dev/null @@ -1,1512 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "fpdfsdk/include/pdfwindow/PWL_Note.h" - -#include "fpdfsdk/include/pdfwindow/PWL_Button.h" -#include "fpdfsdk/include/pdfwindow/PWL_Caret.h" -#include "fpdfsdk/include/pdfwindow/PWL_Edit.h" -#include "fpdfsdk/include/pdfwindow/PWL_EditCtrl.h" -#include "fpdfsdk/include/pdfwindow/PWL_Label.h" -#include "fpdfsdk/include/pdfwindow/PWL_ListCtrl.h" -#include "fpdfsdk/include/pdfwindow/PWL_ScrollBar.h" -#include "fpdfsdk/include/pdfwindow/PWL_Utils.h" -#include "fpdfsdk/include/pdfwindow/PWL_Wnd.h" - -#define POPUP_ITEM_HEAD_BOTTOM 3.0f -#define POPUP_ITEM_BOTTOMWIDTH 1.0f -#define POPUP_ITEM_SIDEMARGIN 3.0f -#define POPUP_ITEM_SPACE 4.0f -#define POPUP_ITEM_TEXT_INDENT 2.0f -#define POPUP_ITEM_BORDERCOLOR \ - CPWL_Color(COLORTYPE_RGB, 80 / 255.0f, 80 / 255.0f, 80 / 255.0f) - -#define IsFloatZero(f) ((f) < 0.0001 && (f) > -0.0001) -#define IsFloatBigger(fa, fb) ((fa) > (fb) && !IsFloatZero((fa) - (fb))) -#define IsFloatSmaller(fa, fb) ((fa) < (fb) && !IsFloatZero((fa) - (fb))) -#define IsFloatEqual(fa, fb) IsFloatZero((fa) - (fb)) - -CPWL_Note_Options::CPWL_Note_Options() : m_pText(NULL) {} - -CPWL_Note_Options::~CPWL_Note_Options() {} - -void CPWL_Note_Options::SetTextColor(const CPWL_Color& color) { - CPWL_Wnd::SetTextColor(color); - - if (m_pText) - m_pText->SetTextColor(color); -} - -void CPWL_Note_Options::RePosChildWnd() { - if (IsValid()) { - CFX_FloatRect rcClient = GetClientRect(); - - if (rcClient.Width() > 15.0f) { - rcClient.right -= 15.0f; - m_pText->Move(rcClient, TRUE, FALSE); - m_pText->SetVisible(TRUE); - } else { - m_pText->Move(CFX_FloatRect(0, 0, 0, 0), TRUE, FALSE); - m_pText->SetVisible(FALSE); - } - } -} - -void CPWL_Note_Options::CreateChildWnd(const PWL_CREATEPARAM& cp) { - m_pText = new CPWL_Label; - PWL_CREATEPARAM tcp = cp; - tcp.pParentWnd = this; - tcp.dwFlags = PWS_CHILD | PWS_VISIBLE; - m_pText->Create(tcp); -} - -void CPWL_Note_Options::SetText(const CFX_WideString& sText) { - m_pText->SetText(sText.c_str()); -} - -void CPWL_Note_Options::DrawThisAppearance(CFX_RenderDevice* pDevice, - CFX_Matrix* pUser2Device) { - CPWL_Wnd::DrawThisAppearance(pDevice, pUser2Device); - - CFX_FloatRect rcClient = GetClientRect(); - rcClient.left = rcClient.right - 15.0f; - - CFX_FloatPoint ptCenter = - CFX_FloatPoint((rcClient.left + rcClient.right) * 0.5f, - (rcClient.top + rcClient.bottom) * 0.5f); - - CFX_FloatPoint pt1(ptCenter.x - 2.0f, ptCenter.y + 2.0f * 0.5f); - CFX_FloatPoint pt2(ptCenter.x + 2.0f, ptCenter.y + 2.0f * 0.5f); - CFX_FloatPoint pt3(ptCenter.x, ptCenter.y - 3.0f * 0.5f); - - CFX_PathData path; - - path.SetPointCount(4); - path.SetPoint(0, pt1.x, pt1.y, FXPT_MOVETO); - path.SetPoint(1, pt2.x, pt2.y, FXPT_LINETO); - path.SetPoint(2, pt3.x, pt3.y, FXPT_LINETO); - path.SetPoint(3, pt1.x, pt1.y, FXPT_LINETO); - - pDevice->DrawPath( - &path, pUser2Device, NULL, - CPWL_Utils::PWLColorToFXColor(GetTextColor(), GetTransparency()), 0, - FXFILL_ALTERNATE); -} - -CFX_FloatRect CPWL_Note_Options::GetContentRect() const { - CFX_FloatRect rcText = m_pText->GetContentRect(); - rcText.right += 15.0f; - return rcText; -} - -CPWL_Note_Edit::CPWL_Note_Edit() - : m_bEnableNotify(TRUE), - m_fOldItemHeight(0.0f), - m_bSizeChanged(FALSE), - m_fOldMin(0.0f), - m_fOldMax(0.0f) {} - -CPWL_Note_Edit::~CPWL_Note_Edit() {} - -void CPWL_Note_Edit::RePosChildWnd() { - m_bEnableNotify = FALSE; - CPWL_Edit::RePosChildWnd(); - m_bEnableNotify = TRUE; - - m_fOldItemHeight = GetContentRect().Height(); -} - -void CPWL_Note_Edit::SetText(const FX_WCHAR* csText) { - m_bEnableNotify = FALSE; - CPWL_Edit::SetText(csText); - m_bEnableNotify = TRUE; - m_fOldItemHeight = GetContentRect().Height(); -} - -void CPWL_Note_Edit::OnSetFocus() { - m_bEnableNotify = FALSE; - CPWL_Edit::OnSetFocus(); - m_bEnableNotify = TRUE; - - EnableSpellCheck(TRUE); -} - -void CPWL_Note_Edit::OnKillFocus() { - EnableSpellCheck(FALSE); - - if (CPWL_Wnd* pParent = GetParentWindow()) { - if (CPWL_Wnd* pGrand = pParent->GetParentWindow()) { - ASSERT(pGrand->GetClassName() == "CPWL_NoteItem"); - - CPWL_NoteItem* pNoteItem = (CPWL_NoteItem*)pGrand; - - pNoteItem->OnContentsValidate(); - } - } - - CPWL_Edit::OnKillFocus(); -} - -void CPWL_Note_Edit::OnNotify(CPWL_Wnd* pWnd, - FX_DWORD msg, - intptr_t wParam, - intptr_t lParam) { - if (m_bEnableNotify) { - if (wParam == SBT_VSCROLL) { - switch (msg) { - case PNM_SETSCROLLINFO: - if (PWL_SCROLL_INFO* pInfo = (PWL_SCROLL_INFO*)lParam) { - if (!IsFloatEqual(pInfo->fContentMax, m_fOldMax) || - !IsFloatEqual(pInfo->fContentMin, m_fOldMin)) { - m_bSizeChanged = TRUE; - if (CPWL_Wnd* pParent = GetParentWindow()) { - pParent->OnNotify(this, PNM_NOTEEDITCHANGED, 0, 0); - } - - m_fOldMax = pInfo->fContentMax; - m_fOldMin = pInfo->fContentMin; - return; - } - } - } - } - } - - CPWL_Edit::OnNotify(pWnd, msg, wParam, lParam); - - if (m_bEnableNotify) { - switch (msg) { - case PNM_SETCARETINFO: - if (PWL_CARET_INFO* pInfo = (PWL_CARET_INFO*)wParam) { - PWL_CARET_INFO newInfo = *pInfo; - newInfo.bVisible = TRUE; - newInfo.ptHead = ChildToParent(pInfo->ptHead); - newInfo.ptFoot = ChildToParent(pInfo->ptFoot); - - if (CPWL_Wnd* pParent = GetParentWindow()) { - pParent->OnNotify(this, PNM_SETCARETINFO, (intptr_t)&newInfo, 0); - } - } - break; - } - } -} - -FX_FLOAT CPWL_Note_Edit::GetItemHeight(FX_FLOAT fLimitWidth) { - if (fLimitWidth > 0) { - if (!m_bSizeChanged) - return m_fOldItemHeight; - - m_bSizeChanged = FALSE; - - EnableNotify(FALSE); - EnableRefresh(FALSE); - m_pEdit->EnableNotify(FALSE); - - Move(CFX_FloatRect(0, 0, fLimitWidth, 0), TRUE, FALSE); - FX_FLOAT fRet = GetContentRect().Height(); - - m_pEdit->EnableNotify(TRUE); - EnableNotify(TRUE); - EnableRefresh(TRUE); - - return fRet; - } - - return 0; -} - -FX_FLOAT CPWL_Note_Edit::GetItemLeftMargin() { - return POPUP_ITEM_TEXT_INDENT; -} - -FX_FLOAT CPWL_Note_Edit::GetItemRightMargin() { - return POPUP_ITEM_TEXT_INDENT; -} - -CPWL_Note_LBBox::CPWL_Note_LBBox() {} - -CPWL_Note_LBBox::~CPWL_Note_LBBox() {} - -void CPWL_Note_LBBox::DrawThisAppearance(CFX_RenderDevice* pDevice, - CFX_Matrix* pUser2Device) { - CFX_FloatRect rcClient = GetClientRect(); - - CFX_GraphStateData gsd; - gsd.m_LineWidth = 1.0f; - - CFX_PathData pathCross; - - pathCross.SetPointCount(4); - pathCross.SetPoint(0, rcClient.left, rcClient.top, FXPT_MOVETO); - pathCross.SetPoint(1, rcClient.right, rcClient.bottom, FXPT_LINETO); - pathCross.SetPoint(2, rcClient.left, - rcClient.bottom + rcClient.Height() * 0.5f, FXPT_MOVETO); - pathCross.SetPoint(3, rcClient.left + rcClient.Width() * 0.5f, - rcClient.bottom, FXPT_LINETO); - - pDevice->DrawPath( - &pathCross, pUser2Device, &gsd, 0, - CPWL_Utils::PWLColorToFXColor(GetTextColor(), GetTransparency()), - FXFILL_ALTERNATE); -} - -CPWL_Note_RBBox::CPWL_Note_RBBox() {} - -CPWL_Note_RBBox::~CPWL_Note_RBBox() {} - -void CPWL_Note_RBBox::DrawThisAppearance(CFX_RenderDevice* pDevice, - CFX_Matrix* pUser2Device) { - CFX_FloatRect rcClient = GetClientRect(); - - CFX_GraphStateData gsd; - gsd.m_LineWidth = 1.0f; - - CFX_PathData pathCross; - - pathCross.SetPointCount(4); - pathCross.SetPoint(0, rcClient.right, rcClient.top, FXPT_MOVETO); - pathCross.SetPoint(1, rcClient.left, rcClient.bottom, FXPT_LINETO); - pathCross.SetPoint(2, rcClient.right, - rcClient.bottom + rcClient.Height() * 0.5f, FXPT_MOVETO); - pathCross.SetPoint(3, rcClient.left + rcClient.Width() * 0.5f, - rcClient.bottom, FXPT_LINETO); - - pDevice->DrawPath( - &pathCross, pUser2Device, &gsd, 0, - CPWL_Utils::PWLColorToFXColor(GetTextColor(), GetTransparency()), - FXFILL_ALTERNATE); -} - -CPWL_Note_Icon::CPWL_Note_Icon() : m_nType(0) {} - -CPWL_Note_Icon::~CPWL_Note_Icon() {} - -void CPWL_Note_Icon::SetIconType(int32_t nType) { - m_nType = nType; -} - -void CPWL_Note_Icon::DrawThisAppearance(CFX_RenderDevice* pDevice, - CFX_Matrix* pUser2Device) { - CPWL_Utils::DrawIconAppStream(pDevice, pUser2Device, m_nType, GetClientRect(), - GetBackgroundColor(), PWL_DEFAULT_BLACKCOLOR, - GetTransparency()); -} - -CPWL_Note_CloseBox::CPWL_Note_CloseBox() : m_bMouseDown(FALSE) {} - -CPWL_Note_CloseBox::~CPWL_Note_CloseBox() {} - -void CPWL_Note_CloseBox::DrawThisAppearance(CFX_RenderDevice* pDevice, - CFX_Matrix* pUser2Device) { - CPWL_Button::DrawThisAppearance(pDevice, pUser2Device); - - CFX_FloatRect rcClient = GetClientRect(); - rcClient = CPWL_Utils::DeflateRect(rcClient, 2.0f); - - CFX_GraphStateData gsd; - gsd.m_LineWidth = 1.0f; - - CFX_PathData pathCross; - - if (m_bMouseDown) { - rcClient.left += 0.5f; - rcClient.right += 0.5f; - rcClient.top -= 0.5f; - rcClient.bottom -= 0.5f; - } - - pathCross.SetPointCount(4); - pathCross.SetPoint(0, rcClient.left, rcClient.bottom, FXPT_MOVETO); - pathCross.SetPoint(1, rcClient.right, rcClient.top, FXPT_LINETO); - pathCross.SetPoint(2, rcClient.left, rcClient.top, FXPT_MOVETO); - pathCross.SetPoint(3, rcClient.right, rcClient.bottom, FXPT_LINETO); - - pDevice->DrawPath( - &pathCross, pUser2Device, &gsd, 0, - CPWL_Utils::PWLColorToFXColor(GetTextColor(), GetTransparency()), - FXFILL_ALTERNATE); -} - -FX_BOOL CPWL_Note_CloseBox::OnLButtonDown(const CFX_FloatPoint& point, - FX_DWORD nFlag) { - SetBorderStyle(PBS_INSET); - InvalidateRect(NULL); - - m_bMouseDown = TRUE; - - return CPWL_Button::OnLButtonDown(point, nFlag); -} - -FX_BOOL CPWL_Note_CloseBox::OnLButtonUp(const CFX_FloatPoint& point, - FX_DWORD nFlag) { - m_bMouseDown = FALSE; - - SetBorderStyle(PBS_BEVELED); - InvalidateRect(NULL); - - return CPWL_Button::OnLButtonUp(point, nFlag); -} - -CPWL_Note_Contents::CPWL_Note_Contents() : m_pEdit(NULL) {} - -CPWL_Note_Contents::~CPWL_Note_Contents() {} - -CFX_ByteString CPWL_Note_Contents::GetClassName() const { - return "CPWL_Note_Contents"; -} - -void CPWL_Note_Contents::CreateChildWnd(const PWL_CREATEPARAM& cp) { - m_pEdit = new CPWL_Note_Edit; - PWL_CREATEPARAM ecp = cp; - ecp.pParentWnd = this; - ecp.dwFlags = PWS_VISIBLE | PWS_CHILD | PES_MULTILINE | PES_AUTORETURN | - PES_TEXTOVERFLOW | PES_UNDO | PES_SPELLCHECK; - - m_pEdit->EnableNotify(FALSE); - m_pEdit->Create(ecp); - m_pEdit->EnableNotify(TRUE); -} - -void CPWL_Note_Contents::SetText(const CFX_WideString& sText) { - if (m_pEdit) { - m_pEdit->EnableNotify(FALSE); - m_pEdit->SetText(sText.c_str()); - m_pEdit->EnableNotify(TRUE); - OnNotify(m_pEdit, PNM_NOTEEDITCHANGED, 0, 0); - } -} - -CFX_WideString CPWL_Note_Contents::GetText() const { - if (m_pEdit) - return m_pEdit->GetText(); - - return L""; -} - -CPWL_NoteItem* CPWL_Note_Contents::CreateSubItem() { - CPWL_NoteItem* pNoteItem = new CPWL_NoteItem; - PWL_CREATEPARAM icp = GetCreationParam(); - icp.pParentWnd = this; - icp.dwFlags = PWS_CHILD | PWS_VISIBLE | PWS_BACKGROUND; - pNoteItem->Create(icp); - - pNoteItem->OnCreateNoteItem(); - - pNoteItem->ResetSubjectName(m_aChildren.GetSize() - 1); - - FX_SYSTEMTIME st; - if (IFX_SystemHandler* pSH = GetSystemHandler()) - st = pSH->GetLocalTime(); - pNoteItem->SetDateTime(st); - - pNoteItem->SetContents(L""); - - OnNotify(pNoteItem, PNM_NOTEEDITCHANGED, 0, 0); - - return pNoteItem; -} - -int32_t CPWL_Note_Contents::CountSubItems() const { - return m_aChildren.GetSize() - 1; -} - -IPWL_NoteItem* CPWL_Note_Contents::GetSubItems(int32_t index) const { - int32_t nIndex = index + 1; - - if (nIndex > 0 && nIndex < m_aChildren.GetSize()) { - if (CPWL_Wnd* pChild = m_aChildren.GetAt(nIndex)) { - ASSERT(pChild->GetClassName() == "CPWL_NoteItem"); - CPWL_NoteItem* pItem = (CPWL_NoteItem*)pChild; - return pItem; - } - } - return NULL; -} - -void CPWL_Note_Contents::DeleteSubItem(IPWL_NoteItem* pNoteItem) { - int32_t nIndex = GetItemIndex((CPWL_NoteItem*)pNoteItem); - - if (nIndex > 0) { - if (CPWL_NoteItem* pPWLNoteItem = (CPWL_NoteItem*)pNoteItem) { - pPWLNoteItem->KillFocus(); - pPWLNoteItem->Destroy(); - delete pPWLNoteItem; - } - - for (int32_t i = nIndex, sz = m_aChildren.GetSize(); i < sz; i++) { - if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) { - ASSERT(pChild->GetClassName() == "CPWL_NoteItem"); - CPWL_NoteItem* pItem = (CPWL_NoteItem*)pChild; - pItem->ResetSubjectName(i); - } - } - - OnNotify(this, PNM_NOTEEDITCHANGED, 0, 0); - } -} - -IPWL_NoteItem* CPWL_Note_Contents::GetHitNoteItem(const CFX_FloatPoint& point) { - CFX_FloatPoint pt = ParentToChild(point); - - for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) { - if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) { - if (pChild->GetClassName() == "CPWL_NoteItem") { - CPWL_NoteItem* pNoteItem = (CPWL_NoteItem*)pChild; - if (IPWL_NoteItem* pRet = pNoteItem->GetHitNoteItem(pt)) - return pRet; - } - } - } - return NULL; -} - -void CPWL_Note_Contents::OnNotify(CPWL_Wnd* pWnd, - FX_DWORD msg, - intptr_t wParam, - intptr_t lParam) { - switch (msg) { - case PNM_NOTEEDITCHANGED: { - int32_t nIndex = GetItemIndex(pWnd); - if (nIndex < 0) - nIndex = 0; - - m_pEdit->EnableNotify(FALSE); - ResetContent(nIndex); - m_pEdit->EnableNotify(TRUE); - - for (int32_t i = nIndex + 1, sz = m_aChildren.GetSize(); i < sz; i++) { - if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) - pChild->OnNotify(this, PNM_NOTERESET, 0, 0); - } - - if (CPWL_Wnd* pParent = GetParentWindow()) { - pParent->OnNotify(this, PNM_NOTEEDITCHANGED, 0, 0); - } - } - return; - case PNM_SCROLLWINDOW: - SetScrollPos(CFX_FloatPoint(0.0f, *(FX_FLOAT*)lParam)); - ResetFace(); - InvalidateRect(NULL); - return; - case PNM_SETCARETINFO: - if (PWL_CARET_INFO* pInfo = (PWL_CARET_INFO*)wParam) { - PWL_CARET_INFO newInfo = *pInfo; - newInfo.bVisible = TRUE; - newInfo.ptHead = ChildToParent(pInfo->ptHead); - newInfo.ptFoot = ChildToParent(pInfo->ptFoot); - - if (CPWL_Wnd* pParent = GetParentWindow()) { - pParent->OnNotify(this, PNM_SETCARETINFO, (intptr_t)&newInfo, 0); - } - } - return; - case PNM_NOTERESET: { - m_pEdit->EnableNotify(FALSE); - ResetContent(0); - m_pEdit->EnableNotify(TRUE); - - for (int32_t i = 1, sz = m_aChildren.GetSize(); i < sz; i++) { - if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) - pChild->OnNotify(this, PNM_NOTERESET, 0, 0); - } - - m_pEdit->EnableNotify(FALSE); - ResetContent(0); - m_pEdit->EnableNotify(TRUE); - } - return; - } - - CPWL_Wnd::OnNotify(pWnd, msg, wParam, lParam); -} - -FX_BOOL CPWL_Note_Contents::OnLButtonDown(const CFX_FloatPoint& point, - FX_DWORD nFlag) { - if (CPWL_Wnd::OnLButtonDown(point, nFlag)) - return TRUE; - - if (!m_pEdit->IsFocused()) { - m_pEdit->SetFocus(); - } - - return TRUE; -} - -void CPWL_Note_Contents::SetEditFocus(FX_BOOL bLast) { - if (!m_pEdit->IsFocused()) { - m_pEdit->SetFocus(); - m_pEdit->SetCaret(bLast ? m_pEdit->GetTotalWords() : 0); - } -} - -CPWL_Edit* CPWL_Note_Contents::GetEdit() const { - return m_pEdit; -} - -void CPWL_Note_Contents::EnableModify(FX_BOOL bEnabled) { - if (!bEnabled) - m_pEdit->AddFlag(PWS_READONLY); - else - m_pEdit->RemoveFlag(PWS_READONLY); - - for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) { - if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) { - if (pChild->GetClassName() == "CPWL_NoteItem") { - CPWL_NoteItem* pNoteItem = (CPWL_NoteItem*)pChild; - pNoteItem->EnableModify(bEnabled); - } - } - } -} - -void CPWL_Note_Contents::EnableRead(FX_BOOL bEnabled) { - if (!bEnabled) - m_pEdit->AddFlag(PES_NOREAD); - else - m_pEdit->RemoveFlag(PES_NOREAD); - - for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) { - if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) { - if (pChild->GetClassName() == "CPWL_NoteItem") { - CPWL_NoteItem* pNoteItem = (CPWL_NoteItem*)pChild; - pNoteItem->EnableRead(bEnabled); - } - } - } -} - -CPWL_NoteItem::CPWL_NoteItem() - : m_pSubject(NULL), - m_pDateTime(NULL), - m_pContents(NULL), - m_pPrivateData(NULL), - m_sAuthor(L""), - m_fOldItemHeight(0.0f), - m_bSizeChanged(FALSE), - m_bAllowModify(TRUE) {} - -CPWL_NoteItem::~CPWL_NoteItem() {} - -CFX_ByteString CPWL_NoteItem::GetClassName() const { - return "CPWL_NoteItem"; -} - -void CPWL_NoteItem::CreateChildWnd(const PWL_CREATEPARAM& cp) { - CPWL_Color sTextColor; - - if (CPWL_Utils::IsBlackOrWhite(GetBackgroundColor())) - sTextColor = PWL_DEFAULT_WHITECOLOR; - else - sTextColor = PWL_DEFAULT_BLACKCOLOR; - - m_pSubject = new CPWL_Label; - PWL_CREATEPARAM scp = cp; - scp.pParentWnd = this; - scp.dwFlags = PWS_VISIBLE | PWS_CHILD | PES_LEFT | PES_TOP; - scp.sTextColor = sTextColor; - m_pSubject->Create(scp); - - m_pDateTime = new CPWL_Label; - PWL_CREATEPARAM dcp = cp; - dcp.pParentWnd = this; - dcp.dwFlags = PWS_VISIBLE | PWS_CHILD | PES_RIGHT | PES_TOP; - dcp.sTextColor = sTextColor; - m_pDateTime->Create(dcp); - - m_pContents = new CPWL_Note_Contents; - PWL_CREATEPARAM ccp = cp; - ccp.pParentWnd = this; - ccp.sBackgroundColor = - CPWL_Color(COLORTYPE_RGB, 240 / 255.0f, 240 / 255.0f, 240 / 255.0f); - ccp.dwFlags = PWS_VISIBLE | PWS_CHILD | PWS_BACKGROUND; - m_pContents->Create(ccp); - m_pContents->SetItemSpace(POPUP_ITEM_SPACE); - m_pContents->SetTopSpace(POPUP_ITEM_SPACE); - m_pContents->SetBottomSpace(POPUP_ITEM_SPACE); -} - -void CPWL_NoteItem::RePosChildWnd() { - if (IsValid()) { - CFX_FloatRect rcClient = GetClientRect(); - - CFX_FloatRect rcSubject = rcClient; - rcSubject.left += POPUP_ITEM_TEXT_INDENT; - rcSubject.top = rcClient.top; - rcSubject.right = - PWL_MIN(rcSubject.left + m_pSubject->GetContentRect().Width() + 1.0f, - rcClient.right); - rcSubject.bottom = rcSubject.top - m_pSubject->GetContentRect().Height(); - rcSubject.Normalize(); - m_pSubject->Move(rcSubject, TRUE, FALSE); - m_pSubject->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcSubject)); - - CFX_FloatRect rcDate = rcClient; - rcDate.right -= POPUP_ITEM_TEXT_INDENT; - rcDate.left = - PWL_MAX(rcDate.right - m_pDateTime->GetContentRect().Width() - 1.0f, - rcSubject.right); - rcDate.bottom = rcDate.top - m_pDateTime->GetContentRect().Height(); - rcDate.Normalize(); - m_pDateTime->Move(rcDate, TRUE, FALSE); - m_pDateTime->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcDate)); - - CFX_FloatRect rcContents = rcClient; - rcContents.left += 1.0f; - rcContents.right -= 1.0f; - rcContents.top = rcDate.bottom - POPUP_ITEM_HEAD_BOTTOM; - rcContents.bottom += POPUP_ITEM_BOTTOMWIDTH; - rcContents.Normalize(); - m_pContents->Move(rcContents, TRUE, FALSE); - m_pContents->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcContents)); - } - - SetClipRect(CPWL_Utils::InflateRect(GetWindowRect(), 1.0f)); -} - -void CPWL_NoteItem::SetPrivateData(void* pData) { - m_pPrivateData = pData; -} - -void CPWL_NoteItem::SetBkColor(const CPWL_Color& color) { - CPWL_Color sBK = color; - SetBackgroundColor(sBK); - - CPWL_Color sTextColor; - - if (CPWL_Utils::IsBlackOrWhite(sBK)) - sTextColor = PWL_DEFAULT_WHITECOLOR; - else - sTextColor = PWL_DEFAULT_BLACKCOLOR; - - SetTextColor(sTextColor); - if (m_pSubject) - m_pSubject->SetTextColor(sTextColor); - if (m_pDateTime) - m_pDateTime->SetTextColor(sTextColor); - - InvalidateRect(nullptr); - - if (IPWL_NoteNotify* pNotify = GetNoteNotify()) { - pNotify->OnSetBkColor(this); - } -} - -void CPWL_NoteItem::SetSubjectName(const CFX_WideString& sName) { - if (m_pSubject) { - m_pSubject->SetText(sName.c_str()); - } - - if (IPWL_NoteNotify* pNotify = GetNoteNotify()) { - pNotify->OnSetSubjectName(this); - } -} - -void CPWL_NoteItem::SetAuthorName(const CFX_WideString& sName) { - m_sAuthor = sName; - ResetSubjectName(-1); - - if (IPWL_NoteNotify* pNotify = GetNoteNotify()) { - pNotify->OnSetAuthorName(this); - } -} - -void CPWL_NoteItem::ResetSubjectName(int32_t nItemIndex) { - if (nItemIndex < 0) { - if (CPWL_Wnd* pParent = GetParentWindow()) { - ASSERT(pParent->GetClassName() == "CPWL_Note_Contents"); - - CPWL_Note_Contents* pContents = (CPWL_Note_Contents*)pParent; - nItemIndex = pContents->GetItemIndex(this); - } - } - - const CPWL_Note* pNote = GetNote(); - CFX_WideString sSubject; - sSubject.Format(pNote->GetReplyString().c_str(), nItemIndex); - - if (!m_sAuthor.IsEmpty()) { - sSubject += L" - "; - sSubject += m_sAuthor; - } - SetSubjectName(sSubject); - RePosChildWnd(); -} - -void CPWL_NoteItem::SetDateTime(FX_SYSTEMTIME time) { - m_dtNote = time; - - CFX_WideString swTime; - swTime.Format(L"%04d-%02d-%02d %02d:%02d:%02d", time.wYear, time.wMonth, - time.wDay, time.wHour, time.wMinute, time.wSecond); - if (m_pDateTime) { - m_pDateTime->SetText(swTime.c_str()); - } - - RePosChildWnd(); - - if (IPWL_NoteNotify* pNotify = GetNoteNotify()) { - pNotify->OnSetDateTime(this); - } -} - -void CPWL_NoteItem::SetContents(const CFX_WideString& sContents) { - if (m_pContents) { - m_pContents->SetText(sContents); - } - - if (IPWL_NoteNotify* pNotify = GetNoteNotify()) { - pNotify->OnSetContents(this); - } -} - -CPWL_NoteItem* CPWL_NoteItem::GetParentNoteItem() const { - if (CPWL_Wnd* pParent = GetParentWindow()) { - if (CPWL_Wnd* pGrand = pParent->GetParentWindow()) { - ASSERT(pGrand->GetClassName() == "CPWL_NoteItem"); - return (CPWL_NoteItem*)pGrand; - } - } - - return NULL; -} - -IPWL_NoteItem* CPWL_NoteItem::GetParentItem() const { - return GetParentNoteItem(); -} - -CPWL_Edit* CPWL_NoteItem::GetEdit() const { - if (m_pContents) - return m_pContents->GetEdit(); - return NULL; -} - -void* CPWL_NoteItem::GetPrivateData() const { - return m_pPrivateData; -} - -CFX_WideString CPWL_NoteItem::GetAuthorName() const { - return m_sAuthor; -} - -CPWL_Color CPWL_NoteItem::GetBkColor() const { - return GetBackgroundColor(); -} - -CFX_WideString CPWL_NoteItem::GetContents() const { - if (m_pContents) - return m_pContents->GetText(); - - return L""; -} - -FX_SYSTEMTIME CPWL_NoteItem::GetDateTime() const { - return m_dtNote; -} - -CFX_WideString CPWL_NoteItem::GetSubjectName() const { - if (m_pSubject) - return m_pSubject->GetText(); - - return L""; -} - -CPWL_NoteItem* CPWL_NoteItem::CreateNoteItem() { - if (m_pContents) - return m_pContents->CreateSubItem(); - - return NULL; -} - -IPWL_NoteItem* CPWL_NoteItem::CreateSubItem() { - return CreateNoteItem(); -} - -int32_t CPWL_NoteItem::CountSubItems() const { - if (m_pContents) - return m_pContents->CountSubItems(); - - return 0; -} - -IPWL_NoteItem* CPWL_NoteItem::GetSubItems(int32_t index) const { - if (m_pContents) - return m_pContents->GetSubItems(index); - - return NULL; -} - -void CPWL_NoteItem::DeleteSubItem(IPWL_NoteItem* pNoteItem) { - KillFocus(); - - if (IPWL_NoteNotify* pNotify = GetNoteNotify()) { - pNotify->OnItemDelete(pNoteItem); - } - - if (m_pContents) - m_pContents->DeleteSubItem(pNoteItem); -} - -IPWL_NoteItem* CPWL_NoteItem::GetHitNoteItem(const CFX_FloatPoint& point) { - CFX_FloatPoint pt = ParentToChild(point); - - if (WndHitTest(pt)) { - if (m_pContents) { - if (IPWL_NoteItem* pNoteItem = m_pContents->GetHitNoteItem(pt)) - return pNoteItem; - } - - return this; - } - - return NULL; -} - -IPWL_NoteItem* CPWL_NoteItem::GetFocusedNoteItem() const { - if (const CPWL_Wnd* pWnd = GetFocused()) { - if (pWnd->GetClassName() == "CPWL_Edit") { - if (CPWL_Wnd* pParent = pWnd->GetParentWindow()) { - ASSERT(pParent->GetClassName() == "CPWL_Note_Contents"); - - if (CPWL_Wnd* pGrand = pParent->GetParentWindow()) { - ASSERT(pGrand->GetClassName() == "CPWL_NoteItem"); - return (CPWL_NoteItem*)pGrand; - } - } - } - } - - return NULL; -} - -FX_FLOAT CPWL_NoteItem::GetItemHeight(FX_FLOAT fLimitWidth) { - if (fLimitWidth > 0) { - if (!m_bSizeChanged) - return m_fOldItemHeight; - - m_bSizeChanged = FALSE; - - FX_FLOAT fRet = m_pDateTime->GetContentRect().Height(); - FX_FLOAT fBorderWidth = (FX_FLOAT)GetBorderWidth(); - if (fLimitWidth > fBorderWidth * 2) - fRet += m_pContents->GetContentsHeight(fLimitWidth - fBorderWidth * 2); - fRet += POPUP_ITEM_HEAD_BOTTOM + POPUP_ITEM_BOTTOMWIDTH + fBorderWidth * 2; - - return m_fOldItemHeight = fRet; - } - - return 0; -} - -FX_FLOAT CPWL_NoteItem::GetItemLeftMargin() { - return POPUP_ITEM_SIDEMARGIN; -} - -FX_FLOAT CPWL_NoteItem::GetItemRightMargin() { - return POPUP_ITEM_SIDEMARGIN; -} - -FX_BOOL CPWL_NoteItem::OnLButtonDown(const CFX_FloatPoint& point, - FX_DWORD nFlag) { - if (!m_pContents->WndHitTest(m_pContents->ParentToChild(point))) { - SetNoteFocus(FALSE); - } - - CPWL_Wnd::OnLButtonDown(point, nFlag); - - return TRUE; -} - -FX_BOOL CPWL_NoteItem::OnRButtonUp(const CFX_FloatPoint& point, - FX_DWORD nFlag) { - if (!m_pContents->WndHitTest(m_pContents->ParentToChild(point))) { - SetNoteFocus(FALSE); - PopupNoteItemMenu(point); - - return TRUE; - } - - return CPWL_Wnd::OnRButtonUp(point, nFlag); -} - -void CPWL_NoteItem::OnNotify(CPWL_Wnd* pWnd, - FX_DWORD msg, - intptr_t wParam, - intptr_t lParam) { - switch (msg) { - case PNM_NOTEEDITCHANGED: - m_bSizeChanged = TRUE; - - if (CPWL_Wnd* pParent = GetParentWindow()) { - pParent->OnNotify(this, PNM_NOTEEDITCHANGED, 0, 0); - } - return; - case PNM_SETCARETINFO: - if (PWL_CARET_INFO* pInfo = (PWL_CARET_INFO*)wParam) { - PWL_CARET_INFO newInfo = *pInfo; - newInfo.bVisible = TRUE; - newInfo.ptHead = ChildToParent(pInfo->ptHead); - newInfo.ptFoot = ChildToParent(pInfo->ptFoot); - - if (CPWL_Wnd* pParent = GetParentWindow()) { - pParent->OnNotify(this, PNM_SETCARETINFO, (intptr_t)&newInfo, 0); - } - } - return; - case PNM_NOTERESET: - m_bSizeChanged = TRUE; - m_pContents->OnNotify(this, PNM_NOTERESET, 0, 0); - - return; - } - - CPWL_Wnd::OnNotify(pWnd, msg, wParam, lParam); -} - -void CPWL_NoteItem::PopupNoteItemMenu(const CFX_FloatPoint& point) { - if (IPWL_NoteNotify* pNotify = GetNoteNotify()) { - int32_t x, y; - PWLtoWnd(point, x, y); - if (IFX_SystemHandler* pSH = GetSystemHandler()) - pSH->ClientToScreen(GetAttachedHWnd(), x, y); - pNotify->OnPopupMenu(this, x, y); - } -} - -const CPWL_Note* CPWL_NoteItem::GetNote() const { - if (const CPWL_Wnd* pRoot = GetRootWnd()) { - ASSERT(pRoot->GetClassName() == "CPWL_NoteItem"); - CPWL_NoteItem* pNoteItem = (CPWL_NoteItem*)pRoot; - if (pNoteItem->IsTopItem()) { - return (CPWL_Note*)pNoteItem; - } - } - - return NULL; -} - -IPWL_NoteNotify* CPWL_NoteItem::GetNoteNotify() const { - if (const CPWL_Note* pNote = GetNote()) - return pNote->GetNoteNotify(); - - return NULL; -} - -void CPWL_NoteItem::OnCreateNoteItem() { - if (IPWL_NoteNotify* pNotify = GetNoteNotify()) { - pNotify->OnItemCreate(this); - } -} - -void CPWL_NoteItem::OnContentsValidate() { - if (IPWL_NoteNotify* pNotify = GetNoteNotify()) { - pNotify->OnSetContents(this); - } -} - -void CPWL_NoteItem::SetNoteFocus(FX_BOOL bLast) { - m_pContents->SetEditFocus(bLast); -} - -void CPWL_NoteItem::EnableModify(FX_BOOL bEnabled) { - m_pContents->EnableModify(bEnabled); - m_bAllowModify = bEnabled; -} - -void CPWL_NoteItem::EnableRead(FX_BOOL bEnabled) { - m_pContents->EnableRead(bEnabled); -} - -CPWL_Note::CPWL_Note(IPopup_Note* pPopupNote, - IPWL_NoteNotify* pNoteNotify, - IPWL_NoteHandler* pNoteHandler) - : m_pAuthor(NULL), - m_pIcon(NULL), - m_pCloseBox(NULL), - m_pLBBox(NULL), - m_pRBBox(NULL), - m_pContentsBar(NULL), - m_pOptions(NULL), - m_pNoteNotify(pNoteNotify), - m_bResizing(FALSE), - m_bEnableNotify(TRUE) {} - -CPWL_Note::~CPWL_Note() {} - -IPWL_NoteItem* CPWL_Note::Reply() { - return CreateNoteItem(); -} - -void CPWL_Note::EnableNotify(FX_BOOL bEnabled) { - m_bEnableNotify = bEnabled; -} - -void CPWL_Note::RePosChildWnd() { - RePosNoteChildren(); - m_pContents->OnNotify(this, PNM_NOTERESET, 0, 0); - ResetScrollBar(); - m_pContents->OnNotify(this, PNM_NOTERESET, 0, 0); - OnNotify(this, PNM_NOTEEDITCHANGED, 0, 0); - if (const CPWL_Wnd* pWnd = GetFocused()) { - if (pWnd->GetClassName() == "CPWL_Edit") { - CPWL_Edit* pEdit = (CPWL_Edit*)pWnd; - pEdit->SetCaret(pEdit->GetCaret()); - } - } -} - -FX_BOOL CPWL_Note::ResetScrollBar() { - FX_BOOL bScrollChanged = FALSE; - - if (ScrollBarShouldVisible()) { - if (!m_pContentsBar->IsVisible()) { - m_pContentsBar->SetVisible(TRUE); - if (m_pContentsBar->IsVisible()) { - m_pContentsBar->InvalidateRect(NULL); - bScrollChanged = TRUE; - } - } - } else { - if (m_pContentsBar->IsVisible()) { - m_pContentsBar->SetVisible(FALSE); - m_pContentsBar->InvalidateRect(NULL); - - bScrollChanged = TRUE; - } - } - - if (bScrollChanged) { - CFX_FloatRect rcNote = GetClientRect(); - CFX_FloatRect rcContents = m_pContents->GetWindowRect(); - rcContents.right = rcNote.right - 3.0f; - if (m_pContentsBar->IsVisible()) - rcContents.right -= PWL_SCROLLBAR_WIDTH; - m_pContents->Move(rcContents, TRUE, TRUE); - m_pContents->SetScrollPos(CFX_FloatPoint(0.0f, 0.0f)); - m_pContents->InvalidateRect(NULL); - } - - return bScrollChanged; -} - -FX_BOOL CPWL_Note::ScrollBarShouldVisible() { - CFX_FloatRect rcContentsFact = m_pContents->GetScrollArea(); - CFX_FloatRect rcContentsClient = m_pContents->GetClientRect(); - - return rcContentsFact.Height() > rcContentsClient.Height(); -} - -void CPWL_Note::SetOptionsText(const CFX_WideString& sText) { - if (m_pOptions) - m_pOptions->SetText(sText); - - RePosNoteChildren(); -} - -void CPWL_Note::RePosNoteChildren() { - if (m_bResizing) - return; - - m_bResizing = TRUE; - - if (IsValid()) { - CFX_FloatRect rcClient = GetClientRect(); - - CFX_FloatRect rcIcon = rcClient; - rcIcon.top -= 2.0f; - rcIcon.right = rcIcon.left + 14.0f; - rcIcon.bottom = rcIcon.top - 14.0f; - rcIcon.Normalize(); - m_pIcon->Move(rcIcon, TRUE, FALSE); - m_pIcon->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcIcon)); - - CFX_FloatRect rcCloseBox = rcClient; - rcCloseBox.right -= 1.0f; - rcCloseBox.top -= 1.0f; - rcCloseBox.left = rcCloseBox.right - 14.0f; - rcCloseBox.bottom = rcCloseBox.top - 14.0f; - rcCloseBox.Normalize(); - m_pCloseBox->Move(rcCloseBox, TRUE, FALSE); - m_pCloseBox->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcCloseBox)); - - CFX_FloatRect rcDate = rcClient; - rcDate.right = rcCloseBox.left - POPUP_ITEM_TEXT_INDENT; - rcDate.left = - PWL_MAX(rcDate.right - m_pDateTime->GetContentRect().Width() - 1.0f, - rcIcon.right + 1.0f); - rcDate.top = rcClient.top - 2.0f; - rcDate.bottom = rcDate.top - m_pDateTime->GetContentRect().Height(); - rcDate.Normalize(); - m_pDateTime->Move(rcDate, TRUE, FALSE); - m_pDateTime->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcDate)); - - CFX_FloatRect rcSubject = rcClient; - rcSubject.top = rcClient.top - 2.0f; - rcSubject.left = rcIcon.right + POPUP_ITEM_TEXT_INDENT; - rcSubject.right = - PWL_MIN(rcSubject.left + m_pSubject->GetContentRect().Width() + 1.0f, - rcDate.left - 1.0f); - rcSubject.bottom = rcSubject.top - m_pSubject->GetContentRect().Height(); - rcSubject.Normalize(); - m_pSubject->Move(rcSubject, TRUE, FALSE); - m_pSubject->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcSubject)); - - CFX_FloatRect rcOptions = rcClient; - rcOptions.left = - PWL_MAX(rcOptions.right - m_pOptions->GetContentRect().Width(), - rcIcon.right + 1.0f); - rcOptions.top = rcSubject.bottom - 4.0f; - rcOptions.bottom = rcOptions.top - m_pOptions->GetContentRect().Height(); - rcOptions.Normalize(); - m_pOptions->Move(rcOptions, TRUE, FALSE); - m_pOptions->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcOptions)); - - CFX_FloatRect rcAuthor = rcClient; - rcAuthor.top = rcSubject.bottom - 4.0f; - rcAuthor.left = rcSubject.left; - rcAuthor.right = - PWL_MIN(rcSubject.left + m_pAuthor->GetContentRect().Width() + 1.0f, - rcOptions.left - 1.0f); - rcAuthor.bottom = rcAuthor.top - m_pAuthor->GetContentRect().Height(); - rcAuthor.Normalize(); - m_pAuthor->Move(rcAuthor, TRUE, FALSE); - m_pAuthor->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcAuthor)); - - CFX_FloatRect rcLBBox = rcClient; - rcLBBox.top = rcLBBox.bottom + 7.0f; - rcLBBox.right = rcLBBox.left + 7.0f; - rcLBBox.Normalize(); - m_pLBBox->Move(rcLBBox, TRUE, FALSE); - m_pLBBox->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcLBBox)); - - CFX_FloatRect rcRBBox = rcClient; - rcRBBox.top = rcRBBox.bottom + 7.0f; - rcRBBox.left = rcRBBox.right - 7.0f; - rcRBBox.Normalize(); - m_pRBBox->Move(rcRBBox, TRUE, FALSE); - m_pRBBox->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcRBBox)); - - CFX_FloatRect rcContents = rcClient; - rcContents.top = rcAuthor.bottom - POPUP_ITEM_HEAD_BOTTOM; - rcContents.left += 3.0f; - rcContents.right -= 3.0f; - if (m_pContentsBar->IsVisible()) - rcContents.right -= PWL_SCROLLBAR_WIDTH; - rcContents.bottom += 14.0f; - rcContents.Normalize(); - m_pContents->Move(rcContents, FALSE, FALSE); - m_pContents->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcContents)); - - CFX_FloatRect rcContentsBar = rcContents; - rcContentsBar.right = rcClient.right - 3.0f; - rcContentsBar.left = rcContentsBar.right - PWL_SCROLLBAR_WIDTH; - rcContentsBar.Normalize(); - m_pContentsBar->Move(rcContentsBar, TRUE, FALSE); - } - - m_bResizing = FALSE; -} - -void CPWL_Note::CreateChildWnd(const PWL_CREATEPARAM& cp) { - CPWL_NoteItem::CreateChildWnd(cp); - - CPWL_Color sTextColor; - - if (CPWL_Utils::IsBlackOrWhite(GetBackgroundColor())) - sTextColor = PWL_DEFAULT_WHITECOLOR; - else - sTextColor = PWL_DEFAULT_BLACKCOLOR; - - m_pAuthor = new CPWL_Label; - PWL_CREATEPARAM acp = cp; - acp.pParentWnd = this; - acp.dwFlags = PWS_VISIBLE | PWS_CHILD | PES_LEFT | PES_TOP; - acp.sTextColor = sTextColor; - m_pAuthor->Create(acp); - - m_pCloseBox = new CPWL_Note_CloseBox; - PWL_CREATEPARAM ccp = cp; - ccp.pParentWnd = this; - ccp.dwBorderWidth = 2; - ccp.nBorderStyle = PBS_BEVELED; - ccp.dwFlags = PWS_VISIBLE | PWS_CHILD | PWS_BORDER; - ccp.sTextColor = sTextColor; - m_pCloseBox->Create(ccp); - - m_pIcon = new CPWL_Note_Icon; - PWL_CREATEPARAM icp = cp; - icp.pParentWnd = this; - icp.dwFlags = PWS_VISIBLE | PWS_CHILD; - m_pIcon->Create(icp); - - m_pOptions = new CPWL_Note_Options; - PWL_CREATEPARAM ocp = cp; - ocp.pParentWnd = this; - ocp.dwFlags = PWS_CHILD | PWS_VISIBLE; - ocp.sTextColor = sTextColor; - m_pOptions->Create(ocp); - - m_pLBBox = new CPWL_Note_LBBox; - PWL_CREATEPARAM lcp = cp; - lcp.pParentWnd = this; - lcp.dwFlags = PWS_VISIBLE | PWS_CHILD; - lcp.eCursorType = FXCT_NESW; - lcp.sTextColor = sTextColor; - m_pLBBox->Create(lcp); - - m_pRBBox = new CPWL_Note_RBBox; - PWL_CREATEPARAM rcp = cp; - rcp.pParentWnd = this; - rcp.dwFlags = PWS_VISIBLE | PWS_CHILD; - rcp.eCursorType = FXCT_NWSE; - rcp.sTextColor = sTextColor; - m_pRBBox->Create(rcp); - - m_pContentsBar = new CPWL_ScrollBar(SBT_VSCROLL); - PWL_CREATEPARAM scp = cp; - scp.pParentWnd = this; - scp.sBackgroundColor = - CPWL_Color(COLORTYPE_RGB, 240 / 255.0f, 240 / 255.0f, 240 / 255.0f); - scp.dwFlags = PWS_CHILD | PWS_VISIBLE | PWS_BACKGROUND; - m_pContentsBar->Create(scp); - m_pContentsBar->SetNotifyForever(TRUE); -} - -void CPWL_Note::SetSubjectName(const CFX_WideString& sName) { - CPWL_NoteItem::SetSubjectName(sName); - RePosChildWnd(); -} - -void CPWL_Note::SetAuthorName(const CFX_WideString& sName) { - if (m_pAuthor) { - m_pAuthor->SetText(sName.c_str()); - RePosChildWnd(); - } - - if (IPWL_NoteNotify* pNotify = GetNoteNotify()) { - pNotify->OnSetAuthorName(this); - } -} - -CFX_WideString CPWL_Note::GetAuthorName() const { - if (m_pAuthor) - return m_pAuthor->GetText(); - - return L""; -} - -FX_BOOL CPWL_Note::OnMouseWheel(short zDelta, - const CFX_FloatPoint& point, - FX_DWORD nFlag) { - CFX_FloatPoint ptScroll = m_pContents->GetScrollPos(); - CFX_FloatRect rcScroll = m_pContents->GetScrollArea(); - CFX_FloatRect rcContents = m_pContents->GetClientRect(); - - if (rcScroll.top - rcScroll.bottom > rcContents.Height()) { - CFX_FloatPoint ptNew = ptScroll; - - if (zDelta > 0) - ptNew.y += 30; - else - ptNew.y -= 30; - - if (ptNew.y > rcScroll.top) - ptNew.y = rcScroll.top; - if (ptNew.y < rcScroll.bottom + rcContents.Height()) - ptNew.y = rcScroll.bottom + rcContents.Height(); - if (ptNew.y < rcScroll.bottom) - ptNew.y = rcScroll.bottom; - - if (ptNew.y != ptScroll.y) { - m_pContents->OnNotify(this, PNM_NOTERESET, 0, 0); - m_pContents->OnNotify(this, PNM_SCROLLWINDOW, SBT_VSCROLL, - (intptr_t)&ptNew.y); - m_pContentsBar->OnNotify(this, PNM_SETSCROLLPOS, SBT_VSCROLL, - (intptr_t)&ptNew.y); - - return TRUE; - } - } - - return FALSE; -} - -void CPWL_Note::OnNotify(CPWL_Wnd* pWnd, - FX_DWORD msg, - intptr_t wParam, - intptr_t lParam) { - switch (msg) { - case PNM_NOTEEDITCHANGED: { - CFX_FloatRect rcScroll = m_pContents->GetScrollArea(); - - PWL_SCROLL_INFO sInfo; - sInfo.fContentMin = rcScroll.bottom; - sInfo.fContentMax = rcScroll.top; - sInfo.fPlateWidth = m_pContents->GetClientRect().Height(); - sInfo.fSmallStep = 13.0f; - sInfo.fBigStep = sInfo.fPlateWidth; - - if (FXSYS_memcmp(&m_OldScrollInfo, &sInfo, sizeof(PWL_SCROLL_INFO)) != - 0) { - FX_BOOL bScrollChanged = FALSE; - - if (lParam < 3) { - bScrollChanged = ResetScrollBar(); - if (bScrollChanged) { - lParam++; - m_pContents->OnNotify(this, PNM_NOTERESET, 0, 0); - OnNotify(this, PNM_NOTEEDITCHANGED, 0, lParam); - } - } - - if (!bScrollChanged) { - if (m_pContentsBar->IsVisible()) { - m_pContentsBar->OnNotify(pWnd, PNM_SETSCROLLINFO, SBT_VSCROLL, - (intptr_t)&sInfo); - m_OldScrollInfo = sInfo; - - CFX_FloatPoint ptScroll = m_pContents->GetScrollPos(); - CFX_FloatPoint ptOld = ptScroll; - - if (ptScroll.y > sInfo.fContentMax) - ptScroll.y = sInfo.fContentMax; - if (ptScroll.y < sInfo.fContentMin + sInfo.fPlateWidth) - ptScroll.y = sInfo.fContentMin + sInfo.fPlateWidth; - if (ptScroll.y < sInfo.fContentMin) - ptScroll.y = sInfo.fContentMin; - - if (ptOld.y != ptScroll.y) { - m_pContentsBar->OnNotify(this, PNM_SETSCROLLPOS, SBT_VSCROLL, - (intptr_t)&ptScroll.y); - m_pContentsBar->InvalidateRect(NULL); - m_pContents->OnNotify(this, PNM_SCROLLWINDOW, SBT_VSCROLL, - (intptr_t)&ptScroll.y); - } - } - } - } - } - - m_pContents->InvalidateRect(NULL); - - return; - case PNM_SCROLLWINDOW: - if (m_pContents) - m_pContents->OnNotify(pWnd, msg, wParam, lParam); - return; - case PNM_SETSCROLLPOS: - if (m_pContentsBar) - m_pContentsBar->OnNotify(pWnd, PNM_SETSCROLLPOS, wParam, lParam); - return; - } - - if (msg == PNM_SETCARETINFO && IsValid()) { - if (PWL_CARET_INFO* pInfo = (PWL_CARET_INFO*)wParam) { - if (m_pContents) { - CFX_FloatRect rcClient = m_pContents->GetClientRect(); - if (pInfo->ptHead.y > rcClient.top) { - CFX_FloatPoint pt = m_pContents->OutToIn(pInfo->ptHead); - m_pContents->OnNotify(this, PNM_SCROLLWINDOW, SBT_VSCROLL, - (intptr_t)&pt.y); - - CFX_FloatPoint ptScroll = m_pContents->GetScrollPos(); - m_pContentsBar->OnNotify(this, PNM_SETSCROLLPOS, SBT_VSCROLL, - (intptr_t)&ptScroll.y); - - return; - } - - if (pInfo->ptFoot.y < rcClient.bottom) { - CFX_FloatPoint pt = m_pContents->OutToIn(pInfo->ptFoot); - pt.y += rcClient.Height(); - m_pContents->OnNotify(this, PNM_SCROLLWINDOW, SBT_VSCROLL, - (intptr_t)&pt.y); - - CFX_FloatPoint ptScroll = m_pContents->GetScrollPos(); - m_pContentsBar->OnNotify(this, PNM_SETSCROLLPOS, SBT_VSCROLL, - (intptr_t)&ptScroll.y); - - return; - } - } - } - } - - CPWL_NoteItem::OnNotify(pWnd, msg, wParam, lParam); -} - -void CPWL_Note::SetBkColor(const CPWL_Color& color) { - CPWL_NoteItem::SetBkColor(color); - - CPWL_Color sBK = color; - CPWL_Color sTextColor; - if (CPWL_Utils::IsBlackOrWhite(sBK)) - sTextColor = PWL_DEFAULT_WHITECOLOR; - else - sTextColor = PWL_DEFAULT_BLACKCOLOR; - - if (m_pCloseBox) - m_pCloseBox->SetTextColor(sTextColor); - if (m_pAuthor) - m_pAuthor->SetTextColor(sTextColor); - if (m_pOptions) - m_pOptions->SetTextColor(sTextColor); - if (m_pLBBox) - m_pLBBox->SetTextColor(sTextColor); - if (m_pRBBox) - m_pRBBox->SetTextColor(sTextColor); -} - -FX_BOOL CPWL_Note::OnLButtonDown(const CFX_FloatPoint& point, FX_DWORD nFlag) { - if (m_pOptions->WndHitTest(m_pOptions->ParentToChild(point))) { - if (IPWL_NoteNotify* pNotify = GetNoteNotify()) { - int32_t x, y; - PWLtoWnd(point, x, y); - if (IFX_SystemHandler* pSH = GetSystemHandler()) - pSH->ClientToScreen(GetAttachedHWnd(), x, y); - KillFocus(); - pNotify->OnPopupMenu(x, y); - - return TRUE; - } - } - - return CPWL_Wnd::OnLButtonDown(point, nFlag); -} - -FX_BOOL CPWL_Note::OnRButtonUp(const CFX_FloatPoint& point, FX_DWORD nFlag) { - return CPWL_Wnd::OnRButtonUp(point, nFlag); -} - -const CPWL_Note* CPWL_Note::GetNote() const { - return this; -} - -IPWL_NoteNotify* CPWL_Note::GetNoteNotify() const { - return m_bEnableNotify ? m_pNoteNotify : nullptr; -} - -void CPWL_Note::SetIconType(int32_t nType) { - if (m_pIcon) - m_pIcon->SetIconType(nType); -} - -void CPWL_Note::EnableModify(FX_BOOL bEnabled) { - m_pContents->EnableModify(bEnabled); -} - -void CPWL_Note::EnableRead(FX_BOOL bEnabled) { - m_pContents->EnableRead(bEnabled); -} - -CFX_WideString CPWL_Note::GetReplyString() const { - return m_sReplyString; -} - -void CPWL_Note::SetReplyString(const CFX_WideString& str) { - m_sReplyString = str; -} diff --git a/fpdfsdk/src/pdfwindow/PWL_ScrollBar.cpp b/fpdfsdk/src/pdfwindow/PWL_ScrollBar.cpp deleted file mode 100644 index 03bf3238fa..0000000000 --- a/fpdfsdk/src/pdfwindow/PWL_ScrollBar.cpp +++ /dev/null @@ -1,1197 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "fpdfsdk/include/pdfwindow/PWL_ScrollBar.h" -#include "fpdfsdk/include/pdfwindow/PWL_Utils.h" -#include "fpdfsdk/include/pdfwindow/PWL_Wnd.h" - -#define IsFloatZero(f) ((f) < 0.0001 && (f) > -0.0001) -#define IsFloatBigger(fa, fb) ((fa) > (fb) && !IsFloatZero((fa) - (fb))) -#define IsFloatSmaller(fa, fb) ((fa) < (fb) && !IsFloatZero((fa) - (fb))) -#define IsFloatEqual(fa, fb) IsFloatZero((fa) - (fb)) - -PWL_FLOATRANGE::PWL_FLOATRANGE() { - Default(); -} - -PWL_FLOATRANGE::PWL_FLOATRANGE(FX_FLOAT min, FX_FLOAT max) { - Set(min, max); -} - -void PWL_FLOATRANGE::Default() { - fMin = 0; - fMax = 0; -} - -void PWL_FLOATRANGE::Set(FX_FLOAT min, FX_FLOAT max) { - if (min > max) { - fMin = max; - fMax = min; - } else { - fMin = min; - fMax = max; - } -} - -FX_BOOL PWL_FLOATRANGE::In(FX_FLOAT x) const { - return (IsFloatBigger(x, fMin) || IsFloatEqual(x, fMin)) && - (IsFloatSmaller(x, fMax) || IsFloatEqual(x, fMax)); -} - -FX_FLOAT PWL_FLOATRANGE::GetWidth() const { - return fMax - fMin; -} - -PWL_SCROLL_PRIVATEDATA::PWL_SCROLL_PRIVATEDATA() { - Default(); -} - -void PWL_SCROLL_PRIVATEDATA::Default() { - ScrollRange.Default(); - fScrollPos = ScrollRange.fMin; - fClientWidth = 0; - fBigStep = 10; - fSmallStep = 1; -} - -void PWL_SCROLL_PRIVATEDATA::SetScrollRange(FX_FLOAT min, FX_FLOAT max) { - ScrollRange.Set(min, max); - - if (IsFloatSmaller(fScrollPos, ScrollRange.fMin)) - fScrollPos = ScrollRange.fMin; - if (IsFloatBigger(fScrollPos, ScrollRange.fMax)) - fScrollPos = ScrollRange.fMax; -} - -void PWL_SCROLL_PRIVATEDATA::SetClientWidth(FX_FLOAT width) { - fClientWidth = width; -} - -void PWL_SCROLL_PRIVATEDATA::SetSmallStep(FX_FLOAT step) { - fSmallStep = step; -} - -void PWL_SCROLL_PRIVATEDATA::SetBigStep(FX_FLOAT step) { - fBigStep = step; -} - -FX_BOOL PWL_SCROLL_PRIVATEDATA::SetPos(FX_FLOAT pos) { - if (ScrollRange.In(pos)) { - fScrollPos = pos; - return TRUE; - } - return FALSE; -} - -void PWL_SCROLL_PRIVATEDATA::AddSmall() { - if (!SetPos(fScrollPos + fSmallStep)) - SetPos(ScrollRange.fMax); -} - -void PWL_SCROLL_PRIVATEDATA::SubSmall() { - if (!SetPos(fScrollPos - fSmallStep)) - SetPos(ScrollRange.fMin); -} - -void PWL_SCROLL_PRIVATEDATA::AddBig() { - if (!SetPos(fScrollPos + fBigStep)) - SetPos(ScrollRange.fMax); -} - -void PWL_SCROLL_PRIVATEDATA::SubBig() { - if (!SetPos(fScrollPos - fBigStep)) - SetPos(ScrollRange.fMin); -} - -CPWL_SBButton::CPWL_SBButton(PWL_SCROLLBAR_TYPE eScrollBarType, - PWL_SBBUTTON_TYPE eButtonType) { - m_eScrollBarType = eScrollBarType; - m_eSBButtonType = eButtonType; - - m_bMouseDown = FALSE; -} - -CPWL_SBButton::~CPWL_SBButton() {} - -CFX_ByteString CPWL_SBButton::GetClassName() const { - return "CPWL_SBButton"; -} - -void CPWL_SBButton::OnCreate(PWL_CREATEPARAM& cp) { - cp.eCursorType = FXCT_ARROW; -} - -void CPWL_SBButton::GetThisAppearanceStream(CFX_ByteTextBuf& sAppStream) { - CPWL_Wnd::GetThisAppearanceStream(sAppStream); - - if (!IsVisible()) - return; - - CFX_ByteTextBuf sButton; - - CFX_FloatRect rectWnd = GetWindowRect(); - - if (rectWnd.IsEmpty()) - return; - - sAppStream << "q\n"; - - CFX_FloatPoint ptCenter = GetCenterPoint(); - - switch (m_eScrollBarType) { - case SBT_HSCROLL: - switch (m_eSBButtonType) { - case PSBT_MIN: { - CFX_FloatPoint pt1(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f, - ptCenter.y); - CFX_FloatPoint pt2(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f, - ptCenter.y + PWL_TRIANGLE_HALFLEN); - CFX_FloatPoint pt3(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f, - ptCenter.y - PWL_TRIANGLE_HALFLEN); - - if (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 && - rectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN) { - sButton << "0 g\n"; - sButton << pt1.x << " " << pt1.y << " m\n"; - sButton << pt2.x << " " << pt2.y << " l\n"; - sButton << pt3.x << " " << pt3.y << " l\n"; - sButton << pt1.x << " " << pt1.y << " l f\n"; - - sAppStream << sButton; - } - } break; - case PSBT_MAX: { - CFX_FloatPoint pt1(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f, - ptCenter.y); - CFX_FloatPoint pt2(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f, - ptCenter.y + PWL_TRIANGLE_HALFLEN); - CFX_FloatPoint pt3(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f, - ptCenter.y - PWL_TRIANGLE_HALFLEN); - - if (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 && - rectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN) { - sButton << "0 g\n"; - sButton << pt1.x << " " << pt1.y << " m\n"; - sButton << pt2.x << " " << pt2.y << " l\n"; - sButton << pt3.x << " " << pt3.y << " l\n"; - sButton << pt1.x << " " << pt1.y << " l f\n"; - - sAppStream << sButton; - } - } break; - default: - break; - } - break; - case SBT_VSCROLL: - switch (m_eSBButtonType) { - case PSBT_MIN: { - CFX_FloatPoint pt1(ptCenter.x - PWL_TRIANGLE_HALFLEN, - ptCenter.y - PWL_TRIANGLE_HALFLEN * 0.5f); - CFX_FloatPoint pt2(ptCenter.x + PWL_TRIANGLE_HALFLEN, - ptCenter.y - PWL_TRIANGLE_HALFLEN * 0.5f); - CFX_FloatPoint pt3(ptCenter.x, - ptCenter.y + PWL_TRIANGLE_HALFLEN * 0.5f); - - if (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 && - rectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN) { - sButton << "0 g\n"; - sButton << pt1.x << " " << pt1.y << " m\n"; - sButton << pt2.x << " " << pt2.y << " l\n"; - sButton << pt3.x << " " << pt3.y << " l\n"; - sButton << pt1.x << " " << pt1.y << " l f\n"; - - sAppStream << sButton; - } - } break; - case PSBT_MAX: { - CFX_FloatPoint pt1(ptCenter.x - PWL_TRIANGLE_HALFLEN, - ptCenter.y + PWL_TRIANGLE_HALFLEN * 0.5f); - CFX_FloatPoint pt2(ptCenter.x + PWL_TRIANGLE_HALFLEN, - ptCenter.y + PWL_TRIANGLE_HALFLEN * 0.5f); - CFX_FloatPoint pt3(ptCenter.x, - ptCenter.y - PWL_TRIANGLE_HALFLEN * 0.5f); - - if (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 && - rectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN) { - sButton << "0 g\n"; - sButton << pt1.x << " " << pt1.y << " m\n"; - sButton << pt2.x << " " << pt2.y << " l\n"; - sButton << pt3.x << " " << pt3.y << " l\n"; - sButton << pt1.x << " " << pt1.y << " l f\n"; - - sAppStream << sButton; - } - } break; - default: - break; - } - break; - default: - break; - } - - sAppStream << "Q\n"; -} - -void CPWL_SBButton::DrawThisAppearance(CFX_RenderDevice* pDevice, - CFX_Matrix* pUser2Device) { - if (!IsVisible()) - return; - - CFX_FloatRect rectWnd = GetWindowRect(); - if (rectWnd.IsEmpty()) - return; - - CFX_FloatPoint ptCenter = GetCenterPoint(); - int32_t nTransparancy = GetTransparency(); - - switch (m_eScrollBarType) { - case SBT_HSCROLL: - CPWL_Wnd::DrawThisAppearance(pDevice, pUser2Device); - switch (m_eSBButtonType) { - case PSBT_MIN: { - CFX_FloatPoint pt1(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f, - ptCenter.y); - CFX_FloatPoint pt2(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f, - ptCenter.y + PWL_TRIANGLE_HALFLEN); - CFX_FloatPoint pt3(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f, - ptCenter.y - PWL_TRIANGLE_HALFLEN); - - if (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 && - rectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN) { - CFX_PathData path; - - path.SetPointCount(4); - path.SetPoint(0, pt1.x, pt1.y, FXPT_MOVETO); - path.SetPoint(1, pt2.x, pt2.y, FXPT_LINETO); - path.SetPoint(2, pt3.x, pt3.y, FXPT_LINETO); - path.SetPoint(3, pt1.x, pt1.y, FXPT_LINETO); - - pDevice->DrawPath(&path, pUser2Device, NULL, - CPWL_Utils::PWLColorToFXColor( - PWL_DEFAULT_BLACKCOLOR, nTransparancy), - 0, FXFILL_ALTERNATE); - } - } break; - case PSBT_MAX: { - CFX_FloatPoint pt1(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f, - ptCenter.y); - CFX_FloatPoint pt2(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f, - ptCenter.y + PWL_TRIANGLE_HALFLEN); - CFX_FloatPoint pt3(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f, - ptCenter.y - PWL_TRIANGLE_HALFLEN); - - if (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 && - rectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN) { - CFX_PathData path; - - path.SetPointCount(4); - path.SetPoint(0, pt1.x, pt1.y, FXPT_MOVETO); - path.SetPoint(1, pt2.x, pt2.y, FXPT_LINETO); - path.SetPoint(2, pt3.x, pt3.y, FXPT_LINETO); - path.SetPoint(3, pt1.x, pt1.y, FXPT_LINETO); - - pDevice->DrawPath(&path, pUser2Device, NULL, - CPWL_Utils::PWLColorToFXColor( - PWL_DEFAULT_BLACKCOLOR, nTransparancy), - 0, FXFILL_ALTERNATE); - } - } break; - default: - break; - } - break; - case SBT_VSCROLL: - switch (m_eSBButtonType) { - case PSBT_MIN: { - // draw border - CFX_FloatRect rcDraw = rectWnd; - CPWL_Utils::DrawStrokeRect(pDevice, pUser2Device, rcDraw, - ArgbEncode(nTransparancy, 100, 100, 100), - 0.0f); - - // draw inner border - rcDraw = CPWL_Utils::DeflateRect(rectWnd, 0.5f); - CPWL_Utils::DrawStrokeRect(pDevice, pUser2Device, rcDraw, - ArgbEncode(nTransparancy, 255, 255, 255), - 1.0f); - - // draw background - - rcDraw = CPWL_Utils::DeflateRect(rectWnd, 1.0f); - - if (IsEnabled()) - CPWL_Utils::DrawShadow(pDevice, pUser2Device, TRUE, FALSE, rcDraw, - nTransparancy, 80, 220); - else - CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcDraw, - ArgbEncode(255, 255, 255, 255)); - - // draw arrow - - if (rectWnd.top - rectWnd.bottom > 6.0f) { - FX_FLOAT fX = rectWnd.left + 1.5f; - FX_FLOAT fY = rectWnd.bottom; - CFX_FloatPoint pts[7] = {CFX_FloatPoint(fX + 2.5f, fY + 4.0f), - CFX_FloatPoint(fX + 2.5f, fY + 3.0f), - CFX_FloatPoint(fX + 4.5f, fY + 5.0f), - CFX_FloatPoint(fX + 6.5f, fY + 3.0f), - CFX_FloatPoint(fX + 6.5f, fY + 4.0f), - CFX_FloatPoint(fX + 4.5f, fY + 6.0f), - CFX_FloatPoint(fX + 2.5f, fY + 4.0f)}; - - if (IsEnabled()) - CPWL_Utils::DrawFillArea( - pDevice, pUser2Device, pts, 7, - ArgbEncode(nTransparancy, 255, 255, 255)); - else - CPWL_Utils::DrawFillArea(pDevice, pUser2Device, pts, 7, - CPWL_Utils::PWLColorToFXColor( - PWL_DEFAULT_HEAVYGRAYCOLOR, 255)); - } - } break; - case PSBT_MAX: { - // draw border - CFX_FloatRect rcDraw = rectWnd; - CPWL_Utils::DrawStrokeRect(pDevice, pUser2Device, rcDraw, - ArgbEncode(nTransparancy, 100, 100, 100), - 0.0f); - - // draw inner border - rcDraw = CPWL_Utils::DeflateRect(rectWnd, 0.5f); - CPWL_Utils::DrawStrokeRect(pDevice, pUser2Device, rcDraw, - ArgbEncode(nTransparancy, 255, 255, 255), - 1.0f); - - // draw background - rcDraw = CPWL_Utils::DeflateRect(rectWnd, 1.0f); - if (IsEnabled()) - CPWL_Utils::DrawShadow(pDevice, pUser2Device, TRUE, FALSE, rcDraw, - nTransparancy, 80, 220); - else - CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcDraw, - ArgbEncode(255, 255, 255, 255)); - - // draw arrow - - if (rectWnd.top - rectWnd.bottom > 6.0f) { - FX_FLOAT fX = rectWnd.left + 1.5f; - FX_FLOAT fY = rectWnd.bottom; - - CFX_FloatPoint pts[7] = {CFX_FloatPoint(fX + 2.5f, fY + 5.0f), - CFX_FloatPoint(fX + 2.5f, fY + 6.0f), - CFX_FloatPoint(fX + 4.5f, fY + 4.0f), - CFX_FloatPoint(fX + 6.5f, fY + 6.0f), - CFX_FloatPoint(fX + 6.5f, fY + 5.0f), - CFX_FloatPoint(fX + 4.5f, fY + 3.0f), - CFX_FloatPoint(fX + 2.5f, fY + 5.0f)}; - - if (IsEnabled()) - CPWL_Utils::DrawFillArea( - pDevice, pUser2Device, pts, 7, - ArgbEncode(nTransparancy, 255, 255, 255)); - else - CPWL_Utils::DrawFillArea(pDevice, pUser2Device, pts, 7, - CPWL_Utils::PWLColorToFXColor( - PWL_DEFAULT_HEAVYGRAYCOLOR, 255)); - } - } break; - case PSBT_POS: { - // draw border - CFX_FloatRect rcDraw = rectWnd; - CPWL_Utils::DrawStrokeRect(pDevice, pUser2Device, rcDraw, - ArgbEncode(nTransparancy, 100, 100, 100), - 0.0f); - - // draw inner border - rcDraw = CPWL_Utils::DeflateRect(rectWnd, 0.5f); - CPWL_Utils::DrawStrokeRect(pDevice, pUser2Device, rcDraw, - ArgbEncode(nTransparancy, 255, 255, 255), - 1.0f); - - if (IsEnabled()) { - // draw shadow effect - - CFX_FloatPoint ptTop = - CFX_FloatPoint(rectWnd.left, rectWnd.top - 1.0f); - CFX_FloatPoint ptBottom = - CFX_FloatPoint(rectWnd.left, rectWnd.bottom + 1.0f); - - ptTop.x += 1.5f; - ptBottom.x += 1.5f; - - CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom, - ArgbEncode(nTransparancy, 210, 210, 210), - 1.0f); - - ptTop.x += 1.0f; - ptBottom.x += 1.0f; - - CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom, - ArgbEncode(nTransparancy, 220, 220, 220), - 1.0f); - - ptTop.x += 1.0f; - ptBottom.x += 1.0f; - - CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom, - ArgbEncode(nTransparancy, 240, 240, 240), - 1.0f); - - ptTop.x += 1.0f; - ptBottom.x += 1.0f; - - CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom, - ArgbEncode(nTransparancy, 240, 240, 240), - 1.0f); - - ptTop.x += 1.0f; - ptBottom.x += 1.0f; - - CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom, - ArgbEncode(nTransparancy, 210, 210, 210), - 1.0f); - - ptTop.x += 1.0f; - ptBottom.x += 1.0f; - - CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom, - ArgbEncode(nTransparancy, 180, 180, 180), - 1.0f); - - ptTop.x += 1.0f; - ptBottom.x += 1.0f; - - CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom, - ArgbEncode(nTransparancy, 150, 150, 150), - 1.0f); - - ptTop.x += 1.0f; - ptBottom.x += 1.0f; - - CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom, - ArgbEncode(nTransparancy, 150, 150, 150), - 1.0f); - - ptTop.x += 1.0f; - ptBottom.x += 1.0f; - - CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom, - ArgbEncode(nTransparancy, 180, 180, 180), - 1.0f); - - ptTop.x += 1.0f; - ptBottom.x += 1.0f; - - CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom, - ArgbEncode(nTransparancy, 210, 210, 210), - 1.0f); - } else { - CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcDraw, - ArgbEncode(255, 255, 255, 255)); - } - - // draw friction - - if (rectWnd.Height() > 8.0f) { - FX_COLORREF crStroke = ArgbEncode(nTransparancy, 120, 120, 120); - if (!IsEnabled()) - crStroke = CPWL_Utils::PWLColorToFXColor( - PWL_DEFAULT_HEAVYGRAYCOLOR, 255); - - FX_FLOAT nFrictionWidth = 5.0f; - FX_FLOAT nFrictionHeight = 5.5f; - - CFX_FloatPoint ptLeft = - CFX_FloatPoint(ptCenter.x - nFrictionWidth / 2.0f, - ptCenter.y - nFrictionHeight / 2.0f + 0.5f); - CFX_FloatPoint ptRight = - CFX_FloatPoint(ptCenter.x + nFrictionWidth / 2.0f, - ptCenter.y - nFrictionHeight / 2.0f + 0.5f); - - CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptLeft, ptRight, - crStroke, 1.0f); - - ptLeft.y += 2.0f; - ptRight.y += 2.0f; - - CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptLeft, ptRight, - crStroke, 1.0f); - - ptLeft.y += 2.0f; - ptRight.y += 2.0f; - - CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptLeft, ptRight, - crStroke, 1.0f); - } - } break; - default: - break; - } - break; - default: - break; - } -} - -FX_BOOL CPWL_SBButton::OnLButtonDown(const CFX_FloatPoint& point, - FX_DWORD nFlag) { - CPWL_Wnd::OnLButtonDown(point, nFlag); - - if (CPWL_Wnd* pParent = GetParentWindow()) - pParent->OnNotify(this, PNM_LBUTTONDOWN, 0, (intptr_t)&point); - - m_bMouseDown = TRUE; - SetCapture(); - - return TRUE; -} - -FX_BOOL CPWL_SBButton::OnLButtonUp(const CFX_FloatPoint& point, - FX_DWORD nFlag) { - CPWL_Wnd::OnLButtonUp(point, nFlag); - - if (CPWL_Wnd* pParent = GetParentWindow()) - pParent->OnNotify(this, PNM_LBUTTONUP, 0, (intptr_t)&point); - - m_bMouseDown = FALSE; - ReleaseCapture(); - - return TRUE; -} - -FX_BOOL CPWL_SBButton::OnMouseMove(const CFX_FloatPoint& point, - FX_DWORD nFlag) { - CPWL_Wnd::OnMouseMove(point, nFlag); - - if (CPWL_Wnd* pParent = GetParentWindow()) { - pParent->OnNotify(this, PNM_MOUSEMOVE, 0, (intptr_t)&point); - } - - return TRUE; -} - -CPWL_ScrollBar::CPWL_ScrollBar(PWL_SCROLLBAR_TYPE sbType) - : m_sbType(sbType), - m_pMinButton(NULL), - m_pMaxButton(NULL), - m_pPosButton(NULL), - m_bMouseDown(FALSE), - m_bMinOrMax(FALSE), - m_bNotifyForever(TRUE) {} - -CPWL_ScrollBar::~CPWL_ScrollBar() {} - -CFX_ByteString CPWL_ScrollBar::GetClassName() const { - return "CPWL_ScrollBar"; -} - -void CPWL_ScrollBar::OnCreate(PWL_CREATEPARAM& cp) { - cp.eCursorType = FXCT_ARROW; -} - -void CPWL_ScrollBar::RePosChildWnd() { - CFX_FloatRect rcClient = GetClientRect(); - CFX_FloatRect rcMinButton, rcMaxButton; - FX_FLOAT fBWidth = 0; - - switch (m_sbType) { - case SBT_HSCROLL: - if (rcClient.right - rcClient.left > - PWL_SCROLLBAR_BUTTON_WIDTH * 2 + PWL_SCROLLBAR_POSBUTTON_MINWIDTH + - 2) { - rcMinButton = CFX_FloatRect(rcClient.left, rcClient.bottom, - rcClient.left + PWL_SCROLLBAR_BUTTON_WIDTH, - rcClient.top); - rcMaxButton = - CFX_FloatRect(rcClient.right - PWL_SCROLLBAR_BUTTON_WIDTH, - rcClient.bottom, rcClient.right, rcClient.top); - } else { - fBWidth = (rcClient.right - rcClient.left - - PWL_SCROLLBAR_POSBUTTON_MINWIDTH - 2) / - 2; - - if (fBWidth > 0) { - rcMinButton = CFX_FloatRect(rcClient.left, rcClient.bottom, - rcClient.left + fBWidth, rcClient.top); - rcMaxButton = CFX_FloatRect(rcClient.right - fBWidth, rcClient.bottom, - rcClient.right, rcClient.top); - } else { - SetVisible(FALSE); - } - } - break; - case SBT_VSCROLL: - if (IsFloatBigger(rcClient.top - rcClient.bottom, - PWL_SCROLLBAR_BUTTON_WIDTH * 2 + - PWL_SCROLLBAR_POSBUTTON_MINWIDTH + 2)) { - rcMinButton = CFX_FloatRect(rcClient.left, - rcClient.top - PWL_SCROLLBAR_BUTTON_WIDTH, - rcClient.right, rcClient.top); - rcMaxButton = - CFX_FloatRect(rcClient.left, rcClient.bottom, rcClient.right, - rcClient.bottom + PWL_SCROLLBAR_BUTTON_WIDTH); - } else { - fBWidth = (rcClient.top - rcClient.bottom - - PWL_SCROLLBAR_POSBUTTON_MINWIDTH - 2) / - 2; - - if (IsFloatBigger(fBWidth, 0)) { - rcMinButton = CFX_FloatRect(rcClient.left, rcClient.top - fBWidth, - rcClient.right, rcClient.top); - rcMaxButton = - CFX_FloatRect(rcClient.left, rcClient.bottom, rcClient.right, - rcClient.bottom + fBWidth); - } else { - SetVisible(FALSE); - } - } - break; - } - - if (m_pMinButton) - m_pMinButton->Move(rcMinButton, TRUE, FALSE); - if (m_pMaxButton) - m_pMaxButton->Move(rcMaxButton, TRUE, FALSE); - MovePosButton(FALSE); -} - -void CPWL_ScrollBar::GetThisAppearanceStream(CFX_ByteTextBuf& sAppStream) { - CFX_FloatRect rectWnd = GetWindowRect(); - - if (IsVisible() && !rectWnd.IsEmpty()) { - CFX_ByteTextBuf sButton; - - sButton << "q\n"; - sButton << "0 w\n" - << CPWL_Utils::GetColorAppStream(GetBackgroundColor(), TRUE); - sButton << rectWnd.left << " " << rectWnd.bottom << " " - << rectWnd.right - rectWnd.left << " " - << rectWnd.top - rectWnd.bottom << " re b Q\n"; - - sAppStream << sButton; - } -} - -void CPWL_ScrollBar::DrawThisAppearance(CFX_RenderDevice* pDevice, - CFX_Matrix* pUser2Device) { - CFX_FloatRect rectWnd = GetWindowRect(); - - if (IsVisible() && !rectWnd.IsEmpty()) { - CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rectWnd, - GetBackgroundColor(), GetTransparency()); - - CPWL_Utils::DrawStrokeLine( - pDevice, pUser2Device, - CFX_FloatPoint(rectWnd.left + 2.0f, rectWnd.top - 2.0f), - CFX_FloatPoint(rectWnd.left + 2.0f, rectWnd.bottom + 2.0f), - ArgbEncode(GetTransparency(), 100, 100, 100), 1.0f); - - CPWL_Utils::DrawStrokeLine( - pDevice, pUser2Device, - CFX_FloatPoint(rectWnd.right - 2.0f, rectWnd.top - 2.0f), - CFX_FloatPoint(rectWnd.right - 2.0f, rectWnd.bottom + 2.0f), - ArgbEncode(GetTransparency(), 100, 100, 100), 1.0f); - } -} - -FX_BOOL CPWL_ScrollBar::OnLButtonDown(const CFX_FloatPoint& point, - FX_DWORD nFlag) { - CPWL_Wnd::OnLButtonDown(point, nFlag); - - if (HasFlag(PWS_AUTOTRANSPARENT)) { - if (GetTransparency() != 255) { - SetTransparency(255); - InvalidateRect(); - } - } - - CFX_FloatRect rcMinArea, rcMaxArea; - - if (m_pPosButton && m_pPosButton->IsVisible()) { - CFX_FloatRect rcClient = GetClientRect(); - CFX_FloatRect rcPosButton = m_pPosButton->GetWindowRect(); - - switch (m_sbType) { - case SBT_HSCROLL: - rcMinArea = - CFX_FloatRect(rcClient.left + PWL_SCROLLBAR_BUTTON_WIDTH, - rcClient.bottom, rcPosButton.left, rcClient.top); - rcMaxArea = CFX_FloatRect(rcPosButton.right, rcClient.bottom, - rcClient.right - PWL_SCROLLBAR_BUTTON_WIDTH, - rcClient.top); - - break; - case SBT_VSCROLL: - rcMinArea = - CFX_FloatRect(rcClient.left, rcPosButton.top, rcClient.right, - rcClient.top - PWL_SCROLLBAR_BUTTON_WIDTH); - rcMaxArea = CFX_FloatRect(rcClient.left, - rcClient.bottom + PWL_SCROLLBAR_BUTTON_WIDTH, - rcClient.right, rcPosButton.bottom); - break; - } - - rcMinArea.Normalize(); - rcMaxArea.Normalize(); - - if (rcMinArea.Contains(point.x, point.y)) { - m_sData.SubBig(); - MovePosButton(TRUE); - NotifyScrollWindow(); - } - - if (rcMaxArea.Contains(point.x, point.y)) { - m_sData.AddBig(); - MovePosButton(TRUE); - NotifyScrollWindow(); - } - } - - return TRUE; -} - -FX_BOOL CPWL_ScrollBar::OnLButtonUp(const CFX_FloatPoint& point, - FX_DWORD nFlag) { - CPWL_Wnd::OnLButtonUp(point, nFlag); - - if (HasFlag(PWS_AUTOTRANSPARENT)) { - if (GetTransparency() != PWL_SCROLLBAR_TRANSPARANCY) { - SetTransparency(PWL_SCROLLBAR_TRANSPARANCY); - InvalidateRect(); - } - } - - EndTimer(); - m_bMouseDown = FALSE; - - return TRUE; -} - -void CPWL_ScrollBar::OnNotify(CPWL_Wnd* pWnd, - FX_DWORD msg, - intptr_t wParam, - intptr_t lParam) { - CPWL_Wnd::OnNotify(pWnd, msg, wParam, lParam); - - switch (msg) { - case PNM_LBUTTONDOWN: - if (pWnd == m_pMinButton) { - OnMinButtonLBDown(*(CFX_FloatPoint*)lParam); - } - - if (pWnd == m_pMaxButton) { - OnMaxButtonLBDown(*(CFX_FloatPoint*)lParam); - } - - if (pWnd == m_pPosButton) { - OnPosButtonLBDown(*(CFX_FloatPoint*)lParam); - } - break; - case PNM_LBUTTONUP: - if (pWnd == m_pMinButton) { - OnMinButtonLBUp(*(CFX_FloatPoint*)lParam); - } - - if (pWnd == m_pMaxButton) { - OnMaxButtonLBUp(*(CFX_FloatPoint*)lParam); - } - - if (pWnd == m_pPosButton) { - OnPosButtonLBUp(*(CFX_FloatPoint*)lParam); - } - break; - case PNM_MOUSEMOVE: - if (pWnd == m_pMinButton) { - OnMinButtonMouseMove(*(CFX_FloatPoint*)lParam); - } - - if (pWnd == m_pMaxButton) { - OnMaxButtonMouseMove(*(CFX_FloatPoint*)lParam); - } - - if (pWnd == m_pPosButton) { - OnPosButtonMouseMove(*(CFX_FloatPoint*)lParam); - } - break; - case PNM_SETSCROLLINFO: { - if (PWL_SCROLL_INFO* pInfo = (PWL_SCROLL_INFO*)lParam) { - if (FXSYS_memcmp(&m_OriginInfo, pInfo, sizeof(PWL_SCROLL_INFO)) != 0) { - m_OriginInfo = *pInfo; - FX_FLOAT fMax = - pInfo->fContentMax - pInfo->fContentMin - pInfo->fPlateWidth; - fMax = fMax > 0.0f ? fMax : 0.0f; - SetScrollRange(0, fMax, pInfo->fPlateWidth); - SetScrollStep(pInfo->fBigStep, pInfo->fSmallStep); - } - } - } break; - case PNM_SETSCROLLPOS: { - FX_FLOAT fPos = *(FX_FLOAT*)lParam; - switch (m_sbType) { - case SBT_HSCROLL: - fPos = fPos - m_OriginInfo.fContentMin; - break; - case SBT_VSCROLL: - fPos = m_OriginInfo.fContentMax - fPos; - break; - } - SetScrollPos(fPos); - } break; - } -} - -void CPWL_ScrollBar::CreateButtons(const PWL_CREATEPARAM& cp) { - PWL_CREATEPARAM scp = cp; - scp.pParentWnd = this; - scp.dwBorderWidth = 2; - scp.nBorderStyle = PBS_BEVELED; - - scp.dwFlags = - PWS_VISIBLE | PWS_CHILD | PWS_BORDER | PWS_BACKGROUND | PWS_NOREFRESHCLIP; - - if (!m_pMinButton) { - m_pMinButton = new CPWL_SBButton(m_sbType, PSBT_MIN); - m_pMinButton->Create(scp); - } - - if (!m_pMaxButton) { - m_pMaxButton = new CPWL_SBButton(m_sbType, PSBT_MAX); - m_pMaxButton->Create(scp); - } - - if (!m_pPosButton) { - m_pPosButton = new CPWL_SBButton(m_sbType, PSBT_POS); - m_pPosButton->SetVisible(FALSE); - m_pPosButton->Create(scp); - } -} - -FX_FLOAT CPWL_ScrollBar::GetScrollBarWidth() const { - if (!IsVisible()) - return 0; - - return PWL_SCROLLBAR_WIDTH; -} - -void CPWL_ScrollBar::SetScrollRange(FX_FLOAT fMin, - FX_FLOAT fMax, - FX_FLOAT fClientWidth) { - if (m_pPosButton) { - m_sData.SetScrollRange(fMin, fMax); - m_sData.SetClientWidth(fClientWidth); - - if (IsFloatSmaller(m_sData.ScrollRange.GetWidth(), 0.0f)) { - m_pPosButton->SetVisible(FALSE); - } else { - m_pPosButton->SetVisible(TRUE); - MovePosButton(TRUE); - } - } -} - -void CPWL_ScrollBar::SetScrollPos(FX_FLOAT fPos) { - FX_FLOAT fOldPos = m_sData.fScrollPos; - - m_sData.SetPos(fPos); - - if (!IsFloatEqual(m_sData.fScrollPos, fOldPos)) - MovePosButton(TRUE); -} - -void CPWL_ScrollBar::SetScrollStep(FX_FLOAT fBigStep, FX_FLOAT fSmallStep) { - m_sData.SetBigStep(fBigStep); - m_sData.SetSmallStep(fSmallStep); -} - -void CPWL_ScrollBar::MovePosButton(FX_BOOL bRefresh) { - ASSERT(m_pMinButton); - ASSERT(m_pMaxButton); - - if (m_pPosButton->IsVisible()) { - CFX_FloatRect rcClient; - CFX_FloatRect rcPosArea, rcPosButton; - - rcClient = GetClientRect(); - rcPosArea = GetScrollArea(); - - FX_FLOAT fLeft, fRight, fTop, fBottom; - - switch (m_sbType) { - case SBT_HSCROLL: - fLeft = TrueToFace(m_sData.fScrollPos); - fRight = TrueToFace(m_sData.fScrollPos + m_sData.fClientWidth); - - if (fRight - fLeft < PWL_SCROLLBAR_POSBUTTON_MINWIDTH) - fRight = fLeft + PWL_SCROLLBAR_POSBUTTON_MINWIDTH; - - if (fRight > rcPosArea.right) { - fRight = rcPosArea.right; - fLeft = fRight - PWL_SCROLLBAR_POSBUTTON_MINWIDTH; - } - - rcPosButton = - CFX_FloatRect(fLeft, rcPosArea.bottom, fRight, rcPosArea.top); - - break; - case SBT_VSCROLL: - fBottom = TrueToFace(m_sData.fScrollPos + m_sData.fClientWidth); - fTop = TrueToFace(m_sData.fScrollPos); - - if (IsFloatSmaller(fTop - fBottom, PWL_SCROLLBAR_POSBUTTON_MINWIDTH)) - fBottom = fTop - PWL_SCROLLBAR_POSBUTTON_MINWIDTH; - - if (IsFloatSmaller(fBottom, rcPosArea.bottom)) { - fBottom = rcPosArea.bottom; - fTop = fBottom + PWL_SCROLLBAR_POSBUTTON_MINWIDTH; - } - - rcPosButton = - CFX_FloatRect(rcPosArea.left, fBottom, rcPosArea.right, fTop); - - break; - } - - m_pPosButton->Move(rcPosButton, TRUE, bRefresh); - } -} - -void CPWL_ScrollBar::OnMinButtonLBDown(const CFX_FloatPoint& point) { - m_sData.SubSmall(); - MovePosButton(TRUE); - NotifyScrollWindow(); - - m_bMinOrMax = TRUE; - - EndTimer(); - BeginTimer(100); -} - -void CPWL_ScrollBar::OnMinButtonLBUp(const CFX_FloatPoint& point) {} - -void CPWL_ScrollBar::OnMinButtonMouseMove(const CFX_FloatPoint& point) {} - -void CPWL_ScrollBar::OnMaxButtonLBDown(const CFX_FloatPoint& point) { - m_sData.AddSmall(); - MovePosButton(TRUE); - NotifyScrollWindow(); - - m_bMinOrMax = FALSE; - - EndTimer(); - BeginTimer(100); -} - -void CPWL_ScrollBar::OnMaxButtonLBUp(const CFX_FloatPoint& point) {} - -void CPWL_ScrollBar::OnMaxButtonMouseMove(const CFX_FloatPoint& point) {} - -void CPWL_ScrollBar::OnPosButtonLBDown(const CFX_FloatPoint& point) { - m_bMouseDown = TRUE; - - if (m_pPosButton) { - CFX_FloatRect rcPosButton = m_pPosButton->GetWindowRect(); - - switch (m_sbType) { - case SBT_HSCROLL: - m_nOldPos = point.x; - m_fOldPosButton = rcPosButton.left; - break; - case SBT_VSCROLL: - m_nOldPos = point.y; - m_fOldPosButton = rcPosButton.top; - break; - } - } -} - -void CPWL_ScrollBar::OnPosButtonLBUp(const CFX_FloatPoint& point) { - if (m_bMouseDown) { - if (!m_bNotifyForever) - NotifyScrollWindow(); - } - m_bMouseDown = FALSE; -} - -void CPWL_ScrollBar::OnPosButtonMouseMove(const CFX_FloatPoint& point) { - FX_FLOAT fOldScrollPos = m_sData.fScrollPos; - - FX_FLOAT fNewPos = 0; - - switch (m_sbType) { - case SBT_HSCROLL: - if (FXSYS_fabs(point.x - m_nOldPos) < 1) - return; - fNewPos = FaceToTrue(m_fOldPosButton + point.x - m_nOldPos); - break; - case SBT_VSCROLL: - if (FXSYS_fabs(point.y - m_nOldPos) < 1) - return; - fNewPos = FaceToTrue(m_fOldPosButton + point.y - m_nOldPos); - break; - } - - if (m_bMouseDown) { - switch (m_sbType) { - case SBT_HSCROLL: - - if (IsFloatSmaller(fNewPos, m_sData.ScrollRange.fMin)) { - fNewPos = m_sData.ScrollRange.fMin; - } - - if (IsFloatBigger(fNewPos, m_sData.ScrollRange.fMax)) { - fNewPos = m_sData.ScrollRange.fMax; - } - - m_sData.SetPos(fNewPos); - - break; - case SBT_VSCROLL: - - if (IsFloatSmaller(fNewPos, m_sData.ScrollRange.fMin)) { - fNewPos = m_sData.ScrollRange.fMin; - } - - if (IsFloatBigger(fNewPos, m_sData.ScrollRange.fMax)) { - fNewPos = m_sData.ScrollRange.fMax; - } - - m_sData.SetPos(fNewPos); - - break; - } - - if (!IsFloatEqual(fOldScrollPos, m_sData.fScrollPos)) { - MovePosButton(TRUE); - - if (m_bNotifyForever) - NotifyScrollWindow(); - } - } -} - -void CPWL_ScrollBar::NotifyScrollWindow() { - if (CPWL_Wnd* pParent = GetParentWindow()) { - FX_FLOAT fPos; - switch (m_sbType) { - case SBT_HSCROLL: - fPos = m_OriginInfo.fContentMin + m_sData.fScrollPos; - break; - case SBT_VSCROLL: - fPos = m_OriginInfo.fContentMax - m_sData.fScrollPos; - break; - } - pParent->OnNotify(this, PNM_SCROLLWINDOW, (intptr_t)m_sbType, - (intptr_t)&fPos); - } -} - -CFX_FloatRect CPWL_ScrollBar::GetScrollArea() const { - CFX_FloatRect rcClient = GetClientRect(); - CFX_FloatRect rcArea; - - if (!m_pMinButton || !m_pMaxButton) - return rcClient; - - CFX_FloatRect rcMin = m_pMinButton->GetWindowRect(); - CFX_FloatRect rcMax = m_pMaxButton->GetWindowRect(); - - FX_FLOAT fMinWidth = rcMin.right - rcMin.left; - FX_FLOAT fMinHeight = rcMin.top - rcMin.bottom; - FX_FLOAT fMaxWidth = rcMax.right - rcMax.left; - FX_FLOAT fMaxHeight = rcMax.top - rcMax.bottom; - - switch (m_sbType) { - case SBT_HSCROLL: - if (rcClient.right - rcClient.left > fMinWidth + fMaxWidth + 2) { - rcArea = CFX_FloatRect(rcClient.left + fMinWidth + 1, rcClient.bottom, - rcClient.right - fMaxWidth - 1, rcClient.top); - } else { - rcArea = CFX_FloatRect(rcClient.left + fMinWidth + 1, rcClient.bottom, - rcClient.left + fMinWidth + 1, rcClient.top); - } - break; - case SBT_VSCROLL: - if (rcClient.top - rcClient.bottom > fMinHeight + fMaxHeight + 2) { - rcArea = CFX_FloatRect(rcClient.left, rcClient.bottom + fMinHeight + 1, - rcClient.right, rcClient.top - fMaxHeight - 1); - } else { - rcArea = - CFX_FloatRect(rcClient.left, rcClient.bottom + fMinHeight + 1, - rcClient.right, rcClient.bottom + fMinHeight + 1); - } - break; - } - - rcArea.Normalize(); - - return rcArea; -} - -FX_FLOAT CPWL_ScrollBar::TrueToFace(FX_FLOAT fTrue) { - CFX_FloatRect rcPosArea; - rcPosArea = GetScrollArea(); - - FX_FLOAT fFactWidth = m_sData.ScrollRange.GetWidth() + m_sData.fClientWidth; - fFactWidth = fFactWidth == 0 ? 1 : fFactWidth; - - FX_FLOAT fFace = 0; - - switch (m_sbType) { - case SBT_HSCROLL: - fFace = rcPosArea.left + - fTrue * (rcPosArea.right - rcPosArea.left) / fFactWidth; - break; - case SBT_VSCROLL: - fFace = rcPosArea.top - - fTrue * (rcPosArea.top - rcPosArea.bottom) / fFactWidth; - break; - } - - return fFace; -} - -FX_FLOAT CPWL_ScrollBar::FaceToTrue(FX_FLOAT fFace) { - CFX_FloatRect rcPosArea; - rcPosArea = GetScrollArea(); - - FX_FLOAT fFactWidth = m_sData.ScrollRange.GetWidth() + m_sData.fClientWidth; - fFactWidth = fFactWidth == 0 ? 1 : fFactWidth; - - FX_FLOAT fTrue = 0; - - switch (m_sbType) { - case SBT_HSCROLL: - fTrue = (fFace - rcPosArea.left) * fFactWidth / - (rcPosArea.right - rcPosArea.left); - break; - case SBT_VSCROLL: - fTrue = (rcPosArea.top - fFace) * fFactWidth / - (rcPosArea.top - rcPosArea.bottom); - break; - } - - return fTrue; -} - -void CPWL_ScrollBar::CreateChildWnd(const PWL_CREATEPARAM& cp) { - CreateButtons(cp); -} - -void CPWL_ScrollBar::TimerProc() { - PWL_SCROLL_PRIVATEDATA sTemp = m_sData; - - if (m_bMinOrMax) - m_sData.SubSmall(); - else - m_sData.AddSmall(); - - if (FXSYS_memcmp(&m_sData, &sTemp, sizeof(PWL_SCROLL_PRIVATEDATA)) != 0) { - MovePosButton(TRUE); - NotifyScrollWindow(); - } -} diff --git a/fpdfsdk/src/pdfwindow/PWL_Signature.cpp b/fpdfsdk/src/pdfwindow/PWL_Signature.cpp deleted file mode 100644 index ffb4461878..0000000000 --- a/fpdfsdk/src/pdfwindow/PWL_Signature.cpp +++ /dev/null @@ -1,177 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "fpdfsdk/include/pdfwindow/PWL_Signature.h" - -#include "fpdfsdk/include/pdfwindow/PWL_Icon.h" -#include "fpdfsdk/include/pdfwindow/PWL_Label.h" -#include "fpdfsdk/include/pdfwindow/PWL_Utils.h" -#include "fpdfsdk/include/pdfwindow/PWL_Wnd.h" - -CPWL_Signature_Image::CPWL_Signature_Image() : m_pImage(NULL) {} - -CPWL_Signature_Image::~CPWL_Signature_Image() {} - -void CPWL_Signature_Image::SetImage(CFX_DIBSource* pImage) { - m_pImage = pImage; -} - -CFX_DIBSource* CPWL_Signature_Image::GetImage() { - return m_pImage; -} - -void CPWL_Signature_Image::DrawThisAppearance(CFX_RenderDevice* pDevice, - CFX_Matrix* pUser2Device) { - CPWL_Wnd::DrawThisAppearance(pDevice, pUser2Device); - - if (m_pImage) { - CFX_FloatRect rcClient = GetClientRect(); - - FX_FLOAT x, y; - pUser2Device->Transform(rcClient.left, rcClient.top, x, y); - - pDevice->StretchDIBits(m_pImage, (int32_t)x, (int32_t)y, - (int32_t)rcClient.Width(), - (int32_t)rcClient.Height()); - } -} - -void CPWL_Signature_Image::GetThisAppearanceStream( - CFX_ByteTextBuf& sAppStream) { - sAppStream << CPWL_Image::GetImageAppStream(); -} - -void CPWL_Signature_Image::GetScale(FX_FLOAT& fHScale, FX_FLOAT& fVScale) { - FX_FLOAT fImageW, fImageH; - - GetImageSize(fImageW, fImageH); - - CFX_FloatRect rcClient = GetClientRect(); - - fHScale = rcClient.Width() / fImageW; - fVScale = rcClient.Height() / fImageH; -} - -CPWL_Signature::CPWL_Signature() - : m_pText(NULL), - m_pDescription(NULL), - m_pImage(NULL), - m_bTextExist(TRUE), - m_bImageExist(FALSE), - m_bFlagExist(TRUE) {} - -CPWL_Signature::~CPWL_Signature() {} - -void CPWL_Signature::SetTextFlag(FX_BOOL bTextExist) { - m_bTextExist = bTextExist; - - RePosChildWnd(); -} - -void CPWL_Signature::SetImageFlag(FX_BOOL bImageExist) { - m_bImageExist = bImageExist; - - RePosChildWnd(); -} - -void CPWL_Signature::SetFoxitFlag(FX_BOOL bFlagExist) { - m_bFlagExist = bFlagExist; -} - -void CPWL_Signature::SetText(const FX_WCHAR* sText) { - m_pText->SetText(sText); - - RePosChildWnd(); -} - -void CPWL_Signature::SetDescription(const FX_WCHAR* str) { - m_pDescription->SetText(str); - - RePosChildWnd(); -} - -void CPWL_Signature::SetImage(CFX_DIBSource* pImage) { - m_pImage->SetImage(pImage); - - RePosChildWnd(); -} - -void CPWL_Signature::SetImageStream(CPDF_Stream* pStream, - const FX_CHAR* sImageAlias) { - m_pImage->SetPDFStream(pStream); - m_pImage->SetImageAlias(sImageAlias); - - RePosChildWnd(); -} - -void CPWL_Signature::RePosChildWnd() { - CFX_FloatRect rcClient = GetClientRect(); - - CFX_FloatRect rcText = rcClient; - CFX_FloatRect rcDescription = rcClient; - - FX_BOOL bTextVisible = m_bTextExist && m_pText->GetText().GetLength() > 0; - - if ((bTextVisible || m_bImageExist) && - m_pDescription->GetText().GetLength() > 0) { - if (rcClient.Width() >= rcClient.Height()) { - rcText.right = rcText.left + rcClient.Width() / 2.0f; - rcDescription.left = rcDescription.right - rcClient.Width() / 2.0f; - } else { - rcText.bottom = rcText.top - rcClient.Height() / 2.0f; - rcDescription.top = rcDescription.bottom + rcClient.Height() / 2.0f; - } - } - - m_pText->SetVisible(bTextVisible); - m_pImage->SetVisible(m_bImageExist); - - m_pText->Move(rcText, TRUE, FALSE); - m_pImage->Move(rcText, TRUE, FALSE); - m_pDescription->Move(rcDescription, TRUE, FALSE); -} - -void CPWL_Signature::CreateChildWnd(const PWL_CREATEPARAM& cp) { - m_pImage = new CPWL_Signature_Image; - PWL_CREATEPARAM icp = cp; - icp.pParentWnd = this; - icp.dwFlags = PWS_CHILD | PWS_VISIBLE; - icp.sTextColor = CPWL_Color(COLORTYPE_GRAY, 0); - m_pImage->Create(icp); - - m_pText = new CPWL_Label; - PWL_CREATEPARAM acp = cp; - acp.pParentWnd = this; - acp.dwFlags = PWS_CHILD | PWS_VISIBLE | PWS_AUTOFONTSIZE | PES_MULTILINE | - PES_AUTORETURN | PES_MIDDLE | PES_CENTER; - acp.sTextColor = CPWL_Color(COLORTYPE_GRAY, 0); - m_pText->Create(acp); - - m_pDescription = new CPWL_Label; - PWL_CREATEPARAM dcp = cp; - dcp.pParentWnd = this; - dcp.dwFlags = PWS_CHILD | PWS_VISIBLE | PWS_AUTOFONTSIZE | PES_MULTILINE | - PES_AUTORETURN | PES_LEFT | PES_CENTER; - dcp.sTextColor = CPWL_Color(COLORTYPE_GRAY, 0); - m_pDescription->Create(dcp); -} - -void CPWL_Signature::DrawThisAppearance(CFX_RenderDevice* pDevice, - CFX_Matrix* pUser2Device) { - CPWL_Wnd::DrawThisAppearance(pDevice, pUser2Device); - - if (m_bFlagExist) { - CPWL_Utils::DrawIconAppStream( - pDevice, pUser2Device, PWL_ICONTYPE_FOXIT, - CPWL_Utils::GetCenterSquare(GetClientRect()), - CPWL_Color(COLORTYPE_RGB, 0.91f, 0.855f, 0.92f), - CPWL_Color(COLORTYPE_TRANSPARENT), 255); - } -} - -void CPWL_Signature::GetThisAppearanceStream(CFX_ByteTextBuf& sAppStream) { - CPWL_Wnd::GetThisAppearanceStream(sAppStream); -} diff --git a/fpdfsdk/src/pdfwindow/PWL_SpecialButton.cpp b/fpdfsdk/src/pdfwindow/PWL_SpecialButton.cpp deleted file mode 100644 index c19a233940..0000000000 --- a/fpdfsdk/src/pdfwindow/PWL_SpecialButton.cpp +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "fpdfsdk/include/pdfwindow/PWL_Button.h" -#include "fpdfsdk/include/pdfwindow/PWL_SpecialButton.h" -#include "fpdfsdk/include/pdfwindow/PWL_Utils.h" -#include "fpdfsdk/include/pdfwindow/PWL_Wnd.h" - -CPWL_PushButton::CPWL_PushButton() {} - -CPWL_PushButton::~CPWL_PushButton() {} - -CFX_ByteString CPWL_PushButton::GetClassName() const { - return "CPWL_PushButton"; -} - -CFX_FloatRect CPWL_PushButton::GetFocusRect() const { - return CPWL_Utils::DeflateRect(GetWindowRect(), (FX_FLOAT)GetBorderWidth()); -} - -CPWL_CheckBox::CPWL_CheckBox() : m_bChecked(false) {} - -CPWL_CheckBox::~CPWL_CheckBox() {} - -CFX_ByteString CPWL_CheckBox::GetClassName() const { - return "CPWL_CheckBox"; -} - -void CPWL_CheckBox::SetCheck(bool bCheck) { - m_bChecked = bCheck; -} - -bool CPWL_CheckBox::IsChecked() const { - return m_bChecked; -} - -FX_BOOL CPWL_CheckBox::OnLButtonUp(const CFX_FloatPoint& point, - FX_DWORD nFlag) { - if (IsReadOnly()) - return FALSE; - - SetCheck(!IsChecked()); - return TRUE; -} - -FX_BOOL CPWL_CheckBox::OnChar(FX_WORD nChar, FX_DWORD nFlag) { - SetCheck(!IsChecked()); - return TRUE; -} - -CPWL_RadioButton::CPWL_RadioButton() : m_bChecked(false) {} - -CPWL_RadioButton::~CPWL_RadioButton() {} - -CFX_ByteString CPWL_RadioButton::GetClassName() const { - return "CPWL_RadioButton"; -} - -FX_BOOL CPWL_RadioButton::OnLButtonUp(const CFX_FloatPoint& point, - FX_DWORD nFlag) { - if (IsReadOnly()) - return FALSE; - - SetCheck(TRUE); - return TRUE; -} - -void CPWL_RadioButton::SetCheck(bool bCheck) { - m_bChecked = bCheck; -} - -bool CPWL_RadioButton::IsChecked() const { - return m_bChecked; -} - -FX_BOOL CPWL_RadioButton::OnChar(FX_WORD nChar, FX_DWORD nFlag) { - SetCheck(TRUE); - return TRUE; -} diff --git a/fpdfsdk/src/pdfwindow/PWL_Utils.cpp b/fpdfsdk/src/pdfwindow/PWL_Utils.cpp deleted file mode 100644 index 926ab3f0b7..0000000000 --- a/fpdfsdk/src/pdfwindow/PWL_Utils.cpp +++ /dev/null @@ -1,3681 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "fpdfsdk/include/pdfwindow/PWL_Utils.h" - -#include <algorithm> - -#include "fpdfsdk/include/pdfwindow/PWL_Icon.h" -#include "fpdfsdk/include/pdfwindow/PWL_Wnd.h" - -#define IsFloatZero(f) ((f) < 0.0001 && (f) > -0.0001) -#define IsFloatBigger(fa, fb) ((fa) > (fb) && !IsFloatZero((fa) - (fb))) -#define IsFloatSmaller(fa, fb) ((fa) < (fb) && !IsFloatZero((fa) - (fb))) -#define IsFloatEqual(fa, fb) IsFloatZero((fa) - (fb)) - -CFX_ByteString CPWL_Utils::GetAppStreamFromArray(const CPWL_PathData* pPathData, - int32_t nCount) { - CFX_ByteTextBuf csAP; - - for (int32_t i = 0; i < nCount; i++) { - switch (pPathData[i].type) { - case PWLPT_MOVETO: - csAP << pPathData[i].point.x << " " << pPathData[i].point.y << " m\n"; - break; - case PWLPT_LINETO: - csAP << pPathData[i].point.x << " " << pPathData[i].point.y << " l\n"; - break; - case PWLPT_BEZIERTO: - csAP << pPathData[i].point.x << " " << pPathData[i].point.y << " " - << pPathData[i + 1].point.x << " " << pPathData[i + 1].point.y - << " " << pPathData[i + 2].point.x << " " - << pPathData[i + 2].point.y << " c\n"; - - i += 2; - break; - default: - break; - } - } - - return csAP.GetByteString(); -} - -void CPWL_Utils::GetPathDataFromArray(CFX_PathData& path, - const CPWL_PathData* pPathData, - int32_t nCount) { - path.SetPointCount(nCount); - - for (int32_t i = 0; i < nCount; i++) { - switch (pPathData[i].type) { - case PWLPT_MOVETO: - path.SetPoint(i, pPathData[i].point.x, pPathData[i].point.y, - FXPT_MOVETO); - break; - case PWLPT_LINETO: - path.SetPoint(i, pPathData[i].point.x, pPathData[i].point.y, - FXPT_LINETO); - break; - case PWLPT_BEZIERTO: - path.SetPoint(i, pPathData[i].point.x, pPathData[i].point.y, - FXPT_BEZIERTO); - break; - default: - break; - } - } -} - -CFX_FloatRect CPWL_Utils::MaxRect(const CFX_FloatRect& rect1, - const CFX_FloatRect& rect2) { - CFX_FloatRect rcRet; - - rcRet.left = PWL_MIN(rect1.left, rect2.left); - rcRet.bottom = PWL_MIN(rect1.bottom, rect2.bottom); - rcRet.right = PWL_MAX(rect1.right, rect2.right); - rcRet.top = PWL_MAX(rect1.top, rect2.top); - - return rcRet; -} - -CFX_FloatRect CPWL_Utils::OffsetRect(const CFX_FloatRect& rect, - FX_FLOAT x, - FX_FLOAT y) { - return CFX_FloatRect(rect.left + x, rect.bottom + y, rect.right + x, - rect.top + y); -} - -FX_BOOL CPWL_Utils::ContainsRect(const CFX_FloatRect& rcParent, - const CFX_FloatRect& rcChild) { - return rcChild.left >= rcParent.left && rcChild.bottom >= rcParent.bottom && - rcChild.right <= rcParent.right && rcChild.top <= rcParent.top; -} - -FX_BOOL CPWL_Utils::IntersectRect(const CFX_FloatRect& rect1, - const CFX_FloatRect& rect2) { - FX_FLOAT left = rect1.left > rect2.left ? rect1.left : rect2.left; - FX_FLOAT right = rect1.right < rect2.right ? rect1.right : rect2.right; - FX_FLOAT bottom = rect1.bottom > rect2.bottom ? rect1.bottom : rect2.bottom; - FX_FLOAT top = rect1.top < rect2.top ? rect1.top : rect2.top; - - return left < right && bottom < top; -} - -CFX_FloatPoint CPWL_Utils::OffsetPoint(const CFX_FloatPoint& point, - FX_FLOAT x, - FX_FLOAT y) { - return CFX_FloatPoint(point.x + x, point.y + y); -} - -CPVT_WordRange CPWL_Utils::OverlapWordRange(const CPVT_WordRange& wr1, - const CPVT_WordRange& wr2) { - CPVT_WordRange wrRet; - - if (wr2.EndPos.WordCmp(wr1.BeginPos) < 0 || - wr2.BeginPos.WordCmp(wr1.EndPos) > 0) - return wrRet; - if (wr1.EndPos.WordCmp(wr2.BeginPos) < 0 || - wr1.BeginPos.WordCmp(wr2.EndPos) > 0) - return wrRet; - - if (wr1.BeginPos.WordCmp(wr2.BeginPos) < 0) { - wrRet.BeginPos = wr2.BeginPos; - } else { - wrRet.BeginPos = wr1.BeginPos; - } - - if (wr1.EndPos.WordCmp(wr2.EndPos) < 0) { - wrRet.EndPos = wr1.EndPos; - } else { - wrRet.EndPos = wr2.EndPos; - } - - return wrRet; -} - -CFX_ByteString CPWL_Utils::GetAP_Check(const CFX_FloatRect& crBBox) { - const FX_FLOAT fWidth = crBBox.right - crBBox.left; - const FX_FLOAT fHeight = crBBox.top - crBBox.bottom; - - CPWL_Point pts[8][3] = {{CPWL_Point(0.28f, 0.52f), CPWL_Point(0.27f, 0.48f), - CPWL_Point(0.29f, 0.40f)}, - {CPWL_Point(0.30f, 0.33f), CPWL_Point(0.31f, 0.29f), - CPWL_Point(0.31f, 0.28f)}, - {CPWL_Point(0.39f, 0.28f), CPWL_Point(0.49f, 0.29f), - CPWL_Point(0.77f, 0.67f)}, - {CPWL_Point(0.76f, 0.68f), CPWL_Point(0.78f, 0.69f), - CPWL_Point(0.76f, 0.75f)}, - {CPWL_Point(0.76f, 0.75f), CPWL_Point(0.73f, 0.80f), - CPWL_Point(0.68f, 0.75f)}, - {CPWL_Point(0.68f, 0.74f), CPWL_Point(0.68f, 0.74f), - CPWL_Point(0.44f, 0.47f)}, - {CPWL_Point(0.43f, 0.47f), CPWL_Point(0.40f, 0.47f), - CPWL_Point(0.41f, 0.58f)}, - {CPWL_Point(0.40f, 0.60f), CPWL_Point(0.28f, 0.66f), - CPWL_Point(0.30f, 0.56f)}}; - - for (size_t i = 0; i < FX_ArraySize(pts); ++i) { - for (size_t j = 0; j < FX_ArraySize(pts[0]); ++j) { - pts[i][j].x = pts[i][j].x * fWidth + crBBox.left; - pts[i][j].y *= pts[i][j].y * fHeight + crBBox.bottom; - } - } - - CFX_ByteTextBuf csAP; - csAP << pts[0][0].x << " " << pts[0][0].y << " m\n"; - - for (size_t i = 0; i < FX_ArraySize(pts); ++i) { - size_t nNext = i < FX_ArraySize(pts) - 1 ? i + 1 : 0; - - FX_FLOAT px1 = pts[i][1].x - pts[i][0].x; - FX_FLOAT py1 = pts[i][1].y - pts[i][0].y; - FX_FLOAT px2 = pts[i][2].x - pts[nNext][0].x; - FX_FLOAT py2 = pts[i][2].y - pts[nNext][0].y; - - csAP << pts[i][0].x + px1 * FX_BEZIER << " " - << pts[i][0].y + py1 * FX_BEZIER << " " - << pts[nNext][0].x + px2 * FX_BEZIER << " " - << pts[nNext][0].y + py2 * FX_BEZIER << " " << pts[nNext][0].x << " " - << pts[nNext][0].y << " c\n"; - } - - return csAP.GetByteString(); -} - -CFX_ByteString CPWL_Utils::GetAP_Circle(const CFX_FloatRect& crBBox) { - CFX_ByteTextBuf csAP; - - FX_FLOAT fWidth = crBBox.right - crBBox.left; - FX_FLOAT fHeight = crBBox.top - crBBox.bottom; - - CFX_FloatPoint pt1(crBBox.left, crBBox.bottom + fHeight / 2); - CFX_FloatPoint pt2(crBBox.left + fWidth / 2, crBBox.top); - CFX_FloatPoint pt3(crBBox.right, crBBox.bottom + fHeight / 2); - CFX_FloatPoint pt4(crBBox.left + fWidth / 2, crBBox.bottom); - - csAP << pt1.x << " " << pt1.y << " m\n"; - - FX_FLOAT px = pt2.x - pt1.x; - FX_FLOAT py = pt2.y - pt1.y; - - csAP << pt1.x << " " << pt1.y + py * FX_BEZIER << " " - << pt2.x - px * FX_BEZIER << " " << pt2.y << " " << pt2.x << " " << pt2.y - << " c\n"; - - px = pt3.x - pt2.x; - py = pt2.y - pt3.y; - - csAP << pt2.x + px * FX_BEZIER << " " << pt2.y << " " << pt3.x << " " - << pt3.y + py * FX_BEZIER << " " << pt3.x << " " << pt3.y << " c\n"; - - px = pt3.x - pt4.x; - py = pt3.y - pt4.y; - - csAP << pt3.x << " " << pt3.y - py * FX_BEZIER << " " - << pt4.x + px * FX_BEZIER << " " << pt4.y << " " << pt4.x << " " << pt4.y - << " c\n"; - - px = pt4.x - pt1.x; - py = pt1.y - pt4.y; - - csAP << pt4.x - px * FX_BEZIER << " " << pt4.y << " " << pt1.x << " " - << pt1.y - py * FX_BEZIER << " " << pt1.x << " " << pt1.y << " c\n"; - - return csAP.GetByteString(); -} - -CFX_ByteString CPWL_Utils::GetAP_Cross(const CFX_FloatRect& crBBox) { - CFX_ByteTextBuf csAP; - - csAP << crBBox.left << " " << crBBox.top << " m\n"; - csAP << crBBox.right << " " << crBBox.bottom << " l\n"; - csAP << crBBox.left << " " << crBBox.bottom << " m\n"; - csAP << crBBox.right << " " << crBBox.top << " l\n"; - - return csAP.GetByteString(); -} - -CFX_ByteString CPWL_Utils::GetAP_Diamond(const CFX_FloatRect& crBBox) { - CFX_ByteTextBuf csAP; - - FX_FLOAT fWidth = crBBox.right - crBBox.left; - FX_FLOAT fHeight = crBBox.top - crBBox.bottom; - - CFX_FloatPoint pt1(crBBox.left, crBBox.bottom + fHeight / 2); - CFX_FloatPoint pt2(crBBox.left + fWidth / 2, crBBox.top); - CFX_FloatPoint pt3(crBBox.right, crBBox.bottom + fHeight / 2); - CFX_FloatPoint pt4(crBBox.left + fWidth / 2, crBBox.bottom); - - csAP << pt1.x << " " << pt1.y << " m\n"; - csAP << pt2.x << " " << pt2.y << " l\n"; - csAP << pt3.x << " " << pt3.y << " l\n"; - csAP << pt4.x << " " << pt4.y << " l\n"; - csAP << pt1.x << " " << pt1.y << " l\n"; - - return csAP.GetByteString(); -} - -CFX_ByteString CPWL_Utils::GetAP_Square(const CFX_FloatRect& crBBox) { - CFX_ByteTextBuf csAP; - - csAP << crBBox.left << " " << crBBox.top << " m\n"; - csAP << crBBox.right << " " << crBBox.top << " l\n"; - csAP << crBBox.right << " " << crBBox.bottom << " l\n"; - csAP << crBBox.left << " " << crBBox.bottom << " l\n"; - csAP << crBBox.left << " " << crBBox.top << " l\n"; - - return csAP.GetByteString(); -} - -CFX_ByteString CPWL_Utils::GetAP_Star(const CFX_FloatRect& crBBox) { - CFX_ByteTextBuf csAP; - - FX_FLOAT fRadius = - (crBBox.top - crBBox.bottom) / (1 + (FX_FLOAT)cos(FX_PI / 5.0f)); - CFX_FloatPoint ptCenter = CFX_FloatPoint((crBBox.left + crBBox.right) / 2.0f, - (crBBox.top + crBBox.bottom) / 2.0f); - - FX_FLOAT px[5], py[5]; - - FX_FLOAT fAngel = FX_PI / 10.0f; - - for (int32_t i = 0; i < 5; i++) { - px[i] = ptCenter.x + fRadius * (FX_FLOAT)cos(fAngel); - py[i] = ptCenter.y + fRadius * (FX_FLOAT)sin(fAngel); - - fAngel += FX_PI * 2 / 5.0f; - } - - csAP << px[0] << " " << py[0] << " m\n"; - - int32_t nNext = 0; - for (int32_t j = 0; j < 5; j++) { - nNext += 2; - if (nNext >= 5) - nNext -= 5; - csAP << px[nNext] << " " << py[nNext] << " l\n"; - } - - return csAP.GetByteString(); -} - -CFX_ByteString CPWL_Utils::GetAP_HalfCircle(const CFX_FloatRect& crBBox, - FX_FLOAT fRotate) { - CFX_ByteTextBuf csAP; - - FX_FLOAT fWidth = crBBox.right - crBBox.left; - FX_FLOAT fHeight = crBBox.top - crBBox.bottom; - - CFX_FloatPoint pt1(-fWidth / 2, 0); - CFX_FloatPoint pt2(0, fHeight / 2); - CFX_FloatPoint pt3(fWidth / 2, 0); - - FX_FLOAT px, py; - - csAP << cos(fRotate) << " " << sin(fRotate) << " " << -sin(fRotate) << " " - << cos(fRotate) << " " << crBBox.left + fWidth / 2 << " " - << crBBox.bottom + fHeight / 2 << " cm\n"; - - csAP << pt1.x << " " << pt1.y << " m\n"; - - px = pt2.x - pt1.x; - py = pt2.y - pt1.y; - - csAP << pt1.x << " " << pt1.y + py * FX_BEZIER << " " - << pt2.x - px * FX_BEZIER << " " << pt2.y << " " << pt2.x << " " << pt2.y - << " c\n"; - - px = pt3.x - pt2.x; - py = pt2.y - pt3.y; - - csAP << pt2.x + px * FX_BEZIER << " " << pt2.y << " " << pt3.x << " " - << pt3.y + py * FX_BEZIER << " " << pt3.x << " " << pt3.y << " c\n"; - - return csAP.GetByteString(); -} - -CFX_FloatRect CPWL_Utils::InflateRect(const CFX_FloatRect& rcRect, - FX_FLOAT fSize) { - if (rcRect.IsEmpty()) - return rcRect; - - CFX_FloatRect rcNew(rcRect.left - fSize, rcRect.bottom - fSize, - rcRect.right + fSize, rcRect.top + fSize); - rcNew.Normalize(); - return rcNew; -} - -CFX_FloatRect CPWL_Utils::DeflateRect(const CFX_FloatRect& rcRect, - FX_FLOAT fSize) { - if (rcRect.IsEmpty()) - return rcRect; - - CFX_FloatRect rcNew(rcRect.left + fSize, rcRect.bottom + fSize, - rcRect.right - fSize, rcRect.top - fSize); - rcNew.Normalize(); - return rcNew; -} - -CFX_FloatRect CPWL_Utils::ScaleRect(const CFX_FloatRect& rcRect, - FX_FLOAT fScale) { - FX_FLOAT fHalfWidth = (rcRect.right - rcRect.left) / 2.0f; - FX_FLOAT fHalfHeight = (rcRect.top - rcRect.bottom) / 2.0f; - - CFX_FloatPoint ptCenter = CFX_FloatPoint((rcRect.left + rcRect.right) / 2, - (rcRect.top + rcRect.bottom) / 2); - - return CFX_FloatRect( - ptCenter.x - fHalfWidth * fScale, ptCenter.y - fHalfHeight * fScale, - ptCenter.x + fHalfWidth * fScale, ptCenter.y + fHalfHeight * fScale); -} - -CFX_ByteString CPWL_Utils::GetRectFillAppStream(const CFX_FloatRect& rect, - const CPWL_Color& color) { - CFX_ByteTextBuf sAppStream; - - CFX_ByteString sColor = GetColorAppStream(color, TRUE); - if (sColor.GetLength() > 0) { - sAppStream << "q\n" << sColor; - sAppStream << rect.left << " " << rect.bottom << " " - << rect.right - rect.left << " " << rect.top - rect.bottom - << " re f\nQ\n"; - } - - return sAppStream.GetByteString(); -} - -CFX_ByteString CPWL_Utils::GetCircleFillAppStream(const CFX_FloatRect& rect, - const CPWL_Color& color) { - CFX_ByteTextBuf sAppStream; - - CFX_ByteString sColor = GetColorAppStream(color, TRUE); - if (sColor.GetLength() > 0) { - sAppStream << "q\n" << sColor << CPWL_Utils::GetAP_Circle(rect) << "f\nQ\n"; - } - - return sAppStream.GetByteString(); -} - -CFX_FloatRect CPWL_Utils::GetCenterSquare(const CFX_FloatRect& rect) { - FX_FLOAT fWidth = rect.right - rect.left; - FX_FLOAT fHeight = rect.top - rect.bottom; - - FX_FLOAT fCenterX = (rect.left + rect.right) / 2.0f; - FX_FLOAT fCenterY = (rect.top + rect.bottom) / 2.0f; - - FX_FLOAT fRadius = (fWidth > fHeight) ? fHeight / 2 : fWidth / 2; - - return CFX_FloatRect(fCenterX - fRadius, fCenterY - fRadius, - fCenterX + fRadius, fCenterY + fRadius); -} - -CFX_ByteString CPWL_Utils::GetEditAppStream(IFX_Edit* pEdit, - const CFX_FloatPoint& ptOffset, - const CPVT_WordRange* pRange, - FX_BOOL bContinuous, - FX_WORD SubWord) { - return IFX_Edit::GetEditAppearanceStream(pEdit, ptOffset, pRange, bContinuous, - SubWord); -} - -CFX_ByteString CPWL_Utils::GetEditSelAppStream(IFX_Edit* pEdit, - const CFX_FloatPoint& ptOffset, - const CPVT_WordRange* pRange) { - return IFX_Edit::GetSelectAppearanceStream(pEdit, ptOffset, pRange); -} - -static CFX_ByteString GetSquigglyAppearanceStream(FX_FLOAT fStartX, - FX_FLOAT fEndX, - FX_FLOAT fY, - FX_FLOAT fStep) { - CFX_ByteTextBuf sRet; - - sRet << "0 w\n" << fStartX << " " << fY << " m\n"; - - FX_FLOAT fx; - int32_t i; - - for (i = 1, fx = fStartX + fStep; fx < fEndX; fx += fStep, i++) { - sRet << fx << " " << fY + (i & 1) * fStep << " l\n"; - } - - sRet << "S\n"; - - return sRet.GetByteString(); -} - -static CFX_ByteString GetWordSpellCheckAppearanceStream( - IFX_Edit_Iterator* pIterator, - const CFX_FloatPoint& ptOffset, - const CPVT_WordRange& wrWord) { - CFX_ByteTextBuf sRet; - - FX_FLOAT fStartX = 0.0f; - FX_FLOAT fEndX = 0.0f; - FX_FLOAT fY = 0.0f; - FX_FLOAT fStep = 0.0f; - - FX_BOOL bBreak = FALSE; - - if (pIterator) { - pIterator->SetAt(wrWord.BeginPos); - - do { - CPVT_WordPlace place = pIterator->GetAt(); - - CPVT_Line line; - if (pIterator->GetLine(line)) { - fY = line.ptLine.y; - fStep = (line.fLineAscent - line.fLineDescent) / 16.0f; - } - - if (place.LineCmp(wrWord.BeginPos) == 0) { - pIterator->SetAt(wrWord.BeginPos); - CPVT_Word word; - if (pIterator->GetWord(word)) { - fStartX = word.ptWord.x; - } - } else { - fStartX = line.ptLine.x; - } - - if (place.LineCmp(wrWord.EndPos) == 0) { - pIterator->SetAt(wrWord.EndPos); - CPVT_Word word; - if (pIterator->GetWord(word)) { - fEndX = word.ptWord.x + word.fWidth; - } - - bBreak = TRUE; - } else { - fEndX = line.ptLine.x + line.fLineWidth; - } - - sRet << GetSquigglyAppearanceStream( - fStartX + ptOffset.x, fEndX + ptOffset.x, fY + ptOffset.y, fStep); - - if (bBreak) - break; - } while (pIterator->NextLine()); - } - - return sRet.GetByteString(); -} - -CFX_ByteString CPWL_Utils::GetSpellCheckAppStream( - IFX_Edit* pEdit, - IPWL_SpellCheck* pSpellCheck, - const CFX_FloatPoint& ptOffset, - const CPVT_WordRange* pRange) { - CFX_ByteTextBuf sRet; - - if (pRange && pRange->IsExist()) { - if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator()) { - pIterator->SetAt(pRange->BeginPos); - - FX_BOOL bLatinWord = FALSE; - CPVT_WordPlace wpWordStart; - CFX_ByteString sWord; - - CPVT_WordPlace oldplace; - while (pIterator->NextWord()) { - CPVT_WordPlace place = pIterator->GetAt(); - if (pRange && place.WordCmp(pRange->EndPos) > 0) - break; - - CPVT_Word word; - if (pIterator->GetWord(word)) { - if (FX_EDIT_ISLATINWORD(word.Word)) { - if (!bLatinWord) { - wpWordStart = place; - bLatinWord = TRUE; - } - - sWord += (char)word.Word; - oldplace = place; - } else { - if (bLatinWord) { - if (!pSpellCheck->CheckWord(sWord)) { - sRet << GetWordSpellCheckAppearanceStream( - pIterator, ptOffset, CPVT_WordRange(wpWordStart, oldplace)); - pIterator->SetAt(place); - } - bLatinWord = FALSE; - } - - sWord.Empty(); - } - } else { - if (bLatinWord) { - if (!pSpellCheck->CheckWord(sWord)) - sRet << GetWordSpellCheckAppearanceStream( - pIterator, ptOffset, CPVT_WordRange(wpWordStart, oldplace)); - bLatinWord = FALSE; - sWord.Empty(); - } - } - } - - if (bLatinWord) { - if (!pSpellCheck->CheckWord(sWord)) - sRet << GetWordSpellCheckAppearanceStream( - pIterator, ptOffset, CPVT_WordRange(wpWordStart, oldplace)); - - bLatinWord = FALSE; - sWord.Empty(); - } - } - } - - return sRet.GetByteString(); -} - -CFX_ByteString CPWL_Utils::GetTextAppStream(const CFX_FloatRect& rcBBox, - IFX_Edit_FontMap* pFontMap, - const CFX_WideString& sText, - int32_t nAlignmentH, - int32_t nAlignmentV, - FX_FLOAT fFontSize, - FX_BOOL bMultiLine, - FX_BOOL bAutoReturn, - const CPWL_Color& crText) { - CFX_ByteTextBuf sRet; - - if (IFX_Edit* pEdit = IFX_Edit::NewEdit()) { - pEdit->SetFontMap(pFontMap); - pEdit->SetPlateRect(rcBBox); - pEdit->SetAlignmentH(nAlignmentH); - pEdit->SetAlignmentV(nAlignmentV); - pEdit->SetMultiLine(bMultiLine); - pEdit->SetAutoReturn(bAutoReturn); - if (IsFloatZero(fFontSize)) - pEdit->SetAutoFontSize(TRUE); - else - pEdit->SetFontSize(fFontSize); - - pEdit->Initialize(); - pEdit->SetText(sText.c_str()); - - CFX_ByteString sEdit = - CPWL_Utils::GetEditAppStream(pEdit, CFX_FloatPoint(0.0f, 0.0f)); - if (sEdit.GetLength() > 0) { - sRet << "BT\n" << CPWL_Utils::GetColorAppStream(crText) << sEdit - << "ET\n"; - } - IFX_Edit::DelEdit(pEdit); - } - - return sRet.GetByteString(); -} - -CFX_ByteString CPWL_Utils::GetPushButtonAppStream(const CFX_FloatRect& rcBBox, - IFX_Edit_FontMap* pFontMap, - CPDF_Stream* pIconStream, - CPDF_IconFit& IconFit, - const CFX_WideString& sLabel, - const CPWL_Color& crText, - FX_FLOAT fFontSize, - int32_t nLayOut) { - const FX_FLOAT fAutoFontScale = 1.0f / 3.0f; - - if (IFX_Edit* pEdit = IFX_Edit::NewEdit()) { - pEdit->SetFontMap(pFontMap); - pEdit->SetAlignmentH(1); - pEdit->SetAlignmentV(1); - pEdit->SetMultiLine(FALSE); - pEdit->SetAutoReturn(FALSE); - if (IsFloatZero(fFontSize)) - pEdit->SetAutoFontSize(TRUE); - else - pEdit->SetFontSize(fFontSize); - - pEdit->Initialize(); - pEdit->SetText(sLabel.c_str()); - - CFX_FloatRect rcLabelContent = pEdit->GetContentRect(); - CPWL_Icon Icon; - PWL_CREATEPARAM cp; - cp.dwFlags = PWS_VISIBLE; - Icon.Create(cp); - Icon.SetIconFit(&IconFit); - Icon.SetPDFStream(pIconStream); - - CFX_FloatRect rcLabel = CFX_FloatRect(0, 0, 0, 0); - CFX_FloatRect rcIcon = CFX_FloatRect(0, 0, 0, 0); - FX_FLOAT fWidth = 0.0f; - FX_FLOAT fHeight = 0.0f; - - switch (nLayOut) { - case PPBL_LABEL: - rcLabel = rcBBox; - rcIcon = CFX_FloatRect(0, 0, 0, 0); - break; - case PPBL_ICON: - rcIcon = rcBBox; - rcLabel = CFX_FloatRect(0, 0, 0, 0); - break; - case PPBL_ICONTOPLABELBOTTOM: - - if (pIconStream) { - if (IsFloatZero(fFontSize)) { - fHeight = rcBBox.top - rcBBox.bottom; - rcLabel = CFX_FloatRect(rcBBox.left, rcBBox.bottom, rcBBox.right, - rcBBox.bottom + fHeight * fAutoFontScale); - rcIcon = CFX_FloatRect(rcBBox.left, rcLabel.top, rcBBox.right, - rcBBox.top); - } else { - fHeight = rcLabelContent.Height(); - - if (rcBBox.bottom + fHeight > rcBBox.top) { - rcIcon = CFX_FloatRect(0, 0, 0, 0); - rcLabel = rcBBox; - } else { - rcLabel = CFX_FloatRect(rcBBox.left, rcBBox.bottom, rcBBox.right, - rcBBox.bottom + fHeight); - rcIcon = CFX_FloatRect(rcBBox.left, rcLabel.top, rcBBox.right, - rcBBox.top); - } - } - } else { - rcLabel = rcBBox; - rcIcon = CFX_FloatRect(0, 0, 0, 0); - } - - break; - case PPBL_LABELTOPICONBOTTOM: - - if (pIconStream) { - if (IsFloatZero(fFontSize)) { - fHeight = rcBBox.top - rcBBox.bottom; - rcLabel = CFX_FloatRect(rcBBox.left, - rcBBox.top - fHeight * fAutoFontScale, - rcBBox.right, rcBBox.top); - rcIcon = CFX_FloatRect(rcBBox.left, rcBBox.bottom, rcBBox.right, - rcLabel.bottom); - } else { - fHeight = rcLabelContent.Height(); - - if (rcBBox.bottom + fHeight > rcBBox.top) { - rcIcon = CFX_FloatRect(0, 0, 0, 0); - rcLabel = rcBBox; - } else { - rcLabel = CFX_FloatRect(rcBBox.left, rcBBox.top - fHeight, - rcBBox.right, rcBBox.top); - rcIcon = CFX_FloatRect(rcBBox.left, rcBBox.bottom, rcBBox.right, - rcLabel.bottom); - } - } - } else { - rcLabel = rcBBox; - rcIcon = CFX_FloatRect(0, 0, 0, 0); - } - - break; - case PPBL_ICONLEFTLABELRIGHT: - - if (pIconStream) { - if (IsFloatZero(fFontSize)) { - fWidth = rcBBox.right - rcBBox.left; - rcLabel = CFX_FloatRect(rcBBox.right - fWidth * fAutoFontScale, - rcBBox.bottom, rcBBox.right, rcBBox.top); - rcIcon = CFX_FloatRect(rcBBox.left, rcBBox.bottom, rcLabel.left, - rcBBox.top); - - if (rcLabelContent.Width() < fWidth * fAutoFontScale) { - } else { - if (rcLabelContent.Width() < fWidth) { - rcLabel = - CFX_FloatRect(rcBBox.right - rcLabelContent.Width(), - rcBBox.bottom, rcBBox.right, rcBBox.top); - rcIcon = CFX_FloatRect(rcBBox.left, rcBBox.bottom, rcLabel.left, - rcBBox.top); - } else { - rcLabel = rcBBox; - rcIcon = CFX_FloatRect(0, 0, 0, 0); - } - } - } else { - fWidth = rcLabelContent.Width(); - - if (rcBBox.left + fWidth > rcBBox.right) { - rcLabel = rcBBox; - rcIcon = CFX_FloatRect(0, 0, 0, 0); - } else { - rcLabel = CFX_FloatRect(rcBBox.right - fWidth, rcBBox.bottom, - rcBBox.right, rcBBox.top); - rcIcon = CFX_FloatRect(rcBBox.left, rcBBox.bottom, rcLabel.left, - rcBBox.top); - } - } - } else { - rcLabel = rcBBox; - rcIcon = CFX_FloatRect(0, 0, 0, 0); - } - - break; - case PPBL_LABELLEFTICONRIGHT: - - if (pIconStream) { - if (IsFloatZero(fFontSize)) { - fWidth = rcBBox.right - rcBBox.left; - rcLabel = CFX_FloatRect(rcBBox.left, rcBBox.bottom, - rcBBox.left + fWidth * fAutoFontScale, - rcBBox.top); - rcIcon = CFX_FloatRect(rcLabel.right, rcBBox.bottom, rcBBox.right, - rcBBox.top); - - if (rcLabelContent.Width() < fWidth * fAutoFontScale) { - } else { - if (rcLabelContent.Width() < fWidth) { - rcLabel = CFX_FloatRect(rcBBox.left, rcBBox.bottom, - rcBBox.left + rcLabelContent.Width(), - rcBBox.top); - rcIcon = CFX_FloatRect(rcLabel.right, rcBBox.bottom, - rcBBox.right, rcBBox.top); - } else { - rcLabel = rcBBox; - rcIcon = CFX_FloatRect(0, 0, 0, 0); - } - } - } else { - fWidth = rcLabelContent.Width(); - - if (rcBBox.left + fWidth > rcBBox.right) { - rcLabel = rcBBox; - rcIcon = CFX_FloatRect(0, 0, 0, 0); - } else { - rcLabel = CFX_FloatRect(rcBBox.left, rcBBox.bottom, - rcBBox.left + fWidth, rcBBox.top); - rcIcon = CFX_FloatRect(rcLabel.right, rcBBox.bottom, rcBBox.right, - rcBBox.top); - } - } - } else { - rcLabel = rcBBox; - rcIcon = CFX_FloatRect(0, 0, 0, 0); - } - - break; - case PPBL_LABELOVERICON: - rcLabel = rcBBox; - rcIcon = rcBBox; - break; - } - - CFX_ByteTextBuf sAppStream, sTemp; - - if (!rcIcon.IsEmpty()) { - Icon.Move(rcIcon, FALSE, FALSE); - sTemp << Icon.GetImageAppStream(); - } - - Icon.Destroy(); - - if (!rcLabel.IsEmpty()) { - pEdit->SetPlateRect(rcLabel); - CFX_ByteString sEdit = - CPWL_Utils::GetEditAppStream(pEdit, CFX_FloatPoint(0.0f, 0.0f)); - if (sEdit.GetLength() > 0) { - sTemp << "BT\n" << CPWL_Utils::GetColorAppStream(crText) << sEdit - << "ET\n"; - } - } - - IFX_Edit::DelEdit(pEdit); - - if (sTemp.GetSize() > 0) { - sAppStream << "q\n" << rcBBox.left << " " << rcBBox.bottom << " " - << rcBBox.right - rcBBox.left << " " - << rcBBox.top - rcBBox.bottom << " re W n\n"; - sAppStream << sTemp << "Q\n"; - } - - return sAppStream.GetByteString(); - } - - return ""; -} - -CFX_ByteString CPWL_Utils::GetColorAppStream(const CPWL_Color& color, - const FX_BOOL& bFillOrStroke) { - CFX_ByteTextBuf sColorStream; - - switch (color.nColorType) { - case COLORTYPE_RGB: - sColorStream << color.fColor1 << " " << color.fColor2 << " " - << color.fColor3 << " " << (bFillOrStroke ? "rg" : "RG") - << "\n"; - break; - case COLORTYPE_GRAY: - sColorStream << color.fColor1 << " " << (bFillOrStroke ? "g" : "G") - << "\n"; - break; - case COLORTYPE_CMYK: - sColorStream << color.fColor1 << " " << color.fColor2 << " " - << color.fColor3 << " " << color.fColor4 << " " - << (bFillOrStroke ? "k" : "K") << "\n"; - break; - } - - return sColorStream.GetByteString(); -} - -CFX_ByteString CPWL_Utils::GetBorderAppStream(const CFX_FloatRect& rect, - FX_FLOAT fWidth, - const CPWL_Color& color, - const CPWL_Color& crLeftTop, - const CPWL_Color& crRightBottom, - int32_t nStyle, - const CPWL_Dash& dash) { - CFX_ByteTextBuf sAppStream; - CFX_ByteString sColor; - - FX_FLOAT fLeft = rect.left; - FX_FLOAT fRight = rect.right; - FX_FLOAT fTop = rect.top; - FX_FLOAT fBottom = rect.bottom; - - if (fWidth > 0.0f) { - FX_FLOAT fHalfWidth = fWidth / 2.0f; - - sAppStream << "q\n"; - - switch (nStyle) { - default: - case PBS_SOLID: - sColor = CPWL_Utils::GetColorAppStream(color, TRUE); - if (sColor.GetLength() > 0) { - sAppStream << sColor; - sAppStream << fLeft << " " << fBottom << " " << fRight - fLeft << " " - << fTop - fBottom << " re\n"; - sAppStream << fLeft + fWidth << " " << fBottom + fWidth << " " - << fRight - fLeft - fWidth * 2 << " " - << fTop - fBottom - fWidth * 2 << " re\n"; - sAppStream << "f*\n"; - } - break; - case PBS_DASH: - sColor = CPWL_Utils::GetColorAppStream(color, FALSE); - if (sColor.GetLength() > 0) { - sAppStream << sColor; - sAppStream << fWidth << " w" - << " [" << dash.nDash << " " << dash.nGap << "] " - << dash.nPhase << " d\n"; - sAppStream << fLeft + fWidth / 2 << " " << fBottom + fWidth / 2 - << " m\n"; - sAppStream << fLeft + fWidth / 2 << " " << fTop - fWidth / 2 - << " l\n"; - sAppStream << fRight - fWidth / 2 << " " << fTop - fWidth / 2 - << " l\n"; - sAppStream << fRight - fWidth / 2 << " " << fBottom + fWidth / 2 - << " l\n"; - sAppStream << fLeft + fWidth / 2 << " " << fBottom + fWidth / 2 - << " l S\n"; - } - break; - case PBS_BEVELED: - case PBS_INSET: - sColor = CPWL_Utils::GetColorAppStream(crLeftTop, TRUE); - if (sColor.GetLength() > 0) { - sAppStream << sColor; - sAppStream << fLeft + fHalfWidth << " " << fBottom + fHalfWidth - << " m\n"; - sAppStream << fLeft + fHalfWidth << " " << fTop - fHalfWidth - << " l\n"; - sAppStream << fRight - fHalfWidth << " " << fTop - fHalfWidth - << " l\n"; - sAppStream << fRight - fHalfWidth * 2 << " " << fTop - fHalfWidth * 2 - << " l\n"; - sAppStream << fLeft + fHalfWidth * 2 << " " << fTop - fHalfWidth * 2 - << " l\n"; - sAppStream << fLeft + fHalfWidth * 2 << " " - << fBottom + fHalfWidth * 2 << " l f\n"; - } - - sColor = CPWL_Utils::GetColorAppStream(crRightBottom, TRUE); - if (sColor.GetLength() > 0) { - sAppStream << sColor; - sAppStream << fRight - fHalfWidth << " " << fTop - fHalfWidth - << " m\n"; - sAppStream << fRight - fHalfWidth << " " << fBottom + fHalfWidth - << " l\n"; - sAppStream << fLeft + fHalfWidth << " " << fBottom + fHalfWidth - << " l\n"; - sAppStream << fLeft + fHalfWidth * 2 << " " - << fBottom + fHalfWidth * 2 << " l\n"; - sAppStream << fRight - fHalfWidth * 2 << " " - << fBottom + fHalfWidth * 2 << " l\n"; - sAppStream << fRight - fHalfWidth * 2 << " " << fTop - fHalfWidth * 2 - << " l f\n"; - } - - sColor = CPWL_Utils::GetColorAppStream(color, TRUE); - if (sColor.GetLength() > 0) { - sAppStream << sColor; - sAppStream << fLeft << " " << fBottom << " " << fRight - fLeft << " " - << fTop - fBottom << " re\n"; - sAppStream << fLeft + fHalfWidth << " " << fBottom + fHalfWidth << " " - << fRight - fLeft - fHalfWidth * 2 << " " - << fTop - fBottom - fHalfWidth * 2 << " re f*\n"; - } - break; - case PBS_UNDERLINED: - sColor = CPWL_Utils::GetColorAppStream(color, FALSE); - if (sColor.GetLength() > 0) { - sAppStream << sColor; - sAppStream << fWidth << " w\n"; - sAppStream << fLeft << " " << fBottom + fWidth / 2 << " m\n"; - sAppStream << fRight << " " << fBottom + fWidth / 2 << " l S\n"; - } - break; - } - - sAppStream << "Q\n"; - } - - return sAppStream.GetByteString(); -} - -CFX_ByteString CPWL_Utils::GetCircleBorderAppStream( - const CFX_FloatRect& rect, - FX_FLOAT fWidth, - const CPWL_Color& color, - const CPWL_Color& crLeftTop, - const CPWL_Color& crRightBottom, - int32_t nStyle, - const CPWL_Dash& dash) { - CFX_ByteTextBuf sAppStream; - CFX_ByteString sColor; - - if (fWidth > 0.0f) { - sAppStream << "q\n"; - - switch (nStyle) { - default: - case PBS_SOLID: - case PBS_UNDERLINED: { - sColor = CPWL_Utils::GetColorAppStream(color, FALSE); - if (sColor.GetLength() > 0) { - sAppStream << "q\n" << fWidth << " w\n" << sColor - << CPWL_Utils::GetAP_Circle( - CPWL_Utils::DeflateRect(rect, fWidth / 2.0f)) - << " S\nQ\n"; - } - } break; - case PBS_DASH: { - sColor = CPWL_Utils::GetColorAppStream(color, FALSE); - if (sColor.GetLength() > 0) { - sAppStream << "q\n" << fWidth << " w\n" - << "[" << dash.nDash << " " << dash.nGap << "] " - << dash.nPhase << " d\n" << sColor - << CPWL_Utils::GetAP_Circle( - CPWL_Utils::DeflateRect(rect, fWidth / 2.0f)) - << " S\nQ\n"; - } - } break; - case PBS_BEVELED: { - FX_FLOAT fHalfWidth = fWidth / 2.0f; - - sColor = CPWL_Utils::GetColorAppStream(color, FALSE); - if (sColor.GetLength() > 0) { - sAppStream << "q\n" << fHalfWidth << " w\n" << sColor - << CPWL_Utils::GetAP_Circle(rect) << " S\nQ\n"; - } - - sColor = CPWL_Utils::GetColorAppStream(crLeftTop, FALSE); - if (sColor.GetLength() > 0) { - sAppStream << "q\n" << fHalfWidth << " w\n" << sColor - << CPWL_Utils::GetAP_HalfCircle( - CPWL_Utils::DeflateRect(rect, fHalfWidth * 0.75f), - FX_PI / 4.0f) - << " S\nQ\n"; - } - - sColor = CPWL_Utils::GetColorAppStream(crRightBottom, FALSE); - if (sColor.GetLength() > 0) { - sAppStream << "q\n" << fHalfWidth << " w\n" << sColor - << CPWL_Utils::GetAP_HalfCircle( - CPWL_Utils::DeflateRect(rect, fHalfWidth * 0.75f), - FX_PI * 5 / 4.0f) - << " S\nQ\n"; - } - } break; - case PBS_INSET: { - FX_FLOAT fHalfWidth = fWidth / 2.0f; - - sColor = CPWL_Utils::GetColorAppStream(color, FALSE); - if (sColor.GetLength() > 0) { - sAppStream << "q\n" << fHalfWidth << " w\n" << sColor - << CPWL_Utils::GetAP_Circle(rect) << " S\nQ\n"; - } - - sColor = CPWL_Utils::GetColorAppStream(crLeftTop, FALSE); - if (sColor.GetLength() > 0) { - sAppStream << "q\n" << fHalfWidth << " w\n" << sColor - << CPWL_Utils::GetAP_HalfCircle( - CPWL_Utils::DeflateRect(rect, fHalfWidth * 0.75f), - FX_PI / 4.0f) - << " S\nQ\n"; - } - - sColor = CPWL_Utils::GetColorAppStream(crRightBottom, FALSE); - if (sColor.GetLength() > 0) { - sAppStream << "q\n" << fHalfWidth << " w\n" << sColor - << CPWL_Utils::GetAP_HalfCircle( - CPWL_Utils::DeflateRect(rect, fHalfWidth * 0.75f), - FX_PI * 5 / 4.0f) - << " S\nQ\n"; - } - } break; - } - - sAppStream << "Q\n"; - } - - return sAppStream.GetByteString(); -} - -CPWL_Color CPWL_Utils::SubstractColor(const CPWL_Color& sColor, - FX_FLOAT fColorSub) { - CPWL_Color sRet; - sRet.nColorType = sColor.nColorType; - - switch (sColor.nColorType) { - case COLORTYPE_TRANSPARENT: - sRet.nColorType = COLORTYPE_RGB; - sRet.fColor1 = PWL_MAX(1 - fColorSub, 0.0f); - sRet.fColor2 = PWL_MAX(1 - fColorSub, 0.0f); - sRet.fColor3 = PWL_MAX(1 - fColorSub, 0.0f); - break; - case COLORTYPE_RGB: - case COLORTYPE_GRAY: - case COLORTYPE_CMYK: - sRet.fColor1 = PWL_MAX(sColor.fColor1 - fColorSub, 0.0f); - sRet.fColor2 = PWL_MAX(sColor.fColor2 - fColorSub, 0.0f); - sRet.fColor3 = PWL_MAX(sColor.fColor3 - fColorSub, 0.0f); - sRet.fColor4 = PWL_MAX(sColor.fColor4 - fColorSub, 0.0f); - break; - } - - return sRet; -} - -CPWL_Color CPWL_Utils::DevideColor(const CPWL_Color& sColor, - FX_FLOAT fColorDevide) { - CPWL_Color sRet; - sRet.nColorType = sColor.nColorType; - - switch (sColor.nColorType) { - case COLORTYPE_TRANSPARENT: - sRet.nColorType = COLORTYPE_RGB; - sRet.fColor1 = 1 / fColorDevide; - sRet.fColor2 = 1 / fColorDevide; - sRet.fColor3 = 1 / fColorDevide; - break; - case COLORTYPE_RGB: - case COLORTYPE_GRAY: - case COLORTYPE_CMYK: - sRet = sColor; - sRet.fColor1 /= fColorDevide; - sRet.fColor2 /= fColorDevide; - sRet.fColor3 /= fColorDevide; - sRet.fColor4 /= fColorDevide; - break; - } - - return sRet; -} - -CFX_ByteString CPWL_Utils::GetAppStream_Check(const CFX_FloatRect& rcBBox, - const CPWL_Color& crText) { - CFX_ByteTextBuf sAP; - sAP << "q\n" << CPWL_Utils::GetColorAppStream(crText, TRUE) - << CPWL_Utils::GetAP_Check(rcBBox) << "f\nQ\n"; - return sAP.GetByteString(); -} - -CFX_ByteString CPWL_Utils::GetAppStream_Circle(const CFX_FloatRect& rcBBox, - const CPWL_Color& crText) { - CFX_ByteTextBuf sAP; - sAP << "q\n" << CPWL_Utils::GetColorAppStream(crText, TRUE) - << CPWL_Utils::GetAP_Circle(rcBBox) << "f\nQ\n"; - return sAP.GetByteString(); -} - -CFX_ByteString CPWL_Utils::GetAppStream_Cross(const CFX_FloatRect& rcBBox, - const CPWL_Color& crText) { - CFX_ByteTextBuf sAP; - sAP << "q\n" << CPWL_Utils::GetColorAppStream(crText, FALSE) - << CPWL_Utils::GetAP_Cross(rcBBox) << "S\nQ\n"; - return sAP.GetByteString(); -} - -CFX_ByteString CPWL_Utils::GetAppStream_Diamond(const CFX_FloatRect& rcBBox, - const CPWL_Color& crText) { - CFX_ByteTextBuf sAP; - sAP << "q\n1 w\n" << CPWL_Utils::GetColorAppStream(crText, TRUE) - << CPWL_Utils::GetAP_Diamond(rcBBox) << "f\nQ\n"; - return sAP.GetByteString(); -} - -CFX_ByteString CPWL_Utils::GetAppStream_Square(const CFX_FloatRect& rcBBox, - const CPWL_Color& crText) { - CFX_ByteTextBuf sAP; - sAP << "q\n" << CPWL_Utils::GetColorAppStream(crText, TRUE) - << CPWL_Utils::GetAP_Square(rcBBox) << "f\nQ\n"; - return sAP.GetByteString(); -} - -CFX_ByteString CPWL_Utils::GetAppStream_Star(const CFX_FloatRect& rcBBox, - const CPWL_Color& crText) { - CFX_ByteTextBuf sAP; - sAP << "q\n" << CPWL_Utils::GetColorAppStream(crText, TRUE) - << CPWL_Utils::GetAP_Star(rcBBox) << "f\nQ\n"; - return sAP.GetByteString(); -} - -CFX_ByteString CPWL_Utils::GetCheckBoxAppStream(const CFX_FloatRect& rcBBox, - int32_t nStyle, - const CPWL_Color& crText) { - CFX_FloatRect rcCenter = GetCenterSquare(rcBBox); - switch (nStyle) { - default: - case PCS_CHECK: - return GetAppStream_Check(rcCenter, crText); - case PCS_CIRCLE: - return GetAppStream_Circle(ScaleRect(rcCenter, 2.0f / 3.0f), crText); - case PCS_CROSS: - return GetAppStream_Cross(rcCenter, crText); - case PCS_DIAMOND: - return GetAppStream_Diamond(ScaleRect(rcCenter, 2.0f / 3.0f), crText); - case PCS_SQUARE: - return GetAppStream_Square(ScaleRect(rcCenter, 2.0f / 3.0f), crText); - case PCS_STAR: - return GetAppStream_Star(ScaleRect(rcCenter, 2.0f / 3.0f), crText); - } -} - -CFX_ByteString CPWL_Utils::GetRadioButtonAppStream(const CFX_FloatRect& rcBBox, - int32_t nStyle, - const CPWL_Color& crText) { - CFX_FloatRect rcCenter = GetCenterSquare(rcBBox); - switch (nStyle) { - default: - case PCS_CHECK: - return GetAppStream_Check(rcCenter, crText); - case PCS_CIRCLE: - return GetAppStream_Circle(ScaleRect(rcCenter, 1.0f / 2.0f), crText); - case PCS_CROSS: - return GetAppStream_Cross(rcCenter, crText); - case PCS_DIAMOND: - return GetAppStream_Diamond(ScaleRect(rcCenter, 2.0f / 3.0f), crText); - case PCS_SQUARE: - return GetAppStream_Square(ScaleRect(rcCenter, 2.0f / 3.0f), crText); - case PCS_STAR: - return GetAppStream_Star(ScaleRect(rcCenter, 2.0f / 3.0f), crText); - } -} - -CFX_ByteString CPWL_Utils::GetDropButtonAppStream(const CFX_FloatRect& rcBBox) { - CFX_ByteTextBuf sAppStream; - - if (!rcBBox.IsEmpty()) { - sAppStream << "q\n" << CPWL_Utils::GetColorAppStream( - CPWL_Color(COLORTYPE_RGB, 220.0f / 255.0f, - 220.0f / 255.0f, 220.0f / 255.0f), - TRUE); - sAppStream << rcBBox.left << " " << rcBBox.bottom << " " - << rcBBox.right - rcBBox.left << " " - << rcBBox.top - rcBBox.bottom << " re f\n"; - sAppStream << "Q\n"; - - sAppStream << "q\n" << CPWL_Utils::GetBorderAppStream( - rcBBox, 2, CPWL_Color(COLORTYPE_GRAY, 0), - CPWL_Color(COLORTYPE_GRAY, 1), - CPWL_Color(COLORTYPE_GRAY, 0.5), PBS_BEVELED, - CPWL_Dash(3, 0, 0)) - << "Q\n"; - - CFX_FloatPoint ptCenter = CFX_FloatPoint((rcBBox.left + rcBBox.right) / 2, - (rcBBox.top + rcBBox.bottom) / 2); - if (IsFloatBigger(rcBBox.right - rcBBox.left, 6) && - IsFloatBigger(rcBBox.top - rcBBox.bottom, 6)) { - sAppStream << "q\n" - << " 0 g\n"; - sAppStream << ptCenter.x - 3 << " " << ptCenter.y + 1.5f << " m\n"; - sAppStream << ptCenter.x + 3 << " " << ptCenter.y + 1.5f << " l\n"; - sAppStream << ptCenter.x << " " << ptCenter.y - 1.5f << " l\n"; - sAppStream << ptCenter.x - 3 << " " << ptCenter.y + 1.5f << " l f\n"; - sAppStream << "Q\n"; - } - } - - return sAppStream.GetByteString(); -} - -void CPWL_Utils::ConvertCMYK2GRAY(FX_FLOAT dC, - FX_FLOAT dM, - FX_FLOAT dY, - FX_FLOAT dK, - FX_FLOAT& dGray) { - if (dC < 0 || dC > 1 || dM < 0 || dM > 1 || dY < 0 || dY > 1 || dK < 0 || - dK > 1) - return; - dGray = 1.0f - std::min(1.0f, 0.3f * dC + 0.59f * dM + 0.11f * dY + dK); -} - -void CPWL_Utils::ConvertGRAY2CMYK(FX_FLOAT dGray, - FX_FLOAT& dC, - FX_FLOAT& dM, - FX_FLOAT& dY, - FX_FLOAT& dK) { - if (dGray < 0 || dGray > 1) - return; - dC = 0.0f; - dM = 0.0f; - dY = 0.0f; - dK = 1.0f - dGray; -} - -void CPWL_Utils::ConvertGRAY2RGB(FX_FLOAT dGray, - FX_FLOAT& dR, - FX_FLOAT& dG, - FX_FLOAT& dB) { - if (dGray < 0 || dGray > 1) - return; - dR = dGray; - dG = dGray; - dB = dGray; -} - -void CPWL_Utils::ConvertRGB2GRAY(FX_FLOAT dR, - FX_FLOAT dG, - FX_FLOAT dB, - FX_FLOAT& dGray) { - if (dR < 0 || dR > 1 || dG < 0 || dG > 0 || dB < 0 || dB > 1) - return; - dGray = 0.3f * dR + 0.59f * dG + 0.11f * dB; -} - -void CPWL_Utils::ConvertCMYK2RGB(FX_FLOAT dC, - FX_FLOAT dM, - FX_FLOAT dY, - FX_FLOAT dK, - FX_FLOAT& dR, - FX_FLOAT& dG, - FX_FLOAT& dB) { - if (dC < 0 || dC > 1 || dM < 0 || dM > 1 || dY < 0 || dY > 1 || dK < 0 || - dK > 1) - return; - dR = 1.0f - std::min(1.0f, dC + dK); - dG = 1.0f - std::min(1.0f, dM + dK); - dB = 1.0f - std::min(1.0f, dY + dK); -} - -void CPWL_Utils::ConvertRGB2CMYK(FX_FLOAT dR, - FX_FLOAT dG, - FX_FLOAT dB, - FX_FLOAT& dC, - FX_FLOAT& dM, - FX_FLOAT& dY, - FX_FLOAT& dK) { - if (dR < 0 || dR > 1 || dG < 0 || dG > 1 || dB < 0 || dB > 1) - return; - - dC = 1.0f - dR; - dM = 1.0f - dG; - dY = 1.0f - dB; - dK = std::min(dC, std::min(dM, dY)); -} - -void CPWL_Utils::PWLColorToARGB(const CPWL_Color& color, - int32_t& alpha, - FX_FLOAT& red, - FX_FLOAT& green, - FX_FLOAT& blue) { - switch (color.nColorType) { - case COLORTYPE_TRANSPARENT: { - alpha = 0; - } break; - case COLORTYPE_GRAY: { - ConvertGRAY2RGB(color.fColor1, red, green, blue); - } break; - case COLORTYPE_RGB: { - red = color.fColor1; - green = color.fColor2; - blue = color.fColor3; - } break; - case COLORTYPE_CMYK: { - ConvertCMYK2RGB(color.fColor1, color.fColor2, color.fColor3, - color.fColor4, red, green, blue); - } break; - } -} - -FX_COLORREF CPWL_Utils::PWLColorToFXColor(const CPWL_Color& color, - int32_t nTransparancy) { - int32_t nAlpha = nTransparancy; - FX_FLOAT dRed = 0; - FX_FLOAT dGreen = 0; - FX_FLOAT dBlue = 0; - - PWLColorToARGB(color, nAlpha, dRed, dGreen, dBlue); - - return ArgbEncode(nAlpha, (int32_t)(dRed * 255), (int32_t)(dGreen * 255), - (int32_t)(dBlue * 255)); -} - -void CPWL_Utils::DrawFillRect(CFX_RenderDevice* pDevice, - CFX_Matrix* pUser2Device, - const CFX_FloatRect& rect, - const FX_COLORREF& color) { - CFX_PathData path; - CFX_FloatRect rcTemp(rect); - path.AppendRect(rcTemp.left, rcTemp.bottom, rcTemp.right, rcTemp.top); - pDevice->DrawPath(&path, pUser2Device, NULL, color, 0, FXFILL_WINDING); -} - -void CPWL_Utils::DrawFillArea(CFX_RenderDevice* pDevice, - CFX_Matrix* pUser2Device, - const CFX_FloatPoint* pPts, - int32_t nCount, - const FX_COLORREF& color) { - CFX_PathData path; - path.SetPointCount(nCount); - - path.SetPoint(0, pPts[0].x, pPts[0].y, FXPT_MOVETO); - for (int32_t i = 1; i < nCount; i++) - path.SetPoint(i, pPts[i].x, pPts[i].y, FXPT_LINETO); - - pDevice->DrawPath(&path, pUser2Device, NULL, color, 0, FXFILL_ALTERNATE); -} - -void CPWL_Utils::DrawStrokeRect(CFX_RenderDevice* pDevice, - CFX_Matrix* pUser2Device, - const CFX_FloatRect& rect, - const FX_COLORREF& color, - FX_FLOAT fWidth) { - CFX_PathData path; - CFX_FloatRect rcTemp(rect); - path.AppendRect(rcTemp.left, rcTemp.bottom, rcTemp.right, rcTemp.top); - - CFX_GraphStateData gsd; - gsd.m_LineWidth = fWidth; - - pDevice->DrawPath(&path, pUser2Device, &gsd, 0, color, FXFILL_ALTERNATE); -} - -void CPWL_Utils::DrawStrokeLine(CFX_RenderDevice* pDevice, - CFX_Matrix* pUser2Device, - const CFX_FloatPoint& ptMoveTo, - const CFX_FloatPoint& ptLineTo, - const FX_COLORREF& color, - FX_FLOAT fWidth) { - CFX_PathData path; - path.SetPointCount(2); - path.SetPoint(0, ptMoveTo.x, ptMoveTo.y, FXPT_MOVETO); - path.SetPoint(1, ptLineTo.x, ptLineTo.y, FXPT_LINETO); - - CFX_GraphStateData gsd; - gsd.m_LineWidth = fWidth; - - pDevice->DrawPath(&path, pUser2Device, &gsd, 0, color, FXFILL_ALTERNATE); -} - -void CPWL_Utils::DrawFillRect(CFX_RenderDevice* pDevice, - CFX_Matrix* pUser2Device, - const CFX_FloatRect& rect, - const CPWL_Color& color, - int32_t nTransparancy) { - CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rect, - PWLColorToFXColor(color, nTransparancy)); -} - -void CPWL_Utils::DrawShadow(CFX_RenderDevice* pDevice, - CFX_Matrix* pUser2Device, - FX_BOOL bVertical, - FX_BOOL bHorizontal, - CFX_FloatRect rect, - int32_t nTransparancy, - int32_t nStartGray, - int32_t nEndGray) { - FX_FLOAT fStepGray = 1.0f; - - if (bVertical) { - fStepGray = (nEndGray - nStartGray) / rect.Height(); - - for (FX_FLOAT fy = rect.bottom + 0.5f; fy <= rect.top - 0.5f; fy += 1.0f) { - int32_t nGray = nStartGray + (int32_t)(fStepGray * (fy - rect.bottom)); - CPWL_Utils::DrawStrokeLine( - pDevice, pUser2Device, CFX_FloatPoint(rect.left, fy), - CFX_FloatPoint(rect.right, fy), - ArgbEncode(nTransparancy, nGray, nGray, nGray), 1.5f); - } - } - - if (bHorizontal) { - fStepGray = (nEndGray - nStartGray) / rect.Width(); - - for (FX_FLOAT fx = rect.left + 0.5f; fx <= rect.right - 0.5f; fx += 1.0f) { - int32_t nGray = nStartGray + (int32_t)(fStepGray * (fx - rect.left)); - CPWL_Utils::DrawStrokeLine( - pDevice, pUser2Device, CFX_FloatPoint(fx, rect.bottom), - CFX_FloatPoint(fx, rect.top), - ArgbEncode(nTransparancy, nGray, nGray, nGray), 1.5f); - } - } -} - -void CPWL_Utils::DrawBorder(CFX_RenderDevice* pDevice, - CFX_Matrix* pUser2Device, - const CFX_FloatRect& rect, - FX_FLOAT fWidth, - const CPWL_Color& color, - const CPWL_Color& crLeftTop, - const CPWL_Color& crRightBottom, - int32_t nStyle, - int32_t nTransparancy) { - FX_FLOAT fLeft = rect.left; - FX_FLOAT fRight = rect.right; - FX_FLOAT fTop = rect.top; - FX_FLOAT fBottom = rect.bottom; - - if (fWidth > 0.0f) { - FX_FLOAT fHalfWidth = fWidth / 2.0f; - - switch (nStyle) { - default: - case PBS_SOLID: { - CFX_PathData path; - path.AppendRect(fLeft, fBottom, fRight, fTop); - path.AppendRect(fLeft + fWidth, fBottom + fWidth, fRight - fWidth, - fTop - fWidth); - pDevice->DrawPath(&path, pUser2Device, NULL, - PWLColorToFXColor(color, nTransparancy), 0, - FXFILL_ALTERNATE); - } break; - case PBS_DASH: { - CFX_PathData path; - - path.SetPointCount(5); - path.SetPoint(0, fLeft + fWidth / 2.0f, fBottom + fWidth / 2.0f, - FXPT_MOVETO); - path.SetPoint(1, fLeft + fWidth / 2.0f, fTop - fWidth / 2.0f, - FXPT_LINETO); - path.SetPoint(2, fRight - fWidth / 2.0f, fTop - fWidth / 2.0f, - FXPT_LINETO); - path.SetPoint(3, fRight - fWidth / 2.0f, fBottom + fWidth / 2.0f, - FXPT_LINETO); - path.SetPoint(4, fLeft + fWidth / 2.0f, fBottom + fWidth / 2.0f, - FXPT_LINETO); - - CFX_GraphStateData gsd; - gsd.SetDashCount(2); - gsd.m_DashArray[0] = 3.0f; - gsd.m_DashArray[1] = 3.0f; - gsd.m_DashPhase = 0; - - gsd.m_LineWidth = fWidth; - pDevice->DrawPath(&path, pUser2Device, &gsd, 0, - PWLColorToFXColor(color, nTransparancy), - FXFILL_WINDING); - } break; - case PBS_BEVELED: - case PBS_INSET: { - CFX_GraphStateData gsd; - gsd.m_LineWidth = fHalfWidth; - - CFX_PathData pathLT; - - pathLT.SetPointCount(7); - pathLT.SetPoint(0, fLeft + fHalfWidth, fBottom + fHalfWidth, - FXPT_MOVETO); - pathLT.SetPoint(1, fLeft + fHalfWidth, fTop - fHalfWidth, FXPT_LINETO); - pathLT.SetPoint(2, fRight - fHalfWidth, fTop - fHalfWidth, FXPT_LINETO); - pathLT.SetPoint(3, fRight - fHalfWidth * 2, fTop - fHalfWidth * 2, - FXPT_LINETO); - pathLT.SetPoint(4, fLeft + fHalfWidth * 2, fTop - fHalfWidth * 2, - FXPT_LINETO); - pathLT.SetPoint(5, fLeft + fHalfWidth * 2, fBottom + fHalfWidth * 2, - FXPT_LINETO); - pathLT.SetPoint(6, fLeft + fHalfWidth, fBottom + fHalfWidth, - FXPT_LINETO); - - pDevice->DrawPath(&pathLT, pUser2Device, &gsd, - PWLColorToFXColor(crLeftTop, nTransparancy), 0, - FXFILL_ALTERNATE); - - CFX_PathData pathRB; - - pathRB.SetPointCount(7); - pathRB.SetPoint(0, fRight - fHalfWidth, fTop - fHalfWidth, FXPT_MOVETO); - pathRB.SetPoint(1, fRight - fHalfWidth, fBottom + fHalfWidth, - FXPT_LINETO); - pathRB.SetPoint(2, fLeft + fHalfWidth, fBottom + fHalfWidth, - FXPT_LINETO); - pathRB.SetPoint(3, fLeft + fHalfWidth * 2, fBottom + fHalfWidth * 2, - FXPT_LINETO); - pathRB.SetPoint(4, fRight - fHalfWidth * 2, fBottom + fHalfWidth * 2, - FXPT_LINETO); - pathRB.SetPoint(5, fRight - fHalfWidth * 2, fTop - fHalfWidth * 2, - FXPT_LINETO); - pathRB.SetPoint(6, fRight - fHalfWidth, fTop - fHalfWidth, FXPT_LINETO); - - pDevice->DrawPath(&pathRB, pUser2Device, &gsd, - PWLColorToFXColor(crRightBottom, nTransparancy), 0, - FXFILL_ALTERNATE); - - CFX_PathData path; - - path.AppendRect(fLeft, fBottom, fRight, fTop); - path.AppendRect(fLeft + fHalfWidth, fBottom + fHalfWidth, - fRight - fHalfWidth, fTop - fHalfWidth); - - pDevice->DrawPath(&path, pUser2Device, &gsd, - PWLColorToFXColor(color, nTransparancy), 0, - FXFILL_ALTERNATE); - } break; - case PBS_UNDERLINED: { - CFX_PathData path; - - path.SetPointCount(2); - path.SetPoint(0, fLeft, fBottom + fWidth / 2, FXPT_MOVETO); - path.SetPoint(1, fRight, fBottom + fWidth / 2, FXPT_LINETO); - - CFX_GraphStateData gsd; - gsd.m_LineWidth = fWidth; - - pDevice->DrawPath(&path, pUser2Device, &gsd, 0, - PWLColorToFXColor(color, nTransparancy), - FXFILL_ALTERNATE); - } break; - case PBS_SHADOW: { - CFX_PathData path; - path.AppendRect(fLeft, fBottom, fRight, fTop); - path.AppendRect(fLeft + fWidth, fBottom + fWidth, fRight - fWidth, - fTop - fWidth); - pDevice->DrawPath(&path, pUser2Device, NULL, - PWLColorToFXColor(color, nTransparancy / 2), 0, - FXFILL_ALTERNATE); - } break; - } - } -} - -static void AddSquigglyPath(CFX_PathData& PathData, - FX_FLOAT fStartX, - FX_FLOAT fEndX, - FX_FLOAT fY, - FX_FLOAT fStep) { - PathData.AddPointCount(1); - PathData.SetPoint(PathData.GetPointCount() - 1, fStartX, fY, FXPT_MOVETO); - - FX_FLOAT fx; - int32_t i; - - for (i = 1, fx = fStartX + fStep; fx < fEndX; fx += fStep, i++) { - PathData.AddPointCount(1); - PathData.SetPoint(PathData.GetPointCount() - 1, fx, fY + (i & 1) * fStep, - FXPT_LINETO); - } -} - -static void AddSpellCheckObj(CFX_PathData& PathData, - IFX_Edit* pEdit, - const CPVT_WordRange& wrWord) { - FX_FLOAT fStartX = 0.0f; - FX_FLOAT fEndX = 0.0f; - FX_FLOAT fY = 0.0f; - FX_FLOAT fStep = 0.0f; - - FX_BOOL bBreak = FALSE; - - if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator()) { - pIterator->SetAt(wrWord.BeginPos); - - do { - CPVT_WordPlace place = pIterator->GetAt(); - - CPVT_Line line; - if (pIterator->GetLine(line)) { - fY = line.ptLine.y; - fStep = (line.fLineAscent - line.fLineDescent) / 16.0f; - } - - if (place.LineCmp(wrWord.BeginPos) == 0) { - pIterator->SetAt(wrWord.BeginPos); - CPVT_Word word; - if (pIterator->GetWord(word)) { - fStartX = word.ptWord.x; - } - } else { - fStartX = line.ptLine.x; - } - - if (place.LineCmp(wrWord.EndPos) == 0) { - pIterator->SetAt(wrWord.EndPos); - CPVT_Word word; - if (pIterator->GetWord(word)) { - fEndX = word.ptWord.x + word.fWidth; - } - - bBreak = TRUE; - } else { - fEndX = line.ptLine.x + line.fLineWidth; - } - - AddSquigglyPath(PathData, fStartX, fEndX, fY, fStep); - - if (bBreak) - break; - } while (pIterator->NextLine()); - } -} - -void CPWL_Utils::DrawEditSpellCheck(CFX_RenderDevice* pDevice, - CFX_Matrix* pUser2Device, - IFX_Edit* pEdit, - const CFX_FloatRect& rcClip, - const CFX_FloatPoint& ptOffset, - const CPVT_WordRange* pRange, - IPWL_SpellCheck* pSpellCheck) { - const FX_COLORREF crSpell = ArgbEncode(255, 255, 0, 0); - - // for spellcheck - FX_BOOL bLatinWord = FALSE; - CPVT_WordPlace wpWordStart; - CFX_ByteString sLatinWord; - - CFX_PathData pathSpell; - - pDevice->SaveState(); - - if (!rcClip.IsEmpty()) { - CFX_FloatRect rcTemp = rcClip; - pUser2Device->TransformRect(rcTemp); - pDevice->SetClip_Rect(rcTemp.ToFxRect()); - } - - if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator()) { - if (pEdit->GetFontMap()) { - if (pRange) - pIterator->SetAt(pRange->BeginPos); - else - pIterator->SetAt(0); - - CPVT_WordPlace oldplace; - - while (pIterator->NextWord()) { - CPVT_WordPlace place = pIterator->GetAt(); - if (pRange && place.WordCmp(pRange->EndPos) > 0) - break; - - CPVT_Word word; - if (pIterator->GetWord(word)) { - if (FX_EDIT_ISLATINWORD(word.Word)) { - if (!bLatinWord) { - wpWordStart = place; - bLatinWord = TRUE; - } - - sLatinWord += (char)word.Word; - } else { - if (bLatinWord) { - if (!sLatinWord.IsEmpty()) { - if (pSpellCheck && !pSpellCheck->CheckWord(sLatinWord)) { - AddSpellCheckObj(pathSpell, pEdit, - CPVT_WordRange(wpWordStart, oldplace)); - pIterator->SetAt(place); - } - } - bLatinWord = FALSE; - } - - sLatinWord.Empty(); - } - - oldplace = place; - } else { - if (bLatinWord) { - if (!sLatinWord.IsEmpty()) { - if (pSpellCheck && !pSpellCheck->CheckWord(sLatinWord)) { - AddSpellCheckObj(pathSpell, pEdit, - CPVT_WordRange(wpWordStart, oldplace)); - pIterator->SetAt(place); - } - } - bLatinWord = FALSE; - } - - sLatinWord.Empty(); - } - } - - if (!sLatinWord.IsEmpty()) { - if (pSpellCheck && !pSpellCheck->CheckWord(sLatinWord)) { - AddSpellCheckObj(pathSpell, pEdit, - CPVT_WordRange(wpWordStart, oldplace)); - } - } - } - } - - CFX_GraphStateData gsd; - gsd.m_LineWidth = 0; - if (pathSpell.GetPointCount() > 0) - pDevice->DrawPath(&pathSpell, pUser2Device, &gsd, 0, crSpell, - FXFILL_ALTERNATE); - - pDevice->RestoreState(); -} - -FX_BOOL CPWL_Utils::IsBlackOrWhite(const CPWL_Color& color) { - switch (color.nColorType) { - case COLORTYPE_TRANSPARENT: - return FALSE; - case COLORTYPE_GRAY: - return color.fColor1 < 0.5f; - case COLORTYPE_RGB: - return color.fColor1 + color.fColor2 + color.fColor3 < 1.5f; - case COLORTYPE_CMYK: - return color.fColor1 + color.fColor2 + color.fColor3 + color.fColor4 > - 2.0f; - } - - return TRUE; -} - -CPWL_Color CPWL_Utils::GetReverseColor(const CPWL_Color& color) { - CPWL_Color crRet = color; - - switch (color.nColorType) { - case COLORTYPE_GRAY: - crRet.fColor1 = 1.0f - crRet.fColor1; - break; - case COLORTYPE_RGB: - crRet.fColor1 = 1.0f - crRet.fColor1; - crRet.fColor2 = 1.0f - crRet.fColor2; - crRet.fColor3 = 1.0f - crRet.fColor3; - break; - case COLORTYPE_CMYK: - crRet.fColor1 = 1.0f - crRet.fColor1; - crRet.fColor2 = 1.0f - crRet.fColor2; - crRet.fColor3 = 1.0f - crRet.fColor3; - crRet.fColor4 = 1.0f - crRet.fColor4; - break; - } - - return crRet; -} - -CFX_ByteString CPWL_Utils::GetIconAppStream(int32_t nType, - const CFX_FloatRect& rect, - const CPWL_Color& crFill, - const CPWL_Color& crStroke) { - CFX_ByteString sAppStream = CPWL_Utils::GetColorAppStream(crStroke, FALSE); - sAppStream += CPWL_Utils::GetColorAppStream(crFill, TRUE); - - CFX_ByteString sPath; - CFX_PathData path; - - switch (nType) { - case PWL_ICONTYPE_CHECKMARK: - GetGraphics_Checkmark(sPath, path, rect, PWLPT_STREAM); - break; - case PWL_ICONTYPE_CIRCLE: - GetGraphics_Circle(sPath, path, rect, PWLPT_STREAM); - break; - case PWL_ICONTYPE_COMMENT: - GetGraphics_Comment(sPath, path, rect, PWLPT_STREAM); - break; - case PWL_ICONTYPE_CROSS: - GetGraphics_Cross(sPath, path, rect, PWLPT_STREAM); - break; - case PWL_ICONTYPE_HELP: - GetGraphics_Help(sPath, path, rect, PWLPT_STREAM); - break; - case PWL_ICONTYPE_INSERTTEXT: - GetGraphics_InsertText(sPath, path, rect, PWLPT_STREAM); - break; - case PWL_ICONTYPE_KEY: - GetGraphics_Key(sPath, path, rect, PWLPT_STREAM); - break; - case PWL_ICONTYPE_NEWPARAGRAPH: - GetGraphics_NewParagraph(sPath, path, rect, PWLPT_STREAM); - break; - case PWL_ICONTYPE_TEXTNOTE: - GetGraphics_TextNote(sPath, path, rect, PWLPT_STREAM); - break; - case PWL_ICONTYPE_PARAGRAPH: - GetGraphics_Paragraph(sPath, path, rect, PWLPT_STREAM); - break; - case PWL_ICONTYPE_RIGHTARROW: - GetGraphics_RightArrow(sPath, path, rect, PWLPT_STREAM); - break; - case PWL_ICONTYPE_RIGHTPOINTER: - GetGraphics_RightPointer(sPath, path, rect, PWLPT_STREAM); - break; - case PWL_ICONTYPE_STAR: - GetGraphics_Star(sPath, path, rect, PWLPT_STREAM); - break; - case PWL_ICONTYPE_UPARROW: - GetGraphics_UpArrow(sPath, path, rect, PWLPT_STREAM); - break; - case PWL_ICONTYPE_UPLEFTARROW: - GetGraphics_UpLeftArrow(sPath, path, rect, PWLPT_STREAM); - break; - case PWL_ICONTYPE_GRAPH: - GetGraphics_Graph(sPath, path, rect, PWLPT_STREAM); - break; - case PWL_ICONTYPE_PAPERCLIP: - GetGraphics_Paperclip(sPath, path, rect, PWLPT_STREAM); - break; - case PWL_ICONTYPE_ATTACHMENT: - GetGraphics_Attachment(sPath, path, rect, PWLPT_STREAM); - break; - case PWL_ICONTYPE_TAG: - GetGraphics_Tag(sPath, path, rect, PWLPT_STREAM); - break; - case PWL_ICONTYPE_FOXIT: - GetGraphics_Foxit(sPath, path, rect, PWLPT_STREAM); - break; - } - - sAppStream += sPath; - if (crStroke.nColorType != COLORTYPE_TRANSPARENT) - sAppStream += "B*\n"; - else - sAppStream += "f*\n"; - - return sAppStream; -} - -void CPWL_Utils::DrawIconAppStream(CFX_RenderDevice* pDevice, - CFX_Matrix* pUser2Device, - int32_t nType, - const CFX_FloatRect& rect, - const CPWL_Color& crFill, - const CPWL_Color& crStroke, - const int32_t nTransparancy) { - CFX_GraphStateData gsd; - gsd.m_LineWidth = 1.0f; - - CFX_ByteString sPath; - CFX_PathData path; - - switch (nType) { - case PWL_ICONTYPE_CHECKMARK: - GetGraphics_Checkmark(sPath, path, rect, PWLPT_PATHDATA); - break; - case PWL_ICONTYPE_CIRCLE: - GetGraphics_Circle(sPath, path, rect, PWLPT_PATHDATA); - break; - case PWL_ICONTYPE_COMMENT: - GetGraphics_Comment(sPath, path, rect, PWLPT_PATHDATA); - break; - case PWL_ICONTYPE_CROSS: - GetGraphics_Cross(sPath, path, rect, PWLPT_PATHDATA); - break; - case PWL_ICONTYPE_HELP: - GetGraphics_Help(sPath, path, rect, PWLPT_PATHDATA); - break; - case PWL_ICONTYPE_INSERTTEXT: - GetGraphics_InsertText(sPath, path, rect, PWLPT_PATHDATA); - break; - case PWL_ICONTYPE_KEY: - GetGraphics_Key(sPath, path, rect, PWLPT_PATHDATA); - break; - case PWL_ICONTYPE_NEWPARAGRAPH: - GetGraphics_NewParagraph(sPath, path, rect, PWLPT_PATHDATA); - break; - case PWL_ICONTYPE_TEXTNOTE: - GetGraphics_TextNote(sPath, path, rect, PWLPT_PATHDATA); - break; - case PWL_ICONTYPE_PARAGRAPH: - GetGraphics_Paragraph(sPath, path, rect, PWLPT_PATHDATA); - break; - case PWL_ICONTYPE_RIGHTARROW: - GetGraphics_RightArrow(sPath, path, rect, PWLPT_PATHDATA); - break; - case PWL_ICONTYPE_RIGHTPOINTER: - GetGraphics_RightPointer(sPath, path, rect, PWLPT_PATHDATA); - break; - case PWL_ICONTYPE_STAR: - GetGraphics_Star(sPath, path, rect, PWLPT_PATHDATA); - break; - case PWL_ICONTYPE_UPARROW: - GetGraphics_UpArrow(sPath, path, rect, PWLPT_PATHDATA); - break; - case PWL_ICONTYPE_UPLEFTARROW: - GetGraphics_UpLeftArrow(sPath, path, rect, PWLPT_PATHDATA); - break; - case PWL_ICONTYPE_GRAPH: - GetGraphics_Graph(sPath, path, rect, PWLPT_PATHDATA); - break; - case PWL_ICONTYPE_PAPERCLIP: - GetGraphics_Paperclip(sPath, path, rect, PWLPT_PATHDATA); - break; - case PWL_ICONTYPE_ATTACHMENT: - GetGraphics_Attachment(sPath, path, rect, PWLPT_PATHDATA); - break; - case PWL_ICONTYPE_TAG: - GetGraphics_Tag(sPath, path, rect, PWLPT_PATHDATA); - break; - case PWL_ICONTYPE_FOXIT: - GetGraphics_Foxit(sPath, path, rect, PWLPT_PATHDATA); - break; - default: - return; - } - - pDevice->DrawPath( - &path, pUser2Device, &gsd, PWLColorToFXColor(crFill, nTransparancy), - PWLColorToFXColor(crStroke, nTransparancy), FXFILL_ALTERNATE); -} - -void CPWL_Utils::GetGraphics_Checkmark(CFX_ByteString& sPathData, - CFX_PathData& path, - const CFX_FloatRect& crBBox, - const PWL_PATH_TYPE type) { - FX_FLOAT fWidth = crBBox.right - crBBox.left; - FX_FLOAT fHeight = crBBox.top - crBBox.bottom; - - CPWL_PathData PathArray[] = { - CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 15.0f, - crBBox.bottom + fHeight * 2 / 5.0f), - PWLPT_MOVETO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth / 15.0f + - FX_BEZIER * (fWidth / 7.0f - fWidth / 15.0f), - crBBox.bottom + fHeight * 2 / 5.0f + - FX_BEZIER * (fHeight * 2 / 7.0f - fHeight * 2 / 5.0f)), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth / 4.5f + - FX_BEZIER * (fWidth / 5.0f - fWidth / 4.5f), - crBBox.bottom + fHeight / 16.0f + - FX_BEZIER * (fHeight / 5.0f - fHeight / 16.0f)), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 4.5f, - crBBox.bottom + fHeight / 16.0f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 4.5f + - FX_BEZIER * (fWidth / 4.4f - fWidth / 4.5f), - crBBox.bottom + fHeight / 16.0f - - FX_BEZIER * fHeight / 16.0f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 3.0f + - FX_BEZIER * (fWidth / 4.0f - fWidth / 3.0f), - crBBox.bottom), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 3.0f, crBBox.bottom), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 3.0f + - FX_BEZIER * fWidth * (1 / 7.0f + 2 / 15.0f), - crBBox.bottom + FX_BEZIER * fHeight * 4 / 5.0f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 14 / 15.0f + - FX_BEZIER * fWidth * (1 / 7.0f - 7 / 15.0f), - crBBox.bottom + fHeight * 15 / 16.0f + - FX_BEZIER * (fHeight * 4 / 5.0f - - fHeight * 15 / 16.0f)), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 14 / 15.0f, - crBBox.bottom + fHeight * 15 / 16.0f), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point( - crBBox.left + fWidth * 14 / 15.0f + - FX_BEZIER * (fWidth * 7 / 15.0f - fWidth * 14 / 15.0f), - crBBox.bottom + fHeight * 15 / 16.0f + - FX_BEZIER * (fHeight * 8 / 7.0f - fHeight * 15 / 16.0f)), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth / 3.6f + - FX_BEZIER * (fWidth / 3.4f - fWidth / 3.6f), - crBBox.bottom + fHeight / 3.5f + - FX_BEZIER * (fHeight / 3.5f - fHeight / 3.5f)), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 3.6f, - crBBox.bottom + fHeight / 3.5f), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth / 3.6f, - crBBox.bottom + fHeight / 3.5f + - FX_BEZIER * (fHeight / 4.0f - fHeight / 3.5f)), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 15.0f + - FX_BEZIER * (fWidth / 3.5f - fWidth / 15.0f), - crBBox.bottom + fHeight * 2 / 5.0f + - FX_BEZIER * (fHeight * 3.5f / 5.0f - - fHeight * 2 / 5.0f)), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 15.0f, - crBBox.bottom + fHeight * 2 / 5.0f), - PWLPT_BEZIERTO)}; - - if (type == PWLPT_STREAM) - sPathData = GetAppStreamFromArray(PathArray, 16); - else - GetPathDataFromArray(path, PathArray, 16); -} - -void CPWL_Utils::GetGraphics_Circle(CFX_ByteString& sPathData, - CFX_PathData& path, - const CFX_FloatRect& crBBox, - const PWL_PATH_TYPE type) { - FX_FLOAT fWidth = crBBox.right - crBBox.left; - FX_FLOAT fHeight = crBBox.top - crBBox.bottom; - - CPWL_PathData PathArray[] = { - CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 15.0f, - crBBox.bottom + fHeight / 2.0f), - PWLPT_MOVETO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth / 15.0f, - crBBox.bottom + fHeight / 2.0f + - FX_BEZIER * (fHeight * 14 / 15.0f - fHeight / 2.0f)), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 2.0f - - FX_BEZIER * (fWidth / 2.0f - fWidth / 15.0f), - crBBox.top - fHeight / 15.0f), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth / 2.0f, crBBox.top - fHeight / 15.0f), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth / 2.0f + - FX_BEZIER * (fWidth * 14 / 15.0f - fWidth / 2.0f), - crBBox.top - fHeight / 15.0f), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(crBBox.right - fWidth / 15.0f, - crBBox.bottom + fHeight / 2.0f + - FX_BEZIER * (fHeight * 14 / 15.0f - fHeight / 2.0f)), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 15.0f, - crBBox.bottom + fHeight / 2.0f), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(crBBox.right - fWidth / 15.0f, - crBBox.bottom + fHeight / 2.0f - - FX_BEZIER * (fHeight / 2.0f - fHeight / 15.0f)), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth / 2.0f + - FX_BEZIER * (fWidth * 14 / 15.0f - fWidth / 2.0f), - crBBox.bottom + fHeight / 15.0f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 2.0f, - crBBox.bottom + fHeight / 15.0f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 2.0f - - FX_BEZIER * (fWidth / 2.0f - fWidth / 15.0f), - crBBox.bottom + fHeight / 15.0f), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth / 15.0f, - crBBox.bottom + fHeight / 2.0f - - FX_BEZIER * (fHeight / 2.0f - fHeight / 15.0f)), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 15.0f, - crBBox.bottom + fHeight / 2.0f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 3 / 15.0f, - crBBox.bottom + fHeight / 2.0f), - PWLPT_MOVETO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth * 3 / 15.0f, - crBBox.bottom + fHeight / 2.0f + - FX_BEZIER * (fHeight * 4 / 5.0f - fHeight / 2.0f)), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth / 2.0f - - FX_BEZIER * (fWidth / 2.0f - fWidth * 3 / 15.0f), - crBBox.top - fHeight * 3 / 15.0f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 2.0f, - crBBox.top - fHeight * 3 / 15.0f), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth / 2.0f + - FX_BEZIER * (fWidth * 4 / 5.0f - fWidth / 2.0f), - crBBox.top - fHeight * 3 / 15.0f), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(crBBox.right - fWidth * 3 / 15.0f, - crBBox.bottom + fHeight / 2.0f + - FX_BEZIER * (fHeight * 4 / 5.0f - fHeight / 2.0f)), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 3 / 15.0f, - crBBox.bottom + fHeight / 2.0f), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(crBBox.right - fWidth * 3 / 15.0f, - crBBox.bottom + fHeight / 2.0f - - FX_BEZIER * (fHeight * 4 / 5.0f - fHeight / 2.0f)), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth / 2.0f + - FX_BEZIER * (fWidth * 4 / 5.0f - fWidth / 2.0f), - crBBox.bottom + fHeight * 3 / 15.0f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 2.0f, - crBBox.bottom + fHeight * 3 / 15.0f), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth / 2.0f - - FX_BEZIER * (fWidth * 4 / 5.0f - fWidth / 2.0f), - crBBox.bottom + fHeight * 3 / 15.0f), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth * 3 / 15.0f, - crBBox.bottom + fHeight / 2.0f - - FX_BEZIER * (fHeight * 4 / 5.0f - fHeight / 2.0f)), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 3 / 15.0f, - crBBox.bottom + fHeight / 2.0f), - PWLPT_BEZIERTO)}; - - if (type == PWLPT_STREAM) - sPathData = GetAppStreamFromArray(PathArray, 26); - else - GetPathDataFromArray(path, PathArray, 26); -} - -void CPWL_Utils::GetGraphics_Comment(CFX_ByteString& sPathData, - CFX_PathData& path, - const CFX_FloatRect& crBBox, - const PWL_PATH_TYPE type) { - FX_FLOAT fWidth = crBBox.right - crBBox.left; - FX_FLOAT fHeight = crBBox.top - crBBox.bottom; - - CPWL_PathData PathArray[] = { - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth / 15.0f, crBBox.top - fHeight / 6.0f), - PWLPT_MOVETO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth / 15.0f, - crBBox.top - fHeight / 6.0f + - FX_BEZIER * (fHeight / 6.0f - fHeight / 10.0f)), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 2 / 15.0f - - FX_BEZIER * fWidth / 15.0f, - crBBox.top - fHeight / 10.0f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 2 / 15.0f, - crBBox.top - fHeight / 10.0f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 2 / 15.0f, - crBBox.top - fHeight / 10.0f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 2 / 15.0f + - FX_BEZIER * fWidth / 15.0f, - crBBox.top - fHeight / 10.0f), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(crBBox.right - fWidth / 15.0f, - crBBox.top - fHeight / 6 + - FX_BEZIER * (fHeight / 6.0f - fHeight / 10.0f)), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 15.0f, - crBBox.top - fHeight / 6.0f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 15.0f, - crBBox.bottom + fHeight / 3.0f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 15.0f, - crBBox.bottom + fHeight * 4 / 15.0f + - FX_BEZIER * fHeight / 15.0f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 2 / 15.0f + - FX_BEZIER * fWidth / 15.0f, - crBBox.bottom + fHeight * 4 / 15.0f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 2 / 15.0f, - crBBox.bottom + fHeight * 4 / 15.0f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 5 / 15.0f, - crBBox.bottom + fHeight * 4 / 15.0f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 5 / 15.0f, - crBBox.bottom + fHeight * 2 / 15 + - FX_BEZIER * fHeight * 2 / 15.0f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 5 / 15.0f - - FX_BEZIER * fWidth * 2 / 15.0f, - crBBox.bottom + fHeight * 2 / 15.0f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 6 / 30.0f, - crBBox.bottom + fHeight * 2 / 15.0f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 7 / 30.0f + - FX_BEZIER * fWidth / 30.0f, - crBBox.bottom + fHeight * 2 / 15.0f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 7 / 30.0f, - crBBox.bottom + fHeight * 2 / 15.0f + - FX_BEZIER * fHeight * 2 / 15.0f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 7 / 30.0f, - crBBox.bottom + fHeight * 4 / 15.0f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 2 / 15.0f, - crBBox.bottom + fHeight * 4 / 15.0f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 2 / 15.0f - - FX_BEZIER * fWidth / 15.0f, - crBBox.bottom + fHeight * 4 / 15.0f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 15.0f, - crBBox.bottom + fHeight / 3.0f - - FX_BEZIER * fHeight / 15.0f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 15.0f, - crBBox.bottom + fHeight / 3.0f), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth / 15.0f, crBBox.top - fHeight / 6.0f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 2 / 15.0f, - crBBox.top - fHeight * 8 / 30.0f), - PWLPT_MOVETO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 2 / 15.0f, - crBBox.top - fHeight * 8 / 30.0f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 2 / 15, - crBBox.top - fHeight * 25 / 60.0f), - PWLPT_MOVETO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 2 / 15.0f, - crBBox.top - fHeight * 25 / 60.0f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 2 / 15.0f, - crBBox.top - fHeight * 17 / 30.0f), - PWLPT_MOVETO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 4 / 15.0f, - crBBox.top - fHeight * 17 / 30.0f), - PWLPT_LINETO)}; - - if (type == PWLPT_STREAM) - sPathData = GetAppStreamFromArray(PathArray, 30); - else - GetPathDataFromArray(path, PathArray, 30); -} - -void CPWL_Utils::GetGraphics_Cross(CFX_ByteString& sPathData, - CFX_PathData& path, - const CFX_FloatRect& crBBox, - const PWL_PATH_TYPE type) { - FX_FLOAT fWidth = crBBox.right - crBBox.left; - FX_FLOAT fHeight = crBBox.top - crBBox.bottom; - CPWL_Point center_point(crBBox.left + fWidth / 2, - crBBox.bottom + fHeight / 2); - - CPWL_PathData PathArray[] = { - CPWL_PathData( - CPWL_Point(center_point.x, center_point.y + fHeight / 10.0f), - PWLPT_MOVETO), - CPWL_PathData( - CPWL_Point(center_point.x + fWidth * 0.3f, - center_point.y + fHeight / 10.0f + fWidth * 0.3f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(center_point.x + fWidth / 10.0f + fWidth * 0.3f, - center_point.y + fHeight * 0.3f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(center_point.x + fWidth / 10.0f, center_point.y), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(center_point.x + fWidth / 10.0f + fWidth * 0.3f, - center_point.y - fHeight * 0.3f), - PWLPT_LINETO), - CPWL_PathData( - CPWL_Point(center_point.x + fWidth * 0.3f, - center_point.y - fHeight / 10.0f - fHeight * 0.3f), - PWLPT_LINETO), - CPWL_PathData( - CPWL_Point(center_point.x, center_point.y - fHeight / 10.0f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(center_point.x - fWidth * 0.3f, - center_point.y - fHeight / 10 - fHeight * 0.3f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(center_point.x - fWidth / 10.0f - fWidth * 0.3f, - center_point.y - fHeight * 0.3f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(center_point.x - fWidth / 10, center_point.y), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(center_point.x - fWidth / 10 - fWidth * 0.3f, - center_point.y + fHeight * 0.3f), - PWLPT_LINETO), - CPWL_PathData( - CPWL_Point(center_point.x - fWidth * 0.3f, - center_point.y + fHeight / 10.0f + fHeight * 0.3f), - PWLPT_LINETO), - CPWL_PathData( - CPWL_Point(center_point.x, center_point.y + fHeight / 10.0f), - PWLPT_LINETO)}; - - if (type == PWLPT_STREAM) - sPathData = GetAppStreamFromArray(PathArray, 13); - else - GetPathDataFromArray(path, PathArray, 13); -} - -void CPWL_Utils::GetGraphics_Help(CFX_ByteString& sPathData, - CFX_PathData& path, - const CFX_FloatRect& crBBox, - const PWL_PATH_TYPE type) { - FX_FLOAT fWidth = crBBox.right - crBBox.left; - FX_FLOAT fHeight = crBBox.top - crBBox.bottom; - - CPWL_PathData PathArray[] = { - CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 60.0f, - crBBox.bottom + fHeight / 2.0f), - PWLPT_MOVETO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth / 60.0f, - crBBox.bottom + fHeight / 2.0f + - FX_BEZIER * (fHeight / 60.0f - fHeight / 2.0f)), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 2.0f - - FX_BEZIER * (fWidth / 2.0f - fWidth / 60.0f), - crBBox.bottom + fHeight / 60.0f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 2.0f, - crBBox.bottom + fHeight / 60.0f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 2.0f + - FX_BEZIER * fWidth * 29 / 60.0f, - crBBox.bottom + fHeight / 60.0f), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(crBBox.right - fWidth / 60.0f, - crBBox.bottom + fHeight / 2.0f + - FX_BEZIER * (fHeight / 60.0f - fHeight / 2.0f)), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 60.0f, - crBBox.bottom + fHeight / 2.0f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 60.0f, - crBBox.bottom + fHeight / 2.0f + - FX_BEZIER * fHeight * 29 / 60.0f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 2.0f + - FX_BEZIER * fWidth * 29 / 60.0f, - crBBox.top - fHeight / 60.0f), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth / 2.0f, crBBox.top - fHeight / 60.0f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 2.0f - - FX_BEZIER * fWidth * 29 / 60.0f, - crBBox.top - fHeight / 60.0f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 60.0f, - crBBox.bottom + fHeight / 2.0f + - FX_BEZIER * fHeight * 29 / 60.0f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 60.0f, - crBBox.bottom + fHeight / 2.0f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.27f, - crBBox.top - fHeight * 0.36f), - PWLPT_MOVETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.27f, - crBBox.top - fHeight * 0.36f + - FX_BEZIER * fHeight * 0.23f), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth * 0.5f - FX_BEZIER * fWidth * 0.23f, - crBBox.bottom + fHeight * 0.87f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.5f, - crBBox.bottom + fHeight * 0.87f), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth * 0.5f + FX_BEZIER * fWidth * 0.23f, - crBBox.bottom + fHeight * 0.87f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.27f, - crBBox.top - fHeight * 0.36f + - FX_BEZIER * fHeight * 0.23f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.27f, - crBBox.top - fHeight * 0.36f), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(crBBox.right - fWidth * 0.27f - fWidth * 0.08f * 0.2f, - crBBox.top - fHeight * 0.36f - fHeight * 0.15f * 0.7f), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(crBBox.right - fWidth * 0.35f + fWidth * 0.08f * 0.2f, - crBBox.top - fHeight * 0.51f + fHeight * 0.15f * 0.2f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.35f, - crBBox.top - fHeight * 0.51f), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(crBBox.right - fWidth * 0.35f - fWidth * 0.1f * 0.5f, - crBBox.top - fHeight * 0.51f - fHeight * 0.15f * 0.3f), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(crBBox.right - fWidth * 0.45f - fWidth * 0.1f * 0.5f, - crBBox.top - fHeight * 0.68f + fHeight * 0.15f * 0.5f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.45f, - crBBox.top - fHeight * 0.68f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.45f, - crBBox.bottom + fHeight * 0.30f), - PWLPT_LINETO), - CPWL_PathData( - CPWL_Point(crBBox.right - fWidth * 0.45f, - crBBox.bottom + fHeight * 0.30f - fWidth * 0.1f * 0.7f), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(crBBox.right - fWidth * 0.55f, - crBBox.bottom + fHeight * 0.30f - fWidth * 0.1f * 0.7f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.55f, - crBBox.bottom + fHeight * 0.30f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.55f, - crBBox.top - fHeight * 0.66f), - PWLPT_LINETO), - CPWL_PathData( - CPWL_Point(crBBox.right - fWidth * 0.55f - fWidth * 0.1f * 0.05f, - crBBox.top - fHeight * 0.66f + fHeight * 0.18f * 0.5f), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(crBBox.right - fWidth * 0.45f - fWidth * 0.1f * 0.05f, - crBBox.top - fHeight * 0.48f - fHeight * 0.18f * 0.3f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.45f, - crBBox.top - fHeight * 0.48f), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(crBBox.right - fWidth * 0.45f + fWidth * 0.08f * 0.2f, - crBBox.top - fHeight * 0.48f + fHeight * 0.18f * 0.2f), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(crBBox.right - fWidth * 0.37f - fWidth * 0.08f * 0.2f, - crBBox.top - fHeight * 0.36f - fHeight * 0.18f * 0.7f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.37f, - crBBox.top - fHeight * 0.36f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.37f, - crBBox.top - fHeight * 0.36f + - FX_BEZIER * fHeight * 0.13f), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth * 0.5f + FX_BEZIER * fWidth * 0.13f, - crBBox.bottom + fHeight * 0.77f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.5f, - crBBox.bottom + fHeight * 0.77f), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth * 0.5f - FX_BEZIER * fWidth * 0.13f, - crBBox.bottom + fHeight * 0.77f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.37f, - crBBox.top - fHeight * 0.36f + - FX_BEZIER * fHeight * 0.13f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.37f, - crBBox.top - fHeight * 0.36f), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth * 0.37f, - crBBox.top - fHeight * 0.36f - fWidth * 0.1f * 0.6f), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth * 0.27f, - crBBox.top - fHeight * 0.36f - fWidth * 0.1f * 0.6f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.27f, - crBBox.top - fHeight * 0.36f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.56f, - crBBox.bottom + fHeight * 0.13f), - PWLPT_MOVETO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.56f, - crBBox.bottom + fHeight * 0.13f + - FX_BEZIER * fHeight * 0.055f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.505f - - FX_BEZIER * fWidth * 0.095f, - crBBox.bottom + fHeight * 0.185f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.505f, - crBBox.bottom + fHeight * 0.185f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.505f + - FX_BEZIER * fWidth * 0.065f, - crBBox.bottom + fHeight * 0.185f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.44f, - crBBox.bottom + fHeight * 0.13f + - FX_BEZIER * fHeight * 0.055f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.44f, - crBBox.bottom + fHeight * 0.13f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.44f, - crBBox.bottom + fHeight * 0.13f - - FX_BEZIER * fHeight * 0.055f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.505f + - FX_BEZIER * fWidth * 0.065f, - crBBox.bottom + fHeight * 0.075f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.505f, - crBBox.bottom + fHeight * 0.075f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.505f - - FX_BEZIER * fWidth * 0.065f, - crBBox.bottom + fHeight * 0.075f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.56f, - crBBox.bottom + fHeight * 0.13f - - FX_BEZIER * fHeight * 0.055f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.56f, - crBBox.bottom + fHeight * 0.13f), - PWLPT_BEZIERTO)}; - - if (type == PWLPT_STREAM) - sPathData = GetAppStreamFromArray(PathArray, 59); - else - GetPathDataFromArray(path, PathArray, 59); -} - -void CPWL_Utils::GetGraphics_InsertText(CFX_ByteString& sPathData, - CFX_PathData& path, - const CFX_FloatRect& crBBox, - const PWL_PATH_TYPE type) { - FX_FLOAT fWidth = crBBox.right - crBBox.left; - FX_FLOAT fHeight = crBBox.top - crBBox.bottom; - - CPWL_PathData PathArray[] = { - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth / 10, crBBox.bottom + fHeight / 10), - PWLPT_MOVETO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth / 2, crBBox.top - fHeight * 2 / 15), - PWLPT_LINETO), - CPWL_PathData( - CPWL_Point(crBBox.right - fWidth / 10, crBBox.bottom + fHeight / 10), - PWLPT_LINETO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth / 10, crBBox.bottom + fHeight / 10), - PWLPT_LINETO)}; - - if (type == PWLPT_STREAM) - sPathData = GetAppStreamFromArray(PathArray, 4); - else - GetPathDataFromArray(path, PathArray, 4); -} - -void CPWL_Utils::GetGraphics_Key(CFX_ByteString& sPathData, - CFX_PathData& path, - const CFX_FloatRect& crBBox, - const PWL_PATH_TYPE type) { - FX_FLOAT fWidth = crBBox.right - crBBox.left; - FX_FLOAT fHeight = crBBox.top - crBBox.bottom; - FX_FLOAT k = -fHeight / fWidth; - CPWL_Point tail; - CPWL_Point CicleCenter; - tail.x = crBBox.left + fWidth * 0.9f; - tail.y = k * (tail.x - crBBox.right) + crBBox.bottom; - CicleCenter.x = crBBox.left + fWidth * 0.15f; - CicleCenter.y = k * (CicleCenter.x - crBBox.right) + crBBox.bottom; - - CPWL_PathData PathArray[] = { - CPWL_PathData( - CPWL_Point(tail.x + fWidth / 30.0f, -fWidth / 30.0f / k + tail.y), - PWLPT_MOVETO), - CPWL_PathData(CPWL_Point(tail.x + fWidth / 30.0f - fWidth * 0.18f, - -k * fWidth * 0.18f - fWidth / 30 / k + tail.y), - PWLPT_LINETO), - CPWL_PathData( - CPWL_Point(tail.x + fWidth / 30 - fWidth * 0.18f + fWidth * 0.07f, - -fWidth * 0.07f / k - k * fWidth * 0.18f - - fWidth / 30 / k + tail.y), - PWLPT_LINETO), - CPWL_PathData( - CPWL_Point(tail.x + fWidth / 30 - fWidth * 0.18f - fWidth / 20 + - fWidth * 0.07f, - -fWidth * 0.07f / k - k * fWidth / 20 - - k * fWidth * 0.18f - fWidth / 30 / k + tail.y), - PWLPT_LINETO), - CPWL_PathData( - CPWL_Point( - tail.x + fWidth / 30 - fWidth * 0.18f - fWidth / 20, - -k * fWidth / 20 - k * fWidth * 0.18f - fWidth / 30 / k + tail.y), - PWLPT_LINETO), - CPWL_PathData( - CPWL_Point( - tail.x + fWidth / 30 - fWidth * 0.18f - fWidth / 20 - fWidth / 15, - -k * fWidth / 15 - k * fWidth / 20 - k * fWidth * 0.18f - - fWidth / 30 / k + tail.y), - PWLPT_LINETO), - CPWL_PathData( - CPWL_Point(tail.x + fWidth / 30 - fWidth * 0.18f - fWidth / 20 - - fWidth / 15 + fWidth * 0.07f, - -fWidth * 0.07f / k - k * fWidth / 15 - k * fWidth / 20 - - k * fWidth * 0.18f - fWidth / 30 / k + tail.y), - PWLPT_LINETO), - CPWL_PathData( - CPWL_Point(tail.x + fWidth / 30 - fWidth * 0.18f - fWidth / 20 - - fWidth / 15 - fWidth / 20 + fWidth * 0.07f, - -fWidth * 0.07f / k + -k * fWidth / 20 + -k * fWidth / 15 - - k * fWidth / 20 - k * fWidth * 0.18f - - fWidth / 30 / k + tail.y), - PWLPT_LINETO), - CPWL_PathData( - CPWL_Point(tail.x + fWidth / 30 - fWidth * 0.18f - fWidth / 20 - - fWidth / 15 - fWidth / 20, - -k * fWidth / 20 + -k * fWidth / 15 - k * fWidth / 20 - - k * fWidth * 0.18f - fWidth / 30 / k + tail.y), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(tail.x + fWidth / 30 - fWidth * 0.45f, - -k * fWidth * 0.45f - fWidth / 30 / k + tail.y), - PWLPT_LINETO), - CPWL_PathData( - CPWL_Point(tail.x + fWidth / 30 - fWidth * 0.45f + fWidth * 0.2f, - -fWidth * 0.4f / k - k * fWidth * 0.45f - fWidth / 30 / k + - tail.y), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(CicleCenter.x + fWidth * 0.2f, - -fWidth * 0.1f / k + CicleCenter.y), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(CicleCenter.x, CicleCenter.y), PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(CicleCenter.x - fWidth / 60.0f, - -k * fWidth / 60 + CicleCenter.y), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(CicleCenter.x - fWidth / 60, - -k * fWidth / 60 + CicleCenter.y), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(CicleCenter.x, CicleCenter.y), PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(CicleCenter.x - fWidth * 0.22f, - fWidth * 0.35f / k + CicleCenter.y - fHeight * 0.05f), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(tail.x - fWidth / 30 - fWidth * 0.45f - fWidth * 0.18f, - fWidth * 0.05f / k - k * fWidth * 0.45f + fWidth / 30 / k + - tail.y - fHeight * 0.05f), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(tail.x - fWidth / 30.0f - fWidth * 0.45f, - -k * fWidth * 0.45f + fWidth / 30.0f / k + tail.y), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(tail.x - fWidth / 30.0f, fWidth / 30.0f / k + tail.y), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(tail.x + fWidth / 30, -fWidth / 30 / k + tail.y), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(CicleCenter.x + fWidth * 0.08f, - k * fWidth * 0.08f + CicleCenter.y), - PWLPT_MOVETO), - CPWL_PathData( - CPWL_Point(CicleCenter.x + fWidth * 0.08f + fWidth * 0.1f, - -fWidth * 0.1f / k + k * fWidth * 0.08f + CicleCenter.y), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(CicleCenter.x + fWidth * 0.22f + fWidth * 0.1f, - k * fWidth * 0.22f + CicleCenter.y - fWidth * 0.1f / k), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(CicleCenter.x + fWidth * 0.22f, - k * fWidth * 0.22f + CicleCenter.y), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(CicleCenter.x + fWidth * 0.22f - fWidth * 0.1f, - fWidth * 0.1f / k + k * fWidth * 0.22f + CicleCenter.y), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(CicleCenter.x + fWidth * 0.08f - fWidth * 0.1f, - fWidth * 0.1f / k + k * fWidth * 0.08f + CicleCenter.y), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(CicleCenter.x + fWidth * 0.08f, - k * fWidth * 0.08f + CicleCenter.y), - PWLPT_BEZIERTO)}; - - if (type == PWLPT_STREAM) - sPathData = GetAppStreamFromArray(PathArray, 28); - else - GetPathDataFromArray(path, PathArray, 28); -} - -void CPWL_Utils::GetGraphics_NewParagraph(CFX_ByteString& sPathData, - CFX_PathData& path, - const CFX_FloatRect& crBBox, - const PWL_PATH_TYPE type) { - FX_FLOAT fWidth = crBBox.right - crBBox.left; - FX_FLOAT fHeight = crBBox.top - crBBox.bottom; - - CPWL_PathData PathArray[] = { - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth / 2.0f, crBBox.top - fHeight / 20.0f), - PWLPT_MOVETO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth / 10.0f, crBBox.top - fHeight / 2.0f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 10.0f, - crBBox.top - fHeight / 2.0f), - PWLPT_LINETO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth / 2.0f, crBBox.top - fHeight / 20.0f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.12f, - crBBox.top - fHeight * 17 / 30.0f), - PWLPT_MOVETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.12f, - crBBox.bottom + fHeight / 10.0f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.22f, - crBBox.bottom + fHeight / 10.0f), - PWLPT_LINETO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth * 0.22f, - crBBox.top - fHeight * 17 / 30.0f - fWidth * 0.14f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.38f, - crBBox.bottom + fHeight / 10.0f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.48f, - crBBox.bottom + fHeight / 10.0f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.48f, - crBBox.top - fHeight * 17 / 30.0f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.38f, - crBBox.top - fHeight * 17 / 30.0f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.38f, - crBBox.bottom + fWidth * 0.24f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.22f, - crBBox.top - fHeight * 17 / 30.0f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.12f, - crBBox.top - fHeight * 17 / 30.0f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.6f, - crBBox.bottom + fHeight / 10.0f), - PWLPT_MOVETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.7f, - crBBox.bottom + fHeight / 10.0f), - PWLPT_LINETO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth * 0.7f, - crBBox.bottom + fHeight / 10.0f + fHeight / 7.0f), - PWLPT_LINETO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth * 0.97f, - crBBox.bottom + fHeight / 10.0f + fHeight / 7.0f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.97f, - crBBox.top - fHeight * 17 / 30.0f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.7f, - crBBox.top - fHeight * 17 / 30.0f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.6f, - crBBox.top - fHeight * 17 / 30.0f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.6f, - crBBox.bottom + fHeight / 10.0f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.7f, - crBBox.bottom + fHeight / 7 + fHeight * 0.18f), - PWLPT_MOVETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.85f, - crBBox.bottom + fHeight / 7 + fHeight * 0.18f), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth * 0.85f, - crBBox.top - fHeight * 17 / 30.0f - fHeight * 0.08f), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth * 0.7f, - crBBox.top - fHeight * 17 / 30.0f - fHeight * 0.08f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.7f, - crBBox.bottom + fHeight / 7 + fHeight * 0.18f), - PWLPT_LINETO)}; - - if (type == PWLPT_STREAM) - sPathData = GetAppStreamFromArray(PathArray, 28); - else - GetPathDataFromArray(path, PathArray, 28); -} - -void CPWL_Utils::GetGraphics_TextNote(CFX_ByteString& sPathData, - CFX_PathData& path, - const CFX_FloatRect& crBBox, - const PWL_PATH_TYPE type) { - FX_FLOAT fWidth = crBBox.right - crBBox.left; - FX_FLOAT fHeight = crBBox.top - crBBox.bottom; - - CPWL_PathData PathArray[] = { - CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 3 / 10.0f, - crBBox.bottom + fHeight / 15.0f), - PWLPT_MOVETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 7 / 10.0f, - crBBox.bottom + fHeight * 4 / 15.0f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 10.0f, - crBBox.bottom + fHeight * 4 / 15.0f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 10.0f, - crBBox.top - fHeight / 15.0f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 10.0f, - crBBox.top - fHeight / 15.0f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 10.0f, - crBBox.bottom + fHeight / 15.0f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 3 / 10.0f, - crBBox.bottom + fHeight / 15.0f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 10.0f, - crBBox.bottom + fHeight * 4 / 15.0f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 3 / 10.0f, - crBBox.bottom + fHeight / 15.0f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 3 / 10.0f, - crBBox.bottom + fHeight * 4 / 15.0f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 10.0f, - crBBox.bottom + fHeight * 4 / 15.0f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 5.0f, - crBBox.top - fHeight * 4 / 15.0f), - PWLPT_MOVETO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 5.0f, - crBBox.top - fHeight * 4 / 15.0f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 5.0f, - crBBox.top - fHeight * 7 / 15.0f), - PWLPT_MOVETO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 5.0f, - crBBox.top - fHeight * 7 / 15.0f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 5.0f, - crBBox.top - fHeight * 10 / 15.0f), - PWLPT_MOVETO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 3 / 10.0f, - crBBox.top - fHeight * 10 / 15.0f), - PWLPT_LINETO)}; - - if (type == PWLPT_STREAM) - sPathData = GetAppStreamFromArray(PathArray, 17); - else - GetPathDataFromArray(path, PathArray, 17); -} - -void CPWL_Utils::GetGraphics_Paragraph(CFX_ByteString& sPathData, - CFX_PathData& path, - const CFX_FloatRect& crBBox, - const PWL_PATH_TYPE type) { - FX_FLOAT fWidth = crBBox.right - crBBox.left; - FX_FLOAT fHeight = crBBox.top - crBBox.bottom; - - CPWL_PathData PathArray[] = { - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth / 2.0f, crBBox.top - fHeight / 15.0f), - PWLPT_MOVETO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth * 0.7f, crBBox.top - fHeight / 15.0f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.7f, - crBBox.bottom + fHeight / 15.0f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.634f, - crBBox.bottom + fHeight / 15.0f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.634f, - crBBox.top - fHeight * 2 / 15.0f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.566f, - crBBox.top - fHeight * 2 / 15.0f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.566f, - crBBox.bottom + fHeight / 15.0f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 2.0f, - crBBox.bottom + fHeight / 15.0f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 2.0f, - crBBox.top - fHeight / 15.0f - fHeight * 0.4f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.2f, - crBBox.top - fHeight / 15.0f - fHeight * 0.4f), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth * 0.2f, crBBox.top - fHeight / 15.0f), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth / 2.0f, crBBox.top - fHeight / 15.0f), - PWLPT_BEZIERTO)}; - - if (type == PWLPT_STREAM) - sPathData = GetAppStreamFromArray(PathArray, 12); - else - GetPathDataFromArray(path, PathArray, 12); -} - -void CPWL_Utils::GetGraphics_RightArrow(CFX_ByteString& sPathData, - CFX_PathData& path, - const CFX_FloatRect& crBBox, - const PWL_PATH_TYPE type) { - FX_FLOAT fWidth = crBBox.right - crBBox.left; - FX_FLOAT fHeight = crBBox.top - crBBox.bottom; - - CPWL_PathData PathArray[] = { - CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 15.0f, - crBBox.top - fHeight / 2.0f), - PWLPT_MOVETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 2.0f + fWidth / 8.0f, - crBBox.bottom + fHeight / 5.0f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 2.0f, - crBBox.bottom + fHeight / 5.0f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 15.0f - fWidth * 0.15f, - crBBox.top - fHeight / 2.0f - fWidth / 25.0f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.1f, - crBBox.top - fHeight / 2.0f - fWidth / 25.0f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.1f, - crBBox.top - fHeight / 2.0f + fWidth / 25.0f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 15.0f - fWidth * 0.15f, - crBBox.top - fHeight / 2.0f + fWidth / 25.0f), - PWLPT_LINETO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth / 2.0f, crBBox.top - fHeight / 5.0f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 2.0f + fWidth / 8.0f, - crBBox.top - fHeight / 5.0f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 15.0f, - crBBox.top - fHeight / 2.0f), - PWLPT_LINETO)}; - - if (type == PWLPT_STREAM) - sPathData = GetAppStreamFromArray(PathArray, 10); - else - GetPathDataFromArray(path, PathArray, 10); -} - -void CPWL_Utils::GetGraphics_RightPointer(CFX_ByteString& sPathData, - CFX_PathData& path, - const CFX_FloatRect& crBBox, - const PWL_PATH_TYPE type) { - FX_FLOAT fWidth = crBBox.right - crBBox.left; - FX_FLOAT fHeight = crBBox.top - crBBox.bottom; - - CPWL_PathData PathArray[] = { - CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 30.0f, - crBBox.top - fHeight / 2.0f), - PWLPT_MOVETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 30.0f, - crBBox.bottom + fHeight / 6.0f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 4 / 15.0f, - crBBox.top - fHeight / 2.0f), - PWLPT_LINETO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth / 30.0f, crBBox.top - fHeight / 6.0f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 30.0f, - crBBox.top - fHeight / 2.0f), - PWLPT_LINETO)}; - - if (type == PWLPT_STREAM) - sPathData = GetAppStreamFromArray(PathArray, 5); - else - GetPathDataFromArray(path, PathArray, 5); -} - -void CPWL_Utils::GetGraphics_Star(CFX_ByteString& sPathData, - CFX_PathData& path, - const CFX_FloatRect& crBBox, - const PWL_PATH_TYPE type) { - FX_FLOAT fLongRadius = - (crBBox.top - crBBox.bottom) / (1 + (FX_FLOAT)cos(FX_PI / 5.0f)); - fLongRadius = fLongRadius * 0.7f; - FX_FLOAT fShortRadius = fLongRadius * 0.55f; - CFX_FloatPoint ptCenter = CFX_FloatPoint((crBBox.left + crBBox.right) / 2.0f, - (crBBox.top + crBBox.bottom) / 2.0f); - - FX_FLOAT px1[5], py1[5]; - FX_FLOAT px2[5], py2[5]; - - FX_FLOAT fAngel = FX_PI / 10.0f; - - for (int32_t i = 0; i < 5; i++) { - px1[i] = ptCenter.x + fLongRadius * (FX_FLOAT)cos(fAngel); - py1[i] = ptCenter.y + fLongRadius * (FX_FLOAT)sin(fAngel); - - fAngel += FX_PI * 2 / 5.0f; - } - - fAngel = FX_PI / 5.0f + FX_PI / 10.0f; - - for (int32_t j = 0; j < 5; j++) { - px2[j] = ptCenter.x + fShortRadius * (FX_FLOAT)cos(fAngel); - py2[j] = ptCenter.y + fShortRadius * (FX_FLOAT)sin(fAngel); - - fAngel += FX_PI * 2 / 5.0f; - } - - CPWL_PathData PathArray[11]; - PathArray[0] = CPWL_PathData(CPWL_Point(px1[0], py1[0]), PWLPT_MOVETO); - PathArray[1] = CPWL_PathData(CPWL_Point(px2[0], py2[0]), PWLPT_LINETO); - - for (int32_t k = 0; k < 4; k++) { - PathArray[(k + 1) * 2] = - CPWL_PathData(CPWL_Point(px1[k + 1], py1[k + 1]), PWLPT_LINETO); - PathArray[(k + 1) * 2 + 1] = - CPWL_PathData(CPWL_Point(px2[k + 1], py2[k + 1]), PWLPT_LINETO); - } - - PathArray[10] = CPWL_PathData(CPWL_Point(px1[0], py1[0]), PWLPT_LINETO); - - if (type == PWLPT_STREAM) - sPathData = GetAppStreamFromArray(PathArray, 11); - else - GetPathDataFromArray(path, PathArray, 11); -} - -void CPWL_Utils::GetGraphics_UpArrow(CFX_ByteString& sPathData, - CFX_PathData& path, - const CFX_FloatRect& crBBox, - const PWL_PATH_TYPE type) { - FX_FLOAT fWidth = crBBox.right - crBBox.left; - FX_FLOAT fHeight = crBBox.top - crBBox.bottom; - - CPWL_PathData PathArray[] = { - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth / 2.0f, crBBox.top - fHeight / 15.0f), - PWLPT_MOVETO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 10.0f, - crBBox.top - fWidth * 3 / 5.0f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.6f, - crBBox.top - fWidth * 3 / 5.0f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.6f, - crBBox.bottom + fHeight / 15.0f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.4f, - crBBox.bottom + fHeight / 15.0f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.4f, - crBBox.top - fWidth * 3 / 5.0f), - PWLPT_LINETO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth / 10, crBBox.top - fWidth * 3 / 5.0f), - PWLPT_LINETO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth / 2.0f, crBBox.top - fHeight / 15.0f), - PWLPT_LINETO)}; - - if (type == PWLPT_STREAM) - sPathData = GetAppStreamFromArray(PathArray, 8); - else - GetPathDataFromArray(path, PathArray, 8); -} - -void CPWL_Utils::GetGraphics_UpLeftArrow(CFX_ByteString& sPathData, - CFX_PathData& path, - const CFX_FloatRect& crBBox, - const PWL_PATH_TYPE type) { - FX_FLOAT fWidth = crBBox.right - crBBox.left; - FX_FLOAT fHeight = crBBox.top - crBBox.bottom; - CPWL_Point leftup(crBBox.left, crBBox.top); - CPWL_Point rightdown(crBBox.right, crBBox.bottom); - FX_FLOAT k = -fHeight / fWidth; - CPWL_Point tail; - tail.x = crBBox.left + fWidth * 4 / 5.0f; - tail.y = k * (tail.x - crBBox.right) + rightdown.y; - - CPWL_PathData PathArray[] = { - CPWL_PathData( - CPWL_Point( - crBBox.left + fWidth / 20.0f, - k * (crBBox.left + fWidth / 20.0f - rightdown.x) + rightdown.y), - PWLPT_MOVETO), - CPWL_PathData(CPWL_Point(fHeight * 17 / 60.0f / k + tail.x + - fWidth / 10.0f + fWidth / 5.0f, - -fWidth / 5.0f / k + tail.y - - fWidth / 10.0f / k + fHeight * 17 / 60.0f), - PWLPT_LINETO), - CPWL_PathData( - CPWL_Point(fHeight * 17 / 60.0f / k + tail.x + fWidth / 10.0f, - tail.y - fWidth / 10.0f / k + fHeight * 17 / 60.0f), - PWLPT_LINETO), - CPWL_PathData( - CPWL_Point(tail.x + fWidth / 10.0f, tail.y - fWidth / 10.0f / k), - PWLPT_LINETO), - CPWL_PathData( - CPWL_Point(tail.x - fWidth / 10.0f, tail.y + fWidth / 10.0f / k), - PWLPT_LINETO), - CPWL_PathData( - CPWL_Point(fHeight * 17 / 60.0f / k + tail.x - fWidth / 10.0f, - tail.y + fWidth / 10.0f / k + fHeight * 17 / 60.0f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(fHeight * 17 / 60.0f / k + tail.x - - fWidth / 10.0f - fWidth / 5.0f, - fWidth / 5.0f / k + tail.y + fWidth / 10.0f / k + - fHeight * 17 / 60.0f), - PWLPT_LINETO), - CPWL_PathData( - CPWL_Point( - crBBox.left + fWidth / 20.0f, - k * (crBBox.left + fWidth / 20.0f - rightdown.x) + rightdown.y), - PWLPT_LINETO)}; - - if (type == PWLPT_STREAM) - sPathData = GetAppStreamFromArray(PathArray, 8); - else - GetPathDataFromArray(path, PathArray, 8); -} - -void CPWL_Utils::GetGraphics_Graph(CFX_ByteString& sPathData, - CFX_PathData& path, - const CFX_FloatRect& crBBox, - const PWL_PATH_TYPE type) { - FX_FLOAT fWidth = crBBox.right - crBBox.left; - FX_FLOAT fHeight = crBBox.top - crBBox.bottom; - - CPWL_PathData PathArray[] = { - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth * 0.05f, crBBox.top - fWidth * 0.15f), - PWLPT_MOVETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.25f, - crBBox.top - fHeight * 0.15f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.275f, - crBBox.bottom + fHeight * 0.08f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.05f, - crBBox.bottom + fHeight * 0.08f), - PWLPT_LINETO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth * 0.05f, crBBox.top - fWidth * 0.15f), - PWLPT_LINETO), - - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.275f, - crBBox.top - fWidth * 0.45f), - PWLPT_MOVETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.475f, - crBBox.top - fWidth * 0.45f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.475f, - crBBox.bottom + fHeight * 0.08f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.275f, - crBBox.bottom + fHeight * 0.08f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.275f, - crBBox.top - fWidth * 0.45f), - PWLPT_LINETO), - - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth * 0.5f, crBBox.top - fHeight * 0.05f), - PWLPT_MOVETO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth * 0.7f, crBBox.top - fHeight * 0.05f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.7f, - crBBox.bottom + fHeight * 0.08f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.5f, - crBBox.bottom + fHeight * 0.08f), - PWLPT_LINETO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth * 0.5f, crBBox.top - fHeight * 0.05f), - PWLPT_LINETO), - - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.725f, - crBBox.top - fWidth * 0.35f), - PWLPT_MOVETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.925f, - crBBox.top - fWidth * 0.35f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.925f, - crBBox.bottom + fHeight * 0.08f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.725f, - crBBox.bottom + fHeight * 0.08f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.725f, - crBBox.top - fWidth * 0.35f), - PWLPT_LINETO)}; - - if (type == PWLPT_STREAM) - sPathData = GetAppStreamFromArray(PathArray, 20); - else - GetPathDataFromArray(path, PathArray, 20); -} - -void CPWL_Utils::GetGraphics_Paperclip(CFX_ByteString& sPathData, - CFX_PathData& path, - const CFX_FloatRect& crBBox, - const PWL_PATH_TYPE type) { - FX_FLOAT fWidth = crBBox.right - crBBox.left; - FX_FLOAT fHeight = crBBox.top - crBBox.bottom; - - CPWL_PathData PathArray[] = { - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth / 60, crBBox.top - fHeight * 0.25f), - PWLPT_MOVETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 60, - crBBox.bottom + fHeight * 0.25f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 60, - crBBox.bottom + fHeight * 0.25f - - fWidth * 57 / 60.0f * 0.35f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 30, - crBBox.bottom + fHeight * 0.25f - - fWidth * 57 / 60.0f * 0.35f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 30, - crBBox.bottom + fHeight * 0.25f), - PWLPT_BEZIERTO), - - CPWL_PathData( - CPWL_Point(crBBox.right - fWidth / 30, crBBox.top - fHeight * 0.33f), - PWLPT_LINETO), - CPWL_PathData( - CPWL_Point(crBBox.right - fWidth / 30, - crBBox.top - fHeight * 0.33f + fHeight / 15 * 0.5f), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(crBBox.right - fWidth / 30 - fWidth * 0.12f, - crBBox.top - fHeight * 0.33f + fHeight / 15 * 0.5f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 30 - fWidth * 0.12f, - crBBox.top - fHeight * 0.33f), - PWLPT_BEZIERTO), - - CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 30 - fWidth * 0.12f, - crBBox.bottom + fHeight * 0.2f), - PWLPT_LINETO), - CPWL_PathData( - CPWL_Point(crBBox.right - fWidth / 30 - fWidth * 0.12f, - crBBox.bottom + fHeight * 0.2f - - (fWidth * 57 / 60.0f - fWidth * 0.24f) * 0.25f), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth / 60 + fWidth * 0.12f, - crBBox.bottom + fHeight * 0.2f - - (fWidth * 57 / 60.0f - fWidth * 0.24f) * 0.25f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 60 + fWidth * 0.12f, - crBBox.bottom + fHeight * 0.2f), - PWLPT_BEZIERTO), - - CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 60 + fWidth * 0.12f, - crBBox.top - fHeight * 0.2f), - PWLPT_LINETO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth / 60 + fWidth * 0.12f, - crBBox.top - fHeight * 0.2f + - (fWidth * 11 / 12.0f - fWidth * 0.36f) * 0.25f), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(crBBox.right - fWidth / 15 - fWidth * 0.24f, - crBBox.top - fHeight * 0.2f + - (fWidth * 11 / 12.0f - fWidth * 0.36f) * 0.25f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 15 - fWidth * 0.24f, - crBBox.top - fHeight * 0.2f), - PWLPT_BEZIERTO), - - CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 15 - fWidth * 0.24f, - crBBox.bottom + fHeight * 0.25f), - PWLPT_LINETO), - CPWL_PathData( - CPWL_Point(crBBox.right - fWidth / 15 - fWidth * 0.24f, - crBBox.bottom + fHeight * 0.25f - - (fWidth * 14 / 15.0f - fWidth * 0.53f) * 0.25f), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth * 0.29f, - crBBox.bottom + fHeight * 0.25f - - (fWidth * 14 / 15.0f - fWidth * 0.53f) * 0.25f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.29f, - crBBox.bottom + fHeight * 0.25f), - PWLPT_BEZIERTO), - - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.29f, - crBBox.top - fHeight * 0.33f), - PWLPT_LINETO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth * 0.29f, - crBBox.top - fHeight * 0.33f + fWidth * 0.12f * 0.35f), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth * 0.17f, - crBBox.top - fHeight * 0.33f + fWidth * 0.12f * 0.35f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.17f, - crBBox.top - fHeight * 0.33f), - PWLPT_BEZIERTO), - - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.17f, - crBBox.bottom + fHeight * 0.3f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.17f, - crBBox.bottom + fHeight * 0.3f - - fWidth * (14 / 15.0f - 0.29f) * 0.35f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 15 - fWidth * 0.12f, - crBBox.bottom + fHeight * 0.3f - - fWidth * (14 / 15.0f - 0.29f) * 0.35f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 15 - fWidth * 0.12f, - crBBox.bottom + fHeight * 0.3f), - PWLPT_BEZIERTO), - - CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 15 - fWidth * 0.12f, - crBBox.top - fHeight * 0.25f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth / 15 - fWidth * 0.12f, - crBBox.top - fHeight * 0.25f + - fWidth * 0.35f * (11 / 12.0f - 0.12f)), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 60, - crBBox.top - fHeight * 0.25f + - fWidth * 0.35f * (11 / 12.0f - 0.12f)), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth / 60, crBBox.top - fHeight * 0.25f), - PWLPT_BEZIERTO)}; - - if (type == PWLPT_STREAM) - sPathData = GetAppStreamFromArray(PathArray, 33); - else - GetPathDataFromArray(path, PathArray, 33); -} - -void CPWL_Utils::GetGraphics_Attachment(CFX_ByteString& sPathData, - CFX_PathData& path, - const CFX_FloatRect& crBBox, - const PWL_PATH_TYPE type) { - FX_FLOAT fWidth = crBBox.right - crBBox.left; - FX_FLOAT fHeight = crBBox.top - crBBox.bottom; - - CPWL_PathData PathArray[] = { - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth * 0.25f, crBBox.top - fHeight * 0.1f), - PWLPT_MOVETO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth * 0.4f, crBBox.top - fHeight * 0.23f), - PWLPT_LINETO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth * 0.4f, crBBox.top - fHeight * 0.5f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.4f, - crBBox.top - fHeight * 0.5f + fWidth * 0.04f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.6f, - crBBox.top - fHeight * 0.5f + fWidth * 0.04f), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth * 0.6f, crBBox.top - fHeight * 0.5f), - PWLPT_BEZIERTO), - - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth * 0.6f, crBBox.top - fHeight * 0.23f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.25f, - crBBox.top - fHeight * 0.1f), - PWLPT_LINETO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth * 0.25f, crBBox.top - fHeight * 0.1f), - PWLPT_LINETO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth * 0.4f, crBBox.top - fHeight * 0.23f), - PWLPT_LINETO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth * 0.6f, crBBox.top - fHeight * 0.23f), - PWLPT_LINETO), - - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth * 0.4f, crBBox.top - fHeight * 0.5f), - PWLPT_MOVETO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth * 0.4f - fWidth * 0.25f * 0.4f, - crBBox.top - fHeight * 0.5f), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth * 0.15f, - crBBox.top - fHeight * 0.65f + fHeight * 0.15f * 0.4f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.15f, - crBBox.top - fHeight * 0.65f), - PWLPT_BEZIERTO), - - CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.15f, - crBBox.top - fHeight * 0.65f), - PWLPT_LINETO), - CPWL_PathData( - CPWL_Point(crBBox.right - fWidth * 0.15f, - crBBox.top - fHeight * 0.65f + fHeight * 0.15f * 0.4f), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth * 0.6f + fWidth * 0.25f * 0.4f, - crBBox.top - fHeight * 0.5f), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth * 0.6f, crBBox.top - fHeight * 0.5f), - PWLPT_BEZIERTO), - - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.6f, - crBBox.top - fHeight * 0.5f + fWidth * 0.04f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.4f, - crBBox.top - fHeight * 0.5f + fWidth * 0.04f), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth * 0.4f, crBBox.top - fHeight * 0.5f), - PWLPT_BEZIERTO), - - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth * 0.5f, crBBox.top - fHeight * 0.65f), - PWLPT_MOVETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.5f, - crBBox.bottom + fHeight * 0.1f), - PWLPT_LINETO)}; - - if (type == PWLPT_STREAM) - sPathData = GetAppStreamFromArray(PathArray, 24); - else - GetPathDataFromArray(path, PathArray, 24); -} - -void CPWL_Utils::GetGraphics_Tag(CFX_ByteString& sPathData, - CFX_PathData& path, - const CFX_FloatRect& crBBox, - const PWL_PATH_TYPE type) { - FX_FLOAT fWidth = crBBox.right - crBBox.left; - FX_FLOAT fHeight = crBBox.top - crBBox.bottom; - - CPWL_PathData PathArray[] = { - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth * 0.4f, crBBox.top - fHeight * 0.1f), - PWLPT_MOVETO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth * 0.1f, crBBox.top - fHeight * 0.5f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 0.3f, - crBBox.bottom + fHeight * 0.1f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crBBox.right - fWidth * 0.1f, - crBBox.bottom + fHeight * 0.1f), - PWLPT_LINETO), - CPWL_PathData( - CPWL_Point(crBBox.right - fWidth * 0.1f, crBBox.top - fHeight * 0.1f), - PWLPT_LINETO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth * 0.4f, crBBox.top - fHeight * 0.1f), - PWLPT_LINETO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth * 0.4f, crBBox.top - fHeight * 0.3f), - PWLPT_MOVETO), - CPWL_PathData( - CPWL_Point(crBBox.right - fWidth * 0.2f, crBBox.top - fHeight * 0.3f), - PWLPT_LINETO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth * 0.4f, crBBox.top - fHeight * 0.5f), - PWLPT_MOVETO), - CPWL_PathData( - CPWL_Point(crBBox.right - fWidth * 0.2f, crBBox.top - fHeight * 0.5f), - PWLPT_LINETO), - CPWL_PathData( - CPWL_Point(crBBox.left + fWidth * 0.4f, crBBox.top - fHeight * 0.7f), - PWLPT_MOVETO), - CPWL_PathData( - CPWL_Point(crBBox.right - fWidth * 0.2f, crBBox.top - fHeight * 0.7f), - PWLPT_LINETO)}; - - if (type == PWLPT_STREAM) - sPathData = GetAppStreamFromArray(PathArray, 12); - else - GetPathDataFromArray(path, PathArray, 12); -} - -void CPWL_Utils::GetGraphics_Foxit(CFX_ByteString& sPathData, - CFX_PathData& path, - const CFX_FloatRect& crBBox, - const PWL_PATH_TYPE type) { - FX_FLOAT fOutWidth = crBBox.right - crBBox.left; - FX_FLOAT fOutHeight = crBBox.top - crBBox.bottom; - - CFX_FloatRect crInBox = crBBox; - crInBox.left = crBBox.left + fOutWidth * 0.08f; - crInBox.right = crBBox.right - fOutWidth * 0.08f; - crInBox.top = crBBox.top - fOutHeight * 0.08f; - crInBox.bottom = crBBox.bottom + fOutHeight * 0.08f; - - FX_FLOAT fWidth = crInBox.right - crInBox.left; - FX_FLOAT fHeight = crInBox.top - crInBox.bottom; - - CPWL_PathData PathArray[] = { - CPWL_PathData(CPWL_Point(crInBox.left, crInBox.top), PWLPT_MOVETO), - CPWL_PathData(CPWL_Point(crInBox.left + fWidth * 0.45f, crInBox.top), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crInBox.left + fWidth * 0.45f, - crInBox.top - FX_BEZIER * fHeight * 0.4f), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(crInBox.left + fWidth * 0.45f - FX_BEZIER * fWidth * 0.45f, - crInBox.top - fHeight * 0.4f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crInBox.left, crInBox.top - fHeight * 0.4f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crInBox.left, crInBox.top), PWLPT_LINETO), - - CPWL_PathData(CPWL_Point(crInBox.left + fWidth * 0.60f, crInBox.top), - PWLPT_MOVETO), - CPWL_PathData(CPWL_Point(crInBox.left + fWidth * 0.75f, crInBox.top), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crInBox.left + fWidth * 0.75f, - crInBox.top - FX_BEZIER * fHeight * 0.7f), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(crInBox.left + fWidth * 0.75f - FX_BEZIER * fWidth * 0.75f, - crInBox.top - fHeight * 0.7f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crInBox.left, crInBox.top - fHeight * 0.7f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crInBox.left, crInBox.top - fHeight * 0.55f), - PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crInBox.left + FX_BEZIER * fWidth * 0.60f, - crInBox.top - fHeight * 0.55f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crInBox.left + fWidth * 0.60f, - crInBox.top - FX_BEZIER * fHeight * 0.55f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crInBox.left + fWidth * 0.60f, crInBox.top), - PWLPT_BEZIERTO), - - CPWL_PathData(CPWL_Point(crInBox.left + fWidth * 0.90f, crInBox.top), - PWLPT_MOVETO), - CPWL_PathData(CPWL_Point(crInBox.left + fWidth * 0.90f, - crInBox.top - FX_BEZIER * fHeight * 0.85f), - PWLPT_BEZIERTO), - CPWL_PathData( - CPWL_Point(crInBox.left + fWidth * 0.90f - FX_BEZIER * fWidth * 0.90f, - crInBox.top - fHeight * 0.85f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crInBox.left, crInBox.top - fHeight * 0.85f), - PWLPT_BEZIERTO), - CPWL_PathData(CPWL_Point(crInBox.left, crInBox.bottom), PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crInBox.right, crInBox.bottom), PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crInBox.right, crInBox.top), PWLPT_LINETO), - CPWL_PathData(CPWL_Point(crInBox.left + fWidth * 0.90f, crInBox.top), - PWLPT_LINETO), - }; - - if (type == PWLPT_STREAM) - sPathData = GetAppStreamFromArray(PathArray, 23); - else - GetPathDataFromArray(path, PathArray, 23); -} - -void CPWL_Color::ConvertColorType(int32_t other_nColorType) { - switch (other_nColorType) { - case COLORTYPE_TRANSPARENT: - break; - case COLORTYPE_GRAY: - switch (other_nColorType) { - case COLORTYPE_RGB: - CPWL_Utils::ConvertGRAY2RGB(fColor1, fColor1, fColor2, fColor3); - break; - case COLORTYPE_CMYK: - CPWL_Utils::ConvertGRAY2CMYK(fColor1, fColor1, fColor2, fColor3, - fColor4); - break; - } - break; - case COLORTYPE_RGB: - switch (other_nColorType) { - case COLORTYPE_GRAY: - CPWL_Utils::ConvertRGB2GRAY(fColor1, fColor2, fColor3, fColor1); - break; - case COLORTYPE_CMYK: - CPWL_Utils::ConvertRGB2CMYK(fColor1, fColor2, fColor3, fColor1, - fColor2, fColor3, fColor4); - break; - } - break; - case COLORTYPE_CMYK: - switch (other_nColorType) { - case COLORTYPE_GRAY: - CPWL_Utils::ConvertCMYK2GRAY(fColor1, fColor2, fColor3, fColor4, - fColor1); - break; - case COLORTYPE_RGB: - CPWL_Utils::ConvertCMYK2RGB(fColor1, fColor2, fColor3, fColor4, - fColor1, fColor2, fColor3); - break; - } - break; - } - nColorType = other_nColorType; -} diff --git a/fpdfsdk/src/pdfwindow/PWL_Wnd.cpp b/fpdfsdk/src/pdfwindow/PWL_Wnd.cpp deleted file mode 100644 index 28bd0e04ed..0000000000 --- a/fpdfsdk/src/pdfwindow/PWL_Wnd.cpp +++ /dev/null @@ -1,1041 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include <map> - -#include "fpdfsdk/include/pdfwindow/PWL_ScrollBar.h" -#include "fpdfsdk/include/pdfwindow/PWL_Utils.h" -#include "fpdfsdk/include/pdfwindow/PWL_Wnd.h" - -static std::map<int32_t, CPWL_Timer*>& GetPWLTimeMap() { - // Leak the object at shutdown. - static auto timeMap = new std::map<int32_t, CPWL_Timer*>; - return *timeMap; -} - -CPWL_Timer::CPWL_Timer(CPWL_TimerHandler* pAttached, - IFX_SystemHandler* pSystemHandler) - : m_nTimerID(0), m_pAttached(pAttached), m_pSystemHandler(pSystemHandler) { - ASSERT(m_pAttached); - ASSERT(m_pSystemHandler); -} - -CPWL_Timer::~CPWL_Timer() { - KillPWLTimer(); -} - -int32_t CPWL_Timer::SetPWLTimer(int32_t nElapse) { - if (m_nTimerID != 0) - KillPWLTimer(); - m_nTimerID = m_pSystemHandler->SetTimer(nElapse, TimerProc); - - GetPWLTimeMap()[m_nTimerID] = this; - return m_nTimerID; -} - -void CPWL_Timer::KillPWLTimer() { - if (m_nTimerID == 0) - return; - - m_pSystemHandler->KillTimer(m_nTimerID); - GetPWLTimeMap().erase(m_nTimerID); - m_nTimerID = 0; -} - -void CPWL_Timer::TimerProc(int32_t idEvent) { - auto it = GetPWLTimeMap().find(idEvent); - if (it == GetPWLTimeMap().end()) - return; - - CPWL_Timer* pTimer = it->second; - if (pTimer->m_pAttached) - pTimer->m_pAttached->TimerProc(); -} - -CPWL_TimerHandler::CPWL_TimerHandler() : m_pTimer(NULL) {} - -CPWL_TimerHandler::~CPWL_TimerHandler() { - delete m_pTimer; -} - -void CPWL_TimerHandler::BeginTimer(int32_t nElapse) { - if (!m_pTimer) - m_pTimer = new CPWL_Timer(this, GetSystemHandler()); - - if (m_pTimer) - m_pTimer->SetPWLTimer(nElapse); -} - -void CPWL_TimerHandler::EndTimer() { - if (m_pTimer) - m_pTimer->KillPWLTimer(); -} - -void CPWL_TimerHandler::TimerProc() {} - -class CPWL_MsgControl { - friend class CPWL_Wnd; - - public: - explicit CPWL_MsgControl(CPWL_Wnd* pWnd) { - m_pCreatedWnd = pWnd; - Default(); - } - - ~CPWL_MsgControl() { - Default(); - } - - void Default() { - m_aMousePath.RemoveAll(); - m_aKeyboardPath.RemoveAll(); - m_pMainMouseWnd = NULL; - m_pMainKeyboardWnd = NULL; - } - - FX_BOOL IsWndCreated(const CPWL_Wnd* pWnd) const { - return m_pCreatedWnd == pWnd; - } - - FX_BOOL IsMainCaptureMouse(const CPWL_Wnd* pWnd) const { - return pWnd == m_pMainMouseWnd; - } - - FX_BOOL IsWndCaptureMouse(const CPWL_Wnd* pWnd) const { - if (pWnd) { - for (int32_t i = 0, sz = m_aMousePath.GetSize(); i < sz; i++) { - if (m_aMousePath.GetAt(i) == pWnd) - return TRUE; - } - } - - return FALSE; - } - - FX_BOOL IsMainCaptureKeyboard(const CPWL_Wnd* pWnd) const { - return pWnd == m_pMainKeyboardWnd; - } - - FX_BOOL IsWndCaptureKeyboard(const CPWL_Wnd* pWnd) const { - if (pWnd) { - for (int32_t i = 0, sz = m_aKeyboardPath.GetSize(); i < sz; i++) { - if (m_aKeyboardPath.GetAt(i) == pWnd) - return TRUE; - } - } - - return FALSE; - } - - void SetFocus(CPWL_Wnd* pWnd) { - m_aKeyboardPath.RemoveAll(); - - if (pWnd) { - m_pMainKeyboardWnd = pWnd; - - CPWL_Wnd* pParent = pWnd; - while (pParent) { - m_aKeyboardPath.Add(pParent); - pParent = pParent->GetParentWindow(); - } - - pWnd->OnSetFocus(); - } - } - - void KillFocus() { - if (m_aKeyboardPath.GetSize() > 0) - if (CPWL_Wnd* pWnd = m_aKeyboardPath.GetAt(0)) - pWnd->OnKillFocus(); - - m_pMainKeyboardWnd = NULL; - m_aKeyboardPath.RemoveAll(); - } - - void SetCapture(CPWL_Wnd* pWnd) { - m_aMousePath.RemoveAll(); - - if (pWnd) { - m_pMainMouseWnd = pWnd; - - CPWL_Wnd* pParent = pWnd; - while (pParent) { - m_aMousePath.Add(pParent); - pParent = pParent->GetParentWindow(); - } - } - } - - void ReleaseCapture() { - m_pMainMouseWnd = NULL; - m_aMousePath.RemoveAll(); - } - - private: - CFX_ArrayTemplate<CPWL_Wnd*> m_aMousePath; - CFX_ArrayTemplate<CPWL_Wnd*> m_aKeyboardPath; - CPWL_Wnd* m_pCreatedWnd; - CPWL_Wnd* m_pMainMouseWnd; - CPWL_Wnd* m_pMainKeyboardWnd; -}; - -CPWL_Wnd::CPWL_Wnd() - : m_pVScrollBar(NULL), - m_rcWindow(), - m_rcClip(), - m_bCreated(FALSE), - m_bVisible(FALSE), - m_bNotifying(FALSE), - m_bEnabled(TRUE) {} - -CPWL_Wnd::~CPWL_Wnd() { - ASSERT(m_bCreated == FALSE); -} - -CFX_ByteString CPWL_Wnd::GetClassName() const { - return "CPWL_Wnd"; -} - -void CPWL_Wnd::Create(const PWL_CREATEPARAM& cp) { - if (!IsValid()) { - m_sPrivateParam = cp; - - OnCreate(m_sPrivateParam); - - m_sPrivateParam.rcRectWnd.Normalize(); - m_rcWindow = m_sPrivateParam.rcRectWnd; - m_rcClip = CPWL_Utils::InflateRect(m_rcWindow, 1.0f); - - CreateMsgControl(); - - if (m_sPrivateParam.pParentWnd) - m_sPrivateParam.pParentWnd->OnNotify(this, PNM_ADDCHILD); - - PWL_CREATEPARAM ccp = m_sPrivateParam; - - ccp.dwFlags &= 0xFFFF0000L; // remove sub styles - ccp.mtChild = CFX_Matrix(1, 0, 0, 1, 0, 0); - - CreateScrollBar(ccp); - CreateChildWnd(ccp); - - m_bVisible = HasFlag(PWS_VISIBLE); - - OnCreated(); - - RePosChildWnd(); - m_bCreated = TRUE; - } -} - -void CPWL_Wnd::OnCreate(PWL_CREATEPARAM& cp) {} - -void CPWL_Wnd::OnCreated() {} - -void CPWL_Wnd::OnDestroy() {} - -void CPWL_Wnd::InvalidateFocusHandler(IPWL_FocusHandler* handler) { - if (m_sPrivateParam.pFocusHandler == handler) - m_sPrivateParam.pFocusHandler = nullptr; -} - -void CPWL_Wnd::InvalidateProvider(IPWL_Provider* provider) { - if (m_sPrivateParam.pProvider == provider) - m_sPrivateParam.pProvider = nullptr; -} - -void CPWL_Wnd::Destroy() { - KillFocus(); - - OnDestroy(); - - if (m_bCreated) { - for (int32_t i = m_aChildren.GetSize() - 1; i >= 0; i--) { - if (CPWL_Wnd* pChild = m_aChildren[i]) { - pChild->Destroy(); - delete pChild; - pChild = NULL; - } - } - - if (m_sPrivateParam.pParentWnd) - m_sPrivateParam.pParentWnd->OnNotify(this, PNM_REMOVECHILD); - m_bCreated = FALSE; - } - - DestroyMsgControl(); - - FXSYS_memset(&m_sPrivateParam, 0, sizeof(PWL_CREATEPARAM)); - m_aChildren.RemoveAll(); - m_pVScrollBar = NULL; -} - -void CPWL_Wnd::Move(const CFX_FloatRect& rcNew, - FX_BOOL bReset, - FX_BOOL bRefresh) { - if (IsValid()) { - CFX_FloatRect rcOld = GetWindowRect(); - - m_rcWindow = rcNew; - m_rcWindow.Normalize(); - - if (rcOld.left != rcNew.left || rcOld.right != rcNew.right || - rcOld.top != rcNew.top || rcOld.bottom != rcNew.bottom) { - if (bReset) { - RePosChildWnd(); - } - } - if (bRefresh) { - InvalidateRectMove(rcOld, rcNew); - } - - m_sPrivateParam.rcRectWnd = m_rcWindow; - } -} - -void CPWL_Wnd::InvalidateRectMove(const CFX_FloatRect& rcOld, - const CFX_FloatRect& rcNew) { - CFX_FloatRect rcUnion = rcOld; - rcUnion.Union(rcNew); - - InvalidateRect(&rcUnion); -} - -void CPWL_Wnd::GetAppearanceStream(CFX_ByteTextBuf& sAppStream) { - if (IsValid() && IsVisible()) { - GetThisAppearanceStream(sAppStream); - GetChildAppearanceStream(sAppStream); - } -} - -// if don't set,Get default apperance stream -void CPWL_Wnd::GetThisAppearanceStream(CFX_ByteTextBuf& sAppStream) { - CFX_FloatRect rectWnd = GetWindowRect(); - if (!rectWnd.IsEmpty()) { - CFX_ByteTextBuf sThis; - - if (HasFlag(PWS_BACKGROUND)) - sThis << CPWL_Utils::GetRectFillAppStream(rectWnd, GetBackgroundColor()); - - if (HasFlag(PWS_BORDER)) { - sThis << CPWL_Utils::GetBorderAppStream( - rectWnd, (FX_FLOAT)GetBorderWidth(), GetBorderColor(), - GetBorderLeftTopColor(GetBorderStyle()), - GetBorderRightBottomColor(GetBorderStyle()), GetBorderStyle(), - GetBorderDash()); - } - - sAppStream << sThis; - } -} - -void CPWL_Wnd::GetChildAppearanceStream(CFX_ByteTextBuf& sAppStream) { - for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) { - if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) { - pChild->GetAppearanceStream(sAppStream); - } - } -} - -void CPWL_Wnd::DrawAppearance(CFX_RenderDevice* pDevice, - CFX_Matrix* pUser2Device) { - if (IsValid() && IsVisible()) { - DrawThisAppearance(pDevice, pUser2Device); - DrawChildAppearance(pDevice, pUser2Device); - } -} - -void CPWL_Wnd::DrawThisAppearance(CFX_RenderDevice* pDevice, - CFX_Matrix* pUser2Device) { - CFX_FloatRect rectWnd = GetWindowRect(); - if (!rectWnd.IsEmpty()) { - if (HasFlag(PWS_BACKGROUND)) { - CFX_FloatRect rcClient = CPWL_Utils::DeflateRect( - rectWnd, (FX_FLOAT)(GetBorderWidth() + GetInnerBorderWidth())); - CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcClient, - GetBackgroundColor(), GetTransparency()); - } - - if (HasFlag(PWS_BORDER)) - CPWL_Utils::DrawBorder(pDevice, pUser2Device, rectWnd, - (FX_FLOAT)GetBorderWidth(), GetBorderColor(), - GetBorderLeftTopColor(GetBorderStyle()), - GetBorderRightBottomColor(GetBorderStyle()), - GetBorderStyle(), GetTransparency()); - } -} - -void CPWL_Wnd::DrawChildAppearance(CFX_RenderDevice* pDevice, - CFX_Matrix* pUser2Device) { - for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) { - if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) { - CFX_Matrix mt = pChild->GetChildMatrix(); - if (mt.IsIdentity()) { - pChild->DrawAppearance(pDevice, pUser2Device); - } else { - mt.Concat(*pUser2Device); - pChild->DrawAppearance(pDevice, &mt); - } - } - } -} - -void CPWL_Wnd::InvalidateRect(CFX_FloatRect* pRect) { - if (IsValid()) { - CFX_FloatRect rcRefresh = pRect ? *pRect : GetWindowRect(); - - if (!HasFlag(PWS_NOREFRESHCLIP)) { - CFX_FloatRect rcClip = GetClipRect(); - if (!rcClip.IsEmpty()) { - rcRefresh.Intersect(rcClip); - } - } - - FX_RECT rcWin = PWLtoWnd(rcRefresh); - rcWin.left -= PWL_INVALIDATE_INFLATE; - rcWin.top -= PWL_INVALIDATE_INFLATE; - rcWin.right += PWL_INVALIDATE_INFLATE; - rcWin.bottom += PWL_INVALIDATE_INFLATE; - - if (IFX_SystemHandler* pSH = GetSystemHandler()) { - if (FX_HWND hWnd = GetAttachedHWnd()) { - pSH->InvalidateRect(hWnd, rcWin); - } - } - } -} - -#define PWL_IMPLEMENT_KEY_METHOD(key_method_name) \ - FX_BOOL CPWL_Wnd::key_method_name(FX_WORD nChar, FX_DWORD nFlag) { \ - if (IsValid() && IsVisible() && IsEnabled()) { \ - if (IsWndCaptureKeyboard(this)) { \ - for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) { \ - if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) { \ - if (IsWndCaptureKeyboard(pChild)) { \ - return pChild->key_method_name(nChar, nFlag); \ - } \ - } \ - } \ - } \ - } \ - return FALSE; \ - } - -#define PWL_IMPLEMENT_MOUSE_METHOD(mouse_method_name) \ - FX_BOOL CPWL_Wnd::mouse_method_name(const CFX_FloatPoint& point, \ - FX_DWORD nFlag) { \ - if (IsValid() && IsVisible() && IsEnabled()) { \ - if (IsWndCaptureMouse(this)) { \ - for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) { \ - if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) { \ - if (IsWndCaptureMouse(pChild)) { \ - return pChild->mouse_method_name(pChild->ParentToChild(point), \ - nFlag); \ - } \ - } \ - } \ - SetCursor(); \ - } else { \ - for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) { \ - if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) { \ - if (pChild->WndHitTest(pChild->ParentToChild(point))) { \ - return pChild->mouse_method_name(pChild->ParentToChild(point), \ - nFlag); \ - } \ - } \ - } \ - if (WndHitTest(point)) \ - SetCursor(); \ - } \ - } \ - return FALSE; \ - } - -PWL_IMPLEMENT_KEY_METHOD(OnKeyDown) -PWL_IMPLEMENT_KEY_METHOD(OnKeyUp) -PWL_IMPLEMENT_KEY_METHOD(OnChar) - -PWL_IMPLEMENT_MOUSE_METHOD(OnLButtonDblClk) -PWL_IMPLEMENT_MOUSE_METHOD(OnLButtonDown) -PWL_IMPLEMENT_MOUSE_METHOD(OnLButtonUp) -PWL_IMPLEMENT_MOUSE_METHOD(OnMButtonDblClk) -PWL_IMPLEMENT_MOUSE_METHOD(OnMButtonDown) -PWL_IMPLEMENT_MOUSE_METHOD(OnMButtonUp) -PWL_IMPLEMENT_MOUSE_METHOD(OnRButtonDown) -PWL_IMPLEMENT_MOUSE_METHOD(OnRButtonUp) -PWL_IMPLEMENT_MOUSE_METHOD(OnMouseMove) - -FX_BOOL CPWL_Wnd::OnMouseWheel(short zDelta, - const CFX_FloatPoint& point, - FX_DWORD nFlag) { - if (IsValid() && IsVisible() && IsEnabled()) { - SetCursor(); - if (IsWndCaptureKeyboard(this)) { - for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) { - if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) { - if (IsWndCaptureKeyboard(pChild)) { - return pChild->OnMouseWheel(zDelta, pChild->ParentToChild(point), - nFlag); - } - } - } - } - } - return FALSE; -} - -void CPWL_Wnd::AddChild(CPWL_Wnd* pWnd) { - m_aChildren.Add(pWnd); -} - -void CPWL_Wnd::RemoveChild(CPWL_Wnd* pWnd) { - for (int32_t i = m_aChildren.GetSize() - 1; i >= 0; i--) { - if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) { - if (pChild == pWnd) { - m_aChildren.RemoveAt(i); - break; - } - } - } -} - -void CPWL_Wnd::OnNotify(CPWL_Wnd* pWnd, - FX_DWORD msg, - intptr_t wParam, - intptr_t lParam) { - switch (msg) { - case PNM_ADDCHILD: - AddChild(pWnd); - break; - case PNM_REMOVECHILD: - RemoveChild(pWnd); - break; - default: - break; - } -} - -FX_BOOL CPWL_Wnd::IsValid() const { - return m_bCreated; -} - -const PWL_CREATEPARAM& CPWL_Wnd::GetCreationParam() const { - return m_sPrivateParam; -} - -CPWL_Wnd* CPWL_Wnd::GetParentWindow() const { - return m_sPrivateParam.pParentWnd; -} - -CFX_FloatRect CPWL_Wnd::GetWindowRect() const { - return m_rcWindow; -} - -CFX_FloatRect CPWL_Wnd::GetClientRect() const { - CFX_FloatRect rcWindow = GetWindowRect(); - CFX_FloatRect rcClient = CPWL_Utils::DeflateRect( - rcWindow, (FX_FLOAT)(GetBorderWidth() + GetInnerBorderWidth())); - if (CPWL_ScrollBar* pVSB = GetVScrollBar()) - rcClient.right -= pVSB->GetScrollBarWidth(); - - rcClient.Normalize(); - return rcWindow.Contains(rcClient) ? rcClient : CFX_FloatRect(); -} - -CFX_FloatPoint CPWL_Wnd::GetCenterPoint() const { - CFX_FloatRect rcClient = GetClientRect(); - return CFX_FloatPoint((rcClient.left + rcClient.right) * 0.5f, - (rcClient.top + rcClient.bottom) * 0.5f); -} - -FX_BOOL CPWL_Wnd::HasFlag(FX_DWORD dwFlags) const { - return (m_sPrivateParam.dwFlags & dwFlags) != 0; -} - -void CPWL_Wnd::RemoveFlag(FX_DWORD dwFlags) { - m_sPrivateParam.dwFlags &= ~dwFlags; -} - -void CPWL_Wnd::AddFlag(FX_DWORD dwFlags) { - m_sPrivateParam.dwFlags |= dwFlags; -} - -CPWL_Color CPWL_Wnd::GetBackgroundColor() const { - return m_sPrivateParam.sBackgroundColor; -} - -void CPWL_Wnd::SetBackgroundColor(const CPWL_Color& color) { - m_sPrivateParam.sBackgroundColor = color; -} - -void CPWL_Wnd::SetTextColor(const CPWL_Color& color) { - m_sPrivateParam.sTextColor = color; -} - -void CPWL_Wnd::SetTextStrokeColor(const CPWL_Color& color) { - m_sPrivateParam.sTextStrokeColor = color; -} - -CPWL_Color CPWL_Wnd::GetTextColor() const { - return m_sPrivateParam.sTextColor; -} - -CPWL_Color CPWL_Wnd::GetTextStrokeColor() const { - return m_sPrivateParam.sTextStrokeColor; -} - -int32_t CPWL_Wnd::GetBorderStyle() const { - return m_sPrivateParam.nBorderStyle; -} - -void CPWL_Wnd::SetBorderStyle(int32_t nBorderStyle) { - if (HasFlag(PWS_BORDER)) - m_sPrivateParam.nBorderStyle = nBorderStyle; -} - -int32_t CPWL_Wnd::GetBorderWidth() const { - if (HasFlag(PWS_BORDER)) - return m_sPrivateParam.dwBorderWidth; - - return 0; -} - -int32_t CPWL_Wnd::GetInnerBorderWidth() const { - return 0; -} - -CPWL_Color CPWL_Wnd::GetBorderColor() const { - if (HasFlag(PWS_BORDER)) - return m_sPrivateParam.sBorderColor; - - return CPWL_Color(); -} - -const CPWL_Dash& CPWL_Wnd::GetBorderDash() const { - return m_sPrivateParam.sDash; -} - -void* CPWL_Wnd::GetAttachedData() const { - return m_sPrivateParam.pAttachedData; -} - -CPWL_ScrollBar* CPWL_Wnd::GetVScrollBar() const { - if (HasFlag(PWS_VSCROLL)) - return m_pVScrollBar; - - return NULL; -} - -void CPWL_Wnd::CreateScrollBar(const PWL_CREATEPARAM& cp) { - CreateVScrollBar(cp); -} - -void CPWL_Wnd::CreateVScrollBar(const PWL_CREATEPARAM& cp) { - if (!m_pVScrollBar && HasFlag(PWS_VSCROLL)) { - PWL_CREATEPARAM scp = cp; - - // flags - scp.dwFlags = - PWS_CHILD | PWS_BACKGROUND | PWS_AUTOTRANSPARENT | PWS_NOREFRESHCLIP; - - scp.pParentWnd = this; - scp.sBackgroundColor = PWL_DEFAULT_WHITECOLOR; - scp.eCursorType = FXCT_ARROW; - scp.nTransparency = PWL_SCROLLBAR_TRANSPARANCY; - - m_pVScrollBar = new CPWL_ScrollBar(SBT_VSCROLL); - m_pVScrollBar->Create(scp); - } -} - -void CPWL_Wnd::SetCapture() { - if (CPWL_MsgControl* pMsgCtrl = GetMsgControl()) - pMsgCtrl->SetCapture(this); -} - -void CPWL_Wnd::ReleaseCapture() { - for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) - if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) - pChild->ReleaseCapture(); - - if (CPWL_MsgControl* pMsgCtrl = GetMsgControl()) - pMsgCtrl->ReleaseCapture(); -} - -void CPWL_Wnd::SetFocus() { - if (CPWL_MsgControl* pMsgCtrl = GetMsgControl()) { - if (!pMsgCtrl->IsMainCaptureKeyboard(this)) - pMsgCtrl->KillFocus(); - pMsgCtrl->SetFocus(this); - } -} - -void CPWL_Wnd::KillFocus() { - if (CPWL_MsgControl* pMsgCtrl = GetMsgControl()) { - if (pMsgCtrl->IsWndCaptureKeyboard(this)) - pMsgCtrl->KillFocus(); - } -} - -void CPWL_Wnd::OnSetFocus() {} - -void CPWL_Wnd::OnKillFocus() {} - -FX_BOOL CPWL_Wnd::WndHitTest(const CFX_FloatPoint& point) const { - return IsValid() && IsVisible() && GetWindowRect().Contains(point.x, point.y); -} - -FX_BOOL CPWL_Wnd::ClientHitTest(const CFX_FloatPoint& point) const { - return IsValid() && IsVisible() && GetClientRect().Contains(point.x, point.y); -} - -const CPWL_Wnd* CPWL_Wnd::GetRootWnd() const { - if (m_sPrivateParam.pParentWnd) - return m_sPrivateParam.pParentWnd->GetRootWnd(); - - return this; -} - -void CPWL_Wnd::SetVisible(FX_BOOL bVisible) { - if (IsValid()) { - for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) { - if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) { - pChild->SetVisible(bVisible); - } - } - - if (bVisible != m_bVisible) { - m_bVisible = bVisible; - RePosChildWnd(); - InvalidateRect(); - } - } -} - -void CPWL_Wnd::SetClipRect(const CFX_FloatRect& rect) { - m_rcClip = rect; - m_rcClip.Normalize(); -} - -const CFX_FloatRect& CPWL_Wnd::GetClipRect() const { - return m_rcClip; -} - -FX_BOOL CPWL_Wnd::IsReadOnly() const { - return HasFlag(PWS_READONLY); -} - -void CPWL_Wnd::RePosChildWnd() { - CFX_FloatRect rcContent = CPWL_Utils::DeflateRect( - GetWindowRect(), (FX_FLOAT)(GetBorderWidth() + GetInnerBorderWidth())); - - CPWL_ScrollBar* pVSB = GetVScrollBar(); - - CFX_FloatRect rcVScroll = - CFX_FloatRect(rcContent.right - PWL_SCROLLBAR_WIDTH, rcContent.bottom, - rcContent.right - 1.0f, rcContent.top); - - if (pVSB) - pVSB->Move(rcVScroll, TRUE, FALSE); -} - -void CPWL_Wnd::CreateChildWnd(const PWL_CREATEPARAM& cp) {} - -void CPWL_Wnd::SetCursor() { - if (IsValid()) { - if (IFX_SystemHandler* pSH = GetSystemHandler()) { - int32_t nCursorType = GetCreationParam().eCursorType; - pSH->SetCursor(nCursorType); - } - } -} - -void CPWL_Wnd::CreateMsgControl() { - if (!m_sPrivateParam.pMsgControl) - m_sPrivateParam.pMsgControl = new CPWL_MsgControl(this); -} - -void CPWL_Wnd::DestroyMsgControl() { - if (CPWL_MsgControl* pMsgControl = GetMsgControl()) - if (pMsgControl->IsWndCreated(this)) - delete pMsgControl; -} - -CPWL_MsgControl* CPWL_Wnd::GetMsgControl() const { - return m_sPrivateParam.pMsgControl; -} - -FX_BOOL CPWL_Wnd::IsCaptureMouse() const { - return IsWndCaptureMouse(this); -} - -FX_BOOL CPWL_Wnd::IsWndCaptureMouse(const CPWL_Wnd* pWnd) const { - if (CPWL_MsgControl* pCtrl = GetMsgControl()) - return pCtrl->IsWndCaptureMouse(pWnd); - - return FALSE; -} - -FX_BOOL CPWL_Wnd::IsWndCaptureKeyboard(const CPWL_Wnd* pWnd) const { - if (CPWL_MsgControl* pCtrl = GetMsgControl()) - return pCtrl->IsWndCaptureKeyboard(pWnd); - - return FALSE; -} - -FX_BOOL CPWL_Wnd::IsFocused() const { - if (CPWL_MsgControl* pCtrl = GetMsgControl()) - return pCtrl->IsMainCaptureKeyboard(this); - - return FALSE; -} - -CFX_FloatRect CPWL_Wnd::GetFocusRect() const { - return CPWL_Utils::InflateRect(GetWindowRect(), 1); -} - -FX_FLOAT CPWL_Wnd::GetFontSize() const { - return m_sPrivateParam.fFontSize; -} - -void CPWL_Wnd::SetFontSize(FX_FLOAT fFontSize) { - m_sPrivateParam.fFontSize = fFontSize; -} - -IFX_SystemHandler* CPWL_Wnd::GetSystemHandler() const { - return m_sPrivateParam.pSystemHandler; -} - -IPWL_FocusHandler* CPWL_Wnd::GetFocusHandler() const { - return m_sPrivateParam.pFocusHandler; -} - -IPWL_Provider* CPWL_Wnd::GetProvider() const { - return m_sPrivateParam.pProvider; -} - -IFX_Edit_FontMap* CPWL_Wnd::GetFontMap() const { - return m_sPrivateParam.pFontMap; -} - -CPWL_Color CPWL_Wnd::GetBorderLeftTopColor(int32_t nBorderStyle) const { - CPWL_Color color; - - switch (nBorderStyle) { - case PBS_SOLID: - break; - case PBS_DASH: - break; - case PBS_BEVELED: - color = CPWL_Color(COLORTYPE_GRAY, 1); - break; - case PBS_INSET: - color = CPWL_Color(COLORTYPE_GRAY, 0.5f); - break; - case PBS_UNDERLINED: - break; - } - - return color; -} - -CPWL_Color CPWL_Wnd::GetBorderRightBottomColor(int32_t nBorderStyle) const { - CPWL_Color color; - - switch (nBorderStyle) { - case PBS_SOLID: - break; - case PBS_DASH: - break; - case PBS_BEVELED: - color = CPWL_Utils::DevideColor(GetBackgroundColor(), 2); - break; - case PBS_INSET: - color = CPWL_Color(COLORTYPE_GRAY, 0.75f); - break; - case PBS_UNDERLINED: - break; - } - - return color; -} - -int32_t CPWL_Wnd::GetTransparency() { - return m_sPrivateParam.nTransparency; -} - -void CPWL_Wnd::SetTransparency(int32_t nTransparency) { - for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) { - if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) { - pChild->SetTransparency(nTransparency); - } - } - - m_sPrivateParam.nTransparency = nTransparency; -} - -CFX_Matrix CPWL_Wnd::GetWindowMatrix() const { - CFX_Matrix mt = GetChildToRoot(); - - if (IPWL_Provider* pProvider = GetProvider()) { - mt.Concat(pProvider->GetWindowMatrix(GetAttachedData())); - return mt; - } - - return mt; -} - -void CPWL_Wnd::PWLtoWnd(const CFX_FloatPoint& point, - int32_t& x, - int32_t& y) const { - CFX_Matrix mt = GetWindowMatrix(); - CFX_FloatPoint pt = point; - mt.Transform(pt.x, pt.y); - x = (int32_t)(pt.x + 0.5); - y = (int32_t)(pt.y + 0.5); -} - -FX_RECT CPWL_Wnd::PWLtoWnd(const CFX_FloatRect& rect) const { - CFX_FloatRect rcTemp = rect; - CFX_Matrix mt = GetWindowMatrix(); - mt.TransformRect(rcTemp); - return FX_RECT((int32_t)(rcTemp.left + 0.5), (int32_t)(rcTemp.bottom + 0.5), - (int32_t)(rcTemp.right + 0.5), (int32_t)(rcTemp.top + 0.5)); -} - -FX_HWND CPWL_Wnd::GetAttachedHWnd() const { - return m_sPrivateParam.hAttachedWnd; -} - -CFX_FloatPoint CPWL_Wnd::ChildToParent(const CFX_FloatPoint& point) const { - CFX_Matrix mt = GetChildMatrix(); - if (mt.IsIdentity()) - return point; - - CFX_FloatPoint pt = point; - mt.Transform(pt.x, pt.y); - return pt; -} - -CFX_FloatRect CPWL_Wnd::ChildToParent(const CFX_FloatRect& rect) const { - CFX_Matrix mt = GetChildMatrix(); - if (mt.IsIdentity()) - return rect; - - CFX_FloatRect rc = rect; - mt.TransformRect(rc); - return rc; -} - -CFX_FloatPoint CPWL_Wnd::ParentToChild(const CFX_FloatPoint& point) const { - CFX_Matrix mt = GetChildMatrix(); - if (mt.IsIdentity()) - return point; - - mt.SetReverse(mt); - CFX_FloatPoint pt = point; - mt.Transform(pt.x, pt.y); - return pt; -} - -CFX_FloatRect CPWL_Wnd::ParentToChild(const CFX_FloatRect& rect) const { - CFX_Matrix mt = GetChildMatrix(); - if (mt.IsIdentity()) - return rect; - - mt.SetReverse(mt); - CFX_FloatRect rc = rect; - mt.TransformRect(rc); - return rc; -} - -CFX_Matrix CPWL_Wnd::GetChildToRoot() const { - CFX_Matrix mt(1, 0, 0, 1, 0, 0); - if (HasFlag(PWS_CHILD)) { - const CPWL_Wnd* pParent = this; - while (pParent) { - mt.Concat(pParent->GetChildMatrix()); - pParent = pParent->GetParentWindow(); - } - } - return mt; -} - -CFX_Matrix CPWL_Wnd::GetChildMatrix() const { - if (HasFlag(PWS_CHILD)) - return m_sPrivateParam.mtChild; - - return CFX_Matrix(1, 0, 0, 1, 0, 0); -} - -void CPWL_Wnd::SetChildMatrix(const CFX_Matrix& mt) { - m_sPrivateParam.mtChild = mt; -} - -const CPWL_Wnd* CPWL_Wnd::GetFocused() const { - if (CPWL_MsgControl* pMsgCtrl = GetMsgControl()) { - return pMsgCtrl->m_pMainKeyboardWnd; - } - - return NULL; -} - -void CPWL_Wnd::EnableWindow(FX_BOOL bEnable) { - if (m_bEnabled != bEnable) { - for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) { - if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) { - pChild->EnableWindow(bEnable); - } - } - - m_bEnabled = bEnable; - - if (bEnable) - OnEnabled(); - else - OnDisabled(); - } -} - -FX_BOOL CPWL_Wnd::IsEnabled() { - return m_bEnabled; -} - -void CPWL_Wnd::OnEnabled() {} - -void CPWL_Wnd::OnDisabled() {} - -FX_BOOL CPWL_Wnd::IsCTRLpressed(FX_DWORD nFlag) const { - if (IFX_SystemHandler* pSystemHandler = GetSystemHandler()) { - return pSystemHandler->IsCTRLKeyDown(nFlag); - } - - return FALSE; -} - -FX_BOOL CPWL_Wnd::IsSHIFTpressed(FX_DWORD nFlag) const { - if (IFX_SystemHandler* pSystemHandler = GetSystemHandler()) { - return pSystemHandler->IsSHIFTKeyDown(nFlag); - } - - return FALSE; -} - -FX_BOOL CPWL_Wnd::IsALTpressed(FX_DWORD nFlag) const { - if (IFX_SystemHandler* pSystemHandler = GetSystemHandler()) { - return pSystemHandler->IsALTKeyDown(nFlag); - } - - return FALSE; -} - -FX_BOOL CPWL_Wnd::IsINSERTpressed(FX_DWORD nFlag) const { - if (IFX_SystemHandler* pSystemHandler = GetSystemHandler()) { - return pSystemHandler->IsINSERTKeyDown(nFlag); - } - - return FALSE; -} |