You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
533 lines
20 KiB
533 lines
20 KiB
// 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 "xfa/fxfa/xfa_ffwidgethandler.h" |
|
|
|
#include <vector> |
|
|
|
#include "xfa/fxfa/app/xfa_ffchoicelist.h" |
|
#include "xfa/fxfa/app/xfa_fffield.h" |
|
#include "xfa/fxfa/app/xfa_fwladapter.h" |
|
#include "xfa/fxfa/parser/cxfa_layoutprocessor.h" |
|
#include "xfa/fxfa/parser/cxfa_measurement.h" |
|
#include "xfa/fxfa/xfa_ffdoc.h" |
|
#include "xfa/fxfa/xfa_ffdocview.h" |
|
#include "xfa/fxfa/xfa_ffwidget.h" |
|
|
|
CXFA_FFWidgetHandler::CXFA_FFWidgetHandler(CXFA_FFDocView* pDocView) |
|
: m_pDocView(pDocView) {} |
|
|
|
CXFA_FFWidgetHandler::~CXFA_FFWidgetHandler() {} |
|
|
|
bool CXFA_FFWidgetHandler::OnMouseEnter(CXFA_FFWidget* hWidget) { |
|
m_pDocView->LockUpdate(); |
|
bool bRet = hWidget->OnMouseEnter(); |
|
m_pDocView->UnlockUpdate(); |
|
m_pDocView->UpdateDocView(); |
|
return bRet; |
|
} |
|
|
|
bool CXFA_FFWidgetHandler::OnMouseExit(CXFA_FFWidget* hWidget) { |
|
m_pDocView->LockUpdate(); |
|
bool bRet = hWidget->OnMouseExit(); |
|
m_pDocView->UnlockUpdate(); |
|
m_pDocView->UpdateDocView(); |
|
return bRet; |
|
} |
|
|
|
bool CXFA_FFWidgetHandler::OnLButtonDown(CXFA_FFWidget* hWidget, |
|
uint32_t dwFlags, |
|
const CFX_PointF& point) { |
|
m_pDocView->LockUpdate(); |
|
bool bRet = hWidget->OnLButtonDown(dwFlags, hWidget->Rotate2Normal(point)); |
|
if (bRet && m_pDocView->SetFocus(hWidget)) { |
|
m_pDocView->GetDoc()->GetDocEnvironment()->SetFocusWidget( |
|
m_pDocView->GetDoc(), hWidget); |
|
} |
|
m_pDocView->UnlockUpdate(); |
|
m_pDocView->UpdateDocView(); |
|
return bRet; |
|
} |
|
|
|
bool CXFA_FFWidgetHandler::OnLButtonUp(CXFA_FFWidget* hWidget, |
|
uint32_t dwFlags, |
|
const CFX_PointF& point) { |
|
m_pDocView->LockUpdate(); |
|
m_pDocView->m_bLayoutEvent = true; |
|
bool bRet = hWidget->OnLButtonUp(dwFlags, hWidget->Rotate2Normal(point)); |
|
m_pDocView->UnlockUpdate(); |
|
m_pDocView->UpdateDocView(); |
|
return bRet; |
|
} |
|
|
|
bool CXFA_FFWidgetHandler::OnLButtonDblClk(CXFA_FFWidget* hWidget, |
|
uint32_t dwFlags, |
|
const CFX_PointF& point) { |
|
bool bRet = hWidget->OnLButtonDblClk(dwFlags, hWidget->Rotate2Normal(point)); |
|
m_pDocView->RunInvalidate(); |
|
return bRet; |
|
} |
|
|
|
bool CXFA_FFWidgetHandler::OnMouseMove(CXFA_FFWidget* hWidget, |
|
uint32_t dwFlags, |
|
const CFX_PointF& point) { |
|
bool bRet = hWidget->OnMouseMove(dwFlags, hWidget->Rotate2Normal(point)); |
|
m_pDocView->RunInvalidate(); |
|
return bRet; |
|
} |
|
|
|
bool CXFA_FFWidgetHandler::OnMouseWheel(CXFA_FFWidget* hWidget, |
|
uint32_t dwFlags, |
|
int16_t zDelta, |
|
const CFX_PointF& point) { |
|
bool bRet = |
|
hWidget->OnMouseWheel(dwFlags, zDelta, hWidget->Rotate2Normal(point)); |
|
m_pDocView->RunInvalidate(); |
|
return bRet; |
|
} |
|
|
|
bool CXFA_FFWidgetHandler::OnRButtonDown(CXFA_FFWidget* hWidget, |
|
uint32_t dwFlags, |
|
const CFX_PointF& point) { |
|
bool bRet = hWidget->OnRButtonDown(dwFlags, hWidget->Rotate2Normal(point)); |
|
if (bRet && m_pDocView->SetFocus(hWidget)) { |
|
m_pDocView->GetDoc()->GetDocEnvironment()->SetFocusWidget( |
|
m_pDocView->GetDoc(), hWidget); |
|
} |
|
m_pDocView->RunInvalidate(); |
|
return bRet; |
|
} |
|
|
|
bool CXFA_FFWidgetHandler::OnRButtonUp(CXFA_FFWidget* hWidget, |
|
uint32_t dwFlags, |
|
const CFX_PointF& point) { |
|
bool bRet = hWidget->OnRButtonUp(dwFlags, hWidget->Rotate2Normal(point)); |
|
m_pDocView->RunInvalidate(); |
|
return bRet; |
|
} |
|
|
|
bool CXFA_FFWidgetHandler::OnRButtonDblClk(CXFA_FFWidget* hWidget, |
|
uint32_t dwFlags, |
|
const CFX_PointF& point) { |
|
bool bRet = hWidget->OnRButtonDblClk(dwFlags, hWidget->Rotate2Normal(point)); |
|
m_pDocView->RunInvalidate(); |
|
return bRet; |
|
} |
|
|
|
bool CXFA_FFWidgetHandler::OnKeyDown(CXFA_FFWidget* hWidget, |
|
uint32_t dwKeyCode, |
|
uint32_t dwFlags) { |
|
bool bRet = hWidget->OnKeyDown(dwKeyCode, dwFlags); |
|
m_pDocView->RunInvalidate(); |
|
m_pDocView->UpdateDocView(); |
|
return bRet; |
|
} |
|
|
|
bool CXFA_FFWidgetHandler::OnKeyUp(CXFA_FFWidget* hWidget, |
|
uint32_t dwKeyCode, |
|
uint32_t dwFlags) { |
|
bool bRet = hWidget->OnKeyUp(dwKeyCode, dwFlags); |
|
m_pDocView->RunInvalidate(); |
|
return bRet; |
|
} |
|
|
|
bool CXFA_FFWidgetHandler::OnChar(CXFA_FFWidget* hWidget, |
|
uint32_t dwChar, |
|
uint32_t dwFlags) { |
|
bool bRet = hWidget->OnChar(dwChar, dwFlags); |
|
m_pDocView->RunInvalidate(); |
|
return bRet; |
|
} |
|
|
|
FWL_WidgetHit CXFA_FFWidgetHandler::OnHitTest(CXFA_FFWidget* hWidget, |
|
const CFX_PointF& point) { |
|
if (!(hWidget->GetStatus() & XFA_WidgetStatus_Visible)) |
|
return FWL_WidgetHit::Unknown; |
|
return hWidget->OnHitTest(hWidget->Rotate2Normal(point)); |
|
} |
|
|
|
bool CXFA_FFWidgetHandler::OnSetCursor(CXFA_FFWidget* hWidget, |
|
const CFX_PointF& point) { |
|
return hWidget->OnSetCursor(hWidget->Rotate2Normal(point)); |
|
} |
|
|
|
void CXFA_FFWidgetHandler::RenderWidget(CXFA_FFWidget* hWidget, |
|
CFX_Graphics* pGS, |
|
CFX_Matrix* pMatrix, |
|
bool bHighlight) { |
|
hWidget->RenderWidget(pGS, pMatrix, |
|
bHighlight ? XFA_WidgetStatus_Highlight : 0); |
|
} |
|
|
|
bool CXFA_FFWidgetHandler::HasEvent(CXFA_WidgetAcc* pWidgetAcc, |
|
XFA_EVENTTYPE eEventType) { |
|
if (!pWidgetAcc || eEventType == XFA_EVENT_Unknown) |
|
return false; |
|
if (pWidgetAcc->GetElementType() == XFA_Element::Draw) |
|
return false; |
|
|
|
switch (eEventType) { |
|
case XFA_EVENT_Calculate: { |
|
CXFA_Calculate calc = pWidgetAcc->GetCalculate(); |
|
if (!calc) |
|
return false; |
|
if (calc.GetScript()) |
|
return true; |
|
return false; |
|
} |
|
case XFA_EVENT_Validate: { |
|
CXFA_Validate val = pWidgetAcc->GetValidate(); |
|
if (!val) |
|
return false; |
|
if (val.GetScript()) |
|
return true; |
|
return false; |
|
} |
|
default: |
|
break; |
|
} |
|
CXFA_NodeArray eventArray; |
|
return pWidgetAcc->GetEventByActivity(gs_EventActivity[eEventType], |
|
eventArray) > 0; |
|
} |
|
|
|
int32_t CXFA_FFWidgetHandler::ProcessEvent(CXFA_WidgetAcc* pWidgetAcc, |
|
CXFA_EventParam* pParam) { |
|
if (!pParam || pParam->m_eType == XFA_EVENT_Unknown) |
|
return XFA_EVENTERROR_NotExist; |
|
if (!pWidgetAcc || pWidgetAcc->GetElementType() == XFA_Element::Draw) |
|
return XFA_EVENTERROR_NotExist; |
|
|
|
switch (pParam->m_eType) { |
|
case XFA_EVENT_Calculate: |
|
return pWidgetAcc->ProcessCalculate(); |
|
case XFA_EVENT_Validate: |
|
if (m_pDocView->GetDoc()->GetDocEnvironment()->IsValidationsEnabled( |
|
m_pDocView->GetDoc())) { |
|
return pWidgetAcc->ProcessValidate(); |
|
} |
|
return XFA_EVENTERROR_Disabled; |
|
case XFA_EVENT_InitCalculate: { |
|
CXFA_Calculate calc = pWidgetAcc->GetCalculate(); |
|
if (!calc) |
|
return XFA_EVENTERROR_NotExist; |
|
if (pWidgetAcc->GetNode()->IsUserInteractive()) |
|
return XFA_EVENTERROR_Disabled; |
|
|
|
CXFA_Script script = calc.GetScript(); |
|
return pWidgetAcc->ExecuteScript(script, pParam); |
|
} |
|
default: |
|
break; |
|
} |
|
int32_t iRet = |
|
pWidgetAcc->ProcessEvent(gs_EventActivity[pParam->m_eType], pParam); |
|
return iRet; |
|
} |
|
|
|
CXFA_FFWidget* CXFA_FFWidgetHandler::CreateWidget(CXFA_FFWidget* hParent, |
|
XFA_WIDGETTYPE eType, |
|
CXFA_FFWidget* hBefore) { |
|
CXFA_Node* pParentFormItem = |
|
hParent ? hParent->GetDataAcc()->GetNode() : nullptr; |
|
CXFA_Node* pBeforeFormItem = |
|
hBefore ? hBefore->GetDataAcc()->GetNode() : nullptr; |
|
CXFA_Node* pNewFormItem = |
|
CreateWidgetFormItem(eType, pParentFormItem, pBeforeFormItem); |
|
if (!pNewFormItem) |
|
return nullptr; |
|
|
|
pNewFormItem->GetTemplateNode()->SetFlag(XFA_NodeFlag_Initialized, true); |
|
pNewFormItem->SetFlag(XFA_NodeFlag_Initialized, true); |
|
m_pDocView->RunLayout(); |
|
CXFA_LayoutItem* pLayout = |
|
m_pDocView->GetXFALayout()->GetLayoutItem(pNewFormItem); |
|
return static_cast<CXFA_FFWidget*>(pLayout); |
|
} |
|
|
|
CXFA_Node* CXFA_FFWidgetHandler::CreateWidgetFormItem( |
|
XFA_WIDGETTYPE eType, |
|
CXFA_Node* pParent, |
|
CXFA_Node* pBefore) const { |
|
switch (eType) { |
|
case XFA_WIDGETTYPE_Barcode: |
|
return nullptr; |
|
case XFA_WIDGETTYPE_PushButton: |
|
return CreatePushButton(pParent, pBefore); |
|
case XFA_WIDGETTYPE_CheckButton: |
|
return CreateCheckButton(pParent, pBefore); |
|
case XFA_WIDGETTYPE_ExcludeGroup: |
|
return CreateExclGroup(pParent, pBefore); |
|
case XFA_WIDGETTYPE_RadioButton: |
|
return CreateRadioButton(pParent, pBefore); |
|
case XFA_WIDGETTYPE_Arc: |
|
return CreateArc(pParent, pBefore); |
|
case XFA_WIDGETTYPE_Rectangle: |
|
return CreateRectangle(pParent, pBefore); |
|
case XFA_WIDGETTYPE_Image: |
|
return CreateImage(pParent, pBefore); |
|
case XFA_WIDGETTYPE_Line: |
|
return CreateLine(pParent, pBefore); |
|
case XFA_WIDGETTYPE_Text: |
|
return CreateText(pParent, pBefore); |
|
case XFA_WIDGETTYPE_DatetimeEdit: |
|
return CreateDatetimeEdit(pParent, pBefore); |
|
case XFA_WIDGETTYPE_DecimalField: |
|
return CreateDecimalField(pParent, pBefore); |
|
case XFA_WIDGETTYPE_NumericField: |
|
return CreateNumericField(pParent, pBefore); |
|
case XFA_WIDGETTYPE_Signature: |
|
return CreateSignature(pParent, pBefore); |
|
case XFA_WIDGETTYPE_TextEdit: |
|
return CreateTextEdit(pParent, pBefore); |
|
case XFA_WIDGETTYPE_DropdownList: |
|
return CreateDropdownList(pParent, pBefore); |
|
case XFA_WIDGETTYPE_ListBox: |
|
return CreateListBox(pParent, pBefore); |
|
case XFA_WIDGETTYPE_ImageField: |
|
return CreateImageField(pParent, pBefore); |
|
case XFA_WIDGETTYPE_PasswordEdit: |
|
return CreatePasswordEdit(pParent, pBefore); |
|
case XFA_WIDGETTYPE_Subform: |
|
return CreateSubform(pParent, pBefore); |
|
default: |
|
return nullptr; |
|
} |
|
} |
|
|
|
CXFA_Node* CXFA_FFWidgetHandler::CreatePushButton(CXFA_Node* pParent, |
|
CXFA_Node* pBefore) const { |
|
CXFA_Node* pField = CreateField(XFA_Element::Button, pParent, pBefore); |
|
CXFA_Node* pCaption = CreateCopyNode(XFA_Element::Caption, pField); |
|
CXFA_Node* pValue = CreateCopyNode(XFA_Element::Value, pCaption); |
|
CXFA_Node* pText = CreateCopyNode(XFA_Element::Text, pValue); |
|
pText->SetContent(L"Button", L"Button", false); |
|
|
|
CXFA_Node* pPara = CreateCopyNode(XFA_Element::Para, pCaption); |
|
pPara->SetEnum(XFA_ATTRIBUTE_VAlign, XFA_ATTRIBUTEENUM_Middle, false); |
|
pPara->SetEnum(XFA_ATTRIBUTE_HAlign, XFA_ATTRIBUTEENUM_Center, false); |
|
CreateFontNode(pCaption); |
|
|
|
CXFA_Node* pBorder = CreateCopyNode(XFA_Element::Border, pField); |
|
pBorder->SetEnum(XFA_ATTRIBUTE_Hand, XFA_ATTRIBUTEENUM_Right, false); |
|
|
|
CXFA_Node* pEdge = CreateCopyNode(XFA_Element::Edge, pBorder); |
|
pEdge->SetEnum(XFA_ATTRIBUTE_Stroke, XFA_ATTRIBUTEENUM_Raised, false); |
|
|
|
CXFA_Node* pFill = CreateCopyNode(XFA_Element::Fill, pBorder); |
|
CXFA_Node* pColor = CreateCopyNode(XFA_Element::Color, pFill); |
|
pColor->SetCData(XFA_ATTRIBUTE_Value, L"212, 208, 200", false); |
|
|
|
CXFA_Node* pBind = CreateCopyNode(XFA_Element::Bind, pField); |
|
pBind->SetEnum(XFA_ATTRIBUTE_Match, XFA_ATTRIBUTEENUM_None); |
|
|
|
return pField; |
|
} |
|
|
|
CXFA_Node* CXFA_FFWidgetHandler::CreateCheckButton(CXFA_Node* pParent, |
|
CXFA_Node* pBefore) const { |
|
return CreateField(XFA_Element::CheckButton, pParent, pBefore); |
|
} |
|
|
|
CXFA_Node* CXFA_FFWidgetHandler::CreateExclGroup(CXFA_Node* pParent, |
|
CXFA_Node* pBefore) const { |
|
return CreateFormItem(XFA_Element::ExclGroup, pParent, pBefore); |
|
} |
|
|
|
CXFA_Node* CXFA_FFWidgetHandler::CreateRadioButton(CXFA_Node* pParent, |
|
CXFA_Node* pBefore) const { |
|
CXFA_Node* pField = CreateField(XFA_Element::CheckButton, pParent, pBefore); |
|
CXFA_Node* pUi = pField->GetFirstChildByClass(XFA_Element::Ui); |
|
CXFA_Node* pWidget = pUi->GetFirstChildByClass(XFA_Element::CheckButton); |
|
pWidget->SetEnum(XFA_ATTRIBUTE_Shape, XFA_ATTRIBUTEENUM_Round); |
|
return pField; |
|
} |
|
|
|
CXFA_Node* CXFA_FFWidgetHandler::CreateDatetimeEdit(CXFA_Node* pParent, |
|
CXFA_Node* pBefore) const { |
|
CXFA_Node* pField = CreateField(XFA_Element::DateTimeEdit, pParent, pBefore); |
|
CreateValueNode(XFA_Element::Date, pField); |
|
return pField; |
|
} |
|
|
|
CXFA_Node* CXFA_FFWidgetHandler::CreateDecimalField(CXFA_Node* pParent, |
|
CXFA_Node* pBefore) const { |
|
CXFA_Node* pField = CreateNumericField(pParent, pBefore); |
|
CreateValueNode(XFA_Element::Decimal, pField); |
|
return pField; |
|
} |
|
|
|
CXFA_Node* CXFA_FFWidgetHandler::CreateNumericField(CXFA_Node* pParent, |
|
CXFA_Node* pBefore) const { |
|
return CreateField(XFA_Element::NumericEdit, pParent, pBefore); |
|
} |
|
|
|
CXFA_Node* CXFA_FFWidgetHandler::CreateSignature(CXFA_Node* pParent, |
|
CXFA_Node* pBefore) const { |
|
return CreateField(XFA_Element::Signature, pParent, pBefore); |
|
} |
|
|
|
CXFA_Node* CXFA_FFWidgetHandler::CreateTextEdit(CXFA_Node* pParent, |
|
CXFA_Node* pBefore) const { |
|
return CreateField(XFA_Element::TextEdit, pParent, pBefore); |
|
} |
|
|
|
CXFA_Node* CXFA_FFWidgetHandler::CreateDropdownList(CXFA_Node* pParent, |
|
CXFA_Node* pBefore) const { |
|
return CreateField(XFA_Element::ChoiceList, pParent, pBefore); |
|
} |
|
|
|
CXFA_Node* CXFA_FFWidgetHandler::CreateListBox(CXFA_Node* pParent, |
|
CXFA_Node* pBefore) const { |
|
CXFA_Node* pField = CreateDropdownList(pParent, pBefore); |
|
CXFA_Node* pUi = pField->GetNodeItem(XFA_NODEITEM_FirstChild); |
|
CXFA_Node* pListBox = pUi->GetNodeItem(XFA_NODEITEM_FirstChild); |
|
pListBox->SetEnum(XFA_ATTRIBUTE_Open, XFA_ATTRIBUTEENUM_Always); |
|
pListBox->SetEnum(XFA_ATTRIBUTE_CommitOn, XFA_ATTRIBUTEENUM_Exit); |
|
return pField; |
|
} |
|
|
|
CXFA_Node* CXFA_FFWidgetHandler::CreateImageField(CXFA_Node* pParent, |
|
CXFA_Node* pBefore) const { |
|
return CreateField(XFA_Element::ImageEdit, pParent, pBefore); |
|
} |
|
|
|
CXFA_Node* CXFA_FFWidgetHandler::CreatePasswordEdit(CXFA_Node* pParent, |
|
CXFA_Node* pBefore) const { |
|
CXFA_Node* pField = CreateField(XFA_Element::PasswordEdit, pParent, pBefore); |
|
CXFA_Node* pBind = CreateCopyNode(XFA_Element::Bind, pField); |
|
pBind->SetEnum(XFA_ATTRIBUTE_Match, XFA_ATTRIBUTEENUM_None, false); |
|
return pField; |
|
} |
|
|
|
CXFA_Node* CXFA_FFWidgetHandler::CreateField(XFA_Element eElement, |
|
CXFA_Node* pParent, |
|
CXFA_Node* pBefore) const { |
|
CXFA_Node* pField = CreateFormItem(XFA_Element::Field, pParent, pBefore); |
|
CreateCopyNode(eElement, CreateCopyNode(XFA_Element::Ui, pField)); |
|
CreateFontNode(pField); |
|
return pField; |
|
} |
|
|
|
CXFA_Node* CXFA_FFWidgetHandler::CreateArc(CXFA_Node* pParent, |
|
CXFA_Node* pBefore) const { |
|
return CreateDraw(XFA_Element::Arc, pParent, pBefore); |
|
} |
|
|
|
CXFA_Node* CXFA_FFWidgetHandler::CreateRectangle(CXFA_Node* pParent, |
|
CXFA_Node* pBefore) const { |
|
return CreateDraw(XFA_Element::Rectangle, pParent, pBefore); |
|
} |
|
|
|
CXFA_Node* CXFA_FFWidgetHandler::CreateImage(CXFA_Node* pParent, |
|
CXFA_Node* pBefore) const { |
|
CXFA_Node* pField = CreateDraw(XFA_Element::Image, pParent, pBefore); |
|
CreateCopyNode(XFA_Element::ImageEdit, |
|
CreateCopyNode(XFA_Element::Ui, pField)); |
|
return pField; |
|
} |
|
|
|
CXFA_Node* CXFA_FFWidgetHandler::CreateLine(CXFA_Node* pParent, |
|
CXFA_Node* pBefore) const { |
|
return CreateDraw(XFA_Element::Line, pParent, pBefore); |
|
} |
|
|
|
CXFA_Node* CXFA_FFWidgetHandler::CreateText(CXFA_Node* pParent, |
|
CXFA_Node* pBefore) const { |
|
CXFA_Node* pField = CreateDraw(XFA_Element::Text, pParent, pBefore); |
|
CreateCopyNode(XFA_Element::TextEdit, |
|
CreateCopyNode(XFA_Element::Ui, pField)); |
|
CreateFontNode(pField); |
|
return pField; |
|
} |
|
|
|
CXFA_Node* CXFA_FFWidgetHandler::CreateDraw(XFA_Element eElement, |
|
CXFA_Node* pParent, |
|
CXFA_Node* pBefore) const { |
|
CXFA_Node* pDraw = CreateFormItem(XFA_Element::Draw, pParent, pBefore); |
|
CreateValueNode(eElement, pDraw); |
|
return pDraw; |
|
} |
|
|
|
CXFA_Node* CXFA_FFWidgetHandler::CreateSubform(CXFA_Node* pParent, |
|
CXFA_Node* pBefore) const { |
|
return CreateFormItem(XFA_Element::Subform, pParent, pBefore); |
|
} |
|
|
|
CXFA_Node* CXFA_FFWidgetHandler::CreateFormItem(XFA_Element eElement, |
|
CXFA_Node* pParent, |
|
CXFA_Node* pBefore) const { |
|
CXFA_Node* pTemplateParent = pParent ? pParent->GetTemplateNode() : nullptr; |
|
CXFA_Node* pNewFormItem = pTemplateParent->CloneTemplateToForm(false); |
|
if (pParent) |
|
pParent->InsertChild(pNewFormItem, pBefore); |
|
return pNewFormItem; |
|
} |
|
|
|
CXFA_Node* CXFA_FFWidgetHandler::CreateCopyNode(XFA_Element eElement, |
|
CXFA_Node* pParent, |
|
CXFA_Node* pBefore) const { |
|
CXFA_Node* pTemplateParent = pParent ? pParent->GetTemplateNode() : nullptr; |
|
CXFA_Node* pNewNode = |
|
CreateTemplateNode(eElement, pTemplateParent, |
|
pBefore ? pBefore->GetTemplateNode() : nullptr) |
|
->Clone(false); |
|
if (pParent) |
|
pParent->InsertChild(pNewNode, pBefore); |
|
return pNewNode; |
|
} |
|
|
|
CXFA_Node* CXFA_FFWidgetHandler::CreateTemplateNode(XFA_Element eElement, |
|
CXFA_Node* pParent, |
|
CXFA_Node* pBefore) const { |
|
CXFA_Document* pXFADoc = GetXFADoc(); |
|
CXFA_Node* pNewTemplateNode = |
|
pXFADoc->CreateNode(XFA_XDPPACKET_Template, eElement); |
|
if (pParent) |
|
pParent->InsertChild(pNewTemplateNode, pBefore); |
|
return pNewTemplateNode; |
|
} |
|
|
|
CXFA_Node* CXFA_FFWidgetHandler::CreateFontNode(CXFA_Node* pParent) const { |
|
CXFA_Node* pFont = CreateCopyNode(XFA_Element::Font, pParent); |
|
pFont->SetCData(XFA_ATTRIBUTE_Typeface, L"Myriad Pro", false); |
|
return pFont; |
|
} |
|
|
|
CXFA_Node* CXFA_FFWidgetHandler::CreateMarginNode(CXFA_Node* pParent, |
|
uint32_t dwFlags, |
|
FX_FLOAT fInsets[4]) const { |
|
CXFA_Node* pMargin = CreateCopyNode(XFA_Element::Margin, pParent); |
|
if (dwFlags & 0x01) |
|
pMargin->SetMeasure(XFA_ATTRIBUTE_LeftInset, |
|
CXFA_Measurement(fInsets[0], XFA_UNIT_Pt), false); |
|
if (dwFlags & 0x02) |
|
pMargin->SetMeasure(XFA_ATTRIBUTE_TopInset, |
|
CXFA_Measurement(fInsets[1], XFA_UNIT_Pt), false); |
|
if (dwFlags & 0x04) |
|
pMargin->SetMeasure(XFA_ATTRIBUTE_RightInset, |
|
CXFA_Measurement(fInsets[2], XFA_UNIT_Pt), false); |
|
if (dwFlags & 0x08) |
|
pMargin->SetMeasure(XFA_ATTRIBUTE_BottomInset, |
|
CXFA_Measurement(fInsets[3], XFA_UNIT_Pt), false); |
|
return pMargin; |
|
} |
|
|
|
CXFA_Node* CXFA_FFWidgetHandler::CreateValueNode(XFA_Element eValue, |
|
CXFA_Node* pParent) const { |
|
CXFA_Node* pValue = CreateCopyNode(XFA_Element::Value, pParent); |
|
CreateCopyNode(eValue, pValue); |
|
return pValue; |
|
} |
|
|
|
CXFA_Document* CXFA_FFWidgetHandler::GetObjFactory() const { |
|
return GetXFADoc(); |
|
} |
|
|
|
CXFA_Document* CXFA_FFWidgetHandler::GetXFADoc() const { |
|
return m_pDocView->GetDoc()->GetXFADoc(); |
|
} |
|
|
|
|