summaryrefslogtreecommitdiff
path: root/fpdfsdk/src/fsdk_mgr.cpp
diff options
context:
space:
mode:
authorBo Xu <bo_xu@foxitsoftware.com>2014-10-28 23:03:33 -0700
committerBo Xu <bo_xu@foxitsoftware.com>2014-11-03 11:10:11 -0800
commitfdc00a7042d912aafaabddae4d9c84199921ef23 (patch)
tree32ab8ac91cc68d2cd15b9168782a71b3f3f5e7b9 /fpdfsdk/src/fsdk_mgr.cpp
parente9b38fa38de2c95d8260be31c57d9272c4d127ed (diff)
downloadpdfium-fdc00a7042d912aafaabddae4d9c84199921ef23.tar.xz
Merge XFA to PDFium master at 4dc95e7 on 10/28/2014
Diffstat (limited to 'fpdfsdk/src/fsdk_mgr.cpp')
-rw-r--r--fpdfsdk/src/fsdk_mgr.cpp337
1 files changed, 249 insertions, 88 deletions
diff --git a/fpdfsdk/src/fsdk_mgr.cpp b/fpdfsdk/src/fsdk_mgr.cpp
index efb21a7efc..2340ffa720 100644
--- a/fpdfsdk/src/fsdk_mgr.cpp
+++ b/fpdfsdk/src/fsdk_mgr.cpp
@@ -5,10 +5,14 @@
// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
#include "../include/fsdk_define.h"
+#include "../include/fpdfxfa/fpdfxfa_doc.h"
+#include "../include/fpdfxfa/fpdfxfa_page.h"
+#include "../include/fpdfxfa/fpdfxfa_util.h"
#include "../include/fsdk_mgr.h"
#include "../include/fpdf_ext.h"
#include "../include/formfiller/FFL_FormFiller.h"
#include "../include/javascript/IJavaScript.h"
+#include "../include/fpdfxfa/fpdfxfa_app.h"
#if _FX_OS_ == _FX_ANDROID_
#include "time.h"
@@ -81,10 +85,10 @@ void CFX_SystemHandler::InvalidateRect(FX_HWND hWnd, FX_RECT rect)
{
//g_pFormFillApp->FFI_Invalidate();
CPDFSDK_Annot* pSDKAnnot = (CPDFSDK_Annot*)hWnd;
- CPDF_Page* pPage = NULL;
+ CPDFXFA_Page* pPage = NULL;
CPDFSDK_PageView* pPageView = NULL;
pPageView = pSDKAnnot->GetPageView();
- pPage = pSDKAnnot->GetPDFPage();
+ pPage = pSDKAnnot->GetPDFXFAPage();
if(!pPage || !pPageView)
return;
CPDF_Matrix page2device;
@@ -114,7 +118,7 @@ void CFX_SystemHandler::OutputSelectedRect(void* pFormFiller, CPDF_Rect& rect)
CPDFSDK_Annot* pAnnot = pFFL->GetSDKAnnot();
ASSERT(pAnnot);
- CPDF_Page* pPage = pAnnot->GetPDFPage();
+ CPDFXFA_Page* pPage = pAnnot->GetPDFXFAPage();
ASSERT(pPage);
m_pEnv->FFI_OutputSelectedRect(pPage, ptA.x, ptB.y, ptB.x, ptA.y);
}
@@ -212,29 +216,22 @@ FX_SYSTEMTIME CFX_SystemHandler::GetLocalTime()
}
-CJS_RuntimeFactory* GetJSRuntimeFactory()
-{
- static CJS_RuntimeFactory s_JSRuntimeFactory;
- return &s_JSRuntimeFactory;
-}
-CPDFDoc_Environment::CPDFDoc_Environment(CPDF_Document* pDoc) :
+CPDFDoc_Environment::CPDFDoc_Environment(CPDFXFA_Document* pDoc) :
m_pAnnotHandlerMgr(NULL),
m_pActionHandler(NULL),
m_pJSRuntime(NULL),
m_pInfo(NULL),
m_pSDKDoc(NULL),
- m_pPDFDoc(pDoc),
+ m_pDoc(pDoc),
m_pIFormFiller(NULL)
{
m_pSysHandler = NULL;
m_pSysHandler = new CFX_SystemHandler(this);
+ //m_pJSRuntimeFactory = pDoc->GetApp()->GetRuntimeFactory();
- m_pJSRuntimeFactory = NULL;
- m_pJSRuntimeFactory = GetJSRuntimeFactory();
- m_pJSRuntimeFactory->AddRef();
}
CPDFDoc_Environment::~CPDFDoc_Environment()
@@ -245,9 +242,15 @@ CPDFDoc_Environment::~CPDFDoc_Environment()
delete m_pIFormFiller;
m_pIFormFiller = NULL;
}
- if(m_pJSRuntime && m_pJSRuntimeFactory)
- m_pJSRuntimeFactory->DeleteJSRuntime(m_pJSRuntime);
- m_pJSRuntimeFactory->Release();
+
+ if (m_pJSRuntime && FPDFXFA_GetApp()->GetRuntimeFactory())
+ FPDFXFA_GetApp()->GetRuntimeFactory()->DeleteJSRuntime(m_pJSRuntime);
+
+ if (FPDFXFA_GetApp()->m_pEnvList.GetSize() == 0)
+ {
+ FPDFXFA_GetApp()->ReleaseRuntime();
+ FPDFXFA_GetApp()->InitRuntime(TRUE);
+ }
if(m_pSysHandler)
{
@@ -274,9 +277,8 @@ IFXJS_Runtime* CPDFDoc_Environment::GetJSRuntime()
{
if(!IsJSInitiated())
return NULL;
- assert(m_pJSRuntimeFactory);
if(!m_pJSRuntime)
- m_pJSRuntime = m_pJSRuntimeFactory->NewJSRuntime(this);
+ m_pJSRuntime = FPDFXFA_GetApp()->GetRuntimeFactory()->NewJSRuntime(this);
return m_pJSRuntime;
}
@@ -324,7 +326,7 @@ FX_BOOL CPDFDoc_Environment::IsJSInitiated()
return FALSE;
}
-CPDFSDK_Document::CPDFSDK_Document(CPDF_Document* pDoc,CPDFDoc_Environment* pEnv):m_pDoc(pDoc),
+CPDFSDK_Document::CPDFSDK_Document(CPDFXFA_Document* pDoc,CPDFDoc_Environment* pEnv):m_pDoc(pDoc),
m_pInterForm(NULL),m_pEnv(pEnv),m_pOccontent(NULL),m_bChangeMask(FALSE)
{
m_pFocusAnnot = NULL;
@@ -332,14 +334,7 @@ CPDFSDK_Document::CPDFSDK_Document(CPDF_Document* pDoc,CPDFDoc_Environment* pEnv
CPDFSDK_Document::~CPDFSDK_Document()
{
- FX_POSITION pos = m_pageMap.GetStartPosition();
- while (pos) {
- CPDF_Page* pPage = NULL;
- CPDFSDK_PageView* pPageView = NULL;
- m_pageMap.GetNextAssoc(pos, pPage, pPageView);
- delete pPageView;
- }
- m_pageMap.RemoveAll();
+ m_pageMap.RemoveAll();
if(m_pInterForm)
{
m_pInterForm->Destroy();
@@ -363,20 +358,20 @@ void CPDFSDK_Document::InitPageView()
}
}
-void CPDFSDK_Document::AddPageView(CPDF_Page* pPDFPage, CPDFSDK_PageView* pPageView)
+void CPDFSDK_Document::AddPageView(CPDFXFA_Page* pPDFXFAPage, CPDFSDK_PageView* pPageView)
{
- m_pageMap.SetAt(pPDFPage, pPageView);
+ m_pageMap.SetAt(pPDFXFAPage, pPageView);
}
-CPDFSDK_PageView* CPDFSDK_Document::GetPageView(CPDF_Page* pPDFPage, FX_BOOL ReNew)
+CPDFSDK_PageView* CPDFSDK_Document::GetPageView(CPDFXFA_Page* pPDFXFAPage, FX_BOOL ReNew)
{
- CPDFSDK_PageView* pPageView = (CPDFSDK_PageView*)m_pageMap.GetValueAt(pPDFPage);
+ CPDFSDK_PageView* pPageView = (CPDFSDK_PageView*)m_pageMap.GetValueAt(pPDFXFAPage);
if(pPageView != NULL)
return pPageView;
if(ReNew)
{
- pPageView = new CPDFSDK_PageView(this,pPDFPage);
- m_pageMap.SetAt(pPDFPage, pPageView);
+ pPageView = new CPDFSDK_PageView(this,pPDFXFAPage);
+ m_pageMap.SetAt(pPDFXFAPage, pPageView);
//Delay to load all the annotations, to avoid endless loop.
pPageView->LoadFXAnnots();
}
@@ -386,7 +381,7 @@ CPDFSDK_PageView* CPDFSDK_Document::GetPageView(CPDF_Page* pPDFPage, FX_BOOL ReN
CPDFSDK_PageView* CPDFSDK_Document::GetCurrentView()
{
- CPDF_Page * pPage = (CPDF_Page *)m_pEnv->FFI_GetCurrentPage(m_pDoc);
+ CPDFXFA_Page * pPage = (CPDFXFA_Page *)m_pEnv->FFI_GetCurrentPage(m_pDoc);
if(pPage)
return this->GetPageView(pPage, TRUE);
return NULL;
@@ -395,7 +390,7 @@ CPDFSDK_PageView* CPDFSDK_Document::GetCurrentView()
CPDFSDK_PageView* CPDFSDK_Document::GetPageView(int nIndex)
{
CPDFSDK_PageView * pTempPageView = NULL;
- CPDF_Page * pTempPage = (CPDF_Page*)m_pEnv->FFI_GetPage(m_pDoc,nIndex);
+ CPDFXFA_Page * pTempPage = (CPDFXFA_Page*)m_pEnv->FFI_GetPage(m_pDoc,nIndex);
if(!pTempPage)
return NULL;
@@ -408,8 +403,8 @@ CPDFSDK_PageView* CPDFSDK_Document::GetPageView(int nIndex)
void CPDFSDK_Document:: ProcJavascriptFun()
{
- CPDF_Document* pPDFDoc = this->GetDocument();
- CPDF_DocJSActions docJS(pPDFDoc);
+ CPDFXFA_Document* pPDFDoc = this->GetDocument();
+ CPDF_DocJSActions docJS(pPDFDoc->GetPDFDoc());
int iCount = docJS.CountJSActions();
if (iCount < 1) return;
for (int i = 0; i < iCount; i ++)
@@ -426,7 +421,7 @@ FX_BOOL CPDFSDK_Document::ProcOpenAction()
{
if(!m_pDoc) return FALSE;
- CPDF_Dictionary* pRoot = m_pDoc->GetRoot();
+ CPDF_Dictionary* pRoot = m_pDoc->GetPDFDoc()->GetRoot();
if (!pRoot) return FALSE;
CPDF_Object* pOpenAction = pRoot->GetDict("OpenAction");//
if(!pOpenAction) pOpenAction = pRoot->GetArray("OpenAction");//
@@ -453,23 +448,23 @@ FX_BOOL CPDFSDK_Document::ProcOpenAction()
CPDF_OCContext* CPDFSDK_Document::GetOCContext()
{
if(!m_pOccontent)
- m_pOccontent = new CPDF_OCContext(m_pDoc);
+ m_pOccontent = new CPDF_OCContext(m_pDoc->GetPDFDoc());
return m_pOccontent;
}
-void CPDFSDK_Document::ReMovePageView(CPDF_Page* pPDFPage)
+void CPDFSDK_Document::ReMovePageView(CPDFXFA_Page* pPDFXFAPage)
{
- CPDFSDK_PageView* pPageView = (CPDFSDK_PageView*)m_pageMap.GetValueAt(pPDFPage);
- if(pPageView && !pPageView->IsLocked())
+ CPDFSDK_PageView* pPageView = (CPDFSDK_PageView*)m_pageMap.GetValueAt(pPDFXFAPage);
+ if(pPageView)
{
delete pPageView;
- m_pageMap.RemoveKey(pPDFPage);
+ m_pageMap.RemoveKey(pPDFXFAPage);
}
}
-CPDF_Page * CPDFSDK_Document::GetPage(int nIndex)
+CPDFXFA_Page * CPDFSDK_Document::GetPage(int nIndex)
{
- CPDF_Page * pTempPage = (CPDF_Page*)m_pEnv->FFI_GetPage(m_pDoc,nIndex);
+ CPDFXFA_Page * pTempPage = (CPDFXFA_Page*)m_pEnv->FFI_GetPage(m_pDoc,nIndex);
if(!pTempPage)
return NULL;
return pTempPage;
@@ -486,7 +481,7 @@ void CPDFSDK_Document::UpdateAllViews(CPDFSDK_PageView* pSender, CPDFSDK_Annot*
{
FX_POSITION pos = m_pageMap.GetStartPosition();
- CPDF_Page * pPage = NULL;
+ CPDFXFA_Page * pPage = NULL;
CPDFSDK_PageView * pPageView = NULL;
while(pos)
{
@@ -509,17 +504,24 @@ FX_BOOL CPDFSDK_Document::SetFocusAnnot(CPDFSDK_Annot* pAnnot,FX_UINT nFlag)
if(m_pFocusAnnot==pAnnot) return TRUE;
+ CPDFSDK_Annot* pLastFocusAnnot = m_pFocusAnnot;
+
if(m_pFocusAnnot)
{
if(!this->KillFocusAnnot(nFlag) ) return FALSE;
}
- CPDFSDK_PageView* pPageView = pAnnot->GetPageView();
+ CPDFSDK_PageView* pPageView = NULL;
+ if (pAnnot)
+ pPageView = pAnnot->GetPageView();
if(pAnnot && pPageView->IsValid())
{
CPDFSDK_AnnotHandlerMgr *pAnnotHandler=m_pEnv->GetAnnotHandlerMgr();
if(pAnnotHandler&&!m_pFocusAnnot)
{
+ if (!pAnnotHandler->Annot_OnChangeFocus(pAnnot,pLastFocusAnnot))
+ return FALSE;
+
if (!pAnnotHandler->Annot_OnSetFocus(pAnnot,nFlag))
return FALSE;
if(!m_pFocusAnnot)
@@ -541,6 +543,10 @@ FX_BOOL CPDFSDK_Document::KillFocusAnnot(FX_UINT nFlag)
{
CPDFSDK_Annot* pFocusAnnot = m_pFocusAnnot;
m_pFocusAnnot = NULL;
+
+ if (!pAnnotHandler->Annot_OnChangeFocus(NULL, pFocusAnnot))
+ return FALSE;
+
if(pAnnotHandler->Annot_OnKillFocus(pFocusAnnot, nFlag))
{
@@ -571,7 +577,7 @@ FX_BOOL CPDFSDK_Document::DeletePages(int nStart, int nCount)
return FALSE;
}
- CPDF_Page * pTempPage = NULL;
+ CPDFXFA_Page * pTempPage = NULL;
for ( int i = nCount-1; i >= 0; i-- )
{
pTempPage = GetPage(nStart+i);
@@ -590,7 +596,7 @@ void CPDFSDK_Document::OnCloseDocument()
FX_BOOL CPDFSDK_Document::GetPermissions(int nFlag)
{
- FX_DWORD dwPermissions = m_pDoc->GetUserPermissions();
+ FX_DWORD dwPermissions = m_pDoc->GetPDFDoc()->GetUserPermissions();
return dwPermissions&nFlag;
}
@@ -607,15 +613,16 @@ CFX_WideString CPDFSDK_Document::GetPath()
}
-CPDFSDK_PageView::CPDFSDK_PageView(CPDFSDK_Document* pSDKDoc,CPDF_Page* page):m_page(page),m_pSDKDoc(pSDKDoc)
+CPDFSDK_PageView::CPDFSDK_PageView(CPDFSDK_Document* pSDKDoc,CPDFXFA_Page* page):m_page(page),m_pSDKDoc(pSDKDoc)
{
CPDFSDK_InterForm* pInterForm = pSDKDoc->GetInterForm();
if(pInterForm)
{
CPDF_InterForm* pPDFInterForm = pInterForm->GetInterForm();
- pPDFInterForm->FixPageFields(page);
+ if (page->GetPDFPage())
+ pPDFInterForm->FixPageFields(page->GetPDFPage());
}
- m_page->SetPrivateData((FX_LPVOID)m_page, (FX_LPVOID)this, NULL);
+
m_fxAnnotArray.RemoveAll();
m_bEnterWidget = FALSE;
@@ -623,15 +630,13 @@ CPDFSDK_PageView::CPDFSDK_PageView(CPDFSDK_Document* pSDKDoc,CPDF_Page* page):m_
m_bOnWidget = FALSE;
m_CaptureWidget = NULL;
m_bValid = FALSE;
- m_bLocked = FALSE;
- m_bTakeOverPage = FALSE;
+ m_pAnnotList = NULL;
}
CPDFSDK_PageView::~CPDFSDK_PageView()
{
CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
int nAnnotCount = m_fxAnnotArray.GetSize();
-
for (int i=0; i<nAnnotCount; i++)
{
CPDFSDK_Annot* pAnnot = (CPDFSDK_Annot*)m_fxAnnotArray.GetAt(i);
@@ -648,30 +653,49 @@ CPDFSDK_PageView::~CPDFSDK_PageView()
delete m_pAnnotList;
m_pAnnotList = NULL;
}
- m_page->RemovePrivateData((FX_LPVOID)m_page);
- if(m_bTakeOverPage) {
- delete m_page;
- }
}
-void CPDFSDK_PageView::PageView_OnDraw(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,CPDF_RenderOptions* pOptions)
+void CPDFSDK_PageView::PageView_OnDraw(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,CPDF_RenderOptions* pOptions, FX_RECT* pClip)
{
m_curMatrix = *pUser2Device;
-
// m_pAnnotList->DisplayAnnots(m_page, pDevice, pUser2Device, FALSE, pOptions);
CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+ CPDFXFA_Page* pPage = GetPDFXFAPage();
+
+ if (pPage == NULL) return;
+
+ if (pPage->GetDocument()->GetDocType() == DOCTYPE_DYNIMIC_XFA) {
+ CFX_Graphics gs;
+ gs.Create(pDevice);
+ if (pClip) {
+ CFX_RectF rectClip;
+ rectClip.Set(pClip->left, pClip->top, pClip->Width(), pClip->Height());
+ gs.SetClipRect(rectClip);
+ }
+ IXFA_RenderContext* pRenderContext = XFA_RenderContext_Create();
+ if (!pRenderContext)
+ return;
+ CXFA_RenderOptions renderOptions;
+ renderOptions.m_bHighlight = TRUE;
+ pRenderContext->StartRender(pPage->GetXFAPageView(), &gs, *pUser2Device, renderOptions);
+ pRenderContext->DoRender();
+ pRenderContext->StopRender();
+ pRenderContext->Release();
+ return;
+ }
+ // for pdf/static xfa.
CPDFSDK_AnnotIterator annotIterator(this, TRUE);
CPDFSDK_Annot * pSDKAnnot=NULL;
int index=-1;
- while((pSDKAnnot = annotIterator.Next(index)))
+ pSDKAnnot = annotIterator.Next(index);
+ while(pSDKAnnot)
{
CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
ASSERT(pAnnotHandlerMgr);
pAnnotHandlerMgr->Annot_OnDraw(this, pSDKAnnot, pDevice, pUser2Device, 0);
+ pSDKAnnot = annotIterator.Next(index);
}
-
}
-
CPDF_Annot* CPDFSDK_PageView::GetPDFAnnotAtPoint(FX_FLOAT pageX, FX_FLOAT pageY)
{
@@ -713,11 +737,13 @@ CPDFSDK_Annot* CPDFSDK_PageView::GetFXAnnotAtPoint(FX_FLOAT pageX, FX_FLOAT page
CPDFSDK_AnnotHandlerMgr* pAnnotMgr = pEnv->GetAnnotHandlerMgr();
CPDFSDK_Annot* pSDKAnnot = NULL;
int index = -1;
- while((pSDKAnnot = annotIterator.Next(index)))
+ pSDKAnnot = annotIterator.Next(index);
+ while(pSDKAnnot)
{
CPDF_Rect rc = pAnnotMgr->Annot_OnGetViewBBox(this, pSDKAnnot);
if(rc.Contains(pageX, pageY))
return pSDKAnnot;
+ pSDKAnnot = annotIterator.Next(index);
}
return NULL;
@@ -731,9 +757,10 @@ CPDFSDK_Annot* CPDFSDK_PageView::GetFXWidgetAtPoint(FX_FLOAT pageX, FX_FLOAT pag
CPDFSDK_AnnotHandlerMgr* pAnnotMgr = pEnv->GetAnnotHandlerMgr();
CPDFSDK_Annot* pSDKAnnot = NULL;
int index = -1;
- while((pSDKAnnot = annotIterator.Next(index)))
+ pSDKAnnot = annotIterator.Next(index);
+ while(pSDKAnnot)
{
- if(pSDKAnnot->GetType() == "Widget")
+ if(pSDKAnnot->GetType() == "Widget" || pSDKAnnot->GetType() == FSDK_XFAWIDGET_TYPENAME)
{
pAnnotMgr->Annot_OnGetViewBBox(this, pSDKAnnot);
CPDF_Point point(pageX, pageY);
@@ -741,6 +768,7 @@ CPDFSDK_Annot* CPDFSDK_PageView::GetFXWidgetAtPoint(FX_FLOAT pageX, FX_FLOAT pag
// if(rc.Contains(pageX, pageY))
return pSDKAnnot;
}
+ pSDKAnnot = annotIterator.Next(index);
}
return NULL;
@@ -781,6 +809,32 @@ CPDFSDK_Annot* CPDFSDK_PageView::AddAnnot(CPDF_Annot * pPDFAnnot)
return pSDKAnnot;
}
+CPDFSDK_Annot* CPDFSDK_PageView::AddAnnot(XFA_HWIDGET pPDFAnnot)
+{
+ if (!pPDFAnnot) return NULL;
+
+ CPDFSDK_Annot* pSDKAnnot = GetAnnotByXFAWidget(pPDFAnnot);
+ if (pSDKAnnot)
+ return pSDKAnnot;
+
+ CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+ ASSERT(pEnv);
+ CPDFSDK_AnnotHandlerMgr * pAnnotHandler= pEnv->GetAnnotHandlerMgr();
+
+ pSDKAnnot =NULL;
+
+ if(pAnnotHandler)
+ {
+ pSDKAnnot = pAnnotHandler->NewAnnot(pPDFAnnot, this);
+ }
+ if(!pSDKAnnot)
+ return NULL;
+
+ m_fxAnnotArray.Add(pSDKAnnot);
+
+ return pSDKAnnot;
+}
+
CPDFSDK_Annot* CPDFSDK_PageView::AddAnnot(CPDF_Dictionary * pDict)
{
if(pDict)
@@ -795,21 +849,42 @@ CPDFSDK_Annot* CPDFSDK_PageView::AddAnnot(FX_LPCSTR lpSubType,CPDF_Dictionary *
FX_BOOL CPDFSDK_PageView::DeleteAnnot(CPDFSDK_Annot* pAnnot)
{
- return FALSE;
+ if (!pAnnot)
+ return FALSE;
+ CPDFXFA_Page* pPage = pAnnot->GetPDFXFAPage();
+ if (!pPage || (pPage->GetDocument()->GetDocType() != DOCTYPE_STATIC_XFA && pPage->GetDocument()->GetDocType() != DOCTYPE_DYNIMIC_XFA))
+ return FALSE;
+
+ int index = m_fxAnnotArray.Find(pAnnot);
+ m_fxAnnotArray.RemoveAt(index);
+ if (m_CaptureWidget == pAnnot)
+ m_CaptureWidget = NULL;
+
+ return TRUE;
}
CPDF_Document* CPDFSDK_PageView::GetPDFDocument()
{
if(m_page)
{
- return m_page->m_pDocument;
+ return m_page->GetDocument()->GetPDFDoc();
}
return NULL;
}
+CPDF_Page* CPDFSDK_PageView::GetPDFPage()
+{
+ if (m_page)
+ {
+ return m_page->GetPDFPage();
+ }
+
+ return NULL;
+}
+
int CPDFSDK_PageView::CountAnnots()
{
- return m_pAnnotList->Count();
+ return m_fxAnnotArray.GetSize();
}
CPDFSDK_Annot* CPDFSDK_PageView::GetAnnot(int nIndex)
@@ -834,6 +909,20 @@ CPDFSDK_Annot* CPDFSDK_PageView::GetAnnotByDict(CPDF_Dictionary * pDict)
}
return NULL;
}
+CPDFSDK_Annot* CPDFSDK_PageView::GetAnnotByXFAWidget(XFA_HWIDGET hWidget)
+{
+ if (hWidget == NULL)
+ return NULL;
+ int annotCount = m_fxAnnotArray.GetSize();
+
+ for(int i = 0; i < annotCount; i++)
+ {
+ CPDFSDK_Annot* pAnnot = (CPDFSDK_Annot*)m_fxAnnotArray.GetAt(i);
+ if(pAnnot->GetXFAWidget() == hWidget)
+ return pAnnot;
+ }
+ return NULL;
+}
FX_BOOL CPDFSDK_PageView::OnLButtonDown(const CPDF_Point & point, FX_UINT nFlag)
{
@@ -859,6 +948,45 @@ FX_BOOL CPDFSDK_PageView::OnLButtonDown(const CPDF_Point & point, FX_UINT nFlag)
return FALSE;
}
+FX_BOOL CPDFSDK_PageView::OnRButtonDown(const CPDF_Point & 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 CPDF_Point & 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_OnRButtonUp(this, pFXAnnot, nFlag,point);
+ if (bRet)
+ {
+ SetFocusAnnot(pFXAnnot);
+ }
+ return TRUE;
+}
FX_BOOL CPDFSDK_PageView::OnLButtonUp(const CPDF_Point & point, FX_UINT nFlag)
{
@@ -978,27 +1106,61 @@ extern void CheckUnSupportAnnot(CPDF_Document * pDoc, CPDF_Annot* pPDFAnnot);
void CPDFSDK_PageView::LoadFXAnnots()
{
+ ASSERT(m_page != NULL);
+
CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+ ASSERT(pEnv != NULL);
- FX_BOOL enableAPUpdate = CPDF_InterForm::UpdatingAPEnabled();
- //Disable the default AP construction.
- CPDF_InterForm::EnableUpdateAP(FALSE);
- m_pAnnotList = new CPDF_AnnotList(m_page);
- CPDF_InterForm::EnableUpdateAP(enableAPUpdate);
- int nCount = m_pAnnotList->Count();
- SetLock(TRUE);
- for(int i=0; i<nCount; i++)
+ CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
+ ASSERT(pAnnotHandlerMgr != NULL);
+
+ if (m_pSDKDoc->GetDocument()->GetDocType() == DOCTYPE_DYNIMIC_XFA)
{
- CPDF_Annot* pPDFAnnot = m_pAnnotList->GetAt(i);
- CPDF_Document * pDoc = this->GetPDFDocument();
+ IXFA_PageView* pageView = NULL;
+ pageView = m_page->GetXFAPageView();
+ ASSERT(pageView != NULL);
+
+ XFA_HWIDGET pXFAAnnot = NULL;
+ IXFA_WidgetIterator* pWidgetHander = pageView->CreateWidgetIterator(XFA_TRAVERSEWAY_Form, XFA_WIDGETFILTER_Visible|XFA_WIDGETFILTER_Viewable|XFA_WIDGETFILTER_AllType);
+ if (!pWidgetHander)
+ return;
+
+ pXFAAnnot = pWidgetHander->MoveToNext();
+ while (pXFAAnnot) {
+ CPDFSDK_Annot* pAnnot = pAnnotHandlerMgr->NewAnnot(pXFAAnnot, this);
+ if(!pAnnot) {
+ pXFAAnnot = pWidgetHander->MoveToNext();
+ continue;
+ }
+ m_fxAnnotArray.Add(pAnnot);
- CheckUnSupportAnnot(pDoc, pPDFAnnot);
+ pAnnotHandlerMgr->Annot_OnLoad(pAnnot);
- CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
- ASSERT(pAnnotHandlerMgr != NULL);
+ pXFAAnnot = pWidgetHander->MoveToNext();
- if(pAnnotHandlerMgr)
+ }
+
+ pWidgetHander->Release();
+ }
+ else
+ {
+ CPDF_Page* pPage = m_page->GetPDFPage();
+ ASSERT(pPage != NULL);
+
+ FX_BOOL enableAPUpdate = CPDF_InterForm::UpdatingAPEnabled();
+ //Disable the default AP construction.
+ CPDF_InterForm::EnableUpdateAP(FALSE);
+ m_pAnnotList = new CPDF_AnnotList(pPage);
+ CPDF_InterForm::EnableUpdateAP(enableAPUpdate);
+
+ int nCount = m_pAnnotList->Count();
+ for(int i=0; i<nCount; i++)
{
+ CPDF_Annot* pPDFAnnot = m_pAnnotList->GetAt(i);
+ CPDF_Document * pDoc = this->GetPDFDocument();
+
+ CheckUnSupportAnnot(pDoc, pPDFAnnot);
+
CPDFSDK_Annot* pAnnot = pAnnotHandlerMgr->NewAnnot(pPDFAnnot, this);
if(!pAnnot)
continue;
@@ -1008,7 +1170,6 @@ void CPDFSDK_PageView::LoadFXAnnots()
}
}
- SetLock(FALSE);
}
void CPDFSDK_PageView::UpdateRects(CFX_RectArray& rects)
@@ -1037,11 +1198,11 @@ int CPDFSDK_PageView::GetPageIndex()
{
if(m_page)
{
- CPDF_Dictionary* pDic = m_page->m_pFormDict;
- CPDF_Document* pDoc = m_pSDKDoc->GetDocument();
+ CPDF_Dictionary* pDic = m_page->GetPDFPage()->m_pFormDict;
+ CPDFXFA_Document* pDoc = m_pSDKDoc->GetDocument();
if(pDoc && pDic)
{
- return pDoc->GetPageIndex(pDic->GetObjNum());
+ return pDoc->GetPDFDoc()->GetPageIndex(pDic->GetObjNum());
}
}
return -1;