668 lines
24 KiB
C++
668 lines
24 KiB
C++
// 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.
|
|
|
|
// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
|
|
|
|
#include "fpdfsdk/fpdfxfa/cpdfxfa_widgethandler.h"
|
|
|
|
#include "fpdfsdk/cpdfsdk_annot.h"
|
|
#include "fpdfsdk/cpdfsdk_formfillenvironment.h"
|
|
#include "fpdfsdk/cpdfsdk_interactiveform.h"
|
|
#include "fpdfsdk/cpdfsdk_pageview.h"
|
|
#include "fpdfsdk/fpdfxfa/cpdfxfa_context.h"
|
|
#include "fpdfsdk/fpdfxfa/cpdfxfa_widget.h"
|
|
#include "public/fpdf_fwlevent.h"
|
|
#include "xfa/fwl/cfwl_app.h"
|
|
#include "xfa/fwl/fwl_widgetdef.h"
|
|
#include "xfa/fwl/fwl_widgethit.h"
|
|
#include "xfa/fxfa/cxfa_ffdocview.h"
|
|
#include "xfa/fxfa/cxfa_ffpageview.h"
|
|
#include "xfa/fxfa/cxfa_ffwidget.h"
|
|
#include "xfa/fxfa/cxfa_ffwidgethandler.h"
|
|
#include "xfa/fxfa/fxfa_basic.h"
|
|
#include "xfa/fxfa/parser/cxfa_node.h"
|
|
#include "xfa/fxgraphics/cxfa_graphics.h"
|
|
|
|
#define CHECK_FWL_VKEY_ENUM____(name) \
|
|
static_assert(static_cast<int>(name) == static_cast<int>(XFA_##name), \
|
|
"FWL_VKEYCODE enum mismatch")
|
|
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Back);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Tab);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_NewLine);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Clear);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Return);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Shift);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Control);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Menu);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Pause);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Capital);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Kana);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Hangul);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Junja);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Final);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Hanja);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Kanji);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Escape);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Convert);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_NonConvert);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Accept);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_ModeChange);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Space);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Prior);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Next);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_End);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Home);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Left);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Up);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Right);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Down);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Select);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Print);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Execute);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Snapshot);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Insert);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Delete);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Help);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_0);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_1);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_2);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_3);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_4);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_5);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_6);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_7);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_8);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_9);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_A);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_B);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_C);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_D);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_E);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_F);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_G);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_H);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_I);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_J);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_K);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_L);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_M);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_N);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_O);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_P);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Q);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_R);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_S);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_T);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_U);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_V);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_W);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_X);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Y);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Z);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_LWin);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Command);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_RWin);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Apps);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Sleep);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_NumPad0);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_NumPad1);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_NumPad2);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_NumPad3);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_NumPad4);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_NumPad5);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_NumPad6);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_NumPad7);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_NumPad8);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_NumPad9);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Multiply);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Add);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Separator);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Subtract);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Decimal);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Divide);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_F1);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_F2);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_F3);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_F4);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_F5);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_F6);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_F7);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_F8);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_F9);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_F10);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_F11);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_F12);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_F13);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_F14);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_F15);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_F16);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_F17);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_F18);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_F19);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_F20);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_F21);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_F22);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_F23);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_F24);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_NunLock);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Scroll);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_LShift);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_RShift);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_LControl);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_RControl);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_LMenu);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_RMenu);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_BROWSER_Back);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_BROWSER_Forward);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_BROWSER_Refresh);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_BROWSER_Stop);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_BROWSER_Search);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_BROWSER_Favorites);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_BROWSER_Home);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_VOLUME_Mute);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_VOLUME_Down);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_VOLUME_Up);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_MEDIA_NEXT_Track);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_MEDIA_PREV_Track);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_MEDIA_Stop);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_MEDIA_PLAY_Pause);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_MEDIA_LAUNCH_Mail);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_MEDIA_LAUNCH_MEDIA_Select);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_MEDIA_LAUNCH_APP1);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_MEDIA_LAUNCH_APP2);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_OEM_1);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_OEM_Plus);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_OEM_Comma);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_OEM_Minus);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_OEM_Period);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_OEM_2);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_OEM_3);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_OEM_4);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_OEM_5);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_OEM_6);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_OEM_7);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_OEM_8);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_OEM_102);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_ProcessKey);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Packet);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Attn);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Crsel);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Exsel);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Ereof);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Play);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Zoom);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_NoName);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_PA1);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_OEM_Clear);
|
|
CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Unknown);
|
|
|
|
#undef CHECK_FWL_VKEY_ENUM____
|
|
|
|
CPDFXFA_WidgetHandler::CPDFXFA_WidgetHandler() = default;
|
|
|
|
CPDFXFA_WidgetHandler::~CPDFXFA_WidgetHandler() = default;
|
|
|
|
void CPDFXFA_WidgetHandler::SetFormFillEnvironment(
|
|
CPDFSDK_FormFillEnvironment* pFormFillEnv) {
|
|
m_pFormFillEnv = pFormFillEnv;
|
|
}
|
|
|
|
bool CPDFXFA_WidgetHandler::CanAnswer(CPDFSDK_Annot* pAnnot) {
|
|
CPDFXFA_Widget* pWidget = ToXFAWidget(pAnnot);
|
|
return pWidget && pWidget->GetXFAFFWidget();
|
|
}
|
|
|
|
CPDFSDK_Annot* CPDFXFA_WidgetHandler::NewAnnot(CPDF_Annot* pAnnot,
|
|
CPDFSDK_PageView* pPage) {
|
|
return nullptr;
|
|
}
|
|
|
|
std::unique_ptr<CPDFSDK_Annot> CPDFXFA_WidgetHandler::NewAnnotForXFA(
|
|
CXFA_FFWidget* pAnnot,
|
|
CPDFSDK_PageView* pPage) {
|
|
CPDFSDK_InteractiveForm* pForm = m_pFormFillEnv->GetInteractiveForm();
|
|
return pdfium::MakeUnique<CPDFXFA_Widget>(pAnnot, pPage, pForm);
|
|
}
|
|
|
|
void CPDFXFA_WidgetHandler::OnDraw(CPDFSDK_PageView* pPageView,
|
|
CPDFSDK_Annot* pAnnot,
|
|
CFX_RenderDevice* pDevice,
|
|
const CFX_Matrix& mtUser2Device,
|
|
bool bDrawAnnots) {
|
|
CPDFXFA_Widget* pXFAWidget = ToXFAWidget(pAnnot);
|
|
ASSERT(pXFAWidget);
|
|
|
|
bool bIsHighlight = false;
|
|
if (pPageView->GetFormFillEnv()->GetFocusAnnot() != pAnnot)
|
|
bIsHighlight = true;
|
|
|
|
CXFA_Graphics gs(pDevice);
|
|
GetXFAFFWidgetHandler(pXFAWidget)
|
|
->RenderWidget(pXFAWidget->GetXFAFFWidget(), &gs, mtUser2Device,
|
|
bIsHighlight);
|
|
|
|
// to do highlight and shadow
|
|
}
|
|
|
|
void CPDFXFA_WidgetHandler::OnLoad(CPDFSDK_Annot* pAnnot) {}
|
|
|
|
void CPDFXFA_WidgetHandler::ReleaseAnnot(
|
|
std::unique_ptr<CPDFSDK_Annot> pAnnot) {}
|
|
|
|
CFX_FloatRect CPDFXFA_WidgetHandler::GetViewBBox(CPDFSDK_PageView* pPageView,
|
|
CPDFSDK_Annot* pAnnot) {
|
|
CPDFXFA_Widget* pXFAWidget = ToXFAWidget(pAnnot);
|
|
CXFA_Node* node = pXFAWidget->GetXFAFFWidget()->GetNode();
|
|
ASSERT(node->IsWidgetReady());
|
|
|
|
CFX_RectF rcBBox = pXFAWidget->GetXFAFFWidget()->GetBBox(
|
|
node->GetFFWidgetType() == XFA_FFWidgetType::kSignature
|
|
? CXFA_FFWidget::kDrawFocus
|
|
: CXFA_FFWidget::kDoNotDrawFocus);
|
|
|
|
CFX_FloatRect rcWidget = rcBBox.ToFloatRect();
|
|
rcWidget.Inflate(1.0f, 1.0f);
|
|
return rcWidget;
|
|
}
|
|
|
|
WideString CPDFXFA_WidgetHandler::GetText(CPDFSDK_Annot* pAnnot) {
|
|
CPDFXFA_Widget* pXFAWidget = ToXFAWidget(pAnnot);
|
|
if (!pXFAWidget)
|
|
return WideString();
|
|
|
|
CXFA_FFWidgetHandler* pWidgetHandler = GetXFAFFWidgetHandler(pXFAWidget);
|
|
return pWidgetHandler->GetText(pXFAWidget->GetXFAFFWidget());
|
|
}
|
|
|
|
WideString CPDFXFA_WidgetHandler::GetSelectedText(CPDFSDK_Annot* pAnnot) {
|
|
CPDFXFA_Widget* pXFAWidget = ToXFAWidget(pAnnot);
|
|
if (!pXFAWidget)
|
|
return WideString();
|
|
|
|
CXFA_FFWidgetHandler* pWidgetHandler = GetXFAFFWidgetHandler(pXFAWidget);
|
|
return pWidgetHandler->GetSelectedText(pXFAWidget->GetXFAFFWidget());
|
|
}
|
|
|
|
void CPDFXFA_WidgetHandler::ReplaceSelection(CPDFSDK_Annot* pAnnot,
|
|
const WideString& text) {
|
|
CPDFXFA_Widget* pXFAWidget = ToXFAWidget(pAnnot);
|
|
if (!pXFAWidget)
|
|
return;
|
|
|
|
CXFA_FFWidgetHandler* pWidgetHandler = GetXFAFFWidgetHandler(pXFAWidget);
|
|
return pWidgetHandler->PasteText(pXFAWidget->GetXFAFFWidget(), text);
|
|
}
|
|
|
|
bool CPDFXFA_WidgetHandler::CanUndo(CPDFSDK_Annot* pAnnot) {
|
|
CPDFXFA_Widget* pXFAWidget = ToXFAWidget(pAnnot);
|
|
if (!pXFAWidget)
|
|
return false;
|
|
|
|
CXFA_FFWidgetHandler* pWidgetHandler = GetXFAFFWidgetHandler(pXFAWidget);
|
|
return pWidgetHandler->CanUndo(pXFAWidget->GetXFAFFWidget());
|
|
}
|
|
|
|
bool CPDFXFA_WidgetHandler::CanRedo(CPDFSDK_Annot* pAnnot) {
|
|
CPDFXFA_Widget* pXFAWidget = ToXFAWidget(pAnnot);
|
|
if (!pXFAWidget)
|
|
return false;
|
|
|
|
CXFA_FFWidgetHandler* pWidgetHandler = GetXFAFFWidgetHandler(pXFAWidget);
|
|
return pWidgetHandler->CanRedo(pXFAWidget->GetXFAFFWidget());
|
|
}
|
|
|
|
bool CPDFXFA_WidgetHandler::Undo(CPDFSDK_Annot* pAnnot) {
|
|
CPDFXFA_Widget* pXFAWidget = ToXFAWidget(pAnnot);
|
|
if (!pXFAWidget)
|
|
return false;
|
|
|
|
CXFA_FFWidgetHandler* pWidgetHandler = GetXFAFFWidgetHandler(pXFAWidget);
|
|
return pWidgetHandler->Undo(pXFAWidget->GetXFAFFWidget());
|
|
}
|
|
|
|
bool CPDFXFA_WidgetHandler::Redo(CPDFSDK_Annot* pAnnot) {
|
|
CPDFXFA_Widget* pXFAWidget = ToXFAWidget(pAnnot);
|
|
if (!pXFAWidget)
|
|
return false;
|
|
|
|
CXFA_FFWidgetHandler* pWidgetHandler = GetXFAFFWidgetHandler(pXFAWidget);
|
|
return pWidgetHandler->Redo(pXFAWidget->GetXFAFFWidget());
|
|
}
|
|
|
|
bool CPDFXFA_WidgetHandler::HitTest(CPDFSDK_PageView* pPageView,
|
|
CPDFSDK_Annot* pAnnot,
|
|
const CFX_PointF& point) {
|
|
if (!pPageView)
|
|
return false;
|
|
|
|
CPDFXFA_Widget* pXFAWidget = ToXFAWidget(pAnnot);
|
|
if (!pXFAWidget)
|
|
return false;
|
|
|
|
CPDFSDK_FormFillEnvironment* pFormFillEnv = pPageView->GetFormFillEnv();
|
|
if (!pFormFillEnv)
|
|
return false;
|
|
|
|
auto* pContext =
|
|
static_cast<CPDFXFA_Context*>(pFormFillEnv->GetDocExtension());
|
|
if (!pContext)
|
|
return false;
|
|
|
|
CXFA_FFDocView* pDocView = pContext->GetXFADocView();
|
|
if (!pDocView)
|
|
return false;
|
|
|
|
CXFA_FFWidgetHandler* pWidgetHandler = pDocView->GetWidgetHandler();
|
|
return pWidgetHandler &&
|
|
pWidgetHandler->HitTest(pXFAWidget->GetXFAFFWidget(), point) !=
|
|
FWL_WidgetHit::Unknown;
|
|
}
|
|
|
|
void CPDFXFA_WidgetHandler::OnMouseEnter(CPDFSDK_PageView* pPageView,
|
|
ObservedPtr<CPDFSDK_Annot>* pAnnot,
|
|
uint32_t nFlag) {
|
|
if (!pPageView)
|
|
return;
|
|
|
|
CPDFXFA_Widget* pXFAWidget = ToXFAWidget(pAnnot->Get());
|
|
if (!pXFAWidget)
|
|
return;
|
|
|
|
CXFA_FFWidgetHandler* pWidgetHandler = GetXFAFFWidgetHandler(pXFAWidget);
|
|
pWidgetHandler->OnMouseEnter(pXFAWidget->GetXFAFFWidget());
|
|
}
|
|
|
|
void CPDFXFA_WidgetHandler::OnMouseExit(CPDFSDK_PageView* pPageView,
|
|
ObservedPtr<CPDFSDK_Annot>* pAnnot,
|
|
uint32_t nFlag) {
|
|
if (!pPageView)
|
|
return;
|
|
|
|
CPDFXFA_Widget* pXFAWidget = ToXFAWidget(pAnnot->Get());
|
|
if (!pXFAWidget)
|
|
return;
|
|
|
|
CXFA_FFWidgetHandler* pWidgetHandler = GetXFAFFWidgetHandler(pXFAWidget);
|
|
pWidgetHandler->OnMouseExit(pXFAWidget->GetXFAFFWidget());
|
|
}
|
|
|
|
bool CPDFXFA_WidgetHandler::OnLButtonDown(CPDFSDK_PageView* pPageView,
|
|
ObservedPtr<CPDFSDK_Annot>* pAnnot,
|
|
uint32_t nFlags,
|
|
const CFX_PointF& point) {
|
|
if (!pPageView)
|
|
return false;
|
|
|
|
CPDFXFA_Widget* pXFAWidget = ToXFAWidget(pAnnot->Get());
|
|
if (!pXFAWidget)
|
|
return false;
|
|
|
|
CXFA_FFWidgetHandler* pWidgetHandler = GetXFAFFWidgetHandler(pXFAWidget);
|
|
return pWidgetHandler->OnLButtonDown(pXFAWidget->GetXFAFFWidget(),
|
|
GetFWLFlags(nFlags), point);
|
|
}
|
|
|
|
bool CPDFXFA_WidgetHandler::OnLButtonUp(CPDFSDK_PageView* pPageView,
|
|
ObservedPtr<CPDFSDK_Annot>* pAnnot,
|
|
uint32_t nFlags,
|
|
const CFX_PointF& point) {
|
|
if (!pPageView)
|
|
return false;
|
|
|
|
CPDFXFA_Widget* pXFAWidget = ToXFAWidget(pAnnot->Get());
|
|
if (!pXFAWidget)
|
|
return false;
|
|
|
|
CXFA_FFWidgetHandler* pWidgetHandler = GetXFAFFWidgetHandler(pXFAWidget);
|
|
return pWidgetHandler->OnLButtonUp(pXFAWidget->GetXFAFFWidget(),
|
|
GetFWLFlags(nFlags), point);
|
|
}
|
|
|
|
bool CPDFXFA_WidgetHandler::OnLButtonDblClk(CPDFSDK_PageView* pPageView,
|
|
ObservedPtr<CPDFSDK_Annot>* pAnnot,
|
|
uint32_t nFlags,
|
|
const CFX_PointF& point) {
|
|
if (!pPageView)
|
|
return false;
|
|
|
|
CPDFXFA_Widget* pXFAWidget = ToXFAWidget(pAnnot->Get());
|
|
if (!pXFAWidget)
|
|
return false;
|
|
|
|
CXFA_FFWidgetHandler* pWidgetHandler = GetXFAFFWidgetHandler(pXFAWidget);
|
|
return pWidgetHandler->OnLButtonDblClk(pXFAWidget->GetXFAFFWidget(),
|
|
GetFWLFlags(nFlags), point);
|
|
}
|
|
|
|
bool CPDFXFA_WidgetHandler::OnMouseMove(CPDFSDK_PageView* pPageView,
|
|
ObservedPtr<CPDFSDK_Annot>* pAnnot,
|
|
uint32_t nFlags,
|
|
const CFX_PointF& point) {
|
|
if (!pPageView)
|
|
return false;
|
|
|
|
CPDFXFA_Widget* pXFAWidget = ToXFAWidget(pAnnot->Get());
|
|
if (!pXFAWidget)
|
|
return false;
|
|
|
|
CXFA_FFWidgetHandler* pWidgetHandler = GetXFAFFWidgetHandler(pXFAWidget);
|
|
return pWidgetHandler->OnMouseMove(pXFAWidget->GetXFAFFWidget(),
|
|
GetFWLFlags(nFlags), point);
|
|
}
|
|
|
|
bool CPDFXFA_WidgetHandler::OnMouseWheel(CPDFSDK_PageView* pPageView,
|
|
ObservedPtr<CPDFSDK_Annot>* pAnnot,
|
|
uint32_t nFlags,
|
|
short zDelta,
|
|
const CFX_PointF& point) {
|
|
if (!pPageView)
|
|
return false;
|
|
|
|
CPDFXFA_Widget* pXFAWidget = ToXFAWidget(pAnnot->Get());
|
|
if (!pXFAWidget)
|
|
return false;
|
|
|
|
CXFA_FFWidgetHandler* pWidgetHandler = GetXFAFFWidgetHandler(pXFAWidget);
|
|
return pWidgetHandler->OnMouseWheel(pXFAWidget->GetXFAFFWidget(),
|
|
GetFWLFlags(nFlags), zDelta, point);
|
|
}
|
|
|
|
bool CPDFXFA_WidgetHandler::OnRButtonDown(CPDFSDK_PageView* pPageView,
|
|
ObservedPtr<CPDFSDK_Annot>* pAnnot,
|
|
uint32_t nFlags,
|
|
const CFX_PointF& point) {
|
|
if (!pPageView)
|
|
return false;
|
|
|
|
CPDFXFA_Widget* pXFAWidget = ToXFAWidget(pAnnot->Get());
|
|
if (!pXFAWidget)
|
|
return false;
|
|
|
|
CXFA_FFWidgetHandler* pWidgetHandler = GetXFAFFWidgetHandler(pXFAWidget);
|
|
return pWidgetHandler->OnRButtonDown(pXFAWidget->GetXFAFFWidget(),
|
|
GetFWLFlags(nFlags), point);
|
|
}
|
|
|
|
bool CPDFXFA_WidgetHandler::OnRButtonUp(CPDFSDK_PageView* pPageView,
|
|
ObservedPtr<CPDFSDK_Annot>* pAnnot,
|
|
uint32_t nFlags,
|
|
const CFX_PointF& point) {
|
|
if (!pPageView)
|
|
return false;
|
|
|
|
CPDFXFA_Widget* pXFAWidget = ToXFAWidget(pAnnot->Get());
|
|
if (!pXFAWidget)
|
|
return false;
|
|
|
|
CXFA_FFWidgetHandler* pWidgetHandler = GetXFAFFWidgetHandler(pXFAWidget);
|
|
return pWidgetHandler->OnRButtonUp(pXFAWidget->GetXFAFFWidget(),
|
|
GetFWLFlags(nFlags), point);
|
|
}
|
|
|
|
bool CPDFXFA_WidgetHandler::OnRButtonDblClk(CPDFSDK_PageView* pPageView,
|
|
ObservedPtr<CPDFSDK_Annot>* pAnnot,
|
|
uint32_t nFlags,
|
|
const CFX_PointF& point) {
|
|
if (!pPageView)
|
|
return false;
|
|
|
|
CPDFXFA_Widget* pXFAWidget = ToXFAWidget(pAnnot->Get());
|
|
if (!pXFAWidget)
|
|
return false;
|
|
|
|
CXFA_FFWidgetHandler* pWidgetHandler = GetXFAFFWidgetHandler(pXFAWidget);
|
|
return pWidgetHandler->OnRButtonDblClk(pXFAWidget->GetXFAFFWidget(),
|
|
GetFWLFlags(nFlags), point);
|
|
}
|
|
|
|
bool CPDFXFA_WidgetHandler::OnChar(CPDFSDK_Annot* pAnnot,
|
|
uint32_t nChar,
|
|
uint32_t nFlags) {
|
|
CPDFXFA_Widget* pXFAWidget = ToXFAWidget(pAnnot);
|
|
if (!pXFAWidget)
|
|
return false;
|
|
|
|
CXFA_FFWidgetHandler* pWidgetHandler = GetXFAFFWidgetHandler(pXFAWidget);
|
|
return pWidgetHandler->OnChar(pXFAWidget->GetXFAFFWidget(), nChar,
|
|
GetFWLFlags(nFlags));
|
|
}
|
|
|
|
bool CPDFXFA_WidgetHandler::OnKeyDown(CPDFSDK_Annot* pAnnot,
|
|
int nKeyCode,
|
|
int nFlag) {
|
|
CPDFXFA_Widget* pXFAWidget = ToXFAWidget(pAnnot);
|
|
if (!pXFAWidget)
|
|
return false;
|
|
|
|
CXFA_FFWidgetHandler* pWidgetHandler = GetXFAFFWidgetHandler(pXFAWidget);
|
|
return pWidgetHandler->OnKeyDown(pXFAWidget->GetXFAFFWidget(), nKeyCode,
|
|
GetFWLFlags(nFlag));
|
|
}
|
|
|
|
bool CPDFXFA_WidgetHandler::OnKeyUp(CPDFSDK_Annot* pAnnot,
|
|
int nKeyCode,
|
|
int nFlag) {
|
|
CPDFXFA_Widget* pXFAWidget = ToXFAWidget(pAnnot);
|
|
if (!pXFAWidget)
|
|
return false;
|
|
|
|
CXFA_FFWidgetHandler* pWidgetHandler = GetXFAFFWidgetHandler(pXFAWidget);
|
|
return pWidgetHandler->OnKeyUp(pXFAWidget->GetXFAFFWidget(), nKeyCode,
|
|
GetFWLFlags(nFlag));
|
|
}
|
|
|
|
bool CPDFXFA_WidgetHandler::OnSetFocus(ObservedPtr<CPDFSDK_Annot>* pAnnot,
|
|
uint32_t nFlag) {
|
|
return true;
|
|
}
|
|
|
|
bool CPDFXFA_WidgetHandler::OnKillFocus(ObservedPtr<CPDFSDK_Annot>* pAnnot,
|
|
uint32_t nFlag) {
|
|
CPDFXFA_Widget* pXFAWidget = ToXFAWidget(pAnnot->Get());
|
|
if (!pXFAWidget)
|
|
return true;
|
|
|
|
CXFA_FFWidget* hWidget = pXFAWidget->GetXFAFFWidget();
|
|
if (!hWidget)
|
|
return true;
|
|
|
|
CXFA_FFPageView* pXFAPageView = hWidget->GetPageView();
|
|
if (!pXFAPageView)
|
|
return true;
|
|
|
|
pXFAPageView->GetDocView()->SetFocus(nullptr);
|
|
return true;
|
|
}
|
|
|
|
bool CPDFXFA_WidgetHandler::OnXFAChangedFocus(
|
|
ObservedPtr<CPDFSDK_Annot>* pOldAnnot,
|
|
ObservedPtr<CPDFSDK_Annot>* pNewAnnot) {
|
|
CXFA_FFWidgetHandler* pWidgetHandler = nullptr;
|
|
if (pOldAnnot->HasObservable())
|
|
pWidgetHandler = GetXFAFFWidgetHandler(pOldAnnot->Get());
|
|
else if (pNewAnnot->HasObservable())
|
|
pWidgetHandler = GetXFAFFWidgetHandler(pNewAnnot->Get());
|
|
|
|
if (!pWidgetHandler)
|
|
return true;
|
|
|
|
CPDFXFA_Widget* pNewXFAWidget = ToXFAWidget(pNewAnnot->Get());
|
|
if (!pNewXFAWidget)
|
|
return true;
|
|
|
|
CXFA_FFWidget* hWidget = pNewXFAWidget->GetXFAFFWidget();
|
|
if (!hWidget)
|
|
return true;
|
|
|
|
CXFA_FFPageView* pXFAPageView = hWidget->GetPageView();
|
|
if (!pXFAPageView)
|
|
return true;
|
|
|
|
ObservedPtr<CXFA_FFPageView> pObservedXFAPageView(pXFAPageView);
|
|
bool bRet = pXFAPageView->GetDocView()->SetFocus(hWidget);
|
|
|
|
// Check |pXFAPageView| again because |SetFocus| can trigger JS to destroy it.
|
|
if (pObservedXFAPageView &&
|
|
pXFAPageView->GetDocView()->GetFocusWidget() == hWidget) {
|
|
bRet = true;
|
|
}
|
|
|
|
return bRet;
|
|
}
|
|
|
|
bool CPDFXFA_WidgetHandler::SetIndexSelected(ObservedPtr<CPDFSDK_Annot>* pAnnot,
|
|
int index,
|
|
bool selected) {
|
|
return false;
|
|
}
|
|
|
|
bool CPDFXFA_WidgetHandler::IsIndexSelected(ObservedPtr<CPDFSDK_Annot>* pAnnot,
|
|
int index) {
|
|
return false;
|
|
}
|
|
|
|
CXFA_FFWidgetHandler* CPDFXFA_WidgetHandler::GetXFAFFWidgetHandler(
|
|
CPDFSDK_Annot* pAnnot) {
|
|
if (!pAnnot)
|
|
return nullptr;
|
|
|
|
CPDFSDK_PageView* pPageView = pAnnot->GetPageView();
|
|
if (!pPageView)
|
|
return nullptr;
|
|
|
|
CPDFSDK_FormFillEnvironment* pFormFillEnv = pPageView->GetFormFillEnv();
|
|
if (!pFormFillEnv)
|
|
return nullptr;
|
|
|
|
auto* pDoc = static_cast<CPDFXFA_Context*>(pFormFillEnv->GetDocExtension());
|
|
if (!pDoc)
|
|
return nullptr;
|
|
|
|
CXFA_FFDocView* pDocView = pDoc->GetXFADocView();
|
|
if (!pDocView)
|
|
return nullptr;
|
|
|
|
return pDocView->GetWidgetHandler();
|
|
}
|
|
|
|
uint32_t CPDFXFA_WidgetHandler::GetFWLFlags(uint32_t dwFlag) {
|
|
uint32_t 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;
|
|
}
|