diff options
Diffstat (limited to 'fpdfsdk')
161 files changed, 65019 insertions, 0 deletions
diff --git a/fpdfsdk/include/formfiller/FFL_CBA_Fontmap.h b/fpdfsdk/include/formfiller/FFL_CBA_Fontmap.h new file mode 100644 index 0000000000..7624596788 --- /dev/null +++ b/fpdfsdk/include/formfiller/FFL_CBA_Fontmap.h @@ -0,0 +1,51 @@ +// 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 _RAO_FONTMAP_H_
+#define _RAO_FONTMAP_H_
+
+#if _MSC_VER > 1000
+#pragma once
+#endif // _MSC_VER > 1000
+
+class CPDFSDK_Annot;
+
+class CBA_FontMap : public CPWL_FontMap
+{
+public:
+ CBA_FontMap(CPDFSDK_Annot* pAnnot, IFX_SystemHandler* pSystemHandler);
+ CBA_FontMap(CPDF_Document* pDocument, CPDF_Dictionary* pAnnotDict, IFX_SystemHandler* pSystemHandler);
+
+ virtual ~CBA_FontMap();
+
+ virtual void Initial(FX_LPCSTR fontname = NULL);
+
+public:
+ void SetDefaultFont(CPDF_Font * pFont, const CFX_ByteString & sFontName);
+
+ void Reset();
+ void SetAPType(const CFX_ByteString& sAPType);
+
+protected:
+ virtual CPDF_Font* FindFontSameCharset(CFX_ByteString& sFontAlias, FX_INT32 nCharset);
+ virtual void AddedFont(CPDF_Font* pFont, const CFX_ByteString& sFontAlias);
+ virtual CPDF_Document* GetDocument();
+private:
+ CPDF_Font* FindResFontSameCharset(CPDF_Dictionary* pResDict, CFX_ByteString& sFontAlias,
+ FX_INT32 nCharset);
+ CPDF_Font* GetAnnotDefaultFont(CFX_ByteString &csNameTag);
+ void AddFontToAnnotDict(CPDF_Font* pFont, const CFX_ByteString& sAlias);
+
+private:
+ CPDF_Document* m_pDocument;
+ CPDF_Dictionary* m_pAnnotDict;
+ CPDF_Font* m_pDefaultFont;
+ CFX_ByteString m_sDefaultFontName;
+
+ CFX_ByteString m_sAPType;
+};
+
+#endif // _RAO_FONTMAP_H_
diff --git a/fpdfsdk/include/formfiller/FFL_CheckBox.h b/fpdfsdk/include/formfiller/FFL_CheckBox.h new file mode 100644 index 0000000000..f8ee370519 --- /dev/null +++ b/fpdfsdk/include/formfiller/FFL_CheckBox.h @@ -0,0 +1,27 @@ +// 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 _FFL_CHECKBOX_H_
+#define _FFL_CHECKBOX_H_
+
+class CFFL_CheckBox : public CFFL_Button
+{
+public:
+ CFFL_CheckBox(CPDFDoc_Environment* pApp, CPDFSDK_Widget* pWidget);
+ virtual ~CFFL_CheckBox();
+
+ virtual CPWL_Wnd* NewPDFWindow(const PWL_CREATEPARAM& cp, CPDFSDK_PageView* pPageView);
+
+ virtual FX_BOOL OnKeyDown(CPDFSDK_Annot* pAnnot, FX_UINT nKeyCode, FX_UINT nFlags);
+ virtual FX_BOOL OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags);
+ virtual FX_BOOL OnLButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);
+
+ virtual FX_BOOL IsDataChanged(CPDFSDK_PageView* pPageView);
+ virtual void SaveData(CPDFSDK_PageView* pPageView);
+};
+
+#endif //_FFL_CHECKBOX_H_
+
diff --git a/fpdfsdk/include/formfiller/FFL_ComboBox.h b/fpdfsdk/include/formfiller/FFL_ComboBox.h new file mode 100644 index 0000000000..f116acffd9 --- /dev/null +++ b/fpdfsdk/include/formfiller/FFL_ComboBox.h @@ -0,0 +1,69 @@ +// 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 _FFL_COMBOBOX_H_
+ #define _FFL_COMBOBOX_H_
+
+struct FFL_ComboBoxState
+{
+ int nIndex;
+ int nStart;
+ int nEnd;
+ CFX_WideString sValue;
+};
+class CBA_FontMap;
+
+class CFFL_ComboBox : public CFFL_FormFiller, public IPWL_FocusHandler, public IPWL_Edit_Notify
+{
+public:
+ CFFL_ComboBox(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pWidget);
+ virtual ~CFFL_ComboBox();
+
+ virtual PWL_CREATEPARAM GetCreateParam();
+ virtual CPWL_Wnd* NewPDFWindow(const PWL_CREATEPARAM& cp, CPDFSDK_PageView* pPageView);
+
+
+ virtual FX_BOOL OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags);
+
+ virtual FX_BOOL IsDataChanged(CPDFSDK_PageView* pPageView);
+ virtual void SaveData(CPDFSDK_PageView* pPageView);
+
+ virtual void GetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type, PDFSDK_FieldAction& fa);
+ virtual void SetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type, const PDFSDK_FieldAction& fa);
+ virtual FX_BOOL IsActionDataChanged(CPDF_AAction::AActionType type, const PDFSDK_FieldAction& faOld, const PDFSDK_FieldAction& faNew);
+ virtual void SaveState(CPDFSDK_PageView* pPageView);
+ virtual void RestoreState(CPDFSDK_PageView* pPageView);
+
+ virtual CPWL_Wnd* ResetPDFWindow(CPDFSDK_PageView* pPageView, FX_BOOL bRestoreValue);
+ virtual void OnKeyStroke(FX_BOOL bKeyDown, FX_UINT nFlag);
+
+public:
+ virtual void OnSetFocus(CPWL_Wnd* pWnd);
+ virtual void OnKillFocus(CPWL_Wnd* pWnd);
+
+public:
+ virtual void OnAddUndo(CPWL_Edit* pEdit);
+
+public:
+ virtual FX_BOOL CanCopy(CPDFSDK_Document* pDocument);
+ virtual FX_BOOL CanCut(CPDFSDK_Document* pDocument);
+ virtual FX_BOOL CanPaste(CPDFSDK_Document* pDocument);
+
+ virtual void DoCopy(CPDFSDK_Document* pDocument);
+ virtual void DoCut(CPDFSDK_Document* pDocument);
+ virtual void DoPaste(CPDFSDK_Document* pDocument);
+
+private:
+ CFX_WideString GetSelectExportText();
+
+private:
+ CBA_FontMap* m_pFontMap;
+ FFL_ComboBoxState m_State;
+ //CFFL_IM_BOX m_IMBox;
+};
+
+#endif //_FFL_COMBOBOX_H_
+
diff --git a/fpdfsdk/include/formfiller/FFL_FormFiller.h b/fpdfsdk/include/formfiller/FFL_FormFiller.h new file mode 100644 index 0000000000..eb81675fa4 --- /dev/null +++ b/fpdfsdk/include/formfiller/FFL_FormFiller.h @@ -0,0 +1,178 @@ +// 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 _FFL_FORMFILLER_H_
+#define _FFL_FORMFILLER_H_
+
+#include "FFL_IFormFiller.h"
+#include "FFL_CBA_Fontmap.h"
+
+class CPDFSDK_Annot;
+class CFFL_FormFiller;
+class CFFL_Notify;
+class CPDFDoc_Environment;
+class CPDFSDK_PageView;
+class CPDFSDK_Document;
+class CPDFSDK_Widget;
+
+
+#define CFFL_PageView2PDFWindow CFX_MapPtrTemplate<CPDFSDK_PageView*, CPWL_Wnd*>
+
+struct FFL_KeyStrokeData
+{
+ CFX_WideString swValue;
+ FX_BOOL bFull;
+ int nSelStart;
+ int nSelEnd;
+};
+
+
+
+class CFFL_FormFiller : /*public IBA_AnnotFiller,*/ public IPWL_Provider, public CPWL_TimerHandler
+{
+public:
+ CFFL_FormFiller(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pAnnot);
+ virtual ~CFFL_FormFiller();
+
+ virtual FX_RECT GetViewBBox(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot);
+ virtual void OnDraw(CPDFSDK_PageView *pPageView, /*HDC hDC,*/ CPDFSDK_Annot* pAnnot,
+ CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
+ /*const CRect& rcWindow, */FX_DWORD dwFlags);
+ virtual void OnDrawDeactive(CPDFSDK_PageView *pPageView, /*HDC hDC,*/ CPDFSDK_Annot* pAnnot,
+ CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
+ /*const CRect& rcWindow, */FX_DWORD dwFlags);
+
+ virtual void OnCreate(CPDFSDK_Annot* pAnnot);
+ virtual void OnLoad(CPDFSDK_Annot* pAnnot);
+ virtual void OnDelete(CPDFSDK_Annot* pAnnot);
+
+ virtual void OnMouseEnter(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot);
+ virtual void OnMouseExit(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot);
+
+ virtual FX_BOOL OnLButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);
+ virtual FX_BOOL OnLButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);
+ virtual FX_BOOL OnLButtonDblClk(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);
+ virtual FX_BOOL OnMouseMove(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);
+ virtual FX_BOOL OnMouseWheel(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, short zDelta, const CPDF_Point& point);
+ virtual FX_BOOL OnRButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);
+ virtual FX_BOOL OnRButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);
+ virtual FX_BOOL OnRButtonDblClk(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);
+
+ virtual FX_BOOL OnKeyDown(CPDFSDK_Annot* pAnnot, FX_UINT nKeyCode, FX_UINT nFlags);
+ virtual FX_BOOL OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags);
+
+ virtual void OnDeSelected(CPDFSDK_Annot* pAnnot);
+ virtual void OnSelected(CPDFSDK_Annot* pAnnot);
+
+ virtual FX_BOOL OnSetFocus(CPDFSDK_Annot* pAnnot, FX_UINT nFlag);
+ virtual FX_BOOL OnKillFocus(CPDFSDK_Annot* pAnnot, FX_UINT nFlag);
+
+ virtual FX_BOOL CanCopy(CPDFSDK_Document* pDocument);
+ virtual FX_BOOL CanCut(CPDFSDK_Document* pDocument);
+ virtual FX_BOOL CanPaste(CPDFSDK_Document* pDocument);
+
+ virtual void DoCopy(CPDFSDK_Document* pDocument);
+ virtual void DoCut(CPDFSDK_Document* pDocument);
+ virtual void DoPaste(CPDFSDK_Document* pDocument);
+
+public: //CPWL_TimerHandler
+ virtual void TimerProc();
+ virtual IFX_SystemHandler* GetSystemHandler() const;
+
+public:
+ virtual CPDF_Matrix GetWindowMatrix(void* pAttachedData);
+ virtual CFX_WideString LoadPopupMenuString(int nIndex);
+
+ virtual void GetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type,
+ PDFSDK_FieldAction& fa);
+ virtual void SetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type,
+ const PDFSDK_FieldAction& fa);
+ virtual FX_BOOL IsActionDataChanged(CPDF_AAction::AActionType type, const PDFSDK_FieldAction& faOld,
+ const PDFSDK_FieldAction& faNew);
+
+ virtual void SaveState(CPDFSDK_PageView* pPageView);
+ virtual void RestoreState(CPDFSDK_PageView* pPageView);
+
+ virtual CPWL_Wnd* ResetPDFWindow(CPDFSDK_PageView* pPageView, FX_BOOL bRestoreValue);
+
+ virtual void OnKeyStroke(FX_BOOL bKeyDown);
+
+ CPDF_Matrix GetCurMatrix();
+
+ CPDF_Rect FFLtoPWL(const CPDF_Rect& rect);
+ CPDF_Rect PWLtoFFL(const CPDF_Rect& rect);
+ CPDF_Point FFLtoPWL(const CPDF_Point& point);
+ CPDF_Point PWLtoFFL(const CPDF_Point& point);
+
+ CPDF_Point WndtoPWL(CPDFSDK_PageView* pPageView, const CPDF_Point& pt);
+ CPDF_Rect FFLtoWnd(CPDFSDK_PageView* pPageView, const CPDF_Rect& rect);
+
+ void SetWindowRect(CPDFSDK_PageView* pPageView, const CPDF_Rect& rcWindow);
+ CPDF_Rect GetWindowRect(CPDFSDK_PageView* pPageView);
+
+ static void FFL_FreeData(void* pData);
+
+ FX_BOOL CommitData(CPDFSDK_PageView* pPageView, FX_UINT nFlag);
+ virtual FX_BOOL IsDataChanged(CPDFSDK_PageView* pPageView);
+ virtual void SaveData(CPDFSDK_PageView* pPageView);
+
+ virtual void GetKeyStrokeData(CPDFSDK_PageView* pPageView, FFL_KeyStrokeData& data);
+
+public:
+ CPWL_Wnd* GetPDFWindow(CPDFSDK_PageView* pPageView, FX_BOOL bNew);
+ void DestroyPDFWindow(CPDFSDK_PageView* pPageView);
+ void EscapeFiller(CPDFSDK_PageView* pPageView, FX_BOOL bDestroyPDFWindow);
+
+ virtual PWL_CREATEPARAM GetCreateParam();
+ virtual CPWL_Wnd* NewPDFWindow(const PWL_CREATEPARAM& cp, CPDFSDK_PageView* pPageView) = 0;
+ virtual CPDF_Rect GetFocusBox(CPDFSDK_PageView* pPageView);
+
+public:
+ FX_BOOL IsValid() const;
+ CPDF_Rect GetPDFWindowRect() const;
+
+ CPDFSDK_PageView* GetCurPageView();
+ void SetChangeMark();
+
+ virtual void InvalidateRect(double left, double top, double right, double bottom);
+ CPDFDoc_Environment* GetApp(){return m_pApp;}
+ CPDFSDK_Annot* GetSDKAnnot() {return m_pAnnot;}
+protected:
+ CPDFDoc_Environment* m_pApp;
+ CPDFSDK_Widget* m_pWidget;
+ CPDFSDK_Annot* m_pAnnot;
+
+ FX_BOOL m_bValid;
+ CFFL_PageView2PDFWindow m_Maps;
+ CPDF_Point m_ptOldPos;
+};
+
+class CFFL_Button : public CFFL_FormFiller
+{
+public:
+ CFFL_Button(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pWidget);
+ virtual ~CFFL_Button();
+
+ virtual void OnMouseEnter(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot);
+ virtual void OnMouseExit(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot);
+ virtual FX_BOOL OnLButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);
+ virtual FX_BOOL OnLButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);
+ virtual FX_BOOL OnMouseMove(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);
+ virtual void OnDraw(CPDFSDK_PageView *pPageView/*, HDC hDC*/, CPDFSDK_Annot* pAnnot,
+ CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
+ /*const CRect& rcWindow,*/ FX_DWORD dwFlags);
+
+ virtual void OnDrawDeactive(CPDFSDK_PageView *pPageView, /*HDC hDC,*/ CPDFSDK_Annot* pAnnot,
+ CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
+ /*const CRect& rcWindow, */FX_DWORD dwFlags);
+protected:
+ FX_BOOL m_bMouseIn;
+ FX_BOOL m_bMouseDown;
+};
+
+//#define CFFL_IM_BOX CFX_ArrayTemplate<CBA_EditInput*>
+
+#endif
diff --git a/fpdfsdk/include/formfiller/FFL_IFormFiller.h b/fpdfsdk/include/formfiller/FFL_IFormFiller.h new file mode 100644 index 0000000000..79b4b8e6d7 --- /dev/null +++ b/fpdfsdk/include/formfiller/FFL_IFormFiller.h @@ -0,0 +1,144 @@ +// 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 _FFL_IFORMFILLER_H_
+#define _FFL_IFORMFILLER_H_
+
+#include "FormFiller.h"
+class CFFL_FormFiller;
+class CFFL_PrivateData;
+
+#define CFFL_Widget2Filler CFX_MapPtrTemplate<CPDFSDK_Annot*, CFFL_FormFiller*>
+
+// #define IsALTpressed() (GetKeyState(VK_MENU) < 0)
+// #define IsCTRLpressed() (GetKeyState(VK_CONTROL) < 0)
+// #define IsSHIFTpressed() (GetKeyState(VK_SHIFT)&0x8000)
+// #define IsINSERTpressed() (GetKeyState(VK_INSERT) & 0x01)
+// #define VK_SHIFT 0x10
+// #define VK_CONTROL 0x11
+// #define VK_MENU 0x12
+// #define VK_RETURN 0x0D
+// #define VK_SPACE 0x20
+// #define VK_ESCAPE 0x1B
+
+
+
+class CFFL_IFormFiller :/* public IBA_AnnotFiller, */public IPWL_Filler_Notify//,
+// public IUndo_EventHandler, public IClipboard_Handler
+{
+public:
+ CFFL_IFormFiller(CPDFDoc_Environment* pApp);
+ virtual ~CFFL_IFormFiller();
+
+ virtual FX_BOOL Annot_HitTest(CPDFSDK_PageView* pPageView,CPDFSDK_Annot* pAnnot, CPDF_Point point);
+ virtual FX_RECT GetViewBBox(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot);
+ virtual void OnDraw(CPDFSDK_PageView *pPageView, /*HDC hDC,*/ CPDFSDK_Annot* pAnnot,
+ CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
+ /*const CRect& rcWindow,*/ FX_DWORD dwFlags);
+
+
+ virtual void OnCreate(CPDFSDK_Annot* pAnnot);
+ virtual void OnLoad(CPDFSDK_Annot* pAnnot);
+ virtual void OnDelete(CPDFSDK_Annot* pAnnot);
+
+ virtual void OnMouseEnter(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlag);
+ virtual void OnMouseExit(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlag);
+
+ virtual FX_BOOL OnLButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);
+ virtual FX_BOOL OnLButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);
+ virtual FX_BOOL OnLButtonDblClk(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);
+ virtual FX_BOOL OnMouseMove(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);
+ virtual FX_BOOL OnMouseWheel(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, short zDelta, const CPDF_Point& point);
+ virtual FX_BOOL OnRButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);
+ virtual FX_BOOL OnRButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);
+ virtual FX_BOOL OnRButtonDblClk(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);
+
+ virtual FX_BOOL OnKeyDown(CPDFSDK_Annot* pAnnot, FX_UINT nKeyCode, FX_UINT nFlags);
+ virtual FX_BOOL OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags);
+
+ virtual void OnDeSelected(CPDFSDK_Annot* pAnnot);
+ virtual void OnSelected(CPDFSDK_Annot* pAnnot);
+
+ virtual FX_BOOL OnSetFocus(CPDFSDK_Annot* pAnnot,FX_UINT nFlag);
+ virtual FX_BOOL OnKillFocus(CPDFSDK_Annot* pAnnot, FX_UINT nFlag);
+
+public:
+ virtual void QueryWherePopup(void* pPrivateData, FX_FLOAT fPopupMin,FX_FLOAT fPopupMax, FX_INT32 & nRet, FX_FLOAT & fPopupRet);
+ virtual void OnBeforeKeyStroke(FX_BOOL bEditOrList, void* pPrivateData, FX_INT32 nKeyCode,
+ CFX_WideString & strChange, const CFX_WideString& strChangeEx,
+ int nSelStart, int nSelEnd,
+ FX_BOOL bKeyDown, FX_BOOL & bRC, FX_BOOL & bExit, FX_DWORD nFlag);
+ virtual void OnAfterKeyStroke(FX_BOOL bEditOrList, void* pPrivateData, FX_BOOL & bExit, FX_DWORD nFlag) ;
+
+ virtual void OnSetWindowRect(void* pPrivateData, const CPDF_Rect & rcWindow);
+ virtual void OnKeyStroke(FX_BOOL bEditOrList, void* pPrivateData, FX_INT32 nKeyCode, CFX_WideString & strChange,
+ const CFX_WideString& strChangeEx, FX_BOOL bKeyDown, FX_BOOL & bRC, FX_BOOL & bExit);
+
+public:
+ virtual void BeforeUndo(CPDFSDK_Document* pDocument);
+ virtual void BeforeRedo(CPDFSDK_Document* pDocument);
+ virtual void AfterUndo(CPDFSDK_Document* pDocument);
+ virtual void AfterRedo(CPDFSDK_Document* pDocument);
+
+public:
+ virtual FX_BOOL CanCopy(CPDFSDK_Document* pDocument);
+ virtual FX_BOOL CanCut(CPDFSDK_Document* pDocument);
+ virtual FX_BOOL CanPaste(CPDFSDK_Document* pDocument);
+
+ virtual void DoCopy(CPDFSDK_Document* pDocument);
+ virtual void DoCut(CPDFSDK_Document* pDocument);
+ virtual void DoPaste(CPDFSDK_Document* pDocument);
+
+public:
+ CFFL_FormFiller* GetFormFiller(CPDFSDK_Annot* pAnnot, FX_BOOL bRegister);
+ void RemoveFormFiller(CPDFSDK_Annot* pAnnot);
+
+ static FX_BOOL IsVisible(CPDFSDK_Widget* pWidget);
+ static FX_BOOL IsReadOnly(CPDFSDK_Widget* pWidget);
+ static FX_BOOL IsFillingAllowed(CPDFSDK_Widget* pWidget);
+ static FX_BOOL IsValidAnnot(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot);
+
+ void OnKeyStrokeCommit(CPDFSDK_Widget* pWidget, CPDFSDK_PageView* pPageView, FX_BOOL& bRC, FX_BOOL& bExit, FX_DWORD nFlag);
+ void OnValidate(CPDFSDK_Widget* pWidget, CPDFSDK_PageView* pPageView, FX_BOOL& bRC, FX_BOOL& bExit, FX_DWORD nFlag);
+
+ void OnCalculate(CPDFSDK_Widget* pWidget, CPDFSDK_PageView* pPageView, FX_BOOL& bExit, FX_DWORD nFlag);
+ void OnFormat(CPDFSDK_Widget* pWidget, CPDFSDK_PageView* pPageView, FX_BOOL& bExit, FX_DWORD nFlag);
+ void OnButtonUp(CPDFSDK_Widget* pWidget, CPDFSDK_PageView* pPageView, FX_BOOL& bReset, FX_BOOL& bExit,FX_UINT nFlag);
+// static LRESULT CALLBACK FFL_WndProc(
+// int code, // hook code
+// WPARAM wParam, // virtual-key code
+// LPARAM lParam // keystroke-message information
+// );
+// static MSG GetLastMessage();
+ static int GetCommitKey();
+ static FX_BOOL GetKeyDown();
+
+
+public:
+// static MSG g_Msg;
+// static HHOOK m_hookSheet;
+
+private:
+ void UnRegisterFormFiller(CPDFSDK_Annot* pAnnot);
+ void SetFocusAnnotTab(CPDFSDK_Annot* pWidget, FX_BOOL bSameField, FX_BOOL bNext);
+
+private:
+ CPDFDoc_Environment* m_pApp;
+ CFFL_Widget2Filler m_Maps;
+ FX_BOOL m_bNotifying;
+};
+
+class CFFL_PrivateData
+{
+public:
+ CPDFSDK_Widget* pWidget;
+ CPDFSDK_PageView* pPageView;
+ int nWidgetAge;
+ int nValueAge;
+};
+
+#endif //_FFL_IFORMFILLER_H_
+
diff --git a/fpdfsdk/include/formfiller/FFL_ListBox.h b/fpdfsdk/include/formfiller/FFL_ListBox.h new file mode 100644 index 0000000000..899c44da2d --- /dev/null +++ b/fpdfsdk/include/formfiller/FFL_ListBox.h @@ -0,0 +1,44 @@ +// 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 _FFL_LISTBOX_H_
+#define _FFL_LISTBOX_H_
+
+class CBA_FontMap;
+class CFFL_ListBox : public CFFL_FormFiller
+{
+public:
+ CFFL_ListBox(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pWidget);
+ virtual ~CFFL_ListBox();
+
+ virtual PWL_CREATEPARAM GetCreateParam();
+ virtual CPWL_Wnd* NewPDFWindow(const PWL_CREATEPARAM& cp, CPDFSDK_PageView* pPageView);
+
+ virtual FX_BOOL OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags);
+
+ virtual FX_BOOL IsDataChanged(CPDFSDK_PageView* pPageView);
+ virtual void SaveData(CPDFSDK_PageView* pPageView);
+
+ virtual void GetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type,
+ PDFSDK_FieldAction& fa);
+ virtual void SetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type,
+ const PDFSDK_FieldAction& fa);
+
+ virtual void SaveState(CPDFSDK_PageView* pPageView);
+ virtual void RestoreState(CPDFSDK_PageView* pPageView);
+
+ virtual CPWL_Wnd* ResetPDFWindow(CPDFSDK_PageView* pPageView, FX_BOOL bRestoreValue);
+ virtual void OnKeyStroke(FX_BOOL bKeyDown, FX_DWORD nFlag);
+
+private:
+ CBA_FontMap* m_pFontMap;
+ CFX_MapPtrTemplate<int, void*> m_OriginSelections;
+ CFX_ArrayTemplate<int> m_State;
+};
+
+
+#endif //_FFL_LISTBOX_H_
+
diff --git a/fpdfsdk/include/formfiller/FFL_Notify.h b/fpdfsdk/include/formfiller/FFL_Notify.h new file mode 100644 index 0000000000..8a0b7a3fa3 --- /dev/null +++ b/fpdfsdk/include/formfiller/FFL_Notify.h @@ -0,0 +1,54 @@ +// 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
+
+#if !defined(_FFL_NOTIFY_H_)
+#define _FFL_NOTIFY_H_
+
+class CFFL_FormFiller;
+
+class CFFL_Notify
+{
+public:
+ CFFL_Notify(CFFL_FormFiller * pFormFiller);
+ virtual ~CFFL_Notify();
+
+public:
+ FX_BOOL OnSetFocus(FX_BOOL & bExit);
+ FX_BOOL OnMouseEnter(FX_BOOL & bExit);
+ FX_BOOL OnMouseDown(FX_BOOL & bExit);
+ FX_BOOL OnMouseUp(FX_BOOL & bExit);
+ FX_BOOL OnMouseExit(FX_BOOL & bExit);
+ FX_BOOL OnKillFocus(FX_BOOL & bExit);
+
+ FX_BOOL OnCalculate();
+ FX_BOOL OnFormat(int iCommitKey);
+ FX_BOOL OnValidate(CPDF_FormField* pFormField, CFX_WideString& strValue, CFX_WideString & strChange,
+ const CFX_WideString& strChangeEx, FX_BOOL bKeyDown, FX_BOOL bModifier,
+ FX_BOOL bShift, FX_BOOL & bRC);
+ FX_BOOL OnKeyStroke(CPDF_FormField* pFormField, int nCommitKey, CFX_WideString& strValue, CFX_WideString& strChange,
+ const CFX_WideString& strChangeEx, FX_BOOL bKeyDown, FX_BOOL bModifier,
+ FX_BOOL bShift, FX_BOOL bWillCommit, FX_BOOL bFieldFull,
+ int& nSelStart, int& nSelEnd, FX_BOOL& bRC);
+
+ void BeforeNotify();
+ void AfterNotify();
+ FX_BOOL IsNotifying() const {return m_nNotifyFlag > 0;}
+
+private:
+// CReader_InterForm * GetReaderInterForm();
+ FX_BOOL DoAAction(CPDF_AAction::AActionType eAAT, FX_BOOL & bExit);
+ FX_BOOL FindAAction(CPDF_AAction::AActionType eAAT,CPDF_Action & action);
+ FX_BOOL FindAAction(CPDF_AAction aaction,CPDF_AAction::AActionType eAAT,CPDF_Action & action);
+ FX_BOOL ExecuteActionTree(CPDF_AAction::AActionType eAAT, CPDF_Action & action, FX_BOOL& bExit);
+ FX_BOOL ExecuteAction(CPDF_AAction::AActionType eAAT,CPDF_Action & action,FX_BOOL& bExit);
+
+ CFFL_FormFiller * m_pFormFiller;
+ FX_BOOL m_bDoActioning;
+ FX_INT32 m_nNotifyFlag;
+};
+
+#endif
+
diff --git a/fpdfsdk/include/formfiller/FFL_PushButton.h b/fpdfsdk/include/formfiller/FFL_PushButton.h new file mode 100644 index 0000000000..4dcff145ae --- /dev/null +++ b/fpdfsdk/include/formfiller/FFL_PushButton.h @@ -0,0 +1,25 @@ +// 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 _FFL_PUSHBUTTON_H_
+#define _FFL_PUSHBUTTON_H_
+
+class CFFL_PushButton : public CFFL_Button
+{
+public:
+ CFFL_PushButton(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pAnnot);
+ virtual ~CFFL_PushButton();
+
+ virtual CPWL_Wnd* NewPDFWindow(const PWL_CREATEPARAM& cp, CPDFSDK_PageView* pPageView);
+
+ virtual FX_BOOL OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags);
+ virtual void OnDraw(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot,
+ CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
+ FX_DWORD dwFlags);
+};
+
+#endif //_FFL_PUSHBUTTON_H_
+
diff --git a/fpdfsdk/include/formfiller/FFL_RadioButton.h b/fpdfsdk/include/formfiller/FFL_RadioButton.h new file mode 100644 index 0000000000..bab8584db9 --- /dev/null +++ b/fpdfsdk/include/formfiller/FFL_RadioButton.h @@ -0,0 +1,25 @@ +// 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 _FFL_RADIOBUTTON_H_
+#define _FFL_RADIOBUTTON_H_
+
+class CFFL_RadioButton : public CFFL_Button
+{
+public:
+ CFFL_RadioButton(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pAnnot);
+ virtual ~CFFL_RadioButton();
+
+ virtual CPWL_Wnd* NewPDFWindow(const PWL_CREATEPARAM& cp, CPDFSDK_PageView* pPageView);
+ virtual FX_BOOL OnKeyDown(CPDFSDK_Annot* pAnnot, FX_UINT nKeyCode, FX_UINT nFlags);
+ virtual FX_BOOL OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags);
+ virtual FX_BOOL OnLButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);
+ virtual FX_BOOL IsDataChanged(CPDFSDK_PageView* pPageView);
+ virtual void SaveData(CPDFSDK_PageView* pPageView);
+};
+
+#endif //_FFL_RADIOBUTTON_H_
+
diff --git a/fpdfsdk/include/formfiller/FFL_TextField.h b/fpdfsdk/include/formfiller/FFL_TextField.h new file mode 100644 index 0000000000..2b6f069af2 --- /dev/null +++ b/fpdfsdk/include/formfiller/FFL_TextField.h @@ -0,0 +1,89 @@ +// 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
+
+#if !defined(AFX_FFL_EDIT_H__8E0C9456_CBA2_4EFB_9F31_53C6D8C1A8AC__INCLUDED_)
+#define AFX_FFL_EDIT_H__8E0C9456_CBA2_4EFB_9F31_53C6D8C1A8AC__INCLUDED_
+
+#include "FFL_FormFiller.h"
+
+#define BF_ALIGN_LEFT 0
+#define BF_ALIGN_MIDDLE 1
+#define BF_ALIGN_RIGHT 2
+
+class CBA_FontMap;
+
+class CFFL_EditUndoItem //: public IUndoItem
+{
+public:
+ CFFL_EditUndoItem(CPWL_Edit* pEdit);
+ virtual ~CFFL_EditUndoItem();
+
+ virtual void Undo();
+ virtual void Redo();
+ virtual CFX_WideString GetDescr();
+ virtual void Release();
+
+private:
+ CPWL_Edit* m_pEdit;
+};
+
+struct FFL_TextFieldState
+{
+ int nStart;
+ int nEnd;
+ CFX_WideString sValue;
+};
+
+class CFFL_TextField : public CFFL_FormFiller, public IPWL_FocusHandler, public IPWL_Edit_Notify
+{
+public:
+ CFFL_TextField(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pAnnot);
+ virtual ~CFFL_TextField();
+
+ virtual PWL_CREATEPARAM GetCreateParam();
+ virtual CPWL_Wnd* NewPDFWindow(const PWL_CREATEPARAM& cp, CPDFSDK_PageView* pPageView);
+
+
+ virtual FX_BOOL OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags);
+
+ virtual FX_BOOL IsDataChanged(CPDFSDK_PageView* pPageView);
+ virtual void SaveData(CPDFSDK_PageView* pPageView);
+
+ virtual void GetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type,
+ PDFSDK_FieldAction& fa);
+ virtual void SetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type,
+ const PDFSDK_FieldAction& fa);
+ virtual FX_BOOL IsActionDataChanged(CPDF_AAction::AActionType type, const PDFSDK_FieldAction& faOld,
+ const PDFSDK_FieldAction& faNew);
+ virtual void SaveState(CPDFSDK_PageView* pPageView);
+ virtual void RestoreState(CPDFSDK_PageView* pPageView);
+
+ virtual CPWL_Wnd* ResetPDFWindow(CPDFSDK_PageView* pPageView, FX_BOOL bRestoreValue);
+
+public:
+ virtual void OnSetFocus(CPWL_Wnd* pWnd);
+ virtual void OnKillFocus(CPWL_Wnd* pWnd);
+
+public:
+ virtual void OnAddUndo(CPWL_Edit* pEdit);
+
+public:
+ virtual FX_BOOL CanCopy(CPDFSDK_Document* pDocument);
+ virtual FX_BOOL CanCut(CPDFSDK_Document* pDocument);
+ virtual FX_BOOL CanPaste(CPDFSDK_Document* pDocument);
+
+ virtual void DoCopy(CPDFSDK_Document* pDocument);
+ virtual void DoCut(CPDFSDK_Document* pDocument);
+ virtual void DoPaste(CPDFSDK_Document* pDocument);
+
+private:
+ CBA_FontMap* m_pFontMap;
+// CBA_SpellCheck* m_pSpellCheck;
+ FFL_TextFieldState m_State;
+// CFFL_IM_BOX m_IMBox;
+};
+
+#endif // !defined(AFX_FFL_EDIT_H__8E0C9456_CBA2_4EFB_9F31_53C6D8C1A8AC__INCLUDED_)
diff --git a/fpdfsdk/include/formfiller/FFL_Utils.h b/fpdfsdk/include/formfiller/FFL_Utils.h new file mode 100644 index 0000000000..07f2bee761 --- /dev/null +++ b/fpdfsdk/include/formfiller/FFL_Utils.h @@ -0,0 +1,20 @@ +// 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
+
+#define FFL_BASE_USERUNIT 1.0f / 72.0f
+
+template<class T> T FFL_MIN (const T & i, const T & j) { return ((i < j) ? i : j); }
+template<class T> T FFL_MAX (const T & i, const T & j) { return ((i > j) ? i : j); }
+
+class CFFL_Utils
+{
+public:
+ static CPDF_Rect MaxRect(const CPDF_Rect & rect1,const CPDF_Rect & rect2);
+ static CPDF_Rect InflateRect(const CPDF_Rect & crRect, const FX_FLOAT & fSize);
+ static CPDF_Rect DeflateRect(const CPDF_Rect & crRect, const FX_FLOAT & fSize);
+ static FX_BOOL TraceObject(CPDF_Object* pObj);
+};
+
diff --git a/fpdfsdk/include/formfiller/FormFiller.h b/fpdfsdk/include/formfiller/FormFiller.h new file mode 100644 index 0000000000..e7a22a0101 --- /dev/null +++ b/fpdfsdk/include/formfiller/FormFiller.h @@ -0,0 +1,30 @@ +// 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 _FORMFILLER_H_
+#define _FORMFILLER_H_
+
+
+
+#ifndef _INC_PDFAPI
+ #define _INC_PDFAPI
+
+ #include "../../../core/include/fpdfapi/fpdf_module.h"
+ #include "../../../core/include/fpdfdoc/fpdf_doc.h"
+ #include "../../../core/include/fpdfdoc/fpdf_vt.h"
+ #include "../../../core/include/fxcrt/fx_xml.h"
+
+#endif
+
+#include "../fsdk_mgr.h"
+
+#include "../fxedit/fx_edit.h"
+#include "../pdfwindow/IPDFWindow.h"
+
+
+
+#endif //_FORMFILLER_H_
+
diff --git a/fpdfsdk/include/fpdf_dataavail.h b/fpdfsdk/include/fpdf_dataavail.h new file mode 100644 index 0000000000..9d373fc959 --- /dev/null +++ b/fpdfsdk/include/fpdf_dataavail.h @@ -0,0 +1,222 @@ +// 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 _FPDF_DATAAVAIL_H_
+#define _FPDF_DATAAVAIL_H_
+
+#ifndef _FPDFVIEW_H_
+#include "fpdfview.h"
+#endif
+
+
+/** The result of the process which check linearized PDF. */
+#define FSDK_IS_LINEARIZED 1
+#define FSDK_NOT_LINEARIZED 0
+#define FSDK_UNKNOW_LINEARIZED -1
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Interface: FX_FILEAVAIL
+ * Interface for checking whether the section of the file is available.
+ */
+typedef struct _FX_FILEAVAIL {
+ /**
+ * Version number of the interface. Currently must be 1.
+ */
+ int version;
+
+ /**
+ * Method: IsDataAvail
+ * Report whether the specified data section is available. A section is available only if all bytes in the section is available.
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * Yes
+ * Parameters:
+ * pThis - Pointer to the interface structure itself.
+ * offset - The offset of the data section in the file.
+ * size - The size of the data section
+ * Return Value:
+ * true means the specified data section is available.
+ * Comments:
+ * Called by Foxit SDK to check whether the data section is ready.
+ */
+ bool (*IsDataAvail)(struct _FX_FILEAVAIL* pThis, size_t offset, size_t size);
+} FX_FILEAVAIL;
+
+typedef void* FPDF_AVAIL;
+
+/**
+* Function: FPDFAvail_Create
+* Create a document availability provider.
+*
+* Parameters:
+* file_avail - Pointer to file availability interface to check availability of file data.
+* file - Pointer to a file access interface for reading data from file.
+* Return value:
+* A handle to the document availability provider. NULL for error.
+* Comments:
+* Application must call FPDFAvail_Destroy when done with the availability provider.
+*/
+DLLEXPORT FPDF_AVAIL STDCALL FPDFAvail_Create(FX_FILEAVAIL* file_avail, FPDF_FILEACCESS* file);
+
+/**
+* Function: FPDFAvail_Destroy
+* Destroy a document availibity provider.
+*
+* Parameters:
+* avail - Handle to document availability provider returned by FPDFAvail_Create
+* Return Value:
+* None.
+*/
+DLLEXPORT void STDCALL FPDFAvail_Destroy(FPDF_AVAIL avail);
+
+/**
+ * Interface: FX_DOWNLOADHINTS
+ * Download hints interface. Used to receive hints for further downloading.
+ */
+typedef struct _FX_DOWNLOADHINTS {
+ /**
+ * Version number of the interface. Currently must be 1.
+ */
+ int version;
+
+ /**
+ * Method: AddSegment
+ * Add a section to be downloaded.
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * Yes
+ * Parameters:
+ * pThis - Pointer to the interface structure itself.
+ * offset - The offset of the hint reported to be downloaded.
+ * size - The size of the hint reported to be downloaded.
+ * Return Value:
+ * None.
+ * Comments:
+ * Called by Foxit SDK to report some downloading hints for download manager.
+ * The position and size of section may be not accurate, part of the section might be already available.
+ * The download manager must deal with that to maximize download efficiency.
+ */
+ void (*AddSegment)(struct _FX_DOWNLOADHINTS* pThis, size_t offset, size_t size);
+} FX_DOWNLOADHINTS;
+
+/**
+* Function: FPDFAvail_IsDocAvail
+* Check whether the document is ready for loading, if not, get download hints.
+*
+* Parameters:
+* avail - Handle to document availability provider returned by FPDFAvail_Create
+* hints - Pointer to a download hints interface, receiving generated hints
+* Return value:
+* Non-zero for page is fully available, 0 for page not yet available.
+* Comments:
+* The application should call this function whenever new data arrived, and process all the
+* generated download hints if any, until the function returns non-zero value. Then the
+* application can call FPDFAvail_GetDocument() to get a document handle.
+*/
+DLLEXPORT int STDCALL FPDFAvail_IsDocAvail(FPDF_AVAIL avail, FX_DOWNLOADHINTS* hints);
+
+/**
+* Function: FPDFAvail_GetDocument
+* Get document from the availability provider.
+*
+* Parameters:
+* avail - Handle to document availability provider returned by FPDFAvail_Create
+* password - Optional password for decrypting the PDF file.
+* Return value:
+* Handle to the document.
+* Comments:
+* After FPDFAvail_IsDocAvail() returns TRUE, the application should call this function to
+* get the document handle. To close the document, use FPDF_CloseDocument function.
+*/
+DLLEXPORT FPDF_DOCUMENT STDCALL FPDFAvail_GetDocument(FPDF_AVAIL avail,
+ FPDF_BYTESTRING password);
+
+/**
+* Function: FPDFAvail_GetFirstPageNum
+* Get page number for the first available page in a linearized PDF
+*
+* Parameters:
+* doc - A document handle returned by FPDFAvail_GetDocument
+* Return Value:
+* Zero-based index for the first available page.
+* Comments:
+* For most linearized PDFs, the first available page would be just the first page, however,
+* some PDFs might make other page to be the first available page.
+* For non-linearized PDF, this function will always return zero.
+*/
+DLLEXPORT int STDCALL FPDFAvail_GetFirstPageNum(FPDF_DOCUMENT doc);
+
+/**
+* Function: FPDFAvail_IsPageAvail
+* Check whether a page is ready for loading, if not, get download hints.
+*
+* Parameters:
+* avail - Handle to document availability provider returned by FPDFAvail_Create
+* page_index - Index number of the page. 0 for the first page.
+* hints - Pointer to a download hints interface, receiving generated hints
+* Return value:
+* Non-zero for page is fully available, 0 for page not yet available.
+* Comments:
+* This function call be called only after FPDFAvail_GetDocument if called.
+* The application should call this function whenever new data arrived, and process all the
+* generated download hints if any, until the function returns non-zero value. Then the
+* application can perform page loading.
+*/
+DLLEXPORT int STDCALL FPDFAvail_IsPageAvail(FPDF_AVAIL avail, int page_index, FX_DOWNLOADHINTS* hints);
+
+/**
+* Function: FPDFAvail_ISFormAvail
+* Check whether Form data is ready for init, if not, get download hints.
+*
+* Parameters:
+* avail - Handle to document availability provider returned by FPDFAvail_Create
+* hints - Pointer to a download hints interface, receiving generated hints
+* Return value:
+* Non-zero for Form data is fully available, 0 for Form data not yet available.
+* Details: -1 - error, the input parameter not correct, such as hints is null.
+* 0 - data not available
+* 1 - data available
+* 2 - no form data.
+* Comments:
+* This function call be called only after FPDFAvail_GetDocument if called.
+* The application should call this function whenever new data arrived, and process all the
+* generated download hints if any, until the function returns non-zero value. Then the
+* application can perform page loading. Recommend to call FPDFDOC_InitFormFillEnviroument
+* after the function returns non-zero value.
+*/
+DLLEXPORT int STDCALL FPDFAvail_IsFormAvail(FPDF_AVAIL avail, FX_DOWNLOADHINTS* hints);
+
+/**
+* Function: FPDFAvail_IsLinearized
+* To check whether a document is Linearized PDF file.
+*
+* Parameters:
+* avail - Handle to document availability provider returned by FPDFAvail_Create
+* Return value:
+* return TRUE means the document is linearized PDF else not.
+* FSDK_IS_LINEARIZED is a linearize file.
+* FSDK_NOT_LINEARIZED is not a linearize file.
+* FSDK_UNKNOW_LINEARIZED don't know whether the file is a linearize file.
+* Comments:
+* It return TRUE/FALSE as soon as we have first 1K data. If the file's size less than
+* 1K,we don't known whether the PDF is a linearized file.
+*
+*/
+DLLEXPORT FPDF_BOOL STDCALL FPDFAvail_IsLinearized(FPDF_AVAIL avail);
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif
+
diff --git a/fpdfsdk/include/fpdf_ext.h b/fpdfsdk/include/fpdf_ext.h new file mode 100644 index 0000000000..a8f268a4a0 --- /dev/null +++ b/fpdfsdk/include/fpdf_ext.h @@ -0,0 +1,108 @@ +// 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 _FPDF_EXT_H_
+#define _FPDF_EXT_H_
+
+#ifndef _FPDFVIEW_H_
+#include "fpdfview.h"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+//flags for type of unsupport object.
+#define FPDF_UNSP_DOC_XFAFORM 1
+#define FPDF_UNSP_DOC_PORTABLECOLLECTION 2
+#define FPDF_UNSP_DOC_ATTACHMENT 3
+#define FPDF_UNSP_DOC_SECURITY 4
+#define FPDF_UNSP_DOC_SHAREDREVIEW 5
+#define FPDF_UNSP_DOC_SHAREDFORM_ACROBAT 6
+#define FPDF_UNSP_DOC_SHAREDFORM_FILESYSTEM 7
+#define FPDF_UNSP_DOC_SHAREDFORM_EMAIL 8
+#define FPDF_UNSP_ANNOT_3DANNOT 11
+#define FPDF_UNSP_ANNOT_MOVIE 12
+#define FPDF_UNSP_ANNOT_SOUND 13
+#define FPDF_UNSP_ANNOT_SCREEN_MEDIA 14
+#define FPDF_UNSP_ANNOT_SCREEN_RICHMEDIA 15
+#define FPDF_UNSP_ANNOT_ATTACHMENT 16
+#define FPDF_UNSP_ANNOT_SIG 17
+
+typedef struct _UNSUPPORT_INFO
+{
+ /**
+ * Version number of the interface. Currently must be 1.
+ **/
+ int version;
+
+ /**
+ * Method: FSDK_UnSupport_Handler
+ * UnSupport Object process handling function.
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * Yes
+ * Parameters:
+ * pThis - Pointer to the interface structure itself.
+ * nType - The type of unsupportObject
+ * Return value:
+ * None.
+ * */
+
+ void(*FSDK_UnSupport_Handler)(_UNSUPPORT_INFO* pThis,int nType);
+}UNSUPPORT_INFO;
+
+
+/**
+ * Function: FSDK_SetUnSpObjProcessHandler
+ * Setup A UnSupport Object process handler for foxit sdk.
+ * Parameters:
+ * unsp_info - Pointer to a UNSUPPORT_INFO structure.
+ * Return Value:
+ * TRUE means successful. FALSE means fails.
+ **/
+
+DLLEXPORT FPDF_BOOL STDCALL FSDK_SetUnSpObjProcessHandler(UNSUPPORT_INFO* unsp_info);
+
+//flags for page mode.
+
+//Unknown value
+#define PAGEMODE_UNKONOWN -1
+
+//Neither document outline nor thumbnail images visible
+#define PAGEMODE_USENONE 0
+
+//Document outline visible
+#define PAGEMODE_USEOUTLINES 1
+
+//Thumbnial images visible
+#define PAGEMODE_USETHUMBS 2
+
+//Full-screen mode, with no menu bar, window controls, or any other window visible
+#define PAGEMODE_FULLSCREEN 3
+
+//Optional content group panel visible
+#define PAGEMODE_USEOC 4
+
+//Attachments panel visible
+#define PAGEMODE_USEATTACHMENTS 5
+
+
+/**
+ * Function: FPDFDoc_GetPageMode
+ * Get the document's PageMode(How the document should be displayed when opened)
+ * Parameters:
+ * doc - Handle to document. Returned by FPDF_LoadDocument function.
+ * Return Value:
+ * The flags for page mode.
+ **/
+DLLEXPORT int FPDFDoc_GetPageMode(FPDF_DOCUMENT document);
+
+#ifdef __cplusplus
+};
+#endif
+#endif
diff --git a/fpdfsdk/include/fpdf_flatten.h b/fpdfsdk/include/fpdf_flatten.h new file mode 100644 index 0000000000..26e324df73 --- /dev/null +++ b/fpdfsdk/include/fpdf_flatten.h @@ -0,0 +1,42 @@ +// 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 _FPDF_FLATTEN_H_
+#define _FPDF_FLATTEN_H_
+
+#include "fpdfview.h"
+
+#define FLATTEN_FAIL 0 // Flatten operation failed.
+#define FLATTEN_SUCCESS 1 // Flatten operation succeed.
+#define FLATTEN_NOTINGTODO 2 // There is nothing can be flatten.
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define FLAT_NORMALDISPLAY 0
+#define FLAT_PRINT 1
+ //Function: FPDFPage_Flatten
+
+ // Flat a pdf page,annotations or form fields will become part of the page contents.
+ //Parameters:
+
+ // page - Handle to the page. Returned by FPDF_LoadPage function.
+ // nFlag - the flag for the use of flatten result. Zero for normal display, 1 for print.
+ //Return value:
+ // The result flag of the function, See flags above ( FLATTEN_FAIL, FLATTEN_SUCCESS, FLATTEN_NOTINGTODO ).
+ //
+ // Comments: Current version all fails return zero. If necessary we will assign different value
+ // to indicate different fail reason.
+ //
+ DLLEXPORT int STDCALL FPDFPage_Flatten( FPDF_PAGE page, int nFlag);
+
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif //_FPDF_FLATTEN_H_
diff --git a/fpdfsdk/include/fpdf_fwlevent.h b/fpdfsdk/include/fpdf_fwlevent.h new file mode 100644 index 0000000000..cf34c2103f --- /dev/null +++ b/fpdfsdk/include/fpdf_fwlevent.h @@ -0,0 +1,286 @@ +// 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 _FWL_EVENT_H
+#define _FWL_EVENT_H
+
+#include "fpdfview.h"
+
+typedef int FPDF_INT32;
+typedef unsigned int FPDF_UINT32;
+typedef float FPDF_FLOAT;
+//event type
+typedef enum
+{
+ FWL_EVENTTYPE_Mouse = 0 ,
+ FWL_EVENTTYPE_MouseWheel,
+ FWL_EVENTTYPE_Key ,
+} FWL_EVENTTYPE;
+
+//key flag
+typedef enum
+{
+ FWL_EVENTFLAG_ShiftKey = 1 << 0,
+ FWL_EVENTFLAG_ControlKey = 1 << 1,
+ FWL_EVENTFLAG_AltKey = 1 << 2,
+ FWL_EVENTFLAG_MetaKey = 1 << 3,
+ FWL_EVENTFLAG_KeyPad = 1 << 4,
+ FWL_EVENTFLAG_AutoRepeat = 1 << 5,
+ FWL_EVENTFLAG_LeftButtonDown = 1 << 6,
+ FWL_EVENTFLAG_MiddleButtonDown = 1 << 7,
+ FWL_EVENTFLAG_RightButtonDown = 1 << 8,
+} FWL_EVENTFLAG;
+
+// Mouse message command
+typedef enum
+{
+ FWL_EVENTMOUSECMD_LButtonDown = 1 ,
+ FWL_EVENTMOUSECMD_LButtonUp ,
+ FWL_EVENTMOUSECMD_LButtonDblClk ,
+ FWL_EVENTMOUSECMD_RButtonDown ,
+ FWL_EVENTMOUSECMD_RButtonUp ,
+ FWL_EVENTMOUSECMD_RButtonDblClk ,
+ FWL_EVENTMOUSECMD_MButtonDown ,
+ FWL_EVENTMOUSECMD_MButtonUp ,
+ FWL_EVENTMOUSECMD_MButtonDblClk ,
+ FWL_EVENTMOUSECMD_MouseMove ,
+ FWL_EVENTMOUSECMD_MouseEnter ,
+ FWL_EVENTMOUSECMD_MouseHover ,
+ FWL_EVENTMOUSECMD_MouseLeave ,
+} FWL_EVENT_MOUSECMD;
+
+//mouse event
+struct FWL_EVENT_MOUSE
+{
+ FPDF_UINT32 command;
+ FPDF_DWORD flag;
+ FPDF_FLOAT x;
+ FPDF_FLOAT y;
+};
+
+//mouse wheel
+struct FWL_EVENT_MOUSEWHEEL
+{
+ FPDF_DWORD flag;
+ FPDF_FLOAT x;
+ FPDF_FLOAT y;
+ FPDF_FLOAT deltaX;
+ FPDF_FLOAT deltaY;
+};
+
+//virtual keycode
+typedef enum
+{
+ FWL_VKEY_Back = 0x08,
+ FWL_VKEY_Tab = 0x09,
+ FWL_VKEY_Clear = 0x0C,
+ FWL_VKEY_Return = 0x0D,
+ FWL_VKEY_Shift = 0x10,
+ FWL_VKEY_Control = 0x11,
+ FWL_VKEY_Menu = 0x12,
+ FWL_VKEY_Pause = 0x13,
+ FWL_VKEY_Capital = 0x14,
+ FWL_VKEY_Kana = 0x15,
+ FWL_VKEY_Hangul = 0x15,
+ FWL_VKEY_Junja = 0x17,
+ FWL_VKEY_Final = 0x18,
+ FWL_VKEY_Hanja = 0x19,
+ FWL_VKEY_Kanji = 0x19,
+ FWL_VKEY_Escape = 0x1B,
+ FWL_VKEY_Convert = 0x1C,
+ FWL_VKEY_NonConvert = 0x1D,
+ FWL_VKEY_Accept = 0x1E,
+ FWL_VKEY_ModeChange = 0x1F,
+ FWL_VKEY_Space = 0x20,
+ FWL_VKEY_Prior = 0x21,
+ FWL_VKEY_Next = 0x22,
+ FWL_VKEY_End = 0x23,
+ FWL_VKEY_Home = 0x24,
+ FWL_VKEY_Left = 0x25,
+ FWL_VKEY_Up = 0x26,
+ FWL_VKEY_Right = 0x27,
+ FWL_VKEY_Down = 0x28,
+ FWL_VKEY_Select = 0x29,
+ FWL_VKEY_Print = 0x2A,
+ FWL_VKEY_Execute = 0x2B,
+ FWL_VKEY_Snapshot = 0x2C,
+ FWL_VKEY_Insert = 0x2D,
+ FWL_VKEY_Delete = 0x2E,
+ FWL_VKEY_Help = 0x2F,
+ FWL_VKEY_0 = 0x30,
+ FWL_VKEY_1 = 0x31,
+ FWL_VKEY_2 = 0x32,
+ FWL_VKEY_3 = 0x33,
+ FWL_VKEY_4 = 0x34,
+ FWL_VKEY_5 = 0x35,
+ FWL_VKEY_6 = 0x36,
+ FWL_VKEY_7 = 0x37,
+ FWL_VKEY_8 = 0x38,
+ FWL_VKEY_9 = 0x39,
+ FWL_VKEY_A = 0x41,
+ FWL_VKEY_B = 0x42,
+ FWL_VKEY_C = 0x43,
+ FWL_VKEY_D = 0x44,
+ FWL_VKEY_E = 0x45,
+ FWL_VKEY_F = 0x46,
+ FWL_VKEY_G = 0x47,
+ FWL_VKEY_H = 0x48,
+ FWL_VKEY_I = 0x49,
+ FWL_VKEY_J = 0x4A,
+ FWL_VKEY_K = 0x4B,
+ FWL_VKEY_L = 0x4C,
+ FWL_VKEY_M = 0x4D,
+ FWL_VKEY_N = 0x4E,
+ FWL_VKEY_O = 0x4F,
+ FWL_VKEY_P = 0x50,
+ FWL_VKEY_Q = 0x51,
+ FWL_VKEY_R = 0x52,
+ FWL_VKEY_S = 0x53,
+ FWL_VKEY_T = 0x54,
+ FWL_VKEY_U = 0x55,
+ FWL_VKEY_V = 0x56,
+ FWL_VKEY_W = 0x57,
+ FWL_VKEY_X = 0x58,
+ FWL_VKEY_Y = 0x59,
+ FWL_VKEY_Z = 0x5A,
+ FWL_VKEY_LWin = 0x5B,
+ FWL_VKEY_Command = 0x5B,
+ FWL_VKEY_RWin = 0x5C,
+ FWL_VKEY_Apps = 0x5D,
+ FWL_VKEY_Sleep = 0x5F,
+ FWL_VKEY_NumPad0 = 0x60,
+ FWL_VKEY_NumPad1 = 0x61,
+ FWL_VKEY_NumPad2 = 0x62,
+ FWL_VKEY_NumPad3 = 0x63,
+ FWL_VKEY_NumPad4 = 0x64,
+ FWL_VKEY_NumPad5 = 0x65,
+ FWL_VKEY_NumPad6 = 0x66,
+ FWL_VKEY_NumPad7 = 0x67,
+ FWL_VKEY_NumPad8 = 0x68,
+ FWL_VKEY_NumPad9 = 0x69,
+ FWL_VKEY_Multiply = 0x6A,
+ FWL_VKEY_Add = 0x6B,
+ FWL_VKEY_Separator = 0x6C,
+ FWL_VKEY_Subtract = 0x6D,
+ FWL_VKEY_Decimal = 0x6E,
+ FWL_VKEY_Divide = 0x6F,
+ FWL_VKEY_F1 = 0x70,
+ FWL_VKEY_F2 = 0x71,
+ FWL_VKEY_F3 = 0x72,
+ FWL_VKEY_F4 = 0x73,
+ FWL_VKEY_F5 = 0x74,
+ FWL_VKEY_F6 = 0x75,
+ FWL_VKEY_F7 = 0x76,
+ FWL_VKEY_F8 = 0x77,
+ FWL_VKEY_F9 = 0x78,
+ FWL_VKEY_F10 = 0x79,
+ FWL_VKEY_F11 = 0x7A,
+ FWL_VKEY_F12 = 0x7B,
+ FWL_VKEY_F13 = 0x7C,
+ FWL_VKEY_F14 = 0x7D,
+ FWL_VKEY_F15 = 0x7E,
+ FWL_VKEY_F16 = 0x7F,
+ FWL_VKEY_F17 = 0x80,
+ FWL_VKEY_F18 = 0x81,
+ FWL_VKEY_F19 = 0x82,
+ FWL_VKEY_F20 = 0x83,
+ FWL_VKEY_F21 = 0x84,
+ FWL_VKEY_F22 = 0x85,
+ FWL_VKEY_F23 = 0x86,
+ FWL_VKEY_F24 = 0x87,
+ FWL_VKEY_NunLock = 0x90,
+ FWL_VKEY_Scroll = 0x91,
+ FWL_VKEY_LShift = 0xA0,
+ FWL_VKEY_RShift = 0xA1,
+ FWL_VKEY_LControl = 0xA2,
+ FWL_VKEY_RControl = 0xA3,
+ FWL_VKEY_LMenu = 0xA4,
+ FWL_VKEY_RMenu = 0xA5,
+ FWL_VKEY_BROWSER_Back = 0xA6,
+ FWL_VKEY_BROWSER_Forward = 0xA7,
+ FWL_VKEY_BROWSER_Refresh = 0xA8,
+ FWL_VKEY_BROWSER_Stop = 0xA9,
+ FWL_VKEY_BROWSER_Search = 0xAA,
+ FWL_VKEY_BROWSER_Favorites = 0xAB,
+ FWL_VKEY_BROWSER_Home = 0xAC,
+ FWL_VKEY_VOLUME_Mute = 0xAD,
+ FWL_VKEY_VOLUME_Down = 0xAE,
+ FWL_VKEY_VOLUME_Up = 0xAF,
+ FWL_VKEY_MEDIA_NEXT_Track = 0xB0,
+ FWL_VKEY_MEDIA_PREV_Track = 0xB1,
+ FWL_VKEY_MEDIA_Stop = 0xB2,
+ FWL_VKEY_MEDIA_PLAY_Pause = 0xB3,
+ FWL_VKEY_MEDIA_LAUNCH_Mail = 0xB4,
+ FWL_VKEY_MEDIA_LAUNCH_MEDIA_Select = 0xB5,
+ FWL_VKEY_MEDIA_LAUNCH_APP1 = 0xB6,
+ FWL_VKEY_MEDIA_LAUNCH_APP2 = 0xB7,
+ FWL_VKEY_OEM_1 = 0xBA,
+ FWL_VKEY_OEM_Plus = 0xBB,
+ FWL_VKEY_OEM_Comma = 0xBC,
+ FWL_VKEY_OEM_Minus = 0xBD,
+ FWL_VKEY_OEM_Period = 0xBE,
+ FWL_VKEY_OEM_2 = 0xBF,
+ FWL_VKEY_OEM_3 = 0xC0,
+ FWL_VKEY_OEM_4 = 0xDB,
+ FWL_VKEY_OEM_5 = 0xDC,
+ FWL_VKEY_OEM_6 = 0xDD,
+ FWL_VKEY_OEM_7 = 0xDE,
+ FWL_VKEY_OEM_8 = 0xDF,
+ FWL_VKEY_OEM_102 = 0xE2,
+ FWL_VKEY_ProcessKey = 0xE5,
+ FWL_VKEY_Packet = 0xE7,
+ FWL_VKEY_Attn = 0xF6,
+ FWL_VKEY_Crsel = 0xF7,
+ FWL_VKEY_Exsel = 0xF8,
+ FWL_VKEY_Ereof = 0xF9,
+ FWL_VKEY_Play = 0xFA,
+ FWL_VKEY_Zoom = 0xFB,
+ FWL_VKEY_NoName = 0xFC,
+ FWL_VKEY_PA1 = 0xFD,
+ FWL_VKEY_OEM_Clear = 0xFE,
+ FWL_VKEY_Unknown = 0,
+} FWL_VKEYCODE;
+
+//key event command
+typedef enum
+{
+ FWL_EVENTKEYCMD_KeyDown = 1 ,
+ FWL_EVENTKEYCMD_KeyUp ,
+ FWL_EVENTKEYCMD_Char ,
+} FWL_EVENTKEYCMD;
+
+//key event
+struct FWL_EVENT_KEY
+{
+ FPDF_UINT32 command;
+ FPDF_DWORD flag;
+ union
+ {
+ //Virtual key code.
+ FPDF_UINT32 vkcode;
+ //Character code.
+ FPDF_DWORD charcode;
+ }code;
+};
+
+//event type
+struct FWL_EVENT
+{
+ //structure size.
+ FPDF_UINT32 size;
+ //FWL_EVENTTYPE.
+ FPDF_UINT32 type;
+ union
+ {
+ struct FWL_EVENT_MOUSE mouse;
+ struct FWL_EVENT_MOUSEWHEEL wheel;
+ struct FWL_EVENT_KEY key;
+ }s;
+};
+
+#endif //_FWL_EVENT_H
+
+
diff --git a/fpdfsdk/include/fpdf_progressive.h b/fpdfsdk/include/fpdf_progressive.h new file mode 100644 index 0000000000..d590f78817 --- /dev/null +++ b/fpdfsdk/include/fpdf_progressive.h @@ -0,0 +1,94 @@ +// 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 _FPDF_PROGRESSIVE_H_
+#define _FPDF_PROGRESSIVE_H_
+
+#include "fpdfview.h"
+
+//Flags for progressive process status.
+#define FPDF_RENDER_READER 0
+#define FPDF_RENDER_TOBECOUNTINUED 1
+#define FPDF_RENDER_DONE 2
+#define FPDF_RENDER_FAILED 3
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+//IFPDF_RENDERINFO interface.
+typedef struct _IFSDK_PAUSE
+{
+ /**
+ * Version number of the interface. Currently must be 1.
+ **/
+ int version;
+
+ /*
+ * Method: NeedToPauseNow
+ * Check if we need to pause a progressive process now.
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * yes
+ * Parameters:
+ * pThis - Pointer to the interface structure itself
+ * Return Value:
+ * Non-zero for pause now, 0 for continue.
+ *
+ */
+ FPDF_BOOL (*NeedToPauseNow) (struct _IFSDK_PAUSE* pThis);
+
+ //A user defined data pointer, used by user's application. Can be NULL.
+ void* user;
+} IFSDK_PAUSE;
+
+// Function: FPDF_RenderPageBitmap_Start
+// Start to render page contents to a device independent bitmap progressively.
+// Parameters:
+// bitmap - Handle to the device independent bitmap (as the output buffer).
+// Bitmap handle can be created by FPDFBitmap_Create function.
+// page - Handle to the page. Returned by FPDF_LoadPage function.
+// start_x - Left pixel position of the display area in the bitmap coordinate.
+// start_y - Top pixel position of the display area in the bitmap coordinate.
+// size_x - Horizontal size (in pixels) for displaying the page.
+// size_y - Vertical size (in pixels) for displaying the page.
+// rotate - Page orientation: 0 (normal), 1 (rotated 90 degrees clockwise),
+// 2 (rotated 180 degrees), 3 (rotated 90 degrees counter-clockwise).
+// flags - 0 for normal display, or combination of flags defined above.
+// pause - The IFSDK_PAUSE interface.A callback mechanism allowing the page rendering process
+// Return value:
+// Rendering Status. See flags for progressive process status for the details.
+//
+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);
+
+// Function: FPDF_RenderPage_Continue
+// Continue rendering a PDF page.
+// Parameters:
+// page - Handle to the page. Returned by FPDF_LoadPage function.
+// pause - The IFSDK_PAUSE interface.A callback mechanism allowing the page rendering process
+// to be paused before it's finished. This can be NULL if you don't want to pause.
+// Return value:
+// The rendering status. See flags for progressive process status for the details.
+DLLEXPORT int STDCALL FPDF_RenderPage_Continue(FPDF_PAGE page,IFSDK_PAUSE * pause);
+
+// Function: FPDF_RenderPage_Close
+// Release the resource allocate during page rendering. Need to be called after finishing rendering or
+// cancel the rendering.
+// Parameters:
+// page - Handle to the page. Returned by FPDF_LoadPage function.
+// Return value:
+// NULL
+DLLEXPORT void STDCALL FPDF_RenderPage_Close(FPDF_PAGE page);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif //_FPDF_PROGRESSIVE_H_
diff --git a/fpdfsdk/include/fpdf_searchex.h b/fpdfsdk/include/fpdf_searchex.h new file mode 100644 index 0000000000..c291c0c280 --- /dev/null +++ b/fpdfsdk/include/fpdf_searchex.h @@ -0,0 +1,33 @@ +// 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 _FPDF_SEARCH_EX_H
+#define _FPDF_SEARCH_EX_H
+
+#ifndef _FPDFVIEW_H_
+#include "fpdfview.h"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// Function: FPDFText_GetCharIndexFromTextIndex
+// Get the actually char index in text_page's internal char list.
+// Parameters:
+// text_page - Handle to a text page information structure. Returned by FPDFText_LoadPage function.
+// nTextIndex - The index of the text in the string get from FPDFText_GetText.
+// Return value:
+// The index of the character in internal charlist. -1 for error.
+DLLEXPORT int STDCALL FPDFText_GetCharIndexFromTextIndex(FPDF_TEXTPAGE text_page, int nTextIndex);
+
+#ifdef __cplusplus
+};
+#endif
+
+
+#endif
+
diff --git a/fpdfsdk/include/fpdf_sysfontinfo.h b/fpdfsdk/include/fpdf_sysfontinfo.h new file mode 100644 index 0000000000..00c9fab0e6 --- /dev/null +++ b/fpdfsdk/include/fpdf_sysfontinfo.h @@ -0,0 +1,241 @@ +// 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 _FPDF_SYSFONTINFO_H +#define _FPDF_SYSFONTINFO_H + +#include "fpdfview.h" + +/* Character sets for the font */ +#define FXFONT_ANSI_CHARSET 0 +#define FXFONT_DEFAULT_CHARSET 1 +#define FXFONT_SYMBOL_CHARSET 2 +#define FXFONT_SHIFTJIS_CHARSET 128 +#define FXFONT_HANGEUL_CHARSET 129 +#define FXFONT_GB2312_CHARSET 134 +#define FXFONT_CHINESEBIG5_CHARSET 136 + +/* Font pitch and family flags */ +#define FXFONT_FF_FIXEDPITCH 1 +#define FXFONT_FF_ROMAN (1<<4) +#define FXFONT_FF_SCRIPT (4<<4) + +/* Typical weight values */ +#define FXFONT_FW_NORMAL 400 +#define FXFONT_FW_BOLD 700 + +// Exported Functions +#ifdef __cplusplus +extern "C" { +#endif + + +/** + * Interface: FPDF_SYSFONTINFO + * Interface for getting system font information and font mapping + */ +typedef struct _FPDF_SYSFONTINFO { + /** + * Version number of the interface. Currently must be 1. + **/ + int version; + + /** + * Method: Release + * Give implementation a chance to release any data after the interface is no longer used + * Interface Version: + * 1 + * Implementation Required: + * No + * Comments: + * Called by Foxit SDK during the final cleanup process. + * Parameters: + * pThis - Pointer to the interface structure itself + * Return Value: + * None + */ + void (*Release)(struct _FPDF_SYSFONTINFO* pThis); + + /** + * Method: EnumFonts + * Enumerate all fonts installed on the system + * Interface Version: + * 1 + * Implementation Required: + * No + * Comments: + * Implementation should call FPDF_AddIntalledFont() function for each font found. + * Only TrueType/OpenType and Type1 fonts are accepted by Foxit SDK. + * Parameters: + * pThis - Pointer to the interface structure itself + * pMapper - An opaque pointer to internal font mapper, used when calling FPDF_AddInstalledFont + * Return Value: + * None + */ + void (*EnumFonts)(struct _FPDF_SYSFONTINFO* pThis, void* pMapper); + + /** + * Method: MapFont + * Use the system font mapper to get a font handle from requested parameters + * Interface Version: + * 1 + * Implementation Required: + * Yes only if GetFont method is not implemented. + * Comments: + * If the system supports native font mapper (like Windows), implementation can implement this method to get a font handle. + * Otherwise, Foxit SDK will do the mapping and then call GetFont method. + * Only TrueType/OpenType and Type1 fonts are accepted by Foxit SDK. + * Parameters: + * pThis - Pointer to the interface structure itself + * weight - Weight of the requested font. 400 is normal and 700 is bold. + * bItalic - Italic option of the requested font, TRUE or FALSE. + * charset - Character set identifier for the requested font. See above defined constants. + * pitch_family - A combination of flags. See above defined constants. + * face - Typeface name. Currently use system local encoding only. + * bExact - Pointer to an boolean value receiving the indicator whether mapper found the exact match. + * If mapper is not sure whether it's exact match, ignore this paramter. + * Return Value: + * An opaque pointer for font handle, or NULL if system mapping is not supported. + **/ + void* (*MapFont)(struct _FPDF_SYSFONTINFO* pThis, int weight, int bItalic, int charset, int pitch_family, + const char* face, int* bExact); + + /** + * Method: GetFont + * Get a handle to a particular font by its internal ID + * Interface Version: + * 1 + * Implementation Required: + * Yes only if MapFont method is not implemented. + * Comments: + * If the system mapping not supported, Foxit SDK will do the font mapping and use this method to get a font handle. + * Parameters: + * pThis - Pointer to the interface structure itself + * face - Typeface name. Currently use system local encoding only. + * Return Value: + * An opaque pointer for font handle. + **/ + void* (*GetFont)(struct _FPDF_SYSFONTINFO* pThis, const char* face); + + /** + * Method: GetFontData + * Get font data from a font + * Interface Version: + * 1 + * Implementation Required: + * Yes + * Comments: + * Can read either full font file, or a particular TrueType/OpenType table + * Parameters: + * pThis - Pointer to the interface structure itself + * hFont - Font handle returned by MapFont or GetFont method + * table - TrueType/OpenType table identifier (refer to TrueType specification). + * 0 for the whole font file. + * buffer - The buffer receiving the font data. Can be NULL if not provided + * buf_size - Buffer size, can be zero if not provided + * Return Value: + * Number of bytes needed, if buffer not provided or not large enough, + * or number of bytes written into buffer otherwise. + **/ + unsigned long (*GetFontData)(struct _FPDF_SYSFONTINFO* pThis, void* hFont, + unsigned int table, unsigned char* buffer, unsigned long buf_size); + + /** + * Method: GetFaceName + * Get face name from a font handle + * Interface Version: + * 1 + * Implementation Required: + * No + * Parameters: + * pThis - Pointer to the interface structure itself + * hFont - Font handle returned by MapFont or GetFont method + * buffer - The buffer receiving the face name. Can be NULL if not provided + * buf_size - Buffer size, can be zero if not provided + * Return Value: + * Number of bytes needed, if buffer not provided or not large enough, + * or number of bytes written into buffer otherwise. + **/ + unsigned long (*GetFaceName)(struct _FPDF_SYSFONTINFO* pThis, void* hFont, char* buffer, unsigned long buf_size); + + /** + * Method: GetFontCharset + * Get character set information for a font handle + * Interface Version: + * 1 + * Implementation Required: + * No + * Parameters: + * pThis - Pointer to the interface structure itself + * hFont - Font handle returned by MapFont or GetFont method + * Return Value: + * Character set identifier. See defined constants above. + **/ + int (*GetFontCharset)(struct _FPDF_SYSFONTINFO* pThis, void* hFont); + + /** + * Method: DeleteFont + * Delete a font handle + * Interface Version: + * 1 + * Implementation Required: + * Yes + * Parameters: + * pThis - Pointer to the interface structure itself + * hFont - Font handle returned by MapFont or GetFont method + * Return Value: + * None + **/ + void (*DeleteFont)(struct _FPDF_SYSFONTINFO* pThis, void* hFont); +} FPDF_SYSFONTINFO; + +/** + * Function: FPDF_AddInstalledFont + * Add a system font to the list in Foxit SDK. + * Comments: + * This function is only called during the system font list building process. + * Parameters: + * mapper - Opaque pointer to Foxit font mapper + * face - The font face name + * charset - Font character set. See above defined constants. + * Return Value: + * None. + **/ +DLLEXPORT void STDCALL FPDF_AddInstalledFont(void* mapper, const char* face, int charset); + +/** + * Function: FPDF_SetSystemFontInfo + * Set the system font info interface into Foxit SDK + * Comments: + * Platform support implementation should implement required methods of FFDF_SYSFONTINFO interface, + * then call this function during SDK initialization process. + * Parameters: + * pFontInfo - Pointer to a FPDF_SYSFONTINFO structure + * Return Value: + * None + **/ +DLLEXPORT void STDCALL FPDF_SetSystemFontInfo(FPDF_SYSFONTINFO* pFontInfo); + +/** + * Function: FPDF_GetDefaultSystemFontInfo + * Get default system font info interface for current platform + * Comments: + * For some platforms Foxit SDK implement a default version of system font info interface. + * The default implementation can be used in FPDF_SetSystemFontInfo function. + * Parameters: + * None + * Return Value: + * Pointer to a FPDF_SYSFONTINFO structure describing the default interface. + * Or NULL if the platform doesn't have a default interface. + * Application should call FPDF_FreeMemory to free the returned pointer. + **/ +DLLEXPORT FPDF_SYSFONTINFO* STDCALL FPDF_GetDefaultSystemFontInfo(); + +#ifdef __cplusplus +}; +#endif + +#endif // _FPDF_SYSFONTINFO_H diff --git a/fpdfsdk/include/fpdf_transformpage.h b/fpdfsdk/include/fpdf_transformpage.h new file mode 100644 index 0000000000..caafeda0e4 --- /dev/null +++ b/fpdfsdk/include/fpdf_transformpage.h @@ -0,0 +1,113 @@ +// 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 _TRANSFORMPAGE_H_
+#define _TRANSFORMPAGE_H_
+
+#ifndef _FPDFVIEW_H_
+#include "fpdfview.h"
+#endif
+
+typedef void* FPDF_PAGEARCSAVER;
+typedef void* FPDF_PAGEARCLOADER;
+/**
+* Set "MediaBox" entry to the page dictionary.
+* @param[in] page - Handle to a page.
+* @param[in] left - The left of the rectangle.
+* @param[in] bottom - The bottom of the rectangle.
+* @param[in] right - The right of the rectangle.
+* @param[in] top - The top of the rectangle.
+* @retval None.
+*/
+DLLEXPORT void STDCALL FPDFPage_SetMediaBox(FPDF_PAGE page, float left, float bottom, float right, float top);
+
+/**
+* Set "CropBox" entry to the page dictionary.
+* @param[in] page - Handle to a page.
+* @param[in] left - The left of the rectangle.
+* @param[in] bottom - The bottom of the rectangle.
+* @param[in] right - The right of the rectangle.
+* @param[in] top - The top of the rectangle.
+* @retval None.
+*/
+DLLEXPORT void STDCALL FPDFPage_SetCropBox(FPDF_PAGE page, float left, float bottom, float right, float top);
+
+
+/** Get "MediaBox" entry from the page dictionary.
+* @param[in] page - Handle to a page.
+* @param[in] left - Pointer to a double value receiving the left of the rectangle.
+* @param[in] bottom - Pointer to a double value receiving the bottom of the rectangle.
+* @param[in] right - Pointer to a double value receiving the right of the rectangle.
+* @param[in] top - Pointer to a double value receiving the top of the rectangle.
+* @retval True if success,else fail.
+*/
+DLLEXPORT FPDF_BOOL STDCALL FPDFPage_GetMediaBox(FPDF_PAGE page, float* left, float* bottom, float* right, float* top);
+
+/** Get "CropBox" entry from the page dictionary.
+* @param[in] page - Handle to a page.
+* @param[in] left - Pointer to a double value receiving the left of the rectangle.
+* @param[in] bottom - Pointer to a double value receiving the bottom of the rectangle.
+* @param[in] right - Pointer to a double value receiving the right of the rectangle.
+* @param[in] top - Pointer to a double value receiving the top of the rectangle.
+* @retval True if success,else fail.
+*/
+DLLEXPORT FPDF_BOOL STDCALL FPDFPage_GetCropBox(FPDF_PAGE page, float* left, float* bottom, float* right, float* top);
+
+/**
+* Transform the whole page with a specified matrix, then clip the page content region.
+*
+* @param[in] page - A page handle.
+* @param[in] matrix - The transform matrix.
+* @param[in] clipRect - A rectangle page area to be clipped.
+* @Note. This function will transform the whole page, and would take effect to all the objects in the page.
+*/
+DLLEXPORT FPDF_BOOL STDCALL FPDFPage_TransFormWithClip(FPDF_PAGE page, FS_MATRIX* matrix, FS_RECTF* clipRect);
+
+/**
+* Transform (scale, rotate, shear, move) the clip path of page object.
+* @param[in] page_object - Handle to a page object. Returned by FPDFPageObj_NewImageObj.
+* @param[in] a - The coefficient "a" of the matrix.
+* @param[in] b - The coefficient "b" of the matrix.
+* @param[in] c - The coefficient "c" of the matrix.
+* @param[in] d - The coefficient "d" of the matrix.
+* @param[in] e - The coefficient "e" of the matrix.
+* @param[in] f - The coefficient "f" of the matrix.
+* @retval None.
+*/
+DLLEXPORT void STDCALL FPDFPageObj_TransformClipPath(FPDF_PAGEOBJECT page_object,double a, double b, double c, double d, double e, double f);
+
+/**
+* Create a new clip path, with a rectangle inserted.
+*
+* @param[in] left - The left of the clip box.
+* @param[in] bottom - The bottom of the clip box.
+* @param[in] right - The right of the clip box.
+* @param[in] top - The top of the clip box.
+* @retval a handle to the clip path.
+*/
+DLLEXPORT FPDF_CLIPPATH STDCALL FPDF_CreateClipPath(float left, float bottom, float right, float top);
+
+/**
+* Destroy the clip path.
+*
+* @param[in] clipPath - A handle to the clip path.
+* Destroy the clip path.
+* @retval None.
+*/
+DLLEXPORT void STDCALL FPDF_DestroyClipPath(FPDF_CLIPPATH clipPath);
+
+/**
+* Clip the page content, the page content that outside the clipping region become invisible.
+*
+* @param[in] page - A page handle.
+* @param[in] clipPath - A handle to the clip path.
+* @Note. A clip path will be inserted before the page content stream or content array. In this way, the page content will be clipped
+* by this clip path.
+*/
+DLLEXPORT void STDCALL FPDFPage_InsertClipPath(FPDF_PAGE page,FPDF_CLIPPATH clipPath);
+
+#endif
+
diff --git a/fpdfsdk/include/fpdfdoc.h b/fpdfsdk/include/fpdfdoc.h new file mode 100644 index 0000000000..35c2c9674c --- /dev/null +++ b/fpdfsdk/include/fpdfdoc.h @@ -0,0 +1,230 @@ +// 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 _FPDFDOC_H_
+#define _FPDFDOC_H_
+
+#include "fpdfview.h"
+
+// Exported Functions
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// Function: FPDFBookmark_Find
+// Find a bookmark in the document, using the bookmark title.
+// Parameters:
+// document - Handle to the document. Returned by FPDF_LoadDocument or FPDF_LoadMemDocument.
+// title - The UTF-16LE encoded Unicode string for the bookmark title to be searched. Can't be NULL.
+// Return value:
+// Handle to the found bookmark item. NULL if the title can't be found.
+// Comments:
+// It always returns the first found bookmark if more than one bookmarks have the same title.
+//
+DLLEXPORT FPDF_BOOKMARK STDCALL FPDFBookmark_Find(FPDF_DOCUMENT document, FPDF_WIDESTRING title);
+
+// Function: FPDFBookmark_GetDest
+// Get the destination associated with a bookmark item.
+// Parameters:
+// document - Handle to the document.
+// bookmark - Handle to the bookmark.
+// Return value:
+// Handle to the destination data. NULL if no destination is associated with this bookmark.
+//
+DLLEXPORT FPDF_DEST STDCALL FPDFBookmark_GetDest(FPDF_DOCUMENT document, FPDF_BOOKMARK bookmark);
+
+// Function: FPDFBookmark_GetAction
+// Get the action associated with a bookmark item.
+// Parameters:
+// bookmark - Handle to the bookmark.
+// Return value:
+// Handle to the action data. NULL if no action is associated with this bookmark. In this case, the
+// application should try FPDFBookmark_GetDest.
+//
+DLLEXPORT FPDF_ACTION STDCALL FPDFBookmark_GetAction(FPDF_BOOKMARK bookmark);
+
+#define PDFACTION_UNSUPPORTED 0 // Unsupported action type.
+#define PDFACTION_GOTO 1 // Go to a destination within current document.
+#define PDFACTION_REMOTEGOTO 2 // Go to a destination within another document.
+#define PDFACTION_URI 3 // Universal Resource Identifier, including web pages and
+ // other Internet based resources.
+#define PDFACTION_LAUNCH 4 // Launch an application or open a file.
+
+// Function: FPDFAction_GetType
+// Get type of an action.
+// Parameters:
+// action - Handle to the action.
+// Return value:
+// A type number as defined above.
+//
+DLLEXPORT unsigned long STDCALL FPDFAction_GetType(FPDF_ACTION action);
+
+// Function: FPDFAction_GetDest
+// Get destination of an action.
+// Parameters:
+// document - Handle to the document.
+// action - Handle to the action. It must be a GOTO or REMOTEGOTO action.
+// Return value:
+// Handle to the destination data.
+// Comments:
+// In case of remote goto action, the application should first use FPDFAction_GetFilePath to
+// get file path, then load that particular document, and use its document handle to call this
+// function.
+//
+DLLEXPORT FPDF_DEST STDCALL FPDFAction_GetDest(FPDF_DOCUMENT document, FPDF_ACTION action);
+
+// Function: FPDFAction_GetURIPath
+// Get URI path of a URI action.
+// Parameters:
+// document - Handle to the document.
+// action - Handle to the action. Must be a URI action.
+// buffer - A buffer for output the path string. Can be NULL.
+// buflen - The length of the buffer, number of bytes. Can be 0.
+// Return value:
+// Number of bytes the URI path consumes, including trailing zeros.
+// Comments:
+// The URI path is always encoded in 7-bit ASCII.
+//
+// The return value always indicated number of bytes required for the buffer, even when there is
+// no buffer specified, or the buffer size is less then required. In this case, the buffer will not
+// be modified.
+//
+DLLEXPORT unsigned long STDCALL FPDFAction_GetURIPath(FPDF_DOCUMENT document, FPDF_ACTION action,
+ void* buffer, unsigned long buflen);
+
+// Function: FPDFDest_GetPageIndex
+// Get page index of a destination.
+// Parameters:
+// document - Handle to the document.
+// dest - Handle to the destination.
+// Return value:
+// The page index. Starting from 0 for the first page.
+//
+DLLEXPORT unsigned long STDCALL FPDFDest_GetPageIndex(FPDF_DOCUMENT document, FPDF_DEST dest);
+
+// Function: FPDFLink_GetLinkAtPoint
+// Find a link at specified point on a document page.
+// Parameters:
+// page - Handle to the document page.
+// x - The x coordinate of the point, specified in page coordinate system.
+// y - The y coordinate of the point, specified in page coordinate system.
+// Return value:
+// Handle to the link. NULL if no link found at that point.
+// Comments:
+// The point coordinates are specified in page coordinate system. You can convert coordinates
+// from screen system to page system using FPDF_DeviceToPage functions.
+//
+DLLEXPORT FPDF_LINK STDCALL FPDFLink_GetLinkAtPoint(FPDF_PAGE page, double x, double y);
+
+// Function: FPDFLink_GetDest
+// Get destination info of a link.
+// Parameters:
+// document - Handle to the document.
+// link - Handle to the link. Returned by FPDFLink_GetLinkAtPoint.
+// Return value:
+// Handle to the destination. NULL if there is no destination associated with the link, in this case
+// the application should try FPDFLink_GetAction.
+//
+DLLEXPORT FPDF_DEST STDCALL FPDFLink_GetDest(FPDF_DOCUMENT document, FPDF_LINK link);
+
+// Function: FPDFLink_GetAction
+// Get action info of a link.
+// Parameters:
+// link - Handle to the link.
+// Return value:
+// Handle to the action. NULL if there is no action associated with the link.
+//
+DLLEXPORT FPDF_ACTION STDCALL FPDFLink_GetAction(FPDF_LINK link);
+
+// Function: FPDFLink_Enumerate
+// This function would enumerate all the link annotations in a single PDF page.
+// Parameters:
+// page[in] - Handle to the page.
+// startPos[in,out] - The start position to enumerate the link annotations, which should be specified to start from
+// - 0 for the first call, and would receive the next position for enumerating to start from.
+// linkAnnot[out] - Receive the link handle.
+// Return value:
+// TRUE if succceed, else False;
+//
+DLLEXPORT FPDF_BOOL STDCALL FPDFLink_Enumerate(FPDF_PAGE page, int* startPos, FPDF_LINK* linkAnnot);
+
+// Function: FPDFLink_GetAnnotRect
+// Get the annotation rectangle. (Specified by the ¡°Rect¡± entry of annotation dictionary).
+// Parameters:
+// linkAnnot[in] - Handle to the link annotation.
+// rect[out] - The annotation rect.
+// Return value:
+// TRUE if succceed, else False;
+//
+DLLEXPORT FPDF_BOOL STDCALL FPDFLink_GetAnnotRect(FPDF_LINK linkAnnot, FS_RECTF* rect);
+
+// Function: FPDFLink_CountQuadPoints
+// Get the count of quadrilateral points to the link annotation.
+// Parameters:
+// linkAnnot[in] - Handle to the link annotation.
+// Return value:
+// The count of quadrilateral points.
+//
+DLLEXPORT int STDCALL FPDFLink_CountQuadPoints(FPDF_LINK linkAnnot);
+
+/* _FS_DEF_STRUCTURE_QUADPOINTSF_ */
+#ifndef _FS_DEF_STRUCTURE_QUADPOINTSF_
+#define _FS_DEF_STRUCTURE_QUADPOINTSF_
+typedef struct _FS_QUADPOINTSF
+{
+ FS_FLOAT x1;
+ FS_FLOAT y1;
+ FS_FLOAT x2;
+ FS_FLOAT y2;
+ FS_FLOAT x3;
+ FS_FLOAT y3;
+ FS_FLOAT x4;
+ FS_FLOAT y4;
+} FS_QUADPOINTSF;
+#endif /* _FS_DEF_STRUCTURE_QUADPOINTSF_ */
+
+// Function: FPDFLink_GetQuadPoints
+// Get the quadrilateral points for the specified index in the link annotation.
+// Parameters:
+// linkAnnot[in] - Handle to the link annotation.
+// quadIndex[in] - The specified quad points index.
+// quadPoints[out] - Receive the quadrilateral points.
+// Return value:
+// True if succeed, else False.
+//
+DLLEXPORT FPDF_BOOL STDCALL FPDFLink_GetQuadPoints(FPDF_LINK linkAnnot, int quadIndex, FS_QUADPOINTSF* quadPoints);
+
+// Function: FPDF_GetMetaText
+// Get a text from meta data of the document. Result is encoded in UTF-16LE.
+// Parameters:
+// doc - Handle to a document
+// tag - The tag for the meta data. Currently, It can be "Title", "Author",
+// "Subject", "Keywords", "Creator", "Producer", "CreationDate", or "ModDate".
+// For detailed explanation of these tags and their respective values,
+// please refer to PDF Reference 1.6, section 10.2.1, "Document Information Dictionary".
+// buffer - A buffer for output the title. Can be NULL.
+// buflen - The length of the buffer, number of bytes. Can be 0.
+// Return value:
+// Number of bytes the title consumes, including trailing zeros.
+// Comments:
+// No matter on what platform, the title is always output in UTF-16LE encoding, which means the buffer
+// can be regarded as an array of WORD (on Intel and compatible CPUs), each WORD represent the Unicode of
+// a character (some special Unicode may take 2 WORDs). The string is followed by two bytes of zero
+// indicating end of the string.
+//
+// The return value always indicated number of bytes required for the buffer, even when there is
+// no buffer specified, or the buffer size is less then required. In this case, the buffer will not
+// be modified.
+//
+DLLEXPORT unsigned long STDCALL FPDF_GetMetaText(FPDF_DOCUMENT doc, FPDF_BYTESTRING tag,
+ void* buffer, unsigned long buflen);
+
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif // _FPDFDOC_H_
diff --git a/fpdfsdk/include/fpdfedit.h b/fpdfsdk/include/fpdfedit.h new file mode 100644 index 0000000000..52fb1484a5 --- /dev/null +++ b/fpdfsdk/include/fpdfedit.h @@ -0,0 +1,235 @@ +// 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 _FPDFEDIT_H_
+#define _FPDFEDIT_H_
+
+#include "fpdfview.h"
+
+// Define all types used in the SDK. Note they can be simply regarded as opaque pointers
+// or long integer numbers.
+
+#define FPDF_ARGB(a,r,g,b) ((((FX_DWORD)(((FX_BYTE)(b)|((FX_WORD)((FX_BYTE)(g))<<8))|(((FX_DWORD)(FX_BYTE)(r))<<16)))) | (((FX_DWORD)(FX_BYTE)(a))<<24))
+#define FPDF_GetBValue(argb) ((FX_BYTE)(argb))
+#define FPDF_GetGValue(argb) ((FX_BYTE)(((FX_WORD)(argb)) >> 8))
+#define FPDF_GetRValue(argb) ((FX_BYTE)((argb)>>16))
+#define FPDF_GetAValue(argb) ((FX_BYTE)((argb)>>24))
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+//////////////////////////////////////////////////////////////////////
+//
+// Document functions
+//
+//////////////////////////////////////////////////////////////////////
+
+// Function: FPDF_CreateNewDocument
+// Create a new PDF document.
+// Parameters:
+// None.
+// Return value:
+// A handle to a document. If failed, NULL is returned.
+DLLEXPORT FPDF_DOCUMENT STDCALL FPDF_CreateNewDocument();
+
+//////////////////////////////////////////////////////////////////////
+//
+// Page functions
+//
+//////////////////////////////////////////////////////////////////////
+
+// Function: FPDFPage_New
+// Construct an empty page.
+// Parameters:
+// document - Handle to document. Returned by FPDF_LoadDocument and FPDF_CreateNewDocument.
+// page_index - The index of a page.
+// width - The page width.
+// height - The page height.
+// Return value:
+// The handle to the page.
+// Comments:
+// Loaded page can be deleted by FPDFPage_Delete.
+DLLEXPORT FPDF_PAGE STDCALL FPDFPage_New(FPDF_DOCUMENT document, int page_index, double width, double height);
+
+// Function: FPDFPage_Delete
+// Delete a PDF page.
+// Parameters:
+// document - Handle to document. Returned by FPDF_LoadDocument and FPDF_CreateNewDocument.
+// page_index - The index of a page.
+// Return value:
+// None.
+DLLEXPORT void STDCALL FPDFPage_Delete(FPDF_DOCUMENT document, int page_index);
+
+// Function: FPDFPage_GetRotation
+// Get the page rotation. One of following values will be returned: 0(0), 1(90), 2(180), 3(270).
+// Parameters:
+// page - Handle to a page. Returned by FPDFPage_New.
+// Return value:
+// The PDF page rotation.
+// Comment:
+// The PDF page rotation is rotated clockwise.
+DLLEXPORT int STDCALL FPDFPage_GetRotation(FPDF_PAGE page);
+
+// Function: FPDFPage_InsertObject
+// Insert an object to the page. The page object is automatically freed.
+// Parameters:
+// page - Handle to a page. Returned by FPDFPage_New.
+// page_obj - Handle to a page object. Returned by FPDFPageObj_NewTextObj,FPDFPageObj_NewTextObjEx and
+// FPDFPageObj_NewPathObj.
+// Return value:
+// None.
+DLLEXPORT void STDCALL FPDFPage_InsertObject(FPDF_PAGE page, FPDF_PAGEOBJECT page_obj);
+
+// Function: FPDFPage_CountObject
+// Get number of page objects inside the page.
+// Parameters:
+// page - Handle to a page. Returned by FPDFPage_New.
+// Return value:
+// The number of the page object.
+DLLEXPORT int STDCALL FPDFPage_CountObject(FPDF_PAGE page);
+
+// Function: FPDFPage_GetObject
+// Get page object by index.
+// Parameters:
+// page - Handle to a page. Returned by FPDFPage_New.
+// index - The index of a page object.
+// Return value:
+// The handle of the page object. Null for failed.
+DLLEXPORT FPDF_PAGEOBJECT STDCALL FPDFPage_GetObject(FPDF_PAGE page, int index);
+
+// Function: FPDFPage_HasTransparency
+// Check that whether the content of specified PDF page contains transparency.
+// Parameters:
+// page - Handle to a page. Returned by FPDFPage_New or FPDF_LoadPage.
+// Return value:
+// TRUE means that the PDF page does contains transparency.
+// Otherwise, returns FALSE.
+DLLEXPORT FPDF_BOOL STDCALL FPDFPage_HasTransparency(FPDF_PAGE page);
+
+// Function: FPDFPage_GenerateContent
+// Generate PDF Page content.
+// Parameters:
+// page - Handle to a page. Returned by FPDFPage_New.
+// Return value:
+// True if successful, false otherwise.
+// Comment:
+// Before you save the page to a file, or reload the page, you must call the FPDFPage_GenerateContent function.
+// Or the changed information will be lost.
+DLLEXPORT FPDF_BOOL STDCALL FPDFPage_GenerateContent(FPDF_PAGE page);
+
+//////////////////////////////////////////////////////////////////////
+//
+// Page Object functions
+//
+//////////////////////////////////////////////////////////////////////
+
+// Function: FPDFPageObj_HasTransparency
+// Check that whether the specified PDF page object contains transparency.
+// Parameters:
+// pageObject - Handle to a page object.
+// Return value:
+// TRUE means that the PDF page object does contains transparency.
+// Otherwise, returns FALSE.
+DLLEXPORT FPDF_BOOL STDCALL FPDFPageObj_HasTransparency(FPDF_PAGEOBJECT pageObject);
+
+// Function: FPDFPageObj_Transform
+// Transform (scale, rotate, shear, move) page object.
+// Parameters:
+// page_object - Handle to a page object. Returned by FPDFPageObj_NewImageObj.
+// a - The coefficient "a" of the matrix.
+// b - The coefficient "b" of the matrix.
+// c - The coefficient "c" of the matrix.
+// d - The coefficient "d" of the matrix.
+// e - The coefficient "e" of the matrix.
+// f - The coefficient "f" of the matrix.
+// Return value:
+// None.
+DLLEXPORT void STDCALL FPDFPageObj_Transform(FPDF_PAGEOBJECT page_object,
+ double a, double b, double c, double d, double e, double f);
+
+// Function: FPDFPage_TransformAnnots
+// Transform (scale, rotate, shear, move) all annots in a page.
+// Parameters:
+// page - Handle to a page.
+// a - The coefficient "a" of the matrix.
+// b - The coefficient "b" of the matrix.
+// c - The coefficient "c" of the matrix.
+// d - The coefficient "d" of the matrix.
+// e - The coefficient "e" of the matrix.
+// f - The coefficient "f" of the matrix.
+// Return value:
+// None.
+DLLEXPORT void STDCALL FPDFPage_TransformAnnots(FPDF_PAGE page,
+ double a, double b, double c, double d, double e, double f);
+
+// The page object constants.
+#define FPDF_PAGEOBJ_TEXT 1
+#define FPDF_PAGEOBJ_PATH 2
+#define FPDF_PAGEOBJ_IMAGE 3
+#define FPDF_PAGEOBJ_SHADING 4
+#define FPDF_PAGEOBJ_FORM 5
+
+//////////////////////////////////////////////////////////////////////
+//
+// Image functions
+//
+//////////////////////////////////////////////////////////////////////
+
+// Function: FPDFPageObj_NewImgeObj
+// Create a new Image Object.
+// Parameters:
+// document - Handle to document. Returned by FPDF_LoadDocument or FPDF_CreateNewDocument function.
+// Return Value:
+// Handle of image object.
+DLLEXPORT FPDF_PAGEOBJECT STDCALL FPDFPageObj_NewImgeObj(FPDF_DOCUMENT document);
+
+
+// Function: FPDFImageObj_LoadJpegFile
+// Load Image from a JPEG image file and then set it to an image object.
+// Parameters:
+// pages - Pointers to the start of all loaded pages, could be NULL.
+// nCount - Number of pages, could be 0.
+// image_object - Handle of image object returned by FPDFPageObj_NewImgeObj.
+// fileAccess - The custom file access handler, which specifies the JPEG image file.
+// Return Value:
+// TRUE if successful, FALSE otherwise.
+// Note:
+// The image object might already has an associated image, which is shared and cached by the loaded pages, In this case, we need to clear the cache of image for all the loaded pages.
+// Pass pages and count to this API to clear the image cache.
+DLLEXPORT FPDF_BOOL STDCALL FPDFImageObj_LoadJpegFile(FPDF_PAGE* pages, int nCount,FPDF_PAGEOBJECT image_object, FPDF_FILEACCESS* fileAccess);
+
+
+// Function: FPDFImageObj_SetMatrix
+// Set the matrix of an image object.
+// Parameters:
+// image_object - Handle of image object returned by FPDFPageObj_NewImgeObj.
+// a - The coefficient "a" of the matrix.
+// b - The coefficient "b" of the matrix.
+// c - The coefficient "c" of the matrix.
+// d - The coefficient "d" of the matrix.
+// e - The coefficient "e" of the matrix.
+// f - The coefficient "f" of the matrix.
+// Return value:
+// TRUE if successful, FALSE otherwise.
+DLLEXPORT FPDF_BOOL STDCALL FPDFImageObj_SetMatrix(FPDF_PAGEOBJECT image_object,
+ double a, double b, double c, double d, double e, double f);
+
+// Function: FPDFImageObj_SetBitmap
+// Set the bitmap to an image object.
+// Parameters:
+// pages - Pointer's to the start of all loaded pages.
+// nCount - Number of pages.
+// image_object - Handle of image object returned by FPDFPageObj_NewImgeObj.
+// bitmap - The handle of the bitmap which you want to set it to the image object.
+// Return value:
+// TRUE if successful, FALSE otherwise.
+DLLEXPORT FPDF_BOOL STDCALL FPDFImageObj_SetBitmap(FPDF_PAGE* pages,int nCount,FPDF_PAGEOBJECT image_object, FPDF_BITMAP bitmap);
+
+#ifdef __cplusplus
+}
+#endif
+#endif // _FPDFEDIT_H_
diff --git a/fpdfsdk/include/fpdfformfill.h b/fpdfsdk/include/fpdfformfill.h new file mode 100644 index 0000000000..0e7556e0a8 --- /dev/null +++ b/fpdfsdk/include/fpdfformfill.h @@ -0,0 +1,841 @@ +// 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 _FPDFORMFILL_H
+#define _FPDFORMFILL_H
+#include "fpdfview.h"
+
+typedef void* FPDF_FORMHANDLE;
+
+// Exported Functions
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct _IPDF_JsPlatform
+{
+/**
+* Version number of the interface. Currently must be 1.
+ **/
+ int version;
+
+ /**
+ * Method: app_alert
+ * pop up a dialog to show warning or hint.
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * yes
+ * Parameters:
+ * pThis - Pointer to the interface structure itself
+ * Msg - A string containing the message to be displayed.
+ * Title - The title of the dialog.
+ * Type - The stype of button group.
+ * 0-OK(default);
+ * 1-OK,Cancel;
+ * 2-Yes,NO;
+ * 3-Yes, NO, Cancel.
+ * nIcon - The Icon type.
+ * 0-Error(default);
+ * 1-Warning;
+ * 2-Question;
+ * 3-Status.
+ * Return Value:
+ * The return value could be the folowing type:
+ * 1-OK;
+ * 2-Cancel;
+ * 3-NO;
+ * 4-Yes;
+ */
+ int (*app_alert)(struct _IPDF_JsPlatform* pThis, FPDF_WIDESTRING Msg, FPDF_WIDESTRING Title, int Type, int Icon);
+
+ /**
+ * Method: app_beep
+ * Causes the system to play a sound.
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * yes
+ * Parameters:
+ * pThis - Pointer to the interface structure itself
+ * nType - The sound type.
+ * 0 - Error
+ * 1 - Warning
+ * 2 - Question
+ * 3 - Status
+ * 4 - Default (default value)
+ * Return Value:
+ * None
+ */
+ void (*app_beep)(struct _IPDF_JsPlatform* pThis, int nType);
+
+
+ /**
+ * Method: app_response
+ * Displays a dialog box containing a question and an entry field for the user to reply to the question.
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * yes
+ * Parameters:
+ * pThis - Pointer to the interface structure itself
+ * Question - The question to be posed to the user.
+ * Title - The title of the dialog box.
+ * Default - A default value for the answer to the question. If not specified, no default value is presented.
+ * cLabel - A short string to appear in front of and on the same line as the edit text field.
+ * bPassword - If true, indicates that the user's response should show as asterisks (*) or bullets (?) to mask the response, which might be sensitive information. The default is false.
+ * response - A string buffer allocated by SDK, to receive the user's response.
+ * length - The length of the buffer, number of bytes. Currently, It's always be 2048.
+ * Return Value:
+ * Number of bytes the user input text consumes, not including trailing zeros. If the text exceed 2048 bytes,
+ * the exceeded part will be ignored.
+ * Comments:
+ * No matter on what platform, the response should be always input in UTF-16LE encoding.
+ * The return value always indicated number of bytes required for the buffer, even when there is
+ * no buffer specified, or the buffer size is less then required. In this case, the buffer will not
+ * be modified.
+ */
+ int (*app_response)(struct _IPDF_JsPlatform* pThis, FPDF_WIDESTRING Question, FPDF_WIDESTRING Title, FPDF_WIDESTRING Default, FPDF_WIDESTRING cLabel, FPDF_BOOL bPassword, void* response, int length);
+
+
+
+ /*
+ * Method: Doc_getFilePath
+ * Get the file path of the current document.
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * yes
+ * Parameters:
+ * pThis - Pointer to the interface structure itself
+ * filePath - The string buffer to receive the file path. Can be NULL.
+ * length - The length of the buffer, number of bytes. Can be 0.
+ * Return Value:
+ * Number of bytes the filePath consumes, including trailing zeros.
+ * Comments:
+ * The filePath should be always input in local encoding.
+ *
+ * The return value always indicated number of bytes required for the buffer, even when there is
+ * no buffer specified, or the buffer size is less then required. In this case, the buffer will not
+ * be modified.
+ */
+ int (*Doc_getFilePath)(struct _IPDF_JsPlatform* pThis, void* filePath, int length);
+
+
+ /*
+ * Method: Doc_mail
+ * Mails the data buffer as an attachment to all recipients, with or without user interaction.
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * yes
+ * Parameters:
+ * pThis - Pointer to the interface structure itself
+ * mailData - Pointer to the data buffer to be sent.Can be NULL.
+ * length - The size,in bytes, of the buffer pointed by mailData parameter.Can be 0.
+ * bUI - If true, the rest of the parameters are used in a compose-new-message window that is displayed to the user. If false, the cTo parameter is required and all others are optional.
+ * To - A semicolon-delimited list of recipients for the message.
+ * Subject - The subject of the message. The length limit is 64 KB.
+ * CC - A semicolon-delimited list of CC recipients for the message.
+ * BCC - A semicolon-delimited list of BCC recipients for the message.
+ * Msg - The content of the message. The length limit is 64 KB.
+ * Return Value:
+ * None.
+ * Comments:
+ * If the parameter mailData is NULL or length is 0, the current document will be mailed as an attachment to all recipients.
+ */
+ void (*Doc_mail)(struct _IPDF_JsPlatform* pThis,void* mailData, int length,FPDF_BOOL bUI, FPDF_WIDESTRING To, FPDF_WIDESTRING Subject, FPDF_WIDESTRING CC, FPDF_WIDESTRING BCC, FPDF_WIDESTRING Msg);
+
+
+ /*
+ * Method: Doc_print
+ * Prints all or a specific number of pages of the document.
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * yes
+ * Parameters:
+ * pThis - Pointer to the interface structure itself.
+ * bUI - If true, will cause a UI to be presented to the user to obtain printing information and confirm the action.
+ * nStart - A 0-based index that defines the start of an inclusive range of pages.
+ * nEnd - A 0-based index that defines the end of an inclusive page range.
+ * bSilent - If true, suppresses the cancel dialog box while the document is printing. The default is false.
+ * bShrinkToFit - If true, the page is shrunk (if necessary) to fit within the imageable area of the printed page.
+ * bPrintAsImage - If true, print pages as an image.
+ * bReverse - If true, print from nEnd to nStart.
+ * bAnnotations - If true (the default), annotations are printed.
+ */
+ void (*Doc_print)(struct _IPDF_JsPlatform* pThis, FPDF_BOOL bUI, int nStart, int nEnd, FPDF_BOOL bSilent ,FPDF_BOOL bShrinkToFit,FPDF_BOOL bPrintAsImage ,FPDF_BOOL bReverse ,FPDF_BOOL bAnnotations);
+
+ /*
+ * Method: Doc_submitForm
+ * Send the form data to a specified URL.
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * yes
+ * Parameters:
+ * pThis - Pointer to the interface structure itself
+ * formData - Pointer to the data buffer to be sent.
+ * length - The size,in bytes, of the buffer pointed by formData parameter.
+ * URL - The URL to send to.
+ * Return Value:
+ * None.
+ *
+ */
+ void (*Doc_submitForm)(struct _IPDF_JsPlatform* pThis,void* formData, int length, FPDF_WIDESTRING URL);
+
+ /*
+ * Method: Doc_gotoPage
+ * Jump to a specified page.
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * yes
+ * Parameters:
+ * pThis - Pointer to the interface structure itself
+ * nPageNum - The specified page number, zero for the first page.
+ * Return Value:
+ * None.
+ *
+ */
+ void (*Doc_gotoPage)(struct _IPDF_JsPlatform* pThis, int nPageNum);
+ /*
+ * Method: Field_browse
+ * Show a file selection dialog, and return the selected file path.
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * yes
+ * Parameters:
+ * pThis - Pointer to the interface structure itself.
+ * filePath - Pointer to the data buffer to receive the file path.Can be NULL.
+ * length - The length of the buffer, number of bytes. Can be 0.
+ * Return Value:
+ * Number of bytes the filePath consumes, including trailing zeros.
+ * Comments:
+ * The filePath shoule be always input in local encoding.
+ */
+ int (*Field_browse)(struct _IPDF_JsPlatform* pThis,void* filePath, int length);
+
+ /**
+ * pointer to FPDF_FORMFILLINFO interface.
+ **/
+ void* m_pFormfillinfo;
+} IPDF_JSPLATFORM;
+
+// Flags for Cursor type
+#define FXCT_ARROW 0
+#define FXCT_NESW 1
+#define FXCT_NWSE 2
+#define FXCT_VBEAM 3
+#define FXCT_HBEAM 4
+#define FXCT_HAND 5
+
+/**
+ * Declares of a pointer type to the callback function for the FFI_SetTimer method.
+ * Parameters:
+ * idEvent - Identifier of the timer.
+ * Return value:
+ * None.
+ **/
+typedef void (*TimerCallback)(int idEvent);
+
+/**
+ * Declares of a struct type to the local system time.
+**/
+typedef struct _FPDF_SYSTEMTIME
+{
+ unsigned short wYear; /* years since 1900 */
+ unsigned short wMonth; /* months since January - [0,11] */
+ unsigned short wDayOfWeek; /* days since Sunday - [0,6] */
+ unsigned short wDay; /* day of the month - [1,31] */
+ unsigned short wHour; /* hours since midnight - [0,23] */
+ unsigned short wMinute; /* minutes after the hour - [0,59] */
+ unsigned short wSecond; /* seconds after the minute - [0,59] */
+ unsigned short wMilliseconds; /* milliseconds after the second - [0,999] */
+}FPDF_SYSTEMTIME;
+
+
+typedef struct _FPDF_FORMFILLINFO
+{
+ /**
+ * Version number of the interface. Currently must be 1.
+ **/
+ int version;
+
+ /**
+ * Method: Release
+ * Give implementation a chance to release any data after the interface is no longer used
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * No
+ * Comments:
+ * Called by Foxit SDK during the final cleanup process.
+ * Parameters:
+ * pThis - Pointer to the interface structure itself
+ * Return Value:
+ * None
+ */
+
+ void (*Release)(struct _FPDF_FORMFILLINFO* pThis);
+
+ /**
+ * Method: FFI_Invalidate
+ * Invalidate the client area within the specified rectangle.
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * yes
+ * Parameters:
+ * pThis - Pointer to the interface structure itself.
+ * page - Handle to the page. Returned by FPDF_LoadPage function.
+ * left - Left position of the client area in PDF page coordinate.
+ * top - Top position of the client area in PDF page coordinate.
+ * right - Right position of the client area in PDF page coordinate.
+ * bottom - Bottom position of the client area in PDF page coordinate.
+ * Return Value:
+ * None.
+ *
+ *comments:
+ * All positions are measured in PDF "user space".
+ * Implementation should call FPDF_RenderPageBitmap() function for repainting a specified page area.
+ */
+ void (*FFI_Invalidate)(struct _FPDF_FORMFILLINFO* pThis,FPDF_PAGE page, double left, double top, double right, double bottom);
+
+ /**
+ * Method: FFI_OutputSelectedRect
+ * When user is taking the mouse to select texts on a form field, this callback function will keep
+ * returning the selected areas to the implementation.
+ *
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * No
+ * Parameters:
+ * pThis - Pointer to the interface structure itself.
+ * page - Handle to the page. Returned by FPDF_LoadPage function.
+ * left - Left position of the client area in PDF page coordinate.
+ * top - Top position of the client area in PDF page coordinate.
+ * right - Right position of the client area in PDF page coordinate.
+ * bottom - Bottom position of the client area in PDF page coordinate.
+ * Return Value:
+ * None.
+ *
+ * comments:
+ * This CALLBACK function is useful for implementing special text selection effect. Implementation should
+ * first records the returned rectangles, then draw them one by one at the painting period, last,remove all
+ * the recorded rectangles when finish painting.
+ */
+ void (*FFI_OutputSelectedRect)(struct _FPDF_FORMFILLINFO* pThis,FPDF_PAGE page, double left, double top, double right, double bottom);
+
+ /**
+ * Method: FFI_SetCursor
+ * Set the Cursor shape.
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * yes
+ * Parameters:
+ * pThis - Pointer to the interface structure itself.
+ * nCursorType - Cursor type. see Flags for Cursor type for the details.
+ * Return value:
+ * None.
+ * */
+ void (*FFI_SetCursor)(struct _FPDF_FORMFILLINFO* pThis, int nCursorType);
+
+ /**
+ * Method: FFI_SetTimer
+ * This method installs a system timer. A time-out value is specified,
+ * and every time a time-out occurs, the system passes a message to
+ * the TimerProc callback function.
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * yes
+ * Parameters:
+ * pThis - Pointer to the interface structure itself.
+ * uElapse - Specifies the time-out value, in milliseconds.
+ * lpTimerFunc - A pointer to the callback function-TimerCallback.
+ * Return value:
+ * The timer identifier of the new timer if the function is successful.
+ * An application passes this value to the FFI_KillTimer method to kill
+ * the timer. Nonzero if it is successful; otherwise, it is zero.
+ * */
+ int (*FFI_SetTimer)(struct _FPDF_FORMFILLINFO* pThis, int uElapse, TimerCallback lpTimerFunc);
+
+ /**
+ * Method: FFI_KillTimer
+ * This method kills the timer event identified by nIDEvent, set by an earlier call to FFI_SetTimer.
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * yes
+ * Parameters:
+ * pThis - Pointer to the interface structure itself.
+ * nTimerID - The timer ID return by FFI_SetTimer function.
+ * Return value:
+ * None.
+ * */
+ void (*FFI_KillTimer)(struct _FPDF_FORMFILLINFO* pThis, int nTimerID);
+
+
+ /**
+ * Method: FFI_GetLocalTime
+ * This method receives the current local time on the system.
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * yes
+ * Parameters:
+ * pThis - Pointer to the interface structure itself.
+ * Return value:
+ * None.
+ * */
+ FPDF_SYSTEMTIME (*FFI_GetLocalTime)(struct _FPDF_FORMFILLINFO* pThis);
+
+ /**
+ * Method: FFI_OnChange
+ * This method will be invoked to notify implementation when the value of any FormField on the document had been changed.
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * no
+ * Parameters:
+ * pThis - Pointer to the interface structure itself.
+ * Return value:
+ * None.
+ * */
+ void (*FFI_OnChange)(struct _FPDF_FORMFILLINFO* pThis);
+
+ /**
+ * Method: FFI_GetPage
+ * This method receives the page pointer associated with a specified page index.
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * yes
+ * Parameters:
+ * pThis - Pointer to the interface structure itself.
+ * document - Handle to document. Returned by FPDF_LoadDocument function.
+ * nPageIndex - Index number of the page. 0 for the first page.
+ * Return value:
+ * Handle to the page. Returned by FPDF_LoadPage function.
+ * Comments:
+ * In some cases, the document-level JavaScript action may refer to a page which hadn't been loaded yet.
+ * To successfully run the javascript action, implementation need to load the page for SDK.
+ * */
+ FPDF_PAGE (*FFI_GetPage)(struct _FPDF_FORMFILLINFO* pThis, FPDF_DOCUMENT document, int nPageIndex);
+
+ /**
+ * Method: FFI_GetCurrentPage
+ * This method receives the current page pointer.
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * yes
+ * Parameters:
+ * pThis - Pointer to the interface structure itself.
+ * document - Handle to document. Returned by FPDF_LoadDocument function.
+ * Return value:
+ * Handle to the page. Returned by FPDF_LoadPage function.
+ * */
+ FPDF_PAGE (*FFI_GetCurrentPage)(struct _FPDF_FORMFILLINFO* pThis, FPDF_DOCUMENT document);
+
+ /**
+ * Method: FFI_GetRotation
+ * This method receives currently rotation of the page view.
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * yes
+ * Parameters:
+ * pThis - Pointer to the interface structure itself.
+ * page - Handle to page. Returned by FPDF_LoadPage function.
+ * Return value:
+ * The page rotation. Should be 0(0 degree),1(90 degree),2(180 degree),3(270 degree), in a clockwise direction.
+ * */
+ int (*FFI_GetRotation)(struct _FPDF_FORMFILLINFO* pThis, FPDF_PAGE page);
+
+ /**
+ * Method: FFI_ExecuteNamedAction
+ * This method will execute an named action.
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * yes
+ * Parameters:
+ * pThis - Pointer to the interface structure itself.
+ * namedAction - A byte string which indicates the named action, terminated by 0.
+ * Return value:
+ * None.
+ * Comments:
+ * See the named actions description of <<PDF Reference, version 1.7>> for more details.
+ * */
+ void (*FFI_ExecuteNamedAction)(struct _FPDF_FORMFILLINFO* pThis, FPDF_BYTESTRING namedAction);
+ /**
+ * @brief This method will be called when a text field is getting or losing a focus.
+ *
+ * @param[in] pThis Pointer to the interface structure itself.
+ * @param[in] value The string value of the form field, in UTF-16LE format.
+ * @param[in] valueLen The length of the string value, number of characters (not bytes).
+ * @param[in] is_focus True if the form field is getting a focus, False for losing a focus.
+ *
+ * @return None.
+ *
+ * @note Currently,only support text field and combobox field.
+ * */
+ void (*FFI_SetTextFieldFocus)(struct _FPDF_FORMFILLINFO* pThis, FPDF_WIDESTRING value, FPDF_DWORD valueLen, FPDF_BOOL is_focus);
+
+
+ /**
+ * Method: FFI_DoURIAction
+ * This action resolves to a uniform resource identifier.
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * No
+ * Parameters:
+ * pThis - Pointer to the interface structure itself.
+ * bsURI - A byte string which indicates the uniform resource identifier, terminated by 0.
+ * Return value:
+ * None.
+ * Comments:
+ * See the URI actions description of <<PDF Reference, version 1.7>> for more details.
+ * */
+ void (*FFI_DoURIAction)(struct _FPDF_FORMFILLINFO* pThis, FPDF_BYTESTRING bsURI);
+
+ /**
+ * Method: FFI_DoGoToAction
+ * This action changes the view to a specified destination.
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * No
+ * Parameters:
+ * pThis - Pointer to the interface structure itself.
+ * nPageIndex - The index of the PDF page.
+ * zoomMode - The zoom mode for viewing page.See Macros "PDFZOOM_XXX" defined in "fpdfdoc.h".
+ * fPosArray - The float array which carries the position info.
+ * sizeofArray - The size of float array.
+ * Return value:
+ * None.
+ * Comments:
+ * See the Destinations description of <<PDF Reference, version 1.7>> in 8.2.1 for more details.
+ **/
+ void (*FFI_DoGoToAction)(struct _FPDF_FORMFILLINFO* pThis, int nPageIndex, int zoomMode, float* fPosArray, int sizeofArray);
+ /**
+ * pointer to IPDF_JSPLATFORM interface
+ **/
+ IPDF_JSPLATFORM* m_pJsPlatform;
+
+} FPDF_FORMFILLINFO;
+
+
+
+/**
+ * Function: FPDFDOC_InitFormFillEnviroument
+ * Init form fill environment.
+ * Comments:
+ * This function should be called before any form fill operation.
+ * Parameters:
+ * document - Handle to document. Returned by FPDF_LoadDocument function.
+ * pFormFillInfo - Pointer to a FPDF_FORMFILLINFO structure.
+ * Return Value:
+ * Return handler to the form fill module. NULL means fails.
+ **/
+DLLEXPORT FPDF_FORMHANDLE STDCALL FPDFDOC_InitFormFillEnviroument(FPDF_DOCUMENT document, FPDF_FORMFILLINFO* formInfo);
+
+/**
+ * Function: FPDFDOC_ExitFormFillEnviroument
+ * Exit form fill environment.
+ * Parameters:
+ * hHandle - Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
+ * Return Value:
+ * NULL.
+ **/
+DLLEXPORT void STDCALL FPDFDOC_ExitFormFillEnviroument(FPDF_FORMHANDLE hHandle);
+
+/**
+ * Function: FORM_OnAfterLoadPage
+ * This method is required for implementing all the form related functions. Should be invoked after user
+ * successfully loaded a PDF page, and method FPDFDOC_InitFormFillEnviroument had been invoked.
+ * Parameters:
+ * hHandle - Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
+ * Return Value:
+ * NONE.
+ **/
+DLLEXPORT void STDCALL FORM_OnAfterLoadPage(FPDF_PAGE page, FPDF_FORMHANDLE hHandle);
+
+/**
+ * Function: FORM_OnBeforeClosePage
+ * This method is required for implementing all the form related functions. Should be invoked before user
+ * close the PDF page.
+ * Parameters:
+ * page - Handle to the page. Returned by FPDF_LoadPage function.
+ * hHandle - Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
+ * Return Value:
+ * NONE.
+ **/
+DLLEXPORT void STDCALL FORM_OnBeforeClosePage(FPDF_PAGE page, FPDF_FORMHANDLE hHandle);
+
+/**
+* Function: FORM_DoDocumentJSAction
+* This method is required for performing Document-level JavaScript action. It should be invoked after the PDF document
+* had been loaded.
+* Parameters:
+* hHandle - Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
+* Return Value:
+* NONE
+* Comments:
+* If there is Document-level JavaScript action embedded in the document, this method will execute the javascript action;
+* otherwise, the method will do nothing.
+**/
+DLLEXPORT void STDCALL FORM_DoDocumentJSAction(FPDF_FORMHANDLE hHandle);
+
+
+/**
+* Function: FORM_DoDocumentOpenAction
+* This method is required for performing open-action when the document is opened.
+* Parameters:
+* hHandle - Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
+* Return Value:
+* NONE
+* Comments:
+* This method will do nothing if there is no open-actions embedded in the document.
+**/
+DLLEXPORT void STDCALL FORM_DoDocumentOpenAction(FPDF_FORMHANDLE hHandle);
+
+
+// additional actions type of document.
+#define FPDFDOC_AACTION_WC 0x10 //WC, before closing document, JavaScript action.
+#define FPDFDOC_AACTION_WS 0x11 //WS, before saving document, JavaScript action.
+#define FPDFDOC_AACTION_DS 0x12 //DS, after saving document, JavaScript action.
+#define FPDFDOC_AACTION_WP 0x13 //WP, before printing document, JavaScript action.
+#define FPDFDOC_AACTION_DP 0x14 //DP, after printing document, JavaScript action.
+/**
+* Function: FORM_DoDocumentAAction
+* This method is required for performing the document's additional-action.
+* Parameters:
+* hHandle - Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
+* aaType - The type of the additional-actions which defined above.
+* Return Value:
+* NONE
+* Comments:
+* This method will do nothing if there is no document additional-action corresponding to the specified aaType.
+**/
+
+DLLEXPORT void STDCALL FORM_DoDocumentAAction(FPDF_FORMHANDLE hHandle, int aaType);
+
+// Additional-action types of page object
+#define FPDFPAGE_AACTION_OPEN 0 // /O -- An action to be performed when the page is opened
+#define FPDFPAGE_AACTION_CLOSE 1 // /C -- An action to be performed when the page is closed
+
+/**
+* Function: FORM_DoPageAAction
+* This method is required for performing the page object's additional-action when opened or closed.
+* Parameters:
+* page - Handle to the page. Returned by FPDF_LoadPage function.
+* hHandle - Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
+* aaType - The type of the page object's additional-actions which defined above.
+* Return Value:
+* NONE
+* Comments:
+* This method will do nothing if no additional-action corresponding to the specified aaType exists.
+**/
+DLLEXPORT void STDCALL FORM_DoPageAAction(FPDF_PAGE page, FPDF_FORMHANDLE hHandle, int aaType);
+
+/**
+ * Function: FORM_OnMouseMove
+ * You can call this member function when the mouse cursor moves.
+ * Parameters:
+ * hHandle - Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
+ * page - Handle to the page. Returned by FPDF_LoadPage function.
+ * modifier - Indicates whether various virtual keys are down.
+ * page_x - Specifies the x-coordinate of the cursor in PDF user space.
+ * page_y - Specifies the y-coordinate of the cursor in PDF user space.
+ * Return Value:
+ * TRUE indicates success; otherwise false.
+ **/
+DLLEXPORT FPDF_BOOL STDCALL FORM_OnMouseMove(FPDF_FORMHANDLE hHandle,FPDF_PAGE page, int modifier, double page_x, double page_y);
+
+/**
+ * Function: FORM_OnLButtonDown
+ * You can call this member function when the user presses the left mouse button.
+ * Parameters:
+ * hHandle - Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
+ * page - Handle to the page. Returned by FPDF_LoadPage function.
+ * modifier - Indicates whether various virtual keys are down.
+ * page_x - Specifies the x-coordinate of the cursor in PDF user space.
+ * page_y - Specifies the y-coordinate of the cursor in PDF user space.
+ * Return Value:
+ * TRUE indicates success; otherwise false.
+ **/
+DLLEXPORT FPDF_BOOL STDCALL FORM_OnLButtonDown(FPDF_FORMHANDLE hHandle,FPDF_PAGE page, int modifier, double page_x, double page_y);
+
+/**
+ * Function: FORM_OnLButtonUp
+ * You can call this member function when the user releases the left mouse button.
+ * Parameters:
+ * hHandle - Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
+ * page - Handle to the page. Returned by FPDF_LoadPage function.
+ * modifier - Indicates whether various virtual keys are down.
+ * page_x - Specifies the x-coordinate of the cursor in device.
+ * page_y - Specifies the y-coordinate of the cursor in device.
+ * Return Value:
+ * TRUE indicates success; otherwise false.
+ **/
+DLLEXPORT FPDF_BOOL STDCALL FORM_OnLButtonUp(FPDF_FORMHANDLE hHandle,FPDF_PAGE page, int modifier, double page_x, double page_y);
+
+/**
+ * Function: FORM_OnKeyDown
+ * You can call this member function when a nonsystem key is pressed.
+ * Parameters:
+ * hHandle - Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
+ * page - Handle to the page. Returned by FPDF_LoadPage function.
+ * nKeyCode - Indicates whether various virtual keys are down.
+ * modifier - Contains the scan code, key-transition code, previous key state, and context code.
+ * Return Value:
+ * TRUE indicates success; otherwise false.
+ **/
+DLLEXPORT FPDF_BOOL STDCALL FORM_OnKeyDown(FPDF_FORMHANDLE hHandle,FPDF_PAGE page, int nKeyCode, int modifier);
+
+/**
+ * Function: FORM_OnKeyUp
+ * You can call this member function when a nonsystem key is released.
+ * Parameters:
+ * hHandle - Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
+ * page - Handle to the page. Returned by FPDF_LoadPage function.
+ * nKeyCode - The virtual-key code of the given key.
+ * modifier - Contains the scan code, key-transition code, previous key state, and context code.
+ * Return Value:
+ * TRUE indicates success; otherwise false.
+ **/
+DLLEXPORT FPDF_BOOL STDCALL FORM_OnKeyUp(FPDF_FORMHANDLE hHandle,FPDF_PAGE page, int nKeyCode, int modifier);
+
+/**
+ * Function: FORM_OnChar
+ * You can call this member function when a keystroke translates to a nonsystem character.
+ * Parameters:
+ * hHandle - Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
+ * page - Handle to the page. Returned by FPDF_LoadPage function.
+ * nChar - The character code value of the key.
+ * modifier - Contains the scan code, key-transition code, previous key state, and context code.
+ * Return Value:
+ * TRUE indicates success; otherwise false.
+ **/
+DLLEXPORT FPDF_BOOL STDCALL FORM_OnChar(FPDF_FORMHANDLE hHandle,FPDF_PAGE page, int nChar, int modifier);
+
+/**
+ * Function: FORM_ForceToKillFocus.
+ * You can call this member function to force to kill the focus of the form field which got focus.
+ * It would kill the focus on the form field, save the value of form field if it's changed by user.
+ * Parameters:
+ * hHandle - Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
+ * Return Value:
+ * TRUE indicates success; otherwise false.
+ **/
+DLLEXPORT FPDF_BOOL STDCALL FORM_ForceToKillFocus(FPDF_FORMHANDLE hHandle);
+
+// Field Types
+#define FPDF_FORMFIELD_UNKNOWN 0 // Unknown.
+#define FPDF_FORMFIELD_PUSHBUTTON 1 // push button type.
+#define FPDF_FORMFIELD_CHECKBOX 2 // check box type.
+#define FPDF_FORMFIELD_RADIOBUTTON 3 // radio button type.
+#define FPDF_FORMFIELD_COMBOBOX 4 // combo box type.
+#define FPDF_FORMFIELD_LISTBOX 5 // list box type.
+#define FPDF_FORMFIELD_TEXTFIELD 6 // text field type.
+
+/**
+ * Function: FPDPage_HasFormFieldAtPoint
+ * Check the form filed position by point.
+ * Parameters:
+ * hHandle - Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
+ * page - Handle to the page. Returned by FPDF_LoadPage function.
+ * page_x - X position in PDF "user space".
+ * page_y - Y position in PDF "user space".
+ * Return Value:
+ * Return the type of the formfiled; -1 indicates no fields.
+ **/
+DLLEXPORT int STDCALL FPDPage_HasFormFieldAtPoint(FPDF_FORMHANDLE hHandle,FPDF_PAGE page,double page_x, double page_y);
+
+/**
+ * Function: FPDF_SetFormFieldHighlightColor
+ * Set the highlight color of specified or all the form fields in the document.
+ * Parameters:
+ * hHandle - Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
+ * doc - Handle to the document. Returned by FPDF_LoadDocument function.
+ * fieldType - A 32-bit integer indicating the type of a form field(defined above).
+ * color - The highlight color of the form field.Constructed by 0xxxrrggbb.
+ * Return Value:
+ * NONE.
+ * Comments:
+ * When the parameter fieldType is set to zero, the highlight color will be applied to all the form fields in the
+ * document.
+ * Please refresh the client window to show the highlight immediately if necessary.
+ **/
+DLLEXPORT void STDCALL FPDF_SetFormFieldHighlightColor(FPDF_FORMHANDLE hHandle, int fieldType, unsigned long color);
+
+/**
+ * Function: FPDF_SetFormFieldHighlightAlpha
+ * Set the transparency of the form field highlight color in the document.
+ * Parameters:
+ * hHandle - Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
+ * doc - Handle to the document. Returned by FPDF_LoadDocument function.
+ * alpha - The transparency of the form field highlight color. between 0-255.
+ * Return Value:
+ * NONE.
+ **/
+DLLEXPORT void STDCALL FPDF_SetFormFieldHighlightAlpha(FPDF_FORMHANDLE hHandle, unsigned char alpha);
+
+
+/**
+ * Function: FPDF_RemoveFormFieldHighlight
+ * Remove the form field highlight color in the document.
+ * Parameters:
+ * hHandle - Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
+ * Return Value:
+ * NONE.
+ * Comments:
+ * Please refresh the client window to remove the highlight immediately if necessary.
+ **/
+DLLEXPORT void STDCALL FPDF_RemoveFormFieldHighlight(FPDF_FORMHANDLE hHandle);
+
+/**
+* Function: FPDF_FFLDraw
+* Render FormFeilds on a page to a device independent bitmap.
+* Parameters:
+* hHandle - Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
+* bitmap - Handle to the device independent bitmap (as the output buffer).
+* Bitmap handle can be created by FPDFBitmap_Create function.
+* page - Handle to the page. Returned by FPDF_LoadPage function.
+* start_x - Left pixel position of the display area in the device coordinate.
+* start_y - Top pixel position of the display area in the device coordinate.
+* size_x - Horizontal size (in pixels) for displaying the page.
+* size_y - Vertical size (in pixels) for displaying the page.
+* rotate - Page orientation: 0 (normal), 1 (rotated 90 degrees clockwise),
+* 2 (rotated 180 degrees), 3 (rotated 90 degrees counter-clockwise).
+* flags - 0 for normal display, or combination of flags defined above.
+* Return Value:
+* None.
+* Comments:
+* This method is designed to only render annotations and FormFields on the page.
+* Without FPDF_ANNOT specified for flags, Rendering functions such as FPDF_RenderPageBitmap or FPDF_RenderPageBitmap_Start will only render page contents(without annotations) to a bitmap.
+* In order to implement the FormFill functions,Implementation should call this method after rendering functions finish rendering the page contents.
+**/
+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);
+
+
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif //_FPDFORMFILL_H
+
diff --git a/fpdfsdk/include/fpdfoom.h b/fpdfsdk/include/fpdfoom.h new file mode 100644 index 0000000000..638b012b74 --- /dev/null +++ b/fpdfsdk/include/fpdfoom.h @@ -0,0 +1,61 @@ +// 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 _FPDFOOM_H_
+#define _FPDFOOM_H_
+
+#ifndef _FPDFVIEW_H_
+#include "fpdfview.h"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct _OOM_INFO
+{
+ /**
+ * Version number of the interface. Currently must be 1.
+ **/
+ int version;
+
+ /**
+ * Method: FSDK_OOM_Handler
+ * Out-Of-Memory handling function.
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * Yes
+ * Parameters:
+ * pThis - Pointer to the interface structure itself.
+ * Return value:
+ * None.
+ * */
+
+ void(*FSDK_OOM_Handler)(_OOM_INFO* pThis);
+}OOM_INFO;
+
+
+/**
+ * Function: FSDK_SetOOMHandler
+ * Setup A Out-Of-Memory handler for foxit sdk.
+ * Parameters:
+ * oomInfo - Pointer to a OOM_INFO structure.
+ * Return Value:
+ * TRUE means successful. FALSE means fails.
+ **/
+
+DLLEXPORT FPDF_BOOL STDCALL FSDK_SetOOMHandler(OOM_INFO* oomInfo);
+
+
+#ifdef __cplusplus
+};
+#endif
+
+
+
+
+#endif
diff --git a/fpdfsdk/include/fpdfppo.h b/fpdfsdk/include/fpdfppo.h new file mode 100644 index 0000000000..5f77b5bf8d --- /dev/null +++ b/fpdfsdk/include/fpdfppo.h @@ -0,0 +1,34 @@ +// 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 _FPDFPPO_H_
+#define _FPDFPPO_H_
+
+#include "fpdfview.h"
+
+// Function: FPDF_ImportPages
+// Import some pages to a PDF document.
+// Parameters:
+// dest_doc - The destination document which add the pages.
+// src_doc - A document to be imported.
+// pagerange - A page range string, Such as "1,3,5-7".
+// If this parameter is NULL, it would import all pages in src_doc.
+// index - The page index wanted to insert from.
+// Return value:
+// TRUE for succeed, FALSE for Failed.
+DLLEXPORT FPDF_BOOL STDCALL FPDF_ImportPages(FPDF_DOCUMENT dest_doc,FPDF_DOCUMENT src_doc, FPDF_BYTESTRING pagerange, int index);
+
+
+// Function: FPDF_CopyViewerPreferences
+// Copy the viewer preferences from one PDF document to another.#endif
+// Parameters:
+// dest_doc - Handle to document to write the viewer preferences to.
+// src_doc - Handle to document with the viewer preferences.
+// Return value:
+// TRUE for success, FALSE for failure.
+DLLEXPORT FPDF_BOOL STDCALL FPDF_CopyViewerPreferences(FPDF_DOCUMENT dest_doc, FPDF_DOCUMENT src_doc);
+#endif
+
diff --git a/fpdfsdk/include/fpdfsave.h b/fpdfsdk/include/fpdfsave.h new file mode 100644 index 0000000000..be340f44a1 --- /dev/null +++ b/fpdfsdk/include/fpdfsave.h @@ -0,0 +1,81 @@ +// 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 _FPDFSAVE_H_
+#define _FPDFSAVE_H_
+
+#include "fpdfview.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+// Structure for custom file write
+struct FPDF_FILEWRITE{
+
+ //
+ //Version number of the interface. Currently must be 1.
+ //
+ int version;
+
+ //
+ // Method: WriteBlock
+ // Output a block of data in your custom way.
+ // Interface Version:
+ // 1
+ // Implementation Required:
+ // Yes
+ // Comments:
+ // Called by function FPDF_SaveDocument
+ // Parameters:
+ // pThis - Pointer to the structure itself
+ // pData - Pointer to a buffer to output
+ // size - The size of the buffer.
+ // Return value:
+ // Should be non-zero if successful, zero for error.
+ //
+ int (*WriteBlock)( FPDF_FILEWRITE* pThis, const void* pData, unsigned long size);
+
+};
+
+
+/** @brief Incremental. */
+#define FPDF_INCREMENTAL 1
+/** @brief No Incremental. */
+#define FPDF_NO_INCREMENTAL 2
+
+
+// Function: FPDF_SaveAsCopy
+// Saves the copy of specified document in custom way.
+// Parameters:
+// document - Handle to document. Returned by FPDF_LoadDocument and FPDF_CreateNewDocument.
+// pFileWrite - A pointer to a custom file write structure.
+// flags - The creating flags.
+// Return value:
+// TRUE for succeed, FALSE for failed.
+//
+DLLEXPORT FPDF_BOOL STDCALL FPDF_SaveAsCopy( FPDF_DOCUMENT document,FPDF_FILEWRITE * pFileWrite,
+ FPDF_DWORD flags );
+
+// Function: FPDF_SaveWithVersion
+// Same as function ::FPDF_SaveAsCopy, except the file version of the saved document could be specified by user.
+// Parameters:
+// document - Handle to document.
+// pFileWrite - A pointer to a custom file write structure.
+// flags - The creating flags.
+// fileVersion - The PDF file version. File version: 14 for 1.4, 15 for 1.5, ...
+// Return value:
+// TRUE if succeed, FALSE if failed.
+//
+DLLEXPORT FPDF_BOOL STDCALL FPDF_SaveWithVersion(FPDF_DOCUMENT document,FPDF_FILEWRITE * pFileWrite,
+ FPDF_DWORD flags, int fileVersion);
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif //_FPDFSAVE_H_
diff --git a/fpdfsdk/include/fpdftext.h b/fpdfsdk/include/fpdftext.h new file mode 100644 index 0000000000..f862db4cbe --- /dev/null +++ b/fpdfsdk/include/fpdftext.h @@ -0,0 +1,316 @@ +// 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 _FPDFTEXT_H_
+#define _FPDFTEXT_H_
+
+#include "fpdfview.h"
+
+// Exported Functions
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// Function: FPDFText_LoadPage
+// Prepare information about all characters in a page.
+// Parameters:
+// page - Handle to the page. Returned by FPDF_LoadPage function (in FPDFVIEW module).
+// Return value:
+// A handle to the text page information structure.
+// NULL if something goes wrong.
+// Comments:
+// Application must call FPDFText_ClosePage to release the text page information.
+// If you don't purchase Text Module , this function will return NULL.
+//
+DLLEXPORT FPDF_TEXTPAGE STDCALL FPDFText_LoadPage(FPDF_PAGE page);
+
+// Function: FPDFText_ClosePage
+// Release all resources allocated for a text page information structure.
+// Parameters:
+// text_page - Handle to a text page information structure. Returned by FPDFText_LoadPage function.
+// Return Value:
+// None.
+//
+DLLEXPORT void STDCALL FPDFText_ClosePage(FPDF_TEXTPAGE text_page);
+
+// Function: FPDFText_CountChars
+// Get number of characters in a page.
+// Parameters:
+// text_page - Handle to a text page information structure. Returned by FPDFText_LoadPage function.
+// Return value:
+// Number of characters in the page. Return -1 for error.
+// Generated characters, like additional space characters, new line characters, are also counted.
+// Comments:
+// Characters in a page form a "stream", inside the stream, each character has an index.
+// We will use the index parameters in many of FPDFTEXT functions. The first character in the page
+// has an index value of zero.
+//
+DLLEXPORT int STDCALL FPDFText_CountChars(FPDF_TEXTPAGE text_page);
+
+// Function: FPDFText_GetUnicode
+// Get Unicode of a character in a page.
+// Parameters:
+// text_page - Handle to a text page information structure. Returned by FPDFText_LoadPage function.
+// index - Zero-based index of the character.
+// Return value:
+// The Unicode of the particular character.
+// If a character is not encoded in Unicode and Foxit engine can't convert to Unicode,
+// the return value will be zero.
+//
+DLLEXPORT unsigned int STDCALL FPDFText_GetUnicode(FPDF_TEXTPAGE text_page, int index);
+
+// Function: FPDFText_GetFontSize
+// Get the font size of a particular character.
+// Parameters:
+// text_page - Handle to a text page information structure. Returned by FPDFText_LoadPage function.
+// index - Zero-based index of the character.
+// Return value:
+// The font size of the particular character, measured in points (about 1/72 inch).
+// This is the typographic size of the font (so called "em size").
+//
+DLLEXPORT double STDCALL FPDFText_GetFontSize(FPDF_TEXTPAGE text_page, int index);
+
+// Function: FPDFText_GetCharBox
+// Get bounding box of a particular character.
+// Parameters:
+// text_page - Handle to a text page information structure. Returned by FPDFText_LoadPage function.
+// index - Zero-based index of the character.
+// left - Pointer to a double number receiving left position of the character box.
+// right - Pointer to a double number receiving right position of the character box.
+// bottom - Pointer to a double number receiving bottom position of the character box.
+// top - Pointer to a double number receiving top position of the character box.
+// Return Value:
+// None.
+// Comments:
+// All positions are measured in PDF "user space".
+//
+DLLEXPORT void STDCALL FPDFText_GetCharBox(FPDF_TEXTPAGE text_page, int index, double* left,
+ double* right, double* bottom, double* top);
+
+// Function: FPDFText_GetCharIndexAtPos
+// Get the index of a character at or nearby a certain position on the page.
+// Parameters:
+// text_page - Handle to a text page information structure. Returned by FPDFText_LoadPage function.
+// x - X position in PDF "user space".
+// y - Y position in PDF "user space".
+// xTolerance - An x-axis tolerance value for character hit detection, in point unit.
+// yTolerance - A y-axis tolerance value for character hit detection, in point unit.
+// Return Value:
+// The zero-based index of the character at, or nearby the point (x,y).
+// If there is no character at or nearby the point, return value will be -1.
+// If an error occurs, -3 will be returned.
+//
+DLLEXPORT int STDCALL FPDFText_GetCharIndexAtPos(FPDF_TEXTPAGE text_page,
+ double x, double y, double xTorelance, double yTolerance);
+
+// Function: FPDFText_GetText
+// Extract unicode text string from the page.
+// Parameters:
+// text_page - Handle to a text page information structure. Returned by FPDFText_LoadPage function.
+// start_index - Index for the start characters.
+// count - Number of characters to be extracted.
+// result - A buffer (allocated by application) receiving the extracted unicodes.
+// The size of the buffer must be able to hold the number of characters plus a terminator.
+// Return Value:
+// Number of characters written into the result buffer, including the trailing terminator.
+// Comments:
+// This function ignores characters without unicode information.
+//
+DLLEXPORT int STDCALL FPDFText_GetText(FPDF_TEXTPAGE text_page, int start_index, int count, unsigned short* result);
+
+// Function: FPDFText_CountRects
+// Count number of rectangular areas occupied by a segment of texts.
+// Parameters:
+// text_page - Handle to a text page information structure. Returned by FPDFText_LoadPage function.
+// start_index - Index for the start characters.
+// count - Number of characters.
+// Return value:
+// Number of rectangles. Zero for error.
+// Comments:
+// This function, along with FPDFText_GetRect can be used by applications to detect the position
+// on the page for a text segment, so proper areas can be highlighted or something.
+// FPDFTEXT will automatically merge small character boxes into bigger one if those characters
+// are on the same line and use same font settings.
+//
+DLLEXPORT int STDCALL FPDFText_CountRects(FPDF_TEXTPAGE text_page, int start_index, int count);
+
+// Function: FPDFText_GetRect
+// Get a rectangular area from the result generated by FPDFText_CountRects.
+// Parameters:
+// text_page - Handle to a text page information structure. Returned by FPDFText_LoadPage function.
+// rect_index - Zero-based index for the rectangle.
+// left - Pointer to a double value receiving the rectangle left boundary.
+// top - Pointer to a double value receiving the rectangle top boundary.
+// right - Pointer to a double value receiving the rectangle right boundary.
+// bottom - Pointer to a double value receiving the rectangle bottom boundary.
+// Return Value:
+// None.
+//
+DLLEXPORT void STDCALL FPDFText_GetRect(FPDF_TEXTPAGE text_page, int rect_index, double* left, double* top,
+ double* right, double* bottom);
+
+// Function: FPDFText_GetBoundedText
+// Extract unicode text within a rectangular boundary on the page.
+// Parameters:
+// text_page - Handle to a text page information structure. Returned by FPDFText_LoadPage function.
+// left - Left boundary.
+// top - Top boundary.
+// right - Right boundary.
+// bottom - Bottom boundary.
+// buffer - A unicode buffer.
+// buflen - Number of characters (not bytes) for the buffer, excluding an additional terminator.
+// Return Value:
+// If buffer is NULL or buflen is zero, return number of characters (not bytes) needed,
+// otherwise, return number of characters copied into the buffer.
+//
+DLLEXPORT int STDCALL FPDFText_GetBoundedText(FPDF_TEXTPAGE text_page,double left, double top,
+ double right, double bottom,unsigned short* buffer,int buflen);
+
+
+// Flags used by FPDFText_FindStart function.
+#define FPDF_MATCHCASE 0x00000001 //If not set, it will not match case by default.
+#define FPDF_MATCHWHOLEWORD 0x00000002 //If not set, it will not match the whole word by default.
+
+// Function: FPDFText_FindStart
+// Start a search.
+// Parameters:
+// text_page - Handle to a text page information structure. Returned by FPDFText_LoadPage function.
+// findwhat - A unicode match pattern.
+// flags - Option flags.
+// start_index - Start from this character. -1 for end of the page.
+// Return Value:
+// A handle for the search context. FPDFText_FindClose must be called to release this handle.
+//
+DLLEXPORT FPDF_SCHHANDLE STDCALL FPDFText_FindStart(FPDF_TEXTPAGE text_page, FPDF_WIDESTRING findwhat,
+ unsigned long flags, int start_index);
+
+// Function: FPDFText_FindNext
+// Search in the direction from page start to end.
+// Parameters:
+// handle - A search context handle returned by FPDFText_FindStart.
+// Return Value:
+// Whether a match is found.
+//
+DLLEXPORT FPDF_BOOL STDCALL FPDFText_FindNext(FPDF_SCHHANDLE handle);
+
+// Function: FPDFText_FindPrev
+// Search in the direction from page end to start.
+// Parameters:
+// handle - A search context handle returned by FPDFText_FindStart.
+// Return Value:
+// Whether a match is found.
+//
+DLLEXPORT FPDF_BOOL STDCALL FPDFText_FindPrev(FPDF_SCHHANDLE handle);
+
+// Function: FPDFText_GetSchResultIndex
+// Get the starting character index of the search result.
+// Parameters:
+// handle - A search context handle returned by FPDFText_FindStart.
+// Return Value:
+// Index for the starting character.
+//
+DLLEXPORT int STDCALL FPDFText_GetSchResultIndex(FPDF_SCHHANDLE handle);
+
+// Function: FPDFText_GetSchCount
+// Get the number of matched characters in the search result.
+// Parameters:
+// handle - A search context handle returned by FPDFText_FindStart.
+// Return Value:
+// Number of matched characters.
+//
+DLLEXPORT int STDCALL FPDFText_GetSchCount(FPDF_SCHHANDLE handle);
+
+// Function: FPDFText_FindClose
+// Release a search context.
+// Parameters:
+// handle - A search context handle returned by FPDFText_FindStart.
+// Return Value:
+// None.
+//
+DLLEXPORT void STDCALL FPDFText_FindClose(FPDF_SCHHANDLE handle);
+
+// Function: FPDFLink_LoadWebLinks
+// Prepare information about weblinks in a page.
+// Parameters:
+// text_page - Handle to a text page information structure. Returned by FPDFText_LoadPage function.
+// Return Value:
+// A handle to the page's links information structure.
+// NULL if something goes wrong.
+// Comments:
+// Weblinks are those links implicitly embedded in PDF pages. PDF also has a type of
+// annotation called "link", FPDFTEXT doesn't deal with that kind of link.
+// FPDFTEXT weblink feature is useful for automatically detecting links in the page
+// contents. For example, things like "http://www.foxitsoftware.com" will be detected,
+// so applications can allow user to click on those characters to activate the link,
+// even the PDF doesn't come with link annotations.
+//
+// FPDFLink_CloseWebLinks must be called to release resources.
+//
+DLLEXPORT FPDF_PAGELINK STDCALL FPDFLink_LoadWebLinks(FPDF_TEXTPAGE text_page);
+
+// Function: FPDFLink_CountWebLinks
+// Count number of detected web links.
+// Parameters:
+// link_page - Handle returned by FPDFLink_LoadWebLinks.
+// Return Value:
+// Number of detected web links.
+//
+DLLEXPORT int STDCALL FPDFLink_CountWebLinks(FPDF_PAGELINK link_page);
+
+// Function: FPDFLink_GetURL
+// Fetch the URL information for a detected web link.
+// Parameters:
+// link_page - Handle returned by FPDFLink_LoadWebLinks.
+// link_index - Zero-based index for the link.
+// buffer - A unicode buffer.
+// buflen - Number of characters (not bytes) for the buffer, including an additional terminator.
+// Return Value:
+// If buffer is NULL or buflen is zero, return number of characters (not bytes and an additional terminator is also counted) needed,
+// otherwise, return number of characters copied into the buffer.
+//
+DLLEXPORT int STDCALL FPDFLink_GetURL(FPDF_PAGELINK link_page, int link_index, unsigned short* buffer,int buflen);
+
+// Function: FPDFLink_CountRects
+// Count number of rectangular areas for the link.
+// Parameters:
+// link_page - Handle returned by FPDFLink_LoadWebLinks.
+// link_index - Zero-based index for the link.
+// Return Value:
+// Number of rectangular areas for the link.
+//
+DLLEXPORT int STDCALL FPDFLink_CountRects(FPDF_PAGELINK link_page, int link_index);
+
+// Function: FPDFLink_GetRect
+// Fetch the boundaries of a rectangle for a link.
+// Parameters:
+// link_page - Handle returned by FPDFLink_LoadWebLinks.
+// link_index - Zero-based index for the link.
+// rect_index - Zero-based index for a rectangle.
+// left - Pointer to a double value receiving the rectangle left boundary.
+// top - Pointer to a double value receiving the rectangle top boundary.
+// right - Pointer to a double value receiving the rectangle right boundary.
+// bottom - Pointer to a double value receiving the rectangle bottom boundary.
+// Return Value:
+// None.
+//
+DLLEXPORT void STDCALL FPDFLink_GetRect(FPDF_PAGELINK link_page, int link_index, int rect_index,
+ double* left, double* top,double* right, double* bottom);
+
+// Function: FPDFLink_CloseWebLinks
+// Release resources used by weblink feature.
+// Parameters:
+// link_page - Handle returned by FPDFLink_LoadWebLinks.
+// Return Value:
+// None.
+//
+DLLEXPORT void STDCALL FPDFLink_CloseWebLinks(FPDF_PAGELINK link_page);
+
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif//_FPDFTEXT_H_
diff --git a/fpdfsdk/include/fpdfview.h b/fpdfsdk/include/fpdfview.h new file mode 100644 index 0000000000..182d3cfdbd --- /dev/null +++ b/fpdfsdk/include/fpdfview.h @@ -0,0 +1,578 @@ +// 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 _FPDFVIEW_H_
+#define _FPDFVIEW_H_
+
+#if defined(_WIN32) && !defined(__WINDOWS__)
+#include <windows.h>
+#endif
+
+// Data types
+typedef void* FPDF_MODULEMGR;
+
+// PDF types
+typedef void* FPDF_DOCUMENT;
+typedef void* FPDF_PAGE;
+typedef void* FPDF_PAGEOBJECT; // Page object(text, path, etc)
+typedef void* FPDF_PATH;
+typedef void* FPDF_CLIPPATH;
+typedef void* FPDF_BITMAP;
+typedef void* FPDF_FONT;
+
+typedef void* FPDF_TEXTPAGE;
+typedef void* FPDF_SCHHANDLE;
+typedef void* FPDF_PAGELINK;
+typedef void* FPDF_HMODULE;
+typedef void* FPDF_DOCSCHHANDLE;
+
+typedef void* FPDF_BOOKMARK;
+typedef void* FPDF_DEST;
+typedef void* FPDF_ACTION;
+typedef void* FPDF_LINK;
+
+// Basic data types
+typedef int FPDF_BOOL;
+typedef int FPDF_ERROR;
+typedef unsigned long FPDF_DWORD;
+
+typedef float FS_FLOAT;
+
+// String types
+typedef unsigned short FPDF_WCHAR;
+typedef unsigned char const* FPDF_LPCBYTE;
+
+// FPDFSDK may use three types of strings: byte string, wide string (UTF-16LE encoded), and platform dependent string
+typedef const char* FPDF_BYTESTRING;
+
+typedef const unsigned short* FPDF_WIDESTRING; // Foxit PDF SDK always use UTF-16LE encoding wide string,
+ // each character use 2 bytes (except surrogation), with low byte first.
+
+// For Windows programmers: for most case it's OK to treat FPDF_WIDESTRING as Windows unicode string,
+// however, special care needs to be taken if you expect to process Unicode larger than 0xffff.
+// For Linux/Unix programmers: most compiler/library environment uses 4 bytes for a Unicode character,
+// you have to convert between FPDF_WIDESTRING and system wide string by yourself.
+
+#ifdef _WIN32_WCE
+typedef const unsigned short* FPDF_STRING;
+#else
+typedef const char* FPDF_STRING;
+#endif
+
+#ifndef _FS_DEF_MATRIX_
+#define _FS_DEF_MATRIX_
+/** @brief Matrix for transformation. */
+typedef struct _FS_MATRIX_
+{
+ float a; /**< @brief Coefficient a.*/
+ float b; /**< @brief Coefficient b.*/
+ float c; /**< @brief Coefficient c.*/
+ float d; /**< @brief Coefficient d.*/
+ float e; /**< @brief Coefficient e.*/
+ float f; /**< @brief Coefficient f.*/
+} FS_MATRIX;
+#endif
+
+#ifndef _FS_DEF_RECTF_
+#define _FS_DEF_RECTF_
+/** @brief Rectangle area(float) in device or page coordination system. */
+typedef struct _FS_RECTF_
+{
+ /**@{*/
+ /** @brief The x-coordinate of the left-top corner. */
+ float left;
+ /** @brief The y-coordinate of the left-top corner. */
+ float top;
+ /** @brief The x-coordinate of the right-bottom corner. */
+ float right;
+ /** @brief The y-coordinate of the right-bottom corner. */
+ float bottom;
+ /**@}*/
+}* FS_LPRECTF, FS_RECTF;
+/** @brief Const Pointer to ::FS_RECTF structure.*/
+typedef const FS_RECTF* FS_LPCRECTF;
+#endif
+
+#if defined(_WIN32) && defined(FPDFSDK_EXPORTS)
+// On Windows system, functions are exported in a DLL
+#define DLLEXPORT __declspec( dllexport )
+#define STDCALL __stdcall
+#else
+#define DLLEXPORT
+#define STDCALL
+#endif
+
+extern const char g_ExpireDate[];
+extern const char g_ModuleCodes[];
+
+// Exported Functions
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// Function: FPDF_InitLibrary
+// Initialize the FPDFSDK library
+// Parameters:
+// hInstance - For WIN32 system only: the instance of the executable or DLL module.
+// Return value:
+// None.
+// Comments:
+// You have to call this function before you can call any PDF processing functions.
+
+DLLEXPORT void STDCALL FPDF_InitLibrary(void* hInstance);
+
+
+// Function: FPDF_DestroyLibary
+// Release all resources allocated by the FPDFSDK library.
+// Parameters:
+// None.
+// Return value:
+// None.
+// Comments:
+// You can call this function to release all memory blocks allocated by the library.
+// After this function called, you should not call any PDF processing functions.
+DLLEXPORT void STDCALL FPDF_DestroyLibrary();
+
+//Policy for accessing the local machine time.
+#define FPDF_POLICY_MACHINETIME_ACCESS 0
+
+// Function: FPDF_SetSandBoxPolicy
+// Set the policy for the sandbox environment.
+// Parameters:
+// policy - The specified policy for setting, for example:FPDF_POLICY_MACHINETIME_ACCESS.
+// enable - True for enable, False for disable the policy.
+// Return value:
+// None.
+DLLEXPORT void STDCALL FPDF_SetSandBoxPolicy(FPDF_DWORD policy, FPDF_BOOL enable);
+
+/**
+* Open and load a PDF document.
+* @param[in] file_path - Path to the PDF file (including extension).
+* @param[in] password - A string used as the password for PDF file.
+* If no password needed, empty or NULL can be used.
+* @note Loaded document can be closed by FPDF_CloseDocument.
+* If this function fails, you can use FPDF_GetLastError() to retrieve
+* the reason why it fails.
+* @retval A handle to the loaded document. If failed, NULL is returned.
+*/
+DLLEXPORT FPDF_DOCUMENT STDCALL FPDF_LoadDocument(FPDF_STRING file_path,
+ FPDF_BYTESTRING password);
+
+// Function: FPDF_LoadMemDocument
+// Open and load a PDF document from memory.
+// Parameters:
+// data_buf - Pointer to a buffer containing the PDF document.
+// size - Number of bytes in the PDF document.
+// password - A string used as the password for PDF file.
+// If no password needed, empty or NULL can be used.
+// Return value:
+// A handle to the loaded document. If failed, NULL is returned.
+// Comments:
+// The memory buffer must remain valid when the document is open.
+// Loaded document can be closed by FPDF_CloseDocument.
+// If this function fails, you can use FPDF_GetLastError() to retrieve
+// the reason why it fails.
+//
+DLLEXPORT FPDF_DOCUMENT STDCALL FPDF_LoadMemDocument(const void* data_buf,
+ int size, FPDF_BYTESTRING password);
+
+// Structure for custom file access.
+typedef struct {
+ // File length, in bytes.
+ unsigned long m_FileLen;
+
+ // A function pointer for getting a block of data from specific position.
+ // Position is specified by byte offset from beginning of the file.
+ // The position and size will never go out range of file length.
+ // It may be possible for FPDFSDK to call this function multiple times for same position.
+ // Return value: should be non-zero if successful, zero for error.
+ int (*m_GetBlock)(void* param, unsigned long position, unsigned char* pBuf, unsigned long size);
+
+ // A custom pointer for all implementation specific data.
+ // This pointer will be used as the first parameter to m_GetBlock callback.
+ void* m_Param;
+} FPDF_FILEACCESS;
+
+// Function: FPDF_LoadCustomDocument
+// Load PDF document from a custom access descriptor.
+// Parameters:
+// pFileAccess - A structure for access the file.
+// password - Optional password for decrypting the PDF file.
+// Return value:
+// A handle to the loaded document. If failed, NULL is returned.
+// Comments:
+// The application should maintain the file resources being valid until the PDF document close.
+// Loaded document can be closed by FPDF_CloseDocument.
+DLLEXPORT FPDF_DOCUMENT STDCALL FPDF_LoadCustomDocument(FPDF_FILEACCESS* pFileAccess,
+ FPDF_BYTESTRING password);
+
+// Function: FPDF_GetFileVersion
+// Get the file version of the specific PDF document.
+// Parameters:
+// doc - Handle to document.
+// fileVersion - The PDF file version. File version: 14 for 1.4, 15 for 1.5, ...
+// Return value:
+// TRUE if this call succeed, If failed, FALSE is returned.
+// Comments:
+// If the document is created by function ::FPDF_CreateNewDocument, then this function would always fail.
+DLLEXPORT FPDF_BOOL STDCALL FPDF_GetFileVersion(FPDF_DOCUMENT doc, int* fileVersion);
+
+#define FPDF_ERR_SUCCESS 0 // No error.
+#define FPDF_ERR_UNKNOWN 1 // Unknown error.
+#define FPDF_ERR_FILE 2 // File not found or could not be opened.
+#define FPDF_ERR_FORMAT 3 // File not in PDF format or corrupted.
+#define FPDF_ERR_PASSWORD 4 // Password required or incorrect password.
+#define FPDF_ERR_SECURITY 5 // Unsupported security scheme.
+#define FPDF_ERR_PAGE 6 // Page not found or content error.
+
+// Function: FPDF_GetLastError
+// Get last error code when an SDK function failed.
+// Parameters:
+// None.
+// Return value:
+// A 32-bit integer indicating error codes (defined above).
+// Comments:
+// If the previous SDK call succeeded, the return value of this function
+// is not defined.
+//
+DLLEXPORT unsigned long STDCALL FPDF_GetLastError();
+
+// Function: FPDF_GetDocPermission
+// Get file permission flags of the document.
+// Parameters:
+// document - Handle to document. Returned by FPDF_LoadDocument function.
+// Return value:
+// A 32-bit integer indicating permission flags. Please refer to PDF Reference for
+// detailed description. If the document is not protected, 0xffffffff will be returned.
+//
+DLLEXPORT unsigned long STDCALL FPDF_GetDocPermissions(FPDF_DOCUMENT document);
+
+// Function: FPDF_GetPageCount
+// Get total number of pages in a document.
+// Parameters:
+// document - Handle to document. Returned by FPDF_LoadDocument function.
+// Return value:
+// Total number of pages in the document.
+//
+DLLEXPORT int STDCALL FPDF_GetPageCount(FPDF_DOCUMENT document);
+
+// Function: FPDF_LoadPage
+// Load a page inside a document.
+// Parameters:
+// document - Handle to document. Returned by FPDF_LoadDocument function.
+// page_index - Index number of the page. 0 for the first page.
+// Return value:
+// A handle to the loaded page. If failed, NULL is returned.
+// Comments:
+// Loaded page can be rendered to devices using FPDF_RenderPage function.
+// Loaded page can be closed by FPDF_ClosePage.
+//
+DLLEXPORT FPDF_PAGE STDCALL FPDF_LoadPage(FPDF_DOCUMENT document, int page_index);
+
+// Function: FPDF_GetPageWidth
+// Get page width.
+// Parameters:
+// page - Handle to the page. Returned by FPDF_LoadPage function.
+// Return value:
+// Page width (excluding non-displayable area) measured in points.
+// One point is 1/72 inch (around 0.3528 mm).
+//
+DLLEXPORT double STDCALL FPDF_GetPageWidth(FPDF_PAGE page);
+
+// Function: FPDF_GetPageHeight
+// Get page height.
+// Parameters:
+// page - Handle to the page. Returned by FPDF_LoadPage function.
+// Return value:
+// Page height (excluding non-displayable area) measured in points.
+// One point is 1/72 inch (around 0.3528 mm)
+//
+DLLEXPORT double STDCALL FPDF_GetPageHeight(FPDF_PAGE page);
+
+// Function: FPDF_GetPageSizeByIndex
+// Get the size of a page by index.
+// Parameters:
+// document - Handle to document. Returned by FPDF_LoadDocument function.
+// page_index - Page index, zero for the first page.
+// width - Pointer to a double value receiving the page width (in points).
+// height - Pointer to a double value receiving the page height (in points).
+// Return value:
+// Non-zero for success. 0 for error (document or page not found).
+//
+DLLEXPORT int STDCALL FPDF_GetPageSizeByIndex(FPDF_DOCUMENT document, int page_index, double* width, double* height);
+
+
+// Page rendering flags. They can be combined with bit OR.
+#define FPDF_ANNOT 0x01 // Set if annotations are to be rendered.
+#define FPDF_LCD_TEXT 0x02 // Set if using text rendering optimized for LCD display.
+#define FPDF_NO_NATIVETEXT 0x04 // Don't use the native text output available on some platforms
+#define FPDF_GRAYSCALE 0x08 // Grayscale output.
+#define FPDF_DEBUG_INFO 0x80 // Set if you want to get some debug info.
+ // Please discuss with Foxit first if you need to collect debug info.
+#define FPDF_NO_CATCH 0x100 // Set if you don't want to catch exception.
+#define FPDF_RENDER_LIMITEDIMAGECACHE 0x200 // Limit image cache size.
+#define FPDF_RENDER_FORCEHALFTONE 0x400 // Always use halftone for image stretching.
+#define FPDF_PRINTING 0x800 // Render for printing.
+#define FPDF_REVERSE_BYTE_ORDER 0x10 //set whether render in a reverse Byte order, this flag only
+ //enable when render to a bitmap.
+#ifdef _WIN32
+// Function: FPDF_RenderPage
+// Render contents in a page to a device (screen, bitmap, or printer).
+// This function is only supported on Windows system.
+// Parameters:
+// dc - Handle to device context.
+// page - Handle to the page. Returned by FPDF_LoadPage function.
+// start_x - Left pixel position of the display area in the device coordinate.
+// start_y - Top pixel position of the display area in the device coordinate.
+// size_x - Horizontal size (in pixels) for displaying the page.
+// size_y - Vertical size (in pixels) for displaying the page.
+// rotate - Page orientation: 0 (normal), 1 (rotated 90 degrees clockwise),
+// 2 (rotated 180 degrees), 3 (rotated 90 degrees counter-clockwise).
+// flags - 0 for normal display, or combination of flags defined above.
+// Return value:
+// None.
+//
+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);
+#endif
+
+// Function: FPDF_RenderPageBitmap
+// Render contents in a page to a device independent bitmap
+// Parameters:
+// bitmap - Handle to the device independent bitmap (as the output buffer).
+// Bitmap handle can be created by FPDFBitmap_Create function.
+// page - Handle to the page. Returned by FPDF_LoadPage function.
+// start_x - Left pixel position of the display area in the bitmap coordinate.
+// start_y - Top pixel position of the display area in the bitmap coordinate.
+// size_x - Horizontal size (in pixels) for displaying the page.
+// size_y - Vertical size (in pixels) for displaying the page.
+// rotate - Page orientation: 0 (normal), 1 (rotated 90 degrees clockwise),
+// 2 (rotated 180 degrees), 3 (rotated 90 degrees counter-clockwise).
+// flags - 0 for normal display, or combination of flags defined above.
+// Return value:
+// None.
+//
+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);
+
+// Function: FPDF_ClosePage
+// Close a loaded PDF page.
+// Parameters:
+// page - Handle to the loaded page.
+// Return value:
+// None.
+//
+DLLEXPORT void STDCALL FPDF_ClosePage(FPDF_PAGE page);
+
+// Function: FPDF_CloseDocument
+// Close a loaded PDF document.
+// Parameters:
+// document - Handle to the loaded document.
+// Return value:
+// None.
+//
+DLLEXPORT void STDCALL FPDF_CloseDocument(FPDF_DOCUMENT document);
+
+// Function: FPDF_DeviceToPage
+// Convert the screen coordinate of a point to page coordinate.
+// Parameters:
+// page - Handle to the page. Returned by FPDF_LoadPage function.
+// start_x - Left pixel position of the display area in the device coordinate.
+// start_y - Top pixel position of the display area in the device coordinate.
+// size_x - Horizontal size (in pixels) for displaying the page.
+// size_y - Vertical size (in pixels) for displaying the page.
+// rotate - Page orientation: 0 (normal), 1 (rotated 90 degrees clockwise),
+// 2 (rotated 180 degrees), 3 (rotated 90 degrees counter-clockwise).
+// device_x - X value in device coordinate, for the point to be converted.
+// device_y - Y value in device coordinate, for the point to be converted.
+// page_x - A Pointer to a double receiving the converted X value in page coordinate.
+// page_y - A Pointer to a double receiving the converted Y value in page coordinate.
+// Return value:
+// None.
+// Comments:
+// The page coordinate system has its origin at left-bottom corner of the page, with X axis goes along
+// the bottom side to the right, and Y axis goes along the left side upward. NOTE: this coordinate system
+// can be altered when you zoom, scroll, or rotate a page, however, a point on the page should always have
+// the same coordinate values in the page coordinate system.
+//
+// The device coordinate system is device dependent. For screen device, its origin is at left-top
+// corner of the window. However this origin can be altered by Windows coordinate transformation
+// utilities. You must make sure the start_x, start_y, size_x, size_y and rotate parameters have exactly
+// same values as you used in FPDF_RenderPage() function call.
+//
+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);
+
+// Function: FPDF_PageToDevice
+// Convert the page coordinate of a point to screen coordinate.
+// Parameters:
+// page - Handle to the page. Returned by FPDF_LoadPage function.
+// start_x - Left pixel position of the display area in the device coordinate.
+// start_y - Top pixel position of the display area in the device coordinate.
+// size_x - Horizontal size (in pixels) for displaying the page.
+// size_y - Vertical size (in pixels) for displaying the page.
+// rotate - Page orientation: 0 (normal), 1 (rotated 90 degrees clockwise),
+// 2 (rotated 180 degrees), 3 (rotated 90 degrees counter-clockwise).
+// page_x - X value in page coordinate, for the point to be converted.
+// page_y - Y value in page coordinate, for the point to be converted.
+// device_x - A pointer to an integer receiving the result X value in device coordinate.
+// device_y - A pointer to an integer receiving the result Y value in device coordinate.
+// Return value:
+// None.
+// Comments:
+// See comments of FPDF_DeviceToPage() function.
+//
+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);
+
+// Function: FPDFBitmap_Create
+// Create a Foxit Device Independent Bitmap (FXDIB).
+// Parameters:
+// width - Number of pixels in a horizontal line of the bitmap. Must be greater than 0.
+// height - Number of pixels in a vertical line of the bitmap. Must be greater than 0.
+// alpha - A flag indicating whether alpha channel is used. Non-zero for using alpha, zero for not using.
+// Return value:
+// The created bitmap handle, or NULL if parameter error or out of memory.
+// Comments:
+// An FXDIB always use 4 byte per pixel. The first byte of a pixel is always double word aligned.
+// Each pixel contains red (R), green (G), blue (B) and optionally alpha (A) values.
+// The byte order is BGRx (the last byte unused if no alpha channel) or BGRA.
+//
+// The pixels in a horizontal line (also called scan line) are stored side by side, with left most
+// pixel stored first (with lower memory address). Each scan line uses width*4 bytes.
+//
+// Scan lines are stored one after another, with top most scan line stored first. There is no gap
+// between adjacent scan lines.
+//
+// This function allocates enough memory for holding all pixels in the bitmap, but it doesn't
+// initialize the buffer. Applications can use FPDFBitmap_FillRect to fill the bitmap using any color.
+DLLEXPORT FPDF_BITMAP STDCALL FPDFBitmap_Create(int width, int height, int alpha);
+
+// More DIB formats
+#define FPDFBitmap_Gray 1 // Gray scale bitmap, one byte per pixel.
+#define FPDFBitmap_BGR 2 // 3 bytes per pixel, byte order: blue, green, red.
+#define FPDFBitmap_BGRx 3 // 4 bytes per pixel, byte order: blue, green, red, unused.
+#define FPDFBitmap_BGRA 4 // 4 bytes per pixel, byte order: blue, green, red, alpha.
+
+// Function: FPDFBitmap_CreateEx
+// Create a Foxit Device Independent Bitmap (FXDIB)
+// Parameters:
+// width - Number of pixels in a horizontal line of the bitmap. Must be greater than 0.
+// height - Number of pixels in a vertical line of the bitmap. Must be greater than 0.
+// format - A number indicating for bitmap format, as defined above.
+// first_scan - A pointer to the first byte of first scan line, for external buffer
+// only. If this parameter is NULL, then the SDK will create its own buffer.
+// stride - Number of bytes for each scan line, for external buffer only..
+// Return value:
+// The created bitmap handle, or NULL if parameter error or out of memory.
+// Comments:
+// Similar to FPDFBitmap_Create function, with more formats and external buffer supported.
+// Bitmap created by this function can be used in any place that a FPDF_BITMAP handle is
+// required.
+//
+// If external scanline buffer is used, then the application should destroy the buffer
+// by itself. FPDFBitmap_Destroy function will not destroy the buffer.
+//
+DLLEXPORT FPDF_BITMAP STDCALL FPDFBitmap_CreateEx(int width, int height, int format, void* first_scan, int stride);
+
+// Function: FPDFBitmap_FillRect
+// Fill a rectangle area in an FXDIB.
+// Parameters:
+// bitmap - The handle to the bitmap. Returned by FPDFBitmap_Create function.
+// left - The left side position. Starting from 0 at the left-most pixel.
+// top - The top side position. Starting from 0 at the top-most scan line.
+// width - Number of pixels to be filled in each scan line.
+// height - Number of scan lines to be filled.
+// red - A number from 0 to 255, identifying the red intensity.
+// green - A number from 0 to 255, identifying the green intensity.
+// blue - A number from 0 to 255, identifying the blue intensity.
+// alpha - (Only if the alpha channeled is used when bitmap created) A number from 0 to 255,
+// identifying the alpha value.
+// Return value:
+// None.
+// Comments:
+// This function set the color and (optionally) alpha value in specified region of the bitmap.
+// NOTE: If alpha channel is used, this function does NOT composite the background with the source color,
+// instead the background will be replaced by the source color and alpha.
+// If alpha channel is not used, the "alpha" parameter is ignored.
+//
+DLLEXPORT void STDCALL FPDFBitmap_FillRect(FPDF_BITMAP bitmap, int left, int top, int width, int height,
+ int red, int green, int blue, int alpha);
+
+// Function: FPDFBitmap_GetBuffer
+// Get data buffer of an FXDIB
+// Parameters:
+// bitmap - Handle to the bitmap. Returned by FPDFBitmap_Create function.
+// Return value:
+// The pointer to the first byte of the bitmap buffer.
+// Comments:
+// The stride may be more than width * number of bytes per pixel
+// Applications can use this function to get the bitmap buffer pointer, then manipulate any color
+// and/or alpha values for any pixels in the bitmap.
+DLLEXPORT void* STDCALL FPDFBitmap_GetBuffer(FPDF_BITMAP bitmap);
+
+// Function: FPDFBitmap_GetWidth
+// Get width of an FXDIB.
+// Parameters:
+// bitmap - Handle to the bitmap. Returned by FPDFBitmap_Create function.
+// Return value:
+// The number of pixels in a horizontal line of the bitmap.
+DLLEXPORT int STDCALL FPDFBitmap_GetWidth(FPDF_BITMAP bitmap);
+
+// Function: FPDFBitmap_GetHeight
+// Get height of an FXDIB.
+// Parameters:
+// bitmap - Handle to the bitmap. Returned by FPDFBitmap_Create function.
+// Return value:
+// The number of pixels in a vertical line of the bitmap.
+DLLEXPORT int STDCALL FPDFBitmap_GetHeight(FPDF_BITMAP bitmap);
+
+// Function: FPDFBitmap_GetStride
+// Get number of bytes for each scan line in the bitmap buffer.
+// Parameters:
+// bitmap - Handle to the bitmap. Returned by FPDFBitmap_Create function.
+// Return value:
+// The number of bytes for each scan line in the bitmap buffer.
+// Comments:
+// The stride may be more than width * number of bytes per pixel
+DLLEXPORT int STDCALL FPDFBitmap_GetStride(FPDF_BITMAP bitmap);
+
+// Function: FPDFBitmap_Destroy
+// Destroy an FXDIB and release all related buffers.
+// Parameters:
+// bitmap - Handle to the bitmap. Returned by FPDFBitmap_Create function.
+// Return value:
+// None.
+// Comments:
+// This function will not destroy any external buffer.
+//
+DLLEXPORT void STDCALL FPDFBitmap_Destroy(FPDF_BITMAP bitmap);
+
+// Function: FPDF_VIEWERREF_GetPrintScaling
+// Whether the PDF document prefers to be scaled or not.
+// Parameters:
+// document - Handle to the loaded document.
+// Return value:
+// None.
+//
+DLLEXPORT FPDF_BOOL STDCALL FPDF_VIEWERREF_GetPrintScaling(FPDF_DOCUMENT document);
+
+// Function: FPDF_GetNamedDestByName
+// get a special dest handle by the index.
+// Parameters:
+// document - Handle to the loaded document.
+// name - The name of a special named dest.
+// Return value:
+// The handle of the dest.
+//
+DLLEXPORT FPDF_DEST STDCALL FPDF_GetNamedDestByName(FPDF_DOCUMENT document,FPDF_BYTESTRING name);
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif // _FPDFVIEW_H_
diff --git a/fpdfsdk/include/fsdk_actionhandler.h b/fpdfsdk/include/fsdk_actionhandler.h new file mode 100644 index 0000000000..c93e679e79 --- /dev/null +++ b/fpdfsdk/include/fsdk_actionhandler.h @@ -0,0 +1,82 @@ +// 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 _FSDK_ACTIONHANDLER_H_
+#define _FSDK_ACTIONHANDLER_H_
+
+
+class CPDFDoc_Environment;
+class IFXJS_Runtime;
+
+class CPDFSDK_FormActionHandler
+{
+public:
+ FX_BOOL DoAction_Hide(const CPDF_Action& action, CPDFSDK_Document* pDocument);
+ FX_BOOL DoAction_SubmitForm(const CPDF_Action& action, CPDFSDK_Document* pDocument);
+ FX_BOOL DoAction_ResetForm(const CPDF_Action& action, CPDFSDK_Document* pDocument);
+ FX_BOOL DoAction_ImportData(const CPDF_Action& action, CPDFSDK_Document* pDocument);
+};
+
+class CPDFSDK_MediaActionHandler
+{
+public:
+ FX_BOOL DoAction_Rendition(const CPDF_Action& action, CPDFSDK_Document* pDocument);
+ FX_BOOL DoAction_Sound(const CPDF_Action& action, CPDFSDK_Document* pDocument);
+ FX_BOOL DoAction_Movie(const CPDF_Action& action, CPDFSDK_Document* pDocument);
+};
+
+class CPDFSDK_ActionHandler /*: public CReader_ActionHandler*/
+{
+public:
+ CPDFSDK_ActionHandler(CPDFDoc_Environment* pEvi);
+ virtual ~CPDFSDK_ActionHandler();
+
+ virtual void Destroy();
+ virtual FX_BOOL DoAction_DocOpen(const CPDF_Action& action, CPDFSDK_Document* pDocument/*, CPDFSDK_DocView *pDocView*/);
+ virtual FX_BOOL DoAction_JavaScript(const CPDF_Action& JsAction,CFX_WideString csJSName, CPDFSDK_Document* pDocument/*, CReader_DocView *pDocView*/);
+ virtual FX_BOOL DoAction_Page(const CPDF_Action& action, enum CPDF_AAction::AActionType eType, CPDFSDK_Document* pDocument/*, CReader_DocView *pDocView*/);
+ virtual FX_BOOL DoAction_Document(const CPDF_Action& action, enum CPDF_AAction::AActionType eType, CPDFSDK_Document* pDocument/*, CReader_DocView *pDocView*/);
+ virtual FX_BOOL DoAction_BookMark(CPDF_Bookmark *pBookMark, const CPDF_Action& action, CPDF_AAction::AActionType type, CPDFSDK_Document* pDocument/*, CReader_DocView *pDocView*/);
+ virtual FX_BOOL DoAction_Screen(const CPDF_Action& action, CPDF_AAction::AActionType type, CPDFSDK_Document* pDocument,/* CReader_DocView *pDocView,*/ CPDFSDK_Annot* pScreen);
+ virtual FX_BOOL DoAction_Link(const CPDF_Action& action, CPDFSDK_Document* pDocument/*, CReader_DocView *pDocView*/);
+ virtual FX_BOOL DoAction_Field(const CPDF_Action& action, CPDF_AAction::AActionType type, CPDFSDK_Document* pDocument, /*CReader_DocView *pDocView,*/ CPDF_FormField* pFormField, PDFSDK_FieldAction& data);
+ virtual FX_BOOL DoAction_FieldJavaScript(const CPDF_Action& JsAction, CPDF_AAction::AActionType type, CPDFSDK_Document* pDocument, CPDF_FormField* pFormField, PDFSDK_FieldAction& data);
+public:
+ void SetFormActionHandler(CPDFSDK_FormActionHandler* pHandler);
+ void SetMediaActionHandler(CPDFSDK_MediaActionHandler* pHandler);
+
+private:
+ FX_BOOL ExecuteDocumentOpenAction(const CPDF_Action& action, CPDFSDK_Document* pDocument, /*CReader_DocView *pDocView,*/ CFX_PtrList& list);
+ FX_BOOL ExecuteDocumentPageAction(const CPDF_Action& action, CPDF_AAction::AActionType type, CPDFSDK_Document* pDocument, /*CReader_DocView *pDocView,*/ CFX_PtrList& list);
+ FX_BOOL ExecuteFieldAction(const CPDF_Action& action, CPDF_AAction::AActionType type, CPDFSDK_Document* pDocument, /*CReader_DocView* pDocView,*/ CPDF_FormField* pFormField, PDFSDK_FieldAction& data, CFX_PtrList& list);
+ FX_BOOL ExecuteScreenAction(const CPDF_Action& action, CPDF_AAction::AActionType type, CPDFSDK_Document* pDocument, /*CReader_DocView* pDocView,*/ CPDFSDK_Annot* pScreen, CFX_PtrList& list);
+ FX_BOOL ExecuteBookMark(const CPDF_Action& action, CPDFSDK_Document* pDocument, /*CReader_DocView* pDocView,*/ CPDF_Bookmark* pBookmark, CFX_PtrList& list);
+ FX_BOOL ExecuteLinkAction(const CPDF_Action& action, CPDFSDK_Document* pDocument, /*CReader_DocView* pDocView,*/ CFX_PtrList& list);
+
+ void DoAction_NoJs(const CPDF_Action& action, CPDFSDK_Document* pDocument/*, CReader_DocView* pDocView*/);
+ void RunDocumentPageJavaScript(CPDFSDK_Document* pDocument, CPDF_AAction::AActionType type, const CFX_WideString& script);
+ void RunDocumentOpenJavaScript(CPDFSDK_Document* pDocument, const CFX_WideString& sScriptName, const CFX_WideString& script);
+ void RunFieldJavaScript(CPDFSDK_Document* pDocument, CPDF_FormField* pFormField, CPDF_AAction::AActionType type, PDFSDK_FieldAction& data, const CFX_WideString& script);
+
+private:
+ FX_BOOL IsValidField(CPDFSDK_Document* pDocument, CPDF_Dictionary* pFieldDict);
+ FX_BOOL IsValidDocView(CPDFSDK_Document* pDocument/*, CReader_DocView* pDocView*/);
+
+ void DoAction_GoTo(CPDFSDK_Document* pDocument, /*CReader_DocView *pDocView,*/ const CPDF_Action& action);
+ void DoAction_GoToR(CPDFSDK_Document* pDocument, const CPDF_Action& action);
+ void DoAction_Launch(CPDFSDK_Document* pDocument, const CPDF_Action& action);
+ void DoAction_URI(CPDFSDK_Document* pDocument, const CPDF_Action& action);
+ void DoAction_Named(CPDFSDK_Document* pDocument, const CPDF_Action& action);
+ void DoAction_SetOCGState(CPDFSDK_Document* pDocument, /*CReader_DocView* pDocView,*/ const CPDF_Action& action);
+
+private:
+ CPDFDoc_Environment* m_pEvi;
+ CPDFSDK_FormActionHandler* m_pFormActionHandler;
+ CPDFSDK_MediaActionHandler* m_pMediaActionHandler;
+};
+
+#endif //_BA_ACTIONHANDLER_H_
+
diff --git a/fpdfsdk/include/fsdk_annothandler.h b/fpdfsdk/include/fsdk_annothandler.h new file mode 100644 index 0000000000..dc2e40a9c7 --- /dev/null +++ b/fpdfsdk/include/fsdk_annothandler.h @@ -0,0 +1,248 @@ +// 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 _FSDK_ANNOTHANDLER_H_
+#define _FSDK_ANNOTHANDLER_H_
+
+
+class CPDFDoc_Environment;
+class CFFL_IFormFiller;
+class CPDFSDK_PageView;
+class IPDFSDK_AnnotHandler
+{
+
+public:
+ virtual ~IPDFSDK_AnnotHandler() {};
+
+ virtual CFX_ByteString GetType() = 0;
+
+ virtual CFX_ByteString GetName() = 0;
+
+ virtual FX_BOOL CanAnswer(CPDFSDK_Annot* pAnnot) = 0;
+
+
+ virtual CPDFSDK_Annot* NewAnnot(CPDF_Annot* pAnnot, CPDFSDK_PageView* pPage) = 0;
+
+ virtual void ReleaseAnnot(CPDFSDK_Annot* pAnnot) = 0;
+
+ virtual void DeleteAnnot(CPDFSDK_Annot* pAnnot) = 0;
+
+
+ virtual CPDF_Rect GetViewBBox(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot) = 0;
+
+ virtual FX_BOOL HitTest(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, const CPDF_Point& point) = 0;
+
+
+ virtual void OnDraw(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot,
+ CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
+ FX_DWORD dwFlags) = 0;
+
+ virtual void OnDrawSleep(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot,
+ CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
+ const CPDF_Rect& rcWindow, FX_DWORD dwFlags) = 0;
+
+
+
+
+ virtual void OnCreate(CPDFSDK_Annot* pAnnot) = 0;
+
+ virtual void OnLoad(CPDFSDK_Annot* pAnnot) = 0;
+
+ virtual void OnDelete(CPDFSDK_Annot* pAnnot) = 0;
+
+ virtual void OnRelease(CPDFSDK_Annot* pAnnot) = 0;
+
+
+ virtual void OnMouseEnter(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlag) = 0;
+ virtual void OnMouseExit(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlag) = 0;
+
+
+ virtual FX_BOOL OnLButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) = 0;
+ virtual FX_BOOL OnLButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) = 0;
+ virtual FX_BOOL OnLButtonDblClk(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) = 0;
+ virtual FX_BOOL OnMouseMove(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) = 0;
+ virtual FX_BOOL OnMouseWheel(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, short zDelta, const CPDF_Point& point) = 0;
+ virtual FX_BOOL OnRButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) = 0;
+ virtual FX_BOOL OnRButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) = 0;
+ virtual FX_BOOL OnRButtonDblClk(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) = 0;
+//by wjm.
+ virtual FX_BOOL OnChar(CPDFSDK_Annot* pAnnot, FX_DWORD nChar, FX_DWORD nFlags) = 0;
+ virtual FX_BOOL OnKeyDown(CPDFSDK_Annot* pAnnot, int nKeyCode, int nFlag) = 0;
+ virtual FX_BOOL OnKeyUp(CPDFSDK_Annot* pAnnot, int nKeyCode, int nFlag) =0 ;
+
+ virtual void OnDeSelected(CPDFSDK_Annot* pAnnot) = 0;
+ virtual void OnSelected(CPDFSDK_Annot* pAnnot) = 0;
+
+ virtual FX_BOOL OnSetFocus(CPDFSDK_Annot* pAnnot, FX_DWORD nFlag) = 0;
+ virtual FX_BOOL OnKillFocus(CPDFSDK_Annot* pAnnot, FX_DWORD nFlag) = 0;
+
+};
+
+
+class CPDFSDK_BFAnnotHandler:public IPDFSDK_AnnotHandler
+{
+public:
+ CPDFSDK_BFAnnotHandler(CPDFDoc_Environment* pApp):m_pFormFiller(NULL),m_pApp(pApp) {}
+ virtual ~CPDFSDK_BFAnnotHandler() {}
+public:
+
+ virtual CFX_ByteString GetType() {return CFX_ByteString("Widget");}
+
+ virtual CFX_ByteString GetName() {return CFX_ByteString("WidgetHandler");}
+
+ virtual FX_BOOL CanAnswer(CPDFSDK_Annot* pAnnot);
+
+ virtual CPDFSDK_Annot* NewAnnot(CPDF_Annot* pAnnot, CPDFSDK_PageView* pPage);
+
+ virtual void ReleaseAnnot(CPDFSDK_Annot* pAnnot) ;
+
+ virtual void DeleteAnnot(CPDFSDK_Annot* pAnnot) {}
+
+
+ virtual CPDF_Rect GetViewBBox(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot) ;
+
+ virtual FX_BOOL HitTest(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, const CPDF_Point& point);
+
+
+ virtual void OnDraw(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot,
+ CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
+ FX_DWORD dwFlags) ;
+
+ virtual void OnDrawSleep(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot,
+ CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
+ const CPDF_Rect& rcWindow, FX_DWORD dwFlags) {}
+
+
+ virtual void OnCreate(CPDFSDK_Annot* pAnnot) ;
+
+ virtual void OnLoad(CPDFSDK_Annot* pAnnot) ;
+
+ virtual void OnDelete(CPDFSDK_Annot* pAnnot) {}
+
+ virtual void OnRelease(CPDFSDK_Annot* pAnnot) {}
+
+
+ virtual void OnMouseEnter(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlag) ;
+ virtual void OnMouseExit(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlag) ;
+
+
+ virtual FX_BOOL OnLButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) ;
+ virtual FX_BOOL OnLButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) ;
+ virtual FX_BOOL OnLButtonDblClk(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) ;
+ virtual FX_BOOL OnMouseMove(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) ;
+ virtual FX_BOOL OnMouseWheel(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, short zDelta, const CPDF_Point& point) ;
+ virtual FX_BOOL OnRButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) ;
+ virtual FX_BOOL OnRButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) ;
+ virtual FX_BOOL OnRButtonDblClk(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) {return FALSE;}
+
+//by wjm.
+ virtual FX_BOOL OnChar(CPDFSDK_Annot* pAnnot, FX_DWORD nChar, FX_DWORD nFlags);
+ virtual FX_BOOL OnKeyDown(CPDFSDK_Annot* pAnnot, int nKeyCode, int nFlag);
+ virtual FX_BOOL OnKeyUp(CPDFSDK_Annot* pAnnot, int nKeyCode, int nFlag);
+
+ virtual void OnDeSelected(CPDFSDK_Annot* pAnnot) {}
+ virtual void OnSelected(CPDFSDK_Annot* pAnnot) {}
+
+ virtual FX_BOOL OnSetFocus(CPDFSDK_Annot* pAnnot, FX_DWORD nFlag);
+ virtual FX_BOOL OnKillFocus(CPDFSDK_Annot* pAnnot, FX_DWORD nFlag);
+
+ void SetFormFiller(CFFL_IFormFiller* pFiller){m_pFormFiller = pFiller;}
+ CFFL_IFormFiller* GetFormFiller() {return m_pFormFiller;}
+private:
+
+ CPDFDoc_Environment* m_pApp;
+ CFFL_IFormFiller* m_pFormFiller;
+};
+
+#define CBA_AnnotHandlerArray CFX_ArrayTemplate<IPDFSDK_AnnotHandler*>
+class CPDFSDK_AnnotHandlerMgr
+{
+public:
+ // Destroy the handler
+ CPDFSDK_AnnotHandlerMgr(CPDFDoc_Environment* pApp);
+ virtual ~CPDFSDK_AnnotHandlerMgr() ;
+
+public:
+ void RegisterAnnotHandler(IPDFSDK_AnnotHandler* pAnnotHandler);
+ void UnRegisterAnnotHandler(IPDFSDK_AnnotHandler* pAnnotHandler);
+
+ virtual CPDFSDK_Annot* NewAnnot(CPDF_Annot * pAnnot, CPDFSDK_PageView *pPageView);
+ virtual void ReleaseAnnot(CPDFSDK_Annot * pAnnot);
+
+ virtual void Annot_OnCreate(CPDFSDK_Annot* pAnnot);
+ virtual void Annot_OnLoad(CPDFSDK_Annot* pAnnot);
+public:
+ IPDFSDK_AnnotHandler* GetAnnotHandler(CPDFSDK_Annot* pAnnot) const;
+ virtual void Annot_OnDraw(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot,
+ CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,FX_DWORD dwFlags);
+
+ virtual void Annot_OnMouseEnter(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags);
+ virtual void Annot_OnMouseExit(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags);
+
+ virtual FX_BOOL Annot_OnLButtonDown(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point);
+ virtual FX_BOOL Annot_OnLButtonUp(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point);
+ virtual FX_BOOL Annot_OnLButtonDblClk(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point);
+
+ virtual FX_BOOL Annot_OnMouseMove(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point);
+ virtual FX_BOOL Annot_OnMouseWheel(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, short zDelta, const CPDF_Point& point);
+ virtual FX_BOOL Annot_OnRButtonDown(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point);
+ virtual FX_BOOL Annot_OnRButtonUp(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point);
+
+
+ virtual FX_BOOL Annot_OnChar(CPDFSDK_Annot* pAnnot, FX_DWORD nChar, FX_DWORD nFlags);
+ virtual FX_BOOL Annot_OnKeyDown(CPDFSDK_Annot* pAnnot, int nKeyCode, int nFlag);
+ virtual FX_BOOL Annot_OnKeyUp(CPDFSDK_Annot* pAnnot, int nKeyCode, int nFlag);
+
+ virtual FX_BOOL Annot_OnSetFocus(CPDFSDK_Annot* pAnnot, FX_DWORD nFlag);
+ virtual FX_BOOL Annot_OnKillFocus(CPDFSDK_Annot* pAnnot, FX_DWORD nFlag);
+
+ virtual CPDF_Rect Annot_OnGetViewBBox(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot);
+ virtual FX_BOOL Annot_OnHitTest(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, const CPDF_Point& point);
+
+private:
+ IPDFSDK_AnnotHandler* GetAnnotHandler(const CFX_ByteString& sType) const;
+ CPDFSDK_Annot* GetNextAnnot(CPDFSDK_Annot* pSDKAnnot,FX_BOOL bNext);
+private:
+ CBA_AnnotHandlerArray m_Handlers;
+ CFX_MapByteStringToPtr m_mapType2Handler;
+ CPDFDoc_Environment* m_pApp;
+};
+
+//#define CBF_Page2Accessible CFX_MapPtrTemplate<CPDFSDK_PageView*, IAccessible*>
+
+typedef int (*AI_COMPARE) (CPDFSDK_Annot* p1, CPDFSDK_Annot* p2);
+
+class CPDFSDK_AnnotIterator
+{
+protected:
+ CPDFSDK_Annot* NextAnnot (const CPDFSDK_Annot* pCurrent) ;
+ CPDFSDK_Annot* PrevAnnot (const CPDFSDK_Annot* pCurrent) ;
+ CPDFSDK_Annot* NextAnnot(int& index ) ;
+ CPDFSDK_Annot* PrevAnnot(int& index ) ;
+public:
+ CPDFSDK_AnnotIterator(CPDFSDK_PageView * pPageView, FX_BOOL bReverse,
+ FX_BOOL bIgnoreTopmost=FALSE,FX_BOOL bCircle=FALSE,CFX_PtrArray* pList=NULL);
+ virtual CPDFSDK_Annot* Next (const CPDFSDK_Annot* pCurrent) ;
+ virtual CPDFSDK_Annot* Prev (const CPDFSDK_Annot* pCurrent) ;
+ virtual CPDFSDK_Annot* Next(int& index ) ;
+ virtual CPDFSDK_Annot* Prev(int& index ) ;
+ virtual int Count(){return m_pIteratorAnnotList.GetSize();}
+
+ virtual FX_BOOL InitIteratorAnnotList(CPDFSDK_PageView * pPageView,CFX_PtrArray* pList=NULL);
+
+ void InsertSort(CFX_PtrArray &arrayList, AI_COMPARE pCompare);
+protected:
+ // CFX_PtrList m_pIteratorAnnotList;
+ CFX_PtrArray m_pIteratorAnnotList;
+ FX_BOOL m_bReverse;
+ FX_BOOL m_bIgnoreTopmost;
+ FX_BOOL m_bCircle;
+};
+
+
+
+#endif
+
diff --git a/fpdfsdk/include/fsdk_baseannot.h b/fpdfsdk/include/fsdk_baseannot.h new file mode 100644 index 0000000000..b6cadb7e5d --- /dev/null +++ b/fpdfsdk/include/fsdk_baseannot.h @@ -0,0 +1,186 @@ +// 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 _FSDK_BASEANNOT_H_
+#define _FSDK_BASEANNOT_H_
+
+#if _FX_OS_ == _FX_ANDROID_
+#include "time.h"
+#else
+#include <ctime>
+#endif
+
+class CPDFSDK_PageView;
+#define CFX_IntArray CFX_ArrayTemplate<int>
+
+class CPDFSDK_DateTime : public CFX_Object
+{
+public:
+ CPDFSDK_DateTime();
+ CPDFSDK_DateTime(const CFX_ByteString& dtStr);
+ CPDFSDK_DateTime(const CPDFSDK_DateTime& datetime);
+ CPDFSDK_DateTime(const FX_SYSTEMTIME& st);
+
+
+ CPDFSDK_DateTime& operator = (const CPDFSDK_DateTime& datetime);
+ CPDFSDK_DateTime& operator = (const FX_SYSTEMTIME& st);
+ FX_BOOL operator == (CPDFSDK_DateTime& datetime);
+ FX_BOOL operator != (CPDFSDK_DateTime& datetime);
+ FX_BOOL operator > (CPDFSDK_DateTime& datetime);
+ FX_BOOL operator >= (CPDFSDK_DateTime& datetime);
+ FX_BOOL operator < (CPDFSDK_DateTime& datetime);
+ FX_BOOL operator <= (CPDFSDK_DateTime& datetime);
+ operator time_t();
+
+ CPDFSDK_DateTime& FromPDFDateTimeString(const CFX_ByteString& dtStr);
+ CFX_ByteString ToCommonDateTimeString();
+ CFX_ByteString ToPDFDateTimeString();
+ void ToSystemTime(FX_SYSTEMTIME& st);
+ CPDFSDK_DateTime ToGMT();
+ CPDFSDK_DateTime& AddDays(short days);
+ CPDFSDK_DateTime& AddSeconds(int seconds);
+
+ void ResetDateTime();
+
+ struct FX_DATETIME
+ {
+ FX_SHORT year;
+ FX_BYTE month;
+ FX_BYTE day;
+ FX_BYTE hour;
+ FX_BYTE minute;
+ FX_BYTE second;
+ FX_CHAR tzHour;
+ FX_BYTE tzMinute;
+ }dt;
+};
+
+class CPDFSDK_Annot
+{
+public:
+ CPDFSDK_Annot(CPDF_Annot* pAnnot, CPDFSDK_PageView* pPageView);
+ virtual ~CPDFSDK_Annot();
+public:
+ virtual FX_FLOAT GetMinWidth() const;
+ virtual FX_FLOAT GetMinHeight() const;
+ //define layout order to 5.
+ virtual int GetLayoutOrder() const { return 5; }
+
+public:
+ CPDF_Annot* GetPDFAnnot();
+
+ void SetPage(CPDFSDK_PageView* pPageView);
+ CPDFSDK_PageView* GetPageView();
+ FX_DWORD GetFlags();
+
+ // Tab Order
+ int GetTabOrder();
+ void SetTabOrder(int iTabOrder);
+
+ // Selection
+ FX_BOOL IsSelected();
+ void SetSelected(FX_BOOL bSelected);
+
+ CFX_ByteString GetType() const;
+ virtual CFX_ByteString GetSubType() const;
+
+ CPDF_Page* GetPDFPage();
+
+public:
+ CPDF_Dictionary* GetAnnotDict() const;
+
+ void SetRect(const CPDF_Rect& rect);
+ CPDF_Rect GetRect() const;
+
+ void SetContents(const CFX_WideString& sContents);
+ CFX_WideString GetContents() const;
+
+ void SetAnnotName(const CFX_WideString& sName);
+ CFX_WideString GetAnnotName() const;
+
+ void SetModifiedDate(const FX_SYSTEMTIME& st);
+ FX_SYSTEMTIME GetModifiedDate() const;
+
+ void SetFlags(int nFlags);
+ int GetFlags() const;
+
+ void SetAppState(const CFX_ByteString& str);
+ CFX_ByteString GetAppState() const;
+
+ void SetStructParent(int key);
+ int GetStructParent() const;
+
+ //border
+ void SetBorderWidth(int nWidth);
+ int GetBorderWidth() const;
+
+ //BBS_SOLID
+ //BBS_DASH
+ //BBS_BEVELED
+ //BBS_INSET
+ //BBS_UNDERLINE
+
+ void SetBorderStyle(int nStyle);
+ int GetBorderStyle() const;
+
+ void SetBorderDash(const CFX_IntArray& array);
+ void GetBorderDash(CFX_IntArray& array) const;
+
+ //The background of the annotation's icon when closed
+ //The title bar of the annotation's pop-up window
+ //The border of a link annotation
+
+ void SetColor(FX_COLORREF color);
+ void RemoveColor();
+ FX_BOOL GetColor(FX_COLORREF& color) const;
+
+ FX_BOOL IsVisible() const;
+ //action
+
+ CPDF_Action GetAction() const;
+ void SetAction(const CPDF_Action& a);
+ void RemoveAction();
+
+ CPDF_AAction GetAAction() const;
+ void SetAAction(const CPDF_AAction& aa);
+ void RemoveAAction();
+
+ virtual CPDF_Action GetAAction(CPDF_AAction::AActionType eAAT);
+
+public:
+ FX_BOOL IsAppearanceValid();
+ FX_BOOL IsAppearanceValid(CPDF_Annot::AppearanceMode mode);
+ void DrawAppearance(CFX_RenderDevice* pDevice, const CPDF_Matrix* pUser2Device,
+ CPDF_Annot::AppearanceMode mode, const CPDF_RenderOptions* pOptions);
+ void DrawBorder(CFX_RenderDevice* pDevice, const CPDF_Matrix* pUser2Device,
+ const CPDF_RenderOptions* pOptions);
+
+ void ClearCachedAP();
+
+ virtual void ResetAppearance();
+ void WriteAppearance(const CFX_ByteString& sAPType, const CPDF_Rect& rcBBox,
+ const CPDF_Matrix& matrix, const CFX_ByteString& sContents,
+ const CFX_ByteString& sAPState = "");
+
+public:
+ virtual void Annot_OnDraw(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,CPDF_RenderOptions* pOptions);
+public:
+
+
+private:
+ FX_BOOL CreateFormFiller();
+protected:
+ CPDF_Annot* m_pAnnot;
+ CPDFSDK_PageView* m_pPageView;
+ FX_BOOL m_bSelected;
+ int m_nTabOrder;
+
+};
+
+
+
+#endif
+
diff --git a/fpdfsdk/include/fsdk_baseform.h b/fpdfsdk/include/fsdk_baseform.h new file mode 100644 index 0000000000..baa1c28485 --- /dev/null +++ b/fpdfsdk/include/fsdk_baseform.h @@ -0,0 +1,292 @@ +// 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 _FSDK_BASEFORM_H_
+#define _FSDK_BASEFORM_H_
+
+#if _FX_OS_ == _FX_ANDROID_
+#include "time.h"
+#else
+#include <ctime>
+#endif
+
+class CPDFSDK_Document;
+class CPDFSDK_DateTime;
+struct CPWL_Color;
+class CFFL_FormFiller;
+class CPDFSDK_PageView;
+class CPDFSDK_InterForm;
+
+
+typedef struct _PDFSDK_FieldAction
+{
+ _PDFSDK_FieldAction()
+ {
+ bModifier = FALSE;
+ bShift = FALSE;
+ nCommitKey = 0;
+ bKeyDown = FALSE;
+ nSelEnd = nSelStart = 0;
+ bWillCommit = FALSE;
+ bFieldFull = FALSE;
+ bRC = TRUE;
+ }
+
+ FX_BOOL bModifier; //in
+ FX_BOOL bShift; //in
+ int nCommitKey; //in
+ CFX_WideString sChange; //in[out]
+ CFX_WideString sChangeEx; //in
+ FX_BOOL bKeyDown; //in
+ int nSelEnd; //in[out]
+ int nSelStart; //in[out]
+ CFX_WideString sValue; //in[out]
+ FX_BOOL bWillCommit; //in
+ FX_BOOL bFieldFull; //in
+ FX_BOOL bRC; //in[out]
+}PDFSDK_FieldAction;
+class CPDFSDK_Widget:public CPDFSDK_Annot
+{
+public:
+ CPDFSDK_Widget(CPDF_Annot* pAnnot, CPDFSDK_PageView* pPageView, CPDFSDK_InterForm* pInterForm);
+ virtual ~CPDFSDK_Widget();
+
+ virtual CFX_ByteString GetSubType() const;
+
+ virtual CPDF_Action GetAAction(CPDF_AAction::AActionType eAAT);
+
+ int GetFieldType() const;
+ //define layout order to 2.
+ virtual int GetLayoutOrder() {return 2;}
+ /*
+ FIELDFLAG_READONLY
+ FIELDFLAG_REQUIRED
+ FIELDFLAG_NOEXPORT
+ */
+
+ int GetFieldFlags() const;
+ int GetRotate() const;
+
+ FX_BOOL GetFillColor(FX_COLORREF& color) const;
+ FX_BOOL GetBorderColor(FX_COLORREF& color) const;
+ FX_BOOL GetTextColor(FX_COLORREF& color) const;
+ FX_FLOAT GetFontSize() const;
+
+ int GetSelectedIndex(int nIndex) const;
+ CFX_WideString GetValue() const;
+ CFX_WideString GetDefaultValue() const;
+ CFX_WideString GetOptionLabel(int nIndex) const;
+ int CountOptions() const;
+ FX_BOOL IsOptionSelected(int nIndex) const;
+ int GetTopVisibleIndex() const;
+ FX_BOOL IsChecked() const;
+ /*
+ BF_ALIGN_LEFT
+ BF_ALIGN_MIDDL
+ BF_ALIGN_RIGHT
+ */
+ int GetAlignment() const;
+ int GetMaxLen() const;
+ CFX_WideString GetAlternateName() const;
+
+//Set Properties.
+ void SetCheck(FX_BOOL bChecked, FX_BOOL bNotify);
+ void SetValue(const CFX_WideString& sValue, FX_BOOL bNotify);
+ void SetDefaultValue(const CFX_WideString& sValue);
+ void SetOptionSelection(int index, FX_BOOL bSelected, FX_BOOL bNotify);
+ void ClearSelection(FX_BOOL bNotify);
+ void SetTopVisibleIndex(int index);
+
+ void ResetAppearance(FX_LPCWSTR sValue, FX_BOOL bValueChanged);
+ void ResetFieldAppearance(FX_BOOL bValueChanged);
+ void UpdateField();
+ CFX_WideString OnFormat(int nCommitKey, FX_BOOL& bFormated);
+
+//Message.
+ FX_BOOL OnAAction(CPDF_AAction::AActionType type, PDFSDK_FieldAction& data,
+ CPDFSDK_PageView* pPageView);
+
+ CPDFSDK_InterForm* GetInterForm() const {return m_pInterForm;}
+ CPDF_FormField* GetFormField() const;
+ CPDF_FormControl* GetFormControl() const;
+ static CPDF_FormControl* GetFormControl(CPDF_InterForm* pInterForm, CPDF_Dictionary* pAnnotDict);
+
+ void DrawShadow(CFX_RenderDevice* pDevice, CPDFSDK_PageView* pPageView);
+
+ void SetAppModified();
+ void ClearAppModified();
+ FX_BOOL IsAppModified() const;
+
+ FX_INT32 GetAppearanceAge() const;
+ FX_INT32 GetValueAge() const;
+
+private:
+ void ResetAppearance_PushButton();
+ void ResetAppearance_CheckBox();
+ void ResetAppearance_RadioButton();
+ void ResetAppearance_ComboBox(FX_LPCWSTR sValue);
+ void ResetAppearance_ListBox();
+ void ResetAppearance_TextField(FX_LPCWSTR sValue);
+
+ CPDF_Rect GetClientRect() const;
+ CPDF_Rect GetRotatedRect() const;
+
+ CFX_ByteString GetBackgroundAppStream() const;
+ CFX_ByteString GetBorderAppStream() const;
+ CPDF_Matrix GetMatrix() const;
+
+ CPWL_Color GetTextPWLColor() const;
+ CPWL_Color GetBorderPWLColor() const;
+ CPWL_Color GetFillPWLColor() const;
+
+ void AddImageToAppearance(const CFX_ByteString& sAPType, CPDF_Stream* pImage);
+ void RemoveAppearance(const CFX_ByteString& sAPType);
+public:
+ FX_BOOL IsWidgetAppearanceValid(CPDF_Annot::AppearanceMode mode);
+ void DrawAppearance(CFX_RenderDevice* pDevice, const CPDF_Matrix* pUser2Device,
+ CPDF_Annot::AppearanceMode mode, const CPDF_RenderOptions* pOptions);
+public:
+ FX_BOOL HitTest(FX_FLOAT pageX, FX_FLOAT pageY);
+private:
+ CPDFSDK_InterForm* m_pInterForm;
+ FX_BOOL m_bAppModified;
+ FX_INT32 m_nAppAge;
+ FX_INT32 m_nValueAge;
+};
+
+#define CPDFSDK_WidgetMap CFX_MapPtrTemplate<CPDF_FormControl*, CPDFSDK_Widget*>
+
+class CPDFSDK_InterForm : public CPDF_FormNotify
+{
+public:
+ CPDFSDK_InterForm(CPDFSDK_Document* pDocument);
+ virtual ~CPDFSDK_InterForm();
+
+public:
+ virtual void Destroy();
+ virtual CPDF_InterForm* GetInterForm();
+
+ CPDFSDK_Document* GetDocument();
+ FX_BOOL HighlightWidgets();
+
+ CPDFSDK_Widget* GetSibling(CPDFSDK_Widget* pWidget, FX_BOOL bNext) const;
+ CPDFSDK_Widget* GetWidget(CPDF_FormControl* pControl) const;
+ void GetWidgets(const CFX_WideString& sFieldName, CFX_PtrArray& widgets);
+ void GetWidgets(CPDF_FormField* pField, CFX_PtrArray& widgets);
+
+ void AddMap(CPDF_FormControl* pControl, CPDFSDK_Widget* pWidget);
+ void RemoveMap(CPDF_FormControl* pControl);
+
+ void EnableCalculate(FX_BOOL bEnabled);
+ FX_BOOL IsCalculateEnabled() const;
+
+#ifdef _WIN32
+ CPDF_Stream* LoadImageFromFile(const CFX_WideString& sFile);
+#endif
+
+ void OnKeyStrokeCommit(CPDF_FormField* pFormField, CFX_WideString& csValue, FX_BOOL& bRC);
+ void OnValidate(CPDF_FormField* pFormField, CFX_WideString& csValue, FX_BOOL& bRC);
+ void OnCalculate(CPDF_FormField* pFormField = NULL);
+ CFX_WideString OnFormat(CPDF_FormField* pFormField, int nCommitKey, FX_BOOL& bFormated);
+
+ void ResetFieldAppearance(CPDF_FormField* pFormField, FX_LPCWSTR sValue, FX_BOOL bValueChanged);
+ void UpdateField(CPDF_FormField* pFormField);
+
+public:
+ FX_BOOL DoAction_Hide(const CPDF_Action& action);
+ FX_BOOL DoAction_SubmitForm(const CPDF_Action& action);
+ FX_BOOL DoAction_ResetForm(const CPDF_Action& action);
+ FX_BOOL DoAction_ImportData(const CPDF_Action& action);
+
+ void GetFieldFromObjects(const CFX_PtrArray& objects, CFX_PtrArray& fields);
+ FX_BOOL IsValidField(CPDF_Dictionary* pFieldDict);
+ FX_BOOL SubmitFields(const CFX_WideString& csDestination, const CFX_PtrArray& fields,
+ FX_BOOL bIncludeOrExclude, FX_BOOL bUrlEncoded);
+ FX_BOOL SubmitForm(const CFX_WideString& sDestination, FX_BOOL bUrlEncoded);
+ FX_BOOL ImportFormFromFDFFile(const CFX_WideString& csFDFFileName, FX_BOOL bNotify);
+ FX_BOOL ExportFormToFDFFile(const CFX_WideString& sFDFFileName);
+ FX_BOOL ExportFormToFDFTextBuf(CFX_ByteTextBuf& textBuf);
+ FX_BOOL ExportFieldsToFDFFile(const CFX_WideString& sFDFFileName, const CFX_PtrArray& fields,
+ FX_BOOL bIncludeOrExclude);
+ FX_BOOL ExportFieldsToFDFTextBuf(const CFX_PtrArray& fields,FX_BOOL bIncludeOrExclude, CFX_ByteTextBuf& textBuf);
+ FX_BOOL ExportFormToTxtFile(const CFX_WideString& sTxtFileName);
+ FX_BOOL ImportFormFromTxtFile(const CFX_WideString& sTxtFileName);
+ CFX_WideString GetTemporaryFileName(const CFX_WideString& sFileExt);
+
+private:
+ virtual int BeforeValueChange(const CPDF_FormField* pField, CFX_WideString& csValue);
+ virtual int AfterValueChange(const CPDF_FormField* pField);
+ virtual int BeforeSelectionChange(const CPDF_FormField* pField, CFX_WideString& csValue);
+ virtual int AfterSelectionChange(const CPDF_FormField* pField);
+ virtual int AfterCheckedStatusChange(const CPDF_FormField* pField, const CFX_ByteArray& statusArray);
+ virtual int BeforeFormReset(const CPDF_InterForm* pForm);
+ virtual int AfterFormReset(const CPDF_InterForm* pForm);
+ virtual int BeforeFormImportData(const CPDF_InterForm* pForm);
+ virtual int AfterFormImportData(const CPDF_InterForm* pForm);
+
+private:
+ FX_BOOL FDFToURLEncodedData(CFX_WideString csFDFFile, CFX_WideString csTxtFile);
+ FX_BOOL FDFToURLEncodedData(FX_LPBYTE& pBuf, FX_STRSIZE& nBufSize);
+ int GetPageIndexByAnnotDict(CPDF_Document* pDocument, CPDF_Dictionary* pAnnotDict) const;
+ void DoFDFBuffer(CFX_ByteString sBuffer);
+
+private:
+ CPDFSDK_Document* m_pDocument;
+ CPDF_InterForm* m_pInterForm;
+ CPDFSDK_WidgetMap m_Map;
+ FX_BOOL m_bCalculate;
+ FX_BOOL m_bBusy;
+
+public:
+ FX_BOOL IsNeedHighLight(int nFieldType);
+ void RemoveAllHighLight();
+ void SetHighlightAlpha(FX_BYTE alpha) {m_iHighlightAlpha = alpha;}
+ FX_BYTE GetHighlightAlpha() {return m_iHighlightAlpha;}
+ void SetHighlightColor(FX_COLORREF clr, int nFieldType);
+ FX_COLORREF GetHighlightColor(int nFieldType);
+private:
+ FX_COLORREF m_aHighlightColor[6];
+ FX_BYTE m_iHighlightAlpha;
+ FX_BOOL m_bNeedHightlight[6];
+};
+
+#define BAI_STRUCTURE 0
+#define BAI_ROW 1
+#define BAI_COLUMN 2
+
+#define CPDFSDK_Annots CFX_ArrayTemplate<CPDFSDK_Annot*>
+#define CPDFSDK_SortAnnots CGW_ArrayTemplate<CPDFSDK_Annot*>
+class CBA_AnnotIterator
+{
+public:
+ CBA_AnnotIterator(CPDFSDK_PageView* pPageView, const CFX_ByteString& sType, const CFX_ByteString& sSubType);
+ virtual ~CBA_AnnotIterator();
+
+ virtual CPDFSDK_Annot* GetFirstAnnot();
+ virtual CPDFSDK_Annot* GetLastAnnot();
+ virtual CPDFSDK_Annot* GetNextAnnot(CPDFSDK_Annot* pAnnot);
+ virtual CPDFSDK_Annot* GetPrevAnnot(CPDFSDK_Annot* pAnnot);
+
+ virtual void Release(){delete this;}
+
+private:
+ void GenerateResults();
+ static int CompareByLeft(CPDFSDK_Annot* p1, CPDFSDK_Annot* p2);
+ static int CompareByTop(CPDFSDK_Annot* p1, CPDFSDK_Annot* p2);
+
+ static CPDF_Rect GetAnnotRect(CPDFSDK_Annot* pAnnot);
+
+private:
+ CPDFSDK_PageView* m_pPageView;
+ CFX_ByteString m_sType;
+ CFX_ByteString m_sSubType;
+ int m_nTabs;
+
+ CPDFSDK_Annots m_Annots;
+};
+
+#endif //#define _FSDK_BASEFORM_H_
+
diff --git a/fpdfsdk/include/fsdk_common.h b/fpdfsdk/include/fsdk_common.h new file mode 100644 index 0000000000..b49c1d1690 --- /dev/null +++ b/fpdfsdk/include/fsdk_common.h @@ -0,0 +1,46 @@ +// 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 _FSDK_COMMON_H_
+#define _FSDK_COMMON_H_
+
+#define BFFT_SIGNATURE "Signature"
+
+//for all fields
+#define FIELDFLAG_READONLY 1
+#define FIELDFLAG_REQUIRED 2
+#define FIELDFLAG_NOEXPORT 4
+//for text fields
+#define FIELDFLAG_MULTILINE (1<<12)
+#define FIELDFLAG_PASSWORD (1<<13)
+#define FIELDFLAG_FILESELECT (1<<20)
+#define FIELDFLAG_DONOTSPELLCHECK (1<<22)
+#define FIELDFLAG_DONOTSCROLL (1<<23)
+#define FIELDFLAG_COMB (1<<24)
+#define FIELDFLAG_RICHTEXT (1<<25)
+//for button fileds
+#define FIELDFLAG_NOTOGGLETOOFF (1<<14)
+#define FIELDFLAG_RADIO (1<<15)
+#define FIELDFLAG_PUSHBUTTON (1<<16)
+#define FIELDFLAG_RADIOSINUNISON (1<<25)
+//for choice fields
+#define FIELDFLAG_COMBO (1<<17)
+#define FIELDFLAG_EDIT (1<<18)
+#define FIELDFLAG_SORT (1<<19)
+#define FIELDFLAG_MULTISELECT (1<<21)
+#ifndef FIELDFLAG_DONOTSPELLCHECK
+#define FIELDFLAG_DONOTSPELLCHECK (1<<22)
+#endif
+#define FIELDFLAG_COMMITONSELCHANGE (1<<26)
+
+#define BBS_SOLID 0
+#define BBS_DASH 1
+#define BBS_BEVELED 2
+#define BBS_INSET 3
+#define BBS_UNDERLINE 4
+
+
+#endif
diff --git a/fpdfsdk/include/fsdk_define.h b/fpdfsdk/include/fsdk_define.h new file mode 100644 index 0000000000..5f9cde3858 --- /dev/null +++ b/fpdfsdk/include/fsdk_define.h @@ -0,0 +1,128 @@ +// 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_DEFINE_H
+#define _FPDFSDK_DEFINE_H
+
+#ifdef _WIN32
+#include <tchar.h>
+#include <math.h>
+#endif
+
+//#define API5
+#define API6
+#define _FPDFAPI_ASYNC_PARSING_
+#define _FXSDK_OPENSOURCE_
+
+#ifdef _FPDFEMB_WCE_
+ #include "../../core/include/fpdfapi/fpdfapi.h"
+ #include "../../core/include/fpdfapi/fpdf_parser.h"
+ #include "../../core/include/fpdfapi/fpdf_module.h"
+ #include "../../core/include/fpdfapi/fpdf_render.h"
+ #include "../../core/include/fpdfapi/fpdf_pageobj.h"
+ #include "../../core/include/fpdfapi/fpdf_serial.h"
+
+ #include "../../core/include/fpdftext/fpdf_text.h"
+
+ #include "../../core/include/fxge/fx_ge_win32.h"
+ #include "../../core/include/fxge/fx_ge.h"
+
+ #include "../../core/include/fxcodec/fx_codec.h"
+
+ #include "../../core/include/fpdfdoc/fpdf_doc.h"
+ #include "../../core/include/fpdfdoc/fpdf_vt.h"
+
+ #include "../../core/include/fxcrt/fx_xml.h"
+ #include "../../core/include/fxcrt/fx_crypt.h"
+
+#else
+ #ifdef API6
+ #include "../../core/include/fpdfapi/fpdf_parser.h"
+ #include "../../core/include/fpdfapi/fpdfapi.h"
+ #include "../../core/include/fpdfapi/fpdf_parser.h"
+ #include "../../core/include/fpdfapi/fpdf_module.h"
+ #include "../../core/include/fpdfapi/fpdf_render.h"
+ #include "../../core/include/fpdfapi/fpdf_pageobj.h"
+ #include "../../core/include/fpdfapi/fpdf_serial.h"
+
+ #include "../../core/include/fpdftext/fpdf_text.h"
+
+ #include "../../core/include/fxge/fx_ge_win32.h"
+ #include "../../core/include/fxge/fx_ge.h"
+
+ #include "../../core/include/fxcodec/fx_codec.h"
+
+ #include "../../core/include/fpdfdoc/fpdf_doc.h"
+ #include "../../core/include/fpdfdoc/fpdf_vt.h"
+
+ #include "../../core/include/fxcrt/fx_xml.h"
+ // #include "../../core/include/fdrm/fx_crypt.h"
+ #ifdef _LICENSED_BUILD_
+ #include "../../cryptopp/Cryptlib.h"
+ #endif
+ #endif
+#endif
+
+
+#ifndef FX_GetAValue
+/** @brief It retrieves an intensity value for the alpha component of a #FX_ARGB value. */
+#define FX_GetAValue(argb) ((argb & 0xFF000000) >> 24)
+#endif
+
+#ifndef FX_GetRValue
+/** @brief It retrieves an intensity value for the red component of a #FX_ARGB value. */
+#define FX_GetRValue(argb) ((argb & 0x00FF0000) >> 16)
+#endif
+
+#ifndef FX_GetGValue
+/** @brief It retrieves an intensity value for the green component of a #FX_ARGB value. */
+#define FX_GetGValue(argb) ((argb & 0x0000FF00) >> 8)
+#endif
+
+#ifndef FX_GetBValue
+/** @brief It retrieves an intensity value for the blue component of a #FX_ARGB value. */
+#define FX_GetBValue(argb) (argb & 0x000000FF)
+#endif
+
+#ifndef FX_ARGBTOCOLORREF
+/** @brief Convert a #FX_ARGB to a #FX_COLORREF. */
+#define FX_ARGBTOCOLORREF(argb) ((((FX_DWORD)argb & 0x00FF0000) >> 16)|((FX_DWORD)argb & 0x0000FF00)|(((FX_DWORD)argb & 0x000000FF) << 16))
+#endif
+
+#ifndef FX_COLORREFTOARGB
+/** @brief Convert a #FX_COLORREF to a #FX_ARGB. */
+#define FX_COLORREFTOARGB(rgb) ((FX_DWORD)0xFF000000|(((FX_DWORD)rgb & 0x000000FF) << 16)|((FX_DWORD)rgb & 0x0000FF00)|(((FX_DWORD)rgb & 0x00FF0000) >> 16))
+#endif
+
+typedef unsigned int FX_UINT;
+
+#include "fpdfview.h"
+
+class CPDF_CustomAccess : public IFX_FileRead, public CFX_Object
+{
+public:
+ CPDF_CustomAccess(FPDF_FILEACCESS* pFileAccess);
+ ~CPDF_CustomAccess() {}
+
+ virtual CFX_ByteString GetFullPath() { return ""; }
+ virtual FX_FILESIZE GetSize() { return m_FileAccess.m_FileLen; }
+
+ virtual FX_BOOL GetByte(FX_DWORD pos, FX_BYTE& ch);
+ virtual FX_BOOL GetBlock(FX_DWORD pos, FX_LPBYTE pBuf, FX_DWORD size);
+ virtual void Release() { delete this; }
+
+ virtual FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size);
+
+ FPDF_FILEACCESS m_FileAccess;
+ FX_BYTE m_Buffer[512];
+ FX_DWORD m_BufferOffset;
+};
+
+void FSDK_SetSandBoxPolicy(FPDF_DWORD policy, FPDF_BOOL enable);
+FPDF_BOOL FSDK_IsSandBoxPolicyEnabled(FPDF_DWORD policy);
+
+
+#endif//_FPDFSDK_DEFINE_H
diff --git a/fpdfsdk/include/fsdk_mgr.h b/fpdfsdk/include/fsdk_mgr.h new file mode 100644 index 0000000000..9933c41974 --- /dev/null +++ b/fpdfsdk/include/fsdk_mgr.h @@ -0,0 +1,615 @@ +// 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_MGR_H
+#define _FPDFSDK_MGR_H
+
+#include "fsdk_common.h"
+#include "fsdk_define.h"
+#include "fx_systemhandler.h"
+#include "fsdk_baseannot.h"
+#include "fsdk_baseform.h"
+#include "fpdfformfill.h"
+#include "fsdk_annothandler.h"
+#include "fsdk_actionhandler.h"
+
+//cross platform keycode and events define.
+#include "fpdf_fwlevent.h"
+
+
+class CPDFSDK_Document;
+class CPDFSDK_PageView;
+class CPDFSDK_Annot;
+class CFFL_IFormFiller;
+class CPDFSDK_Widget;
+class IFX_SystemHandler;
+class CPDFSDK_ActionHandler;
+class CJS_RuntimeFactory;
+
+#include "javascript/IJavaScript.h"
+
+class CPDFDoc_Environment
+{
+public:
+ CPDFDoc_Environment(CPDF_Document * pDoc);
+ ~CPDFDoc_Environment();
+
+ int RegAppHandle(FPDF_FORMFILLINFO* pFFinfo);//{ m_pInfo = pFFinfo; return TRUE;}
+
+ virtual void Release()
+ {
+ if (m_pInfo && m_pInfo->Release)
+ m_pInfo->Release(m_pInfo);
+ delete this;
+ }
+
+ virtual void FFI_Invalidate(FPDF_PAGE page, double left, double top, double right, double bottom)
+ {
+ if (m_pInfo && m_pInfo->FFI_Invalidate)
+ {
+ m_pInfo->FFI_Invalidate(m_pInfo, page, left, top, right, bottom);
+ }
+ }
+ virtual void FFI_OutputSelectedRect(FPDF_PAGE page, double left, double top, double right, double bottom)
+ {
+ if (m_pInfo && m_pInfo->FFI_OutputSelectedRect)
+ {
+ m_pInfo->FFI_OutputSelectedRect(m_pInfo, page, left, top, right, bottom);
+ }
+ }
+
+ virtual void FFI_SetCursor(int nCursorType)
+ {
+ if (m_pInfo && m_pInfo->FFI_SetCursor)
+ {
+ m_pInfo->FFI_SetCursor(m_pInfo, nCursorType);
+ }
+ }
+
+ virtual int FFI_SetTimer(int uElapse, TimerCallback lpTimerFunc)
+ {
+ if (m_pInfo && m_pInfo->FFI_SetTimer)
+ {
+ return m_pInfo->FFI_SetTimer(m_pInfo, uElapse, lpTimerFunc);
+ }
+ return -1;
+ }
+
+ virtual void FFI_KillTimer(int nTimerID)
+ {
+ if (m_pInfo && m_pInfo->FFI_KillTimer)
+ {
+ m_pInfo->FFI_KillTimer(m_pInfo, nTimerID);
+ }
+ }
+ FX_SYSTEMTIME FFI_GetLocalTime()
+ {
+ FX_SYSTEMTIME fxtime;
+ if(m_pInfo && m_pInfo->FFI_GetLocalTime)
+ {
+ FPDF_SYSTEMTIME systime = m_pInfo->FFI_GetLocalTime(m_pInfo);
+ fxtime.wDay = systime.wDay;
+ fxtime.wDayOfWeek = systime.wDayOfWeek;
+ fxtime.wHour = systime.wHour;
+ fxtime.wMilliseconds = systime.wMilliseconds;
+ fxtime.wMinute = systime.wMinute;
+ fxtime.wMonth = systime.wMonth;
+ fxtime.wSecond = systime.wSecond;
+ fxtime.wYear = systime.wYear;
+ }
+ return fxtime;
+ }
+
+ virtual void FFI_OnChange()
+ {
+ if(m_pInfo && m_pInfo->FFI_OnChange)
+ {
+ m_pInfo->FFI_OnChange(m_pInfo);
+ }
+ }
+
+ virtual FX_BOOL FFI_IsSHIFTKeyDown(FX_DWORD nFlag)
+ {
+
+ return (nFlag & FWL_EVENTFLAG_ShiftKey) != 0;
+ }
+ virtual FX_BOOL FFI_IsCTRLKeyDown(FX_DWORD nFlag)
+ {
+
+ return (nFlag & FWL_EVENTFLAG_ControlKey) != 0;
+ }
+ virtual FX_BOOL FFI_IsALTKeyDown(FX_DWORD nFlag)
+ {
+
+ return (nFlag & FWL_EVENTFLAG_AltKey) != 0;
+ }
+ virtual FX_BOOL FFI_IsINSERTKeyDown(FX_DWORD nFlag)
+ {
+ return FALSE;
+ }
+
+ virtual int JS_appAlert(FX_LPCWSTR Msg, FX_LPCWSTR Title, FX_UINT Type, FX_UINT Icon)
+ {
+ if(m_pInfo && m_pInfo->m_pJsPlatform && m_pInfo->m_pJsPlatform->app_alert)
+ {
+ CFX_ByteString bsMsg = CFX_WideString(Msg).UTF16LE_Encode();
+ CFX_ByteString bsTitle = CFX_WideString(Title).UTF16LE_Encode();
+ FPDF_WIDESTRING pMsg = (FPDF_WIDESTRING)bsMsg.GetBuffer(bsMsg.GetLength());
+ FPDF_WIDESTRING pTitle = (FPDF_WIDESTRING)bsTitle.GetBuffer(bsTitle.GetLength());
+ int ret = m_pInfo->m_pJsPlatform->app_alert(m_pInfo->m_pJsPlatform, pMsg, pTitle, Type, Icon);
+ bsMsg.ReleaseBuffer();
+ bsTitle.ReleaseBuffer();
+ return ret;
+ }
+ return -1;
+ }
+
+ virtual int JS_appResponse(FX_LPCWSTR Question, FX_LPCWSTR Title, FX_LPCWSTR Default, FX_LPCWSTR cLabel, FPDF_BOOL bPassword, void* response, int length)
+ {
+ if (m_pInfo && m_pInfo->m_pJsPlatform && m_pInfo->m_pJsPlatform->app_response)
+ {
+ 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();
+ FPDF_WIDESTRING pQuestion = (FPDF_WIDESTRING)bsQuestion.GetBuffer(bsQuestion.GetLength());
+ FPDF_WIDESTRING pTitle = (FPDF_WIDESTRING)bsTitle.GetBuffer(bsTitle.GetLength());
+ FPDF_WIDESTRING pDefault = (FPDF_WIDESTRING)bsDefault.GetBuffer(bsDefault.GetLength());
+ FPDF_WIDESTRING pLabel = (FPDF_WIDESTRING)bsLabel.GetBuffer(bsLabel.GetLength());
+ int ret = m_pInfo->m_pJsPlatform->app_response(m_pInfo->m_pJsPlatform, pQuestion, pTitle,
+ pDefault, pLabel, bPassword, response, length);
+ bsQuestion.ReleaseBuffer();
+ bsTitle.ReleaseBuffer();
+ bsDefault.ReleaseBuffer();
+ bsLabel.ReleaseBuffer();
+ return ret;
+ }
+ return -1;
+ }
+
+ virtual void JS_appBeep(int nType)
+ {
+ if(m_pInfo && m_pInfo->m_pJsPlatform && m_pInfo->m_pJsPlatform->app_beep)
+ {
+ m_pInfo->m_pJsPlatform->app_beep(m_pInfo->m_pJsPlatform, nType);
+ }
+ }
+
+ virtual CFX_WideString JS_fieldBrowse()
+ {
+ if(m_pInfo && m_pInfo->m_pJsPlatform && m_pInfo->m_pJsPlatform->Field_browse)
+ {
+ int nLen = m_pInfo->m_pJsPlatform->Field_browse(m_pInfo->m_pJsPlatform, NULL, 0);
+ if(nLen <= 0)
+ return L"";
+ char* pbuff = new char[nLen];
+ if(pbuff)
+ memset(pbuff, 0, nLen);
+ else
+ return L"";
+ nLen = m_pInfo->m_pJsPlatform->Field_browse(m_pInfo->m_pJsPlatform, pbuff, nLen);
+ CFX_ByteString bsRet = CFX_ByteString(pbuff, nLen);
+ CFX_WideString wsRet = CFX_WideString::FromLocal(bsRet);
+ delete[] pbuff;
+ return wsRet;
+ }
+ return L"";
+ }
+
+ CFX_WideString JS_docGetFilePath()
+ {
+ if(m_pInfo && m_pInfo->m_pJsPlatform && m_pInfo->m_pJsPlatform->Doc_getFilePath)
+ {
+ int nLen = m_pInfo->m_pJsPlatform->Doc_getFilePath(m_pInfo->m_pJsPlatform, NULL, 0);
+ if(nLen <= 0)
+ return L"";
+ char* pbuff = new char[nLen];
+ if(pbuff)
+ memset(pbuff, 0, nLen);
+ else
+ return L"";
+ nLen = m_pInfo->m_pJsPlatform->Doc_getFilePath(m_pInfo->m_pJsPlatform, pbuff, nLen);
+ CFX_ByteString bsRet = CFX_ByteString(pbuff, nLen);
+ CFX_WideString wsRet = CFX_WideString::FromLocal(bsRet);
+ delete[] pbuff;
+ return wsRet;
+ }
+ return L"";
+ }
+
+ void JS_docSubmitForm(void* formData, int length, FX_LPCWSTR URL)
+ {
+ if(m_pInfo && m_pInfo->m_pJsPlatform && m_pInfo->m_pJsPlatform->Doc_submitForm)
+ {
+ CFX_ByteString bsDestination = CFX_WideString(URL).UTF16LE_Encode();
+ FPDF_WIDESTRING pDestination = (FPDF_WIDESTRING)bsDestination.GetBuffer(bsDestination.GetLength());
+ m_pInfo->m_pJsPlatform->Doc_submitForm(m_pInfo->m_pJsPlatform, formData, length, pDestination);
+ bsDestination.ReleaseBuffer();
+ }
+ }
+
+ void JS_docmailForm(void* mailData, int length, FPDF_BOOL bUI,FX_LPCWSTR To, FX_LPCWSTR Subject, FX_LPCWSTR CC, FX_LPCWSTR BCC, FX_LPCWSTR Msg)
+ {
+ if(m_pInfo && m_pInfo->m_pJsPlatform && m_pInfo->m_pJsPlatform->Doc_mail)
+ {
+ CFX_ByteString bsTo = CFX_WideString(To).UTF16LE_Encode();
+ CFX_ByteString bsCC = CFX_WideString(Subject).UTF16LE_Encode();
+ CFX_ByteString bsBcc = CFX_WideString(BCC).UTF16LE_Encode();
+ CFX_ByteString bsSubject = CFX_WideString(Subject).UTF16LE_Encode();
+ CFX_ByteString bsMsg = CFX_WideString(Msg).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());
+ m_pInfo->m_pJsPlatform->Doc_mail(m_pInfo->m_pJsPlatform, mailData, length, bUI, pTo, pSubject,
+ pCC, pBcc, pMsg);
+ bsTo.ReleaseBuffer();
+ bsCC.ReleaseBuffer();
+ bsBcc.ReleaseBuffer();
+ bsSubject.ReleaseBuffer();
+ bsMsg.ReleaseBuffer();
+ }
+ }
+ CFX_WideString JS_appbrowseForDoc(FPDF_BOOL bSave, FX_LPCWSTR cFilenameInit)
+ {
+ //to do....
+ return L"";
+// if(m_pInfo && m_pInfo->m_pJsPlatform && m_pInfo->m_pJsPlatform->app_browseForDoc)
+// {
+// CFX_ByteString bsFilenameInit = CFX_WideString(cFilenameInit).UTF16LE_Encode();
+// FPDF_WIDESTRING pFileNameInit = (FPDF_WIDESTRING)bsFilenameInit.GetBuffer(bsFilenameInit.GetLength());
+//
+// m_pInfo->m_pJsPlatform->app_browseForDoc(m_pInfo->m_pJsPlatform, pFileNameInit);
+// bsFilenameInit.ReleaseBuffer();
+// }
+ }
+
+ void 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)
+ {
+ m_pInfo->m_pJsPlatform->Doc_print(m_pInfo->m_pJsPlatform, bUI, nStart, nEnd, bSilent, bShrinkToFit, bPrintAsImage, bReverse, bAnnotations);
+ }
+ }
+ void JS_docgotoPage(int nPageNum)
+ {
+ if(m_pInfo && m_pInfo->m_pJsPlatform && m_pInfo->m_pJsPlatform->Doc_gotoPage)
+ {
+ m_pInfo->m_pJsPlatform->Doc_gotoPage(m_pInfo->m_pJsPlatform, nPageNum);
+ }
+ }
+
+ virtual FPDF_PAGE FFI_GetPage(FPDF_DOCUMENT document,int nPageIndex)
+ {
+ if(m_pInfo && m_pInfo->FFI_GetPage)
+ {
+ return m_pInfo->FFI_GetPage(m_pInfo, document, nPageIndex);
+ }
+ return NULL;
+ }
+
+ virtual FPDF_PAGE FFI_GetCurrentPage(FPDF_DOCUMENT document)
+ {
+ if(m_pInfo && m_pInfo->FFI_GetCurrentPage)
+ {
+ return m_pInfo->FFI_GetCurrentPage(m_pInfo, document);
+ }
+ return NULL;
+ }
+
+ int FFI_GetRotation(FPDF_PAGE page)
+ {
+ if(m_pInfo && m_pInfo->FFI_GetRotation)
+ {
+ return m_pInfo->FFI_GetRotation(m_pInfo, page);
+ }
+ return 0;
+ }
+ void FFI_ExecuteNamedAction(FX_LPCSTR namedAction)
+ {
+ if(m_pInfo && m_pInfo->FFI_ExecuteNamedAction)
+ {
+ m_pInfo->FFI_ExecuteNamedAction(m_pInfo, namedAction);
+ }
+ }
+ void FFI_OnSetFieldInputFocus(void* field,FPDF_WIDESTRING focusText, FPDF_DWORD nTextLen, FX_BOOL bFocus)
+ {
+ if(m_pInfo && m_pInfo->FFI_SetTextFieldFocus)
+ {
+ m_pInfo->FFI_SetTextFieldFocus(m_pInfo, focusText, nTextLen, bFocus);
+ }
+ }
+
+ void FFI_DoURIAction(FX_LPCSTR bsURI)
+ {
+ if(m_pInfo && m_pInfo->FFI_DoURIAction)
+ {
+ m_pInfo->FFI_DoURIAction(m_pInfo, bsURI);
+ }
+ }
+
+ void FFI_DoGoToAction(int nPageIndex, int zoomMode, float* fPosArray, int sizeOfArray)
+ {
+ if(m_pInfo && m_pInfo->FFI_DoGoToAction)
+ {
+ m_pInfo->FFI_DoGoToAction(m_pInfo, nPageIndex, zoomMode, fPosArray, sizeOfArray);
+ }
+ }
+
+public:
+ FX_BOOL IsJSInitiated();
+
+public:
+ void SetCurrentDoc(CPDFSDK_Document* pFXDoc) {m_pSDKDoc = pFXDoc;}
+ CPDFSDK_Document* GetCurrentDoc();
+ CPDF_Document* GetPDFDocument() {return m_pPDFDoc;}
+// CPDFSDK_Document* GetDocument(int nIndex);
+// int CountDocuments() {return m_docMap.GetCount();}
+
+ CPDFSDK_Document* OpenDocument(CFX_WideString &fileName);
+ CPDFSDK_Document* OpenMemPDFDoc(CPDF_Document* pNewDoc, CFX_WideString &fileName);
+ FX_BOOL OpenURL(CFX_WideString &filePath);
+
+
+ CFX_ByteString GetAppName() {return "";}
+
+ CFFL_IFormFiller* GetIFormFiller();
+ IFX_SystemHandler* GetSysHandler() {return m_pSysHandler;}
+
+public:
+ CPDFSDK_AnnotHandlerMgr* GetAnnotHandlerMgr();
+ IFXJS_Runtime* GetJSRuntime();
+ CPDFSDK_ActionHandler* GetActionHander();
+private:
+ CPDFSDK_AnnotHandlerMgr* m_pAnnotHandlerMgr;
+ CPDFSDK_ActionHandler* m_pActionHandler;
+ IFXJS_Runtime* m_pJSRuntime;
+public:
+ FPDF_FORMFILLINFO* GetFormFillInfo() {return m_pInfo;}
+private:
+ FPDF_FORMFILLINFO* m_pInfo;
+// CFX_MapPtrTemplate<CPDF_Document*, CPDFSDK_Document*> m_docMap;
+ CPDFSDK_Document* m_pSDKDoc;
+ CPDF_Document* m_pPDFDoc;
+
+ CFFL_IFormFiller* m_pIFormFiller;
+ IFX_SystemHandler* m_pSysHandler;
+
+public:
+ CJS_RuntimeFactory* m_pJSRuntimeFactory;
+};
+
+
+
+// class CFX_App
+// {
+// public:
+// CFX_App():m_pCurDoc(NULL) {}
+// void SetAt(CPDF_Document* pPDFDoc, CPDFSDK_Document* pFXDoc);
+// CPDFSDK_Document* GetAt(CPDF_Document* pPDFDoc);
+// public:
+// void SetCurrentDocument(CPDFSDK_Document* pFXDoc) {m_pCurDoc = pFXDoc;}
+// CPDFSDK_Document* GetCurrentDocument() {return m_pCurDoc;}
+// private:
+// CFX_MapPtrTemplate<CPDF_Document*, CPDFSDK_Document*> m_docArray;
+// CPDFSDK_Document* m_pCurDoc;
+// };
+class CPDFSDK_InterForm;
+class CPDFSDK_Document
+{
+public:
+ CPDFSDK_Document(CPDF_Document* pDoc, CPDFDoc_Environment* pEnv);
+ ~CPDFSDK_Document();
+public:
+ CPDFSDK_InterForm* GetInterForm() ;
+ CPDF_Document* GetDocument() {return m_pDoc;}
+
+public:
+ void InitPageView();
+ void AddPageView(CPDF_Page* pPDFPage, CPDFSDK_PageView* pPageView);
+ CPDFSDK_PageView* GetPageView(CPDF_Page* pPDFPage, FX_BOOL ReNew = TRUE);
+ CPDFSDK_PageView* GetPageView(int nIndex);
+ CPDFSDK_PageView* GetCurrentView();
+ void ReMovePageView(CPDF_Page* pPDFPage);
+ void UpdateAllViews(CPDFSDK_PageView* pSender, CPDFSDK_Annot* pAnnot);
+
+ CPDFSDK_Annot* GetFocusAnnot();//{return NULL;}
+
+ IFXJS_Runtime * GetJsRuntime();
+
+ FX_BOOL SetFocusAnnot(CPDFSDK_Annot* pAnnot, FX_UINT nFlag = 0);//{return FALSE;}
+ FX_BOOL KillFocusAnnot(FX_UINT nFlag = 0);
+
+ FX_BOOL ExtractPages(const CFX_WordArray &arrExtraPages, CPDF_Document* pDstDoc);
+ FX_BOOL InsertPages(int nInsertAt, const CPDF_Document* pSrcDoc, const CFX_WordArray &arrSrcPages);
+ FX_BOOL DeletePages(int nStart, int nCount);
+ FX_BOOL ReplacePages(int nPage, const CPDF_Document* pSrcDoc, const CFX_WordArray &arrSrcPages);
+
+ void OnCloseDocument();
+
+ int GetPageCount() {return m_pDoc->GetPageCount();}
+ FX_BOOL GetPermissions(int nFlag);
+ FX_BOOL GetChangeMark() {return m_bChangeMask;}
+ void SetChangeMark() {m_bChangeMask = TRUE;}
+ void ClearChangeMark() {m_bChangeMask= FALSE;}
+// FX_BOOL GetChangeMark(){return FALSE;}//IsAnnotModified()||IsFormModified() || IsWidgetModified()|| m_nChangeMark>0 ;}
+// void ClearChangeMark(){}
+ CFX_WideString GetPath() ;
+ CPDF_Page* GetPage(int nIndex);
+ CPDFDoc_Environment * GetEnv() {return m_pEnv; }
+ void ProcJavascriptFun();
+ FX_BOOL ProcOpenAction();
+ CPDF_OCContext* GetOCContext();
+private:
+ //CFX_ArrayTemplate<CPDFSDK_PageView*> m_pageArray;
+ CFX_MapPtrTemplate<CPDF_Page*, CPDFSDK_PageView*> m_pageMap;
+ CPDF_Document* m_pDoc;
+
+ CPDFSDK_InterForm* m_pInterForm;
+ CPDFSDK_Annot* m_pFocusAnnot;
+ CPDFDoc_Environment * m_pEnv;
+ CPDF_OCContext * m_pOccontent;
+ FX_BOOL m_bChangeMask;
+};
+
+class CPDFSDK_PageView
+{
+public:
+ CPDFSDK_PageView(CPDFSDK_Document* pSDKDoc,CPDF_Page* page);
+ ~CPDFSDK_PageView();
+public:
+ virtual void PageView_OnDraw(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,CPDF_RenderOptions* pOptions) ;
+public:
+ CPDF_Annot* GetPDFAnnotAtPoint(FX_FLOAT pageX, FX_FLOAT pageY);
+ CPDFSDK_Annot* GetFXAnnotAtPoint(FX_FLOAT pageX, FX_FLOAT pageY);
+ CPDF_Annot* GetPDFWidgetAtPoint(FX_FLOAT pageX, FX_FLOAT pageY);
+ CPDFSDK_Annot* GetFXWidgetAtPoint(FX_FLOAT pageX, FX_FLOAT pageY);
+ CPDFSDK_Annot* GetFocusAnnot() ;
+ void SetFocusAnnot(CPDFSDK_Annot* pSDKAnnot,FX_UINT nFlag = 0) {m_pSDKDoc->SetFocusAnnot(pSDKAnnot, nFlag);}
+ FX_BOOL KillFocusAnnot(FX_UINT nFlag = 0) {return m_pSDKDoc->KillFocusAnnot(nFlag);}
+ FX_BOOL Annot_HasAppearance(CPDF_Annot* pAnnot);
+
+ CPDFSDK_Annot* AddAnnot(CPDF_Dictionary * pDict);
+ CPDFSDK_Annot* AddAnnot(FX_LPCSTR lpSubType,CPDF_Dictionary * pDict);
+ CPDFSDK_Annot* AddAnnot(CPDF_Annot * pPDFAnnot);
+ FX_BOOL DeleteAnnot(CPDFSDK_Annot* pAnnot);
+
+ int CountAnnots();
+ CPDFSDK_Annot* GetAnnot(int nIndex);
+ CPDFSDK_Annot* GetAnnotByDict(CPDF_Dictionary * pDict);
+ CPDF_Page* GetPDFPage(){return m_page;}
+ CPDF_Document* GetPDFDocument();
+ CPDFSDK_Document* GetSDKDocument() {return m_pSDKDoc;}
+public:
+ virtual FX_BOOL OnLButtonDown(const CPDF_Point & point, FX_UINT nFlag);
+ virtual FX_BOOL OnLButtonUp(const CPDF_Point & point, FX_UINT nFlag);
+ virtual FX_BOOL OnChar(int nChar, FX_UINT nFlag);
+ virtual FX_BOOL OnKeyDown(int nKeyCode, int nFlag);
+ virtual FX_BOOL OnKeyUp(int nKeyCode, int nFlag);
+
+ virtual FX_BOOL OnMouseMove(const CPDF_Point & point, int nFlag);
+ virtual FX_BOOL OnMouseWheel(double deltaX, double deltaY,const CPDF_Point& point, int nFlag);
+ virtual FX_BOOL IsValidAnnot(FX_LPVOID p);
+public:
+ virtual void GetCurrentMatrix(CPDF_Matrix& matrix) {matrix = m_curMatrix;}
+ virtual void UpdateRects(CFX_RectArray& rects);
+ void UpdateView(CPDFSDK_Annot* pAnnot);
+ CFX_PtrArray* GetAnnotList(){ return &m_fxAnnotArray; }
+
+public:
+ virtual int GetPageIndex();
+ void LoadFXAnnots();
+private:
+ CPDF_Matrix m_curMatrix;
+
+private:
+ void PageView_OnHighlightFormFields(CFX_RenderDevice* pDevice, CPDFSDK_Widget* pWidget);
+
+private:
+ CPDF_Page* m_page;
+ CPDF_AnnotList* m_pAnnotList;
+
+ //CPDFSDK_Annot* m_pFocusAnnot;
+ CFX_PtrArray m_fxAnnotArray;
+
+ CPDFSDK_Document* m_pSDKDoc;
+private:
+ CPDFSDK_Widget* m_CaptureWidget;
+ FX_BOOL m_bEnterWidget;
+ FX_BOOL m_bExitWidget;
+ FX_BOOL m_bOnWidget;
+public:
+ void SetValid(FX_BOOL bValid) {m_bValid = bValid;}
+ FX_BOOL IsValid() {return m_bValid;}
+private:
+ FX_BOOL m_bValid;
+};
+
+
+template<class TYPE>
+class CGW_ArrayTemplate : public CFX_ArrayTemplate<TYPE>
+{
+public:
+ CGW_ArrayTemplate(){}
+ virtual ~CGW_ArrayTemplate(){}
+
+ typedef int (*LP_COMPARE)(TYPE p1, TYPE p2);
+
+ void Sort(LP_COMPARE pCompare, FX_BOOL bAscent = TRUE)
+ {
+ int nSize = this->GetSize();
+ QuickSort(0, nSize -1, bAscent, pCompare);
+ }
+
+private:
+ void QuickSort(FX_UINT nStartPos, FX_UINT nStopPos, FX_BOOL bAscend, LP_COMPARE pCompare)
+ {
+ if (nStartPos >= nStopPos) return;
+
+ if ((nStopPos - nStartPos) == 1)
+ {
+ TYPE Value1 = this->GetAt(nStartPos);
+ TYPE Value2 = this->GetAt(nStopPos);
+
+ int iGreate = (*pCompare)(Value1, Value2);
+ if ((bAscend && iGreate > 0) || (!bAscend && iGreate < 0))
+ {
+ this->SetAt(nStartPos, Value2);
+ this->SetAt(nStopPos, Value1);
+ }
+ return;
+ }
+
+ FX_UINT m = (nStartPos + nStopPos) / 2;
+ FX_UINT i = nStartPos;
+
+ TYPE Value = this->GetAt(m);
+
+ while (i < m)
+ {
+ TYPE temp = this->GetAt(i);
+
+ int iGreate = (*pCompare)(temp, Value);
+ if ((bAscend && iGreate > 0) || (!bAscend && iGreate < 0))
+ {
+ this->InsertAt(m+1, temp);
+ this->RemoveAt(i);
+ m--;
+ }
+ else
+ {
+ i++;
+ }
+ }
+
+ FX_UINT j = nStopPos;
+
+ while (j > m)
+ {
+ TYPE temp = this->GetAt(j);
+
+ int iGreate = (*pCompare)(temp, Value);
+ if ((bAscend && iGreate < 0) || (!bAscend && iGreate > 0))
+ {
+ this->RemoveAt(j);
+ this->InsertAt(m, temp);
+ m++;
+ }
+ else
+ {
+ j--;
+ }
+ }
+
+ if (nStartPos < m) QuickSort(nStartPos, m, bAscend, pCompare);
+ if (nStopPos > m) QuickSort(m, nStopPos, bAscend, pCompare);
+ }
+};
+
+
+#endif //_FPDFSDK_MGR_H
+
diff --git a/fpdfsdk/include/fsdk_rendercontext.h b/fpdfsdk/include/fsdk_rendercontext.h new file mode 100644 index 0000000000..c33dfddfa5 --- /dev/null +++ b/fpdfsdk/include/fsdk_rendercontext.h @@ -0,0 +1,41 @@ +// 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 _RENDERCONTENT_H_
+#define _RENDERCONTENT_H_
+#include "../include/fsdk_define.h"
+#include "../include/fpdf_progressive.h"
+
+// Everything about rendering is put here: for OOM recovery
+class CRenderContext : public CFX_Object
+{
+public:
+ CRenderContext() { Clear(); }
+ ~CRenderContext();
+
+ void Clear();
+
+ CFX_RenderDevice* m_pDevice;
+ CPDF_RenderContext* m_pContext;
+ CPDF_ProgressiveRenderer* m_pRenderer;
+ CPDF_AnnotList* m_pAnnots;
+ CPDF_RenderOptions* m_pOptions;
+#ifdef _WIN32_WCE
+ CFX_DIBitmap* m_pBitmap;
+ HBITMAP m_hBitmap;
+#endif
+};
+
+class IFSDK_PAUSE_Adapter : public IFX_Pause
+{
+public:
+ IFSDK_PAUSE_Adapter(IFSDK_PAUSE* IPause );
+ FX_BOOL NeedToPauseNow();
+
+private:
+ IFSDK_PAUSE* m_IPause;
+};
+#endif
diff --git a/fpdfsdk/include/fx_systemhandler.h b/fpdfsdk/include/fx_systemhandler.h new file mode 100644 index 0000000000..c760377194 --- /dev/null +++ b/fpdfsdk/include/fx_systemhandler.h @@ -0,0 +1,85 @@ +// 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 _FX_SYSTEMHANDLER_H_
+#define _FX_SYSTEMHANDLER_H_
+
+typedef FX_LPVOID FX_HWND;
+typedef FX_LPVOID FX_HMENU;
+typedef void (*TimerCallback)(FX_INT32 idEvent);
+
+typedef struct _FX_SYSTEMTIME
+{
+ FX_WORD wYear;
+ FX_WORD wMonth;
+ FX_WORD wDayOfWeek;
+ FX_WORD wDay;
+ FX_WORD wHour;
+ FX_WORD wMinute;
+ FX_WORD wSecond;
+ FX_WORD wMilliseconds;
+}FX_SYSTEMTIME;
+
+//cursor style
+#define FXCT_ARROW 0
+#define FXCT_NESW 1
+#define FXCT_NWSE 2
+#define FXCT_VBEAM 3
+#define FXCT_HBEAM 4
+#define FXCT_HAND 5
+
+class IFX_SystemHandler
+{
+public:
+ virtual ~IFX_SystemHandler() {}
+ virtual void InvalidateRect(FX_HWND hWnd, FX_RECT rect) = 0;
+ virtual void OutputSelectedRect(void* pFormFiller, CPDF_Rect&rect) = 0;
+
+ virtual FX_BOOL IsSelectionImplemented() = 0;
+
+ virtual CFX_WideString GetClipboardText(FX_HWND hWnd) = 0;
+ virtual FX_BOOL SetClipboardText(FX_HWND hWnd, CFX_WideString string) = 0;
+
+ virtual void ClientToScreen(FX_HWND hWnd, FX_INT32& x, FX_INT32& y) = 0;
+ virtual void ScreenToClient(FX_HWND hWnd, FX_INT32& x, FX_INT32& y) = 0;
+
+ /*cursor style
+ FXCT_ARROW
+ FXCT_NESW
+ FXCT_NWSE
+ FXCT_VBEAM
+ FXCT_HBEAM
+ FXCT_HAND
+ */
+ virtual void SetCursor(FX_INT32 nCursorType) = 0;
+
+ virtual FX_HMENU CreatePopupMenu() = 0;
+ virtual FX_BOOL AppendMenuItem(FX_HMENU hMenu, FX_INT32 nIDNewItem, CFX_WideString string) = 0;
+ virtual FX_BOOL EnableMenuItem(FX_HMENU hMenu, FX_INT32 nIDItem, FX_BOOL bEnabled) = 0;
+ virtual FX_INT32 TrackPopupMenu(FX_HMENU hMenu, FX_INT32 x, FX_INT32 y, FX_HWND hParent) = 0;
+ virtual void DestroyMenu(FX_HMENU hMenu) = 0;
+
+ virtual CFX_ByteString GetNativeTrueTypeFont(FX_INT32 nCharset) = 0;
+ virtual FX_BOOL FindNativeTrueTypeFont(FX_INT32 nCharset, CFX_ByteString sFontFaceName) = 0;
+ virtual CPDF_Font* AddNativeTrueTypeFontToPDF(CPDF_Document* pDoc, CFX_ByteString sFontFaceName, FX_BYTE nCharset) = 0;
+
+ virtual FX_INT32 SetTimer(FX_INT32 uElapse, TimerCallback lpTimerFunc) = 0;
+ virtual void KillTimer(FX_INT32 nID) = 0;
+
+
+ virtual FX_BOOL IsSHIFTKeyDown(FX_DWORD nFlag) = 0;
+ virtual FX_BOOL IsCTRLKeyDown(FX_DWORD nFlag) = 0;
+ virtual FX_BOOL IsALTKeyDown(FX_DWORD nFlag) = 0;
+ virtual FX_BOOL IsINSERTKeyDown(FX_DWORD nFlag) = 0;
+
+ virtual FX_SYSTEMTIME GetLocalTime() = 0;
+
+ virtual FX_INT32 GetCharSet() = 0;
+ virtual void SetCharSet(FX_INT32 nCharSet) = 0;
+};
+
+#endif //_FX_SYSTEMHANDLER_H_
+
diff --git a/fpdfsdk/include/fxedit/fx_edit.h b/fpdfsdk/include/fxedit/fx_edit.h new file mode 100644 index 0000000000..2b73e61bc4 --- /dev/null +++ b/fpdfsdk/include/fxedit/fx_edit.h @@ -0,0 +1,471 @@ +// 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 _FX_EDIT_H_
+#define _FX_EDIT_H_
+
+#define PVTWORD_STYLE_NORMAL 0x0000L
+#define PVTWORD_STYLE_HIGHLIGHT 0x0001L
+#define PVTWORD_STYLE_UNDERLINE 0x0002L
+#define PVTWORD_STYLE_CROSSOUT 0x0004L
+#define PVTWORD_STYLE_SQUIGGLY 0x0008L
+#define PVTWORD_STYLE_DUALCROSSOUT 0x0010L
+#define PVTWORD_STYLE_BOLD 0x0020L
+#define PVTWORD_STYLE_ITALIC 0x0040L
+
+#define FX_EDIT_ISLATINWORD(u) (u == 0x2D || (u <= 0x005A && u >= 0x0041) || (u <= 0x007A && u >= 0x0061) || (u <= 0x02AF && u >= 0x00C0))
+
+#ifdef FX_READER_DLL
+ #ifdef FXET_EXPORT
+ #define FXET_CLASS __declspec(dllexport)
+ #else
+ #define FXET_CLASS
+ #endif
+#else
+ #define FXET_CLASS
+#endif
+
+#ifndef DEFAULT_CHARSET
+#define DEFAULT_CHARSET 1
+#endif
+
+class IFX_Edit_FontMap;
+class IFX_Edit_Notify;
+class IFX_Edit_Iterator;
+class IFX_Edit_UndoItem;
+class IFX_Edit;
+class IFX_List_Notify;
+class IFX_List;
+class IFX_SystemHandler;
+
+class IFX_Edit_FontMap
+{
+public:
+ //map a fontindex to pdf font.
+ virtual CPDF_Font * GetPDFFont(FX_INT32 nFontIndex) = 0;
+ //get the alias of a pdf font.
+ virtual CFX_ByteString GetPDFFontAlias(FX_INT32 nFontIndex) = 0;
+ //get the index of a font that can show a word.
+ virtual FX_INT32 GetWordFontIndex(FX_WORD word, FX_INT32 charset, FX_INT32 nFontIndex) = 0;
+ //get the charcode of word from unicode
+ virtual FX_INT32 CharCodeFromUnicode(FX_INT32 nFontIndex, FX_WORD word) = 0;
+ //get the charset of unicode
+ virtual FX_INT32 CharSetFromUnicode(FX_WORD word, FX_INT32 nOldCharset) = 0;
+};
+
+class IFX_Edit_Notify
+{
+ //this class is implemented by user
+public:
+ //set the horizontal scrollbar information.
+ virtual void IOnSetScrollInfoX(FX_FLOAT fPlateMin, FX_FLOAT fPlateMax,
+ FX_FLOAT fContentMin, FX_FLOAT fContentMax,
+ FX_FLOAT fSmallStep, FX_FLOAT fBigStep) = 0;
+ //set the vertical scrollbar information.
+ virtual void IOnSetScrollInfoY(FX_FLOAT fPlateMin, FX_FLOAT fPlateMax,
+ FX_FLOAT fContentMin, FX_FLOAT fContentMax,
+ FX_FLOAT fSmallStep, FX_FLOAT fBigStep) = 0;
+ //set the position of horizontal scrollbar.
+ virtual void IOnSetScrollPosX(FX_FLOAT fx) = 0;
+ //set the position of vertical scrollbar.
+ virtual void IOnSetScrollPosY(FX_FLOAT fy) = 0;
+ //set the caret information.
+ virtual void IOnSetCaret(FX_BOOL bVisible,const CPDF_Point & ptHead,const CPDF_Point & ptFoot, const CPVT_WordPlace& place) = 0;
+ //if the caret position is changed ,send the information of current postion to user.
+ virtual void IOnCaretChange(const CPVT_SecProps & secProps, const CPVT_WordProps & wordProps) = 0;
+ //if the text area is changed, send the information to user.
+ virtual void IOnContentChange(const CPDF_Rect& rcContent) = 0;
+ //Invalidate the rectangle relative to the bounding box of edit.
+ virtual void IOnInvalidateRect(CPDF_Rect * pRect) = 0;
+};
+
+class IFX_Edit_OprNotify
+{
+ //this class is implemented by user
+public:
+ //OprType: 0
+ virtual void OnInsertWord(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace) = 0;
+ //OprType: 1
+ virtual void OnInsertReturn(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace) = 0;
+ //OprType: 2
+ virtual void OnBackSpace(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace) = 0;
+ //OprType: 3
+ virtual void OnDelete(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace) = 0;
+ //OprType: 4
+ virtual void OnClear(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace) = 0;
+ //OprType: 5
+ virtual void OnInsertText(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace) = 0;
+ //OprType: 6
+ virtual void OnSetText(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace) = 0;
+ //
+ virtual void OnAddUndo(IFX_Edit_UndoItem* pUndoItem) = 0;
+};
+
+class IFX_Edit_Iterator
+{
+public:
+ virtual ~IFX_Edit_Iterator() {}
+public:
+ //move the current position to the next word.
+ virtual FX_BOOL NextWord() = 0;
+ //move the current position to the next line.
+ virtual FX_BOOL NextLine() = 0;
+ //move the current position to the next section.
+ virtual FX_BOOL NextSection() = 0;
+
+ //move the current position to the previous word.
+ virtual FX_BOOL PrevWord() = 0;
+ //move the current position to the previous line.
+ virtual FX_BOOL PrevLine() = 0;
+ //move the current position to the previous section.
+ virtual FX_BOOL PrevSection() = 0;
+
+ //get the information of the current word.
+ virtual FX_BOOL GetWord(CPVT_Word & word) const = 0;
+ //get the information of the current line.
+ virtual FX_BOOL GetLine(CPVT_Line & line) const = 0;
+ //get the information of the current section.
+ virtual FX_BOOL GetSection(CPVT_Section & section) const = 0;
+ //set the current position.
+ virtual void SetAt(FX_INT32 nWordIndex) = 0;
+ //set the current position.
+ virtual void SetAt(const CPVT_WordPlace & place) = 0;
+ //get the current position.
+ virtual const CPVT_WordPlace & GetAt() const = 0;
+
+ //get the edit which this iterator belongs to
+ virtual IFX_Edit* GetEdit() const = 0;
+};
+
+class IFX_Edit_UndoItem
+{
+public:
+ virtual void Undo() = 0;
+ virtual void Redo() = 0;
+ virtual CFX_WideString GetUndoTitle() = 0;
+ virtual void Release() = 0;
+};
+
+class FXET_CLASS IFX_Edit
+{
+public:
+ static IFX_Edit* NewEdit();
+ static void DelEdit(IFX_Edit* pEdit);
+
+public:
+ //set a IFX_Edit_FontMap pointer implemented by user.
+ virtual void SetFontMap(IFX_Edit_FontMap* pFontMap) = 0;
+ //if user don't like to use FontMap, implement VTProvider and set it directly.
+ virtual void SetVTProvider(IPDF_VariableText_Provider* pProvider) = 0;
+ //set a IFX_Edit_Notify pointer implemented by user.
+ virtual void SetNotify(IFX_Edit_Notify * pNotify) = 0;
+ virtual void SetOprNotify(IFX_Edit_OprNotify* pOprNotify) = 0;
+ //get a pointer allocated by CPDF_Edit, by this pointer, user can iterate the contents of edit, but don't need to release.
+ virtual IFX_Edit_Iterator* GetIterator() = 0;
+ //get a VT pointer relative to this edit.
+ virtual IPDF_VariableText* GetVariableText() = 0;
+ //get the IFX_Edit_FontMap pointer set by user.
+ virtual IFX_Edit_FontMap* GetFontMap() = 0;
+
+ //initialize the edit.
+ virtual void Initialize() = 0;
+
+ //set the bounding box of the text area.
+ virtual void SetPlateRect(const CPDF_Rect & rect, FX_BOOL bPaint = TRUE) = 0;
+ //set the scroll origin
+ virtual void SetScrollPos(const CPDF_Point & point) = 0;
+
+ //set the horizontal text alignment in text box, nFormat (0:left 1:middle 2:right).
+ virtual void SetAlignmentH(FX_INT32 nFormat = 0, FX_BOOL bPaint = TRUE) = 0;
+ //set the vertical text alignment in text box, nFormat (0:top 1:center 2:bottom).
+ virtual void SetAlignmentV(FX_INT32 nFormat = 0, FX_BOOL bPaint = TRUE) = 0;
+ //if the text is shown in secret , set a character for substitute.
+ virtual void SetPasswordChar(FX_WORD wSubWord = '*', FX_BOOL bPaint = TRUE) = 0;
+ //set the maximal count of words of the text.
+ virtual void SetLimitChar(FX_INT32 nLimitChar = 0, FX_BOOL bPaint = TRUE) = 0;
+ //if set the count of charArray , then all words is shown in equal space.
+ virtual void SetCharArray(FX_INT32 nCharArray = 0, FX_BOOL bPaint = TRUE) = 0;
+ //set the space of two characters.
+ virtual void SetCharSpace(FX_FLOAT fCharSpace = 0.0f, FX_BOOL bPaint = TRUE) = 0;
+ //set the horizontal scale of all characters.
+ virtual void SetHorzScale(FX_INT32 nHorzScale = 100, FX_BOOL bPaint = TRUE) = 0;
+ //set the leading of all lines
+ virtual void SetLineLeading(FX_FLOAT fLineLeading, FX_BOOL bPaint = TRUE) = 0;
+ //if set, CRLF is allowed.
+ virtual void SetMultiLine(FX_BOOL bMultiLine = TRUE, FX_BOOL bPaint = TRUE) = 0;
+ //if set, all words auto fit the width of the bounding box.
+ virtual void SetAutoReturn(FX_BOOL bAuto = TRUE, FX_BOOL bPaint = TRUE) = 0;
+ //if set, a font size is calculated to full fit the bounding box.
+ virtual void SetAutoFontSize(FX_BOOL bAuto = TRUE, FX_BOOL bPaint = TRUE) = 0;
+ //is set, the text is allowed to scroll.
+ virtual void SetAutoScroll(FX_BOOL bAuto = TRUE, FX_BOOL bPaint = TRUE) = 0;
+ //set the font size of all words.
+ virtual void SetFontSize(FX_FLOAT fFontSize, FX_BOOL bPaint = TRUE) = 0;
+ //the text is allowed to auto-scroll, allow the text overflow?
+ virtual void SetTextOverflow(FX_BOOL bAllowed = FALSE, FX_BOOL bPaint = TRUE) = 0;
+
+ //query if the edit is richedit.
+ virtual FX_BOOL IsRichText() const = 0;
+ //set the edit is richedit.
+ virtual void SetRichText(FX_BOOL bRichText = TRUE, FX_BOOL bPaint = TRUE) = 0;
+ //set the fontsize of selected text.
+ virtual FX_BOOL SetRichFontSize(FX_FLOAT fFontSize) = 0;
+ //set the fontindex of selected text, user can change the font of selected text.
+ virtual FX_BOOL SetRichFontIndex(FX_INT32 nFontIndex) = 0;
+ //set the textcolor of selected text.
+ virtual FX_BOOL SetRichTextColor(FX_COLORREF dwColor) = 0;
+ //set the text script type of selected text. (0:normal 1:superscript 2:subscript)
+ virtual FX_BOOL SetRichTextScript(FX_INT32 nScriptType) = 0;
+ //set the bold font style of selected text.
+ virtual FX_BOOL SetRichTextBold(FX_BOOL bBold = TRUE) = 0;
+ //set the italic font style of selected text.
+ virtual FX_BOOL SetRichTextItalic(FX_BOOL bItalic = TRUE) = 0;
+ //set the underline style of selected text.
+ virtual FX_BOOL SetRichTextUnderline(FX_BOOL bUnderline = TRUE) = 0;
+ //set the crossout style of selected text.
+ virtual FX_BOOL SetRichTextCrossout(FX_BOOL bCrossout = TRUE) = 0;
+ //set the charspace of selected text, in user coordinate.
+ virtual FX_BOOL SetRichTextCharSpace(FX_FLOAT fCharSpace) = 0;
+ //set the horizontal scale of selected text, default value is 100.
+ virtual FX_BOOL SetRichTextHorzScale(FX_INT32 nHorzScale = 100) = 0;
+ //set the leading of selected section, in user coordinate.
+ virtual FX_BOOL SetRichTextLineLeading(FX_FLOAT fLineLeading) = 0;
+ //set the indent of selected section, in user coordinate.
+ virtual FX_BOOL SetRichTextLineIndent(FX_FLOAT fLineIndent) = 0;
+ //set the alignment of selected section, nAlignment(0:left 1:middle 2:right)
+ virtual FX_BOOL SetRichTextAlignment(FX_INT32 nAlignment) = 0;
+
+ //set the selected range of text.
+ //if nStartChar == 0 and nEndChar == -1, select all the text.
+ virtual void SetSel(FX_INT32 nStartChar,FX_INT32 nEndChar) = 0;
+ //get the selected range of text.
+ virtual void GetSel(FX_INT32 & nStartChar, FX_INT32 & nEndChar) const = 0;
+ //select all the text.
+ virtual void SelectAll() = 0;
+ //set text is not selected.
+ virtual void SelectNone() = 0;
+ //get the caret position.
+ virtual FX_INT32 GetCaret() const = 0;
+ virtual CPVT_WordPlace GetCaretWordPlace() const = 0;
+ //get the string of selected text.
+ virtual CFX_WideString GetSelText() const = 0;
+ //get the text conent
+ virtual CFX_WideString GetText() const = 0;
+ //query if any text is selected.
+ virtual FX_BOOL IsSelected() const = 0;
+ //get the scroll origin
+ virtual CPDF_Point GetScrollPos() const = 0;
+ //get the bounding box of the text area.
+ virtual CPDF_Rect GetPlateRect() const = 0;
+ //get the fact area of the text.
+ virtual CPDF_Rect GetContentRect() const = 0;
+ //get the visible word range
+ virtual CPVT_WordRange GetVisibleWordRange() const = 0;
+ //get the whole word range
+ virtual CPVT_WordRange GetWholeWordRange() const = 0;
+ //get the word range of select text
+ virtual CPVT_WordRange GetSelectWordRange() const = 0;
+
+ //send the mousedown message to edit for response.
+ //if Shift key is hold, bShift is TRUE, is Ctrl key is hold, bCtrl is TRUE.
+ virtual void OnMouseDown(const CPDF_Point & point,FX_BOOL bShift,FX_BOOL bCtrl) = 0;
+ //send the mousemove message to edit when mouse down is TRUE.
+ virtual void OnMouseMove(const CPDF_Point & point,FX_BOOL bShift,FX_BOOL bCtrl) = 0;
+ //send the UP key message to edit.
+ virtual void OnVK_UP(FX_BOOL bShift,FX_BOOL bCtrl) = 0;
+ //send the DOWN key message to edit.
+ virtual void OnVK_DOWN(FX_BOOL bShift,FX_BOOL bCtrl) = 0;
+ //send the LEFT key message to edit.
+ virtual void OnVK_LEFT(FX_BOOL bShift,FX_BOOL bCtrl) = 0;
+ //send the RIGHT key message to edit.
+ virtual void OnVK_RIGHT(FX_BOOL bShift,FX_BOOL bCtrl) = 0;
+ //send the HOME key message to edit.
+ virtual void OnVK_HOME(FX_BOOL bShift,FX_BOOL bCtrl) = 0;
+ //send the END key message to edit.
+ virtual void OnVK_END(FX_BOOL bShift,FX_BOOL bCtrl) = 0;
+
+ //put text into edit.
+ virtual void SetText(FX_LPCWSTR text,FX_INT32 charset = DEFAULT_CHARSET,
+ const CPVT_SecProps * pSecProps = NULL,const CPVT_WordProps * pWordProps = NULL) = 0;
+ //insert a word into the edit.
+ virtual FX_BOOL InsertWord(FX_WORD word, FX_INT32 charset = DEFAULT_CHARSET, const CPVT_WordProps * pWordProps = NULL) = 0;
+ //insert a return into the edit.
+ virtual FX_BOOL InsertReturn(const CPVT_SecProps * pSecProps = NULL,const CPVT_WordProps * pWordProps = NULL) = 0;
+ //insert text into the edit.
+ virtual FX_BOOL InsertText(FX_LPCWSTR text, FX_INT32 charset = DEFAULT_CHARSET,
+ const CPVT_SecProps * pSecProps = NULL,const CPVT_WordProps * pWordProps = NULL) = 0;
+ //do backspace operation.
+ virtual FX_BOOL Backspace() = 0;
+ //do delete operation.
+ virtual FX_BOOL Delete() = 0;
+ //delete the selected text.
+ virtual FX_BOOL Clear() = 0;
+
+ //do Redo operation.
+ virtual FX_BOOL Redo() = 0;
+ //do Undo operation.
+ virtual FX_BOOL Undo() = 0;
+ //move caret
+ virtual void SetCaret(FX_INT32 nPos) = 0;
+
+ //arrange all words over again
+ virtual void Paint() = 0;
+
+ //allow to refresh screen?
+ virtual void EnableRefresh(FX_BOOL bRefresh) = 0;
+
+ virtual void RefreshWordRange(const CPVT_WordRange& wr) = 0;
+
+ //allow undo/redo?
+ virtual void EnableUndo(FX_BOOL bUndo) = 0;
+
+ //allow notify?
+ virtual void EnableNotify(FX_BOOL bNotify) = 0;
+
+ //allow opr notify?
+ virtual void EnableOprNotify(FX_BOOL bNotify) = 0;
+
+ //map word place to word index.
+ virtual FX_INT32 WordPlaceToWordIndex(const CPVT_WordPlace & place) const = 0;
+ //map word index to word place.
+ virtual CPVT_WordPlace WordIndexToWordPlace(FX_INT32 index) const = 0;
+
+ //get the beginning position of a line
+ virtual CPVT_WordPlace GetLineBeginPlace(const CPVT_WordPlace & place) const = 0;
+
+ //get the ending position of a line
+ virtual CPVT_WordPlace GetLineEndPlace(const CPVT_WordPlace & place) const = 0;
+
+ //get the beginning position of a section
+ virtual CPVT_WordPlace GetSectionBeginPlace(const CPVT_WordPlace & place) const = 0;
+
+ //get the ending position of a section
+ virtual CPVT_WordPlace GetSectionEndPlace(const CPVT_WordPlace & place) const = 0;
+
+ //search a wordplace form point
+ virtual CPVT_WordPlace SearchWordPlace(const CPDF_Point& point) const = 0;
+
+ //get the font size of non_rich text or default font size of richtext.
+ virtual FX_FLOAT GetFontSize() const = 0;
+ //get the mask character.
+ virtual FX_WORD GetPasswordChar() const = 0;
+ //get the count of charArray
+ virtual FX_INT32 GetCharArray() const = 0;
+ //get the horizontal scale of all characters
+ virtual FX_INT32 GetHorzScale() const = 0;
+ //get the space of two characters
+ virtual FX_FLOAT GetCharSpace() const = 0;
+ //get the latin words of specified range
+ virtual CFX_WideString GetRangeText(const CPVT_WordRange & range) const = 0;
+ //is the text full in bounding box
+ virtual FX_BOOL IsTextFull() const = 0;
+ virtual FX_BOOL CanUndo() const = 0;
+ virtual FX_BOOL CanRedo() const = 0;
+ //if the content is changed after settext?
+ virtual FX_BOOL IsModified() const = 0;
+ //get the total words in edit
+ virtual FX_INT32 GetTotalWords() const = 0;
+
+ virtual void AddUndoItem(IFX_Edit_UndoItem* pUndoItem) = 0;
+
+public:
+ static CFX_ByteString GetEditAppearanceStream(IFX_Edit* pEdit, const CPDF_Point & ptOffset,
+ const CPVT_WordRange* pRange = NULL,
+ FX_BOOL bContinuous = TRUE, FX_WORD SubWord = 0);
+ static CFX_ByteString GetSelectAppearanceStream(IFX_Edit* pEdit, const CPDF_Point & ptOffset, const CPVT_WordRange* pRange = NULL);
+ static void DrawEdit(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device, IFX_Edit* pEdit, FX_COLORREF crTextFill, FX_COLORREF crTextStroke,
+ const CPDF_Rect& rcClip, const CPDF_Point& ptOffset, const CPVT_WordRange* pRange, IFX_SystemHandler* pSystemHandler, void* pFFLData);
+ static void DrawUnderline(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device, IFX_Edit* pEdit, FX_COLORREF color,
+ const CPDF_Rect& rcClip, const CPDF_Point& ptOffset, const CPVT_WordRange* pRange);
+ static void DrawRichEdit(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device, IFX_Edit* pEdit,
+ const CPDF_Rect& rcClip, const CPDF_Point& ptOffset, const CPVT_WordRange* pRange);
+ static void GeneratePageObjects(CPDF_PageObjects* pPageObjects, IFX_Edit* pEdit,
+ const CPDF_Point& ptOffset, const CPVT_WordRange* pRange, FX_COLORREF crText, CFX_ArrayTemplate<CPDF_TextObject*>& ObjArray);
+ static void GenerateRichPageObjects(CPDF_PageObjects* pPageObjects, IFX_Edit* pEdit,
+ const CPDF_Point& ptOffset, const CPVT_WordRange* pRange, CFX_ArrayTemplate<CPDF_TextObject*>& ObjArray);
+ static void GenerateUnderlineObjects(CPDF_PageObjects* pPageObjects, IFX_Edit* pEdit,
+ const CPDF_Point& ptOffset, const CPVT_WordRange* pRange, FX_COLORREF color);
+};
+
+class IFX_List_Notify
+{
+ //this class is implemented by user
+public:
+ //set the horizontal scrollbar information.
+ virtual void IOnSetScrollInfoX(FX_FLOAT fPlateMin, FX_FLOAT fPlateMax,
+ FX_FLOAT fContentMin, FX_FLOAT fContentMax,
+ FX_FLOAT fSmallStep, FX_FLOAT fBigStep) = 0;
+ //set the vertical scrollbar information.
+ virtual void IOnSetScrollInfoY(FX_FLOAT fPlateMin, FX_FLOAT fPlateMax,
+ FX_FLOAT fContentMin, FX_FLOAT fContentMax,
+ FX_FLOAT fSmallStep, FX_FLOAT fBigStep) = 0;
+ //set the position of horizontal scrollbar.
+ virtual void IOnSetScrollPosX(FX_FLOAT fx) = 0;
+ //set the position of vertical scrollbar.
+ virtual void IOnSetScrollPosY(FX_FLOAT fy) = 0;
+ //Invalidate the rectangle relative to the bounding box of edit.
+ virtual void IOnInvalidateRect(CPDF_Rect * pRect) = 0;
+};
+
+class FXET_CLASS IFX_List
+{
+public:
+ static IFX_List* NewList();
+ static void DelList(IFX_List* pList);
+
+public:
+ virtual void SetFontMap(IFX_Edit_FontMap * pFontMap) = 0;
+ virtual void SetNotify(IFX_List_Notify * pNotify) = 0;
+
+ virtual void SetPlateRect(const CPDF_Rect & rect) = 0;
+ virtual void SetFontSize(FX_FLOAT fFontSize) = 0;
+
+ virtual CPDF_Rect GetPlateRect() const = 0;
+ virtual CPDF_Rect GetContentRect() const = 0;
+
+ virtual FX_FLOAT GetFontSize() const = 0;
+ virtual IFX_Edit* GetItemEdit(FX_INT32 nIndex) const = 0;
+ virtual FX_INT32 GetCount() const = 0;
+ virtual FX_BOOL IsItemSelected(FX_INT32 nIndex) const = 0;
+ virtual FX_FLOAT GetFirstHeight() const = 0;
+
+ virtual void SetMultipleSel(FX_BOOL bMultiple) = 0;
+ virtual FX_BOOL IsMultipleSel() const = 0;
+ virtual FX_BOOL IsValid(FX_INT32 nItemIndex) const = 0;
+ virtual FX_INT32 FindNext(FX_INT32 nIndex,FX_WCHAR nChar) const = 0;
+
+ virtual void SetScrollPos(const CPDF_Point & point) = 0;
+ virtual void ScrollToListItem(FX_INT32 nItemIndex) = 0;
+ virtual CPDF_Rect GetItemRect(FX_INT32 nIndex) const = 0;
+ virtual FX_INT32 GetCaret() const = 0;
+ virtual FX_INT32 GetSelect() const = 0;
+ virtual FX_INT32 GetTopItem() const = 0;
+ virtual FX_INT32 GetItemIndex(const CPDF_Point & point) const = 0;
+ virtual FX_INT32 GetFirstSelected() const = 0;
+
+ virtual void AddString(FX_LPCWSTR string) = 0;
+ virtual void SetTopItem(FX_INT32 nIndex) = 0;
+ virtual void Select(FX_INT32 nItemIndex) = 0;
+ virtual void SetCaret(FX_INT32 nItemIndex) = 0;
+ virtual void Empty() = 0;
+ virtual void Cancel() = 0;
+ virtual CFX_WideString GetText() const = 0;
+
+
+ virtual void OnMouseDown(const CPDF_Point & point,FX_BOOL bShift,FX_BOOL bCtrl) = 0;
+ virtual void OnMouseMove(const CPDF_Point & point,FX_BOOL bShift,FX_BOOL bCtrl) = 0;
+ virtual void OnVK_UP(FX_BOOL bShift,FX_BOOL bCtrl) = 0;
+ virtual void OnVK_DOWN(FX_BOOL bShift,FX_BOOL bCtrl) = 0;
+ virtual void OnVK_LEFT(FX_BOOL bShift,FX_BOOL bCtrl) = 0;
+ virtual void OnVK_RIGHT(FX_BOOL bShift,FX_BOOL bCtrl) = 0;
+ virtual void OnVK_HOME(FX_BOOL bShift,FX_BOOL bCtrl) = 0;
+ virtual void OnVK_END(FX_BOOL bShift,FX_BOOL bCtrl) = 0;
+ virtual void OnVK(FX_INT32 nItemIndex,FX_BOOL bShift,FX_BOOL bCtrl) = 0;
+ virtual FX_BOOL OnChar(FX_WORD nChar,FX_BOOL bShift,FX_BOOL bCtrl) = 0;
+};
+
+#endif
+
diff --git a/fpdfsdk/include/fxedit/fxet_edit.h b/fpdfsdk/include/fxedit/fxet_edit.h new file mode 100644 index 0000000000..72b780956d --- /dev/null +++ b/fpdfsdk/include/fxedit/fxet_edit.h @@ -0,0 +1,823 @@ +// 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 _FXET_EDIT_H_
+#define _FXET_EDIT_H_
+
+#include "fx_edit.h"
+
+class CFX_Edit_Page;
+struct CFX_Edit_LineRect;
+class CFX_Edit_LineRectArray;
+class CFX_Edit_RectArray;
+class CFX_Edit_Refresh;
+class CFX_Edit_Select;
+class CFX_Edit;
+class CFX_Edit_Iterator;
+class CFX_Edit_Refresh;
+class CFX_Edit_UndoItem;
+class CFX_Edit_Undo;
+class CFX_Edit_Provider;
+
+#define FX_EDIT_IsFloatZero(f) (f < 0.0001 && f > -0.0001)
+#define FX_EDIT_IsFloatEqual(fa,fb) FX_EDIT_IsFloatZero(fa - fb)
+#define FX_EDIT_IsFloatBigger(fa,fb) (fa > fb && !FX_EDIT_IsFloatEqual(fa,fb))
+#define FX_EDIT_IsFloatSmaller(fa,fb) (fa < fb && !FX_EDIT_IsFloatEqual(fa,fb))
+
+template<class T> T FX_EDIT_MIN (const T & i, const T & j) { return ((i < j) ? i : j); }
+template<class T> T FX_EDIT_MAX (const T & i, const T & j) { return ((i > j) ? i : j); }
+
+#define FX_EDIT_PI 3.14159265358979f
+#define FX_EDIT_ITALIC_ANGEL 10 * FX_EDIT_PI / 180.0f
+
+
+/* ------------------------- CFX_Edit_Refresh ---------------------------- */
+
+enum REFRESH_PLAN_E
+{
+ RP_ANALYSE,
+ RP_NOANALYSE,
+ RP_OPTIONAL
+};
+
+enum EDIT_PROPS_E
+{
+ EP_LINELEADING,
+ EP_LINEINDENT,
+ EP_ALIGNMENT,
+ EP_FONTINDEX,
+ EP_FONTSIZE,
+ EP_WORDCOLOR,
+ EP_SCRIPTTYPE,
+ EP_UNDERLINE,
+ EP_CROSSOUT,
+ EP_CHARSPACE,
+ EP_HORZSCALE,
+ EP_BOLD,
+ EP_ITALIC
+};
+
+struct CFX_Edit_LineRect
+{
+ CFX_Edit_LineRect(const CPVT_WordRange & wrLine,const CPDF_Rect & rcLine) :
+ m_wrLine(wrLine), m_rcLine(rcLine)
+ {
+ }
+
+ FX_BOOL operator != (const CFX_Edit_LineRect & linerect) const
+ {
+ return FXSYS_memcmp(this, &linerect, sizeof(CFX_Edit_LineRect)) != 0;
+ }
+
+ FX_BOOL IsSameHeight(const CFX_Edit_LineRect & linerect) const
+ {
+ return FX_EDIT_IsFloatZero((m_rcLine.top - m_rcLine.bottom) - (linerect.m_rcLine.top -linerect.m_rcLine.bottom));
+ }
+
+ FX_BOOL IsSameTop(const CFX_Edit_LineRect & linerect) const
+ {
+ return FX_EDIT_IsFloatZero(m_rcLine.top - linerect.m_rcLine.top);
+ }
+
+ FX_BOOL IsSameLeft(const CFX_Edit_LineRect & linerect) const
+ {
+ return FX_EDIT_IsFloatZero(m_rcLine.left - linerect.m_rcLine.left);
+ }
+
+ FX_BOOL IsSameRight(const CFX_Edit_LineRect & linerect) const
+ {
+ return FX_EDIT_IsFloatZero(m_rcLine.right - linerect.m_rcLine.right);
+ }
+
+ CPVT_WordRange m_wrLine;
+ CPDF_Rect m_rcLine;
+};
+
+class CFX_Edit_LineRectArray
+{
+public:
+ CFX_Edit_LineRectArray()
+ {
+ }
+
+ virtual ~CFX_Edit_LineRectArray()
+ {
+ Empty();
+ }
+
+ void Empty()
+ {
+ for (FX_INT32 i = 0, sz = m_LineRects.GetSize(); i < sz; i++)
+ delete m_LineRects.GetAt(i);
+
+ m_LineRects.RemoveAll();
+ }
+
+ void RemoveAll()
+ {
+ m_LineRects.RemoveAll();
+ }
+
+ void operator = (CFX_Edit_LineRectArray & rects)
+ {
+ Empty();
+ for (FX_INT32 i = 0, sz = rects.GetSize(); i < sz; i++)
+ m_LineRects.Add(rects.GetAt(i));
+
+ rects.RemoveAll();
+ }
+
+ void Add(const CPVT_WordRange & wrLine,const CPDF_Rect & rcLine)
+ {
+ if (CFX_Edit_LineRect * pRect = new CFX_Edit_LineRect(wrLine,rcLine))
+ m_LineRects.Add(pRect);
+ }
+
+ FX_INT32 GetSize() const
+ {
+ return m_LineRects.GetSize();
+ }
+
+ CFX_Edit_LineRect * GetAt(FX_INT32 nIndex) const
+ {
+ if (nIndex < 0 || nIndex >= m_LineRects.GetSize())
+ return NULL;
+
+ return m_LineRects.GetAt(nIndex);
+ }
+
+ CFX_ArrayTemplate<CFX_Edit_LineRect*> m_LineRects;
+};
+
+class CFX_Edit_RectArray
+{
+public:
+ CFX_Edit_RectArray()
+ {
+ }
+
+ virtual ~CFX_Edit_RectArray()
+ {
+ this->Empty();
+ }
+
+ void Empty()
+ {
+ for (FX_INT32 i = 0, sz = m_Rects.GetSize(); i < sz; i++)
+ delete m_Rects.GetAt(i);
+
+ this->m_Rects.RemoveAll();
+ }
+
+ void Add(const CPDF_Rect & rect)
+ {
+ //check for overlaped area
+ for (FX_INT32 i = 0, sz = m_Rects.GetSize(); i < sz; i++)
+ if (CPDF_Rect * pRect = m_Rects.GetAt(i))
+ if (pRect->Contains(rect))return;
+
+ if (CPDF_Rect * pNewRect = new CPDF_Rect(rect))
+ m_Rects.Add(pNewRect);
+ }
+
+ FX_INT32 GetSize() const
+ {
+ return m_Rects.GetSize();
+ }
+
+ CPDF_Rect * GetAt(FX_INT32 nIndex) const
+ {
+ if (nIndex < 0 || nIndex >= m_Rects.GetSize())
+ return NULL;
+
+ return m_Rects.GetAt(nIndex);
+ }
+
+ CFX_ArrayTemplate<CPDF_Rect*> m_Rects;
+};
+
+class CFX_Edit_Refresh
+{
+public:
+ CFX_Edit_Refresh();
+ virtual ~CFX_Edit_Refresh();
+
+ void BeginRefresh();
+ void Push(const CPVT_WordRange & linerange,const CPDF_Rect & rect);
+ void NoAnalyse();
+ void Analyse(FX_INT32 nAlignment);
+ void AddRefresh(const CPDF_Rect & rect);
+ const CFX_Edit_RectArray * GetRefreshRects() const;
+ void EndRefresh();
+
+private:
+ CFX_Edit_LineRectArray m_NewLineRects;
+ CFX_Edit_LineRectArray m_OldLineRects;
+ CFX_Edit_RectArray m_RefreshRects;
+};
+
+
+/* ------------------------- CFX_Edit_Select ---------------------------- */
+
+class CFX_Edit_Select
+{
+public:
+ CFX_Edit_Select()
+ {
+ }
+
+ CFX_Edit_Select(const CPVT_WordPlace & begin,const CPVT_WordPlace & end)
+ {
+ Set(begin,end);
+ }
+
+ CFX_Edit_Select(const CPVT_WordRange & range)
+ {
+ Set(range.BeginPos,range.EndPos);
+ }
+
+ CPVT_WordRange ConvertToWordRange() const
+ {
+ return CPVT_WordRange(this->BeginPos,this->EndPos);
+ }
+
+ void Default()
+ {
+ BeginPos.Default();
+ EndPos.Default();
+ }
+
+ void Set(const CPVT_WordPlace & begin,const CPVT_WordPlace & end)
+ {
+ this->BeginPos = begin;
+ this->EndPos = end;
+ }
+
+ void SetBeginPos(const CPVT_WordPlace & begin)
+ {
+ this->BeginPos = begin;
+ }
+
+ void SetEndPos(const CPVT_WordPlace & end)
+ {
+ this->EndPos = end;
+ }
+
+ FX_BOOL IsExist() const
+ {
+ return this->BeginPos != this->EndPos;
+ }
+
+ FX_BOOL operator != (const CPVT_WordRange & wr) const
+ {
+ return wr.BeginPos != this->BeginPos || wr.EndPos != this->EndPos;
+ }
+
+ CPVT_WordPlace BeginPos,EndPos;
+};
+
+/* ------------------------- CFX_Edit_Undo ---------------------------- */
+
+class CFX_Edit_Undo
+{
+public:
+ CFX_Edit_Undo(FX_INT32 nBufsize = 10000);
+ virtual ~CFX_Edit_Undo();
+
+ void Undo();
+ void Redo();
+
+ void AddItem(IFX_Edit_UndoItem* pItem);
+
+ FX_BOOL CanUndo() const;
+ FX_BOOL CanRedo() const;
+ FX_BOOL IsModified() const;
+ FX_BOOL IsWorking() const;
+
+ void Reset();
+
+ IFX_Edit_UndoItem* GetItem(FX_INT32 nIndex);
+ FX_INT32 GetItemCount(){return m_UndoItemStack.GetSize();}
+ FX_INT32 GetCurUndoPos(){return m_nCurUndoPos;}
+
+private:
+ void SetBufSize(FX_INT32 nSize){m_nBufSize = nSize;}
+ FX_INT32 GetBufSize(){return m_nBufSize;}
+
+ void RemoveHeads();
+ void RemoveTails();
+
+private:
+ CFX_ArrayTemplate<IFX_Edit_UndoItem*> m_UndoItemStack;
+
+ FX_INT32 m_nCurUndoPos;
+ FX_INT32 m_nBufSize;
+ FX_BOOL m_bModified;
+ FX_BOOL m_bVirgin;
+ FX_BOOL m_bWorking;
+};
+
+class CFX_Edit_UndoItem : public IFX_Edit_UndoItem
+{
+public:
+ CFX_Edit_UndoItem() : m_bFirst(TRUE), m_bLast(TRUE) {}
+ virtual ~CFX_Edit_UndoItem(){}
+
+ virtual CFX_WideString GetUndoTitle() {return L"";}
+ virtual void Release(){delete this;}
+
+public:
+ void SetFirst(FX_BOOL bFirst){m_bFirst = bFirst;}
+ FX_BOOL IsFirst(){return m_bFirst;}
+ void SetLast(FX_BOOL bLast){m_bLast = bLast;}
+ FX_BOOL IsLast(){return m_bLast;}
+
+private:
+ FX_BOOL m_bFirst;
+ FX_BOOL m_bLast;
+};
+
+class CFX_Edit_GroupUndoItem : public IFX_Edit_UndoItem
+{
+public:
+ CFX_Edit_GroupUndoItem(const CFX_WideString& sTitle);
+ virtual ~CFX_Edit_GroupUndoItem();
+
+ void AddUndoItem(CFX_Edit_UndoItem* pUndoItem);
+ void UpdateItems();
+
+public:
+ virtual void Undo();
+ virtual void Redo();
+ virtual CFX_WideString GetUndoTitle();
+ virtual void Release();
+
+private:
+ CFX_WideString m_sTitle;
+ CFX_ArrayTemplate<CFX_Edit_UndoItem*> m_Items;
+};
+
+/* ------------------------- CFX_Edit_UndoItem derived classes ---------------------------- */
+
+class CFXEU_InsertWord : public CFX_Edit_UndoItem
+{
+public:
+ CFXEU_InsertWord(CFX_Edit * pEdit, const CPVT_WordPlace & wpOldPlace, const CPVT_WordPlace & wpNewPlace,
+ FX_WORD word, FX_INT32 charset, const CPVT_WordProps * pWordProps);
+ virtual ~CFXEU_InsertWord();
+
+ void Redo();
+ void Undo();
+
+private:
+ CFX_Edit* m_pEdit;
+
+ CPVT_WordPlace m_wpOld;
+ CPVT_WordPlace m_wpNew;
+ FX_WORD m_Word;
+ FX_INT32 m_nCharset;
+ CPVT_WordProps m_WordProps;
+};
+
+class CFXEU_InsertReturn : public CFX_Edit_UndoItem
+{
+public:
+ CFXEU_InsertReturn(CFX_Edit * pEdit, const CPVT_WordPlace & wpOldPlace, const CPVT_WordPlace & wpNewPlace,
+ const CPVT_SecProps * pSecProps, const CPVT_WordProps * pWordProps);
+ virtual ~CFXEU_InsertReturn();
+
+ void Redo();
+ void Undo();
+
+private:
+ CFX_Edit * m_pEdit;
+
+ CPVT_WordPlace m_wpOld;
+ CPVT_WordPlace m_wpNew;
+ CPVT_SecProps m_SecProps;
+ CPVT_WordProps m_WordProps;
+};
+
+class CFXEU_Backspace : public CFX_Edit_UndoItem
+{
+public:
+ CFXEU_Backspace(CFX_Edit * pEdit, const CPVT_WordPlace & wpOldPlace, const CPVT_WordPlace & wpNewPlace,
+ FX_WORD word, FX_INT32 charset,
+ const CPVT_SecProps & SecProps, const CPVT_WordProps & WordProps);
+ virtual ~CFXEU_Backspace();
+
+ void Redo();
+ void Undo();
+
+private:
+ CFX_Edit * m_pEdit;
+
+ CPVT_WordPlace m_wpOld;
+ CPVT_WordPlace m_wpNew;
+ FX_WORD m_Word;
+ FX_INT32 m_nCharset;
+ CPVT_SecProps m_SecProps;
+ CPVT_WordProps m_WordProps;
+};
+
+class CFXEU_Delete : public CFX_Edit_UndoItem
+{
+public:
+ CFXEU_Delete(CFX_Edit * pEdit, const CPVT_WordPlace & wpOldPlace, const CPVT_WordPlace & wpNewPlace,
+ FX_WORD word, FX_INT32 charset,
+ const CPVT_SecProps & SecProps, const CPVT_WordProps & WordProps, FX_BOOL bSecEnd);
+ virtual ~CFXEU_Delete();
+
+ void Redo();
+ void Undo();
+
+private:
+ CFX_Edit * m_pEdit;
+
+ CPVT_WordPlace m_wpOld;
+ CPVT_WordPlace m_wpNew;
+ FX_WORD m_Word;
+ FX_INT32 m_nCharset;
+ CPVT_SecProps m_SecProps;
+ CPVT_WordProps m_WordProps;
+ FX_BOOL m_bSecEnd;
+};
+
+class CFXEU_Clear : public CFX_Edit_UndoItem
+{
+public:
+ CFXEU_Clear(CFX_Edit * pEdit, const CPVT_WordRange & wrSel, const CFX_WideString & swText);
+ virtual ~CFXEU_Clear();
+
+ void Redo();
+ void Undo();
+
+private:
+ CFX_Edit* m_pEdit;
+
+ CPVT_WordRange m_wrSel;
+ CFX_WideString m_swText;
+};
+
+class CFXEU_ClearRich : public CFX_Edit_UndoItem
+{
+public:
+ CFXEU_ClearRich(CFX_Edit * pEdit, const CPVT_WordPlace & wpOldPlace, const CPVT_WordPlace & wpNewPlace,
+ const CPVT_WordRange & wrSel,
+ FX_WORD word, FX_INT32 charset,
+ const CPVT_SecProps & SecProps, const CPVT_WordProps & WordProps);
+ virtual ~CFXEU_ClearRich();
+
+ void Redo();
+ void Undo();
+
+private:
+ CFX_Edit * m_pEdit;
+
+ CPVT_WordPlace m_wpOld;
+ CPVT_WordPlace m_wpNew;
+ CPVT_WordRange m_wrSel;
+ FX_WORD m_Word;
+ FX_INT32 m_nCharset;
+ CPVT_SecProps m_SecProps;
+ CPVT_WordProps m_WordProps;
+};
+
+class CFXEU_InsertText : public CFX_Edit_UndoItem
+{
+public:
+ CFXEU_InsertText(CFX_Edit * pEdit, const CPVT_WordPlace & wpOldPlace, const CPVT_WordPlace & wpNewPlace,
+ const CFX_WideString & swText, FX_INT32 charset,
+ const CPVT_SecProps * pSecProps, const CPVT_WordProps * pWordProps);
+ virtual ~CFXEU_InsertText();
+
+ void Redo();
+ void Undo();
+
+private:
+ CFX_Edit * m_pEdit;
+
+ CPVT_WordPlace m_wpOld;
+ CPVT_WordPlace m_wpNew;
+ CFX_WideString m_swText;
+ FX_INT32 m_nCharset;
+ CPVT_SecProps m_SecProps;
+ CPVT_WordProps m_WordProps;
+};
+
+class CFXEU_SetSecProps : public CFX_Edit_UndoItem
+{
+public:
+ 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);
+ virtual ~CFXEU_SetSecProps();
+
+ void Redo();
+ void Undo();
+
+private:
+ CFX_Edit * m_pEdit;
+ CPVT_WordPlace m_wpPlace;
+ CPVT_WordRange m_wrPlace;
+ EDIT_PROPS_E m_eProps;
+
+ CPVT_SecProps m_OldSecProps;
+ CPVT_SecProps m_NewSecProps;
+ CPVT_WordProps m_OldWordProps;
+ CPVT_WordProps m_NewWordProps;
+};
+
+class CFXEU_SetWordProps : public CFX_Edit_UndoItem
+{
+public:
+ 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);
+ virtual ~CFXEU_SetWordProps();
+
+ void Redo();
+ void Undo();
+
+private:
+ CFX_Edit * m_pEdit;
+ CPVT_WordPlace m_wpPlace;
+ CPVT_WordRange m_wrPlace;
+ EDIT_PROPS_E m_eProps;
+
+ CPVT_WordProps m_OldWordProps;
+ CPVT_WordProps m_NewWordProps;
+};
+
+/* ------------------------- CFX_Edit ---------------------------- */
+
+class CFX_Edit : public IFX_Edit
+{
+ friend class CFX_Edit_Iterator;
+ friend class CFXEU_InsertWord;
+ friend class CFXEU_InsertReturn;
+ friend class CFXEU_Backspace;
+ friend class CFXEU_Delete;
+ friend class CFXEU_Clear;
+ friend class CFXEU_ClearRich;
+ friend class CFXEU_SetSecProps;
+ friend class CFXEU_SetWordProps;
+ friend class CFXEU_InsertText;
+
+public:
+ CFX_Edit(IPDF_VariableText * pVT);
+ virtual ~CFX_Edit();
+
+ void SetFontMap(IFX_Edit_FontMap * pFontMap);
+ void SetVTProvider(IPDF_VariableText_Provider* pProvider);
+ void SetNotify(IFX_Edit_Notify * pNotify);
+ void SetOprNotify(IFX_Edit_OprNotify* pOprNotify);
+ IFX_Edit_Iterator* GetIterator();
+ IPDF_VariableText * GetVariableText();
+ IFX_Edit_FontMap* GetFontMap();
+
+ void Initialize();
+ void SetPlateRect(const CPDF_Rect & rect, FX_BOOL bPaint = TRUE);
+ void SetScrollPos(const CPDF_Point & point);
+
+ void SetAlignmentH(FX_INT32 nFormat = 0, FX_BOOL bPaint = TRUE);
+ void SetAlignmentV(FX_INT32 nFormat = 0, FX_BOOL bPaint = TRUE);
+ void SetPasswordChar(FX_WORD wSubWord = '*', FX_BOOL bPaint = TRUE);
+ void SetLimitChar(FX_INT32 nLimitChar = 0, FX_BOOL bPaint = TRUE);
+ void SetCharArray(FX_INT32 nCharArray = 0, FX_BOOL bPaint = TRUE);
+ void SetCharSpace(FX_FLOAT fCharSpace = 0.0f, FX_BOOL bPaint = TRUE);
+ void SetHorzScale(FX_INT32 nHorzScale = 100, FX_BOOL bPaint = TRUE);
+ void SetLineLeading(FX_FLOAT fLineLeading, FX_BOOL bPaint = TRUE);
+ void SetMultiLine(FX_BOOL bMultiLine = TRUE, FX_BOOL bPaint = TRUE);
+ void SetAutoReturn(FX_BOOL bAuto = TRUE, FX_BOOL bPaint = TRUE);
+ void SetAutoFontSize(FX_BOOL bAuto = TRUE, FX_BOOL bPaint = TRUE);
+ void SetAutoScroll(FX_BOOL bAuto = TRUE, FX_BOOL bPaint = TRUE);
+ void SetFontSize(FX_FLOAT fFontSize, FX_BOOL bPaint = TRUE);
+ void SetTextOverflow(FX_BOOL bAllowed = FALSE, FX_BOOL bPaint = TRUE);
+
+ FX_BOOL IsRichText() const;
+ void SetRichText(FX_BOOL bRichText = TRUE, FX_BOOL bPaint = TRUE);
+ FX_BOOL SetRichFontSize(FX_FLOAT fFontSize);
+ FX_BOOL SetRichFontIndex(FX_INT32 nFontIndex);
+ FX_BOOL SetRichTextColor(FX_COLORREF dwColor);
+ FX_BOOL SetRichTextScript(FX_INT32 nScriptType);
+ FX_BOOL SetRichTextBold(FX_BOOL bBold = TRUE);
+ FX_BOOL SetRichTextItalic(FX_BOOL bItalic = TRUE);
+ FX_BOOL SetRichTextUnderline(FX_BOOL bUnderline = TRUE);
+ FX_BOOL SetRichTextCrossout(FX_BOOL bCrossout = TRUE);
+ FX_BOOL SetRichTextCharSpace(FX_FLOAT fCharSpace);
+ FX_BOOL SetRichTextHorzScale(FX_INT32 nHorzScale = 100);
+ FX_BOOL SetRichTextLineLeading(FX_FLOAT fLineLeading);
+ FX_BOOL SetRichTextLineIndent(FX_FLOAT fLineIndent);
+ FX_BOOL SetRichTextAlignment(FX_INT32 nAlignment);
+
+ void OnMouseDown(const CPDF_Point & point,FX_BOOL bShift,FX_BOOL bCtrl);
+ void OnMouseMove(const CPDF_Point & point,FX_BOOL bShift,FX_BOOL bCtrl);
+ void OnVK_UP(FX_BOOL bShift,FX_BOOL bCtrl);
+ void OnVK_DOWN(FX_BOOL bShift,FX_BOOL bCtrl);
+ void OnVK_LEFT(FX_BOOL bShift,FX_BOOL bCtrl);
+ void OnVK_RIGHT(FX_BOOL bShift,FX_BOOL bCtrl);
+ void OnVK_HOME(FX_BOOL bShift,FX_BOOL bCtrl);
+ void OnVK_END(FX_BOOL bShift,FX_BOOL bCtrl);
+
+ void SetText(FX_LPCWSTR text,FX_INT32 charset = DEFAULT_CHARSET,
+ const CPVT_SecProps * pSecProps = NULL,const CPVT_WordProps * pWordProps = NULL);
+ FX_BOOL InsertWord(FX_WORD word, FX_INT32 charset = DEFAULT_CHARSET, const CPVT_WordProps * pWordProps = NULL);
+ FX_BOOL InsertReturn(const CPVT_SecProps * pSecProps = NULL,const CPVT_WordProps * pWordProps = NULL);
+ FX_BOOL Backspace();
+ FX_BOOL Delete();
+ FX_BOOL Clear();
+ FX_BOOL Empty();
+ FX_BOOL InsertText(FX_LPCWSTR text, FX_INT32 charset = DEFAULT_CHARSET,
+ const CPVT_SecProps * pSecProps = NULL,const CPVT_WordProps * pWordProps = NULL);
+ FX_BOOL Redo();
+ FX_BOOL Undo();
+ CPVT_WordPlace DoInsertText(const CPVT_WordPlace& place, FX_LPCWSTR text, FX_INT32 charset,
+ const CPVT_SecProps * pSecProps, const CPVT_WordProps * pWordProps);
+ FX_INT32 GetCharSetFromUnicode(FX_WORD word, FX_INT32 nOldCharset);
+
+ FX_INT32 WordPlaceToWordIndex(const CPVT_WordPlace & place) const;
+ CPVT_WordPlace WordIndexToWordPlace(FX_INT32 index) const;
+
+ CPVT_WordPlace GetLineBeginPlace(const CPVT_WordPlace & place) const;
+ CPVT_WordPlace GetLineEndPlace(const CPVT_WordPlace & place) const;
+ CPVT_WordPlace GetSectionBeginPlace(const CPVT_WordPlace & place) const;
+ CPVT_WordPlace GetSectionEndPlace(const CPVT_WordPlace & place) const;
+ CPVT_WordPlace SearchWordPlace(const CPDF_Point& point) const;
+
+ FX_INT32 GetCaret() const;
+ CPVT_WordPlace GetCaretWordPlace() const;
+ CFX_WideString GetSelText() const;
+ CFX_WideString GetText() const;
+ FX_FLOAT GetFontSize() const;
+ FX_WORD GetPasswordChar() const;
+ CPDF_Point GetScrollPos() const;
+ FX_INT32 GetCharArray() const;
+ CPDF_Rect GetPlateRect() const;
+ CPDF_Rect GetContentRect() const;
+ CFX_WideString GetRangeText(const CPVT_WordRange & range) const;
+ FX_INT32 GetHorzScale() const;
+ FX_FLOAT GetCharSpace() const;
+ FX_INT32 GetTotalWords() const;
+ FX_INT32 GetTotalLines() const;
+
+ void SetSel(FX_INT32 nStartChar,FX_INT32 nEndChar);
+ void GetSel(FX_INT32 & nStartChar, FX_INT32 & nEndChar) const;
+
+private:
+ void SelectAll();
+ void SelectNone();
+ void SetSel(const CPVT_WordPlace & begin,const CPVT_WordPlace & end);
+ FX_BOOL IsSelected() const;
+
+ void RearrangeAll();
+ void RearrangePart(const CPVT_WordRange & range);
+ void Paint();
+ void ScrollToCaret();
+ void SetScrollInfo();
+ void SetScrollPosX(FX_FLOAT fx);
+ void SetScrollPosY(FX_FLOAT fy);
+ void SetScrollLimit();
+ void SetContentChanged();
+ void EnableNotify(FX_BOOL bNotify);
+
+ void SetText(FX_LPCWSTR text,FX_INT32 charset,
+ const CPVT_SecProps * pSecProps,const CPVT_WordProps * pWordProps,FX_BOOL bAddUndo, FX_BOOL bPaint);
+ FX_BOOL InsertWord(FX_WORD word, FX_INT32 charset, const CPVT_WordProps * pWordProps,FX_BOOL bAddUndo, FX_BOOL bPaint);
+ FX_BOOL InsertReturn(const CPVT_SecProps * pSecProps,const CPVT_WordProps * pWordProps,FX_BOOL bAddUndo, FX_BOOL bPaint);
+ FX_BOOL Backspace(FX_BOOL bAddUndo, FX_BOOL bPaint);
+ FX_BOOL Delete(FX_BOOL bAddUndo, FX_BOOL bPaint);
+ FX_BOOL Clear(FX_BOOL bAddUndo, FX_BOOL bPaint);
+ FX_BOOL InsertText(FX_LPCWSTR text, FX_INT32 charset,
+ const CPVT_SecProps * pSecProps,const CPVT_WordProps * pWordProps,FX_BOOL bAddUndo, FX_BOOL bPaint);
+ FX_BOOL SetRichTextProps(EDIT_PROPS_E eProps,
+ const CPVT_SecProps * pSecProps, const CPVT_WordProps * pWordProps);
+ FX_BOOL SetSecProps(EDIT_PROPS_E eProps, const CPVT_WordPlace & place,
+ const CPVT_SecProps * pSecProps, const CPVT_WordProps * pWordProps, const CPVT_WordRange & wr, FX_BOOL bAddUndo);
+ FX_BOOL SetWordProps(EDIT_PROPS_E eProps, const CPVT_WordPlace & place,
+ const CPVT_WordProps * pWordProps, const CPVT_WordRange & wr, FX_BOOL bAddUndo);
+ void PaintSetProps(EDIT_PROPS_E eProps, const CPVT_WordRange & wr);
+ void PaintInsertText(const CPVT_WordPlace & wpOld, const CPVT_WordPlace & wpNew);
+
+ inline CPDF_Point VTToEdit(const CPDF_Point & point) const;
+ inline CPDF_Point EditToVT(const CPDF_Point & point) const;
+ inline CPDF_Rect VTToEdit(const CPDF_Rect & rect) const;
+ inline CPDF_Rect EditToVT(const CPDF_Rect & rect) const;
+
+ void EnableRefresh(FX_BOOL bRefresh);
+ void Refresh(REFRESH_PLAN_E ePlan,const CPVT_WordRange * pRange1 = NULL,const CPVT_WordRange * pRange2 = NULL);
+ void RefreshPushLineRects(const CPVT_WordRange & wr);
+ void RefreshPushRandomRects(const CPVT_WordRange & wr);
+ void RefreshWordRange(const CPVT_WordRange& wr);
+
+ void SetCaret(FX_INT32 nPos);
+ void SetCaret(const CPVT_WordPlace & place);
+ void SetCaretInfo();
+ void SetCaretOrigin();
+ void SetCaretChange();
+
+ CPVT_WordRange GetWholeWordRange() const;
+ CPVT_WordRange GetVisibleWordRange() const;
+ CPVT_WordRange GetLatinWordsRange(const CPVT_WordPlace & place) const;
+ CPVT_WordRange CombineWordRange(const CPVT_WordRange & wr1, const CPVT_WordRange & wr2);
+ CPVT_WordRange GetSelectWordRange() const;
+
+ void EnableUndo(FX_BOOL bUndo);
+ void EnableOprNotify(FX_BOOL bNotify);
+
+ FX_BOOL IsTextFull() const;
+ FX_BOOL IsTextOverflow() const;
+ FX_BOOL CanUndo() const;
+ FX_BOOL CanRedo() const;
+ FX_BOOL IsModified() const;
+
+ void BeginGroupUndo(const CFX_WideString& sTitle);
+ void EndGroupUndo();
+ void AddEditUndoItem(CFX_Edit_UndoItem* pEditUndoItem);
+ void AddUndoItem(IFX_Edit_UndoItem* pUndoItem);
+
+ void SetPageInfo(const CPVT_WordPlace& place);
+ CPVT_WordPlace SearchPageEndPlace(const CPVT_WordPlace& wpPageBegin, const CPDF_Point& point) const;
+ FX_FLOAT GetLineTop(const CPVT_WordPlace& place) const;
+ FX_FLOAT GetLineBottom(const CPVT_WordPlace& place) const;
+
+private:
+ IPDF_VariableText* m_pVT;
+ IFX_Edit_Notify* m_pNotify;
+ IFX_Edit_OprNotify* m_pOprNotify;
+ CFX_Edit_Provider* m_pVTProvide;
+
+ CPVT_WordPlace m_wpCaret;
+ CPVT_WordPlace m_wpOldCaret;
+ CFX_Edit_Select m_SelState;
+
+ CPDF_Point m_ptScrollPos;
+ CPDF_Point m_ptRefreshScrollPos;
+ FX_BOOL m_bEnableScroll;
+ IFX_Edit_Iterator * m_pIterator;
+ CFX_Edit_Refresh m_Refresh;
+ CPDF_Point m_ptCaret;
+ CFX_Edit_Undo m_Undo;
+ FX_INT32 m_nAlignment;
+ FX_BOOL m_bNotifyFlag;
+ FX_BOOL m_bTextFullFlag;
+ FX_BOOL m_bEnableOverflow;
+ FX_BOOL m_bEnableRefresh;
+ CPDF_Rect m_rcOldContent;
+ FX_BOOL m_bEnableUndo;
+ FX_BOOL m_bNotify;
+ FX_BOOL m_bOprNotify;
+ CFX_Edit_GroupUndoItem* m_pGroupUndoItem;
+};
+
+/* ------------------------- CFX_Edit_Iterator ---------------------------- */
+
+class CFX_Edit_Iterator : public IFX_Edit_Iterator
+{
+public:
+ CFX_Edit_Iterator(CFX_Edit * pEdit,IPDF_VariableText_Iterator * pVTIterator);
+ virtual ~CFX_Edit_Iterator();
+
+ FX_BOOL NextWord();
+ FX_BOOL NextLine();
+ FX_BOOL NextSection();
+ FX_BOOL PrevWord();
+ FX_BOOL PrevLine();
+ FX_BOOL PrevSection();
+
+ FX_BOOL GetWord(CPVT_Word & word) const;
+ FX_BOOL GetLine(CPVT_Line & line) const;
+ FX_BOOL GetSection(CPVT_Section & section) const;
+ void SetAt(FX_INT32 nWordIndex);
+ void SetAt(const CPVT_WordPlace & place);
+ const CPVT_WordPlace & GetAt() const;
+ IFX_Edit* GetEdit() const;
+
+private:
+ CFX_Edit * m_pEdit;
+ IPDF_VariableText_Iterator* m_pVTIterator;
+};
+
+class CFX_Edit_Provider : public IPDF_VariableText_Provider
+{
+public:
+ CFX_Edit_Provider(IFX_Edit_FontMap* pFontMap);
+ virtual ~CFX_Edit_Provider();
+
+ IFX_Edit_FontMap* GetFontMap();
+
+ FX_INT32 GetCharWidth(FX_INT32 nFontIndex, FX_WORD word, FX_INT32 nWordStyle);
+ FX_INT32 GetTypeAscent(FX_INT32 nFontIndex);
+ FX_INT32 GetTypeDescent(FX_INT32 nFontIndex);
+ FX_INT32 GetWordFontIndex(FX_WORD word, FX_INT32 charset, FX_INT32 nFontIndex);
+ FX_INT32 GetDefaultFontIndex();
+ FX_BOOL IsLatinWord(FX_WORD word);
+
+private:
+ IFX_Edit_FontMap* m_pFontMap;
+};
+
+#endif //_FXET_EDIT_H_
+
diff --git a/fpdfsdk/include/fxedit/fxet_list.h b/fpdfsdk/include/fxedit/fxet_list.h new file mode 100644 index 0000000000..d77be86be4 --- /dev/null +++ b/fpdfsdk/include/fxedit/fxet_list.h @@ -0,0 +1,363 @@ +// 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 _FXET_LIST_H_
+#define _FXET_LIST_H_
+
+#include "fx_edit.h"
+
+class IFX_Edit;
+
+class CLST_Size
+{
+public:
+ CLST_Size() : x(0.0f), y(0.0f)
+ {
+ }
+
+ CLST_Size(FX_FLOAT x,FX_FLOAT y)
+ {
+ this->x = x;
+ this->y = y;
+ }
+
+ void Default()
+ {
+ x = 0.0f;
+ y = 0.0f;
+ }
+
+ FX_BOOL operator != (const CLST_Size & size) const
+ {
+ return FXSYS_memcmp(this, &size, sizeof(CLST_Size)) != 0;
+ }
+
+ FX_FLOAT x,y;
+};
+
+class CLST_Rect : public CPDF_Rect
+{
+public:
+ CLST_Rect()
+ {
+ left = top = right = bottom = 0.0f;
+ }
+
+ CLST_Rect(FX_FLOAT left,FX_FLOAT top,
+ FX_FLOAT right,FX_FLOAT bottom)
+ {
+ this->left = left;
+ this->top = top;
+ this->right = right;
+ this->bottom = bottom;
+ }
+
+ CLST_Rect(const CPDF_Rect & rect)
+ {
+ this->left = rect.left;
+ this->top = rect.top;
+ this->right = rect.right;
+ this->bottom = rect.bottom;
+ }
+
+ void Default()
+ {
+ left = top = right = bottom = 0.0f;
+ }
+
+ const CLST_Rect operator = (const CPDF_Rect & rect)
+ {
+ this->left = rect.left;
+ this->top = rect.top;
+ this->right = rect.right;
+ this->bottom = rect.bottom;
+
+ return *this;
+ }
+
+ FX_BOOL operator == (const CLST_Rect & rect) const
+ {
+ return FXSYS_memcmp(this, &rect, sizeof(CLST_Rect)) == 0;
+ }
+
+ FX_BOOL operator != (const CLST_Rect & rect) const
+ {
+ return FXSYS_memcmp(this, &rect, sizeof(CLST_Rect)) != 0;
+ }
+
+ FX_FLOAT Width() const
+ {
+ return this->right - this->left;
+ }
+
+ FX_FLOAT Height() const
+ {
+ if (this->top > this->bottom)
+ return this->top - this->bottom;
+ else
+ return this->bottom - this->top;
+ }
+
+ CPDF_Point LeftTop() const
+ {
+ return CPDF_Point(left,top);
+ }
+
+ CPDF_Point RightBottom() const
+ {
+ return CPDF_Point(right,bottom);
+ }
+
+ const CLST_Rect operator += (const CPDF_Point & point)
+ {
+ this->left += point.x;
+ this->right += point.x;
+ this->top += point.y;
+ this->bottom += point.y;
+
+ return *this;
+ }
+
+ const CLST_Rect operator -= (const CPDF_Point & point)
+ {
+ this->left -= point.x;
+ this->right -= point.x;
+ this->top -= point.y;
+ this->bottom -= point.y;
+
+ return *this;
+ }
+
+ CLST_Rect operator + (const CPDF_Point & point) const
+ {
+ return CLST_Rect(left + point.x,
+ top + point.y,
+ right + point.x,
+ bottom + point.y);
+ }
+
+ CLST_Rect operator - (const CPDF_Point & point) const
+ {
+ return CLST_Rect(left - point.x,
+ top - point.y,
+ right - point.x,
+ bottom - point.y);
+ }
+};
+
+class CFX_ListItem
+{
+public:
+ CFX_ListItem();
+ virtual ~CFX_ListItem();
+
+ void SetFontMap(IFX_Edit_FontMap * pFontMap);
+ IFX_Edit_Iterator* GetIterator() const;
+ IFX_Edit* GetEdit() const;
+
+public:
+ void SetRect(const CLST_Rect & rect);
+ void SetSelect(FX_BOOL bSelected);
+ void SetCaret(FX_BOOL bCaret);
+ void SetText(FX_LPCWSTR text);
+ void SetFontSize(FX_FLOAT fFontSize);
+ CFX_WideString GetText() const;
+
+ CLST_Rect GetRect() const;
+ FX_BOOL IsSelected() const;
+ FX_BOOL IsCaret() const;
+ FX_FLOAT GetItemHeight() const;
+ FX_WORD GetFirstChar() const;
+
+private:
+ IFX_Edit* m_pEdit;
+ FX_BOOL m_bSelected; //ÊÇ·ñÑ¡ÖÐ
+ FX_BOOL m_bCaret; //ÊÇ·ñΪ½¹µã£¬¶àѡʱÓÃ
+ CLST_Rect m_rcListItem; //ÄÚ²¿×ø±ê
+};
+
+class CFX_ListContainer
+{
+public:
+ CFX_ListContainer() : m_rcPlate(0.0f,0.0f,0.0f,0.0f), m_rcContent(0.0f,0.0f,0.0f,0.0f){}
+ virtual ~CFX_ListContainer(){}
+ virtual void SetPlateRect(const CPDF_Rect & rect){m_rcPlate = rect;}
+ CPDF_Rect GetPlateRect() const{return m_rcPlate;}
+ void SetContentRect(const CLST_Rect & rect){m_rcContent = rect;}
+ CLST_Rect GetContentRect() const{return m_rcContent;}
+ CPDF_Point GetBTPoint() const{return CPDF_Point(m_rcPlate.left,m_rcPlate.top);}
+ CPDF_Point GetETPoint() const{return CPDF_Point(m_rcPlate.right,m_rcPlate.bottom);}
+public:
+ CPDF_Point InnerToOuter(const CPDF_Point & point) const{return CPDF_Point(point.x + GetBTPoint().x,GetBTPoint().y - point.y);}
+ CPDF_Point OuterToInner(const CPDF_Point & point) const{return CPDF_Point(point.x - GetBTPoint().x,GetBTPoint().y - point.y);}
+ CPDF_Rect InnerToOuter(const CLST_Rect & rect) const{CPDF_Point ptLeftTop = InnerToOuter(CPDF_Point(rect.left,rect.top));
+ CPDF_Point ptRightBottom = InnerToOuter(CPDF_Point(rect.right,rect.bottom));
+ return CPDF_Rect(ptLeftTop.x,ptRightBottom.y,ptRightBottom.x,ptLeftTop.y);}
+ CLST_Rect OuterToInner(const CPDF_Rect & rect) const{CPDF_Point ptLeftTop = OuterToInner(CPDF_Point(rect.left,rect.top));
+ CPDF_Point ptRightBottom = OuterToInner(CPDF_Point(rect.right,rect.bottom));
+ return CLST_Rect(ptLeftTop.x,ptLeftTop.y,ptRightBottom.x,ptRightBottom.y);}
+private:
+ CPDF_Rect m_rcPlate;
+ CLST_Rect m_rcContent; //positive forever!
+};
+
+template<class TYPE> class CLST_ArrayTemplate : public CFX_ArrayTemplate<TYPE>
+{
+public:
+ FX_BOOL IsEmpty() { return CFX_ArrayTemplate<TYPE>::GetSize() <= 0; }
+ TYPE GetAt(FX_INT32 nIndex) const { if (nIndex >= 0 && nIndex < CFX_ArrayTemplate<TYPE>::GetSize()) return CFX_ArrayTemplate<TYPE>::GetAt(nIndex); return NULL;}
+ void RemoveAt(FX_INT32 nIndex){if (nIndex >= 0 && nIndex < CFX_ArrayTemplate<TYPE>::GetSize()) CFX_ArrayTemplate<TYPE>::RemoveAt(nIndex);}
+};
+
+class CFX_List : protected CFX_ListContainer , public IFX_List
+{
+public:
+ CFX_List();
+ virtual ~CFX_List();
+
+public:
+ virtual void SetFontMap(IFX_Edit_FontMap * pFontMap);
+ virtual void SetFontSize(FX_FLOAT fFontSize);
+
+ virtual CPDF_Rect GetPlateRect() const;
+ virtual CPDF_Rect GetContentRect() const;
+
+ virtual FX_FLOAT GetFontSize() const;
+ virtual IFX_Edit* GetItemEdit(FX_INT32 nIndex) const;
+ virtual FX_INT32 GetCount() const;
+ virtual FX_BOOL IsItemSelected(FX_INT32 nIndex) const;
+ virtual FX_FLOAT GetFirstHeight() const;
+
+ virtual void SetMultipleSel(FX_BOOL bMultiple);
+ virtual FX_BOOL IsMultipleSel() const;
+ virtual FX_BOOL IsValid(FX_INT32 nItemIndex) const;
+ virtual FX_INT32 FindNext(FX_INT32 nIndex,FX_WCHAR nChar) const;
+
+protected:
+ virtual void Empty();
+
+ void AddItem(FX_LPCWSTR str);
+ virtual void ReArrange(FX_INT32 nItemIndex);
+
+ virtual CPDF_Rect GetItemRect(FX_INT32 nIndex) const;
+ CFX_WideString GetItemText(FX_INT32 nIndex) const;
+
+ void SetItemSelect(FX_INT32 nItemIndex, FX_BOOL bSelected);
+ void SetItemCaret(FX_INT32 nItemIndex, FX_BOOL bCaret);
+
+ virtual FX_INT32 GetItemIndex(const CPDF_Point & point) const;
+ FX_INT32 GetFirstSelected() const;
+ FX_INT32 GetLastSelected() const;
+ FX_WCHAR Toupper(FX_WCHAR c) const;
+
+private:
+ CLST_ArrayTemplate<CFX_ListItem*> m_aListItems;
+ FX_FLOAT m_fFontSize;
+ IFX_Edit_FontMap* m_pFontMap;
+ FX_BOOL m_bMultiple;
+};
+
+struct CPLST_Select_Item
+{
+ CPLST_Select_Item(FX_INT32 nItemIndex,FX_INT32 nState)
+ {
+ this->nItemIndex = nItemIndex;
+ this->nState = nState;
+ }
+
+ FX_INT32 nItemIndex;
+ FX_INT32 nState; //0:normal select -1:to deselect 1: to select
+};
+
+class CPLST_Select
+{
+public:
+ CPLST_Select();
+ virtual ~CPLST_Select();
+
+public:
+ void Add(FX_INT32 nItemIndex);
+ void Add(FX_INT32 nBeginIndex, FX_INT32 nEndIndex);
+ void Sub(FX_INT32 nItemIndex);
+ void Sub(FX_INT32 nBeginIndex, FX_INT32 nEndIndex);
+ FX_BOOL IsExist(FX_INT32 nItemIndex) const;
+ FX_INT32 Find(FX_INT32 nItemIndex) const;
+ FX_INT32 GetCount() const;
+ FX_INT32 GetItemIndex(FX_INT32 nIndex) const;
+ FX_INT32 GetState(FX_INT32 nIndex) const;
+ void Done();
+ void DeselectAll();
+
+private:
+ CFX_ArrayTemplate<CPLST_Select_Item*> m_aItems;
+};
+
+class CFX_ListCtrl : public CFX_List
+{
+public:
+ CFX_ListCtrl();
+ virtual ~CFX_ListCtrl();
+
+public:
+ void SetNotify(IFX_List_Notify * pNotify);
+
+ void OnMouseDown(const CPDF_Point & point,FX_BOOL bShift,FX_BOOL bCtrl);
+ void OnMouseMove(const CPDF_Point & point,FX_BOOL bShift,FX_BOOL bCtrl);
+ void OnVK_UP(FX_BOOL bShift,FX_BOOL bCtrl);
+ void OnVK_DOWN(FX_BOOL bShift,FX_BOOL bCtrl);
+ void OnVK_LEFT(FX_BOOL bShift,FX_BOOL bCtrl);
+ void OnVK_RIGHT(FX_BOOL bShift,FX_BOOL bCtrl);
+ void OnVK_HOME(FX_BOOL bShift,FX_BOOL bCtrl);
+ void OnVK_END(FX_BOOL bShift,FX_BOOL bCtrl);
+ void OnVK(FX_INT32 nItemIndex,FX_BOOL bShift,FX_BOOL bCtrl);
+ FX_BOOL OnChar(FX_WORD nChar,FX_BOOL bShift,FX_BOOL bCtrl);
+
+ virtual CPDF_Point InToOut(const CPDF_Point & point) const;
+ virtual CPDF_Point OutToIn(const CPDF_Point & point) const;
+ virtual CPDF_Rect InToOut(const CPDF_Rect & rect) const;
+ virtual CPDF_Rect OutToIn(const CPDF_Rect & rect) const;
+
+ virtual void SetPlateRect(const CPDF_Rect & rect);
+ void SetScrollPos(const CPDF_Point & point);
+ void ScrollToListItem(FX_INT32 nItemIndex);
+ virtual CPDF_Rect GetItemRect(FX_INT32 nIndex) const;
+ FX_INT32 GetCaret() const {return m_nCaretIndex;}
+ FX_INT32 GetSelect() const {return m_nSelItem;}
+ FX_INT32 GetTopItem() const;
+ virtual CPDF_Rect GetContentRect() const;
+ virtual FX_INT32 GetItemIndex(const CPDF_Point & point) const;
+
+ void AddString(FX_LPCWSTR string);
+ void SetTopItem(FX_INT32 nIndex);
+ void Select(FX_INT32 nItemIndex);
+ virtual void SetCaret(FX_INT32 nItemIndex);
+ virtual void Empty();
+ virtual void Cancel();
+ CFX_WideString GetText() const;
+
+private:
+ void SetMultipleSelect(FX_INT32 nItemIndex, FX_BOOL bSelected);
+ void SetSingleSelect(FX_INT32 nItemIndex);
+ void InvalidateItem(FX_INT32 nItemIndex);
+ void SelectItems();
+ FX_BOOL IsItemVisible(FX_INT32 nItemIndex) const;
+ void SetScrollInfo();
+ void SetScrollPosY(FX_FLOAT fy);
+ virtual void ReArrange(FX_INT32 nItemIndex);
+
+private:
+ IFX_List_Notify* m_pNotify;
+ FX_BOOL m_bNotifyFlag;
+ CPDF_Point m_ptScrollPos;
+ CPLST_Select m_aSelItems; //for multiple
+ FX_INT32 m_nSelItem; //for single
+ FX_INT32 m_nFootIndex; //for multiple
+ FX_BOOL m_bCtrlSel; //for multiple
+ FX_INT32 m_nCaretIndex; //for multiple
+};
+
+#endif
+
diff --git a/fpdfsdk/include/fxedit/fxet_stub.h b/fpdfsdk/include/fxedit/fxet_stub.h new file mode 100644 index 0000000000..aa50cd59a0 --- /dev/null +++ b/fpdfsdk/include/fxedit/fxet_stub.h @@ -0,0 +1,26 @@ +// 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 _FXET_STUB_H_
+#define _FXET_STUB_H_
+
+#include "../../../core/include/fpdfapi/fpdf_module.h"
+#include "../../../core/include/fpdfapi/fpdf_render.h"
+#include "../../../core/include/fpdfapi/fpdf_pageobj.h"
+#include "../../../core/include/fpdfdoc/fpdf_vt.h"
+#include "../fx_systemhandler.h"
+#ifdef FX_READER_DLL
+ #ifdef _DEBUG
+ #pragma comment(lib, "X:/pdf/fxcore/Lib/dbg_w32_vc6/fxcoredll[dbg,w32,vc6].lib")
+ #pragma comment(lib, "X:/pdf/fxcore/Lib/dbg_w32_vc6/fpdfdocdll[dbg,w32,vc6].lib")
+ #else
+ #pragma comment(lib, "X:/pdf/fxcore/Lib/rel_w32_vc6/fxcoredll[rel,w32,vc6].lib")
+ #pragma comment(lib, "X:/pdf/fxcore/Lib/rel_w32_vc6/fpdfdocdll[rel,w32,vc6].lib")
+ #endif
+#endif
+
+#endif
+
diff --git a/fpdfsdk/include/javascript/Consts.h b/fpdfsdk/include/javascript/Consts.h new file mode 100644 index 0000000000..32b0217502 --- /dev/null +++ b/fpdfsdk/include/javascript/Consts.h @@ -0,0 +1,126 @@ +// 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 _CONSTS_H_
+#define _CONSTS_H_
+
+/* ------------------------------ border ------------------------------ */
+
+class CJS_Border : public CJS_Object
+{
+public:
+ CJS_Border(JSFXObject pObject) : CJS_Object(pObject) {};
+ virtual ~CJS_Border(void){};
+
+ DECLARE_JS_CLASS_CONST();
+};
+
+/* ------------------------------ display ------------------------------ */
+
+class CJS_Display : public CJS_Object
+{
+public:
+ CJS_Display(JSFXObject pObject) : CJS_Object(pObject) {};
+ virtual ~CJS_Display(void){};
+
+ DECLARE_JS_CLASS_CONST();
+};
+
+/* ------------------------------ font ------------------------------ */
+
+class CJS_Font : public CJS_Object
+{
+public:
+ CJS_Font(JSFXObject pObject) : CJS_Object(pObject) {};
+ virtual ~CJS_Font(void){};
+
+ DECLARE_JS_CLASS_CONST();
+};
+
+/* ------------------------------ highlight ------------------------------ */
+
+class CJS_Highlight : public CJS_Object
+{
+public:
+ CJS_Highlight(JSFXObject pObject) : CJS_Object(pObject) {};
+ virtual ~CJS_Highlight(void){};
+
+ DECLARE_JS_CLASS_CONST();
+};
+
+/* ------------------------------ position ------------------------------ */
+
+class CJS_Position : public CJS_Object
+{
+public:
+ CJS_Position(JSFXObject pObject) : CJS_Object(pObject) {};
+ virtual ~CJS_Position(void){};
+
+ DECLARE_JS_CLASS_CONST();
+};
+
+/* ------------------------------ scaleHow ------------------------------ */
+
+class CJS_ScaleHow : public CJS_Object
+{
+public:
+ CJS_ScaleHow(JSFXObject pObject) : CJS_Object(pObject) {};
+ virtual ~CJS_ScaleHow(void){};
+
+ DECLARE_JS_CLASS_CONST();
+};
+
+/* ------------------------------ scaleWhen ------------------------------ */
+
+class CJS_ScaleWhen : public CJS_Object
+{
+public:
+ CJS_ScaleWhen(JSFXObject pObject) : CJS_Object(pObject) {};
+ virtual ~CJS_ScaleWhen(void){};
+
+ DECLARE_JS_CLASS_CONST();
+};
+
+/* ------------------------------ style ------------------------------ */
+
+class CJS_Style : public CJS_Object
+{
+public:
+ CJS_Style(JSFXObject pObject) : CJS_Object(pObject) {};
+ virtual ~CJS_Style(void){};
+
+ DECLARE_JS_CLASS_CONST();
+};
+
+/* ------------------------------ zoomtype ------------------------------ */
+
+class CJS_Zoomtype : public CJS_Object
+{
+public:
+ CJS_Zoomtype(JSFXObject pObject) : CJS_Object(pObject) {};
+ virtual ~CJS_Zoomtype(void){};
+
+ DECLARE_JS_CLASS_CONST();
+};
+
+/* ------------------------------ CJS_GlobalConsts ------------------------------ */
+
+class CJS_GlobalConsts : public CJS_Object
+{
+public:
+ static int Init(IJS_Runtime* pRuntime);
+};
+
+/* ------------------------------ CJS_GlobalArrays ------------------------------ */
+
+class CJS_GlobalArrays : public CJS_Object
+{
+public:
+ static int Init(IJS_Runtime* pRuntime);
+};
+
+#endif //_CONSTS_H_
+
diff --git a/fpdfsdk/include/javascript/Document.h b/fpdfsdk/include/javascript/Document.h new file mode 100644 index 0000000000..3e9669b8ef --- /dev/null +++ b/fpdfsdk/include/javascript/Document.h @@ -0,0 +1,282 @@ +// 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 _DOCUMENT_H_
+#define _DOCUMENT_H_
+
+
+
+class PrintParamsObj : public CJS_EmbedObj
+{
+public:
+ PrintParamsObj(CJS_Object* pJSObject);
+ virtual ~PrintParamsObj(){}
+
+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(JSFXObject pObject) : CJS_Object(pObject) {}
+ virtual ~CJS_PrintParamsObj(){}
+
+ DECLARE_JS_CLASS(CJS_PrintParamsObj);
+};
+
+
+class Icon;
+class Field;
+
+struct IconElement
+{
+ IconElement() : IconName(L""), IconStream(NULL), NextIcon(NULL){}
+ virtual ~IconElement()
+ {
+ }
+ CFX_WideString IconName;
+ IconElement* NextIcon;
+ Icon* IconStream;
+};
+
+class IconTree
+{
+public:
+ IconTree():m_pHead(NULL), m_pEnd(NULL), m_iLength(0)
+ {
+
+ }
+
+ virtual ~IconTree()
+ {
+ }
+
+public:
+ void InsertIconElement(IconElement* pNewIcon);
+ void DeleteIconElement(CFX_WideString swIconName);
+ void DeleteIconTree();
+ int GetLength();
+ IconElement* operator[](int iIndex);
+
+private:
+ IconElement* m_pHead;
+ IconElement* m_pEnd;
+ int m_iLength;
+};
+
+struct CJS_DelayData;
+struct CJS_DelayAnnot;
+struct CJS_AnnotObj;
+
+class Document : public CJS_EmbedObj
+{
+public:
+ Document(CJS_Object* pJSObject);
+ virtual ~Document();
+
+public:
+ FX_BOOL ADBE(OBJ_PROP_PARAMS);
+ FX_BOOL author(OBJ_PROP_PARAMS);
+ FX_BOOL baseURL(OBJ_PROP_PARAMS);
+ FX_BOOL bookmarkRoot(OBJ_PROP_PARAMS);
+ FX_BOOL calculate(OBJ_PROP_PARAMS);
+ FX_BOOL Collab(OBJ_PROP_PARAMS);
+ FX_BOOL creationDate(OBJ_PROP_PARAMS);
+ FX_BOOL creator(OBJ_PROP_PARAMS);
+ FX_BOOL delay(OBJ_PROP_PARAMS);
+ FX_BOOL dirty(OBJ_PROP_PARAMS);
+ FX_BOOL documentFileName(OBJ_PROP_PARAMS);
+ FX_BOOL external(OBJ_PROP_PARAMS);
+ FX_BOOL filesize(OBJ_PROP_PARAMS);
+ FX_BOOL icons(OBJ_PROP_PARAMS);
+ FX_BOOL info(OBJ_PROP_PARAMS);
+ FX_BOOL keywords(OBJ_PROP_PARAMS);
+ FX_BOOL layout(OBJ_PROP_PARAMS);
+ FX_BOOL media(OBJ_PROP_PARAMS);
+ FX_BOOL modDate(OBJ_PROP_PARAMS);
+ FX_BOOL mouseX(OBJ_PROP_PARAMS);
+ FX_BOOL mouseY(OBJ_PROP_PARAMS);
+ FX_BOOL numFields(OBJ_PROP_PARAMS);
+ FX_BOOL numPages(OBJ_PROP_PARAMS);
+ FX_BOOL pageNum(OBJ_PROP_PARAMS);
+ FX_BOOL pageWindowRect(OBJ_PROP_PARAMS);
+ FX_BOOL path(OBJ_PROP_PARAMS);
+ FX_BOOL producer(OBJ_PROP_PARAMS);
+ FX_BOOL subject(OBJ_PROP_PARAMS);
+ FX_BOOL title(OBJ_PROP_PARAMS);
+ FX_BOOL zoom(OBJ_PROP_PARAMS);
+ FX_BOOL zoomType(OBJ_PROP_PARAMS);
+
+ FX_BOOL addAnnot(OBJ_METHOD_PARAMS);
+ FX_BOOL addField(OBJ_METHOD_PARAMS);
+ FX_BOOL addLink(OBJ_METHOD_PARAMS);
+ FX_BOOL addIcon(OBJ_METHOD_PARAMS);
+ FX_BOOL calculateNow(OBJ_METHOD_PARAMS);
+ FX_BOOL closeDoc(OBJ_METHOD_PARAMS);
+ FX_BOOL createDataObject(OBJ_METHOD_PARAMS);
+ FX_BOOL deletePages(OBJ_METHOD_PARAMS);
+ FX_BOOL exportAsText(OBJ_METHOD_PARAMS);
+ FX_BOOL exportAsFDF(OBJ_METHOD_PARAMS);
+ FX_BOOL exportAsXFDF(OBJ_METHOD_PARAMS);
+ FX_BOOL extractPages(OBJ_METHOD_PARAMS);
+ FX_BOOL getAnnot(OBJ_METHOD_PARAMS);
+ FX_BOOL getAnnots(OBJ_METHOD_PARAMS);
+ FX_BOOL getAnnot3D(OBJ_METHOD_PARAMS);
+ FX_BOOL getAnnots3D(OBJ_METHOD_PARAMS);
+ FX_BOOL getField(OBJ_METHOD_PARAMS);
+ FX_BOOL getIcon(OBJ_METHOD_PARAMS);
+ FX_BOOL getLinks(OBJ_METHOD_PARAMS);
+ FX_BOOL getNthFieldName(OBJ_METHOD_PARAMS);
+ FX_BOOL getOCGs(OBJ_METHOD_PARAMS);
+ FX_BOOL getPageBox(OBJ_METHOD_PARAMS);
+ FX_BOOL getPageNthWord(OBJ_METHOD_PARAMS);
+ FX_BOOL getPageNthWordQuads(OBJ_METHOD_PARAMS);
+ FX_BOOL getPageNumWords(OBJ_METHOD_PARAMS);
+ FX_BOOL getPrintParams(OBJ_METHOD_PARAMS);
+ FX_BOOL getURL(OBJ_METHOD_PARAMS);
+ FX_BOOL importAnFDF(OBJ_METHOD_PARAMS);
+ FX_BOOL importAnXFDF(OBJ_METHOD_PARAMS);
+ FX_BOOL importTextData(OBJ_METHOD_PARAMS);
+ FX_BOOL insertPages(OBJ_METHOD_PARAMS);
+ FX_BOOL mailForm(OBJ_METHOD_PARAMS);
+ FX_BOOL print(OBJ_METHOD_PARAMS);
+ FX_BOOL removeField(OBJ_METHOD_PARAMS);
+ FX_BOOL replacePages(OBJ_METHOD_PARAMS);
+ FX_BOOL resetForm(OBJ_METHOD_PARAMS);
+ FX_BOOL saveAs(OBJ_METHOD_PARAMS);
+ FX_BOOL submitForm(OBJ_METHOD_PARAMS);
+ FX_BOOL mailDoc(OBJ_METHOD_PARAMS);
+ FX_BOOL removeIcon(OBJ_METHOD_PARAMS);
+
+public:
+ void AttachDoc(CPDFSDK_Document* pDoc);
+ CPDFSDK_Document* GetReaderDoc();
+
+ static FX_BOOL ExtractFileName(CPDFSDK_Document* pDoc, CFX_ByteString& strFileName);
+ static FX_BOOL ExtractFolderName(CPDFSDK_Document* pDoc, CFX_ByteString& strFolderName);
+
+public:
+ void AddDelayData(CJS_DelayData* pData);
+ void DoFieldDelay(const CFX_WideString& sFieldName, int nControlIndex);
+
+ void AddDelayAnnotData(CJS_AnnotObj *pData);
+ void DoAnnotDelay();
+ void SetIsolate(v8::Isolate* isolate) {m_isolate = isolate;}
+
+private:
+ CFX_WideString ReversalStr(CFX_WideString cbFrom);
+ CFX_WideString CutString(CFX_WideString cbFrom);
+ bool IsEnclosedInRect(CFX_FloatRect rect, CFX_FloatRect LinkRect);
+ int CountWords(CPDF_TextObject* pTextObj);
+ CFX_WideString GetObjWordStr(CPDF_TextObject* pTextObj, int nWordIndex);
+
+ FX_BOOL ParserParams(JSObject *pObj,CJS_AnnotObj& annotobj);
+
+private:
+ v8::Isolate* m_isolate;
+ IconTree* m_pIconTree;
+ CPDFSDK_Document* m_pDocument;
+ CFX_WideString m_cwBaseURL;
+
+ FX_BOOL m_bDelay;
+ CFX_ArrayTemplate<CJS_DelayData*> m_DelayData;
+ CFX_ArrayTemplate<CJS_AnnotObj*> m_DelayAnnotData;
+};
+
+class CJS_Document : public CJS_Object
+{
+public:
+ CJS_Document(JSFXObject pObject) : CJS_Object(pObject) {};
+ virtual ~CJS_Document(){};
+
+ virtual FX_BOOL InitInstance(IFXJS_Context* cc);
+
+ DECLARE_JS_CLASS(CJS_Document);
+
+ 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//_DOCUMENT_H_
+
diff --git a/fpdfsdk/include/javascript/Field.h b/fpdfsdk/include/javascript/Field.h new file mode 100644 index 0000000000..1b0bb05a12 --- /dev/null +++ b/fpdfsdk/include/javascript/Field.h @@ -0,0 +1,355 @@ +// 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 _FIELD_H_
+#define _FIELD_H_
+
+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;
+ FX_INT32 num;
+ bool b;
+ CFX_ByteString string;
+ CFX_WideString widestring;
+ CPDF_Rect rect;
+ CPWL_Color color;
+ CFX_DWordArray wordarray;
+ CJS_WideStringArray widestringarray;
+};
+
+class Field : public CJS_EmbedObj
+{
+public:
+ Field(CJS_Object* pJSObject);
+ virtual ~Field(void);
+
+ FX_BOOL alignment(OBJ_PROP_PARAMS);
+ FX_BOOL borderStyle(OBJ_PROP_PARAMS);
+ FX_BOOL buttonAlignX(OBJ_PROP_PARAMS);
+ FX_BOOL buttonAlignY(OBJ_PROP_PARAMS);
+ FX_BOOL buttonFitBounds(OBJ_PROP_PARAMS);
+ FX_BOOL buttonPosition(OBJ_PROP_PARAMS);
+ FX_BOOL buttonScaleHow(OBJ_PROP_PARAMS);
+ FX_BOOL buttonScaleWhen(OBJ_PROP_PARAMS);
+ FX_BOOL calcOrderIndex(OBJ_PROP_PARAMS);
+ FX_BOOL charLimit(OBJ_PROP_PARAMS);
+ FX_BOOL comb(OBJ_PROP_PARAMS);
+ FX_BOOL commitOnSelChange(OBJ_PROP_PARAMS);
+ FX_BOOL currentValueIndices(OBJ_PROP_PARAMS);
+ FX_BOOL defaultStyle(OBJ_PROP_PARAMS);
+ FX_BOOL defaultValue(OBJ_PROP_PARAMS);
+ FX_BOOL doNotScroll(OBJ_PROP_PARAMS);
+ FX_BOOL doNotSpellCheck(OBJ_PROP_PARAMS);
+ FX_BOOL delay(OBJ_PROP_PARAMS);
+ FX_BOOL display(OBJ_PROP_PARAMS);
+ FX_BOOL doc(OBJ_PROP_PARAMS);
+ FX_BOOL editable(OBJ_PROP_PARAMS);
+ FX_BOOL exportValues(OBJ_PROP_PARAMS);
+ FX_BOOL fileSelect(OBJ_PROP_PARAMS);
+ FX_BOOL fillColor(OBJ_PROP_PARAMS);
+ FX_BOOL hidden(OBJ_PROP_PARAMS);
+ FX_BOOL highlight(OBJ_PROP_PARAMS);
+ FX_BOOL lineWidth(OBJ_PROP_PARAMS);
+ FX_BOOL multiline(OBJ_PROP_PARAMS);
+ FX_BOOL multipleSelection(OBJ_PROP_PARAMS);
+ FX_BOOL name(OBJ_PROP_PARAMS);
+ FX_BOOL numItems(OBJ_PROP_PARAMS);
+ FX_BOOL page(OBJ_PROP_PARAMS);
+ FX_BOOL password(OBJ_PROP_PARAMS);
+ FX_BOOL print(OBJ_PROP_PARAMS);
+ FX_BOOL radiosInUnison(OBJ_PROP_PARAMS);
+ FX_BOOL readonly(OBJ_PROP_PARAMS);
+ FX_BOOL rect(OBJ_PROP_PARAMS);
+ FX_BOOL required(OBJ_PROP_PARAMS);
+ FX_BOOL richText(OBJ_PROP_PARAMS);
+ FX_BOOL richValue(OBJ_PROP_PARAMS);
+ FX_BOOL rotation(OBJ_PROP_PARAMS);
+ FX_BOOL strokeColor(OBJ_PROP_PARAMS);
+ FX_BOOL style(OBJ_PROP_PARAMS);
+ FX_BOOL submitName(OBJ_PROP_PARAMS);
+ FX_BOOL textColor(OBJ_PROP_PARAMS);
+ FX_BOOL textFont(OBJ_PROP_PARAMS);
+ FX_BOOL textSize(OBJ_PROP_PARAMS);
+ FX_BOOL type(OBJ_PROP_PARAMS);
+ FX_BOOL userName(OBJ_PROP_PARAMS);
+ FX_BOOL value(OBJ_PROP_PARAMS);
+ FX_BOOL valueAsString(OBJ_PROP_PARAMS);
+ FX_BOOL source(OBJ_PROP_PARAMS);
+
+ FX_BOOL browseForFileToSubmit(OBJ_METHOD_PARAMS);
+ FX_BOOL buttonGetCaption(OBJ_METHOD_PARAMS);
+ FX_BOOL buttonGetIcon(OBJ_METHOD_PARAMS);
+ FX_BOOL buttonImportIcon(OBJ_METHOD_PARAMS);
+ FX_BOOL buttonSetCaption(OBJ_METHOD_PARAMS);
+ FX_BOOL buttonSetIcon(OBJ_METHOD_PARAMS);
+ FX_BOOL checkThisBox(OBJ_METHOD_PARAMS);
+ FX_BOOL clearItems(OBJ_METHOD_PARAMS);
+ FX_BOOL defaultIsChecked(OBJ_METHOD_PARAMS);
+ FX_BOOL deleteItemAt(OBJ_METHOD_PARAMS);
+ FX_BOOL getArray(OBJ_METHOD_PARAMS);
+ FX_BOOL getItemAt(OBJ_METHOD_PARAMS);
+ FX_BOOL getLock(OBJ_METHOD_PARAMS);
+ FX_BOOL insertItemAt(OBJ_METHOD_PARAMS);
+ FX_BOOL isBoxChecked(OBJ_METHOD_PARAMS);
+ FX_BOOL isDefaultChecked(OBJ_METHOD_PARAMS);
+ FX_BOOL setAction(OBJ_METHOD_PARAMS);
+ FX_BOOL setFocus(OBJ_METHOD_PARAMS);
+ FX_BOOL setItems(OBJ_METHOD_PARAMS);
+ FX_BOOL setLock(OBJ_METHOD_PARAMS);
+ FX_BOOL signatureGetModifications(OBJ_METHOD_PARAMS);
+ FX_BOOL signatureGetSeedValue(OBJ_METHOD_PARAMS);
+ FX_BOOL signatureInfo(OBJ_METHOD_PARAMS);
+ FX_BOOL signatureSetSeedValue(OBJ_METHOD_PARAMS);
+ FX_BOOL signatureSign(OBJ_METHOD_PARAMS);
+ FX_BOOL signatureValidate(OBJ_METHOD_PARAMS);
+
+public:
+ 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 CPDF_Rect& 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);
+
+public:
+ static void AddField(CPDFSDK_Document* pDocument, int nPageIndex, int nFieldType,
+ const CFX_WideString& sName, const CPDF_Rect& rcCoords);
+public:
+ 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 void GetFormFields(CPDFSDK_Document* pDocument, const CFX_WideString& csFieldName, CFX_PtrArray& FieldsArray);
+
+ static void DoDelay(CPDFSDK_Document* pDocument, CJS_DelayData* pData);
+
+public:
+ 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);
+ void GetFormFields(const CFX_WideString& csFieldName, CFX_PtrArray& FieldsArray);
+ CPDF_FormControl* GetSmartFieldControl(CPDF_FormField* pFormField);
+ FX_BOOL ValueIsOccur(CPDF_FormField* pFormField, CFX_WideString csOptLabel);
+
+ void AddDelay_Int(enum FIELD_PROP prop, FX_INT32 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 CPDF_Rect& 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:
+ CJS_Field(JSFXObject pObject) : CJS_Object(pObject) {};
+ virtual ~CJS_Field(void){};
+
+ virtual FX_BOOL InitInstance(IFXJS_Context* cc);
+
+ DECLARE_JS_CLASS(CJS_Field);
+
+ 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 //_FIELD_H_
+
diff --git a/fpdfsdk/include/javascript/IJavaScript.h b/fpdfsdk/include/javascript/IJavaScript.h new file mode 100644 index 0000000000..567ee82651 --- /dev/null +++ b/fpdfsdk/include/javascript/IJavaScript.h @@ -0,0 +1,112 @@ +// 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 _IJAVASCRIPT_H_
+#define _IJAVASCRIPT_H_
+
+class IFXJS_Context
+{
+public:
+ virtual FX_BOOL Compile(const CFX_WideString& script, CFX_WideString& info) = 0;
+ virtual FX_BOOL RunScript(const CFX_WideString& script, CFX_WideString& info) = 0;
+
+public:
+ virtual void OnApp_Init() = 0;
+
+ virtual void OnDoc_Open(CPDFSDK_Document* pDoc, const CFX_WideString& strTargetName) = 0;
+ virtual void OnDoc_WillPrint(CPDFSDK_Document* pDoc) = 0;
+ virtual void OnDoc_DidPrint(CPDFSDK_Document* pDoc) = 0;
+ virtual void OnDoc_WillSave(CPDFSDK_Document* pDoc) = 0;
+ virtual void OnDoc_DidSave(CPDFSDK_Document* pDoc) = 0;
+ virtual void OnDoc_WillClose(CPDFSDK_Document* pDoc) = 0;
+
+ virtual void OnPage_Open(CPDFSDK_Document* pTarget) = 0;
+ virtual void OnPage_Close(CPDFSDK_Document* pTarget) = 0;
+ virtual void OnPage_InView(CPDFSDK_Document* pTarget) = 0;
+ virtual void OnPage_OutView(CPDFSDK_Document* pTarget) = 0;
+
+ virtual void OnField_MouseDown(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget) = 0;
+ virtual void OnField_MouseEnter(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget) = 0;
+ virtual void OnField_MouseExit(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget) = 0;
+ virtual void OnField_MouseUp(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget) = 0;
+ virtual void OnField_Focus(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget, const CFX_WideString& Value) = 0;
+ virtual void OnField_Blur(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget, const CFX_WideString& Value) = 0;
+
+ virtual void OnField_Calculate(CPDF_FormField* pSource, CPDF_FormField* pTarget, CFX_WideString& Value, FX_BOOL& bRc) = 0;
+ virtual void OnField_Format(int nCommitKey, CPDF_FormField* pTarget, CFX_WideString& Value, FX_BOOL bWillCommit) = 0;
+ virtual void OnField_Keystroke(int nCommitKey, 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) = 0;
+ virtual 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) = 0;
+
+ virtual void OnScreen_Focus(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen) = 0;
+ virtual void OnScreen_Blur(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen) = 0;
+ virtual void OnScreen_Open(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen) = 0;
+ virtual void OnScreen_Close(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen) = 0;
+ virtual void OnScreen_MouseDown(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen) = 0;
+ virtual void OnScreen_MouseUp(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen) = 0;
+ virtual void OnScreen_MouseEnter(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen) = 0;
+ virtual void OnScreen_MouseExit(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen) = 0;
+ virtual void OnScreen_InView(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen) = 0;
+ virtual void OnScreen_OutView(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen) = 0;
+
+ virtual void OnBookmark_MouseUp(CPDF_Bookmark* pBookMark) = 0;
+ virtual void OnLink_MouseUp(CPDFSDK_Document* pTarget) = 0;
+
+ virtual void OnMenu_Exec(CPDFSDK_Document* pTarget, const CFX_WideString &) = 0;
+ virtual void OnBatchExec(CPDFSDK_Document* pTarget) = 0;
+ virtual void OnConsole_Exec() = 0;
+ virtual void OnExternal_Exec() = 0;
+
+ virtual void EnableMessageBox(FX_BOOL bEnable) = 0;
+};
+
+class IFXJS_Runtime
+{
+public:
+ virtual IFXJS_Context* NewContext() = 0;
+ virtual void ReleaseContext(IFXJS_Context * pContext) = 0;
+ virtual IFXJS_Context* GetCurrentContext() = 0;
+
+ virtual void SetReaderDocument(CPDFSDK_Document* pReaderDoc) = 0;
+ virtual CPDFSDK_Document* GetReaderDocument() = 0;
+
+ virtual void GetObjectNames(CFX_WideStringArray& array) = 0;
+ virtual void GetObjectConsts(const CFX_WideString& swObjName, CFX_WideStringArray& array) = 0;
+ virtual void GetObjectProps(const CFX_WideString& swObjName, CFX_WideStringArray& array) = 0;
+ virtual void GetObjectMethods(const CFX_WideString& swObjName, CFX_WideStringArray& array) = 0;
+
+ virtual void Exit() = 0;
+ virtual void Enter() = 0;
+ virtual FX_BOOL IsEntered() = 0;
+};
+
+class CPDFDoc_Environment;
+class CJS_GlobalData;
+
+class CJS_RuntimeFactory
+{
+public:
+ CJS_RuntimeFactory():m_bInit(FALSE),m_nRef(0),m_pGlobalData(NULL),m_nGlobalDataCount(0) {}
+ ~CJS_RuntimeFactory();
+ IFXJS_Runtime* NewJSRuntime(CPDFDoc_Environment* pApp);
+ void DeleteJSRuntime(IFXJS_Runtime* pRuntime);
+ void AddRef();
+ void Release();
+
+ CJS_GlobalData* NewGlobalData(CPDFDoc_Environment* pApp);
+ void ReleaseGlobalData();
+private:
+ FX_BOOL m_bInit;
+ int m_nRef;
+ CJS_GlobalData* m_pGlobalData;
+ FX_INT32 m_nGlobalDataCount;
+};
+
+#endif //_IJAVASCRIPT_H_
+
diff --git a/fpdfsdk/include/javascript/Icon.h b/fpdfsdk/include/javascript/Icon.h new file mode 100644 index 0000000000..26fec2ddfd --- /dev/null +++ b/fpdfsdk/include/javascript/Icon.h @@ -0,0 +1,42 @@ +// 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 _ICON_H_
+#define _ICON_H_
+
+class Icon : public CJS_EmbedObj
+{
+public:
+ Icon(CJS_Object* pJSObject);
+ virtual ~Icon();
+
+public:
+ FX_BOOL name(OBJ_PROP_PARAMS);
+
+public:
+ 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(JSFXObject pObject) : CJS_Object(pObject){};
+ virtual ~CJS_Icon(){};
+
+public:
+ DECLARE_JS_CLASS(CJS_Icon);
+
+ JS_STATIC_PROP(name, Icon);
+};
+
+#endif //_ICON_H_
+
diff --git a/fpdfsdk/include/javascript/JS_Console.h b/fpdfsdk/include/javascript/JS_Console.h new file mode 100644 index 0000000000..da842bdde7 --- /dev/null +++ b/fpdfsdk/include/javascript/JS_Console.h @@ -0,0 +1,239 @@ +// 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 _JS_CONSOLE_H_
+#define _JS_CONSOLE_H_
+
+#include "../res/resource.h"
+
+#define WST_NONE 0x00 // No size changed
+#define WST_LEFT 0x01 // size to left
+#define WST_TOP 0x02 // size to top
+#define WST_RIGHT 0x04 // size to right
+#define WST_BOTTOM 0x08 // size to bottom
+#define WST_TOPLEFT (WST_TOP|WST_LEFT) // size to top & left
+#define WST_TOPRIGHT (WST_TOP|WST_RIGHT) // size to top & right
+#define WST_BOTTOMRIGHT (WST_BOTTOM|WST_RIGHT) // size to bottom & right
+#define WST_BOTTOMLEFT (WST_BOTTOM|WST_LEFT) // size to bottom & right
+
+#ifndef IDC_DLGSIZEBOX
+#define IDC_DLGSIZEBOX 50
+#endif /* IDC_DLGSIZEBOX */
+
+enum { m_idSizeIcon = IDC_DLGSIZEBOX };
+enum { // possible Control reSize Type
+ CST_NONE = 0,
+ CST_RESIZE, // NOMOVE + SIZE, add all delta-size of dlg to control
+ CST_REPOS, // MOVE(absolutely) + NOSIZE, move control's pos by delta-size
+ CST_RELATIVE, // MOVE(proportional) + NOSIZE, keep control always at a relative pos
+ CST_ZOOM, // MOVE + SIZE (both are automatically proportional)
+ CST_DELTA_ZOOM // MOVE(proportional, set manually) + SIZE(proportional, set manuall)
+};
+
+// contained class to hold item state
+//
+class CJS_ItemCtrl
+{
+public:
+ UINT m_nID;
+ UINT m_stxLeft : 4; // when left resizing ...
+ UINT m_stxRight : 4; // when right resizing ...
+ UINT m_styTop : 4; // when top resizing ...
+ UINT m_styBottom : 4; // when bottom resizing ...
+ UINT m_bFlickerFree : 1;
+ UINT m_bInvalidate : 1; // Invalidate ctrl's rect(eg. no-automatical update for static when resize+move)
+ UINT m_r0 : 14;
+ CRect m_wRect;
+ double m_xRatio, m_cxRatio;
+ double m_yRatio, m_cyRatio;
+
+protected:
+ void Assign(const CJS_ItemCtrl& src);
+
+public:
+ CJS_ItemCtrl();
+ CJS_ItemCtrl(const CJS_ItemCtrl& src);
+
+ HDWP OnSize(HDWP hdwp, int sizeType, CRect *pnCltRect, CRect *poCltRect, CRect *pR0, CWnd *pDlg);
+
+ CJS_ItemCtrl& operator=(const CJS_ItemCtrl& src);
+};
+
+class CJS_ResizeDlg : public CDialog
+{
+// DECLARE_DYNAMIC(CJS_ResizeDlg)
+public:
+ CJS_ResizeDlg(UINT nID,CWnd *pParentWnd = NULL);
+ virtual ~CJS_ResizeDlg();
+
+
+public:
+ std::vector<CJS_ItemCtrl> m_Items; // array of controlled items
+ CRect m_cltRect, m_cltR0;
+ int m_xMin, m_yMin;
+ int m_xSt, m_ySt; //step?
+ UINT m_nDelaySide; //drag side of window
+ CStatic m_wndSizeIcon; // size icon window
+
+protected:
+ void AddControl( UINT nID, int xl, int xr, int yt, int yb, int bFlickerFree = 0,
+ double xRatio = -1.0, double cxRatio = -1.0,
+ double yRatio = -1.0, double cyRatio = -1.0 );
+ void AllowSizing(int xst, int yst);
+ void HideSizeIcon(void);
+ virtual BOOL OnInitDialog();
+
+ void OnSizing(UINT nSide, LPRECT lpRect);
+ void OnSize(UINT nType, int cx, int cy);
+ void OnGetMinMaxInfo(MINMAXINFO *pmmi);
+ BOOL OnEraseBkgnd(CDC* pDC);
+
+public:
+ int UpdateControlRect(UINT nID, CRect *pnr);
+};
+
+
+//------------------------CIconListBox for CWndElementList-------------------------------------
+
+class CIconListBox : public CListBox
+{
+public:
+ CIconListBox();
+ virtual ~CIconListBox();
+
+public:
+ int InsertString(int nIndex, LPCWSTR lpszItem , int nImage);
+ virtual void ResetContent();
+ virtual void GetText(int nIndex, CString& rString);
+
+ virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
+ void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct);
+ int CompareItem(LPCOMPAREITEMSTRUCT lpCompareItemStruct);
+
+protected:
+ // Generated message map functions
+ //{{AFX_MSG(CIconListBox)
+ afx_msg void OnMouseMove(UINT nFlags, CPoint point);
+ //}}AFX_MSG
+ DECLARE_MESSAGE_MAP()
+
+protected:
+ struct ItemDatas
+ {
+ CString csText;
+ int nImage;
+ };
+};
+//----------------------------------CWndElementList--------------------------------------------
+#define IDC_LIST_JS_ELEMENT 10070
+
+#define ELEMENT_LIST_WIDTH 140
+#define ELEMENT_LIST_HEIGHT 180
+#define ELEMENT_LIST_TOP_OFFSET 13
+
+#define ELEMENT_TYPE_NAME 0
+#define ELEMENT_TYPE_CONST 1
+#define ELEMENT_TYPE_FUN 2
+#define ELEMENT_TYPE_PRO 3
+
+class CWndElementList : public CWnd
+{
+public:
+ CWndElementList();
+ virtual ~CWndElementList();
+
+public:
+ virtual void OnSize(UINT nType, int cx, int cy);
+ virtual BOOL Create(CWnd* pParentWnd);
+ virtual BOOL ShowWindow(int nCmdShow);
+ void RemoveAllElement();
+ void SetElementList(LPCWSTR* pElement, int* pType , int iCount);
+ void AddElement(CFX_WideString csValue , int nType);
+ BOOL GetElementSel(CString &csElement);
+ BOOL SelectNext();
+ BOOL SelectPrevious();
+ BOOL SelectFirst();
+ BOOL SelectLast();
+ BOOL SelectNextPage();
+ BOOL SelectPreviousPage();
+ int GetListHeight();
+
+protected:
+ // Generated message map functions
+ //{{AFX_MSG(CWndElementList)
+ afx_msg void OnPaint();
+ afx_msg BOOL OnNcActivate(BOOL bActive);
+ afx_msg void OnSelJSElement();
+ afx_msg void OnDblclkJSElement();
+ afx_msg void OnDestroy();
+ //}}AFX_MSG
+ DECLARE_MESSAGE_MAP()
+protected:
+ CIconListBox m_ListBox;
+ BOOL m_bBlock;
+};
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+// CJS_ConsoleDlg ¶Ô»°¿ò
+class CJS_ConsoleDlg : public CJS_ResizeDlg
+{
+ DECLARE_DYNAMIC(CJS_ConsoleDlg)
+
+public:
+ CJS_ConsoleDlg(CReader_App* pApp, CWnd* pParent);
+ virtual ~CJS_ConsoleDlg();
+
+ enum { IDD = IDD_JS_CONSOLE };
+
+ void Create();
+
+ void AppendConsoleText(const CFX_WideString& swText);
+ void SetConsoleText(const CFX_WideString& swText);
+ CFX_WideString GetConsoleText() const;
+ CFX_WideString GetScriptText() const;
+
+ BOOL ResetElementList(LPCWSTR lpstrRef);
+ IFXJS_Runtime* GetJSRuntime();
+
+protected:
+ virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV Ö§³Ö
+
+protected:
+ virtual BOOL OnInitDialog();
+ virtual void OnCancel();
+
+ virtual BOOL PreTranslateMessage(MSG* pMsg);
+
+protected:
+ // Generated message map functions
+ //{{AFX_MSG(CJS_ConsoleDlg)
+ afx_msg void OnBnClickedClear();
+ afx_msg void OnBnClickedOk();
+ afx_msg void OnBnClickTips();
+ afx_msg void OnSizing(UINT nSide, LPRECT lpRect);
+ afx_msg void OnSize(UINT nType, int cx, int cy);
+ afx_msg void OnGetMinMaxInfo(MINMAXINFO *pmmi);
+ afx_msg BOOL OnEraseBkgnd(CDC* pDC);
+ afx_msg void OnShowWindow(BOOL bShow, UINT nStatus);
+
+ afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
+ afx_msg void OnChangeScriptEdit(WPARAM wParam , LPARAM lParam);
+ afx_msg void OnMove(int x , int y);
+ public:
+ virtual int DoModal();
+ //}}AFX_MSG
+ DECLARE_MESSAGE_MAP()
+
+public:
+ CGW_LineNumberEdit m_edtSC;
+ BOOL m_bTips;
+ const UINT m_uTextlimited;
+ FX_HGLOBAL m_hGlobal;
+ CReader_App * m_pApp;
+ CWndElementList m_WndElementList;
+};
+
+#endif //_JS_CONSOLE_H_
\ No newline at end of file diff --git a/fpdfsdk/include/javascript/JS_Context.h b/fpdfsdk/include/javascript/JS_Context.h new file mode 100644 index 0000000000..0e79169d53 --- /dev/null +++ b/fpdfsdk/include/javascript/JS_Context.h @@ -0,0 +1,101 @@ +// 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 _JS_CONTEXT_H_
+#define _JS_CONTEXT_H_
+
+class CJS_EventHandler;
+class CJS_Runtime;
+
+class CJS_Context : public IFXJS_Context
+{
+public:
+ CJS_Context(CJS_Runtime* pRuntime);
+ virtual ~CJS_Context();
+
+public:
+ virtual FX_BOOL Compile(const CFX_WideString& script, CFX_WideString& info);
+ virtual FX_BOOL RunScript(const CFX_WideString& script, CFX_WideString& info);
+
+public:
+ virtual void OnApp_Init();
+
+ virtual void OnDoc_Open(CPDFSDK_Document* pDoc, const CFX_WideString& strTargetName);
+ virtual void OnDoc_WillPrint(CPDFSDK_Document* pDoc);
+ virtual void OnDoc_DidPrint(CPDFSDK_Document* pDoc);
+ virtual void OnDoc_WillSave(CPDFSDK_Document* pDoc);
+ virtual void OnDoc_DidSave(CPDFSDK_Document* pDoc);
+ virtual void OnDoc_WillClose(CPDFSDK_Document* pDoc);
+
+ virtual void OnPage_Open(CPDFSDK_Document* pTarget);
+ virtual void OnPage_Close(CPDFSDK_Document* pTarget);
+ virtual void OnPage_InView(CPDFSDK_Document* pTarget);
+ virtual void OnPage_OutView(CPDFSDK_Document* pTarget);
+
+ virtual void OnField_MouseDown(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField *pTarget);
+ virtual void OnField_MouseEnter(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField *pTarget);
+ virtual void OnField_MouseExit(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField *pTarget);
+ virtual void OnField_MouseUp(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField *pTarget);
+ virtual void OnField_Focus(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget, const CFX_WideString& Value);
+ virtual void OnField_Blur(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget, const CFX_WideString& Value);
+
+ virtual void OnField_Calculate(CPDF_FormField* pSource, CPDF_FormField* pTarget, CFX_WideString& Value, FX_BOOL& bRc);
+ virtual void OnField_Format(int nCommitKey, CPDF_FormField* pTarget, CFX_WideString& Value, FX_BOOL bWillCommit);
+ virtual void OnField_Keystroke(int nCommitKey, 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);
+ virtual 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);
+
+ virtual void OnScreen_Focus(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);
+ virtual void OnScreen_Blur(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);
+ virtual void OnScreen_Open(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);
+ virtual void OnScreen_Close(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);
+ virtual void OnScreen_MouseDown(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);
+ virtual void OnScreen_MouseUp(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);
+ virtual void OnScreen_MouseEnter(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);
+ virtual void OnScreen_MouseExit(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);
+ virtual void OnScreen_InView(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);
+ virtual void OnScreen_OutView(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);
+
+ virtual void OnBookmark_MouseUp(CPDF_Bookmark* pBookMark);
+ virtual void OnLink_MouseUp(CPDFSDK_Document* pTarget);
+
+ virtual void OnMenu_Exec(CPDFSDK_Document* pTarget, const CFX_WideString& strTargetName);
+ virtual void OnBatchExec(CPDFSDK_Document* pTarget);
+ virtual void OnConsole_Exec();
+ virtual void OnExternal_Exec();
+
+ virtual void EnableMessageBox(FX_BOOL bEnable) {m_bMsgBoxEnable = bEnable;}
+ FX_BOOL IsMsgBoxEnabled() const {return m_bMsgBoxEnable;}
+
+public:
+ CPDFDoc_Environment* GetReaderApp();
+ CJS_Runtime* GetJSRuntime(){return m_pRuntime;}
+
+ FX_BOOL DoJob(int nMode, const CFX_WideString& script, CFX_WideString& info);
+
+ CJS_EventHandler* GetEventHandler(){return m_pEventHandler;};
+ CPDFSDK_Document* GetReaderDocument();
+
+private:
+ CJS_Runtime* m_pRuntime;
+ CJS_EventHandler* m_pEventHandler;
+
+ FX_BOOL m_bBusy;
+ FX_BOOL m_bMsgBoxEnable;
+};
+
+// static CFX_WideString JSGetStringFromID(CJS_Context* pContext, UINT ID)
+// {
+// ASSERT(pContext != NULL);
+//
+// return JS_LoadString(pContext->GetReaderApp(), ID);
+// }
+
+#endif //_JS_CONTEXT_H_
+
diff --git a/fpdfsdk/include/javascript/JS_Define.h b/fpdfsdk/include/javascript/JS_Define.h new file mode 100644 index 0000000000..c86289e640 --- /dev/null +++ b/fpdfsdk/include/javascript/JS_Define.h @@ -0,0 +1,785 @@ +// 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 _JS_DEFINE_H_
+#define _JS_DEFINE_H_
+
+typedef v8::Value JSValue;
+typedef v8::Handle<v8::Object> JSObject;
+typedef v8::Handle<v8::Object> JSFXObject;
+typedef unsigned JSBool;
+
+struct JSConstSpec
+{
+ const wchar_t* pName;
+ double number;
+ const wchar_t* string;
+ FX_BYTE t; //0:double 1:str
+};
+
+struct JSPropertySpec
+{
+ const wchar_t* pName;
+ AccessorGetterCallback pPropGet;
+ AccessorSetterCallback pPropPut;
+};
+
+struct JSMethodSpec
+{
+ const wchar_t* pName;
+ FunctionCallback pMethodCall;
+ unsigned nParamNum;
+};
+
+typedef CFX_WideString JS_ErrorString;
+
+#define JS_TRUE (unsigned)1
+#define JS_FALSE (unsigned)0
+
+
+#define CJS_PointsArray CFX_ArrayTemplate<float>
+#define CJS_IntArray CFX_ArrayTemplate<int>
+
+/* ====================================== PUBLIC DEFINE SPEC ============================================== */
+#ifndef __GNUC__
+#define JS_WIDESTRING(widestring) L#widestring
+#else
+#define JS_WIDESTRING(widestring) L""#widestring
+#endif
+
+#define OBJ_PROP_PARAMS IFXJS_Context* cc, CJS_PropValue& vp, JS_ErrorString& sError
+#define OBJ_METHOD_PARAMS IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, JS_ErrorString& sError
+#define BEGIN_JS_STATIC_CONST(js_class_name) JSConstSpec js_class_name::JS_Class_Consts[] = {
+#define JS_STATIC_CONST_ENTRY_NUMBER(const_name, pValue) {JS_WIDESTRING(const_name), pValue, L"", 0},
+#define JS_STATIC_CONST_ENTRY_STRING(const_name, pValue) {JS_WIDESTRING(const_name), 0, JS_WIDESTRING(pValue), 1},
+#define END_JS_STATIC_CONST() {0, 0, 0, 0}};
+
+#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}};
+
+#define BEGIN_JS_STATIC_METHOD(js_class_name) JSMethodSpec js_class_name::JS_Class_Methods[] = {
+#define JS_STATIC_METHOD_ENTRY(method_name, nargs) {JS_WIDESTRING(method_name), method_name##_static, nargs},
+#define END_JS_STATIC_METHOD() {0, 0, 0}};
+#define MEMLEAKCHECK_1() ((void)0)
+#define MEMLEAKCHECK_2(main_name, sub_name) ((void)0)
+
+
+/*
+#ifdef _DEBUG
+#define MEMLEAKCHECK_1() \
+ _CrtMemState state1;\
+ _CrtMemCheckpoint(&state1);
+
+#define MEMLEAKCHECK_2(main_name,sub_name) \
+ _CrtMemState state2;\
+ _CrtMemCheckpoint(&state2);\
+ _CrtMemState diff;\
+ _CrtMemDifference(&diff,&state1,&state2);\
+ if (diff.lSizes[_NORMAL_BLOCK] > 0)\
+ {\
+ TRACE("Detected normal block memory leaks in JS Module! [%s.%s]\n",#main_name,#sub_name);\
+ _CrtMemDumpStatistics(&diff);\
+ }
+#else
+ #define MEMLEAKCHECK_1() ((void)0)
+ #define MEMLEAKCHECK_2(main_name,sub_name) ((void)0)
+#endif
+*/
+
+/* ======================================== PROP CALLBACK ============================================ */
+
+#define JS_STATIC_PROP_GET(prop_name, class_name)\
+ static void get_##prop_name##_static(JS_PROPGET_ARGS)\
+{\
+ v8::Isolate* isolate = info.GetIsolate();\
+ v8::Local<v8::Context> context = isolate->GetCurrentContext();\
+ v8::Local<v8::Value> v = context->GetEmbedderData(1);\
+ ASSERT(!v.IsEmpty());\
+ if(v.IsEmpty()) return;\
+ v8::Handle<External> field = v8::Handle<External>::Cast(v);\
+ IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();\
+ IFXJS_Context* cc = pRuntime->GetCurrentContext();\
+ CJS_PropValue value(isolate);\
+ value.StartGetting();\
+ CJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());\
+ ASSERT(pJSObj != NULL);\
+ class_name* pObj = (class_name*)pJSObj->GetEmbedObject();\
+ ASSERT(pObj != NULL);\
+ JS_ErrorString sError;\
+ FX_BOOL bRet = FALSE;\
+ try\
+ {\
+ MEMLEAKCHECK_1();\
+ bRet = pObj->prop_name(cc, value, sError);\
+ MEMLEAKCHECK_2(class_name, prop_name);\
+ }\
+ catch (...)\
+ {\
+ CFX_ByteString cbName;\
+ cbName.Format("%s.%s", #class_name, #prop_name);\
+ JS_Error(NULL,CFX_WideString::FromLocal(cbName), L"Unknown error is catched!");\
+ return ;\
+ }\
+ if (bRet)\
+ {\
+ info.GetReturnValue().Set((v8::Handle<v8::Value>)value);\
+ return ;\
+ }\
+ else\
+ {\
+ CFX_ByteString cbName;\
+ cbName.Format("%s.%s", #class_name, #prop_name);\
+ JS_Error(NULL,CFX_WideString::FromLocal(cbName), sError);\
+ return ;\
+ }\
+}
+
+#define JS_STATIC_PROP_SET(prop_name, class_name)\
+ static void set_##prop_name##_static(JS_PROPPUT_ARGS)\
+{\
+ v8::Isolate* isolate = info.GetIsolate();\
+ v8::Local<v8::Context> context = isolate->GetCurrentContext();\
+ v8::Local<v8::Value> v = context->GetEmbedderData(1);\
+ ASSERT(!v.IsEmpty());\
+ if(v.IsEmpty()) return;\
+ v8::Handle<External> field = v8::Handle<External>::Cast(v);\
+ IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();\
+ IFXJS_Context* cc = pRuntime->GetCurrentContext();\
+ CJS_PropValue propValue(CJS_Value(isolate,value,VT_unknown));\
+ propValue.StartSetting();\
+ CJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());\
+ ASSERT(pJSObj != NULL);\
+ class_name* pObj = (class_name*)pJSObj->GetEmbedObject();\
+ ASSERT(pObj != NULL);\
+ JS_ErrorString sError;\
+ FX_BOOL bRet = FALSE;\
+ try\
+ {\
+ MEMLEAKCHECK_1();\
+ bRet = pObj->prop_name(cc, propValue, sError);\
+ MEMLEAKCHECK_2(class_name, prop_name);\
+ }\
+ catch (...)\
+ {\
+ CFX_ByteString cbName;\
+ cbName.Format("%s.%s", #class_name, #prop_name);\
+ JS_Error(NULL,CFX_WideString::FromLocal(cbName), L"Unknown error is catched!");\
+ return ;\
+ }\
+ if (bRet)\
+ {\
+ return ;\
+ }\
+ else\
+ {\
+ CFX_ByteString cbName;\
+ cbName.Format("%s.%s", #class_name, #prop_name);\
+ JS_Error(NULL,CFX_WideString::FromLocal(cbName), sError);\
+ return ;\
+ }\
+}
+
+#define JS_STATIC_PROP(prop_name, class_name)\
+JS_STATIC_PROP_GET(prop_name, class_name);\
+JS_STATIC_PROP_SET(prop_name, class_name)
+
+/* ========================================= METHOD CALLBACK =========================================== */
+
+#define JS_STATIC_METHOD(method_name, class_name)\
+ static void method_name##_static(JS_METHOD_ARGS)\
+{\
+ v8::Isolate* isolate = info.GetIsolate();\
+ v8::Local<v8::Context> context = isolate->GetCurrentContext();\
+ v8::Local<v8::Value> v = context->GetEmbedderData(1);\
+ ASSERT(!v.IsEmpty());\
+ if(v.IsEmpty()) return;\
+ v8::Handle<External> field = v8::Handle<External>::Cast(v);\
+ IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();\
+ IFXJS_Context* cc = pRuntime->GetCurrentContext();\
+ CJS_Parameters parameters;\
+ for (unsigned int i = 0; i<(unsigned int)info.Length(); i++)\
+ {\
+ parameters.push_back(CJS_Value(isolate, info[i], VT_unknown));\
+ }\
+ CJS_Value valueRes(isolate);\
+ CJS_Object* pJSObj = (CJS_Object *)JS_GetPrivate(isolate,info.Holder());\
+ ASSERT(pJSObj != NULL);\
+ class_name* pObj = (class_name*)pJSObj->GetEmbedObject();\
+ ASSERT(pObj != NULL);\
+ JS_ErrorString sError;\
+ FX_BOOL bRet = FALSE;\
+ try\
+ {\
+ MEMLEAKCHECK_1();\
+ bRet = pObj->method_name(cc, parameters, valueRes, sError);\
+ MEMLEAKCHECK_2(class_name, method_name);\
+ }\
+ catch (...)\
+ {\
+ CFX_ByteString cbName;\
+ cbName.Format("%s.%s", #class_name, #method_name);\
+ JS_Error(NULL, CFX_WideString::FromLocal(cbName), L"Unknown error is catched!");\
+ return ;\
+ }\
+ if (bRet)\
+ {\
+ info.GetReturnValue().Set(valueRes.ToJSValue());\
+ return ;\
+ }\
+ else\
+ {\
+ CFX_ByteString cbName;\
+ cbName.Format("%s.%s", #class_name, #method_name);\
+ JS_Error(NULL, CFX_WideString::FromLocal(cbName), sError);\
+ return ;\
+ }\
+}
+
+/* ===================================== JS CLASS =============================================== */
+
+#define DECLARE_JS_CLASS(js_class_name) \
+ static JSBool JSConstructor(IFXJS_Context* cc, JSFXObject obj,JSFXObject global);\
+ static JSBool JSDestructor(JSFXObject obj);\
+ static int Init(IJS_Runtime* pRuntime, FXJSOBJTYPE eObjType);\
+ static void GetConsts(JSConstSpec*& pConsts, int& nSize);\
+ static void GetProperties(JSPropertySpec*& pProperties, int& nSize);\
+ static void GetMethods(JSMethodSpec*& pMethods, int& nSize);\
+ static JSConstSpec JS_Class_Consts[];\
+ static JSPropertySpec JS_Class_Properties[];\
+ static JSMethodSpec JS_Class_Methods[];\
+ static const wchar_t* m_pClassName
+
+#define IMPLEMENT_JS_CLASS_RICH(js_class_name, class_alternate, class_name) \
+const wchar_t* js_class_name::m_pClassName = JS_WIDESTRING(class_name);\
+JSBool js_class_name::JSConstructor(IFXJS_Context* cc, JSFXObject obj, JSFXObject global)\
+{\
+ CJS_Object* pObj = FX_NEW js_class_name(obj);\
+ pObj->SetEmbedObject(FX_NEW class_alternate(pObj));\
+ JS_SetPrivate(NULL,obj,(void*)pObj); \
+ pObj->InitInstance(cc);\
+ return JS_TRUE;\
+}\
+\
+JSBool js_class_name::JSDestructor(JSFXObject obj) \
+{\
+ js_class_name* pObj = (js_class_name*)JS_GetPrivate(NULL,obj);\
+ ASSERT(pObj != NULL);\
+ pObj->ExitInstance();\
+ delete pObj;\
+ return JS_TRUE;\
+}\
+\
+int js_class_name::Init(IJS_Runtime* pRuntime, FXJSOBJTYPE eObjType)\
+{\
+ int nObjDefnID = JS_DefineObj(pRuntime, js_class_name::m_pClassName, eObjType, JSConstructor, JSDestructor, 0);\
+ if (nObjDefnID >= 0)\
+ {\
+ for (int j=0, szj=sizeof(JS_Class_Properties)/sizeof(JSPropertySpec)-1; j<szj; j++)\
+ {\
+ if (JS_DefineObjProperty(pRuntime, nObjDefnID, JS_Class_Properties[j].pName, JS_Class_Properties[j].pPropGet, JS_Class_Properties[j].pPropPut) < 0) return -1;\
+ }\
+ for (int k=0, szk=sizeof(JS_Class_Methods)/sizeof(JSMethodSpec)-1; k<szk; k++)\
+ {\
+ if (JS_DefineObjMethod(pRuntime, nObjDefnID,JS_Class_Methods[k].pName, JS_Class_Methods[k].pMethodCall, JS_Class_Methods[k].nParamNum) < 0) return -1;\
+ }\
+ return nObjDefnID;\
+ }\
+ return -1;\
+}\
+void js_class_name::GetConsts(JSConstSpec*& pConsts, int& nSize)\
+{\
+ pConsts = JS_Class_Consts;\
+ nSize = sizeof(JS_Class_Consts) / sizeof(JSConstSpec) - 1;\
+}\
+void js_class_name::GetProperties(JSPropertySpec*& pProperties, int& nSize)\
+{\
+ pProperties = JS_Class_Properties;\
+ nSize = sizeof(JS_Class_Properties) / sizeof(JSPropertySpec) - 1;\
+}\
+void js_class_name::GetMethods(JSMethodSpec*& pMethods, int& nSize)\
+{\
+ pMethods = JS_Class_Methods;\
+ nSize = sizeof(JS_Class_Methods) / sizeof(JSMethodSpec) - 1;\
+}
+
+#define IMPLEMENT_JS_CLASS(js_class_name, class_name) IMPLEMENT_JS_CLASS_RICH(js_class_name, class_name, class_name)
+
+/* ======================================== CONST CLASS ============================================ */
+
+#define DECLARE_JS_CLASS_CONST() \
+ static int Init(IJS_Runtime* pRuntime, FXJSOBJTYPE eObjType);\
+ static void GetConsts(JSConstSpec*& pConsts, int& nSize);\
+ static JSConstSpec JS_Class_Consts[];\
+ static const wchar_t* m_pClassName
+
+#define IMPLEMENT_JS_CLASS_CONST(js_class_name, class_name) \
+const wchar_t* js_class_name::m_pClassName = JS_WIDESTRING(class_name);\
+int js_class_name::Init(IJS_Runtime* pRuntime, FXJSOBJTYPE eObjType)\
+{\
+ int nObjDefnID = JS_DefineObj(pRuntime, js_class_name::m_pClassName, eObjType, NULL, NULL, 0);\
+ if (nObjDefnID >=0)\
+ {\
+ for (int i=0, sz=sizeof(JS_Class_Consts)/sizeof(JSConstSpec)-1; i<sz; i++)\
+ {\
+ if (JS_Class_Consts[i].t == 0)\
+ {\
+ if (JS_DefineObjConst(pRuntime, nObjDefnID, JS_Class_Consts[i].pName, JS_NewNumber(pRuntime,JS_Class_Consts[i].number)) < 0) return -1;\
+ }\
+ else\
+ {\
+ if (JS_DefineObjConst(pRuntime, nObjDefnID, JS_Class_Consts[i].pName, JS_NewString(pRuntime,JS_Class_Consts[i].string)) < 0) return -1;\
+ }\
+ }\
+ return nObjDefnID;\
+ }\
+ return -1;\
+}\
+void js_class_name::GetConsts(JSConstSpec*& pConsts, int& nSize)\
+{\
+ pConsts = JS_Class_Consts;\
+ nSize = sizeof(JS_Class_Consts)/sizeof(JSConstSpec)-1;\
+}
+
+/* ===================================== SPECIAL JS CLASS =============================================== */
+
+#define DECLARE_SPECIAL_JS_CLASS(js_class_name) \
+ static JSBool JSConstructor(IFXJS_Context* cc, JSFXObject obj, JSFXObject global);\
+ static JSBool JSDestructor(JSFXObject obj);\
+ static void GetConsts(JSConstSpec*& pConsts, int& nSize);\
+ static void GetProperties(JSPropertySpec*& pProperties, int& nSize);\
+ static void GetMethods(JSMethodSpec*& pMethods, int& nSize);\
+ static JSConstSpec JS_Class_Consts[];\
+ static JSPropertySpec JS_Class_Properties[];\
+ static JSMethodSpec JS_Class_Methods[];\
+ static int Init(IJS_Runtime* pRuntime, FXJSOBJTYPE eObjType);\
+ static const wchar_t* m_pClassName;\
+ static void queryprop_##js_class_name##_static(JS_PROPQUERY_ARGS);\
+ static void getprop_##js_class_name##_static(JS_NAMED_PROPGET_ARGS);\
+ static void putprop_##js_class_name##_static(JS_NAMED_PROPPUT_ARGS);\
+ static void delprop_##js_class_name##_static(JS_PROPDEL_ARGS)
+
+#define IMPLEMENT_SPECIAL_JS_CLASS(js_class_name, class_alternate, class_name) \
+const wchar_t * js_class_name::m_pClassName = JS_WIDESTRING(class_name);\
+ void js_class_name::queryprop_##js_class_name##_static(JS_PROPQUERY_ARGS)\
+{\
+ 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 = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());\
+ ASSERT(pJSObj != NULL);\
+ class_alternate* pObj = (class_alternate*)pJSObj->GetEmbedObject();\
+ ASSERT(pObj != NULL);\
+ FX_BOOL bRet = FALSE;\
+ try\
+ {\
+ MEMLEAKCHECK_1();\
+ bRet = pObj->QueryProperty((FX_LPCWSTR)propname);\
+ MEMLEAKCHECK_2(class_name, (FX_LPCWSTR)prop_name);\
+ }\
+ catch (...)\
+ {\
+ return ;\
+ }\
+ if (bRet)\
+ {\
+ info.GetReturnValue().Set(0x004);\
+ return ;\
+ }\
+ else\
+ {\
+ info.GetReturnValue().Set(0);\
+ return ;\
+ }\
+ return ;\
+}\
+ void js_class_name::getprop_##js_class_name##_static(JS_NAMED_PROPGET_ARGS)\
+{\
+ v8::Isolate* isolate = info.GetIsolate();\
+ v8::Local<v8::Context> context = isolate->GetCurrentContext();\
+ v8::Local<v8::Value> v = context->GetEmbedderData(1);\
+ ASSERT(!v.IsEmpty());\
+ if(v.IsEmpty()) return;\
+ v8::Handle<External> field = v8::Handle<External>::Cast(v);\
+ IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();\
+ IFXJS_Context* cc = pRuntime->GetCurrentContext();\
+ v8::String::Utf8Value utf8_value(property);\
+ CFX_WideString propname = CFX_WideString::FromUTF8(*utf8_value, utf8_value.length());\
+ CJS_PropValue value(isolate);\
+ value.StartGetting();\
+ CJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());\
+ ASSERT(pJSObj != NULL);\
+ class_alternate* pObj = (class_alternate*)pJSObj->GetEmbedObject();\
+ ASSERT(pObj != NULL);\
+ JS_ErrorString sError;\
+ FX_BOOL bRet = FALSE;\
+ try\
+ {\
+ MEMLEAKCHECK_1();\
+ bRet = pObj->DoProperty(cc, (FX_LPCWSTR)propname, value, sError);\
+ MEMLEAKCHECK_2(class_name, L"GetProperty");\
+ }\
+ catch (...)\
+ {\
+ CFX_ByteString cbName;\
+ cbName.Format("%s.%s", #class_name, L"GetProperty");\
+ JS_Error(NULL,CFX_WideString::FromLocal(cbName), L"Unknown error is catched!");\
+ return ;\
+ }\
+ if (bRet)\
+ {\
+ info.GetReturnValue().Set((v8::Handle<v8::Value>)value);\
+ return ;\
+ }\
+ else\
+ {\
+ CFX_ByteString cbName;\
+ cbName.Format("%s.%s", #class_name, L"GetProperty");\
+ JS_Error(NULL,CFX_WideString::FromLocal(cbName), sError);\
+ return ;\
+ }\
+ JS_Error(NULL,L"GetProperty", L"Embeded object not found!");\
+ return ;\
+}\
+ void js_class_name::putprop_##js_class_name##_static(JS_NAMED_PROPPUT_ARGS)\
+{\
+ v8::Isolate* isolate = info.GetIsolate();\
+ v8::Local<v8::Context> context = isolate->GetCurrentContext();\
+ v8::Local<v8::Value> v = context->GetEmbedderData(1);\
+ ASSERT(!v.IsEmpty());\
+ if(v.IsEmpty()) return;\
+ v8::Handle<External> field = v8::Handle<External>::Cast(v);\
+ IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();\
+ IFXJS_Context* cc = pRuntime->GetCurrentContext();\
+ v8::String::Utf8Value utf8_value(property);\
+ CFX_WideString propname = CFX_WideString::FromUTF8(*utf8_value, utf8_value.length());\
+ CJS_PropValue PropValue(CJS_Value(isolate,value,VT_unknown));\
+ PropValue.StartSetting();\
+ CJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());\
+ if(!pJSObj) return;\
+ class_alternate* pObj = (class_alternate*)pJSObj->GetEmbedObject();\
+ ASSERT(pObj != NULL);\
+ JS_ErrorString sError;\
+ FX_BOOL bRet = FALSE;\
+ try\
+ {\
+ MEMLEAKCHECK_1();\
+ bRet = pObj->DoProperty(cc, (FX_LPCWSTR)propname, PropValue, sError);\
+ MEMLEAKCHECK_2(class_name,L"PutProperty");\
+ }\
+ catch (...)\
+ {\
+ CFX_ByteString cbName;\
+ cbName.Format("%s.%s", #class_name, "PutProperty");\
+ JS_Error(NULL,CFX_WideString::FromLocal(cbName), L"Unknown error is catched!");\
+ return ;\
+ }\
+ if (bRet)\
+ {\
+ return ;\
+ }\
+ else\
+ {\
+ CFX_ByteString cbName;\
+ cbName.Format("%s.%s", #class_name, "PutProperty");\
+ JS_Error(NULL,CFX_WideString::FromLocal(cbName), sError);\
+ return ;\
+ }\
+ JS_Error(NULL,L"PutProperty", L"Embeded object not found!");\
+ return ;\
+}\
+ void js_class_name::delprop_##js_class_name##_static(JS_PROPDEL_ARGS)\
+{\
+ v8::Isolate* isolate = info.GetIsolate();\
+ v8::Local<v8::Context> context = isolate->GetCurrentContext();\
+ v8::Local<v8::Value> v = context->GetEmbedderData(1);\
+ ASSERT(!v.IsEmpty());\
+ if(v.IsEmpty()) return;\
+ v8::Handle<External> field = v8::Handle<External>::Cast(v);\
+ IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();\
+ IFXJS_Context* cc = pRuntime->GetCurrentContext();\
+ v8::String::Utf8Value utf8_value(property);\
+ CFX_WideString propname = CFX_WideString::FromUTF8(*utf8_value, utf8_value.length());\
+ CJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());\
+ ASSERT(pJSObj != NULL);\
+ class_alternate* pObj = (class_alternate*)pJSObj->GetEmbedObject();\
+ ASSERT(pObj != NULL);\
+ JS_ErrorString sError;\
+ FX_BOOL bRet = FALSE;\
+ try\
+ {\
+ MEMLEAKCHECK_1();\
+ bRet = pObj->DelProperty(cc, (FX_LPCWSTR)propname, sError);\
+ MEMLEAKCHECK_2(class_name,L"DelProperty");\
+ }\
+ catch (...)\
+ {\
+ CFX_ByteString cbName;\
+ cbName.Format("%s.%s", #class_name, "DelProperty");\
+ return ;\
+ }\
+ if (bRet)\
+ {\
+ return ;\
+ }\
+ else\
+ {\
+ CFX_ByteString cbName;\
+ cbName.Format("%s.%s", #class_name, "DelProperty");\
+ return ;\
+ }\
+ return ;\
+}\
+JSBool js_class_name::JSConstructor(IFXJS_Context* cc, JSFXObject obj,JSFXObject global)\
+{\
+ CJS_Object* pObj = FX_NEW js_class_name(obj);\
+ pObj->SetEmbedObject(FX_NEW class_alternate(pObj));\
+ JS_SetPrivate(NULL,obj, (void*)pObj); \
+ pObj->InitInstance(cc);\
+ return JS_TRUE;\
+}\
+\
+JSBool js_class_name::JSDestructor(JSFXObject obj) \
+{\
+ js_class_name* pObj = (js_class_name*)JS_GetPrivate(NULL,obj);\
+ ASSERT(pObj != NULL);\
+ pObj->ExitInstance();\
+ delete pObj;\
+ return JS_TRUE;\
+}\
+\
+int js_class_name::Init(IJS_Runtime* pRuntime, FXJSOBJTYPE eObjType)\
+{\
+\
+ int nObjDefnID = JS_DefineObj(pRuntime, js_class_name::m_pClassName, eObjType, JSConstructor, JSDestructor, 0);\
+\
+ if (nObjDefnID >= 0)\
+ {\
+ for (int j=0, szj=sizeof(JS_Class_Properties)/sizeof(JSPropertySpec)-1; j<szj; j++)\
+ {\
+ if (JS_DefineObjProperty(pRuntime, nObjDefnID, JS_Class_Properties[j].pName, JS_Class_Properties[j].pPropGet,JS_Class_Properties[j].pPropPut)<0)return -1;\
+ }\
+\
+ for (int k=0, szk=sizeof(JS_Class_Methods)/sizeof(JSMethodSpec)-1; k<szk; k++)\
+ {\
+ if (JS_DefineObjMethod(pRuntime, nObjDefnID,JS_Class_Methods[k].pName,JS_Class_Methods[k].pMethodCall,JS_Class_Methods[k].nParamNum)<0)return -1;\
+ }\
+ if (JS_DefineObjAllProperties(pRuntime, nObjDefnID, js_class_name::queryprop_##js_class_name##_static, js_class_name::getprop_##js_class_name##_static,js_class_name::putprop_##js_class_name##_static,js_class_name::delprop_##js_class_name##_static)<0) return -1;\
+\
+ return nObjDefnID;\
+ }\
+\
+ return -1;\
+}\
+void js_class_name::GetConsts(JSConstSpec*& pConsts, int& nSize)\
+{\
+ pConsts = JS_Class_Consts;\
+ nSize = sizeof(JS_Class_Consts)/sizeof(JSConstSpec)-1;\
+}\
+void js_class_name::GetProperties(JSPropertySpec*& pProperties, int& nSize)\
+{\
+ pProperties = JS_Class_Properties;\
+ nSize = sizeof(JS_Class_Properties)/sizeof(JSPropertySpec)-1;\
+}\
+void js_class_name::GetMethods(JSMethodSpec*& pMethods, int& nSize)\
+{\
+ pMethods = JS_Class_Methods;\
+ nSize = sizeof(JS_Class_Methods)/sizeof(JSMethodSpec)-1;\
+}
+
+#define JS_SPECIAL_STATIC_METHOD(method_name, class_alternate, class_name)\
+ static void method_name##_static(JS_METHOD_ARGS)\
+{\
+ v8::Isolate* isolate = info.GetIsolate();\
+ v8::Local<v8::Context> context = isolate->GetCurrentContext();\
+ v8::Local<v8::Value> v = context->GetEmbedderData(1);\
+ ASSERT(!v.IsEmpty());\
+ if(v.IsEmpty()) return;\
+ v8::Handle<External> field = v8::Handle<External>::Cast(v);\
+ IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();\
+ IFXJS_Context* cc = pRuntime->GetCurrentContext();\
+ CJS_Parameters parameters;\
+ for (unsigned int i = 0; i<(unsigned int)info.Length(); i++)\
+ {\
+ parameters.push_back(CJS_Value(isolate, info[i], VT_unknown));\
+ }\
+ CJS_Value valueRes(isolate);\
+ CJS_Object* pJSObj = (CJS_Object *)JS_GetPrivate(isolate, info.Holder());\
+ ASSERT(pJSObj != NULL);\
+ class_alternate* pObj = (class_alternate*)pJSObj->GetEmbedObject();\
+ ASSERT(pObj != NULL);\
+ JS_ErrorString sError;\
+ FX_BOOL bRet = FALSE;\
+ try\
+ {\
+ MEMLEAKCHECK_1();\
+ bRet = pObj->method_name(cc, parameters, valueRes, sError);\
+ MEMLEAKCHECK_2(class_name, method_name);\
+ }\
+ catch (...)\
+ {\
+ CFX_ByteString cbName;\
+ cbName.Format("%s.%s", #class_name, #method_name);\
+ JS_Error(NULL, CFX_WideString::FromLocal(cbName), L"Unknown error is catched!");\
+ return ;\
+ }\
+ if (bRet)\
+ {\
+ info.GetReturnValue().Set(valueRes.ToJSValue());\
+ return ;\
+ }\
+ else\
+ {\
+ CFX_ByteString cbName;\
+ cbName.Format("%s.%s", #class_name, #method_name);\
+ JS_Error(NULL, CFX_WideString::FromLocal(cbName), sError);\
+ return ;\
+ }\
+ JS_Error(NULL, JS_WIDESTRING(method_name), L"Embeded object not found!");\
+ return ;\
+}
+
+/* ======================================== GLOBAL METHODS ============================================ */
+#define JS_STATIC_GLOBAL_FUN(fun_name) \
+static void fun_name##_static(JS_METHOD_ARGS)\
+{\
+ v8::Isolate* isolate = info.GetIsolate();\
+ v8::Local<v8::Context> context = isolate->GetCurrentContext();\
+ v8::Local<v8::Value> v = context->GetEmbedderData(1);\
+ ASSERT(!v.IsEmpty());\
+ if(v.IsEmpty()) return;\
+ v8::Handle<External> field = v8::Handle<External>::Cast(v);\
+ IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();\
+ IFXJS_Context* cc = pRuntime->GetCurrentContext();\
+ CJS_Parameters parameters;\
+ for (unsigned int i = 0; i<(unsigned int)info.Length(); i++)\
+ {\
+ parameters.push_back(CJS_Value(isolate, info[i], VT_unknown));\
+ }\
+ CJS_Value valueRes(isolate);\
+ JS_ErrorString sError;\
+ if (!fun_name(cc, parameters, valueRes, sError))\
+ {\
+ JS_Error(NULL, JS_WIDESTRING(fun_name), sError);\
+ return ;\
+ }\
+ info.GetReturnValue().Set(valueRes.ToJSValue());\
+ return ;\
+}
+
+#define JS_STATIC_DECLARE_GLOBAL_FUN() \
+static JSMethodSpec global_methods[]; \
+static int Init(IJS_Runtime* pRuntime)
+
+#define BEGIN_JS_STATIC_GLOBAL_FUN(js_class_name) \
+JSMethodSpec js_class_name::global_methods[] = {
+
+#define JS_STATIC_GLOBAL_FUN_ENTRY(method_name,nargs) JS_STATIC_METHOD_ENTRY(method_name,nargs)
+
+#define END_JS_STATIC_GLOBAL_FUN() END_JS_STATIC_METHOD()
+
+#define IMPLEMENT_JS_STATIC_GLOBAL_FUN(js_class_name) \
+int js_class_name::Init(IJS_Runtime* pRuntime)\
+{\
+ for (int i=0, sz=sizeof(js_class_name::global_methods)/sizeof(JSMethodSpec)-1; i<sz; i++)\
+ {\
+ if (JS_DefineGlobalMethod(pRuntime,\
+ js_class_name::global_methods[i].pName,\
+ js_class_name::global_methods[i].pMethodCall,\
+ js_class_name::global_methods[i].nParamNum\
+ ) < 0\
+ )return -1;\
+ }\
+ return 0;\
+}
+
+/* ======================================== GLOBAL CONSTS ============================================ */
+#define DEFINE_GLOBAL_CONST(pRuntime, const_name , const_value)\
+if (JS_DefineGlobalConst(pRuntime,JS_WIDESTRING(const_name),JS_NewString(pRuntime,JS_WIDESTRING(const_value)))) return -1
+
+/* ======================================== GLOBAL ARRAYS ============================================ */
+
+#define DEFINE_GLOBAL_ARRAY(pRuntime)\
+int size = sizeof(ArrayContent) / sizeof(FX_LPCWSTR);\
+\
+CJS_Array array(pRuntime);\
+for (int i=0; i<size; i++) array.SetElement(i,CJS_Value(pRuntime,(FX_LPCWSTR)ArrayContent[i]));\
+\
+CJS_PropValue prop(pRuntime);\
+prop << array;\
+if (JS_DefineGlobalConst(pRuntime, (const wchar_t*)ArrayName, prop.ToJSValue()) < 0)\
+ return -1
+
+/* ============================================================ */
+
+#define VALUE_NAME_STRING L"string"
+#define VALUE_NAME_NUMBER L"number"
+#define VALUE_NAME_BOOLEAN L"boolean"
+#define VALUE_NAME_DATE L"date"
+#define VALUE_NAME_OBJECT L"object"
+#define VALUE_NAME_FXOBJ L"fxobj"
+#define VALUE_NAME_NULL L"null"
+#define VALUE_NAME_UNDEFINED L"undefined"
+
+#define CLASSNAME_ARRAY L"Array"
+#define CLASSNAME_DATE L"Date"
+#define CLASSNAME_STRING L"v8::String"
+
+const unsigned int JSCONST_nStringHash = JS_CalcHash(VALUE_NAME_STRING,wcslen(VALUE_NAME_STRING));
+const unsigned int JSCONST_nNumberHash = JS_CalcHash(VALUE_NAME_NUMBER,wcslen(VALUE_NAME_NUMBER));
+const unsigned int JSCONST_nBoolHash = JS_CalcHash(VALUE_NAME_BOOLEAN,wcslen(VALUE_NAME_BOOLEAN));
+const unsigned int JSCONST_nDateHash = JS_CalcHash(VALUE_NAME_DATE,wcslen(VALUE_NAME_DATE));
+const unsigned int JSCONST_nObjectHash = JS_CalcHash(VALUE_NAME_OBJECT,wcslen(VALUE_NAME_OBJECT));
+const unsigned int JSCONST_nFXobjHash = JS_CalcHash(VALUE_NAME_FXOBJ,wcslen(VALUE_NAME_FXOBJ));
+const unsigned int JSCONST_nNullHash = JS_CalcHash(VALUE_NAME_NULL,wcslen(VALUE_NAME_NULL));
+const unsigned int JSCONST_nUndefHash = JS_CalcHash(VALUE_NAME_UNDEFINED,wcslen(VALUE_NAME_UNDEFINED));
+
+static FXJSVALUETYPE GET_VALUE_TYPE(v8::Handle<v8::Value> p)
+{
+
+ const unsigned int nHash = JS_CalcHash(JS_GetTypeof(p));
+
+ if (nHash == JSCONST_nUndefHash)
+ return VT_undefined;
+ else if (nHash == JSCONST_nNullHash)
+ return VT_null;
+ else if (nHash == JSCONST_nStringHash)
+ return VT_string;
+ else if (nHash == JSCONST_nNumberHash)
+ return VT_number;
+ else if (nHash == JSCONST_nBoolHash)
+ return VT_boolean;
+ else if (nHash == JSCONST_nDateHash)
+ return VT_date;
+ else if (nHash == JSCONST_nObjectHash)
+ return VT_object;
+ else if (nHash == JSCONST_nFXobjHash)
+ return VT_fxobject;
+
+ /*
+ const char * sType = p->getTypeof()->toDchars();
+ if (strcmp(sType,VALUE_NAME_STRING) == 0)
+ return VT_string;
+ else if (strcmp(sType,VALUE_NAME_NUMBER) == 0)
+ return VT_number;
+ else if (strcmp(sType,VALUE_NAME_BOOLEAN) == 0)
+ return VT_boolean;
+ else if (strcmp(sType,VALUE_NAME_DATE) == 0)
+ return VT_date;
+ else if (strcmp(sType,VALUE_NAME_OBJECT) == 0)
+ return VT_object;
+ else if (strcmp(sType,VALUE_NAME_FXOBJ) == 0)
+ return VT_object;
+ else if (strcmp(sType,VALUE_NAME_NULL) == 0)
+ return VT_null;
+ else if (strcmp(sType,VALUE_NAME_UNDEFINED) == 0)
+ return VT_undefined;
+ */
+
+ return VT_unknown;
+}
+
+#endif //_JS_DEFINE_H_
diff --git a/fpdfsdk/include/javascript/JS_EventHandler.h b/fpdfsdk/include/javascript/JS_EventHandler.h new file mode 100644 index 0000000000..d88c50c06b --- /dev/null +++ b/fpdfsdk/include/javascript/JS_EventHandler.h @@ -0,0 +1,167 @@ +// 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 _JS_EVENTHANDLER_H_
+#define _JS_EVENTHANDLER_H_
+
+class CJS_Context;
+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(int nCommitKey, CPDF_FormField* pTarget, CFX_WideString& Value, FX_BOOL bWillCommit);
+ void OnField_Keystroke(int nCommitKey, 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();
+ FX_LPCWSTR Name();
+ FX_LPCWSTR 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 //_JS_EVENTHANDLER_H_
+
diff --git a/fpdfsdk/include/javascript/JS_GlobalData.h b/fpdfsdk/include/javascript/JS_GlobalData.h new file mode 100644 index 0000000000..97a54024d0 --- /dev/null +++ b/fpdfsdk/include/javascript/JS_GlobalData.h @@ -0,0 +1,97 @@ +// 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 _JS_GLOBALDATA_H_
+#define _JS_GLOBALDATA_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 CJS_GlobalVariableArray;
+class CJS_GlobalData_Element;
+
+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:
+ CJS_GlobalData(CPDFDoc_Environment* pApp);
+ virtual ~CJS_GlobalData();
+
+public:
+ void SetGlobalVariableNumber(FX_LPCSTR propname, double dData);
+ void SetGlobalVariableBoolean(FX_LPCSTR propname, bool bData);
+ void SetGlobalVariableString(FX_LPCSTR propname, const CFX_ByteString& sData);
+ void SetGlobalVariableObject(FX_LPCSTR propname, const CJS_GlobalVariableArray& array);
+ void SetGlobalVariableNull(FX_LPCSTR propname);
+
+ FX_BOOL SetGlobalVariablePersistent(FX_LPCSTR propname, FX_BOOL bPersistent);
+ FX_BOOL DeleteGlobalVariable(FX_LPCSTR propname);
+
+ FX_INT32 GetSize() const;
+ CJS_GlobalData_Element* GetAt(int index) const;
+
+private:
+ void LoadGlobalPersistentVariables();
+ void SaveGlobalPersisitentVariables();
+
+ CJS_GlobalData_Element* GetGlobalVariable(FX_LPCSTR propname);
+ int FindGlobalVariable(FX_LPCSTR propname);
+
+ void LoadFileBuffer(FX_LPCWSTR sFilePath, FX_LPBYTE& pBuffer, FX_INT32& nLength);
+ void WriteFileBuffer(FX_LPCWSTR sFilePath, FX_LPCSTR pBuffer, FX_INT32 nLength);
+ void MakeByteString(const CFX_ByteString& name, CJS_KeyValue* pData, CFX_BinaryBuf& sData);
+
+private:
+ CFX_ArrayTemplate<CJS_GlobalData_Element*> m_arrayGlobalData;
+ CFX_WideString m_sFilePath;
+ CPDFDoc_Environment* m_pApp;
+};
+
+#endif //_JS_GLOBALDATA_H_
diff --git a/fpdfsdk/include/javascript/JS_Module.h b/fpdfsdk/include/javascript/JS_Module.h new file mode 100644 index 0000000000..d725f6bc17 --- /dev/null +++ b/fpdfsdk/include/javascript/JS_Module.h @@ -0,0 +1,47 @@ +// 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 _JS_MODULE_H_
+#define _JS_MODULE_H_
+
+class CJS_GlobalData;
+class CJS_ConsoleDlg;
+
+class CJS_Module : public IReader_Module
+{
+public:
+ CJS_Module(HMODULE hModule, CReader_App* pApp);
+ virtual ~CJS_Module();
+
+ virtual void Destroy(){delete this;}
+ virtual CFX_ByteString GetModuleName();
+
+public:
+ static CJS_Module* GetModule(CReader_App* pApp);
+
+ IFXJS_Runtime* NewJSRuntime();
+ CJS_GlobalData* NewGlobalData();
+ void ReleaseGlobalData();
+
+public:
+ //console
+ void ShowConsole();
+ void HideConsole();
+ void ClearConsole();
+ void PrintLineConsole(FX_LPCWSTR string);
+
+private:
+ HMODULE m_hModule;
+ CReader_App* m_pApp;
+
+ FX_BOOL m_bInitial;
+ CJS_GlobalData* m_pGlobalData;
+ FX_INT32 m_nGlobalDataCount;
+
+ CJS_ConsoleDlg* m_pConsole;
+};
+
+#endif //_JS_MODULE_H_
\ No newline at end of file diff --git a/fpdfsdk/include/javascript/JS_Object.h b/fpdfsdk/include/javascript/JS_Object.h new file mode 100644 index 0000000000..8b91f8cd0d --- /dev/null +++ b/fpdfsdk/include/javascript/JS_Object.h @@ -0,0 +1,288 @@ +// 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 _JS_OBJECT_H_
+#define _JS_OBJECT_H_
+
+class CJS_Object;
+class CJS_Timer;
+class CJS_Context;
+
+class CJS_EmbedObj : public CFX_Object
+{
+public:
+ CJS_EmbedObj(CJS_Object* pJSObject);
+ virtual ~CJS_EmbedObj();
+
+ virtual void TimerProc(CJS_Timer* pTimer){};
+
+ CJS_Timer* BeginTimer(CPDFDoc_Environment * pApp, FX_UINT nElapse);
+ void EndTimer(CJS_Timer* pTimer);
+
+ CJS_Object* GetJSObject(){return m_pJSObject;};
+ operator CJS_Object* (){return m_pJSObject;};
+
+ CPDFSDK_PageView * JSGetPageView(IFXJS_Context* cc);
+ int MsgBox(CPDFDoc_Environment* pApp, CPDFSDK_PageView* pPageView, FX_LPCWSTR swMsg, FX_LPCWSTR swTitle = NULL, FX_UINT nType = 0, FX_UINT nIcon = 0);
+ void Alert(CJS_Context* pContext, FX_LPCWSTR swMsg);
+ FX_BOOL IsSafeMode(IFXJS_Context* cc);
+
+protected:
+
+ CJS_Object* m_pJSObject;
+};
+
+class CJS_Object : public CFX_Object
+{
+public:
+ CJS_Object(JSFXObject pObject);
+ virtual ~CJS_Object(void);
+
+ void MakeWeak();
+
+ virtual FX_BOOL IsType(FX_LPCSTR sClassName){return TRUE;};
+ virtual CFX_ByteString GetClassName(){return "";};
+
+ virtual FX_BOOL InitInstance(IFXJS_Context* cc){return TRUE;};
+ virtual FX_BOOL ExitInstance(){return TRUE;};
+
+ operator JSFXObject () {return v8::Local<v8::Object>::New(m_pIsolate, m_pObject);}
+ operator CJS_EmbedObj* (){return m_pEmbedObj;};
+
+ void SetEmbedObject(CJS_EmbedObj* pObj){m_pEmbedObj = pObj;};
+ CJS_EmbedObj * GetEmbedObject(){return m_pEmbedObj;};
+
+ static CPDFSDK_PageView * JSGetPageView(IFXJS_Context* cc);
+ static int MsgBox(CPDFDoc_Environment* pApp, CPDFSDK_PageView* pPageView, FX_LPCWSTR swMsg, FX_LPCWSTR swTitle = NULL, FX_UINT nType = 0,FX_UINT nIcon = 0);
+ static void Alert(CJS_Context* pContext, FX_LPCWSTR swMsg);
+
+ v8::Isolate* GetIsolate() {return m_pIsolate;}
+protected:
+ CJS_EmbedObj * m_pEmbedObj;
+ v8::Persistent<v8::Object> m_pObject;
+ v8::Isolate* m_pIsolate;
+};
+
+struct JS_TIMER_MAP
+{
+ FX_UINT nID;
+ CJS_Timer * pTimer;
+};
+
+typedef CFX_ArrayTemplate<JS_TIMER_MAP*> CTimerMapArray;
+
+struct JS_TIMER_MAPARRAY
+{
+public:
+ JS_TIMER_MAPARRAY()
+ {
+ }
+
+ ~JS_TIMER_MAPARRAY()
+ {
+ Reset();
+ }
+
+ void Reset()
+ {
+ for (int i=0,sz=m_Array.GetSize(); i<sz; i++)
+ delete m_Array.GetAt(i);
+
+ m_Array.RemoveAll();
+ }
+
+ void SetAt(FX_UINT nIndex,CJS_Timer * pTimer)
+ {
+ int i = Find(nIndex);
+
+ if (i>=0)
+ {
+ if (JS_TIMER_MAP * pMap = m_Array.GetAt(i))
+ pMap->pTimer = pTimer;
+ }
+ else
+ {
+ if (JS_TIMER_MAP * pMap = new JS_TIMER_MAP)
+ {
+ pMap->nID = nIndex;
+ pMap->pTimer = pTimer;
+ m_Array.Add(pMap);
+ }
+ }
+ }
+
+ CJS_Timer * GetAt(FX_UINT nIndex)
+ {
+ int i = Find(nIndex);
+
+ if (i>=0)
+ {
+ if (JS_TIMER_MAP * pMap = m_Array.GetAt(i))
+ return pMap->pTimer;
+ }
+ return NULL;
+ }
+
+ void RemoveAt(FX_UINT nIndex)
+ {
+ int i = Find(nIndex);
+
+ if (i>=0)
+ {
+ delete m_Array.GetAt(i);
+ m_Array.RemoveAt(i);
+ }
+ //To prevent potential fake memory leak reported by vc6.
+ if(m_Array.GetSize() == 0)
+ m_Array.RemoveAll();
+ }
+
+ int Find(FX_UINT nIndex)
+ {
+ for (int i=0,sz=m_Array.GetSize(); i<sz; i++)
+ {
+ if (JS_TIMER_MAP * pMap = m_Array.GetAt(i))
+ {
+ if (pMap->nID == nIndex)
+ return i;
+ }
+ }
+
+ return -1;
+ }
+
+ CTimerMapArray m_Array;
+};
+
+static JS_TIMER_MAPARRAY m_sTimeMap;
+
+class CJS_Runtime;
+
+class CJS_Timer
+{
+public:
+ CJS_Timer(CJS_EmbedObj * pObj,CPDFDoc_Environment* pApp): m_pEmbedObj(pObj),
+ m_nTimerID(0),
+ m_bProcessing(FALSE),
+ m_dwStartTime(0),
+ m_dwTimeOut(0),
+ m_dwElapse(0),
+ m_pRuntime(NULL),
+ m_nType(0),
+ m_pApp(pApp)
+ {
+ }
+
+ virtual ~CJS_Timer()
+ {
+ KillJSTimer();
+ }
+
+public:
+ FX_UINT SetJSTimer(FX_UINT nElapse)
+ {
+ if (m_nTimerID)KillJSTimer();
+ IFX_SystemHandler* pHandler = m_pApp->GetSysHandler();
+ m_nTimerID = pHandler->SetTimer(nElapse,TimerProc);
+ m_sTimeMap.SetAt(m_nTimerID,this);
+ m_dwElapse = nElapse;
+ return m_nTimerID;
+ };
+
+ void KillJSTimer()
+ {
+ if (m_nTimerID)
+ {
+ IFX_SystemHandler* pHandler = m_pApp->GetSysHandler();
+ pHandler->KillTimer(m_nTimerID);
+ m_sTimeMap.RemoveAt(m_nTimerID);
+ m_nTimerID = 0;
+ }
+ };
+
+ void SetType(int nType)
+ {
+ m_nType = nType;
+ }
+
+ int GetType() const
+ {
+ return m_nType;
+ }
+
+ void SetStartTime(FX_DWORD dwStartTime)
+ {
+ m_dwStartTime = dwStartTime;
+ }
+
+ FX_DWORD GetStartTime() const
+ {
+ return m_dwStartTime;
+ }
+
+ void SetTimeOut(FX_DWORD dwTimeOut)
+ {
+ m_dwTimeOut = dwTimeOut;
+ }
+
+ FX_DWORD GetTimeOut() const
+ {
+ return m_dwTimeOut;
+ }
+
+ void SetRuntime(CJS_Runtime* pRuntime)
+ {
+ m_pRuntime = pRuntime;
+ }
+
+ CJS_Runtime* GetRuntime() const
+ {
+ return m_pRuntime;
+ }
+
+ void SetJScript(const CFX_WideString& script)
+ {
+ m_swJScript = script;
+ }
+
+ CFX_WideString GetJScript() const
+ {
+ return m_swJScript;
+ }
+
+ static void TimerProc(int idEvent)
+ {
+ if (CJS_Timer * pTimer = m_sTimeMap.GetAt(idEvent))
+ {
+ if (!pTimer->m_bProcessing)
+ {
+ pTimer->m_bProcessing = TRUE;
+ if (pTimer->m_pEmbedObj) pTimer->m_pEmbedObj->TimerProc(pTimer);
+ pTimer->m_bProcessing = FALSE;
+ }
+ else
+ {
+ // TRACE(L"BUSY!\n");
+ }
+ }
+ };
+
+private:
+ FX_UINT m_nTimerID;
+ CJS_EmbedObj* m_pEmbedObj;
+ FX_BOOL m_bProcessing;
+
+ //data
+ FX_DWORD m_dwStartTime;
+ FX_DWORD m_dwTimeOut;
+ FX_DWORD m_dwElapse;
+ CJS_Runtime* m_pRuntime;
+ CFX_WideString m_swJScript;
+ int m_nType; //0:Interval; 1:TimeOut
+
+ CPDFDoc_Environment* m_pApp;
+};
+#endif //_JS_OBJECT_H_
diff --git a/fpdfsdk/include/javascript/JS_Runtime.h b/fpdfsdk/include/javascript/JS_Runtime.h new file mode 100644 index 0000000000..32f845755f --- /dev/null +++ b/fpdfsdk/include/javascript/JS_Runtime.h @@ -0,0 +1,70 @@ +// 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 _JS_RUNTIME_H_
+#define _JS_RUNTIME_H_
+
+class CJS_FieldEvent
+{
+public:
+ CFX_WideString sTargetName;
+ JS_EVENT_T eEventType;
+ CJS_FieldEvent* pNext;
+};
+
+class CJS_Runtime : public IFXJS_Runtime
+{
+public:
+ CJS_Runtime(CPDFDoc_Environment * pApp);
+ virtual ~CJS_Runtime();
+
+ virtual IFXJS_Context * NewContext();
+ virtual void ReleaseContext(IFXJS_Context * pContext);
+ virtual IFXJS_Context* GetCurrentContext();
+
+ virtual void SetReaderDocument(CPDFSDK_Document *pReaderDoc);
+ virtual CPDFSDK_Document * GetReaderDocument(){return m_pDocument;}
+
+ virtual void GetObjectNames(CFX_WideStringArray& array);
+ virtual void GetObjectConsts(const CFX_WideString& swObjName, CFX_WideStringArray& array);
+ virtual void GetObjectProps(const CFX_WideString& swObjName, CFX_WideStringArray& array);
+ virtual void GetObjectMethods(const CFX_WideString& swObjName, CFX_WideStringArray& array);
+
+ virtual void Exit();
+ virtual void Enter();
+ virtual FX_BOOL IsEntered();
+
+ CPDFDoc_Environment * GetReaderApp(){return m_pApp;}
+
+ FX_BOOL InitJSObjects();
+
+ FX_BOOL AddEventToLoop(const CFX_WideString& sTargetName, JS_EVENT_T eEventType);
+ void RemoveEventInLoop(const CFX_WideString& sTargetName, JS_EVENT_T eEventType);
+ void RemoveEventsInLoop(CJS_FieldEvent* pStart);
+
+ void BeginBlock(){m_bBlocking = TRUE;}
+ void EndBlock(){m_bBlocking = FALSE;}
+ FX_BOOL IsBlocking(){return m_bBlocking;}
+
+ operator IJS_Runtime*() {return (IJS_Runtime*)m_isolate;}
+ v8::Isolate* GetIsolate(){return m_isolate;};
+ void SetIsolate(v8::Isolate* isolate){m_isolate = isolate;}
+
+ v8::Handle<v8::Context> NewJSContext();
+protected:
+ CFX_ArrayTemplate<CJS_Context *> m_ContextArray;
+ CPDFDoc_Environment * m_pApp;
+ CPDFSDK_Document * m_pDocument;
+ FX_BOOL m_bBlocking;
+ CJS_FieldEvent* m_pFieldEventPath;
+
+ v8::Isolate* m_isolate;
+ v8::Persistent<v8::Context> m_context;
+ FX_BOOL m_bRegistered;
+};
+
+#endif //_JS_RUNTIME_H_
+
diff --git a/fpdfsdk/include/javascript/JS_Value.h b/fpdfsdk/include/javascript/JS_Value.h new file mode 100644 index 0000000000..f87f9e1d43 --- /dev/null +++ b/fpdfsdk/include/javascript/JS_Value.h @@ -0,0 +1,186 @@ +// 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 _JS_VALUE_H_
+#define _JS_VALUE_H_
+
+class CJS_Array;
+class CJS_Date;
+
+class CJS_Value
+{
+public:
+ CJS_Value(v8::Isolate* isolate);
+ CJS_Value(v8::Isolate* isolate, v8::Handle<v8::Value> pValue,FXJSVALUETYPE t);
+ CJS_Value(v8::Isolate* isolate, const int &iValue);
+ CJS_Value(v8::Isolate* isolate, const double &dValue);
+ CJS_Value(v8::Isolate* isolate, const float &fValue);
+ CJS_Value(v8::Isolate* isolate, const bool &bValue);
+ CJS_Value(v8::Isolate* isolate, JSFXObject);
+ CJS_Value(v8::Isolate* isolate, CJS_Object *);
+ CJS_Value(v8::Isolate* isolate, FX_LPCSTR pStr);
+ CJS_Value(v8::Isolate* isolate, FX_LPCWSTR pWstr);
+ CJS_Value(v8::Isolate* isolate, CJS_Array& array);
+
+ ~CJS_Value();
+
+ void SetNull();
+ void Attach(v8::Handle<v8::Value> pValue,FXJSVALUETYPE t);
+ void Attach(CJS_Value *pValue);
+ void Detach();
+
+
+ operator int() const;
+ operator bool() const;
+ operator double() const;
+ operator float() const;
+ operator CJS_Object *() const;
+ //operator JSFXObject *() const;
+ operator v8::Handle<v8::Object>() const;
+ operator v8::Handle<v8::Array>() const;
+ operator CFX_WideString() const;
+ //operator FX_WCHAR *() const;
+ operator CFX_ByteString() const;
+ v8::Handle<v8::Value> ToJSValue();
+
+ void operator = (int iValue);
+ void operator = (bool bValue);
+ void operator = (double);
+ void operator = (float);
+ void operator = (CJS_Object *);
+ void operator = (v8::Handle<v8::Object>);
+// void operator = (JSObject *);
+ void operator = (CJS_Array &);
+ void operator = (CJS_Date &);
+ void operator = (FX_LPCWSTR pWstr);
+ void operator = (FX_LPCSTR pStr);
+ void operator = (CJS_Value value);
+
+ FX_BOOL IsArrayObject() const;
+ FX_BOOL IsDateObject() const;
+ FXJSVALUETYPE GetType() const;
+
+ FX_BOOL ConvertToArray(CJS_Array &) const;
+ FX_BOOL ConvertToDate(CJS_Date &) const;
+
+ v8::Isolate* GetIsolate() {return m_isolate;}
+protected:
+ v8::Handle<v8::Value> m_pValue;
+ FXJSVALUETYPE m_eType;
+ v8::Isolate* m_isolate;
+};
+
+template<class TYPE> class CJS_ParametersTmpl : public CFX_ArrayTemplate<TYPE>
+{
+public:
+ void push_back(TYPE newElement){CFX_ArrayTemplate<TYPE>::Add(newElement);}
+ int size() const{return CFX_ArrayTemplate<TYPE>::GetSize();}
+};
+typedef CJS_ParametersTmpl<CJS_Value> CJS_Parameters;
+
+class CJS_PropValue: public CJS_Value
+{
+public:
+ CJS_PropValue(const CJS_Value &);
+ CJS_PropValue(v8::Isolate* isolate);
+ ~CJS_PropValue();
+public:
+ FX_BOOL IsSetting();
+ FX_BOOL IsGetting();
+ void operator<<(int );
+ void operator>>(int &) const;
+ void operator<<(bool);
+ void operator>>(bool &) const;
+ void operator<<(double );
+ void operator>>(double &) const;
+ void operator<<(CJS_Object *pObj);
+ void operator>>(CJS_Object *&ppObj) const;
+ void operator<<(CFX_ByteString);
+ void operator>>(CFX_ByteString &) const;
+ void operator<<(CFX_WideString);
+ void operator>>(CFX_WideString &) const;
+ void operator<<(FX_LPCWSTR c_string);
+
+ void operator<<(JSFXObject);
+ void operator>>(JSFXObject &) 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::Handle<v8::Value>() const;
+
+ void StartSetting();
+ void StartGetting();
+private:
+ FX_BOOL m_bIsSetting;
+};
+
+class CJS_Array
+{
+public:
+ CJS_Array(v8::Isolate* isolate);
+ virtual ~CJS_Array();
+
+ void Attach(v8::Handle<v8::Array> pArray);
+ void GetElement(unsigned index,CJS_Value &value);
+ void SetElement(unsigned index,CJS_Value value);
+ int GetLength();
+ FX_BOOL IsAttached();
+ operator v8::Handle<v8::Array>();
+
+ v8::Isolate* GetIsolate() {return m_isolate;}
+private:
+ v8::Handle<v8::Array> m_pArray;
+ v8::Isolate* m_isolate;
+};
+
+class CJS_Date
+{
+friend class CJS_Value;
+public:
+ CJS_Date(v8::Isolate* isolate);
+ CJS_Date(v8::Isolate* isolate,double dMsec_time);
+ CJS_Date(v8::Isolate* isolate,int year, int mon, int day,int hour, int min, int sec);
+ virtual ~CJS_Date();
+ void Attach(v8::Handle<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::Handle<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::Handle<v8::Value> m_pDate;
+ v8::Isolate* m_isolate;
+};
+
+#endif //_JS_VALUE_H_
+
diff --git a/fpdfsdk/include/javascript/JavaScript.h b/fpdfsdk/include/javascript/JavaScript.h new file mode 100644 index 0000000000..d1375cc2f4 --- /dev/null +++ b/fpdfsdk/include/javascript/JavaScript.h @@ -0,0 +1,39 @@ +// 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 _JAVASCRIPT_H_
+#define _JAVASCRIPT_H_
+
+
+#ifndef _INC_PDFAPI
+ #define _INC_PDFAPI
+
+ #include "../../../core/include/fpdfapi/fpdf_module.h"
+ #include "../../../core/include/fpdfdoc/fpdf_doc.h"
+ #include "../../../core/include/fpdfdoc/fpdf_vt.h"
+ #include "../../../core/include/fxcrt/fx_xml.h"
+ #include "../../../core/include/fdrm/fx_crypt.h"
+ #include "../../../core/include/fpdfapi/fpdf_pageobj.h"
+ #include "../../../core/include/fpdfapi/fpdf_serial.h"
+
+
+ #include "../../include/fx_systemhandler.h"
+#endif
+
+
+#include "../jsapi/fxjs_v8.h"
+#include "../fxedit/fx_edit.h"
+#include "../pdfwindow/IPDFWindow.h"
+#include "../fsdk_mgr.h"
+
+
+#include <string>
+//#pragma warning( disable : 4786)
+#include <vector>
+
+
+#endif //_JAVASCRIPT_H_
+
diff --git a/fpdfsdk/include/javascript/PublicMethods.h b/fpdfsdk/include/javascript/PublicMethods.h new file mode 100644 index 0000000000..a485a9a31a --- /dev/null +++ b/fpdfsdk/include/javascript/PublicMethods.h @@ -0,0 +1,101 @@ +// 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 _PUBLICMETHODS_H_
+#define _PUBLICMETHODS_H_
+
+class CJS_PublicMethods : public CJS_Object
+{
+public:
+ CJS_PublicMethods(JSFXObject pObject) : CJS_Object(pObject) {};
+ virtual ~CJS_PublicMethods(void){};
+
+public:
+ static FX_BOOL AFNumber_Format(OBJ_METHOD_PARAMS);
+ static FX_BOOL AFNumber_Keystroke(OBJ_METHOD_PARAMS);
+ static FX_BOOL AFPercent_Format(OBJ_METHOD_PARAMS);
+ static FX_BOOL AFPercent_Keystroke(OBJ_METHOD_PARAMS);
+ static FX_BOOL AFDate_FormatEx(OBJ_METHOD_PARAMS);
+ static FX_BOOL AFDate_KeystrokeEx(OBJ_METHOD_PARAMS);
+ static FX_BOOL AFDate_Format(OBJ_METHOD_PARAMS);
+ static FX_BOOL AFDate_Keystroke(OBJ_METHOD_PARAMS);
+ static FX_BOOL AFTime_FormatEx(OBJ_METHOD_PARAMS); //
+ static FX_BOOL AFTime_KeystrokeEx(OBJ_METHOD_PARAMS);
+ static FX_BOOL AFTime_Format(OBJ_METHOD_PARAMS);
+ static FX_BOOL AFTime_Keystroke(OBJ_METHOD_PARAMS);
+ static FX_BOOL AFSpecial_Format(OBJ_METHOD_PARAMS);
+ static FX_BOOL AFSpecial_Keystroke(OBJ_METHOD_PARAMS);
+ static FX_BOOL AFSpecial_KeystrokeEx(OBJ_METHOD_PARAMS);//
+ static FX_BOOL AFSimple(OBJ_METHOD_PARAMS);
+ static FX_BOOL AFMakeNumber(OBJ_METHOD_PARAMS);
+ static FX_BOOL AFSimple_Calculate(OBJ_METHOD_PARAMS);
+ static FX_BOOL AFRange_Validate(OBJ_METHOD_PARAMS);
+ static FX_BOOL AFMergeChange(OBJ_METHOD_PARAMS);
+ static FX_BOOL AFParseDateEx(OBJ_METHOD_PARAMS);
+ static FX_BOOL AFExtractNums(OBJ_METHOD_PARAMS);
+
+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, FX_BOOL& bWrongFormat);
+ static CFX_WideString MakeFormatDate(double dDate,const CFX_WideString & format);
+ static FX_BOOL ConvertStringToNumber(FX_LPCWSTR swSource, double & dRet, FX_BOOL & bDot);
+ static double ParseStringToNumber(FX_LPCWSTR swSource);
+ static double ParseNormalDate(const CFX_WideString & value, FX_BOOL& bWrongFormat);
+ static double MakeInterDate(CFX_WideString strValue);
+ static double ParseNumber(FX_LPCWSTR swSource, FX_BOOL& bAllDigits, FX_BOOL& bDot, FX_BOOL& bSign, FX_BOOL& bKXJS);
+
+public:
+ static CFX_WideString StrLTrim(FX_LPCWSTR pStr);
+ static CFX_WideString StrRTrim(FX_LPCWSTR pStr);
+ static CFX_WideString StrTrim(FX_LPCWSTR pStr);
+
+ static CFX_ByteString StrLTrim(FX_LPCSTR pStr);
+ static CFX_ByteString StrRTrim(FX_LPCSTR pStr);
+ static CFX_ByteString StrTrim(FX_LPCSTR pStr);
+
+ static FX_BOOL IsNumber(FX_LPCSTR string);
+ static FX_BOOL IsNumber(FX_LPCWSTR string);
+
+ static FX_BOOL IsDigit(char ch);
+ static FX_BOOL IsDigit(wchar_t ch);
+ static FX_BOOL IsAlphabetic(wchar_t ch);
+ static FX_BOOL IsAlphaNumeric(wchar_t ch);
+
+ static FX_BOOL maskSatisfied(wchar_t c_Change,wchar_t c_Mask);
+ static FX_BOOL isReservedMaskChar(wchar_t ch);
+
+ static double AF_Simple(FX_LPCWSTR sFuction, double dValue1, double dValue2);
+ static CJS_Array AF_MakeArrayFromList(v8::Isolate* isolate, CJS_Value val);
+};
+
+#endif //_PUBLICMETHODS_H_
diff --git a/fpdfsdk/include/javascript/app.h b/fpdfsdk/include/javascript/app.h new file mode 100644 index 0000000000..35ee401058 --- /dev/null +++ b/fpdfsdk/include/javascript/app.h @@ -0,0 +1,225 @@ +// 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 _APP_H_
+#define _APP_H_
+
+class CJS_Runtime;
+
+/* ---------------------------- TimerObj ---------------------------- */
+
+class CJS_Timer;
+
+class TimerObj : public CJS_EmbedObj
+{
+public:
+ TimerObj(CJS_Object* pJSObject);
+ virtual ~TimerObj();
+
+public:
+ void SetTimer(CJS_Timer* pTimer);
+ CJS_Timer* GetTimer() const;
+
+private:
+ CJS_Timer* m_pTimer;
+};
+
+class CJS_TimerObj : public CJS_Object
+{
+public:
+ CJS_TimerObj(JSFXObject pObject) : CJS_Object(pObject) {}
+ virtual ~CJS_TimerObj(){}
+
+ DECLARE_JS_CLASS(CJS_TimerObj);
+};
+
+
+// struct APP_MENUITEM_ARRAY;
+//
+// struct APP_MENUITEM
+// {
+// APP_MENUITEM() : oSubMenu(NULL), cName(L""), cReturn(L""), bMarked(false), bEnabled(true)
+// {
+// }
+// CFX_WideString cName;
+// CFX_WideString cReturn;
+// APP_MENUITEM_ARRAY* oSubMenu;
+// bool bMarked;
+// bool bEnabled;
+// };
+
+// struct APP_MENUITEM_ARRAY
+// {
+// APP_MENUITEM_ARRAY() : m_hMenu(NULL), pContents(NULL), nSize(0)
+// {
+//
+// }
+// APP_MENUITEM * pContents;
+// HMENU m_hMenu;
+// int nSize;
+// };
+
+// struct APP_MENU;
+// struct APP_MENU_ARRAY
+// {
+// APP_MENU_ARRAY():
+// pContent(NULL)
+// {
+// }
+//
+// APP_MENU* pContent;
+// };
+
+// struct APP_MENU
+// {
+// APP_MENU():bSubMenu(false),
+// SubMenuItems(NULL),
+// cwMenuItemName(L""),
+// hMenu(NULL),
+// iSize(0)
+// {
+//
+// }
+//
+// APP_MENU(CFX_WideString &cwName):
+// cwMenuItemName(cwName),
+// bSubMenu(false),
+// SubMenuItems(NULL),
+// hMenu(NULL),
+// iSize(0)
+// {
+//
+// }
+//
+// CFX_WideString cwMenuItemName;
+// bool bSubMenu;
+// APP_MENU_ARRAY* SubMenuItems;
+// int iSize;
+// HMENU hMenu;
+// };
+
+class app : public CJS_EmbedObj
+{
+public:
+ app(CJS_Object * pJSObject);
+ virtual ~app();
+
+public:
+ FX_BOOL activeDocs(OBJ_PROP_PARAMS);
+ FX_BOOL calculate(OBJ_PROP_PARAMS);
+ FX_BOOL formsVersion(OBJ_PROP_PARAMS);
+ FX_BOOL fs(OBJ_PROP_PARAMS);
+ FX_BOOL fullscreen(OBJ_PROP_PARAMS);
+ FX_BOOL language(OBJ_PROP_PARAMS);
+ FX_BOOL media(OBJ_PROP_PARAMS);
+ FX_BOOL platform(OBJ_PROP_PARAMS);
+ FX_BOOL runtimeHighlight(OBJ_PROP_PARAMS);
+ FX_BOOL viewerType(OBJ_PROP_PARAMS);
+ FX_BOOL viewerVariation(OBJ_PROP_PARAMS);
+ FX_BOOL viewerVersion(OBJ_PROP_PARAMS);
+
+
+ FX_BOOL alert(OBJ_METHOD_PARAMS);
+ FX_BOOL beep(OBJ_METHOD_PARAMS);
+ FX_BOOL browseForDoc(OBJ_METHOD_PARAMS);
+ FX_BOOL clearInterval(OBJ_METHOD_PARAMS);
+ FX_BOOL clearTimeOut(OBJ_METHOD_PARAMS);
+ FX_BOOL execDialog(OBJ_METHOD_PARAMS);
+ FX_BOOL execMenuItem(OBJ_METHOD_PARAMS);
+ FX_BOOL findComponent(OBJ_METHOD_PARAMS);
+ FX_BOOL goBack(OBJ_METHOD_PARAMS);
+ FX_BOOL goForward(OBJ_METHOD_PARAMS);
+ FX_BOOL launchURL(OBJ_METHOD_PARAMS);
+ FX_BOOL mailMsg(OBJ_METHOD_PARAMS);
+ FX_BOOL newFDF(OBJ_METHOD_PARAMS);
+ FX_BOOL newDoc(OBJ_METHOD_PARAMS);
+ FX_BOOL openDoc(OBJ_METHOD_PARAMS);
+ FX_BOOL openFDF(OBJ_METHOD_PARAMS);
+ FX_BOOL popUpMenuEx(OBJ_METHOD_PARAMS);
+ FX_BOOL popUpMenu(OBJ_METHOD_PARAMS);
+ FX_BOOL response(OBJ_METHOD_PARAMS);
+ FX_BOOL setInterval(OBJ_METHOD_PARAMS);
+ FX_BOOL setTimeOut(OBJ_METHOD_PARAMS);
+
+private:
+// FX_DWORD AppGetTickCount();
+ void TimerProc(CJS_Timer* pTimer);
+ void RunJsScript(CJS_Runtime * pRuntime,const CFX_WideString & wsScript);
+// void ParsePopupMenuObj(APP_MENUITEM * ppMenuItem,JSObject * pObj);
+// void DeleteMenuItems(APP_MENUITEM_ARRAY * pMenuItems);
+// void AddMenuItem(APP_MENUITEM_ARRAY * pMenuItems, HMENU hMenu, MENUITEMINFO MenuItemInfo);
+// void InitMenuItemInfo(MENUITEMINFO& MenuItemInfo);
+// void DestroyPopUpMenu();
+
+// void ParserMenuItem(APP_MENU* pHead, const CJS_Parameters¶ms);
+// void AddItemToMenu(APP_MENU* pHead, HMENU hMenu, MENUITEMINFO MenuItemInfo);
+// void DestroyMenuItems(APP_MENU* pHead);
+
+public:
+ static CFX_WideString SysPathToPDFPath(const CFX_WideString& sOldPath);
+ static CFX_WideString PDFPathToSysPath(const CFX_WideString& sOldPath);
+ static CFX_WideString RelativePathToSysPath(const CFX_WideString& sOldPath, const CFX_WideString& sFilePath);
+
+
+private:
+
+ bool m_bCalculate;
+ CJS_Runtime* m_pRuntime;
+ bool m_bRuntimeHighLight;
+
+ CFX_ArrayTemplate<CJS_Timer*> m_aTimer;
+// APP_MENU* m_pMenuHead;
+
+public:
+// static CReader_App* s_App;
+};
+
+class CJS_App : public CJS_Object
+{
+public:
+ CJS_App(JSFXObject pObject) : CJS_Object(pObject) {};
+ virtual ~CJS_App(void){};
+
+ DECLARE_JS_CLASS(CJS_App);
+
+ 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 //_APP_H_
diff --git a/fpdfsdk/include/javascript/color.h b/fpdfsdk/include/javascript/color.h new file mode 100644 index 0000000000..1910e16955 --- /dev/null +++ b/fpdfsdk/include/javascript/color.h @@ -0,0 +1,78 @@ +// 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 _COLOR_H_
+#define _COLOR_H_
+
+class color : public CJS_EmbedObj
+{
+public:
+ color(CJS_Object* pJSObject);
+ virtual ~color(void);
+
+ FX_BOOL black(OBJ_PROP_PARAMS);
+ FX_BOOL blue(OBJ_PROP_PARAMS);
+ FX_BOOL cyan(OBJ_PROP_PARAMS);
+ FX_BOOL dkGray(OBJ_PROP_PARAMS);
+ FX_BOOL gray(OBJ_PROP_PARAMS);
+ FX_BOOL green(OBJ_PROP_PARAMS);
+ FX_BOOL ltGray(OBJ_PROP_PARAMS);
+ FX_BOOL magenta(OBJ_PROP_PARAMS);
+ FX_BOOL red(OBJ_PROP_PARAMS);
+ FX_BOOL transparent(OBJ_PROP_PARAMS);
+ FX_BOOL white(OBJ_PROP_PARAMS);
+ FX_BOOL yellow(OBJ_PROP_PARAMS);
+
+ FX_BOOL convert(OBJ_METHOD_PARAMS);
+ FX_BOOL equal(OBJ_METHOD_PARAMS);
+
+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(JSFXObject pObject) : CJS_Object(pObject) {};
+ virtual ~CJS_Color(void){};
+
+ DECLARE_JS_CLASS(CJS_Color);
+
+ 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 //_COLOR_H_
+
diff --git a/fpdfsdk/include/javascript/console.h b/fpdfsdk/include/javascript/console.h new file mode 100644 index 0000000000..98a329367e --- /dev/null +++ b/fpdfsdk/include/javascript/console.h @@ -0,0 +1,38 @@ +// 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 _CONSOLE_H_
+#define _CONSOLE_H_
+
+class console : public CJS_EmbedObj
+{
+public:
+ console(CJS_Object* pJSObject);
+ virtual ~console(void);
+
+public:
+ FX_BOOL clear(OBJ_METHOD_PARAMS);
+ FX_BOOL hide(OBJ_METHOD_PARAMS);
+ FX_BOOL println(OBJ_METHOD_PARAMS);
+ FX_BOOL show(OBJ_METHOD_PARAMS);
+};
+
+class CJS_Console : public CJS_Object
+{
+public:
+ CJS_Console(JSFXObject pObject) : CJS_Object(pObject) {};
+ virtual ~CJS_Console(void){};
+
+ DECLARE_JS_CLASS(CJS_Console);
+
+ JS_STATIC_METHOD(clear, console);
+ JS_STATIC_METHOD(hide, console);
+ JS_STATIC_METHOD(println, console);
+ JS_STATIC_METHOD(show, console);
+};
+
+#endif //_CONSOLE_H_
+
diff --git a/fpdfsdk/include/javascript/event.h b/fpdfsdk/include/javascript/event.h new file mode 100644 index 0000000000..91f2c65a21 --- /dev/null +++ b/fpdfsdk/include/javascript/event.h @@ -0,0 +1,70 @@ +// 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 _EVENT_H_
+#define _EVENT_H_
+
+class event : public CJS_EmbedObj
+{
+public:
+ event(CJS_Object * pJSObject);
+ virtual ~event(void);
+
+public:
+ FX_BOOL change(OBJ_PROP_PARAMS);
+ FX_BOOL changeEx(OBJ_PROP_PARAMS);
+ FX_BOOL commitKey(OBJ_PROP_PARAMS);
+ FX_BOOL fieldFull(OBJ_PROP_PARAMS);
+ FX_BOOL keyDown(OBJ_PROP_PARAMS);
+ FX_BOOL modifier(OBJ_PROP_PARAMS);
+ FX_BOOL name(OBJ_PROP_PARAMS);
+ FX_BOOL rc(OBJ_PROP_PARAMS);
+ FX_BOOL richChange(OBJ_PROP_PARAMS);
+ FX_BOOL richChangeEx(OBJ_PROP_PARAMS);
+ FX_BOOL richValue(OBJ_PROP_PARAMS);
+ FX_BOOL selEnd(OBJ_PROP_PARAMS);
+ FX_BOOL selStart(OBJ_PROP_PARAMS);
+ FX_BOOL shift(OBJ_PROP_PARAMS);
+ FX_BOOL source(OBJ_PROP_PARAMS);
+ FX_BOOL target(OBJ_PROP_PARAMS);
+ FX_BOOL targetName(OBJ_PROP_PARAMS);
+ FX_BOOL type(OBJ_PROP_PARAMS);
+ FX_BOOL value(OBJ_PROP_PARAMS);
+ FX_BOOL willCommit(OBJ_PROP_PARAMS);
+
+};
+
+class CJS_Event : public CJS_Object
+{
+public:
+ CJS_Event(JSFXObject pObject) : CJS_Object(pObject) {};
+ virtual ~CJS_Event(void){};
+
+ DECLARE_JS_CLASS(CJS_Event);
+
+ 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 //_EVENT_H_
diff --git a/fpdfsdk/include/javascript/global.h b/fpdfsdk/include/javascript/global.h new file mode 100644 index 0000000000..7effd574a0 --- /dev/null +++ b/fpdfsdk/include/javascript/global.h @@ -0,0 +1,85 @@ +// 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 _GLOBAL_H_
+#define _GLOBAL_H_
+
+class CJS_GlobalData;
+
+struct js_global_data
+{
+ js_global_data()
+ {
+ nType = 0;
+ dData = 0;
+ bData = FALSE;
+ sData = "";
+ bPersistent = FALSE;
+ bDeleted = FALSE;
+ }
+
+ ~js_global_data()
+ {
+ pData.Reset();
+ }
+ int nType; //0:int 1:bool 2:string 3:obj
+ double dData;
+ bool bData;
+ CFX_ByteString sData;
+ v8::Persistent<v8::Object> pData;
+ bool bPersistent;
+ bool bDeleted;
+};
+
+class global_alternate : public CJS_EmbedObj
+{
+public:
+ global_alternate(CJS_Object* pJSObject);
+ virtual ~global_alternate();
+
+public:
+ FX_BOOL setPersistent(OBJ_METHOD_PARAMS);
+
+public:
+ FX_BOOL QueryProperty(FX_LPCWSTR propname);
+ FX_BOOL DoProperty(IFXJS_Context* cc, FX_LPCWSTR propname, CJS_PropValue & vp, JS_ErrorString & sError);
+ FX_BOOL DelProperty(IFXJS_Context* cc, FX_LPCWSTR propname, JS_ErrorString & sError);
+
+ void Initial(CPDFDoc_Environment* pApp);
+
+private:
+ void UpdateGlobalPersistentVariables();
+ void CommitGlobalPersisitentVariables();
+ void DestroyGlobalPersisitentVariables();
+ FX_BOOL SetGlobalVariables(FX_LPCSTR propname, int nType,
+ double dData, bool bData, const CFX_ByteString& sData, JSObject pData, bool bDefaultPersistent);
+
+ void ObjectToArray(v8::Handle<v8::Object> pObj, CJS_GlobalVariableArray& array);
+ void PutObjectProperty(v8::Handle<v8::Object> obj, CJS_KeyValue* pData);
+
+private:
+ CFX_MapByteStringToPtr m_mapGlobal;
+ CFX_WideString m_sFilePath;
+ CJS_GlobalData* m_pGlobalData;
+ CPDFDoc_Environment* m_pApp;
+};
+
+
+class CJS_Global : public CJS_Object
+{
+public:
+ CJS_Global(JSFXObject pObject) : CJS_Object(pObject) {};
+ virtual ~CJS_Global(void){};
+
+ virtual FX_BOOL InitInstance(IFXJS_Context* cc);
+
+ DECLARE_SPECIAL_JS_CLASS(CJS_Global);
+
+ JS_SPECIAL_STATIC_METHOD(setPersistent, global_alternate, global);
+
+};
+
+#endif //_GLOBAL_H_
diff --git a/fpdfsdk/include/javascript/report.h b/fpdfsdk/include/javascript/report.h new file mode 100644 index 0000000000..8a4084dac1 --- /dev/null +++ b/fpdfsdk/include/javascript/report.h @@ -0,0 +1,35 @@ +// 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 _REPORT_H_
+#define _REPORT_H_
+
+class Report : public CJS_EmbedObj
+{
+public:
+ Report(CJS_Object * pJSObject);
+ virtual ~Report();
+
+public:
+ FX_BOOL save(OBJ_METHOD_PARAMS);
+ FX_BOOL writeText(OBJ_METHOD_PARAMS);
+};
+
+class CJS_Report : public CJS_Object
+{
+public:
+ CJS_Report(JSFXObject pObject) : CJS_Object(pObject){};
+ virtual ~CJS_Report(){};
+
+public:
+ DECLARE_JS_CLASS(CJS_Report);
+
+ JS_STATIC_METHOD(save, Report)
+ JS_STATIC_METHOD(writeText, Report);
+};
+
+#endif //_REPORT_H_
+
diff --git a/fpdfsdk/include/javascript/resource.h b/fpdfsdk/include/javascript/resource.h new file mode 100644 index 0000000000..0b7668e908 --- /dev/null +++ b/fpdfsdk/include/javascript/resource.h @@ -0,0 +1,110 @@ +// 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
+
+#define IDD_JS_MSGBOX 25600
+#define IDD_RESPONSE 25601
+#define IDC_JS_MSG_TEXT 25602
+#define ID_JS_MSG_OK 25603
+#define ID_JS_MSG_CANCEL 25604
+#define IDC_JS_MSG_ICON 25605
+#define ID_JS_MSG_YES 25606
+#define ID_JS_MSG_NO 25607
+#define IDC_JS_QUESTION 25608
+#define ID_JS_OK 25609
+#define ID_JS_CANCEL 25610
+#define IDC_JS_ANSWER 25611
+#define IDC_JS_EDIT 25612
+#define IDS_STRING_JSALERT 25613
+#define IDS_STRING_JSPARAMERROR 25614
+#define IDS_STRING_JSAFNUMBER_KEYSTROKE 25615
+#define IDS_STRING_JSINPUTERROR 25616
+#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_JSRANGE4 25622
+#define IDS_STRING_FILEOPENFAIL 25623
+#define IDS_STRING_JSATTENTION 25624
+#define IDS_STRING_JSSUBMITS 25625
+#define IDS_STRING_JSSUBMITF 25626
+#define IDS_STRING_NOTSUPPORT 25627
+#define IDS_STRING_JSBUSY 25628
+#define IDS_STRING_JSEVENT 25629
+#define IDS_STRING_RUN 25630
+#define IDS_STRING_UNHANDLED 25631
+#define IDS_STRING_JSPRINT1 25632
+#define IDS_STRING_JSPRINT2 25633
+#define IDS_STRING_LAUNCHURL 25634
+#define IDS_JSPARAM_INCORRECT 25635
+#define IDD_JS_CONSOLE 25636
+#define IDS_STRING_SAFEMODEL 25636
+#define IDC_EDTSCRIPT 25637
+#define IDC_BTNCLEAR 25638
+#define IDC_EDTOUTPUT 25639
+#define IDC_CHECK_TIPS 25640
+#define IDC_BTNRUN 25641
+
+
+
+static CFX_WideString JSGetStringFromID(CJS_Context* pContext, FX_UINT ID)
+{
+ switch(ID)
+ {
+ case IDS_STRING_JSALERT:
+ return L"Alert";
+ case IDS_STRING_JSPARAMERROR:
+ return L"The amount of parameters is not correct !";
+ case IDS_STRING_JSAFNUMBER_KEYSTROKE:
+ return L"The input value is invalid.";
+ case IDS_STRING_JSINPUTERROR:
+ return L"Input error !";
+ case IDS_STRING_JSPARAM_TOOLONG:
+ return L"The value you are going to input is too long.";
+ case IDS_STRING_JSPARSEDATE:
+ return L"The input string can't be parsed to a valid date time (%s).";
+ case IDS_STRING_JSRANGE1:
+ return L"Invalid value: must be greater or equal to %s and less than or equal to %s.";
+ case IDS_STRING_JSRANGE2:
+ return L"Invalid value: must be greater or equal to %s.";
+ case IDS_STRING_JSRANGE3:
+ return L"Invalid value: must be less than or equal to %s.";
+ case IDS_STRING_JSRANGE4:
+ return L"Range Error";
+ case IDS_STRING_FILEOPENFAIL:
+ return L"Opening file failed.";
+ case IDS_STRING_JSATTENTION:
+ return L"Attention";
+ case IDS_STRING_JSSUBMITS:
+ return L"Submit form successfully!";
+ case IDS_STRING_JSSUBMITF:
+ return L"Submit form failed!";
+ case IDS_STRING_NOTSUPPORT:
+ return L"Not supported.";
+ case IDS_STRING_JSBUSY:
+ return L"System is busy!";
+ case IDS_STRING_JSEVENT:
+ return L"The event of the formfield exists!";
+ case IDS_STRING_RUN:
+ return L"It runs successfully.";
+ case IDS_STRING_UNHANDLED:
+ return L"An unhandled error!";
+ case IDS_STRING_JSPRINT1:
+ return L"The second parameter can't convert to Date!";
+ case IDS_STRING_JSPRINT2:
+ return L"The second parameter isn't a valid Date!";
+ case IDS_STRING_LAUNCHURL:
+ return L"The Document is trying to connect to \r\n%s\r\nIf you trust the site, choose OK. If you don't trust the site, choose Cancel.";
+ case IDS_JSPARAM_INCORRECT:
+ return L"The parameter you inputted is incorrect!";
+ case IDS_STRING_SAFEMODEL:
+ return L"Secure reading mode";
+ default:
+ return L"";
+
+ }
+}
+
diff --git a/fpdfsdk/include/javascript/util.h b/fpdfsdk/include/javascript/util.h new file mode 100644 index 0000000000..9f4efc3525 --- /dev/null +++ b/fpdfsdk/include/javascript/util.h @@ -0,0 +1,45 @@ +// 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 _UTIL_H_
+#define _UTIL_H_
+
+class util : public CJS_EmbedObj
+{
+public:
+ util(CJS_Object * pJSObject);
+ virtual ~util(void);
+
+public:
+ FX_BOOL printd(OBJ_METHOD_PARAMS);
+ FX_BOOL printf(OBJ_METHOD_PARAMS);
+ FX_BOOL printx(OBJ_METHOD_PARAMS);
+ FX_BOOL scand(OBJ_METHOD_PARAMS);
+ FX_BOOL byteToChar(OBJ_METHOD_PARAMS);
+
+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(JSFXObject pObject) : CJS_Object(pObject) {};
+ virtual ~CJS_Util(void){};
+
+ DECLARE_JS_CLASS(CJS_Util);
+
+ 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);
+};
+
+FX_INT64 FX_atoi64(const char *nptr);
+#endif //_UTIL_H_
diff --git a/fpdfsdk/include/jsapi/fxjs_v8.h b/fpdfsdk/include/jsapi/fxjs_v8.h new file mode 100644 index 0000000000..7e8e655a6e --- /dev/null +++ b/fpdfsdk/include/jsapi/fxjs_v8.h @@ -0,0 +1,148 @@ +// 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 FXJSAPI_H +#define FXJSAPI_H + +#include <v8.h> +using namespace v8; + +enum FXJSOBJTYPE +{ + JS_DYNAMIC = 0, + JS_STATIC = 1, +}; + +enum FXJSVALUETYPE +{ + VT_unknown, + VT_string, + VT_number, + VT_boolean, + VT_date, + VT_object, + VT_fxobject, + VT_null, + VT_undefined +}; + +struct FXJSErr +{ + const wchar_t* message; + const wchar_t* srcline; + unsigned linnum; +}; + +/* --------------------------------------------- API --------------------------------------------- */ + +typedef v8::Isolate IJS_Runtime; +class IFXJS_Context; +class IFXJS_Runtime; + + +#ifndef JSCRIPT_ARGS +#define JSCRIPT_ARGS + +#define JS_PROPGET_ARGS v8::Local<v8::String> property,const v8::PropertyCallbackInfo<v8::Value>& info +#define JS_PROPPUT_ARGS v8::Local<v8::String> property,v8::Local<v8::Value> value,const v8::PropertyCallbackInfo<void>& info +#define JS_METHOD_ARGS const v8::FunctionCallbackInfo<v8::Value>& info +#define JS_CONSTRUCTOR_ARGS IFXJS_Context* cc, v8::Handle<v8::Object> obj, v8::Handle<v8::Object> global +#define JS_DESTRUCTOR_ARGS v8::Handle<v8::Object> obj + +#define JS_PROPQUERY_ARGS v8::Local<v8::String> property,const v8::PropertyCallbackInfo<v8::Integer>& info +#define JS_NAMED_PROPGET_ARGS JS_PROPGET_ARGS +#define JS_NAMED_PROPPUT_ARGS v8::Local<v8::String> property,v8::Local<v8::Value> value,const v8::PropertyCallbackInfo<v8::Value>& info +#define JS_PROPDEL_ARGS v8::Local<v8::String> property,const v8::PropertyCallbackInfo<v8::Boolean>& info + +typedef unsigned (*LP_CONSTRUCTOR)(JS_CONSTRUCTOR_ARGS); +typedef unsigned (*LP_DESTRUCTOR)(JS_DESTRUCTOR_ARGS); + +#endif + +int JS_DefineObj(IJS_Runtime* pJSRuntime, const wchar_t* sObjName, FXJSOBJTYPE eObjType, LP_CONSTRUCTOR pConstructor, LP_DESTRUCTOR pDestructor, unsigned bApplyNew); +int JS_DefineObjMethod(IJS_Runtime* pJSRuntime, int nObjDefnID, const wchar_t* sMethodName, FunctionCallback pMethodCall, unsigned nParamNum); +int JS_DefineObjProperty(IJS_Runtime* pJSRuntime, int nObjDefnID, const wchar_t* sPropName, AccessorGetterCallback pPropGet, AccessorSetterCallback pPropPut); +int JS_DefineObjAllProperties(IJS_Runtime* pJSRuntime, int nObjDefnID, NamedPropertyQueryCallback pPropQurey, NamedPropertyGetterCallback pPropGet, NamedPropertySetterCallback pPropPut, NamedPropertyDeleterCallback pPropDel); +int JS_DefineObjConst(IJS_Runtime* pJSRuntime, int nObjDefnID, const wchar_t* sConstName, v8::Handle<v8::Value> pDefault); +int JS_DefineGlobalMethod(IJS_Runtime* pJSRuntime, const wchar_t* sMethodName, FunctionCallback pMethodCall, unsigned nParamNum); +int JS_DefineGlobalConst(IJS_Runtime* pJSRuntime, const wchar_t* sConstName, v8::Handle<v8::Value> pDefault); + +void JS_InitialRuntime(IJS_Runtime* pJSRuntime,IFXJS_Runtime* pFXRuntime, IFXJS_Context* context, v8::Persistent<v8::Context>& v8PersistentContext); +void JS_ReleaseRuntime(IJS_Runtime* pJSRuntime, v8::Persistent<v8::Context>& v8PersistentContext); +void JS_Initial(); +void JS_Release(); +int JS_Parse(IJS_Runtime* pJSRuntime, IFXJS_Context* pJSContext, const wchar_t* script, long length, FXJSErr* perror); +int JS_Execute(IJS_Runtime* pJSRuntime, IFXJS_Context* pJSContext, const wchar_t* script, long length, FXJSErr* perror); +v8::Handle<v8::Object> JS_NewFxDynamicObj(IJS_Runtime* pJSRuntime, IFXJS_Context* pJSContext, int nObjDefnID); +v8::Handle<v8::Object> JS_GetStaticObj(IJS_Runtime* pJSRuntime, int nObjDefnID); +void JS_SetThisObj(IJS_Runtime* pJSRuntime, int nThisObjID); +v8::Handle<v8::Object> JS_GetThisObj(IJS_Runtime * pJSRuntime); +int JS_GetObjDefnID(v8::Handle<v8::Object> pObj); +IJS_Runtime* JS_GetRuntime(v8::Handle<v8::Object> pObj); +int JS_GetObjDefnID(IJS_Runtime * pJSRuntime, const wchar_t* pObjName); +void JS_Error(v8::Value * pError,const wchar_t * main,const wchar_t * sub); +unsigned JS_CalcHash(const wchar_t* main, unsigned nLen); +unsigned JS_CalcHash(const wchar_t* main); +const wchar_t* JS_GetTypeof(v8::Handle<v8::Value> pObj); +const wchar_t* JS_GetClassname(v8::Handle<v8::Object> pObj); +void JS_SetPrivate(IJS_Runtime* pJSRuntime, v8::Handle<v8::Object> pObj, void* p); +void* JS_GetPrivate(IJS_Runtime* pJSRuntime, v8::Handle<v8::Object> pObj); +void JS_SetPrivate(v8::Handle<v8::Object> pObj, void* p); +void* JS_GetPrivate(v8::Handle<v8::Object> pObj); +void JS_FreePrivate(v8::Handle<v8::Object> pObj); +v8::Handle<v8::Value> JS_GetObjectValue(v8::Handle<v8::Object> pObj); +v8::Handle<v8::Value> JS_GetObjectElement(IJS_Runtime* pJSRuntime, v8::Handle<v8::Object> pObj,const wchar_t* PropertyName); +v8::Handle<v8::Array> JS_GetObjectElementNames(v8::Handle<v8::Object> pObj); +void JS_PutObjectString(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj, const wchar_t* PropertyName, const wchar_t* sValue); +void JS_PutObjectNumber(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj, const wchar_t* PropertyName, int nValue); +void JS_PutObjectNumber(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj, const wchar_t* PropertyName, float fValue); +void JS_PutObjectNumber(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj, const wchar_t* PropertyName, double dValue); +void JS_PutObjectBoolean(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj, const wchar_t* PropertyName, bool bValue); +void JS_PutObjectObject(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj, const wchar_t* PropertyName, v8::Handle<v8::Object> pPut); +void JS_PutObjectNull(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj, const wchar_t* PropertyName); +unsigned JS_PutArrayElement(v8::Handle<v8::Array> pArray,unsigned index,v8::Handle<v8::Value> pValue,FXJSVALUETYPE eType); +v8::Handle<v8::Value> JS_GetArrayElemnet(v8::Handle<v8::Array> pArray,unsigned index); +unsigned JS_GetArrayLength(v8::Handle<v8::Array> pArray); +v8::Handle<v8::Value> JS_GetListValue(v8::Handle<v8::Value> pList, int index); + + +v8::Handle<v8::Array> JS_NewArray(IJS_Runtime* pJSRuntime); +v8::Handle<v8::Value> JS_NewNumber(IJS_Runtime* pJSRuntime,int number); +v8::Handle<v8::Value> JS_NewNumber(IJS_Runtime* pJSRuntime,double number); +v8::Handle<v8::Value> JS_NewNumber(IJS_Runtime* pJSRuntime,float number); +v8::Handle<v8::Value> JS_NewBoolean(IJS_Runtime* pJSRuntime,bool b); +v8::Handle<v8::Value> JS_NewObject(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj); +v8::Handle<v8::Value> JS_NewObject2(IJS_Runtime* pJSRuntime,v8::Handle<v8::Array> pObj); +v8::Handle<v8::Value> JS_NewString(IJS_Runtime* pJSRuntime,const wchar_t* string); +v8::Handle<v8::Value> JS_NewString(IJS_Runtime* pJSRuntime,const wchar_t* string, unsigned nLen); +v8::Handle<v8::Value> JS_NewNull(); +v8::Handle<v8::Value> JS_NewDate(IJS_Runtime* pJSRuntime,double d); +v8::Handle<v8::Value> JS_NewValue(IJS_Runtime* pJSRuntime); + + +int JS_ToInt32(v8::Handle<v8::Value> pValue); +bool JS_ToBoolean(v8::Handle<v8::Value> pValue); +double JS_ToNumber(v8::Handle<v8::Value> pValue); +v8::Handle<v8::Object> JS_ToObject(v8::Handle<v8::Value> pValue); +CFX_WideString JS_ToString(v8::Handle<v8::Value> pValue); +v8::Handle<v8::Array> JS_ToArray(v8::Handle<v8::Value> pValue); +void JS_ValueCopy(v8::Handle<v8::Value>& pTo, v8::Handle<v8::Value> pFrom); + +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* string); +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); + +#endif //FXJSAPI_H diff --git a/fpdfsdk/include/pdfwindow/IPDFWindow.h b/fpdfsdk/include/pdfwindow/IPDFWindow.h new file mode 100644 index 0000000000..53b96a64fd --- /dev/null +++ b/fpdfsdk/include/pdfwindow/IPDFWindow.h @@ -0,0 +1,28 @@ +// 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 _IPDFWINDOW_H_
+#define _IPDFWINDOW_H_
+
+#include "PWL_Wnd.h"
+#include "PWL_EditCtrl.h"
+#include "PWL_Edit.h"
+#include "PWL_ListBox.h"
+#include "PWL_ComboBox.h"
+#include "PWL_Button.h"
+#include "PWL_SpecialButton.h"
+#include "PWL_Icon.h"
+#include "PWL_Label.h"
+#include "PWL_ListCtrl.h"
+#include "PWL_Caret.h"
+#include "PWL_ScrollBar.h"
+#include "PWL_Note.h"
+#include "PWL_IconList.h"
+#include "PWL_FontMap.h"
+#include "PWL_Signature.h"
+#include "PWL_Utils.h"
+
+#endif //_IPDFWINDOW_H_
diff --git a/fpdfsdk/include/pdfwindow/PDFWindow.h b/fpdfsdk/include/pdfwindow/PDFWindow.h new file mode 100644 index 0000000000..22703e1f01 --- /dev/null +++ b/fpdfsdk/include/pdfwindow/PDFWindow.h @@ -0,0 +1,28 @@ +// 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 _PDFWINDOW_H_
+#define _PDFWINDOW_H_
+
+// #define VC_EXTRALEAN
+// #include <afxext.h>
+// #include <afxcmn.h>
+
+#ifndef _INC_PDFAPI
+ #define _INC_PDFAPI
+
+ #include "../../../core/include/fpdfapi/fpdf_module.h"
+ #include "../../../core/include/fpdfdoc/fpdf_doc.h"
+ #include "../../../core/include/fpdfdoc/fpdf_vt.h"
+ #include "../../../core/include/fxcrt/fx_xml.h"
+
+ #include "../fpdf_fwlevent.h"
+ #include "../fx_systemhandler.h"
+#endif
+
+#include "../fxedit/fx_edit.h"
+#endif
+
diff --git a/fpdfsdk/include/pdfwindow/PWL_Button.h b/fpdfsdk/include/pdfwindow/PWL_Button.h new file mode 100644 index 0000000000..202a0d1152 --- /dev/null +++ b/fpdfsdk/include/pdfwindow/PWL_Button.h @@ -0,0 +1,28 @@ +// 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 _PWL_BUTTON_H_
+#define _PWL_BUTTON_H_
+
+class PWL_CLASS CPWL_Button : public CPWL_Wnd
+{
+public:
+ CPWL_Button();
+ virtual ~CPWL_Button();
+
+public:
+ virtual CFX_ByteString GetClassName() const;
+ virtual void OnCreate(PWL_CREATEPARAM & cp);
+
+ virtual FX_BOOL OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual FX_BOOL OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag);
+
+protected:
+ FX_BOOL m_bMouseDown;
+};
+
+#endif // !defined(AFX_PWL_BUTTON_H__5A6080AA_33C5_4FC9_91FC_D9644C41120A__INCLUDED_)
+
diff --git a/fpdfsdk/include/pdfwindow/PWL_Caret.h b/fpdfsdk/include/pdfwindow/PWL_Caret.h new file mode 100644 index 0000000000..4586d471ad --- /dev/null +++ b/fpdfsdk/include/pdfwindow/PWL_Caret.h @@ -0,0 +1,58 @@ +// 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 _PWL_CARET_H_
+#define _PWL_CARET_H_
+
+struct PWL_CARET_INFO
+{
+public:
+ PWL_CARET_INFO() : bVisible(FALSE), ptHead(0,0), ptFoot(0,0)
+ {
+ }
+
+ FX_BOOL bVisible;
+ CPDF_Point ptHead;
+ CPDF_Point ptFoot;
+};
+
+
+class CPWL_Caret : public CPWL_Wnd
+{
+public:
+ CPWL_Caret();
+ virtual ~CPWL_Caret();
+public:
+ virtual CFX_ByteString GetClassName() const;
+ virtual void GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream);
+ virtual void DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);
+ virtual void InvalidateRect(CPDF_Rect * pRect = NULL);
+
+ virtual void SetVisible(FX_BOOL bVisible) {}
+
+ virtual void TimerProc();
+
+ void SetCaret(FX_BOOL bVisible, const CPDF_Point & ptHead, const CPDF_Point & ptFoot);
+ CFX_ByteString GetCaretAppearanceStream(const CPDF_Point & ptOffset);
+
+private:
+ void GetCaretApp(CFX_ByteTextBuf & sAppStream,const CPDF_Point & ptOffset);
+ CPDF_Rect GetCaretRect() const;
+
+ FX_BOOL m_bFlash;
+ CPDF_Point m_ptHead;
+ CPDF_Point m_ptFoot;
+ FX_FLOAT m_fWidth;
+ FX_INT32 m_nDelay;
+
+public:
+ void SetInvalidRect(CPDF_Rect rc) {m_rcInvalid = rc;}
+private:
+ CPDF_Rect m_rcInvalid;
+};
+
+#endif // !defined(AFX_PWL_CARET_H__6A729612_4173_4B65_BCAB_7C6C850ECA47__INCLUDED_)
+
diff --git a/fpdfsdk/include/pdfwindow/PWL_ComboBox.h b/fpdfsdk/include/pdfwindow/PWL_ComboBox.h new file mode 100644 index 0000000000..f64b636c44 --- /dev/null +++ b/fpdfsdk/include/pdfwindow/PWL_ComboBox.h @@ -0,0 +1,115 @@ +// 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 _PWL_COMBOBOX_H_
+#define _PWL_COMBOBOX_H_
+
+class CPWL_CBEdit : public CPWL_Edit
+{
+public:
+ CPWL_CBEdit(){};
+ virtual ~CPWL_CBEdit(){};
+};
+
+class PWL_CLASS CPWL_CBListBox : public CPWL_ListBox
+{
+public:
+ CPWL_CBListBox(){};
+ virtual ~CPWL_CBListBox(){};
+
+public:
+ virtual FX_BOOL OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag);
+
+ virtual FX_BOOL OnKeyDown(FX_WORD nChar, FX_BOOL & bExit, FX_DWORD nFlag);
+ virtual FX_BOOL OnChar(FX_WORD nChar, FX_BOOL & bExit, FX_DWORD nFlag);
+};
+
+#define PWL_COMBOBOX_BUTTON_WIDTH 13
+
+class CPWL_CBButton : public CPWL_Wnd
+{
+public:
+ CPWL_CBButton(){};
+ virtual ~CPWL_CBButton(){};
+
+public:
+ virtual void GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream);
+ virtual void DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);
+
+ virtual FX_BOOL OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual FX_BOOL OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag);
+
+};
+
+class PWL_CLASS CPWL_ComboBox : public CPWL_Wnd
+{
+public:
+ CPWL_ComboBox();
+ operator CPWL_Edit* () {return m_pEdit;}
+
+public:
+ virtual CFX_ByteString GetClassName() const;
+ virtual void OnCreate(PWL_CREATEPARAM & cp);
+
+ virtual FX_BOOL OnKeyDown(FX_WORD nChar, FX_DWORD nFlag);
+ virtual FX_BOOL OnChar(FX_WORD nChar, FX_DWORD nFlag);
+
+ virtual void OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam = 0, FX_INTPTR lParam = 0);
+
+ virtual void CreateChildWnd(const PWL_CREATEPARAM & cp);
+ virtual void RePosChildWnd();
+
+ virtual CPDF_Rect GetFocusRect() const;
+
+ virtual void SetFocus();
+ virtual void KillFocus();
+
+ FX_BOOL IsModified() const;
+
+public:
+ void SetFillerNotify(IPWL_Filler_Notify* pNotify);
+
+ CFX_WideString GetText() const;
+ void SetText(FX_LPCWSTR text);
+
+ void AddString(FX_LPCWSTR string);
+ FX_INT32 GetSelect() const;
+ void SetSelect(FX_INT32 nItemIndex);
+
+ void SetEditSel(FX_INT32 nStartChar,FX_INT32 nEndChar);
+ void GetEditSel(FX_INT32 & nStartChar, FX_INT32 & nEndChar ) const;
+ void Clear();
+ void SelectAll();
+ FX_BOOL IsPopup() const;
+
+ void SetSelectText();
+
+private:
+ void CreateEdit(const PWL_CREATEPARAM & cp);
+ void CreateButton(const PWL_CREATEPARAM & cp);
+ void CreateListBox(const PWL_CREATEPARAM & cp);
+
+ void SetPopup(FX_BOOL bPopup);
+
+private:
+ CPWL_CBEdit* m_pEdit;
+ CPWL_CBButton* m_pButton;
+ CPWL_CBListBox* m_pList;
+
+ FX_BOOL m_bPopup;
+ CPDF_Rect m_rcOldWindow;
+ FX_INT32 m_nPopupWhere;
+ FX_INT32 m_nSelectItem;
+ IPWL_Filler_Notify* m_pFillerNotify;
+
+public:
+ void AttachFFLData(void* pData) {m_pFormFiller = pData;}
+private:
+ void* m_pFormFiller;
+};
+
+#endif // !defined(AFX_PWL_COMBOBOX_H__9D6645F8_64AA_4806_94E8_95FDEDD39C17__INCLUDED_)
+
diff --git a/fpdfsdk/include/pdfwindow/PWL_Edit.h b/fpdfsdk/include/pdfwindow/PWL_Edit.h new file mode 100644 index 0000000000..71f675600d --- /dev/null +++ b/fpdfsdk/include/pdfwindow/PWL_Edit.h @@ -0,0 +1,138 @@ +// 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 _PWL_EDIT_H_
+#define _PWL_EDIT_H_
+
+class IPWL_Filler_Notify;
+class CPWL_Edit;
+class IPWL_SpellCheck;
+
+class IPWL_Filler_Notify
+{
+public:
+ virtual void QueryWherePopup(void* pPrivateData, FX_FLOAT fPopupMin,FX_FLOAT fPopupMax,
+ FX_INT32 & nRet, FX_FLOAT & fPopupRet) = 0; //nRet: (0:bottom 1:top)
+ virtual void OnBeforeKeyStroke(FX_BOOL bEditOrList, void* pPrivateData, FX_INT32 nKeyCode,
+ CFX_WideString & strChange, const CFX_WideString& strChangeEx,
+ int nSelStart, int nSelEnd,
+ FX_BOOL bKeyDown, FX_BOOL & bRC, FX_BOOL & bExit, FX_DWORD nFlag) = 0;
+ virtual void OnAfterKeyStroke(FX_BOOL bEditOrList, void* pPrivateData, FX_BOOL & bExit, FX_DWORD nFlag) = 0;
+};
+
+class PWL_CLASS CPWL_Edit : public CPWL_EditCtrl, public IFX_Edit_OprNotify
+{
+public:
+ CPWL_Edit();
+ virtual ~CPWL_Edit();
+
+public:
+ virtual CFX_ByteString GetClassName() const;
+ virtual void OnDestroy();
+ virtual void OnCreated();
+ virtual void RePosChildWnd();
+ virtual CPDF_Rect GetClientRect() const;
+
+ virtual void GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream);
+ virtual void DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);
+
+ virtual FX_BOOL OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual FX_BOOL OnLButtonDblClk(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual FX_BOOL OnRButtonUp(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual FX_BOOL OnMouseWheel(short zDelta, const CPDF_Point & point, FX_DWORD nFlag);
+
+ virtual FX_BOOL OnKeyDown(FX_WORD nChar, FX_DWORD nFlag);
+ virtual FX_BOOL OnChar(FX_WORD nChar, FX_DWORD nFlag);
+
+ virtual CPDF_Rect GetFocusRect() const;
+
+public:
+ void SetAlignFormatH(PWL_EDIT_ALIGNFORMAT_H nFormat = PEAH_LEFT, FX_BOOL bPaint = TRUE); //0:left 1:right 2:middle
+ void SetAlignFormatV(PWL_EDIT_ALIGNFORMAT_V nFormat = PEAV_TOP, FX_BOOL bPaint = TRUE); //0:top 1:bottom 2:center
+
+ void SetCharArray(FX_INT32 nCharArray);
+ void SetLimitChar(FX_INT32 nLimitChar);
+
+ void SetHorzScale(FX_INT32 nHorzScale, FX_BOOL bPaint = TRUE);
+ void SetCharSpace(FX_FLOAT fCharSpace, FX_BOOL bPaint = TRUE);
+
+ void SetLineLeading(FX_FLOAT fLineLeading, FX_BOOL bPaint = TRUE);
+
+ void EnableSpellCheck(FX_BOOL bEnabled);
+
+ FX_BOOL CanSelectAll() const;
+ FX_BOOL CanClear() const;
+ FX_BOOL CanCopy() const;
+ FX_BOOL CanCut() const;
+ FX_BOOL CanPaste() const;
+
+ virtual void CopyText();
+ virtual void PasteText();
+ virtual void CutText();
+
+ virtual void SetText(FX_LPCWSTR csText);
+ void ReplaceSel(FX_LPCWSTR csText);
+
+ CFX_ByteString GetTextAppearanceStream(const CPDF_Point & ptOffset) const;
+ CFX_ByteString GetCaretAppearanceStream(const CPDF_Point & ptOffset) const;
+ CFX_ByteString GetSelectAppearanceStream(const CPDF_Point & ptOffset) const;
+
+ FX_BOOL IsTextFull() const;
+
+ static FX_FLOAT GetCharArrayAutoFontSize(CPDF_Font* pFont, const CPDF_Rect& rcPlate, FX_INT32 nCharArray);
+
+ void SetFillerNotify(IPWL_Filler_Notify* pNotify) {m_pFillerNotify = pNotify;}
+
+ void GeneratePageObjects(CPDF_PageObjects* pPageObjects,
+ const CPDF_Point& ptOffset, CFX_ArrayTemplate<CPDF_TextObject*>& ObjArray);
+ void GeneratePageObjects(CPDF_PageObjects* pPageObjects,
+ const CPDF_Point& ptOffset);
+
+protected:
+ virtual void OnSetFocus();
+ virtual void OnKillFocus();
+
+protected:
+ virtual void OnInsertWord(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace);
+ virtual void OnInsertReturn(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace);
+ virtual void OnBackSpace(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace);
+ virtual void OnDelete(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace);
+ virtual void OnClear(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace);
+ virtual void OnSetText(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace);
+ virtual void OnInsertText(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace);
+ virtual void OnAddUndo(IFX_Edit_UndoItem* pUndoItem);
+
+private:
+ CPVT_WordRange GetSelectWordRange() const;
+ virtual void ShowVScrollBar(FX_BOOL bShow);
+ FX_BOOL IsVScrollBarVisible() const;
+ void SetParamByFlag();
+
+ FX_FLOAT GetCharArrayAutoFontSize(FX_INT32 nCharArray);
+ CPDF_Point GetWordRightBottomPoint(const CPVT_WordPlace& wpWord);
+
+ CPVT_WordRange CombineWordRange(const CPVT_WordRange& wr1, const CPVT_WordRange& wr2);
+ CPVT_WordRange GetLatinWordsRange(const CPDF_Point & point) const;
+ CPVT_WordRange GetLatinWordsRange(const CPVT_WordPlace & place) const;
+ CPVT_WordRange GetArabicWordsRange(const CPVT_WordPlace & place) const;
+ CPVT_WordRange GetSameWordsRange(const CPVT_WordPlace & place, FX_BOOL bLatin, FX_BOOL bArabic) const;
+
+ void AjustArabicWords(const CPVT_WordRange& wr);
+public:
+ FX_BOOL IsProceedtoOnChar(FX_WORD nKeyCode, FX_DWORD nFlag);
+private:
+ IPWL_Filler_Notify* m_pFillerNotify;
+ IPWL_SpellCheck* m_pSpellCheck;
+ FX_BOOL m_bFocus;
+ CPDF_Rect m_rcOldWindow;
+public:
+ void AttachFFLData(void* pData) {m_pFormFiller = pData;}
+private:
+ void* m_pFormFiller;
+};
+
+#endif
+
diff --git a/fpdfsdk/include/pdfwindow/PWL_EditCtrl.h b/fpdfsdk/include/pdfwindow/PWL_EditCtrl.h new file mode 100644 index 0000000000..3df0f4c23f --- /dev/null +++ b/fpdfsdk/include/pdfwindow/PWL_EditCtrl.h @@ -0,0 +1,171 @@ +// 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 _PWL_EDITCTRL_H_
+#define _PWL_EDITCTRL_H_
+
+enum PWL_EDIT_ALIGNFORMAT_H
+{
+ PEAH_LEFT = 0,
+ PEAH_MIDDLE,
+ PEAH_RIGHT
+};
+
+enum PWL_EDIT_ALIGNFORMAT_V
+{
+ PEAV_TOP = 0,
+ PEAV_CENTER,
+ PEAV_BOTTOM
+};
+
+class IPWL_Edit_Notify;
+class CPWL_EditCtrl;
+class CPWL_Caret;
+class IFX_Edit;
+class CPWL_Edit;
+
+class IPWL_Edit_Notify
+{
+public:
+ //when the position of caret is changed in edit
+ virtual void OnCaretMove(FX_INT32 x1, FX_INT32 y1, FX_INT32 x2, FX_INT32 y2) {}
+ virtual void OnContentChange(const CPDF_Rect& rcContent){}
+ //OprType: 0 InsertWord
+ //1 InsertReturn
+ //2 BackSpace
+ //3 Delete
+ //4 Clear
+ //5 InsertText
+ //6 SetText
+ virtual void OnInsertWord(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace){}
+ virtual void OnInsertReturn(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace){}
+ virtual void OnBackSpace(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace){}
+ virtual void OnDelete(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace){}
+ virtual void OnClear(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace){}
+ virtual void OnInsertText(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace){}
+ virtual void OnSetText(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace){}
+ virtual void OnAddUndo(CPWL_Edit* pEdit) {}
+};
+
+class PWL_CLASS CPWL_EditCtrl : public CPWL_Wnd, public IFX_Edit_Notify
+{
+ friend class CPWL_Edit_Notify;
+
+public:
+ CPWL_EditCtrl();
+ virtual ~CPWL_EditCtrl();
+
+public:
+ virtual void OnCreate(PWL_CREATEPARAM & cp);
+ virtual void OnCreated();
+
+ virtual FX_BOOL OnKeyDown(FX_WORD nChar, FX_DWORD nFlag);
+ virtual FX_BOOL OnChar(FX_WORD nChar, FX_DWORD nFlag);
+ virtual FX_BOOL OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual FX_BOOL OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual FX_BOOL OnMouseMove(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual void OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam = 0, FX_INTPTR lParam = 0);
+
+ virtual void CreateChildWnd(const PWL_CREATEPARAM & cp);
+ virtual void RePosChildWnd();
+ virtual void SetFontSize(FX_FLOAT fFontSize);
+ virtual FX_FLOAT GetFontSize() const;
+
+public:
+ virtual void SetText(FX_LPCWSTR csText);
+
+ virtual void CopyText();
+ virtual void PasteText();
+ virtual void CutText();
+
+ CPDF_Rect GetContentRect() const;
+ void GetCaretPos(FX_INT32& x, FX_INT32& y) const;
+ FX_BOOL IsModified() const;
+
+ CFX_WideString GetText() const;
+ void SetSel(FX_INT32 nStartChar,FX_INT32 nEndChar);
+ void GetSel(FX_INT32 & nStartChar, FX_INT32 & nEndChar ) const;
+ void GetTextRange(const CPDF_Rect& rect, FX_INT32 & nStartChar, FX_INT32 & nEndChar) const;
+ CFX_WideString GetText(FX_INT32 & nStartChar, FX_INT32 & nEndChar) const;
+ void Clear();
+ void SelectAll();
+
+ FX_INT32 GetCaret() const;
+ void SetCaret(FX_INT32 nPos);
+ FX_INT32 GetTotalWords() const;
+
+ void Paint();
+
+ void EnableRefresh(FX_BOOL bRefresh);
+ CPDF_Point GetScrollPos() const;
+ void SetScrollPos(const CPDF_Point& point);
+
+ void SetEditNotify(IPWL_Edit_Notify* pNotify) {m_pEditNotify = pNotify;}
+
+ void SetCharSet(FX_BYTE nCharSet){m_nCharSet = nCharSet;}
+ FX_INT32 GetCharSet() const;
+
+ void SetCodePage(FX_INT32 nCodePage){m_nCodePage = nCodePage;}
+ FX_INT32 GetCodePage() const {return m_nCodePage;}
+
+ CPDF_Font * GetCaretFont() const;
+ FX_FLOAT GetCaretFontSize() const;
+
+ FX_BOOL CanUndo() const;
+ FX_BOOL CanRedo() const;
+ void Redo();
+ void Undo();
+
+ void SetReadyToInput();
+protected:
+ virtual void ShowVScrollBar(FX_BOOL bShow);
+
+ virtual void InsertWord(FX_WORD word, FX_INT32 nCharset);
+ virtual void InsertReturn();
+ virtual void InsertText(FX_LPCWSTR csText);
+
+ virtual void SetCursor();
+ FX_BOOL IsWndHorV();
+
+ void Delete();
+ void Backspace();
+
+protected:
+ void GetCaretInfo(CPDF_Point & ptHead, CPDF_Point & ptFoot) const;
+ void SetCaret(FX_BOOL bVisible, const CPDF_Point & ptHead, const CPDF_Point & ptFoot);
+
+ void SetEditCaret(FX_BOOL bVisible);
+
+protected:
+ virtual void IOnSetScrollInfoX(FX_FLOAT fPlateMin, FX_FLOAT fPlateMax,
+ FX_FLOAT fContentMin, FX_FLOAT fContentMax,
+ FX_FLOAT fSmallStep, FX_FLOAT fBigStep){}
+ virtual void IOnSetScrollInfoY(FX_FLOAT fPlateMin, FX_FLOAT fPlateMax,
+ FX_FLOAT fContentMin, FX_FLOAT fContentMax,
+ FX_FLOAT fSmallStep, FX_FLOAT fBigStep);
+ virtual void IOnSetScrollPosX(FX_FLOAT fx){}
+ virtual void IOnSetScrollPosY(FX_FLOAT fy);
+ virtual void IOnSetCaret(FX_BOOL bVisible,const CPDF_Point & ptHead,const CPDF_Point & ptFoot, const CPVT_WordPlace& place);
+ virtual void IOnCaretChange(const CPVT_SecProps & secProps, const CPVT_WordProps & wordProps);
+ virtual void IOnContentChange(const CPDF_Rect& rcContent);
+ virtual void IOnInvalidateRect(CPDF_Rect * pRect);
+
+private:
+ void CreateEditCaret(const PWL_CREATEPARAM & cp);
+
+protected:
+ IFX_Edit* m_pEdit;
+ CPWL_Caret* m_pEditCaret;
+ FX_BOOL m_bMouseDown;
+ IPWL_Edit_Notify* m_pEditNotify;
+
+private:
+ FX_INT32 m_nCharSet;
+ FX_INT32 m_nCodePage;
+};
+
+#endif
+
diff --git a/fpdfsdk/include/pdfwindow/PWL_FontMap.h b/fpdfsdk/include/pdfwindow/PWL_FontMap.h new file mode 100644 index 0000000000..858bb2a398 --- /dev/null +++ b/fpdfsdk/include/pdfwindow/PWL_FontMap.h @@ -0,0 +1,137 @@ +// 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 _PWL_FONTMAP_H_
+#define _PWL_FONTMAP_H_
+
+struct CPWL_FontMap_Data
+{
+ CPDF_Font* pFont;
+ FX_INT32 nCharset;
+ CFX_ByteString sFontName;
+};
+
+struct CPWL_FontMap_Native
+{
+ FX_INT32 nCharset;
+ CFX_ByteString sFontName;
+};
+
+#ifndef ANSI_CHARSET
+
+#define ANSI_CHARSET 0
+#define DEFAULT_CHARSET 1
+#define SYMBOL_CHARSET 2
+#define SHIFTJIS_CHARSET 128
+#define HANGEUL_CHARSET 129
+#define HANGUL_CHARSET 129
+#define GB2312_CHARSET 134
+#define CHINESEBIG5_CHARSET 136
+#define OEM_CHARSET 255
+#define JOHAB_CHARSET 130
+#define HEBREW_CHARSET 177
+#define ARABIC_CHARSET 178
+#define GREEK_CHARSET 161
+#define TURKISH_CHARSET 162
+#define VIETNAMESE_CHARSET 163
+#define THAI_CHARSET 222
+#define EASTEUROPE_CHARSET 238
+#define RUSSIAN_CHARSET 204
+#define BALTIC_CHARSET 186
+
+#endif
+
+#ifndef PWL_CLASS
+
+ #ifdef FX_READER_DLL
+ #define PWL_CLASS __declspec(dllexport)
+ #else
+ #define PWL_CLASS
+ #endif
+#endif
+
+class IFX_SystemHandler;
+class PWL_CLASS CPWL_FontMap : public IFX_Edit_FontMap
+{
+public:
+ CPWL_FontMap(IFX_SystemHandler* pSystemHandler);
+ virtual ~CPWL_FontMap();
+
+ virtual CPDF_Font* GetPDFFont(FX_INT32 nFontIndex);
+ virtual CFX_ByteString GetPDFFontAlias(FX_INT32 nFontIndex);
+ virtual FX_INT32 GetWordFontIndex(FX_WORD word, FX_INT32 nCharset, FX_INT32 nFontIndex);
+ virtual FX_INT32 CharCodeFromUnicode(FX_INT32 nFontIndex, FX_WORD word);
+ virtual FX_INT32 CharSetFromUnicode(FX_WORD word, FX_INT32 nOldCharset);
+
+public:
+ virtual void Initial(FX_LPCSTR fontname = NULL);
+ void SetSystemHandler(IFX_SystemHandler* pSystemHandler);
+
+ FX_INT32 GetFontMapCount() const;
+ const CPWL_FontMap_Data* GetFontMapData(FX_INT32 nIndex) const;
+
+public:
+ static FX_INT32 GetNativeCharset();
+ CFX_ByteString GetNativeFontName(FX_INT32 nCharset);
+
+ static CFX_ByteString GetDefaultFontByCharset(FX_INT32 nCharset);
+
+ CPDF_Font* AddFontToDocument(CPDF_Document* pDoc, CFX_ByteString& sFontName, FX_BYTE nCharset);
+ static FX_BOOL IsStandardFont(const CFX_ByteString& sFontName);
+ CPDF_Font* AddStandardFont(CPDF_Document* pDoc, CFX_ByteString& sFontName);
+ CPDF_Font* AddSystemFont(CPDF_Document* pDoc, CFX_ByteString& sFontName,
+ FX_BYTE nCharset);
+
+protected:
+ virtual CPDF_Font* FindFontSameCharset(CFX_ByteString& sFontAlias, FX_INT32 nCharset);
+ virtual void AddedFont(CPDF_Font* pFont, const CFX_ByteString& sFontAlias);
+ FX_BOOL KnowWord(FX_INT32 nFontIndex, FX_WORD word);
+
+ virtual CPDF_Document* GetDocument();
+
+ void Empty();
+ FX_INT32 GetFontIndex(const CFX_ByteString& sFontName, FX_INT32 nCharset, FX_BOOL bFind);
+ FX_INT32 GetPWLFontIndex(FX_WORD word, FX_INT32 nCharset);
+ FX_INT32 AddFontData(CPDF_Font* pFont, const CFX_ByteString& sFontAlias, FX_INT32 nCharset = DEFAULT_CHARSET);
+
+ CFX_ByteString EncodeFontAlias(const CFX_ByteString& sFontName, FX_INT32 nCharset);
+ CFX_ByteString EncodeFontAlias(const CFX_ByteString& sFontName);
+
+private:
+ CFX_ByteString GetFontName(FX_INT32 nFontIndex);
+ FX_INT32 FindFont(const CFX_ByteString& sFontName, FX_INT32 nCharset = DEFAULT_CHARSET);
+
+ CFX_ByteString GetNativeFont(FX_INT32 nCharset);
+
+public:
+ struct CharsetFontMap {
+ FX_INT32 charset;
+ const char* fontname;
+ };
+ static const CharsetFontMap defaultTTFMap[];
+
+protected:
+ CFX_ArrayTemplate<CPWL_FontMap_Data*> m_aData;
+ CFX_ArrayTemplate<CPWL_FontMap_Native*> m_aNativeFont;
+
+private:
+ CPDF_Document* m_pPDFDoc;
+ IFX_SystemHandler* m_pSystemHandler;
+};
+
+class PWL_CLASS CPWL_DocFontMap : public CPWL_FontMap
+{
+public:
+ CPWL_DocFontMap(IFX_SystemHandler* pSystemHandler, CPDF_Document* pAttachedDoc);
+ virtual ~CPWL_DocFontMap();
+
+ virtual CPDF_Document* GetDocument();
+
+private:
+ CPDF_Document* m_pAttachedDoc;
+};
+
+#endif
diff --git a/fpdfsdk/include/pdfwindow/PWL_Icon.h b/fpdfsdk/include/pdfwindow/PWL_Icon.h new file mode 100644 index 0000000000..d6b121e800 --- /dev/null +++ b/fpdfsdk/include/pdfwindow/PWL_Icon.h @@ -0,0 +1,59 @@ +// 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 _PWL_ICON_H_
+#define _PWL_ICON_H_
+
+class PWL_CLASS CPWL_Image : public CPWL_Wnd
+{
+public:
+ CPWL_Image();
+ virtual ~CPWL_Image();
+
+ virtual CFX_ByteString GetImageAppStream();
+
+ virtual void GetScale(FX_FLOAT & fHScale,FX_FLOAT & fVScale);
+ virtual void GetImageOffset(FX_FLOAT & x,FX_FLOAT & y);
+ virtual CPDF_Stream * GetPDFStream();
+
+public:
+ void SetPDFStream(CPDF_Stream* pStream);
+ void GetImageSize(FX_FLOAT & fWidth,FX_FLOAT & fHeight);
+ CPDF_Matrix GetImageMatrix();
+ CFX_ByteString GetImageAlias();
+ void SetImageAlias(FX_LPCSTR sImageAlias);
+
+protected:
+ CPDF_Stream* m_pPDFStream;
+ CFX_ByteString m_sImageAlias;
+};
+
+class PWL_CLASS CPWL_Icon : public CPWL_Image
+{
+public:
+ CPWL_Icon();
+ virtual ~CPWL_Icon();
+
+ virtual CPDF_IconFit * GetIconFit(){return m_pIconFit;};
+
+ virtual void GetScale(FX_FLOAT & fHScale,FX_FLOAT & fVScale);
+ virtual void GetImageOffset(FX_FLOAT & x,FX_FLOAT & y);
+
+ FX_INT32 GetScaleMethod();
+ FX_BOOL IsProportionalScale();
+ void GetIconPosition(FX_FLOAT & fLeft, FX_FLOAT & fBottom);
+ FX_BOOL GetFittingBounds();
+
+ void SetIconFit(CPDF_IconFit * pIconFit){m_pIconFit = pIconFit;};
+
+private:
+ CPDF_IconFit * m_pIconFit;
+};
+
+
+#endif // !defined(AFX_PWL_BUTTON_H__5A6080AA_33C5_4FC9_91FC_D9644C41120A__INCLUDED_)
+
+
diff --git a/fpdfsdk/include/pdfwindow/PWL_IconList.h b/fpdfsdk/include/pdfwindow/PWL_IconList.h new file mode 100644 index 0000000000..e5192901e8 --- /dev/null +++ b/fpdfsdk/include/pdfwindow/PWL_IconList.h @@ -0,0 +1,125 @@ +// 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 _PWL_IconList_H_
+#define _PWL_IconList_H_
+
+class IPWL_IconList_Notify;
+class CPWL_IconList_Item;
+class CPWL_IconList_Content;
+class CPWL_IconList;
+class CPWL_Label;
+
+class IPWL_IconList_Notify
+{
+public:
+ virtual void OnNoteListSelChanged(FX_INT32 nItemIndex) = 0;
+};
+
+class CPWL_IconList_Item : public CPWL_Wnd
+{
+public:
+ CPWL_IconList_Item();
+ virtual ~CPWL_IconList_Item();
+
+ virtual CFX_ByteString GetClassName() const;
+ virtual void CreateChildWnd(const PWL_CREATEPARAM & cp);
+ virtual void RePosChildWnd();
+
+ void SetSelect(FX_BOOL bSelected);
+ FX_BOOL IsSelected() const;
+ void SetData(void* pData);
+ void SetIcon(FX_INT32 nIconIndex);
+ void SetText(const CFX_WideString& str);
+ void SetIconFillColor(const CPWL_Color& color);
+ CFX_WideString GetText() const;
+
+protected:
+ virtual FX_FLOAT GetItemHeight(FX_FLOAT fLimitWidth);
+ virtual void DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);
+
+ virtual void OnEnabled();
+ virtual void OnDisabled();
+
+private:
+ FX_INT32 m_nIconIndex;
+ void* m_pData;
+ FX_BOOL m_bSelected;
+ CPWL_Label* m_pText;
+ CPWL_Color m_crIcon;
+};
+
+class CPWL_IconList_Content : public CPWL_ListCtrl
+{
+public:
+ CPWL_IconList_Content(FX_INT32 nListCount);
+ virtual ~CPWL_IconList_Content();
+
+ void SetSelect(FX_INT32 nIndex);
+ FX_INT32 GetSelect() const;
+ void SetNotify(IPWL_IconList_Notify* pNotify);
+ void EnableNotify(FX_BOOL bNotify);
+ void SetListData(FX_INT32 nItemIndex, void* pData);
+ void SetListIcon(FX_INT32 nItemIndex, FX_INT32 nIconIndex);
+ void SetListString(FX_INT32 nItemIndex, const CFX_WideString& str);
+ void SetIconFillColor(const CPWL_Color& color);
+ CFX_WideString GetListString(FX_INT32 nItemIndex) const;
+ IPWL_IconList_Notify* GetNotify() const;
+ void ScrollToItem(FX_INT32 nItemIndex);
+
+protected:
+ virtual void CreateChildWnd(const PWL_CREATEPARAM & cp);
+ virtual FX_BOOL OnLButtonDown(const CPDF_Point & point);
+ virtual FX_BOOL OnLButtonUp(const CPDF_Point & point);
+ virtual FX_BOOL OnMouseMove(const CPDF_Point & point);
+ virtual FX_BOOL OnKeyDown(FX_WORD nChar);
+
+private:
+ CPWL_IconList_Item* GetListItem(FX_INT32 nItemIndex) const;
+ void SelectItem(FX_INT32 nItemIndex, FX_BOOL bSelect);
+ FX_INT32 FindItemIndex(const CPDF_Point& point);
+
+ FX_BOOL m_nSelectIndex;
+ IPWL_IconList_Notify* m_pNotify;
+ FX_BOOL m_bEnableNotify;
+ FX_BOOL m_bMouseDown;
+ FX_INT32 m_nListCount;
+};
+
+class PWL_CLASS CPWL_IconList : public CPWL_Wnd
+{
+public:
+ CPWL_IconList(FX_INT32 nListCount);
+ virtual ~CPWL_IconList();
+
+ virtual FX_BOOL OnMouseWheel(short zDelta, const CPDF_Point & point);
+
+ void SetSelect(FX_INT32 nIndex);
+ void SetTopItem(FX_INT32 nIndex);
+ FX_INT32 GetSelect() const;
+ void SetNotify(IPWL_IconList_Notify* pNotify);
+ void EnableNotify(FX_BOOL bNotify);
+ void SetListData(FX_INT32 nItemIndex, void* pData);
+ void SetListIcon(FX_INT32 nItemIndex, FX_INT32 nIconIndex);
+ void SetListString(FX_INT32 nItemIndex, const CFX_WideString& str);
+ void SetIconFillColor(const CPWL_Color& color);
+ CFX_WideString GetListString(FX_INT32 nItemIndex) const;
+
+protected:
+ virtual void OnCreated();
+ virtual void RePosChildWnd();
+ virtual void CreateChildWnd(const PWL_CREATEPARAM & cp);
+
+ virtual void OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam = 0, FX_INTPTR lParam = 0);
+
+private:
+ CPWL_IconList_Content* m_pListContent;
+ FX_INT32 m_nListCount;
+};
+
+#endif //_PWL_IconList_H_
+
+
diff --git a/fpdfsdk/include/pdfwindow/PWL_Label.h b/fpdfsdk/include/pdfwindow/PWL_Label.h new file mode 100644 index 0000000000..16bd1ae39a --- /dev/null +++ b/fpdfsdk/include/pdfwindow/PWL_Label.h @@ -0,0 +1,51 @@ +// 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 _PWL_LABEL_H_
+#define _PWL_LABEL_H_
+
+class IFX_Edit;
+
+class PWL_CLASS CPWL_Label : public CPWL_Wnd
+{
+public:
+ CPWL_Label();
+ virtual ~CPWL_Label();
+
+public:
+ virtual CFX_ByteString GetClassName() const;
+ virtual void SetFontSize(FX_FLOAT fFontSize);
+ virtual FX_FLOAT GetFontSize() const;
+
+public:
+ void SetText(FX_LPCWSTR csText);
+ CFX_WideString GetText() const;
+
+ void SetLimitChar(FX_INT32 nLimitChar);
+ void SetHorzScale(FX_INT32 nHorzScale);
+ void SetCharSpace(FX_FLOAT fCharSpace);
+
+ CPDF_Rect GetContentRect() const;
+ FX_INT32 GetTotalWords();
+
+ CFX_ByteString GetTextAppearanceStream(const CPDF_Point & ptOffset) const;
+
+protected:
+ virtual void OnCreated();
+ virtual void DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);
+ virtual void GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream);
+ virtual void RePosChildWnd();
+
+private:
+ void SetParamByFlag();
+
+private:
+ IFX_Edit* m_pEdit;
+};
+
+#endif
+
+
diff --git a/fpdfsdk/include/pdfwindow/PWL_ListBox.h b/fpdfsdk/include/pdfwindow/PWL_ListBox.h new file mode 100644 index 0000000000..6ef82c82c6 --- /dev/null +++ b/fpdfsdk/include/pdfwindow/PWL_ListBox.h @@ -0,0 +1,103 @@ +// 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 _PWL_LISTBOX_H_
+#define _PWL_LISTBOX_H_
+
+class CPDF_ListCtrl;
+class CPWL_List_Notify;
+class CPWL_ListBox;
+class IPWL_Filler_Notify;
+
+class CPWL_List_Notify : public IFX_List_Notify
+{
+public:
+ CPWL_List_Notify(CPWL_ListBox * pList);
+ virtual ~CPWL_List_Notify();
+
+ void IOnSetScrollInfoX(FX_FLOAT fPlateMin, FX_FLOAT fPlateMax,
+ FX_FLOAT fContentMin, FX_FLOAT fContentMax,
+ FX_FLOAT fSmallStep, FX_FLOAT fBigStep){}
+ void IOnSetScrollInfoY(FX_FLOAT fPlateMin, FX_FLOAT fPlateMax,
+ FX_FLOAT fContentMin, FX_FLOAT fContentMax,
+ FX_FLOAT fSmallStep, FX_FLOAT fBigStep);
+ void IOnSetScrollPosX(FX_FLOAT fx){}
+ void IOnSetScrollPosY(FX_FLOAT fy);
+ void IOnSetCaret(FX_BOOL bVisible,const CPDF_Point & ptHead,const CPDF_Point & ptFoot, const CPVT_WordPlace& place);
+ void IOnCaretChange(const CPVT_SecProps & secProps, const CPVT_WordProps & wordProps);
+ void IOnInvalidateRect(CPDF_Rect * pRect);
+
+private:
+ CPWL_ListBox* m_pList;
+};
+
+class PWL_CLASS CPWL_ListBox : public CPWL_Wnd
+{
+public:
+ CPWL_ListBox();
+ virtual ~CPWL_ListBox();
+
+ virtual CFX_ByteString GetClassName() const;
+ virtual void OnCreated();
+ virtual void OnDestroy();
+ virtual void GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream);
+ virtual void DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);
+
+ virtual FX_BOOL OnKeyDown(FX_WORD nChar, FX_DWORD nFlag);
+ virtual FX_BOOL OnChar(FX_WORD nChar, FX_DWORD nFlag);
+ virtual FX_BOOL OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual FX_BOOL OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual FX_BOOL OnMouseMove(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual FX_BOOL OnMouseWheel(short zDelta, const CPDF_Point & point, FX_DWORD nFlag);
+ virtual void KillFocus();
+
+ virtual void OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam = 0, FX_INTPTR lParam = 0);
+ virtual void RePosChildWnd();
+ virtual void SetText(FX_LPCWSTR csText,FX_BOOL bRefresh = TRUE);
+ virtual CFX_WideString GetText() const;
+ virtual CPDF_Rect GetFocusRect() const;
+ virtual void SetFontSize(FX_FLOAT fFontSize);
+ virtual FX_FLOAT GetFontSize() const;
+
+ void OnNotifySelChanged(FX_BOOL bKeyDown, FX_BOOL & bExit , FX_DWORD nFlag);
+
+ void AddString(FX_LPCWSTR string);
+ void SetTopVisibleIndex(FX_INT32 nItemIndex);
+ void ScrollToListItem(FX_INT32 nItemIndex);
+ void ResetContent();
+ void Reset();
+ void Select(FX_INT32 nItemIndex);
+ void SetCaret(FX_INT32 nItemIndex);
+ void SetHoverSel(FX_BOOL bHoverSel);
+
+ FX_INT32 GetCount() const;
+ FX_BOOL IsMultipleSel() const;
+ FX_INT32 GetCaretIndex() const;
+ FX_INT32 GetCurSel() const;
+ FX_BOOL IsItemSelected(FX_INT32 nItemIndex) const;
+ FX_INT32 GetTopVisibleIndex() const;
+ FX_INT32 FindNext(FX_INT32 nIndex,FX_WCHAR nChar) const;
+ CPDF_Rect GetContentRect() const;
+ FX_FLOAT GetFirstHeight() const;
+ CPDF_Rect GetListRect() const;
+
+ void SetFillerNotify(IPWL_Filler_Notify* pNotify) {m_pFillerNotify = pNotify;}
+
+protected:
+ IFX_List* m_pList;
+ CPWL_List_Notify* m_pListNotify;
+ FX_BOOL m_bMouseDown;
+ FX_BOOL m_bHoverSel;
+ IPWL_Filler_Notify* m_pFillerNotify;
+public:
+ void AttachFFLData(void* pData) {m_pFormFiller = pData;}
+private:
+ void* m_pFormFiller;
+};
+
+#endif // !defined(AFX_PWL_LISTBOX_H__F8C0DD72_CC3C_4806_86FB_E9D02B04A34B__INCLUDED_)
+
+
diff --git a/fpdfsdk/include/pdfwindow/PWL_ListCtrl.h b/fpdfsdk/include/pdfwindow/PWL_ListCtrl.h new file mode 100644 index 0000000000..3a3b922e68 --- /dev/null +++ b/fpdfsdk/include/pdfwindow/PWL_ListCtrl.h @@ -0,0 +1,53 @@ +// 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 _PWL_LISTCTRL_H_
+#define _PWL_LISTCTRL_H_
+
+class CPWL_ListCtrl;
+
+class CPWL_ListCtrl : public CPWL_Wnd
+{
+public:
+ CPWL_ListCtrl();
+ virtual ~CPWL_ListCtrl();
+
+public:
+ void SetScrollPos(const CPDF_Point& point);
+ CPDF_Point GetScrollPos() const;
+ CPDF_Rect GetScrollArea() const;
+
+ void SetItemSpace(FX_FLOAT fSpace);
+ void SetTopSpace(FX_FLOAT fSpace);
+ void SetBottomSpace(FX_FLOAT fSpace);
+ void ResetFace();
+ void ResetContent(FX_INT32 nStart);
+ FX_INT32 GetItemIndex(CPWL_Wnd* pItem);
+ FX_FLOAT GetContentsHeight(FX_FLOAT fLimitWidth);
+
+protected:
+ virtual void RePosChildWnd();
+ virtual void DrawChildAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);
+
+public:
+ CPDF_Point InToOut(const CPDF_Point& point) const;
+ CPDF_Point OutToIn(const CPDF_Point& point) const;
+ CPDF_Rect InToOut(const CPDF_Rect& rect) const;
+ CPDF_Rect OutToIn(const CPDF_Rect& rect) const;
+
+private:
+ void ResetAll(FX_BOOL bMove,FX_INT32 nStart);
+
+private:
+ CPDF_Rect m_rcContent;
+ CPDF_Point m_ptScroll;
+ FX_FLOAT m_fItemSpace;
+ FX_FLOAT m_fTopSpace;
+ FX_FLOAT m_fBottomSpace;
+};
+
+#endif
+
diff --git a/fpdfsdk/include/pdfwindow/PWL_Note.h b/fpdfsdk/include/pdfwindow/PWL_Note.h new file mode 100644 index 0000000000..89308e63e4 --- /dev/null +++ b/fpdfsdk/include/pdfwindow/PWL_Note.h @@ -0,0 +1,355 @@ +// 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 _PWL_NOTE_H_
+#define _PWL_NOTE_H_
+
+class IPWL_NoteNotify;
+class IPWL_NoteHandler;
+class IPWL_NoteItem;
+class CPWL_NoteItem;
+class CPWL_Note;
+class CPWL_Label;
+class CPWL_Edit;
+class CPWL_Note_Icon;
+class CPWL_Note_CloseBox;
+class CPWL_Note_LBBox;
+class CPWL_Note_RBBox;
+class CPWL_Note_Edit;
+class CPWL_Note_Options;
+class CPWL_Note_Contents;
+class IPopup_Note;
+
+
+class IPWL_NoteNotify
+{
+public:
+ virtual void OnNoteMove(const FX_RECT& rtWin) = 0;
+ virtual void OnNoteShow(FX_BOOL bShow) = 0;
+ virtual void OnNoteActivate(FX_BOOL bActive) = 0;
+ virtual void OnNoteClose() = 0;
+ virtual void OnItemCreate(IPWL_NoteItem* pItem) = 0;
+ virtual void OnItemDelete(IPWL_NoteItem* pItem) = 0;
+ virtual void OnSetAuthorName(IPWL_NoteItem* pItem) = 0;
+ virtual void OnSetBkColor(IPWL_NoteItem* pItem) = 0;
+ virtual void OnSetContents(IPWL_NoteItem* pItem) = 0;
+ virtual void OnSetDateTime(IPWL_NoteItem* pItem) = 0;
+ virtual void OnSetSubjectName(IPWL_NoteItem* pItem) = 0;
+ virtual void OnPopupMenu(FX_INT32 x, FX_INT32 y) = 0;
+ virtual void OnPopupMenu(IPWL_NoteItem* pItem, FX_INT32 x, FX_INT32 y) = 0;
+};
+
+class IPWL_NoteHandler
+{
+public:
+ virtual void OnNoteColorChanged(const CPWL_Color& color) = 0;
+};
+
+class IPWL_NoteItem
+{
+public:
+ virtual void SetPrivateData(void* pData) = 0;
+ virtual void SetBkColor(const CPWL_Color& color) = 0;
+ virtual void SetSubjectName(const CFX_WideString& sName) = 0;
+ virtual void SetAuthorName(const CFX_WideString& sName) = 0;
+ virtual void SetDateTime(FX_SYSTEMTIME time) = 0;
+ virtual void SetContents(const CFX_WideString& sContents) = 0;
+
+ virtual IPWL_NoteItem* CreateSubItem() = 0;
+ virtual FX_INT32 CountSubItems() const = 0;
+ virtual IPWL_NoteItem* GetSubItems(FX_INT32 index) const = 0;
+ virtual void DeleteSubItem(IPWL_NoteItem* pNoteItem) = 0;
+ virtual void SetFocus() = 0;
+
+ virtual IPWL_NoteItem* GetParentItem() const = 0;
+ virtual void* GetPrivateData() const = 0;
+ virtual CFX_WideString GetAuthorName() const = 0;
+ virtual CPWL_Color GetBkColor() const = 0;
+ virtual CFX_WideString GetContents() const = 0;
+ virtual FX_SYSTEMTIME GetDateTime() const = 0;
+ virtual CFX_WideString GetSubjectName() const = 0;
+
+ virtual CPWL_Edit* GetEdit() const = 0;
+};
+
+class PWL_CLASS CPWL_Note_Icon : public CPWL_Wnd
+{
+public:
+ CPWL_Note_Icon();
+ virtual ~CPWL_Note_Icon();
+
+ void SetIconType(FX_INT32 nType);
+
+public:
+
+protected:
+ virtual void DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);
+
+private:
+ FX_INT32 m_nType;
+};
+
+class CPWL_Note_CloseBox : public CPWL_Button
+{
+public:
+ CPWL_Note_CloseBox();
+ virtual ~CPWL_Note_CloseBox();
+
+protected:
+ virtual void DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);
+ virtual FX_BOOL OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual FX_BOOL OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag);
+
+private:
+ FX_BOOL m_bMouseDown;
+};
+
+class CPWL_Note_LBBox : public CPWL_Wnd
+{
+public:
+ CPWL_Note_LBBox();
+ virtual ~CPWL_Note_LBBox();
+
+protected:
+ virtual void DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);
+};
+
+class CPWL_Note_RBBox : public CPWL_Wnd
+{
+public:
+ CPWL_Note_RBBox();
+ virtual ~CPWL_Note_RBBox();
+
+protected:
+ virtual void DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);
+};
+
+class CPWL_Note_Edit : public CPWL_Edit
+{
+public:
+ CPWL_Note_Edit();
+ virtual ~CPWL_Note_Edit();
+
+ void EnableNotify(FX_BOOL bEnable) {m_bEnableNotify = bEnable;}
+ virtual FX_FLOAT GetItemHeight(FX_FLOAT fLimitWidth);
+ FX_FLOAT GetItemLeftMargin();
+ FX_FLOAT GetItemRightMargin();
+
+ virtual void SetText(FX_LPCWSTR csText);
+
+protected:
+ virtual void OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam = 0, FX_INTPTR lParam = 0);
+ virtual void RePosChildWnd();
+ virtual void OnSetFocus();
+ virtual void OnKillFocus();
+
+private:
+ FX_BOOL m_bEnableNotify;
+ FX_FLOAT m_fOldItemHeight;
+ FX_BOOL m_bSizeChanged;
+ FX_FLOAT m_fOldMin;
+ FX_FLOAT m_fOldMax;
+};
+
+class CPWL_Note_Options : public CPWL_Wnd
+{
+public:
+ CPWL_Note_Options();
+ virtual ~CPWL_Note_Options();
+
+ CPDF_Rect GetContentRect() const;
+ virtual void SetTextColor(const CPWL_Color & color);
+ void SetText(const CFX_WideString& sText);
+
+protected:
+ virtual void RePosChildWnd();
+ virtual void CreateChildWnd(const PWL_CREATEPARAM & cp);
+ virtual void DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);
+
+private:
+ CPWL_Label* m_pText;
+};
+
+class CPWL_Note_Contents : public CPWL_ListCtrl
+{
+public:
+ CPWL_Note_Contents();
+ virtual ~CPWL_Note_Contents();
+
+ virtual CFX_ByteString GetClassName() const;
+ virtual void OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam = 0, FX_INTPTR lParam = 0);
+ virtual FX_BOOL OnLButtonDown(const CPDF_Point& point, FX_DWORD nFlag);
+
+ void SetEditFocus(FX_BOOL bLast);
+ CPWL_Edit* GetEdit() const;
+
+public:
+ void SetText(const CFX_WideString& sText);
+ CFX_WideString GetText() const;
+
+ CPWL_NoteItem* CreateSubItem();
+ void DeleteSubItem(IPWL_NoteItem* pNoteItem);
+ FX_INT32 CountSubItems() const;
+ IPWL_NoteItem* GetSubItems(FX_INT32 index) const;
+
+ virtual IPWL_NoteItem* GetHitNoteItem(const CPDF_Point& point);
+ void EnableRead(FX_BOOL bEnabled);
+ void EnableModify(FX_BOOL bEnabled);
+
+protected:
+ virtual void CreateChildWnd(const PWL_CREATEPARAM & cp);
+
+private:
+ CPWL_Note_Edit* m_pEdit;
+};
+
+class PWL_CLASS CPWL_NoteItem : public CPWL_Wnd, public IPWL_NoteItem
+{
+public:
+ CPWL_NoteItem();
+ virtual ~CPWL_NoteItem();
+
+public:
+ virtual void SetPrivateData(void* pData);
+ virtual void SetBkColor(const CPWL_Color& color);
+ virtual void SetSubjectName(const CFX_WideString& sName);
+ virtual void SetAuthorName(const CFX_WideString& sName);
+ virtual void SetDateTime(FX_SYSTEMTIME time);
+ virtual void SetContents(const CFX_WideString& sContents);
+
+ virtual IPWL_NoteItem* CreateSubItem();
+ virtual FX_INT32 CountSubItems() const;
+ virtual IPWL_NoteItem* GetSubItems(FX_INT32 index) const;
+ virtual void DeleteSubItem(IPWL_NoteItem* pNoteItem);
+ virtual void SetFocus(){SetNoteFocus(FALSE);}
+
+ virtual IPWL_NoteItem* GetParentItem() const;
+ virtual void* GetPrivateData() const;
+ virtual CFX_WideString GetAuthorName() const;
+ virtual CPWL_Color GetBkColor() const;
+ virtual CFX_WideString GetContents() const;
+ virtual FX_SYSTEMTIME GetDateTime() const;
+ virtual CFX_WideString GetSubjectName() const;
+ virtual FX_BOOL IsTopItem() const { return FALSE;}
+ virtual CPWL_Edit* GetEdit() const;
+
+public:
+ virtual FX_BOOL OnLButtonDown(const CPDF_Point& point, FX_DWORD nFlag);
+ virtual FX_BOOL OnRButtonUp(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual CFX_ByteString GetClassName() const;
+ virtual IPWL_NoteItem* GetHitNoteItem(const CPDF_Point& point);
+ virtual IPWL_NoteItem* GetFocusedNoteItem() const;
+
+ virtual void ResetSubjectName(FX_INT32 nItemIndex);
+ void EnableRead(FX_BOOL bEnabled);
+ void EnableModify(FX_BOOL bEnabled);
+
+protected:
+ virtual void RePosChildWnd();
+ virtual void CreateChildWnd(const PWL_CREATEPARAM & cp);
+
+ virtual void OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam = 0, FX_INTPTR lParam = 0);
+
+public:
+ virtual FX_FLOAT GetItemHeight(FX_FLOAT fLimitWidth);
+ virtual FX_FLOAT GetItemLeftMargin();
+ virtual FX_FLOAT GetItemRightMargin();
+ CPWL_NoteItem* CreateNoteItem();
+ CPWL_NoteItem* GetParentNoteItem() const;
+
+ void SetNoteFocus(FX_BOOL bLast);
+ void OnContentsValidate();
+
+ void OnCreateNoteItem();
+
+protected:
+ void PopupNoteItemMenu(const CPDF_Point& point);
+
+ virtual const CPWL_Note* GetNote() const;
+ virtual IPWL_NoteNotify* GetNoteNotify() const;
+
+protected:
+ CPWL_Label* m_pSubject;
+ CPWL_Label* m_pDateTime;
+ CPWL_Note_Contents* m_pContents;
+
+private:
+ void* m_pPrivateData;
+ FX_SYSTEMTIME m_dtNote;
+ CFX_WideString m_sAuthor;
+
+ FX_FLOAT m_fOldItemHeight;
+ FX_BOOL m_bSizeChanged;
+ FX_BOOL m_bAllowModify;
+};
+
+class PWL_CLASS CPWL_Note : public CPWL_NoteItem
+{
+public:
+ CPWL_Note(IPopup_Note* pPopupNote, IPWL_NoteNotify* pNoteNotify, IPWL_NoteHandler* pNoteHandler);
+ virtual ~CPWL_Note();
+
+public:
+ virtual void SetSubjectName(const CFX_WideString& sName);
+ virtual void SetAuthorName(const CFX_WideString& sName);
+ virtual CFX_WideString GetAuthorName() const;
+ virtual void SetBkColor(const CPWL_Color& color);
+ virtual void ResetSubjectName(FX_INT32 nItemIndex){}
+ virtual FX_BOOL IsTopItem() const {return TRUE;}
+ virtual const CPWL_Note* GetNote() const;
+ virtual IPWL_NoteNotify* GetNoteNotify() const;
+
+public:
+ IPWL_NoteItem* Reply();
+ void EnableNotify(FX_BOOL bEnabled);
+ void SetIconType(FX_INT32 nType);
+ void SetOptionsText(const CFX_WideString& sText);
+ void EnableRead(FX_BOOL bEnabled);
+ void EnableModify(FX_BOOL bEnabled);
+
+ CFX_WideString GetReplyString() const;
+ void SetReplyString(const CFX_WideString& string);
+
+ //0-normal / 1-caption / 2-leftbottom corner / 3-rightbottom corner / 4-close / 5-options
+ FX_INT32 NoteHitTest(const CPDF_Point& point) const;
+ CPDF_Rect GetCaptionRect() const {return m_rcCaption;}
+ IPopup_Note* GetPopupNote() const {return m_pPopupNote;}
+
+public:
+ virtual FX_BOOL OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual FX_BOOL OnRButtonUp(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual FX_BOOL OnMouseWheel(short zDelta, const CPDF_Point & point, FX_DWORD nFlag);
+
+protected:
+ virtual void RePosChildWnd();
+ virtual void CreateChildWnd(const PWL_CREATEPARAM & cp);
+
+ virtual void OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam = 0, FX_INTPTR lParam = 0);
+
+ FX_BOOL ResetScrollBar();
+ void RePosNoteChildren();
+ FX_BOOL ScrollBarShouldVisible();
+
+private:
+ CPWL_Label* m_pAuthor;
+ CPWL_Note_Icon* m_pIcon;
+ CPWL_Note_CloseBox* m_pCloseBox;
+ CPWL_Note_LBBox* m_pLBBox;
+ CPWL_Note_RBBox* m_pRBBox;
+ CPWL_ScrollBar* m_pContentsBar;
+ CPWL_Note_Options* m_pOptions;
+ IPWL_NoteNotify* m_pNoteNotify;
+ FX_BOOL m_bResizing;
+ PWL_SCROLL_INFO m_OldScrollInfo;
+ CPDF_Rect m_rcCaption;
+ FX_BOOL m_bEnalbleNotify;
+ IPopup_Note* m_pPopupNote;
+ IPWL_NoteHandler* m_pNoteHandler;
+ CFX_WideString m_sReplyString;
+};
+
+#endif
+
diff --git a/fpdfsdk/include/pdfwindow/PWL_ScrollBar.h b/fpdfsdk/include/pdfwindow/PWL_ScrollBar.h new file mode 100644 index 0000000000..3196b2209e --- /dev/null +++ b/fpdfsdk/include/pdfwindow/PWL_ScrollBar.h @@ -0,0 +1,166 @@ +// 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 _PWL_SCROLLBAR_H_
+#define _PWL_SCROLLBAR_H_
+
+class CPWL_SBButton;
+class CPWL_ScrollBar;
+
+struct PWL_SCROLL_INFO
+{
+public:
+ PWL_SCROLL_INFO() : fContentMin(0.0f), fContentMax(0.0f), fPlateWidth(0.0f), fBigStep(0.0f), fSmallStep(0.0f)
+ {
+ }
+ FX_FLOAT fContentMin;
+ FX_FLOAT fContentMax;
+ FX_FLOAT fPlateWidth;
+ FX_FLOAT fBigStep;
+ FX_FLOAT fSmallStep;
+};
+
+enum PWL_SCROLLBAR_TYPE
+{
+ SBT_HSCROLL,
+ SBT_VSCROLL
+};
+
+enum PWL_SBBUTTON_TYPE
+{
+ PSBT_MIN,
+ PSBT_MAX,
+ PSBT_POS
+};
+
+class CPWL_SBButton : public CPWL_Wnd
+{
+public:
+ CPWL_SBButton(PWL_SCROLLBAR_TYPE eScrollBarType,PWL_SBBUTTON_TYPE eButtonType);
+ virtual ~CPWL_SBButton();
+
+public:
+ virtual CFX_ByteString GetClassName() const;
+ virtual void OnCreate(PWL_CREATEPARAM & cp);
+ virtual void GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream);
+ virtual void DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);
+ virtual FX_BOOL OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual FX_BOOL OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual FX_BOOL OnMouseMove(const CPDF_Point & point, FX_DWORD nFlag);
+
+protected:
+ PWL_SCROLLBAR_TYPE m_eScrollBarType;
+ PWL_SBBUTTON_TYPE m_eSBButtonType;
+
+ FX_BOOL m_bMouseDown;
+};
+
+struct PWL_FLOATRANGE
+{
+public:
+ PWL_FLOATRANGE();
+ PWL_FLOATRANGE(FX_FLOAT min,FX_FLOAT max);
+ void Default();
+ void Set(FX_FLOAT min,FX_FLOAT max);
+ FX_BOOL In(FX_FLOAT x) const;
+ FX_FLOAT GetWidth() const;
+
+ FX_FLOAT fMin,fMax;
+};
+
+struct PWL_SCROLL_PRIVATEDATA
+{
+public:
+ PWL_SCROLL_PRIVATEDATA();
+
+ void Default();
+ void SetScrollRange(FX_FLOAT min,FX_FLOAT max);
+ void SetClientWidth(FX_FLOAT width);
+ void SetSmallStep(FX_FLOAT step);
+ void SetBigStep(FX_FLOAT step);
+ FX_BOOL SetPos(FX_FLOAT pos);
+
+ void AddSmall();
+ void SubSmall();
+ void AddBig();
+ void SubBig();
+
+ PWL_FLOATRANGE ScrollRange;
+ FX_FLOAT fClientWidth;
+ FX_FLOAT fScrollPos;
+ FX_FLOAT fBigStep;
+ FX_FLOAT fSmallStep;
+};
+
+class CPWL_ScrollBar : public CPWL_Wnd
+{
+public:
+ CPWL_ScrollBar(PWL_SCROLLBAR_TYPE sbType = SBT_HSCROLL);
+ virtual ~CPWL_ScrollBar();
+
+public:
+ virtual CFX_ByteString GetClassName() const;
+ virtual void OnCreate(PWL_CREATEPARAM & cp);
+ virtual void RePosChildWnd();
+ virtual void GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream);
+ virtual void DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);
+
+ virtual FX_BOOL OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual FX_BOOL OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual void OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam = 0, FX_INTPTR lParam = 0);
+
+ virtual void CreateChildWnd(const PWL_CREATEPARAM & cp);
+
+ FX_FLOAT GetScrollBarWidth() const;
+ PWL_SCROLLBAR_TYPE GetScrollBarType() const {return m_sbType;};
+
+ void SetNotifyForever(FX_BOOL bForever) {m_bNotifyForever = bForever;}
+
+protected:
+ void SetScrollRange(FX_FLOAT fMin,FX_FLOAT fMax,FX_FLOAT fClientWidth);
+ void SetScrollPos(FX_FLOAT fPos);
+ void MovePosButton(FX_BOOL bRefresh);
+ void SetScrollStep(FX_FLOAT fBigStep,FX_FLOAT fSmallStep);
+ void NotifyScrollWindow();
+ CPDF_Rect GetScrollArea() const;
+
+private:
+ void CreateButtons(const PWL_CREATEPARAM & cp);
+
+ void OnMinButtonLBDown(const CPDF_Point & point);
+ void OnMinButtonLBUp(const CPDF_Point & point);
+ void OnMinButtonMouseMove(const CPDF_Point & point);
+
+ void OnMaxButtonLBDown(const CPDF_Point & point);
+ void OnMaxButtonLBUp(const CPDF_Point & point);
+ void OnMaxButtonMouseMove(const CPDF_Point & point);
+
+ void OnPosButtonLBDown(const CPDF_Point & point);
+ void OnPosButtonLBUp(const CPDF_Point & point);
+ void OnPosButtonMouseMove(const CPDF_Point & point);
+
+ FX_FLOAT TrueToFace(FX_FLOAT);
+ FX_FLOAT FaceToTrue(FX_FLOAT);
+
+ virtual void TimerProc();
+
+private:
+ PWL_SCROLLBAR_TYPE m_sbType;
+ PWL_SCROLL_INFO m_OriginInfo;
+ CPWL_SBButton* m_pMinButton;
+ CPWL_SBButton* m_pMaxButton;
+ CPWL_SBButton* m_pPosButton;
+ PWL_SCROLL_PRIVATEDATA m_sData;
+ FX_BOOL m_bMouseDown;
+ FX_BOOL m_bMinOrMax;
+ FX_BOOL m_bNotifyForever;
+ FX_FLOAT m_nOldPos;
+ FX_FLOAT m_fOldPosButton;
+};
+
+#endif // !defined(AFX_PWL_SCROLLBAR_H__DCFEC082_2651_48A4_B8F3_63F1B3CC5E10__INCLUDED_)
+
+
diff --git a/fpdfsdk/include/pdfwindow/PWL_Signature.h b/fpdfsdk/include/pdfwindow/PWL_Signature.h new file mode 100644 index 0000000000..712f7408ea --- /dev/null +++ b/fpdfsdk/include/pdfwindow/PWL_Signature.h @@ -0,0 +1,67 @@ +// 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 _PWL_SIGNATURE_H_
+#define _PWL_SIGNATURE_H_
+
+class CPWL_Signature;
+class CPWL_Label;
+class CPWL_Signature_Image;
+
+class CPWL_Signature_Image : public CPWL_Image
+{
+public:
+ CPWL_Signature_Image();
+ virtual ~CPWL_Signature_Image();
+
+ void SetImage(CFX_DIBSource* pImage);
+ CFX_DIBSource* GetImage();
+
+protected:
+ virtual void DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);
+ virtual void GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream);
+
+ virtual void GetScale(FX_FLOAT & fHScale,FX_FLOAT & fVScale);
+
+private:
+ CFX_DIBSource* m_pImage;
+};
+
+class PWL_CLASS CPWL_Signature : public CPWL_Wnd
+{
+public:
+ CPWL_Signature();
+ virtual ~CPWL_Signature();
+
+ void SetText(FX_LPCWSTR sText);
+ void SetDescription(FX_LPCWSTR string);
+ void SetImage(CFX_DIBSource* pImage);
+ void SetImageStream(CPDF_Stream * pStream, FX_LPCSTR sImageAlias);
+
+ void SetTextFlag(FX_BOOL bTextExist);
+ void SetImageFlag(FX_BOOL bImageExist);
+ void SetFoxitFlag(FX_BOOL bFlagExist);
+
+protected:
+ virtual void RePosChildWnd();
+ virtual void CreateChildWnd(const PWL_CREATEPARAM & cp);
+
+ virtual void DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);
+ virtual void GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream);
+
+private:
+ CPWL_Label* m_pText;
+ CPWL_Label* m_pDescription;
+ CPWL_Signature_Image* m_pImage;
+
+ FX_BOOL m_bTextExist;
+ FX_BOOL m_bImageExist;
+ FX_BOOL m_bFlagExist;
+};
+
+#endif // _PWL_SIGNATURE_H_
+
+
diff --git a/fpdfsdk/include/pdfwindow/PWL_SpecialButton.h b/fpdfsdk/include/pdfwindow/PWL_SpecialButton.h new file mode 100644 index 0000000000..55613014a0 --- /dev/null +++ b/fpdfsdk/include/pdfwindow/PWL_SpecialButton.h @@ -0,0 +1,63 @@ +// 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 _PWL_SPECIALBUTTON_H_
+#define _PWL_SPECIALBUTTON_H_
+
+#if _MSC_VER > 1000
+#pragma once
+#endif // _MSC_VER > 1000
+
+class PWL_CLASS CPWL_PushButton : public CPWL_Button
+{
+public:
+ CPWL_PushButton();
+ virtual ~CPWL_PushButton();
+
+public:
+ virtual CFX_ByteString GetClassName() const;
+ virtual CPDF_Rect GetFocusRect() const;
+};
+
+class PWL_CLASS CPWL_CheckBox : public CPWL_Button
+{
+public:
+ CPWL_CheckBox();
+ virtual ~CPWL_CheckBox();
+
+public:
+ virtual CFX_ByteString GetClassName() const;
+ virtual FX_BOOL OnLButtonUp(const CPDF_Point & point);
+ virtual FX_BOOL OnChar(FX_WORD nChar);
+
+ void SetCheck(FX_BOOL bCheck);
+ FX_BOOL IsChecked() const;
+
+private:
+ FX_BOOL m_bChecked;
+};
+
+class PWL_CLASS CPWL_RadioButton : public CPWL_Button
+{
+public:
+ CPWL_RadioButton();
+ virtual ~CPWL_RadioButton();
+
+public:
+ virtual CFX_ByteString GetClassName() const;
+ virtual FX_BOOL OnLButtonUp(const CPDF_Point & point);
+ virtual FX_BOOL OnChar(FX_WORD nChar);
+
+ void SetCheck(FX_BOOL bCheck);
+ FX_BOOL IsChecked() const;
+
+private:
+ FX_BOOL m_bChecked;
+};
+
+#endif
+
+
diff --git a/fpdfsdk/include/pdfwindow/PWL_Utils.h b/fpdfsdk/include/pdfwindow/PWL_Utils.h new file mode 100644 index 0000000000..2eccc363fd --- /dev/null +++ b/fpdfsdk/include/pdfwindow/PWL_Utils.h @@ -0,0 +1,237 @@ +// 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 _PWL_UTILS_H_
+#define _PWL_UTILS_H_
+
+template<class T> T PWL_MIN (const T & i, const T & j) { return ((i < j) ? i : j); }
+template<class T> T PWL_MAX (const T & i, const T & j) { return ((i > j) ? i : j); }
+
+#define PWL_PDF2WIN(color) (FX_BYTE(color*255))
+#define PWL_WIN2PDF(color) ((FX_FLOAT)((FX_FLOAT)color/255.0f))
+
+#define PWL_MAKEDWORD(low,high) ((FX_DWORD)((FX_WORD)(low) | (FX_DWORD)(((FX_WORD)(high))<<16)))
+#define PWL_GETLOWWORD(dword) ((FX_WORD)(dword))
+#define PWL_GETHIGHWORD(dword) ((FX_WORD)(dword>>16))
+
+#define PWL_ICONTYPE_CHECKMARK 0
+#define PWL_ICONTYPE_CIRCLE 1
+#define PWL_ICONTYPE_COMMENT 2
+#define PWL_ICONTYPE_CROSS 3
+#define PWL_ICONTYPE_HELP 4
+#define PWL_ICONTYPE_INSERTTEXT 5
+#define PWL_ICONTYPE_KEY 6
+#define PWL_ICONTYPE_NEWPARAGRAPH 7
+#define PWL_ICONTYPE_TEXTNOTE 8
+#define PWL_ICONTYPE_PARAGRAPH 9
+#define PWL_ICONTYPE_RIGHTARROW 10
+#define PWL_ICONTYPE_RIGHTPOINTER 11
+#define PWL_ICONTYPE_STAR 12
+#define PWL_ICONTYPE_UPARROW 13
+#define PWL_ICONTYPE_UPLEFTARROW 14
+
+#define PWL_ICONTYPE_GRAPH 15
+#define PWL_ICONTYPE_PAPERCLIP 16
+#define PWL_ICONTYPE_ATTACHMENT 17
+#define PWL_ICONTYPE_TAG 18
+
+#define PWL_ICONTYPE_FOXIT 19
+
+#define PWL_ICONTYPE_UNKNOWN -1
+
+//checkbox & radiobutton style
+#define PCS_CHECK 0
+#define PCS_CIRCLE 1
+#define PCS_CROSS 2
+#define PCS_DIAMOND 3
+#define PCS_SQUARE 4
+#define PCS_STAR 5
+
+#define PWL_PI 3.14159265358979f
+#define PWL_BEZIER 0.5522847498308f
+
+//pushbutton layout style
+#define PPBL_LABEL 0
+#define PPBL_ICON 1
+#define PPBL_ICONTOPLABELBOTTOM 2
+#define PPBL_LABELTOPICONBOTTOM 3
+#define PPBL_ICONLEFTLABELRIGHT 4
+#define PPBL_LABELLEFTICONRIGHT 5
+#define PPBL_LABELOVERICON 6
+
+class CPWL_Point : public CPDF_Point
+{
+public:
+ CPWL_Point() : CPDF_Point(0.0f,0.0f){}
+ CPWL_Point(FX_FLOAT fx, FX_FLOAT fy) : CPDF_Point(fx,fy) {}
+ CPWL_Point(const CPWL_Point& point) : CPDF_Point(point.x, point.y) {}
+};
+
+enum PWL_PATHDATA_TYPE
+{
+ PWLPT_MOVETO,
+ PWLPT_LINETO,
+ PWLPT_BEZIERTO,
+ PWLPT_UNKNOWN
+};
+
+enum PWL_PATH_TYPE
+{
+ PWLPT_PATHDATA,
+ PWLPT_STREAM
+};
+
+class CPWL_PathData
+{
+public:
+ CPWL_PathData() : point(), type(PWLPT_UNKNOWN){}
+ CPWL_PathData(const CPWL_Point& pt, PWL_PATHDATA_TYPE tp) : point(pt), type(tp) {}
+
+ CPWL_Point point;
+ PWL_PATHDATA_TYPE type;
+};
+
+class IPWL_SpellCheck;
+
+class PWL_CLASS CPWL_Utils
+{
+public:
+ static CPDF_Rect InflateRect(const CPDF_Rect& rcRect, FX_FLOAT fSize);
+ static CPDF_Rect DeflateRect(const CPDF_Rect& rcRect, FX_FLOAT fSize);
+ static FX_BOOL IntersectRect(const CPDF_Rect& rect1, const CPDF_Rect& rect2);
+ static FX_BOOL ContainsRect(const CPDF_Rect& rcParent, const CPDF_Rect& rcChild);
+ static CPDF_Rect ScaleRect(const CPDF_Rect& rcRect,FX_FLOAT fScale);
+ static CPVT_WordRange OverlapWordRange(const CPVT_WordRange& wr1, const CPVT_WordRange& wr2);
+ static CPDF_Rect GetCenterSquare(const CPDF_Rect & rect);
+ static CPWL_Color SubstractColor(const CPWL_Color & sColor,FX_FLOAT fColorSub);
+ static CPWL_Color DevideColor(const CPWL_Color & sColor,FX_FLOAT fColorDevide);
+ static CPDF_Rect MaxRect(const CPDF_Rect & rect1,const CPDF_Rect & rect2);
+ static CPDF_Rect OffsetRect(const CPDF_Rect & rect,FX_FLOAT x,FX_FLOAT y);
+ static CPDF_Point OffsetPoint(const CPDF_Point & point,FX_FLOAT x,FX_FLOAT y);
+ static FX_COLORREF PWLColorToFXColor(const CPWL_Color& color, FX_INT32 nTransparancy = 255);
+ static FX_BOOL IsBlackOrWhite(const CPWL_Color& color);
+ static CPWL_Color GetReverseColor(const CPWL_Color& color);
+
+ static CFX_ByteString GetColorAppStream(const CPWL_Color & color,const FX_BOOL & bFillOrStroke = TRUE);
+ static CFX_ByteString GetBorderAppStream(const CPDF_Rect & rect, FX_FLOAT fWidth,
+ const CPWL_Color & color, const CPWL_Color & crLeftTop, const CPWL_Color & crRightBottom,
+ FX_INT32 nStyle, const CPWL_Dash & dash);
+ static CFX_ByteString GetCircleBorderAppStream(const CPDF_Rect & rect, FX_FLOAT fWidth,
+ const CPWL_Color & color, const CPWL_Color & crLeftTop, const CPWL_Color & crRightBottom,
+ FX_INT32 nStyle, const CPWL_Dash & dash);
+ static CFX_ByteString GetRectFillAppStream(const CPDF_Rect & rect,const CPWL_Color & color);
+ static CFX_ByteString GetCircleFillAppStream(const CPDF_Rect & rect,const CPWL_Color & color);
+
+ static CFX_ByteString GetPushButtonAppStream(const CPDF_Rect & rcBBox,
+ IFX_Edit_FontMap * pFontMap,
+ CPDF_Stream * pIconStream,
+ CPDF_IconFit & IconFit,
+ const CFX_WideString & sLabel,
+ const CPWL_Color & crText,
+ FX_FLOAT fFontSize,
+ FX_INT32 nLayOut);
+ static CFX_ByteString GetCheckBoxAppStream(const CPDF_Rect & rcBBox,
+ FX_INT32 nStyle,
+ const CPWL_Color & crText);
+ static CFX_ByteString GetRadioButtonAppStream(const CPDF_Rect & rcBBox,
+ FX_INT32 nStyle,
+ const CPWL_Color & crText);
+
+ static CFX_ByteString GetEditAppStream(IFX_Edit* pEdit, const CPDF_Point & ptOffset, const CPVT_WordRange * pRange = NULL,
+ FX_BOOL bContinuous = TRUE, FX_WORD SubWord = 0);
+ static CFX_ByteString GetEditSelAppStream(IFX_Edit* pEdit, const CPDF_Point & ptOffset,
+ const CPVT_WordRange * pRange = NULL);
+ static CFX_ByteString GetSpellCheckAppStream(IFX_Edit* pEdit, IPWL_SpellCheck* pSpellCheck,
+ const CPDF_Point & ptOffset,
+ const CPVT_WordRange * pRange = NULL);
+ static CFX_ByteString GetTextAppStream(const CPDF_Rect & rcBBox,IFX_Edit_FontMap * pFontMap,
+ const CFX_WideString & sText, FX_INT32 nAlignmentH, FX_INT32 nAlignmentV,
+ FX_FLOAT fFontSize, FX_BOOL bMultiLine, FX_BOOL bAutoReturn, const CPWL_Color & crText);
+ static CFX_ByteString GetDropButtonAppStream(const CPDF_Rect & rcBBox);
+
+ static void DrawFillRect(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,const CPDF_Rect & rect,
+ const CPWL_Color & color, FX_INT32 nTransparancy);
+ static void DrawFillRect(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
+ const CPDF_Rect & rect,const FX_COLORREF & color);
+ static void DrawStrokeRect(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,const CPDF_Rect & rect,
+ const FX_COLORREF & color, FX_FLOAT fWidth);
+ static void DrawStrokeLine(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
+ const CPDF_Point & ptMoveTo, const CPDF_Point & ptLineTo, const FX_COLORREF & color, FX_FLOAT fWidth);
+ static void DrawBorder(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
+ const CPDF_Rect & rect, FX_FLOAT fWidth,
+ const CPWL_Color & color, const CPWL_Color & crLeftTop, const CPWL_Color & crRightBottom,
+ FX_INT32 nStyle, const CPWL_Dash & dash, FX_INT32 nTransparancy);
+ static void DrawFillArea(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
+ const CPDF_Point* pPts, FX_INT32 nCount, const FX_COLORREF& color);
+ static void DrawShadow(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
+ FX_BOOL bVertical, FX_BOOL bHorizontal, CPDF_Rect rect,
+ FX_INT32 nTransparancy, FX_INT32 nStartGray, FX_INT32 nEndGray);
+ static void DrawEditSpellCheck(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device, IFX_Edit* pEdit,
+ const CPDF_Rect& rcClip, const CPDF_Point& ptOffset, const CPVT_WordRange* pRange,
+ IPWL_SpellCheck* pSpellCheck);
+public:
+ static void ConvertCMYK2RGB(FX_FLOAT dC,FX_FLOAT dM,FX_FLOAT dY,FX_FLOAT dK,FX_FLOAT &dR,FX_FLOAT &dG,FX_FLOAT &dB);
+ static void ConvertRGB2CMYK(FX_FLOAT dR,FX_FLOAT dG,FX_FLOAT dB,FX_FLOAT &dC,FX_FLOAT &dM,FX_FLOAT &dY,FX_FLOAT &dK);
+
+ static void ConvertRGB2GRAY(FX_FLOAT dR,FX_FLOAT dG,FX_FLOAT dB,FX_FLOAT &dGray);
+ static void ConvertGRAY2RGB(FX_FLOAT dGray,FX_FLOAT &dR,FX_FLOAT &dG,FX_FLOAT &dB);
+
+ static void ConvertCMYK2GRAY(FX_FLOAT dC,FX_FLOAT dM,FX_FLOAT dY,FX_FLOAT dK,FX_FLOAT &dGray);
+ static void ConvertGRAY2CMYK(FX_FLOAT dGray,FX_FLOAT &dC,FX_FLOAT &dM,FX_FLOAT &dY,FX_FLOAT &dK);
+
+ static void PWLColorToARGB(const CPWL_Color& color, FX_INT32& alpha, FX_FLOAT& red, FX_FLOAT& green, FX_FLOAT& blue);
+
+public:
+ static CFX_ByteString GetIconAppStream(FX_INT32 nType, const CPDF_Rect& rect, const CPWL_Color& crFill,
+ const CPWL_Color& crStroke = PWL_DEFAULT_BLACKCOLOR);
+ static void DrawIconAppStream(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
+ FX_INT32 nType, const CPDF_Rect & rect, const CPWL_Color& crFill,
+ const CPWL_Color& crStroke, const FX_INT32 nTransparancy);
+
+private:
+ static CFX_ByteString GetAppStreamFromArray(const CPWL_PathData* pPathData, FX_INT32 nCount);
+ static void GetPathDataFromArray(CFX_PathData& path, const CPWL_PathData* pPathData, FX_INT32 nCount);
+
+ static CFX_ByteString GetAppStream_Check(const CPDF_Rect & rcBBox, const CPWL_Color & crText);
+ static CFX_ByteString GetAppStream_Circle(const CPDF_Rect & rcBBox, const CPWL_Color & crText);
+ static CFX_ByteString GetAppStream_Cross(const CPDF_Rect & rcBBox, const CPWL_Color & crText);
+ static CFX_ByteString GetAppStream_Diamond(const CPDF_Rect & rcBBox, const CPWL_Color & crText);
+ static CFX_ByteString GetAppStream_Square(const CPDF_Rect & rcBBox, const CPWL_Color & crText);
+ static CFX_ByteString GetAppStream_Star(const CPDF_Rect & rcBBox, const CPWL_Color & crText);
+
+ static CFX_ByteString GetAP_Check(const CPDF_Rect & crBBox);
+ static CFX_ByteString GetAP_Circle(const CPDF_Rect & crBBox);
+ static CFX_ByteString GetAP_Cross(const CPDF_Rect & crBBox);
+ static CFX_ByteString GetAP_Diamond(const CPDF_Rect & crBBox);
+ static CFX_ByteString GetAP_Square(const CPDF_Rect & crBBox);
+ static CFX_ByteString GetAP_Star(const CPDF_Rect & crBBox);
+ static CFX_ByteString GetAP_HalfCircle(const CPDF_Rect & crBBox,FX_FLOAT fRotate);
+
+ static void GetGraphics_Checkmark(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);
+ static void GetGraphics_Circle(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);
+ static void GetGraphics_Comment(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);
+ static void GetGraphics_Cross(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);
+ static void GetGraphics_Help(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);
+ static void GetGraphics_InsertText(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);
+ static void GetGraphics_Key(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);
+ static void GetGraphics_NewParagraph(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);
+ static void GetGraphics_TextNote(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);
+ static void GetGraphics_Paragraph(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);
+ static void GetGraphics_RightArrow(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);
+ static void GetGraphics_RightPointer(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);
+ static void GetGraphics_Star(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);
+ static void GetGraphics_UpArrow(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);
+ static void GetGraphics_UpLeftArrow(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);
+ static void GetGraphics_Graph(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);
+ static void GetGraphics_Paperclip(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);
+ static void GetGraphics_Attachment(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);
+ static void GetGraphics_Tag(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);
+ static void GetGraphics_Foxit(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);
+};
+
+#endif // !defined(AFX_PWL_UTILS_H__D32812AD_A875_4E08_9D3C_0A57020987C6__INCLUDED_)
+
+
diff --git a/fpdfsdk/include/pdfwindow/PWL_Wnd.h b/fpdfsdk/include/pdfwindow/PWL_Wnd.h new file mode 100644 index 0000000000..7e9e25d07a --- /dev/null +++ b/fpdfsdk/include/pdfwindow/PWL_Wnd.h @@ -0,0 +1,493 @@ +// 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 _PWL_WND_H_
+#define _PWL_WND_H_
+
+class IPWL_Provider;
+class CPWL_Wnd;
+class CPWL_MsgControl;
+class CPWL_Wnd;
+class CPWL_ScrollBar;
+class CPWL_Timer;
+class CPWL_TimerHandler;
+class IPWL_SpellCheck;
+class IFX_SystemHandler;
+
+#ifdef FX_READER_DLL
+ #ifdef PWL_EXPORT
+ #define PWL_CLASS __declspec(dllexport)
+ #define PWL_FUNCTION PWL_CLASS
+ #else
+ #define PWL_CLASS
+ #define PWL_FUNCTION
+ #endif
+#else
+ #define PWL_CLASS
+ #define PWL_FUNCTION
+#endif
+
+//window styles
+#define PWS_CHILD 0x80000000L
+#define PWS_BORDER 0x40000000L
+#define PWS_BACKGROUND 0x20000000L
+#define PWS_HSCROLL 0x10000000L
+#define PWS_VSCROLL 0x08000000L
+#define PWS_VISIBLE 0x04000000L
+#define PWS_DISABLE 0x02000000L
+#define PWS_READONLY 0x01000000L
+#define PWS_AUTOFONTSIZE 0x00800000L
+#define PWS_AUTOTRANSPARENT 0x00400000L
+#define PWS_NOREFRESHCLIP 0x00200000L
+
+//edit and label styles
+#define PES_MULTILINE 0x0001L
+#define PES_PASSWORD 0x0002L
+#define PES_LEFT 0x0004L
+#define PES_RIGHT 0x0008L
+#define PES_MIDDLE 0x0010L
+#define PES_TOP 0x0020L
+#define PES_BOTTOM 0x0040L
+#define PES_CENTER 0x0080L
+#define PES_CHARARRAY 0x0100L
+#define PES_AUTOSCROLL 0x0200L
+#define PES_AUTORETURN 0x0400L
+#define PES_UNDO 0x0800L
+#define PES_RICH 0x1000L
+#define PES_SPELLCHECK 0x2000L
+#define PES_TEXTOVERFLOW 0x4000L
+#define PES_NOREAD 0x8000L
+
+//listbox styles
+#define PLBS_MULTIPLESEL 0x0001L
+#define PLBS_HOVERSEL 0x0008L
+
+//combobox styles
+#define PCBS_ALLOWCUSTOMTEXT 0x0001L
+
+//richedit styles
+#define PRES_MULTILINE 0x0001L
+#define PRES_AUTORETURN 0x0002L
+#define PRES_AUTOSCROLL 0x0004L
+#define PRES_SPELLCHECK 0x0008L
+#define PRES_UNDO 0x0100L
+#define PRES_MULTIPAGES 0x0200L
+#define PRES_TEXTOVERFLOW 0x0400L
+
+//border style
+#define PBS_SOLID 0
+#define PBS_DASH 1
+#define PBS_BEVELED 2
+#define PBS_INSET 3
+#define PBS_UNDERLINED 4
+#define PBS_SHADOW 5
+
+//notification messages
+#define PNM_ADDCHILD 0x00000000L
+#define PNM_REMOVECHILD 0x00000001L
+#define PNM_SETSCROLLINFO 0x00000002L
+#define PNM_SETSCROLLPOS 0x00000003L
+#define PNM_SCROLLWINDOW 0x00000004L
+#define PNM_LBUTTONDOWN 0x00000005L
+#define PNM_LBUTTONUP 0x00000006L
+#define PNM_MOUSEMOVE 0x00000007L
+#define PNM_NOTERESET 0x00000008L
+#define PNM_SETCARETINFO 0x00000009L
+#define PNM_SELCHANGED 0x0000000AL
+#define PNM_NOTEEDITCHANGED 0x0000000BL
+
+#define PWL_CLASSNAME_EDIT "CPWL_Edit"
+
+struct CPWL_Dash
+{
+ CPWL_Dash(FX_INT32 dash, FX_INT32 gap, FX_INT32 phase) : nDash(dash), nGap(gap), nPhase(phase)
+ {}
+
+ FX_INT32 nDash;
+ FX_INT32 nGap;
+ FX_INT32 nPhase;
+};
+
+struct PWL_CLASS CPWL_Color
+{
+ CPWL_Color(FX_INT32 type = COLORTYPE_TRANSPARENT, FX_FLOAT color1 = 0.0f, FX_FLOAT color2 = 0.0f, FX_FLOAT color3 = 0.0f, FX_FLOAT color4 = 0.0f)
+ : nColorType(type), fColor1(color1), fColor2(color2), fColor3(color3), fColor4(color4)
+ {}
+
+ CPWL_Color(FX_INT32 r, FX_INT32 g, FX_INT32 b) :
+ nColorType(COLORTYPE_RGB), fColor1(r/255.0f), fColor2(g/255.0f), fColor3(b/255.0f), fColor4(0)
+ {}
+
+ void ConvertColorType(FX_INT32 nColorType);
+
+ /*
+ COLORTYPE_TRANSPARENT
+ COLORTYPE_RGB
+ COLORTYPE_CMYK
+ COLORTYPE_GRAY
+ */
+ FX_INT32 nColorType;
+ FX_FLOAT fColor1,fColor2,fColor3,fColor4;
+};
+
+inline FX_BOOL operator == (const CPWL_Color &c1, const CPWL_Color &c2)
+{
+ return c1.nColorType == c2.nColorType &&
+ c1.fColor1 - c2.fColor1 < 0.0001 && c1.fColor1 - c2.fColor1 > -0.0001 &&
+ c1.fColor2 - c2.fColor2 < 0.0001 && c1.fColor2 - c2.fColor2 > -0.0001 &&
+ c1.fColor3 - c2.fColor3 < 0.0001 && c1.fColor3 - c2.fColor3 > -0.0001 &&
+ c1.fColor4 - c2.fColor4 < 0.0001 && c1.fColor4 - c2.fColor4 > -0.0001;
+}
+
+inline FX_BOOL operator != (const CPWL_Color &c1, const CPWL_Color &c2)
+{
+ return !operator == (c1, c2);
+}
+
+#define PWL_SCROLLBAR_WIDTH 12.0f
+#define PWL_SCROLLBAR_BUTTON_WIDTH 9.0f
+#define PWL_SCROLLBAR_POSBUTTON_MINWIDTH 2.0f
+#define PWL_SCROLLBAR_TRANSPARANCY 150
+#define PWL_SCROLLBAR_BKCOLOR CPWL_Color(COLORTYPE_RGB,220.0f/255.0f,220.0f/255.0f,220.0f/255.0f)
+#define PWL_DEFAULT_SELTEXTCOLOR CPWL_Color(COLORTYPE_RGB,1,1,1)
+#define PWL_DEFAULT_SELBACKCOLOR CPWL_Color(COLORTYPE_RGB,0,51.0f/255.0f,113.0f/255.0f)
+#define PWL_DEFAULT_BACKCOLOR PWL_DEFAULT_SELTEXTCOLOR
+#define PWL_DEFAULT_TEXTCOLOR CPWL_Color(COLORTYPE_RGB,0,0,0)
+#define PWL_DEFAULT_FONTSIZE 9.0f
+#define PWL_DEFAULT_BLACKCOLOR CPWL_Color(COLORTYPE_GRAY,0)
+#define PWL_DEFAULT_WHITECOLOR CPWL_Color(COLORTYPE_GRAY,1)
+#define PWL_DEFAULT_HEAVYGRAYCOLOR CPWL_Color(COLORTYPE_GRAY,0.50)
+#define PWL_DEFAULT_LIGHTGRAYCOLOR CPWL_Color(COLORTYPE_GRAY,0.75)
+#define PWL_TRIANGLE_HALFLEN 2.0f
+#define PWL_CBBUTTON_TRIANGLE_HALFLEN 3.0f
+#define PWL_INVALIDATE_INFLATE 2
+
+class IPWL_SpellCheck
+{
+public:
+ virtual FX_BOOL CheckWord(FX_LPCSTR sWord) = 0;
+ virtual void SuggestWords(FX_LPCSTR sWord, CFX_ByteStringArray & sSuggest) = 0;
+};
+
+class IPWL_Provider
+{
+public:
+ //get a matrix which map user space to CWnd client space
+ virtual CPDF_Matrix GetWindowMatrix(void* pAttachedData) = 0;
+
+ /*
+ 0 L"&Undo\tCtrl+Z"
+ 1 L"&Redo\tCtrl+Shift+Z"
+ 2 L"Cu&t\tCtrl+X"
+ 3 L"&Copy\tCtrl+C"
+ 4 L"&Paste\tCtrl+V"
+ 5 L"&Delete"
+ 6 L"&Select All\tCtrl+A"
+ */
+ virtual CFX_WideString LoadPopupMenuString(FX_INT32 nIndex) = 0;
+};
+
+class IPWL_FocusHandler
+{
+public:
+ virtual void OnSetFocus(CPWL_Wnd* pWnd) = 0;
+ virtual void OnKillFocus(CPWL_Wnd* pWnd) = 0;
+};
+
+struct PWL_CREATEPARAM
+{
+public:
+ PWL_CREATEPARAM() : rcRectWnd(0,0,0,0),
+ pSystemHandler(NULL),
+ pFontMap(NULL),
+ pProvider(NULL),
+ pFocusHandler(NULL),
+ dwFlags(0),
+ sBackgroundColor(),
+ hAttachedWnd(NULL),
+ pSpellCheck(NULL),
+ nBorderStyle(PBS_SOLID),
+ dwBorderWidth(1),
+ sBorderColor(),
+ sTextColor(),
+ sTextStrokeColor(),
+ nTransparency(255),
+ fFontSize(PWL_DEFAULT_FONTSIZE),
+ sDash(3,0,0),
+ pAttachedData(NULL),
+ pParentWnd(NULL),
+ pMsgControl(NULL),
+ eCursorType(FXCT_ARROW),
+ mtChild(1,0,0,1,0,0)
+ {
+ }
+
+ CPDF_Rect rcRectWnd; //required
+ IFX_SystemHandler* pSystemHandler; //required
+ IFX_Edit_FontMap* pFontMap; //required for text window
+ IPWL_Provider* pProvider; //required for self coordinate
+ IPWL_FocusHandler* pFocusHandler; //optional
+ FX_DWORD dwFlags; //optional
+ CPWL_Color sBackgroundColor; //optional
+ FX_HWND hAttachedWnd; //required for no-reader framework
+ IPWL_SpellCheck* pSpellCheck; //required for spellchecking
+ FX_INT32 nBorderStyle; //optional
+ FX_INT32 dwBorderWidth; //optional
+ CPWL_Color sBorderColor; //optional
+ CPWL_Color sTextColor; //optional
+ CPWL_Color sTextStrokeColor; //optional
+ FX_INT32 nTransparency; //optional
+ FX_FLOAT fFontSize; //optional
+ CPWL_Dash sDash; //optional
+ void* pAttachedData; //optional
+ CPWL_Wnd* pParentWnd; //ignore
+ CPWL_MsgControl* pMsgControl; //ignore
+ FX_INT32 eCursorType; //ignore
+ CPDF_Matrix mtChild; //ignore
+};
+
+class CPWL_Timer
+{
+public:
+ CPWL_Timer(CPWL_TimerHandler* pAttached, IFX_SystemHandler* pSystemHandler);
+ virtual ~CPWL_Timer();
+
+ FX_INT32 SetPWLTimer(FX_INT32 nElapse);
+ void KillPWLTimer();
+ static void TimerProc(FX_INT32 idEvent);
+
+private:
+ FX_INT32 m_nTimerID;
+ CPWL_TimerHandler* m_pAttached;
+ IFX_SystemHandler* m_pSystemHandler;
+};
+
+class PWL_CLASS CPWL_TimerHandler
+{
+public:
+ CPWL_TimerHandler();
+ virtual ~CPWL_TimerHandler();
+
+ void BeginTimer(FX_INT32 nElapse);
+ void EndTimer();
+ virtual void TimerProc();
+ virtual IFX_SystemHandler* GetSystemHandler() const = 0;
+
+private:
+ CPWL_Timer* m_pTimer;
+};
+
+class PWL_CLASS CPWL_Wnd : public CPWL_TimerHandler
+{
+ friend class CPWL_MsgControl;
+public:
+ CPWL_Wnd();
+ virtual ~CPWL_Wnd();
+
+ void Create(const PWL_CREATEPARAM & cp);
+ virtual CFX_ByteString GetClassName() const;
+ void Destroy();
+ void Move(const CPDF_Rect & rcNew,FX_BOOL bReset,FX_BOOL bRefresh);
+ virtual void InvalidateRect(CPDF_Rect* pRect = NULL);
+
+ void GetAppearanceStream(CFX_ByteString & sAppStream);
+ void DrawAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);
+
+ virtual FX_BOOL OnKeyDown(FX_WORD nChar, FX_DWORD nFlag);
+ virtual FX_BOOL OnKeyUp(FX_WORD nChar, FX_DWORD nFlag);
+ virtual FX_BOOL OnChar(FX_WORD nChar, FX_DWORD nFlag);
+ virtual FX_BOOL OnLButtonDblClk(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual FX_BOOL OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual FX_BOOL OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual FX_BOOL OnMButtonDblClk(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual FX_BOOL OnMButtonDown(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual FX_BOOL OnMButtonUp(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual FX_BOOL OnRButtonDblClk(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual FX_BOOL OnRButtonDown(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual FX_BOOL OnRButtonUp(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual FX_BOOL OnMouseMove(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual FX_BOOL OnMouseWheel(short zDelta, const CPDF_Point & point, FX_DWORD nFlag);
+
+ virtual void SetFocus();
+ virtual void KillFocus();
+ void SetCapture();
+ void ReleaseCapture();
+
+ virtual void OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam = 0, FX_INTPTR lParam = 0);
+ virtual void SetTextColor(const CPWL_Color & color);
+ virtual void SetTextStrokeColor(const CPWL_Color & color);
+ virtual void SetVisible(FX_BOOL bVisible);
+
+ virtual CPDF_Rect GetFocusRect() const;
+ virtual CPWL_Color GetBackgroundColor() const;
+ virtual CPWL_Color GetBorderColor() const;
+ virtual CPWL_Color GetTextColor() const;
+ virtual CPWL_Color GetTextStrokeColor() const;
+ virtual FX_FLOAT GetFontSize() const;
+ virtual FX_INT32 GetInnerBorderWidth() const;
+ virtual CPWL_Color GetBorderLeftTopColor(FX_INT32 nBorderStyle) const;
+ virtual CPWL_Color GetBorderRightBottomColor(FX_INT32 nBorderStyle) const;
+
+ virtual FX_BOOL IsModified() const {return FALSE;}
+
+ virtual void SetFontSize(FX_FLOAT fFontSize);
+
+ void SetBackgroundColor(const CPWL_Color & color);
+ void SetBorderColor(const CPWL_Color & color);
+ void SetBorderWidth(FX_INT32 nBorderWidth);
+ void SetClipRect(const CPDF_Rect & rect);
+ void SetBorderStyle(FX_INT32 eBorderStyle);
+ void SetBorderDash(const CPWL_Dash & sDash);
+
+ CPDF_Rect GetOriginWindowRect() const;
+ virtual CPDF_Rect GetWindowRect() const;
+ virtual CPDF_Rect GetClientRect() const;
+ CPDF_Point GetCenterPoint() const;
+ CPDF_Rect GetClientCenterSquare() const;
+ CPDF_Rect GetWindowCenterSquare() const;
+ FX_INT32 GetBorderWidth() const;
+ FX_BOOL IsVisible() const {return m_bVisible;}
+ FX_BOOL HasFlag(FX_DWORD dwFlags) const;
+ void AddFlag(FX_DWORD dwFlags);
+ void RemoveFlag(FX_DWORD dwFlags);
+ CPDF_Rect GetClipRect() const;
+ CPWL_Wnd* GetParentWindow() const;
+ FX_INT32 GetBorderStyle() const;
+ CPWL_Dash GetBorderDash() const;
+ void* GetAttachedData() const;
+
+ FX_BOOL WndHitTest(const CPDF_Point & point) const;
+ FX_BOOL ClientHitTest(const CPDF_Point & point) const;
+ FX_BOOL IsCaptureMouse() const;
+
+ const CPWL_Wnd* GetFocused() const;
+ FX_BOOL IsFocused() const;
+ FX_BOOL IsReadOnly() const;
+ CPWL_ScrollBar* GetVScrollBar() const;
+
+ IFX_Edit_FontMap* GetFontMap() const;
+ IPWL_Provider* GetProvider() const;
+ virtual IFX_SystemHandler* GetSystemHandler() const;
+ IPWL_FocusHandler* GetFocusHandler() const;
+
+ FX_INT32 GetTransparency();
+ void SetTransparency(FX_INT32 nTransparency);
+
+ CPDF_Matrix GetChildToRoot() const;
+ CPDF_Matrix GetChildMatrix() const;
+ void SetChildMatrix(const CPDF_Matrix& mt);
+ CPDF_Matrix GetWindowMatrix() const;
+
+ virtual CPDF_Point ChildToParent(const CPDF_Point& point) const;
+ virtual CPDF_Rect ChildToParent(const CPDF_Rect& rect) const;
+ virtual CPDF_Point ParentToChild(const CPDF_Point& point) const;
+ virtual CPDF_Rect ParentToChild(const CPDF_Rect& rect) const;
+
+ //those methods only implemented by listctrl item
+ virtual FX_FLOAT GetItemHeight(FX_FLOAT fLimitWidth) {return 0;}
+ virtual FX_FLOAT GetItemLeftMargin() {return 0;}
+ virtual FX_FLOAT GetItemRightMargin() {return 0;}
+
+ void EnableWindow(FX_BOOL bEnable);
+ FX_BOOL IsEnabled();
+ virtual void SetCursor();
+
+protected:
+ virtual void CreateChildWnd(const PWL_CREATEPARAM & cp);
+ virtual void RePosChildWnd();
+ void GetAppearanceStream(CFX_ByteTextBuf & sAppStream);
+ virtual void GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream);
+ virtual void GetChildAppearanceStream(CFX_ByteTextBuf & sAppStream);
+
+ virtual void DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);
+ virtual void DrawChildAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);
+
+ virtual void OnCreate(PWL_CREATEPARAM & cp);
+ virtual void OnCreated();
+ virtual void OnDestroy();
+
+ virtual void OnSetFocus();
+ virtual void OnKillFocus();
+
+ virtual void OnEnabled();
+ virtual void OnDisabled();
+
+ void SetNotifyFlag(FX_BOOL bNotifying = TRUE){m_bNotifying = bNotifying;};
+
+ FX_BOOL IsValid() const;
+ PWL_CREATEPARAM GetCreationParam() const;
+ FX_BOOL IsNotifying() const {return m_bNotifying;}
+
+ void InvalidateRectMove(const CPDF_Rect & rcOld, const CPDF_Rect & rcNew);
+
+ void PWLtoWnd(const CPDF_Point & point, FX_INT32& x, FX_INT32& y) const;
+ FX_RECT PWLtoWnd(const CPDF_Rect & rect) const;
+ FX_HWND GetAttachedHWnd() const;
+
+ FX_BOOL IsWndCaptureMouse(const CPWL_Wnd * pWnd) const;
+ FX_BOOL IsWndCaptureKeyboard(const CPWL_Wnd * pWnd) const;
+ const CPWL_Wnd* GetRootWnd() const;
+
+ FX_BOOL IsCTRLpressed(FX_DWORD nFlag) const;
+ FX_BOOL IsSHIFTpressed(FX_DWORD nFlag) const;
+ FX_BOOL IsALTpressed(FX_DWORD nFlag) const;
+ FX_BOOL IsINSERTpressed(FX_DWORD nFlag) const;
+
+private:
+ void AddChild(CPWL_Wnd * pWnd);
+ void RemoveChild(CPWL_Wnd * pWnd);
+
+ void CreateScrollBar(const PWL_CREATEPARAM & cp);
+ void CreateVScrollBar(const PWL_CREATEPARAM & cp);
+
+ void AjustStyle();
+ void CreateMsgControl();
+ void DestroyMsgControl();
+
+ CPWL_MsgControl* GetMsgControl() const;
+
+protected:
+ CFX_ArrayTemplate<CPWL_Wnd*> m_aChildren;
+
+private:
+ PWL_CREATEPARAM m_sPrivateParam;
+
+ CPWL_ScrollBar* m_pVScrollBar;
+
+ CPDF_Rect m_rcWindow;
+ CPDF_Rect m_rcClip;
+
+ FX_BOOL m_bCreated;
+ FX_BOOL m_bVisible;
+ FX_BOOL m_bNotifying;
+ FX_BOOL m_bEnabled;
+};
+
+// #ifndef VK_END
+//
+// #define VK_END 0x23
+// #define VK_HOME 0x24
+// #define VK_LEFT 0x25
+// #define VK_UP 0x26
+// #define VK_RIGHT 0x27
+// #define VK_DOWN 0x28
+// #define VK_INSERT 0x2D
+// #define VK_DELETE 0x2E
+//
+// #define VK_BACK 0x08
+// #define VK_TAB 0x09
+//
+// #define VK_CLEAR 0x0C
+// #define VK_RETURN 0x0D
+// #define VK_ESCAPE 0x1B
+// #define VK_SPACE 0x20
+// #endif
+//
+// #define VK_NONE 0
+
+#endif // !defined(AFX_PWL_WND_H__D32812AD_A875_4E08_9D3C_0A57020987C6__INCLUDED_)
+
+
diff --git a/fpdfsdk/src/formfiller/FFL_CBA_Fontmap.cpp b/fpdfsdk/src/formfiller/FFL_CBA_Fontmap.cpp new file mode 100644 index 0000000000..59617ac09a --- /dev/null +++ b/fpdfsdk/src/formfiller/FFL_CBA_Fontmap.cpp @@ -0,0 +1,300 @@ +// 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 "../../include/formfiller/FormFiller.h"
+#include "../../include/formfiller/FFL_CBA_Fontmap.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")
+{
+ ASSERT(pAnnot != NULL);
+
+ CPDF_Page* pPage = pAnnot->GetPDFPage();
+
+ m_pDocument = pPage->m_pDocument;
+ m_pAnnotDict = pAnnot->GetPDFAnnot()->m_pAnnotDict;
+}
+
+CBA_FontMap::CBA_FontMap(CPDF_Document* pDocument, CPDF_Dictionary* pAnnotDict,
+ IFX_SystemHandler* pSystemHandler) :
+ CPWL_FontMap(pSystemHandler),
+ m_pDocument(pDocument),
+ m_pAnnotDict(pAnnotDict),
+ m_pDefaultFont(NULL),
+ m_sAPType("N")
+{
+}
+
+CBA_FontMap::~CBA_FontMap()
+{
+}
+
+void CBA_FontMap::Reset()
+{
+ Empty();
+ m_pDefaultFont = NULL;
+ m_sDefaultFontName = "";
+}
+
+void CBA_FontMap::Initial(FX_LPCSTR fontname)
+{
+ FX_INT32 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::Initial(fontname);
+}
+
+void CBA_FontMap::SetDefaultFont(CPDF_Font * pFont, const CFX_ByteString & sFontName)
+{
+ ASSERT(pFont != NULL);
+
+ if (m_pDefaultFont) return;
+
+ m_pDefaultFont = pFont;
+ m_sDefaultFontName = sFontName;
+
+// if (m_sDefaultFontName.IsEmpty())
+// m_sDefaultFontName = pFont->GetFontTypeName();
+
+ FX_INT32 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, FX_INT32 nCharset)
+{
+ ASSERT(m_pAnnotDict != NULL);
+
+ if (m_pAnnotDict->GetString("Subtype") == "Widget")
+ {
+ CPDF_Document* pDocument = GetDocument();
+ ASSERT(pDocument != NULL);
+
+ CPDF_Dictionary * pRootDict = pDocument->GetRoot();
+ if (!pRootDict) return NULL;
+
+ CPDF_Dictionary* pAcroFormDict = pRootDict->GetDict("AcroForm");
+ if (!pAcroFormDict) return NULL;
+
+ CPDF_Dictionary * pDRDict = pAcroFormDict->GetDict("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,
+ FX_INT32 nCharset)
+{
+ if (!pResDict) return NULL;
+
+ CPDF_Document* pDocument = GetDocument();
+ ASSERT(pDocument != NULL);
+
+ CPDF_Dictionary* pFonts = pResDict->GetDict("Font");
+ if (pFonts == NULL) return NULL;
+
+ CPDF_Font* pFind = NULL;
+
+ FX_POSITION pos = pFonts->GetStartPos();
+ while (pos)
+ {
+ CPDF_Object* pObj = NULL;
+ CFX_ByteString csKey;
+ pObj = pFonts->GetNextElement(pos, csKey);
+ if (pObj == NULL) continue;
+
+ CPDF_Object* pDirect = pObj->GetDirect();
+ if (pDirect == NULL || pDirect->GetType() != PDFOBJ_DICTIONARY) continue;
+
+ CPDF_Dictionary* pElement = (CPDF_Dictionary*)pDirect;
+ if (pElement->GetString("Type") != "Font") continue;
+
+ CPDF_Font* pFont = pDocument->LoadFont(pElement);
+ if (pFont == NULL) continue;
+ const CFX_SubstFont* pSubst = pFont->GetSubstFont();
+ if (pSubst == NULL) 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;
+
+ ASSERT(m_pAnnotDict != NULL);
+ ASSERT(m_pDocument != NULL);
+
+ CPDF_Dictionary* pAPDict = m_pAnnotDict->GetDict("AP");
+
+ if (pAPDict == NULL)
+ {
+ pAPDict = FX_NEW CPDF_Dictionary;
+ m_pAnnotDict->SetAt("AP", pAPDict);
+ }
+
+ //to avoid checkbox and radiobutton
+ CPDF_Object* pObject = pAPDict->GetElement(m_sAPType);
+ if (pObject && pObject->GetType() == PDFOBJ_DICTIONARY)
+ return;
+
+ CPDF_Stream* pStream = pAPDict->GetStream(m_sAPType);
+ if (pStream == NULL)
+ {
+ pStream = FX_NEW CPDF_Stream(NULL, 0, NULL);
+ FX_INT32 objnum = m_pDocument->AddIndirectObject(pStream);
+ pAPDict->SetAtReference(m_sAPType, m_pDocument, objnum);
+ }
+
+ CPDF_Dictionary * pStreamDict = pStream->GetDict();
+
+ if (!pStreamDict)
+ {
+ pStreamDict = FX_NEW CPDF_Dictionary;
+ pStream->InitStream(NULL, 0, pStreamDict);
+ }
+
+ if (pStreamDict)
+ {
+ CPDF_Dictionary* pStreamResList = pStreamDict->GetDict("Resources");
+ if (!pStreamResList)
+ {
+ pStreamResList = FX_NEW CPDF_Dictionary();
+ pStreamDict->SetAt("Resources", pStreamResList);
+ }
+
+ if (pStreamResList)
+ {
+ CPDF_Dictionary* pStreamResFontList = pStreamResList->GetDict("Font");
+ if (!pStreamResFontList)
+ {
+ pStreamResFontList = FX_NEW CPDF_Dictionary;
+ FX_INT32 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)
+{
+ ASSERT(m_pAnnotDict != NULL);
+ ASSERT(m_pDocument != NULL);
+
+ CPDF_Dictionary* pAcroFormDict = NULL;
+
+ FX_BOOL bWidget = (m_pAnnotDict->GetString("Subtype") == "Widget");
+
+ if (bWidget)
+ {
+ if (CPDF_Dictionary * pRootDict = m_pDocument->GetRoot())
+ pAcroFormDict = pRootDict->GetDict("AcroForm");
+ }
+
+ CFX_ByteString sDA;
+
+ sDA = FPDF_GetFieldAttr(m_pAnnotDict, "DA")->GetString();
+
+ if (bWidget)
+ {
+ if (sDA.IsEmpty())
+ {
+ sDA = FPDF_GetFieldAttr(pAcroFormDict, "DA")->GetString();
+ }
+ }
+
+ CPDF_Dictionary * pFontDict = NULL;
+
+ if (!sDA.IsEmpty())
+ {
+ CPDF_SimpleParser syntax(sDA);
+ syntax.FindTagParam("Tf", 2);
+ CFX_ByteString sFontName = syntax.GetWord();
+ sAlias = PDF_NameDecode(sFontName).Mid(1);
+
+ if (CPDF_Dictionary * pDRDict = m_pAnnotDict->GetDict("DR"))
+ if (CPDF_Dictionary* pDRFontDict = pDRDict->GetDict("Font"))
+ pFontDict = pDRFontDict->GetDict(sAlias);
+
+ if (!pFontDict)
+ if (CPDF_Dictionary* pAPDict = m_pAnnotDict->GetDict("AP"))
+ if (CPDF_Dictionary* pNormalDict = pAPDict->GetDict("N"))
+ if (CPDF_Dictionary* pNormalResDict = pNormalDict->GetDict("Resources"))
+ if (CPDF_Dictionary* pResFontDict = pNormalResDict->GetDict("Font"))
+ pFontDict = pResFontDict->GetDict(sAlias);
+
+ if (bWidget)
+ {
+ if (!pFontDict)
+ {
+ if (pAcroFormDict)
+ {
+ if (CPDF_Dictionary * pDRDict = pAcroFormDict->GetDict("DR"))
+ if (CPDF_Dictionary* pDRFontDict = pDRDict->GetDict("Font"))
+ pFontDict = pDRFontDict->GetDict(sAlias);
+ }
+ }
+ }
+ }
+
+ if (pFontDict)
+ return m_pDocument->LoadFont(pFontDict);
+ else
+ return NULL;
+}
+
+void CBA_FontMap::SetAPType(const CFX_ByteString& sAPType)
+{
+ m_sAPType = sAPType;
+
+ Reset();
+ Initial();
+}
+
diff --git a/fpdfsdk/src/formfiller/FFL_CheckBox.cpp b/fpdfsdk/src/formfiller/FFL_CheckBox.cpp new file mode 100644 index 0000000000..db79926733 --- /dev/null +++ b/fpdfsdk/src/formfiller/FFL_CheckBox.cpp @@ -0,0 +1,144 @@ +// 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 "../../include/formfiller/FormFiller.h"
+#include "../../include/formfiller/FFL_FormFiller.h"
+#include "../../include/formfiller/FFL_CheckBox.h"
+
+
+/* ------------------------------- CFFL_CheckBox ------------------------------- */
+
+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);
+
+ ASSERT(m_pWidget != NULL);
+ 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 != NULL);
+
+ CPDFSDK_PageView* pPageView = pAnnot->GetPageView();
+ ASSERT(pPageView != NULL);
+
+ 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 CPDF_Point& 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());
+ // pWnd->SetCheck(!pWnd->IsChecked());
+ }
+
+ if (!CommitData(pPageView, nFlags)) return FALSE;
+ }
+
+ return TRUE;
+}
+
+FX_BOOL CFFL_CheckBox::IsDataChanged(CPDFSDK_PageView* pPageView)
+{
+
+ ASSERT(m_pWidget != NULL);
+
+ if (CPWL_CheckBox* pWnd = (CPWL_CheckBox*)GetPDFWindow(pPageView, FALSE))
+ {
+ return pWnd->IsChecked() != m_pWidget->IsChecked();
+ }
+
+ return FALSE;
+}
+
+void CFFL_CheckBox::SaveData(CPDFSDK_PageView* pPageView)
+{
+
+ ASSERT(m_pWidget != NULL);
+
+ if (CPWL_CheckBox* pWnd = (CPWL_CheckBox*)GetPDFWindow(pPageView, FALSE))
+ {
+
+ FX_BOOL bNewChecked = pWnd->IsChecked();
+
+
+ if (bNewChecked)
+ {
+ CPDF_FormField* pField = m_pWidget->GetFormField();
+ ASSERT(pField != NULL);
+
+ for (FX_INT32 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 new file mode 100644 index 0000000000..3f2c453e5d --- /dev/null +++ b/fpdfsdk/src/formfiller/FFL_ComboBox.cpp @@ -0,0 +1,442 @@ +// 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 "../../include/formfiller/FormFiller.h"
+#include "../../include/formfiller/FFL_FormFiller.h"
+#include "../../include/formfiller/FFL_IFormFiller.h"
+#include "../../include/formfiller/FFL_CBA_Fontmap.h"
+#include "../../include/formfiller/FFL_ComboBox.h"
+
+
+/* ------------------------------- CFFL_ComboBox ------------------------------- */
+
+CFFL_ComboBox::CFFL_ComboBox(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pAnnot) :
+ CFFL_FormFiller(pApp, pAnnot), m_pFontMap( NULL )
+{
+ //m_pFontMap = new CBA_FontMap( pAnnot, GetSystemHandler() );
+ m_State.nIndex = 0;
+ m_State.nStart = 0;
+ m_State.nEnd = 0;
+}
+
+CFFL_ComboBox::~CFFL_ComboBox()
+{
+ if (m_pFontMap)
+ {
+ delete m_pFontMap;
+ m_pFontMap = NULL;
+ }
+
+// for (int i=0,sz=m_IMBox.GetSize(); i<sz; i++)
+// {
+// delete m_IMBox.GetAt(i);
+// }
+//
+// m_IMBox.RemoveAll();
+}
+
+PWL_CREATEPARAM CFFL_ComboBox::GetCreateParam()
+{
+ PWL_CREATEPARAM cp = CFFL_FormFiller::GetCreateParam();
+
+ ASSERT(m_pWidget != NULL);
+
+ int nFlags = m_pWidget->GetFieldFlags();
+
+ if (nFlags & FIELDFLAG_EDIT)
+ {
+ cp.dwFlags |= PCBS_ALLOWCUSTOMTEXT;
+ }
+
+ /*
+ if (nFlags & FIELDFLAG_COMMITONSELCHANGE)
+ {
+ m_bCommitOnSelectChange = TRUE;
+ }
+ */
+
+ if (!m_pFontMap)
+ {
+ ASSERT(this->m_pApp != NULL);
+ m_pFontMap = new CBA_FontMap(m_pWidget, GetSystemHandler());
+ m_pFontMap->Initial();
+ }
+
+ 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);
+
+ ASSERT(m_pApp != NULL);
+ CFFL_IFormFiller* pFormFiller = m_pApp->GetIFormFiller();
+ pWnd->SetFillerNotify(pFormFiller);
+
+ ASSERT(m_pWidget != NULL);
+ FX_INT32 nCurSel = m_pWidget->GetSelectedIndex(0);
+
+ CFX_WideString swText;
+
+ if (nCurSel < 0)
+ swText = m_pWidget->GetValue();
+ else
+ swText = m_pWidget->GetOptionLabel(nCurSel);
+
+ for (FX_INT32 i=0,sz=m_pWidget->CountOptions(); i<sz; i++)
+ {
+ pWnd->AddString(m_pWidget->GetOptionLabel(i));
+ }
+
+ pWnd->SetSelect(nCurSel);
+ pWnd->SetText(swText);
+
+ 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)
+{
+ if (CPWL_ComboBox * pWnd = (CPWL_ComboBox*)GetPDFWindow(pPageView, FALSE))
+ {
+ FX_INT32 nCurSel = pWnd->GetSelect();
+
+ ASSERT(m_pWidget != NULL);
+
+ if (m_pWidget->GetFieldFlags() & FIELDFLAG_EDIT)
+ {
+ if (nCurSel >= 0)
+ {
+ return nCurSel != m_pWidget->GetSelectedIndex(0);
+ }
+ else
+ {
+ return pWnd->GetText() != m_pWidget->GetValue();
+ }
+ }
+ else
+ {
+ return nCurSel != m_pWidget->GetSelectedIndex(0);
+ }
+ }
+
+ return FALSE;
+}
+
+void CFFL_ComboBox::SaveData(CPDFSDK_PageView* pPageView)
+{
+ ASSERT(m_pWidget != NULL);
+
+ if (CPWL_ComboBox* pWnd = (CPWL_ComboBox*)GetPDFWindow(pPageView, FALSE))
+ {
+ CFX_WideString swText = pWnd->GetText();
+ FX_INT32 nCurSel = pWnd->GetSelect();
+
+ //mantis:0004157
+ FX_BOOL bSetValue = TRUE;
+
+ if (m_pWidget->GetFieldFlags() & FIELDFLAG_EDIT)
+ {
+ if (nCurSel >= 0)
+ {
+ if (swText != m_pWidget->GetOptionLabel(nCurSel))
+ bSetValue = TRUE;
+ else
+ bSetValue = FALSE;
+ }
+ else
+ bSetValue = TRUE;
+ }
+ else
+ bSetValue = FALSE;
+
+ CFX_WideString sOldValue;
+
+
+ if (bSetValue)
+ {
+ sOldValue = m_pWidget->GetValue();
+ 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 = (CPWL_ComboBox*)GetPDFWindow(pPageView, FALSE))
+ {
+ if (CPWL_Edit* pEdit = (CPWL_Edit*)*pComboBox)
+ {
+ 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 = (CPWL_ComboBox*)GetPDFWindow(pPageView, FALSE))
+ {
+ if (CPWL_Edit* pEdit = (CPWL_Edit*)*pComboBox)
+ {
+ fa.sValue = pEdit->GetText();
+ }
+ }
+ break;
+ case CPDF_AAction::LoseFocus:
+ case CPDF_AAction::GetFocus:
+ ASSERT(m_pWidget != NULL);
+ 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 = (CPWL_ComboBox*)GetPDFWindow(pPageView, FALSE))
+ {
+ if (CPWL_Edit* pEdit = (CPWL_Edit*)*pComboBox)
+ {
+ pEdit->SetSel(fa.nSelStart, fa.nSelEnd);
+ pEdit->ReplaceSel(fa.sChange);
+ }
+ }
+ 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 != NULL);
+
+ if (CPWL_ComboBox* pComboBox = (CPWL_ComboBox*)GetPDFWindow(pPageView, FALSE))
+ {
+ m_State.nIndex = pComboBox->GetSelect();
+
+ if (CPWL_Edit* pEdit = (CPWL_Edit*)*pComboBox)
+ {
+ pEdit->GetSel(m_State.nStart, m_State.nEnd);
+ m_State.sValue = pEdit->GetText();
+ }
+ }
+}
+
+void CFFL_ComboBox::RestoreState(CPDFSDK_PageView* pPageView)
+{
+ ASSERT(pPageView != NULL);
+
+ if (CPWL_ComboBox* pComboBox = (CPWL_ComboBox*)GetPDFWindow(pPageView, TRUE))
+ {
+ if (m_State.nIndex >= 0)
+ pComboBox->SetSelect(m_State.nIndex);
+ else
+ {
+ if (CPWL_Edit* pEdit = (CPWL_Edit*)*pComboBox)
+ {
+ pEdit->SetText(m_State.sValue);
+ 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 = this->GetPDFWindow(pPageView, FALSE);
+ }
+ else
+ pRet = this->GetPDFWindow(pPageView, TRUE);
+
+ m_pWidget->UpdateField();
+
+ return pRet;
+}
+
+void CFFL_ComboBox::OnKeyStroke(FX_BOOL bKeyDown, FX_UINT nFlag)
+{
+ ASSERT(m_pWidget != NULL);
+
+ int nFlags = m_pWidget->GetFieldFlags();
+
+ if (nFlags & FIELDFLAG_COMMITONSELCHANGE)
+ {
+ if (m_bValid)
+ {
+ CPDFSDK_PageView* pPageView = this->GetCurPageView();
+ ASSERT(pPageView != NULL);
+
+ if (CommitData(pPageView, nFlag))
+ {
+ DestroyPDFWindow(pPageView);
+ m_bValid = FALSE;
+ }
+ }
+ }
+}
+
+void CFFL_ComboBox::OnSetFocus(CPWL_Wnd* pWnd)
+{
+ ASSERT(m_pApp != NULL);
+
+ ASSERT(pWnd != NULL);
+
+ 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*)(FX_LPCSTR)bsUTFText;
+ m_pApp->FFI_OnSetFieldInputFocus(m_pWidget->GetFormField(), pBuffer, nCharacters, TRUE);
+
+ pEdit->SetEditNotify(this);
+ }
+}
+
+void CFFL_ComboBox::OnKillFocus(CPWL_Wnd* pWnd)
+{
+ ASSERT(m_pApp != NULL);
+}
+
+FX_BOOL CFFL_ComboBox::CanCopy(CPDFSDK_Document* pDocument)
+{
+ ASSERT(pDocument != NULL);
+
+ return FALSE;
+}
+
+FX_BOOL CFFL_ComboBox::CanCut(CPDFSDK_Document* pDocument)
+{
+ ASSERT(pDocument != NULL);
+
+ return FALSE;
+}
+
+FX_BOOL CFFL_ComboBox::CanPaste(CPDFSDK_Document* pDocument)
+{
+ ASSERT(pDocument != NULL);
+
+ return FALSE;
+}
+
+void CFFL_ComboBox::DoCopy(CPDFSDK_Document* pDocument)
+{
+ ASSERT(pDocument != NULL);
+}
+
+void CFFL_ComboBox::DoCut(CPDFSDK_Document* pDocument)
+{
+ ASSERT(pDocument != NULL);
+}
+
+void CFFL_ComboBox::DoPaste(CPDFSDK_Document* pDocument)
+{
+ ASSERT(pDocument != NULL);
+}
+
+void CFFL_ComboBox::OnAddUndo(CPWL_Edit* pEdit)
+{
+ ASSERT(pEdit != NULL);
+}
+
+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 new file mode 100644 index 0000000000..f514bf29d5 --- /dev/null +++ b/fpdfsdk/src/formfiller/FFL_FormFiller.cpp @@ -0,0 +1,925 @@ +// 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 "../../include/formfiller/FFL_FormFiller.h"
+#include "../../include/formfiller/FFL_Notify.h"
+#include "../../include/formfiller/FFL_CBA_Fontmap.h"
+
+#define GetRed(rgb) ((FX_BYTE)(rgb))
+#define GetGreen(rgb) ((FX_BYTE)(((FX_WORD)(rgb)) >> 8))
+#define GetBlue(rgb) ((FX_BYTE)((rgb)>>16))
+
+#define FFL_HINT_ELAPSE 800
+
+/* ------------------------- CFFL_FormFiller ------------------------- */
+
+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()
+{
+ FX_POSITION pos = m_Maps.GetStartPosition();
+ while (pos)
+ {
+ CPDFSDK_PageView * pPageView = NULL;
+ CPWL_Wnd* pWnd = NULL;
+ m_Maps.GetNextAssoc(pos, pPageView, pWnd);
+
+ if (pWnd)
+ {
+ CFFL_PrivateData* pData = (CFFL_PrivateData*)pWnd->GetAttachedData();
+ pWnd->Destroy();
+ delete pWnd;
+ delete pData;
+ }
+ }
+ m_Maps.RemoveAll();
+
+}
+
+void CFFL_FormFiller::SetWindowRect(CPDFSDK_PageView* pPageView, const CPDF_Rect& rcWindow)
+{
+ if (CPWL_Wnd* pWnd = this->GetPDFWindow(pPageView, FALSE))
+ {
+ pWnd->Move(CPDF_Rect(rcWindow), TRUE, FALSE);
+ }
+}
+
+CPDF_Rect CFFL_FormFiller::GetWindowRect(CPDFSDK_PageView* pPageView)
+{
+ if (CPWL_Wnd* pWnd = this->GetPDFWindow(pPageView, FALSE))
+ {
+ return pWnd->GetWindowRect();
+ }
+
+ return CPDF_Rect(0,0,0,0);
+}
+
+FX_RECT CFFL_FormFiller::GetViewBBox(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot)
+{
+ ASSERT(pPageView != NULL);
+ ASSERT(pAnnot != NULL);
+
+ CPDF_Rect rcAnnot = m_pWidget->GetRect();
+
+ if (CPWL_Wnd* pWnd = this->GetPDFWindow(pPageView, FALSE))
+ {
+ CPDF_Rect rcWindow = pWnd->GetWindowRect();
+ rcAnnot = PWLtoFFL(rcWindow);
+ }
+
+ CPDF_Rect rcWin = rcAnnot;
+// pPageView->DocToWindow(rcAnnot, rcWin);
+
+ CPDF_Rect rcFocus = this->GetFocusBox(pPageView);
+ if (!rcFocus.IsEmpty())
+ rcWin.Union(rcFocus);
+
+ CPDF_Rect rect = CPWL_Utils::InflateRect(rcWin,1);
+
+ return rect.GetOutterRect();
+}
+
+void CFFL_FormFiller::OnDraw(CPDFSDK_PageView *pPageView, /*HDC hDC,*/ CPDFSDK_Annot* pAnnot,
+ CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
+ /*const CRect& rcWindow,*/ FX_DWORD dwFlags)
+{
+ ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
+
+ if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE))
+ {
+ CPDF_Matrix mt = this->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, /*HDC hDC,*/ CPDFSDK_Annot* pAnnot,
+ CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
+ /*const CRect& rcWindow,*/ FX_DWORD dwFlags)
+{
+ ASSERT(pAnnot != NULL);
+
+ 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 != NULL);
+}
+
+FX_BOOL CFFL_FormFiller::OnLButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
+{
+ if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, TRUE))
+ {
+ m_bValid = TRUE;
+ FX_RECT rect = this->GetViewBBox(pPageView,pAnnot);
+ this->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 CPDF_Point& point)
+{
+ if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE))
+ {
+ FX_RECT rcFFL = this->GetViewBBox(pPageView, pAnnot);
+ this->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 CPDF_Point& 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 CPDF_Point& 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 CPDF_Point& 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 CPDF_Point& 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 CPDF_Point& point)
+{
+ if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE))
+ {
+ pWnd->OnRButtonUp(WndtoPWL(pPageView, point),nFlags);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CFFL_FormFiller::OnRButtonDblClk(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
+{
+ if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE))
+ {
+ pWnd->OnRButtonDblClk(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 = this->GetCurPageView();
+ ASSERT(pPageView != NULL);
+
+ 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 = this->GetCurPageView();
+ ASSERT(pPageView != NULL);
+
+ if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE))
+ {
+ return pWnd->OnChar(nChar,nFlags);
+ }
+ }
+
+ return FALSE;
+}
+
+void CFFL_FormFiller::OnDeSelected(CPDFSDK_Annot* pAnnot)
+{
+ ASSERT(FALSE);
+}
+
+void CFFL_FormFiller::OnSelected(CPDFSDK_Annot* pAnnot)
+{
+ ASSERT(FALSE);
+}
+
+FX_BOOL CFFL_FormFiller::OnSetFocus(CPDFSDK_Annot* pAnnot, FX_UINT nFlag)
+{
+ CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
+
+ CPDF_Page * pPage = pWidget->GetPDFPage();
+ CPDFSDK_Document * pDoc = m_pApp->GetCurrentDoc();
+ CPDFSDK_PageView* pPageView = pDoc->GetPageView(pPage);
+ ASSERT(pPageView != NULL);
+
+
+
+ CPWL_Wnd * pWnd = NULL;
+ if ( (pWnd = GetPDFWindow(pPageView, TRUE)))
+ {
+ pWnd->SetFocus();
+ }
+
+ m_bValid = TRUE;
+
+
+
+
+ m_bValid = TRUE;
+ FX_RECT rcRect = this->GetViewBBox(pPageView,pAnnot);
+ this->InvalidateRect(rcRect.left, rcRect.top, rcRect.right, rcRect.bottom);
+
+ return TRUE;
+}
+
+FX_BOOL CFFL_FormFiller::OnKillFocus(CPDFSDK_Annot* pAnnot, FX_UINT nFlag)
+{
+ if (IsValid())
+ {
+ CPDFSDK_PageView* pPageView = this->GetCurPageView();
+ ASSERT(pPageView != NULL);
+
+ CommitData(pPageView, nFlag);
+
+ if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, FALSE))
+ {
+ pWnd->KillFocus();
+ }
+
+ switch (m_pWidget->GetFieldType())
+ {
+ case FIELDTYPE_PUSHBUTTON:
+ case FIELDTYPE_CHECKBOX:
+ case FIELDTYPE_RADIOBUTTON:
+ EscapeFiller(pPageView, TRUE);
+ break;
+ default:
+ EscapeFiller(pPageView, FALSE);
+ break;
+ }
+ }
+
+ return TRUE;
+}
+
+FX_BOOL CFFL_FormFiller::IsValid() const
+{
+ return m_bValid;
+}
+
+PWL_CREATEPARAM CFFL_FormFiller::GetCreateParam()
+{
+ ASSERT(m_pApp != NULL);
+
+ PWL_CREATEPARAM cp;
+
+ cp.pParentWnd = NULL;
+ cp.pProvider = this;
+ cp.rcRectWnd = GetPDFWindowRect();
+
+ FX_DWORD dwCreateFlags = PWS_BORDER | PWS_BACKGROUND | PWS_VISIBLE;
+
+ ASSERT(m_pWidget != NULL);
+
+
+ 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 != NULL);
+ ASSERT(m_pWidget != NULL);
+
+ CPWL_Wnd* pWnd = NULL;
+ m_Maps.Lookup(pPageView, pWnd);
+
+ if (bNew)
+ {
+ if (pWnd)
+ {
+ CFFL_PrivateData* pPrivateData = (CFFL_PrivateData*)pWnd->GetAttachedData();
+ ASSERT(pPrivateData != NULL);
+
+ if (pPrivateData->nWidgetAge != m_pWidget->GetAppearanceAge())
+ {
+ return this->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);
+
+ if (pWnd)
+ {
+ m_Maps.SetAt(pPageView, pWnd);
+ }
+ }
+ }
+
+ return pWnd;
+}
+
+void CFFL_FormFiller::DestroyPDFWindow(CPDFSDK_PageView* pPageView)
+{
+ CPWL_Wnd* pWnd = NULL;
+ m_Maps.Lookup(pPageView, pWnd);
+
+ if (pWnd)
+ {
+ CFFL_PrivateData* pData = (CFFL_PrivateData*)pWnd->GetAttachedData();
+ pData->pPageView = NULL;
+ pWnd->Destroy();
+ delete pWnd;
+ delete pData;
+ }
+
+ m_Maps.RemoveKey(pPageView);
+}
+
+CPDF_Matrix CFFL_FormFiller::GetWindowMatrix(void* pAttachedData)
+{
+ if (CFFL_PrivateData* pPrivateData = (CFFL_PrivateData*)pAttachedData)
+ {
+ if (pPrivateData->pPageView)
+ {
+ CPDF_Matrix mtPageView;
+ pPrivateData->pPageView->GetCurrentMatrix(mtPageView);
+ CPDF_Matrix mt = GetCurMatrix();
+ mt.Concat(mtPageView);
+
+ return mt;
+ }
+ }
+ return CPDF_Matrix(1,0,0,1,0,0);
+}
+
+CPDF_Matrix CFFL_FormFiller::GetCurMatrix()
+{
+ CPDF_Matrix mt;
+
+ ASSERT(m_pWidget != NULL);
+
+ CPDF_Rect rcDA ;
+ m_pWidget->GetPDFAnnot()->GetRect(rcDA);
+
+
+ switch (m_pWidget->GetRotate())
+ {
+ default:
+ case 0:
+ mt = CPDF_Matrix(1,0,0,1,0,0);
+ break;
+ case 90:
+ mt = CPDF_Matrix(0,1,-1,0,rcDA.right - rcDA.left,0);
+ break;
+ case 180:
+ mt = CPDF_Matrix(-1,0,0,-1,rcDA.right - rcDA.left,rcDA.top - rcDA.bottom);
+ break;
+ case 270:
+ mt = CPDF_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 != NULL);
+
+ return L"";
+}
+
+CPDF_Rect CFFL_FormFiller::GetPDFWindowRect() const
+{
+ ASSERT(m_pWidget != NULL);
+
+ CPDF_Rect 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 CPDF_Rect(0,0,fHeight,fWidth);
+ else
+ return CPDF_Rect(0,0,fWidth,fHeight);
+}
+
+CPDFSDK_PageView* CFFL_FormFiller::GetCurPageView()
+{
+
+ CPDF_Page* pPage = m_pAnnot->GetPDFPage();
+ CPDFSDK_Document* pSDKDoc = m_pApp->GetCurrentDoc();
+ if(pSDKDoc)
+ {
+ return pSDKDoc->GetPageView(pPage);
+ }
+ return NULL;
+}
+
+CPDF_Rect CFFL_FormFiller::GetFocusBox(CPDFSDK_PageView* pPageView)
+{
+ if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE))
+ {
+ CPDF_Rect rcFocus = FFLtoWnd(pPageView, PWLtoFFL(pWnd->GetFocusRect()));
+ ASSERT(pPageView);
+ CPDF_Rect rcPage = pPageView->GetPDFPage()->GetPageBBox();
+ if(rcPage.Contains(rcFocus))
+ return rcFocus;
+ else
+ return CPDF_Rect(0,0,0,0);
+ }
+ return CPDF_Rect(0,0,0,0);
+}
+
+CPDF_Rect CFFL_FormFiller::FFLtoPWL(const CPDF_Rect& rect)
+{
+ CPDF_Matrix mt;
+ mt.SetReverse(GetCurMatrix());
+
+ CPDF_Rect temp = rect;
+ mt.TransformRect(temp);
+
+ return temp;
+}
+
+CPDF_Rect CFFL_FormFiller::PWLtoFFL(const CPDF_Rect& rect)
+{
+ CPDF_Matrix mt = GetCurMatrix();
+
+ CPDF_Rect temp = rect;
+ mt.TransformRect(temp);
+
+ return temp;
+}
+
+CPDF_Point CFFL_FormFiller::FFLtoPWL(const CPDF_Point& point)
+{
+ CPDF_Matrix mt;
+ mt.SetReverse(GetCurMatrix());
+
+ CPDF_Point pt = point;
+ mt.Transform(pt.x,pt.y);
+
+ return pt;
+}
+
+CPDF_Point CFFL_FormFiller::PWLtoFFL(const CPDF_Point & point)
+{
+ CPDF_Matrix mt = GetCurMatrix();
+
+ CPDF_Point pt = point;
+ mt.Transform(pt.x,pt.y);
+
+ return pt;
+}
+
+CPDF_Point CFFL_FormFiller::WndtoPWL(CPDFSDK_PageView* pPageView, const CPDF_Point& pt)
+{
+// ASSERT(pPageView != NULL);
+//
+// CPDF_Point point(0.0f, 0.0f);
+// pPageView->WindowToDoc(pt.x, pt.y, point.x, point.y);
+//
+ return FFLtoPWL(pt);
+// return CPDF_Point(0, 0);
+}
+
+CPDF_Rect CFFL_FormFiller::FFLtoWnd(CPDFSDK_PageView* pPageView, const CPDF_Rect & rect)
+{
+// FX_RECT rcRet(0,0,0,0);
+//
+// ASSERT(pPageView != NULL);
+// pPageView->DocToWindow(rect, rcRet);
+//
+ return rect;
+
+}
+
+void CFFL_FormFiller::FFL_FreeData(void* pData)
+{
+ ASSERT(pData != NULL);
+
+ delete (CFFL_PrivateData*)pData;
+}
+
+FX_BOOL CFFL_FormFiller::CommitData(CPDFSDK_PageView* pPageView, FX_UINT nFlag)
+{
+ if (IsDataChanged(pPageView))
+ {
+ //CFFL_IFormFiller* pIFormFiller = CFFL_Module::GetFormFiller(m_pApp);
+ CFFL_IFormFiller* pIFormFiller = m_pApp->GetIFormFiller();//NULL;
+ ASSERT(pIFormFiller != NULL);
+
+ FX_BOOL bRC = TRUE;
+ FX_BOOL bExit = FALSE;
+
+ pIFormFiller->OnKeyStrokeCommit(m_pWidget, pPageView, bRC, bExit, nFlag);
+ if (bExit) return TRUE;
+ if (!bRC)
+ {
+ this->ResetPDFWindow(pPageView, FALSE);
+ return TRUE;
+ }
+
+ pIFormFiller->OnValidate(m_pWidget, pPageView, bRC, bExit, nFlag);
+ if (bExit) return TRUE;
+ if (!bRC)
+ {
+ this->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)
+{
+}
+
+void CFFL_FormFiller::GetKeyStrokeData(CPDFSDK_PageView* pPageView, FFL_KeyStrokeData& data)
+{
+}
+
+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();
+// return NULL;
+}
+
+void CFFL_FormFiller::OnKeyStroke(FX_BOOL bKeyDown)
+{
+}
+
+void CFFL_FormFiller::EscapeFiller(CPDFSDK_PageView* pPageView, FX_BOOL bDestroyPDFWindow)
+{
+ m_bValid = FALSE;
+
+ FX_RECT rcRect = this->GetViewBBox(pPageView, m_pWidget);
+ this->InvalidateRect(rcRect.left, rcRect.top, rcRect.right, rcRect.bottom);
+
+ if(bDestroyPDFWindow)
+ DestroyPDFWindow(pPageView);
+}
+
+FX_BOOL CFFL_FormFiller::CanCopy(CPDFSDK_Document* pDocument)
+{
+ return FALSE;
+}
+
+FX_BOOL CFFL_FormFiller::CanCut(CPDFSDK_Document* pDocument)
+{
+ return FALSE;
+}
+
+FX_BOOL CFFL_FormFiller::CanPaste(CPDFSDK_Document* pDocument)
+{
+ return FALSE;
+}
+
+void CFFL_FormFiller::DoCopy(CPDFSDK_Document* pDocument)
+{
+}
+
+void CFFL_FormFiller::DoCut(CPDFSDK_Document* pDocument)
+{
+}
+
+void CFFL_FormFiller::DoPaste(CPDFSDK_Document* pDocument)
+{
+}
+
+void CFFL_FormFiller::InvalidateRect(double left, double top, double right, double bottom)
+{
+ CPDF_Page * pPage = m_pWidget->GetPDFPage();
+ m_pApp->FFI_Invalidate(pPage, left, top, right, bottom);
+}
+
+/* ------------------------- CFFL_Button ------------------------- */
+
+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 = this->GetViewBBox(pPageView,pAnnot);
+ this->InvalidateRect(rect.left, rect.top, rect.right, rect.bottom);
+// ::InvalidateRect(pPageView->GetPageViewWnd(), &this->GetViewBBox(pPageView, pAnnot), TRUE);
+}
+
+void CFFL_Button::OnMouseExit(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot)
+{
+ m_bMouseIn = FALSE;
+
+ FX_RECT rect = this->GetViewBBox(pPageView,pAnnot);
+ this->InvalidateRect(rect.left, rect.top, rect.right, rect.bottom);
+// ::InvalidateRect(pPageView->GetPageViewWnd(), &this->GetViewBBox(pPageView, pAnnot), TRUE);
+ EndTimer();
+ ASSERT(m_pWidget != NULL);
+// m_pWidget->HideHint();
+}
+
+FX_BOOL CFFL_Button::OnLButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
+{
+ CPDF_Rect rcAnnot = pAnnot->GetRect();
+ if(!rcAnnot.Contains(point.x, point.y))
+ return FALSE;
+
+ m_bMouseDown = TRUE;
+ m_bValid = TRUE;
+ FX_RECT rect = this->GetViewBBox(pPageView, pAnnot);
+ this->InvalidateRect(rect.left, rect.top, rect.right, rect.bottom);
+// ::InvalidateRect(pPageView->GetPageViewWnd(), &this->GetViewBBox(pPageView, pAnnot), TRUE);
+ return TRUE;
+}
+
+FX_BOOL CFFL_Button::OnLButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
+{
+ CPDF_Rect rcAnnot = pAnnot->GetRect();
+ if(!rcAnnot.Contains(point.x, point.y))
+ return FALSE;
+
+ m_bMouseDown = FALSE;
+ m_pWidget->GetPDFPage();
+
+
+ FX_RECT rect = this->GetViewBBox(pPageView, pAnnot);
+ this->InvalidateRect(rect.left, rect.top, rect.right, rect.bottom);
+// ::InvalidateRect(pPageView->GetPageViewWnd(), &this->GetViewBBox(pPageView, pAnnot), TRUE);
+ return TRUE;
+}
+
+FX_BOOL CFFL_Button::OnMouseMove(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
+{
+ ASSERT(m_pApp != NULL);
+
+ return TRUE;
+}
+
+void CFFL_Button::OnDraw(CPDFSDK_PageView *pPageView, /*HDC hDC,*/ CPDFSDK_Annot* pAnnot,
+ CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
+ /*const CRect& rcWindow,*/ FX_DWORD dwFlags)
+{
+ ASSERT(pPageView != NULL);
+ ASSERT(pAnnot != NULL);
+
+ CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
+
+ CPDF_FormControl* pCtrl = pWidget->GetFormControl();
+ ASSERT(pCtrl != NULL);
+
+ CPDF_FormControl::HighlightingMode eHM = pCtrl->GetHighlightingMode();
+
+ if (eHM == CPDF_FormControl::Push)
+ {
+ 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);
+ }
+ }
+ else
+ pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL);
+}
+
+
+void CFFL_Button::OnDrawDeactive(CPDFSDK_PageView *pPageView, /*HDC hDC,*/ CPDFSDK_Annot* pAnnot,
+ CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
+ /*const CRect& rcWindow, */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 new file mode 100644 index 0000000000..686b38c557 --- /dev/null +++ b/fpdfsdk/src/formfiller/FFL_IFormFiller.cpp @@ -0,0 +1,1197 @@ +// 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 "../../include/formfiller/FFL_FormFiller.h"
+#include "../../include/formfiller/FFL_IFormFiller.h"
+#include "../../include/formfiller/FFL_CheckBox.h"
+#include "../../include/formfiller/FFL_ComboBox.h"
+#include "../../include/formfiller/FFL_ListBox.h"
+#include "../../include/formfiller/FFL_PushButton.h"
+#include "../../include/formfiller/FFL_RadioButton.h"
+#include "../../include/formfiller/FFL_TextField.h"
+
+#define FFL_MAXLISTBOXHEIGHT 140.0f
+
+// HHOOK CFFL_IFormFiller::m_hookSheet = NULL;
+// MSG CFFL_IFormFiller::g_Msg;
+
+/* ----------------------------- CFFL_IFormFiller ----------------------------- */
+
+CFFL_IFormFiller::CFFL_IFormFiller(CPDFDoc_Environment* pApp) :
+ m_pApp(pApp),
+ m_bNotifying(FALSE)
+{
+}
+
+CFFL_IFormFiller::~CFFL_IFormFiller()
+{
+ FX_POSITION pos = m_Maps.GetStartPosition();
+ while (pos)
+ {
+ CPDFSDK_Annot * pAnnot = NULL;
+ CFFL_FormFiller * pFormFiller = NULL;
+ m_Maps.GetNextAssoc(pos,pAnnot,pFormFiller);
+ delete pFormFiller;
+ }
+ m_Maps.RemoveAll();
+}
+
+FX_BOOL CFFL_IFormFiller::Annot_HitTest(CPDFSDK_PageView* pPageView,CPDFSDK_Annot* pAnnot, CPDF_Point point)
+{
+ CPDF_Rect 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);
+ }
+ else
+ {
+ ASSERT(pPageView != NULL);
+ ASSERT(pAnnot != NULL);
+
+ CPDF_Annot* pPDFAnnot = pAnnot->GetPDFAnnot();
+ ASSERT(pPDFAnnot != NULL);
+
+ CPDF_Rect rcAnnot;
+ pPDFAnnot->GetRect(rcAnnot);
+
+// CRect rcWin;
+// pPageView->DocToWindow(rcAnnot, rcWin);
+ CPDF_Rect rcWin = CPWL_Utils::InflateRect(rcAnnot,1);
+// rcWin.InflateRect(1, 1);
+
+ return rcWin.GetOutterRect();
+ }
+}
+
+void CFFL_IFormFiller::OnDraw(CPDFSDK_PageView* pPageView, /*HDC hDC,*/ CPDFSDK_Annot* pAnnot,
+ CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
+ /*const CRect& rcWindow,*/ FX_DWORD dwFlags)
+{
+ ASSERT(pPageView != NULL);
+ 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->GetCurrentDoc();
+ ASSERT(pDocument != NULL);
+
+ if (pDocument->GetFocusAnnot() == pAnnot)
+ {
+ CPDF_Rect 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);
+
+ // ::DrawFocusRect(hDC, &rcFocus);
+ }
+ }
+
+ 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 != NULL);
+ ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
+
+ if (!m_bNotifying)
+ {
+ CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
+ if (pWidget->GetAAction(CPDF_AAction::CursorEnter))
+ {
+ m_bNotifying = TRUE;
+
+ int nValueAge = pWidget->GetValueAge();
+
+ pWidget->ClearAppModified();
+
+ ASSERT(pPageView != NULL);
+
+
+
+ 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 ( !IsValidAnnot(pPageView, pAnnot) ) return;
+
+ 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 != NULL);
+ ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
+
+ if (!m_bNotifying)
+ {
+ CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
+ if (pWidget->GetAAction(CPDF_AAction::CursorExit))
+ {
+ m_bNotifying = TRUE;
+ pWidget->GetAppearanceAge();
+ int nValueAge = pWidget->GetValueAge();
+ pWidget->ClearAppModified();
+
+ ASSERT(pPageView != NULL);
+
+
+
+ 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 (!IsValidAnnot(pPageView, pAnnot)) return;
+
+ 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 CPDF_Point& point)
+{
+ ASSERT(pAnnot != NULL);
+ 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))
+ {
+ m_bNotifying = TRUE;
+ pWidget->GetAppearanceAge();
+ int nValueAge = pWidget->GetValueAge();
+ pWidget->ClearAppModified();
+
+ ASSERT(pPageView != NULL);
+
+
+
+ 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 CPDF_Point& point)
+{
+ ASSERT(pAnnot != NULL);
+ ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
+
+ CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
+ // CReader_Page* pPage = pAnnot->GetPage();
+ // ASSERT(pPage != NULL);
+ CPDFSDK_Document* pDocument = m_pApp->GetCurrentDoc();
+ ASSERT(pDocument != NULL);
+
+ 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;
+ }
+ return bRet;
+}
+
+void CFFL_IFormFiller::OnButtonUp(CPDFSDK_Widget* pWidget, CPDFSDK_PageView* pPageView, FX_BOOL& bReset, FX_BOOL& bExit,FX_UINT nFlag)
+{
+ ASSERT(pWidget != NULL);
+
+ if (!m_bNotifying)
+ {
+ if (pWidget->GetAAction(CPDF_AAction::ButtonUp))
+ {
+ m_bNotifying = TRUE;
+ int nAge = pWidget->GetAppearanceAge();
+ int nValueAge = pWidget->GetValueAge();
+
+ ASSERT(pPageView != NULL);
+// CReader_DocView* pDocView = pPageView->GetDocView();
+// ASSERT(pDocView != NULL);
+
+
+
+ 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 CPDF_Point& point)
+{
+ ASSERT(pAnnot != NULL);
+ 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 CPDF_Point& point)
+{
+ ASSERT(pAnnot != NULL);
+ 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 CPDF_Point& point)
+{
+ ASSERT(pAnnot != NULL);
+ 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 CPDF_Point& point)
+{
+ ASSERT(pAnnot != NULL);
+ 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 CPDF_Point& point)
+{
+ ASSERT(pAnnot != NULL);
+ 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::OnRButtonDblClk(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
+{
+ ASSERT(pAnnot != NULL);
+ ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
+
+ if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
+ {
+ return pFormFiller->OnRButtonDblClk(pPageView, pAnnot, nFlags, point);
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CFFL_IFormFiller::OnKeyDown(CPDFSDK_Annot* pAnnot, FX_UINT nKeyCode, FX_UINT nFlags)
+{
+ ASSERT(pAnnot != NULL);
+ 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 != NULL);
+ 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;
+}
+
+void CFFL_IFormFiller::OnDeSelected(CPDFSDK_Annot* pAnnot)
+{
+ ASSERT(pAnnot != NULL);
+ ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
+
+ if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
+ {
+ pFormFiller->OnDeSelected(pAnnot);
+ }
+}
+
+void CFFL_IFormFiller::OnSelected(CPDFSDK_Annot* pAnnot)
+{
+ ASSERT(pAnnot != NULL);
+ ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
+
+ if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
+ {
+ pFormFiller->OnSelected(pAnnot);
+ }
+}
+
+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))
+ {
+ m_bNotifying = TRUE;
+ pWidget->GetAppearanceAge();
+ int nValueAge = pWidget->GetValueAge();
+ pWidget->ClearAppModified();
+
+
+ CPDFSDK_PageView* pPageView = pAnnot->GetPageView();
+ ASSERT(pPageView != NULL);
+
+ 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 (!IsValidAnnot(m_pApp, pDocument, pDocView, pPageView, pAnnot)) return FALSE;
+
+ if (pWidget->IsAppModified())
+ {
+ if (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE))
+ {
+ pFormFiller->ResetPDFWindow(pPageView, nValueAge == pWidget->GetValueAge());
+ }
+ }
+ }
+ }
+
+ if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, TRUE))
+ {
+ if (pFormFiller->OnSetFocus(pAnnot, nFlag))
+ {
+ return TRUE;
+ }
+ else
+ return FALSE;
+ }
+
+ 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))
+ {
+ if (pFormFiller->OnKillFocus(pAnnot, nFlag))
+ {
+ if (!m_bNotifying)
+ {
+ CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
+ if (pWidget->GetAAction(CPDF_AAction::LoseFocus))
+ {
+ m_bNotifying = TRUE;
+ pWidget->ClearAppModified();
+
+ CPDFSDK_PageView* pPageView = pWidget->GetPageView();
+ ASSERT(pPageView != NULL);
+
+ 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;
+
+ }
+ }
+ }
+ else
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+FX_BOOL CFFL_IFormFiller::IsVisible(CPDFSDK_Widget* pWidget)
+{
+ return pWidget->IsVisible();
+}
+
+FX_BOOL CFFL_IFormFiller::IsReadOnly(CPDFSDK_Widget* pWidget)
+{
+ ASSERT(pWidget != NULL);
+
+ int nFieldFlags = pWidget->GetFieldFlags();
+
+ return (nFieldFlags & FIELDFLAG_READONLY) == FIELDFLAG_READONLY;
+}
+
+FX_BOOL CFFL_IFormFiller::IsFillingAllowed(CPDFSDK_Widget* pWidget)
+{
+ ASSERT(pWidget != NULL);
+
+ if (pWidget->GetFieldType() == FIELDTYPE_PUSHBUTTON)
+ return TRUE;
+ else
+ {
+ CPDF_Page* pPage = pWidget->GetPDFPage();
+ ASSERT(pPage != NULL);
+
+ CPDF_Document* pDocument = pPage->m_pDocument;
+ ASSERT(pDocument != NULL);
+
+ FX_DWORD dwPermissions = pDocument->GetUserPermissions();
+ return (dwPermissions&FPDFPERM_FILL_FORM) ||
+ (dwPermissions&FPDFPERM_ANNOT_FORM) ||
+ (dwPermissions&FPDFPERM_MODIFY);
+ }
+ return TRUE;
+}
+
+CFFL_FormFiller* CFFL_IFormFiller::GetFormFiller(CPDFSDK_Annot* pAnnot, FX_BOOL bRegister)
+{
+// ASSERT(pAnnot != NULL);
+// ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
+
+ CFFL_FormFiller * pFormFiller = NULL;
+ m_Maps.Lookup(pAnnot, pFormFiller);
+
+ if (pFormFiller)
+ return pFormFiller;
+
+ if (bRegister)
+ {
+ CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
+
+ int nFieldType = pWidget->GetFieldType();
+ 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 = NULL;
+ break;
+ }
+
+ if (pFormFiller)
+ {
+ m_Maps.SetAt(pAnnot, pFormFiller);
+ }
+ }
+
+ return pFormFiller;
+}
+
+void CFFL_IFormFiller::RemoveFormFiller(CPDFSDK_Annot* pAnnot)
+{
+ if ( pAnnot != NULL )
+ {
+ UnRegisterFormFiller( pAnnot );
+ }
+}
+
+void CFFL_IFormFiller::UnRegisterFormFiller(CPDFSDK_Annot* pAnnot)
+{
+ CFFL_FormFiller * pFormFiller = NULL;
+
+ if (m_Maps.Lookup(pAnnot,pFormFiller))
+ {
+ if (pFormFiller)
+ delete pFormFiller;
+ m_Maps.RemoveKey(pAnnot);
+ }
+}
+
+void CFFL_IFormFiller::SetFocusAnnotTab(CPDFSDK_Annot* pWidget, FX_BOOL bSameField, FX_BOOL bNext)
+{
+
+}
+
+void CFFL_IFormFiller::QueryWherePopup(void* pPrivateData, FX_FLOAT fPopupMin,FX_FLOAT fPopupMax, FX_INT32 & nRet, FX_FLOAT & fPopupRet)
+{
+ ASSERT(pPrivateData != NULL);
+
+ CFFL_PrivateData* pData = (CFFL_PrivateData*)pPrivateData;
+
+
+
+
+ CPDF_Rect rcPageView(0,0,0,0);
+ rcPageView.right = pData->pWidget->GetPDFPage()->GetPageWidth();
+ rcPageView.bottom = pData->pWidget->GetPDFPage()->GetPageHeight();
+ rcPageView.Normalize();
+
+
+ ASSERT(pData->pWidget != NULL);
+ CPDF_Rect 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::OnSetWindowRect(void* pPrivateData, const CPDF_Rect & rcWindow)
+{
+ ASSERT(pPrivateData != NULL);
+
+ CFFL_PrivateData* pData = (CFFL_PrivateData*)pPrivateData;
+
+ if (CFFL_FormFiller* pFormFiller = GetFormFiller(pData->pWidget, TRUE))
+ {
+
+ CPDF_Rect rcOld = pFormFiller->PWLtoFFL(pFormFiller->GetWindowRect(pData->pPageView));
+ CPDF_Rect rcNew = pFormFiller->PWLtoFFL(rcWindow);
+ pFormFiller->SetWindowRect(pData->pPageView, rcWindow);
+
+ CPDF_Rect unRect = rcOld;
+ unRect.Union(rcNew);
+ //FX_RECT rcRect = unRect.GetOutterRect();
+ unRect.left = (FX_FLOAT)(unRect.left - 0.5);
+ unRect.right = (FX_FLOAT)(unRect.right + 0.5);
+ unRect.top = (FX_FLOAT)(unRect.top + 0.5);
+ unRect.bottom = (FX_FLOAT)(unRect.bottom -0.5);
+ m_pApp->FFI_Invalidate(pData->pWidget->GetPDFPage(), unRect.left, unRect.top, unRect.right, unRect.bottom);
+ }
+}
+
+void CFFL_IFormFiller::OnKeyStroke(FX_BOOL bEditOrList, void* pPrivateData, FX_INT32 nKeyCode, CFX_WideString& strChange,
+ const CFX_WideString& strChangeEx, FX_BOOL bKeyDown,
+ FX_BOOL & bRC, FX_BOOL & bExit)
+{
+ ASSERT(pPrivateData != NULL);
+ CFFL_PrivateData* pData = (CFFL_PrivateData*)pPrivateData;
+ ASSERT(pData->pWidget != NULL);
+
+ CFFL_FormFiller* pFormFiller = GetFormFiller(pData->pWidget, FALSE);
+ ASSERT(pFormFiller != NULL);
+
+ pFormFiller->OnKeyStroke(bKeyDown);
+}
+
+void CFFL_IFormFiller::OnKeyStrokeCommit(CPDFSDK_Widget* pWidget, CPDFSDK_PageView* pPageView, FX_BOOL& bRC, FX_BOOL& bExit, FX_DWORD nFlag)
+{
+ if (!m_bNotifying)
+ {
+ ASSERT(pWidget != NULL);
+ if (pWidget->GetAAction(CPDF_AAction::KeyStroke))
+ {
+ m_bNotifying = TRUE;
+ pWidget->ClearAppModified();
+
+ ASSERT(pPageView != NULL);
+// CReader_DocView* pDocView = pPageView->GetDocView();
+// ASSERT(pDocView != NULL);
+
+
+
+ PDFSDK_FieldAction fa;
+ fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag);
+ fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag);
+ fa.bWillCommit = TRUE;
+ fa.nCommitKey = GetCommitKey();
+ fa.bKeyDown = GetKeyDown();
+ fa.bRC = TRUE;
+
+ CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE);
+ ASSERT(pFormFiller != NULL);
+
+ pFormFiller->GetActionData(pPageView, CPDF_AAction::KeyStroke, fa);
+ pFormFiller->SaveState(pPageView);
+
+ PDFSDK_FieldAction faOld = fa;
+ pWidget->OnAAction(CPDF_AAction::KeyStroke, fa, pPageView);
+
+ bRC = fa.bRC;
+// bExit = !IsValidAnnot(m_pApp, pDocument, pDocView, pPageView, pWidget);
+
+ 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)
+ {
+ ASSERT(pWidget != NULL);
+ if (pWidget->GetAAction(CPDF_AAction::Validate))
+ {
+ m_bNotifying = TRUE;
+ pWidget->ClearAppModified();
+
+ ASSERT(pPageView != NULL);
+// CReader_DocView* pDocView = pPageView->GetDocView();
+// ASSERT(pDocView != NULL);
+
+
+
+ PDFSDK_FieldAction fa;
+ fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag);
+ fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag);
+ fa.bKeyDown = GetKeyDown();
+ fa.bRC = TRUE;
+
+ CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE);
+ ASSERT(pFormFiller != NULL);
+
+ pFormFiller->GetActionData(pPageView, CPDF_AAction::Validate, fa);
+ pFormFiller->SaveState(pPageView);
+
+ PDFSDK_FieldAction faOld = fa;
+ pWidget->OnAAction(CPDF_AAction::Validate, fa, pPageView);
+
+ bRC = fa.bRC;
+// bExit = !IsValidAnnot(m_pApp, pDocument, pDocView, pPageView, pWidget);
+
+ m_bNotifying = FALSE;
+ }
+ }
+}
+
+void CFFL_IFormFiller::OnCalculate(CPDFSDK_Widget* pWidget, CPDFSDK_PageView* pPageView, FX_BOOL& bExit, FX_DWORD nFlag)
+{
+ if (!m_bNotifying)
+ {
+ ASSERT(pWidget != NULL);
+ ASSERT(pPageView != NULL);
+// CReader_DocView* pDocView = pPageView->GetDocView();
+// ASSERT(pDocView != NULL);
+ CPDFSDK_Document* pDocument = pPageView->GetSDKDocument();
+ ASSERT(pDocument != NULL);
+
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ pInterForm->OnCalculate(pWidget->GetFormField());
+
+// bExit = !IsValidAnnot(m_pApp, pDocument, pDocView, pPageView, pWidget);
+
+ m_bNotifying = FALSE;
+ }
+}
+
+void CFFL_IFormFiller::OnFormat(CPDFSDK_Widget* pWidget, CPDFSDK_PageView* pPageView, FX_BOOL& bExit, FX_DWORD nFlag)
+{
+ if (!m_bNotifying)
+ {
+ ASSERT(pWidget != NULL);
+ ASSERT(pPageView != NULL);
+// CReader_DocView* pDocView = pPageView->GetDocView();
+// ASSERT(pDocView != NULL);
+ CPDFSDK_Document* pDocument = pPageView->GetSDKDocument();
+ ASSERT(pDocument != NULL);
+
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ FX_BOOL bFormated = FALSE;
+ CFX_WideString sValue = pInterForm->OnFormat(pWidget->GetFormField(), GetCommitKey(), bFormated);
+
+// bExit = !IsValidAnnot(m_pApp, pDocument, pDocView, pPageView, pWidget);
+
+ if (bExit) return;
+
+ if (bFormated)
+ {
+ pInterForm->ResetFieldAppearance(pWidget->GetFormField(), sValue, TRUE);
+ pInterForm->UpdateField(pWidget->GetFormField());
+ }
+
+ m_bNotifying = FALSE;
+ }
+}
+
+// LRESULT CALLBACK CFFL_IFormFiller::FFL_WndProc(
+// int code, // hook code
+// WPARAM wParam, // virtual-key code
+// LPARAM lParam // keystroke-message information
+// )
+// {
+// if (code != HC_ACTION)
+// {
+// return CallNextHookEx (m_hookSheet, code, wParam, lParam);
+// }
+//
+// FXSYS_memcpy(&g_Msg, (void*)lParam, sizeof(MSG));
+//
+// return 0;
+// }
+
+// MSG CFFL_IFormFiller::GetLastMessage()
+// {
+// return g_Msg;
+// }
+
+int CFFL_IFormFiller::GetCommitKey()
+{
+// MSG msg = CFFL_IFormFiller::GetLastMessage();
+
+ int nCommitKey = 0;
+// switch (msg.message)
+// {
+// case WM_LBUTTONDOWN:
+// case WM_LBUTTONUP:
+// nCommitKey = 1;
+// break;
+// case WM_KEYDOWN:
+// switch (msg.wParam)
+// {
+// case VK_RETURN:
+// nCommitKey = 2;
+// break;
+// case VK_TAB:
+// nCommitKey = 3;
+// break;
+// }
+// break;
+// }
+
+ return nCommitKey;
+}
+
+FX_BOOL CFFL_IFormFiller::GetKeyDown()
+{
+ return TRUE;
+// MSG msg = CFFL_IFormFiller::GetLastMessage();
+//
+// return msg.message == WM_KEYDOWN || msg.message == WM_CHAR;
+}
+
+FX_BOOL CFFL_IFormFiller::IsValidAnnot(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot)
+{
+
+ ASSERT(pPageView != NULL);
+ ASSERT(pAnnot != NULL);
+
+ if(pPageView)
+ return pPageView->IsValidAnnot(pAnnot->GetPDFAnnot());
+ else
+ return FALSE;
+}
+
+void CFFL_IFormFiller::BeforeUndo(CPDFSDK_Document* pDocument)
+{
+
+}
+
+void CFFL_IFormFiller::BeforeRedo(CPDFSDK_Document* pDocument)
+{
+ BeforeUndo(pDocument);
+}
+
+void CFFL_IFormFiller::AfterUndo(CPDFSDK_Document* pDocument)
+{
+}
+
+void CFFL_IFormFiller::AfterRedo(CPDFSDK_Document* pDocument)
+{
+}
+
+FX_BOOL CFFL_IFormFiller::CanCopy(CPDFSDK_Document* pDocument)
+{
+
+ return FALSE;
+}
+
+FX_BOOL CFFL_IFormFiller::CanCut(CPDFSDK_Document* pDocument)
+{
+
+ return FALSE;
+}
+
+FX_BOOL CFFL_IFormFiller::CanPaste(CPDFSDK_Document* pDocument)
+{
+
+ return FALSE;
+}
+
+void CFFL_IFormFiller::DoCopy(CPDFSDK_Document* pDocument)
+{
+}
+
+void CFFL_IFormFiller::DoCut(CPDFSDK_Document* pDocument)
+{
+}
+
+void CFFL_IFormFiller::DoPaste(CPDFSDK_Document* pDocument)
+{
+
+}
+void CFFL_IFormFiller::OnBeforeKeyStroke(FX_BOOL bEditOrList, void* pPrivateData, FX_INT32 nKeyCode,
+ CFX_WideString & strChange, const CFX_WideString& strChangeEx,
+ int nSelStart, int nSelEnd,
+ FX_BOOL bKeyDown, FX_BOOL & bRC, FX_BOOL & bExit, FX_DWORD nFlag)
+{
+ ASSERT(pPrivateData != NULL);
+ CFFL_PrivateData* pData = (CFFL_PrivateData*)pPrivateData;
+ ASSERT(pData->pWidget != NULL);
+
+ CFFL_FormFiller* pFormFiller = GetFormFiller(pData->pWidget, FALSE);
+ ASSERT(pFormFiller != NULL);
+
+ if (!m_bNotifying)
+ {
+ if (pData->pWidget->GetAAction(CPDF_AAction::KeyStroke))
+ {
+ m_bNotifying = TRUE;
+ int nAge = pData->pWidget->GetAppearanceAge();
+ int nValueAge = pData->pWidget->GetValueAge();
+
+ ASSERT(pData->pPageView != NULL);
+ 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;
+ }
+ }
+}
+
+void CFFL_IFormFiller::OnAfterKeyStroke(FX_BOOL bEditOrList, void* pPrivateData, FX_BOOL & bExit,FX_DWORD nFlag)
+{
+ ASSERT(pPrivateData != NULL);
+ CFFL_PrivateData* pData = (CFFL_PrivateData*)pPrivateData;
+ ASSERT(pData->pWidget != NULL);
+
+ CFFL_FormFiller* pFormFiller = GetFormFiller(pData->pWidget, FALSE);
+ ASSERT(pFormFiller != NULL);
+
+ if (!bEditOrList)
+ pFormFiller->OnKeyStroke(bExit);
+}
diff --git a/fpdfsdk/src/formfiller/FFL_ListBox.cpp b/fpdfsdk/src/formfiller/FFL_ListBox.cpp new file mode 100644 index 0000000000..9ddb6a00d9 --- /dev/null +++ b/fpdfsdk/src/formfiller/FFL_ListBox.cpp @@ -0,0 +1,319 @@ +// 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 "../../include/formfiller/FormFiller.h"
+#include "../../include/formfiller/FFL_FormFiller.h"
+#include "../../include/formfiller/FFL_ListBox.h"
+//#include "../../include/formfiller/FFL_Module.h"
+#include "../../include/formfiller/FFL_IFormFiller.h"
+//#include "../../include/formfiller/FFL_Undo.h"
+#include "../../include/formfiller/FFL_CBA_Fontmap.h"
+
+
+#define FFL_DEFAULTLISTBOXFONTSIZE 12.0f
+
+
+/* ------------------------------- CFFL_ListBox ------------------------------- */
+
+CFFL_ListBox::CFFL_ListBox(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pWidget) :
+ CFFL_FormFiller(pApp, pWidget),
+ m_pFontMap(NULL)
+{
+}
+
+CFFL_ListBox::~CFFL_ListBox()
+{
+ if (m_pFontMap)
+ {
+ delete m_pFontMap;
+ m_pFontMap = NULL;
+ }
+}
+
+PWL_CREATEPARAM CFFL_ListBox::GetCreateParam()
+{
+ PWL_CREATEPARAM cp = CFFL_FormFiller::GetCreateParam();
+
+ ASSERT(m_pWidget != NULL);
+ FX_DWORD dwFieldFlag = m_pWidget->GetFieldFlags();
+
+ if (dwFieldFlag & FIELDFLAG_MULTISELECT)
+ {
+ cp.dwFlags |= PLBS_MULTIPLESEL;
+ }
+
+ if (dwFieldFlag & FIELDFLAG_COMMITONSELCHANGE)
+ {
+ //cp.dwFlags |= PLBS_COMMITSELECTEDVALUE;
+ }
+
+ cp.dwFlags |= PWS_VSCROLL;
+
+ if (cp.dwFlags & PWS_AUTOFONTSIZE)
+ cp.fFontSize = FFL_DEFAULTLISTBOXFONTSIZE;
+
+ if (!m_pFontMap)
+ {
+ ASSERT(this->m_pApp != NULL);
+ m_pFontMap = new CBA_FontMap(m_pWidget,m_pApp->GetSysHandler());//, ISystemHandle::GetSystemHandler(m_pApp));
+ m_pFontMap->Initial();
+ }
+ 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);
+
+ ASSERT(m_pApp != NULL);
+ CFFL_IFormFiller* pIFormFiller = m_pApp->GetIFormFiller();
+ pWnd->SetFillerNotify(pIFormFiller);
+
+ ASSERT(m_pWidget != NULL);
+
+ for (FX_INT32 i=0,sz=m_pWidget->CountOptions(); i<sz; i++)
+ pWnd->AddString(m_pWidget->GetOptionLabel(i));
+
+ if (pWnd->HasFlag(PLBS_MULTIPLESEL))
+ {
+ m_OriginSelections.RemoveAll();
+
+ FX_BOOL bSetCaret = FALSE;
+ for (FX_INT32 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.SetAt(i, NULL);
+ }
+ }
+ }
+ 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)
+{
+ ASSERT(m_pWidget != NULL);
+
+ if (CPWL_ListBox* pListBox = (CPWL_ListBox*)GetPDFWindow(pPageView, FALSE))
+ {
+ if (m_pWidget->GetFieldFlags() & FIELDFLAG_MULTISELECT)
+ {
+ int nSelCount = 0;
+ for (FX_INT32 i=0,sz=pListBox->GetCount(); i<sz; i++)
+ {
+ if (pListBox->IsItemSelected(i))
+ {
+ void* p = NULL;
+ if (!m_OriginSelections.Lookup(i, p))
+ return TRUE;
+
+ nSelCount++;
+ }
+ }
+
+ return nSelCount != m_OriginSelections.GetCount();
+ }
+ else
+ {
+ return pListBox->GetCurSel() != m_pWidget->GetSelectedIndex(0);
+ }
+ }
+
+ return FALSE;
+}
+
+void CFFL_ListBox::SaveData(CPDFSDK_PageView* pPageView)
+{
+ ASSERT(m_pWidget != NULL);
+
+ 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);
+ }
+ }
+ }
+
+
+ FX_INT32 nNewTopIndex = pListBox->GetTopVisibleIndex();
+
+ m_pWidget->ClearSelection(FALSE);
+
+ if (m_pWidget->GetFieldFlags() & FIELDFLAG_MULTISELECT)
+ {
+ for (FX_INT32 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))
+ {
+ ASSERT(m_pWidget != NULL);
+ FX_INT32 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
+ {
+ ASSERT(m_pWidget != NULL);
+ FX_INT32 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 != NULL);
+
+ if (CPWL_ListBox* pListBox = (CPWL_ListBox*)GetPDFWindow(pPageView, FALSE))
+ {
+ for (FX_INT32 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 = this->GetPDFWindow(pPageView, FALSE);
+ }
+ else
+ pRet = this->GetPDFWindow(pPageView, TRUE);
+
+ m_pWidget->UpdateField();
+
+ return pRet;
+}
+
+void CFFL_ListBox::OnKeyStroke(FX_BOOL bKeyDown, FX_DWORD nFlag)
+{
+ ASSERT(m_pWidget != NULL);
+
+ int nFlags = m_pWidget->GetFieldFlags();
+
+ if (nFlags & FIELDFLAG_COMMITONSELCHANGE)
+ {
+ if (m_bValid)
+ {
+ CPDFSDK_PageView* pPageView = this->GetCurPageView();
+ ASSERT(pPageView != NULL);
+
+ if (CommitData(pPageView, nFlag))
+ {
+ DestroyPDFWindow(pPageView);
+ m_bValid = FALSE;
+ }
+ }
+ }
+}
+
diff --git a/fpdfsdk/src/formfiller/FFL_Notify.cpp b/fpdfsdk/src/formfiller/FFL_Notify.cpp new file mode 100644 index 0000000000..f18ed51875 --- /dev/null +++ b/fpdfsdk/src/formfiller/FFL_Notify.cpp @@ -0,0 +1,172 @@ +// 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 "../../include/formfiller/FormFiller.h"
+#include "../../include/formfiller/FFL_FormFiller.h"
+#include "../../include/formfiller/FFL_Notify.h"
+// #include "../../include/formfiller/FFL_ComboBox.h"
+// #include "../../include/formfiller/FFL_Module.h"
+
+/* -------------------------------- CFFL_Notify ------------------------------ */
+
+//#pragma warning(disable: 4800)
+
+CFFL_Notify::CFFL_Notify(CFFL_FormFiller * pFormFiller) :
+ m_pFormFiller(pFormFiller),
+ m_bDoActioning(FALSE),
+ m_nNotifyFlag(0)
+{
+ ASSERT(m_pFormFiller != NULL);
+}
+
+CFFL_Notify::~CFFL_Notify()
+{
+}
+
+void CFFL_Notify::BeforeNotify()
+{
+ m_nNotifyFlag ++;
+}
+
+
+void CFFL_Notify::AfterNotify()
+{
+ m_nNotifyFlag --;
+}
+
+FX_BOOL CFFL_Notify::OnMouseUp(FX_BOOL & bExit)
+{
+ BeforeNotify();
+ FX_BOOL bRet = FALSE;//DoAAction(CPDF_AAction::AActionType::ButtonUp, bExit);
+ AfterNotify();
+ return bRet;
+}
+
+FX_BOOL CFFL_Notify::OnMouseDown(FX_BOOL & bExit)
+{
+ BeforeNotify();
+ FX_BOOL bRet = FALSE;//DoAAction(CPDF_AAction::AActionType::ButtonDown, bExit);
+ AfterNotify();
+ return bRet;
+}
+
+FX_BOOL CFFL_Notify::OnMouseEnter(FX_BOOL & bExit)
+{
+ BeforeNotify();
+ FX_BOOL bRet = FALSE;//DoAAction(CPDF_AAction::AActionType::CursorEnter, bExit);
+ AfterNotify();
+ return bRet;
+}
+
+FX_BOOL CFFL_Notify::OnMouseExit(FX_BOOL & bExit)
+{
+ BeforeNotify();
+ FX_BOOL bRet = FALSE;//DoAAction(CPDF_AAction::AActionType::CursorExit, bExit);
+ AfterNotify();
+ return bRet;
+}
+
+FX_BOOL CFFL_Notify::OnSetFocus(FX_BOOL & bExit)
+{
+ BeforeNotify();
+ FX_BOOL bRet = FALSE;//DoAAction(CPDF_AAction::AActionType::GetFocus, bExit);
+ AfterNotify();
+ return bRet;
+}
+
+FX_BOOL CFFL_Notify::OnKillFocus(FX_BOOL & bExit)
+{
+ BeforeNotify();
+ FX_BOOL bRet = FALSE;//DoAAction(CPDF_AAction::AActionType::LoseFocus, bExit);
+ AfterNotify();
+ return bRet;
+}
+
+FX_BOOL CFFL_Notify::OnCalculate()
+{
+ return TRUE;
+}
+
+FX_BOOL CFFL_Notify::OnFormat(int iCommitKey)
+{
+ return TRUE;
+}
+
+FX_BOOL CFFL_Notify::OnKeyStroke(CPDF_FormField* pFormField, int nCommitKey, CFX_WideString& strValue, CFX_WideString& strChange,
+ const CFX_WideString& strChangeEx, FX_BOOL bKeyDown, FX_BOOL bModifier,
+ FX_BOOL bShift, FX_BOOL bWillCommit, FX_BOOL bFieldFull,
+ int& nSelStart, int& nSelEnd, FX_BOOL& bRC)
+{
+ return TRUE;
+}
+
+FX_BOOL CFFL_Notify::OnValidate(CPDF_FormField* pFormField, CFX_WideString& strValue, CFX_WideString & strChange,
+ const CFX_WideString& strChangeEx, FX_BOOL bKeyDown, FX_BOOL bModifier,
+ FX_BOOL bShift, FX_BOOL & bRC)
+{
+ return TRUE;
+}
+
+FX_BOOL CFFL_Notify::DoAAction(CPDF_AAction::AActionType eAAT, FX_BOOL & bExit)
+{
+ if (this->m_bDoActioning) return FALSE;
+
+ CPDF_Action action;
+ if (!FindAAction(eAAT,action)) return FALSE;
+
+ this->m_bDoActioning = TRUE;
+ ExecuteActionTree(eAAT,action,bExit);
+ this->m_bDoActioning = FALSE;
+ return TRUE;
+}
+
+FX_BOOL CFFL_Notify::ExecuteActionTree(CPDF_AAction::AActionType eAAT,CPDF_Action & action, FX_BOOL& bExit)
+{
+ if (!ExecuteAction(eAAT,action,bExit)) return FALSE;
+ if (bExit) return TRUE;
+
+ for (FX_INT32 i=0,sz=action.GetSubActionsCount(); i<sz; i++)
+ {
+ CPDF_Action subaction = action.GetSubAction(i);
+ if (!ExecuteActionTree(eAAT,subaction,bExit)) return FALSE;
+ if (bExit) break;
+ }
+
+ return TRUE;
+}
+
+
+FX_BOOL CFFL_Notify::FindAAction(CPDF_AAction::AActionType eAAT,CPDF_Action & action)
+{
+ return FALSE;
+}
+
+FX_BOOL CFFL_Notify::FindAAction(CPDF_AAction aaction,CPDF_AAction::AActionType eAAT,CPDF_Action & action)
+{
+ CPDF_Action MyAction;
+
+ if (aaction.ActionExist(eAAT))
+ {
+ MyAction = aaction.GetAction(eAAT);
+ }
+ else
+ return FALSE;
+
+
+ if (MyAction.GetType() == CPDF_Action::Unknown)
+ return FALSE;
+
+ action = MyAction;
+
+ return TRUE;
+}
+
+FX_BOOL CFFL_Notify::ExecuteAction(CPDF_AAction::AActionType eAAT,CPDF_Action & action,FX_BOOL& bExit)
+{
+ return FALSE;
+}
+//#pragma warning(default: 4800)
+
diff --git a/fpdfsdk/src/formfiller/FFL_PushButton.cpp b/fpdfsdk/src/formfiller/FFL_PushButton.cpp new file mode 100644 index 0000000000..1afbe8b84e --- /dev/null +++ b/fpdfsdk/src/formfiller/FFL_PushButton.cpp @@ -0,0 +1,43 @@ +// 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 "../../include/formfiller/FormFiller.h"
+#include "../../include/formfiller/FFL_FormFiller.h"
+#include "../../include/formfiller/FFL_PushButton.h"
+
+/* ------------------------------- CFFL_PushButton ------------------------------- */
+
+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, CPDF_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 new file mode 100644 index 0000000000..462c05ede2 --- /dev/null +++ b/fpdfsdk/src/formfiller/FFL_RadioButton.cpp @@ -0,0 +1,137 @@ +// 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 "../../include/formfiller/FormFiller.h"
+#include "../../include/formfiller/FFL_FormFiller.h"
+#include "../../include/formfiller/FFL_RadioButton.h"
+//#include "../include/FFL_Undo.h"
+
+/* ------------------------------- CFFL_RadioButton ------------------------------- */
+
+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);
+
+ ASSERT(m_pWidget != NULL);
+ 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();
+ ASSERT(pIFormFiller != NULL);
+
+ CPDFSDK_PageView* pPageView = pAnnot->GetPageView();
+ ASSERT(pPageView != NULL);
+
+ 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 CPDF_Point& 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)
+{
+ ASSERT(m_pWidget != NULL);
+
+ if (CPWL_RadioButton* pWnd = (CPWL_RadioButton*)GetPDFWindow(pPageView, FALSE))
+ {
+ return pWnd->IsChecked() != m_pWidget->IsChecked();
+ }
+
+ return FALSE;
+}
+
+void CFFL_RadioButton::SaveData(CPDFSDK_PageView* pPageView)
+{
+ ASSERT(m_pWidget != NULL);
+
+ if (CPWL_RadioButton* pWnd = (CPWL_RadioButton*)GetPDFWindow(pPageView, FALSE))
+ {
+
+ FX_BOOL bNewChecked = pWnd->IsChecked();
+
+ if (bNewChecked)
+ {
+ CPDF_FormField* pField = m_pWidget->GetFormField();
+ ASSERT(pField != NULL);
+
+ for (FX_INT32 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 new file mode 100644 index 0000000000..7644d4bc60 --- /dev/null +++ b/fpdfsdk/src/formfiller/FFL_TextField.cpp @@ -0,0 +1,412 @@ +// 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 "../include/FormFiller.h"
+//#include "../include/FFL_FormFiller.h"
+#include "../../include/formfiller/FFL_TextField.h"
+#include "../../include/formfiller/FFL_CBA_Fontmap.h"
+//#include "../include/FFL_Notify.h"
+
+CFFL_EditUndoItem::CFFL_EditUndoItem(CPWL_Edit* pEdit) : m_pEdit(pEdit)
+{
+}
+
+CFFL_EditUndoItem::~CFFL_EditUndoItem()
+{
+}
+
+void CFFL_EditUndoItem::Undo()
+{
+}
+
+void CFFL_EditUndoItem::Redo()
+{
+}
+
+CFX_WideString CFFL_EditUndoItem::GetDescr()
+{
+ return L"Input";
+}
+
+void CFFL_EditUndoItem::Release()
+{
+ delete this;
+}
+
+/* ------------------------------- CFFL_TextField ------------------------------- */
+
+CFFL_TextField::CFFL_TextField(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pAnnot) :
+ CFFL_FormFiller(pApp, pAnnot),
+ m_pFontMap(NULL)//,
+ //m_pSpellCheck(NULL)
+{
+ m_State.nStart = m_State.nEnd = 0;
+}
+
+CFFL_TextField::~CFFL_TextField()
+{
+ if (m_pFontMap)
+ {
+ delete m_pFontMap;
+ m_pFontMap = NULL;
+ }
+
+}
+
+PWL_CREATEPARAM CFFL_TextField::GetCreateParam()
+{
+ PWL_CREATEPARAM cp = CFFL_FormFiller::GetCreateParam();
+
+ ASSERT(m_pWidget != NULL);
+ 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)
+ {
+ ASSERT(this->m_pApp != NULL);
+ m_pFontMap = new CBA_FontMap(m_pWidget, /*ISystemHandle::GetSystemHandler(m_pApp)*/m_pApp->GetSysHandler());
+ m_pFontMap->Initial();
+ }
+ 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);
+
+
+
+ ASSERT(m_pApp != NULL);
+ CFFL_IFormFiller* pIFormFiller = m_pApp->GetIFormFiller();
+ pWnd->SetFillerNotify(pIFormFiller);
+
+ ASSERT(m_pWidget != NULL);
+ FX_INT32 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);
+
+ 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 = this->GetCurPageView();
+ ASSERT(pPageView != NULL);
+ m_bValid = !m_bValid;
+ CPDF_Rect rcAnnot = pAnnot->GetRect();
+ m_pApp->FFI_Invalidate(pAnnot->GetPDFPage(), 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;
+ }
+ else
+ {
+ return FALSE;
+ }
+ }
+ }
+ break;
+ case FWL_VKEY_Escape:
+ {
+ CPDFSDK_PageView* pPageView = this->GetCurPageView();
+ ASSERT(pPageView != NULL);
+ EscapeFiller(pPageView,TRUE);
+ return TRUE;
+ }
+ }
+
+ return CFFL_FormFiller::OnChar(pAnnot, nChar, nFlags);
+}
+
+FX_BOOL CFFL_TextField::IsDataChanged(CPDFSDK_PageView* pPageView)
+{
+ ASSERT(m_pWidget != NULL);
+
+ if (CPWL_Edit * pEdit = (CPWL_Edit*)GetPDFWindow(pPageView, FALSE))
+ return pEdit->GetText() != m_pWidget->GetValue();
+
+ return FALSE;
+}
+
+void CFFL_TextField::SaveData(CPDFSDK_PageView* pPageView)
+{
+ ASSERT(m_pWidget != NULL);
+
+ 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:
+ ASSERT(m_pWidget != NULL);
+ 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);
+ }
+ 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 != NULL);
+
+ 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 != NULL);
+
+ if (CPWL_Edit* pWnd = (CPWL_Edit*)GetPDFWindow(pPageView, TRUE))
+ {
+ pWnd->SetText(m_State.sValue);
+ 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 = this->GetPDFWindow(pPageView, FALSE);
+ }
+ else
+ pRet = this->GetPDFWindow(pPageView, TRUE);
+
+ m_pWidget->UpdateField();
+
+ return pRet;
+}
+
+void CFFL_TextField::OnSetFocus(CPWL_Wnd* pWnd)
+{
+ ASSERT(m_pApp != NULL);
+
+ ASSERT(pWnd != NULL);
+
+ 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*)(FX_LPCSTR)bsUTFText;
+ m_pApp->FFI_OnSetFieldInputFocus(m_pWidget->GetFormField(), pBuffer, nCharacters, TRUE);
+
+ pEdit->SetEditNotify(this);
+ //pUndo->BeginEdit(pDocument);
+ }
+}
+
+void CFFL_TextField::OnKillFocus(CPWL_Wnd* pWnd)
+{
+
+}
+
+FX_BOOL CFFL_TextField::CanCopy(CPDFSDK_Document* pDocument)
+{
+ return FALSE;
+}
+
+FX_BOOL CFFL_TextField::CanCut(CPDFSDK_Document* pDocument)
+{
+ return FALSE;
+}
+
+FX_BOOL CFFL_TextField::CanPaste(CPDFSDK_Document* pDocument)
+{
+ return FALSE;
+}
+
+void CFFL_TextField::DoCopy(CPDFSDK_Document* pDocument)
+{
+
+}
+
+void CFFL_TextField::DoCut(CPDFSDK_Document* pDocument)
+{
+}
+
+void CFFL_TextField::DoPaste(CPDFSDK_Document* pDocument)
+{
+
+}
+
+void CFFL_TextField::OnAddUndo(CPWL_Edit* pEdit)
+{
+}
+
diff --git a/fpdfsdk/src/formfiller/FFL_Utils.cpp b/fpdfsdk/src/formfiller/FFL_Utils.cpp new file mode 100644 index 0000000000..2e908108b8 --- /dev/null +++ b/fpdfsdk/src/formfiller/FFL_Utils.cpp @@ -0,0 +1,133 @@ +// 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 "../../include/formfiller/FormFiller.h"
+#include "../../include/formfiller/FFL_Utils.h"
+
+CPDF_Rect CFFL_Utils::MaxRect(const CPDF_Rect & rect1,const CPDF_Rect & rect2)
+{
+ CPDF_Rect rcRet;
+
+ rcRet.left = FFL_MIN(rect1.left,rect2.left);
+ rcRet.bottom = FFL_MIN(rect1.bottom,rect2.bottom);
+ rcRet.right = FFL_MAX(rect1.right,rect2.right);
+ rcRet.top = FFL_MAX(rect1.top,rect2.top);
+
+ return rcRet;
+}
+
+CPDF_Rect CFFL_Utils::InflateRect(const CPDF_Rect & crRect,const FX_FLOAT & fSize)
+{
+ CPDF_Rect crNew(crRect.left - fSize,
+ crRect.bottom - fSize,
+ crRect.right + fSize,
+ crRect.top + fSize);
+ crNew.Normalize();
+ return crNew;
+}
+
+CPDF_Rect CFFL_Utils::DeflateRect(const CPDF_Rect & crRect,const FX_FLOAT & fSize)
+{
+ CPDF_Rect crNew(crRect.left + fSize,
+ crRect.bottom + fSize,
+ crRect.right - fSize,
+ crRect.top - fSize);
+ crNew.Normalize();
+ return crNew;
+}
+
+/*
+FX_BOOL CFFL_Utils::RectContainsRect(const CPDF_Rect & father,const CPDF_Rect & son)
+{
+ return (father.left <= son.left && father.right >= son.right &&
+ father.bottom <= son.bottom && father.top >= son.top);
+
+}
+
+FX_BOOL CFFL_Utils::RectContainsPoint(const CPDF_Rect & father,const CPDF_Point & son)
+{
+ return (father.left <= son.x && father.right >= son.x &&
+ father.bottom <= son.y && father.top >= son.y);
+}
+
+FX_BOOL CFFL_Utils::RectContainsXY(const CPDF_Rect & father,FX_FLOAT x,FX_FLOAT y)
+{
+ return (father.left <= x && father.right >= x &&
+ father.bottom <= y && father.top >= y);
+}
+*/
+
+FX_BOOL CFFL_Utils::TraceObject(CPDF_Object* pObj)
+{
+ if (!pObj) return FALSE;
+
+ FX_DWORD dwObjNum = pObj->GetObjNum();
+ switch (pObj->GetType())
+ {
+ case PDFOBJ_ARRAY:
+ {
+ CPDF_Array* pArray = (CPDF_Array*)pObj;
+ for (FX_DWORD i = 0; i < pArray->GetCount(); i ++)
+ {
+ CPDF_Object* pElement = pArray->GetElementValue(i);
+ TraceObject(pElement);
+ }
+ }
+ break;
+
+ case PDFOBJ_DICTIONARY:
+ {
+ CPDF_Dictionary* pDict = (CPDF_Dictionary*)pObj;
+
+ FX_POSITION fPos = pDict->GetStartPos();
+ CFX_ByteString csKey;
+ do
+ {
+ CPDF_Object* pElement = pDict->GetNextElement(fPos, csKey);
+ //TRACE(csKey + "\n");
+ if (!pElement) break;
+ TraceObject(pElement);
+ }while (TRUE);
+ }
+ break;
+
+ case PDFOBJ_STREAM:
+ {
+ CPDF_Stream* pStream = (CPDF_Stream*)pObj;
+ CPDF_Dictionary* pDict = pStream->GetDict();
+ TraceObject(pDict);
+ }
+ break;
+
+ case PDFOBJ_REFERENCE:
+ {
+ CPDF_Object* pDirectObj = pObj->GetDirect();
+ TraceObject(pDirectObj);
+ }
+ break;
+
+ case PDFOBJ_BOOLEAN:
+ break;
+ case PDFOBJ_NUMBER:
+ //TRACE("%d\n",(FX_INT32)pObj);
+ break;
+ case PDFOBJ_STRING:
+ //TRACE(((CPDF_String*)pObj)->GetString() + "\n");
+ break;
+ case PDFOBJ_NAME:
+ //TRACE(((CPDF_Name*)pObj)->GetString() + "\n");
+ break;
+ case PDFOBJ_NULL:
+// case PDFOBJ_KEYWORD:
+// case PDFOBJ_EOF:
+ default:
+ break;
+ }
+ if (dwObjNum == 0) return FALSE;
+
+ return TRUE;
+}
+
diff --git a/fpdfsdk/src/fpdf_dataavail.cpp b/fpdfsdk/src/fpdf_dataavail.cpp new file mode 100644 index 0000000000..9e56c2e0c8 --- /dev/null +++ b/fpdfsdk/src/fpdf_dataavail.cpp @@ -0,0 +1,165 @@ +// 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 "../include/fsdk_define.h"
+#include "../include/fpdf_dataavail.h"
+
+extern void ProcessParseError(FX_DWORD err_code);
+class CFPDF_FileAvailWrap : public IFX_FileAvail
+{
+public:
+ CFPDF_FileAvailWrap()
+ {
+ m_pfileAvail = NULL;
+ }
+
+ void Set(FX_FILEAVAIL* pfileAvail)
+ {
+ m_pfileAvail = pfileAvail;
+ }
+
+ virtual FX_BOOL IsDataAvail( FX_FILESIZE offset, FX_DWORD size)
+ {
+ 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;
+ }
+
+ void Set(FPDF_FILEACCESS* pFile)
+ {
+ m_pFileAccess = pFile;
+ }
+
+ virtual FX_FILESIZE GetSize()
+ {
+ return m_pFileAccess->m_FileLen;
+ }
+
+ virtual FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size)
+ {
+ return m_pFileAccess->m_GetBlock(m_pFileAccess->m_Param, offset, (FX_LPBYTE)buffer, size);
+ }
+
+ virtual void Release()
+ {
+ }
+
+private:
+ FPDF_FILEACCESS* m_pFileAccess;
+};
+
+class CFPDF_DownloadHintsWrap : public IFX_DownloadHints
+{
+public:
+ CFPDF_DownloadHintsWrap(FX_DOWNLOADHINTS* pDownloadHints)
+ {
+ m_pDownloadHints = pDownloadHints;
+ }
+public:
+ virtual void AddSegment(FX_FILESIZE offset, FX_DWORD size)
+ {
+ m_pDownloadHints->AddSegment(m_pDownloadHints, offset, size);
+ }
+private:
+ FX_DOWNLOADHINTS* m_pDownloadHints;
+};
+
+class CFPDF_DataAvail : public CFX_Object
+{
+public:
+ CFPDF_DataAvail()
+ {
+ m_pDataAvail = NULL;
+ }
+
+ ~CFPDF_DataAvail()
+ {
+ if (m_pDataAvail) delete m_pDataAvail;
+ }
+
+ CPDF_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 = FX_NEW CFPDF_DataAvail;
+ pAvail->m_FileAvail.Set(file_avail);
+ pAvail->m_FileRead.Set(file);
+ pAvail->m_pDataAvail = FX_NEW CPDF_DataAvail(&pAvail->m_FileAvail, &pAvail->m_FileRead);
+ return pAvail;
+}
+
+DLLEXPORT void STDCALL FPDFAvail_Destroy(FPDF_AVAIL avail)
+{
+ if (avail == NULL) return;
+ delete (CFPDF_DataAvail*)avail;
+}
+
+DLLEXPORT int STDCALL FPDFAvail_IsDocAvail(FPDF_AVAIL avail, FX_DOWNLOADHINTS* hints)
+{
+ if (avail == NULL || hints == NULL) return 0;
+ CFPDF_DownloadHintsWrap hints_wrap(hints);
+ return ((CFPDF_DataAvail*)avail)->m_pDataAvail->IsDocAvail(&hints_wrap);
+}
+
+extern void CheckUnSupportError(CPDF_Document * pDoc, FX_DWORD err_code);
+
+DLLEXPORT FPDF_DOCUMENT STDCALL FPDFAvail_GetDocument(FPDF_AVAIL avail, FPDF_BYTESTRING password)
+{
+ if (avail == NULL) return NULL;
+ CPDF_Parser* pParser = FX_NEW CPDF_Parser;
+ pParser->SetPassword(password);
+
+ FX_DWORD err_code = pParser->StartAsynParse(((CFPDF_DataAvail*)avail)->m_pDataAvail->GetFileRead());
+ if (err_code) {
+ delete pParser;
+ ProcessParseError(err_code);
+ return NULL;
+ }
+ ((CFPDF_DataAvail*)avail)->m_pDataAvail->SetDocument(pParser->GetDocument());
+ CheckUnSupportError(pParser->GetDocument(), FPDF_ERR_SUCCESS);
+ return pParser->GetDocument();
+}
+
+DLLEXPORT int STDCALL FPDFAvail_GetFirstPageNum(FPDF_DOCUMENT doc)
+{
+ if (doc == NULL) return 0;
+ CPDF_Document* pDoc = (CPDF_Document*)doc;
+ return ((CPDF_Parser*)pDoc->GetParser())->GetFirstPageNo();
+}
+
+DLLEXPORT int STDCALL FPDFAvail_IsPageAvail(FPDF_AVAIL avail, int page_index, FX_DOWNLOADHINTS* hints)
+{
+ if (avail == NULL || hints == NULL) return 0;
+ 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 == NULL || hints == NULL) return -1;
+ CFPDF_DownloadHintsWrap hints_wrap(hints);
+ return ((CFPDF_DataAvail*)avail)->m_pDataAvail->IsFormAvail(&hints_wrap);
+}
+
+DLLEXPORT FPDF_BOOL STDCALL FPDFAvail_IsLinearized(FPDF_AVAIL avail)
+{
+ if (avail == NULL) return -1;
+ return ((CFPDF_DataAvail*)avail)->m_pDataAvail->IsLinearizedPDF();
+
+}
diff --git a/fpdfsdk/src/fpdf_ext.cpp b/fpdfsdk/src/fpdf_ext.cpp new file mode 100644 index 0000000000..e2e2d84995 --- /dev/null +++ b/fpdfsdk/src/fpdf_ext.cpp @@ -0,0 +1,245 @@ +// 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 "../include/fsdk_define.h"
+#include "../include/fpdf_ext.h"
+
+#define FPDFSDK_UNSUPPORT_CALL 100
+
+class CFSDK_UnsupportInfo_Adapter
+{
+public:
+ CFSDK_UnsupportInfo_Adapter(UNSUPPORT_INFO* unsp_info){ m_unsp_info = unsp_info;}
+// FX_BOOL NeedToPauseNow();
+ 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(FX_LPVOID 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, 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)
+ {
+ CPDF_Dictionary* pAnnotDict = pPDFAnnot->m_pAnnotDict;
+ CFX_ByteString cbString;
+ if(pAnnotDict->KeyExist("IT"))
+ cbString = pAnnotDict->GetString("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)
+ {
+ CPDF_Dictionary* pAnnotDict = pPDFAnnot->m_pAnnotDict;
+ CFX_ByteString cbString;
+ if(pAnnotDict->KeyExist("FT"))
+ {
+ cbString = pAnnotDict->GetString("FT");
+ }
+ if(cbString.Compare("Sig") == 0)
+ {
+ FPDF_UnSupportError(FPDF_UNSP_ANNOT_SIG);
+ }
+ }
+
+}
+
+FX_BOOL CheckSharedForm(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 == FX_BSTRC("xmlns") && name == FX_BSTRC("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->GetDict("Names");
+ if(pNameDict->KeyExist("EmbeddedFiles"))
+ {
+ FPDF_UnSupportError(FPDF_UNSP_DOC_ATTACHMENT);
+ return;
+ }
+ else if(pNameDict->KeyExist("JavaScript"))
+ {
+ CPDF_Dictionary* pJSDict = pNameDict->GetDict("JavaScript");
+ CPDF_Array * pArray = pJSDict->GetArray("Names");
+ if (pArray) {
+ int nCount = pArray->GetCount();
+ for(int i=0; i<nCount; i++)
+ {
+ CFX_ByteString cbStr = pArray->GetString(i);
+ if(cbStr.Compare("com.adobe.acrobat.SharedReview.Register") == 0)
+ {
+ FPDF_UnSupportError(FPDF_UNSP_DOC_SHAREDREVIEW);
+ return;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // SharedForm
+ CPDF_Metadata metaData;
+ metaData.LoadDoc(pDoc);
+ CXML_Element * pElement = metaData.GetRoot();
+ if(pElement)
+ CheckSharedForm(pElement, "workflowType");
+
+
+ // XFA Forms
+ CPDF_InterForm * pInterForm = FX_NEW CPDF_InterForm(pDoc,FALSE);
+ if (pInterForm)
+ {
+ if(pInterForm->HasXFAForm())
+ {
+ FPDF_UnSupportError(FPDF_UNSP_DOC_XFAFORM);
+ }
+ delete pInterForm;
+ }
+}
+
+DLLEXPORT int FPDFDoc_GetPageMode(FPDF_DOCUMENT document)
+{
+ if (!document) return PAGEMODE_UNKONOWN;
+ CPDF_Dictionary *pRoot = ((CPDF_Document*)document)->GetRoot();
+ if (!pRoot)
+ return PAGEMODE_UNKONOWN;
+ CPDF_Object* pName = pRoot->GetElement("PageMode");
+ if (!pName)
+ return PAGEMODE_USENONE;
+ CFX_ByteString strPageMode = pName->GetString();
+
+ if (strPageMode.IsEmpty()||strPageMode.EqualNoCase(FX_BSTR("UseNone")))
+ return PAGEMODE_USENONE;
+ else if (strPageMode.EqualNoCase(FX_BSTR("UseOutlines")))
+ return PAGEMODE_USEOUTLINES;
+ else if (strPageMode.EqualNoCase(FX_BSTR("UseThumbs")))
+ return PAGEMODE_USETHUMBS;
+ else if (strPageMode.EqualNoCase(FX_BSTR("FullScreen")))
+ return PAGEMODE_FULLSCREEN;
+ else if (strPageMode.EqualNoCase(FX_BSTR("UseOC")))
+ return PAGEMODE_USEOC;
+ else if (strPageMode.EqualNoCase(FX_BSTR("UseAttachments")))
+ return PAGEMODE_USEATTACHMENTS;
+
+ return PAGEMODE_UNKONOWN;
+}
diff --git a/fpdfsdk/src/fpdf_flatten.cpp b/fpdfsdk/src/fpdf_flatten.cpp new file mode 100644 index 0000000000..f04100f95a --- /dev/null +++ b/fpdfsdk/src/fpdf_flatten.cpp @@ -0,0 +1,561 @@ +// 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 "../include/fsdk_define.h"
+#include "../include/fpdf_flatten.h"
+
+typedef CFX_ArrayTemplate<CPDF_Dictionary*> CPDF_ObjectArray;
+typedef CFX_ArrayTemplate<CPDF_Rect> CPDF_RectArray;
+
+enum FPDF_TYPE { MAX, MIN };
+enum FPDF_VALUE { TOP, LEFT, RIGHT, BOTTOM };
+
+FX_BOOL IsValiableRect(CPDF_Rect rect, CPDF_Rect 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;
+}
+
+
+FX_BOOL GetContentsRect( CPDF_Document * pDoc, CPDF_Dictionary* pDict, CPDF_RectArray * pRectArray )
+{
+ CPDF_Page* pPDFPage = FX_NEW CPDF_Page;
+ pPDFPage->Load( pDoc, pDict, FALSE );
+ pPDFPage->ParseContent();
+
+ FX_POSITION pos = pPDFPage->GetFirstObjectPosition();
+
+ while (pos)
+ {
+ CPDF_PageObject* pPageObject = pPDFPage->GetNextObject(pos);
+ if (!pPageObject)continue;
+
+ CPDF_Rect 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->GetRect("MediaBox")))
+ {
+ pRectArray->Add(rc);
+ }
+ }
+
+ delete pPDFPage;
+ return TRUE;
+}
+
+
+void ParserStream( CPDF_Dictionary * pPageDic, CPDF_Dictionary* pStream, CPDF_RectArray * pRectArray, CPDF_ObjectArray * pObjectArray )
+{
+ if (!pStream)return;
+ CPDF_Rect rect;
+ if (pStream->KeyExist("Rect"))
+ rect = pStream->GetRect("Rect");
+ else if (pStream->KeyExist("BBox"))
+ rect = pStream->GetRect("BBox");
+
+ if (IsValiableRect(rect, pPageDic->GetRect("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->GetArray("Annots");
+ if (pAnnots)
+ {
+ FX_DWORD dwSize = pAnnots->GetCount();
+
+ for (int i = 0; i < (int)dwSize; i++)
+ {
+ CPDF_Object* pObj = pAnnots->GetElementValue(i);
+
+ if (!pObj)continue;
+
+ if (pObj->GetType() == PDFOBJ_DICTIONARY)
+ {
+ CPDF_Dictionary* pAnnotDic = (CPDF_Dictionary*)pObj;
+ CFX_ByteString sSubtype = pAnnotDic->GetString("Subtype");
+ if (sSubtype == "Popup")continue;
+
+ int nAnnotFlag = pAnnotDic->GetInteger("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;
+ }else{
+ return FLATTEN_NOTINGTODO;
+ }
+}
+
+
+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] = CPDF_Rect(array.GetAt(i)).left;
+
+ break;
+ }
+ case TOP:
+ {
+ for (int i = 0; i < nRects; i++)
+ pArray[i] = CPDF_Rect(array.GetAt(i)).top;
+
+ break;
+ }
+ case RIGHT:
+ {
+ for (int i = 0; i < nRects; i++)
+ pArray[i] = CPDF_Rect(array.GetAt(i)).right;
+
+ break;
+ }
+ case BOTTOM:
+ {
+ for (int i = 0; i < nRects; i++)
+ pArray[i] = CPDF_Rect(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;
+}
+
+CPDF_Rect CalculateRect( CPDF_RectArray * pRectArray )
+{
+
+ CPDF_Rect 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->GetStream("Contents");
+ if (!pContentsObj)
+ {
+ pContentsObj = pPage->GetArray("Contents");
+ }
+
+ if (!pContentsObj)
+ {
+ //Create a new contents dictionary
+ if (!key.IsEmpty())
+ {
+ CPDF_Stream* pNewContents = FX_NEW CPDF_Stream(NULL, 0, FX_NEW CPDF_Dictionary);
+ if (!pNewContents)return;
+ pPage->SetAtReference("Contents", pDocument, pDocument->AddIndirectObject(pNewContents));
+
+ CFX_ByteString sStream;
+ sStream.Format("q 1 0 0 1 0 0 cm /%s Do Q", (FX_LPCSTR)key);
+ pNewContents->SetData((FX_LPCBYTE)sStream, sStream.GetLength(), FALSE, FALSE);
+ }
+ return;
+ }
+
+ int iType = pContentsObj->GetType();
+ CPDF_Array* pContentsArray = NULL;
+
+ switch(iType)
+ {
+ case PDFOBJ_STREAM:
+ {
+ pContentsArray = FX_NEW CPDF_Array;
+ CPDF_Stream* pContents = (CPDF_Stream*)pContentsObj;
+ FX_DWORD dwObjNum = pDocument->AddIndirectObject(pContents);
+ CPDF_StreamAcc acc;
+ acc.LoadAllData(pContents);
+ CFX_ByteString sStream = "q\n";
+ CFX_ByteString sBody = CFX_ByteString((FX_LPCSTR)acc.GetData(), acc.GetSize());
+ sStream = sStream + sBody + "\nQ";
+ pContents->SetData((FX_LPCBYTE)sStream, sStream.GetLength(), FALSE, FALSE);
+ pContentsArray->AddReference(pDocument, dwObjNum);
+ break;
+ }
+
+ case PDFOBJ_ARRAY:
+ {
+ pContentsArray = (CPDF_Array*)pContentsObj;
+ break;
+ }
+ default:
+ break;
+ }
+
+ if (!pContentsArray)return;
+
+ FX_DWORD dwObjNum = pDocument->AddIndirectObject(pContentsArray);
+ pPage->SetAtReference("Contents", pDocument, dwObjNum);
+
+ if (!key.IsEmpty())
+ {
+ CPDF_Stream* pNewContents = FX_NEW CPDF_Stream(NULL, 0, FX_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", (FX_LPCSTR)key);
+ pNewContents->SetData((FX_LPCBYTE)sStream, sStream.GetLength(), FALSE, FALSE);
+ }
+}
+
+CFX_AffineMatrix GetMatrix(CPDF_Rect rcAnnot, CPDF_Rect rcStream, CFX_AffineMatrix matrix)
+{
+ if(rcStream.IsEmpty())
+ return CFX_AffineMatrix();
+
+ 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_AffineMatrix(a, 0, 0, d, e, f);
+}
+
+void GetOffset(FX_FLOAT& fa, FX_FLOAT& fd, FX_FLOAT& fe, FX_FLOAT& ff, CPDF_Rect rcAnnot, CPDF_Rect rcStream, CFX_AffineMatrix 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 = FX_MIN(FX_MIN(x1, x2), FX_MIN(x3, x4));
+ FX_FLOAT bottom = FX_MIN(FX_MIN(y1, y2), FX_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)
+{
+ if (!page)
+ {
+ return FLATTEN_FAIL;
+ }
+
+ CPDF_Page * pPage = (CPDF_Page*)( page );
+ 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_NOTINGTODO)
+ {
+ return FLATTEN_NOTINGTODO;
+ }else if (iRet == FLATTEN_FAIL)
+ {
+ return FLATTEN_FAIL;
+ }
+
+ CPDF_Rect rcOriginalCB;
+ CPDF_Rect rcMerger = CalculateRect( &RectArray );
+ CPDF_Rect rcOriginalMB = pPageDict->GetRect("MediaBox");
+
+ if (pPageDict->KeyExist("CropBox"))
+ rcOriginalMB = pPageDict->GetRect("CropBox");
+
+ if (rcOriginalMB.IsEmpty())
+ {
+ rcOriginalMB = CPDF_Rect(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->GetRect("ArtBox");
+ else
+ rcOriginalCB = rcOriginalMB;
+
+ if (!rcOriginalMB.IsEmpty())
+ {
+ CPDF_Array* pMediaBox = FX_NEW CPDF_Array();
+
+ pMediaBox->Add(FX_NEW CPDF_Number(rcOriginalMB.left));
+ pMediaBox->Add(FX_NEW CPDF_Number(rcOriginalMB.bottom));
+ pMediaBox->Add(FX_NEW CPDF_Number(rcOriginalMB.right));
+ pMediaBox->Add(FX_NEW CPDF_Number(rcOriginalMB.top));
+
+ pPageDict->SetAt("MediaBox",pMediaBox);
+ }
+
+ if (!rcOriginalCB.IsEmpty())
+ {
+ CPDF_Array* pCropBox = FX_NEW CPDF_Array();
+ pCropBox->Add(FX_NEW CPDF_Number(rcOriginalCB.left));
+ pCropBox->Add(FX_NEW CPDF_Number(rcOriginalCB.bottom));
+ pCropBox->Add(FX_NEW CPDF_Number(rcOriginalCB.right));
+ pCropBox->Add(FX_NEW CPDF_Number(rcOriginalCB.top));
+ pPageDict->SetAt("ArtBox", pCropBox);
+ }
+
+ CPDF_Dictionary* pRes = NULL;
+ pRes = pPageDict->GetDict("Resources");
+ if (!pRes)
+ {
+ pRes = FX_NEW CPDF_Dictionary;
+ pPageDict->SetAt( "Resources", pRes );
+ }
+
+ CPDF_Stream* pNewXObject = FX_NEW CPDF_Stream(NULL, 0, FX_NEW CPDF_Dictionary);
+ FX_DWORD dwObjNum = pDocument->AddIndirectObject(pNewXObject);
+ CPDF_Dictionary* pPageXObject = pRes->GetDict("XObject");
+ if (!pPageXObject)
+ {
+ pPageXObject = FX_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] = {0};
+ 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 = FX_NEW CPDF_Dictionary;
+ pNewOXbjectDic->SetAt("Resources", pNewXORes);
+ pNewOXbjectDic->SetAtName("Type", "XObject");
+ pNewOXbjectDic->SetAtName("Subtype", "Form");
+ pNewOXbjectDic->SetAtInteger("FormType", 1);
+ pNewOXbjectDic->SetAtName("Name", "FRM");
+ CPDF_Rect rcBBox = pPageDict->GetRect("ArtBox");
+ pNewOXbjectDic->SetAtRect("BBox", rcBBox);
+ }
+
+ for (int i = 0; i < nStreams; i++)
+ {
+ CPDF_Dictionary* pAnnotDic = ObjectArray.GetAt(i);
+ if (!pAnnotDic)continue;
+
+ CPDF_Rect rcAnnot = pAnnotDic->GetRect("Rect");
+ rcAnnot.Normalize();
+
+ CFX_ByteString sAnnotState = pAnnotDic->GetString("AS");
+ CPDF_Dictionary* pAnnotAP = pAnnotDic->GetDict("AP");
+ if (!pAnnotAP)continue;
+
+ CPDF_Stream* pAPStream = pAnnotAP->GetStream("N");
+ if (!pAPStream)
+ {
+ CPDF_Dictionary* pAPDic = pAnnotAP->GetDict("N");
+ if (!pAPDic)continue;
+
+ if (!sAnnotState.IsEmpty())
+ {
+ pAPStream = pAPDic->GetStream(sAnnotState);
+ }
+ else
+ {
+ FX_POSITION pos = pAPDic->GetStartPos();
+ if (pos)
+ {
+ CFX_ByteString sKey;
+ CPDF_Object* pFirstObj = pAPDic->GetNextElement(pos, sKey);
+ if (pFirstObj)
+ {
+ if (pFirstObj->GetType() == PDFOBJ_REFERENCE)
+ pFirstObj = pFirstObj->GetDirect();
+
+ if (pFirstObj->GetType() != PDFOBJ_STREAM)
+ continue;
+
+ pAPStream = (CPDF_Stream*)pFirstObj;
+ }
+ }
+ }
+ }
+
+ if (!pAPStream)continue;
+
+ CPDF_Dictionary* pAPDic = pAPStream->GetDict();
+ CFX_AffineMatrix matrix = pAPDic->GetMatrix("Matrix");
+
+ CPDF_Rect rcStream;
+ if (pAPDic->KeyExist("Rect"))
+ rcStream = pAPDic->GetRect("Rect");
+ else if (pAPDic->KeyExist("BBox"))
+ rcStream = pAPDic->GetRect("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->GetDict("XObject");
+ if (!pXObject)
+ {
+ pXObject = FX_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);
+
+ FX_LPCBYTE 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_AffineMatrix 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, (FX_LPCSTR)sFormName);
+ sStream += sTemp;
+
+ pNewXObject->SetData((FX_LPCBYTE)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 new file mode 100644 index 0000000000..29496e05dc --- /dev/null +++ b/fpdfsdk/src/fpdf_progressive.cpp @@ -0,0 +1,114 @@ +// 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 "../include/fpdf_progressive.h"
+#include "../include/fsdk_define.h"
+#include "../include/fpdfview.h"
+#include "../include/fsdk_rendercontext.h"
+
+extern void (*Func_RenderPage)( CRenderContext*, 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 );
+
+extern void DropContext(void* data);
+
+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 == NULL || page == NULL)
+ return FPDF_RENDER_FAILED;
+
+ if (!pause)
+ return FPDF_RENDER_FAILED;
+
+ if (pause->version !=1)
+ return FPDF_RENDER_FAILED;
+
+ CPDF_Page* pPage = (CPDF_Page*)page;
+
+// FXMT_CSLOCK_OBJ(&pPage->m_PageLock);
+
+ CRenderContext* pContext = FX_NEW CRenderContext;
+ pPage->SetPrivateData((void*)1, pContext, DropContext );
+#ifdef _SKIA_SUPPORT_
+ pContext->m_pDevice = FX_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 = FX_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);
+
+ if (flags & FPDF_NO_CATCH)
+ Func_RenderPage(pContext, page, start_x, start_y, size_x, size_y, rotate, flags,FALSE, &IPauseAdapter);
+ else {
+ try {
+ Func_RenderPage(pContext, page, start_x, start_y, size_x, size_y, rotate, flags,FALSE, &IPauseAdapter);
+ }
+ catch (...){}
+ }
+
+ if ( pContext->m_pRenderer )
+ {
+ CPDF_ProgressiveRenderer::RenderStatus status = CPDF_ProgressiveRenderer::Failed;
+ status = pContext->m_pRenderer->GetStatus();
+ return status;
+ }
+ return FPDF_RENDER_FAILED;
+}
+
+DLLEXPORT int STDCALL FPDF_RenderPage_Continue(FPDF_PAGE page,IFSDK_PAUSE * pause)
+{
+ if (page == NULL)
+ return FPDF_RENDER_FAILED;
+
+ if (!pause)
+ return FPDF_RENDER_FAILED;
+
+ if (pause->version !=1)
+ return FPDF_RENDER_FAILED;
+
+ CPDF_Page* pPage = (CPDF_Page*)page;
+
+// FXMT_CSLOCK_OBJ(&pPage->m_PageLock);
+
+ CRenderContext * pContext = (CRenderContext*)pPage->GetPrivateData((void*)1);
+ if (pContext && pContext->m_pRenderer)
+ {
+ IFSDK_PAUSE_Adapter IPauseAdapter(pause);
+ pContext->m_pRenderer->Continue(&IPauseAdapter);
+
+ CPDF_ProgressiveRenderer::RenderStatus status = CPDF_ProgressiveRenderer::Failed;
+ status = pContext->m_pRenderer->GetStatus();
+ return status;
+ }
+ return FPDF_RENDER_FAILED;
+}
+
+
+DLLEXPORT void STDCALL FPDF_RenderPage_Close(FPDF_PAGE page)
+{
+ if (page == NULL) return;
+ CPDF_Page* pPage = (CPDF_Page*)page;
+
+// FXMT_CSLOCK_OBJ(&pPage->m_PageLock);
+
+ CRenderContext * pContext = (CRenderContext*)pPage->GetPrivateData((void*)1);
+ if (pContext)
+ {
+ pContext->m_pDevice->RestoreState();
+ delete pContext;
+ pPage->RemovePrivateData((void*)1);
+ }
+}
+
diff --git a/fpdfsdk/src/fpdf_searchex.cpp b/fpdfsdk/src/fpdf_searchex.cpp new file mode 100644 index 0000000000..540cd552fa --- /dev/null +++ b/fpdfsdk/src/fpdf_searchex.cpp @@ -0,0 +1,15 @@ +// 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 "../include/fsdk_define.h"
+#include "../include/fpdf_searchex.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 new file mode 100644 index 0000000000..4c6b784981 --- /dev/null +++ b/fpdfsdk/src/fpdf_sysfontinfo.cpp @@ -0,0 +1,163 @@ +// 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 "../include/fsdk_define.h" +#include "../include/fpdf_sysfontinfo.h" + +class CSysFontInfo_Ext : public IFX_SystemFontInfo +{ +public: + FPDF_SYSFONTINFO* m_pInfo; + + virtual void Release() + { + if (m_pInfo->Release) + m_pInfo->Release(m_pInfo); + delete this; + } + + virtual FX_BOOL EnumFontList(CFX_FontMapper* pMapper) + { + if (m_pInfo->EnumFonts) { + m_pInfo->EnumFonts(m_pInfo, pMapper); + return TRUE; + } + return FALSE; + } + + virtual void* MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR family, FX_BOOL& bExact) + { + if (m_pInfo->MapFont) + return m_pInfo->MapFont(m_pInfo, weight, bItalic, charset, pitch_family, family, &bExact); + return NULL; + } + + virtual void* GetFont(FX_LPCSTR family) + { + if (m_pInfo->GetFont) + return m_pInfo->GetFont(m_pInfo, family); + return NULL; + } + + virtual FX_DWORD GetFontData(void* hFont, FX_DWORD table, FX_LPBYTE buffer, FX_DWORD size) + { + if (m_pInfo->GetFontData) + return m_pInfo->GetFontData(m_pInfo, hFont, table, buffer, size); + return 0; + } + + virtual FX_BOOL GetFaceName(void* hFont, CFX_ByteString& name) + { + if (m_pInfo->GetFaceName == NULL) 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; + } + + virtual FX_BOOL GetFontCharset(void* hFont, int& charset) + { + if (m_pInfo->GetFontCharset) { + charset = m_pInfo->GetFontCharset(m_pInfo, hFont); + return TRUE; + } + return FALSE; + } + + virtual void DeleteFont(void* hFont) + { + if (m_pInfo->DeleteFont) + m_pInfo->DeleteFont(m_pInfo, hFont); + } +}; + +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; + + CSysFontInfo_Ext* pFontInfo = FX_NEW CSysFontInfo_Ext; + pFontInfo->m_pInfo = pFontInfoExt; + CFX_GEModule::Get()->GetFontMgr()->SetSystemFontInfo(pFontInfo); +} + +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(); + if (pFontInfo == NULL) 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 new file mode 100644 index 0000000000..f171c5e526 --- /dev/null +++ b/fpdfsdk/src/fpdf_transformpage.cpp @@ -0,0 +1,325 @@ +// 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 "../include/fsdk_define.h"
+#include "../include/fpdf_transformpage.h"
+
+DLLEXPORT void STDCALL FPDFPage_SetMediaBox(FPDF_PAGE page, float left, float bottom, float right, float top)
+{
+ if(!page)
+ return;
+ CPDF_Page* pPage = (CPDF_Page*)page;
+ CPDF_Dictionary* pPageDict = pPage->m_pFormDict;
+ CPDF_Array* pMediaBoxArray = FX_NEW CPDF_Array;
+ pMediaBoxArray->Add(FX_NEW CPDF_Number(left));
+ pMediaBoxArray->Add(FX_NEW CPDF_Number(bottom));
+ pMediaBoxArray->Add(FX_NEW CPDF_Number(FX_FLOAT(right)));
+ pMediaBoxArray->Add(FX_NEW CPDF_Number(FX_FLOAT(top)));
+
+ pPageDict->SetAt("MediaBox", pMediaBoxArray);
+}
+
+
+DLLEXPORT void STDCALL FPDFPage_SetCropBox(FPDF_PAGE page, float left, float bottom, float right, float top)
+{
+ if(!page)
+ return;
+ CPDF_Page* pPage = (CPDF_Page*)page;
+ CPDF_Dictionary* pPageDict = pPage->m_pFormDict;
+ CPDF_Array* pCropBoxArray = FX_NEW CPDF_Array;
+ pCropBoxArray->Add(FX_NEW CPDF_Number(left));
+ pCropBoxArray->Add(FX_NEW CPDF_Number(bottom));
+ pCropBoxArray->Add(FX_NEW CPDF_Number(FX_FLOAT(right)));
+ pCropBoxArray->Add(FX_NEW CPDF_Number(FX_FLOAT(top)));
+
+
+ pPageDict->SetAt("CropBox", pCropBoxArray);
+}
+
+
+DLLEXPORT FX_BOOL STDCALL FPDFPage_GetMediaBox(FPDF_PAGE page, float* left, float* bottom, float* right, float* top)
+{
+ if(!page)
+ return FALSE;
+ CPDF_Page* pPage = (CPDF_Page*)page;
+ CPDF_Dictionary* pPageDict = pPage->m_pFormDict;
+ CPDF_Array* pArray = pPageDict->GetArray("MediaBox");
+ if(pArray)
+ {
+ *left = pArray->GetFloat(0);
+ *bottom = pArray->GetFloat(1);
+ *right = pArray->GetFloat(2);
+ *top = pArray->GetFloat(3);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+DLLEXPORT FPDF_BOOL STDCALL FPDFPage_GetCropBox(FPDF_PAGE page, float* left, float* bottom, float* right, float* top)
+{
+ if(!page)
+ return FALSE;
+ CPDF_Page* pPage = (CPDF_Page*)page;
+ CPDF_Dictionary* pPageDict = pPage->m_pFormDict;
+ CPDF_Array* pArray = pPageDict->GetArray("CropBox");
+ if(pArray)
+ {
+ *left = pArray->GetFloat(0);
+ *bottom = pArray->GetFloat(1);
+ *right = pArray->GetFloat(2);
+ *top = pArray->GetFloat(3);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+DLLEXPORT FPDF_BOOL STDCALL FPDFPage_TransFormWithClip(FPDF_PAGE page, FS_MATRIX* matrix, FS_RECTF* clipRect)
+{
+ if(!page)
+ 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_Page* pPage = (CPDF_Page*)page;
+ CPDF_Dictionary* pPageDic = pPage->m_pFormDict;
+ CPDF_Object* pContentObj = pPageDic->GetElement("Contents");
+ if(!pContentObj)
+ pContentObj = pPageDic->GetArray("Contents");
+ if(!pContentObj)
+ return FALSE;
+
+ CPDF_Dictionary* pDic = FX_NEW CPDF_Dictionary;
+ CPDF_Stream* pStream = FX_NEW CPDF_Stream(NULL,0, pDic);
+ pStream->SetData(textBuf.GetBuffer(), textBuf.GetSize(), FALSE, FALSE);
+ CPDF_Document* pDoc = pPage->m_pDocument;
+ if(!pDoc)
+ return FALSE;
+ pDoc->AddIndirectObject(pStream);
+
+ pDic = FX_NEW CPDF_Dictionary;
+ CPDF_Stream* pEndStream = FX_NEW CPDF_Stream(NULL,0, pDic);
+ pEndStream->SetData((FX_LPCBYTE)" Q", 2, FALSE, FALSE);
+ pDoc->AddIndirectObject(pEndStream);
+
+ CPDF_Array* pContentArray = NULL;
+ if (pContentObj && pContentObj->GetType() == PDFOBJ_ARRAY)
+ {
+ pContentArray = (CPDF_Array*)pContentObj;
+ CPDF_Reference* pRef = FX_NEW CPDF_Reference(pDoc, pStream->GetObjNum());
+ pContentArray->InsertAt(0, pRef);
+ pContentArray->AddReference(pDoc,pEndStream);
+
+ }
+ else if(pContentObj && pContentObj->GetType() == PDFOBJ_REFERENCE)
+ {
+ CPDF_Reference* pReference = (CPDF_Reference*)pContentObj;
+ CPDF_Object* pDirectObj = pReference->GetDirect();
+ if(pDirectObj != NULL)
+ {
+ if(pDirectObj->GetType() == PDFOBJ_ARRAY)
+ {
+ pContentArray = (CPDF_Array*)pDirectObj;
+ CPDF_Reference* pRef = FX_NEW CPDF_Reference(pDoc, pStream->GetObjNum());
+ pContentArray->InsertAt(0, pRef);
+ pContentArray->AddReference(pDoc,pEndStream);
+
+ }
+ else if(pDirectObj->GetType() == PDFOBJ_STREAM)
+ {
+ pContentArray = FX_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->GetDict(FX_BSTRC("Resources"));
+ if(pRes)
+ {
+ CPDF_Dictionary* pPattenDict = pRes->GetDict(FX_BSTRC("Pattern"));
+ if(pPattenDict)
+ {
+ FX_POSITION pos = pPattenDict->GetStartPos();
+ while(pos)
+ {
+ CPDF_Dictionary* pDict = NULL;
+ CFX_ByteString key;
+ CPDF_Object* pObj = pPattenDict->GetNextElement(pos, key);
+ if(pObj->GetType() == PDFOBJ_REFERENCE)
+ pObj = pObj->GetDirect();
+ if(pObj->GetType() == PDFOBJ_DICTIONARY)
+ {
+ pDict = (CPDF_Dictionary*)pObj;
+ }
+ else if(pObj->GetType() == PDFOBJ_STREAM)
+ {
+ pDict = ((CPDF_Stream*)pObj)->GetDict();
+ }
+ else
+ continue;
+
+ CFX_AffineMatrix m = pDict->GetMatrix(FX_BSTRC("Matrix"));
+ CFX_AffineMatrix t = *(CFX_AffineMatrix*)matrix;
+ m.Concat(t);
+ pDict->SetAtMatrix(FX_BSTRC("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 == NULL)
+ return;
+ CFX_AffineMatrix 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->m_Type != PDFPAGE_SHADING)
+ pPageObj->TransformClipPath(matrix);
+ pPageObj->TransformGeneralState(matrix);
+}
+
+
+DLLEXPORT FPDF_CLIPPATH STDCALL FPDF_CreateClipPath(float left, float bottom, float right, float top)
+{
+ CPDF_ClipPath* pNewClipPath = FX_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)
+{
+ if(clipPath)
+ delete (CPDF_ClipPath*)clipPath;
+}
+
+void OutputPath(CFX_ByteTextBuf& buf, CPDF_Path path)
+{
+ const CFX_PathData* pPathData = path;
+ if (pPathData == NULL) 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)
+{
+ if(!page)
+ return;
+ CPDF_Page* pPage = (CPDF_Page*)page;
+ CPDF_Dictionary* pPageDic = pPage->m_pFormDict;
+ CPDF_Object* pContentObj = pPageDic->GetElement("Contents");
+ if(!pContentObj)
+ pContentObj = pPageDic->GetArray("Contents");
+ 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 = FX_NEW CPDF_Dictionary;
+ CPDF_Stream* pStream = FX_NEW CPDF_Stream(NULL,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 = NULL;
+ if (pContentObj && pContentObj->GetType() == PDFOBJ_ARRAY)
+ {
+ pContentArray = (CPDF_Array*)pContentObj;
+ CPDF_Reference* pRef = FX_NEW CPDF_Reference(pDoc, pStream->GetObjNum());
+ pContentArray->InsertAt(0, pRef);
+
+ }
+ else if(pContentObj && pContentObj->GetType() == PDFOBJ_REFERENCE)
+ {
+ CPDF_Reference* pReference = (CPDF_Reference*)pContentObj;
+ CPDF_Object* pDirectObj = pReference->GetDirect();
+ if(pDirectObj != NULL)
+ {
+ if(pDirectObj->GetType() == PDFOBJ_ARRAY)
+ {
+ pContentArray = (CPDF_Array*)pDirectObj;
+ CPDF_Reference* pRef = FX_NEW CPDF_Reference(pDoc, pStream->GetObjNum());
+ pContentArray->InsertAt(0, pRef);
+
+ }
+ else if(pDirectObj->GetType() == PDFOBJ_STREAM)
+ {
+ pContentArray = FX_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 new file mode 100644 index 0000000000..d5d9000bd2 --- /dev/null +++ b/fpdfsdk/src/fpdfdoc.cpp @@ -0,0 +1,259 @@ +// 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 "../include/fsdk_define.h"
+#include "../include/fpdfdoc.h"
+
+static int this_module = 0;
+
+static CPDF_Bookmark FindBookmark(CPDF_BookmarkTree& tree, CPDF_Bookmark This, const CFX_WideString& title)
+{
+ if (This != NULL) {
+ // First check this item
+ CFX_WideString this_title = This.GetTitle();
+ if (this_title.CompareNoCase(title) == 0)
+ return This;
+ }
+ // go into children items
+ CPDF_Bookmark Child = tree.GetFirstChild(This);
+ while (Child != NULL) {
+ // check if this item
+ CPDF_Bookmark Found = FindBookmark(tree, Child, title);
+ if (Found) return Found;
+ Child = tree.GetNextSibling(Child);
+ }
+ return NULL;
+}
+
+DLLEXPORT FPDF_BOOKMARK STDCALL FPDFBookmark_Find(FPDF_DOCUMENT document, FPDF_WIDESTRING title)
+{
+ if (document == NULL) return NULL;
+ if (title == NULL || title[0] == 0) return NULL;
+
+ CPDF_Document* pDoc = (CPDF_Document*)document;
+ CPDF_BookmarkTree tree(pDoc);
+
+ CFX_WideString wstr = CFX_WideString::FromUTF16LE(title);
+ return FindBookmark(tree, NULL, wstr);
+}
+
+DLLEXPORT FPDF_DEST STDCALL FPDFBookmark_GetDest(FPDF_DOCUMENT document, FPDF_BOOKMARK bookmark)
+{
+ if (document == NULL) return NULL;
+ if (bookmark == NULL) return NULL;
+
+ CPDF_Bookmark Bookmark = (CPDF_Dictionary*)bookmark;
+ CPDF_Document* pDoc = (CPDF_Document*)document;
+ CPDF_Dest dest = Bookmark.GetDest(pDoc);
+ if (dest != NULL) return dest;
+
+ // If this bookmark is not directly associated with a dest, we try to get action
+ CPDF_Action Action = Bookmark.GetAction();
+ if (Action == NULL) return NULL;
+ return Action.GetDest(pDoc);
+}
+
+DLLEXPORT FPDF_ACTION STDCALL FPDFBookmark_GetAction(FPDF_BOOKMARK bookmark)
+{
+ if (bookmark == NULL) return NULL;
+
+ CPDF_Bookmark Bookmark = (CPDF_Dictionary*)bookmark;
+ return Bookmark.GetAction();
+}
+
+DLLEXPORT unsigned long STDCALL FPDFAction_GetType(FPDF_ACTION action)
+{
+ if (action == NULL) return 0;
+
+ CPDF_Action Action = (CPDF_Dictionary*)action;
+ 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;
+ }
+ return PDFACTION_UNSUPPORTED;
+}
+
+DLLEXPORT FPDF_DEST STDCALL FPDFAction_GetDest(FPDF_DOCUMENT document, FPDF_ACTION action)
+{
+ if (document == NULL) return NULL;
+ if (action == NULL) return NULL;
+ CPDF_Document* pDoc = (CPDF_Document*)document;
+ CPDF_Action Action = (CPDF_Dictionary*)action;
+
+ return Action.GetDest(pDoc);
+}
+
+DLLEXPORT unsigned long STDCALL FPDFAction_GetURIPath(FPDF_DOCUMENT document, FPDF_ACTION action,
+ void* buffer, unsigned long buflen)
+{
+ if (document == NULL) return 0;
+ if (action == NULL) return 0;
+ CPDF_Document* pDoc = (CPDF_Document*)document;
+ CPDF_Action Action = (CPDF_Dictionary*)action;
+
+ CFX_ByteString path = Action.GetURI(pDoc);
+ unsigned long len = path.GetLength() + 1;
+ if (buffer != NULL && buflen >= len)
+ FXSYS_memcpy(buffer, (FX_LPCSTR)path, len);
+ return len;
+}
+
+DLLEXPORT unsigned long STDCALL FPDFDest_GetPageIndex(FPDF_DOCUMENT document, FPDF_DEST dest)
+{
+ if (document == NULL) return 0;
+ if (dest == NULL) return 0;
+ CPDF_Document* pDoc = (CPDF_Document*)document;
+ CPDF_Dest Dest = (CPDF_Array*)dest;
+
+ return Dest.GetPageIndex(pDoc);
+}
+
+static void ReleaseLinkList(FX_LPVOID data)
+{
+ delete (CPDF_LinkList*)data;
+}
+
+DLLEXPORT FPDF_LINK STDCALL FPDFLink_GetLinkAtPoint(FPDF_PAGE page, double x, double y)
+{
+ if (page == NULL) return NULL;
+ CPDF_Page* pPage = (CPDF_Page*)page;
+
+ // Link list is stored with the document
+ CPDF_Document* pDoc = pPage->m_pDocument;
+ CPDF_LinkList* pLinkList = (CPDF_LinkList*)pDoc->GetPrivateData(&this_module);
+ if (pLinkList == NULL) {
+ pLinkList = FX_NEW CPDF_LinkList(pDoc);
+ pDoc->SetPrivateData(&this_module, pLinkList, ReleaseLinkList);
+ }
+
+ return pLinkList->GetLinkAtPoint(pPage, (FX_FLOAT)x, (FX_FLOAT)y);
+}
+
+DLLEXPORT FPDF_DEST STDCALL FPDFLink_GetDest(FPDF_DOCUMENT document, FPDF_LINK link)
+{
+ if (document == NULL) return NULL;
+ CPDF_Document* pDoc = (CPDF_Document*)document;
+ if (link == NULL) return NULL;
+ CPDF_Link Link = (CPDF_Dictionary*)link;
+
+ FPDF_DEST dest = Link.GetDest(pDoc);
+ 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 == NULL) return NULL;
+ return Action.GetDest(pDoc);
+}
+
+DLLEXPORT FPDF_ACTION STDCALL FPDFLink_GetAction(FPDF_LINK link)
+{
+ if (link == NULL) return NULL;
+ CPDF_Link Link = (CPDF_Dictionary*)link;
+
+ return Link.GetAction();
+}
+
+DLLEXPORT FPDF_BOOL STDCALL FPDFLink_Enumerate(FPDF_PAGE page, int* startPos, FPDF_LINK* linkAnnot)
+{
+ if(!page || !startPos || !linkAnnot)
+ return FALSE;
+ CPDF_Page* pPage = (CPDF_Page*)page;
+ if(!pPage->m_pFormDict) return FALSE;
+ CPDF_Array* pAnnots = pPage->m_pFormDict->GetArray("Annots");
+ if(!pAnnots) return FALSE;
+ for (int i = *startPos; i < (int)pAnnots->GetCount(); i ++) {
+ CPDF_Dictionary* pDict = (CPDF_Dictionary*)pAnnots->GetElementValue(i);
+ if (pDict == NULL || pDict->GetType() != PDFOBJ_DICTIONARY) continue;
+ if(pDict->GetString(FX_BSTRC("Subtype")).Equal(FX_BSTRC("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 = (CPDF_Dictionary*)linkAnnot;
+ CPDF_Rect rt = pAnnotDict->GetRect(FX_BSTRC("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 = (CPDF_Dictionary*)linkAnnot;
+ CPDF_Array* pArray = pAnnotDict->GetArray(FX_BSTRC("QuadPoints"));
+ if (pArray == NULL)
+ return 0;
+ else
+ 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 = (CPDF_Dictionary*)linkAnnot;
+ CPDF_Array* pArray = pAnnotDict->GetArray(FX_BSTRC("QuadPoints"));
+ if (pArray) {
+ if (0 > quadIndex || quadIndex >= (int)pArray->GetCount()/8 ||
+ ((quadIndex*8+7) >= (int)pArray->GetCount())) return FALSE;
+ quadPoints->x1 = pArray->GetNumber(quadIndex*8);
+ quadPoints->y1 = pArray->GetNumber(quadIndex*8+1);
+ quadPoints->x2 = pArray->GetNumber(quadIndex*8+2);
+ quadPoints->y2 = pArray->GetNumber(quadIndex*8+3);
+ quadPoints->x3 = pArray->GetNumber(quadIndex*8+4);
+ quadPoints->y3 = pArray->GetNumber(quadIndex*8+5);
+ quadPoints->x4 = pArray->GetNumber(quadIndex*8+6);
+ quadPoints->y4 = pArray->GetNumber(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 (doc == NULL || tag == NULL) return 0;
+
+ CPDF_Document* pDoc = (CPDF_Document*)doc;
+ // Get info dictionary
+ CPDF_Dictionary* pInfo = pDoc->GetInfo();
+ if (pInfo == NULL) return 0;
+
+ CFX_WideString text = pInfo->GetUnicodeText(tag);
+
+ // Use UTF-16LE encoding
+ CFX_ByteString bstr = text.UTF16LE_Encode();
+ unsigned long len = bstr.GetLength();
+ if (buffer != NULL || buflen >= len+2) {
+ FXSYS_memcpy(buffer, (FX_LPCSTR)bstr, len);
+ // use double zero as trailer
+ ((FX_BYTE*)buffer)[len] = ((FX_BYTE*)buffer)[len+1] = 0;
+ }
+ return len+2;
+}
+
diff --git a/fpdfsdk/src/fpdfeditimg.cpp b/fpdfsdk/src/fpdfeditimg.cpp new file mode 100644 index 0000000000..ea81203cad --- /dev/null +++ b/fpdfsdk/src/fpdfeditimg.cpp @@ -0,0 +1,74 @@ +// 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 "../include/fsdk_define.h"
+#include "../include/fpdfedit.h"
+
+
+DLLEXPORT FPDF_PAGEOBJECT STDCALL FPDFPageObj_NewImgeObj(FPDF_DOCUMENT document)
+{
+ if (!document)
+ return NULL;
+ CPDF_ImageObject* pImageObj = FX_NEW CPDF_ImageObject;
+ CPDF_Image* pImg = FX_NEW CPDF_Image((CPDF_Document *)document);
+ 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)
+ return FALSE;
+
+ IFX_FileRead* pFile = FX_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 = (CPDF_Page*)pages[index];
+ 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)
+ 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 = (CPDF_Page*)pages[index];
+ 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 new file mode 100644 index 0000000000..d9cbbe4733 --- /dev/null +++ b/fpdfsdk/src/fpdfeditpage.cpp @@ -0,0 +1,316 @@ +// 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 "x:/pdf/fpdfapi5/include/fpdfapi.h"
+#include "../include/fsdk_define.h"
+#include "../include/fpdfedit.h"
+
+
+#if _FX_OS_ == _FX_ANDROID_
+#include "time.h"
+#else
+#include <ctime>
+#endif
+
+DLLEXPORT FPDF_DOCUMENT STDCALL FPDF_CreateNewDocument()
+{
+ CPDF_Document* pDoc = FX_NEW CPDF_Document;
+ if (!pDoc)
+ return NULL;
+ 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));
+#ifdef FOXIT_CHROME_BUILD
+ pInfoDict->SetAt("Creator",FX_NEW CPDF_String(L"Google"));
+#else
+ pInfoDict->SetAt("Creator",FX_NEW CPDF_String(L"Foxit PDF SDK DLL 2.0 - Foxit Software"));
+#endif
+ }
+
+ return pDoc;
+}
+
+DLLEXPORT void STDCALL FPDFPage_Delete(FPDF_DOCUMENT document, int page_index)
+{
+ CPDF_Document* pDoc = (CPDF_Document*)document;
+ if (pDoc == NULL)
+ return;
+ if (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)
+{
+ if (!document)
+ return NULL;
+
+// CPDF_Parser* pParser = (CPDF_Parser*)document;
+ CPDF_Document* pDoc = (CPDF_Document*)document;
+ if(page_index < 0)
+ page_index = 0;
+ if(pDoc->GetPageCount()<page_index)
+ page_index = pDoc->GetPageCount();
+// if (page_index < 0 || page_index >= pDoc->GetPageCount())
+// return NULL;
+
+ CPDF_Dictionary* pPageDict = pDoc->CreateNewPage(page_index);
+ if(!pPageDict)
+ return NULL;
+ CPDF_Array* pMediaBoxArray = FX_NEW CPDF_Array;
+ pMediaBoxArray->Add(FX_NEW CPDF_Number(0));
+ pMediaBoxArray->Add(FX_NEW CPDF_Number(0));
+ pMediaBoxArray->Add(FX_NEW CPDF_Number(FX_FLOAT(width)));
+ pMediaBoxArray->Add(FX_NEW CPDF_Number(FX_FLOAT(height)));
+
+ pPageDict->SetAt("MediaBox", pMediaBoxArray);
+ pPageDict->SetAt("Rotate", FX_NEW CPDF_Number(0));
+ pPageDict->SetAt("Resources", FX_NEW CPDF_Dictionary);
+
+ CPDF_Page* pPage = FX_NEW CPDF_Page;
+ pPage->Load(pDoc,pPageDict);
+ pPage->ParseContent();
+
+ return pPage;
+}
+
+DLLEXPORT int STDCALL FPDFPage_GetRotation(FPDF_PAGE page)
+{
+ CPDF_Page* pPage = (CPDF_Page*)page;
+ if (!pPage || !pPage->m_pFormDict || !pPage->m_pFormDict->KeyExist("Type")
+ || pPage->m_pFormDict->GetElement("Type")->GetDirect()->GetString().Compare("Page"))
+ {
+ return -1;
+ }
+ CPDF_Dictionary* pDict = pPage->m_pFormDict;
+
+ int rotate = 0;
+ if(pDict != NULL)
+ {
+ if(pDict->KeyExist("Rotate"))
+ rotate = pDict->GetElement("Rotate")->GetDirect()->GetInteger() / 90;
+ else
+ {
+ if(pDict->KeyExist("Parent"))
+ {
+ CPDF_Dictionary* pPages = (CPDF_Dictionary*)pDict->GetElement("Parent")->GetDirect();
+ while(pPages)
+ {
+ if(pPages->KeyExist("Rotate"))
+ {
+ rotate = pPages->GetElement("Rotate")->GetDirect()->GetInteger() / 90;
+ break;
+ }
+ else if(pPages->KeyExist("Parent"))
+ pPages = (CPDF_Dictionary*)pPages->GetElement("Parent")->GetDirect();
+ else break;
+ }
+ }
+ }
+ }
+ else
+ {
+ return -1;
+ }
+
+ return rotate;
+}
+
+DLLEXPORT void STDCALL FPDFPage_InsertObject(FPDF_PAGE page, FPDF_PAGEOBJECT page_obj)
+{
+ CPDF_Page* pPage = (CPDF_Page*)page;
+ if (!pPage || !pPage->m_pFormDict || !pPage->m_pFormDict->KeyExist("Type")
+ || pPage->m_pFormDict->GetElement("Type")->GetDirect()->GetString().Compare("Page"))
+ {
+ return;
+ }
+ CPDF_PageObject* pPageObj = (CPDF_PageObject*)page_obj;
+ if(pPageObj == NULL)
+ return;
+ FX_POSITION LastPersition = pPage->GetLastObjectPosition();
+
+ pPage->InsertObject(LastPersition, pPageObj);
+ switch(pPageObj->m_Type)
+ {
+ case FPDF_PAGEOBJ_PATH:
+ {
+ CPDF_PathObject* pPathObj = (CPDF_PathObject*)pPageObj;
+ pPathObj->CalcBoundingBox();
+ break;
+ }
+ case FPDF_PAGEOBJ_TEXT:
+ {
+ // CPDF_PathObject* pPathObj = (CPDF_PathObject*)pPageObj;
+ // pPathObj->CalcBoundingBox();
+ break;
+ }
+ case FPDF_PAGEOBJ_IMAGE:
+ {
+ CPDF_ImageObject* pImageObj = (CPDF_ImageObject*)pPageObj;
+ pImageObj->CalcBoundingBox();
+ break;
+ }
+ case FPDF_PAGEOBJ_SHADING:
+ {
+ CPDF_ShadingObject* pShadingObj = (CPDF_ShadingObject*)pPageObj;
+ pShadingObj->CalcBoundingBox();
+ break;
+ }
+ case FPDF_PAGEOBJ_FORM:
+ {
+ CPDF_FormObject* pFormObj = (CPDF_FormObject*)pPageObj;
+ pFormObj->CalcBoundingBox();
+ break;
+ }
+ default:
+ break;
+ }
+
+ // pPage->ParseContent();
+ //pPage->GenerateContent();
+
+}
+
+DLLEXPORT int STDCALL FPDFPage_CountObject(FPDF_PAGE page)
+{
+ CPDF_Page* pPage = (CPDF_Page*)page;
+ if (!pPage || !pPage->m_pFormDict || !pPage->m_pFormDict->KeyExist("Type")
+ || pPage->m_pFormDict->GetElement("Type")->GetDirect()->GetString().Compare("Page"))
+ {
+ return -1;
+ }
+ return pPage->CountObjects();
+// return 0;
+}
+
+DLLEXPORT FPDF_PAGEOBJECT STDCALL FPDFPage_GetObject(FPDF_PAGE page, int index)
+{
+ CPDF_Page* pPage = (CPDF_Page*)page;
+ if (!pPage || !pPage->m_pFormDict || !pPage->m_pFormDict->KeyExist("Type")
+ || pPage->m_pFormDict->GetElement("Type")->GetDirect()->GetString().Compare("Page"))
+ {
+ return NULL;
+ }
+ return pPage->GetObjectByIndex(index);
+// return NULL;
+}
+
+DLLEXPORT FPDF_BOOL STDCALL FPDFPage_HasTransparency(FPDF_PAGE page)
+{
+ if(!page) return FALSE;
+ CPDF_Page* pPage = (CPDF_Page*)page;
+
+ return 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 ? (CPDF_Dictionary*)pGeneralState->m_pSoftMask : NULL;
+ if(pSMaskDict) return TRUE;
+
+ if(pGeneralState && pGeneralState->m_FillAlpha != 1.0f)
+ return TRUE;
+
+ if(pPageObj->m_Type == PDFPAGE_PATH)
+ {
+ if(pGeneralState && pGeneralState->m_StrokeAlpha != 1.0f)
+ return TRUE;
+ }
+
+ if(pPageObj->m_Type == PDFPAGE_FORM)
+ {
+ CPDF_FormObject* pFormObj = (CPDF_FormObject*)pPageObj;
+ 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 = (CPDF_Page*)page;
+ if (!pPage || !pPage->m_pFormDict || !pPage->m_pFormDict->KeyExist("Type")
+ || pPage->m_pFormDict->GetElement("Type")->GetDirect()->GetString().Compare("Page"))
+ {
+ return FALSE;
+ }
+ CPDF_PageContentGenerate 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 == NULL)
+ return;
+//PDF_ImageObject* pImageObj = FX_NEW CPDF_ImageObject;
+ CFX_AffineMatrix 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)
+{
+ if(page == NULL)
+ return;
+ CPDF_Page* pPage = (CPDF_Page*)page;
+ CPDF_AnnotList AnnotList(pPage);
+ for (int i=0; i<AnnotList.Count();i++)
+ {
+ CPDF_Annot* pAnnot = AnnotList.GetAt(i);
+ // transformAnnots Rectangle
+ CPDF_Rect rect;
+ pAnnot->GetRect(rect);
+ CFX_AffineMatrix 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->m_pAnnotDict->GetArray("Rect");
+ if (!pRectArray) pRectArray=CPDF_Array::Create();
+ pRectArray->SetAt(0,FX_NEW CPDF_Number(rect.left));
+ pRectArray->SetAt(1,FX_NEW CPDF_Number(rect.bottom));
+ pRectArray->SetAt(2,FX_NEW CPDF_Number(rect.right));
+ pRectArray->SetAt(3,FX_NEW CPDF_Number(rect.top));
+ pAnnot->m_pAnnotDict->SetAt("Rect",pRectArray);
+
+ //Transform AP's rectangle
+ //To Do
+
+ }
+
+}
diff --git a/fpdfsdk/src/fpdfformfill.cpp b/fpdfsdk/src/fpdfformfill.cpp new file mode 100644 index 0000000000..101146b099 --- /dev/null +++ b/fpdfsdk/src/fpdfformfill.cpp @@ -0,0 +1,441 @@ +// 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 "../include/fpdfview.h"
+#include "../include/fpdfformfill.h"
+#include "../include/fsdk_define.h"
+#include "../include/fsdk_mgr.h"
+
+
+#include "../include/javascript/IJavaScript.h"
+
+
+DLLEXPORT int STDCALL FPDPage_HasFormFieldAtPoint(FPDF_FORMHANDLE hHandle, FPDF_PAGE page,double page_x, double page_y)
+{
+ if(!page || !hHandle)
+ return -1;
+ CPDF_Page * pPage = (CPDF_Page*) page;
+
+ CPDF_InterForm * pInterForm = NULL;
+ pInterForm = new CPDF_InterForm(pPage->m_pDocument,FALSE);
+ if (!pInterForm)
+ return -1;
+ CPDF_FormControl* pFormCtrl = pInterForm->GetControlAtPoint(pPage, (FX_FLOAT)page_x, (FX_FLOAT)page_y);
+ if(!pFormCtrl)
+ {
+ delete pInterForm;
+ return -1;
+ }
+ CPDF_FormField* pFormField = pFormCtrl->GetField();
+ if(!pFormField)
+ {
+ delete pInterForm;
+ return -1;
+ }
+
+ int nType = pFormField->GetFieldType();
+ delete pInterForm;
+ return nType;
+}
+
+DLLEXPORT FPDF_FORMHANDLE STDCALL FPDFDOC_InitFormFillEnviroument(FPDF_DOCUMENT document, FPDF_FORMFILLINFO* formInfo)
+{
+ if(!document || !formInfo || formInfo->version!=1)
+ return NULL;
+ CPDF_Document * pDocument = (CPDF_Document*) document;
+ CPDFDoc_Environment * pEnv = NULL;
+ pEnv = new CPDFDoc_Environment(pDocument);
+ if (!pEnv)
+ return NULL;
+ pEnv->RegAppHandle(formInfo);
+
+ if(pEnv->GetPDFDocument())
+ {
+ CPDFSDK_Document* pSDKDoc = new CPDFSDK_Document(pEnv->GetPDFDocument(), pEnv);
+ if(pSDKDoc)
+ pEnv->SetCurrentDoc(pSDKDoc);
+ }
+ return pEnv;
+}
+
+DLLEXPORT void STDCALL FPDFDOC_ExitFormFillEnviroument(FPDF_FORMHANDLE hHandle)
+{
+ if(!hHandle)
+ return;
+ CPDFSDK_Document* pSDKDoc = ((CPDFDoc_Environment*)hHandle)->GetCurrentDoc();
+ if(pSDKDoc)
+ {
+ ((CPDFDoc_Environment*)hHandle)->SetCurrentDoc(NULL);
+ delete pSDKDoc;
+ }
+ delete (CPDFDoc_Environment*)hHandle;
+ hHandle = NULL;
+}
+
+DLLEXPORT FPDF_BOOL STDCALL FORM_OnMouseMove(FPDF_FORMHANDLE hHandle, FPDF_PAGE page, int modifier, double page_x, double page_y)
+{
+ if (!hHandle || !page)
+ return FALSE;
+// CPDF_Page * pPage = (CPDF_Page*) page;
+// CPDF_Document * pDoc = pPage->m_pDocument;
+// CPDFDoc_Environment* pEnv = (CPDFDoc_Environment*)hHandle;
+ CPDFSDK_Document* pFXDoc = ((CPDFDoc_Environment*)hHandle)->GetCurrentDoc();
+ if(!pFXDoc)
+ return FALSE;
+ CPDFSDK_PageView* pPageView = pFXDoc->GetPageView((CPDF_Page*)page);
+ if(!pPageView)
+ return FALSE;
+
+// double page_x = 0;
+// double page_y = 0;
+// pEnv->FFI_DeviceToPage(page, point_x, point_y, &page_x, &page_y);
+ CPDF_Point 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)
+{
+ if (!hHandle || !page)
+ return FALSE;
+ CPDFSDK_Document* pFXDoc = ((CPDFDoc_Environment*)hHandle)->GetCurrentDoc();
+ if(!pFXDoc)
+ return FALSE;
+ CPDFSDK_PageView* pPageView = pFXDoc->GetPageView((CPDF_Page*)page);
+ if(!pPageView)
+ return FALSE;
+// double page_x = 0;
+// double page_y = 0;
+// pEnv->FFI_DeviceToPage(page, point_x, point_y, &page_x, &page_y);
+ CPDF_Point 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)
+{
+ if (!hHandle || !page)
+ return FALSE;
+ CPDFSDK_Document* pFXDoc = ((CPDFDoc_Environment*)hHandle)->GetCurrentDoc();
+ if(!pFXDoc)
+ return FALSE;
+ CPDFSDK_PageView* pPageView = pFXDoc->GetPageView((CPDF_Page*)page);
+ if(!pPageView)
+ return FALSE;
+// double page_x = 0;
+// double page_y = 0;
+// pEnv->FFI_DeviceToPage(page, point_x, point_y, &page_x, &page_y);
+ CPDF_Point pt((FX_FLOAT)page_x, (FX_FLOAT)page_y);
+ return pPageView->OnLButtonUp(pt, modifier);
+}
+
+DLLEXPORT FPDF_BOOL STDCALL FORM_OnKeyDown(FPDF_FORMHANDLE hHandle, FPDF_PAGE page, int nKeyCode, int modifier)
+{
+ if (!hHandle || !page)
+ return FALSE;
+ CPDFSDK_Document* pFXDoc = ((CPDFDoc_Environment*)hHandle)->GetCurrentDoc();
+ if(!pFXDoc)
+ return FALSE;
+ CPDFSDK_PageView* pPageView = pFXDoc->GetPageView((CPDF_Page*)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)
+{
+ if (!hHandle || !page)
+ return FALSE;
+ CPDFSDK_Document* pFXDoc = ((CPDFDoc_Environment*)hHandle)->GetCurrentDoc();
+ if(!pFXDoc)
+ return FALSE;
+ CPDFSDK_PageView* pPageView = pFXDoc->GetPageView((CPDF_Page*)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)
+{
+ if (!hHandle || !page)
+ return FALSE;
+ CPDFSDK_Document* pFXDoc = ((CPDFDoc_Environment*)hHandle)->GetCurrentDoc();
+ if(!pFXDoc)
+ return FALSE;
+ CPDFSDK_PageView* pPageView = pFXDoc->GetPageView((CPDF_Page*)page);
+ if(!pPageView)
+ return FALSE;
+ return pPageView->OnChar(nChar, modifier);
+
+}
+
+DLLEXPORT FPDF_BOOL STDCALL FORM_ForceToKillFocus(FPDF_FORMHANDLE hHandle)
+{
+ if(!hHandle)
+ return FALSE;
+ CPDFSDK_Document* pSDKDoc = ((CPDFDoc_Environment*)hHandle)->GetCurrentDoc();
+ if(!pSDKDoc)
+ return FALSE;
+ //Kill the current focus.
+ 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 || !page)
+ return ;
+ CPDF_Page* pPage = (CPDF_Page*)page;
+
+ 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 = FX_NEW CPDF_OCContext(pPage->m_pDocument);
+
+ //FXMT_CSLOCK_OBJ(&pPage->m_PageLock);
+
+ CFX_AffineMatrix matrix;
+ pPage->GetDisplayMatrix(matrix, start_x, start_y, size_x, size_y, rotate);
+
+ FX_RECT clip;
+ clip.left = start_x;
+ clip.right = start_x + size_x;
+ clip.top = start_y;
+ clip.bottom = start_y + size_y;
+
+#ifdef _SKIA_SUPPORT_
+ CFX_SkiaDevice* pDevice = FX_NEW CFX_SkiaDevice;
+#else
+ CFX_FxgeDevice* pDevice = NULL;
+ pDevice = FX_NEW CFX_FxgeDevice;
+#endif
+
+ if (!pDevice)
+ return;
+ pDevice->Attach((CFX_DIBitmap*)bitmap);
+ pDevice->SaveState();
+ pDevice->SetClip_Rect(&clip);
+
+
+ CPDF_RenderContext* pContext = NULL;
+ pContext = FX_NEW CPDF_RenderContext;
+ if (!pContext)
+ {
+ delete pDevice;
+ pDevice = NULL;
+ return;
+ }
+
+
+// CPDF_Document* pDoc = pPage->m_pDocument;
+ CPDFDoc_Environment* pEnv = (CPDFDoc_Environment*)hHandle;
+ CPDFSDK_Document* pFXDoc = pEnv->GetCurrentDoc();
+ if(!pFXDoc)
+ {
+ delete pContext;
+ delete pDevice;
+ pContext = NULL;
+ pDevice = NULL;
+ return;
+ }
+ if(CPDFSDK_PageView* pPageView = pFXDoc->GetPageView(pPage))
+ {
+ pPageView->PageView_OnDraw(pDevice, &matrix, &options);
+ }
+ pDevice->RestoreState();
+
+ if(options.m_pOCContext)
+ {
+ delete options.m_pOCContext;
+ options.m_pOCContext = NULL;
+ }
+ if(pContext)
+ {
+ delete pContext;
+ pContext = NULL;
+ }
+ if(pDevice)
+ {
+ delete pDevice;
+ pDevice = NULL;
+ }
+
+}
+
+DLLEXPORT void STDCALL FPDF_SetFormFieldHighlightColor(FPDF_FORMHANDLE hHandle, int fieldType, unsigned long color)
+{
+ if (!hHandle)
+ return;
+// CPDFDoc_Environment* pEnv = (CPDFDoc_Environment* )hHandle;
+ CPDFSDK_Document* pSDKDoc = ((CPDFDoc_Environment*)hHandle)->GetCurrentDoc();
+ if(pSDKDoc)
+ {
+ if(CPDFSDK_InterForm* pInterForm = pSDKDoc->GetInterForm())
+ {
+ pInterForm->SetHighlightColor(color, fieldType);
+ }
+
+ }
+
+}
+
+DLLEXPORT void STDCALL FPDF_SetFormFieldHighlightAlpha(FPDF_FORMHANDLE hHandle, unsigned char alpha)
+{
+ if (!hHandle)
+ return;
+ CPDFSDK_Document* pSDKDoc = ((CPDFDoc_Environment*)hHandle)->GetCurrentDoc();
+ if(pSDKDoc)
+ {
+ if(CPDFSDK_InterForm* pInterForm = pSDKDoc->GetInterForm())
+ pInterForm->SetHighlightAlpha(alpha);
+ }
+}
+
+DLLEXPORT void STDCALL FPDF_RemoveFormFieldHighlight(FPDF_FORMHANDLE hHandle)
+{
+ if (!hHandle)
+ return;
+ CPDFSDK_Document* pSDKDoc = ((CPDFDoc_Environment*)hHandle)->GetCurrentDoc();
+ if(pSDKDoc)
+ {
+ if(CPDFSDK_InterForm* pInterForm = pSDKDoc->GetInterForm())
+ pInterForm->RemoveAllHighLight();
+ }
+}
+
+DLLEXPORT void STDCALL FORM_OnAfterLoadPage(FPDF_PAGE page, FPDF_FORMHANDLE hHandle)
+{
+ if(!hHandle || !page)
+ return;
+ CPDFSDK_Document* pSDKDoc = ((CPDFDoc_Environment*)hHandle)->GetCurrentDoc();
+ if(!pSDKDoc)
+ return;
+ CPDF_Page* pPage = (CPDF_Page*)page;
+ CPDFSDK_PageView* pPageView = pSDKDoc->GetPageView(pPage, TRUE);
+ if(pPageView)
+ {
+ pPageView->SetValid(TRUE);
+ }
+}
+
+DLLEXPORT void STDCALL FORM_OnBeforeClosePage(FPDF_PAGE page, FPDF_FORMHANDLE hHandle)
+{
+ if(!hHandle || !page)
+ return;
+ CPDFSDK_Document* pSDKDoc = ((CPDFDoc_Environment*)hHandle)->GetCurrentDoc();
+ CPDF_Page* pPage = (CPDF_Page*)page;
+ 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)
+{
+ if(!hHandle)
+ return;
+ if( CPDFSDK_Document* pSDKDoc = ((CPDFDoc_Environment*)hHandle)->GetCurrentDoc())
+ {
+ pSDKDoc->InitPageView();
+ if(((CPDFDoc_Environment*)hHandle)->IsJSInitiated())
+ pSDKDoc->ProcJavascriptFun();
+ }
+}
+
+DLLEXPORT void STDCALL FORM_DoDocumentOpenAction(FPDF_FORMHANDLE hHandle)
+{
+ if(!hHandle)
+ return;
+ if( CPDFSDK_Document* pSDKDoc = ((CPDFDoc_Environment*)hHandle)->GetCurrentDoc())
+ {
+ if(((CPDFDoc_Environment*)hHandle)->IsJSInitiated())
+ pSDKDoc->ProcOpenAction();
+ }
+}
+DLLEXPORT void STDCALL FORM_DoDocumentAAction(FPDF_FORMHANDLE hHandle, int aaType)
+{
+ if(!hHandle)
+ return;
+ CPDFSDK_Document* pSDKDoc = ((CPDFDoc_Environment*)hHandle)->GetCurrentDoc();
+ if(pSDKDoc)
+ {
+ CPDF_Document* pDoc = pSDKDoc->GetDocument();
+ CPDF_Dictionary* pDic = pDoc->GetRoot();
+ if (!pDic)
+ return;
+ CPDF_AAction aa = pDic->GetDict(FX_BSTRC("AA"));
+
+ if(aa.ActionExist((CPDF_AAction::AActionType)aaType))
+ {
+ CPDF_Action action = aa.GetAction((CPDF_AAction::AActionType)aaType);
+ CPDFSDK_ActionHandler *pActionHandler = ((CPDFDoc_Environment*)hHandle)->GetActionHander();
+ ASSERT(pActionHandler != NULL);
+ pActionHandler->DoAction_Document(action, (CPDF_AAction::AActionType)aaType, pSDKDoc);
+ }
+ }
+}
+DLLEXPORT void STDCALL FORM_DoPageAAction(FPDF_PAGE page, FPDF_FORMHANDLE hHandle, int aaType)
+{
+ if(!hHandle || !page)
+ return;
+ CPDFSDK_Document* pSDKDoc = ((CPDFDoc_Environment*)hHandle)->GetCurrentDoc();
+ CPDF_Page* pPage = (CPDF_Page*)page;
+ CPDFSDK_PageView* pPageView = pSDKDoc->GetPageView(pPage, FALSE);
+ if(pPageView)
+ {
+ CPDFDoc_Environment *pEnv = pSDKDoc->GetEnv();
+ ASSERT(pEnv != NULL);
+
+ CPDFSDK_ActionHandler *pActionHandler = pEnv->GetActionHander();
+ ASSERT(pActionHandler != NULL);
+
+ CPDF_Dictionary *pPageDict = pPage->m_pFormDict;
+ ASSERT(pPageDict != NULL);
+
+ CPDF_AAction aa = pPageDict->GetDict(FX_BSTRC("AA"));
+
+ FX_BOOL bExistOAAction = FALSE;
+ FX_BOOL bExistCAAction = FALSE;
+ if (FPDFPAGE_AACTION_OPEN == aaType)
+ {
+ bExistOAAction = aa.ActionExist(CPDF_AAction::OpenPage);
+ if (bExistOAAction)
+ {
+ CPDF_Action action = aa.GetAction(CPDF_AAction::OpenPage);
+ pActionHandler->DoAction_Page(action, CPDF_AAction::OpenPage, pSDKDoc);
+ }
+ }
+ else
+ {
+ bExistCAAction = aa.ActionExist(CPDF_AAction::ClosePage);
+ if (bExistCAAction)
+ {
+ CPDF_Action action = aa.GetAction(CPDF_AAction::ClosePage);
+ pActionHandler->DoAction_Page(action, CPDF_AAction::ClosePage, pSDKDoc);
+ }
+ }
+ }
+}
+
+
diff --git a/fpdfsdk/src/fpdfoom.cpp b/fpdfsdk/src/fpdfoom.cpp new file mode 100644 index 0000000000..fb67a5a1fe --- /dev/null +++ b/fpdfsdk/src/fpdfoom.cpp @@ -0,0 +1,27 @@ +// 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 "../include/fsdk_define.h"
+#include "../include/fpdfoom.h"
+
+void OOM_Handler(FXMEM_FoxitMgr* pFoxitMgr, void* param)
+{
+ if (!param) return;
+ ((OOM_INFO*)param)->FSDK_OOM_Handler((OOM_INFO*)param);
+}
+
+
+DLLEXPORT FX_BOOL STDCALL FSDK_SetOOMHandler(OOM_INFO* oomInfo)
+{
+#ifndef _FXSDK_OPENSOURCE_
+ if (!oomInfo || oomInfo->version!=1)
+ return FALSE;
+ FXMEM_SetOOMHandler(FXMEM_GetDefaultMgr(),OOM_Handler,oomInfo);
+ return TRUE;
+#else
+ return TRUE;
+#endif
+}
diff --git a/fpdfsdk/src/fpdfppo.cpp b/fpdfsdk/src/fpdfppo.cpp new file mode 100644 index 0000000000..e605484cb3 --- /dev/null +++ b/fpdfsdk/src/fpdfppo.cpp @@ -0,0 +1,460 @@ +// 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 "../include/fpdfppo.h"
+#include "../include/fsdk_define.h"
+
+class CPDF_PageOrganizer
+{
+public:
+ CPDF_PageOrganizer();
+ ~CPDF_PageOrganizer();
+
+public:
+ FX_BOOL PDFDocInit(CPDF_Document *pDestPDFDoc, CPDF_Document *pSrcPDFDoc);
+ FX_BOOL ExportPage(CPDF_Document *pSrcPDFDoc, CFX_WordArray* nPageNum, CPDF_Document *pDestPDFDoc, int nIndex);
+ CPDF_Object* PageDictGetInheritableTag(CPDF_Dictionary *pDict, CFX_ByteString nSrctag);
+ FX_BOOL UpdateReference(CPDF_Object *pObj, CPDF_Document *pDoc, CFX_MapPtrToPtr* pMapPtrToPtr);
+ int GetNewObjId(CPDF_Document *pDoc, CFX_MapPtrToPtr* pMapPtrToPtr, 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;
+
+#ifdef FOXIT_CHROME_BUILD
+ producerstr.Format("Google");
+#else
+ producerstr.Format("Foxit PDF SDK %s - Foxit Corporation", "2.0");
+#endif
+ DInfoDict->SetAt("Producer", new CPDF_String(producerstr));
+
+ //Set type////////////////////////////////////////////////////////////////
+ CFX_ByteString cbRootType = pNewRoot->GetString("Type","");
+ if( cbRootType.Equal("") )
+ {
+ pNewRoot->SetAt("Type", new CPDF_Name("Catalog"));
+ }
+
+ CPDF_Dictionary* pNewPages = (CPDF_Dictionary*)pNewRoot->GetElement("Pages")->GetDirect();
+ if(!pNewPages)
+ {
+ pNewPages = new CPDF_Dictionary;
+ FX_DWORD NewPagesON = pDestPDFDoc->AddIndirectObject(pNewPages);
+ pNewRoot->SetAt("Pages", new CPDF_Reference(pDestPDFDoc, NewPagesON));
+ }
+
+ CFX_ByteString cbPageType = pNewPages->GetString("Type","");
+ if(cbPageType.Equal(""))
+ {
+ pNewPages->SetAt("Type", new CPDF_Name("Pages"));
+ }
+
+ CPDF_Array* pKeysArray = pNewPages->GetArray("Kids");
+ if(pKeysArray == NULL)
+ {
+ CPDF_Array* pNewKids = new CPDF_Array;
+ FX_DWORD Kidsobjnum = -1;
+ Kidsobjnum = pDestPDFDoc->AddIndirectObject(pNewKids);//, Kidsobjnum, Kidsgennum);
+
+ pNewPages->SetAt("Kids", new CPDF_Reference(pDestPDFDoc, Kidsobjnum));//, Kidsgennum));
+ pNewPages->SetAt("Count", new CPDF_Number(0));
+ }
+
+ return true;
+}
+
+FX_BOOL CPDF_PageOrganizer::ExportPage(CPDF_Document *pSrcPDFDoc, CFX_WordArray* nPageNum,
+ CPDF_Document *pDestPDFDoc,int nIndex)
+{
+ int curpage =nIndex;
+
+ CFX_MapPtrToPtr* pMapPtrToPtr = new CFX_MapPtrToPtr;
+ pMapPtrToPtr->InitHashTable(1001);
+
+ for(int i=0; i<nPageNum->GetSize(); i++)
+ {
+
+ CPDF_Dictionary* pCurPageDict = pDestPDFDoc->CreateNewPage(curpage);
+ CPDF_Dictionary* pSrcPageDict = pSrcPDFDoc->GetPage(nPageNum->GetAt(i)-1);
+ if(!pSrcPageDict || !pCurPageDict)
+ {
+ delete pMapPtrToPtr;
+ return FALSE;
+ }
+
+ // Clone the page dictionary///////////
+ FX_POSITION SrcPos = pSrcPageDict->GetStartPos();
+ while (SrcPos)
+ {
+ CFX_ByteString cbSrcKeyStr;
+ CPDF_Object* pObj = pSrcPageDict->GetNextElement(SrcPos, cbSrcKeyStr);
+ if(cbSrcKeyStr.Compare(("Type")) && cbSrcKeyStr.Compare(("Parent")))
+ {
+ if(pCurPageDict->KeyExist(cbSrcKeyStr))
+ pCurPageDict->RemoveAt(cbSrcKeyStr);
+ pCurPageDict->SetAt(cbSrcKeyStr, pObj->Clone());
+ }
+ }
+
+ //inheritable item///////////////////////
+ CPDF_Object* pInheritable = NULL;
+ //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)
+ {
+ delete pMapPtrToPtr;
+ 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();
+
+ pMapPtrToPtr->SetAt((FX_LPVOID)(FX_UINTPTR)dwOldPageObj, (FX_LPVOID)(FX_UINTPTR)dwNewPageObj);
+
+ this->UpdateReference(pCurPageDict, pDestPDFDoc, pMapPtrToPtr);
+ curpage++;
+ }
+
+ delete pMapPtrToPtr;
+ return TRUE;
+}
+
+CPDF_Object* CPDF_PageOrganizer::PageDictGetInheritableTag(CPDF_Dictionary *pDict, CFX_ByteString nSrctag)
+{
+ if(!pDict || !pDict->KeyExist("Type") || nSrctag.IsEmpty())
+ return NULL;
+
+ CPDF_Object* pType = pDict->GetElement("Type")->GetDirect();
+ if(!pType || pType->GetType() != PDFOBJ_NAME) return NULL;
+
+ if(pType->GetString().Compare("Page")) return NULL;
+
+ if(!pDict->KeyExist("Parent")) return NULL;
+ CPDF_Object* pParent = pDict->GetElement("Parent")->GetDirect();
+ if(!pParent || pParent->GetType() != PDFOBJ_DICTIONARY) return NULL;
+
+ CPDF_Dictionary* pp = (CPDF_Dictionary*)pParent;
+
+ 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);
+ else if(pp->KeyExist("Parent"))
+ pp = (CPDF_Dictionary*)pp->GetElement("Parent")->GetDirect();
+ else break;
+ }
+
+ return NULL;
+}
+
+FX_BOOL CPDF_PageOrganizer::UpdateReference(CPDF_Object *pObj, CPDF_Document *pDoc,
+ CFX_MapPtrToPtr* pMapPtrToPtr)
+{
+ switch (pObj->GetType())
+ {
+ case PDFOBJ_REFERENCE:
+ {
+ CPDF_Reference* pReference = (CPDF_Reference*)pObj;
+ int newobjnum = GetNewObjId(pDoc, pMapPtrToPtr, pReference);
+ if (newobjnum == 0) return FALSE;
+ pReference->SetRef(pDoc, newobjnum);//, 0);
+ break;
+ }
+ case PDFOBJ_DICTIONARY:
+ {
+ CPDF_Dictionary* pDict = (CPDF_Dictionary*)pObj;
+
+ FX_POSITION pos = pDict->GetStartPos();
+ while(pos)
+ {
+ CFX_ByteString key("");
+ CPDF_Object* pNextObj = pDict->GetNextElement(pos, key);
+ if (!FXSYS_strcmp(key, "Parent") || !FXSYS_strcmp(key, "Prev") || !FXSYS_strcmp(key, "First"))
+ continue;
+ if(pNextObj)
+ {
+ if(!UpdateReference(pNextObj, pDoc, pMapPtrToPtr))
+ pDict->RemoveAt(key);
+ }
+ else
+ return FALSE;
+ }
+ break;
+ }
+ case PDFOBJ_ARRAY:
+ {
+ CPDF_Array* pArray = (CPDF_Array*)pObj;
+ FX_DWORD count = pArray->GetCount();
+ for(FX_DWORD i = 0; i < count; i ++)
+ {
+ CPDF_Object* pNextObj = pArray->GetElement(i);
+ if(pNextObj)
+ {
+ if(!UpdateReference(pNextObj, pDoc, pMapPtrToPtr))
+ return FALSE;
+ }
+ else
+ return FALSE;
+ }
+ break;
+ }
+ case PDFOBJ_STREAM:
+ {
+ CPDF_Stream* pStream = (CPDF_Stream*)pObj;
+ CPDF_Dictionary* pDict = pStream->GetDict();
+ if(pDict)
+ {
+ if(!UpdateReference(pDict, pDoc, pMapPtrToPtr))
+ return FALSE;
+ }
+ else
+ return FALSE;
+ break;
+ }
+ default: break;
+ }
+
+ return TRUE;
+}
+
+int CPDF_PageOrganizer::GetNewObjId(CPDF_Document *pDoc, CFX_MapPtrToPtr* pMapPtrToPtr,
+ CPDF_Reference *pRef)
+{
+ size_t dwObjnum = 0;
+ if(!pRef)
+ return 0;
+ dwObjnum = pRef->GetRefObjNum();
+
+ size_t dwNewObjNum = 0;
+
+ pMapPtrToPtr->Lookup((FX_LPVOID)dwObjnum, (FX_LPVOID&)dwNewObjNum);
+ if(dwNewObjNum)
+ {
+ return (int)dwNewObjNum;
+ }
+ else
+ {
+ CPDF_Object* pClone = pRef->GetDirect()->Clone();
+ if(!pClone) return 0;
+
+ if(pClone->GetType() == PDFOBJ_DICTIONARY)
+ {
+ CPDF_Dictionary* pDictClone = (CPDF_Dictionary*)pClone;
+ if(pDictClone->KeyExist("Type"))
+ {
+ CFX_ByteString strType = pDictClone->GetString("Type");
+ if(!FXSYS_stricmp(strType, "Pages"))
+ {
+ pDictClone->Release();
+ return 4;
+ }
+ else if(!FXSYS_stricmp(strType, "Page"))
+ {
+ pDictClone->Release();
+ return 0;
+ }
+ }
+ }
+ dwNewObjNum = pDoc->AddIndirectObject(pClone);//, onum, gnum);
+ pMapPtrToPtr->SetAt((FX_LPVOID)dwObjnum, (FX_LPVOID)dwNewObjNum);
+
+ if(!UpdateReference(pClone, pDoc, pMapPtrToPtr))
+ {
+ pClone->Release();
+ return 0;
+ }
+ return (int)dwNewObjNum;
+ }
+ return 0;
+}
+
+FPDF_BOOL ParserPageRangeString(CFX_ByteString rangstring, CFX_WordArray* 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->Add((FX_WORD)lPageNum);
+ }
+ else
+ {
+ int nStartPageNum = atol(cbMidRange.Mid(0,nMid));
+ if (nStartPageNum ==0)
+ {
+ return FALSE;
+ }
+
+
+ nMid = nMid+1;
+ int nEnd = cbMidRange.GetLength()-nMid;
+
+ if(nEnd ==0)return FALSE;
+
+ // int nEndPageNum = (nEnd == 0)?nCount:atol(cbMidRange.Mid(nMid,nEnd));
+ int nEndPageNum = atol(cbMidRange.Mid(nMid,nEnd));
+
+ if(nStartPageNum < 0 ||nStartPageNum >nEndPageNum|| nEndPageNum > nCount)
+ {
+ return FALSE;
+ }
+ else
+ {
+ for(int nIndex=nStartPageNum; nIndex <= nEndPageNum; nIndex ++)
+ pageArray->Add(nIndex);
+ }
+ }
+ nStringFrom = nStringTo +1;
+ }
+ }
+ return TRUE;
+}
+
+DLLEXPORT FPDF_BOOL STDCALL FPDF_ImportPages(FPDF_DOCUMENT dest_doc,FPDF_DOCUMENT src_doc,
+ FPDF_BYTESTRING pagerange, int index)
+{
+ if(dest_doc == NULL || src_doc == NULL )
+ return FALSE;
+ CFX_WordArray pageArray;
+ CPDF_Document* pSrcDoc = (CPDF_Document*)src_doc;
+ int nCount = pSrcDoc->GetPageCount();
+ if(pagerange)
+ {
+ if(ParserPageRangeString(pagerange,&pageArray,nCount) == FALSE)
+ return FALSE;
+ }
+ else
+ {
+ for(int i=1; i<=nCount; i++)
+ {
+ pageArray.Add(i);
+ }
+ }
+
+ CPDF_Document* pDestDoc = (CPDF_Document*)dest_doc;
+ CPDF_PageOrganizer pageOrg;
+
+ pageOrg.PDFDocInit(pDestDoc,pSrcDoc);
+
+ if(pageOrg.ExportPage(pSrcDoc,&pageArray,pDestDoc,index))
+ return TRUE;
+ return FALSE;
+}
+
+DLLEXPORT FPDF_BOOL STDCALL FPDF_CopyViewerPreferences(FPDF_DOCUMENT dest_doc, FPDF_DOCUMENT src_doc)
+{
+ if(src_doc == NULL || dest_doc == NULL)
+ return false;
+ CPDF_Document* pSrcDoc = (CPDF_Document*)src_doc;
+ CPDF_Dictionary* pSrcDict = pSrcDoc->GetRoot();
+ pSrcDict = pSrcDict->GetDict(FX_BSTRC("ViewerPreferences"));;
+ if(!pSrcDict)
+ return FALSE;
+ CPDF_Document* pDstDoc = (CPDF_Document*)dest_doc;
+ CPDF_Dictionary* pDstDict = pDstDoc->GetRoot();
+ if(!pDstDict)
+ return FALSE;
+ pDstDict->SetAt(FX_BSTRC("ViewerPreferences"), pSrcDict->Clone(TRUE));
+ return TRUE;
+}
+
diff --git a/fpdfsdk/src/fpdfsave.cpp b/fpdfsdk/src/fpdfsave.cpp new file mode 100644 index 0000000000..8272eb0fee --- /dev/null +++ b/fpdfsdk/src/fpdfsave.cpp @@ -0,0 +1,91 @@ +// 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 "../include/fsdk_define.h"
+#include "../include/fpdfsave.h"
+#include "../include/fpdfedit.h"
+#if _FX_OS_ == _FX_ANDROID_
+#include "time.h"
+#else
+#include <ctime>
+#endif
+
+class CFX_IFileWrite:public IFX_StreamWrite
+{
+
+public:
+ CFX_IFileWrite();
+ FX_BOOL Init( FPDF_FILEWRITE * pFileWriteStruct );
+ virtual FX_BOOL WriteBlock(const void* pData, size_t size);
+ virtual void Release(){};
+
+protected:
+ FPDF_FILEWRITE* m_pFileWriteStruct;
+};
+
+CFX_IFileWrite::CFX_IFileWrite()
+{
+ m_pFileWriteStruct = NULL;
+}
+
+FX_BOOL CFX_IFileWrite::Init( FPDF_FILEWRITE * pFileWriteStruct )
+{
+ if (!pFileWriteStruct)
+ return FALSE;
+ else
+ {
+ m_pFileWriteStruct = pFileWriteStruct;
+ }
+ return TRUE;
+}
+
+FX_BOOL CFX_IFileWrite::WriteBlock(const void* pData, size_t size)
+{
+ if (m_pFileWriteStruct)
+ {
+ m_pFileWriteStruct->WriteBlock( m_pFileWriteStruct, pData, size );
+ return TRUE;
+ }
+ else
+ return FALSE;
+}
+
+FPDF_BOOL _FPDF_Doc_Save(FPDF_DOCUMENT document,FPDF_FILEWRITE * pFileWrite,FPDF_DWORD flags, FPDF_BOOL bSetVersion,
+ int fileVerion)
+{
+ CPDF_Document* pDoc = (CPDF_Document*)document;
+ if (!pDoc)
+ return 0;
+
+ if ( flags < 1 || flags > 2 )
+ {
+ flags = 0;
+ }
+
+ CPDF_Creator FileMaker(pDoc);
+ if(bSetVersion)
+ FileMaker.SetFileVersion(fileVerion);
+ CFX_IFileWrite* pStreamWrite = NULL;
+ FX_BOOL bRet;
+ pStreamWrite = new CFX_IFileWrite;
+ pStreamWrite->Init( pFileWrite );
+ bRet = FileMaker.Create(pStreamWrite, flags);
+ delete pStreamWrite;
+ return bRet;
+}
+
+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/fpdfsdkdll.rc b/fpdfsdk/src/fpdfsdkdll.rc new file mode 100644 index 0000000000..ee12049847 --- /dev/null +++ b/fpdfsdk/src/fpdfsdkdll.rc @@ -0,0 +1,109 @@ +//Microsoft Developer Studio generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "afxres.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// Chinese (P.R.C.) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
+#ifdef _WIN32
+LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
+#pragma code_page(936)
+#endif //_WIN32
+
+#ifndef _MAC
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION 2,0,0,1705
+ PRODUCTVERSION 2,0,0,1705
+ FILEFLAGSMASK 0x3fL
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x40004L
+ FILETYPE 0x2L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "080904b0"
+ BEGIN
+ VALUE "Comments", "Foxit Corporation\0"
+ VALUE "CompanyName", "Foxit Corporation\0"
+ VALUE "FileDescription", "fpdfsdk\0"
+ VALUE "FileVersion", "2, 0, 0, 1705\0"
+ VALUE "InternalName", "fpdfsdk\0"
+ VALUE "LegalCopyright", "Copyright (C) 2004-2009 Foxit Corporation\0"
+ VALUE "LegalTrademarks", "\0"
+ VALUE "OriginalFilename", "fpdfsdk.dll\0"
+ VALUE "PrivateBuild", "\0"
+ VALUE "ProductName", "Foxit PDF SDK DLL\0"
+ VALUE "ProductVersion", "2, 0, 0, 1705\0"
+ VALUE "SpecialBuild", "\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x809, 1200
+ END
+END
+
+#endif // !_MAC
+
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE MOVEABLE PURE
+BEGIN
+ "resource.h\0"
+END
+
+2 TEXTINCLUDE MOVEABLE PURE
+BEGIN
+ "#include ""afxres.h""\r\n"
+ "\0"
+END
+
+3 TEXTINCLUDE MOVEABLE PURE
+BEGIN
+ "\r\n"
+ "\0"
+END
+
+#endif // APSTUDIO_INVOKED
+
+#endif // Chinese (P.R.C.) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif // not APSTUDIO_INVOKED
+
diff --git a/fpdfsdk/src/fpdftext.cpp b/fpdfsdk/src/fpdftext.cpp new file mode 100644 index 0000000000..6042fcc7b1 --- /dev/null +++ b/fpdfsdk/src/fpdftext.cpp @@ -0,0 +1,278 @@ +// 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 "../include/fsdk_define.h"
+#include "../include/fpdftext.h"
+
+#ifdef _WIN32
+#include <tchar.h>
+#endif
+
+ // jabdelmalek: commented out to build on Linux. Not used.
+ // extern HANDLE g_hModule;
+
+DLLEXPORT FPDF_TEXTPAGE STDCALL FPDFText_LoadPage(FPDF_PAGE page)
+{
+ if (!page) return NULL;
+ IPDF_TextPage* textpage=NULL;
+ try
+ {
+ CPDF_ViewerPreferences viewRef(((CPDF_Page*)page)->m_pDocument);
+ textpage=IPDF_TextPage::CreateTextPage((CPDF_Page*)page,viewRef.IsDirectionR2L());
+ textpage->ParseTextPage();
+ }
+ catch (...)
+ {
+ if (textpage)
+ delete textpage;
+ return NULL;
+ }
+ return textpage;
+}
+DLLEXPORT void STDCALL FPDFText_ClosePage(FPDF_TEXTPAGE text_page)
+{
+ if (text_page){
+ IPDF_TextPage* textpage=(IPDF_TextPage*)text_page;
+ delete textpage;
+ text_page=NULL;
+ }
+}
+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 xTorelance,double yTorelance)
+{
+ if (!text_page) return -3;
+ IPDF_TextPage* textpage=(IPDF_TextPage*)text_page;
+ return textpage->GetIndexAtPos((FX_FLOAT)x,(FX_FLOAT)y,(FX_FLOAT)xTorelance,(FX_FLOAT)yTorelance);
+}
+
+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==NULL)
+ {
+ 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;
+ try
+ {
+ textpageFind=IPDF_TextPageFind::CreatePageFind((IPDF_TextPage*)text_page);
+ textpageFind->FindFirst(CFX_WideString::FromUTF16LE(findwhat),flags,start_index);
+ }
+ catch (...)
+ {
+ if (textpageFind)
+ delete textpageFind;
+ return NULL;
+ }
+ 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;
+ try
+ {
+ pageLink=IPDF_LinkExtract::CreateLinkExtract();
+ pageLink->ExtractLinks((IPDF_TextPage*)text_page);
+ }
+ catch (...)
+ {
+ if (pageLink)
+ delete pageLink;
+ return NULL;
+ }
+ 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==NULL || 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);
+ CFX_FloatRect rect;
+ 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)
+{
+ if (!link_page) return;
+ IPDF_LinkExtract* pageLink=(IPDF_LinkExtract*)link_page;
+ delete pageLink;
+ pageLink =NULL;
+}
+
diff --git a/fpdfsdk/src/fpdfview.cpp b/fpdfsdk/src/fpdfview.cpp new file mode 100644 index 0000000000..453b006893 --- /dev/null +++ b/fpdfsdk/src/fpdfview.cpp @@ -0,0 +1,879 @@ +// 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 "../include/fsdk_define.h"
+#include "../include/fpdfview.h"
+#include "../include/fsdk_rendercontext.h"
+#include "../include/fpdf_progressive.h"
+#include "../include/fpdf_ext.h"
+
+
+CPDF_CustomAccess::CPDF_CustomAccess(FPDF_FILEACCESS* pFileAccess)
+{
+ m_FileAccess = *pFileAccess;
+ m_BufferOffset = (FX_DWORD)-1;
+}
+
+FX_BOOL CPDF_CustomAccess::GetByte(FX_DWORD pos, FX_BYTE& 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, FX_LPBYTE 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);
+}
+
+FX_BOOL CPDF_CustomAccess::ReadBlock(void* buffer, FX_FILESIZE offset, size_t size)
+{
+ // m_FileAccess = *pFileAccess;
+ // m_BufferOffset = (FX_DWORD)-1;
+ if (offset + size > m_FileAccess.m_FileLen) return FALSE;
+ return m_FileAccess.m_GetBlock(m_FileAccess.m_Param, offset,(FX_LPBYTE) buffer, size);
+
+ // return FALSE;
+}
+
+//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:
+ {
+ if(foxit_sandbox_policy&0x01)
+ return TRUE;
+ else
+ return FALSE;
+ }
+ break;
+ default:
+ break;
+ }
+ return FALSE;
+}
+
+
+#ifndef _T
+#define _T(x) x
+#endif
+
+#ifdef API5
+ CPDF_ModuleMgr* g_pModuleMgr = NULL;
+#else
+ CCodec_ModuleMgr* g_pCodecModule = NULL;
+#ifdef _FXSDK_OPENSOURCE_
+ FXMEM_FoxitMgr* g_pFoxitMgr = NULL;
+#endif
+#endif
+
+//extern CPDFSDK_FormFillApp* g_pFormFillApp;
+
+#if _FX_OS_ == _FX_LINUX_EMBEDDED_
+class CFontMapper : public IPDF_FontMapper
+{
+public:
+ CFontMapper();
+ virtual ~CFontMapper();
+
+ virtual FT_Face FindSubstFont(
+ CPDF_Document* pDoc, // [IN] The PDF document
+ const CFX_ByteString& face_name, // [IN] Original name
+ FX_BOOL bTrueType, // [IN] TrueType or Type1
+ FX_DWORD flags, // [IN] PDF font flags (see PDF Reference section 5.7.1)
+ int font_weight, // [IN] original font weight. 0 for not specified
+ int CharsetCP, // [IN] code page for charset (see Win32 GetACP())
+ FX_BOOL bVertical,
+ CPDF_SubstFont* pSubstFont // [OUT] Subst font data
+ );
+
+ FT_Face m_SysFace;
+};
+
+CFontMapper* g_pFontMapper = NULL;
+#endif // #if _FX_OS_ == _FX_LINUX_EMBEDDED_
+
+DLLEXPORT void STDCALL FPDF_InitLibrary(FX_LPVOID hInstance)
+{
+#ifdef API5
+ CPDF_ModuleMgr::Create();
+ g_pModuleMgr = CPDF_ModuleMgr::Get();
+ #if _FX_OS_ == _FX_WIN32_MOBILE_ || _FX_OS_ == _FX_LINUX_EMBEDDED_
+ g_pModuleMgr->InitEmbedded();
+ #ifdef _GB1_CMAPS_
+ g_pModuleMgr->LoadEmbeddedGB1CMaps();
+ #endif
+ #ifdef _GB1_CMAPS_4_
+ g_pModuleMgr->LoadEmbeddedGB1CMaps_4();
+ #endif
+ #ifdef _CNS1_CMAPS_
+ g_pModuleMgr->LoadEmbeddedCNS1CMaps();
+ #endif
+ #ifdef _JAPAN1_CMAPS_
+ g_pModuleMgr->LoadEmbeddedJapan1CMaps();
+ #endif
+ #ifdef _JAPAN1_CMAPS_6_
+ g_pModuleMgr->LoadEmbeddedJapan1CMaps_6();
+ #endif
+ #ifdef _KOREA1_CMAPS_
+ g_pModuleMgr->LoadEmbeddedKorea1CMaps();
+ #endif
+ #ifdef _JPX_DECODER_
+ g_pModuleMgr->InitJpxModule();
+ g_pModuleMgr->InitJbig2Module();
+ // g_pModuleMgr->InitIccModule();
+ #endif
+ #else
+ g_pModuleMgr->InitDesktop();
+ #endif
+#else
+#ifdef _FXSDK_OPENSOURCE_
+ g_pFoxitMgr = FXMEM_CreateMemoryMgr(1024 * 1024 * 32, TRUE);
+#endif
+ g_pCodecModule = CCodec_ModuleMgr::Create();
+
+ CFX_GEModule::Create();
+ CFX_GEModule::Get()->SetCodecModule(g_pCodecModule);
+
+ CPDF_ModuleMgr::Create();
+ CPDF_ModuleMgr::Get()->SetCodecModule(g_pCodecModule);
+ CPDF_ModuleMgr::Get()->InitPageModule();
+ CPDF_ModuleMgr::Get()->InitRenderModule();
+#ifdef FOXIT_CHROME_BUILD
+ CPDF_ModuleMgr * pModuleMgr = CPDF_ModuleMgr::Get();
+ if ( pModuleMgr )
+ {
+ pModuleMgr->LoadEmbeddedGB1CMaps();
+ pModuleMgr->LoadEmbeddedJapan1CMaps();
+ pModuleMgr->LoadEmbeddedCNS1CMaps();
+ pModuleMgr->LoadEmbeddedKorea1CMaps();
+ }
+#endif
+#endif
+
+#ifdef _WIN32
+ // Get module path
+ TCHAR app_path[MAX_PATH];
+ ::GetModuleFileName((HINSTANCE)hInstance, app_path, MAX_PATH);
+ size_t len = _tcslen(app_path);
+ for (size_t i = len; i >= 0; i --)
+ if (app_path[i] == '\\') {
+ app_path[i] = 0;
+ break;
+ }
+
+#ifdef _UNICODE
+ #ifndef _FXSDK_OPENSOURCE_
+ CPDF_ModuleMgr::Get()->SetModulePath(NULL, CFX_ByteString::FromUnicode(app_path));
+ #endif
+#else
+#ifndef _FXSDK_OPENSOURCE_
+ CPDF_ModuleMgr::Get()->SetModulePath(NULL, app_path);
+#endif
+#endif
+#endif
+}
+
+
+DLLEXPORT void STDCALL FPDF_DestroyLibrary()
+{
+
+#if _FX_OS_ == _FX_LINUX_EMBEDDED_
+ if (g_pFontMapper) delete g_pFontMapper;
+#endif
+#ifdef API5
+ g_pModuleMgr->Destroy();
+#else
+ CPDF_ModuleMgr::Destroy();
+ CFX_GEModule::Destroy();
+ g_pCodecModule->Destroy();
+#endif
+#ifndef _FXSDK_OPENSOURCE_
+ FXMEM_CollectAll(FXMEM_GetDefaultMgr());
+#else
+ FXMEM_DestroyFoxitMgr(g_pFoxitMgr);
+#endif
+}
+
+#ifndef _WIN32
+int g_LastError;
+void SetLastError(int err)
+{
+ g_LastError = err;
+}
+
+int GetLastError()
+{
+ return g_LastError;
+}
+#endif
+
+void ProcessParseError(FX_DWORD err_code)
+{
+ // Translate FPDFAPI error code to FPDFVIEW error code
+ switch (err_code) {
+ case PDFPARSE_ERROR_FILE:
+ err_code = FPDF_ERR_FILE;
+ break;
+ case PDFPARSE_ERROR_FORMAT:
+ err_code = FPDF_ERR_FORMAT;
+ break;
+ case PDFPARSE_ERROR_PASSWORD:
+ err_code = FPDF_ERR_PASSWORD;
+ break;
+ case PDFPARSE_ERROR_HANDLER:
+ 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)
+{
+ CPDF_Parser* pParser = FX_NEW CPDF_Parser;
+ pParser->SetPassword(password);
+ try {
+ FX_DWORD err_code = pParser->StartParse((FX_LPCSTR)file_path);
+ if (err_code) {
+ delete pParser;
+ ProcessParseError(err_code);
+ return NULL;
+ }
+ }
+ catch (...) {
+ delete pParser;
+ SetLastError(FPDF_ERR_UNKNOWN);
+ return NULL;
+ }
+ return pParser->GetDocument();
+}
+
+extern void CheckUnSupportError(CPDF_Document * pDoc, FX_DWORD err_code);
+
+class CMemFile: public IFX_FileRead, public CFX_Object
+{
+public:
+ CMemFile(FX_BYTE* pBuf, FX_FILESIZE size):m_pBuf(pBuf),m_size(size) {}
+
+ virtual void Release() {delete this;}
+ virtual FX_FILESIZE GetSize() {return m_size;}
+ virtual FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size)
+ {
+ if(offset+size > (FX_DWORD)m_size) return FALSE;
+ FXSYS_memcpy(buffer, m_pBuf+offset, size);
+ return TRUE;
+ }
+private:
+ FX_BYTE* m_pBuf;
+ FX_FILESIZE m_size;
+};
+DLLEXPORT FPDF_DOCUMENT STDCALL FPDF_LoadMemDocument(const void* data_buf, int size, FPDF_BYTESTRING password)
+{
+ CPDF_Parser* pParser = FX_NEW CPDF_Parser;
+ pParser->SetPassword(password);
+ try {
+ CMemFile* pMemFile = FX_NEW CMemFile((FX_BYTE*)data_buf, size);
+ FX_DWORD err_code = pParser->StartParse(pMemFile);
+ if (err_code) {
+ delete pParser;
+ ProcessParseError(err_code);
+ return NULL;
+ }
+ CPDF_Document * pDoc = NULL;
+ pDoc = pParser?pParser->GetDocument():NULL;
+ CheckUnSupportError(pDoc, err_code);
+ }
+ catch (...) {
+ delete pParser;
+ SetLastError(FPDF_ERR_UNKNOWN);
+ return NULL;
+ }
+ return pParser->GetDocument();
+}
+
+DLLEXPORT FPDF_DOCUMENT STDCALL FPDF_LoadCustomDocument(FPDF_FILEACCESS* pFileAccess, FPDF_BYTESTRING password)
+{
+ CPDF_Parser* pParser = FX_NEW CPDF_Parser;
+ pParser->SetPassword(password);
+ CPDF_CustomAccess* pFile = FX_NEW CPDF_CustomAccess(pFileAccess);
+ try {
+ FX_DWORD err_code = pParser->StartParse(pFile);
+ if (err_code) {
+ delete pParser;
+ ProcessParseError(err_code);
+ return NULL;
+ }
+ CPDF_Document * pDoc = NULL;
+ pDoc = pParser?pParser->GetDocument():NULL;
+ CheckUnSupportError(pDoc, err_code);
+ }
+ catch (...) {
+ delete pParser;
+ SetLastError(FPDF_ERR_UNKNOWN);
+ return NULL;
+ }
+ return pParser->GetDocument();
+}
+
+DLLEXPORT FPDF_BOOL STDCALL FPDF_GetFileVersion(FPDF_DOCUMENT doc, int* fileVersion)
+{
+ if(!doc||!fileVersion) return FALSE;
+ *fileVersion = 0;
+ CPDF_Document* pDoc = (CPDF_Document*)doc;
+ CPDF_Parser* pParser = (CPDF_Parser*)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)
+{
+ if (document == NULL) return 0;
+ CPDF_Document*pDoc = (CPDF_Document*)document;
+ CPDF_Parser* pParser = (CPDF_Parser*)pDoc->GetParser();
+ CPDF_Dictionary* pDict = pParser->GetEncryptDict();
+ if (pDict == NULL) return (FX_DWORD)-1;
+
+ return pDict->GetInteger("P");
+}
+
+DLLEXPORT int STDCALL FPDF_GetPageCount(FPDF_DOCUMENT document)
+{
+ if (document == NULL) return 0;
+ return ((CPDF_Document*)document)->GetPageCount();
+}
+
+DLLEXPORT FPDF_PAGE STDCALL FPDF_LoadPage(FPDF_DOCUMENT document, int page_index)
+{
+ if (document == NULL) return NULL;
+ if (page_index < 0 || page_index >= FPDF_GetPageCount(document)) return NULL;
+// CPDF_Parser* pParser = (CPDF_Parser*)document;
+ CPDF_Document* pDoc = (CPDF_Document*)document;
+ if (pDoc == NULL) return NULL;
+ CPDF_Dictionary* pDict = pDoc->GetPage(page_index);
+ if (pDict == NULL) return NULL;
+ CPDF_Page* pPage = FX_NEW CPDF_Page;
+ pPage->Load(pDoc, pDict);
+ try {
+ pPage->ParseContent();
+ }
+ catch (...) {
+ delete pPage;
+ return NULL;
+ }
+
+// CheckUnSupportError(pDoc, 0);
+
+ return pPage;
+}
+
+DLLEXPORT double STDCALL FPDF_GetPageWidth(FPDF_PAGE page)
+{
+ if (!page)
+ return 0.0;
+ return ((CPDF_Page*)page)->GetPageWidth();
+}
+
+DLLEXPORT double STDCALL FPDF_GetPageHeight(FPDF_PAGE page)
+{
+ if (!page) return 0.0;
+ return ((CPDF_Page*)page)->GetPageHeight();
+}
+
+void DropContext(void* data)
+{
+ delete (CRenderContext*)data;
+}
+
+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 );
+void (*Func_RenderPage)(CRenderContext*, 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 ) = FPDF_RenderPage_Retail;
+
+#if defined(_DEBUG) || defined(DEBUG)
+#define DEBUG_TRACE
+#endif
+
+#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)
+{
+ if (page==NULL) return;
+ CPDF_Page* pPage = (CPDF_Page*)page;
+
+ CRenderContext* pContext = FX_NEW CRenderContext;
+ pPage->SetPrivateData((void*)1, pContext, DropContext);
+
+#ifndef _WIN32_WCE
+ CFX_DIBitmap* pBitmap = NULL;
+ FX_BOOL bBackgroundAlphaNeeded=FALSE;
+ bBackgroundAlphaNeeded = pPage->BackgroundAlphaNeeded();
+ if (bBackgroundAlphaNeeded)
+ {
+
+ pBitmap = FX_NEW CFX_DIBitmap;
+ pBitmap->Create(size_x, size_y, FXDIB_Argb);
+ pBitmap->Clear(0x00ffffff);
+#ifdef _SKIA_SUPPORT_
+ pContext->m_pDevice = FX_NEW CFX_SkiaDevice;
+ ((CFX_SkiaDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)pBitmap);
+#else
+ pContext->m_pDevice = FX_NEW CFX_FxgeDevice;
+ ((CFX_FxgeDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)pBitmap);
+#endif
+ }
+ else
+ pContext->m_pDevice = FX_NEW CFX_WindowsDevice(dc);
+ if (flags & FPDF_NO_CATCH)
+ Func_RenderPage(pContext, page, start_x, start_y, size_x, size_y, rotate, flags,TRUE,NULL);
+ else {
+ try {
+ Func_RenderPage(pContext, page, start_x, start_y, size_x, size_y, rotate, flags,TRUE,NULL);
+ } catch (...) {
+ }
+ }
+ if (bBackgroundAlphaNeeded)
+ {
+ if (pBitmap)
+ {
+ CFX_WindowsDevice WinDC(dc);
+
+ if (WinDC.GetDeviceCaps(FXDC_DEVICE_CLASS) == FXDC_PRINTER)
+ {
+ CFX_DIBitmap* pDst = FX_NEW CFX_DIBitmap;
+ pDst->Create(pBitmap->GetWidth(), pBitmap->GetHeight(),FXDIB_Rgb32);
+ FXSYS_memcpy(pDst->GetBuffer(), pBitmap->GetBuffer(), pBitmap->GetPitch()*pBitmap->GetHeight());
+// WinDC.SetDIBits(pDst,0,0);
+ WinDC.StretchDIBits(pDst,0,0,size_x*2,size_y*2);
+ 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;
+
+#ifdef DEBUG_TRACE
+ {
+ char str[128];
+ sprintf(str, "Rendering DIB %d x %d", width, height);
+ CPDF_ModuleMgr::Get()->ReportError(999, str);
+ }
+#endif
+
+ // 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);
+ if (pContext->m_hBitmap == NULL) {
+#if defined(DEBUG) || defined(_DEBUG)
+ char str[128];
+ sprintf(str, "Error CreateDIBSection: %d x %d, error code = %d", width, height, GetLastError());
+ CPDF_ModuleMgr::Get()->ReportError(FPDFERR_OUT_OF_MEMORY, str);
+#else
+ CPDF_ModuleMgr::Get()->ReportError(FPDFERR_OUT_OF_MEMORY, NULL);
+#endif
+ }
+ FXSYS_memset(pBuffer, 0xff, height*((width*3+3)/4*4));
+
+#ifdef DEBUG_TRACE
+ {
+ CPDF_ModuleMgr::Get()->ReportError(999, "DIBSection created");
+ }
+#endif
+
+ // Create a device with this external buffer
+ pContext->m_pBitmap = FX_NEW CFX_DIBitmap;
+ pContext->m_pBitmap->Create(width, height, FXDIB_Rgb, (FX_LPBYTE)pBuffer);
+ pContext->m_pDevice = FX_NEW CPDF_FxgeDevice;
+ ((CPDF_FxgeDevice*)pContext->m_pDevice)->Attach(pContext->m_pBitmap);
+
+#ifdef DEBUG_TRACE
+ CPDF_ModuleMgr::Get()->ReportError(999, "Ready for PDF rendering");
+#endif
+
+ // output to bitmap device
+ if (flags & FPDF_NO_CATCH)
+ Func_RenderPage(pContext, page, start_x - rect.left, start_y - rect.top, size_x, size_y, rotate, flags);
+ else {
+ try {
+ Func_RenderPage(pContext, page, start_x - rect.left, start_y - rect.top, size_x, size_y, rotate, flags);
+ } catch (...) {
+ }
+ }
+
+#ifdef DEBUG_TRACE
+ CPDF_ModuleMgr::Get()->ReportError(999, "Finished PDF rendering");
+#endif
+
+ // Now output to real device
+ HDC hMemDC = CreateCompatibleDC(dc);
+ if (hMemDC == NULL) {
+#if defined(DEBUG) || defined(_DEBUG)
+ char str[128];
+ sprintf(str, "Error CreateCompatibleDC. Error code = %d", GetLastError());
+ CPDF_ModuleMgr::Get()->ReportError(FPDFERR_OUT_OF_MEMORY, str);
+#else
+ CPDF_ModuleMgr::Get()->ReportError(FPDFERR_OUT_OF_MEMORY, NULL);
+#endif
+ }
+
+ HGDIOBJ hOldBitmap = SelectObject(hMemDC, pContext->m_hBitmap);
+
+#ifdef DEBUG_TRACE
+ CPDF_ModuleMgr::Get()->ReportError(999, "Ready for screen rendering");
+#endif
+
+ BitBlt(dc, rect.left, rect.top, width, height, hMemDC, 0, 0, SRCCOPY);
+ SelectObject(hMemDC, hOldBitmap);
+ DeleteDC(hMemDC);
+
+#ifdef DEBUG_TRACE
+ CPDF_ModuleMgr::Get()->ReportError(999, "Finished screen rendering");
+#endif
+
+#endif
+ if (bBackgroundAlphaNeeded)
+ {
+ if (pBitmap)
+ delete pBitmap;
+ pBitmap = NULL;
+ }
+ delete pContext;
+ pPage->RemovePrivateData((void*)1);
+}
+#endif
+
+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 == NULL || page == NULL) return;
+ CPDF_Page* pPage = (CPDF_Page*)page;
+
+
+ CRenderContext* pContext = FX_NEW CRenderContext;
+ pPage->SetPrivateData((void*)1, pContext, DropContext);
+#ifdef _SKIA_SUPPORT_
+ pContext->m_pDevice = FX_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 = FX_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
+ if (flags & FPDF_NO_CATCH)
+ Func_RenderPage(pContext, page, start_x, start_y, size_x, size_y, rotate, flags,TRUE,NULL);
+ else {
+ try {
+ Func_RenderPage(pContext, page, start_x, start_y, size_x, size_y, rotate, flags,TRUE,NULL);
+ } catch (...) {
+ }
+ }
+
+ delete pContext;
+ pPage->RemovePrivateData((void*)1);
+}
+
+DLLEXPORT void STDCALL FPDF_ClosePage(FPDF_PAGE page)
+{
+ if (!page) return;
+ delete (CPDF_Page*)page;
+
+}
+
+DLLEXPORT void STDCALL FPDF_CloseDocument(FPDF_DOCUMENT document)
+{
+ if (!document)
+ return;
+ CPDF_Document* pDoc = (CPDF_Document*)document;
+ CPDF_Parser* pParser = (CPDF_Parser*)pDoc->GetParser();
+ if (pParser == NULL)
+ {
+ delete pDoc;
+ return;
+ }
+ delete pParser;
+// delete pDoc;
+}
+
+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 == NULL || page_x == NULL || page_y == NULL) return;
+ CPDF_Page* pPage = (CPDF_Page*)page;
+
+ CPDF_Matrix page2device;
+ pPage->GetDisplayMatrix(page2device, start_x, start_y, size_x, size_y, rotate);
+ CPDF_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);
+}
+
+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 (page == NULL || device_x == NULL || device_y == NULL) return;
+ CPDF_Page* pPage = (CPDF_Page*)page;
+
+ CPDF_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);
+}
+
+DLLEXPORT FPDF_BITMAP STDCALL FPDFBitmap_Create(int width, int height, int alpha)
+{
+ CFX_DIBitmap* pBitmap = FX_NEW CFX_DIBitmap;
+ pBitmap->Create(width, height, alpha ? FXDIB_Argb : FXDIB_Rgb32);
+ return pBitmap;
+}
+
+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 = FX_NEW CFX_DIBitmap;
+ pBitmap->Create(width, height, fx_format, (FX_LPBYTE)first_scan, stride);
+ return pBitmap;
+}
+
+DLLEXPORT void STDCALL FPDFBitmap_FillRect(FPDF_BITMAP bitmap, int left, int top, int width, int height,
+ int red, int green, int blue, int alpha)
+{
+ if (bitmap == NULL) return;
+#ifdef _SKIA_SUPPORT_
+ CFX_SkiaDevice device;
+#else
+ CFX_FxgeDevice device;
+#endif
+ device.Attach((CFX_DIBitmap*)bitmap);
+ if (!((CFX_DIBitmap*)bitmap)->HasAlpha()) alpha = 255;
+ FX_RECT rect(left, top, left+width, top+height);
+ device.FillRect(&rect, FXARGB_MAKE(alpha, red, green, blue));
+}
+
+DLLEXPORT void* STDCALL FPDFBitmap_GetBuffer(FPDF_BITMAP bitmap)
+{
+ if (bitmap == NULL) return NULL;
+ return ((CFX_DIBitmap*)bitmap)->GetBuffer();
+}
+
+DLLEXPORT int STDCALL FPDFBitmap_GetWidth(FPDF_BITMAP bitmap)
+{
+ if (bitmap == NULL) return 0;
+ return ((CFX_DIBitmap*)bitmap)->GetWidth();
+}
+
+DLLEXPORT int STDCALL FPDFBitmap_GetHeight(FPDF_BITMAP bitmap)
+{
+ if (bitmap == NULL) return 0;
+ return ((CFX_DIBitmap*)bitmap)->GetHeight();
+}
+
+DLLEXPORT int STDCALL FPDFBitmap_GetStride(FPDF_BITMAP bitmap)
+{
+ if (bitmap == NULL) return 0;
+ return ((CFX_DIBitmap*)bitmap)->GetPitch();
+}
+
+DLLEXPORT void STDCALL FPDFBitmap_Destroy(FPDF_BITMAP bitmap)
+{
+ if (bitmap == NULL) return;
+ 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 )
+{
+//#ifdef _LICENSED_BUILD_
+ CPDF_Page* pPage = (CPDF_Page*)page;
+ if (pPage == NULL) return;
+
+ if (!pContext->m_pOptions)
+ pContext->m_pOptions = new CPDF_RenderOptions;
+// CPDF_RenderOptions options;
+ 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;
+ //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_AffineMatrix matrix;
+ pPage->GetDisplayMatrix(matrix, start_x, start_y, size_x, size_y, rotate);
+
+ FX_RECT clip;
+ clip.left = start_x;
+ clip.right = start_x + size_x;
+ clip.top = start_y;
+ clip.bottom = start_y + size_y;
+ pContext->m_pDevice->SaveState();
+ pContext->m_pDevice->SetClip_Rect(&clip);
+
+ pContext->m_pContext = FX_NEW CPDF_RenderContext;
+ pContext->m_pContext->Create(pPage);
+ pContext->m_pContext->AppendObjectList(pPage, &matrix);
+
+ if (flags & FPDF_ANNOT) {
+ pContext->m_pAnnots = FX_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 = FX_NEW CPDF_ProgressiveRenderer;
+ pContext->m_pRenderer->Start(pContext->m_pContext, pContext->m_pDevice, pContext->m_pOptions, pause);
+ if (bNeedToRestore)
+ {
+ pContext->m_pDevice->RestoreState();
+ }
+
+//#endif
+}
+
+DLLEXPORT int STDCALL FPDF_GetPageSizeByIndex(FPDF_DOCUMENT document, int page_index, double* width, double* height)
+{
+ CPDF_Document* pDoc = (CPDF_Document*)document;
+ if(pDoc == NULL)
+ return FALSE;
+
+ CPDF_Dictionary* pDict = pDoc->GetPage(page_index);
+ if (pDict == NULL) return FALSE;
+
+ CPDF_Page page;
+ page.Load(pDoc, pDict);
+ *width = page.GetPageWidth();
+ *height = page.GetPageHeight();
+
+ return TRUE;
+}
+
+DLLEXPORT FPDF_BOOL STDCALL FPDF_VIEWERREF_GetPrintScaling(FPDF_DOCUMENT document)
+{
+ CPDF_Document* pDoc = (CPDF_Document*)document;
+ if (!pDoc) return TRUE;
+ CPDF_ViewerPreferences viewRef(pDoc);
+ return viewRef.PrintScaling();
+}
+
+DLLEXPORT FPDF_DEST STDCALL FPDF_GetNamedDestByName(FPDF_DOCUMENT document,FPDF_BYTESTRING name)
+{
+ if (document == NULL)
+ return NULL;
+ if (name == NULL || name[0] == 0)
+ return NULL;
+
+ CPDF_Document* pDoc = (CPDF_Document*)document;
+ CPDF_NameTree name_tree(pDoc, FX_BSTRC("Dests"));
+ return name_tree.LookupNamedDest(pDoc, name);
+}
\ No newline at end of file diff --git a/fpdfsdk/src/fsdk_actionhandler.cpp b/fpdfsdk/src/fsdk_actionhandler.cpp new file mode 100644 index 0000000000..2a3898cd9b --- /dev/null +++ b/fpdfsdk/src/fsdk_actionhandler.cpp @@ -0,0 +1,850 @@ +// 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 "../include/fsdk_define.h"
+#include "../include/fsdk_mgr.h"
+#include "../include/fsdk_actionhandler.h"
+#include "../include/javascript/IJavaScript.h"
+
+/* -------------------------- CBA_ActionHandler -------------------------- */
+
+CPDFSDK_ActionHandler::CPDFSDK_ActionHandler(CPDFDoc_Environment* pEvi) :
+ m_pEvi(pEvi),
+ m_pFormActionHandler(NULL),
+ m_pMediaActionHandler(NULL)
+{
+ m_pFormActionHandler = new CPDFSDK_FormActionHandler;
+}
+
+CPDFSDK_ActionHandler::~CPDFSDK_ActionHandler()
+{
+ if(m_pFormActionHandler)
+ {
+ delete m_pFormActionHandler;
+ m_pFormActionHandler = NULL;
+ }
+}
+
+void CPDFSDK_ActionHandler::SetFormActionHandler(CPDFSDK_FormActionHandler* pHandler)
+{
+ ASSERT(pHandler != NULL);
+ ASSERT(m_pFormActionHandler == NULL);
+ m_pFormActionHandler = pHandler;
+}
+
+void CPDFSDK_ActionHandler::SetMediaActionHandler(CPDFSDK_MediaActionHandler* pHandler)
+{
+ ASSERT(pHandler != NULL);
+ ASSERT(m_pMediaActionHandler == NULL);
+ m_pMediaActionHandler = pHandler;
+}
+
+void CPDFSDK_ActionHandler::Destroy()
+{
+ delete this;
+}
+
+//document open
+FX_BOOL CPDFSDK_ActionHandler::DoAction_DocOpen(const CPDF_Action& action, CPDFSDK_Document* pDocument
+ /*CReader_Document* pDocument, CReader_DocView *pDocView*/)
+{
+ CFX_PtrList list;
+ return ExecuteDocumentOpenAction(action, pDocument, /*pDocView, */list);
+}
+
+//document open
+FX_BOOL CPDFSDK_ActionHandler::DoAction_JavaScript(const CPDF_Action& JsAction,CFX_WideString csJSName,
+ CPDFSDK_Document* pDocument/*, CReader_DocView *pDocView*/)
+{
+ 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/*, CReader_DocView *pDocView*/)
+{
+ CFX_PtrList list;
+ return ExecuteDocumentPageAction(action, eType, pDocument,/* pDocView,*/ list);
+}
+
+FX_BOOL CPDFSDK_ActionHandler::DoAction_Document(const CPDF_Action& action, enum CPDF_AAction::AActionType eType,
+ CPDFSDK_Document* pDocument/*, CReader_DocView *pDocView*/)
+{
+ CFX_PtrList list;
+ return ExecuteDocumentPageAction(action, eType, pDocument,/* pDocView,*/ list);
+}
+
+FX_BOOL CPDFSDK_ActionHandler::DoAction_BookMark(CPDF_Bookmark *pBookMark, const CPDF_Action& action, CPDF_AAction::AActionType type,
+ CPDFSDK_Document* pDocument/*, CReader_DocView *pDocView*/)
+{
+ CFX_PtrList list;
+ return this->ExecuteBookMark(action, pDocument,/* pDocView,*/ pBookMark, list);
+}
+
+FX_BOOL CPDFSDK_ActionHandler::DoAction_Screen(const CPDF_Action& action, CPDF_AAction::AActionType type,
+ CPDFSDK_Document* pDocument,/* CReader_DocView *pDocView,*/ CPDFSDK_Annot* pScreen)
+{
+ CFX_PtrList list;
+ return this->ExecuteScreenAction(action, type, pDocument,/* pDocView,*/ pScreen, list);
+}
+
+FX_BOOL CPDFSDK_ActionHandler::DoAction_Link(const CPDF_Action& action,
+ CPDFSDK_Document* pDocument/*, CReader_DocView *pDocView*/)
+{
+ CFX_PtrList list;
+ return ExecuteLinkAction(action, pDocument,/* pDocView,*/ list);
+}
+
+FX_BOOL CPDFSDK_ActionHandler::DoAction_Field(const CPDF_Action& action, CPDF_AAction::AActionType type,
+ CPDFSDK_Document* pDocument,/* CReader_DocView *pDocView,*/
+ CPDF_FormField* pFormField, PDFSDK_FieldAction& data)
+{
+ CFX_PtrList list;
+ return ExecuteFieldAction(action, type, pDocument,/* pDocView,*/ pFormField, data, list);
+}
+
+FX_BOOL CPDFSDK_ActionHandler::ExecuteDocumentOpenAction(const CPDF_Action& action, CPDFSDK_Document* pDocument,
+ /*CReader_DocView *pDocView,*/ CFX_PtrList& list)
+{
+ ASSERT(pDocument != NULL);
+
+ if (list.Find((CPDF_Dictionary*)action))
+ return FALSE;
+ list.AddTail((CPDF_Dictionary*)action);
+
+ 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/*, pDocView*/);
+ }
+
+// if (!IsValidDocView(pDocument, pDocView))
+// return FALSE;
+
+ for (FX_INT32 i=0,sz=action.GetSubActionsCount(); i<sz; i++)
+ {
+ CPDF_Action subaction = action.GetSubAction(i);
+ if (!ExecuteDocumentOpenAction(subaction, pDocument,/* pDocView,*/ list)) return FALSE;
+ }
+
+ return TRUE;
+}
+
+FX_BOOL CPDFSDK_ActionHandler::ExecuteLinkAction(const CPDF_Action& action, CPDFSDK_Document* pDocument,
+ /*CReader_DocView* pDocView,*/ CFX_PtrList& list)
+{
+ ASSERT(pDocument != NULL);
+
+ if (list.Find((CPDF_Dictionary*)action))
+ return FALSE;
+ list.AddTail((CPDF_Dictionary*)action);
+
+ CPDFDoc_Environment* pEnv = pDocument->GetEnv();
+ ASSERT(pEnv);
+ if (action.GetType() == CPDF_Action::JavaScript)
+ {
+ if(pEnv->IsJSInitiated())
+ {
+ CFX_WideString swJS = action.GetJavaScript();
+ if (!swJS.IsEmpty())
+ {
+ IFXJS_Runtime* pRuntime = pDocument->GetJsRuntime(); //????
+ ASSERT(pRuntime != NULL);
+
+ pRuntime->SetReaderDocument(pDocument);
+
+ IFXJS_Context* pContext = pRuntime->NewContext();
+ ASSERT(pContext != NULL);
+
+ pContext->OnLink_MouseUp(pDocument);
+
+ CFX_WideString csInfo;
+ FX_BOOL bRet = pContext->RunScript(swJS, csInfo);
+ if (!bRet)
+ {
+ //CBCL_FormNotify::MsgBoxJSError(pPageView->GetPageViewWnd(), csInfo);
+ }
+
+ pRuntime->ReleaseContext(pContext);
+ }
+ }
+ }
+ else
+ {
+ DoAction_NoJs(action, pDocument/*, pDocView*/);
+ }
+
+// if (!IsValidDocView(pDocument, pDocView))
+// return FALSE;
+
+ for (FX_INT32 i=0,sz=action.GetSubActionsCount(); i<sz; i++)
+ {
+ CPDF_Action subaction = action.GetSubAction(i);
+ if (!ExecuteLinkAction(subaction, pDocument,/* pDocView,*/ list)) return FALSE;
+ }
+
+ return TRUE;
+}
+
+FX_BOOL CPDFSDK_ActionHandler::ExecuteDocumentPageAction(const CPDF_Action& action, CPDF_AAction::AActionType type,
+ CPDFSDK_Document* pDocument,/* CReader_DocView* pDocView,*/ CFX_PtrList& list)
+{
+ ASSERT(pDocument != NULL);
+
+ if (list.Find((CPDF_Dictionary*)action))
+ return FALSE;
+ list.AddTail((CPDF_Dictionary*)action);
+
+ 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/*, pDocView*/);
+ }
+
+ if (!IsValidDocView(pDocument/*, pDocView*/))
+ return FALSE;
+
+ for (FX_INT32 i=0,sz=action.GetSubActionsCount(); i<sz; i++)
+ {
+ CPDF_Action subaction = action.GetSubAction(i);
+ if (!ExecuteDocumentPageAction(subaction, type, pDocument,/* pDocView,*/ list)) return FALSE;
+ }
+
+ return TRUE;
+}
+
+FX_BOOL CPDFSDK_ActionHandler::IsValidField(CPDFSDK_Document* pDocument, CPDF_Dictionary* pFieldDict)
+{
+ ASSERT(m_pEvi != NULL);
+ ASSERT(pDocument != NULL);
+ ASSERT(pFieldDict != NULL);
+
+ if (1/*m_pApp->IsValidDocument(pDocument)*/)
+ {
+ CPDFSDK_InterForm* pInterForm = pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ CPDF_InterForm* pPDFInterForm = pInterForm->GetInterForm();
+ ASSERT(pPDFInterForm != NULL);
+
+ return pPDFInterForm->GetFieldByDict(pFieldDict) != NULL;
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CPDFSDK_ActionHandler::ExecuteFieldAction(const CPDF_Action& action, CPDF_AAction::AActionType type,
+ CPDFSDK_Document* pDocument,/* CReader_DocView* pDocView,*/ CPDF_FormField* pFormField,
+ PDFSDK_FieldAction& data, CFX_PtrList& list)
+{
+ ASSERT(pDocument != NULL);
+
+ if (list.Find((CPDF_Dictionary*)action))
+ return FALSE;
+ list.AddTail((CPDF_Dictionary*)action);
+
+ 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/*, pDocView*/);
+// if (!IsValidDocView(pDocument, pDocView))
+// return FALSE;
+ }
+
+ for (FX_INT32 i=0,sz=action.GetSubActionsCount(); i<sz; i++)
+ {
+ CPDF_Action subaction = action.GetSubAction(i);
+ if (!ExecuteFieldAction(subaction, type, pDocument,/* pDocView,*/ pFormField, data, list)) return FALSE;
+ }
+
+ return TRUE;
+}
+
+FX_BOOL CPDFSDK_ActionHandler::ExecuteScreenAction(const CPDF_Action& action, CPDF_AAction::AActionType type,
+ CPDFSDK_Document* pDocument,/* CReader_DocView* pDocView,*/ CPDFSDK_Annot* pScreen, CFX_PtrList& list)
+{
+ ASSERT(pDocument != NULL);
+
+ if (list.Find((CPDF_Dictionary*)action))
+ return FALSE;
+ list.AddTail((CPDF_Dictionary*)action);
+
+ CPDFDoc_Environment* pEnv = pDocument->GetEnv();
+ ASSERT(pEnv);
+ if (action.GetType() == CPDF_Action::JavaScript)
+ {
+ if(pEnv->IsJSInitiated())
+ {
+ CFX_WideString swJS = action.GetJavaScript();
+ if (!swJS.IsEmpty())
+ {
+ IFXJS_Runtime* pRuntime = pDocument->GetJsRuntime();
+ ASSERT(pRuntime != NULL);
+
+ pRuntime->SetReaderDocument(pDocument);
+
+ IFXJS_Context* pContext = pRuntime->NewContext();
+ ASSERT(pContext != NULL);
+
+ // switch (type)
+ // {
+ // case CPDF_AAction::CursorEnter:
+ // pContext->OnScreen_MouseEnter(IsCTRLpressed(), IsSHIFTpressed(), pScreen);
+ // break;
+ // case CPDF_AAction::CursorExit:
+ // pContext->OnScreen_MouseExit(IsCTRLpressed(), IsSHIFTpressed(), pScreen);
+ // break;
+ // case CPDF_AAction::ButtonDown:
+ // pContext->OnScreen_MouseDown(IsCTRLpressed(), IsSHIFTpressed(), pScreen);
+ // break;
+ // case CPDF_AAction::ButtonUp:
+ // pContext->OnScreen_MouseUp(IsCTRLpressed(), IsSHIFTpressed(), pScreen);
+ // break;
+ // case CPDF_AAction::GetFocus:
+ // pContext->OnScreen_Focus(IsCTRLpressed(), IsSHIFTpressed(), pScreen);
+ // break;
+ // case CPDF_AAction::LoseFocus:
+ // pContext->OnScreen_Blur(IsCTRLpressed(), IsSHIFTpressed(), pScreen);
+ // break;
+ // case CPDF_AAction::PageOpen:
+ // pContext->OnScreen_Open(IsCTRLpressed(), IsSHIFTpressed(), pScreen);
+ // break;
+ // case CPDF_AAction::PageClose:
+ // pContext->OnScreen_Close(IsCTRLpressed(), IsSHIFTpressed(), pScreen);
+ // break;
+ // case CPDF_AAction::PageVisible:
+ // pContext->OnScreen_InView(IsCTRLpressed(), IsSHIFTpressed(), pScreen);
+ // break;
+ // case CPDF_AAction::PageInvisible:
+ // pContext->OnScreen_OutView(IsCTRLpressed(), IsSHIFTpressed(), pScreen);
+ // break;
+ // default:
+ // ASSERT(FALSE);
+ // break;
+ // }
+
+ CFX_WideString csInfo;
+ FX_BOOL bRet = pContext->RunScript(swJS, csInfo);
+ if (!bRet)
+ {
+ //CBCL_FormNotify::MsgBoxJSError(pPageView->GetPageViewWnd(), csInfo);
+ }
+
+ pRuntime->ReleaseContext(pContext);
+ }
+ }
+ }
+ else
+ {
+ DoAction_NoJs(action, pDocument/*, pDocView*/);
+ }
+
+// if (!IsValidDocView(pDocument, pDocView))
+// return FALSE;
+
+ for (FX_INT32 i=0,sz=action.GetSubActionsCount(); i<sz; i++)
+ {
+ CPDF_Action subaction = action.GetSubAction(i);
+ if (!ExecuteScreenAction(subaction, type, pDocument,/* pDocView,*/ pScreen, list)) return FALSE;
+ }
+
+ return TRUE;
+}
+
+FX_BOOL CPDFSDK_ActionHandler::ExecuteBookMark(const CPDF_Action& action, CPDFSDK_Document* pDocument,
+ /*CReader_DocView* pDocView,*/ CPDF_Bookmark* pBookmark, CFX_PtrList& list)
+{
+ ASSERT(pDocument != NULL);
+
+ if (list.Find((CPDF_Dictionary*)action))
+ return FALSE;
+ list.AddTail((CPDF_Dictionary*)action);
+
+ CPDFDoc_Environment* pEnv = pDocument->GetEnv();
+ ASSERT(pEnv);
+ if (action.GetType() == CPDF_Action::JavaScript)
+ {
+ if(pEnv->IsJSInitiated())
+ {
+ CFX_WideString swJS = action.GetJavaScript();
+ if (!swJS.IsEmpty())
+ {
+ IFXJS_Runtime* pRuntime = pDocument->GetJsRuntime();
+ ASSERT(pRuntime != NULL);
+
+ pRuntime->SetReaderDocument(pDocument);
+
+ IFXJS_Context* pContext = pRuntime->NewContext();
+ ASSERT(pContext != NULL);
+
+ pContext->OnBookmark_MouseUp(pBookmark);
+
+ CFX_WideString csInfo;
+ FX_BOOL bRet = pContext->RunScript(swJS, csInfo);
+ if (!bRet)
+ {
+ //CBCL_FormNotify::MsgBoxJSError(pPageView->GetPageViewWnd(), csInfo);
+ }
+
+ pRuntime->ReleaseContext(pContext);
+ }
+ }
+ }
+ else
+ {
+ DoAction_NoJs(action, pDocument/*, pDocView*/);
+ }
+
+// if (!IsValidDocView(pDocument, pDocView))
+// return FALSE;
+
+ for (FX_INT32 i=0,sz=action.GetSubActionsCount(); i<sz; i++)
+ {
+ CPDF_Action subaction = action.GetSubAction(i);
+ if (!ExecuteBookMark(subaction, pDocument,/* pDocView,*/ pBookmark, list)) return FALSE;
+ }
+
+ return TRUE;
+}
+
+void CPDFSDK_ActionHandler::DoAction_NoJs(const CPDF_Action& action, CPDFSDK_Document* pDocument/*, CReader_DocView* pDocView*/)
+{
+ ASSERT(pDocument != NULL);
+
+ switch (action.GetType())
+ {
+ case CPDF_Action::GoTo:
+ DoAction_GoTo(pDocument,/* pDocView,*/ 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:
+ if (m_pMediaActionHandler)
+ {
+ m_pMediaActionHandler->DoAction_Sound(action, pDocument/*, pDocView*/);
+ }
+ break;
+ case CPDF_Action::Movie:
+ if (m_pMediaActionHandler)
+ {
+ m_pMediaActionHandler->DoAction_Movie(action, pDocument/*, pDocView*/);
+ }
+ 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/*, pDocView*/);
+ }
+ 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/*, pDocView*/);
+ }
+ break;
+ case CPDF_Action::JavaScript:
+ ASSERT(FALSE);
+ break;
+ case CPDF_Action::SetOCGState:
+ DoAction_SetOCGState(pDocument, /*pDocView,*/ action);
+ break;
+ case CPDF_Action::Rendition:
+ if (m_pMediaActionHandler)
+ {
+ m_pMediaActionHandler->DoAction_Rendition(action, pDocument/*, pDocView*/);
+ }
+ break;
+ case CPDF_Action::Trans:
+ break;
+ case CPDF_Action::GoTo3DView:
+ break;
+ default:
+ break;
+ }
+}
+
+FX_BOOL CPDFSDK_ActionHandler::IsValidDocView(CPDFSDK_Document* pDocument/*, CReader_DocView* pDocView*/)
+{
+ ASSERT(pDocument != NULL);
+ //ASSERT(pDocView != NULL);
+
+ //return pDocument->IsValidDocView(pDocView);
+ return TRUE;
+}
+
+void CPDFSDK_ActionHandler::DoAction_GoTo(CPDFSDK_Document* pDocument, /*CReader_DocView* pDocView,*/
+ const CPDF_Action& action)
+{
+ ASSERT(pDocument != NULL);
+// ASSERT(pDocView != NULL);
+ ASSERT(action != NULL);
+
+ CPDF_Document* pPDFDocument = pDocument->GetDocument();
+ ASSERT(pPDFDocument != NULL);
+ CPDFDoc_Environment* pApp = pDocument->GetEnv();
+ ASSERT(pApp != NULL);
+
+ CPDF_Dest MyDest = action.GetDest(pPDFDocument);
+ int nPageIndex = MyDest.GetPageIndex(pPDFDocument);
+ int nFitType = MyDest.GetZoomMode();
+ const CPDF_Array * pMyArray = (CPDF_Array*)MyDest.m_pObj;
+ float* pPosAry = NULL;
+ int sizeOfAry = 0;
+ if (pMyArray != NULL)
+ {
+ pPosAry = new float[pMyArray->GetCount()];
+ int j = 0;
+ for (int i = 2; i < (int)pMyArray->GetCount(); i++)
+ {
+ pPosAry[j++] = pMyArray->GetFloat(i);
+ }
+ sizeOfAry = j;
+ }
+ pApp->FFI_DoGoToAction(nPageIndex, nFitType, pPosAry, sizeOfAry);
+ if(pPosAry)
+ 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(pDocument != NULL);
+ ASSERT(action != NULL);
+
+ CPDFDoc_Environment* pApp = pDocument->GetEnv();
+ ASSERT(pApp != NULL);
+
+ CFX_ByteString sURI = action.GetURI(pDocument->GetDocument());
+ pApp->FFI_DoURIAction(FX_LPCSTR(sURI));
+}
+
+void CPDFSDK_ActionHandler::DoAction_Named(CPDFSDK_Document* pDocument, const CPDF_Action& action)
+{
+ ASSERT(pDocument != NULL);
+ ASSERT(action != NULL);
+
+ CFX_ByteString csName = action.GetNamedAction();
+ pDocument->GetEnv()->FFI_ExecuteNamedAction(csName);
+}
+
+
+void CPDFSDK_ActionHandler::DoAction_SetOCGState(CPDFSDK_Document* pDocument,/* CReader_DocView* pDocView,*/ 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);
+
+ ASSERT(pDocument != NULL);
+
+ IFXJS_Runtime* pRuntime = pDocument->GetJsRuntime();
+ ASSERT(pRuntime != NULL);
+
+ pRuntime->SetReaderDocument(pDocument);
+
+ IFXJS_Context* pContext = pRuntime->NewContext();
+ ASSERT(pContext != NULL);
+
+ 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.nCommitKey, 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)
+ {
+ //CBCL_FormNotify::MsgBoxJSError(pPageView->GetPageViewWnd(), csInfo);
+ }
+
+ pRuntime->ReleaseContext(pContext);
+}
+
+void CPDFSDK_ActionHandler::RunDocumentOpenJavaScript(CPDFSDK_Document* pDocument, const CFX_WideString& sScriptName, const CFX_WideString& script)
+{
+ ASSERT(pDocument != NULL);
+
+ IFXJS_Runtime* pRuntime = pDocument->GetJsRuntime();
+ ASSERT(pRuntime != NULL);
+
+ pRuntime->SetReaderDocument(pDocument);
+
+ IFXJS_Context* pContext = pRuntime->NewContext();
+ ASSERT(pContext != NULL);
+
+ pContext->OnDoc_Open(pDocument, sScriptName);
+
+ CFX_WideString csInfo;
+ FX_BOOL bRet = pContext->RunScript(script, csInfo);
+ if (!bRet)
+ {
+ //CBCL_FormNotify::MsgBoxJSError(pPageView->GetPageViewWnd(), csInfo);
+ }
+
+ pRuntime->ReleaseContext(pContext);
+}
+
+void CPDFSDK_ActionHandler::RunDocumentPageJavaScript(CPDFSDK_Document* pDocument, CPDF_AAction::AActionType type, const CFX_WideString& script)
+{
+ ASSERT(pDocument != NULL);
+
+ IFXJS_Runtime* pRuntime = pDocument->GetJsRuntime();
+ ASSERT(pRuntime != NULL);
+
+ pRuntime->SetReaderDocument(pDocument);
+
+ IFXJS_Context* pContext = pRuntime->NewContext();
+ ASSERT(pContext != NULL);
+
+ 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)
+ {
+ //CBCL_FormNotify::MsgBoxJSError(pPageView->GetPageViewWnd(), csInfo);
+ }
+
+ pRuntime->ReleaseContext(pContext);
+}
+
+
+FX_BOOL CPDFSDK_FormActionHandler::DoAction_Hide(const CPDF_Action& action, CPDFSDK_Document* pDocument)
+{
+ ASSERT(pDocument != NULL);
+
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ if (pInterForm->DoAction_Hide(action))
+ {
+ pDocument->SetChangeMark();
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CPDFSDK_FormActionHandler::DoAction_SubmitForm(const CPDF_Action& action, CPDFSDK_Document* pDocument)
+{
+ ASSERT(pDocument != NULL);
+
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ return pInterForm->DoAction_SubmitForm(action);
+}
+
+FX_BOOL CPDFSDK_FormActionHandler::DoAction_ResetForm(const CPDF_Action& action, CPDFSDK_Document* pDocument)
+{
+ ASSERT(pDocument != NULL);
+
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ if (pInterForm->DoAction_ResetForm(action))
+ {
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CPDFSDK_FormActionHandler::DoAction_ImportData(const CPDF_Action& action, CPDFSDK_Document* pDocument)
+{
+ ASSERT(pDocument != NULL);
+
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ if (pInterForm->DoAction_ImportData(action))
+ {
+ pDocument->SetChangeMark();
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CPDFSDK_MediaActionHandler::DoAction_Rendition(const CPDF_Action& action, CPDFSDK_Document* pDocument)
+{
+ return FALSE;
+}
+
+FX_BOOL CPDFSDK_MediaActionHandler::DoAction_Sound(const CPDF_Action& action, CPDFSDK_Document* pDocument)
+{
+ return FALSE;
+}
+
+FX_BOOL CPDFSDK_MediaActionHandler::DoAction_Movie(const CPDF_Action& action, CPDFSDK_Document* pDocument)
+{
+ return FALSE;
+}
+
diff --git a/fpdfsdk/src/fsdk_annothandler.cpp b/fpdfsdk/src/fsdk_annothandler.cpp new file mode 100644 index 0000000000..b2a24a8dde --- /dev/null +++ b/fpdfsdk/src/fsdk_annothandler.cpp @@ -0,0 +1,945 @@ +// 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 "../include/fsdk_define.h"
+#include "../include/fsdk_mgr.h"
+#include "../include/formfiller/FFL_FormFiller.h"
+#include "../include/fsdk_annothandler.h"
+
+
+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);
+}
+
+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.RemoveAll();
+}
+
+void CPDFSDK_AnnotHandlerMgr::RegisterAnnotHandler(IPDFSDK_AnnotHandler* pAnnotHandler)
+{
+ ASSERT(pAnnotHandler != NULL);
+
+ ASSERT(GetAnnotHandler(pAnnotHandler->GetType()) == NULL);
+
+ m_Handlers.Add(pAnnotHandler);
+ m_mapType2Handler.SetAt(pAnnotHandler->GetType(), (void*)pAnnotHandler);
+}
+
+void CPDFSDK_AnnotHandlerMgr::UnRegisterAnnotHandler(IPDFSDK_AnnotHandler* pAnnotHandler)
+{
+ ASSERT(pAnnotHandler != NULL);
+
+ m_mapType2Handler.RemoveKey(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(pAnnot != NULL);
+ ASSERT(pPageView != NULL);
+
+ if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot->GetSubType()))
+ {
+ return pAnnotHandler->NewAnnot(pAnnot, pPageView);
+ }
+
+ return new CPDFSDK_Annot(pAnnot, pPageView);
+}
+
+void CPDFSDK_AnnotHandlerMgr::ReleaseAnnot(CPDFSDK_Annot* pAnnot)
+{
+ ASSERT(pAnnot != NULL);
+
+ pAnnot->GetPDFPage();
+
+ 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)
+{
+ ASSERT(pAnnot != NULL);
+
+ CPDF_Annot* pPDFAnnot = pAnnot->GetPDFAnnot();
+ ASSERT(pPDFAnnot != NULL);
+ ASSERT(pPDFAnnot->m_pAnnotDict != NULL);
+
+ CPDFSDK_DateTime curTime;
+ pPDFAnnot->m_pAnnotDict->SetAtString("M", curTime.ToPDFDateTimeString());
+ pPDFAnnot->m_pAnnotDict->SetAtNumber("F", (int)0);
+
+ if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
+ {
+ pAnnotHandler->OnCreate(pAnnot);
+ }
+}
+
+void CPDFSDK_AnnotHandlerMgr::Annot_OnLoad(CPDFSDK_Annot* pAnnot)
+{
+ ASSERT(pAnnot != NULL);
+
+ if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
+ {
+ pAnnotHandler->OnLoad(pAnnot);
+ }
+}
+
+IPDFSDK_AnnotHandler* CPDFSDK_AnnotHandlerMgr::GetAnnotHandler(CPDFSDK_Annot* pAnnot) const
+{
+ ASSERT(pAnnot != NULL);
+
+ CPDF_Annot* pPDFAnnot = pAnnot->GetPDFAnnot();
+ ASSERT(pPDFAnnot != NULL);
+
+ return GetAnnotHandler(pPDFAnnot->GetSubType());
+}
+
+IPDFSDK_AnnotHandler* CPDFSDK_AnnotHandlerMgr::GetAnnotHandler(const CFX_ByteString& sType) const
+{
+ void* pRet = NULL;
+ m_mapType2Handler.Lookup(sType, pRet);
+ return (IPDFSDK_AnnotHandler*)pRet;
+}
+
+void CPDFSDK_AnnotHandlerMgr::Annot_OnDraw(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,FX_DWORD dwFlags)
+{
+ ASSERT(pAnnot != NULL);
+
+ if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
+ {
+ pAnnotHandler->OnDraw(pPageView, pAnnot, pDevice, pUser2Device, dwFlags);
+ }
+ else
+ {
+ pAnnot->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL);
+ }
+}
+
+
+FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnLButtonDown(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point)
+{
+ ASSERT(pAnnot != NULL);
+
+ 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 CPDF_Point& point)
+ {
+ ASSERT(pAnnot != NULL);
+
+ 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 CPDF_Point& point)
+{
+ ASSERT(pAnnot != NULL);
+
+ 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 CPDF_Point& point)
+{
+ ASSERT(pAnnot != NULL);
+
+ 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 CPDF_Point& point)
+{
+ ASSERT(pAnnot != NULL);
+
+ 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 CPDF_Point& point)
+{
+ ASSERT(pAnnot != NULL);
+
+ 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 CPDF_Point& point)
+{
+ ASSERT(pAnnot != NULL);
+
+ 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 != NULL);
+
+ if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
+ {
+ pAnnotHandler->OnMouseEnter(pPageView, pAnnot, nFlag);
+ }
+ return ;
+}
+
+void CPDFSDK_AnnotHandlerMgr::Annot_OnMouseExit(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlag)
+{
+ ASSERT(pAnnot != NULL);
+
+ if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
+ {
+ pAnnotHandler->OnMouseExit(pPageView, pAnnot, nFlag);
+ }
+ return;
+}
+
+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 != NULL);
+
+ if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
+ {
+ if (pAnnotHandler->OnSetFocus(pAnnot, nFlag))
+ {
+ CPDFSDK_PageView* pPage = pAnnot->GetPageView();
+ ASSERT(pPage != NULL);
+
+ pPage->GetSDKDocument();
+ // pDocument->SetTopmostAnnot(pAnnot);
+
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnKillFocus(CPDFSDK_Annot* pAnnot, FX_DWORD nFlag)
+{
+ ASSERT(pAnnot != NULL);
+
+ if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
+ {
+ if (pAnnotHandler->OnKillFocus(pAnnot, nFlag))
+ {
+ return TRUE;
+ }
+ else
+ return FALSE;
+ }
+
+ return FALSE;
+}
+
+CPDF_Rect 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 CPDF_Point& 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)
+{
+ CBA_AnnotIterator ai(pSDKAnnot->GetPageView(), "Widget", "");
+
+ CPDFSDK_Annot* pNext = bNext ?
+ ai.GetNextAnnot(pSDKAnnot) :
+ ai.GetPrevAnnot(pSDKAnnot);
+
+ return pNext;
+}
+
+FX_BOOL CPDFSDK_BFAnnotHandler::CanAnswer(CPDFSDK_Annot* pAnnot)
+{
+ ASSERT(pAnnot);
+ ASSERT(pAnnot->GetType() == "Widget");
+ CFX_ByteString sSubType = pAnnot->GetSubType();
+
+ if (sSubType == BFFT_SIGNATURE)
+ {
+ }
+ else
+ {
+ 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;
+ else
+ {
+ CPDF_Page* pPage = pWidget->GetPDFPage();
+ ASSERT(pPage != NULL);
+
+ CPDF_Document* pDocument = pPage->m_pDocument;
+ ASSERT(pDocument != NULL);
+
+ FX_DWORD dwPermissions = pDocument->GetUserPermissions();
+ return (dwPermissions&FPDFPERM_FILL_FORM) ||
+ (dwPermissions&FPDFPERM_ANNOT_FORM) ||
+ (dwPermissions&FPDFPERM_ANNOT_FORM);
+ }
+ }
+
+ return FALSE;
+}
+
+CPDFSDK_Annot* CPDFSDK_BFAnnotHandler::NewAnnot(CPDF_Annot* pAnnot, CPDFSDK_PageView* pPage)
+{
+ ASSERT(pPage != NULL);
+ pPage->GetPDFDocument();
+
+ CPDFSDK_Document* pSDKDoc = m_pApp->GetCurrentDoc();
+ ASSERT(pSDKDoc);
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pSDKDoc->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ CPDFSDK_Widget* pWidget = NULL;
+ if (CPDF_FormControl* pCtrl = CPDFSDK_Widget::GetFormControl(pInterForm->GetInterForm(), pAnnot->m_pAnnotDict))
+ {
+ pWidget = new CPDFSDK_Widget(pAnnot, pPage, pInterForm);
+ pInterForm->AddMap(pCtrl, pWidget);
+ CPDF_InterForm* pPDFInterForm = pInterForm->GetInterForm();
+ if(pPDFInterForm && pPDFInterForm->NeedConstructAP())
+ pWidget->ResetAppearance(NULL,FALSE);
+ }
+
+ return pWidget;
+}
+
+void CPDFSDK_BFAnnotHandler::ReleaseAnnot(CPDFSDK_Annot* pAnnot)
+{
+ ASSERT(pAnnot != NULL);
+
+ if (m_pFormFiller)
+ m_pFormFiller->OnDelete(pAnnot);
+
+ CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
+ CPDFSDK_InterForm* pInterForm = pWidget->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ CPDF_FormControl* pCtrol = pWidget->GetFormControl();
+ pInterForm->RemoveMap(pCtrol);
+
+
+ delete pWidget;
+}
+
+
+void CPDFSDK_BFAnnotHandler::OnDraw(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device, FX_DWORD dwFlags)
+{
+ ASSERT(pAnnot != NULL);
+ CFX_ByteString sSubType = pAnnot->GetSubType();
+
+ if (sSubType == BFFT_SIGNATURE)
+ {
+ pAnnot->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL);
+ }
+ 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)
+{
+ ASSERT(pAnnot != NULL);
+ 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)
+{
+ ASSERT(pAnnot != NULL);
+ 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 CPDF_Point& point)
+{
+ ASSERT(pAnnot != NULL);
+ 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 CPDF_Point& point)
+{
+ ASSERT(pAnnot != NULL);
+ 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 CPDF_Point& point)
+{
+ ASSERT(pAnnot != NULL);
+ 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 CPDF_Point& point)
+{
+ ASSERT(pAnnot != NULL);
+ 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 CPDF_Point& point)
+{
+ ASSERT(pAnnot != NULL);
+ 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 CPDF_Point& point)
+{
+ ASSERT(pAnnot != NULL);
+ 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 CPDF_Point& point)
+{
+ ASSERT(pAnnot != NULL);
+ 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)
+{
+ ASSERT(pAnnot != NULL);
+ 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)
+{
+ ASSERT(pAnnot != NULL);
+ 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)
+{
+ ASSERT(pAnnot != NULL);
+ CFX_ByteString sSubType = pAnnot->GetSubType();
+
+ if (sSubType == BFFT_SIGNATURE)
+ {
+ }
+ else
+ {
+ if (m_pFormFiller)
+ m_pFormFiller->OnCreate(pAnnot);
+ }
+}
+
+void CPDFSDK_BFAnnotHandler::OnLoad(CPDFSDK_Annot* pAnnot)
+{
+ ASSERT(pAnnot != NULL);
+
+ CFX_ByteString sSubType = pAnnot->GetSubType();
+
+ if (sSubType == BFFT_SIGNATURE)
+ {
+ }
+ else
+ {
+ 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(0, bFormated);
+
+ if (bFormated && nFieldType == FIELDTYPE_COMBOBOX)
+ {
+ pWidget->ResetAppearance(sValue, FALSE);
+ }
+ }
+
+
+ if (m_pFormFiller)
+ m_pFormFiller->OnLoad(pAnnot);
+
+ }
+}
+
+FX_BOOL CPDFSDK_BFAnnotHandler::OnSetFocus(CPDFSDK_Annot* pAnnot, FX_DWORD nFlag)
+{
+ ASSERT(pAnnot != NULL);
+ 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)
+{
+ ASSERT(pAnnot != NULL);
+ CFX_ByteString sSubType = pAnnot->GetSubType();
+
+ if (sSubType == BFFT_SIGNATURE)
+ {
+ }
+ else
+ {
+ if (m_pFormFiller)
+ return m_pFormFiller->OnKillFocus(pAnnot,nFlag);
+ }
+
+ return TRUE;
+}
+
+CPDF_Rect CPDFSDK_BFAnnotHandler::GetViewBBox(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot)
+{
+ ASSERT(pAnnot != NULL);
+ CFX_ByteString sSubType = pAnnot->GetSubType();
+
+ if (sSubType == BFFT_SIGNATURE)
+ {
+ }
+ else
+ {
+ if (m_pFormFiller)
+ return m_pFormFiller->GetViewBBox(pPageView, pAnnot);
+
+ }
+
+ return CPDF_Rect(0,0,0,0);
+}
+
+FX_BOOL CPDFSDK_BFAnnotHandler::HitTest(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, const CPDF_Point& point)
+{
+ ASSERT(pPageView);
+ ASSERT(pAnnot);
+
+ CPDF_Rect rect = GetViewBBox(pPageView, pAnnot);
+ return rect.Contains(point.x, point.y);
+}
+
+//CReader_AnnotIteratorEx
+
+CPDFSDK_AnnotIterator::CPDFSDK_AnnotIterator(CPDFSDK_PageView * pPageView,FX_BOOL bReverse,
+ FX_BOOL bIgnoreTopmost/*=FALSE*/,
+ FX_BOOL bCircle/*=FALSE*/,
+ CFX_PtrArray *pList/*=NULL*/)
+{
+ ASSERT(pPageView);
+ m_bReverse=bReverse;
+ m_bIgnoreTopmost= bIgnoreTopmost;
+ m_bCircle=bCircle;
+ m_pIteratorAnnotList.RemoveAll();
+ InitIteratorAnnotList(pPageView,pList);
+}
+
+CPDFSDK_Annot* CPDFSDK_AnnotIterator::NextAnnot (const CPDFSDK_Annot* pCurrent)
+{
+
+ int index=-1;
+ int nCount=this->m_pIteratorAnnotList.GetSize();
+ if(pCurrent){
+ for(int i=0;i<nCount;i++){
+ CPDFSDK_Annot * pReaderAnnot= (CPDFSDK_Annot *)m_pIteratorAnnotList.GetAt(i);
+ if(pReaderAnnot ==pCurrent){
+ index=i;
+ break;
+ }
+ }
+ }
+ return NextAnnot(index);
+}
+CPDFSDK_Annot* CPDFSDK_AnnotIterator::PrevAnnot (const CPDFSDK_Annot*pCurrent)
+{
+
+ int index=-1;
+ int nCount=this->m_pIteratorAnnotList.GetSize();
+ if(pCurrent){
+ for(int i=0;i<nCount;i++){
+ CPDFSDK_Annot * pReaderAnnot= (CPDFSDK_Annot*)m_pIteratorAnnotList.GetAt(i);
+ if(pReaderAnnot ==pCurrent){
+ index=i;
+ break;
+ }
+ }
+ }
+ return PrevAnnot(index);
+}
+CPDFSDK_Annot* CPDFSDK_AnnotIterator::NextAnnot (int& index)
+{
+
+ int nCount=m_pIteratorAnnotList.GetSize();
+ if(nCount<=0) index=-1;
+ else{
+ if(index<0){
+ index=0;
+ }
+ else{
+ if(m_bCircle){
+ index=( index <nCount-1) ? (index+1) :0;
+ }
+ else{
+ index=( index <nCount-1) ? (index+1) :-1;
+ }
+
+ }
+ }
+ return (index <0) ? NULL : (CPDFSDK_Annot*)m_pIteratorAnnotList.GetAt(index);
+}
+
+
+CPDFSDK_Annot* CPDFSDK_AnnotIterator::PrevAnnot (int& index)
+{
+
+ int nCount=m_pIteratorAnnotList.GetSize();
+ if(nCount<=0) index=-1;
+ else{
+ if(index<0){
+ index=nCount-1;
+ }
+ else{
+ if(m_bCircle){
+ index = ( index >0) ? (index-1) :nCount-1;
+ }
+ else{
+ index = ( index >0) ? (index-1) :-1;
+ }
+ }
+ }
+ return (index <0) ? NULL : (CPDFSDK_Annot*)m_pIteratorAnnotList.GetAt(index);
+}
+
+
+CPDFSDK_Annot*CPDFSDK_AnnotIterator::Next(const CPDFSDK_Annot* pCurrent)
+{
+
+ return (m_bReverse) ? PrevAnnot(pCurrent):NextAnnot(pCurrent);
+
+}
+
+CPDFSDK_Annot* CPDFSDK_AnnotIterator::Prev(const CPDFSDK_Annot* pCurrent)
+{
+
+ return (m_bReverse) ? NextAnnot(pCurrent):PrevAnnot(pCurrent);
+}
+
+CPDFSDK_Annot*CPDFSDK_AnnotIterator::Next(int& index )
+{
+
+ return (m_bReverse) ? PrevAnnot(index):NextAnnot(index);
+
+}
+
+CPDFSDK_Annot* CPDFSDK_AnnotIterator::Prev(int& index )
+{
+
+ return (m_bReverse) ? NextAnnot(index):PrevAnnot(index);
+}
+
+
+void CPDFSDK_AnnotIterator::InsertSort(CFX_PtrArray &arrayList, AI_COMPARE pCompare)
+{
+ for (int i = 1; i < arrayList.GetSize(); i++)
+ {
+ if (pCompare((CPDFSDK_Annot*)(arrayList[i]) , (CPDFSDK_Annot*)(arrayList[i-1])) < 0)
+ {
+ int j = i-1;
+ CPDFSDK_Annot* pTemp = (CPDFSDK_Annot*)arrayList[i];
+
+ do
+ {
+ arrayList[j + 1] = arrayList[j];
+ } while (--j >= 0 && pCompare(pTemp, (CPDFSDK_Annot*)arrayList[j]) < 0);
+
+ arrayList[j+1] = pTemp;
+ }
+ }
+}
+
+int LyOrderCompare(CPDFSDK_Annot* p1, CPDFSDK_Annot* p2)
+{
+ if(p1->GetLayoutOrder() < p2->GetLayoutOrder())
+ return -1;
+ else if (p1->GetLayoutOrder() == p2->GetLayoutOrder())
+ return 0;
+ else
+ return 1;
+}
+
+FX_BOOL CPDFSDK_AnnotIterator::InitIteratorAnnotList(CPDFSDK_PageView* pPageView,CFX_PtrArray * pAnnotList)
+{
+ ASSERT(pPageView);
+
+
+
+ if(pAnnotList==NULL){
+ pAnnotList=pPageView->GetAnnotList();
+ }
+
+ this->m_pIteratorAnnotList.RemoveAll();
+ if(!pAnnotList) return FALSE;
+
+ CPDFSDK_Annot * pTopMostAnnot= (m_bIgnoreTopmost) ? NULL : pPageView->GetFocusAnnot();
+
+
+ int nCount =pAnnotList->GetSize();
+
+ for(int i = nCount- 1 ;i >= 0;i--)
+ {
+ CPDFSDK_Annot * pReaderAnnot= (CPDFSDK_Annot*)pAnnotList->GetAt(i);
+ m_pIteratorAnnotList.Add(pReaderAnnot);
+ }
+
+ InsertSort(m_pIteratorAnnotList,&LyOrderCompare);
+
+ if(pTopMostAnnot)
+ {
+ for(int i=0 ;i<nCount;i++)
+ {
+ CPDFSDK_Annot * pReaderAnnot = (CPDFSDK_Annot*)m_pIteratorAnnotList.GetAt(i);
+ if(pReaderAnnot == pTopMostAnnot)
+ {
+ m_pIteratorAnnotList.RemoveAt(i);
+ m_pIteratorAnnotList.InsertAt(0, pReaderAnnot);
+ break;
+ }
+ }
+ }
+
+ return TRUE;
+}
+
diff --git a/fpdfsdk/src/fsdk_baseannot.cpp b/fpdfsdk/src/fsdk_baseannot.cpp new file mode 100644 index 0000000000..ac36e3c3a6 --- /dev/null +++ b/fpdfsdk/src/fsdk_baseannot.cpp @@ -0,0 +1,1187 @@ +// 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 "../include/fsdk_define.h"
+#include "../include/fsdk_mgr.h"
+#include "../include/fsdk_baseannot.h"
+
+
+//---------------------------------------------------------------------------
+// CPDFSDK_DateTime
+//---------------------------------------------------------------------------
+int _gAfxGetTimeZoneInSeconds(FX_CHAR tzhour, FX_BYTE tzminute)
+{
+ return (int)tzhour * 3600 + (int)tzminute * (tzhour >= 0 ? 60 : -60);
+}
+
+FX_BOOL _gAfxIsLeapYear(FX_SHORT year)
+{
+ return ((year % 400 == 0) || ((year % 4 == 0) && (year % 100 != 0)));
+}
+
+FX_WORD _gAfxGetYearDays(FX_SHORT year)
+{
+ return (_gAfxIsLeapYear(year) == TRUE ? 366 : 365);
+}
+
+FX_BYTE _gAfxGetMonthDays(FX_SHORT year, FX_BYTE month)
+{
+ FX_BYTE 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;
+ //newtime = gmtime(&curTime);
+ 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;
+// dt.tzHour = _timezone / 3600 * -1;
+// dt.tzMinute = (abs(_timezone) % 3600) / 60;
+}
+
+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 = (FX_SHORT)st.wYear;
+ dt.month = (FX_BYTE)st.wMonth;
+ dt.day = (FX_BYTE)st.wDay;
+ dt.hour = (FX_BYTE)st.wHour;
+ dt.minute = (FX_BYTE)st.wMinute;
+ dt.second = (FX_BYTE)st.wSecond;
+// dt.tzHour = _timezone / 3600 * -1;
+// dt.tzMinute = (abs(_timezone) % 3600) / 60;
+ return *this;
+}
+
+FX_BOOL CPDFSDK_DateTime::operator == (CPDFSDK_DateTime& datetime)
+{
+ return (FXSYS_memcmp(&dt, &datetime.dt, sizeof(FX_DATETIME)) == 0);
+}
+
+FX_BOOL CPDFSDK_DateTime::operator != (CPDFSDK_DateTime& datetime)
+{
+ return (FXSYS_memcmp(&dt, &datetime.dt, sizeof(FX_DATETIME)) != 0);
+}
+
+FX_BOOL CPDFSDK_DateTime::operator > (CPDFSDK_DateTime& datetime)
+{
+ 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;
+
+ if (d1 > d3) return TRUE;
+ if (d2 > d4) return TRUE;
+ return FALSE;
+}
+
+FX_BOOL CPDFSDK_DateTime::operator >= (CPDFSDK_DateTime& datetime)
+{
+ 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;
+
+ if (d1 >= d3) return TRUE;
+ if (d2 >= d4) return TRUE;
+ return FALSE;
+}
+
+FX_BOOL CPDFSDK_DateTime::operator < (CPDFSDK_DateTime& datetime)
+{
+ 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;
+
+ if (d1 < d3) return TRUE;
+ if (d2 < d4) return TRUE;
+ return FALSE;
+}
+
+FX_BOOL CPDFSDK_DateTime::operator <= (CPDFSDK_DateTime& datetime)
+{
+ 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;
+
+ if (d1 <= d3) return TRUE;
+ if (d2 <= d4) return TRUE;
+ return FALSE;
+}
+
+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)
+ {
+ ch = dtStr[i];
+ if (ch >= '0' && ch <= '9') break;
+ i ++;
+ }
+ if (i >= strLength) return *this;
+
+ j = 0;
+ k = 0;
+ while (i < strLength && j < 4)
+ {
+ ch = dtStr[i];
+ k = k * 10 + ch - '0';
+ j ++;
+ if (ch < '0' || ch > '9') break;
+ i ++;
+ }
+ dt.year = (FX_SHORT)k;
+ if (i >= strLength || j < 4) return *this;
+
+ j = 0;
+ k = 0;
+ while (i < strLength && j < 2)
+ {
+ ch = dtStr[i];
+ k = k * 10 + ch - '0';
+ j ++;
+ if (ch < '0' || ch > '9') break;
+ i ++;
+ }
+ dt.month = (FX_BYTE)k;
+ if (i >= strLength || j < 2) return *this;
+
+ j = 0;
+ k = 0;
+ while (i < strLength && j < 2)
+ {
+ ch = dtStr[i];
+ k = k * 10 + ch - '0';
+ j ++;
+ if (ch < '0' || ch > '9') break;
+ i ++;
+ }
+ dt.day = (FX_BYTE)k;
+ if (i >= strLength || j < 2) return *this;
+
+ j = 0;
+ k = 0;
+ while (i < strLength && j < 2)
+ {
+ ch = dtStr[i];
+ k = k * 10 + ch - '0';
+ j ++;
+ if (ch < '0' || ch > '9') break;
+ i ++;
+ }
+ dt.hour = (FX_BYTE)k;
+ if (i >= strLength || j < 2) return *this;
+
+ j = 0;
+ k = 0;
+ while (i < strLength && j < 2)
+ {
+ ch = dtStr[i];
+ k = k * 10 + ch - '0';
+ j ++;
+ if (ch < '0' || ch > '9') break;
+ i ++;
+ }
+ dt.minute = (FX_BYTE)k;
+ if (i >= strLength || j < 2) return *this;
+
+ j = 0;
+ k = 0;
+ while (i < strLength && j < 2)
+ {
+ ch = dtStr[i];
+ k = k * 10 + ch - '0';
+ j ++;
+ if (ch < '0' || ch > '9') break;
+ i ++;
+ }
+ dt.second = (FX_BYTE)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 + ch - '0';
+ j ++;
+ if (ch < '0' || ch > '9') 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 + ch - '0';
+ j ++;
+ if (ch < '0' || ch > '9') break;
+ i ++;
+ }
+ dt.tzMinute = (FX_BYTE)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];
+ sprintf(tempStr, "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("+");
+ sprintf(tempStr, "%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()
+{
+ 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;
+
+ FX_SHORT y = dt.year, yy;
+ FX_BYTE m = dt.month;
+ FX_BYTE 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 = (FX_BYTE)(n / 3600);
+ dt.hour %= 24;
+ n %= 3600;
+ dt.minute = (FX_BYTE)(n / 60);
+ dt.second = (FX_BYTE)(n % 60);
+ if (days != 0) AddDays(days);
+
+ return *this;
+}
+
+
+//---------------------------------------------------------------------------
+// CPDFSDK_Annot
+//---------------------------------------------------------------------------
+CPDFSDK_Annot::CPDFSDK_Annot(CPDF_Annot* pAnnot, CPDFSDK_PageView* pPageView) :
+m_pAnnot(pAnnot),
+m_pPageView(pPageView),
+m_bSelected(FALSE),
+m_nTabOrder(-1)
+{
+}
+
+CPDFSDK_Annot::~CPDFSDK_Annot()
+{
+ m_pAnnot = NULL;
+ m_pPageView = NULL;
+}
+
+CPDF_Annot* CPDFSDK_Annot::GetPDFAnnot()
+{
+ return m_pAnnot;
+}
+
+FX_DWORD CPDFSDK_Annot::GetFlags()
+{
+ ASSERT(m_pAnnot != NULL);
+
+ return m_pAnnot->GetFlags();
+}
+
+void CPDFSDK_Annot::SetPage(CPDFSDK_PageView* pPageView)
+{
+ m_pPageView = pPageView;
+}
+
+CPDFSDK_PageView* CPDFSDK_Annot::GetPageView()
+{
+ return m_pPageView;
+}
+
+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_Annot::GetAnnotDict() const
+{
+ ASSERT(m_pAnnot != NULL);
+
+ return m_pAnnot->m_pAnnotDict;
+}
+
+void CPDFSDK_Annot::SetRect(const CPDF_Rect& rect)
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+ ASSERT(rect.right - rect.left >= GetMinWidth());
+ ASSERT(rect.top - rect.bottom >= GetMinHeight());
+
+ m_pAnnot->m_pAnnotDict->SetAtRect("Rect", rect);
+}
+
+CPDF_Rect CPDFSDK_Annot::GetRect() const
+{
+ ASSERT(m_pAnnot != NULL);
+
+ CPDF_Rect rect;
+ m_pAnnot->GetRect(rect);
+
+ return rect;
+}
+
+CFX_ByteString CPDFSDK_Annot::GetType() const
+{
+ ASSERT(m_pAnnot != NULL);
+
+ return m_pAnnot->GetSubType();
+}
+
+CFX_ByteString CPDFSDK_Annot::GetSubType() const
+{
+ return "";
+}
+
+void CPDFSDK_Annot::ResetAppearance()
+{
+ ASSERT(FALSE);
+}
+
+void CPDFSDK_Annot::DrawAppearance(CFX_RenderDevice* pDevice, const CPDF_Matrix* pUser2Device,
+ CPDF_Annot::AppearanceMode mode, const CPDF_RenderOptions* pOptions)
+{
+ ASSERT(m_pPageView != NULL);
+ ASSERT(m_pAnnot != NULL);
+
+ m_pAnnot->DrawAppearance(m_pPageView->GetPDFPage(), pDevice, pUser2Device, mode, pOptions);
+}
+
+FX_BOOL CPDFSDK_Annot::IsAppearanceValid()
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ return m_pAnnot->m_pAnnotDict->GetDict("AP") != NULL;
+}
+
+FX_BOOL CPDFSDK_Annot::IsAppearanceValid(CPDF_Annot::AppearanceMode mode)
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ CPDF_Dictionary* pAP = m_pAnnot->m_pAnnotDict->GetDict("AP");
+ if (pAP == NULL) 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 == NULL) return FALSE;
+
+ return TRUE;
+}
+
+void CPDFSDK_Annot::DrawBorder(CFX_RenderDevice* pDevice, const CPDF_Matrix* pUser2Device,
+ const CPDF_RenderOptions* pOptions)
+{
+ ASSERT(m_pAnnot != NULL);
+ m_pAnnot->DrawBorder(pDevice, pUser2Device, pOptions);
+}
+
+void CPDFSDK_Annot::ClearCachedAP()
+{
+ ASSERT(m_pAnnot != NULL);
+ m_pAnnot->ClearCachedAP();
+}
+
+void CPDFSDK_Annot::SetContents(const CFX_WideString& sContents)
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ if (sContents.IsEmpty())
+ m_pAnnot->m_pAnnotDict->RemoveAt("Contents");
+ else
+ m_pAnnot->m_pAnnotDict->SetAtString("Contents", PDF_EncodeText(sContents));
+}
+
+CFX_WideString CPDFSDK_Annot::GetContents() const
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ return m_pAnnot->m_pAnnotDict->GetUnicodeText("Contents");
+}
+
+void CPDFSDK_Annot::SetAnnotName(const CFX_WideString& sName)
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ if (sName.IsEmpty())
+ m_pAnnot->m_pAnnotDict->RemoveAt("NM");
+ else
+ m_pAnnot->m_pAnnotDict->SetAtString("NM", PDF_EncodeText(sName));
+}
+
+CFX_WideString CPDFSDK_Annot::GetAnnotName() const
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ return m_pAnnot->m_pAnnotDict->GetUnicodeText("NM");
+}
+
+void CPDFSDK_Annot::SetModifiedDate(const FX_SYSTEMTIME& st)
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ CPDFSDK_DateTime dt(st);
+ CFX_ByteString str = dt.ToPDFDateTimeString();
+
+ if (str.IsEmpty())
+ m_pAnnot->m_pAnnotDict->RemoveAt("M");
+ else
+ m_pAnnot->m_pAnnotDict->SetAtString("M", str);
+}
+
+FX_SYSTEMTIME CPDFSDK_Annot::GetModifiedDate() const
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ FX_SYSTEMTIME systime;
+ CFX_ByteString str = m_pAnnot->m_pAnnotDict->GetString("M");
+
+ CPDFSDK_DateTime dt(str);
+ dt.ToSystemTime(systime);
+
+ return systime;
+}
+
+void CPDFSDK_Annot::SetFlags(int nFlags)
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ m_pAnnot->m_pAnnotDict->SetAtInteger("F", nFlags);
+}
+
+int CPDFSDK_Annot::GetFlags() const
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ return m_pAnnot->m_pAnnotDict->GetInteger("F");
+}
+
+void CPDFSDK_Annot::SetAppState(const CFX_ByteString& str)
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ if (str.IsEmpty())
+ m_pAnnot->m_pAnnotDict->RemoveAt("AS");
+ else
+ m_pAnnot->m_pAnnotDict->SetAtString("AS", str);
+}
+
+CFX_ByteString CPDFSDK_Annot::GetAppState() const
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ return m_pAnnot->m_pAnnotDict->GetString("AS");
+}
+
+void CPDFSDK_Annot::SetStructParent(int key)
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ m_pAnnot->m_pAnnotDict->SetAtInteger("StructParent", key);
+}
+
+int CPDFSDK_Annot::GetStructParent() const
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ return m_pAnnot->m_pAnnotDict->GetInteger("StructParent");
+}
+
+//border
+void CPDFSDK_Annot::SetBorderWidth(int nWidth)
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ CPDF_Array* pBorder = m_pAnnot->m_pAnnotDict->GetArray("Border");
+
+ if (pBorder)
+ {
+ pBorder->SetAt(2, FX_NEW CPDF_Number(nWidth));
+ }
+ else
+ {
+ CPDF_Dictionary* pBSDict = m_pAnnot->m_pAnnotDict->GetDict("BS");
+
+ if (!pBSDict)
+ {
+ pBSDict = FX_NEW CPDF_Dictionary;
+ m_pAnnot->m_pAnnotDict->SetAt("BS", pBSDict);
+ }
+
+ pBSDict->SetAtInteger("W", nWidth);
+ }
+}
+
+int CPDFSDK_Annot::GetBorderWidth() const
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ CPDF_Array* pBorder = m_pAnnot->m_pAnnotDict->GetArray("Border");
+
+ if (pBorder)
+ {
+ return pBorder->GetInteger(2);
+ }
+ else
+ {
+ CPDF_Dictionary* pBSDict = m_pAnnot->m_pAnnotDict->GetDict("BS");
+
+ if (pBSDict)
+ {
+ return pBSDict->GetInteger("W", 1);
+ }
+ }
+ return 1;
+}
+
+void CPDFSDK_Annot::SetBorderStyle(int nStyle)
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ CPDF_Dictionary* pBSDict = m_pAnnot->m_pAnnotDict->GetDict("BS");
+ if (!pBSDict)
+ {
+ pBSDict = FX_NEW CPDF_Dictionary;
+ m_pAnnot->m_pAnnotDict->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_Annot::GetBorderStyle() const
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ CPDF_Dictionary* pBSDict = m_pAnnot->m_pAnnotDict->GetDict("BS");
+ if (pBSDict)
+ {
+ CFX_ByteString sBorderStyle = pBSDict->GetString("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->m_pAnnotDict->GetArray("Border");
+ if (pBorder)
+ {
+ if (pBorder->GetCount() >= 4)
+ {
+ CPDF_Array *pDP = pBorder->GetArray(3);
+ if (pDP && pDP->GetCount() > 0)
+ return BBS_DASH;
+ }
+ }
+
+ return BBS_SOLID;
+}
+
+void CPDFSDK_Annot::SetBorderDash(const CFX_IntArray& array)
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ CPDF_Dictionary* pBSDict = m_pAnnot->m_pAnnotDict->GetDict("BS");
+ if (!pBSDict)
+ {
+ pBSDict = FX_NEW CPDF_Dictionary;
+ m_pAnnot->m_pAnnotDict->SetAt("BS", pBSDict);
+ }
+
+ CPDF_Array* pArray = FX_NEW CPDF_Array;
+ for (int i=0,sz=array.GetSize(); i<sz; i++)
+ {
+ pArray->AddInteger(array[i]);
+ }
+
+ pBSDict->SetAt("D", pArray);
+}
+
+void CPDFSDK_Annot::GetBorderDash(CFX_IntArray& array) const
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ CPDF_Array* pDash = NULL;
+
+ CPDF_Array* pBorder = m_pAnnot->m_pAnnotDict->GetArray("Border");
+ if (pBorder)
+ {
+ pDash = pBorder->GetArray(3);
+ }
+ else
+ {
+ CPDF_Dictionary* pBSDict = m_pAnnot->m_pAnnotDict->GetDict("BS");
+ if (pBSDict)
+ {
+ pDash = pBSDict->GetArray("D");
+ }
+ }
+
+ if (pDash)
+ {
+ for (int i=0,sz=pDash->GetCount(); i<sz; i++)
+ {
+ array.Add(pDash->GetInteger(i));
+ }
+ }
+}
+
+void CPDFSDK_Annot::SetColor(FX_COLORREF color)
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ CPDF_Array* pArray = FX_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->m_pAnnotDict->SetAt("C", pArray);
+}
+
+void CPDFSDK_Annot::RemoveColor()
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ m_pAnnot->m_pAnnotDict->RemoveAt("C") ;
+}
+
+FX_BOOL CPDFSDK_Annot::GetColor(FX_COLORREF& color) const
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ if (CPDF_Array* pEntry = m_pAnnot->m_pAnnotDict->GetArray("C"))
+ {
+ int nCount = pEntry->GetCount();
+ if (nCount == 1)
+ {
+ FX_FLOAT g = pEntry->GetNumber(0) * 255;
+
+ color = FXSYS_RGB((int)g, (int)g, (int)g);
+
+ return TRUE;
+ }
+ else if (nCount == 3)
+ {
+ FX_FLOAT r = pEntry->GetNumber(0) * 255;
+ FX_FLOAT g = pEntry->GetNumber(1) * 255;
+ FX_FLOAT b = pEntry->GetNumber(2) * 255;
+
+ color = FXSYS_RGB((int)r, (int)g, (int)b);
+
+ return TRUE;
+ }
+ else if (nCount == 4)
+ {
+ FX_FLOAT c = pEntry->GetNumber(0);
+ FX_FLOAT m = pEntry->GetNumber(1);
+ FX_FLOAT y = pEntry->GetNumber(2);
+ FX_FLOAT k = pEntry->GetNumber(3);
+
+ FX_FLOAT r = 1.0f - FX_MIN(1.0f, c + k);
+ FX_FLOAT g = 1.0f - FX_MIN(1.0f, m + k);
+ FX_FLOAT b = 1.0f - FX_MIN(1.0f, y + k);
+
+ color = FXSYS_RGB((int)(r * 255), (int)(g * 255), (int)(b * 255));
+
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+
+void CPDFSDK_Annot::WriteAppearance(const CFX_ByteString& sAPType, const CPDF_Rect& rcBBox,
+ const CPDF_Matrix& matrix, const CFX_ByteString& sContents,
+ const CFX_ByteString& sAPState)
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ CPDF_Dictionary* pAPDict = m_pAnnot->m_pAnnotDict->GetDict("AP");
+
+ if (!pAPDict)
+ {
+ pAPDict = FX_NEW CPDF_Dictionary;
+ m_pAnnot->m_pAnnotDict->SetAt("AP", pAPDict);
+ }
+
+ CPDF_Stream* pStream = NULL;
+ CPDF_Dictionary* pParentDict = NULL;
+
+ if (sAPState.IsEmpty())
+ {
+ pParentDict = pAPDict;
+ pStream = pAPDict->GetStream(sAPType);
+ }
+ else
+ {
+ CPDF_Dictionary* pAPTypeDict = pAPDict->GetDict(sAPType);
+ if (!pAPTypeDict)
+ {
+ pAPTypeDict = FX_NEW CPDF_Dictionary;
+ pAPDict->SetAt(sAPType, pAPTypeDict);
+ }
+
+ pParentDict = pAPTypeDict;
+ pStream = pAPTypeDict->GetStream(sAPState);
+ }
+
+ if (!pStream)
+ {
+ ASSERT(m_pPageView != NULL);
+ CPDF_Document* pDoc = m_pPageView->GetPDFDocument();
+ ASSERT(pDoc != NULL);
+
+ pStream = FX_NEW CPDF_Stream(NULL, 0, NULL);
+ FX_INT32 objnum = pDoc->AddIndirectObject(pStream);
+ //pAPDict->SetAtReference(sAPType, pDoc, objnum);
+ ASSERT(pParentDict != NULL);
+ pParentDict->SetAtReference(sAPType, pDoc, objnum);
+ }
+
+ CPDF_Dictionary * pStreamDict = pStream->GetDict();
+
+ if (!pStreamDict)
+ {
+ pStreamDict = FX_NEW CPDF_Dictionary;
+ pStreamDict->SetAtName("Type", "XObject");
+ pStreamDict->SetAtName("Subtype", "Form");
+ pStreamDict->SetAtInteger("FormType", 1);
+ pStream->InitStream(NULL,0,pStreamDict);
+ }
+
+ if (pStreamDict)
+ {
+ pStreamDict->SetAtMatrix("Matrix",matrix);
+ pStreamDict->SetAtRect("BBox", rcBBox);
+ }
+
+ pStream->SetData((FX_BYTE*)(FX_LPCSTR)sContents, 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_Annot::CreateFormFiller()
+{
+ return TRUE;
+}
+FX_BOOL CPDFSDK_Annot::IsVisible() const
+{
+ int nFlags = GetFlags();
+ return !((nFlags & ANNOTFLAG_INVISIBLE) || (nFlags & ANNOTFLAG_HIDDEN) || (nFlags & ANNOTFLAG_NOVIEW));
+}
+
+CPDF_Action CPDFSDK_Annot::GetAction() const
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ return m_pAnnot->m_pAnnotDict->GetDict("A");
+}
+
+void CPDFSDK_Annot::SetAction(const CPDF_Action& action)
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ ASSERT(action != NULL);
+
+ if ((CPDF_Action&)action != m_pAnnot->m_pAnnotDict->GetDict("A"))
+ {
+ CPDF_Document* pDoc = m_pPageView->GetPDFDocument();
+ ASSERT(pDoc != NULL);
+
+ if (action.m_pDict && (action.m_pDict->GetObjNum() == 0))
+ pDoc->AddIndirectObject(action.m_pDict);
+ m_pAnnot->m_pAnnotDict->SetAtReference("A", pDoc, action.m_pDict->GetObjNum());
+ }
+}
+
+void CPDFSDK_Annot::RemoveAction()
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ m_pAnnot->m_pAnnotDict->RemoveAt("A");
+}
+
+CPDF_AAction CPDFSDK_Annot::GetAAction() const
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ return m_pAnnot->m_pAnnotDict->GetDict("AA");
+}
+
+void CPDFSDK_Annot::SetAAction(const CPDF_AAction& aa)
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+ ASSERT(aa != NULL);
+
+ if ((CPDF_AAction&)aa != m_pAnnot->m_pAnnotDict->GetDict("AA"))
+ m_pAnnot->m_pAnnotDict->SetAt("AA", (CPDF_AAction&)aa);
+}
+
+void CPDFSDK_Annot::RemoveAAction()
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ m_pAnnot->m_pAnnotDict->RemoveAt("AA");
+}
+
+CPDF_Action CPDFSDK_Annot::GetAAction(CPDF_AAction::AActionType eAAT)
+{
+ CPDF_AAction AAction = GetAAction();
+
+ if (AAction.ActionExist(eAAT))
+ {
+ return AAction.GetAction(eAAT);
+ }
+ else if (eAAT == CPDF_AAction::ButtonUp)
+ {
+ return GetAction();
+ }
+
+ return NULL;
+}
+
+void CPDFSDK_Annot::Annot_OnDraw(CFX_RenderDevice* pDevice, CPDF_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);
+
+ return ;
+}
+
+CPDF_Page* CPDFSDK_Annot::GetPDFPage()
+{
+ if(m_pPageView)
+ return m_pPageView->GetPDFPage();
+ return NULL;
+}
+
diff --git a/fpdfsdk/src/fsdk_baseform.cpp b/fpdfsdk/src/fsdk_baseform.cpp new file mode 100644 index 0000000000..23d9ec9c47 --- /dev/null +++ b/fpdfsdk/src/fsdk_baseform.cpp @@ -0,0 +1,3111 @@ +// 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 "../include/fsdk_define.h"
+#include "../include/fsdk_mgr.h"
+#include "../include/fsdk_baseannot.h"
+#include "../include/fsdk_baseform.h"
+#include "../include/formfiller/FFL_FormFiller.h"
+#include "../include/fsdk_actionhandler.h"
+
+#include "../include/javascript/IJavaScript.h"
+
+//------------------------------------------------------------------------------------
+//* CPDFSDK_Widget
+//------------------------------------------------------------------------------------
+
+#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_Annot(pAnnot, pPageView),
+ m_pInterForm(pInterForm),
+ m_nAppAge(0),
+ m_nValueAge(0)
+{
+ ASSERT(m_pInterForm != NULL);
+}
+
+CPDFSDK_Widget::~CPDFSDK_Widget()
+{
+
+}
+
+FX_BOOL CPDFSDK_Widget::IsWidgetAppearanceValid(CPDF_Annot::AppearanceMode mode)
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ CPDF_Dictionary* pAP = m_pAnnot->m_pAnnotDict->GetDict("AP");
+ if (pAP == NULL) 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 == NULL) return FALSE;
+
+ int nFieldType = GetFieldType();
+ switch (nFieldType)
+ {
+ case FIELDTYPE_PUSHBUTTON:
+ case FIELDTYPE_COMBOBOX:
+ case FIELDTYPE_LISTBOX:
+ case FIELDTYPE_TEXTFIELD:
+ case FIELDTYPE_SIGNATURE:
+ return psub->GetType() == PDFOBJ_STREAM;
+ case FIELDTYPE_CHECKBOX:
+ case FIELDTYPE_RADIOBUTTON:
+ if (psub->GetType() == PDFOBJ_DICTIONARY)
+ {
+ CPDF_Dictionary* pSubDict = (CPDF_Dictionary*)psub;
+
+ return pSubDict->GetStream(this->GetAppState()) != NULL;
+ }
+ else
+ return FALSE;
+ break;
+ }
+
+ return TRUE;
+}
+
+int CPDFSDK_Widget::GetFieldType() const
+{
+ CPDF_FormField* pField = GetFormField();
+ ASSERT(pField != NULL);
+
+ return pField->GetFieldType();
+}
+
+int CPDFSDK_Widget::GetFieldFlags() const
+{
+ CPDF_InterForm* pPDFInterForm = m_pInterForm->GetInterForm();
+ ASSERT(pPDFInterForm != NULL);
+
+ CPDF_FormControl* pFormControl = pPDFInterForm->GetControlByDict(m_pAnnot->m_pAnnotDict);
+ 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
+{
+ ASSERT(m_pInterForm != NULL);
+
+ CPDF_FormControl* pCtrl = GetFormControl();
+ ASSERT(pCtrl != NULL);
+
+ return pCtrl->GetField();
+}
+
+CPDF_FormControl* CPDFSDK_Widget::GetFormControl() const
+{
+ ASSERT(m_pInterForm != NULL);
+
+ CPDF_InterForm* pPDFInterForm = m_pInterForm->GetInterForm();
+ ASSERT(pPDFInterForm != NULL);
+
+ return pPDFInterForm->GetControlByDict(GetAnnotDict());
+}
+static CPDF_Dictionary* BF_GetField(CPDF_Dictionary* pFieldDict, const FX_CHAR* name)
+{
+ if (pFieldDict == NULL) return NULL;
+ // First check the dictionary itself
+ CPDF_Object* pAttr = pFieldDict->GetElementValue(name);
+ if (pAttr) return pFieldDict;
+
+ // Now we need to search from parents
+ CPDF_Dictionary* pParent = pFieldDict->GetDict("Parent");
+ if (pParent == NULL) return NULL;
+
+ return BF_GetField(pParent, name);
+}
+
+CPDF_FormControl* CPDFSDK_Widget::GetFormControl(CPDF_InterForm* pInterForm, CPDF_Dictionary* pAnnotDict)
+{
+ ASSERT(pInterForm != NULL);
+ ASSERT(pAnnotDict != NULL);
+
+ CPDF_FormControl* pControl = pInterForm->GetControlByDict(pAnnotDict);
+
+ return pControl;
+}
+
+int CPDFSDK_Widget::GetRotate() const
+{
+ CPDF_FormControl* pCtrl = this->GetFormControl();
+ ASSERT(pCtrl != NULL);
+
+ return pCtrl->GetRotation() % 360;
+}
+
+FX_BOOL CPDFSDK_Widget::GetFillColor(FX_COLORREF& color) const
+{
+ CPDF_FormControl* pFormCtrl = GetFormControl();
+ ASSERT(pFormCtrl != NULL);
+
+ 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();
+ ASSERT(pFormCtrl != NULL);
+
+ 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();
+ ASSERT(pFormCtrl != NULL);
+
+ 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();
+ ASSERT(pFormCtrl != NULL);
+
+ 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
+{
+ CPDF_FormField* pFormField = GetFormField();
+ ASSERT(pFormField != NULL);
+
+ return pFormField->GetSelectedIndex(nIndex);
+}
+
+CFX_WideString CPDFSDK_Widget::GetValue() const
+{
+ CPDF_FormField* pFormField = GetFormField();
+ ASSERT(pFormField != NULL);
+
+ return pFormField->GetValue();
+}
+
+CFX_WideString CPDFSDK_Widget::GetDefaultValue() const
+{
+ CPDF_FormField* pFormField = GetFormField();
+ ASSERT(pFormField != NULL);
+
+ return pFormField->GetDefaultValue();
+}
+
+CFX_WideString CPDFSDK_Widget::GetOptionLabel(int nIndex) const
+{
+ CPDF_FormField* pFormField = GetFormField();
+ ASSERT(pFormField != NULL);
+
+ return pFormField->GetOptionLabel(nIndex);
+}
+
+int CPDFSDK_Widget::CountOptions() const
+{
+ CPDF_FormField* pFormField = GetFormField();
+ ASSERT(pFormField != NULL);
+
+ return pFormField->CountOptions();
+}
+
+FX_BOOL CPDFSDK_Widget::IsOptionSelected(int nIndex) const
+{
+ CPDF_FormField* pFormField = GetFormField();
+ ASSERT(pFormField != NULL);
+
+ return pFormField->IsItemSelected(nIndex);
+}
+
+int CPDFSDK_Widget::GetTopVisibleIndex() const
+{
+ CPDF_FormField* pFormField = GetFormField();
+ ASSERT(pFormField != NULL);
+
+ return pFormField->GetTopVisibleIndex();
+}
+
+FX_BOOL CPDFSDK_Widget::IsChecked() const
+{
+ CPDF_FormControl* pFormCtrl = GetFormControl();
+ ASSERT(pFormCtrl != NULL);
+
+ return pFormCtrl->IsChecked();
+}
+
+int CPDFSDK_Widget::GetAlignment() const
+{
+ CPDF_FormControl* pFormCtrl = GetFormControl();
+ ASSERT(pFormCtrl != NULL);
+
+ return pFormCtrl->GetControlAlignment();
+}
+
+int CPDFSDK_Widget::GetMaxLen() const
+{
+ CPDF_FormField* pFormField = GetFormField();
+ ASSERT(pFormField != NULL);
+
+ return pFormField->GetMaxLen();
+}
+
+void CPDFSDK_Widget::SetCheck(FX_BOOL bChecked, FX_BOOL bNotify)
+{
+ CPDF_FormControl* pFormCtrl = GetFormControl();
+ ASSERT(pFormCtrl != NULL);
+
+ CPDF_FormField* pFormField = pFormCtrl->GetField();
+ ASSERT(pFormField != NULL);
+
+ pFormField->CheckControl(pFormField->GetControlIndex(pFormCtrl), bChecked, bNotify);
+}
+
+void CPDFSDK_Widget::SetValue(const CFX_WideString& sValue, FX_BOOL bNotify)
+{
+ CPDF_FormField* pFormField = GetFormField();
+ ASSERT(pFormField != NULL);
+
+ pFormField->SetValue(sValue, bNotify);
+}
+
+void CPDFSDK_Widget::SetDefaultValue(const CFX_WideString& sValue)
+{
+}
+void CPDFSDK_Widget::SetOptionSelection(int index, FX_BOOL bSelected, FX_BOOL bNotify)
+{
+ CPDF_FormField* pFormField = GetFormField();
+ ASSERT(pFormField != NULL);
+
+ pFormField->SetItemSelection(index, bSelected, bNotify);
+}
+
+void CPDFSDK_Widget::ClearSelection(FX_BOOL bNotify)
+{
+ CPDF_FormField* pFormField = GetFormField();
+ ASSERT(pFormField != NULL);
+
+ pFormField->ClearSelection(bNotify);
+}
+
+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;
+}
+
+void CPDFSDK_Widget::ResetAppearance(FX_LPCWSTR 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;
+ }
+
+ ASSERT(m_pAnnot != NULL);
+ m_pAnnot->ClearCachedAP();
+}
+
+CFX_WideString CPDFSDK_Widget::OnFormat(int nCommitKey, FX_BOOL& bFormated)
+{
+ CPDF_FormField* pFormField = GetFormField();
+ ASSERT(pFormField != NULL);
+
+ ASSERT(m_pInterForm != NULL);
+
+ return m_pInterForm->OnFormat(pFormField, nCommitKey, bFormated);
+
+}
+
+void CPDFSDK_Widget::ResetFieldAppearance(FX_BOOL bValueChanged)
+{
+ CPDF_FormField* pFormField = GetFormField();
+ ASSERT(pFormField != NULL);
+
+ ASSERT(m_pInterForm != NULL);
+
+ m_pInterForm->ResetFieldAppearance(pFormField, NULL, bValueChanged);
+}
+
+void CPDFSDK_Widget::DrawAppearance(CFX_RenderDevice* pDevice, const CPDF_Matrix* pUser2Device,
+ CPDF_Annot::AppearanceMode mode, const CPDF_RenderOptions* pOptions)
+{
+ int nFieldType = GetFieldType();
+
+ if ((nFieldType == FIELDTYPE_CHECKBOX || nFieldType == FIELDTYPE_RADIOBUTTON) &&
+ mode == CPDF_Annot::Normal &&
+ !this->IsWidgetAppearanceValid(CPDF_Annot::Normal))
+ {
+ CFX_PathData pathData;
+
+ CPDF_Rect rcAnnot = this->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_Annot::DrawAppearance(pDevice, pUser2Device, mode, pOptions);
+ }
+}
+
+void CPDFSDK_Widget::UpdateField()
+{
+ CPDF_FormField* pFormField = GetFormField();
+ ASSERT(pFormField != NULL);
+
+ ASSERT(m_pInterForm != NULL);
+ m_pInterForm->UpdateField(pFormField);
+}
+
+void CPDFSDK_Widget::DrawShadow(CFX_RenderDevice* pDevice, CPDFSDK_PageView* pPageView)
+{
+ ASSERT(m_pInterForm != NULL);
+
+ int nFieldType = GetFieldType();
+ if (m_pInterForm->IsNeedHighLight(nFieldType))
+ {
+
+// if (nFieldType != FIELDTYPE_PUSHBUTTON)
+// {
+ CPDF_Rect rc = GetRect();
+ FX_COLORREF color = m_pInterForm->GetHighlightColor(nFieldType);
+ FX_BYTE alpha = m_pInterForm->GetHighlightAlpha();
+
+ CFX_FloatRect rcDevice;
+ ASSERT(m_pInterForm->GetDocument());
+ CPDFDoc_Environment* pEnv = m_pInterForm->GetDocument()->GetEnv();
+ if(!pEnv)
+ return;
+ CFX_AffineMatrix page2device;
+ pPageView->GetCurrentMatrix(page2device);
+ page2device.Transform(((FX_FLOAT)rc.left), ((FX_FLOAT)rc.bottom), rcDevice.left, rcDevice.bottom);
+// pEnv->FFI_PageToDevice(m_pPageView->GetPDFPage(), rc.left, rc.bottom, &rcDevice.left, &rcDevice.bottom);
+// pEnv->FFI_PageToDevice(m_pPageView->GetPDFPage(), rc.right, rc.top, &rcDevice.right, &rcDevice.top);
+ 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();
+ ASSERT(pControl != NULL);
+
+
+
+ CPDF_Rect rcWindow = GetRotatedRect();
+
+ FX_INT32 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();
+ FX_INT32 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;
+ }
+
+ CPDF_Rect 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->GetString("Name").IsEmpty())
+ pImageDict->SetAtString("Name", "ImgA");
+ }
+ }
+
+ if (pRolloverIcon)
+ {
+ if (CPDF_Dictionary* pImageDict = pRolloverIcon->GetDict())
+ {
+ if (pImageDict->GetString("Name").IsEmpty())
+ pImageDict->SetAtString("Name", "ImgB");
+ }
+ }
+
+ if (pDownIcon)
+ {
+ if (CPDF_Dictionary* pImageDict = pDownIcon->GetDict())
+ {
+ if (pImageDict->GetString("Name").IsEmpty())
+ pImageDict->SetAtString("Name", "ImgC");
+ }
+ }
+
+ CPDF_IconFit iconFit = pControl->GetIconFit();
+
+// ASSERT(this->m_pBaseForm != NULL);
+ ASSERT(this->m_pInterForm != NULL);
+ CPDFSDK_Document* pDoc = m_pInterForm->GetDocument();
+ ASSERT(pDoc != NULL);
+ CPDFDoc_Environment* pEnv = pDoc->GetEnv();
+
+ CBA_FontMap FontMap(this,pEnv->GetSysHandler());//, ISystemHandle::GetSystemHandler(m_pBaseForm->GetEnv()));
+ FontMap.Initial();
+
+ FontMap.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, &FontMap, 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;
+ }
+
+ FontMap.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, &FontMap, 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;
+ }
+
+ FontMap.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, &FontMap, 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();
+ ASSERT(pControl != NULL);
+
+
+
+ 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();
+ FX_INT32 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;
+ }
+
+ CPDF_Rect rcWindow = GetRotatedRect();
+ CPDF_Rect 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]);
+ }
+
+ FX_INT32 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();
+ ASSERT(pControl != NULL);
+
+
+
+ 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();
+ FX_INT32 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;
+ }
+
+ CPDF_Rect rcWindow = GetRotatedRect();
+ CPDF_Rect 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]);
+ }
+
+ FX_INT32 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;
+
+ CPDF_Rect 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(FX_LPCWSTR sValue)
+{
+ CPDF_FormControl* pControl = GetFormControl();
+ ASSERT(pControl != NULL);
+ CPDF_FormField* pField = pControl->GetField();
+ ASSERT(pField != NULL);
+
+ CFX_ByteTextBuf sBody, sLines;
+
+ CPDF_Rect rcClient = GetClientRect();
+ CPDF_Rect rcButton = rcClient;
+ rcButton.left = rcButton.right - 13;
+ rcButton.Normalize();
+
+ if (IFX_Edit * pEdit = IFX_Edit::NewEdit())
+ {
+ pEdit->EnableRefresh(FALSE);
+
+ ASSERT(this->m_pInterForm != NULL);
+ CPDFSDK_Document* pDoc = m_pInterForm->GetDocument();
+ ASSERT(pDoc != NULL);
+ CPDFDoc_Environment* pEnv = pDoc->GetEnv();
+ CBA_FontMap FontMap(this,pEnv->GetSysHandler());
+ FontMap.Initial();
+ pEdit->SetFontMap(&FontMap);
+
+ CPDF_Rect rcEdit = rcClient;
+ rcEdit.right = rcButton.left;
+ rcEdit.Normalize();
+
+ pEdit->SetPlateRect(rcEdit);
+ pEdit->SetAlignmentV(1);
+
+ FX_FLOAT fFontSize = this->GetFontSize();
+ if (IsFloatZero(fFontSize))
+ pEdit->SetAutoFontSize(TRUE);
+ else
+ pEdit->SetFontSize(fFontSize);
+
+ pEdit->Initialize();
+
+ if (sValue)
+ pEdit->SetText(sValue);
+ else
+ {
+ FX_INT32 nCurSel = pField->GetSelectedIndex(0);
+
+ if (nCurSel < 0)
+ pEdit->SetText((FX_LPCWSTR)pField->GetValue());
+ else
+ pEdit->SetText((FX_LPCWSTR)pField->GetOptionLabel(nCurSel));
+ }
+
+ CPDF_Rect rcContent = pEdit->GetContentRect();
+
+ CFX_ByteString sEdit = CPWL_Utils::GetEditAppStream(pEdit,CPDF_Point(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();
+ ASSERT(pControl != NULL);
+ CPDF_FormField* pField = pControl->GetField();
+ ASSERT(pField != NULL);
+
+ CPDF_Rect rcClient = GetClientRect();
+
+ CFX_ByteTextBuf sBody, sLines;
+
+ if (IFX_Edit * pEdit = IFX_Edit::NewEdit())
+ {
+ pEdit->EnableRefresh(FALSE);
+
+// ASSERT(this->m_pBaseForm != NULL);
+ ASSERT(this->m_pInterForm != NULL);
+ CPDFSDK_Document* pDoc = m_pInterForm->GetDocument();
+ ASSERT(pDoc != NULL);
+ CPDFDoc_Environment* pEnv = pDoc->GetEnv();
+
+ CBA_FontMap FontMap(this,pEnv->GetSysHandler());
+ FontMap.Initial();
+ pEdit->SetFontMap(&FontMap);
+
+ pEdit->SetPlateRect(CPDF_Rect(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;
+
+ FX_INT32 nTop = pField->GetTopVisibleIndex();
+ FX_INT32 nCount = pField->CountOptions();
+ FX_INT32 nSelCount = pField->CountSelectedItems();
+
+ for (FX_INT32 i=nTop; i<nCount; i++)
+ {
+ FX_BOOL bSelected = FALSE;
+ for (FX_INT32 j=0; j<nSelCount; j++)
+ {
+ if (pField->GetSelectedIndex(j) == i)
+ {
+ bSelected = TRUE;
+ break;
+ }
+ }
+
+ pEdit->SetText((FX_LPCWSTR)pField->GetOptionLabel(i));
+
+ CPDF_Rect rcContent = pEdit->GetContentRect();
+ FX_FLOAT fItemHeight = rcContent.Height();
+
+ if (bSelected)
+ {
+ CPDF_Rect rcItem = CPDF_Rect(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,CPDF_Point(0.0f,fy)) << "ET\n";
+ }
+ else
+ {
+ CPWL_Color crText = GetTextPWLColor();
+ sList << "BT\n" << CPWL_Utils::GetColorAppStream(crText,TRUE) <<
+ CPWL_Utils::GetEditAppStream(pEdit,CPDF_Point(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(FX_LPCWSTR sValue)
+{
+ CPDF_FormControl* pControl = GetFormControl();
+ ASSERT(pControl != NULL);
+ CPDF_FormField* pField = pControl->GetField();
+ ASSERT(pField != NULL);
+
+ CFX_ByteTextBuf sBody, sLines;
+
+ if (IFX_Edit * pEdit = IFX_Edit::NewEdit())
+ {
+ pEdit->EnableRefresh(FALSE);
+
+// ASSERT(this->m_pBaseForm != NULL);
+ ASSERT(this->m_pInterForm != NULL);
+ CPDFSDK_Document* pDoc = m_pInterForm->GetDocument();
+ ASSERT(pDoc != NULL);
+ CPDFDoc_Environment* pEnv = pDoc->GetEnv();
+
+ CBA_FontMap FontMap(this,pEnv->GetSysHandler());//, ISystemHandle::GetSystemHandler(m_pBaseForm->GetEnv()));
+ FontMap.Initial();
+ pEdit->SetFontMap(&FontMap);
+
+ CPDF_Rect 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();
+
+ if (nMaxLen > 0)
+ {
+ if (bCharArray)
+ {
+ pEdit->SetCharArray(nMaxLen);
+
+ if (IsFloatZero(fFontSize))
+ {
+ fFontSize = CPWL_Edit::GetCharArrayAutoFontSize(FontMap.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((FX_LPCWSTR)pField->GetValue());
+
+ CPDF_Rect rcContent = pEdit->GetContentRect();
+
+ CFX_ByteString sEdit = CPWL_Utils::GetEditAppStream(pEdit,CPDF_Point(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 (FX_INT32 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 (FX_INT32 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);
+}
+
+CPDF_Rect CPDFSDK_Widget::GetClientRect() const
+{
+ CPDF_Rect 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);
+}
+
+CPDF_Rect CPDFSDK_Widget::GetRotatedRect() const
+{
+ CPDF_Rect rectAnnot = GetRect();
+ FX_FLOAT fWidth = rectAnnot.right - rectAnnot.left;
+ FX_FLOAT fHeight = rectAnnot.top - rectAnnot.bottom;
+
+ CPDF_FormControl* pControl = GetFormControl();
+ ASSERT(pControl != NULL);
+
+ CPDF_Rect rcPDFWindow;
+ switch(abs(pControl->GetRotation() % 360))
+ {
+ case 0:
+ case 180:
+ default:
+ rcPDFWindow = CPDF_Rect(0, 0, fWidth, fHeight);
+ break;
+ case 90:
+ case 270:
+ rcPDFWindow = CPDF_Rect(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);
+ else
+ return "";
+}
+
+CFX_ByteString CPDFSDK_Widget::GetBorderAppStream() const
+{
+ CPDF_Rect rcWindow = GetRotatedRect();
+ CPWL_Color crBorder = GetBorderPWLColor();
+ CPWL_Color crBackground = GetFillPWLColor();
+ CPWL_Color crLeftTop, crRightBottom;
+
+ FX_FLOAT fBorderWidth = (FX_FLOAT)GetBorderWidth();
+ FX_INT32 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);
+}
+
+CPDF_Matrix CPDFSDK_Widget::GetMatrix() const
+{
+ CPDF_Matrix mt;
+ CPDF_FormControl* pControl = GetFormControl();
+ ASSERT(pControl != NULL);
+
+ CPDF_Rect 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 = CPDF_Matrix(1, 0, 0, 1, 0, 0);
+ break;
+ case 90:
+ mt = CPDF_Matrix(0, 1, -1, 0, fWidth, 0);
+ break;
+ case 180:
+ mt = CPDF_Matrix(-1, 0, 0, -1, fWidth, fHeight);
+ break;
+ case 270:
+ mt = CPDF_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();
+ ASSERT(pFormCtrl != NULL);
+
+ CPDF_DefaultAppearance da = pFormCtrl->GetDefaultAppearance();
+ if (da.HasColor())
+ {
+ FX_INT32 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();
+ ASSERT(pFormCtrl != NULL);
+
+ FX_INT32 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();
+ ASSERT(pFormCtrl != NULL);
+
+ FX_INT32 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)
+{
+ ASSERT(pImage != NULL);
+
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ CPDF_Document* pDoc = m_pPageView->GetPDFDocument();//pDocument->GetDocument();
+ ASSERT(pDoc != NULL);
+
+ CPDF_Dictionary* pAPDict = m_pAnnot->m_pAnnotDict->GetDict("AP");
+ ASSERT(pAPDict != NULL);
+
+ CPDF_Stream* pStream = pAPDict->GetStream(sAPType);
+ ASSERT(pStream != NULL);
+
+ CPDF_Dictionary* pStreamDict = pStream->GetDict();
+ ASSERT(pStreamDict != NULL);
+
+ CFX_ByteString sImageAlias = "IMG";
+
+ if (CPDF_Dictionary* pImageDict = pImage->GetDict())
+ {
+ sImageAlias = pImageDict->GetString("Name");
+ if (sImageAlias.IsEmpty())
+ sImageAlias = "IMG";
+ }
+
+ CPDF_Dictionary* pStreamResList = pStreamDict->GetDict("Resources");
+ if (!pStreamResList)
+ {
+ pStreamResList = FX_NEW CPDF_Dictionary();
+ pStreamDict->SetAt("Resources", pStreamResList);
+ }
+
+ if (pStreamResList)
+ {
+ CPDF_Dictionary* pXObject = FX_NEW CPDF_Dictionary;
+ pXObject->SetAtReference(sImageAlias, pDoc, pImage);
+ pStreamResList->SetAt("XObject", pXObject);
+ }
+}
+
+void CPDFSDK_Widget::RemoveAppearance(const CFX_ByteString& sAPType)
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ if (CPDF_Dictionary* pAPDict = m_pAnnot->m_pAnnotDict->GetDict("AP"))
+ {
+ pAPDict->RemoveAt(sAPType);
+ }
+}
+
+FX_BOOL CPDFSDK_Widget::OnAAction(CPDF_AAction::AActionType type, PDFSDK_FieldAction& data, CPDFSDK_PageView* pPageView)
+{
+ CPDF_Action action = GetAAction(type);
+
+ if (action && action.GetType() != CPDF_Action::Unknown)
+ {
+ CPDFSDK_Document* pDocument = pPageView->GetSDKDocument();
+ ASSERT(pDocument != NULL);
+
+ CPDFDoc_Environment* pEnv = pDocument->GetEnv();
+ ASSERT(pEnv != NULL);
+
+ CPDFSDK_ActionHandler* pActionHandler = pEnv->GetActionHander();/*(CPDFSDK_ActionHandler*)pApp->GetActionHandler();*/
+ ASSERT(pActionHandler != NULL);
+
+ 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_Annot::GetAAction(eAAT);
+ case CPDF_AAction::KeyStroke:
+ case CPDF_AAction::Format:
+ case CPDF_AAction::Validate:
+ case CPDF_AAction::Calculate:
+ {
+ CPDF_FormField* pField = this->GetFormField();
+ ASSERT(pField != NULL);
+
+ if (CPDF_AAction aa = pField->GetAdditionalAction())
+ return aa.GetAction(eAAT);
+ else
+ return CPDFSDK_Annot::GetAAction(eAAT);
+ }
+ default:
+ return NULL;
+ }
+
+ return NULL;
+}
+
+
+CFX_WideString CPDFSDK_Widget::GetAlternateName() const
+{
+ CPDF_FormField* pFormField = GetFormField();
+ ASSERT(pFormField != NULL);
+
+ return pFormField->GetAlternateName();
+}
+
+FX_INT32 CPDFSDK_Widget::GetAppearanceAge() const
+{
+ return m_nAppAge;
+}
+
+FX_INT32 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;
+}
+
+CPDFSDK_InterForm::CPDFSDK_InterForm(CPDFSDK_Document* pDocument)
+ :m_pDocument(pDocument),
+ m_pInterForm(NULL),
+ m_bCalculate(TRUE),
+ m_bBusy(FALSE)
+{
+ ASSERT(m_pDocument != NULL);
+ m_pInterForm = new CPDF_InterForm(m_pDocument->GetDocument(), FALSE);
+ ASSERT(m_pInterForm != NULL);
+ m_pInterForm->SetFormNotify(this);
+
+ for(int i=0; i<6; i++)
+ m_bNeedHightlight[i] = FALSE;
+ m_iHighlightAlpha = 0;
+}
+
+CPDFSDK_InterForm::~CPDFSDK_InterForm()
+{
+ ASSERT(m_pInterForm != NULL);
+ delete m_pInterForm;
+ m_pInterForm = NULL;
+
+ m_Map.RemoveAll();
+}
+
+void CPDFSDK_InterForm::Destroy()
+{
+ delete this;
+}
+
+CPDF_InterForm* CPDFSDK_InterForm::GetInterForm()
+{
+ return m_pInterForm;
+}
+
+CPDFSDK_Document* CPDFSDK_InterForm::GetDocument()
+{
+ return m_pDocument;
+}
+
+FX_BOOL CPDFSDK_InterForm::HighlightWidgets()
+{
+ return FALSE;
+}
+
+CPDFSDK_Widget* CPDFSDK_InterForm::GetSibling(CPDFSDK_Widget* pWidget, FX_BOOL bNext) const
+{
+ ASSERT(pWidget != NULL);
+
+ CBA_AnnotIterator* pIterator = new CBA_AnnotIterator(pWidget->GetPageView(), "Widget", "");
+ ASSERT(pIterator != NULL);
+
+ CPDFSDK_Widget* pRet = NULL;
+
+ if (bNext)
+ pRet = (CPDFSDK_Widget*)pIterator->GetNextAnnot(pWidget);
+ else
+ pRet = (CPDFSDK_Widget*)pIterator->GetPrevAnnot(pWidget);
+
+ pIterator->Release();
+
+ return pRet;
+
+}
+
+CPDFSDK_Widget* CPDFSDK_InterForm::GetWidget(CPDF_FormControl* pControl) const
+{
+ if(!pControl || !m_pInterForm) return NULL;
+
+ CPDFSDK_Widget* pWidget = NULL;
+ m_Map.Lookup(pControl, pWidget);
+
+ if (pWidget) return pWidget;
+
+ CPDF_Dictionary* pControlDict = pControl->GetWidget();
+ ASSERT(pControlDict != NULL);
+
+ ASSERT(m_pDocument != NULL);
+ CPDF_Document* pDocument = m_pDocument->GetDocument();
+
+ CPDFSDK_PageView* pPage = NULL;
+
+ if (CPDF_Dictionary* pPageDict = pControlDict->GetDict("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 (CPDFSDK_Widget*)pPage->GetAnnotByDict(pControlDict);
+
+ return NULL;
+}
+
+void CPDFSDK_InterForm::GetWidgets(const CFX_WideString& sFieldName, CFX_PtrArray& widgets)
+{
+ ASSERT(m_pInterForm != NULL);
+
+ for (int i=0,sz=m_pInterForm->CountFields(sFieldName); i<sz; i++)
+ {
+ CPDF_FormField* pFormField = m_pInterForm->GetField(i, sFieldName);
+ ASSERT(pFormField != NULL);
+
+ GetWidgets(pFormField, widgets);
+ }
+}
+
+void CPDFSDK_InterForm::GetWidgets(CPDF_FormField* pField, CFX_PtrArray& widgets)
+{
+ ASSERT(pField != NULL);
+
+ for (int i=0,isz=pField->CountControls(); i<isz; i++)
+ {
+ CPDF_FormControl* pFormCtrl = pField->GetControl(i);
+ ASSERT(pFormCtrl != NULL);
+
+ CPDFSDK_Widget* pWidget = GetWidget(pFormCtrl);
+
+ if (pWidget)
+ widgets.Add(pWidget);
+ }
+}
+
+int CPDFSDK_InterForm::GetPageIndexByAnnotDict(CPDF_Document* pDocument, CPDF_Dictionary* pAnnotDict) const
+{
+ ASSERT(pDocument != NULL);
+ ASSERT(pAnnotDict != NULL);
+
+ for (int i=0,sz=pDocument->GetPageCount(); i<sz; i++)
+ {
+ if (CPDF_Dictionary* pPageDict = pDocument->GetPage(i))
+ {
+ if (CPDF_Array* pAnnots = pPageDict->GetArray("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.SetAt(pControl, pWidget);
+}
+
+void CPDFSDK_InterForm::RemoveMap(CPDF_FormControl* pControl)
+{
+ m_Map.RemoveKey(pControl);
+}
+
+void CPDFSDK_InterForm::EnableCalculate(FX_BOOL bEnabled)
+{
+ m_bCalculate = bEnabled;
+}
+
+FX_BOOL CPDFSDK_InterForm::IsCalculateEnabled() const
+{
+ return m_bCalculate;
+}
+
+#ifdef _WIN32
+CPDF_Stream* CPDFSDK_InterForm::LoadImageFromFile(const CFX_WideString& sFile)
+{
+ ASSERT(m_pDocument != NULL);
+ CPDF_Document* pDocument = m_pDocument->GetDocument();
+ ASSERT(pDocument != NULL);
+
+ CPDF_Stream* pRetStream = NULL;
+
+ if (CFX_DIBitmap* pBmp = CFX_WindowsDIB::LoadFromFile(sFile))
+ {
+ int nWidth = pBmp->GetWidth();
+ int nHeight = pBmp->GetHeight();
+
+ CPDF_Image Image(pDocument);
+ Image.SetImage(pBmp, FALSE);
+ CPDF_Stream* pImageStream = Image.GetStream();
+ if (pImageStream)
+ {
+ if (pImageStream->GetObjNum() == 0)
+ pDocument->AddIndirectObject(pImageStream);
+
+ CPDF_Dictionary* pStreamDict = new CPDF_Dictionary();
+ pStreamDict->SetAtName("Subtype", "Form");
+ pStreamDict->SetAtName("Name", "IMG");
+ CPDF_Array* pMatrix = new CPDF_Array();
+ pStreamDict->SetAt("Matrix", pMatrix);
+ pMatrix->AddInteger(1);
+ pMatrix->AddInteger(0);
+ pMatrix->AddInteger(0);
+ pMatrix->AddInteger(1);
+ pMatrix->AddInteger(-nWidth / 2);
+ pMatrix->AddInteger(-nHeight / 2);
+ CPDF_Dictionary* pResource = new CPDF_Dictionary();
+ pStreamDict->SetAt("Resources", pResource);
+ CPDF_Dictionary* pXObject = new CPDF_Dictionary();
+ pResource->SetAt("XObject", pXObject);
+ pXObject->SetAtReference("Img", pDocument, pImageStream);
+ CPDF_Array* pProcSet = new CPDF_Array();
+ pResource->SetAt("ProcSet", pProcSet);
+ pProcSet->AddName("PDF");
+ pProcSet->AddName("ImageC");
+ pStreamDict->SetAtName("Type", "XObject");
+ CPDF_Array* pBBox = new CPDF_Array();
+ pStreamDict->SetAt("BBox", pBBox);
+ pBBox->AddInteger(0);
+ pBBox->AddInteger(0);
+ pBBox->AddInteger(nWidth);
+ pBBox->AddInteger(nHeight);
+ pStreamDict->SetAtInteger("FormType", 1);
+
+ pRetStream = new CPDF_Stream(NULL, 0, NULL);
+ CFX_ByteString csStream;
+ csStream.Format("q\n%d 0 0 %d 0 0 cm\n/Img Do\nQ", nWidth, nHeight);
+ pRetStream->InitStream((FX_BYTE*)(FX_LPCSTR)csStream, csStream.GetLength(), pStreamDict);
+ pDocument->AddIndirectObject(pRetStream);
+ }
+
+ delete pBmp;
+ }
+
+ return pRetStream;
+}
+#endif
+
+void CPDFSDK_InterForm::OnCalculate(CPDF_FormField* pFormField)
+{
+ ASSERT(m_pDocument != NULL);
+ CPDFDoc_Environment* pEnv = m_pDocument->GetEnv();
+ ASSERT(pEnv);
+ if(!pEnv->IsJSInitiated())
+ return;
+
+ if (m_bBusy) return;
+
+ m_bBusy = TRUE;
+
+ if (this->IsCalculateEnabled())
+ {
+ IFXJS_Runtime* pRuntime = m_pDocument->GetJsRuntime();
+ ASSERT(pRuntime != NULL);
+
+ pRuntime->SetReaderDocument(m_pDocument);
+
+ int nSize = m_pInterForm->CountFieldsInCalculationOrder();
+ for (int i=0; i<nSize; i++)
+ {
+ if(CPDF_FormField* pField = m_pInterForm->GetFieldInCalculationOrder(i))
+ {
+// ASSERT(pField != NULL);
+ int nType = pField->GetFieldType();
+ if (nType == FIELDTYPE_COMBOBOX || nType == FIELDTYPE_TEXTFIELD)
+ {
+ CPDF_AAction aAction = pField->GetAdditionalAction();
+ if (aAction && aAction.ActionExist(CPDF_AAction::Calculate))
+ {
+ CPDF_Action action = aAction.GetAction(CPDF_AAction::Calculate);
+ if (action)
+ {
+ CFX_WideString csJS = action.GetJavaScript();
+ if (!csJS.IsEmpty())
+ {
+ IFXJS_Context* pContext = pRuntime->NewContext();
+ ASSERT(pContext != NULL);
+
+ 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, int nCommitKey, FX_BOOL& bFormated)
+{
+ ASSERT(m_pDocument != NULL);
+ ASSERT(pFormField != NULL);
+
+ CFX_WideString sValue = pFormField->GetValue();
+ CPDFDoc_Environment* pEnv = m_pDocument->GetEnv();
+ ASSERT(pEnv);
+ if(!pEnv->IsJSInitiated())
+ {
+ bFormated = FALSE;
+ return sValue;
+ }
+
+ IFXJS_Runtime* pRuntime = m_pDocument->GetJsRuntime();
+ ASSERT(pRuntime != NULL);
+
+ 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 != NULL && aAction.ActionExist(CPDF_AAction::Format))
+ {
+ CPDF_Action action = aAction.GetAction(CPDF_AAction::Format);
+ if (action)
+ {
+ CFX_WideString script = action.GetJavaScript();
+ if (!script.IsEmpty())
+ {
+ CFX_WideString Value = sValue;
+
+ IFXJS_Context* pContext = pRuntime->NewContext();
+ ASSERT(pContext != NULL);
+
+ pContext->OnField_Format(nCommitKey, 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, FX_LPCWSTR sValue, FX_BOOL bValueChanged)
+{
+ ASSERT(pFormField != NULL);
+
+ for (int i=0,sz=pFormField->CountControls(); i<sz; i++)
+ {
+ CPDF_FormControl* pFormCtrl = pFormField->GetControl(i);
+ ASSERT(pFormCtrl != NULL);
+
+ ASSERT(m_pInterForm != NULL);
+ if(CPDFSDK_Widget* pWidget = GetWidget(pFormCtrl))
+ pWidget->ResetAppearance(sValue, bValueChanged);
+ }
+}
+
+void CPDFSDK_InterForm::UpdateField(CPDF_FormField* pFormField)
+{
+ ASSERT(pFormField != NULL);
+
+ for (int i=0,sz=pFormField->CountControls(); i<sz; i++)
+ {
+ CPDF_FormControl* pFormCtrl = pFormField->GetControl(i);
+ ASSERT(pFormCtrl != NULL);
+
+ if(CPDFSDK_Widget* pWidget = GetWidget(pFormCtrl))
+ {
+ CPDFDoc_Environment * pEnv = m_pDocument->GetEnv();
+ CFFL_IFormFiller* pIFormFiller = pEnv->GetIFormFiller();
+
+ CPDF_Page * pPage = pWidget->GetPDFPage();
+ 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);
+ }
+ }
+}
+
+void CPDFSDK_InterForm::OnKeyStrokeCommit(CPDF_FormField* pFormField, CFX_WideString& csValue, FX_BOOL& bRC)
+{
+ ASSERT(pFormField != NULL);
+
+ CPDF_AAction aAction = pFormField->GetAdditionalAction();
+ if (aAction != NULL && aAction.ActionExist(CPDF_AAction::KeyStroke))
+ {
+ CPDF_Action action = aAction.GetAction(CPDF_AAction::KeyStroke);
+ if (action)
+ {
+ ASSERT(m_pDocument != NULL);
+ CPDFDoc_Environment* pEnv = m_pDocument->GetEnv();
+ ASSERT(pEnv != NULL);
+
+ CPDFSDK_ActionHandler* pActionHandler = pEnv->GetActionHander();
+ ASSERT(pActionHandler != NULL);
+
+ 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);
+ bRC = fa.bRC;
+ }
+ }
+}
+
+void CPDFSDK_InterForm::OnValidate(CPDF_FormField* pFormField, CFX_WideString& csValue, FX_BOOL& bRC)
+{
+ ASSERT(pFormField != NULL);
+
+ CPDF_AAction aAction = pFormField->GetAdditionalAction();
+ if (aAction != NULL && aAction.ActionExist(CPDF_AAction::Validate))
+ {
+ CPDF_Action action = aAction.GetAction(CPDF_AAction::Validate);
+ if (action)
+ {
+ ASSERT(m_pDocument != NULL);
+ CPDFDoc_Environment* pEnv = m_pDocument->GetEnv();
+ ASSERT(pEnv != NULL);
+
+ CPDFSDK_ActionHandler* pActionHandler = pEnv->GetActionHander();
+ ASSERT(pActionHandler != NULL);
+
+ 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);
+ bRC = fa.bRC;
+
+ }
+ }
+}
+
+/* ----------------------------- action ----------------------------- */
+
+FX_BOOL CPDFSDK_InterForm::DoAction_Hide(const CPDF_Action& action)
+{
+ ASSERT(action != NULL);
+
+ CPDF_ActionFields af = action.GetWidgets();
+ CFX_PtrArray fieldObjects;
+ af.GetAllFields(fieldObjects);
+ CFX_PtrArray widgetArray;
+ CFX_PtrArray fields;
+ GetFieldFromObjects(fieldObjects, fields);
+
+ FX_BOOL bHide = action.GetHideStatus();
+
+ FX_BOOL bChanged = FALSE;
+
+ for (int i=0, sz=fields.GetSize(); i<sz; i++)
+ {
+ CPDF_FormField* pField = (CPDF_FormField*)fields[i];
+ ASSERT(pField != NULL);
+
+
+ for (int j=0,jsz=pField->CountControls(); j<jsz; j++)
+ {
+ CPDF_FormControl* pControl = pField->GetControl(j);
+ ASSERT(pControl != NULL);
+
+ if (CPDFSDK_Widget* pWidget = GetWidget(pControl))
+ {
+ int nFlags = pWidget->GetFlags();
+ if (bHide)
+ {
+ nFlags &= (~ANNOTFLAG_INVISIBLE);
+ nFlags &= (~ANNOTFLAG_NOVIEW);
+ nFlags |= (ANNOTFLAG_HIDDEN);
+ }
+ else
+ {
+ nFlags &= (~ANNOTFLAG_INVISIBLE);
+ nFlags &= (~ANNOTFLAG_HIDDEN);
+ nFlags &= (~ANNOTFLAG_NOVIEW);
+ }
+ pWidget->SetFlags(nFlags);
+
+ CPDFSDK_PageView* pPageView = pWidget->GetPageView();
+ ASSERT(pPageView != NULL);
+
+ pPageView->UpdateView(pWidget);
+
+ bChanged = TRUE;
+ }
+ }
+ }
+
+ return bChanged;
+}
+
+FX_BOOL CPDFSDK_InterForm::DoAction_SubmitForm(const CPDF_Action& action)
+{
+ ASSERT(action != NULL);
+ ASSERT(m_pInterForm != NULL);
+
+ CFX_WideString sDestination = action.GetFilePath();
+ if (sDestination.IsEmpty()) return FALSE;
+
+ CPDF_Dictionary* pActionDict = action;
+ if (pActionDict->KeyExist("Fields"))
+ {
+ CPDF_ActionFields af = action.GetWidgets();
+ FX_DWORD dwFlags = action.GetFlags();
+
+ CFX_PtrArray fieldObjects;
+ af.GetAllFields(fieldObjects);
+ CFX_PtrArray fields;
+ GetFieldFromObjects(fieldObjects, fields);
+
+ if (fields.GetSize() != 0)
+ {
+ FX_BOOL bIncludeOrExclude = !(dwFlags & 0x01);
+ if (m_pInterForm->CheckRequiredFields(&fields, bIncludeOrExclude))
+ {
+ return FALSE;
+ }
+ return SubmitFields(sDestination, fields, bIncludeOrExclude, FALSE);
+ }
+ else
+ {
+ if ( m_pInterForm->CheckRequiredFields())
+ {
+ return FALSE;
+ }
+
+ return SubmitForm(sDestination, FALSE);
+ }
+ }
+ else
+ {
+ if ( m_pInterForm->CheckRequiredFields())
+ {
+ return FALSE;
+ }
+
+ return SubmitForm(sDestination, FALSE);
+ }
+}
+
+FX_BOOL CPDFSDK_InterForm::SubmitFields(const CFX_WideString& csDestination, const CFX_PtrArray& fields,
+ FX_BOOL bIncludeOrExclude, FX_BOOL bUrlEncoded)
+{
+ CPDFDoc_Environment* pEnv = m_pDocument->GetEnv();
+ ASSERT(pEnv != NULL);
+
+ CFX_ByteTextBuf textBuf;
+ ExportFieldsToFDFTextBuf(fields, bIncludeOrExclude, textBuf);
+
+ FX_LPBYTE pBuffer = textBuf.GetBuffer();
+ FX_STRSIZE nBufSize = textBuf.GetLength();
+
+ if (bUrlEncoded)
+ {
+ if(!FDFToURLEncodedData(pBuffer, nBufSize))
+ return FALSE;
+ }
+
+ pEnv->JS_docSubmitForm(pBuffer, nBufSize, (FX_LPCWSTR)csDestination);
+
+ if (bUrlEncoded && pBuffer)
+ {
+ FX_Free(pBuffer);
+ pBuffer = NULL;
+ }
+
+ return TRUE;
+}
+
+void CPDFSDK_InterForm::DoFDFBuffer(CFX_ByteString sBuffer)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (CFDF_Document *pFDFDocument = CFDF_Document::ParseMemory((const unsigned char *)sBuffer.GetBuffer(sBuffer.GetLength()), sBuffer.GetLength()))
+ {
+ CPDF_Dictionary* pRootDic = pFDFDocument->GetRoot();
+ if(pRootDic)
+ {
+ CPDF_Dictionary * pFDFDict=pRootDic->GetDict("FDF");
+ if(pFDFDict)
+ {
+ CPDF_Dictionary * pJSDict = pFDFDict->GetDict("JavaScript");
+ if(pJSDict)
+ {
+ CFX_WideString csJS;
+
+ CPDF_Object* pJS = pJSDict->GetElementValue("Before");
+ if (pJS != NULL)
+ {
+ int iType = pJS->GetType();
+ if (iType == PDFOBJ_STRING)
+ csJS = pJSDict->GetUnicodeText("Before");
+ else if (iType == PDFOBJ_STREAM)
+ csJS = pJS->GetUnicodeText();
+ }
+
+ }
+ }
+ }
+ delete pFDFDocument;
+ }
+
+ sBuffer.ReleaseBuffer();
+}
+
+FX_BOOL CPDFSDK_InterForm::FDFToURLEncodedData(CFX_WideString csFDFFile, CFX_WideString csTxtFile)
+{
+ return TRUE;
+}
+
+FX_BOOL CPDFSDK_InterForm::FDFToURLEncodedData(FX_LPBYTE& pBuf, FX_STRSIZE& nBufSize)
+{
+ CFDF_Document* pFDF = CFDF_Document::ParseMemory(pBuf, nBufSize);
+ if (pFDF)
+ {
+ CPDF_Dictionary* pMainDict = pFDF->GetRoot()->GetDict("FDF");
+ if (pMainDict == NULL) return FALSE;
+
+ // Get fields
+ CPDF_Array* pFields = pMainDict->GetArray("Fields");
+ if (pFields == NULL) return FALSE;
+
+ CFX_ByteTextBuf fdfEncodedData;
+
+ for (FX_DWORD i = 0; i < pFields->GetCount(); i ++)
+ {
+ CPDF_Dictionary* pField = pFields->GetDict(i);
+ if (pField == NULL) continue;
+ CFX_WideString name;
+ name = pField->GetUnicodeText("T");
+ CFX_ByteString name_b = CFX_ByteString::FromUnicode(name);
+ CFX_ByteString csBValue = pField->GetString("V");
+ CFX_WideString csWValue = PDF_DecodeText(csBValue);
+ CFX_ByteString csValue_b = CFX_ByteString::FromUnicode(csWValue);
+
+ fdfEncodedData = fdfEncodedData<<name_b.GetBuffer(name_b.GetLength());
+ name_b.ReleaseBuffer();
+ fdfEncodedData = fdfEncodedData<<"=";
+ fdfEncodedData = fdfEncodedData<<csValue_b.GetBuffer(csValue_b.GetLength());
+ csValue_b.ReleaseBuffer();
+ if(i != pFields->GetCount()-1)
+ fdfEncodedData = fdfEncodedData<<"&";
+ }
+
+ nBufSize = fdfEncodedData.GetLength();
+ pBuf = FX_Alloc(FX_BYTE, nBufSize);
+ if(!pBuf)
+ return FALSE;
+ FXSYS_memcpy(pBuf, fdfEncodedData.GetBuffer(), nBufSize);
+
+ }
+ return TRUE;
+}
+
+FX_BOOL CPDFSDK_InterForm::ExportFieldsToFDFFile(const CFX_WideString& sFDFFileName,
+ const CFX_PtrArray& fields, FX_BOOL bIncludeOrExclude)
+{
+ if (sFDFFileName.IsEmpty()) return FALSE;
+ ASSERT(m_pDocument != NULL);
+ ASSERT(m_pInterForm != NULL);
+
+ CFDF_Document* pFDF = m_pInterForm->ExportToFDF(m_pDocument->GetPath(),(CFX_PtrArray&)fields, bIncludeOrExclude);
+ if (!pFDF) return FALSE;
+ FX_BOOL bRet = pFDF->WriteFile(sFDFFileName.UTF8Encode()); // = FALSE;//
+ delete pFDF;
+
+ return bRet;
+}
+FX_BOOL CPDFSDK_InterForm::ExportFieldsToFDFTextBuf(const CFX_PtrArray& fields,FX_BOOL bIncludeOrExclude, CFX_ByteTextBuf& textBuf)
+{
+ ASSERT(m_pDocument != NULL);
+ ASSERT(m_pInterForm != NULL);
+
+ CFDF_Document* pFDF = m_pInterForm->ExportToFDF(m_pDocument->GetPath(),(CFX_PtrArray&)fields, bIncludeOrExclude);
+ if (!pFDF) return FALSE;
+ FX_BOOL bRet = pFDF->WriteBuf(textBuf); // = FALSE;//
+ delete pFDF;
+
+ return bRet;
+}
+
+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;
+
+ CPDFDoc_Environment* pEnv = m_pDocument->GetEnv();
+ ASSERT(pEnv != NULL);
+
+ if(NULL == m_pDocument) return FALSE;
+ CFX_WideString wsPDFFilePath = m_pDocument->GetPath();
+
+ if(NULL == m_pInterForm) return FALSE;
+ CFDF_Document* pFDFDoc = m_pInterForm->ExportToFDF(wsPDFFilePath);
+ if (NULL == pFDFDoc) return FALSE;
+
+ CFX_ByteTextBuf FdfBuffer;
+ FX_BOOL bRet = pFDFDoc->WriteBuf(FdfBuffer);
+ delete pFDFDoc;
+ if (!bRet) return FALSE;
+
+ FX_LPBYTE pBuffer = FdfBuffer.GetBuffer();
+ FX_STRSIZE nBufSize = FdfBuffer.GetLength();
+
+ if (bUrlEncoded)
+ {
+ if(!FDFToURLEncodedData(pBuffer, nBufSize))
+ return FALSE;
+ }
+
+ pEnv->JS_docSubmitForm(pBuffer, nBufSize, (FX_LPCWSTR)sDestination);
+
+ if (bUrlEncoded && pBuffer)
+ {
+ FX_Free(pBuffer);
+ pBuffer = NULL;
+ }
+
+ return TRUE;
+}
+
+FX_BOOL CPDFSDK_InterForm::ExportFormToFDFFile(const CFX_WideString& sFDFFileName)
+{
+ if (sFDFFileName.IsEmpty()) return FALSE;
+
+ ASSERT(m_pInterForm != NULL);
+ ASSERT(m_pDocument != NULL);
+
+ CFDF_Document* pFDF = m_pInterForm->ExportToFDF(m_pDocument->GetPath());
+ if (!pFDF) return FALSE;
+
+ FX_BOOL bRet = pFDF->WriteFile(sFDFFileName.UTF8Encode());
+ delete pFDF;
+
+ return bRet;
+}
+
+FX_BOOL CPDFSDK_InterForm::ExportFormToFDFTextBuf(CFX_ByteTextBuf& textBuf)
+{
+
+ ASSERT(m_pInterForm != NULL);
+ ASSERT(m_pDocument != NULL);
+
+ 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::ExportFormToTxtFile(const CFX_WideString& sTxtFileName)
+{
+ ASSERT(m_pInterForm != NULL);
+
+ CFX_WideString sFieldNames;
+ CFX_WideString sFieldValues;
+
+ int nSize = m_pInterForm->CountFields();
+
+ if (nSize > 0)
+ {
+ for (int i=0; i<nSize; i++)
+ {
+ CPDF_FormField* pField = m_pInterForm->GetField(i);
+ ASSERT(pField != NULL);
+
+ if (i != 0)
+ {
+ sFieldNames += L"\t";
+ sFieldValues += L"\t";
+ }
+ sFieldNames += pField->GetFullName();
+ sFieldValues += pField->GetValue();
+ }
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CPDFSDK_InterForm::ImportFormFromTxtFile(const CFX_WideString& sTxtFileName)
+{
+ ASSERT(m_pInterForm != NULL);
+
+ return TRUE;
+}
+
+FX_BOOL CPDFSDK_InterForm::DoAction_ResetForm(const CPDF_Action& action)
+{
+ ASSERT(action != NULL);
+
+ CPDF_Dictionary* pActionDict = action;
+
+ if (pActionDict->KeyExist("Fields"))
+ {
+ CPDF_ActionFields af = action.GetWidgets();
+ FX_DWORD dwFlags = action.GetFlags();
+
+ CFX_PtrArray fieldObjects;
+ af.GetAllFields(fieldObjects);
+ CFX_PtrArray fields;
+ GetFieldFromObjects(fieldObjects, fields);
+
+ ASSERT(m_pInterForm != NULL);
+
+ return m_pInterForm->ResetForm(fields, !(dwFlags & 0x01), TRUE);
+ }
+ else
+ {
+ ASSERT(m_pInterForm != NULL);
+ return m_pInterForm->ResetForm(TRUE);
+ }
+}
+
+FX_BOOL CPDFSDK_InterForm::DoAction_ImportData(const CPDF_Action& action)
+{
+ ASSERT(action != NULL);
+
+ CFX_WideString sFilePath = action.GetFilePath();
+ if (sFilePath.IsEmpty())
+ return FALSE;
+
+ if (!ImportFormFromFDFFile(sFilePath, TRUE))
+ {
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+FX_BOOL CPDFSDK_InterForm::ImportFormFromFDFFile(const CFX_WideString& csFDFFileName,
+ FX_BOOL bNotify)
+{
+ return FALSE;
+}
+
+void CPDFSDK_InterForm::GetFieldFromObjects(const CFX_PtrArray& objects, CFX_PtrArray& fields)
+{
+ ASSERT(m_pInterForm != NULL);
+
+ int iCount = objects.GetSize();
+ for (int i = 0; i < iCount; i ++)
+ {
+ CPDF_Object* pObject = (CPDF_Object*)objects[i];
+ if (pObject == NULL) continue;
+
+ int iType = pObject->GetType();
+ if (iType == PDFOBJ_STRING)
+ {
+ CFX_WideString csName = pObject->GetUnicodeText();
+ CPDF_FormField* pField = m_pInterForm->GetField(0, csName);
+ if (pField != NULL)
+ fields.Add(pField);
+ }
+ else if (iType == PDFOBJ_DICTIONARY)
+ {
+ if (m_pInterForm->IsValidFormField(pObject))
+ fields.Add(pObject);
+ }
+ }
+}
+
+/* ----------------------------- CPDF_FormNotify ----------------------------- */
+
+int CPDFSDK_InterForm::BeforeValueChange(const CPDF_FormField* pField, CFX_WideString& csValue)
+{
+ ASSERT(pField != NULL);
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)pField;
+
+ int nType = pFormField->GetFieldType();
+ if (nType == FIELDTYPE_COMBOBOX || nType == FIELDTYPE_TEXTFIELD)
+ {
+ FX_BOOL bRC = TRUE;
+ OnKeyStrokeCommit(pFormField, csValue, bRC);
+ if (bRC)
+ {
+ OnValidate(pFormField, csValue, bRC);
+ if (bRC)
+ return 1;
+ else
+ return -1;
+ }
+ else
+ return -1;
+ }
+ else
+ return 0;
+}
+
+int CPDFSDK_InterForm::AfterValueChange(const CPDF_FormField* pField)
+{
+ ASSERT(pField != NULL);
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)pField;
+ int nType = pFormField->GetFieldType();
+
+ if (nType == FIELDTYPE_COMBOBOX || nType == FIELDTYPE_TEXTFIELD)
+ {
+ this->OnCalculate(pFormField);
+ FX_BOOL bFormated = FALSE;
+ CFX_WideString sValue = this->OnFormat(pFormField, 0, bFormated);
+ if (bFormated)
+ this->ResetFieldAppearance(pFormField, sValue, TRUE);
+ else
+ this->ResetFieldAppearance(pFormField, NULL, TRUE);
+ this->UpdateField(pFormField);
+ }
+
+ return 0;
+}
+
+int CPDFSDK_InterForm::BeforeSelectionChange(const CPDF_FormField* pField, CFX_WideString& csValue)
+{
+ ASSERT(pField != NULL);
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)pField;
+
+ int nType = pFormField->GetFieldType();
+ if (nType == FIELDTYPE_LISTBOX)
+ {
+ FX_BOOL bRC = TRUE;
+ OnKeyStrokeCommit(pFormField, csValue, bRC);
+ if (bRC)
+ {
+ OnValidate(pFormField, csValue, bRC);
+ if (bRC)
+ return 1;
+ else
+ return -1;
+ }
+ else
+ return -1;
+ }
+ else
+ return 0;
+}
+
+int CPDFSDK_InterForm::AfterSelectionChange(const CPDF_FormField* pField)
+{
+ ASSERT(pField != NULL);
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)pField;
+ int nType = pFormField->GetFieldType();
+
+ if (nType == FIELDTYPE_LISTBOX)
+ {
+ this->OnCalculate(pFormField);
+ this->ResetFieldAppearance(pFormField, NULL, TRUE);
+ this->UpdateField(pFormField);
+ }
+
+ return 0;
+}
+
+int CPDFSDK_InterForm::AfterCheckedStatusChange(const CPDF_FormField* pField, const CFX_ByteArray& statusArray)
+{
+ ASSERT(pField != NULL);
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)pField;
+ int nType = pFormField->GetFieldType();
+
+ if (nType == FIELDTYPE_CHECKBOX || nType == FIELDTYPE_RADIOBUTTON)
+ {
+ this->OnCalculate(pFormField);
+ //this->ResetFieldAppearance(pFormField, NULL);
+ this->UpdateField(pFormField);
+ }
+
+ return 0;
+}
+
+int CPDFSDK_InterForm::BeforeFormReset(const CPDF_InterForm* pForm)
+{
+ return 0;
+}
+
+int CPDFSDK_InterForm::AfterFormReset(const CPDF_InterForm* pForm)
+{
+ this->OnCalculate(NULL);
+
+ return 0;
+}
+
+int CPDFSDK_InterForm::BeforeFormImportData(const CPDF_InterForm* pForm)
+{
+ return 0;
+}
+
+int CPDFSDK_InterForm::AfterFormImportData(const CPDF_InterForm* pForm)
+{
+ this->OnCalculate(NULL);
+
+ return 0;
+}
+
+FX_BOOL CPDFSDK_InterForm::IsNeedHighLight(int nFieldType)
+{
+ if(nFieldType <1 || nFieldType > 6)
+ return FALSE;
+ return m_bNeedHightlight[nFieldType-1];
+}
+
+void CPDFSDK_InterForm::RemoveAllHighLight()
+{
+ memset((void*)m_bNeedHightlight, 0, 6*sizeof(FX_BOOL));
+}
+void CPDFSDK_InterForm::SetHighlightColor(FX_COLORREF clr, int nFieldType)
+{
+ if(nFieldType <0 || nFieldType > 6) return;
+ switch(nFieldType)
+ {
+ case 0:
+ {
+ for(int i=0; i<6; 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 >6) return FXSYS_RGB(255,255,255);
+ if(nFieldType == 0)
+ return m_aHighlightColor[0];
+ else
+ return m_aHighlightColor[nFieldType-1];
+}
+
+/* ------------------------- CBA_AnnotIterator ------------------------- */
+
+CBA_AnnotIterator::CBA_AnnotIterator(CPDFSDK_PageView* pPageView, const CFX_ByteString& sType, const CFX_ByteString& sSubType)
+ :m_pPageView(pPageView),
+ m_sType(sType),
+ m_sSubType(sSubType),
+ m_nTabs(BAI_STRUCTURE)
+{
+ ASSERT(m_pPageView != NULL);
+
+ CPDF_Page* pPDFPage = m_pPageView->GetPDFPage();
+ ASSERT(pPDFPage != NULL);
+ ASSERT(pPDFPage->m_pFormDict != NULL);
+
+ CFX_ByteString sTabs = pPDFPage->m_pFormDict->GetString("Tabs");
+
+ if (sTabs == "R")
+ {
+ m_nTabs = BAI_ROW;
+ }
+ else if (sTabs == "C")
+ {
+ m_nTabs = BAI_COLUMN;
+ }
+ else
+ {
+ m_nTabs = BAI_STRUCTURE;
+ }
+
+ GenerateResults();
+}
+
+CBA_AnnotIterator::~CBA_AnnotIterator()
+{
+ m_Annots.RemoveAll();
+}
+
+CPDFSDK_Annot* CBA_AnnotIterator::GetFirstAnnot()
+{
+ if (m_Annots.GetSize() > 0)
+ return m_Annots[0];
+
+ return NULL;
+}
+
+CPDFSDK_Annot* CBA_AnnotIterator::GetLastAnnot()
+{
+ if (m_Annots.GetSize() > 0)
+ return m_Annots[m_Annots.GetSize() - 1];
+
+ return NULL;
+}
+
+CPDFSDK_Annot* CBA_AnnotIterator::GetNextAnnot(CPDFSDK_Annot* pAnnot)
+{
+ for (int i=0,sz=m_Annots.GetSize(); i<sz; i++)
+ {
+ if (m_Annots[i] == pAnnot)
+ {
+ if (i+1 < sz)
+ return m_Annots[i+1];
+ else
+ return m_Annots[0];
+ }
+ }
+
+ return NULL;
+}
+
+CPDFSDK_Annot* CBA_AnnotIterator::GetPrevAnnot(CPDFSDK_Annot* pAnnot)
+{
+ for (int i=0,sz=m_Annots.GetSize(); i<sz; i++)
+ {
+ if (m_Annots[i] == pAnnot)
+ {
+ if (i-1 >= 0)
+ return m_Annots[i-1];
+ else
+ return m_Annots[sz-1];
+ }
+ }
+
+ return NULL;
+}
+
+int CBA_AnnotIterator::CompareByLeft(CPDFSDK_Annot* p1, CPDFSDK_Annot* p2)
+{
+ ASSERT(p1 != NULL);
+ ASSERT(p2 != NULL);
+
+ CPDF_Rect rcAnnot1 = GetAnnotRect(p1);
+ CPDF_Rect rcAnnot2 = GetAnnotRect(p2);
+
+ if (rcAnnot1.left < rcAnnot2.left)
+ return -1;
+ if (rcAnnot1.left > rcAnnot2.left)
+ return 1;
+ return 0;
+}
+
+
+int CBA_AnnotIterator::CompareByTop(CPDFSDK_Annot* p1, CPDFSDK_Annot* p2)
+{
+ ASSERT(p1 != NULL);
+ ASSERT(p2 != NULL);
+
+ CPDF_Rect rcAnnot1 = GetAnnotRect(p1);
+ CPDF_Rect rcAnnot2 = GetAnnotRect(p2);
+
+ if (rcAnnot1.top < rcAnnot2.top)
+ return -1;
+ if (rcAnnot1.top > rcAnnot2.top)
+ return 1;
+ return 0;
+}
+
+void CBA_AnnotIterator::GenerateResults()
+{
+ ASSERT(m_pPageView != NULL);
+
+ switch (m_nTabs)
+ {
+ case BAI_STRUCTURE:
+ {
+ for (int i=0,sz=m_pPageView->CountAnnots(); i<sz; i++)
+ {
+ CPDFSDK_Annot* pAnnot = m_pPageView->GetAnnot(i);
+ ASSERT(pAnnot != NULL);
+
+ if (pAnnot->GetType() == m_sType
+ && pAnnot->GetSubType() == m_sSubType)
+ m_Annots.Add(pAnnot);
+ }
+ }
+ break;
+ case BAI_ROW:
+ {
+ CPDFSDK_SortAnnots sa;
+
+ {
+
+ for (int i=0,sz=m_pPageView->CountAnnots(); i<sz; i++)
+ {
+ CPDFSDK_Annot* pAnnot = m_pPageView->GetAnnot(i);
+ ASSERT(pAnnot != NULL);
+
+ if (pAnnot->GetType() == m_sType
+ && pAnnot->GetSubType() == m_sSubType)
+ sa.Add(pAnnot);
+ }
+ }
+
+ if (sa.GetSize() > 0)
+ {
+ sa.Sort(CBA_AnnotIterator::CompareByLeft);
+ }
+
+ while (sa.GetSize() > 0)
+ {
+ int nLeftTopIndex = -1;
+
+ {
+ FX_FLOAT fTop = 0.0f;
+
+ for (int i=sa.GetSize()-1; i>=0; i--)
+ {
+ CPDFSDK_Annot* pAnnot = sa.GetAt(i);
+ ASSERT(pAnnot != NULL);
+
+ CPDF_Rect rcAnnot = GetAnnotRect(pAnnot);
+
+ if (rcAnnot.top > fTop)
+ {
+ nLeftTopIndex = i;
+ fTop = rcAnnot.top;
+ }
+ }
+ }
+
+ if (nLeftTopIndex >= 0)
+ {
+ CPDFSDK_Annot* pLeftTopAnnot = sa.GetAt(nLeftTopIndex);
+ ASSERT(pLeftTopAnnot != NULL);
+
+ CPDF_Rect rcLeftTop = GetAnnotRect(pLeftTopAnnot);
+
+ m_Annots.Add(pLeftTopAnnot);
+ sa.RemoveAt(nLeftTopIndex);
+
+ CFX_ArrayTemplate<int> aSelect;
+
+ {
+ for (int i=0,sz=sa.GetSize(); i<sz; i++)
+ {
+ CPDFSDK_Annot* pAnnot = sa.GetAt(i);
+ ASSERT(pAnnot != NULL);
+
+ CPDF_Rect rcAnnot = GetAnnotRect(pAnnot);
+
+ FX_FLOAT fCenterY = (rcAnnot.top + rcAnnot.bottom) / 2.0f;
+
+ if (fCenterY > rcLeftTop.bottom && fCenterY < rcLeftTop.top)
+ aSelect.Add(i);
+ }
+ }
+
+ {
+ for (int i=0,sz=aSelect.GetSize(); i<sz; i++)
+ {
+ m_Annots.Add(sa[aSelect[i]]);
+ }
+ }
+
+ {
+ for (int i=aSelect.GetSize()-1; i>=0; i--)
+ {
+ sa.RemoveAt(aSelect[i]);
+ }
+ }
+
+ aSelect.RemoveAll();
+ }
+ }
+ sa.RemoveAll();
+ }
+ break;
+ case BAI_COLUMN:
+ {
+ CPDFSDK_SortAnnots sa;
+
+ {
+ for (int i=0,sz=m_pPageView->CountAnnots(); i<sz; i++)
+ {
+ CPDFSDK_Annot* pAnnot = m_pPageView->GetAnnot(i);
+ ASSERT(pAnnot != NULL);
+
+ if (pAnnot->GetType() == m_sType
+ && pAnnot->GetSubType() == m_sSubType)
+ sa.Add(pAnnot);
+ }
+ }
+
+ if (sa.GetSize() > 0)
+ {
+ sa.Sort(CBA_AnnotIterator::CompareByTop, FALSE);
+ }
+
+ while (sa.GetSize() > 0)
+ {
+ int nLeftTopIndex = -1;
+
+ {
+ FX_FLOAT fLeft = -1.0f;
+
+ for (int i=sa.GetSize()-1; i>=0; i--)
+ {
+ CPDFSDK_Annot* pAnnot = sa.GetAt(i);
+ ASSERT(pAnnot != NULL);
+
+ CPDF_Rect rcAnnot = GetAnnotRect(pAnnot);
+
+ 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.GetAt(nLeftTopIndex);
+ ASSERT(pLeftTopAnnot != NULL);
+
+ CPDF_Rect rcLeftTop = GetAnnotRect(pLeftTopAnnot);
+
+ m_Annots.Add(pLeftTopAnnot);
+ sa.RemoveAt(nLeftTopIndex);
+
+ CFX_ArrayTemplate<int> aSelect;
+
+ {
+ for (int i=0,sz=sa.GetSize(); i<sz; i++)
+ {
+ CPDFSDK_Annot* pAnnot = sa.GetAt(i);
+ ASSERT(pAnnot != NULL);
+
+ CPDF_Rect rcAnnot = GetAnnotRect(pAnnot);
+
+ FX_FLOAT fCenterX = (rcAnnot.left + rcAnnot.right) / 2.0f;
+
+ if (fCenterX > rcLeftTop.left && fCenterX < rcLeftTop.right)
+ aSelect.Add(i);
+ }
+ }
+
+ {
+ for (int i=0,sz=aSelect.GetSize(); i<sz; i++)
+ {
+ m_Annots.Add(sa[aSelect[i]]);
+ }
+ }
+
+ {
+ for (int i=aSelect.GetSize()-1; i>=0; i--)
+ {
+ sa.RemoveAt(aSelect[i]);
+ }
+ }
+
+ aSelect.RemoveAll();
+ }
+ }
+ sa.RemoveAll();
+ }
+ break;
+ }
+}
+
+CPDF_Rect CBA_AnnotIterator::GetAnnotRect(CPDFSDK_Annot* pAnnot)
+{
+ ASSERT(pAnnot != NULL);
+
+ CPDF_Annot* pPDFAnnot = pAnnot->GetPDFAnnot();
+ ASSERT(pPDFAnnot != NULL);
+
+ CPDF_Rect rcAnnot;
+ pPDFAnnot->GetRect(rcAnnot);
+
+ return rcAnnot;
+}
+
diff --git a/fpdfsdk/src/fsdk_mgr.cpp b/fpdfsdk/src/fsdk_mgr.cpp new file mode 100644 index 0000000000..9a11927fab --- /dev/null +++ b/fpdfsdk/src/fsdk_mgr.cpp @@ -0,0 +1,1055 @@ +// 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 "../include/fsdk_define.h"
+#include "../include/fsdk_mgr.h"
+#include "../include/fpdf_ext.h"
+#include "../include/formfiller/FFL_FormFiller.h"
+#include "../include/javascript/IJavaScript.h"
+
+#if _FX_OS_ == _FX_ANDROID_
+#include "time.h"
+#else
+#include <ctime>
+#endif
+
+//extern CPDFDoc_Environment* g_pFormFillApp;
+class CFX_SystemHandler:public IFX_SystemHandler
+{
+public:
+ CFX_SystemHandler(CPDFDoc_Environment* pEnv):m_pEnv(pEnv),m_nCharSet(-1) {}
+public:
+ virtual void InvalidateRect(FX_HWND hWnd, FX_RECT rect) ;
+ virtual void OutputSelectedRect(void* pFormFiller, CPDF_Rect& rect);
+
+ virtual FX_BOOL IsSelectionImplemented();
+
+ virtual CFX_WideString GetClipboardText(FX_HWND hWnd){return L"";}
+ virtual FX_BOOL SetClipboardText(FX_HWND hWnd, CFX_WideString string) {return FALSE;}
+
+ virtual void ClientToScreen(FX_HWND hWnd, FX_INT32& x, FX_INT32& y) {}
+ virtual void ScreenToClient(FX_HWND hWnd, FX_INT32& x, FX_INT32& y) {}
+
+ /*cursor style
+ FXCT_ARROW
+ FXCT_NESW
+ FXCT_NWSE
+ FXCT_VBEAM
+ FXCT_HBEAM
+ FXCT_HAND
+ */
+ virtual void SetCursor(FX_INT32 nCursorType);
+
+ virtual FX_HMENU CreatePopupMenu() {return NULL;}
+ virtual FX_BOOL AppendMenuItem(FX_HMENU hMenu, FX_INT32 nIDNewItem, CFX_WideString string) {return FALSE;}
+ virtual FX_BOOL EnableMenuItem(FX_HMENU hMenu, FX_INT32 nIDItem, FX_BOOL bEnabled) {return FALSE;}
+ virtual FX_INT32 TrackPopupMenu(FX_HMENU hMenu, FX_INT32 x, FX_INT32 y, FX_HWND hParent) {return -1;}
+ virtual void DestroyMenu(FX_HMENU hMenu) {}
+
+ virtual CFX_ByteString GetNativeTrueTypeFont(FX_INT32 nCharset);
+ virtual FX_BOOL FindNativeTrueTypeFont(FX_INT32 nCharset, CFX_ByteString sFontFaceName);
+ virtual CPDF_Font* AddNativeTrueTypeFontToPDF(CPDF_Document* pDoc, CFX_ByteString sFontFaceName, FX_BYTE nCharset);
+
+ virtual FX_INT32 SetTimer(FX_INT32 uElapse, TimerCallback lpTimerFunc) ;
+ virtual void KillTimer(FX_INT32 nID) ;
+
+
+ virtual FX_BOOL IsSHIFTKeyDown(FX_DWORD nFlag) {return m_pEnv->FFI_IsSHIFTKeyDown(nFlag);}
+ virtual FX_BOOL IsCTRLKeyDown(FX_DWORD nFlag) {return m_pEnv->FFI_IsCTRLKeyDown(nFlag);}
+ virtual FX_BOOL IsALTKeyDown(FX_DWORD nFlag) {return m_pEnv->FFI_IsALTKeyDown(nFlag);}
+ virtual FX_BOOL IsINSERTKeyDown(FX_DWORD nFlag) {return m_pEnv->FFI_IsINSERTKeyDown(nFlag);}
+
+ virtual FX_SYSTEMTIME GetLocalTime();
+
+ virtual FX_INT32 GetCharSet() {return m_nCharSet;}
+ virtual void SetCharSet(FX_INT32 nCharSet) {m_nCharSet = nCharSet;}
+private:
+ CPDFDoc_Environment* m_pEnv;
+ int m_nCharSet;
+};
+
+void CFX_SystemHandler::SetCursor(FX_INT32 nCursorType)
+{
+
+ m_pEnv->FFI_SetCursor(nCursorType);
+}
+
+void CFX_SystemHandler::InvalidateRect(FX_HWND hWnd, FX_RECT rect)
+{
+ //g_pFormFillApp->FFI_Invalidate();
+ CPDFSDK_Annot* pSDKAnnot = (CPDFSDK_Annot*)hWnd;
+ CPDF_Page* pPage = NULL;
+ CPDFSDK_PageView* pPageView = NULL;
+ pPageView = pSDKAnnot->GetPageView();
+ pPage = pSDKAnnot->GetPDFPage();
+ if(!pPage || !pPageView)
+ return;
+ CPDF_Matrix page2device;
+ pPageView->GetCurrentMatrix(page2device);
+ CPDF_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);
+// m_pEnv->FFI_DeviceToPage(pPage, rect.left, rect.top, (double*)&left, (double*)&top);
+// m_pEnv->FFI_DeviceToPage(pPage, rect.right, rect.bottom, (double*)&right, (double*)&bottom);
+ CPDF_Rect 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, CPDF_Rect& rect)
+{
+ CFFL_FormFiller* pFFL = (CFFL_FormFiller*)pFormFiller;
+ if(pFFL)
+ {
+ CPDF_Point leftbottom = CPDF_Point(rect.left, rect.bottom);
+ CPDF_Point righttop = CPDF_Point(rect.right, rect.top);
+ CPDF_Point ptA = pFFL->PWLtoFFL(leftbottom);
+ CPDF_Point ptB = pFFL->PWLtoFFL(righttop);
+
+
+ CPDFSDK_Annot* pAnnot = pFFL->GetSDKAnnot();
+ ASSERT(pAnnot);
+ CPDF_Page* pPage = pAnnot->GetPDFPage();
+ 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(FX_INT32 nCharset)
+{
+ return "";
+}
+
+FX_BOOL CFX_SystemHandler::FindNativeTrueTypeFont(FX_INT32 nCharset, CFX_ByteString sFontFaceName)
+{
+ CFX_FontMgr* pFontMgr = CFX_GEModule::Get()->GetFontMgr();
+// FXFT_Face nFace = pFontMgr->FindSubstFont(sFontFaceName,TRUE,0,0,0,0,NULL);
+// FXFT_Face nFace = pFontMgr->m_pBuiltinMapper->FindSubstFont(sFontFaceName,TRUE,0,0,0,0,NULL);
+
+ if(pFontMgr)
+ {
+ CFX_FontMapper* pFontMapper = pFontMgr->m_pBuiltinMapper;
+ if(pFontMapper)
+ {
+ int nSize = pFontMapper->m_InstalledTTFonts.GetSize();
+ if(nSize ==0)
+ {
+ pFontMapper->LoadInstalledFonts();
+ nSize = pFontMapper->m_InstalledTTFonts.GetSize();
+ }
+
+ for(int i=0; i<nSize; i++)
+ {
+ if(pFontMapper->m_InstalledTTFonts[i].Compare(sFontFaceName))
+ return TRUE;
+ }
+ }
+
+ }
+
+ return FALSE;
+// pFontMgr->m_FaceMap.Lookup(sFontFaceName,pFont);
+// return (pFont!=NULL);
+}
+
+static int CharSet2CP(int charset)
+{
+ if(charset == 128)
+ return 932;
+ else if(charset == 134)
+ return 936;
+ else if(charset == 129)
+ return 949;
+ else if(charset == 136)
+ return 950;
+ return 0;
+}
+CPDF_Font* CFX_SystemHandler::AddNativeTrueTypeFontToPDF(CPDF_Document* pDoc, CFX_ByteString sFontFaceName,
+ FX_BYTE 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;
+}
+
+
+FX_INT32 CFX_SystemHandler::SetTimer(FX_INT32 uElapse, TimerCallback lpTimerFunc)
+{
+ return m_pEnv->FFI_SetTimer(uElapse, lpTimerFunc);
+}
+void CFX_SystemHandler::KillTimer(FX_INT32 nID)
+{
+ m_pEnv->FFI_KillTimer(nID);
+}
+
+FX_SYSTEMTIME CFX_SystemHandler::GetLocalTime()
+{
+ return m_pEnv->FFI_GetLocalTime();
+}
+
+
+CJS_RuntimeFactory* GetJSRuntimeFactory()
+{
+ static CJS_RuntimeFactory s_JSRuntimeFactory;
+ return &s_JSRuntimeFactory;
+}
+
+CPDFDoc_Environment::CPDFDoc_Environment(CPDF_Document * pDoc):m_pInfo(NULL),m_pIFormFiller(NULL),
+ m_pAnnotHandlerMgr(NULL),m_pActionHandler(NULL),m_pJSRuntime(NULL),
+ m_pSDKDoc(NULL), m_pPDFDoc(pDoc)
+{
+
+ m_pSysHandler = NULL;
+ m_pSysHandler = new CFX_SystemHandler(this);
+
+
+ m_pJSRuntimeFactory = NULL;
+ m_pJSRuntimeFactory = GetJSRuntimeFactory();
+ m_pJSRuntimeFactory->AddRef();
+}
+
+CPDFDoc_Environment::~CPDFDoc_Environment()
+{
+
+ if ( m_pIFormFiller )
+ {
+ delete m_pIFormFiller;
+ m_pIFormFiller = NULL;
+ }
+ if(m_pJSRuntime && m_pJSRuntimeFactory)
+ m_pJSRuntimeFactory->DeleteJSRuntime(m_pJSRuntime);
+ m_pJSRuntimeFactory->Release();
+
+ if(m_pSysHandler)
+ {
+ delete m_pSysHandler;
+ m_pSysHandler = NULL;
+ }
+
+ if(m_pAnnotHandlerMgr)
+ {
+ delete m_pAnnotHandlerMgr;
+ m_pAnnotHandlerMgr = NULL;
+ }
+ if(m_pActionHandler)
+ {
+ delete m_pActionHandler;
+ m_pActionHandler = NULL;
+ }
+
+
+}
+
+
+IFXJS_Runtime* CPDFDoc_Environment::GetJSRuntime()
+{
+ if(!IsJSInitiated())
+ return NULL;
+ assert(m_pJSRuntimeFactory);
+ if(!m_pJSRuntime)
+ m_pJSRuntime = m_pJSRuntimeFactory->NewJSRuntime(this);
+ return m_pJSRuntime;
+}
+
+CPDFSDK_AnnotHandlerMgr* CPDFDoc_Environment::GetAnnotHandlerMgr()
+{
+ if(!m_pAnnotHandlerMgr)
+ m_pAnnotHandlerMgr = new CPDFSDK_AnnotHandlerMgr(this);
+ return m_pAnnotHandlerMgr;
+}
+
+CPDFSDK_ActionHandler* CPDFDoc_Environment::GetActionHander()
+{
+ if(!m_pActionHandler)
+ m_pActionHandler = new CPDFSDK_ActionHandler(this);
+ return m_pActionHandler;
+}
+
+int CPDFDoc_Environment::RegAppHandle(FPDF_FORMFILLINFO* pFFinfo)
+{
+ m_pInfo = pFFinfo;
+ return TRUE;
+}
+
+CPDFSDK_Document* CPDFDoc_Environment::GetCurrentDoc()
+{
+ return m_pSDKDoc;
+}
+
+CFFL_IFormFiller* CPDFDoc_Environment::GetIFormFiller()
+{
+ if(!m_pIFormFiller)
+ m_pIFormFiller = new CFFL_IFormFiller(this);
+ return m_pIFormFiller;
+}
+
+FX_BOOL CPDFDoc_Environment::IsJSInitiated()
+{
+ if(m_pInfo)
+ {
+ if(m_pInfo->m_pJsPlatform)
+ return TRUE;
+ else
+ return FALSE;
+ }
+ return FALSE;
+}
+
+CPDFSDK_Document::CPDFSDK_Document(CPDF_Document* pDoc,CPDFDoc_Environment* pEnv):m_pDoc(pDoc),
+ m_pInterForm(NULL),m_pEnv(pEnv),m_pOccontent(NULL),m_bChangeMask(FALSE)
+{
+ m_pFocusAnnot = NULL;
+}
+
+CPDFSDK_Document::~CPDFSDK_Document()
+{
+ m_pageMap.RemoveAll();
+ if(m_pInterForm)
+ {
+ m_pInterForm->Destroy();
+ m_pInterForm = NULL;
+ }
+ if(m_pOccontent)
+ {
+ delete m_pOccontent;
+ m_pOccontent = NULL;
+ }
+}
+
+void CPDFSDK_Document::InitPageView()
+{
+ int nCount = m_pDoc->GetPageCount();
+ for(int i=0; i<nCount; i++)
+ {
+ // To do
+// CPDF_Dictionary* pDic = m_pDoc->GetPage(i);
+// m_pageMap.SetAt(pDic, pPageView);
+ }
+}
+
+void CPDFSDK_Document::AddPageView(CPDF_Page* pPDFPage, CPDFSDK_PageView* pPageView)
+{
+ m_pageMap.SetAt(pPDFPage, pPageView);
+}
+
+CPDFSDK_PageView* CPDFSDK_Document::GetPageView(CPDF_Page* pPDFPage, FX_BOOL ReNew)
+{
+ CPDFSDK_PageView* pPageView = (CPDFSDK_PageView*)m_pageMap.GetValueAt(pPDFPage);
+ if(pPageView != NULL)
+ return pPageView;
+ if(ReNew)
+ {
+ pPageView = new CPDFSDK_PageView(this,pPDFPage);
+ m_pageMap.SetAt(pPDFPage, pPageView);
+ //Delay to load all the annotations, to avoid endless loop.
+ pPageView->LoadFXAnnots();
+ }
+ return pPageView;
+
+}
+
+CPDFSDK_PageView* CPDFSDK_Document::GetCurrentView()
+{
+ CPDF_Page * pPage = (CPDF_Page *)m_pEnv->FFI_GetCurrentPage(m_pDoc);
+ if(pPage)
+ return this->GetPageView(pPage, TRUE);
+ return NULL;
+}
+
+CPDFSDK_PageView* CPDFSDK_Document::GetPageView(int nIndex)
+{
+ CPDFSDK_PageView * pTempPageView = NULL;
+ CPDF_Page * pTempPage = (CPDF_Page*)m_pEnv->FFI_GetPage(m_pDoc,nIndex);
+ if(!pTempPage)
+ return NULL;
+
+ m_pageMap.Lookup(pTempPage, pTempPageView);
+
+ ASSERT(pTempPageView != NULL);
+
+ return pTempPageView;
+}
+
+void CPDFSDK_Document:: ProcJavascriptFun()
+{
+ CPDF_Document* pPDFDoc = this->GetDocument();
+ 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 = m_pDoc->GetRoot();
+ if (!pRoot) return FALSE;
+ CPDF_Object* pOpenAction = pRoot->GetDict("OpenAction");//
+ if(!pOpenAction) pOpenAction = pRoot->GetArray("OpenAction");//
+ if(!pOpenAction) return FALSE;
+
+ if(pOpenAction->GetType()==PDFOBJ_ARRAY)
+ {
+ }
+ else if(pOpenAction->GetType()==PDFOBJ_DICTIONARY)
+ {
+ CPDF_Dictionary * pDict=(CPDF_Dictionary*)pOpenAction;
+ CPDF_Action Action = pDict;
+
+ if(m_pEnv->GetActionHander())
+ m_pEnv->GetActionHander()->DoAction_DocOpen(Action,this);
+ }
+ else
+ {
+ return FALSE;
+ }
+ return TRUE;
+}
+
+CPDF_OCContext* CPDFSDK_Document::GetOCContext()
+{
+ if(!m_pOccontent)
+ m_pOccontent = new CPDF_OCContext(m_pDoc);
+ return m_pOccontent;
+}
+
+void CPDFSDK_Document::ReMovePageView(CPDF_Page* pPDFPage)
+{
+ CPDFSDK_PageView* pPageView = (CPDFSDK_PageView*)m_pageMap.GetValueAt(pPDFPage);
+ if(pPageView)
+ {
+ delete pPageView;
+ m_pageMap.RemoveKey(pPDFPage);
+ }
+}
+
+CPDF_Page * CPDFSDK_Document::GetPage(int nIndex)
+{
+ CPDF_Page * pTempPage = (CPDF_Page*)m_pEnv->FFI_GetPage(m_pDoc,nIndex);
+ if(!pTempPage)
+ return NULL;
+ return pTempPage;
+}
+
+CPDFSDK_InterForm* CPDFSDK_Document::GetInterForm()
+{
+ if(!m_pInterForm)
+ m_pInterForm = new CPDFSDK_InterForm(this);
+ return m_pInterForm;
+}
+
+void CPDFSDK_Document::UpdateAllViews(CPDFSDK_PageView* pSender, CPDFSDK_Annot* pAnnot)
+{
+
+ FX_POSITION pos = m_pageMap.GetStartPosition();
+ CPDF_Page * pPage = NULL;
+ CPDFSDK_PageView * pPageView = NULL;
+ while(pos)
+ {
+ m_pageMap.GetNextAssoc(pos, pPage, pPageView);
+
+ if(pPageView != pSender)
+ {
+ pPageView->UpdateView(pAnnot);
+ }
+ }
+}
+
+CPDFSDK_Annot* CPDFSDK_Document::GetFocusAnnot()
+{
+ return this->m_pFocusAnnot;
+}
+
+FX_BOOL CPDFSDK_Document::SetFocusAnnot(CPDFSDK_Annot* pAnnot,FX_UINT nFlag)
+{
+
+ if(m_pFocusAnnot==pAnnot) return TRUE;
+
+ if(m_pFocusAnnot)
+ {
+ if(!this->KillFocusAnnot(nFlag) ) return FALSE;
+ }
+ CPDFSDK_PageView* pPageView = pAnnot->GetPageView();
+ if(pAnnot && pPageView->IsValid())
+ {
+ CPDFSDK_AnnotHandlerMgr *pAnnotHandler=m_pEnv->GetAnnotHandlerMgr();
+
+ if(pAnnotHandler&&!m_pFocusAnnot)
+ {
+ if (!pAnnotHandler->Annot_OnSetFocus(pAnnot,nFlag))
+ return FALSE;
+ if(!m_pFocusAnnot)
+ {
+ this->m_pFocusAnnot=pAnnot;
+ return TRUE;
+ }
+ }
+ }
+ return FALSE;
+}
+
+FX_BOOL CPDFSDK_Document::KillFocusAnnot(FX_UINT nFlag)
+{
+ if(m_pFocusAnnot)
+ {
+ CPDFSDK_AnnotHandlerMgr *pAnnotHandler=m_pEnv->GetAnnotHandlerMgr();
+ if(pAnnotHandler)
+ {
+ CPDFSDK_Annot* pFocusAnnot = m_pFocusAnnot;
+ m_pFocusAnnot = NULL;
+ if(pAnnotHandler->Annot_OnKillFocus(pFocusAnnot, nFlag))
+ {
+
+ if(pFocusAnnot->GetType() == FX_BSTRC("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;
+}
+
+FX_BOOL CPDFSDK_Document::DeletePages(int nStart, int nCount)
+{
+ if ( nStart < 0 || nStart >= GetPageCount() || nCount <= 0 )
+ {
+ return FALSE;
+ }
+
+ CPDF_Page * pTempPage = NULL;
+ for ( int i = nCount-1; i >= 0; i-- )
+ {
+ pTempPage = GetPage(nStart+i);
+ if ( pTempPage != NULL )
+ {
+ ReMovePageView(pTempPage);
+ }
+ }
+ return TRUE;
+}
+
+void CPDFSDK_Document::OnCloseDocument()
+{
+ KillFocusAnnot();
+}
+
+FX_BOOL CPDFSDK_Document::GetPermissions(int nFlag)
+{
+ FX_DWORD dwPermissions = m_pDoc->GetUserPermissions();
+ return dwPermissions&nFlag;
+}
+
+IFXJS_Runtime * CPDFSDK_Document::GetJsRuntime()
+{
+ ASSERT(m_pEnv!=NULL);
+ return m_pEnv->GetJSRuntime();
+}
+
+CFX_WideString CPDFSDK_Document::GetPath()
+{
+ ASSERT(m_pEnv != NULL);
+ return m_pEnv->JS_docGetFilePath();
+}
+
+
+CPDFSDK_PageView::CPDFSDK_PageView(CPDFSDK_Document* pSDKDoc,CPDF_Page* page):m_pSDKDoc(pSDKDoc),m_page(page)
+{
+ CPDFSDK_InterForm* pInterForm = pSDKDoc->GetInterForm();
+ if(pInterForm)
+ {
+ CPDF_InterForm* pPDFInterForm = pInterForm->GetInterForm();
+ pPDFInterForm->FixPageFields(page);
+ }
+
+ m_fxAnnotArray.RemoveAll();
+
+ m_bEnterWidget = FALSE;
+ m_bExitWidget = FALSE;
+ m_bOnWidget = FALSE;
+ m_CaptureWidget = NULL;
+ m_bValid = FALSE;
+}
+
+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);
+ //if there is a focused annot on the page, we should kill the focus first.
+ if(pAnnot == m_pSDKDoc->GetFocusAnnot())
+ KillFocusAnnot();
+ CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
+ ASSERT(pAnnotHandlerMgr);
+ pAnnotHandlerMgr->ReleaseAnnot(pAnnot);
+ }
+ m_fxAnnotArray.RemoveAll();
+ if(m_pAnnotList)
+ {
+ delete m_pAnnotList;
+ m_pAnnotList = NULL;
+ }
+}
+
+void CPDFSDK_PageView::PageView_OnDraw(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,CPDF_RenderOptions* pOptions)
+{
+ m_curMatrix = *pUser2Device;
+
+ // m_pAnnotList->DisplayAnnots(m_page, pDevice, pUser2Device, FALSE, pOptions);
+ CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+ CPDFSDK_AnnotIterator annotIterator(this, TRUE);
+ CPDFSDK_Annot * pSDKAnnot=NULL;
+ int index=-1;
+ while((pSDKAnnot = annotIterator.Next(index)))
+ {
+ CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
+ ASSERT(pAnnotHandlerMgr);
+ pAnnotHandlerMgr->Annot_OnDraw(this, pSDKAnnot, pDevice, pUser2Device, 0);
+ }
+
+}
+
+CPDF_Annot* CPDFSDK_PageView::GetPDFAnnotAtPoint(FX_FLOAT pageX, FX_FLOAT pageY)
+{
+
+ int nCount = m_pAnnotList->Count();
+ for(int i = 0 ; i<nCount; i++)
+ {
+ CPDF_Annot* pAnnot = m_pAnnotList->GetAt(i);
+ CFX_FloatRect annotRect;
+ pAnnot->GetRect(annotRect);
+ if(annotRect.Contains(pageX, pageY))
+ return pAnnot;
+ }
+ return NULL;
+}
+
+CPDF_Annot* CPDFSDK_PageView::GetPDFWidgetAtPoint(FX_FLOAT pageX, FX_FLOAT pageY)
+{
+
+ int nCount = m_pAnnotList->Count();
+ for(int i = 0 ; i<nCount; i++)
+ {
+ CPDF_Annot* pAnnot = m_pAnnotList->GetAt(i);
+ if(pAnnot->GetSubType() == "Widget")
+ {
+ CFX_FloatRect annotRect;
+ pAnnot->GetRect(annotRect);
+ if(annotRect.Contains(pageX, pageY))
+ return pAnnot;
+ }
+ }
+ return NULL;
+}
+
+CPDFSDK_Annot* CPDFSDK_PageView::GetFXAnnotAtPoint(FX_FLOAT pageX, FX_FLOAT pageY)
+{
+
+ CPDFSDK_AnnotIterator annotIterator(this, FALSE);
+ CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+ CPDFSDK_AnnotHandlerMgr* pAnnotMgr = pEnv->GetAnnotHandlerMgr();
+ CPDFSDK_Annot* pSDKAnnot = NULL;
+ int index = -1;
+ while((pSDKAnnot = annotIterator.Next(index)))
+ {
+ CPDF_Rect rc = pAnnotMgr->Annot_OnGetViewBBox(this, pSDKAnnot);
+ if(rc.Contains(pageX, pageY))
+ return pSDKAnnot;
+ }
+
+ return NULL;
+}
+
+CPDFSDK_Annot* CPDFSDK_PageView::GetFXWidgetAtPoint(FX_FLOAT pageX, FX_FLOAT pageY)
+{
+
+ CPDFSDK_AnnotIterator annotIterator(this, FALSE);
+ CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+ CPDFSDK_AnnotHandlerMgr* pAnnotMgr = pEnv->GetAnnotHandlerMgr();
+ CPDFSDK_Annot* pSDKAnnot = NULL;
+ int index = -1;
+ while((pSDKAnnot = annotIterator.Next(index)))
+ {
+ if(pSDKAnnot->GetType() == "Widget")
+ {
+ pAnnotMgr->Annot_OnGetViewBBox(this, pSDKAnnot);
+ CPDF_Point point(pageX, pageY);
+ if (pAnnotMgr->Annot_OnHitTest(this, pSDKAnnot, point))
+// if(rc.Contains(pageX, pageY))
+ return pSDKAnnot;
+ }
+ }
+
+ return NULL;
+}
+
+
+FX_BOOL CPDFSDK_PageView::Annot_HasAppearance(CPDF_Annot* pAnnot)
+{
+ CPDF_Dictionary* pAnnotDic = pAnnot->m_pAnnotDict;
+ 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 =NULL;
+
+ if(pAnnotHandler)
+ {
+ pSDKAnnot = pAnnotHandler->NewAnnot(pPDFAnnot, this);
+ }
+ if(!pSDKAnnot)
+ return NULL;
+
+ m_fxAnnotArray.Add(pSDKAnnot);
+
+ if(pAnnotHandler)
+ {
+ pAnnotHandler->Annot_OnCreate(pSDKAnnot);
+
+ }
+
+ return pSDKAnnot;
+}
+
+CPDFSDK_Annot* CPDFSDK_PageView::AddAnnot(CPDF_Dictionary * pDict)
+{
+ if(pDict)
+ return this->AddAnnot(pDict->GetString("Subtype"),pDict);
+ return NULL;
+}
+
+CPDFSDK_Annot* CPDFSDK_PageView::AddAnnot(FX_LPCSTR lpSubType,CPDF_Dictionary * pDict)
+{
+ return NULL;
+}
+
+FX_BOOL CPDFSDK_PageView::DeleteAnnot(CPDFSDK_Annot* pAnnot)
+{
+ return FALSE;
+}
+
+CPDF_Document* CPDFSDK_PageView::GetPDFDocument()
+{
+ if(m_page)
+ {
+ return m_page->m_pDocument;
+ }
+ return NULL;
+}
+
+int CPDFSDK_PageView::CountAnnots()
+{
+ return m_pAnnotList->Count();
+}
+
+CPDFSDK_Annot* CPDFSDK_PageView::GetAnnot(int nIndex)
+{
+ int nCount = m_fxAnnotArray.GetSize();
+ if ( nIndex < 0 || nIndex >= nCount )
+ {
+ return NULL;
+ }
+
+ return (CPDFSDK_Annot*)m_fxAnnotArray.GetAt(nIndex);
+}
+
+CPDFSDK_Annot* CPDFSDK_PageView::GetAnnotByDict(CPDF_Dictionary * pDict)
+{
+ int nCount = m_fxAnnotArray.GetSize();
+ for(int i=0; i<nCount; i++)
+ {
+ CPDFSDK_Annot* pAnnot = (CPDFSDK_Annot*)m_fxAnnotArray.GetAt(i);
+ if(pDict==pAnnot->GetPDFAnnot()->m_pAnnotDict)
+ return pAnnot;
+ }
+ return NULL;
+}
+
+FX_BOOL CPDFSDK_PageView::OnLButtonDown(const CPDF_Point & point, FX_UINT nFlag)
+{
+ CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+ ASSERT(pEnv);
+ CPDFSDK_Annot* pFXAnnot = GetFXWidgetAtPoint(point.x, point.y);
+ if(!pFXAnnot)
+ {
+ KillFocusAnnot(nFlag);
+ }
+ else
+ {
+ CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
+ ASSERT(pAnnotHandlerMgr);
+
+ FX_BOOL bRet = pAnnotHandlerMgr->Annot_OnLButtonDown(this, pFXAnnot, nFlag,point);
+ if(bRet)
+ {
+ SetFocusAnnot(pFXAnnot);
+ }
+ return bRet;
+ }
+ return FALSE;
+}
+
+
+FX_BOOL CPDFSDK_PageView::OnLButtonUp(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);
+ 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;
+ }
+ return bRet;
+}
+
+FX_BOOL CPDFSDK_PageView::OnMouseMove(const CPDF_Point & point, int nFlag)
+{
+
+ CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+ CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
+ ASSERT(pAnnotHandlerMgr);
+ 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;
+ }
+ else
+ {
+ 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;
+ }
+
+ return FALSE;;
+}
+
+FX_BOOL CPDFSDK_PageView::OnMouseWheel(double deltaX, double deltaY,const CPDF_Point& point, int nFlag)
+{
+ if(CPDFSDK_Annot* pAnnot = GetFXWidgetAtPoint(point.x, point.y))
+ {
+ CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+ CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
+ ASSERT(pAnnotHandlerMgr);
+ 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();
+ ASSERT(pAnnotHandlerMgr);
+ 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();
+ ASSERT(pAnnotHandlerMgr);
+ return pAnnotHandlerMgr->Annot_OnKeyDown(pAnnot, nKeyCode, nFlag);
+ }
+ return FALSE;
+}
+
+FX_BOOL CPDFSDK_PageView::OnKeyUp(int nKeyCode, int nFlag)
+{
+// if(CPDFSDK_Annot* pAnnot = GetFocusAnnot())
+// {
+// CFFL_IFormFiller* pIFormFiller = g_pFormFillApp->GetIFormFiller();
+// return pIFormFiller->OnKeyUp(pAnnot, nKeyCode, nFlag);
+// }
+ return FALSE;
+}
+
+extern void CheckUnSupportAnnot(CPDF_Document * pDoc, CPDF_Annot* pPDFAnnot);
+
+void CPDFSDK_PageView::LoadFXAnnots()
+{
+ CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+
+ 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();
+ for(int i=0; i<nCount; i++)
+ {
+ CPDF_Annot* pPDFAnnot = m_pAnnotList->GetAt(i);
+ CPDF_Document * pDoc = this->GetPDFDocument();
+
+ CheckUnSupportAnnot(pDoc, pPDFAnnot);
+
+ CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
+ ASSERT(pAnnotHandlerMgr != NULL);
+ if(pAnnotHandlerMgr)
+ {
+ CPDFSDK_Annot* pAnnot = pAnnotHandlerMgr->NewAnnot(pPDFAnnot, this);
+ if(!pAnnot)
+ continue;
+ m_fxAnnotArray.Add(pAnnot);
+
+ pAnnotHandlerMgr->Annot_OnLoad(pAnnot);
+ }
+
+ }
+}
+
+void CPDFSDK_PageView::UpdateRects(CFX_RectArray& rects)
+{
+ for(int i=0; i<rects.GetSize(); i++)
+ {
+ CPDF_Rect 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)
+{
+ CPDF_Rect rcWindow;
+
+ CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+// CPDFSDK_AnnotHandlerMgr* pAnnotHandler = pEnv->GetAnnotHandlerMgr();
+
+ rcWindow = pAnnot->GetRect();//pAnnotHandler->Annot_OnGetViewBBox(this,pAnnot);
+ pEnv->FFI_Invalidate(m_page, rcWindow.left, rcWindow.top, rcWindow.right, rcWindow.bottom);
+
+}
+
+int CPDFSDK_PageView::GetPageIndex()
+{
+ if(m_page)
+ {
+ CPDF_Dictionary* pDic = m_page->m_pFormDict;
+ CPDF_Document* pDoc = m_pSDKDoc->GetDocument();
+ if(pDoc && pDic)
+ {
+ return pDoc->GetPageIndex(pDic->GetObjNum());
+ }
+ }
+ return -1;
+}
+
+FX_BOOL CPDFSDK_PageView::IsValidAnnot(FX_LPVOID p)
+{
+ if (p == NULL) return FALSE;
+ int iCount = m_pAnnotList->Count();
+ for (int i = 0; i < iCount; i++)
+ {
+ if (m_pAnnotList->GetAt(i) == p)
+ return TRUE;
+ }
+ return FALSE;
+}
+
+
+CPDFSDK_Annot* CPDFSDK_PageView::GetFocusAnnot()
+{
+ CPDFSDK_Annot* pFocusAnnot = m_pSDKDoc->GetFocusAnnot();
+ if(!pFocusAnnot)
+ return NULL;
+
+ for(int i=0; i<m_fxAnnotArray.GetSize(); i++)
+ {
+ CPDFSDK_Annot* pAnnot = (CPDFSDK_Annot*)m_fxAnnotArray.GetAt(i);
+ if(pAnnot == pFocusAnnot)
+ return pAnnot;
+ }
+ return NULL;
+}
+
diff --git a/fpdfsdk/src/fsdk_rendercontext.cpp b/fpdfsdk/src/fsdk_rendercontext.cpp new file mode 100644 index 0000000000..55382e160e --- /dev/null +++ b/fpdfsdk/src/fsdk_rendercontext.cpp @@ -0,0 +1,49 @@ +// 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 "../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()
+{
+ if (m_pRenderer) delete m_pRenderer;
+ if (m_pContext) delete m_pContext;
+ if (m_pDevice) delete m_pDevice;
+ if (m_pAnnots) delete m_pAnnots;
+ if (m_pOptions->m_pOCContext) delete m_pOptions->m_pOCContext;
+ if (m_pOptions) delete m_pOptions;
+#ifdef _WIN32_WCE
+ if (m_pBitmap) delete m_pBitmap;
+ if (m_hBitmap) DeleteObject(m_hBitmap);
+#endif
+}
+
+IFSDK_PAUSE_Adapter::IFSDK_PAUSE_Adapter(IFSDK_PAUSE* IPause )
+{
+ m_IPause = IPause;
+}
+
+FX_BOOL IFSDK_PAUSE_Adapter::NeedToPauseNow()
+{
+ if (m_IPause->NeedToPauseNow)
+ {
+ return m_IPause->NeedToPauseNow(m_IPause);
+ }else{
+ return FALSE;
+ }
+}
diff --git a/fpdfsdk/src/fxedit/fxet_ap.cpp b/fpdfsdk/src/fxedit/fxet_ap.cpp new file mode 100644 index 0000000000..9730d37a45 --- /dev/null +++ b/fpdfsdk/src/fxedit/fxet_ap.cpp @@ -0,0 +1,225 @@ +// 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 "../../include/fxedit/fxet_stub.h"
+#include "../../include/fxedit/fx_edit.h"
+#include "../../include/fxedit/fxet_edit.h"
+
+CFX_ByteString GetPDFWordString(IFX_Edit_FontMap * pFontMap, FX_INT32 nFontIndex, FX_WORD Word, FX_WORD SubWord)
+{
+ ASSERT (pFontMap != NULL);
+
+ 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, FX_INT32 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 CPDF_Point & ptOffset,
+ const CPVT_WordRange * pRange /* = NULL*/, FX_BOOL bContinuous/* = TRUE*/, FX_WORD SubWord/* = 0*/)
+{
+ CFX_ByteTextBuf sEditStream, sWords;
+
+ CPDF_Point ptOld(0.0f,0.0f),ptNew(0.0f,0.0f);
+ FX_INT32 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 = CPDF_Point(word.ptWord.x + ptOffset.x, word.ptWord.y + ptOffset.y);
+ }
+ else
+ {
+ CPVT_Line line;
+ pIterator->GetLine(line);
+ ptNew = CPDF_Point(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 = CPDF_Point(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)
+ {
+ FX_INT32 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 CPDF_Point & ptOffset,
+ const CPVT_WordRange * pRange /*= NULL*/)
+{
+ 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))
+ {
+ //CPDF_Rect rcWordSel = CPDF_Rect(word.ptWord.x,line.ptLine.y + line.fLineDescent,
+ // word.ptWord.x+word.fWidth,line.ptLine.y + line.fLineAscent);
+
+ 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 new file mode 100644 index 0000000000..5a6d4d804e --- /dev/null +++ b/fpdfsdk/src/fxedit/fxet_edit.cpp @@ -0,0 +1,3610 @@ +// 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 "../../include/fxedit/fxet_stub.h"
+#include "../../include/fxedit/fxet_edit.h"
+
+#define FX_EDIT_UNDO_MAXITEM 10000
+
+/* ---------------------------- CFX_Edit_Iterator ---------------------------- */
+
+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()
+{
+ ASSERT(m_pVTIterator != NULL);
+
+ return m_pVTIterator->NextWord();
+}
+
+FX_BOOL CFX_Edit_Iterator::NextLine()
+{
+ ASSERT(m_pVTIterator != NULL);
+
+ return m_pVTIterator->NextLine();
+}
+
+FX_BOOL CFX_Edit_Iterator::NextSection()
+{
+ ASSERT(m_pVTIterator != NULL);
+
+ return m_pVTIterator->NextSection();
+}
+
+FX_BOOL CFX_Edit_Iterator::PrevWord()
+{
+ ASSERT(m_pVTIterator != NULL);
+
+ return m_pVTIterator->PrevWord();
+}
+
+FX_BOOL CFX_Edit_Iterator::PrevLine()
+{
+ ASSERT(m_pVTIterator != NULL);
+
+ return m_pVTIterator->PrevLine();
+}
+
+FX_BOOL CFX_Edit_Iterator::PrevSection()
+{
+ ASSERT(m_pVTIterator != NULL);
+
+ return m_pVTIterator->PrevSection();
+}
+
+FX_BOOL CFX_Edit_Iterator::GetWord(CPVT_Word & word) const
+{
+ ASSERT(m_pEdit != NULL);
+ ASSERT(m_pVTIterator != NULL);
+
+ 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 != NULL);
+ ASSERT(m_pVTIterator != NULL);
+
+ 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 != NULL);
+ ASSERT(m_pVTIterator != NULL);
+
+ if (m_pVTIterator->GetSection(section))
+ {
+ section.rcSection = m_pEdit->VTToEdit(section.rcSection);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+void CFX_Edit_Iterator::SetAt(FX_INT32 nWordIndex)
+{
+ ASSERT(m_pVTIterator != NULL);
+
+ m_pVTIterator->SetAt(nWordIndex);
+}
+
+void CFX_Edit_Iterator::SetAt(const CPVT_WordPlace & place)
+{
+ ASSERT(m_pVTIterator != NULL);
+
+ m_pVTIterator->SetAt(place);
+}
+
+const CPVT_WordPlace & CFX_Edit_Iterator::GetAt() const
+{
+ ASSERT(m_pVTIterator != NULL);
+
+ return m_pVTIterator->GetAt();
+}
+
+IFX_Edit* CFX_Edit_Iterator::GetEdit() const
+{
+ return m_pEdit;
+}
+
+/* --------------------------- CFX_Edit_Provider ------------------------------- */
+
+CFX_Edit_Provider::CFX_Edit_Provider(IFX_Edit_FontMap * pFontMap) : m_pFontMap(pFontMap)
+{
+ ASSERT(m_pFontMap != NULL);
+}
+
+CFX_Edit_Provider::~CFX_Edit_Provider()
+{
+}
+
+IFX_Edit_FontMap* CFX_Edit_Provider::GetFontMap()
+{
+ return m_pFontMap;
+}
+
+FX_INT32 CFX_Edit_Provider::GetCharWidth(FX_INT32 nFontIndex, FX_WORD word, FX_INT32 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;
+}
+
+FX_INT32 CFX_Edit_Provider::GetTypeAscent(FX_INT32 nFontIndex)
+{
+ if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex))
+ return pPDFFont->GetTypeAscent();
+
+ return 0;
+}
+
+FX_INT32 CFX_Edit_Provider::GetTypeDescent(FX_INT32 nFontIndex)
+{
+ if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex))
+ return pPDFFont->GetTypeDescent();
+
+ return 0;
+}
+
+FX_INT32 CFX_Edit_Provider::GetWordFontIndex(FX_WORD word, FX_INT32 charset, FX_INT32 nFontIndex)
+{
+ return m_pFontMap->GetWordFontIndex(word,charset,nFontIndex);
+}
+
+FX_INT32 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::~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 CPDF_Rect & rect)
+{
+ m_NewLineRects.Add(linerange,rect);
+}
+
+void CFX_Edit_Refresh::NoAnalyse()
+{
+ {
+ for (FX_INT32 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 (FX_INT32 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(FX_INT32 nAlignment)
+{
+ FX_BOOL bLineTopChanged = FALSE;
+ CPDF_Rect rcResult;
+ FX_FLOAT fWidthDiff;
+
+ FX_INT32 szMax = FX_EDIT_MAX(m_OldLineRects.GetSize(),m_NewLineRects.GetSize());
+ FX_INT32 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
+ {
+ //don't need to do anything
+ }
+ }
+ }
+ else
+ {
+ m_RefreshRects.Add(pOldRect->m_rcLine);
+ }
+ }
+ else
+ {
+ if (pNewRect)
+ {
+ m_RefreshRects.Add(pNewRect->m_rcLine);
+ }
+ else
+ {
+ //error
+ }
+ }
+ i++;
+ }
+}
+
+void CFX_Edit_Refresh::AddRefresh(const CPDF_Rect & 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::CFX_Edit_Undo(FX_INT32 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);
+ ASSERT(pItem != NULL);
+
+ 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;
+
+ FX_INT32 nStackSize = m_UndoItemStack.GetSize();
+
+ if (m_nCurUndoPos < nStackSize)
+ {
+ IFX_Edit_UndoItem * pItem = m_UndoItemStack.GetAt(m_nCurUndoPos);
+ ASSERT(pItem != NULL);
+
+ 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 != NULL);
+ 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
+{
+ if (m_bVirgin)
+ return m_bModified;
+ else
+ return TRUE;
+}
+
+IFX_Edit_UndoItem* CFX_Edit_Undo::GetItem(FX_INT32 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);
+
+ IFX_Edit_UndoItem* pItem = m_UndoItemStack.GetAt(0);
+ ASSERT(pItem != NULL);
+
+ pItem->Release();
+ m_UndoItemStack.RemoveAt(0);
+}
+
+void CFX_Edit_Undo::RemoveTails()
+{
+ for (FX_INT32 i = m_UndoItemStack.GetSize()-1; i >= m_nCurUndoPos; i--)
+ {
+ IFX_Edit_UndoItem* pItem = m_UndoItemStack.GetAt(i);
+ ASSERT(pItem != NULL);
+
+ pItem->Release();
+ m_UndoItemStack.RemoveAt(i);
+ }
+}
+
+void CFX_Edit_Undo::Reset()
+{
+ for (FX_INT32 i=0, sz=m_UndoItemStack.GetSize(); i < sz; i++)
+ {
+ IFX_Edit_UndoItem * pItem = m_UndoItemStack.GetAt(i);
+ ASSERT(pItem != NULL);
+
+ pItem->Release();
+ }
+ m_nCurUndoPos = 0;
+ m_UndoItemStack.RemoveAll();
+}
+
+/* -------------------------------- CFX_Edit_GroupUndoItem -------------------------------- */
+
+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++)
+ {
+ CFX_Edit_UndoItem* pUndoItem = m_Items[i];
+ ASSERT(pUndoItem != NULL);
+
+ pUndoItem->Release();
+ }
+
+ m_Items.RemoveAll();
+}
+
+void CFX_Edit_GroupUndoItem::AddUndoItem(CFX_Edit_UndoItem* pUndoItem)
+{
+ ASSERT(pUndoItem != NULL);
+
+ 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];
+ ASSERT(pFirstItem != NULL);
+ pFirstItem->SetFirst(TRUE);
+
+ CFX_Edit_UndoItem* pLastItem = m_Items[m_Items.GetSize() - 1];
+ ASSERT(pLastItem != NULL);
+ 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];
+ ASSERT(pUndoItem != NULL);
+
+ 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];
+ ASSERT(pUndoItem != NULL);
+
+ pUndoItem->Redo();
+ }
+}
+
+CFX_WideString CFX_Edit_GroupUndoItem::GetUndoTitle()
+{
+ return m_sTitle;
+}
+
+void CFX_Edit_GroupUndoItem::Release()
+{
+ delete this;
+}
+
+/* ------------------------------------- CFX_Edit_UndoItem derived classes ------------------------------------- */
+
+CFXEU_InsertWord::CFXEU_InsertWord(CFX_Edit * pEdit, const CPVT_WordPlace & wpOldPlace, const CPVT_WordPlace & wpNewPlace,
+ FX_WORD word, FX_INT32 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::CFXEU_Backspace(CFX_Edit * pEdit, const CPVT_WordPlace & wpOldPlace, const CPVT_WordPlace & wpNewPlace,
+ FX_WORD word, FX_INT32 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::CFXEU_Delete(CFX_Edit * pEdit, const CPVT_WordPlace & wpOldPlace, const CPVT_WordPlace & wpNewPlace,
+ FX_WORD word, FX_INT32 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::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, DEFAULT_CHARSET, NULL,NULL,FALSE,TRUE);
+ m_pEdit->SetSel(m_wrSel.BeginPos,m_wrSel.EndPos);
+ }
+}
+
+/* -------------------------------------------------------------------------- */
+//CFXEU_ClearRich
+
+CFXEU_ClearRich::CFXEU_ClearRich(CFX_Edit * pEdit, const CPVT_WordPlace & wpOldPlace, const CPVT_WordPlace & wpNewPlace,
+ const CPVT_WordRange & wrSel, FX_WORD word, FX_INT32 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::CFXEU_InsertText(CFX_Edit * pEdit, const CPVT_WordPlace & wpOldPlace, const CPVT_WordPlace & wpNewPlace,
+ const CFX_WideString & swText, FX_INT32 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, 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_eProps(ep),
+ m_OldSecProps(oldsecprops),
+ m_NewSecProps(newsecprops),
+ m_OldWordProps(oldwordprops),
+ m_NewWordProps(newwordprops),
+ m_wrPlace(range)
+{
+}
+
+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_eProps(ep),
+ m_OldWordProps(oldprops),
+ m_NewWordProps(newprops),
+ m_wrPlace(range)
+{
+}
+
+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::CFX_Edit(IPDF_VariableText * pVT) :
+ m_pVT(pVT),
+ m_pNotify(NULL),
+ m_pOprNotify(NULL),
+ m_wpCaret(-1,-1,-1),
+ m_wpOldCaret(-1,-1,-1),
+ m_ptScrollPos(0,0),
+ m_ptRefreshScrollPos(0,0),
+ m_bEnableScroll(FALSE),
+ m_bEnableOverflow(FALSE),
+ m_pVTProvide(NULL),
+ m_pIterator(NULL),
+ m_SelState(),
+ m_ptCaret(0.0f,0.0f),
+ m_Undo(FX_EDIT_UNDO_MAXITEM),
+ m_nAlignment(0),
+ m_bNotifyFlag(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 != NULL);
+}
+
+CFX_Edit::~CFX_Edit()
+{
+ if (m_pVTProvide)
+ {
+ delete m_pVTProvide;
+ m_pVTProvide = NULL;
+ }
+
+ if (m_pIterator)
+ {
+ delete m_pIterator;
+ m_pIterator = NULL;
+ }
+
+ ASSERT(m_pGroupUndoItem == NULL);
+}
+
+// public methods
+
+void CFX_Edit::Initialize()
+{
+ m_pVT->Initialize();
+ SetCaret(m_pVT->GetBeginWordPlace());
+ SetCaretOrigin();
+}
+
+void CFX_Edit::SetFontMap(IFX_Edit_FontMap * pFontMap)
+{
+ if (m_pVTProvide)
+ 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 CPDF_Rect & rect, FX_BOOL bPaint/* = TRUE*/)
+{
+ m_pVT->SetPlateRect(rect);
+ m_ptScrollPos = CPDF_Point(rect.left,rect.top);
+ if (bPaint) Paint();
+}
+
+void CFX_Edit::SetAlignmentH(FX_INT32 nFormat/* =0 */, FX_BOOL bPaint/* = TRUE*/)
+{
+ m_pVT->SetAlignment(nFormat);
+ if (bPaint) Paint();
+}
+
+void CFX_Edit::SetAlignmentV(FX_INT32 nFormat/* =0 */, FX_BOOL bPaint/* = TRUE*/)
+{
+ m_nAlignment = nFormat;
+ if (bPaint) Paint();
+}
+
+void CFX_Edit::SetPasswordChar(FX_WORD wSubWord/* ='*' */, FX_BOOL bPaint/* = TRUE*/)
+{
+ m_pVT->SetPasswordChar(wSubWord);
+ if (bPaint) Paint();
+}
+
+void CFX_Edit::SetLimitChar(FX_INT32 nLimitChar/* =0 */, FX_BOOL bPaint/* = TRUE*/)
+{
+ m_pVT->SetLimitChar(nLimitChar);
+ if (bPaint) Paint();
+}
+
+void CFX_Edit::SetCharArray(FX_INT32 nCharArray/* =0 */, FX_BOOL bPaint/* = TRUE*/)
+{
+ m_pVT->SetCharArray(nCharArray);
+ if (bPaint) Paint();
+}
+
+void CFX_Edit::SetCharSpace(FX_FLOAT fCharSpace/* =0.0f */, FX_BOOL bPaint/* = TRUE*/)
+{
+ m_pVT->SetCharSpace(fCharSpace);
+ if (bPaint) Paint();
+}
+
+void CFX_Edit::SetHorzScale(FX_INT32 nHorzScale/* =100 */, FX_BOOL bPaint/* = TRUE*/)
+{
+ m_pVT->SetHorzScale(nHorzScale);
+ if (bPaint) Paint();
+}
+
+void CFX_Edit::SetMultiLine(FX_BOOL bMultiLine/* =TRUE */, FX_BOOL bPaint/* = TRUE*/)
+{
+ m_pVT->SetMultiLine(bMultiLine);
+ if (bPaint) Paint();
+}
+
+void CFX_Edit::SetAutoReturn(FX_BOOL bAuto/* =TRUE */, FX_BOOL bPaint/* = TRUE*/)
+{
+ m_pVT->SetAutoReturn(bAuto);
+ if (bPaint) Paint();
+}
+
+void CFX_Edit::SetLineLeading(FX_FLOAT fLineLeading/* =TRUE */, FX_BOOL bPaint/* = TRUE*/)
+{
+ m_pVT->SetLineLeading(fLineLeading);
+ if (bPaint) Paint();
+}
+
+void CFX_Edit::SetAutoFontSize(FX_BOOL bAuto/* =TRUE */, FX_BOOL bPaint/* = TRUE*/)
+{
+ m_pVT->SetAutoFontSize(bAuto);
+ if (bPaint) Paint();
+}
+
+void CFX_Edit::SetFontSize(FX_FLOAT fFontSize, FX_BOOL bPaint/* = TRUE*/)
+{
+ m_pVT->SetFontSize(fFontSize);
+ if (bPaint) Paint();
+}
+
+void CFX_Edit::SetAutoScroll(FX_BOOL bAuto/* =TRUE */, FX_BOOL bPaint/* = TRUE*/)
+{
+ m_bEnableScroll = bAuto;
+ if (bPaint) Paint();
+}
+
+void CFX_Edit::SetTextOverflow(FX_BOOL bAllowed /*= FALSE*/, FX_BOOL bPaint/* = TRUE*/)
+{
+ m_bEnableOverflow = bAllowed;
+ if (bPaint) Paint();
+}
+
+void CFX_Edit::SetSel(FX_INT32 nStartChar,FX_INT32 nEndChar)
+{
+ if (m_pVT->IsValid())
+ {
+ if (nStartChar == 0 && nEndChar < 0)
+ {
+ SelectAll();
+ }
+ else if (nStartChar < 0)
+ {
+ this->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(FX_INT32 & nStartChar, FX_INT32 & 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);
+ }
+ }
+}
+
+FX_INT32 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());
+}
+
+FX_INT32 CFX_Edit::GetTotalWords() const
+{
+ return m_pVT->GetTotalWords();
+}
+
+FX_INT32 CFX_Edit::GetTotalLines() const
+{
+ FX_INT32 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/* =TRUE */, FX_BOOL bPaint/* = TRUE*/)
+{
+ m_pVT->SetRichText(bRichText);
+ if (bPaint) Paint();
+}
+
+FX_BOOL CFX_Edit::SetRichFontIndex(FX_INT32 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(FX_INT32 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(FX_INT32 nHorzScale /*= 100*/)
+{
+ 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(FX_INT32 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 = this->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(FX_LPCWSTR text,FX_INT32 charset /*= DEFAULT_CHARSET*/,
+ const CPVT_SecProps * pSecProps /*= NULL*/,const CPVT_WordProps * pWordProps /*= NULL*/)
+{
+ SetText(text,charset,pSecProps,pWordProps,TRUE,TRUE);
+}
+
+FX_BOOL CFX_Edit::InsertWord(FX_WORD word, FX_INT32 charset /*= DEFAULT_CHARSET*/, const CPVT_WordProps * pWordProps /*= NULL*/)
+{
+ return InsertWord(word,charset,pWordProps,TRUE,TRUE);
+}
+
+FX_BOOL CFX_Edit::InsertReturn(const CPVT_SecProps * pSecProps /*= NULL*/,const CPVT_WordProps * pWordProps /*= NULL*/)
+{
+ 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(FX_LPCWSTR text, FX_INT32 charset /*= DEFAULT_CHARSET*/,
+ const CPVT_SecProps * pSecProps /*= NULL*/,const CPVT_WordProps * pWordProps /*= NULL*/)
+{
+ 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();
+}
+
+FX_INT32 CFX_Edit::GetCharArray() const
+{
+ return m_pVT->GetCharArray();
+}
+
+CPDF_Rect CFX_Edit::GetPlateRect() const
+{
+ return m_pVT->GetPlateRect();
+}
+
+CPDF_Rect CFX_Edit::GetContentRect() const
+{
+ return VTToEdit(m_pVT->GetContentRect());
+}
+
+FX_INT32 CFX_Edit::GetHorzScale() const
+{
+ return m_pVT->GetHorzScale();
+}
+
+FX_FLOAT CFX_Edit::GetCharSpace() const
+{
+ return m_pVT->GetCharSpace();
+}
+
+// inner methods
+
+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())
+ {
+ CPDF_Rect rcPlate = m_pVT->GetPlateRect();
+
+ CPVT_WordPlace place1 = m_pVT->SearchWordPlace(EditToVT(CPDF_Point(rcPlate.left,rcPlate.top)));
+ CPVT_WordPlace place2 = m_pVT->SearchWordPlace(EditToVT(CPDF_Point(rcPlate.right,rcPlate.bottom)));
+
+ return CPVT_WordRange(place1,place2);
+ }
+
+ return CPVT_WordRange();
+}
+
+CPVT_WordPlace CFX_Edit::SearchWordPlace(const CPDF_Point& 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)
+ {
+ CPDF_Rect 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 = 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();
+}
+
+CPDF_Point CFX_Edit::VTToEdit(const CPDF_Point & point) const
+{
+ CPDF_Rect rcContent = m_pVT->GetContentRect();
+ CPDF_Rect 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 CPDF_Point(point.x - (m_ptScrollPos.x - rcPlate.left),
+ point.y - (m_ptScrollPos.y + fPadding - rcPlate.top));
+}
+
+CPDF_Point CFX_Edit::EditToVT(const CPDF_Point & point) const
+{
+ CPDF_Rect rcContent = m_pVT->GetContentRect();
+ CPDF_Rect 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 CPDF_Point(point.x + (m_ptScrollPos.x - rcPlate.left),
+ point.y + (m_ptScrollPos.y + fPadding - rcPlate.top));
+}
+
+CPDF_Rect CFX_Edit::VTToEdit(const CPDF_Rect & rect) const
+{
+ CPDF_Point ptLeftBottom = VTToEdit(CPDF_Point(rect.left,rect.bottom));
+ CPDF_Point ptRightTop = VTToEdit(CPDF_Point(rect.right,rect.top));
+
+ return CPDF_Rect(ptLeftBottom.x,ptLeftBottom.y,ptRightTop.x,ptRightTop.y);
+}
+
+CPDF_Rect CFX_Edit::EditToVT(const CPDF_Rect & rect) const
+{
+ CPDF_Point ptLeftBottom = EditToVT(CPDF_Point(rect.left,rect.bottom));
+ CPDF_Point ptRightTop = EditToVT(CPDF_Point(rect.right,rect.top));
+
+ return CPDF_Rect(ptLeftBottom.x,ptLeftBottom.y,ptRightTop.x,ptRightTop.y);
+}
+
+void CFX_Edit::SetScrollInfo()
+{
+ if (m_bNotify && m_pNotify)
+ {
+ CPDF_Rect rcPlate = m_pVT->GetPlateRect();
+ CPDF_Rect 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 CPDF_Point & point)
+{
+ SetScrollPosX(point.x);
+ SetScrollPosY(point.y);
+ SetScrollLimit();
+ SetCaretInfo();
+}
+
+CPDF_Point CFX_Edit::GetScrollPos() const
+{
+ return m_ptScrollPos;
+}
+
+void CFX_Edit::SetScrollLimit()
+{
+ if (m_pVT->IsValid())
+ {
+ CPDF_Rect rcContent = m_pVT->GetContentRect();
+ CPDF_Rect 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())
+ {
+ CPDF_Point ptHead(0,0);
+ CPDF_Point 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;
+ }
+ }
+
+ CPDF_Point ptHeadEdit = VTToEdit(ptHead);
+ CPDF_Point ptFootEdit = VTToEdit(ptFoot);
+
+ CPDF_Rect 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());
+
+// if (!FX_EDIT_IsFloatEqual(m_ptRefreshScrollPos.x,m_ptScrollPos.x) ||
+// !FX_EDIT_IsFloatEqual(m_ptRefreshScrollPos.y,m_ptScrollPos.y))
+// {
+ m_Refresh.NoAnalyse();
+ m_ptRefreshScrollPos = m_ptScrollPos;
+// }
+// else
+// {
+// switch (ePlan)
+// {
+// case RP_ANALYSE:
+// m_Refresh.Analyse(m_pVT->GetAlignment());
+//
+// if (pRange1) RefreshPushRandomRects(*pRange1);
+// if (pRange2) RefreshPushRandomRects(*pRange2);
+// break;
+// case RP_NOANALYSE:
+// m_Refresh.NoAnalyse();
+// break;
+// case RP_OPTIONAL:
+// if (pRange1) RefreshPushRandomRects(*pRange1);
+// if (pRange2) RefreshPushRandomRects(*pRange2);
+// break;
+// }
+// }
+
+ if (m_bNotify && m_pNotify)
+ {
+ if (!m_bNotifyFlag)
+ {
+ m_bNotifyFlag = TRUE;
+ if (const CFX_Edit_RectArray * pRects = m_Refresh.GetRefreshRects())
+ {
+ for (FX_INT32 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;
+
+ CPDF_Rect 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)
+ {
+ CPDF_Rect 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
+ {
+ CPDF_Rect 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)
+ {
+ CPDF_Rect 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;
+ CPDF_Rect rcRefresh = VTToEdit(rcWord);
+ m_pNotify->IOnInvalidateRect(&rcRefresh);
+ m_bNotifyFlag = FALSE;
+ }
+ }
+ }
+ else
+ {
+ CPDF_Rect 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;
+ CPDF_Rect 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)
+ {
+ CPDF_Point 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 (this->m_wpCaret == this->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(FX_INT32 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 CPDF_Point & 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 CPDF_Point & 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(FX_LPCWSTR text,FX_INT32 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);
+ //if (bAddUndo)
+}
+
+FX_BOOL CFX_Edit::InsertWord(FX_WORD word, FX_INT32 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->AjustLineHeader(oldplace,TRUE);
+ place = m_pVT->AjustLineHeader(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(FX_LPCWSTR text, FX_INT32 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;
+ }
+ }
+ }
+}
+
+FX_INT32 CFX_Edit::WordPlaceToWordIndex(const CPVT_WordPlace & place) const
+{
+ if (m_pVT->IsValid())
+ return m_pVT->WordPlaceToWordIndex(place);
+
+ return -1;
+}
+
+CPVT_WordPlace CFX_Edit::WordIndexToWordPlace(FX_INT32 index) const
+{
+ if (m_pVT->IsValid())
+ return m_pVT->WordIndexToWordPlace(index);
+
+ return CPVT_WordPlace();
+}
+
+FX_BOOL CFX_Edit::IsTextFull() const
+{
+ FX_INT32 nTotalWords = m_pVT->GetTotalWords();
+ FX_INT32 nLimitChar = m_pVT->GetLimitChar();
+ FX_INT32 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)
+ {
+ CPDF_Rect rcPlate = m_pVT->GetPlateRect();
+ CPDF_Rect 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)
+{
+ this->m_bEnableUndo = bUndo;
+}
+
+void CFX_Edit::EnableNotify(FX_BOOL bNotify)
+{
+ this->m_bNotify = bNotify;
+}
+
+void CFX_Edit::EnableOprNotify(FX_BOOL bNotify)
+{
+ this->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, FX_LPCWSTR text, FX_INT32 charset,
+ const CPVT_SecProps * pSecProps, const CPVT_WordProps * pWordProps)
+{
+ CPVT_WordPlace wp = place;
+
+ if (m_pVT->IsValid())
+ {
+ CFX_WideString sText = text;
+
+ for (FX_INT32 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;
+}
+
+FX_INT32 CFX_Edit::GetCharSetFromUnicode(FX_WORD word, FX_INT32 nOldCharset)
+{
+ if (IFX_Edit_FontMap* pFontMap = this->GetFontMap())
+ return pFontMap->CharSetFromUnicode(word, nOldCharset);
+ else
+ return nOldCharset;
+}
+
+void CFX_Edit::BeginGroupUndo(const CFX_WideString& sTitle)
+{
+ ASSERT(m_pGroupUndoItem == NULL);
+
+ m_pGroupUndoItem = new CFX_Edit_GroupUndoItem(sTitle);
+}
+
+void CFX_Edit::EndGroupUndo()
+{
+ ASSERT(m_pGroupUndoItem != NULL);
+
+ 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 new file mode 100644 index 0000000000..dd70e0c7d4 --- /dev/null +++ b/fpdfsdk/src/fxedit/fxet_list.cpp @@ -0,0 +1,1012 @@ +// 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 "../../include/fxedit/fxet_stub.h"
+#include "../../include/fxedit/fxet_edit.h"
+#include "../../include/fxedit/fxet_list.h"
+
+/* ------------------------------- CFX_ListItem ---------------------------------- */
+
+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();
+ ASSERT(m_pEdit != NULL);
+
+ 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(FX_LPCWSTR 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::CFX_List() : m_pFontMap(NULL), m_fFontSize(0.0f), m_bMultiple(FALSE)
+{
+}
+
+CFX_List::~CFX_List()
+{
+ Empty();
+}
+
+void CFX_List::Empty()
+{
+ for (FX_INT32 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(FX_LPCWSTR str)
+{
+ if (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(FX_INT32 nItemIndex)
+{
+ FX_FLOAT fPosY = 0.0f;
+
+ if (CFX_ListItem * pPrevItem = m_aListItems.GetAt(nItemIndex - 1))
+ fPosY = pPrevItem->GetRect().bottom;
+
+ for (FX_INT32 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(FX_INT32 nIndex) const
+{
+ if (CFX_ListItem * pListItem = m_aListItems.GetAt(nIndex))
+ {
+ return pListItem->GetEdit();
+ }
+
+ return NULL;
+}
+
+FX_INT32 CFX_List::GetCount() const
+{
+ return m_aListItems.GetSize();
+}
+
+CPDF_Rect CFX_List::GetPlateRect() const
+{
+ return CFX_ListContainer::GetPlateRect();
+}
+
+CPDF_Rect CFX_List::GetContentRect() const
+{
+ return InnerToOuter(CFX_ListContainer::GetContentRect());
+}
+
+FX_FLOAT CFX_List::GetFontSize() const
+{
+ return m_fFontSize;
+}
+
+FX_INT32 CFX_List::GetItemIndex(const CPDF_Point & point) const
+{
+ CPDF_Point pt = OuterToInner(point);
+
+ FX_BOOL bFirst = TRUE;
+ FX_BOOL bLast = TRUE;
+
+ for (FX_INT32 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;
+}
+
+FX_INT32 CFX_List::GetFirstSelected() const
+{
+ for (FX_INT32 i=0,sz=m_aListItems.GetSize(); i<sz; i++)
+ {
+ if (CFX_ListItem * pListItem = m_aListItems.GetAt(i))
+ {
+ if (pListItem->IsSelected())
+ return i;
+ }
+ }
+ return -1;
+}
+
+FX_INT32 CFX_List::GetLastSelected() const
+{
+ for (FX_INT32 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;
+}
+
+FX_INT32 CFX_List::FindNext(FX_INT32 nIndex,FX_WCHAR nChar) const
+{
+ FX_INT32 nCircleIndex = nIndex;
+
+ for (FX_INT32 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;
+}
+
+CPDF_Rect CFX_List::GetItemRect(FX_INT32 nIndex) const
+{
+ if (CFX_ListItem * pListItem = m_aListItems.GetAt(nIndex))
+ {
+ CPDF_Rect rcItem = pListItem->GetRect();
+ rcItem.left = 0.0f;
+ rcItem.right = GetPlateRect().Width();
+ return InnerToOuter(rcItem);
+ }
+
+ return CPDF_Rect();
+}
+
+FX_BOOL CFX_List::IsItemSelected(FX_INT32 nIndex) const
+{
+ if (CFX_ListItem * pListItem = m_aListItems.GetAt(nIndex))
+ {
+ return pListItem->IsSelected();
+ }
+
+ return FALSE;
+}
+
+void CFX_List::SetItemSelect(FX_INT32 nItemIndex, FX_BOOL bSelected)
+{
+ if (CFX_ListItem * pListItem = m_aListItems.GetAt(nItemIndex))
+ {
+ pListItem->SetSelect(bSelected);
+ }
+}
+
+void CFX_List::SetItemCaret(FX_INT32 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(FX_INT32 nItemIndex) const
+{
+ return nItemIndex >= 0 && nItemIndex < m_aListItems.GetSize();
+}
+
+CFX_WideString CFX_List::GetItemText(FX_INT32 nIndex) const
+{
+ if (CFX_ListItem * pListItem = m_aListItems.GetAt(nIndex))
+ {
+ return pListItem->GetText();
+ }
+
+ return L"";
+}
+
+/* ------------------------------------ CPLST_Select ---------------------------------- */
+
+CPLST_Select::CPLST_Select()
+{
+}
+
+CPLST_Select::~CPLST_Select()
+{
+ for (FX_INT32 i=0,sz=m_aItems.GetSize(); i<sz; i++)
+ delete m_aItems.GetAt(i);
+
+ m_aItems.RemoveAll();
+}
+
+void CPLST_Select::Add(FX_INT32 nItemIndex)
+{
+ FX_INT32 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(FX_INT32 nBeginIndex, FX_INT32 nEndIndex)
+{
+ if (nBeginIndex > nEndIndex)
+ {
+ FX_INT32 nTemp = nEndIndex;
+ nEndIndex = nBeginIndex;
+ nBeginIndex = nTemp;
+ }
+
+ for (FX_INT32 i=nBeginIndex; i<=nEndIndex; i++) Add(i);
+}
+
+void CPLST_Select::Sub(FX_INT32 nItemIndex)
+{
+ for (FX_INT32 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(FX_INT32 nBeginIndex, FX_INT32 nEndIndex)
+{
+ if (nBeginIndex > nEndIndex)
+ {
+ FX_INT32 nTemp = nEndIndex;
+ nEndIndex = nBeginIndex;
+ nBeginIndex = nTemp;
+ }
+
+ for (FX_INT32 i=nBeginIndex; i<=nEndIndex; i++) Sub(i);
+}
+
+FX_INT32 CPLST_Select::Find(FX_INT32 nItemIndex) const
+{
+ for (FX_INT32 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(FX_INT32 nItemIndex) const
+{
+ return Find(nItemIndex) >= 0;
+}
+
+FX_INT32 CPLST_Select::GetCount() const
+{
+ return m_aItems.GetSize();
+}
+
+FX_INT32 CPLST_Select::GetItemIndex(FX_INT32 nIndex) const
+{
+ if (nIndex >= 0 && nIndex < m_aItems.GetSize())
+ if (CPLST_Select_Item * pItem = m_aItems.GetAt(nIndex))
+ return pItem->nItemIndex;
+
+ return -1;
+}
+
+FX_INT32 CPLST_Select::GetState(FX_INT32 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 (FX_INT32 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 (FX_INT32 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::CFX_ListCtrl() : m_pNotify(NULL),
+ m_ptScrollPos(0.0f,0.0f),
+ m_nSelItem(-1),
+ m_nFootIndex(-1),
+ m_bCtrlSel(FALSE),
+ m_nCaretIndex(-1),
+ m_bNotifyFlag(FALSE)
+{
+}
+
+CFX_ListCtrl::~CFX_ListCtrl()
+{
+}
+
+void CFX_ListCtrl::SetNotify(IFX_List_Notify * pNotify)
+{
+ m_pNotify = pNotify;
+}
+
+CPDF_Point CFX_ListCtrl::InToOut(const CPDF_Point & point) const
+{
+ CPDF_Rect rcPlate = GetPlateRect();
+
+ return CPDF_Point(point.x - (m_ptScrollPos.x - rcPlate.left),
+ point.y - (m_ptScrollPos.y - rcPlate.top));
+}
+
+CPDF_Point CFX_ListCtrl::OutToIn(const CPDF_Point & point) const
+{
+ CPDF_Rect rcPlate = GetPlateRect();
+
+ return CPDF_Point(point.x + (m_ptScrollPos.x - rcPlate.left),
+ point.y + (m_ptScrollPos.y - rcPlate.top));
+}
+
+CPDF_Rect CFX_ListCtrl::InToOut(const CPDF_Rect & rect) const
+{
+ CPDF_Point ptLeftBottom = InToOut(CPDF_Point(rect.left,rect.bottom));
+ CPDF_Point ptRightTop = InToOut(CPDF_Point(rect.right,rect.top));
+
+ return CPDF_Rect(ptLeftBottom.x,ptLeftBottom.y,ptRightTop.x,ptRightTop.y);
+}
+
+CPDF_Rect CFX_ListCtrl::OutToIn(const CPDF_Rect & rect) const
+{
+ CPDF_Point ptLeftBottom = OutToIn(CPDF_Point(rect.left,rect.bottom));
+ CPDF_Point ptRightTop = OutToIn(CPDF_Point(rect.right,rect.top));
+
+ return CPDF_Rect(ptLeftBottom.x,ptLeftBottom.y,ptRightTop.x,ptRightTop.y);
+}
+
+void CFX_ListCtrl::OnMouseDown(const CPDF_Point & point,FX_BOOL bShift,FX_BOOL bCtrl)
+{
+ FX_INT32 nHitIndex = this->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 (!this->IsItemVisible(nHitIndex))
+ this->ScrollToListItem(nHitIndex);
+}
+
+void CFX_ListCtrl::OnMouseMove(const CPDF_Point & point,FX_BOOL bShift,FX_BOOL bCtrl)
+{
+ FX_INT32 nHitIndex = this->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 (!this->IsItemVisible(nHitIndex))
+ this->ScrollToListItem(nHitIndex);
+}
+
+void CFX_ListCtrl::OnVK(FX_INT32 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 (!this->IsItemVisible(nItemIndex))
+ this->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)
+{
+ FX_INT32 nIndex = GetLastSelected();
+ FX_INT32 nFindIndex = FindNext(nIndex,nChar);
+
+ if (nFindIndex != nIndex)
+ {
+ OnVK(nFindIndex, bShift, bCtrl);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/* -------- inner methods ------- */
+
+void CFX_ListCtrl::SetPlateRect(const CPDF_Rect & rect)
+{
+ CFX_ListContainer::SetPlateRect(rect);
+ m_ptScrollPos.x = rect.left;
+ SetScrollPos(CPDF_Point(rect.left,rect.top));
+ ReArrange(0);
+ InvalidateItem(-1);
+}
+
+CPDF_Rect CFX_ListCtrl::GetItemRect(FX_INT32 nIndex) const
+{
+ return InToOut(CFX_List::GetItemRect(nIndex));
+}
+
+void CFX_ListCtrl::AddString(FX_LPCWSTR string)
+{
+ AddItem(string);
+ ReArrange(GetCount() - 1);
+}
+
+void CFX_ListCtrl::SetMultipleSelect(FX_INT32 nItemIndex, FX_BOOL bSelected)
+{
+ if (!IsValid(nItemIndex)) return;
+
+ if (bSelected != this->IsItemSelected(nItemIndex))
+ {
+ if (bSelected)
+ {
+ SetItemSelect(nItemIndex,TRUE);
+ InvalidateItem(nItemIndex);
+ }
+ else
+ {
+ SetItemSelect(nItemIndex,FALSE);
+ InvalidateItem(nItemIndex);
+ }
+ }
+}
+
+void CFX_ListCtrl::SetSingleSelect(FX_INT32 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(FX_INT32 nItemIndex)
+{
+ if (!IsValid(nItemIndex)) return;
+
+ if (this->IsMultipleSel())
+ {
+ FX_INT32 nOldIndex = m_nCaretIndex;
+
+ if (nOldIndex != nItemIndex)
+ {
+ m_nCaretIndex = nItemIndex;
+
+ SetItemCaret(nOldIndex, FALSE);
+ SetItemCaret(nItemIndex,TRUE);
+
+ InvalidateItem(nOldIndex);
+ InvalidateItem(nItemIndex);
+ }
+ }
+}
+
+void CFX_ListCtrl::InvalidateItem(FX_INT32 nItemIndex)
+{
+ if (m_pNotify)
+ {
+ if (nItemIndex == -1)
+ {
+ if (!m_bNotifyFlag)
+ {
+ m_bNotifyFlag = TRUE;
+ CPDF_Rect rcRefresh = GetPlateRect();
+ m_pNotify->IOnInvalidateRect(&rcRefresh);
+ m_bNotifyFlag = FALSE;
+ }
+ }
+ else
+ {
+ if (!m_bNotifyFlag)
+ {
+ m_bNotifyFlag = TRUE;
+ CPDF_Rect 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 (FX_INT32 i=0,sz=m_aSelItems.GetCount(); i<sz; i++)
+ {
+ FX_INT32 nItemIndex = m_aSelItems.GetItemIndex(i);
+ FX_INT32 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(FX_INT32 nItemIndex)
+{
+ if (!IsValid(nItemIndex)) return;
+
+ if (this->IsMultipleSel())
+ {
+ m_aSelItems.Add(nItemIndex);
+ SelectItems();
+ }
+ else
+ SetSingleSelect(nItemIndex);
+}
+
+FX_BOOL CFX_ListCtrl::IsItemVisible(FX_INT32 nItemIndex) const
+{
+ CPDF_Rect rcPlate = this->GetPlateRect();
+ CPDF_Rect rcItem = this->GetItemRect(nItemIndex);
+
+ return rcItem.bottom >= rcPlate.bottom && rcItem.top <= rcPlate.top;
+}
+
+void CFX_ListCtrl::ScrollToListItem(FX_INT32 nItemIndex)
+{
+ if (!IsValid(nItemIndex)) return;
+
+ CPDF_Rect rcPlate = this->GetPlateRect();
+ CPDF_Rect rcItem = CFX_List::GetItemRect(nItemIndex);
+ CPDF_Rect 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)
+ {
+ CPDF_Rect rcPlate = GetPlateRect();
+ CPDF_Rect 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 CPDF_Point & point)
+{
+ SetScrollPosY(point.y);
+}
+
+void CFX_ListCtrl::SetScrollPosY(FX_FLOAT fy)
+{
+ if (!FX_EDIT_IsFloatEqual(m_ptScrollPos.y,fy))
+ {
+ CPDF_Rect rcPlate = this->GetPlateRect();
+ CPDF_Rect 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;
+ }
+ }
+ }
+}
+
+CPDF_Rect CFX_ListCtrl::GetContentRect() const
+{
+ return InToOut(CFX_List::GetContentRect());
+}
+
+void CFX_ListCtrl::ReArrange(FX_INT32 nItemIndex)
+{
+ CFX_List::ReArrange(nItemIndex);
+ SetScrollInfo();
+}
+
+void CFX_ListCtrl::SetTopItem(FX_INT32 nIndex)
+{
+ if (IsValid(nIndex))
+ {
+ this->GetPlateRect();
+ CPDF_Rect rcItem = CFX_List::GetItemRect(nIndex);
+ SetScrollPosY(rcItem.top);
+ }
+}
+
+FX_INT32 CFX_ListCtrl::GetTopItem() const
+{
+ FX_INT32 nItemIndex = this->GetItemIndex(this->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();
+}
+
+FX_INT32 CFX_ListCtrl::GetItemIndex(const CPDF_Point & point) const
+{
+ return CFX_List::GetItemIndex(OutToIn(point));
+}
+
+CFX_WideString CFX_ListCtrl::GetText() const
+{
+ if (this->IsMultipleSel())
+ return this->GetItemText(this->m_nCaretIndex);
+ else
+ return this->GetItemText(this->m_nSelItem);
+}
+
diff --git a/fpdfsdk/src/fxedit/fxet_module.cpp b/fpdfsdk/src/fxedit/fxet_module.cpp new file mode 100644 index 0000000000..b13af89833 --- /dev/null +++ b/fpdfsdk/src/fxedit/fxet_module.cpp @@ -0,0 +1,46 @@ +// 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 "../../include/fxedit/fxet_stub.h"
+#include "../../include/fxedit/fxet_edit.h"
+#include "../../include/fxedit/fxet_list.h"
+
+/* ---------------------- IFX_Edit ---------------------- */
+
+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)
+{
+ ASSERT(pEdit != NULL);
+
+ IPDF_VariableText::DelVariableText(pEdit->GetVariableText());
+
+ delete (CFX_Edit*)pEdit;
+}
+
+
+/* ---------------------- IFX_List ---------------------- */
+
+IFX_List* IFX_List::NewList()
+{
+ return new CFX_ListCtrl();
+}
+
+void IFX_List::DelList(IFX_List* pList)
+{
+ ASSERT(pList != NULL);
+
+ delete (CFX_ListCtrl*)pList;
+}
+
diff --git a/fpdfsdk/src/fxedit/fxet_pageobjs.cpp b/fpdfsdk/src/fxedit/fxet_pageobjs.cpp new file mode 100644 index 0000000000..99520619ad --- /dev/null +++ b/fpdfsdk/src/fxedit/fxet_pageobjs.cpp @@ -0,0 +1,687 @@ +// 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 "../../include/fxedit/fxet_stub.h"
+#include "../../include/fxedit/fx_edit.h"
+#include "../../include/fxedit/fxet_edit.h"
+
+#define FX_EDIT_UNDERLINEHALFWIDTH 0.5f
+#define FX_EDIT_CROSSOUTHALFWIDTH 0.5f
+
+extern CFX_ByteString GetPDFWordString(IFX_Edit_FontMap * pFontMap, FX_INT32 nFontIndex, FX_WORD Word, FX_WORD SubWord);
+
+CPDF_Rect GetUnderLineRect(const CPVT_Word& word)
+{
+ return CPDF_Rect(word.ptWord.x, word.ptWord.y + word.fDescent * 0.5f,
+ word.ptWord.x + word.fWidth, word.ptWord.y + word.fDescent * 0.25f);
+}
+
+CPDF_Rect GetCrossoutRect(const CPVT_Word& word)
+{
+ return CPDF_Rect(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 CPDF_Point& pt, CPDF_Font* pFont, FX_FLOAT fFontSize, CPDF_Matrix* pUser2Device,
+ const CFX_ByteString& str, FX_ARGB crTextFill, FX_ARGB crTextStroke, FX_INT32 nHorzScale)
+{
+ FX_FLOAT x = pt.x, y = pt.y;
+ pUser2Device->Transform(x, y);
+
+ if (pFont)
+ {
+ if (nHorzScale != 100)
+ {
+ CPDF_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)
+ {
+ CPDF_Point 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)
+ {
+ CPDF_Point 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, CPDF_Matrix* pUser2Device, IFX_Edit* pEdit, FX_COLORREF color,
+ const CPDF_Rect& rcClip, const CPDF_Point& ptOffset, const CPVT_WordRange* pRange)
+{
+ pDevice->SaveState();
+
+ if (!rcClip.IsEmpty())
+ {
+ CPDF_Rect rcTemp = rcClip;
+ pUser2Device->TransformRect(rcTemp);
+ FX_RECT rcDevClip;
+ rcDevClip.left = (FX_INT32)rcTemp.left;
+ rcDevClip.right = (FX_INT32)rcTemp.right;
+ rcDevClip.top = (FX_INT32)rcTemp.top;
+ rcDevClip.bottom = (FX_INT32)rcTemp.bottom;
+ pDevice->SetClip_Rect(&rcDevClip);
+ }
+
+ 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;
+ CPDF_Rect 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, CPDF_Matrix* pUser2Device, IFX_Edit* pEdit, FX_COLORREF crTextFill, FX_COLORREF crTextStroke,
+ const CPDF_Rect& rcClip, const CPDF_Point& ptOffset, const CPVT_WordRange* pRange, IFX_SystemHandler* pSystemHandler, void* pFFLData)
+{
+
+ FX_BOOL bContinuous = pEdit->GetCharArray() == 0;
+ if (pEdit->GetCharSpace() > 0.0f)
+ bContinuous = FALSE;
+
+ FX_WORD SubWord = pEdit->GetPasswordChar();
+ FX_FLOAT fFontSize = pEdit->GetFontSize();
+ CPVT_WordRange wrSelect = pEdit->GetSelectWordRange();
+ FX_INT32 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;
+ FX_INT32 nFontIndex = -1;
+ CPDF_Point ptBT(0.0f,0.0f);
+
+ pDevice->SaveState();
+
+ if (!rcClip.IsEmpty())
+ {
+ CPDF_Rect rcTemp = rcClip;
+ pUser2Device->TransformRect(rcTemp);
+ FX_RECT rcDevClip;
+ rcDevClip.left = (FX_INT32)rcTemp.left;
+ rcDevClip.right = (FX_INT32)rcTemp.right;
+ rcDevClip.top = (FX_INT32)rcTemp.top;
+ rcDevClip.bottom = (FX_INT32)rcTemp.bottom;
+ pDevice->SetClip_Rect(&rcDevClip);
+ }
+
+ 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())
+ {
+ CPDF_Rect rc(word.ptWord.x,line.ptLine.y + line.fLineDescent,
+ word.ptWord.x+word.fWidth,line.ptLine.y + line.fLineAscent);
+ rc.Intersect(rcClip);
+ //CFX_Edit* pEt = (CFX_Edit*)pEdit;
+ //CPDF_Rect rcEdit = pEt->VTToEdit(rc);
+ 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, CPDF_Point(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,CPDF_Point(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, CPDF_Point(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, CPDF_Matrix* pUser2Device, IFX_Edit* pEdit,
+ const CPDF_Rect& rcClip, const CPDF_Point& ptOffset, const CPVT_WordRange* pRange)
+{
+ //FX_FLOAT fFontSize = pEdit->GetFontSize();
+ 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;
+ CPDF_Point ptBT(0.0f,0.0f);
+
+ pDevice->SaveState();
+
+ if (!rcClip.IsEmpty())
+ {
+ CPDF_Rect rcTemp = rcClip;
+ pUser2Device->TransformRect(rcTemp);
+ FX_RECT rcDevClip;
+ rcDevClip.left = (FX_INT32)rcTemp.left;
+ rcDevClip.right = (FX_INT32)rcTemp.right;
+ rcDevClip.top = (FX_INT32)rcTemp.top;
+ rcDevClip.bottom = (FX_INT32)rcTemp.bottom;
+ pDevice->SetClip_Rect(&rcDevClip);
+ }
+
+ 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, CPDF_Point(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;
+ CPDF_Rect 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;
+ CPDF_Rect 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, CPDF_Point(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 AddLineToPageObjects(CPDF_PageObjects* pPageObjs, FX_COLORREF crStroke,
+ const CPDF_Point& pt1, const CPDF_Point& pt2)
+{
+ CPDF_PathObject* pPathObj = new CPDF_PathObject;
+ CPDF_PathData* pPathData = pPathObj->m_Path.GetModify();
+
+ pPathData->SetPointCount(2);
+ pPathData->SetPoint(0, pt1.x, pt1.y, FXPT_MOVETO);
+ pPathData->SetPoint(1, pt2.x, pt2.y, FXPT_LINETO);
+
+ FX_FLOAT rgb[3];
+ rgb[0] = FXARGB_R(crStroke) / 255.0f;
+ rgb[1] = FXARGB_G(crStroke) / 255.0f;
+ rgb[2] = FXARGB_B(crStroke) / 255.0f;
+ pPathObj->m_ColorState.SetStrokeColor(CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB), rgb, 3);
+
+ CFX_GraphStateData* pData = pPathObj->m_GraphState.GetModify();
+ pData->m_LineWidth = 1;
+
+ pPageObjs->InsertObject(pPageObjs->GetLastObjectPosition(),pPathObj);
+}
+
+static void AddRectToPageObjects(CPDF_PageObjects* pPageObjs, FX_COLORREF crFill, const CPDF_Rect& rcFill)
+{
+ CPDF_PathObject* pPathObj = new CPDF_PathObject;
+ CPDF_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;
+
+ pPageObjs->InsertObject(pPageObjs->GetLastObjectPosition(),pPathObj);
+}
+
+static CPDF_TextObject* AddTextObjToPageObjects(CPDF_PageObjects* pPageObjs, FX_COLORREF crText,
+ CPDF_Font* pFont, FX_FLOAT fFontSize, FX_FLOAT fCharSpace, FX_INT32 nHorzScale,
+ const CPDF_Point& point, const CFX_ByteString& text)
+{
+ 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);
+
+ pPageObjs->InsertObject(pPageObjs->GetLastObjectPosition(),pTxtObj);
+
+ return pTxtObj;
+}
+
+/*
+List of currently supported standard fonts:
+Courier, Courier-Bold, Courier-BoldOblique, Courier-Oblique
+Helvetica, Helvetica-Bold, Helvetica-BoldOblique, Helvetica-Oblique
+Times-Roman, Times-Bold, Times-Italic, Times-BoldItalic
+Symbol, ZapfDingbats
+*/
+
+const char* g_sFXEDITStandardFontName[] = {"Courier", "Courier-Bold", "Courier-BoldOblique", "Courier-Oblique",
+ "Helvetica", "Helvetica-Bold", "Helvetica-BoldOblique", "Helvetica-Oblique",
+ "Times-Roman", "Times-Bold", "Times-Italic", "Times-BoldItalic",
+ "Symbol", "ZapfDingbats"};
+
+static FX_BOOL FX_EDIT_IsStandardFont(const CFX_ByteString& sFontName)
+{
+ for (FX_INT32 i=0; i<14; i++)
+ {
+ if (sFontName == g_sFXEDITStandardFontName[i])
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+void IFX_Edit::GeneratePageObjects(CPDF_PageObjects* pPageObjects, IFX_Edit* pEdit,
+ const CPDF_Point& ptOffset, const CPVT_WordRange* pRange, FX_COLORREF crText, CFX_ArrayTemplate<CPDF_TextObject*>& ObjArray)
+{
+ FX_FLOAT fFontSize = pEdit->GetFontSize();
+
+ FX_INT32 nOldFontIndex = -1;
+
+ CFX_ByteTextBuf sTextBuf;
+ CPDF_Point 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(pPageObjects, crText, pFontMap->GetPDFFont(nOldFontIndex), fFontSize, 0.0f, 100,
+ CPDF_Point(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(pPageObjects, crText, pFontMap->GetPDFFont(nOldFontIndex), fFontSize, 0.0f, 100,
+ CPDF_Point(ptBT.x+ptOffset.x, ptBT.y+ptOffset.y), sTextBuf.GetByteString()));
+ }
+ }
+ }
+}
+
+void IFX_Edit::GenerateRichPageObjects(CPDF_PageObjects* pPageObjects, IFX_Edit* pEdit,
+ const CPDF_Point& 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;
+ CPDF_Point 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(pPageObjects, crOld, pFontMap->GetPDFFont(wp.nFontIndex), wp.fFontSize, wp.fCharSpace, wp.nHorzScale,
+ CPDF_Point(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)
+ {/*
+ AddLineToPageObjects(pPageObjects, crCurText,
+ CPDF_Point(word.ptWord.x, word.ptWord.y + word.fDescent * 0.4f),
+ CPDF_Point(word.ptWord.x + word.fWidth, word.ptWord.y + word.fDescent * 0.4f));
+*/
+ CPDF_Rect rcUnderline = GetUnderLineRect(word);
+ rcUnderline.left += ptOffset.x;
+ rcUnderline.right += ptOffset.x;
+ rcUnderline.top += ptOffset.y;
+ rcUnderline.bottom += ptOffset.y;
+
+ AddRectToPageObjects(pPageObjects, crCurText, rcUnderline);
+ }
+
+ if (word.WordProps.nWordStyle & PVTWORD_STYLE_CROSSOUT)
+ {
+ CPDF_Rect rcCrossout = GetCrossoutRect(word);
+ rcCrossout.left += ptOffset.x;
+ rcCrossout.right += ptOffset.x;
+ rcCrossout.top += ptOffset.y;
+ rcCrossout.bottom += ptOffset.y;
+
+ AddRectToPageObjects(pPageObjects, crCurText, rcCrossout);
+ }
+
+ oldplace = place;
+ }
+ }
+
+ if (sTextBuf.GetLength() > 0)
+ {
+ ObjArray.Add(AddTextObjToPageObjects(pPageObjects, crOld, pFontMap->GetPDFFont(wp.nFontIndex), wp.fFontSize, wp.fCharSpace, wp.nHorzScale,
+ CPDF_Point(ptBT.x+ptOffset.x, ptBT.y+ptOffset.y), sTextBuf.GetByteString()));
+ }
+ }
+ }
+}
+
+void IFX_Edit::GenerateUnderlineObjects(CPDF_PageObjects* pPageObjects, IFX_Edit* pEdit,
+ const CPDF_Point& 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))
+ {
+ CPDF_Rect rcUnderline = GetUnderLineRect(word);
+ rcUnderline.left += ptOffset.x;
+ rcUnderline.right += ptOffset.x;
+ rcUnderline.top += ptOffset.y;
+ rcUnderline.bottom += ptOffset.y;
+ AddRectToPageObjects(pPageObjects, color, rcUnderline);
+ }
+ }
+ }
+ }
+}
+
diff --git a/fpdfsdk/src/javascript/Consts.cpp b/fpdfsdk/src/javascript/Consts.cpp new file mode 100644 index 0000000000..09b8f8e1a0 --- /dev/null +++ b/fpdfsdk/src/javascript/Consts.cpp @@ -0,0 +1,247 @@ +// 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 "../../include/javascript/JavaScript.h"
+#include "../../include/javascript/IJavaScript.h"
+#include "../../include/javascript/JS_Define.h"
+#include "../../include/javascript/JS_Object.h"
+#include "../../include/javascript/JS_Value.h"
+#include "../../include/javascript/Consts.h"
+
+/* ------------------------------ border ------------------------------ */
+
+BEGIN_JS_STATIC_CONST(CJS_Border)
+ JS_STATIC_CONST_ENTRY_STRING(s, solid)
+ JS_STATIC_CONST_ENTRY_STRING(b, beveled)
+ JS_STATIC_CONST_ENTRY_STRING(d, dashed)
+ JS_STATIC_CONST_ENTRY_STRING(i, inset)
+ JS_STATIC_CONST_ENTRY_STRING(u, underline)
+END_JS_STATIC_CONST()
+
+IMPLEMENT_JS_CLASS_CONST(CJS_Border,border)
+
+/* ------------------------------ display ------------------------------ */
+
+BEGIN_JS_STATIC_CONST(CJS_Display)
+ JS_STATIC_CONST_ENTRY_NUMBER(visible, 0)
+ JS_STATIC_CONST_ENTRY_NUMBER(hidden, 1)
+ JS_STATIC_CONST_ENTRY_NUMBER(noPrint, 2)
+ JS_STATIC_CONST_ENTRY_NUMBER(noView, 3)
+END_JS_STATIC_CONST()
+
+IMPLEMENT_JS_CLASS_CONST(CJS_Display,display)
+
+/* ------------------------------ font ------------------------------ */
+
+BEGIN_JS_STATIC_CONST(CJS_Font)
+ JS_STATIC_CONST_ENTRY_STRING(Times, Times-Roman)
+ JS_STATIC_CONST_ENTRY_STRING(TimesB, Times-Bold)
+ JS_STATIC_CONST_ENTRY_STRING(TimesI, Times-Italic)
+ JS_STATIC_CONST_ENTRY_STRING(TimesBI, Times-BoldItalic)
+ JS_STATIC_CONST_ENTRY_STRING(Helv, Helvetica)
+ JS_STATIC_CONST_ENTRY_STRING(HelvB, Helvetica-Bold)
+ JS_STATIC_CONST_ENTRY_STRING(HelvI, Helvetica-Oblique)
+ JS_STATIC_CONST_ENTRY_STRING(HelvBI, Helvetica-BoldOblique)
+ JS_STATIC_CONST_ENTRY_STRING(Cour, Courier)
+ JS_STATIC_CONST_ENTRY_STRING(CourB, Courier-Bold)
+ JS_STATIC_CONST_ENTRY_STRING(CourI, Courier-Oblique)
+ JS_STATIC_CONST_ENTRY_STRING(CourBI, Courier-BoldOblique)
+ JS_STATIC_CONST_ENTRY_STRING(Symbol, Symbol)
+ JS_STATIC_CONST_ENTRY_STRING(ZapfD, ZapfDingbats)
+END_JS_STATIC_CONST()
+
+IMPLEMENT_JS_CLASS_CONST(CJS_Font,font)
+
+/* ------------------------------ highlight ------------------------------ */
+
+BEGIN_JS_STATIC_CONST(CJS_Highlight)
+ JS_STATIC_CONST_ENTRY_STRING(n, none)
+ JS_STATIC_CONST_ENTRY_STRING(i, invert)
+ JS_STATIC_CONST_ENTRY_STRING(p, push)
+ JS_STATIC_CONST_ENTRY_STRING(o, outline)
+END_JS_STATIC_CONST()
+
+IMPLEMENT_JS_CLASS_CONST(CJS_Highlight,highlight)
+
+/* ------------------------------ position ------------------------------ */
+
+BEGIN_JS_STATIC_CONST(CJS_Position)
+ JS_STATIC_CONST_ENTRY_NUMBER(textOnly, 0)
+ JS_STATIC_CONST_ENTRY_NUMBER(iconOnly, 1)
+ JS_STATIC_CONST_ENTRY_NUMBER(iconTextV, 2)
+ JS_STATIC_CONST_ENTRY_NUMBER(textIconV, 3)
+ JS_STATIC_CONST_ENTRY_NUMBER(iconTextH, 4)
+ JS_STATIC_CONST_ENTRY_NUMBER(textIconH, 5)
+ JS_STATIC_CONST_ENTRY_NUMBER(overlay, 6)
+END_JS_STATIC_CONST()
+
+IMPLEMENT_JS_CLASS_CONST(CJS_Position,position)
+
+/* ------------------------------ scaleHow ------------------------------ */
+
+BEGIN_JS_STATIC_CONST(CJS_ScaleHow)
+ JS_STATIC_CONST_ENTRY_NUMBER(proportional, 0)
+ JS_STATIC_CONST_ENTRY_NUMBER(anamorphic, 1)
+END_JS_STATIC_CONST()
+
+IMPLEMENT_JS_CLASS_CONST(CJS_ScaleHow,scaleHow)
+
+/* ------------------------------ scaleWhen ------------------------------ */
+
+BEGIN_JS_STATIC_CONST(CJS_ScaleWhen)
+ JS_STATIC_CONST_ENTRY_NUMBER(always, 0)
+ JS_STATIC_CONST_ENTRY_NUMBER(never, 1)
+ JS_STATIC_CONST_ENTRY_NUMBER(tooBig, 2)
+ JS_STATIC_CONST_ENTRY_NUMBER(tooSmall, 3)
+END_JS_STATIC_CONST()
+
+IMPLEMENT_JS_CLASS_CONST(CJS_ScaleWhen,scaleWhen)
+
+/* ------------------------------ style ------------------------------ */
+
+BEGIN_JS_STATIC_CONST(CJS_Style)
+ JS_STATIC_CONST_ENTRY_STRING(ch, check)
+ JS_STATIC_CONST_ENTRY_STRING(cr, cross)
+ JS_STATIC_CONST_ENTRY_STRING(di, diamond)
+ JS_STATIC_CONST_ENTRY_STRING(ci, circle)
+ JS_STATIC_CONST_ENTRY_STRING(st, star)
+ JS_STATIC_CONST_ENTRY_STRING(sq, square)
+END_JS_STATIC_CONST()
+
+IMPLEMENT_JS_CLASS_CONST(CJS_Style,style)
+
+
+/* ------------------------------ zoomtype ------------------------------ */
+
+BEGIN_JS_STATIC_CONST(CJS_Zoomtype)
+ JS_STATIC_CONST_ENTRY_STRING(none, NoVary)
+ JS_STATIC_CONST_ENTRY_STRING(fitP, FitPage)
+ JS_STATIC_CONST_ENTRY_STRING(fitW, FitWidth)
+ JS_STATIC_CONST_ENTRY_STRING(fitH, FitHeight)
+ JS_STATIC_CONST_ENTRY_STRING(fitV, FitVisibleWidth)
+ JS_STATIC_CONST_ENTRY_STRING(pref, Preferred)
+ JS_STATIC_CONST_ENTRY_STRING(refW, ReflowWidth)
+END_JS_STATIC_CONST()
+
+IMPLEMENT_JS_CLASS_CONST(CJS_Zoomtype,zoomtype)
+
+/* ------------------------------ CJS_GlobalConsts ------------------------------ */
+
+int CJS_GlobalConsts::Init(IJS_Runtime* pRuntime)
+{
+ DEFINE_GLOBAL_CONST(pRuntime, IDS_GREATER_THAN , Invalid value: must be greater than or equal to %s.);
+ DEFINE_GLOBAL_CONST(pRuntime, IDS_GT_AND_LT,Invalid value: must be greater than or equal to %s and less than or equal to %s.);
+ DEFINE_GLOBAL_CONST(pRuntime, IDS_LESS_THAN,Invalid value: must be less than or equal to %s.);
+ DEFINE_GLOBAL_CONST(pRuntime, IDS_INVALID_MONTH,** Invalid **);
+ DEFINE_GLOBAL_CONST(pRuntime, IDS_INVALID_DATE,Invalid date/time: please ensure that the date/time exists. Field);
+ DEFINE_GLOBAL_CONST(pRuntime, IDS_INVALID_VALUE,The value entered does not match the format of the field);
+ DEFINE_GLOBAL_CONST(pRuntime, IDS_AM,am);
+ DEFINE_GLOBAL_CONST(pRuntime, IDS_PM,pm);
+ DEFINE_GLOBAL_CONST(pRuntime, IDS_MONTH_INFO,January[1]February[2]March[3]April[4]May[5]June[6]July[7]August[8]September[9]October[10]November[11]December[12]Sept[9]Jan[1]Feb[2]Mar[3]Apr[4]Jun[6]Jul[7]Aug[8]Sep[9]Oct[10]Nov[11]Dec[12]);
+ DEFINE_GLOBAL_CONST(pRuntime, IDS_STARTUP_CONSOLE_MSG, ** ^_^ **);
+
+ return 0;
+}
+
+/* ------------------------------ CJS_GlobalArrays ------------------------------ */
+
+int CJS_GlobalArrays::Init(IJS_Runtime* pRuntime)
+{
+ {
+ FX_LPCWSTR ArrayName = (FX_LPCWSTR)L"RE_NUMBER_ENTRY_DOT_SEP";
+ FX_LPCWSTR ArrayContent[] = {(FX_LPCWSTR)L"[+-]?\\d*\\.?\\d*"};
+ DEFINE_GLOBAL_ARRAY(pRuntime);
+ }
+
+ {
+ FX_LPCWSTR ArrayName = (FX_LPCWSTR)L"RE_NUMBER_COMMIT_DOT_SEP";
+ FX_LPCWSTR ArrayContent[] = {(FX_LPCWSTR)L"[+-]?\\d+(\\.\\d+)?", /* -1.0 or -1 */
+ (FX_LPCWSTR)L"[+-]?\\.\\d+", /* -.1 */
+ (FX_LPCWSTR)L"[+-]?\\d+\\." /* -1. */
+ };
+ DEFINE_GLOBAL_ARRAY(pRuntime);
+ }
+
+ {
+ FX_LPCWSTR ArrayName = (FX_LPCWSTR)L"RE_NUMBER_ENTRY_COMMA_SEP";
+ FX_LPCWSTR ArrayContent[] = {(FX_LPCWSTR)L"[+-]?\\d*,?\\d*"};
+
+ DEFINE_GLOBAL_ARRAY(pRuntime);
+ }
+
+ {
+ FX_LPCWSTR ArrayName = (FX_LPCWSTR)L"RE_NUMBER_COMMIT_COMMA_SEP";
+ FX_LPCWSTR ArrayContent[] = {(FX_LPCWSTR)L"[+-]?\\d+([.,]\\d+)?", /* -1,0 or -1 */
+ (FX_LPCWSTR)L"[+-]?[.,]\\d+", /* -,1 */
+ (FX_LPCWSTR)L"[+-]?\\d+[.,]" /* -1, */
+ };
+ DEFINE_GLOBAL_ARRAY(pRuntime);
+ }
+
+ {
+ FX_LPCWSTR ArrayName = (FX_LPCWSTR)L"RE_ZIP_ENTRY";
+ FX_LPCWSTR ArrayContent[] = {(FX_LPCWSTR)L"\\d{0,5}"};
+ DEFINE_GLOBAL_ARRAY(pRuntime);
+ }
+
+ {
+ FX_LPCWSTR ArrayName = (FX_LPCWSTR)L"RE_ZIP_COMMIT";
+ FX_LPCWSTR ArrayContent[] = {(FX_LPCWSTR)L"\\d{5}"};
+ DEFINE_GLOBAL_ARRAY(pRuntime);
+ }
+
+ {
+ FX_LPCWSTR ArrayName = (FX_LPCWSTR)L"RE_ZIP4_ENTRY";
+ FX_LPCWSTR ArrayContent[] = {(FX_LPCWSTR)L"\\d{0,5}(\\.|[- ])?\\d{0,4}"};
+ DEFINE_GLOBAL_ARRAY(pRuntime);
+ }
+
+ {
+ FX_LPCWSTR ArrayName = (FX_LPCWSTR)L"RE_ZIP4_COMMIT";
+ FX_LPCWSTR ArrayContent[] = {(FX_LPCWSTR)L"\\d{5}(\\.|[- ])?\\d{4}"};
+ DEFINE_GLOBAL_ARRAY(pRuntime);
+ }
+
+ {
+ FX_LPCWSTR ArrayName = (FX_LPCWSTR)L"RE_PHONE_ENTRY";
+ FX_LPCWSTR ArrayContent[] = {
+ (FX_LPCWSTR)L"\\d{0,3}(\\.|[- ])?\\d{0,3}(\\.|[- ])?\\d{0,4}", /* 555-1234 or 408 555-1234 */
+ (FX_LPCWSTR)L"\\(\\d{0,3}", /* (408 */
+ (FX_LPCWSTR)L"\\(\\d{0,3}\\)(\\.|[- ])?\\d{0,3}(\\.|[- ])?\\d{0,4}", /* (408) 555-1234 */
+ /* (allow the addition of parens as an afterthought) */
+ (FX_LPCWSTR)L"\\(\\d{0,3}(\\.|[- ])?\\d{0,3}(\\.|[- ])?\\d{0,4}", /* (408 555-1234 */
+ (FX_LPCWSTR)L"\\d{0,3}\\)(\\.|[- ])?\\d{0,3}(\\.|[- ])?\\d{0,4}", /* 408) 555-1234 */
+ (FX_LPCWSTR)L"011(\\.|[- \\d])*" /* international */
+ };
+ DEFINE_GLOBAL_ARRAY(pRuntime);
+ }
+
+ {
+ FX_LPCWSTR ArrayName = (FX_LPCWSTR)L"RE_PHONE_COMMIT";
+ FX_LPCWSTR ArrayContent[] = {
+ (FX_LPCWSTR)L"\\d{3}(\\.|[- ])?\\d{4}", /* 555-1234 */
+ (FX_LPCWSTR)L"\\d{3}(\\.|[- ])?\\d{3}(\\.|[- ])?\\d{4}", /* 408 555-1234 */
+ (FX_LPCWSTR)L"\\(\\d{3}\\)(\\.|[- ])?\\d{3}(\\.|[- ])?\\d{4}", /* (408) 555-1234 */
+ (FX_LPCWSTR)L"011(\\.|[- \\d])*" /* international */
+ };
+ DEFINE_GLOBAL_ARRAY(pRuntime);
+ }
+
+ {
+ FX_LPCWSTR ArrayName = (FX_LPCWSTR)L"RE_SSN_ENTRY";
+ FX_LPCWSTR ArrayContent[] = {(FX_LPCWSTR)L"\\d{0,3}(\\.|[- ])?\\d{0,2}(\\.|[- ])?\\d{0,4}"};
+ DEFINE_GLOBAL_ARRAY(pRuntime);
+ }
+
+ {
+ FX_LPCWSTR ArrayName = (FX_LPCWSTR)L"RE_SSN_COMMIT";
+ FX_LPCWSTR ArrayContent[] = {(FX_LPCWSTR)L"\\d{3}(\\.|[- ])?\\d{2}(\\.|[- ])?\\d{4}"};
+ DEFINE_GLOBAL_ARRAY(pRuntime);
+ }
+
+ return 0;
+}
+
diff --git a/fpdfsdk/src/javascript/Document.cpp b/fpdfsdk/src/javascript/Document.cpp new file mode 100644 index 0000000000..ec930b810d --- /dev/null +++ b/fpdfsdk/src/javascript/Document.cpp @@ -0,0 +1,2527 @@ +// 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 "../../include/javascript/JavaScript.h"
+#include "../../include/javascript/IJavaScript.h"
+#include "../../include/javascript/JS_Define.h"
+#include "../../include/javascript/JS_Object.h"
+#include "../../include/javascript/JS_Value.h"
+#include "../../include/javascript/Document.h"
+#include "../../include/javascript/JS_EventHandler.h"
+#include "../../include/javascript/JS_Context.h"
+#include "../../include/javascript/JS_Runtime.h"
+#include "../../include/javascript/app.h"
+#include "../../include/javascript/Field.h"
+#include "../../include/javascript/Icon.h"
+#include "../../include/javascript/Field.h"
+
+static v8::Isolate* GetIsolate(IFXJS_Context* cc)
+{
+ CJS_Context* pContext = (CJS_Context *)cc;
+ ASSERT(pContext != NULL);
+
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+ ASSERT(pRuntime != NULL);
+
+ 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,0)
+ JS_STATIC_METHOD_ENTRY(addField, 4)
+ JS_STATIC_METHOD_ENTRY(addLink, 0)
+ JS_STATIC_METHOD_ENTRY(addIcon, 0)
+ JS_STATIC_METHOD_ENTRY(calculateNow, 0)
+ JS_STATIC_METHOD_ENTRY(closeDoc, 0)
+ JS_STATIC_METHOD_ENTRY(createDataObject, 0)
+ JS_STATIC_METHOD_ENTRY(deletePages, 2)
+ JS_STATIC_METHOD_ENTRY(exportAsText, 3)
+ JS_STATIC_METHOD_ENTRY(exportAsFDF, 6)
+ JS_STATIC_METHOD_ENTRY(exportAsXFDF, 5)
+ JS_STATIC_METHOD_ENTRY(extractPages, 3)
+ JS_STATIC_METHOD_ENTRY(getAnnot, 0)
+ JS_STATIC_METHOD_ENTRY(getAnnots, 2)
+ JS_STATIC_METHOD_ENTRY(getAnnot3D, 2)
+ JS_STATIC_METHOD_ENTRY(getAnnots3D, 1)
+ JS_STATIC_METHOD_ENTRY(getField, 1)
+ JS_STATIC_METHOD_ENTRY(getIcon, 0)
+ JS_STATIC_METHOD_ENTRY(getLinks, 0)
+ JS_STATIC_METHOD_ENTRY(getNthFieldName, 1)
+ JS_STATIC_METHOD_ENTRY(getOCGs, 0)
+ JS_STATIC_METHOD_ENTRY(getPageBox, 0)
+ JS_STATIC_METHOD_ENTRY(getPageNthWord, 3)
+ JS_STATIC_METHOD_ENTRY(getPageNthWordQuads, 2)
+ JS_STATIC_METHOD_ENTRY(getPageNumWords, 1)
+ JS_STATIC_METHOD_ENTRY(getPrintParams, 0)
+ JS_STATIC_METHOD_ENTRY(getURL, 2)
+ JS_STATIC_METHOD_ENTRY(importAnFDF, 1)
+ JS_STATIC_METHOD_ENTRY(importAnXFDF, 1)
+ JS_STATIC_METHOD_ENTRY(importTextData, 2)
+ JS_STATIC_METHOD_ENTRY(insertPages, 4)
+ JS_STATIC_METHOD_ENTRY(mailForm, 6)
+ JS_STATIC_METHOD_ENTRY(print, 9)
+ JS_STATIC_METHOD_ENTRY(removeField, 1)
+ JS_STATIC_METHOD_ENTRY(replacePages, 4)
+ JS_STATIC_METHOD_ENTRY(resetForm, 1)
+ JS_STATIC_METHOD_ENTRY(removeIcon, 0)
+ JS_STATIC_METHOD_ENTRY(saveAs, 5)
+ JS_STATIC_METHOD_ENTRY(submitForm, 23)
+ JS_STATIC_METHOD_ENTRY(mailDoc, 0)
+END_JS_STATIC_METHOD()
+
+IMPLEMENT_JS_CLASS(CJS_Document, Document)
+
+FX_BOOL CJS_Document::InitInstance(IFXJS_Context* cc)
+{
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+
+ Document* pDoc = (Document*)GetEmbedObject();
+ ASSERT(pDoc != NULL);
+
+ pDoc->AttachDoc(pContext->GetReaderDocument());
+ pDoc->SetIsolate(pContext->GetJSRuntime()->GetIsolate());
+ return TRUE;
+};
+
+/* --------------------------------- Document --------------------------------- */
+
+Document::Document(CJS_Object* pJSObject) : CJS_EmbedObj(pJSObject),
+ m_cwBaseURL(L""),
+ m_pIconTree(NULL),
+ m_pDocument(NULL),
+ m_bDelay(FALSE),
+ m_isolate(NULL)
+{
+}
+
+Document::~Document()
+{
+ if (m_pIconTree)
+ {
+ m_pIconTree->DeleteIconTree();
+ delete m_pIconTree;
+ m_pIconTree = NULL;
+ }
+ for (int i=0; i<m_DelayData.GetSize(); i++)
+ {
+ if (CJS_DelayData* pData = m_DelayData.GetAt(i))
+ {
+ delete pData;
+ pData = NULL;
+ m_DelayData.SetAt(i, NULL);
+
+ }
+ }
+
+ m_DelayData.RemoveAll();
+ m_DelayAnnotData.RemoveAll();
+}
+
+//the total number of fileds in document.
+FX_BOOL Document::numFields(OBJ_PROP_PARAMS)
+{
+ if (!vp.IsGetting()) return FALSE;
+
+ ASSERT(m_pDocument != NULL);
+
+ CPDFSDK_InterForm *pInterForm = m_pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ CPDF_InterForm *pPDFForm = pInterForm->GetInterForm();
+ ASSERT(pPDFForm != NULL);
+
+ vp << (int)pPDFForm->CountFields();
+
+ return TRUE;
+}
+
+FX_BOOL Document::dirty(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ 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(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (vp.IsGetting())
+ {
+ vp.SetNull();
+ }
+ else
+ {
+ }
+
+ return TRUE;
+}
+
+FX_BOOL Document::pageNum(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ 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(!pEnv)
+ return FALSE;
+
+ 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::ParserParams(JSObject* pObj,CJS_AnnotObj& annotobj)
+{
+ return TRUE;
+}
+
+FX_BOOL Document::addAnnot(OBJ_METHOD_PARAMS)
+{
+ return TRUE;
+}
+
+FX_BOOL Document::addField(OBJ_METHOD_PARAMS)
+{
+ //Doesn't support.
+ return TRUE;
+}
+
+//exports form fields as a tab-delimited text file to a local hard disk.
+//comment: need reader support
+//note : watch the third parameter:cPath, for what case it can be safely saved?
+//int CPDFSDK_InterForm::ExportAsText(FX_BOOL bNoPassword,StringArray aFields,String cPath);
+//return value, int the index of the parameters illegal, the index is based on 1.
+
+FX_BOOL Document::exportAsText(OBJ_METHOD_PARAMS)
+{
+ if (IsSafeMode(cc)) return TRUE;
+ return TRUE;
+}
+
+//exports form fields as a fdf file to the local hard drive
+//comment: need reader supports
+//note:the last parameter hasn't been confirmed.because the previous one blocks the way.
+//int CPDFSDK_Document::ExportAsFDF(FX_BOOL bAllFields,BOOL bNoPassword,StringArray aFields,FX_BOOL bFlags,String cPath,FX_BOOL bAnnotations);
+
+FX_BOOL Document::exportAsFDF(OBJ_METHOD_PARAMS)
+{
+ v8::Isolate* isolate = GetIsolate(cc);
+ if (IsSafeMode(cc)) return TRUE;
+
+ ASSERT(m_pDocument != NULL);
+
+ if (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS)) return FALSE;
+
+ FX_BOOL bAllFields = params.size() > 0 ? (FX_BOOL)params[0] : FALSE;
+ FX_BOOL bNoPassWord = params.size() > 1 ? (FX_BOOL)params[1] : TRUE;
+ FX_BOOL bWhole = params.size() > 2 ? (params[2].GetType() == VT_null) : TRUE;
+ CJS_Array arrayFileds(isolate);
+ if (!bWhole)
+ arrayFileds.Attach(params[2]);
+ //FX_BOOL bFlags = params.size() > 3 ? (FX_BOOL)params[3] : FALSE;
+ CFX_WideString swFilePath = params.size() > 4 ? (FX_LPCWSTR)params[4].operator CFX_WideString() : (FX_LPCWSTR)L"";
+
+ if (swFilePath.IsEmpty())
+ {
+ CPDFDoc_Environment* pEnv = m_pDocument->GetEnv();
+ swFilePath = pEnv->JS_fieldBrowse();
+ if(swFilePath.IsEmpty())
+ return TRUE;
+ }
+ else
+ {
+ swFilePath = app::PDFPathToSysPath(swFilePath);
+ }
+
+ m_pDocument->SetFocusAnnot(NULL);
+
+ CPDFSDK_InterForm* pInterForm= (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ CPDF_InterForm* pPDFForm = pInterForm->GetInterForm();
+ ASSERT(pPDFForm != NULL);
+
+ CFX_PtrArray aFields;
+
+ if (bWhole)
+ {
+ for (int j=0,jsz=pPDFForm->CountFields(); j<jsz; j++)
+ {
+ aFields.Add(pPDFForm->GetField(j));
+ }
+ }
+ else
+ {
+ for (int i=0,isz=arrayFileds.GetLength(); i<isz; i++)
+ {
+ CJS_Value valName(isolate);
+ arrayFileds.GetElement(i,valName);
+ CFX_WideString swName = valName.operator CFX_WideString();
+
+ for (int j=0, jsz=pPDFForm->CountFields(swName); j<jsz; j++)
+ {
+ aFields.Add(pPDFForm->GetField(j, swName));
+ }
+ }
+ }
+
+ CFX_PtrArray fields;
+
+ for (int i=0,sz=aFields.GetSize(); i<sz; i++)
+ {
+ CPDF_FormField* pField = (CPDF_FormField*)aFields[i];
+
+ if (!bAllFields)
+ if (pField->GetValue() == L"")
+ continue;
+
+ if (bNoPassWord)
+ if (pField->GetFieldFlags() & 0x2000)
+ continue;
+
+ fields.Add((void*)pField);
+ }
+
+ return pInterForm->ExportFieldsToFDFFile(swFilePath, fields, TRUE);
+}
+
+//exports form fields an XFDF file to the local hard drive
+//comment: need reder supports
+//note:the last parameter can't be test
+//int CPDFSDK_Document::ExportAsXFDF(FX_BOOL bAllFields,FX_BOOL bNoPassWord,StringArray aFields,String cPath,FX_BOOL bAnnoatations);
+
+FX_BOOL Document::exportAsXFDF(OBJ_METHOD_PARAMS)
+{
+ if (IsSafeMode(cc)) return TRUE;
+ ASSERT(m_pDocument != NULL);
+
+ if (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS)) return FALSE;
+
+ 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(OBJ_METHOD_PARAMS)
+{
+ v8::Isolate* isolate = GetIsolate(cc);
+ ASSERT(m_pDocument != NULL);
+
+ if (params.size() < 1) return FALSE;
+
+ CFX_WideString wideName = params[0].operator CFX_WideString();
+
+ CPDFSDK_InterForm* pInterForm = m_pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ CPDF_InterForm* pPDFForm = pInterForm->GetInterForm();
+ ASSERT(pPDFForm != NULL);
+
+ if (pPDFForm->CountFields(wideName) <= 0)
+ {
+ vRet.SetNull();
+ return TRUE;
+ }
+
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+ ASSERT(pRuntime != NULL);
+
+ JSFXObject pFieldObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime, L"Field"));
+
+ CJS_Field * pJSField = (CJS_Field*)JS_GetPrivate(isolate,pFieldObj);
+ ASSERT(pJSField != NULL);
+
+ Field * pField = (Field *)pJSField->GetEmbedObject();
+ ASSERT(pField != NULL);
+
+ pField->AttachField(this, wideName);
+ vRet = pJSField;
+
+ return TRUE;
+}
+
+//Gets the name of the nth field in the document
+//comment:
+//note: the parameter nIndex, if it is not available
+
+FX_BOOL Document::getNthFieldName(OBJ_METHOD_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ int nIndex = params.size() > 0 ? (int)params[0] : -1;
+ if (nIndex == -1) return FALSE;
+
+ CPDFSDK_InterForm* pInterForm = m_pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ CPDF_InterForm* pPDFForm = pInterForm->GetInterForm();
+ ASSERT(pPDFForm != NULL);
+
+ CPDF_FormField* pField = pPDFForm->GetField(nIndex);
+ if (!pField)
+ return FALSE;
+
+ vRet = pField->GetFullName();
+ return TRUE;
+}
+
+//imports the specified fdf file.
+//comments: need reader suppport
+//note:once the cpath is illigl then a file dialog box pops up in order to ask user to chooose the file
+//int CPDFSDK_Document::importAnFDF(String cPath);
+
+FX_BOOL Document::importAnFDF(OBJ_METHOD_PARAMS)
+{
+ if (IsSafeMode(cc)) return TRUE;
+ ASSERT(m_pDocument != NULL);
+
+ if (!(m_pDocument->GetPermissions(FPDFPERM_MODIFY) ||
+ m_pDocument->GetPermissions(FPDFPERM_ANNOT_FORM) ||
+ m_pDocument->GetPermissions(FPDFPERM_FILL_FORM))) return FALSE;
+
+
+ CFX_WideString swPath;
+
+ if (params.size() > 0)
+ swPath = params[0];
+
+ if (swPath.IsEmpty())
+ {
+ CPDFDoc_Environment* pEnv = m_pDocument->GetEnv();
+ swPath = pEnv->JS_fieldBrowse();
+ if(swPath.IsEmpty())
+ return TRUE;
+ }
+ else
+ {
+ swPath = app::PDFPathToSysPath(swPath);
+ }
+
+ m_pDocument->SetFocusAnnot(NULL);
+
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ if (!pInterForm->ImportFormFromFDFFile(swPath, TRUE))
+ return FALSE;
+
+ m_pDocument->SetChangeMark();
+// CPDFDoc_Environment* pEnv = m_pDocument->GetEnv();
+// ASSERT(pEnv != NULL);
+// IUndo* pUndo = IUndo::GetUndo(pEnv);
+// ASSERT(pUndo != NULL);
+// pUndo->Reset(m_pDocument);
+
+ return TRUE;
+}
+
+//imports and specified XFDF file containing XML form data
+//comment: need reader supports
+//note: same as up
+//int CPDFSDK_Document::importAnFDF(String cPath)
+
+FX_BOOL Document::importAnXFDF(OBJ_METHOD_PARAMS)
+{
+ if (IsSafeMode(cc)) return TRUE;
+ ASSERT(m_pDocument != NULL);
+
+ if (!(m_pDocument->GetPermissions(FPDFPERM_MODIFY) ||
+ m_pDocument->GetPermissions(FPDFPERM_ANNOT_FORM) ||
+ m_pDocument->GetPermissions(FPDFPERM_FILL_FORM))) return FALSE;
+
+ return TRUE;
+}
+
+//imports and specified text file
+//commnet: need reader supports
+//note: same as up,when nRow is not rational,adobe is dumb for it.
+//int CPDFSDK_Document::importTextData(String cPath,int nRow);
+
+FX_BOOL Document::importTextData(OBJ_METHOD_PARAMS)
+{
+ if (IsSafeMode(cc)) return TRUE;
+ ASSERT(m_pDocument != NULL);
+
+ if (!(m_pDocument->GetPermissions(FPDFPERM_MODIFY) ||
+ m_pDocument->GetPermissions(FPDFPERM_ANNOT_FORM) ||
+ m_pDocument->GetPermissions(FPDFPERM_FILL_FORM))) return FALSE;
+
+ 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(OBJ_METHOD_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS)) return FALSE;
+
+ int iLength = params.size();
+
+ FX_BOOL bUI = iLength > 0 ? (FX_BOOL)params[0] : TRUE;
+ CFX_WideString cTo = iLength > 1 ? (FX_LPCWSTR)params[1].operator CFX_WideString() : (FX_LPCWSTR)L"";
+ CFX_WideString cCc = iLength > 2 ? (FX_LPCWSTR)params[2].operator CFX_WideString() : (FX_LPCWSTR)L"";
+ CFX_WideString cBcc = iLength > 3 ? (FX_LPCWSTR)params[3].operator CFX_WideString() : (FX_LPCWSTR)L"";
+ CFX_WideString cSubject = iLength > 4 ? (FX_LPCWSTR)params[4].operator CFX_WideString() : (FX_LPCWSTR)L"";
+ CFX_WideString cMsg = iLength > 5 ? (FX_LPCWSTR)params[5].operator CFX_WideString() : (FX_LPCWSTR)L"";
+
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ CFX_ByteTextBuf textBuf;
+ if (!pInterForm->ExportFormToFDFTextBuf(textBuf))
+ return FALSE;
+
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CPDFDoc_Environment* pEnv = pContext->GetReaderApp();
+ ASSERT(pEnv != NULL);
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+ ASSERT(pRuntime != NULL);
+
+ pRuntime->BeginBlock();
+ pEnv->JS_docmailForm(textBuf.GetBuffer(), textBuf.GetLength(), bUI, (FX_LPCWSTR)cTo, (FX_LPCWSTR)cSubject, (FX_LPCWSTR)cCc, (FX_LPCWSTR)cBcc, (FX_LPCWSTR)cMsg);
+ pRuntime->EndBlock();
+ return TRUE;
+}
+
+FX_BOOL Document::print(OBJ_METHOD_PARAMS)
+{
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+ ASSERT(pRuntime != NULL);
+
+ 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() == VT_fxobject)
+ {
+ JSFXObject pObj = (JSFXObject)params[8];
+ {
+ if (JS_GetObjDefnID(pObj) == JS_GetObjDefnID(*pRuntime, L"PrintParamsObj"))
+ {
+ if (CJS_Object* pJSObj = (CJS_Object*)params[8])
+ {
+ 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];
+ if(nlength >= 2)
+ nStart = (int)params[1];
+ if(nlength >= 3)
+ nEnd = (int)params[2];
+ if(nlength >= 4)
+ bSilent = params[3];
+ if(nlength >= 5)
+ bShrinkToFit = params[4];
+ if(nlength >= 6)
+ bPrintAsImage = params[5];
+ if(nlength >= 7)
+ bReverse = params[6];
+ if(nlength >= 8)
+ bAnnotations = params[7];
+ }
+
+ ASSERT(m_pDocument != NULL);
+
+ 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(OBJ_METHOD_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (!(m_pDocument->GetPermissions(FPDFPERM_MODIFY) ||
+ m_pDocument->GetPermissions(FPDFPERM_ANNOT_FORM))) return FALSE;
+
+ if (params.size() < 1)
+ return TRUE;
+
+ CFX_WideString sFieldName = params[0].operator CFX_WideString();
+
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ CFX_PtrArray widgets;
+ pInterForm->GetWidgets(sFieldName, widgets);
+
+ int nSize = widgets.GetSize();
+
+ if (nSize > 0)
+ {
+ for (int i=0; i<nSize; i++)
+ {
+ CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)widgets[i];
+ ASSERT(pWidget != NULL);
+
+ CPDF_Rect rcAnnot = pWidget->GetRect();
+ rcAnnot.left -= 1;
+ rcAnnot.bottom -= 1;
+ rcAnnot.right += 1;
+ rcAnnot.top += 1;
+
+ CFX_RectArray aRefresh;
+ aRefresh.Add(rcAnnot);
+
+ CPDF_Page* pPage = pWidget->GetPDFPage();
+ ASSERT(pPage != NULL);
+
+ 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(OBJ_METHOD_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ 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();
+ ASSERT(pInterForm != NULL);
+
+ CPDF_InterForm* pPDFForm = pInterForm->GetInterForm();
+ ASSERT(pPDFForm != NULL);
+
+ v8::Isolate* isolate = GetIsolate(cc);
+ CJS_Array aName(isolate);
+
+ if (params.size() > 0)
+ {
+ switch (params[0].GetType())
+ {
+ default:
+ aName.Attach(params[0]);
+ break;
+ case VT_string:
+ aName.SetElement(0,params[0]);
+ break;
+ }
+
+ CFX_PtrArray aFields;
+
+ for (int i=0,isz=aName.GetLength(); i<isz; i++)
+ {
+ CJS_Value valElement(isolate);
+ aName.GetElement(i,valElement);
+ CFX_WideString swVal = valElement.operator CFX_WideString();
+
+ for (int j=0,jsz=pPDFForm->CountFields(swVal); j<jsz; j++)
+ {
+ aFields.Add((void*)pPDFForm->GetField(j,swVal));
+ }
+ }
+
+ if (aFields.GetSize() > 0)
+ {
+ pPDFForm->ResetForm(aFields, TRUE, TRUE);
+ m_pDocument->SetChangeMark();
+
+ }
+ }
+ else
+ {
+ pPDFForm->ResetForm(TRUE);
+ m_pDocument->SetChangeMark();
+
+ }
+
+ return TRUE;
+}
+
+
+FX_BOOL Document::saveAs(OBJ_METHOD_PARAMS)
+{
+
+ if (IsSafeMode(cc)) return TRUE;
+
+ ASSERT(m_pDocument != NULL);
+
+// m_pDocument->DoSaveAs();
+
+ return TRUE;
+}
+
+
+FX_BOOL Document::submitForm(OBJ_METHOD_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+// if (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS)) return FALSE;
+
+ int nSize = params.size();
+ if (nSize < 1) return FALSE;
+
+ CFX_WideString strURL;
+ FX_BOOL bFDF = TRUE;
+ FX_BOOL bEmpty = FALSE;
+ v8::Isolate* isolate = GetIsolate(cc);
+ CJS_Array aFields(isolate);
+
+ CJS_Value v = params[0];
+ if (v.GetType() == VT_string)
+ {
+ strURL = params[0].operator CFX_WideString();
+ if (nSize > 1)
+ bFDF = params[1];
+ if (nSize > 2)
+ bEmpty = params[2];
+ if (nSize > 3)
+ aFields.Attach(params[3]);
+ }
+ else if (v.GetType() == VT_object)
+ {
+ JSObject pObj = (JSObject)params[0];
+ v8::Handle<v8::Value> pValue = JS_GetObjectElement(isolate,pObj, L"cURL");
+ if (!pValue.IsEmpty())
+ strURL = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue));
+ pValue = JS_GetObjectElement(isolate,pObj, L"bFDF");
+ bFDF = CJS_Value(isolate,pValue, GET_VALUE_TYPE(pValue));
+ pValue = JS_GetObjectElement(isolate,pObj, L"bEmpty");
+ bEmpty = CJS_Value(isolate,pValue, GET_VALUE_TYPE(pValue));
+ pValue = JS_GetObjectElement(isolate,pObj,L"aFields");
+ aFields.Attach(CJS_Value(isolate,pValue, GET_VALUE_TYPE(pValue)));
+ }
+
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+ CPDF_InterForm* pPDFInterForm = pInterForm->GetInterForm();
+ ASSERT(pPDFInterForm != NULL);
+
+ FX_BOOL bAll = (aFields.GetLength() == 0);
+
+ if (bAll && bEmpty)
+ {
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+ ASSERT(pRuntime != NULL);
+
+
+ if (pPDFInterForm->CheckRequiredFields())
+ {
+ pRuntime->BeginBlock();
+ pInterForm->SubmitForm(strURL, FALSE);
+ pRuntime->EndBlock();
+ }
+
+ return TRUE;
+ }
+ else
+ {
+ CFX_PtrArray fieldObjects;
+
+ for (int i=0,sz=aFields.GetLength(); i<sz; i++)
+ {
+ CJS_Value valName(isolate);
+ aFields.GetElement(i, valName);
+ CFX_WideString sName = valName.operator CFX_WideString();
+
+ CPDF_InterForm* pPDFForm = pInterForm->GetInterForm();
+ ASSERT(pPDFForm != NULL);
+
+ 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.Add(pField);
+ }
+ }
+
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+ ASSERT(pRuntime != NULL);
+
+
+ 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::ExtractFileName(CPDFSDK_Document *pDoc,CFX_ByteString &strFileName)
+{
+ return FALSE;
+}
+
+FX_BOOL Document::ExtractFolderName(CPDFSDK_Document *pDoc,CFX_ByteString &strFolderName)
+{
+ return FALSE;
+}
+
+FX_BOOL Document::bookmarkRoot(OBJ_PROP_PARAMS)
+{
+ return TRUE;
+}
+
+FX_BOOL Document::mailDoc(OBJ_METHOD_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ FX_BOOL bUI = TRUE;
+ CFX_WideString cTo = L"";
+ CFX_WideString cCc = L"";
+ CFX_WideString cBcc = L"";
+ CFX_WideString cSubject = L"";
+ CFX_WideString cMsg = L"";
+
+
+ bUI = params.size()>=1?static_cast<FX_BOOL>(params[0]):TRUE;
+ cTo = params.size()>=2?(const wchar_t*)params[1].operator CFX_WideString():L"";
+ cCc = params.size()>=3?(const wchar_t*)params[2].operator CFX_WideString():L"";
+ cBcc = params.size()>=4?(const wchar_t*)params[3].operator CFX_WideString():L"";
+ cSubject = params.size()>=5?(const wchar_t*)params[4].operator CFX_WideString():L"";
+ cMsg = params.size()>=6?(const wchar_t*)params[5].operator CFX_WideString():L"";
+
+ v8::Isolate* isolate = GetIsolate(cc);
+
+ if(params.size()>=1 && params[0].GetType() == VT_object)
+ {
+ JSObject pObj = (JSObject )params[0];
+
+ v8::Handle<v8::Value> pValue = JS_GetObjectElement(isolate,pObj, L"bUI");
+ bUI = (int)CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue));
+
+ pValue = JS_GetObjectElement(isolate,pObj, L"cTo");
+ cTo = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
+
+ pValue = JS_GetObjectElement(isolate,pObj, L"cCc");
+ cCc = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
+
+ pValue = JS_GetObjectElement(isolate,pObj, L"cBcc");
+ cBcc = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
+
+ pValue = JS_GetObjectElement(isolate,pObj, L"cSubject");
+ cSubject = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
+
+ pValue = JS_GetObjectElement(isolate,pObj, L"cMsg");
+ cMsg = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
+
+ }
+
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+ ASSERT(pRuntime != NULL);
+
+ pRuntime->BeginBlock();
+ CPDFDoc_Environment* pEnv = pRuntime->GetReaderApp();
+ pEnv->JS_docmailForm(NULL, 0, bUI, (FX_LPCWSTR)cTo, (FX_LPCWSTR)cSubject, (FX_LPCWSTR)cCc, (FX_LPCWSTR)cBcc, (FX_LPCWSTR)cMsg);
+ pRuntime->EndBlock();
+
+ return TRUE;
+}
+
+FX_BOOL Document::author(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ CPDF_Dictionary* pDictionary = m_pDocument->GetDocument()->GetInfo();
+ if (!pDictionary)return FALSE;
+
+ if (vp.IsGetting())
+ {
+ vp << pDictionary->GetUnicodeText("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(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ CPDF_Dictionary* pDictionary = m_pDocument->GetDocument()->GetInfo();
+ if (!pDictionary)return FALSE;
+
+ CFX_WideString cwAuthor = pDictionary->GetUnicodeText("Author");
+ CFX_WideString cwTitle = pDictionary->GetUnicodeText("Title");
+ CFX_WideString cwSubject = pDictionary->GetUnicodeText("Subject");
+ CFX_WideString cwKeywords = pDictionary->GetUnicodeText("Keywords");
+ CFX_WideString cwCreator = pDictionary->GetUnicodeText("Creator");
+ CFX_WideString cwProducer = pDictionary->GetUnicodeText("Producer");
+ CFX_WideString cwCreationDate = pDictionary->GetUnicodeText("CreationDate");
+ CFX_WideString cwModDate = pDictionary->GetUnicodeText("ModDate");
+ CFX_WideString cwTrapped = pDictionary->GetUnicodeText("Trapped");
+
+ v8::Isolate* isolate = GetIsolate(cc);
+ if (!vp.IsSetting())
+ {
+ CJS_Context* pContext = (CJS_Context *)cc;
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+
+ JSFXObject pObj = JS_NewFxDynamicObj(*pRuntime, pContext, -1);
+
+ JS_PutObjectString(isolate,pObj, L"Author", cwAuthor);
+ JS_PutObjectString(isolate,pObj, L"Title", cwTitle);
+ JS_PutObjectString(isolate,pObj, L"Subject", cwSubject);
+ JS_PutObjectString(isolate,pObj, L"Keywords", cwKeywords);
+ JS_PutObjectString(isolate,pObj, L"Creator", cwCreator);
+ JS_PutObjectString(isolate,pObj, L"Producer", cwProducer);
+ JS_PutObjectString(isolate,pObj, L"CreationDate", cwCreationDate);
+ JS_PutObjectString(isolate,pObj, L"ModDate", cwModDate);
+ JS_PutObjectString(isolate,pObj, L"Trapped", cwTrapped);
+
+// It's to be compatible to non-standard info dictionary.
+ FX_POSITION pos = pDictionary->GetStartPos();
+ while(pos)
+ {
+ CFX_ByteString bsKey;
+ CPDF_Object* pValueObj = pDictionary->GetNextElement(pos, bsKey);
+ CFX_WideString wsKey = CFX_WideString::FromUTF8(bsKey);
+ if((pValueObj->GetType()==PDFOBJ_STRING) || (pValueObj->GetType()==PDFOBJ_NAME) )
+ JS_PutObjectString(isolate,pObj, wsKey, pValueObj->GetUnicodeText());
+ if(pValueObj->GetType()==PDFOBJ_NUMBER)
+ JS_PutObjectNumber(isolate,pObj, wsKey, (float)pValueObj->GetNumber());
+ if(pValueObj->GetType()==PDFOBJ_BOOLEAN)
+ JS_PutObjectBoolean(isolate,pObj, wsKey, (bool)pValueObj->GetInteger());
+ }
+
+ vp << pObj;
+ return TRUE;
+ }
+ else
+ {
+ return TRUE;
+ }
+}
+
+FX_BOOL Document::creationDate(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ CPDF_Dictionary* pDictionary = m_pDocument->GetDocument()->GetInfo();
+ if (!pDictionary)return FALSE;
+
+ if (vp.IsGetting())
+ {
+ vp << pDictionary->GetUnicodeText("CreationDate");
+ return TRUE;
+ }
+ 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(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ CPDF_Dictionary* pDictionary = m_pDocument->GetDocument()->GetInfo();
+ if (!pDictionary)return FALSE;
+
+ if (vp.IsGetting())
+ {
+ vp << pDictionary->GetUnicodeText("Creator");
+ return TRUE;
+ }
+ 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(OBJ_PROP_PARAMS)
+{
+ if (vp.IsGetting())
+ {
+ vp << m_bDelay;
+ return TRUE;
+ }
+ else
+ {
+ ASSERT(m_pDocument != NULL);
+
+ if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY)) return FALSE;
+
+ bool b;
+ vp >> b;
+
+ m_bDelay = b;
+
+ if (m_bDelay)
+ {
+ for (int i=0,sz=m_DelayData.GetSize(); i<sz; i++)
+ delete m_DelayData.GetAt(i);
+
+ m_DelayData.RemoveAll();
+ }
+ else
+ {
+ for (int i=0,sz=m_DelayData.GetSize(); i<sz; i++)
+ {
+ if (CJS_DelayData* pData = m_DelayData.GetAt(i))
+ {
+ Field::DoDelay(m_pDocument, pData);
+ delete m_DelayData.GetAt(i);
+ }
+ }
+ m_DelayData.RemoveAll();
+ }
+
+ return TRUE;
+ }
+}
+
+FX_BOOL Document::keywords(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ CPDF_Dictionary* pDictionary = m_pDocument->GetDocument()->GetInfo();
+ if (!pDictionary)return FALSE;
+
+ if (vp.IsGetting())
+ {
+ vp << pDictionary->GetUnicodeText("Keywords");
+ return TRUE;
+ }
+ 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(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ CPDF_Dictionary* pDictionary = m_pDocument->GetDocument()->GetInfo();
+ if (!pDictionary)return FALSE;
+
+ if (vp.IsGetting())
+ {
+ vp << pDictionary->GetUnicodeText("ModDate");
+ return TRUE;
+ }
+ 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(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ CPDF_Dictionary* pDictionary = m_pDocument->GetDocument()->GetInfo();
+ if (!pDictionary)return FALSE;
+
+ if (vp.IsGetting())
+ {
+ vp << pDictionary->GetUnicodeText("Producer");
+ return TRUE;
+ }
+ 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(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ CPDF_Dictionary* pDictionary = m_pDocument->GetDocument()->GetInfo();
+ if (!pDictionary)return FALSE;
+
+ if (vp.IsGetting())
+ {
+ vp << pDictionary->GetUnicodeText("Subject");
+ return TRUE;
+ }
+ 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(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (m_pDocument == NULL || m_pDocument->GetDocument() == NULL)
+ return FALSE;
+
+ CPDF_Dictionary* pDictionary = m_pDocument->GetDocument()->GetInfo();
+ if (!pDictionary)return FALSE;
+
+ if (vp.IsGetting())
+ {
+ vp << pDictionary->GetUnicodeText("Title");
+ return TRUE;
+ }
+ 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(OBJ_PROP_PARAMS)
+{
+ if (vp.IsGetting())
+ {
+ ASSERT(m_pDocument != NULL);
+ vp << m_pDocument->GetPageCount();
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+}
+
+FX_BOOL Document::external(OBJ_PROP_PARAMS)
+{
+ //In Chrome case,should always return true.
+ vp << TRUE;
+ return TRUE;
+}
+
+FX_BOOL Document::filesize(OBJ_PROP_PARAMS)
+{
+ if (!vp.IsGetting())return FALSE;
+
+ ASSERT(m_pDocument != NULL);
+
+// CFile file(m_pDocument->GetPath(), CFile::modeRead | CFile::typeBinary | CFile::shareDenyNone);
+// vp << (double)file.GetLength();
+// file.Close();
+
+ if ( m_pDocument->GetPath().IsEmpty() == FALSE)
+ {
+ CFX_ByteString bsStr = CFX_ByteString::FromUnicode( m_pDocument->GetPath() );
+ FILE * pFile = NULL;
+ pFile = fopen( bsStr.GetBuffer( bsStr.GetLength() ), "rb" );
+ if ( pFile )
+ {
+ fseek( pFile, 0, SEEK_END );
+ long lSize = ftell( pFile );
+ fclose( pFile );
+ pFile = NULL;
+
+ vp << (FX_INT32)(lSize);
+ return TRUE;
+ }
+ }
+
+ vp << 0;
+ return TRUE;
+}
+
+FX_BOOL Document::mouseX(OBJ_PROP_PARAMS)
+{
+ return TRUE;
+}
+
+FX_BOOL Document::mouseY(OBJ_PROP_PARAMS)
+{
+ return TRUE;
+}
+
+FX_BOOL Document::baseURL(OBJ_PROP_PARAMS)
+{
+ if (vp.IsGetting())
+ {
+ vp << m_cwBaseURL;
+ return TRUE;
+ }
+ else
+ {
+ vp >> m_cwBaseURL;
+ return TRUE;
+ }
+}
+
+FX_BOOL Document::calculate(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ 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(OBJ_PROP_PARAMS)
+{
+ if (!vp.IsGetting())
+ return FALSE;
+
+ CFX_WideString wsFilePath = m_pDocument->GetPath();
+
+ FX_INT32 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;
+}
+
+CFX_WideString Document::ReversalStr(CFX_WideString cbFrom)
+{
+ wchar_t* pFrom = NULL;
+ int iLenth = cbFrom.GetLength();
+ wchar_t* pResult = (wchar_t*)malloc((iLenth+1) * sizeof(wchar_t));
+ memset(pResult, 0, (iLenth+1));
+ pFrom = (wchar_t*)cbFrom.GetBuffer(iLenth);
+
+ for (int i = 0; i < iLenth; i++)
+ {
+ pResult[i] = *(pFrom + iLenth - i - 1);
+ }
+
+ cbFrom.ReleaseBuffer();
+ CFX_WideString cbRet = CFX_WideString(pResult);
+ free(pResult);
+ pResult = NULL;
+ return cbRet;
+}
+
+CFX_WideString Document::CutString(CFX_WideString cbFrom)
+{
+ wchar_t* pFrom = NULL;
+ int iLenth = cbFrom.GetLength();
+ wchar_t* pResult = (wchar_t*)malloc((iLenth+1) * sizeof(wchar_t));
+ memset(pResult, 0, (iLenth+1));
+ pFrom = (wchar_t*)cbFrom.GetBuffer(iLenth);
+
+ for (int i = 0; i < iLenth; i++)
+ {
+ if (pFrom[i] == L'\\' || pFrom[i] == L'/')
+ break;
+ pResult[i] = pFrom[i];
+ }
+
+ cbFrom.ReleaseBuffer();
+ CFX_WideString cbRet = CFX_WideString(pResult);
+ free(pResult);
+ pResult = NULL;
+ return cbRet;
+}
+
+FX_BOOL Document::path(OBJ_PROP_PARAMS)
+{
+ if (!vp.IsGetting()) return FALSE;
+
+ vp << app::SysPathToPDFPath(m_pDocument->GetPath());
+
+ return TRUE;
+}
+
+FX_BOOL Document::pageWindowRect(OBJ_PROP_PARAMS)
+{
+ return TRUE;
+}
+
+FX_BOOL Document::layout(OBJ_PROP_PARAMS)
+{
+ return TRUE;
+}
+
+FX_BOOL Document::addLink(OBJ_METHOD_PARAMS)
+{
+ return TRUE;
+}
+
+FX_BOOL Document::closeDoc(OBJ_METHOD_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+
+
+
+
+ return TRUE;
+}
+
+FX_BOOL Document::getPageBox(OBJ_METHOD_PARAMS)
+{
+ return TRUE;
+}
+
+
+FX_BOOL Document::getAnnot(OBJ_METHOD_PARAMS)
+{
+ return TRUE;
+}
+
+FX_BOOL Document::getAnnots(OBJ_METHOD_PARAMS)
+{
+ vRet.SetNull();
+ return TRUE;
+}
+
+FX_BOOL Document::getAnnot3D(OBJ_METHOD_PARAMS)
+{
+ vRet.SetNull();
+ return TRUE;
+}
+
+FX_BOOL Document::getAnnots3D(OBJ_METHOD_PARAMS)
+{
+ vRet = VT_undefined;
+ return TRUE;
+}
+
+FX_BOOL Document::getOCGs(OBJ_METHOD_PARAMS)
+{
+ return TRUE;
+}
+
+FX_BOOL Document::getLinks(OBJ_METHOD_PARAMS)
+{
+ return TRUE;
+}
+
+bool Document::IsEnclosedInRect(CFX_FloatRect rect, CFX_FloatRect LinkRect)
+{
+ if (rect.left <= LinkRect.left
+ && rect.top <= LinkRect.top
+ && rect.right >= LinkRect.right
+ && rect.bottom >= LinkRect.bottom)
+ return true;
+ else
+ return false;
+}
+
+void IconTree::InsertIconElement(IconElement* pNewIcon)
+{
+ if (!pNewIcon)return;
+
+ if (m_pHead == NULL && m_pEnd == NULL)
+ {
+ m_pHead = m_pEnd = pNewIcon;
+ m_iLength++;
+ }
+ else
+ {
+ m_pEnd->NextIcon = pNewIcon;
+ m_pEnd = pNewIcon;
+ m_iLength++;
+ }
+}
+
+void IconTree::DeleteIconTree()
+{
+ if (!m_pHead || !m_pEnd)return;
+
+ IconElement* pTemp = NULL;
+ while(m_pEnd != m_pHead)
+ {
+ pTemp = m_pHead;
+ m_pHead = m_pHead->NextIcon;
+ delete pTemp;
+ }
+
+ delete m_pEnd;
+ m_pHead = NULL;
+ m_pEnd = NULL;
+}
+
+int IconTree::GetLength()
+{
+ return m_iLength;
+}
+
+IconElement* IconTree::operator [](int iIndex)
+{
+ if (iIndex >= 0 && iIndex <= m_iLength)
+ {
+ IconElement* pTemp = m_pHead;
+ for (int i = 0; i < iIndex; i++)
+ {
+ pTemp = pTemp->NextIcon;
+ }
+ return pTemp;
+ }
+ else
+ return NULL;
+}
+
+void IconTree::DeleteIconElement(CFX_WideString swIconName)
+{
+ IconElement* pTemp = m_pHead;
+ int iLoopCount = m_iLength;
+ for (int i = 0; i < iLoopCount - 1; i++)
+ {
+ if (pTemp == m_pEnd)
+ break;
+
+ if (m_pHead->IconName == swIconName)
+ {
+ m_pHead = m_pHead->NextIcon;
+ delete pTemp;
+ m_iLength--;
+ pTemp = m_pHead;
+ }
+ if (pTemp->NextIcon->IconName == swIconName)
+ {
+ if (pTemp->NextIcon == m_pEnd)
+ {
+ m_pEnd = pTemp;
+ delete pTemp->NextIcon;
+ m_iLength--;
+ pTemp->NextIcon = NULL;
+ }
+ else
+ {
+ IconElement* pElement = pTemp->NextIcon;
+ pTemp->NextIcon = pTemp->NextIcon->NextIcon;
+ delete pElement;
+ m_iLength--;
+ pElement = NULL;
+ }
+
+ continue;
+ }
+
+ pTemp = pTemp->NextIcon;
+ }
+}
+
+FX_BOOL Document::addIcon(OBJ_METHOD_PARAMS)
+{
+ if (params.size() != 2)return FALSE;
+
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+ ASSERT(pRuntime != NULL);
+
+ CFX_WideString swIconName = params[0].operator CFX_WideString();
+
+ JSFXObject pJSIcon = (JSFXObject)params[1];
+ if (JS_GetObjDefnID(pJSIcon) != JS_GetObjDefnID(*pRuntime, L"Icon")) return FALSE;
+
+ CJS_EmbedObj* pEmbedObj = ((CJS_Object*)params[1])->GetEmbedObject();
+ if (!pEmbedObj)return FALSE;
+ Icon* pIcon = (Icon*)pEmbedObj;
+
+ if (!m_pIconTree)
+ m_pIconTree = new IconTree();
+
+ IconElement* pNewIcon = new IconElement();
+ pNewIcon->IconName = swIconName;
+ pNewIcon->NextIcon = NULL;
+ pNewIcon->IconStream = pIcon;
+ m_pIconTree->InsertIconElement(pNewIcon);
+ return TRUE;
+}
+
+FX_BOOL Document::icons(OBJ_PROP_PARAMS)
+{
+ if (vp.IsSetting())
+ return FALSE;
+
+ if (!m_pIconTree)
+ {
+ vp.SetNull();
+ return TRUE;
+ }
+
+ CJS_Array Icons(m_isolate);
+ IconElement* pIconElement = NULL;
+ int iIconTreeLength = m_pIconTree->GetLength();
+
+ CJS_Context* pContext = (CJS_Context *)cc;
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+
+ for (int i = 0; i < iIconTreeLength; i++)
+ {
+ pIconElement = (*m_pIconTree)[i];
+
+ JSFXObject pObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime, L"Icon"));
+ if (pObj.IsEmpty()) return FALSE;
+
+ CJS_Icon * pJS_Icon = (CJS_Icon *)JS_GetPrivate(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(m_isolate,pJS_Icon));
+ }
+
+ vp << Icons;
+ return TRUE;
+}
+
+FX_BOOL Document::getIcon(OBJ_METHOD_PARAMS)
+{
+ if (params.size() != 1)return FALSE;
+ if(!m_pIconTree)
+ return FALSE;
+ CFX_WideString swIconName = params[0].operator CFX_WideString();
+ int iIconCounts = m_pIconTree->GetLength();
+
+ CJS_Context* pContext = (CJS_Context *)cc;
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+
+ for (int i = 0; i < iIconCounts; i++)
+ {
+ if ((*m_pIconTree)[i]->IconName == swIconName)
+ {
+ Icon* pRetIcon = (*m_pIconTree)[i]->IconStream;
+
+ JSFXObject pObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime, L"Icon"));
+ if (pObj.IsEmpty()) return FALSE;
+
+ CJS_Icon * pJS_Icon = (CJS_Icon *)JS_GetPrivate(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(OBJ_METHOD_PARAMS)
+{
+ if (params.size() != 1)return FALSE;
+ if(!m_pIconTree)
+ return FALSE;
+ CFX_WideString swIconName = params[0].operator CFX_WideString();
+#ifndef FOXIT_CHROME_BUILD
+ m_pIconTree->DeleteIconElement(swIconName);
+#endif
+ return TRUE;
+}
+
+FX_BOOL Document::createDataObject(OBJ_METHOD_PARAMS)
+{
+ if (IsSafeMode(cc)) return TRUE;
+ ASSERT(m_pDocument != NULL);
+
+ CFX_WideString swName = L"";
+ CFX_ByteString sbName = "";
+ CFX_WideString swValue = L"";
+ CFX_WideString swMIMEType = L"";
+ CFX_WideString swCryptFilter = L"";
+ CFX_ByteString sbFileValue = "";
+
+ int iParamSize = params.size();
+ for (int i = 0; i < iParamSize; i++)
+ {
+ if (i == 0)
+ swName = params[0];
+ if (i == 1)
+ swValue = params[1];
+ if (i == 2)
+ swMIMEType = params[2];
+ if (i == 3)
+ swCryptFilter = params[4];
+ }
+
+ FILE* pFile = NULL;
+
+ //CFileStatus fileStatus;
+ const int BUFSIZE = 17;
+ FX_BYTE buf[BUFSIZE];
+ FX_BYTE *pBuffer = NULL;
+ char* pBuf = NULL;
+ int nFileSize = 0;
+ sbFileValue = CFX_ByteString::FromUnicode(swValue);
+ sbName = CFX_ByteString::FromUnicode(swName);
+ int iBufLength = sbFileValue.GetLength();
+ pBuf = (char*)malloc(sizeof(char) * iBufLength);
+ pBuf = sbFileValue.GetBuffer(iBufLength);
+
+ if ( NULL == (pFile = FXSYS_fopen( sbName.GetBuffer(sbName.GetLength()), "wb+" )) )
+ {
+ return FALSE;
+ }
+
+ fwrite( pBuf, sizeof(char), iBufLength, pFile );
+ fclose( pFile );
+ pFile = NULL;
+
+ pFile = FXSYS_fopen( sbName.GetBuffer(sbName.GetLength()), "rb+" );
+ fseek( pFile, 0, SEEK_END );
+ nFileSize = ftell( pFile );
+
+ pBuffer = new FX_BYTE[nFileSize];
+ fseek( pFile, 0, SEEK_SET );
+ size_t s = fread( pBuffer, sizeof(char), nFileSize, pFile );
+ if(s == 0)
+ {
+ delete[] pBuffer;
+ return FALSE;
+ }
+
+ CRYPT_MD5Generate(pBuffer, nFileSize, buf);
+ buf[BUFSIZE - 1] = 0;
+ CFX_WideString csCheckSum((FX_LPCWSTR)buf, 16);
+ delete[] pBuffer;
+
+ return TRUE;
+}
+
+FX_BOOL Document::media(OBJ_PROP_PARAMS)
+{
+ return TRUE;
+}
+
+FX_BOOL Document::calculateNow(OBJ_METHOD_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ 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();
+ ASSERT(pInterForm != NULL);
+ pInterForm->OnCalculate();
+ return TRUE;
+}
+
+FX_BOOL Document::Collab(OBJ_PROP_PARAMS)
+{
+ return TRUE;
+}
+
+FX_BOOL Document::getPageNthWord(OBJ_METHOD_PARAMS)
+{
+ //if (IsSafeMode(cc)) return TRUE;
+
+ ASSERT(m_pDocument != NULL);
+
+ if (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS)) return FALSE;
+
+ int nPageNo = params.GetSize() > 0 ? (int)params[0] : 0;
+ int nWordNo = params.GetSize() > 1 ? (int)params[1] : 0;
+ bool bStrip = params.GetSize() > 2 ? (bool)params[2] : true;
+
+ CPDF_Document* pDocument = m_pDocument->GetDocument();
+ if (!pDocument) return FALSE;
+
+ if (nPageNo < 0 || nPageNo >= pDocument->GetPageCount())
+ {
+ //sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
+ return FALSE;
+ }
+
+ CPDF_Dictionary* pPageDict = pDocument->GetPage(nPageNo);
+ if (!pPageDict) return FALSE;
+
+ CPDF_Page page;
+ page.Load(pDocument, pPageDict);
+ page.StartParse();
+ page.ParseContent();
+
+ FX_POSITION pos = page.GetFirstObjectPosition();
+
+ int nWords = 0;
+
+ CFX_WideString swRet;
+
+ while (pos)
+ {
+ if (CPDF_PageObject* pPageObj = page.GetNextObject(pos))
+ {
+ if (pPageObj->m_Type == PDFPAGE_TEXT)
+ {
+ int nObjWords = CountWords((CPDF_TextObject*)pPageObj);
+
+ if (nWords + nObjWords >= nWordNo)
+ {
+ swRet = GetObjWordStr((CPDF_TextObject*)pPageObj, nWordNo - nWords);
+ break;
+ }
+
+ nWords += nObjWords;
+ }
+ }
+ }
+
+ if (bStrip)
+ {
+ swRet.TrimLeft();
+ swRet.TrimRight();
+ }
+
+ vRet = swRet;
+ return TRUE;
+}
+
+FX_BOOL Document::getPageNthWordQuads(OBJ_METHOD_PARAMS)
+{
+ //if (IsSafeMode(cc)) return TRUE;
+
+ ASSERT(m_pDocument != NULL);
+
+ if (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS)) return FALSE;
+
+ return FALSE;
+}
+
+FX_BOOL Document::getPageNumWords(OBJ_METHOD_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS)) return FALSE;
+
+ int nPageNo = params.GetSize() > 0 ? (int)params[0] : 0;
+
+ CPDF_Document* pDocument = m_pDocument->GetDocument();
+ ASSERT(pDocument != NULL);
+
+ if (nPageNo < 0 || nPageNo >= pDocument->GetPageCount())
+ {
+ //sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
+ return FALSE;
+ }
+
+ CPDF_Dictionary* pPageDict = pDocument->GetPage(nPageNo);
+ if (!pPageDict) return FALSE;
+
+ CPDF_Page page;
+ page.Load(pDocument, pPageDict);
+ page.StartParse();
+ page.ParseContent();
+
+ FX_POSITION pos = page.GetFirstObjectPosition();
+
+ int nWords = 0;
+
+ while (pos)
+ {
+ if (CPDF_PageObject* pPageObj = page.GetNextObject(pos))
+ {
+ if (pPageObj->m_Type == PDFPAGE_TEXT)
+ {
+ CPDF_TextObject* pTextObj = (CPDF_TextObject*)pPageObj;
+ nWords += CountWords(pTextObj);
+ }
+ }
+ }
+
+ vRet = nWords;
+
+ return TRUE;
+}
+
+FX_BOOL Document::getPrintParams(OBJ_METHOD_PARAMS)
+{
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+ ASSERT(pRuntime != NULL);
+ JSFXObject pRetObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime, L"PrintParamsObj"));
+ //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)
+{
+ ASSERT(pTextObj != NULL);
+
+ 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(OBJ_PROP_PARAMS)
+{
+
+ return TRUE;
+}
+
+/**
+(none, NoVary)
+(fitP, FitPage)
+(fitW, FitWidth)
+(fitH, FitHeight)
+(fitV, FitVisibleWidth)
+(pref, Preferred)
+(refW, ReflowWidth)
+*/
+
+FX_BOOL Document::zoomType(OBJ_PROP_PARAMS)
+{
+ return TRUE;
+}
+
+FX_BOOL Document::deletePages(OBJ_METHOD_PARAMS)
+{
+
+
+
+
+
+
+ v8::Isolate* isolate = GetIsolate(cc);
+// if (pEnv->GetAppName().Compare(PHANTOM) != 0)
+// return TRUE;
+
+ //if (IsSafeMode(cc)) return TRUE;
+
+ ASSERT(m_pDocument != NULL);
+
+ if (!(m_pDocument->GetPermissions(FPDFPERM_MODIFY) ||
+ m_pDocument->GetPermissions(FPDFPERM_ASSEMBLE))) return FALSE;
+
+ int iSize = params.size();
+
+ int nStart = 0;
+ int nEnd = 0;
+
+ if (iSize < 1)
+ {
+ }
+ else if (iSize == 1)
+ {
+ if (params[0].GetType() == VT_object)
+ {
+ JSObject pObj = (JSObject )params[0];
+ v8::Handle<v8::Value> pValue = JS_GetObjectElement(isolate,pObj, L"nStart");
+ nStart = (int)CJS_Value(m_isolate,pValue,GET_VALUE_TYPE(pValue));
+
+ pValue = JS_GetObjectElement(isolate,pObj, L"nEnd");
+ nEnd = (int)CJS_Value(m_isolate,pValue,GET_VALUE_TYPE(pValue));
+ }
+ else
+ {
+ nStart = (int)params[0];
+ }
+ }
+ else
+ {
+ nStart = (int)params[0];
+ nEnd = (int)params[1];
+ }
+
+ int nTotal = m_pDocument->GetPageCount();
+
+ if (nStart < 0) nStart = 0;
+ if (nStart >= nTotal) nStart = nTotal - 1;
+
+ if (nEnd < 0) nEnd = 0;
+ if (nEnd >= nTotal) nEnd = nTotal - 1;
+
+ if (nEnd < nStart) nEnd = nStart;
+
+
+
+#ifndef FOXIT_CHROME_BUILD
+ return m_pDocument->DeletePages(nStart, nEnd - nStart + 1);
+#else
+ return TRUE;
+#endif
+}
+
+FX_BOOL Document::extractPages(OBJ_METHOD_PARAMS)
+{
+
+
+
+
+
+
+ v8::Isolate* isolate = GetIsolate(cc);
+
+ if (IsSafeMode(cc)) return TRUE;
+
+ ASSERT(m_pDocument != NULL);
+
+ if (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT)) return FALSE;
+
+ int iSize = params.size();
+
+ int nTotal = m_pDocument->GetPageCount();
+ int nStart = 0;
+ int nEnd = nTotal - 1;
+
+ CFX_WideString swFilePath;
+
+ if (iSize < 1)
+ {
+ }
+ else if (iSize == 1)
+ {
+ if (params[0].GetType() == VT_object)
+ {
+ JSObject pObj = (JSObject )params[0];
+ v8::Handle<v8::Value> pValue = JS_GetObjectElement(isolate,pObj, L"nStart");
+ nStart = (int)CJS_Value(m_isolate,pValue,GET_VALUE_TYPE(pValue));
+
+ pValue = JS_GetObjectElement(isolate,pObj, L"nEnd");
+ nEnd = (int)CJS_Value(m_isolate,pValue,GET_VALUE_TYPE(pValue));
+
+ pValue = JS_GetObjectElement(isolate,pObj, L"cPath");
+ swFilePath = CJS_Value(m_isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
+ }
+ else
+ {
+ nStart = (int)params[0];
+ }
+ }
+ else if (iSize == 2)
+ {
+ nStart = (int)params[0];
+ nEnd = (int)params[1];
+ }
+ else
+ {
+ nStart = (int)params[0];
+ nEnd = (int)params[1];
+ swFilePath = params[2].operator CFX_WideString();
+ }
+
+ if (nEnd < nStart)
+ nEnd = nStart;
+
+ CPDF_Document *pNewDoc = new CPDF_Document;
+ pNewDoc->CreateNewDoc();
+
+ CFX_WordArray array;
+ for (int i=nStart; i<=nEnd; i++)
+ array.Add(i);
+
+// m_pDocument->ExtractPages(array, pNewDoc);
+
+ if (swFilePath.IsEmpty())
+ {
+
+ }
+ else
+ {
+ swFilePath = app::PDFPathToSysPath(swFilePath);
+ CPDF_Creator PDFCreater(pNewDoc);
+ PDFCreater.Create(swFilePath);
+ delete pNewDoc;
+// pEnv->OpenDocument(swFilePath);
+ vRet.SetNull();
+ }
+
+ return TRUE;
+}
+
+FX_BOOL Document::insertPages(OBJ_METHOD_PARAMS)
+{
+
+
+
+
+
+
+ v8::Isolate* isolate = GetIsolate(cc);
+
+ if (IsSafeMode(cc)) return TRUE;
+
+ ASSERT(m_pDocument != NULL);
+
+ if (!(m_pDocument->GetPermissions(FPDFPERM_MODIFY) ||
+ m_pDocument->GetPermissions(FPDFPERM_ASSEMBLE))) return FALSE;
+
+ int iSize = params.size();
+
+ int nStart = 0;
+ int nEnd = 0;
+ int nPage = 0;
+
+ CFX_WideString swFilePath;
+
+ if (iSize < 1)
+ {
+ }
+ else if (iSize == 1)
+ {
+ if (params[0].GetType() == VT_object)
+ {
+ JSObject pObj = (JSObject )params[0];
+
+ v8::Handle<v8::Value> pValue = JS_GetObjectElement(isolate,pObj, L"nPage");
+ nPage = (int)CJS_Value(m_isolate,pValue,GET_VALUE_TYPE(pValue));
+
+ pValue = JS_GetObjectElement(isolate,pObj, L"cPath");
+ swFilePath = CJS_Value(m_isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
+
+ pValue = JS_GetObjectElement(isolate,pObj, L"nStart");
+ nStart = (int)CJS_Value(m_isolate,pValue,GET_VALUE_TYPE(pValue));
+
+ pValue = JS_GetObjectElement(isolate,pObj, L"nEnd");
+ nEnd = (int)CJS_Value(m_isolate,pValue,GET_VALUE_TYPE(pValue));
+ }
+ else
+ {
+ nPage = (int)params[0];
+ }
+ }
+ else
+ {
+ nPage = (int)params[0];
+
+ if (iSize >= 2)
+ swFilePath = params[1].operator CFX_WideString();
+
+ if (iSize >= 3)
+ nStart = (int)params[2];
+
+ if (iSize >= 4)
+ nEnd = (int)params[3];
+ }
+
+ nPage++;
+
+ if (nPage < 0)
+ nPage = 0;
+
+ if (nPage > m_pDocument->GetPageCount())
+ nPage = m_pDocument->GetPageCount();
+
+ if (swFilePath.IsEmpty()) return FALSE;
+
+ swFilePath = app::PDFPathToSysPath(swFilePath);
+
+ CPDF_Parser pdfParser;
+ pdfParser.StartParse(swFilePath, FALSE);
+ CPDF_Document* pSrcDoc = pdfParser.GetDocument();
+
+ if (!pSrcDoc)
+ {
+ pdfParser.CloseParser();
+ return FALSE;
+ }
+
+ int nTotal = pSrcDoc->GetPageCount();
+
+ if (nStart < 0) nStart = 0;
+ if (nStart >= nTotal) nStart = nTotal - 1;
+
+ if (nEnd < 0) nEnd = 0;
+ if (nEnd >= nTotal) nEnd = nTotal - 1;
+
+ if (nEnd < nStart) nEnd = nStart;
+
+ CFX_WordArray array;
+ for (int i=nStart; i<=nEnd; i++)
+ array.Add(i);
+
+// m_pDocument->InsertPages(nPage, pSrcDoc, array);
+
+ pdfParser.CloseParser();
+
+ return TRUE;
+}
+
+FX_BOOL Document::replacePages(OBJ_METHOD_PARAMS)
+{
+
+
+
+
+
+
+ v8::Isolate* isolate = GetIsolate(cc);
+
+ if (IsSafeMode(cc)) return TRUE;
+
+ ASSERT(m_pDocument != NULL);
+
+ if (!(m_pDocument->GetPermissions(FPDFPERM_MODIFY) ||
+ m_pDocument->GetPermissions(FPDFPERM_ASSEMBLE))) return FALSE;
+
+ int iSize = params.size();
+
+ int nStart = -1;
+ int nEnd = -1;
+ int nPage = 0;
+
+ CFX_WideString swFilePath;
+
+ if (iSize < 1)
+ {
+ }
+ else if (iSize == 1)
+ {
+ if (params[0].GetType() == VT_object)
+ {
+ JSObject pObj = (JSObject )params[0];
+
+ v8::Handle<v8::Value> pValue = JS_GetObjectElement(isolate,pObj, L"nPage");
+ nPage = (int)CJS_Value(m_isolate,pValue,GET_VALUE_TYPE(pValue));
+
+ pValue = JS_GetObjectElement(isolate,pObj, L"cPath");
+ swFilePath = CJS_Value(m_isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
+
+ pValue = JS_GetObjectElement(isolate,pObj, L"nStart");
+ nStart = (int)CJS_Value(m_isolate,pValue,GET_VALUE_TYPE(pValue));
+
+ pValue = JS_GetObjectElement(isolate,pObj, L"nEnd");
+ nEnd = (int)CJS_Value(m_isolate,pValue,GET_VALUE_TYPE(pValue));
+ }
+ else
+ {
+ nPage = (int)params[0];
+ }
+ }
+ else
+ {
+ nPage = (int)params[0];
+
+ if (iSize >= 2)
+ swFilePath = params[1].operator CFX_WideString();
+
+ if (iSize >= 3)
+ nStart = (int)params[2];
+
+ if (iSize >= 4)
+ nEnd = (int)params[3];
+ }
+
+ if (nPage < 0)
+ nPage = 0;
+
+ if (nPage >= m_pDocument->GetPageCount())
+ nPage = m_pDocument->GetPageCount() - 1;
+
+ if (swFilePath.IsEmpty()) return FALSE;
+
+ swFilePath = app::PDFPathToSysPath(swFilePath);
+
+ CPDF_Parser pdfParser;
+ pdfParser.StartParse(swFilePath, FALSE);
+ CPDF_Document* pSrcDoc = pdfParser.GetDocument();
+
+ if (!pSrcDoc)
+ {
+ pdfParser.CloseParser();
+ return FALSE;
+ }
+
+ int nTotal = pSrcDoc->GetPageCount();
+
+ if (nStart < 0)
+ {
+ if (nEnd < 0)
+ {
+ nStart = 0;
+ nEnd = nTotal - 1;
+ }
+ else
+ {
+ nStart = 0;
+ }
+ }
+ else
+ {
+ if (nEnd < 0)
+ {
+ nEnd = nStart;
+ }
+ else
+ {
+ if (nStart >= nTotal) nStart = nTotal - 1;
+ if (nEnd >= nTotal) nEnd = nTotal - 1;
+
+ if (nEnd < nStart) nEnd = nStart;
+ }
+ }
+
+ CFX_WordArray array;
+ for (int i=nStart; i<=nEnd; i++)
+ array.Add(i);
+
+// m_pDocument->ReplacePages(nPage, pSrcDoc, array);
+
+ pdfParser.CloseParser();
+
+ return TRUE;
+}
+
+FX_BOOL Document::getURL(OBJ_METHOD_PARAMS)
+{
+ if (IsSafeMode(cc)) return TRUE;
+
+ return TRUE;
+}
+
+void Document::AddDelayData(CJS_DelayData* pData)
+{
+ m_DelayData.Add(pData);
+}
+
+void Document::DoFieldDelay(const CFX_WideString& sFieldName, int nControlIndex)
+{
+ CFX_DWordArray DelArray;
+
+ 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)
+ {
+ Field::DoDelay(m_pDocument, pData);
+ delete pData;
+ m_DelayData.SetAt(i, NULL);
+ DelArray.Add(i);
+ }
+ }
+ }
+
+ for (int j=DelArray.GetSize()-1; j>=0; j--)
+ {
+ m_DelayData.RemoveAt(DelArray[j]);
+ }
+}
+
+void Document::AddDelayAnnotData(CJS_AnnotObj *pData)
+{
+ m_DelayAnnotData.Add(pData);
+}
+
+void Document::DoAnnotDelay()
+{
+ CFX_DWordArray DelArray;
+
+ for (int j=DelArray.GetSize()-1; j>=0; j--)
+ {
+ m_DelayData.RemoveAt(DelArray[j]);
+ }
+}
diff --git a/fpdfsdk/src/javascript/Field.cpp b/fpdfsdk/src/javascript/Field.cpp new file mode 100644 index 0000000000..44a744f1d1 --- /dev/null +++ b/fpdfsdk/src/javascript/Field.cpp @@ -0,0 +1,4128 @@ +// 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 "../../include/javascript/JavaScript.h"
+#include "../../include/javascript/IJavaScript.h"
+#include "../../include/javascript/JS_Define.h"
+#include "../../include/javascript/JS_Object.h"
+#include "../../include/javascript/JS_Value.h"
+#include "../../include/javascript/Field.h"
+#include "../../include/javascript/JS_EventHandler.h"
+//#include "../include/JS_ResMgr.h"
+#include "../../include/javascript/JS_Context.h"
+#include "../../include/javascript/JS_Runtime.h"
+#include "../../include/javascript/Document.h"
+#include "../../include/javascript/color.h"
+#include "../../include/javascript/PublicMethods.h"
+#include "../../include/javascript/Icon.h"
+
+
+/* ---------------------- Field ---------------------- */
+
+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, 0)
+ JS_STATIC_METHOD_ENTRY(buttonGetCaption, 1)
+ JS_STATIC_METHOD_ENTRY(buttonGetIcon, 1)
+ JS_STATIC_METHOD_ENTRY(buttonImportIcon, 0)
+ JS_STATIC_METHOD_ENTRY(buttonSetCaption, 2)
+ JS_STATIC_METHOD_ENTRY(buttonSetIcon, 2)
+ JS_STATIC_METHOD_ENTRY(checkThisBox, 2)
+ JS_STATIC_METHOD_ENTRY(clearItems, 0)
+ JS_STATIC_METHOD_ENTRY(defaultIsChecked, 2)
+ JS_STATIC_METHOD_ENTRY(deleteItemAt, 1)
+ JS_STATIC_METHOD_ENTRY(getArray , 0)
+ JS_STATIC_METHOD_ENTRY(getItemAt, 0)
+ JS_STATIC_METHOD_ENTRY(getLock, 0)
+ JS_STATIC_METHOD_ENTRY(insertItemAt, 0)
+ JS_STATIC_METHOD_ENTRY(isBoxChecked, 1)
+ JS_STATIC_METHOD_ENTRY(isDefaultChecked, 1)
+ JS_STATIC_METHOD_ENTRY(setAction, 2)
+ JS_STATIC_METHOD_ENTRY(setFocus, 0)
+ JS_STATIC_METHOD_ENTRY(setItems, 1)
+ JS_STATIC_METHOD_ENTRY(setLock, 0)
+ JS_STATIC_METHOD_ENTRY(signatureGetModifications, 0)
+ JS_STATIC_METHOD_ENTRY(signatureGetSeedValue, 0)
+ JS_STATIC_METHOD_ENTRY(signatureInfo, 0)
+ JS_STATIC_METHOD_ENTRY(signatureSetSeedValue, 0)
+ JS_STATIC_METHOD_ENTRY(signatureSign, 0)
+ JS_STATIC_METHOD_ENTRY(signatureValidate, 0)
+END_JS_STATIC_METHOD()
+
+IMPLEMENT_JS_CLASS(CJS_Field, Field)
+
+FX_BOOL CJS_Field::InitInstance(IFXJS_Context* cc)
+{
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+
+ Field* pField = (Field*)GetEmbedObject();
+ ASSERT(pField != NULL);
+
+ pField->SetIsolate(pContext->GetJSRuntime()->GetIsolate());
+
+ return TRUE;
+};
+
+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((FX_LPCWSTR)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)
+{
+ ASSERT(pDocument != NULL);
+ m_pJSDoc = pDocument;
+
+ m_pDocument = pDocument->GetReaderDoc();
+ ASSERT(m_pDocument != NULL);
+
+ 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();
+ ASSERT(pRDInterForm != NULL);
+
+ CPDF_InterForm* pInterForm = pRDInterForm->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ CFX_WideString swFieldNameTemp = csFieldName;
+ swFieldNameTemp.Replace((FX_LPCWSTR)L"..", (FX_LPCWSTR)L".");
+
+ if (pInterForm->CountFields(swFieldNameTemp) <= 0)
+ {
+ std::wstring strFieldName;
+ int iControlNo = -1;
+ ParseFieldName((wchar_t*)(FX_LPCWSTR)swFieldNameTemp, 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;
+}
+
+void Field::GetFormFields(CPDFSDK_Document* pDocument, const CFX_WideString& csFieldName, CFX_PtrArray& FieldArray)
+{
+ ASSERT(pDocument != NULL);
+
+ CPDFSDK_InterForm* pReaderInterForm = pDocument->GetInterForm();
+ ASSERT(pReaderInterForm != NULL);
+
+ CPDF_InterForm* pInterForm = pReaderInterForm->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ ASSERT(FieldArray.GetSize() == 0);
+
+ for (int i=0,sz=pInterForm->CountFields(csFieldName); i<sz; i++)
+ {
+ if (CPDF_FormField* pFormField = pInterForm->GetField(i, csFieldName))
+ FieldArray.Add((void*)pFormField);
+ }
+}
+
+void Field::GetFormFields(const CFX_WideString& csFieldName, CFX_PtrArray& FieldArray)
+{
+ ASSERT(m_pDocument != NULL);
+
+ Field::GetFormFields(m_pDocument, csFieldName, FieldArray);
+}
+
+void Field::UpdateFormField(CPDFSDK_Document* pDocument, CPDF_FormField* pFormField,
+ FX_BOOL bChangeMark, FX_BOOL bResetAP, FX_BOOL bRefresh)
+{
+ ASSERT(pDocument != NULL);
+ ASSERT(pFormField != NULL);
+
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ CFX_PtrArray widgets;
+ pInterForm->GetWidgets(pFormField, widgets);
+
+ if (bResetAP)
+ {
+ int nFieldType = pFormField->GetFieldType();
+ if (nFieldType == FIELDTYPE_COMBOBOX || nFieldType == FIELDTYPE_TEXTFIELD)
+ {
+ for (int i=0,sz=widgets.GetSize(); i<sz; i++)
+ {
+ CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)widgets.GetAt(i);
+ ASSERT(pWidget != NULL);
+
+ FX_BOOL bFormated = FALSE;
+ CFX_WideString sValue = pWidget->OnFormat(0, bFormated);
+ if (bFormated)
+ pWidget->ResetAppearance(sValue, FALSE);
+ else
+ pWidget->ResetAppearance(NULL, FALSE);
+ }
+ }
+ else
+ {
+ for (int i=0,sz=widgets.GetSize(); i<sz; i++)
+ {
+ CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)widgets.GetAt(i);
+ ASSERT(pWidget != NULL);
+
+ pWidget->ResetAppearance(NULL, FALSE);
+ }
+ }
+ }
+
+ if (bRefresh)
+ {
+ for (int i=0,sz=widgets.GetSize(); i<sz; i++)
+ {
+ CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)widgets.GetAt(i);
+ ASSERT(pWidget != NULL);
+
+ CPDFSDK_InterForm * pInterForm = pWidget->GetInterForm();
+ CPDFSDK_Document* pDoc = pInterForm->GetDocument();
+// CReader_Page* pPage = pWidget->GetPage();
+ ASSERT(pDoc != NULL);
+ pDoc->UpdateAllViews(NULL, pWidget);
+ }
+ }
+
+ if (bChangeMark)
+ pDocument->SetChangeMark();
+}
+
+void Field::UpdateFormControl(CPDFSDK_Document* pDocument, CPDF_FormControl* pFormControl,
+ FX_BOOL bChangeMark, FX_BOOL bResetAP, FX_BOOL bRefresh)
+{
+ ASSERT(pDocument != NULL);
+ ASSERT(pFormControl != NULL);
+
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ 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(0, bFormated);
+ if (bFormated)
+ pWidget->ResetAppearance(sValue, FALSE);
+ else
+ pWidget->ResetAppearance(NULL, FALSE);
+ }
+ else
+ {
+ pWidget->ResetAppearance(NULL, FALSE);
+ }
+ }
+
+ if (bRefresh)
+ {
+ CPDFSDK_InterForm * pInterForm = pWidget->GetInterForm();
+ CPDFSDK_Document* pDoc = pInterForm->GetDocument();
+ ASSERT(pDoc != NULL);
+ pDoc->UpdateAllViews(NULL, pWidget);
+ }
+
+ }
+
+ if (bChangeMark)
+ pDocument->SetChangeMark();
+}
+
+CPDFSDK_Widget* Field::GetWidget(CPDFSDK_Document* pDocument, CPDF_FormControl* pFormControl)
+{
+ ASSERT(pDocument != NULL);
+ ASSERT(pFormControl != NULL);
+
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ return pInterForm->GetWidget(pFormControl);
+}
+
+FX_BOOL Field::ValueIsOccur(CPDF_FormField* pFormField, CFX_WideString csOptLabel)
+{
+ ASSERT(pFormField != NULL);
+
+ 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)
+{
+ ASSERT(pFormField != NULL);
+ if(!pFormField->CountControls() || m_nFormControlIndex>=pFormField->CountControls()) return NULL;
+
+ if (m_nFormControlIndex<0)
+ return pFormField->GetControl(0);
+ else
+ return pFormField->GetControl(m_nFormControlIndex);
+}
+
+/* ---------------------------------------- property ---------------------------------------- */
+
+FX_BOOL Field::alignment(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ 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
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName, FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
+ return FALSE;
+
+ CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
+ if (!pFormControl)return FALSE;
+
+ switch (pFormControl->GetControlAlignment())
+ {
+ case 1:
+ vp << (FX_LPCWSTR)L"center";
+ break;
+ case 0:
+ vp << (FX_LPCWSTR)L"left";
+ break;
+ case 2:
+ vp << (FX_LPCWSTR)L"right";
+ break;
+ default:
+ vp << (FX_LPCWSTR)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(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ 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
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName, FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(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 << (FX_LPCWSTR)L"solid";
+ break;
+ case BBS_DASH:
+ vp << (FX_LPCWSTR)L"dashed";
+ break;
+ case BBS_BEVELED:
+ vp << (FX_LPCWSTR)L"beveled";
+ break;
+ case BBS_INSET:
+ vp << (FX_LPCWSTR)L"inset";
+ break;
+ case BBS_UNDERLINE:
+ vp << (FX_LPCWSTR)L"underline";
+ break;
+ default:
+ vp << (FX_LPCWSTR)L"";
+ break;
+ }
+ }
+
+ return TRUE;
+}
+
+void Field::SetBorderStyle(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex,
+ const CFX_ByteString& string)
+{
+ ASSERT(pDocument != NULL);
+
+ 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;
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(pDocument, swFieldName, FieldArray);
+
+ for (int i=0,isz=FieldArray.GetSize(); i<isz; i++)
+ {
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(i);
+ ASSERT(pFormField != NULL);
+
+ if (nControlIndex < 0)
+ {
+ FX_BOOL bSet = FALSE;
+ for (int j=0,jsz = pFormField->CountControls(); j<jsz; j++)
+ {
+ if (CPDFSDK_Widget* pWidget = GetWidget(pDocument, pFormField->GetControl(j)))
+ {
+ 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(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ 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
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ 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 << (FX_INT32)fLeft;
+ }
+
+ return TRUE;
+}
+
+void Field::SetButtonAlignX(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number)
+{
+ //Not supported.
+}
+
+FX_BOOL Field::buttonAlignY(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ 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
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ 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 << (FX_INT32)fBottom;
+ }
+
+ return TRUE;
+}
+
+void Field::SetButtonAlignY(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number)
+{
+ //Not supported.
+}
+
+FX_BOOL Field::buttonFitBounds(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ 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
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ 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(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ 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
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ 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(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ 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
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName, FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ 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 << (FX_INT32)0;
+ else
+ vp << (FX_INT32)1;
+ }
+
+ return TRUE;
+}
+
+void Field::SetButtonScaleHow(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number)
+{
+ //Not supported.
+}
+
+FX_BOOL Field::buttonScaleWhen(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ 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
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*) FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ 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 << (FX_INT32) CPDF_IconFit::Always;
+ break;
+ case CPDF_IconFit::Bigger :
+ vp << (FX_INT32) CPDF_IconFit::Bigger;
+ break;
+ case CPDF_IconFit::Never :
+ vp << (FX_INT32) CPDF_IconFit::Never;
+ break;
+ case CPDF_IconFit::Smaller :
+ vp << (FX_INT32) 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(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ 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
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName, FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ if (pFormField->GetFieldType() != FIELDTYPE_COMBOBOX && pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
+ return FALSE;
+
+ CPDFSDK_InterForm* pRDInterForm = m_pDocument->GetInterForm();
+ ASSERT(pRDInterForm != NULL);
+
+ CPDF_InterForm* pInterForm = pRDInterForm->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ vp << (FX_INT32)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(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ 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
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName, FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
+ return FALSE;
+
+ vp << (FX_INT32)pFormField->GetMaxLen();
+ }
+ return TRUE;
+}
+
+void Field::SetCharLimit(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number)
+{
+ //Not supported.
+}
+
+FX_BOOL Field::comb(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ 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
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ 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(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ 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
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ 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(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+
+ CFX_DWordArray array;
+
+ if (vp.GetType() == VT_number)
+ {
+ int iSelecting = 0;
+ vp >> iSelecting;
+ array.Add(iSelecting);
+ }
+ else if (vp.IsArrayObject())
+ {
+ CJS_Array SelArray(m_isolate);
+ CJS_Value SelValue(m_isolate);
+ int iSelecting;
+ vp >> SelArray;
+ for (int i=0,sz=SelArray.GetLength(); i<sz; i++)
+ {
+ SelArray.GetElement(i,SelValue);
+ iSelecting = (FX_INT32)SelValue;
+ array.Add(iSelecting);
+ }
+ }
+
+ if (m_bDelay)
+ {
+ AddDelay_WordArray(FP_CURRENTVALUEINDICES, array);
+ }
+ else
+ {
+ Field::SetCurrentValueIndices(m_pDocument, m_FieldName, m_nFormControlIndex, array);
+ }
+ }
+ else
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ 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(m_isolate);
+ for (int i=0,sz=pFormField->CountSelectedItems(); i<sz; i++)
+ {
+ SelArray.SetElement(i, CJS_Value(m_isolate,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 != NULL);
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(pDocument, swFieldName, FieldArray);
+
+ for (int i=0,isz=FieldArray.GetSize(); i<isz; i++)
+ {
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(i);
+ ASSERT(pFormField != NULL);
+
+ 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 = (FX_INT32)array.GetAt(i);
+ if (iSelecting < pFormField->CountOptions() && !pFormField->IsItemSelected(iSelecting))
+ pFormField->SetItemSelection(iSelecting, TRUE);
+
+ }
+ UpdateFormField(pDocument, pFormField, TRUE, TRUE, TRUE);
+ }
+ }
+}
+
+FX_BOOL Field::defaultStyle(OBJ_PROP_PARAMS)
+{
+ // MQG sError = JSGetStringFromID(IDS_STRING_NOTSUPPORT);
+ return FALSE;
+
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+
+ ;
+ }
+ else
+ {
+ ;
+ }
+ return TRUE;
+}
+
+void Field::SetDefaultStyle(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex)
+{
+ //Not supported.
+}
+
+FX_BOOL Field::defaultValue(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ 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
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ 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(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ 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
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ 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(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+
+ bool bVP;
+ vp >> bVP;
+ }
+ else
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ 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(OBJ_PROP_PARAMS)
+{
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+
+ bool bVP;
+ vp >> bVP;
+
+ SetDelay(bVP);
+ }
+ else
+ {
+ vp << m_bDelay;
+ }
+ return TRUE;
+}
+
+FX_BOOL Field::display(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ 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
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ CPDFSDK_Widget* pWidget = pInterForm->GetWidget(GetSmartFieldControl(pFormField));
+ if (!pWidget)return FALSE;
+
+ FX_DWORD dwFlag = pWidget->GetFlags();
+
+ if (ANNOTFLAG_INVISIBLE & dwFlag || ANNOTFLAG_HIDDEN & dwFlag)
+ {
+ vp << (FX_INT32)1;
+ }
+ else
+ {
+ if (ANNOTFLAG_PRINT & dwFlag)
+ {
+ if (ANNOTFLAG_NOVIEW & dwFlag)
+ {
+ vp << (FX_INT32)3;
+ }
+ else
+ {
+ vp << (FX_INT32)0;
+ }
+ }
+ else
+ {
+ vp << (FX_INT32)2;
+ }
+ }
+ }
+
+ return TRUE;
+}
+
+void Field::SetDisplay(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number)
+{
+ ASSERT(pDocument != NULL);
+
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(pDocument, swFieldName, FieldArray);
+
+ for (int i=0,isz=FieldArray.GetSize(); i<isz; i++)
+ {
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(i);
+ ASSERT(pFormField != NULL);
+
+ if (nControlIndex < 0)
+ {
+ FX_BOOL bSet = FALSE;
+ for (int j=0,jsz = pFormField->CountControls(); j<jsz; j++)
+ {
+ CPDF_FormControl* pFormControl = pFormField->GetControl(j);
+ ASSERT(pFormControl != NULL);
+
+ 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(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pJSDoc != NULL);
+
+ if (!vp.IsGetting())return FALSE;
+
+ vp << (CJS_Object*)(*m_pJSDoc);
+
+ return TRUE;
+}
+
+FX_BOOL Field::editable(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+
+ bool bVP;
+ vp >> bVP;
+
+ }
+ else
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName, FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ if (pFormField->GetFieldType() != FIELDTYPE_COMBOBOX)
+ return FALSE;
+
+ if (pFormField->GetFieldFlags() & FIELDFLAG_EDIT)
+ vp << true;
+ else
+ vp << false;
+ }
+
+ return TRUE;
+}
+
+FX_BOOL Field::exportValues(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ 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_Array ExportValusArray(m_isolate);
+
+ if (m_nFormControlIndex < 0)
+ {
+ for (int i=0,sz=pFormField->CountControls(); i<sz; i++)
+ {
+ CPDF_FormControl* pFormControl = pFormField->GetControl(i);
+ ASSERT(pFormControl != NULL);
+
+ ExportValusArray.SetElement(i, CJS_Value(m_isolate,(FX_LPCWSTR)pFormControl->GetExportValue()));
+ }
+ }
+ else
+ {
+ if(m_nFormControlIndex >= pFormField->CountControls()) return FALSE;
+ CPDF_FormControl* pFormControl = pFormField->GetControl(m_nFormControlIndex);
+ if (!pFormControl) return FALSE;
+
+ ExportValusArray.SetElement(0, CJS_Value(m_isolate,(FX_LPCWSTR)pFormControl->GetExportValue()));
+ }
+
+ vp << ExportValusArray;
+ }
+
+ return TRUE;
+}
+
+FX_BOOL Field::fileSelect(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName, FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ 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(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ CJS_Array crArray(m_isolate);
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) 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 = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ 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(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ 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
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ 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)
+{
+ ASSERT(pDocument != NULL);
+
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(pDocument, swFieldName, FieldArray);
+
+ for (int i=0,isz=FieldArray.GetSize(); i<isz; i++)
+ {
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(i);
+ ASSERT(pFormField != NULL);
+
+ if (nControlIndex < 0)
+ {
+ FX_BOOL bSet = FALSE;
+ for (int j=0,jsz = pFormField->CountControls(); j<jsz; j++)
+ {
+ if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormField->GetControl(j)))
+ {
+ 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(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ 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
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ 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 << (FX_LPCWSTR)L"none";
+ break;
+ case CPDF_FormControl::Push:
+ vp << (FX_LPCWSTR)L"push";
+ break;
+ case CPDF_FormControl::Invert:
+ vp << (FX_LPCWSTR)L"invert";
+ break;
+ case CPDF_FormControl::Outline:
+ vp << (FX_LPCWSTR)L"outline";
+ break;
+ case CPDF_FormControl::Toggle:
+ vp << (FX_LPCWSTR)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(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ 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
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
+ if (!pFormControl) return FALSE;
+
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ if(!pFormField->CountControls()) return FALSE;
+
+ CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormField->GetControl(0));
+ if (!pWidget) return FALSE;
+
+ vp << (FX_INT32)pWidget->GetBorderWidth();
+ }
+
+ return TRUE;
+}
+
+void Field::SetLineWidth(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number)
+{
+ ASSERT(pDocument != NULL);
+
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(pDocument, swFieldName, FieldArray);
+
+ for (int i=0,isz=FieldArray.GetSize(); i<isz; i++)
+ {
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(i);
+ ASSERT(pFormField != NULL);
+
+ if (nControlIndex < 0)
+ {
+ FX_BOOL bSet = FALSE;
+ for (int j=0,jsz=pFormField->CountControls(); j<jsz; j++)
+ {
+ CPDF_FormControl* pFormControl = pFormField->GetControl(j);
+ ASSERT(pFormControl != NULL);
+
+ 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(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ 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
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName, FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ 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(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ 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
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ 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(OBJ_PROP_PARAMS)
+{
+ if (!vp.IsGetting()) return FALSE;
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName, FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ vp << m_FieldName;
+
+ return TRUE;
+}
+
+FX_BOOL Field::numItems(OBJ_PROP_PARAMS)
+{
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName, FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ if (pFormField->GetFieldType() != FIELDTYPE_COMBOBOX &&
+ pFormField->GetFieldType() != FIELDTYPE_LISTBOX)
+ return FALSE;
+
+ if (!vp.IsGetting()) return FALSE;
+
+ vp << (FX_INT32)pFormField->CountOptions();
+
+ return TRUE;
+}
+
+FX_BOOL Field::page(OBJ_PROP_PARAMS)
+{
+ if (!vp.IsGetting()) return FALSE;
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName, FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ if (!pFormField) return FALSE;
+
+ ASSERT(m_pDocument != NULL);
+
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ CFX_PtrArray widgetArray;
+ pInterForm->GetWidgets(pFormField, widgetArray);
+
+ if (widgetArray.GetSize() > 0)
+ {
+ CJS_Array PageArray(m_isolate);
+
+ for (int i=0,sz=widgetArray.GetSize(); i<sz; i++)
+ {
+ CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)widgetArray.GetAt(i);
+ ASSERT(pWidget != NULL);
+
+ CPDFSDK_PageView* pPageView = pWidget->GetPageView();
+ if(!pPageView)
+ return FALSE;
+
+ PageArray.SetElement(i, CJS_Value(m_isolate,(FX_INT32)pPageView->GetPageIndex()));
+ }
+
+ vp << PageArray;
+ }
+ else
+ {
+ vp << (FX_INT32) -1;
+ }
+
+ return TRUE;
+}
+
+FX_BOOL Field::password(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ 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
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ 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(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName, FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+
+ bool bVP;
+ vp >> bVP;
+
+ for (int i=0,isz=FieldArray.GetSize(); i<isz; i++)
+ {
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(i);
+ ASSERT(pFormField != NULL);
+
+ if (m_nFormControlIndex < 0)
+ {
+ FX_BOOL bSet = FALSE;
+ for (int j=0,jsz = pFormField->CountControls(); j<jsz; j++)
+ {
+ if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormField->GetControl(j)))
+ {
+ 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 = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ 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(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+
+ bool bVP;
+ vp >> bVP;
+
+ }
+ else
+ {
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ if (pFormField->GetFieldType() != FIELDTYPE_RADIOBUTTON)
+ return FALSE;
+
+ if (pFormField->GetFieldFlags() & FIELDFLAG_RADIOSINUNISON)
+ vp << true;
+ else
+ vp << false;
+ }
+
+ return TRUE;
+}
+
+FX_BOOL Field::readonly(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+
+ bool bVP;
+ vp >> bVP;
+
+ }
+ else
+ {
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ if (pFormField->GetFieldFlags() & FIELDFLAG_READONLY)
+ vp << true;
+ else
+ vp << false;
+ }
+
+ return TRUE;
+}
+
+FX_BOOL Field::rect(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+ if (!vp.IsArrayObject())return FALSE;
+
+ CJS_Array rcArray(m_isolate);
+ vp >> rcArray;
+ CJS_Value Upper_Leftx(m_isolate), Upper_Lefty(m_isolate), Lower_Rightx(m_isolate), Lower_Righty(m_isolate);
+ 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)(FX_INT32)Upper_Leftx;
+ pArray[1] = (FX_FLOAT)(FX_INT32)Lower_Righty;
+ pArray[2] = (FX_FLOAT)(FX_INT32)Lower_Rightx;
+ pArray[3] = (FX_FLOAT)(FX_INT32)Upper_Lefty;
+
+ CPDF_Rect crRect(pArray);
+
+ if (m_bDelay)
+ {
+ AddDelay_Rect(FP_RECT, crRect);
+ }
+ else
+ {
+ Field::SetRect(m_pDocument, m_FieldName, m_nFormControlIndex, crRect);
+ }
+ }
+ else
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ CPDFSDK_Widget* pWidget = pInterForm->GetWidget(GetSmartFieldControl(pFormField));
+ if (!pWidget) return FALSE;
+
+ CFX_FloatRect crRect = pWidget->GetRect();
+ CJS_Value Upper_Leftx(m_isolate),Upper_Lefty(m_isolate),Lower_Rightx(m_isolate),Lower_Righty(m_isolate);
+ Upper_Leftx = (FX_INT32)crRect.left;
+ Upper_Lefty = (FX_INT32)crRect.top;
+ Lower_Rightx = (FX_INT32)crRect.right;
+ Lower_Righty = (FX_INT32)crRect.bottom;
+
+ CJS_Array rcArray(m_isolate);
+ 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 CPDF_Rect& rect)
+{
+ ASSERT(pDocument != NULL);
+
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(pDocument, swFieldName, FieldArray);
+
+ for (int i=0,isz=FieldArray.GetSize(); i<isz; i++)
+ {
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(i);
+ ASSERT(pFormField != NULL);
+
+ 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 != NULL);
+
+ if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl))
+ {
+ CPDF_Rect crRect = rect;
+
+ CPDF_Page* pPDFPage = pWidget->GetPDFPage();
+ ASSERT(pPDFPage != NULL);
+
+// CPDF_Page* pPDFPage = pPage->GetPage();
+// ASSERT(pPDFPage != NULL);
+
+ crRect.Intersect(pPDFPage->GetPageBBox());
+
+ if (!crRect.IsEmpty())
+ {
+ CPDF_Rect 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))
+ {
+ CPDF_Rect crRect = rect;
+
+ CPDF_Page* pPDFPage = pWidget->GetPDFPage();
+ ASSERT(pPDFPage != NULL);
+
+// CPDF_Page* pPDFPage = pPage->GetPage();
+// ASSERT(pPDFPage != NULL);
+
+ crRect.Intersect(pPDFPage->GetPageBBox());
+
+ if (!crRect.IsEmpty())
+ {
+ CPDF_Rect 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(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+
+
+ bool bVP;
+ vp >> bVP;
+
+ }
+ else
+ {
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ if (pFormField->GetFieldType() == FIELDTYPE_PUSHBUTTON)
+ return FALSE;
+
+ if (pFormField->GetFieldFlags() & FIELDFLAG_REQUIRED)
+ vp << true;
+ else
+ vp << false;
+ }
+
+ return TRUE;
+}
+
+FX_BOOL Field::richText(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ 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
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ 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(OBJ_PROP_PARAMS)
+{
+ return TRUE;
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+ ;
+ }
+ else
+ {
+ ;
+ }
+ return TRUE;
+}
+
+void Field::SetRichValue(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex)
+{
+ //Not supported.
+}
+
+FX_BOOL Field::rotation(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ 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
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
+ if (!pFormControl)return FALSE;
+
+ vp << (FX_INT32)pFormControl->GetRotation();
+ }
+
+ return TRUE;
+}
+
+void Field::SetRotation(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number)
+{
+ //Not supported.
+}
+
+FX_BOOL Field::strokeColor(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+
+ if (!vp.IsArrayObject())return FALSE;
+
+ CJS_Array crArray(m_isolate);
+ 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
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ 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;
+
+ CJS_Array crArray(m_isolate);
+ 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(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ 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
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ 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(OBJ_PROP_PARAMS)
+{
+ return TRUE;
+}
+
+FX_BOOL Field::textColor(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+
+ CJS_Array crArray(m_isolate);
+ 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
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
+ if (!pFormControl)return FALSE;
+
+ int iColorType;
+ FX_ARGB color;
+ CPDF_DefaultAppearance FieldAppearance = pFormControl->GetDefaultAppearance();
+ FieldAppearance.GetColor(color, iColorType);
+ FX_INT32 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);
+
+ CJS_Array crArray(m_isolate);
+ 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(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ 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
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ 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(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ 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
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ 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(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (!vp.IsGetting()) return FALSE;
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ switch (pFormField->GetFieldType())
+ {
+ case FIELDTYPE_UNKNOWN:
+ vp << (FX_LPCWSTR)L"unknown";
+ break;
+ case FIELDTYPE_PUSHBUTTON:
+ vp << (FX_LPCWSTR)L"button";
+ break;
+ case FIELDTYPE_CHECKBOX:
+ vp << (FX_LPCWSTR)L"checkbox";
+ break;
+ case FIELDTYPE_RADIOBUTTON:
+ vp << (FX_LPCWSTR)L"radiobutton";
+ break;
+ case FIELDTYPE_COMBOBOX:
+ vp << (FX_LPCWSTR)L"combobox";
+ break;
+ case FIELDTYPE_LISTBOX:
+ vp << (FX_LPCWSTR)L"listbox";
+ break;
+ case FIELDTYPE_TEXTFIELD:
+ vp << (FX_LPCWSTR)L"text";
+ break;
+ case FIELDTYPE_SIGNATURE:
+ vp << (FX_LPCWSTR)L"signature";
+ break;
+ default :
+ vp << (FX_LPCWSTR)L"unknown";
+ break;
+ }
+
+ return TRUE;
+}
+
+FX_BOOL Field::userName(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ 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
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ 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(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+
+ CJS_WideStringArray strArray;
+
+ if (vp.IsArrayObject())
+ {
+ CJS_Array ValueArray(m_isolate);
+ vp.ConvertToArray(ValueArray);
+ for (int i = 0,sz = ValueArray.GetLength(); i < sz; i++)
+ {
+ CJS_Value ElementValue(m_isolate);
+ ValueArray.GetElement(i, ElementValue);
+ strArray.Add(ElementValue.operator CFX_WideString());
+ }
+ }
+ 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
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+
+
+ switch (pFormField->GetFieldType())
+ {
+ case FIELDTYPE_PUSHBUTTON:
+ return FALSE;
+ case FIELDTYPE_COMBOBOX:
+ case FIELDTYPE_TEXTFIELD:
+ {
+ CFX_WideString swValue = pFormField->GetValue();
+
+ double dRet;
+ FX_BOOL bDot;
+ if (CJS_PublicMethods::ConvertStringToNumber(swValue,dRet,bDot))
+ {
+ if (bDot)
+ vp << dRet;
+ else
+ vp << dRet;
+ }
+ else
+ vp << swValue;
+ }
+ break;
+ case FIELDTYPE_LISTBOX:
+ {
+ if (pFormField->CountSelectedItems() > 1)
+ {
+ CJS_Array ValueArray(m_isolate);
+ CJS_Value ElementValue(m_isolate);
+ int iIndex;
+ for (int i = 0, sz = pFormField->CountSelectedItems(); i < sz; i++)
+ {
+ iIndex = pFormField->GetSelectedIndex(i);
+ ElementValue = pFormField->GetOptionValue(iIndex);
+ if (FXSYS_wcslen((FX_LPCWSTR)ElementValue.operator CFX_WideString()) == 0)
+ ElementValue = pFormField->GetOptionLabel(iIndex);
+ ValueArray.SetElement(i, ElementValue);
+ }
+ vp << ValueArray;
+ }
+ else
+ {
+ CFX_WideString swValue = pFormField->GetValue();
+
+ double dRet;
+ FX_BOOL bDot;
+ if (CJS_PublicMethods::ConvertStringToNumber(swValue,dRet,bDot))
+ {
+ if (bDot)
+ vp << dRet;
+ else
+ vp << dRet;
+ }
+ else
+ vp << swValue;
+ }
+ }
+ break;
+ case FIELDTYPE_CHECKBOX:
+ case FIELDTYPE_RADIOBUTTON:
+ {
+ FX_BOOL bFind = FALSE;
+ for (int i = 0 , sz = pFormField->CountControls(); i < sz; i++)
+ {
+ if (pFormField->GetControl(i)->IsChecked())
+ {
+ CFX_WideString swValue = pFormField->GetControl(i)->GetExportValue();
+
+ double dRet;
+ FX_BOOL bDot;
+ if (CJS_PublicMethods::ConvertStringToNumber(swValue,dRet,bDot))
+ {
+ if (bDot)
+ vp << dRet;
+ else
+ vp << dRet;
+ }
+ else
+ vp << swValue;
+
+ bFind = TRUE;
+ break;
+ }
+ else
+ continue;
+ }
+ if (!bFind)
+ vp << (FX_LPCWSTR)L"Off";
+ }
+ break;
+ default:
+ vp << pFormField->GetValue();
+ break;
+ }
+ }
+
+ return TRUE;
+}
+
+void Field::SetValue(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName,
+ int nControlIndex, const CJS_WideStringArray& strArray)
+{
+ ASSERT(pDocument != NULL);
+
+ if (strArray.GetSize() < 1) return;
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(pDocument, swFieldName, FieldArray);
+
+ for (int i=0,isz=FieldArray.GetSize(); i<isz; i++)
+ {
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(i);
+ ASSERT(pFormField != NULL);
+
+ 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(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (!vp.IsGetting()) return FALSE;
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ if (pFormField->GetFieldType() == FIELDTYPE_PUSHBUTTON)
+ return FALSE;
+
+ if (pFormField->GetFieldType() == FIELDTYPE_CHECKBOX)
+ {
+ if(!pFormField->CountControls()) return FALSE;
+
+ if (pFormField->GetControl(0)->IsChecked())
+ vp << (FX_LPCWSTR)L"Yes";
+ else
+ vp << (FX_LPCWSTR)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 << (FX_LPCWSTR)pFormField->GetControl(i)->GetExportValue();
+ break;
+ }
+ else
+ vp << (FX_LPCWSTR)L"Off";
+ }
+ }
+ else if (pFormField->GetFieldType() == FIELDTYPE_LISTBOX && (pFormField->CountSelectedItems() > 1))
+ {
+ vp << (FX_LPCWSTR)L"";
+ }
+ else
+ vp << (FX_LPCWSTR)pFormField->GetValue();
+
+ return TRUE;
+}
+
+/* --------------------------------- methods --------------------------------- */
+
+FX_BOOL Field::browseForFileToSubmit(OBJ_METHOD_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName, FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ CPDFDoc_Environment* pApp = m_pDocument->GetEnv();
+ ASSERT(pApp != NULL);
+
+ 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);
+ }
+ }
+ else
+ return FALSE;
+
+ return TRUE;
+}
+
+
+FX_BOOL Field::buttonGetCaption(OBJ_METHOD_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ int nface = 0;
+ int iSize = params.size();
+ if ( iSize >= 1)
+ nface = (FX_INT32) params[0];
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)
+ return FALSE;
+
+ CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
+ if (!pFormControl)return FALSE;
+
+ if (nface == 0)
+ vRet = pFormControl->GetNormalCaption();
+ else if (nface == 1)
+ vRet = pFormControl->GetDownCaption();
+ else if (nface == 2)
+ vRet = pFormControl->GetRolloverCaption();
+ else
+ return FALSE;
+
+ return TRUE;
+}
+
+//#pragma warning(disable: 4800)
+
+FX_BOOL Field::buttonGetIcon(OBJ_METHOD_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ int nface = 0;
+ int iSize = params.size();
+ if ( iSize >= 1)
+ nface = (FX_INT32) params[0];
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)
+ return FALSE;
+
+ CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
+ if (!pFormControl)return FALSE;
+
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+ ASSERT(pRuntime != NULL);
+
+ JSFXObject pObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime, L"Icon"));
+ ASSERT(pObj.IsEmpty() == FALSE);
+
+ CJS_Icon* pJS_Icon = (CJS_Icon*)JS_GetPrivate(pObj);
+ ASSERT(pJS_Icon != NULL);
+
+ Icon* pIcon = (Icon*)pJS_Icon->GetEmbedObject();
+ ASSERT(pIcon != NULL);
+
+ 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;
+}
+
+//#pragma warning(default: 4800)
+
+FX_BOOL Field::buttonImportIcon(OBJ_METHOD_PARAMS)
+{
+#if 0
+ ASSERT(m_pDocument != NULL);
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ if (!pFormField)return FALSE;
+
+ CPDFDoc_Environment* pEnv = m_pDocument->GetEnv();
+ ASSERT(pEnv);
+
+ CFX_WideString sIconFileName = pEnv->JS_fieldBrowse();
+ if (sIconFileName.IsEmpty())
+ {
+ vRet = 1;
+ return TRUE;
+ }
+
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ CPDF_Stream* pStream = pInterForm->LoadImageFromFile(sIconFileName);
+ if (!pStream)
+ {
+ vRet = -1;
+ return TRUE;
+ }
+
+ CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
+ if (!pFormControl)return FALSE;
+
+ pFormControl->SetNormalIcon(pStream);
+ UpdateFormControl(m_pDocument, pFormControl, TRUE, TRUE, TRUE);
+
+ vRet = 0;
+#endif // 0
+ return TRUE;
+}
+
+FX_BOOL Field::buttonSetCaption(OBJ_METHOD_PARAMS)
+{
+ return FALSE;
+}
+
+FX_BOOL Field::buttonSetIcon(OBJ_METHOD_PARAMS)
+{
+ return FALSE;
+}
+
+FX_BOOL Field::checkThisBox(OBJ_METHOD_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (!m_bCanSet) return FALSE;
+
+ int iSize = params.size();
+ int nWidget = -1;
+ if ( iSize >= 1)
+ nWidget= (FX_INT32) params[0];
+ else
+ return FALSE;
+ FX_BOOL bCheckit = TRUE;
+ if ( iSize >= 2)
+ bCheckit = params[1];
+
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ if (pFormField->GetFieldType() != FIELDTYPE_CHECKBOX && pFormField->GetFieldType() != FIELDTYPE_RADIOBUTTON)
+ return FALSE;
+ if(nWidget <0 || nWidget >= pFormField->CountControls())
+ return FALSE;
+ 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(OBJ_METHOD_PARAMS)
+{
+ return TRUE;
+}
+
+FX_BOOL Field::defaultIsChecked(OBJ_METHOD_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (!m_bCanSet) return FALSE;
+
+ int iSize = params.size();
+ int nWidget = -1;
+ if ( iSize >= 1)
+ nWidget= (FX_INT32) params[0];
+ else
+ return FALSE;
+ //FX_BOOL bIsDefaultChecked = TRUE;
+ //if ( iSize >= 2)
+ // bIsDefaultChecked = params[1];
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ if(nWidget <0 || nWidget >= pFormField->CountControls())
+ {
+ vRet = FALSE;
+ return FALSE;
+ }
+ if ((pFormField->GetFieldType() == FIELDTYPE_CHECKBOX)
+ || (pFormField->GetFieldType() == FIELDTYPE_RADIOBUTTON))
+ {
+
+ vRet = TRUE;
+ }
+ else
+ vRet = FALSE;
+
+ return TRUE;
+}
+
+FX_BOOL Field::deleteItemAt(OBJ_METHOD_PARAMS)
+{
+ return TRUE;
+}
+
+int JS_COMPARESTRING(CFX_WideString* ps1, CFX_WideString* ps2)
+{
+ ASSERT(ps1 != NULL);
+ ASSERT(ps2 != NULL);
+
+ return ps1->Compare(*ps2);
+}
+
+
+FX_BOOL Field::getArray(OBJ_METHOD_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CGW_ArrayTemplate<CFX_WideString*> swSort;
+
+ for (int i=0,sz=FieldArray.GetSize(); i<sz; i++)
+ {
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(i);
+ ASSERT(pFormField != NULL);
+
+ swSort.Add(new CFX_WideString(pFormField->GetFullName()));
+
+ }
+ swSort.Sort(JS_COMPARESTRING);
+
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+ ASSERT(pRuntime != NULL);
+
+ CJS_Array FormFieldArray(m_isolate);
+ for (int j=0,jsz = swSort.GetSize(); j<jsz; j++)
+ {
+ CFX_WideString* pStr = swSort.GetAt(j);
+
+ JSFXObject pObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime, L"Field"));
+ ASSERT(pObj.IsEmpty() == FALSE);
+
+ CJS_Field* pJSField = (CJS_Field*)JS_GetPrivate(pObj);
+ ASSERT(pJSField != NULL);
+
+ Field* pField = (Field*)pJSField->GetEmbedObject();
+ ASSERT(pField != NULL);
+
+ pField->AttachField(this->m_pJSDoc, *pStr);
+
+ CJS_Value FormFieldValue(m_isolate);
+ FormFieldValue = pJSField;
+ FormFieldArray.SetElement(j, FormFieldValue);
+
+ delete pStr;
+ }
+
+ vRet = FormFieldArray;
+ swSort.RemoveAll();
+ return TRUE;
+}
+
+FX_BOOL Field::getItemAt(OBJ_METHOD_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ int nIdx = -1;
+ if (params.size() >=1)
+ nIdx = (FX_INT32) params[0];
+ FX_BOOL bExport = TRUE;
+ int iSize = params.size();
+ if ( iSize >= 2)
+ {
+ bExport =(FX_BOOL) params[1];
+ }
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ 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);
+ else
+ vRet = strval;
+ }
+ else
+ vRet = pFormField->GetOptionLabel(nIdx);
+ }
+ else
+ return FALSE;
+
+ return TRUE;
+}
+
+FX_BOOL Field::getLock(OBJ_METHOD_PARAMS)
+{
+ return FALSE;
+}
+
+FX_BOOL Field::insertItemAt(OBJ_METHOD_PARAMS)
+{
+ return TRUE;
+}
+
+FX_BOOL Field::isBoxChecked(OBJ_METHOD_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ int nIndex = -1;
+ if (params.size() >=1)
+ nIndex = (FX_INT32) params[0];
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ 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(OBJ_METHOD_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ int nIndex = -1;
+ if (params.size() >=1)
+ nIndex = (FX_INT32) params[0];
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ 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(OBJ_METHOD_PARAMS)
+{
+ return TRUE;
+}
+
+FX_BOOL Field::setFocus(OBJ_METHOD_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ FX_INT32 nCount = pFormField->CountControls();
+
+ if (nCount < 1) return FALSE;
+
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ CPDFSDK_Widget* pWidget = NULL;
+ if (nCount == 1)
+ {
+ pWidget = pInterForm->GetWidget(pFormField->GetControl(0));
+ }
+ else
+ {
+ CPDFDoc_Environment* pEnv = m_pDocument->GetEnv();
+ ASSERT(pEnv);
+ CPDF_Page* pPage = (CPDF_Page*)pEnv->FFI_GetCurrentPage(m_pDocument->GetDocument());
+ if(!pPage)
+ return FALSE;
+ if (CPDFSDK_PageView* pCurPageView = m_pDocument->GetPageView(pPage))
+ {
+ for (FX_INT32 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(OBJ_METHOD_PARAMS)
+{
+ return TRUE;
+}
+
+FX_BOOL Field::setLock(OBJ_METHOD_PARAMS)
+{
+ return FALSE;
+}
+
+FX_BOOL Field::signatureGetModifications(OBJ_METHOD_PARAMS)
+{
+ return FALSE;
+}
+
+FX_BOOL Field::signatureGetSeedValue(OBJ_METHOD_PARAMS)
+{
+ return FALSE;
+}
+
+FX_BOOL Field::signatureInfo(OBJ_METHOD_PARAMS)
+{
+ return FALSE;
+}
+
+FX_BOOL Field::signatureSetSeedValue(OBJ_METHOD_PARAMS)
+{
+ return FALSE;
+}
+
+FX_BOOL Field::signatureSign(OBJ_METHOD_PARAMS)
+{
+ return FALSE;
+}
+
+FX_BOOL Field::signatureValidate(OBJ_METHOD_PARAMS)
+{
+ return FALSE;
+}
+
+FX_BOOL Field::source(OBJ_PROP_PARAMS)
+{
+ if (vp.IsGetting())
+ {
+ vp << (CJS_Object*)NULL;
+ }
+
+ return TRUE;
+}
+
+/////////////////////////////////////////// delay /////////////////////////////////////////////
+
+void Field::AddDelay_Int(enum FIELD_PROP prop, FX_INT32 n)
+{
+ ASSERT(m_pJSDoc != NULL);
+
+ 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)
+{
+ ASSERT(m_pJSDoc != NULL);
+
+ 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)
+{
+ ASSERT(m_pJSDoc != NULL);
+
+ 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)
+{
+ ASSERT(m_pJSDoc != NULL);
+
+ 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 CPDF_Rect& rect)
+{
+ ASSERT(m_pJSDoc != NULL);
+
+ 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)
+{
+ ASSERT(m_pJSDoc != NULL);
+
+ 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)
+{
+ ASSERT(m_pJSDoc != NULL);
+
+ 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)
+{
+ ASSERT(m_pJSDoc != NULL);
+
+ 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 != NULL);
+ ASSERT(pData != NULL);
+
+ 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;
+ }
+}
+
+#define JS_FIELD_MINWIDTH 1
+#define JS_FIELD_MINHEIGHT 1
+
+void Field::AddField(CPDFSDK_Document* pDocument, int nPageIndex, int nFieldType,
+ const CFX_WideString& sName, const CPDF_Rect& rcCoords)
+{
+ //Not supported.
+}
+
diff --git a/fpdfsdk/src/javascript/Icon.cpp b/fpdfsdk/src/javascript/Icon.cpp new file mode 100644 index 0000000000..418fcd53d5 --- /dev/null +++ b/fpdfsdk/src/javascript/Icon.cpp @@ -0,0 +1,67 @@ +// 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 "../../include/javascript/JavaScript.h"
+#include "../../include/javascript/IJavaScript.h"
+#include "../../include/javascript/JS_Define.h"
+#include "../../include/javascript/JS_Object.h"
+#include "../../include/javascript/JS_Value.h"
+#include "../../include/javascript/Icon.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(OBJ_PROP_PARAMS)
+{
+ if(!vp.IsGetting())return FALSE;
+
+ vp << m_swIconName;
+ return TRUE;
+}
+
diff --git a/fpdfsdk/src/javascript/JS_Context.cpp b/fpdfsdk/src/javascript/JS_Context.cpp new file mode 100644 index 0000000000..21acf59180 --- /dev/null +++ b/fpdfsdk/src/javascript/JS_Context.cpp @@ -0,0 +1,364 @@ +// 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 "../../include/javascript/JavaScript.h"
+#include "../../include/javascript/IJavaScript.h"
+//#include "../../include/javascript/JS_ResMgr.h"
+#include "../../include/javascript/JS_Context.h"
+#include "../../include/javascript/JS_EventHandler.h"
+#include "../../include/javascript/JS_Runtime.h"
+#include "../../include/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(void)
+{
+ if (m_pEventHandler)
+ {
+ delete m_pEventHandler;
+ m_pEventHandler = NULL;
+ }
+}
+
+CPDFSDK_Document* CJS_Context::GetReaderDocument()
+{
+ ASSERT(m_pRuntime != NULL);
+
+ return m_pRuntime->GetReaderDocument();
+}
+
+CPDFDoc_Environment* CJS_Context::GetReaderApp()
+{
+ ASSERT(m_pRuntime != NULL);
+
+ return m_pRuntime->GetReaderApp();
+}
+
+FX_BOOL CJS_Context::DoJob(int nMode, const CFX_WideString& script, CFX_WideString& info)
+{
+ if (m_bBusy)
+ {
+ info = JSGetStringFromID(this, IDS_STRING_JSBUSY);
+ return FALSE;
+ }
+
+ m_bBusy = TRUE;
+
+ ASSERT(m_pRuntime != NULL);
+ ASSERT(m_pEventHandler != NULL);
+ ASSERT(m_pEventHandler->IsValid());
+
+ if (!m_pRuntime->AddEventToLoop(m_pEventHandler->TargetName(), m_pEventHandler->EventType()))
+ {
+ info = JSGetStringFromID(this, IDS_STRING_JSEVENT);
+ return FALSE;
+ }
+
+ FXJSErr error ={NULL,NULL, 0};
+ int nRet = 0;
+
+ try
+ {
+ if (script.GetLength() > 0)
+ {
+ if (nMode == 0)
+ {
+ nRet = JS_Execute(*m_pRuntime, this, script, script.GetLength(), &error);
+ }
+ else
+ {
+ nRet = JS_Parse(*m_pRuntime, this, script, script.GetLength(), &error);
+ }
+ }
+
+ if (nRet < 0)
+ {
+ CFX_WideString sLine;
+ sLine.Format((FX_LPCWSTR)L"[ Line: %05d { %s } ] : %s",error.linnum-1,error.srcline,error.message);
+
+// TRACE(L"/* -------------- JS Error -------------- */\n");
+// TRACE(sLine);
+// TRACE(L"\n");
+ //CFX_ByteString sTemp = CFX_ByteString::FromUnicode(error.message);
+ info += sLine;
+ }
+ else
+ {
+ info = JSGetStringFromID(this, IDS_STRING_RUN);
+ }
+
+ }
+ catch (...)
+ {
+ info = JSGetStringFromID(this, IDS_STRING_UNHANDLED);
+ nRet = -1;
+ }
+
+ m_pRuntime->RemoveEventInLoop(m_pEventHandler->TargetName(), m_pEventHandler->EventType());
+
+ m_pEventHandler->Destroy();
+ m_bBusy = FALSE;
+
+ return nRet >= 0;
+}
+
+FX_BOOL CJS_Context::RunScript(const CFX_WideString& script, CFX_WideString& info)
+{
+ v8::Isolate::Scope isolate_scope(m_pRuntime->GetIsolate());
+ HandleScope handle_scope(m_pRuntime->GetIsolate());
+ v8::Local<v8::Context> context = m_pRuntime->NewJSContext();
+ v8::Context::Scope context_scope(context);
+
+ return DoJob(0, script, info);
+}
+
+FX_BOOL CJS_Context::Compile(const CFX_WideString& script, CFX_WideString& info)
+{
+ v8::Isolate::Scope isolate_scope(m_pRuntime->GetIsolate());
+ HandleScope handle_scope(m_pRuntime->GetIsolate());
+ v8::Local<v8::Context> context = m_pRuntime->NewJSContext();
+ v8::Context::Scope context_scope(context);
+
+ return DoJob(1, script, info);
+}
+
+void CJS_Context::OnApp_Init()
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnApp_Init();
+}
+
+void CJS_Context::OnDoc_Open(CPDFSDK_Document* pDoc, const CFX_WideString &strTargetName)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnDoc_Open(pDoc,strTargetName);
+}
+
+void CJS_Context::OnDoc_WillPrint(CPDFSDK_Document* pDoc)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnDoc_WillPrint(pDoc);
+}
+
+void CJS_Context::OnDoc_DidPrint(CPDFSDK_Document* pDoc)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnDoc_DidPrint(pDoc);
+}
+
+void CJS_Context::OnDoc_WillSave(CPDFSDK_Document* pDoc)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnDoc_WillSave(pDoc);
+}
+
+void CJS_Context::OnDoc_DidSave(CPDFSDK_Document* pDoc)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnDoc_DidSave(pDoc);
+}
+
+void CJS_Context::OnDoc_WillClose(CPDFSDK_Document* pDoc)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnDoc_WillClose(pDoc);
+}
+
+void CJS_Context::OnPage_Open(CPDFSDK_Document* pTarget)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnPage_Open(pTarget);
+}
+
+void CJS_Context::OnPage_Close(CPDFSDK_Document* pTarget)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnPage_Close(pTarget);
+}
+
+void CJS_Context::OnPage_InView(CPDFSDK_Document* pTarget)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnPage_InView(pTarget);
+}
+
+void CJS_Context::OnPage_OutView(CPDFSDK_Document* pTarget)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnPage_OutView(pTarget);
+}
+
+void CJS_Context::OnField_MouseDown(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField *pTarget)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnField_MouseDown(bModifier, bShift, pTarget);
+}
+
+void CJS_Context::OnField_MouseEnter(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField *pTarget)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnField_MouseEnter(bModifier, bShift, pTarget);
+}
+
+void CJS_Context::OnField_MouseExit(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField *pTarget)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnField_MouseExit(bModifier, bShift, pTarget);
+}
+
+void CJS_Context::OnField_MouseUp(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField *pTarget)
+{
+ ASSERT(m_pEventHandler != NULL);
+ 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)
+{
+ ASSERT(m_pEventHandler != NULL);
+ 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)
+{
+ ASSERT(m_pEventHandler != NULL);
+ 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)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnField_Calculate(pSource, pTarget, Value, bRc);
+}
+
+void CJS_Context::OnField_Format(int nCommitKey, CPDF_FormField* pTarget, CFX_WideString& Value, FX_BOOL bWillCommit)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnField_Format(nCommitKey, pTarget, Value, bWillCommit);
+}
+
+
+void CJS_Context::OnField_Keystroke(int nCommitKey, 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)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnField_Keystroke(nCommitKey, 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)
+{
+ ASSERT(m_pEventHandler != NULL);
+ 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)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnScreen_Focus(bModifier, bShift, pScreen);
+}
+
+void CJS_Context::OnScreen_Blur(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnScreen_Blur(bModifier, bShift, pScreen);
+}
+
+void CJS_Context::OnScreen_Open(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnScreen_Open(bModifier, bShift, pScreen);
+}
+
+void CJS_Context::OnScreen_Close(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnScreen_Close(bModifier, bShift, pScreen);
+}
+
+void CJS_Context::OnScreen_MouseDown(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnScreen_MouseDown(bModifier, bShift, pScreen);
+}
+
+void CJS_Context::OnScreen_MouseUp(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnScreen_MouseUp(bModifier, bShift, pScreen);
+}
+
+void CJS_Context::OnScreen_MouseEnter(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnScreen_MouseEnter(bModifier, bShift, pScreen);
+}
+
+void CJS_Context::OnScreen_MouseExit(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnScreen_MouseExit(bModifier, bShift, pScreen);
+}
+
+void CJS_Context::OnScreen_InView(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnScreen_InView(bModifier, bShift, pScreen);
+}
+
+void CJS_Context::OnScreen_OutView(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnScreen_OutView(bModifier, bShift, pScreen);
+}
+
+void CJS_Context::OnBookmark_MouseUp(CPDF_Bookmark* pBookMark)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnBookmark_MouseUp(pBookMark);
+}
+
+void CJS_Context::OnLink_MouseUp(CPDFSDK_Document* pTarget)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnLink_MouseUp(pTarget);
+}
+
+void CJS_Context::OnConsole_Exec()
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnConsole_Exec();
+}
+
+void CJS_Context::OnExternal_Exec()
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnExternal_Exec();
+}
+
+void CJS_Context::OnBatchExec(CPDFSDK_Document* pTarget)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnBatchExec(pTarget);
+}
+
+void CJS_Context::OnMenu_Exec(CPDFSDK_Document* pTarget,const CFX_WideString& strTargetName)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnMenu_Exec(pTarget, strTargetName);
+}
+
diff --git a/fpdfsdk/src/javascript/JS_EventHandler.cpp b/fpdfsdk/src/javascript/JS_EventHandler.cpp new file mode 100644 index 0000000000..ce69e6b9d2 --- /dev/null +++ b/fpdfsdk/src/javascript/JS_EventHandler.cpp @@ -0,0 +1,676 @@ +// 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 "../../include/javascript/JavaScript.h"
+#include "../../include/javascript/IJavaScript.h"
+#include "../../include/javascript/JS_EventHandler.h"
+//#include "../../include/javascript/JS_ResMgr.h"
+#include "../../include/javascript/JS_Context.h"
+#include "../../include/javascript/JS_Runtime.h"
+#include "../../include/javascript/JS_Define.h"
+#include "../../include/javascript/JS_Object.h"
+#include "../../include/javascript/JS_Value.h"
+#include "../../include/javascript/Document.h"
+#include "../../include/javascript/Field.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;
+
+ ASSERT(pTarget != NULL);
+ 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;
+ ASSERT(pTarget != NULL);
+ 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;
+ ASSERT(pTarget != NULL);
+ 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;
+ ASSERT(pTarget != NULL);
+ 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;
+ ASSERT(pTarget != NULL);
+ 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;
+ ASSERT(pTarget != NULL);
+ m_strTargetName = pTarget->GetFullName();
+ m_pValue = (CFX_WideString*)&Value;
+}
+
+void CJS_EventHandler::OnField_Keystroke(int nCommitKey, 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 = nCommitKey;
+ m_pWideStrChange = &strChange;
+ m_WideStrChangeEx = strChangeEx;
+ m_bKeyDown = KeyDown;
+ m_bModifier = bModifier;
+ m_pISelEnd = &nSelEnd;
+ m_pISelStart = &nSelStart;
+ m_bShift = bShift;
+ ASSERT(pTarget != NULL);
+ 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;
+ ASSERT(pTarget != NULL);
+ 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();
+ ASSERT(pTarget != NULL);
+ m_strTargetName = pTarget->GetFullName();
+ m_pValue = &Value;
+ m_pbRc = &bRc;
+}
+
+void CJS_EventHandler::OnField_Format(int nCommitKey, CPDF_FormField* pTarget,
+ CFX_WideString& Value, FX_BOOL bWillCommit)
+{
+ Initial(JET_FIELD_FORMAT);
+
+ m_nCommitKey = nCommitKey;
+ ASSERT(pTarget != NULL);
+ 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 != NULL)
+ return *m_pWideStrChange;
+ else
+ {
+ 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;
+}
+
+FX_LPCWSTR CJS_EventHandler::Name()
+{
+ switch (m_eEventType)
+ {
+ case JET_APP_INIT: return (FX_LPCWSTR)L"Init";
+ case JET_BATCH_EXEC: return (FX_LPCWSTR)L"Exec";
+ case JET_BOOKMARK_MOUSEUP: return (FX_LPCWSTR)L"Mouse Up";
+ case JET_CONSOLE_EXEC: return (FX_LPCWSTR)L"Exec";
+ case JET_DOC_DIDPRINT: return (FX_LPCWSTR)L"DidPrint";
+ case JET_DOC_DIDSAVE: return (FX_LPCWSTR)L"DidSave";
+ case JET_DOC_OPEN: return (FX_LPCWSTR)L"Open";
+ case JET_DOC_WILLCLOSE: return (FX_LPCWSTR)L"WillClose";
+ case JET_DOC_WILLPRINT: return (FX_LPCWSTR)L"WillPrint";
+ case JET_DOC_WILLSAVE: return (FX_LPCWSTR)L"WillSave";
+ case JET_EXTERNAL_EXEC: return (FX_LPCWSTR)L"Exec";
+ case JET_FIELD_FOCUS:
+ case JET_SCREEN_FOCUS: return (FX_LPCWSTR)L"Focus";
+ case JET_FIELD_BLUR:
+ case JET_SCREEN_BLUR: return (FX_LPCWSTR)L"Blur";
+ case JET_FIELD_MOUSEDOWN:
+ case JET_SCREEN_MOUSEDOWN: return (FX_LPCWSTR)L"Mouse Down";
+ case JET_FIELD_MOUSEUP:
+ case JET_SCREEN_MOUSEUP: return (FX_LPCWSTR)L"Mouse Up";
+ case JET_FIELD_MOUSEENTER:
+ case JET_SCREEN_MOUSEENTER: return (FX_LPCWSTR)L"Mouse Enter";
+ case JET_FIELD_MOUSEEXIT:
+ case JET_SCREEN_MOUSEEXIT: return (FX_LPCWSTR)L"Mouse Exit";
+ case JET_FIELD_CALCULATE: return (FX_LPCWSTR)L"Calculate";
+ case JET_FIELD_FORMAT: return (FX_LPCWSTR)L"Format";
+ case JET_FIELD_KEYSTROKE: return (FX_LPCWSTR)L"Keystroke";
+ case JET_FIELD_VALIDATE: return (FX_LPCWSTR)L"Validate";
+ case JET_LINK_MOUSEUP: return (FX_LPCWSTR)L"Mouse Up";
+ case JET_MENU_EXEC: return (FX_LPCWSTR)L"Exec";
+ case JET_PAGE_OPEN:
+ case JET_SCREEN_OPEN: return (FX_LPCWSTR)L"Open";
+ case JET_PAGE_CLOSE:
+ case JET_SCREEN_CLOSE: return (FX_LPCWSTR)L"Close";
+ case JET_SCREEN_INVIEW:
+ case JET_PAGE_INVIEW: return (FX_LPCWSTR)L"InView";
+ case JET_PAGE_OUTVIEW:
+ case JET_SCREEN_OUTVIEW: return (FX_LPCWSTR)L"OutView";
+ default:
+ return (FX_LPCWSTR)L"";
+ }
+
+ return (FX_LPCWSTR)L"";
+}
+
+FX_LPCWSTR CJS_EventHandler::Type()
+{
+ switch (m_eEventType)
+ {
+ case JET_APP_INIT: return (FX_LPCWSTR)L"App";
+ case JET_BATCH_EXEC: return (FX_LPCWSTR)L"Batch";
+ case JET_BOOKMARK_MOUSEUP: return (FX_LPCWSTR)L"BookMark";
+ case JET_CONSOLE_EXEC: return (FX_LPCWSTR)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 (FX_LPCWSTR)L"Doc";
+ case JET_EXTERNAL_EXEC: return (FX_LPCWSTR)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 (FX_LPCWSTR)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 (FX_LPCWSTR)L"Screen";
+ case JET_LINK_MOUSEUP: return (FX_LPCWSTR)L"Link";
+ case JET_MENU_EXEC: return (FX_LPCWSTR)L"Menu";
+ case JET_PAGE_OPEN:
+ case JET_PAGE_CLOSE:
+ case JET_PAGE_INVIEW:
+ case JET_PAGE_OUTVIEW:return (FX_LPCWSTR)L"Page";
+ default:
+ return (FX_LPCWSTR)L"";
+ }
+
+ return (FX_LPCWSTR)L"";
+}
+
+FX_BOOL& CJS_EventHandler::Rc()
+{
+ if (m_pbRc != NULL)
+ return *m_pbRc;
+ else
+ {
+ return m_bRcDu;
+ }
+}
+
+int & CJS_EventHandler::SelEnd()
+{
+ if (m_pISelEnd != NULL)
+ {
+ return *m_pISelEnd;
+ }
+ else
+ {
+ return m_nSelEndDu;
+ }
+}
+
+int & CJS_EventHandler::SelStart()
+{
+ if (m_pISelStart != NULL)
+ return * m_pISelStart;
+ else
+ {
+ return m_nSelStartDu;
+ }
+}
+
+FX_BOOL CJS_EventHandler::Shift()
+{
+ return m_bShift;
+}
+
+Field* CJS_EventHandler::Source()
+{
+ ASSERT(m_pJSContext != NULL);
+
+ CJS_Runtime* pRuntime = m_pJSContext->GetJSRuntime();
+
+ JSFXObject pDocObj = JS_NewFxDynamicObj(*pRuntime, m_pJSContext, JS_GetObjDefnID(*pRuntime, L"Document"));
+ ASSERT(pDocObj.IsEmpty() == FALSE);
+ JSFXObject pFieldObj = JS_NewFxDynamicObj(*pRuntime, m_pJSContext, JS_GetObjDefnID(*pRuntime, L"Field"));
+ ASSERT(pFieldObj.IsEmpty() == FALSE);
+
+ CJS_Document* pJSDocument = (CJS_Document*)JS_GetPrivate(pDocObj);
+ ASSERT(pJSDocument != NULL);
+ Document* pDocument = (Document*)pJSDocument->GetEmbedObject();
+ ASSERT(pDocument != NULL);
+ if (m_pTargetDoc != NULL)
+ pDocument->AttachDoc(m_pTargetDoc);
+ else
+ pDocument->AttachDoc(m_pJSContext->GetReaderDocument());
+
+ //if (m_pSourceField == NULL)
+ // return NULL;
+ //CRAO_Widget *pWidget = IBCL_Widget::GetWidget(m_pSourceField);
+ //CPDF_FormField* pFormField = pWidget->GetFormField();
+ //ASSERT(pFormField);
+ //CFX_WideString csFieldName = pFormField->GetFullName();
+ CJS_Field * pJSField = (CJS_Field*)JS_GetPrivate(pFieldObj);
+ ASSERT(pJSField != NULL);
+ Field * pField = (Field *)pJSField->GetEmbedObject();
+ ASSERT(pField != NULL);
+ pField->AttachField(pDocument, m_strSourceName);
+ return pField;
+}
+
+Field* CJS_EventHandler::Target_Field()
+{
+ ASSERT(m_pJSContext != NULL);
+
+ CJS_Runtime* pRuntime = m_pJSContext->GetJSRuntime();
+
+ JSFXObject pDocObj = JS_NewFxDynamicObj(*pRuntime, m_pJSContext, JS_GetObjDefnID(*pRuntime, L"Document"));
+ ASSERT(pDocObj.IsEmpty() == FALSE);
+ JSFXObject pFieldObj = JS_NewFxDynamicObj(*pRuntime, m_pJSContext, JS_GetObjDefnID(*pRuntime, L"Field"));
+ ASSERT(pFieldObj.IsEmpty() == FALSE);
+
+ CJS_Document* pJSDocument = (CJS_Document*)JS_GetPrivate(pDocObj);
+ ASSERT(pJSDocument != NULL);
+ Document* pDocument = (Document*)pJSDocument->GetEmbedObject();
+ ASSERT(pDocument != NULL);
+ if (m_pTargetDoc != NULL)
+ pDocument->AttachDoc(m_pTargetDoc);
+ else
+ pDocument->AttachDoc(m_pJSContext->GetReaderDocument());
+
+ CJS_Field* pJSField = (CJS_Field*)JS_GetPrivate(pFieldObj);
+ ASSERT(pJSField != NULL);
+
+ Field* pField = (Field *)pJSField->GetEmbedObject();
+ ASSERT(pField != NULL);
+
+ 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_GlobalData.cpp b/fpdfsdk/src/javascript/JS_GlobalData.cpp new file mode 100644 index 0000000000..97bba8d243 --- /dev/null +++ b/fpdfsdk/src/javascript/JS_GlobalData.cpp @@ -0,0 +1,581 @@ +// 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 "../../include/javascript/JavaScript.h"
+#include "../../include/javascript/IJavaScript.h"
+#include "../../include/javascript/JS_GlobalData.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);
+ ASSERT(pOldObjData != NULL);
+
+ 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);
+ }
+ case JS_GLOBALDATA_TYPE_NULL:
+ {
+ CJS_KeyValue* pNewObjData = new CJS_KeyValue;
+ pNewObjData->sKey = pOldObjData->sKey;
+ pNewObjData->nType = pOldObjData->nType;
+ Add(pNewObjData);
+ }
+ }
+ }
+}
+
+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 FX_BYTE 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(CPDFDoc_Environment* pApp) : m_pApp(pApp)
+{
+// IBaseAnnot* pBaseAnnot = IBaseAnnot::GetBaseAnnot(m_pApp);
+// ASSERT(pBaseAnnot != NULL);
+//
+// m_sFilePath = pBaseAnnot->GetUserPath();
+ 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(FX_LPCSTR propname)
+{
+ ASSERT(propname != NULL);
+
+ int nRet = -1;
+
+ 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)
+ {
+ nRet = i;
+ break;
+ }
+ }
+
+ return nRet;
+}
+
+CJS_GlobalData_Element* CJS_GlobalData::GetGlobalVariable(FX_LPCSTR propname)
+{
+ ASSERT(propname != NULL);
+
+ int nFind = FindGlobalVariable(propname);
+
+ if (nFind >= 0)
+ return m_arrayGlobalData.GetAt(nFind);
+ else
+ return NULL;
+}
+
+void CJS_GlobalData::SetGlobalVariableNumber(FX_LPCSTR propname, double dData)
+{
+ ASSERT(propname != NULL);
+ 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(FX_LPCSTR propname, bool bData)
+{
+ ASSERT(propname != NULL);
+ 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(FX_LPCSTR propname, const CFX_ByteString& sData)
+{
+ ASSERT(propname != NULL);
+ 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(FX_LPCSTR propname, const CJS_GlobalVariableArray& array)
+{
+ ASSERT(propname != NULL);
+ 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(FX_LPCSTR propname)
+{
+ ASSERT(propname != NULL);
+ 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(FX_LPCSTR propname, FX_BOOL bPersistent)
+{
+ ASSERT(propname != NULL);
+ 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(FX_LPCSTR propname)
+{
+ ASSERT(propname != NULL);
+ 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;
+}
+
+FX_INT32 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()
+{
+ FX_LPBYTE pBuffer = NULL;
+ FX_INT32 nLength = 0;
+
+ LoadFileBuffer(m_sFilePath, pBuffer, nLength);
+
+ CRYPT_ArcFourCryptBlock(pBuffer, nLength, JS_RC4KEY, sizeof(JS_RC4KEY));
+
+ if (pBuffer)
+ {
+ FX_LPBYTE 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 (FX_INT32 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);
+ }
+}
+
+/*
+struct js_global_datafile_header
+{
+ FX_WORD type; //FX ('X' << 8) | 'F'
+ FX_WORD version; //1.0
+ FX_DWORD datacount;
+};
+struct js_global_datafile_data
+{
+ FX_WORD type;
+ FX_DWORD nData;
+ FX_WORD bData;
+ FX_DWORD nStrLen;
+ char* pStr;
+};
+*/
+
+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);
+ ASSERT(pElement != NULL);
+
+ 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, (FX_LPCSTR)sFile.GetBuffer(), sFile.GetSize());
+}
+
+void CJS_GlobalData::LoadFileBuffer(FX_LPCWSTR sFilePath, FX_LPBYTE& pBuffer, FX_INT32& nLength)
+{
+//UnSupport.
+}
+
+void CJS_GlobalData::WriteFileBuffer(FX_LPCWSTR sFilePath, FX_LPCSTR pBuffer, FX_INT32 nLength)
+{
+//UnSupport.
+}
+
+void CJS_GlobalData::MakeByteString(const CFX_ByteString& name, CJS_KeyValue* pData, CFX_BinaryBuf& sData)
+{
+ ASSERT(pData != NULL);
+
+ 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_Object.cpp b/fpdfsdk/src/javascript/JS_Object.cpp new file mode 100644 index 0000000000..07c5df2525 --- /dev/null +++ b/fpdfsdk/src/javascript/JS_Object.cpp @@ -0,0 +1,145 @@ +// 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 "../../include/javascript/JavaScript.h"
+#include "../../include/javascript/IJavaScript.h"
+#include "../../include/javascript/JS_Define.h"
+#include "../../include/javascript/JS_Object.h"
+// #include "../../include/javascript/JS_MsgBox.h"
+// #include "../../include/javascript/JS_ResMgr.h"
+#include "../../include/javascript/JS_Context.h"
+
+int FXJS_MsgBox(CPDFDoc_Environment* pApp, CPDFSDK_PageView* pPageView, FX_LPCWSTR swMsg, FX_LPCWSTR swTitle, FX_UINT nType, FX_UINT nIcon)
+{
+ int nRet = 0;
+
+ if(pApp)
+ {
+ CPDFSDK_Document* pDoc = pApp->GetCurrentDoc();
+ if(pDoc)
+ pDoc->KillFocusAnnot();
+ nRet = pApp->JS_appAlert(swMsg, swTitle, nType, nIcon);
+ }
+
+ return nRet;
+}
+
+CPDFSDK_PageView* FXJS_GetPageView(IFXJS_Context* cc)
+{
+ if (CJS_Context* pContext = (CJS_Context *)cc)
+ {
+ if (pContext->GetReaderDocument())
+ return NULL;
+ }
+ return NULL;
+}
+
+/* --------------------------------- CJS_EmbedObj --------------------------------- */
+
+CJS_EmbedObj::CJS_EmbedObj(CJS_Object* pJSObject) :
+ m_pJSObject(pJSObject)
+{
+}
+
+CJS_EmbedObj::~CJS_EmbedObj()
+{
+ m_pJSObject = NULL;
+
+}
+
+CPDFSDK_PageView* CJS_EmbedObj::JSGetPageView(IFXJS_Context* cc)
+{
+ return FXJS_GetPageView(cc);
+}
+
+int CJS_EmbedObj::MsgBox(CPDFDoc_Environment* pApp, CPDFSDK_PageView* pPageView,FX_LPCWSTR swMsg,FX_LPCWSTR swTitle,FX_UINT nType,FX_UINT nIcon)
+{
+ return FXJS_MsgBox(pApp, pPageView, swMsg, swTitle, nType, nIcon);
+}
+
+void CJS_EmbedObj::Alert(CJS_Context* pContext, FX_LPCWSTR swMsg)
+{
+ CJS_Object::Alert(pContext, swMsg);
+}
+
+CJS_Timer* CJS_EmbedObj::BeginTimer(CPDFDoc_Environment * pApp,FX_UINT nElapse)
+{
+ CJS_Timer* pTimer = new CJS_Timer(this,pApp);
+ pTimer->SetJSTimer(nElapse);
+
+ return pTimer;
+}
+
+void CJS_EmbedObj::EndTimer(CJS_Timer* pTimer)
+{
+ ASSERT(pTimer != NULL);
+ pTimer->KillJSTimer();
+ delete pTimer;
+}
+
+FX_BOOL CJS_EmbedObj::IsSafeMode(IFXJS_Context* cc)
+{
+ ASSERT(cc != NULL);
+
+ return TRUE;
+}
+
+/* --------------------------------- CJS_Object --------------------------------- */
+void FreeObject(const WeakCallbackData<v8::Object, CJS_Object>& data)
+{
+ CJS_Object* pJSObj = data.GetParameter();
+ if(pJSObj)
+ {
+ pJSObj->ExitInstance();
+ delete pJSObj;
+ }
+ v8::Local<v8::Object> obj = data.GetValue();
+ JS_FreePrivate(obj);
+}
+
+CJS_Object::CJS_Object(JSFXObject pObject) :m_pEmbedObj(NULL)
+{
+ v8::Local<v8::Context> context = pObject->CreationContext();
+ m_pIsolate = context->GetIsolate();
+ m_pObject.Reset(m_pIsolate, pObject);
+};
+
+CJS_Object::~CJS_Object(void)
+{
+ delete m_pEmbedObj;
+ m_pEmbedObj = NULL;
+
+ m_pObject.Reset();
+};
+
+void CJS_Object::MakeWeak()
+{
+ m_pObject.SetWeak(this, FreeObject);
+}
+
+CPDFSDK_PageView* CJS_Object::JSGetPageView(IFXJS_Context* cc)
+{
+ return FXJS_GetPageView(cc);
+}
+
+int CJS_Object::MsgBox(CPDFDoc_Environment* pApp, CPDFSDK_PageView* pPageView, FX_LPCWSTR swMsg, FX_LPCWSTR swTitle, FX_UINT nType, FX_UINT nIcon)
+{
+ return FXJS_MsgBox(pApp, pPageView, swMsg, swTitle, nType, nIcon);
+}
+
+void CJS_Object::Alert(CJS_Context* pContext, FX_LPCWSTR swMsg)
+{
+ ASSERT(pContext != NULL);
+
+ if (pContext->IsMsgBoxEnabled())
+ {
+ CPDFDoc_Environment* pApp = pContext->GetReaderApp();
+ if(pApp)
+ pApp->JS_appAlert(swMsg, NULL, 0, 3);
+ }
+}
+
+
diff --git a/fpdfsdk/src/javascript/JS_Runtime.cpp b/fpdfsdk/src/javascript/JS_Runtime.cpp new file mode 100644 index 0000000000..dc95d530f9 --- /dev/null +++ b/fpdfsdk/src/javascript/JS_Runtime.cpp @@ -0,0 +1,470 @@ +// 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 "../../include/javascript/JavaScript.h"
+#include "../../include/javascript/IJavaScript.h"
+#include "../../include/javascript/JS_EventHandler.h"
+#include "../../include/javascript/JS_Runtime.h"
+#include "../../include/javascript/JS_Context.h"
+#include "../../include/javascript/JS_Define.h"
+#include "../../include/javascript/JS_Object.h"
+#include "../../include/javascript/JS_Value.h"
+#include "../../include/javascript/Document.h"
+#include "../../include/javascript/app.h"
+#include "../../include/javascript/color.h"
+#include "../../include/javascript/Consts.h"
+#include "../../include/javascript/Document.h"
+#include "../../include/javascript/event.h"
+#include "../../include/javascript/Field.h"
+#include "../../include/javascript/Icon.h"
+#include "../../include/javascript/PublicMethods.h"
+#include "../../include/javascript/report.h"
+#include "../../include/javascript/util.h"
+#include "../../include/javascript/JS_GlobalData.h"
+#include "../../include/javascript/global.h"
+#include "../../include/javascript/console.h"
+
+CJS_RuntimeFactory::~CJS_RuntimeFactory()
+{
+}
+
+IFXJS_Runtime* CJS_RuntimeFactory::NewJSRuntime(CPDFDoc_Environment* pApp)
+{
+ if (!m_bInit)
+ {
+ JS_Initial();
+
+ m_bInit = TRUE;
+ }
+ return new CJS_Runtime(pApp);
+}
+void CJS_RuntimeFactory::AddRef()
+{
+ //to do.Should be implemented as atom manipulation.
+ m_nRef++;
+}
+void CJS_RuntimeFactory::Release()
+{
+ if(m_bInit)
+ {
+ //to do.Should be implemented as atom manipulation.
+ if (--m_nRef == 0)
+ {
+ JS_Release();
+ ReleaseGlobalData();
+ m_bInit = FALSE;
+ }
+ }
+}
+
+void CJS_RuntimeFactory::DeleteJSRuntime(IFXJS_Runtime* pRuntime)
+{
+ if(pRuntime)
+ delete (CJS_Runtime*)pRuntime;
+}
+
+CJS_GlobalData* CJS_RuntimeFactory::NewGlobalData(CPDFDoc_Environment* pApp)
+{
+ if (m_pGlobalData)
+ {
+ m_nGlobalDataCount++;
+ return m_pGlobalData;
+ }
+ else
+ {
+ m_nGlobalDataCount = 1;
+ m_pGlobalData = new CJS_GlobalData(pApp);
+ return m_pGlobalData;
+ }
+}
+
+void CJS_RuntimeFactory::ReleaseGlobalData()
+{
+ m_nGlobalDataCount--;
+
+ if (m_nGlobalDataCount <= 0)
+ {
+ delete m_pGlobalData;
+ m_pGlobalData = NULL;
+ }
+}
+
+/* ------------------------------ CJS_Runtime ------------------------------ */
+
+CJS_Runtime::CJS_Runtime(CPDFDoc_Environment * pApp) :
+ m_pApp(pApp),
+ m_pDocument(NULL),
+ m_pFieldEventPath(NULL),
+ m_bBlocking(FALSE),
+ m_bRegistered(FALSE)
+{
+ m_isolate = v8::Isolate::New();
+ //m_isolate->Enter();
+
+ InitJSObjects();
+
+ CJS_Context * pContext = (CJS_Context*)NewContext();
+ JS_InitialRuntime(*this, this, pContext, m_context);
+ ReleaseContext(pContext);
+}
+
+CJS_Runtime::~CJS_Runtime()
+{
+ for (int i=0, sz=m_ContextArray.GetSize(); i<sz; i++)
+ delete m_ContextArray.GetAt(i);
+
+ m_ContextArray.RemoveAll();
+
+ JS_ReleaseRuntime(*this, m_context);
+
+ RemoveEventsInLoop(m_pFieldEventPath);
+
+ m_pApp = NULL;
+ m_pDocument = NULL;
+ m_pFieldEventPath = NULL;
+ m_context.Reset();
+
+ //m_isolate->Exit();
+ m_isolate->Dispose();
+}
+
+FX_BOOL CJS_Runtime::InitJSObjects()
+{
+ v8::Isolate::Scope isolate_scope(GetIsolate());
+ HandleScope handle_scope(GetIsolate());
+ v8::Handle<v8::Context> context = v8::Context::New(GetIsolate());
+ v8::Context::Scope context_scope(context);
+ //0 - 8
+ if (CJS_Border::Init(*this, JS_STATIC) < 0) return FALSE;
+ if (CJS_Display::Init(*this, JS_STATIC) < 0) return FALSE;
+ if (CJS_Font::Init(*this, JS_STATIC) < 0) return FALSE;
+ if (CJS_Highlight::Init(*this, JS_STATIC) < 0) return FALSE;
+ if (CJS_Position::Init(*this, JS_STATIC) < 0) return FALSE;
+ if (CJS_ScaleHow::Init(*this, JS_STATIC) < 0) return FALSE;
+ if (CJS_ScaleWhen::Init(*this, JS_STATIC) < 0) return FALSE;
+ if (CJS_Style::Init(*this, JS_STATIC) < 0) return FALSE;
+ if (CJS_Zoomtype::Init(*this, JS_STATIC) < 0) return FALSE;
+
+ //9 - 11
+ if (CJS_App::Init(*this, JS_STATIC) < 0) return FALSE;
+ if (CJS_Color::Init(*this, JS_STATIC) < 0) return FALSE;
+ if (CJS_Console::Init(*this, JS_STATIC) < 0) return FALSE;
+
+ //12 - 14
+ if (CJS_Document::Init(*this, JS_DYNAMIC) < 0) return FALSE;
+ if (CJS_Event::Init(*this, JS_STATIC) < 0) return FALSE;
+ if (CJS_Field::Init(*this, JS_DYNAMIC) < 0) return FALSE;
+
+ //15 - 17
+ if (CJS_Global::Init(*this, JS_STATIC) < 0) return FALSE;
+ if (CJS_Icon::Init(*this, JS_DYNAMIC) < 0) return FALSE;
+ if (CJS_Util::Init(*this, JS_STATIC) < 0) return FALSE;
+
+ if (CJS_PublicMethods::Init(*this) < 0) return FALSE;
+ if (CJS_GlobalConsts::Init(*this) < 0) return FALSE;
+ if (CJS_GlobalArrays::Init(*this) < 0) return FALSE;
+
+ if (CJS_TimerObj::Init(*this, JS_DYNAMIC) < 0) return FALSE;
+ if (CJS_PrintParamsObj::Init(*this, JS_DYNAMIC) <0) return FALSE;
+
+ return TRUE;
+}
+
+IFXJS_Context* CJS_Runtime::NewContext()
+{
+ CJS_Context * p = new CJS_Context(this);
+ m_ContextArray.Add(p);
+ return p;
+}
+
+void CJS_Runtime::ReleaseContext(IFXJS_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;
+ }
+ }
+}
+
+IFXJS_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);
+ 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)
+ {
+ JSObject pThis = JS_GetThisObj(*this);
+ if(!pThis.IsEmpty())
+ {
+ if (JS_GetObjDefnID(pThis) == JS_GetObjDefnID(*this, L"Document"))
+ {
+ if (CJS_Document* pJSDocument = (CJS_Document*)JS_GetPrivate(pThis))
+ {
+ if (Document * pDocument = (Document*)pJSDocument->GetEmbedObject())
+ pDocument->AttachDoc(pReaderDoc);
+ }
+ }
+ }
+ JS_SetThisObj(*this, JS_GetObjDefnID(*this, L"Document"));
+ }
+ else
+ {
+ JS_SetThisObj(*this, JS_GetObjDefnID(*this, L"app"));
+ }
+ }
+}
+
+FX_BOOL CJS_Runtime::AddEventToLoop(const CFX_WideString& sTargetName, JS_EVENT_T eEventType)
+{
+ if (m_pFieldEventPath == NULL)
+ {
+ m_pFieldEventPath = new CJS_FieldEvent;
+ m_pFieldEventPath->sTargetName = sTargetName;
+ m_pFieldEventPath->eEventType = eEventType;
+ m_pFieldEventPath->pNext = NULL;
+
+ return TRUE;
+ }
+
+ //to search
+ CJS_FieldEvent* p = m_pFieldEventPath;
+ CJS_FieldEvent* pLast = m_pFieldEventPath;
+ while (p)
+ {
+ if (p->eEventType == eEventType && p->sTargetName == sTargetName)
+ return FALSE;
+
+ pLast = p;
+ p = p->pNext;
+ }
+
+ //to add
+ CJS_FieldEvent* pNew = new CJS_FieldEvent;
+ pNew->sTargetName = sTargetName;
+ pNew->eEventType = eEventType;
+ pNew->pNext = NULL;
+
+ pLast->pNext = pNew;
+
+ return TRUE;
+}
+
+void CJS_Runtime::RemoveEventInLoop(const CFX_WideString& sTargetName, JS_EVENT_T eEventType)
+{
+ FX_BOOL bFind = FALSE;
+
+ CJS_FieldEvent* p = m_pFieldEventPath;
+ CJS_FieldEvent* pLast = NULL;
+ while (p)
+ {
+ if (p->eEventType == eEventType && p->sTargetName == sTargetName)
+ {
+ bFind = TRUE;
+ break;
+ }
+
+ pLast = p;
+ p = p->pNext;
+ }
+
+ if (bFind)
+ {
+ RemoveEventsInLoop(p);
+
+ if (p == m_pFieldEventPath)
+ m_pFieldEventPath = NULL;
+
+ if (pLast)
+ pLast->pNext = NULL;
+ }
+}
+
+void CJS_Runtime::RemoveEventsInLoop(CJS_FieldEvent* pStart)
+{
+ CJS_FieldEvent* p = pStart;
+
+ while (p)
+ {
+ CJS_FieldEvent* pOld = p;
+ p = pOld->pNext;
+
+ delete pOld;
+ }
+}
+
+v8::Handle<v8::Context> CJS_Runtime::NewJSContext()
+{
+ return v8::Local<v8::Context>::New(m_isolate, m_context);
+}
+
+CFX_WideString ChangeObjName(const CFX_WideString& str)
+{
+ CFX_WideString sRet = str;
+ sRet.Replace((FX_LPCWSTR)L"_", (FX_LPCWSTR)L".");
+ return sRet;
+}
+
+void CJS_Runtime::GetObjectNames(CFX_WideStringArray& array)
+{
+ array.RemoveAll();
+
+ array.Add(CJS_Border::m_pClassName);
+ array.Add(CJS_Display::m_pClassName);
+ array.Add(CJS_Font::m_pClassName);
+ array.Add(CJS_Highlight::m_pClassName);
+ array.Add(CJS_Position::m_pClassName);
+ array.Add(CJS_ScaleHow::m_pClassName);
+ array.Add(CJS_ScaleWhen::m_pClassName);
+ array.Add(CJS_Style::m_pClassName);
+ array.Add(CJS_Zoomtype::m_pClassName);
+
+ array.Add(CJS_App::m_pClassName);
+ array.Add((FX_LPCWSTR)"this");
+ array.Add(CJS_Event::m_pClassName);
+
+ array.Add(CJS_Global::m_pClassName);
+ array.Add(CJS_Util::m_pClassName);
+}
+
+void CJS_Runtime::GetObjectConsts(const CFX_WideString& sObjName, CFX_WideStringArray& array)
+{
+ JSConstSpec* pConsts = NULL;
+ int nSize = 0;
+
+ if (sObjName == CJS_Border::m_pClassName)
+ CJS_Border::GetConsts(pConsts, nSize);
+ else if (sObjName == CJS_Display::m_pClassName)
+ CJS_Display::GetConsts(pConsts, nSize);
+ else if (sObjName == CJS_Font::m_pClassName)
+ CJS_Font::GetConsts(pConsts, nSize);
+ else if (sObjName == CJS_Highlight::m_pClassName)
+ CJS_Highlight::GetConsts(pConsts, nSize);
+ else if (sObjName == CJS_Position::m_pClassName)
+ CJS_Position::GetConsts(pConsts, nSize);
+ else if (sObjName == CJS_ScaleHow::m_pClassName)
+ CJS_ScaleHow::GetConsts(pConsts, nSize);
+ else if (sObjName == CJS_ScaleWhen::m_pClassName)
+ CJS_ScaleWhen::GetConsts(pConsts, nSize);
+ else if (sObjName == CJS_Style::m_pClassName)
+ CJS_Style::GetConsts(pConsts, nSize);
+ else if (sObjName == CJS_Zoomtype::m_pClassName)
+ CJS_Zoomtype::GetConsts(pConsts, nSize);
+
+ else if (sObjName == CJS_App::m_pClassName)
+ CJS_App::GetConsts(pConsts, nSize);
+ else if (sObjName == CJS_Color::m_pClassName)
+ CJS_Color::GetConsts(pConsts, nSize);
+
+ else if (sObjName == L"this")
+ {
+ if (GetReaderDocument())
+ CJS_Document::GetConsts(pConsts, nSize);
+ else
+ CJS_App::GetConsts(pConsts, nSize);
+ }
+
+ if (sObjName == CJS_Event::m_pClassName)
+ CJS_Event::GetConsts(pConsts, nSize);
+ else if (sObjName == CJS_Field::m_pClassName)
+ CJS_Field::GetConsts(pConsts, nSize);
+ else if (sObjName == CJS_Global::m_pClassName)
+ CJS_Global::GetConsts(pConsts, nSize);
+ else if (sObjName == CJS_Util::m_pClassName)
+ CJS_Util::GetConsts(pConsts, nSize);
+
+ for (int i=0; i<nSize; i++)
+ array.Add(pConsts[i].pName);
+}
+
+void CJS_Runtime::GetObjectProps(const CFX_WideString& sObjName, CFX_WideStringArray& array)
+{
+ JSPropertySpec* pProperties = NULL;
+ int nSize = 0;
+
+ if (sObjName == CJS_App::m_pClassName)
+ CJS_App::GetProperties(pProperties, nSize);
+ else if (sObjName == CJS_Color::m_pClassName)
+ CJS_Color::GetProperties(pProperties, nSize);
+ else if (sObjName == L"this")
+ {
+ if (GetReaderDocument())
+ CJS_Document::GetProperties(pProperties, nSize);
+ else
+ CJS_App::GetProperties(pProperties, nSize);
+ }
+ else if (sObjName == CJS_Event::m_pClassName)
+ CJS_Event::GetProperties(pProperties, nSize);
+ else if (sObjName == CJS_Field::m_pClassName)
+ CJS_Field::GetProperties(pProperties, nSize);
+ else if (sObjName == CJS_Global::m_pClassName)
+ CJS_Global::GetProperties(pProperties, nSize);
+ else if (sObjName == CJS_Util::m_pClassName)
+ CJS_Util::GetProperties(pProperties, nSize);
+
+ for (int i=0; i<nSize; i++)
+ array.Add(pProperties[i].pName);
+}
+
+void CJS_Runtime::GetObjectMethods(const CFX_WideString& sObjName, CFX_WideStringArray& array)
+{
+ JSMethodSpec* pMethods = NULL;
+ int nSize = 0;
+
+ if (sObjName == CJS_App::m_pClassName)
+ CJS_App::GetMethods(pMethods, nSize);
+ else if (sObjName == CJS_Color::m_pClassName)
+ CJS_Color::GetMethods(pMethods, nSize);
+ else if (sObjName == L"this")
+ {
+ if (GetReaderDocument())
+ CJS_Document::GetMethods(pMethods, nSize);
+ else
+ CJS_App::GetMethods(pMethods, nSize);
+ }
+ else if (sObjName == CJS_Event::m_pClassName)
+ CJS_Event::GetMethods(pMethods, nSize);
+ else if (sObjName == CJS_Field::m_pClassName)
+ CJS_Field::GetMethods(pMethods, nSize);
+ else if (sObjName == CJS_Global::m_pClassName)
+ CJS_Global::GetMethods(pMethods, nSize);
+ else if (sObjName == CJS_Util::m_pClassName)
+ CJS_Util::GetMethods(pMethods, nSize);
+
+ for (int i=0; i<nSize; i++)
+ array.Add(pMethods[i].pName);
+}
+
+FX_BOOL CJS_Runtime::IsEntered()
+{
+ return v8::Isolate::GetCurrent() == m_isolate;
+}
+void CJS_Runtime::Exit()
+{
+ if(m_isolate) m_isolate->Exit();
+}
+void CJS_Runtime::Enter()
+{
+ if(m_isolate) m_isolate->Enter();
+}
\ No newline at end of file diff --git a/fpdfsdk/src/javascript/JS_Value.cpp b/fpdfsdk/src/javascript/JS_Value.cpp new file mode 100644 index 0000000000..037f6184ed --- /dev/null +++ b/fpdfsdk/src/javascript/JS_Value.cpp @@ -0,0 +1,643 @@ +// 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 "../../include/javascript/JavaScript.h"
+#include "../../include/javascript/JS_Define.h"
+#include "../../include/javascript/JS_Object.h"
+#include "../../include/javascript/JS_Value.h"
+
+/* ---------------------------- CJS_Value ---------------------------- */
+
+CJS_Value::CJS_Value(v8::Isolate* isolate) : m_isolate(isolate),m_eType(VT_unknown)
+{
+}
+CJS_Value::CJS_Value(v8::Isolate* isolate, v8::Handle<v8::Value> pValue,FXJSVALUETYPE t) :m_isolate(isolate), m_pValue(pValue) , m_eType(t)
+{
+}
+
+CJS_Value::CJS_Value(v8::Isolate* isolate, const int &iValue):m_isolate(isolate)
+{
+ operator =(iValue);
+}
+
+CJS_Value::CJS_Value(v8::Isolate* isolate, const bool &bValue):m_isolate(isolate)
+{
+ operator =(bValue);
+}
+
+CJS_Value::CJS_Value(v8::Isolate* isolate, const float &fValue):m_isolate(isolate)
+{
+ operator =(fValue);
+}
+
+CJS_Value::CJS_Value(v8::Isolate* isolate, const double &dValue):m_isolate(isolate)
+{
+ operator =(dValue);
+}
+
+CJS_Value::CJS_Value(v8::Isolate* isolate, JSFXObject pJsObj):m_isolate(isolate)
+{
+ operator =(pJsObj);
+}
+
+CJS_Value::CJS_Value(v8::Isolate* isolate, CJS_Object * pJsObj):m_isolate(isolate)
+{
+ operator =(pJsObj);
+}
+
+CJS_Value::CJS_Value(v8::Isolate* isolate, FX_LPCWSTR pWstr):m_isolate(isolate)
+{
+ operator =(pWstr);
+}
+
+CJS_Value::CJS_Value(v8::Isolate* isolate, FX_LPCSTR pStr):m_isolate(isolate)
+{
+ operator = (pStr);
+}
+
+CJS_Value::CJS_Value(v8::Isolate* isolate, CJS_Array& array):m_isolate(isolate)
+{
+ operator = (array);
+}
+
+CJS_Value::~CJS_Value()
+{
+}
+
+void CJS_Value::Attach(v8::Handle<v8::Value> pValue,FXJSVALUETYPE t)
+{
+ m_pValue = pValue;
+ m_eType = t;
+}
+
+void CJS_Value::Attach(CJS_Value *pValue)
+{
+ if (pValue)
+ Attach(pValue->ToJSValue(),pValue->GetType());
+}
+
+void CJS_Value::Detach()
+{
+ m_pValue = v8::Handle<v8::Value>();
+ m_eType = VT_unknown;
+}
+
+/* ---------------------------------------------------------------------------------------- */
+
+CJS_Value::operator int() const
+{
+
+ return JS_ToInt32(m_pValue);
+
+}
+
+CJS_Value::operator bool() const
+{
+
+ return JS_ToBoolean(m_pValue);
+
+}
+
+CJS_Value::operator double() const
+{
+
+ return JS_ToNumber(m_pValue);
+
+}
+
+CJS_Value::operator float() const
+{
+
+ return (float)JS_ToNumber(m_pValue);
+
+}
+
+CJS_Value::operator CJS_Object *() const
+{
+
+ v8::Handle<v8::Object> pObj = JS_ToObject(m_pValue);
+ return (CJS_Object*)JS_GetPrivate(m_isolate, pObj);
+}
+
+CJS_Value::operator v8::Handle<v8::Object>() const
+{
+ return JS_ToObject(m_pValue);
+}
+
+CJS_Value::operator CFX_WideString() const
+{
+ return JS_ToString(m_pValue);
+}
+
+CJS_Value::operator CFX_ByteString() const
+{
+ return CFX_ByteString::FromUnicode(operator CFX_WideString());
+}
+
+v8::Handle<v8::Value> CJS_Value::ToJSValue()
+{
+ return m_pValue;
+}
+
+
+CJS_Value::operator v8::Handle<v8::Array>() const
+{
+ if (IsArrayObject())
+ return v8::Handle<v8::Array>::Cast(JS_ToObject(m_pValue));
+ return v8::Handle<v8::Array>();
+}
+
+/* ---------------------------------------------------------------------------------------- */
+
+void CJS_Value::operator =(int iValue)
+{
+ m_pValue = JS_NewNumber(m_isolate, iValue);
+
+ m_eType = VT_number;
+}
+
+void CJS_Value::operator =(bool bValue)
+{
+ m_pValue = JS_NewBoolean(m_isolate, bValue);
+
+ m_eType = VT_boolean;
+}
+
+void CJS_Value::operator =(double dValue)
+{
+ m_pValue = JS_NewNumber(m_isolate,dValue);
+
+ m_eType = VT_number;
+}
+
+void CJS_Value::operator = (float fValue)
+{
+ m_pValue = JS_NewNumber(m_isolate,fValue);
+ m_eType = VT_number;
+}
+
+void CJS_Value::operator =(v8::Handle<v8::Object> pObj)
+{
+
+ m_pValue = JS_NewObject(m_isolate,pObj);
+
+ m_eType = VT_fxobject;
+}
+
+void CJS_Value::operator =(CJS_Object * pObj)
+{
+ if (pObj)
+ operator = ((JSFXObject)*pObj);
+}
+
+void CJS_Value::operator =(FX_LPCWSTR pWstr)
+{
+ m_pValue = JS_NewString(m_isolate,(wchar_t *)pWstr);
+
+ m_eType = VT_string;
+}
+
+void CJS_Value::SetNull()
+{
+ m_pValue = JS_NewNull();
+
+ m_eType = VT_null;
+}
+
+void CJS_Value::operator = (FX_LPCSTR pStr)
+{
+ operator = (CFX_WideString::FromLocal(pStr));
+}
+
+void CJS_Value::operator = (CJS_Array & array)
+{
+ m_pValue = JS_NewObject2(m_isolate,(v8::Handle<v8::Array>)array);
+
+ m_eType = VT_object;
+}
+
+void CJS_Value::operator = (CJS_Date & date)
+{
+ m_pValue = JS_NewDate(m_isolate, (double)date);
+
+ m_eType = VT_date;
+}
+
+void CJS_Value::operator = (CJS_Value value)
+{
+ m_pValue = value.ToJSValue();
+
+ m_eType = value.m_eType;
+}
+
+/* ---------------------------------------------------------------------------------------- */
+
+FXJSVALUETYPE 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(JS_ToArray(m_pValue));
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CJS_Value::ConvertToDate(CJS_Date &date) const
+{
+// if (GetType() == VT_date)
+// {
+// date = (double)(*this);
+// return TRUE;
+// }
+
+ 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(v8::Isolate* isolate) : CJS_Value(isolate),
+ m_bIsSetting(0)
+{
+}
+
+CJS_PropValue::~CJS_PropValue()
+{
+}
+
+FX_BOOL CJS_PropValue::IsSetting()
+{
+ return m_bIsSetting;
+}
+
+FX_BOOL CJS_PropValue::IsGetting()
+{
+ return !m_bIsSetting;
+}
+
+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::operator int();
+}
+
+
+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::operator bool();
+
+}
+
+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::operator double();
+}
+
+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::operator CJS_Object *();
+}
+
+void CJS_PropValue::operator<<(JSFXObject pObj)
+{
+ ASSERT(!m_bIsSetting);
+ CJS_Value::operator = (pObj);
+}
+
+void CJS_PropValue::operator>>(JSFXObject &ppObj) const
+{
+ ASSERT(m_bIsSetting);
+ ppObj = CJS_Value::operator JSFXObject ();
+}
+
+
+void CJS_PropValue::StartSetting()
+{
+ m_bIsSetting = 1;
+}
+
+void CJS_PropValue::StartGetting()
+{
+ m_bIsSetting = 0;
+}
+void CJS_PropValue::operator <<(CFX_ByteString string)
+{
+ ASSERT(!m_bIsSetting);
+ CJS_Value::operator =((FX_LPCSTR)string);
+}
+
+void CJS_PropValue::operator >>(CFX_ByteString &string) const
+{
+ ASSERT(m_bIsSetting);
+ string = CJS_Value::operator CFX_ByteString();
+}
+
+void CJS_PropValue::operator <<(FX_LPCWSTR 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::operator CFX_WideString();
+}
+
+void CJS_PropValue::operator <<(CFX_WideString wide_string)
+{
+ ASSERT(!m_bIsSetting);
+ CJS_Value::operator = (wide_string);
+}
+
+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::Handle<v8::Value>() const
+{
+ return m_pValue;
+}
+
+/* ======================================== CJS_Array ========================================= */
+CJS_Array::CJS_Array(v8::Isolate* isolate):m_isolate(isolate)
+{
+}
+
+CJS_Array::~CJS_Array()
+{
+}
+
+void CJS_Array::Attach(v8::Handle<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::Handle<v8::Value> p = JS_GetArrayElemnet(m_pArray,index);
+ value.Attach(p,VT_object);
+}
+
+void CJS_Array::SetElement(unsigned index,CJS_Value value)
+{
+ if (m_pArray.IsEmpty())
+ m_pArray = JS_NewArray(m_isolate);
+
+ JS_PutArrayElement(m_pArray,index,value.ToJSValue(),value.GetType());
+}
+
+int CJS_Array::GetLength()
+{
+ if (m_pArray.IsEmpty())
+ return 0;
+ return JS_GetArrayLength(m_pArray);
+}
+
+CJS_Array:: operator v8::Handle<v8::Array>()
+{
+ if (m_pArray.IsEmpty())
+ m_pArray = JS_NewArray(m_isolate);
+
+ return m_pArray;
+}
+
+/* ======================================== CJS_Date ========================================= */
+
+CJS_Date::CJS_Date(v8::Isolate* isolate) :m_isolate(isolate)
+{
+}
+
+CJS_Date::CJS_Date(v8::Isolate* isolate,double dMsec_time)
+{
+ m_isolate = isolate;
+ m_pDate = JS_NewDate(isolate,dMsec_time);
+}
+
+CJS_Date::CJS_Date(v8::Isolate* isolate,int year, int mon, int day,int hour, int min, int sec)
+{
+ m_isolate = isolate;
+ m_pDate = JS_NewDate(isolate,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(JS_ToNumber(m_pDate));
+}
+
+void CJS_Date::Attach(v8::Handle<v8::Value> pDate)
+{
+ m_pDate = pDate;
+}
+
+int CJS_Date::GetYear()
+{
+ if (IsValidDate())
+ return JS_GetYearFromTime(JS_LocalTime(JS_ToNumber(m_pDate)));
+
+ return 0;
+}
+
+void CJS_Date::SetYear(int iYear)
+{
+ double date = MakeDate(iYear,GetMonth(),GetDay(),GetHours(),GetMinutes(),GetSeconds(),0);
+ JS_ValueCopy(m_pDate, JS_NewDate(m_isolate,date));
+}
+
+int CJS_Date::GetMonth()
+{
+ if (IsValidDate())
+ return JS_GetMonthFromTime(JS_LocalTime(JS_ToNumber(m_pDate)));
+
+ return 0;
+}
+
+void CJS_Date::SetMonth(int iMonth)
+{
+
+ double date = MakeDate(GetYear(),iMonth,GetDay(),GetHours(),GetMinutes(),GetSeconds(),0);
+ JS_ValueCopy(m_pDate, JS_NewDate(m_isolate,date));
+
+}
+
+int CJS_Date::GetDay()
+{
+ if (IsValidDate())
+ return JS_GetDayFromTime(JS_LocalTime(JS_ToNumber(m_pDate)));
+
+ return 0;
+}
+
+void CJS_Date::SetDay(int iDay)
+{
+
+ double date = MakeDate(GetYear(),GetMonth(),iDay,GetHours(),GetMinutes(),GetSeconds(),0);
+ JS_ValueCopy(m_pDate,JS_NewDate(m_isolate,date));
+
+}
+
+int CJS_Date::GetHours()
+{
+ if (IsValidDate())
+ return JS_GetHourFromTime(JS_LocalTime(JS_ToNumber(m_pDate)));
+
+ return 0;
+}
+
+void CJS_Date::SetHours(int iHours)
+{
+ double date = MakeDate(GetYear(),GetMonth(),GetDay(),iHours,GetMinutes(),GetSeconds(),0);
+ JS_ValueCopy(m_pDate,JS_NewDate(m_isolate,date));
+}
+
+int CJS_Date::GetMinutes()
+{
+ if (IsValidDate())
+ return JS_GetMinFromTime(JS_LocalTime(JS_ToNumber(m_pDate)));
+
+ return 0;
+}
+
+void CJS_Date::SetMinutes(int minutes)
+{
+ double date = MakeDate(GetYear(),GetMonth(),GetDay(),GetHours(),minutes,GetSeconds(),0);
+ JS_ValueCopy(m_pDate,JS_NewDate(m_isolate,date));
+}
+
+int CJS_Date::GetSeconds()
+{
+ if (IsValidDate())
+ return JS_GetSecFromTime(JS_LocalTime(JS_ToNumber(m_pDate)));
+
+ return 0;
+}
+
+void CJS_Date::SetSeconds(int seconds)
+{
+ double date = MakeDate(GetYear(),GetMonth(),GetDay(),GetHours(),GetMinutes(),seconds,0);
+ JS_ValueCopy(m_pDate,JS_NewDate(m_isolate,date));
+}
+
+CJS_Date::operator v8::Handle<v8::Value>()
+{
+ return m_pDate;
+}
+
+CJS_Date::operator double() const
+{
+ if(m_pDate.IsEmpty())
+ return 0.0;
+ return JS_ToNumber(m_pDate);
+}
+
+CFX_WideString CJS_Date::ToString() const
+{
+ if(m_pDate.IsEmpty())
+ return L"";
+ return JS_ToString(m_pDate);
+}
diff --git a/fpdfsdk/src/javascript/PublicMethods.cpp b/fpdfsdk/src/javascript/PublicMethods.cpp new file mode 100644 index 0000000000..c39c8a00dd --- /dev/null +++ b/fpdfsdk/src/javascript/PublicMethods.cpp @@ -0,0 +1,2335 @@ +// 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 "../../include/javascript/JavaScript.h"
+#include "../../include/javascript/IJavaScript.h"
+#include "../../include/javascript/JS_Define.h"
+#include "../../include/javascript/JS_Object.h"
+#include "../../include/javascript/JS_Value.h"
+#include "../../include/javascript/PublicMethods.h"
+#include "../../include/javascript/JS_EventHandler.h"
+#include "../../include/javascript/resource.h"
+#include "../../include/javascript/JS_Context.h"
+#include "../../include/javascript/JS_Value.h"
+#include "../../include/javascript/util.h"
+#include "../../include/javascript/Field.h"
+#include "../../include/javascript/color.h"
+#include "../../include/javascript/JS_Runtime.h"
+
+static v8::Isolate* GetIsolate(IFXJS_Context* cc)
+{
+ CJS_Context* pContext = (CJS_Context *)cc;
+ ASSERT(pContext != NULL);
+
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+ ASSERT(pRuntime != NULL);
+
+ return pRuntime->GetIsolate();
+}
+
+
+/* -------------------------------- CJS_PublicMethods -------------------------------- */
+
+#define DOUBLE_CORRECT 0.000000000000001
+
+BEGIN_JS_STATIC_GLOBAL_FUN(CJS_PublicMethods)
+ JS_STATIC_GLOBAL_FUN_ENTRY(AFNumber_Format,6)
+ JS_STATIC_GLOBAL_FUN_ENTRY(AFNumber_Keystroke,6)
+ JS_STATIC_GLOBAL_FUN_ENTRY(AFPercent_Format,2)
+ JS_STATIC_GLOBAL_FUN_ENTRY(AFPercent_Keystroke,2)
+ JS_STATIC_GLOBAL_FUN_ENTRY(AFDate_FormatEx,1)
+ JS_STATIC_GLOBAL_FUN_ENTRY(AFDate_KeystrokeEx,1)
+ JS_STATIC_GLOBAL_FUN_ENTRY(AFDate_Format,1)
+ JS_STATIC_GLOBAL_FUN_ENTRY(AFDate_Keystroke,1)
+ JS_STATIC_GLOBAL_FUN_ENTRY(AFTime_FormatEx,1)
+ JS_STATIC_GLOBAL_FUN_ENTRY(AFTime_KeystrokeEx,1)
+ JS_STATIC_GLOBAL_FUN_ENTRY(AFTime_Format,1)
+ JS_STATIC_GLOBAL_FUN_ENTRY(AFTime_Keystroke,1)
+ JS_STATIC_GLOBAL_FUN_ENTRY(AFSpecial_Format,1)
+ JS_STATIC_GLOBAL_FUN_ENTRY(AFSpecial_Keystroke,1)
+ JS_STATIC_GLOBAL_FUN_ENTRY(AFSpecial_KeystrokeEx,1)
+ JS_STATIC_GLOBAL_FUN_ENTRY(AFSimple,3)
+ JS_STATIC_GLOBAL_FUN_ENTRY(AFMakeNumber,1)
+ JS_STATIC_GLOBAL_FUN_ENTRY(AFSimple_Calculate,2)
+ JS_STATIC_GLOBAL_FUN_ENTRY(AFRange_Validate,4)
+ JS_STATIC_GLOBAL_FUN_ENTRY(AFMergeChange,1)
+ JS_STATIC_GLOBAL_FUN_ENTRY(AFParseDateEx,2)
+ JS_STATIC_GLOBAL_FUN_ENTRY(AFExtractNums,1)
+END_JS_STATIC_GLOBAL_FUN()
+
+IMPLEMENT_JS_STATIC_GLOBAL_FUN(CJS_PublicMethods)
+
+struct stru_TbConvert
+{
+ FX_LPCSTR lpszJSMark;
+ FX_LPCSTR lpszCppMark;
+};
+
+static const stru_TbConvert fcTable[] = {"mmmm","%B",
+ "mmm", "%b",
+ "mm", "%m",
+ //"m"
+ "dddd","%A",
+ "ddd", "%a",
+ "dd", "%d",
+ //"d", "%w",
+ "yyyy","%Y",
+ "yy", "%y",
+ "HH", "%H",
+ //"H"
+ "hh", "%I",
+ //"h"
+ "MM", "%M",
+ //"M"
+ "ss", "%S",
+ //"s
+ "tt", "%p"
+ //"t"
+};
+
+static FX_LPCWSTR months[] =
+{
+ (FX_LPCWSTR)L"Jan", (FX_LPCWSTR)L"Feb", (FX_LPCWSTR)L"Mar", (FX_LPCWSTR)L"Apr", (FX_LPCWSTR)L"May", (FX_LPCWSTR)L"Jun", (FX_LPCWSTR)L"Jul", (FX_LPCWSTR)L"Aug", (FX_LPCWSTR)L"Sep", (FX_LPCWSTR)L"Oct", (FX_LPCWSTR)L"Nov", (FX_LPCWSTR)L"Dec"
+};
+
+static FX_LPCWSTR fullmonths[] =
+{
+ (FX_LPCWSTR)L"January", (FX_LPCWSTR)L"February", (FX_LPCWSTR)L"March", (FX_LPCWSTR)L"April", (FX_LPCWSTR)L"May", (FX_LPCWSTR)L"June", (FX_LPCWSTR)L"July", (FX_LPCWSTR)L"August", (FX_LPCWSTR)L"September", (FX_LPCWSTR)L"October", (FX_LPCWSTR)L"November", (FX_LPCWSTR)L"December"
+};
+
+FX_BOOL CJS_PublicMethods::IsNumber(FX_LPCWSTR string)
+{
+ CFX_WideString sTrim = StrTrim(string);
+ FX_LPCWSTR pTrim = sTrim;
+ FX_LPCWSTR 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 (!IsDigit(c))
+ {
+ return FALSE;
+ }
+ p++;
+ }
+
+ return TRUE;
+}
+
+FX_BOOL CJS_PublicMethods::IsDigit(wchar_t ch)
+{
+ return (ch >= L'0' && ch <= L'9');
+}
+
+FX_BOOL CJS_PublicMethods::IsDigit(char ch)
+{
+ return (ch >= '0' && ch <= '9');
+}
+
+FX_BOOL CJS_PublicMethods::IsAlphabetic(wchar_t ch)
+{
+ return ((ch >= L'a' && ch <= L'z') || (ch >= L'A' && ch <= L'Z'));
+}
+
+FX_BOOL CJS_PublicMethods::IsAlphaNumeric(wchar_t ch)
+{
+ return (IsDigit(ch) || IsAlphabetic(ch));
+}
+
+FX_BOOL CJS_PublicMethods::maskSatisfied(wchar_t c_Change,wchar_t c_Mask)
+{
+ switch (c_Mask)
+ {
+ case L'9':
+ return IsDigit(c_Change);
+ case L'A':
+ return IsAlphabetic(c_Change);
+ case L'O':
+ return IsAlphaNumeric(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(FX_LPCWSTR sFuction, double dValue1, double dValue2)
+{
+ if (FXSYS_wcsicmp(sFuction,(FX_LPCWSTR)L"AVG") == 0 || FXSYS_wcsicmp(sFuction,(FX_LPCWSTR)L"SUM") == 0)
+ {
+ return dValue1 + dValue2;
+ }
+ else if (FXSYS_wcsicmp(sFuction, (FX_LPCWSTR)L"PRD") == 0)
+ {
+ return dValue1 * dValue2;
+ }
+ else if (FXSYS_wcsicmp(sFuction,(FX_LPCWSTR)L"MIN") == 0)
+ {
+ return FX_MIN(dValue1, dValue2);
+ }
+ else if (FXSYS_wcsicmp(sFuction,(FX_LPCWSTR)L"MAX") == 0)
+ {
+ return FX_MAX(dValue1, dValue2);
+ }
+
+ return dValue1;
+}
+
+CFX_WideString CJS_PublicMethods::StrLTrim(FX_LPCWSTR pStr)
+{
+ while (*pStr && *pStr == L' ') pStr++;
+
+ return pStr;
+}
+
+CFX_WideString CJS_PublicMethods::StrRTrim(FX_LPCWSTR pStr)
+{
+ FX_LPCWSTR p = pStr;
+
+ while (*p) p++;
+ p--;
+ if (p >= pStr)
+ {
+ while (*p && *p == L' ') p--;
+ p++;
+ return CFX_WideString(pStr,p-pStr);
+ }
+ return L"";
+}
+
+CFX_WideString CJS_PublicMethods::StrTrim(FX_LPCWSTR pStr)
+{
+ return StrRTrim(StrLTrim(pStr));
+}
+
+CFX_ByteString CJS_PublicMethods::StrLTrim(FX_LPCSTR pStr)
+{
+ while (*pStr && *pStr == ' ') pStr++;
+
+ return pStr;
+}
+
+CFX_ByteString CJS_PublicMethods::StrRTrim(FX_LPCSTR pStr)
+{
+ FX_LPCSTR p = pStr;
+
+ while (*p) p++;
+ p--;
+ if (p >= pStr)
+ {
+ while (*p && *p == ' ') p--;
+ p++;
+ return CFX_ByteString(pStr,p-pStr);
+ }
+ return "";
+}
+
+CFX_ByteString CJS_PublicMethods::StrTrim(FX_LPCSTR pStr)
+{
+ return StrRTrim(StrLTrim(pStr));
+}
+
+double CJS_PublicMethods::ParseNumber(FX_LPCWSTR swSource, FX_BOOL& bAllDigits, FX_BOOL& bDot, FX_BOOL& bSign, FX_BOOL& bKXJS)
+{
+ bDot = FALSE;
+ bSign = FALSE;
+ bKXJS = FALSE;
+
+ FX_BOOL bDigitExist = FALSE;
+
+ FX_LPCWSTR p = swSource;
+ wchar_t c;
+
+ FX_LPCWSTR pStart = NULL;
+ FX_LPCWSTR pEnd = NULL;
+
+ while ((c = *p))
+ {
+ if (!pStart && c != L' ')
+ {
+ pStart = p;
+ }
+
+ pEnd = p;
+ p++;
+ }
+
+ if (!pStart)
+ {
+ bAllDigits = FALSE;
+ return 0;
+ }
+
+ while (pEnd != pStart)
+ {
+ if (*pEnd == L' ')
+ pEnd --;
+ else
+ break;
+ }
+
+ double dRet = 0;
+ p = pStart;
+ bAllDigits = TRUE;
+ CFX_WideString swDigits;
+
+ while (p <= pEnd)
+ {
+ c = *p;
+
+ if (IsDigit(c))
+ {
+ swDigits += c;
+ bDigitExist = TRUE;
+ }
+ else
+ {
+ switch (c)
+ {
+ case L' ':
+ bAllDigits = FALSE;
+ break;
+ case L'.':
+ case L',':
+ if (!bDot)
+ {
+ if (bDigitExist)
+ {
+ swDigits += L'.';
+ }
+ else
+ {
+ swDigits += L'0';
+ swDigits += L'.';
+ bDigitExist = TRUE;
+ }
+
+ bDot = TRUE;
+ break;
+ }
+ case 'e':
+ case 'E':
+ if (!bKXJS)
+ {
+ p++;
+ c = *p;
+ if (c == '+' || c == '-')
+ {
+ bKXJS = TRUE;
+ swDigits += 'e';
+ swDigits += c;
+ }
+ break;
+ }
+ case L'-':
+ if (!bDigitExist && !bSign)
+ {
+ swDigits += c;
+ bSign = TRUE;
+ break;
+ }
+ default:
+ bAllDigits = FALSE;
+
+ if (p != pStart && !bDot && bDigitExist)
+ {
+ swDigits += L'.';
+ bDot = TRUE;
+ }
+ else
+ {
+ bDot = FALSE;
+ bDigitExist = FALSE;
+ swDigits = L"";
+ }
+ break;
+ }
+ }
+
+ p++;
+ }
+
+ if (swDigits.GetLength() > 0 && swDigits.GetLength() < 17)
+ {
+ CFX_ByteString sDigits = swDigits.UTF8Encode();
+
+ if (bKXJS)
+ {
+ dRet = atof(sDigits);
+ }
+ else
+ {
+ if (bDot)
+ {
+ char* pStopString;
+ dRet = ::strtod(sDigits, &pStopString);
+ }
+ else
+ {
+ dRet = atol(sDigits);
+ }
+ }
+
+ }
+
+ return dRet;
+}
+
+double CJS_PublicMethods::ParseStringToNumber(FX_LPCWSTR swSource)
+{
+ FX_BOOL bAllDigits = FALSE;
+ FX_BOOL bDot = FALSE;
+ FX_BOOL bSign = FALSE;
+ FX_BOOL bKXJS = FALSE;
+
+ return ParseNumber(swSource, bAllDigits, bDot, bSign, bKXJS);
+}
+
+FX_BOOL CJS_PublicMethods::ConvertStringToNumber(FX_LPCWSTR swSource, double & dRet, FX_BOOL & bDot)
+{
+ FX_BOOL bAllDigits = FALSE;
+ FX_BOOL bSign = FALSE;
+ FX_BOOL bKXJS = FALSE;
+
+ dRet = ParseNumber(swSource, bAllDigits, bDot, bSign, bKXJS);
+
+ return bAllDigits;
+}
+
+CJS_Array CJS_PublicMethods::AF_MakeArrayFromList(v8::Isolate* isolate, CJS_Value val)
+{
+ CJS_Array StrArray(isolate);
+ if(val.IsArrayObject())
+ {
+ val.ConvertToArray(StrArray);
+ return StrArray;
+ }
+ CFX_WideString wsStr = val.operator CFX_WideString();
+ 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 == NULL)
+ {
+ StrArray.SetElement(nIndex, CJS_Value(isolate,(FX_LPCSTR)StrTrim(p)));
+ break;
+ }
+ else
+ {
+ char * pSub = new char[pTemp - p + 1];
+ strncpy(pSub, p, pTemp - p);
+ *(pSub + (pTemp - p)) = '\0';
+
+ StrArray.SetElement(nIndex, CJS_Value(isolate,(FX_LPCSTR)StrTrim(pSub)));
+ delete []pSub;
+
+ nIndex ++;
+ p = ++pTemp;
+ }
+
+ }
+ return StrArray;
+}
+
+int CJS_PublicMethods::ParseStringInteger(const CFX_WideString& string,int nStart,int& nSkip, int nMaxStep)
+{
+ int nRet = 0;
+ nSkip = 0;
+ for (int i=nStart, sz=string.GetLength(); i < sz; i++)
+ {
+ if (i-nStart > 10)
+ break;
+
+ FX_WCHAR c = string.GetAt(i);
+ if (IsDigit((wchar_t)c))
+ {
+ nRet = nRet * 10 + (c - '0');
+ nSkip = i - nStart + 1;
+ if (nSkip >= nMaxStep)
+ break;
+ }
+ else
+ break;
+ }
+
+ return nRet;
+}
+
+CFX_WideString CJS_PublicMethods::ParseStringString(const CFX_WideString& string, int nStart, int& nSkip)
+{
+ CFX_WideString swRet;
+ nSkip = 0;
+ for (int i=nStart, sz=string.GetLength(); i < sz; i++)
+ {
+ FX_WCHAR c = string.GetAt(i);
+ if ((c >= L'a' && c <= L'z') || (c >= L'A' && c <= L'Z'))
+ {
+ swRet += c;
+ nSkip = i - nStart + 1;
+ }
+ else
+ break;
+ }
+
+ return swRet;
+}
+
+double CJS_PublicMethods::ParseNormalDate(const CFX_WideString & value, FX_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 (IsDigit((wchar_t)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];
+ }
+
+ 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];
+ }
+
+ bWrongFormat = FALSE;
+ }
+ else
+ {
+ bWrongFormat = TRUE;
+ return dt;
+ }
+
+ CFX_WideString swTemp;
+ swTemp.Format((FX_LPCWSTR)L"%d/%d/%d %d:%d:%d",nMonth,nDay,nYear,nHour,nMin,nSec);
+ return JS_DateParse(swTemp);
+}
+
+double CJS_PublicMethods::MakeRegularDate(const CFX_WideString & value, const CFX_WideString & format, FX_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;
+ bWrongFormat = 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;
+
+ if (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 = value.GetAt(i) == 'p';
+ i++;
+ j++;
+ break;
+ }
+ }
+ else if (format.GetAt(i+1) == c && 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 = (value.GetAt(j) == 'p' && value.GetAt(j+1) == 'm');
+ i += 2;
+ j += 2;
+ break;
+ }
+ }
+ else if (format.GetAt(i+1) == c && format.GetAt(i+2) == c && 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 (format.GetAt(i+1) == c && format.GetAt(i+2) == c && format.GetAt(i+3) == c && 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, 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 (format.GetAt(i) != value.GetAt(j))
+ {
+ bWrongFormat = TRUE;
+ bExit = TRUE;
+ }
+ i++;
+ j++;
+ }
+
+ if (oldj == j)
+ {
+ bWrongFormat = TRUE;
+ bExit = TRUE;
+ }
+ }
+
+ break;
+ default:
+ if (value.GetLength() <= j)
+ {
+ bExit = TRUE;
+ }
+ else if (format.GetAt(i) != value.GetAt(j))
+ {
+ bWrongFormat = TRUE;
+ bExit = TRUE;
+ }
+
+ i++;
+ j++;
+ break;
+ }
+ }
+
+ if (bPm) nHour += 12;
+
+ if (nYear >= 0 && nYear <= nYearSub)
+ nYear += 2000;
+
+ if (nMonth < 1 || nMonth > 12)
+ bWrongFormat = TRUE;
+
+ if (nDay < 1 || nDay > 31)
+ bWrongFormat = TRUE;
+
+ if (nHour < 0 || nHour > 24)
+ bWrongFormat = TRUE;
+
+ if (nMin < 0 || nMin > 60)
+ bWrongFormat = TRUE;
+
+ if (nSec < 0 || nSec > 60)
+ bWrongFormat = TRUE;
+
+ double dRet = 0;
+
+ if (bWrongFormat)
+ {
+ dRet = ParseNormalDate(value, bWrongFormat);
+ }
+ else
+ {
+ dRet = JS_MakeDate(JS_MakeDay(nYear,nMonth - 1,nDay),JS_MakeTime(nHour, nMin, nSec, 0));
+
+ if (JS_PortIsNan(dRet))
+ {
+ dRet = JS_DateParse(value);
+ }
+ }
+
+ if (JS_PortIsNan(dRet))
+ {
+ dRet = ParseNormalDate(value, bWrongFormat);
+ }
+
+ 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;
+ FX_WCHAR c;
+ while (i < format.GetLength())
+ {
+ c = format.GetAt(i);
+ sPart = L"";
+ switch (c)
+ {
+ case 'y':
+ case 'm':
+ case 'd':
+ case 'H':
+ case 'h':
+ case 'M':
+ case 's':
+ case 't':
+ if (format.GetAt(i+1) != c)
+ {
+ switch (c)
+ {
+ case 'y':
+ sPart += c;
+ break;
+ case 'm':
+ sPart.Format((FX_LPCWSTR)L"%d",nMonth);
+ break;
+ case 'd':
+ sPart.Format((FX_LPCWSTR)L"%d",nDay);
+ break;
+ case 'H':
+ sPart.Format((FX_LPCWSTR)L"%d",nHour);
+ break;
+ case 'h':
+ sPart.Format((FX_LPCWSTR)L"%d",nHour>12?nHour - 12:nHour);
+ break;
+ case 'M':
+ sPart.Format((FX_LPCWSTR)L"%d",nMin);
+ break;
+ case 's':
+ sPart.Format((FX_LPCWSTR)L"%d",nSec);
+ break;
+ case 't':
+ sPart += nHour>12?'p':'a';
+ break;
+ }
+ i++;
+ }
+ else if (format.GetAt(i+1) == c && format.GetAt(i+2) != c)
+ {
+ switch (c)
+ {
+ case 'y':
+ sPart.Format((FX_LPCWSTR)L"%02d",nYear - (nYear / 100) * 100);
+ break;
+ case 'm':
+ sPart.Format((FX_LPCWSTR)L"%02d",nMonth);
+ break;
+ case 'd':
+ sPart.Format((FX_LPCWSTR)L"%02d",nDay);
+ break;
+ case 'H':
+ sPart.Format((FX_LPCWSTR)L"%02d",nHour);
+ break;
+ case 'h':
+ sPart.Format((FX_LPCWSTR)L"%02d",nHour>12?nHour - 12:nHour);
+ break;
+ case 'M':
+ sPart.Format((FX_LPCWSTR)L"%02d",nMin);
+ break;
+ case 's':
+ sPart.Format((FX_LPCWSTR)L"%02d",nSec);
+ break;
+ case 't':
+ sPart = nHour>12? (FX_LPCWSTR)L"pm": (FX_LPCWSTR)L"am";
+ break;
+ }
+ i+=2;
+ }
+ else if (format.GetAt(i+1) == c && format.GetAt(i+2) == c && 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 (format.GetAt(i+1) == c && format.GetAt(i+2) == c && format.GetAt(i+3) == c && format.GetAt(i+4) != c)
+ {
+ switch (c)
+ {
+ case 'y':
+ sPart.Format((FX_LPCWSTR)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(OBJ_METHOD_PARAMS)
+{
+#if _FX_OS_ != _FX_ANDROID_
+ v8::Isolate* isolate = ::GetIsolate(cc);
+ CJS_Context* pContext = (CJS_Context *)cc;
+ ASSERT(pContext != NULL);
+ CJS_EventHandler* pEvent = pContext->GetEventHandler();
+ ASSERT(pEvent != NULL);
+
+ if (params.size() != 6)
+ {
+ 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];
+ int iSepStyle = params[1];
+ int iNegStyle = params[2];
+ int icurrStyle = params[3]; //it's no use!
+ std::wstring wstrCurrency(params[4].operator CFX_WideString());
+ FX_BOOL bCurrencyPrepend = params[5];
+
+ 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;
+ FX_BOOL bNagative = FALSE;
+
+ strValue = fcvt(dValue,iDec,&iDec2,&bNagative);
+ if (strValue.IsEmpty())
+ {
+ dValue = 0;
+ strValue = fcvt(dValue,iDec,&iDec2,&bNagative);
+ 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 = '.';
+
+ int iDecPositive,iDecNagative;
+ iDecPositive = iDec2;
+ iDecNagative = iDec2;
+
+ for (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);
+
+ if (bCurrencyPrepend)
+ strValue2 = wstrCurrency + strValue2;
+ else
+ strValue2 = strValue2 + wstrCurrency;
+
+
+
+ /////////////////////////////////////////////////////////////////////////
+ //for processing negative style
+ if (bNagative)
+ {
+ 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(isolate);
+ CJS_Value vColElm(isolate);
+ 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(isolate);
+ 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(isolate);
+ CJS_Value vColElm(isolate);
+ vColElm = L"RGB";
+ arColor.SetElement(0,vColElm);
+ vColElm = 0;
+ arColor.SetElement(1,vColElm);
+ arColor.SetElement(2,vColElm);
+ arColor.SetElement(3,vColElm);
+
+ CJS_PropValue vProp(isolate);
+ vProp.StartGetting();
+ fTarget->textColor(cc,vProp,sError);
+
+ CJS_Array aProp(isolate);
+ vProp.ConvertToArray(aProp);
+
+ CPWL_Color crProp;
+ CPWL_Color crColor;
+ color::ConvertArrayToPWLColor(aProp, crProp);
+ color::ConvertArrayToPWLColor(arColor, crColor);
+
+ if (crColor != crProp)
+ {
+ CJS_PropValue vProp2(isolate);
+ 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(OBJ_METHOD_PARAMS)
+{
+ CJS_Context* pContext = (CJS_Context *)cc;
+ ASSERT(pContext != NULL);
+ CJS_EventHandler* pEvent = pContext->GetEventHandler();
+ ASSERT(pEvent != NULL);
+
+ if(params.size() < 2)
+ return FALSE;
+ int iSepStyle = params[1];
+
+ 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);
+ if (wstrValue.IsEmpty())
+ return TRUE;
+
+ CFX_WideString swTemp = wstrValue;
+ swTemp.Replace((FX_LPCWSTR)L",", (FX_LPCWSTR)L".");
+ if (!IsNumber(swTemp)) //!(IsNumber(wstrChange) &&
+ {
+ pEvent->Rc() = FALSE;
+ sError = JSGetStringFromID(pContext, IDS_STRING_JSAFNUMBER_KEYSTROKE);
+ Alert(pContext, sError);
+ return TRUE;
+ }
+ return TRUE; // it happens after the last keystroke and before validating,
+ }
+
+ std::wstring w_strValue2 (w_strValue);
+ std::wstring w_strChange2(w_strChange);
+
+ std::wstring w_strSelected;
+ if(-1 != pEvent->SelStart())
+ w_strSelected = w_strValue2.substr(pEvent->SelStart(),(pEvent->SelEnd() - pEvent->SelStart()));
+ FX_BOOL bHasSign = (w_strValue2.find('-') != -1) && (w_strSelected.find('-') == -1);
+ 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;
+ }
+
+ FX_BOOL bHasSep = (w_strValue2.find(cSep) != -1);
+ 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;
+ }
+ else
+ {
+ bHasSep = TRUE;
+ continue;
+ }
+ }
+ if (*it == L'-')
+ {
+ if (bHasSign)
+ {
+ FX_BOOL &bRc = pEvent->Rc();
+ bRc = FALSE;
+ return TRUE;
+ }
+ else if (it != w_strChange2.begin()) //sign's position is not correct
+ {
+ FX_BOOL &bRc = pEvent->Rc();
+ bRc = FALSE;
+ return TRUE;
+ }
+ else if (pEvent->SelStart() != 0)
+ {
+ FX_BOOL &bRc = pEvent->Rc();
+ bRc = FALSE;
+ return TRUE;
+ }
+ bHasSign = TRUE;
+ continue;
+ }
+
+ if (!IsDigit(*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(OBJ_METHOD_PARAMS)
+{
+#if _FX_OS_ != _FX_ANDROID_
+ CJS_Context* pContext = (CJS_Context *)cc;
+ ASSERT(pContext != NULL);
+ CJS_EventHandler* pEvent = pContext->GetEventHandler();
+ ASSERT(pEvent != NULL);
+
+ if (params.size() != 2)
+ {
+ sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+ return FALSE;
+ }
+ if(!pEvent->m_pValue)
+ return FALSE;
+ CFX_WideString& Value = pEvent->Value();
+
+// HWND hMainFrame = NULL;
+//
+// CPDFSDK_FormFillApp *pApp = pContext->GetReaderApp();
+// ASSERT(pApp);
+// hMainFrame = pApp->GetMainFrameWnd();
+
+ CFX_ByteString strValue = StrTrim(CFX_ByteString::FromUnicode(Value));
+
+ if (strValue.IsEmpty())
+ return TRUE;
+
+ int iDec = params[0];
+ int iSepStyle = params[1];
+
+ //ASSERT(iDec > 0);
+ if (iDec < 0)
+ iDec = -iDec;
+
+ 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;
+ FX_BOOL bNagative = FALSE;
+ strValue = fcvt(dValue,iDec,&iDec2,&bNagative);
+ if (strValue.IsEmpty())
+ {
+ dValue = 0;
+ strValue = fcvt(dValue,iDec,&iDec2,&bNagative);
+ }
+
+ 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 = '.';
+
+ int iDecPositive,iDecNagative;
+ iDecPositive = iDec2;
+ iDecNagative = iDec2;
+
+ for (iDecPositive = iDec2 -3; iDecPositive > 0; iDecPositive -= 3)
+ {
+ strValue.Insert(iDecPositive,cSeperator);
+ iMax++;
+ }
+ }
+ ////////////////////////////////////////////////////////////////////
+ //nagative mark
+ if(bNagative)
+ strValue = "-" + strValue;
+ strValue += "%";
+ Value = CFX_WideString::FromLocal(strValue);
+#endif
+ return TRUE;
+}
+//AFPercent_Keystroke(nDec, sepStyle)
+FX_BOOL CJS_PublicMethods::AFPercent_Keystroke(OBJ_METHOD_PARAMS)
+{
+ return AFNumber_Keystroke(cc,params,vRet,sError);
+}
+
+//function AFDate_FormatEx(cFormat)
+FX_BOOL CJS_PublicMethods::AFDate_FormatEx(OBJ_METHOD_PARAMS)
+{
+ CJS_Context* pContext = (CJS_Context *)cc;
+ ASSERT(pContext != NULL);
+ CJS_EventHandler* pEvent = pContext->GetEventHandler();
+ ASSERT(pEvent != NULL);
+
+ 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].operator CFX_WideString();
+
+ FX_BOOL bWrongFormat = FALSE;
+ 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,bWrongFormat);
+ }
+
+ if (JS_PortIsNan(dDate))
+ {
+ CFX_WideString swMsg;
+ swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSPARSEDATE), (FX_LPCWSTR)sFormat);
+ Alert(pContext, swMsg);
+ return FALSE;
+ }
+
+ val = MakeFormatDate(dDate,sFormat);
+
+ return TRUE;
+}
+
+double CJS_PublicMethods::MakeInterDate(CFX_WideString strValue)
+{
+ int nHour;
+ int nMin;
+ int nSec;
+ int nYear;
+ int nMonth;
+ int nDay;
+
+ CFX_WideStringArray wsArray;
+ CFX_WideString sMonth = L"";
+ CFX_WideString sTemp = L"";
+ int nSize = strValue.GetLength();
+
+ for(int i = 0; i < nSize; i++)
+ {
+ FX_WCHAR c = strValue.GetAt(i);
+ if(c == L' ' || c == L':')
+ {
+ wsArray.Add(sTemp);
+ sTemp = L"";
+ continue;
+ }
+
+ sTemp += c;
+ }
+
+ wsArray.Add(sTemp);
+ if(wsArray.GetSize() != 8)return 0;
+
+ sTemp = wsArray[1];
+ if(sTemp.Compare(L"Jan") == 0) nMonth = 1;
+ if(sTemp.Compare(L"Feb") == 0) nMonth = 2;
+ if(sTemp.Compare(L"Mar") == 0) nMonth = 3;
+ if(sTemp.Compare(L"Apr") == 0) nMonth = 4;
+ if(sTemp.Compare(L"May") == 0) nMonth = 5;
+ if(sTemp.Compare(L"Jun") == 0) nMonth = 6;
+ if(sTemp.Compare(L"Jul") == 0) nMonth = 7;
+ if(sTemp.Compare(L"Aug") == 0) nMonth = 8;
+ if(sTemp.Compare(L"Sep") == 0) nMonth = 9;
+ if(sTemp.Compare(L"Oct") == 0) nMonth = 10;
+ if(sTemp.Compare(L"Nov") == 0) nMonth = 11;
+ if(sTemp.Compare(L"Dec") == 0) nMonth = 12;
+
+ nDay = (int)ParseStringToNumber(wsArray[2]);
+ nHour = (int)ParseStringToNumber(wsArray[3]);
+ nMin = (int)ParseStringToNumber(wsArray[4]);
+ nSec = (int)ParseStringToNumber(wsArray[5]);
+ nYear = (int)ParseStringToNumber(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);
+ }
+
+ return dRet;
+}
+
+//AFDate_KeystrokeEx(cFormat)
+FX_BOOL CJS_PublicMethods::AFDate_KeystrokeEx(OBJ_METHOD_PARAMS)
+{
+ CJS_Context* pContext = (CJS_Context *)cc;
+ ASSERT(pContext != NULL);
+ CJS_EventHandler* pEvent = pContext->GetEventHandler();
+ ASSERT(pEvent != NULL);
+
+ 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].operator CFX_WideString();
+
+ FX_BOOL bWrongFormat = FALSE;
+ double dRet = MakeRegularDate(strValue,sFormat,bWrongFormat);
+ if (bWrongFormat || JS_PortIsNan(dRet))
+ {
+ CFX_WideString swMsg;
+ swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSPARSEDATE), (FX_LPCWSTR)sFormat);
+ Alert(pContext, swMsg);
+ pEvent->Rc() = FALSE;
+ return TRUE;
+ }
+ }
+ return TRUE;
+}
+
+FX_BOOL CJS_PublicMethods::AFDate_Format(OBJ_METHOD_PARAMS)
+{
+ v8::Isolate* isolate = ::GetIsolate(cc);
+
+ if (params.size() != 1)
+ {
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+
+ sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+ return FALSE;
+ }
+
+ int iIndex = params[0];
+ FX_LPCWSTR cFormats[] = {(FX_LPCWSTR)L"m/d", (FX_LPCWSTR)L"m/d/yy", (FX_LPCWSTR)L"mm/dd/yy", (FX_LPCWSTR)L"mm/yy", (FX_LPCWSTR)L"d-mmm", (FX_LPCWSTR)L"d-mmm-yy", (FX_LPCWSTR)L"dd-mmm-yy",
+ (FX_LPCWSTR)L"yy-mm-dd", (FX_LPCWSTR)L"mmm-yy", (FX_LPCWSTR)L"mmmm-yy", (FX_LPCWSTR)L"mmm d, yyyy", (FX_LPCWSTR)L"mmmm d, yyyy",
+ (FX_LPCWSTR)L"m/d/yy h:MM tt", (FX_LPCWSTR)L"m/d/yy HH:MM" };
+
+ ASSERT(iIndex < sizeof(cFormats)/sizeof(FX_LPCWSTR));
+
+ if (iIndex < 0)
+ iIndex = 0;
+ if (iIndex >= sizeof(cFormats)/sizeof(FX_LPCWSTR))
+ iIndex = 0;
+ CJS_Parameters newParams;
+ CJS_Value val(isolate,cFormats[iIndex]);
+ newParams.push_back(val);
+ return AFDate_FormatEx(cc,newParams,vRet,sError);
+}
+
+//AFDate_KeystrokeEx(cFormat)
+FX_BOOL CJS_PublicMethods::AFDate_Keystroke(OBJ_METHOD_PARAMS)
+{
+ v8::Isolate* isolate = ::GetIsolate(cc);
+
+ if (params.size() != 1)
+ {
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+
+ sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+ return FALSE;
+ }
+
+ int iIndex = params[0];
+ FX_LPCWSTR cFormats[] = {(FX_LPCWSTR)L"m/d", (FX_LPCWSTR)L"m/d/yy", (FX_LPCWSTR)L"mm/dd/yy", (FX_LPCWSTR)L"mm/yy", (FX_LPCWSTR)L"d-mmm", (FX_LPCWSTR)L"d-mmm-yy", (FX_LPCWSTR)L"dd-mmm-yy",
+ (FX_LPCWSTR)L"yy-mm-dd", (FX_LPCWSTR)L"mmm-yy", (FX_LPCWSTR)L"mmmm-yy", (FX_LPCWSTR)L"mmm d, yyyy", (FX_LPCWSTR)L"mmmm d, yyyy",
+ (FX_LPCWSTR)L"m/d/yy h:MM tt", (FX_LPCWSTR)L"m/d/yy HH:MM" };
+
+ ASSERT(iIndex<sizeof(cFormats)/sizeof(FX_LPCWSTR));
+
+ if (iIndex < 0)
+ iIndex = 0;
+ if (iIndex >= sizeof(cFormats)/sizeof(FX_LPCWSTR))
+ iIndex = 0;
+ CJS_Parameters newParams;
+ CJS_Value val(isolate,cFormats[iIndex]);
+ newParams.push_back(val);
+ return AFDate_KeystrokeEx(cc,newParams,vRet,sError);
+}
+
+//function AFTime_Format(ptf)
+FX_BOOL CJS_PublicMethods::AFTime_Format(OBJ_METHOD_PARAMS)
+{
+ v8::Isolate* isolate = ::GetIsolate(cc);
+
+ if (params.size() != 1)
+ {
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+ return FALSE;
+ }
+
+ int iIndex = params[0];
+ FX_LPCWSTR cFormats[] = {(FX_LPCWSTR)L"HH:MM", (FX_LPCWSTR)L"h:MM tt", (FX_LPCWSTR)L"HH:MM:ss", (FX_LPCWSTR)L"h:MM:ss tt"};
+
+ ASSERT(iIndex<sizeof(cFormats)/sizeof(FX_LPCWSTR));
+
+ if (iIndex < 0)
+ iIndex = 0;
+ if (iIndex >= sizeof(cFormats)/sizeof(FX_LPCWSTR))
+ iIndex = 0;
+ CJS_Parameters newParams;
+ CJS_Value val(isolate,cFormats[iIndex]);
+ newParams.push_back(val);
+ return AFDate_FormatEx(cc,newParams,vRet,sError);
+}
+
+FX_BOOL CJS_PublicMethods::AFTime_Keystroke(OBJ_METHOD_PARAMS)
+{
+ v8::Isolate* isolate = ::GetIsolate(cc);
+ if (params.size() != 1)
+ {
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+ return FALSE;
+ }
+
+ int iIndex = params[0];
+ FX_LPCWSTR cFormats[] = {(FX_LPCWSTR)L"HH:MM", (FX_LPCWSTR)L"h:MM tt", (FX_LPCWSTR)L"HH:MM:ss", (FX_LPCWSTR)L"h:MM:ss tt"};
+
+ ASSERT(iIndex<sizeof(cFormats)/sizeof(FX_LPCWSTR));
+
+ if (iIndex < 0)
+ iIndex = 0;
+ if (iIndex >= sizeof(cFormats)/sizeof(FX_LPCWSTR))
+ iIndex = 0;
+ CJS_Parameters newParams;
+ CJS_Value val(isolate,cFormats[iIndex]);
+ newParams.push_back(val);
+ return AFDate_KeystrokeEx(cc,newParams,vRet,sError);
+}
+
+FX_BOOL CJS_PublicMethods::AFTime_FormatEx(OBJ_METHOD_PARAMS)
+{
+ return AFDate_FormatEx(cc,params,vRet,sError);
+}
+
+FX_BOOL CJS_PublicMethods::AFTime_KeystrokeEx(OBJ_METHOD_PARAMS)
+{
+ return AFDate_KeystrokeEx(cc,params,vRet,sError);
+}
+
+//function AFSpecial_Format(psf)
+FX_BOOL CJS_PublicMethods::AFSpecial_Format(OBJ_METHOD_PARAMS)
+{
+ CJS_Context* pContext = (CJS_Context *)cc;
+ ASSERT(pContext != NULL);
+
+ if (params.size() != 1)
+ {
+ sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+ return FALSE;
+ }
+
+ std::string cFormat;
+ int iIndex = params[0];
+
+ CJS_EventHandler* pEvent = pContext->GetEventHandler();
+ ASSERT(pEvent != NULL);
+
+ if(!pEvent->m_pValue)
+ return FALSE;
+ CFX_WideString& Value = pEvent->Value();
+ std::string strSrc = (FX_LPCSTR)CFX_ByteString::FromUnicode(Value);
+
+ 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(OBJ_METHOD_PARAMS)
+{
+ CJS_Context* pContext = (CJS_Context *)cc;
+ ASSERT(pContext != NULL);
+ CJS_EventHandler* pEvent = pContext->GetEventHandler();
+
+ ASSERT(pEvent != NULL);
+
+ 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].operator CFX_WideString();
+ if (wstrMask.IsEmpty()) return TRUE;
+
+ std::wstring wstrValue(valEvent);
+
+ if (pEvent->WillCommit())
+ {
+ if (wstrValue.empty())
+ return TRUE;
+ int iIndexMask = 0;
+ for (std::wstring::iterator it = wstrValue.begin(); it != wstrValue.end(); it++)
+ {
+ wchar_t w_Value = *it;
+ if (!maskSatisfied(w_Value,wstrMask[iIndexMask]))
+ break;
+ iIndexMask++;
+ }
+
+ if (iIndexMask != wstrMask.GetLength() || (iIndexMask != wstrValue.size() && wstrMask.GetLength() != 0))
+ {
+ Alert(pContext, JSGetStringFromID(pContext, IDS_STRING_JSAFNUMBER_KEYSTROKE));
+ pEvent->Rc() = FALSE;
+ }
+ return TRUE;
+ }
+
+
+ CFX_WideString &wideChange = pEvent->Change();
+ std::wstring wChange(wideChange);
+
+ if (wChange.empty())
+ return TRUE;
+ int iIndexMask = pEvent->SelStart();
+ //iIndexMask++;
+
+
+ if (wstrValue.length() - (pEvent->SelEnd()-pEvent->SelStart()) + wChange.length() > (FX_DWORD)wstrMask.GetLength())
+ {
+ Alert(pContext, JSGetStringFromID(pContext, IDS_STRING_JSPARAM_TOOLONG));
+ pEvent->Rc() = FALSE;
+ return TRUE;
+ }
+
+
+ if (iIndexMask >= wstrMask.GetLength() && (!wChange.empty()))
+ {
+ Alert(pContext, JSGetStringFromID(pContext, IDS_STRING_JSPARAM_TOOLONG));
+ pEvent->Rc() = FALSE;
+ return TRUE;
+ }
+
+ for (std::wstring::iterator it = wChange.begin(); it != wChange.end(); it++)
+ {
+ if (iIndexMask >= wstrMask.GetLength())
+ {
+ Alert(pContext, JSGetStringFromID(pContext, IDS_STRING_JSPARAM_TOOLONG));
+ pEvent->Rc() = FALSE;
+ return TRUE;
+ }
+ wchar_t w_Mask = wstrMask[iIndexMask];
+ if (!isReservedMaskChar(w_Mask))
+ {
+ //wChange.insert(it,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(OBJ_METHOD_PARAMS)
+{
+ v8::Isolate* isolate = ::GetIsolate(cc);
+
+ CJS_Context* pContext = (CJS_Context *)cc;
+ ASSERT(pContext != NULL);
+ CJS_EventHandler* pEvent = pContext->GetEventHandler();
+ ASSERT(pEvent != NULL);
+
+ if (params.size() != 1)
+ {
+ sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+ return FALSE;
+ }
+
+ std::string cFormat;
+ int iIndex = (int)params[0];
+
+ if(!pEvent->m_pValue)
+ return FALSE;
+ //CJS_Value val = pEvent->Value();
+ CFX_WideString& val = pEvent->Value();
+ std::string strSrc = (FX_LPCSTR)CFX_ByteString::FromUnicode(val);
+ std::wstring wstrChange(pEvent->Change());
+
+ 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;
+ }
+
+ CJS_Parameters params2;
+ CJS_Value vMask(isolate, cFormat.c_str());
+ params2.push_back(vMask);
+
+ return AFSpecial_KeystrokeEx(cc,params2,vRet,sError);
+}
+
+FX_BOOL CJS_PublicMethods::AFMergeChange(OBJ_METHOD_PARAMS)
+{
+ CJS_Context* pContext = (CJS_Context *)cc;
+ ASSERT(pContext != NULL);
+ CJS_EventHandler* pEventHandler = pContext->GetEventHandler();
+ ASSERT(pEventHandler != NULL);
+
+ if (params.size() != 1)
+ {
+ sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+ return FALSE;
+ }
+
+ CFX_WideString swValue;
+ if (pEventHandler->m_pValue != NULL)
+ swValue = pEventHandler->Value();
+
+ if (pEventHandler->WillCommit())
+ {
+ vRet = swValue;
+ 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;
+
+ return TRUE;
+}
+
+FX_BOOL CJS_PublicMethods::AFParseDateEx(OBJ_METHOD_PARAMS)
+{
+ CJS_Context* pContext = (CJS_Context *)cc;
+ ASSERT(pContext != NULL);
+
+ if (params.size() != 2)
+ {
+ sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+ return FALSE;
+ }
+
+ CFX_WideString sValue = params[0].operator CFX_WideString();
+ CFX_WideString sFormat = params[1].operator CFX_WideString();
+
+ FX_BOOL bWrongFormat = FALSE;
+ double dDate = MakeRegularDate(sValue,sFormat,bWrongFormat);
+
+ if (JS_PortIsNan(dDate))
+ {
+ CFX_WideString swMsg;
+ swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSPARSEDATE), (FX_LPCWSTR)sFormat);
+ Alert((CJS_Context *)cc, swMsg);
+ return FALSE;
+ }
+
+ vRet = dDate;
+
+ return TRUE;
+}
+
+FX_BOOL CJS_PublicMethods::AFSimple(OBJ_METHOD_PARAMS)
+{
+ if (params.size() != 3)
+ {
+ CJS_Context* pContext = (CJS_Context *)cc;
+ ASSERT(pContext != NULL);
+
+ sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+ return FALSE;
+ }
+
+ vRet = (double)AF_Simple(params[0].operator CFX_WideString(), (double)params[1], (double)params[2]);
+ return TRUE;
+}
+
+FX_BOOL CJS_PublicMethods::AFMakeNumber(OBJ_METHOD_PARAMS)
+{
+ if (params.size() != 1)
+ {
+ CJS_Context* pContext = (CJS_Context *)cc;
+ ASSERT(pContext != NULL);
+
+ sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+ return FALSE;
+ }
+ vRet = ParseStringToNumber(params[0].operator CFX_WideString());
+ return TRUE;
+}
+
+FX_BOOL CJS_PublicMethods::AFSimple_Calculate(OBJ_METHOD_PARAMS)
+{
+ v8::Isolate* isolate = ::GetIsolate(cc);
+
+ CJS_Context* pContext = (CJS_Context *)cc;
+ ASSERT(pContext != NULL);
+
+ if (params.size() != 2)
+ {
+ sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+ return FALSE;
+ }
+
+ CJS_Value params1 = params[1];
+
+ if (!params1.IsArrayObject() && params1.GetType() != VT_string)
+ {
+ sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+ return FALSE;
+ }
+
+ CPDFSDK_Document* pReaderDoc = pContext->GetReaderDocument();
+ ASSERT(pReaderDoc != NULL);
+
+ CPDFSDK_InterForm* pReaderInterForm = pReaderDoc->GetInterForm();
+ ASSERT(pReaderInterForm != NULL);
+
+ CPDF_InterForm* pInterForm = pReaderInterForm->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ double dValue;
+ CFX_WideString sFunction = params[0].operator CFX_WideString();
+ if (wcscmp(sFunction, L"PRD") == 0)
+ dValue = 1.0;
+ else
+ dValue = 0.0;
+
+ CJS_Array FieldNameArray = AF_MakeArrayFromList(isolate,params1);
+
+ int nFieldsCount = 0;
+
+ for (int i=0,isz=FieldNameArray.GetLength(); i<isz; i++)
+ {
+ CJS_Value jsValue(isolate);
+ FieldNameArray.GetElement(i,jsValue);
+ CFX_WideString wsFieldName = jsValue.operator CFX_WideString();
+
+ 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:
+ {
+ dTemp = ParseStringToNumber(pFormField->GetValue());
+ 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())
+ {
+ dTemp += ParseStringToNumber(pFormCtrl->GetExportValue());
+ break;
+ }
+ else
+ continue;
+ }
+ }
+ break;
+ }
+ case FIELDTYPE_LISTBOX:
+ {
+ dTemp = 0.0;
+ if (pFormField->CountSelectedItems() > 1)
+ break;
+ else
+ {
+ dTemp = ParseStringToNumber(pFormField->GetValue());
+ break;
+ }
+ }
+ default:
+ break;
+ }
+
+ if (i == 0 && j == 0 && (wcscmp(sFunction,L"MIN") == 0 || wcscmp(sFunction, L"MAX") == 0))
+ dValue = dTemp;
+
+ dValue = AF_Simple(sFunction, dValue, dTemp);
+
+ nFieldsCount++;
+ }
+ }
+ }
+
+ if (wcscmp(sFunction, 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(isolate,dValue);
+ if((CJS_EventHandler*)pContext->GetEventHandler()->m_pValue)
+ ((CJS_EventHandler*)pContext->GetEventHandler())->Value() = jsValue;
+
+ return TRUE;
+}
+
+/* This function validates the current event to ensure that its value is
+** within the specified range. */
+
+FX_BOOL CJS_PublicMethods::AFRange_Validate(OBJ_METHOD_PARAMS)
+{
+ CJS_Context* pContext = (CJS_Context *)cc;
+ ASSERT(pContext != NULL);
+ CJS_EventHandler* pEvent = pContext->GetEventHandler();
+ ASSERT(pEvent != NULL);
+
+ 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, bLessThan;
+ double dGreaterThan, dLessThan;
+ bGreaterThan = (FX_BOOL)params[0];
+ CFX_WideString swMsg;
+ dGreaterThan = (double)params[1];
+ bLessThan = (FX_BOOL)params[2];
+ dLessThan = (double)params[3];
+
+ if (bGreaterThan && bLessThan)
+ {
+ if (dEentValue < dGreaterThan || dEentValue > dLessThan)
+ swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSRANGE1),(FX_LPCWSTR)params[1].operator CFX_WideString(), (FX_LPCWSTR)params[3].operator CFX_WideString());
+ }
+ else if (bGreaterThan)
+ {
+ if (dEentValue < dGreaterThan)
+ swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSRANGE2), (FX_LPCWSTR)params[1].operator CFX_WideString());
+ }
+ else if (bLessThan)
+ {
+ if (dEentValue > dLessThan)
+ swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSRANGE3), (FX_LPCWSTR)params[3].operator CFX_WideString());
+ }
+
+ if (!swMsg.IsEmpty())
+ {
+ Alert(pContext, swMsg);
+ pEvent->Rc() = FALSE;
+ }
+ return TRUE;
+}
+
+FX_BOOL CJS_PublicMethods::AFExtractNums(OBJ_METHOD_PARAMS)
+{
+ v8::Isolate* isolate = ::GetIsolate(cc);
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+
+ if (params.size() != 1)
+ {
+ sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+ return FALSE;
+ }
+
+ CJS_Array nums(isolate);
+
+ CFX_WideString str = params[0].operator CFX_WideString();
+ 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 (IsDigit((wchar_t)wc))
+ {
+ sPart += wc;
+ }
+ else
+ {
+ if (sPart.GetLength() > 0)
+ {
+ nums.SetElement(nIndex,CJS_Value(isolate,(FX_LPCWSTR)sPart));
+ sPart = L"";
+ nIndex ++;
+ }
+ }
+ }
+
+ if (sPart.GetLength() > 0)
+ {
+ nums.SetElement(nIndex,CJS_Value(isolate,(FX_LPCWSTR)sPart));
+ }
+
+ if (nums.GetLength() > 0)
+ vRet = nums;
+ else
+ vRet.SetNull();
+
+ return TRUE;
+}
diff --git a/fpdfsdk/src/javascript/app.cpp b/fpdfsdk/src/javascript/app.cpp new file mode 100644 index 0000000000..c1ef76c3b8 --- /dev/null +++ b/fpdfsdk/src/javascript/app.cpp @@ -0,0 +1,1134 @@ +// 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 "../../include/javascript/JavaScript.h"
+#include "../../include/javascript/IJavaScript.h"
+#include "../../include/javascript/JS_Define.h"
+#include "../../include/javascript/JS_Object.h"
+#include "../../include/javascript/JS_Value.h"
+#include "../../include/javascript/app.h"
+#include "../../include/javascript/JS_EventHandler.h"
+#include "../../include/javascript/resource.h"
+#include "../../include/javascript/JS_Context.h"
+#include "../../include/javascript/JS_Runtime.h"
+#include "../../include/javascript/Document.h"
+
+
+static v8::Isolate* GetIsolate(IFXJS_Context* cc)
+{
+ CJS_Context* pContext = (CJS_Context *)cc;
+ ASSERT(pContext != NULL);
+
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+ ASSERT(pRuntime != NULL);
+
+ return pRuntime->GetIsolate();
+}
+
+/* ---------------------------- TimerObj ---------------------------- */
+
+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_READER L"Reader"
+#define JS_STR_VIEWERTYPE_STANDARD L"Exchange"
+#define JS_STR_VIEWERVARIATION L"Full"
+#define JS_STR_PLATFORM L"WIN"
+#define JS_STR_LANGUANGE L"ENU"
+#define JS_STR_VIEWERVERSION 8
+#define JS_NUM_FORMSVERSION 7
+
+#define JS_FILEPATH_MAXLEN 2000
+
+/* ---------------------------- app ---------------------------- */
+
+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, 6)
+ JS_STATIC_METHOD_ENTRY(beep, 1)
+ JS_STATIC_METHOD_ENTRY(browseForDoc, 0)
+ JS_STATIC_METHOD_ENTRY(clearInterval, 1)
+ JS_STATIC_METHOD_ENTRY(clearTimeOut, 1)
+ JS_STATIC_METHOD_ENTRY(execDialog, 3)
+ JS_STATIC_METHOD_ENTRY(execMenuItem, 1)
+ JS_STATIC_METHOD_ENTRY(findComponent, 1)
+ JS_STATIC_METHOD_ENTRY(goBack, 0)
+ JS_STATIC_METHOD_ENTRY(goForward, 0)
+ JS_STATIC_METHOD_ENTRY(launchURL, 0)
+ JS_STATIC_METHOD_ENTRY(mailMsg, 0)
+ JS_STATIC_METHOD_ENTRY(newFDF, 0)
+ JS_STATIC_METHOD_ENTRY(newDoc, 0)
+ JS_STATIC_METHOD_ENTRY(openDoc, 0)
+ JS_STATIC_METHOD_ENTRY(openFDF, 5)
+ JS_STATIC_METHOD_ENTRY(popUpMenuEx, 0)
+ JS_STATIC_METHOD_ENTRY(popUpMenu, 0)
+ JS_STATIC_METHOD_ENTRY(response, 0)
+ JS_STATIC_METHOD_ENTRY(setInterval, 2)
+ JS_STATIC_METHOD_ENTRY(setTimeOut, 2)
+END_JS_STATIC_METHOD()
+
+IMPLEMENT_JS_CLASS(CJS_App,app)
+
+app::app(CJS_Object * pJSObject) : CJS_EmbedObj(pJSObject) ,
+ m_bCalculate(true),
+ m_pRuntime(NULL),
+ m_bRuntimeHighLight(false)
+// m_pMenuHead(NULL)
+{
+}
+
+app::~app(void)
+{
+ for (int i=0,sz=m_aTimer.GetSize(); i<sz; i++)
+ delete m_aTimer[i];
+
+ m_aTimer.RemoveAll();
+}
+
+FX_BOOL app::activeDocs(OBJ_PROP_PARAMS)
+{
+ if (vp.IsGetting())
+ {
+
+ CJS_Context* pContext = (CJS_Context *)cc;
+ ASSERT(pContext != NULL);
+
+ CPDFDoc_Environment* pApp = pContext->GetReaderApp();
+ ASSERT(pApp != NULL);
+
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+ ASSERT(pRuntime != NULL);
+
+ CPDFSDK_Document* pCurDoc = pContext->GetReaderDocument();
+
+ CJS_Array aDocs(pRuntime->GetIsolate());
+// int iNumDocs = pApp->CountDocuments();
+
+// for(int iIndex = 0; iIndex<iNumDocs; iIndex++)
+// {
+ CPDFSDK_Document* pDoc = pApp->GetCurrentDoc();
+ if (pDoc)
+ {
+ CJS_Document * pJSDocument = NULL;
+
+ if (pDoc == pCurDoc)
+ {
+ JSFXObject pObj = JS_GetThisObj(*pRuntime);
+
+ if (JS_GetObjDefnID(pObj) == JS_GetObjDefnID(*pRuntime, L"Document"))
+ {
+ pJSDocument = (CJS_Document*)JS_GetPrivate(pRuntime->GetIsolate(),pObj);
+ }
+ }
+ else
+ {
+ JSFXObject pObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime,L"Document"));
+ pJSDocument = (CJS_Document*)JS_GetPrivate(pRuntime->GetIsolate(),pObj);
+ ASSERT(pJSDocument != NULL);
+
+
+ // pDocument->AttachDoc(pDoc);
+ }
+
+ aDocs.SetElement(0,CJS_Value(pRuntime->GetIsolate(),pJSDocument));
+ }
+ // }
+
+ if (aDocs.GetLength() > 0)
+ vp << aDocs;
+ else
+ vp.SetNull();
+ return TRUE;
+ }
+ return FALSE;
+}
+
+FX_BOOL app::calculate(OBJ_PROP_PARAMS)
+{
+ if (vp.IsSetting())
+ {
+ bool bVP;
+ vp >> bVP;
+ m_bCalculate = (FX_BOOL)bVP;
+
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+
+ CPDFDoc_Environment* pApp = pContext->GetReaderApp();
+ ASSERT(pApp != NULL);
+
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+ ASSERT(pRuntime != NULL);
+
+ CJS_Array aDocs(pRuntime->GetIsolate());
+// int iNumDocs = pApp->CountDocuments();
+//
+// for (int iIndex = 0;iIndex < iNumDocs; iIndex++)
+// {
+ if (CPDFSDK_Document* pDoc = pApp->GetCurrentDoc())
+ {
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDoc->GetInterForm();
+ ASSERT(pInterForm != NULL);
+ pInterForm->EnableCalculate((FX_BOOL)m_bCalculate);
+ }
+// }
+ }
+ else
+ {
+ vp << (bool)m_bCalculate;
+ }
+
+ return TRUE;
+}
+
+FX_BOOL app::formsVersion(OBJ_PROP_PARAMS)
+{
+ if (vp.IsGetting())
+ {
+ vp << JS_NUM_FORMSVERSION;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+FX_BOOL app::viewerType(OBJ_PROP_PARAMS)
+{
+
+
+
+
+
+
+ if (vp.IsGetting())
+ {
+// if (pApp->GetAppName() == PHANTOM)
+// vp << JS_STR_VIEWERTYPE_STANDARD;
+// else
+// vp << JS_STR_VIEWERTYPE_READER;
+ vp << L"unknown";
+
+ //vp << pApp->GetAppTitle();
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+FX_BOOL app::viewerVariation(OBJ_PROP_PARAMS)
+{
+ if (vp.IsGetting())
+ {
+ vp << JS_STR_VIEWERVARIATION;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+FX_BOOL app::viewerVersion(OBJ_PROP_PARAMS)
+{
+ if (vp.IsGetting())
+ {
+ vp << JS_STR_VIEWERVERSION;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+FX_BOOL app::platform(OBJ_PROP_PARAMS)
+{
+ if (vp.IsGetting())
+ {
+ vp << JS_STR_PLATFORM;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+FX_BOOL app::language(OBJ_PROP_PARAMS)
+{
+ if (vp.IsGetting())
+ {
+ vp << JS_STR_LANGUANGE;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+//creates a new fdf object that contains no data
+//comment: need reader support
+//note:
+//CFDF_Document * CPDFDoc_Environment::NewFDF();
+FX_BOOL app::newFDF(OBJ_METHOD_PARAMS)
+{
+ 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(OBJ_METHOD_PARAMS)
+{
+ return TRUE;
+}
+
+FX_BOOL app::alert(OBJ_METHOD_PARAMS)
+{
+ int iSize = params.size();
+ if (iSize < 1)
+ return FALSE;
+
+ CFX_WideString swMsg = L"";
+ CFX_WideString swTitle = L"";
+ int iIcon = 0;
+ int iType = 0;
+
+ v8::Isolate* isolate = GetIsolate(cc);
+
+ if (iSize == 1)
+ {
+ if (params[0].GetType() == VT_object)
+ {
+ JSObject pObj = params[0];
+ {
+ v8::Handle<v8::Value> pValue = JS_GetObjectElement(isolate, pObj, L"cMsg");
+ swMsg = CJS_Value(isolate,pValue,VT_unknown).operator CFX_WideString();
+
+ pValue = JS_GetObjectElement(isolate,pObj,L"cTitle");
+ swTitle = CJS_Value(isolate, pValue,VT_unknown).operator CFX_WideString();
+
+ pValue = JS_GetObjectElement(isolate,pObj,L"nIcon");
+ iIcon = (int)CJS_Value(isolate,pValue,VT_unknown);
+
+ pValue = JS_GetObjectElement(isolate,pObj,L"nType");
+ iType = (int)CJS_Value(isolate,pValue,VT_unknown);
+ }
+
+ if (swMsg == L"")
+ {
+ CJS_Array carray(isolate);
+ if (params[0].ConvertToArray(carray))
+ {
+ int iLenth = carray.GetLength();
+ CJS_Value* pValue = new CJS_Value(isolate);
+// if (iLenth == 1)
+// pValue = new CJS_Value(isolate);
+// else if (iLenth > 1)
+// pValue = new CJS_Value[iLenth];
+
+ for(int i = 0; i < iLenth; i++)
+ {
+ carray.GetElement(i, *pValue);
+ swMsg += (*pValue).operator CFX_WideString();
+ if (i < iLenth - 1)
+ swMsg += L", ";
+ }
+
+ if(pValue) delete pValue;
+// if ((iLenth > 1) && pValue)
+// {
+// delete[]pValue;
+// pValue = NULL;
+// }
+// else if ((iLenth == 1) && pValue)
+// {
+// delete pValue;
+// pValue = NULL;
+// }
+ }
+ }
+
+ if (swTitle == L"")
+ swTitle = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSALERT);
+ }
+ else if (params[0].GetType() == VT_boolean)
+ {
+ FX_BOOL bGet = (FX_BOOL)params[0];
+ if (bGet)
+ swMsg = L"true";
+ else
+ swMsg = L"false";
+
+ swTitle = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSALERT);
+ }
+ else
+ {
+ swMsg = params[0];
+ swTitle = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSALERT);
+ }
+ }
+ else
+ {
+ if (params[0].GetType() == VT_boolean)
+ {
+ FX_BOOL bGet = (FX_BOOL)params[0];
+ if (bGet)
+ swMsg = L"true";
+ else
+ swMsg = L"false";
+ }
+ else
+ {
+ swMsg = params[0];
+ }
+ swTitle = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSALERT);
+
+ for(int i = 1;i<iSize;i++)
+ {
+ if (i == 1)
+ iIcon = int(params[i]);
+ if (i == 2)
+ iType = int(params[i]);
+ if (i == 3)
+ swTitle = params[i];
+ }
+ }
+
+
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+ ASSERT(pRuntime != NULL);
+ pRuntime->BeginBlock();
+ vRet = MsgBox(pRuntime->GetReaderApp(), JSGetPageView(cc),swMsg,swTitle,iType,iIcon);
+ pRuntime->EndBlock();
+
+ return TRUE;
+}
+
+
+FX_BOOL app::beep(OBJ_METHOD_PARAMS)
+{
+ if (params.size() == 1)
+ {
+ CJS_Context* pContext = (CJS_Context*)cc;
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+ CPDFDoc_Environment * pEnv = pRuntime->GetReaderApp();
+ pEnv->JS_appBeep((int)params[0]);
+
+ return TRUE;
+ }
+ else
+ {
+ sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPARAMERROR);
+ return FALSE;
+ }
+}
+
+FX_BOOL app::findComponent(OBJ_METHOD_PARAMS)
+{
+ return TRUE;
+}
+
+FX_BOOL app::popUpMenuEx(OBJ_METHOD_PARAMS)
+{
+ return FALSE;
+}
+
+FX_BOOL app::fs(OBJ_PROP_PARAMS)
+{
+#ifdef FOXIT_CHROME_BUILD
+ return FALSE;
+#else
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+ ASSERT(pRuntime != NULL);
+
+ if (vp.IsGetting())
+ {
+ return TRUE;
+ }
+ else
+ {
+ return TRUE;
+ }
+#endif
+}
+
+FX_BOOL app::setInterval(OBJ_METHOD_PARAMS)
+{
+ if (params.size() > 2 || params.size() == 0)
+ {
+ sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPARAMERROR);
+ return FALSE;
+ }
+
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+ ASSERT(pRuntime != NULL);
+
+ CFX_WideString script = params.size() > 0 ? (FX_LPCWSTR)(params[0].operator CFX_WideString()) : (FX_LPCWSTR)L"";
+ if (script.IsEmpty())
+ {
+ sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSAFNUMBER_KEYSTROKE);
+ return TRUE;
+ }
+
+ FX_DWORD dwInterval = params.size() > 1 ? (int)params[1] : 1000;
+
+ CPDFDoc_Environment* pApp = pRuntime->GetReaderApp();
+ ASSERT(pApp);
+ CJS_Timer* pTimer = new CJS_Timer(this, pApp);
+ m_aTimer.Add(pTimer);
+
+ pTimer->SetType(0);
+ pTimer->SetRuntime(pRuntime);
+ pTimer->SetJScript(script);
+ pTimer->SetTimeOut(0);
+// pTimer->SetStartTime(GetTickCount());
+ pTimer->SetJSTimer(dwInterval);
+
+ JSFXObject pRetObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime, L"TimerObj"));
+
+ CJS_TimerObj* pJS_TimerObj = (CJS_TimerObj*)JS_GetPrivate(pRuntime->GetIsolate(),pRetObj);
+ ASSERT(pJS_TimerObj != NULL);
+
+ TimerObj* pTimerObj = (TimerObj*)pJS_TimerObj->GetEmbedObject();
+ ASSERT(pTimerObj != NULL);
+
+ pTimerObj->SetTimer(pTimer);
+
+ vRet = pRetObj;
+
+ return TRUE;
+}
+
+FX_BOOL app::setTimeOut(OBJ_METHOD_PARAMS)
+{
+ if (params.size() > 2 || params.size() == 0)
+ {
+ sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPARAMERROR);
+ return FALSE;
+ }
+
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+ ASSERT(pRuntime != NULL);
+
+ CFX_WideString script = params.size() > 0 ? (FX_LPCWSTR)(params[0].operator CFX_WideString()) : (FX_LPCWSTR)L"";
+ if (script.IsEmpty())
+ {
+ sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSAFNUMBER_KEYSTROKE);
+ return TRUE;
+ }
+
+ FX_DWORD dwTimeOut = params.size() > 1 ? (int)params[1] : 1000;
+
+ CPDFDoc_Environment* pApp = pRuntime->GetReaderApp();
+ ASSERT(pApp);
+ CJS_Timer* pTimer = new CJS_Timer(this, pApp);
+ m_aTimer.Add(pTimer);
+
+ pTimer->SetType(1);
+ pTimer->SetRuntime(pRuntime);
+ pTimer->SetJScript(script);
+ pTimer->SetTimeOut(dwTimeOut);
+// pTimer->SetStartTime(GetTickCount());
+// pTimer->SetJSTimer(1000);
+ pTimer->SetJSTimer(dwTimeOut);
+
+ JSFXObject pRetObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime, L"TimerObj"));
+// ASSERT(pRetObj != NULL);
+
+ CJS_TimerObj* pJS_TimerObj = (CJS_TimerObj*)JS_GetPrivate(pRuntime->GetIsolate(),pRetObj);
+ ASSERT(pJS_TimerObj != NULL);
+
+ TimerObj* pTimerObj = (TimerObj*)pJS_TimerObj->GetEmbedObject();
+ ASSERT(pTimerObj != NULL);
+
+ pTimerObj->SetTimer(pTimer);
+
+ vRet = pRetObj;
+
+ return TRUE;
+}
+
+FX_BOOL app::clearTimeOut(OBJ_METHOD_PARAMS)
+{
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+ ASSERT(pRuntime != NULL);
+
+ if (params.size() != 1)
+ {
+ sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPARAMERROR);
+ return FALSE;
+ }
+
+ if (params[0].GetType() == VT_fxobject)
+ {
+ JSFXObject pObj = (JSFXObject)params[0];
+ {
+ if (JS_GetObjDefnID(pObj) == JS_GetObjDefnID(*pRuntime, L"TimerObj"))
+ {
+ if (CJS_Object* pJSObj = (CJS_Object*)params[0])
+ {
+ 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(OBJ_METHOD_PARAMS)
+{
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+ ASSERT(pRuntime != NULL);
+
+ if (params.size() != 1)
+ {
+ sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPARAMERROR);
+ return FALSE;
+ }
+
+ if (params[0].GetType() == VT_fxobject)
+ {
+ JSFXObject pObj = (JSFXObject)params[0];
+ {
+ if (JS_GetObjDefnID(pObj) == JS_GetObjDefnID(*pRuntime, L"TimerObj"))
+ {
+ if (CJS_Object* pJSObj = (CJS_Object*)params[0])
+ {
+ 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(OBJ_METHOD_PARAMS)
+{
+ return FALSE;
+}
+
+void app::TimerProc(CJS_Timer* pTimer)
+{
+ ASSERT(pTimer != NULL);
+
+ switch (pTimer->GetType())
+ {
+ case 0: //interval
+ RunJsScript(pTimer->GetRuntime(), pTimer->GetJScript());
+ break;
+ case 1:
+ if (pTimer->GetTimeOut() > 0)
+ {
+ RunJsScript(pTimer->GetRuntime(), pTimer->GetJScript());
+ pTimer->KillJSTimer();
+ }
+ break;
+ }
+
+}
+
+void app::RunJsScript(CJS_Runtime* pRuntime,const CFX_WideString& wsScript)
+{
+ ASSERT(pRuntime != NULL);
+
+ if (!pRuntime->IsBlocking())
+ {
+ IFXJS_Context* pContext = pRuntime->NewContext();
+ ASSERT(pContext != NULL);
+ pContext->OnExternal_Exec();
+ CFX_WideString wtInfo;
+ pContext->RunScript(wsScript,wtInfo);
+ pRuntime->ReleaseContext(pContext);
+ }
+}
+
+FX_BOOL app::goBack(OBJ_METHOD_PARAMS)
+{
+
+
+
+
+
+
+ return TRUE;
+}
+
+FX_BOOL app::goForward(OBJ_METHOD_PARAMS)
+{
+
+
+
+
+
+
+ return TRUE;
+}
+
+FX_BOOL app::mailMsg(OBJ_METHOD_PARAMS)
+{
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+
+ v8::Isolate* isolate = GetIsolate(cc);
+
+ 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() < 2)
+ return FALSE;
+
+ bUI = params.size()>=1?(int)params[0]:TRUE;
+ cTo = params.size()>=2?(const wchar_t*)(FX_LPCWSTR)params[1].operator CFX_WideString():L"";
+ cCc = params.size()>=3?(const wchar_t*)(FX_LPCWSTR)params[2].operator CFX_WideString():L"";
+ cBcc = params.size()>=4?(const wchar_t*)(FX_LPCWSTR)params[3].operator CFX_WideString():L"";
+ cSubject = params.size()>=5?(const wchar_t*)(FX_LPCWSTR)params[4].operator CFX_WideString():L"";
+ cMsg = params.size()>=6?(const wchar_t*)(FX_LPCWSTR)params[5].operator CFX_WideString():L"";
+
+
+ if (params[0].GetType() == VT_object)
+ {
+ JSObject pObj = (JSObject)params[0];
+
+ v8::Handle<v8::Value> pValue = JS_GetObjectElement(isolate,pObj, L"bUI");
+ bUI = (int)CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue));
+
+ pValue = JS_GetObjectElement(isolate, pObj, L"cTo");
+ cTo = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
+
+ pValue = JS_GetObjectElement(isolate,pObj, L"cCc");
+ cCc = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
+
+ pValue = JS_GetObjectElement(isolate,pObj, L"cBcc");
+ cBcc = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
+
+ pValue = JS_GetObjectElement(isolate,pObj, L"cSubject");
+ cSubject = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
+
+ pValue = JS_GetObjectElement(isolate,pObj, L"cMsg");
+ cMsg = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
+ }
+
+
+
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+ ASSERT(pRuntime != NULL);
+
+ CPDFDoc_Environment* pApp = pContext->GetReaderApp();
+ ASSERT(pApp != NULL);
+
+ pRuntime->BeginBlock();
+ pApp->JS_docmailForm(NULL, 0, bUI, (FX_LPCWSTR)cTo, (FX_LPCWSTR)cSubject, (FX_LPCWSTR)cCc, (FX_LPCWSTR)cBcc, (FX_LPCWSTR)cMsg);
+ ///////////////////////////////////////////////////////////////////////////////////////////////
+ pRuntime->EndBlock();
+
+ //return bRet;
+ return FALSE;
+}
+
+FX_BOOL app::launchURL(OBJ_METHOD_PARAMS)
+{
+ if (IsSafeMode(cc)) return TRUE;
+
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+
+
+
+
+ CFX_WideString swURL = params[0].operator CFX_WideString();
+
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+ ASSERT(pRuntime != NULL);
+
+ pRuntime->BeginBlock();
+// FX_BOOL bRet = pApp->OpenURL(swURL);
+ pRuntime->EndBlock();
+
+// return bRet;
+ return FALSE;
+}
+
+FX_BOOL app::runtimeHighlight(OBJ_PROP_PARAMS)
+{
+ if (vp.IsSetting())
+ {
+ vp>>m_bRuntimeHighLight;
+ }
+ else
+ {
+ vp<<m_bRuntimeHighLight;
+ }
+
+ return TRUE;
+}
+
+FX_BOOL app::fullscreen(OBJ_PROP_PARAMS)
+{
+ return FALSE;
+}
+
+FX_BOOL app::popUpMenu(OBJ_METHOD_PARAMS)
+{
+ return FALSE;
+}
+
+
+FX_BOOL app::browseForDoc(OBJ_METHOD_PARAMS)
+{
+ //This method may trigger a "file save" dialog,while enable user to save contents of the document.
+ //Such action is considered to be unsafe.
+ if (IsSafeMode(cc)) return TRUE;
+
+ v8::Isolate* isolate = GetIsolate(cc);
+
+ bool bSave = false;
+ CFX_ByteString cFilenameInit = CFX_ByteString();
+ CFX_ByteString cFSInit = CFX_ByteString();
+
+ if(params.size()>0 && (params[0].GetType() == VT_object))
+ {
+ JSObject pObj = (JSObject )params[0];
+
+ v8::Handle<v8::Value> pValue = JS_GetObjectElement(isolate,pObj,L"bSave");
+ bSave = (bool)CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue));
+
+ pValue = JS_GetObjectElement(isolate, pObj,L"cFilenameInit");
+ {
+ CJS_Value t = CJS_Value(isolate, pValue, GET_VALUE_TYPE(pValue));
+ cFilenameInit = t.operator CFX_ByteString();
+ }
+
+ pValue = JS_GetObjectElement(isolate,pObj,L"cFSInit");
+ {
+ CJS_Value t = CJS_Value(isolate, pValue, GET_VALUE_TYPE(pValue));
+ cFSInit = t.operator CFX_ByteString();
+ }
+ }
+ else
+ {
+ if(params.size() >= 1)
+ {
+ bSave = (bool)params[0];
+ }
+ if(params.size() >= 2)
+ {
+ CJS_Value t = params[1];
+ cFilenameInit = t.operator CFX_ByteString();
+ }
+ if(params.size() >= 3)
+ {
+ CJS_Value t = params[2];
+ cFSInit = t.operator CFX_ByteString();
+ }
+ }
+ CJS_Context* pContext = (CJS_Context *)cc;
+ ASSERT(pContext != NULL);
+
+ CPDFDoc_Environment* pApp = pContext->GetReaderApp();
+ ASSERT(pApp != NULL);
+
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+ ASSERT(pRuntime != NULL);
+
+ CFX_WideString wsFileNameInit = CFX_WideString::FromLocal(cFilenameInit);
+ CFX_WideString wsFSInit = CFX_WideString::FromLocal(cFSInit);
+ CFX_WideString wsFilePath = pApp->JS_appbrowseForDoc(bSave, wsFileNameInit);
+ if(wsFilePath.IsEmpty())
+ return FALSE;
+
+ JSFXObject pRetObj = JS_NewFxDynamicObj(*pRuntime, pContext, -1);
+
+ JS_PutObjectString(isolate,pRetObj, L"cPath", SysPathToPDFPath(wsFilePath));
+ JS_PutObjectString(isolate,pRetObj, L"cURL", SysPathToPDFPath(wsFilePath));
+
+ if (!cFSInit.IsEmpty())
+ {
+ JS_PutObjectString(isolate,pRetObj, L"cFS", CFX_WideString::FromLocal(cFSInit.GetBuffer(cFSInit.GetLength())));
+ }
+ else
+ {
+ JS_PutObjectString(isolate,pRetObj, L"cFS", CFX_WideString::FromLocal("DOS"));
+ }
+
+ vRet = pRetObj;
+
+ 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;
+}
+
+CFX_WideString app::PDFPathToSysPath(const CFX_WideString& sOldPath)
+{
+ //strLPath = "D:\temporay.fdf";
+ CFX_WideString strOPath = sOldPath;
+ strOPath.TrimLeft();
+ strOPath.TrimRight();
+
+ if (strOPath.GetAt(0) == L'/' && strOPath.GetAt(2) == L'/')
+ {
+ wchar_t c_Drive = strOPath.GetAt(1);
+ if ((c_Drive >= L'a' && c_Drive <= L'z' )||( c_Drive >= L'A' && c_Drive <= L'Z'))
+ {
+ strOPath.Replace((FX_LPCWSTR)L"/",(FX_LPCWSTR)L"\\");
+ //strOPath.SetAt(0,'');
+ strOPath.Insert(2,':');
+ strOPath.Delete(0);
+ }
+ }
+
+ return strOPath;
+}
+
+CFX_WideString app::RelativePathToSysPath(const CFX_WideString& sOldPath, const CFX_WideString& sFilePath)
+{
+// if (!PathIsRelative(sOldPath)) return sOldPath;
+
+ int nSplit = 0;
+ for (int i=sFilePath.GetLength()-1; i>=0; i--)
+ {
+ if (sFilePath[i] == '\\' || sFilePath[i] == '/')
+ {
+ nSplit = i;
+ break;
+ }
+ }
+
+ return sFilePath.Left(nSplit+1) + sOldPath;
+}
+
+FX_BOOL app::newDoc(OBJ_METHOD_PARAMS)
+{
+ return FALSE;
+}
+
+FX_BOOL app::openDoc(OBJ_METHOD_PARAMS)
+{
+ return FALSE;
+}
+
+FX_BOOL app::response(OBJ_METHOD_PARAMS)
+{
+ CFX_WideString swQuestion = L"";
+ CFX_WideString swLabel = L"";
+#ifndef FOXIT_CHROME_BUILD
+ CFX_WideString swTitle = L"Foxit";
+#else
+ CFX_WideString swTitle = L"PDF";
+#endif
+ CFX_WideString swDefault = L"";
+ CFX_WideString swResponse = L"";
+ bool bPassWord = false;
+
+ v8::Isolate* isolate = GetIsolate(cc);
+
+ int iLength = params.size();
+ if (iLength > 0 && params[0].GetType() == VT_object)
+ {
+
+ JSObject pObj = (JSObject )params[0];
+ v8::Handle<v8::Value> pValue = JS_GetObjectElement(isolate,pObj,L"cQuestion");
+ swQuestion = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
+
+ pValue = JS_GetObjectElement(isolate,pObj,L"cTitle");
+ swTitle = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
+
+ pValue = JS_GetObjectElement(isolate,pObj,L"cDefault");
+ swDefault = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
+
+ pValue = JS_GetObjectElement(isolate,pObj,L"cLabel");
+ swLabel = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
+
+ pValue = JS_GetObjectElement(isolate,pObj,L"bPassword");
+ bPassWord = (bool)CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue));
+ }
+ else
+ {
+ switch(iLength)
+ {
+ case 1:
+ swQuestion = params[0];
+ break;
+ case 2:
+ swQuestion = params[0];
+ swTitle = params[1];
+ break;
+ case 3:
+ swQuestion = params[0];
+ swTitle = params[1];
+ swDefault = params[2];
+ break;
+ case 4:
+ swQuestion = params[0];
+ swTitle = params[1];
+ swDefault = params[2];
+ bPassWord = params[3];
+ break;
+ case 5:
+ swQuestion = params[0];
+ swTitle = params[1];
+ swDefault = params[2];
+ bPassWord = params[3];
+ swLabel = params[4];
+ break;
+ default:
+ break;
+ }
+ }
+
+ CJS_Context* pContext = (CJS_Context *)cc;
+ ASSERT(pContext != NULL);
+
+ CPDFDoc_Environment* pApp = pContext->GetReaderApp();
+ ASSERT(pApp != NULL);
+ int nLength = 2048;
+ char* pBuff = new char[nLength];
+ nLength = pApp->JS_appResponse(swQuestion, swTitle, swDefault, swLabel, bPassWord, pBuff, nLength);
+ if(nLength<=0)
+ {
+ vRet.SetNull();
+ return FALSE;
+ }
+ else
+ {
+ nLength = nLength>2046?2046:nLength;
+ pBuff[nLength] = 0;
+ pBuff[nLength+1] = 0;
+ swResponse = CFX_WideString::FromUTF16LE((unsigned short*)pBuff, nLength);
+ vRet = swResponse;
+ }
+ delete[] pBuff;
+
+ return TRUE;
+}
+
+FX_BOOL app::media(OBJ_PROP_PARAMS)
+{
+ return FALSE;
+}
+
+FX_BOOL app::execDialog(OBJ_METHOD_PARAMS)
+{
+ return TRUE;
+}
+
diff --git a/fpdfsdk/src/javascript/color.cpp b/fpdfsdk/src/javascript/color.cpp new file mode 100644 index 0000000000..de5a53fc5f --- /dev/null +++ b/fpdfsdk/src/javascript/color.cpp @@ -0,0 +1,253 @@ +// 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 "../../include/javascript/JavaScript.h"
+#include "../../include/javascript/IJavaScript.h"
+#include "../../include/javascript/JS_Define.h"
+#include "../../include/javascript/JS_Object.h"
+#include "../../include/javascript/JS_Value.h"
+#include "../../include/javascript/color.h"
+#include "../../include/javascript/JS_EventHandler.h"
+#include "../../include/javascript/JS_Context.h"
+#include "../../include/javascript/JS_Runtime.h"
+
+static v8::Isolate* GetIsolate(IFXJS_Context* cc)
+{
+ CJS_Context* pContext = (CJS_Context *)cc;
+ ASSERT(pContext != NULL);
+
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+ ASSERT(pRuntime != NULL);
+
+ return pRuntime->GetIsolate();
+}
+/* -------------------------- 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, 2)
+ JS_STATIC_METHOD_ENTRY(equal, 2)
+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)
+{
+}
+
+void color::ConvertPWLColorToArray(const CPWL_Color& color, CJS_Array& array)
+{
+ switch (color.nColorType)
+ {
+ case COLORTYPE_TRANSPARENT:
+ array.SetElement(0, CJS_Value(array.GetIsolate(), "T"));
+ break;
+ case COLORTYPE_GRAY:
+ array.SetElement(0, CJS_Value(array.GetIsolate(),"G"));
+ array.SetElement(1, CJS_Value(array.GetIsolate(),color.fColor1));
+ break;
+ case COLORTYPE_RGB:
+ array.SetElement(0, CJS_Value(array.GetIsolate(),"RGB"));
+ array.SetElement(1, CJS_Value(array.GetIsolate(),color.fColor1));
+ array.SetElement(2, CJS_Value(array.GetIsolate(),color.fColor2));
+ array.SetElement(3, CJS_Value(array.GetIsolate(),color.fColor3));
+ break;
+ case COLORTYPE_CMYK:
+ array.SetElement(0, CJS_Value(array.GetIsolate(),"CMYK"));
+ array.SetElement(1, CJS_Value(array.GetIsolate(),color.fColor1));
+ array.SetElement(2, CJS_Value(array.GetIsolate(),color.fColor2));
+ array.SetElement(3, CJS_Value(array.GetIsolate(),color.fColor3));
+ array.SetElement(4, CJS_Value(array.GetIsolate(),color.fColor4));
+ break;
+ }
+}
+
+void color::ConvertArrayToPWLColor(CJS_Array& array, CPWL_Color& color)
+{
+ int nArrayLen = array.GetLength();
+ if (nArrayLen < 1) return;
+
+ CJS_Value value(array.GetIsolate());
+ CFX_ByteString sSpace;
+ array.GetElement(0, value);
+ sSpace = value;
+
+ double d1 = 0;
+ double d2 = 0;
+ double d3 = 0;
+ double d4 = 0;
+
+ if (nArrayLen > 1)
+ {
+ array.GetElement(1, value);
+ d1 = value;
+ }
+
+ if (nArrayLen > 2)
+ {
+ array.GetElement(2, value);
+ d2 = value;
+ }
+
+ if (nArrayLen > 3)
+ {
+ array.GetElement(3, value);
+ d3 = value;
+ }
+
+ if (nArrayLen > 4)
+ {
+ array.GetElement(4, value);
+ d4 = value;
+ }
+
+ 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(OBJ_PROP_PARAMS)\
+{\
+ CJS_Context* pContext = (CJS_Context*)cc;\
+ v8::Isolate* isolate = pContext->GetJSRuntime()->GetIsolate();\
+ if (vp.IsGetting())\
+ {\
+ CJS_Array array(isolate);\
+ ConvertPWLColorToArray(var, array);\
+ vp << array;\
+ }\
+ else\
+ {\
+ CJS_Array array(isolate);\
+ 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(OBJ_METHOD_PARAMS)
+{
+ v8::Isolate* isolate = GetIsolate(cc);
+ int iSize = params.size();
+ if (iSize < 2) return FALSE;
+ CJS_Array aSource(isolate);
+ if (!params[0].ConvertToArray(aSource)) return FALSE;
+
+ CPWL_Color crSource;
+ ConvertArrayToPWLColor(aSource, crSource);
+
+ CFX_ByteString sDestSpace = params[1];
+
+ 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(isolate);
+ CPWL_Color crDest = crSource;
+ crDest.ConvertColorType(nColorType);
+ ConvertPWLColorToArray(crDest, aDest);
+ vRet = aDest;
+
+ return TRUE;
+}
+
+FX_BOOL color::equal(OBJ_METHOD_PARAMS)
+{
+ v8::Isolate* isolate = GetIsolate(cc);
+ if (params.size() < 2) return FALSE;
+
+ CJS_Array array1(isolate), array2(isolate);
+
+ 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/console.cpp b/fpdfsdk/src/javascript/console.cpp new file mode 100644 index 0000000000..25e5559a06 --- /dev/null +++ b/fpdfsdk/src/javascript/console.cpp @@ -0,0 +1,78 @@ +// 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 "../../include/javascript/JavaScript.h"
+#include "../../include/javascript/IJavaScript.h"
+#include "../../include/javascript/JS_Define.h"
+#include "../../include/javascript/JS_Object.h"
+#include "../../include/javascript/JS_Value.h"
+#include "../../include/javascript/console.h"
+//#include "../../include/javascript/JS_Module.h"
+#include "../../include/javascript/JS_EventHandler.h"
+//#include "../../include/javascript/JS_ResMgr.h"
+#include "../../include/javascript/JS_Context.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, 0)
+ JS_STATIC_METHOD_ENTRY(hide, 0)
+ JS_STATIC_METHOD_ENTRY(println, 1)
+ JS_STATIC_METHOD_ENTRY(show, 0)
+END_JS_STATIC_METHOD()
+
+IMPLEMENT_JS_CLASS(CJS_Console,console)
+
+#define MAXCONSOLECONTENTS 10000
+
+console::console(CJS_Object* pJSObject): CJS_EmbedObj(pJSObject)
+{
+}
+
+console::~console()
+{
+}
+
+FX_BOOL console::clear(OBJ_METHOD_PARAMS)
+{
+
+
+
+ return TRUE;
+}
+
+FX_BOOL console::hide(OBJ_METHOD_PARAMS)
+{
+
+
+
+
+ return TRUE;
+}
+
+FX_BOOL console::println(OBJ_METHOD_PARAMS)
+{
+ if (params.size() < 1)
+ {
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+FX_BOOL console::show(OBJ_METHOD_PARAMS)
+{
+ return TRUE;
+}
+
+
+
diff --git a/fpdfsdk/src/javascript/event.cpp b/fpdfsdk/src/javascript/event.cpp new file mode 100644 index 0000000000..9168a2e0cf --- /dev/null +++ b/fpdfsdk/src/javascript/event.cpp @@ -0,0 +1,379 @@ +// 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 "../../include/javascript/JavaScript.h"
+#include "../../include/javascript/IJavaScript.h"
+#include "../../include/javascript/JS_Define.h"
+#include "../../include/javascript/JS_Object.h"
+#include "../../include/javascript/JS_Value.h"
+#include "../../include/javascript/JS_EventHandler.h"
+//#include "../include/JS_ResMgr.h"
+#include "../../include/javascript/JS_Context.h"
+#include "../../include/javascript/event.h"
+#include "../../include/javascript/Field.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(void)
+{
+}
+
+FX_BOOL event::change(OBJ_PROP_PARAMS)
+{
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_EventHandler* pEvent = pContext->GetEventHandler();
+ ASSERT(pEvent != NULL);
+
+ CFX_WideString &wChange = pEvent->Change();
+ if (vp.IsSetting())
+ {
+ if (vp.GetType() == VT_string)
+ vp >> wChange;
+ }
+ else
+ {
+ vp << wChange;
+ }
+ return TRUE;
+}
+
+FX_BOOL event::changeEx(OBJ_PROP_PARAMS)
+{
+ if (!vp.IsGetting())return FALSE;
+
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_EventHandler* pEvent = pContext->GetEventHandler();
+ ASSERT(pEvent != NULL);
+
+ vp << pEvent->ChangeEx();
+ return TRUE;
+}
+
+FX_BOOL event::commitKey(OBJ_PROP_PARAMS)
+{
+ if (!vp.IsGetting())return FALSE;
+
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_EventHandler* pEvent = pContext->GetEventHandler();
+ ASSERT(pEvent != NULL);
+
+ vp << pEvent->CommitKey();
+ return TRUE;
+}
+
+FX_BOOL event::fieldFull(OBJ_PROP_PARAMS)
+{
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_EventHandler* pEvent = pContext->GetEventHandler();
+ ASSERT(pEvent != NULL);
+
+ 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(OBJ_PROP_PARAMS)
+{
+ if (!vp.IsGetting())return FALSE;
+
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_EventHandler* pEvent = pContext->GetEventHandler();
+ ASSERT(pEvent != NULL);
+
+ if (pEvent->KeyDown())
+ vp << TRUE;
+ else
+ vp << FALSE;
+ return TRUE;
+}
+
+FX_BOOL event::modifier(OBJ_PROP_PARAMS)
+{
+ if (!vp.IsGetting())return FALSE;
+
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_EventHandler* pEvent = pContext->GetEventHandler();
+ ASSERT(pEvent != NULL);
+
+ if (pEvent->Modifier())
+ vp << TRUE;
+ else
+ vp << FALSE;
+ return TRUE;
+}
+
+FX_BOOL event::name(OBJ_PROP_PARAMS)
+{
+ if (!vp.IsGetting())return FALSE;
+
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_EventHandler* pEvent = pContext->GetEventHandler();
+ ASSERT(pEvent != NULL);
+
+ vp << pEvent->Name();
+ return TRUE;
+}
+
+FX_BOOL event::rc(OBJ_PROP_PARAMS)
+{
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_EventHandler* pEvent = pContext->GetEventHandler();
+ ASSERT(pEvent != NULL);
+
+ FX_BOOL &bRc = pEvent->Rc();
+ if (vp.IsSetting())
+ {
+ vp>>bRc;
+ }
+ else
+ {
+ vp<<bRc;
+ }
+ return TRUE;
+}
+
+FX_BOOL event::richChange(OBJ_PROP_PARAMS)
+{
+ return TRUE;
+ if (vp.IsSetting())
+ {
+ }
+ else
+ {
+ ;
+ }
+ return TRUE;
+}
+
+FX_BOOL event::richChangeEx(OBJ_PROP_PARAMS)
+{
+ return TRUE;
+ if (vp.IsSetting())
+ {
+ }
+ else
+ {
+ ;
+ }
+ return TRUE;
+}
+
+
+FX_BOOL event::richValue(OBJ_PROP_PARAMS)
+{
+ return TRUE;
+ if (vp.IsSetting())
+ {
+ }
+ else
+ {
+ ;
+ }
+ return TRUE;
+}
+
+FX_BOOL event::selEnd(OBJ_PROP_PARAMS)
+{
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_EventHandler* pEvent = pContext->GetEventHandler();
+ ASSERT(pEvent != NULL);
+
+ 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(OBJ_PROP_PARAMS)
+{
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_EventHandler* pEvent = pContext->GetEventHandler();
+ ASSERT(pEvent != NULL);
+
+ 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(OBJ_PROP_PARAMS)
+{
+ if (!vp.IsGetting())return FALSE;
+
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_EventHandler* pEvent = pContext->GetEventHandler();
+ ASSERT(pEvent != NULL);
+
+ if (pEvent->Shift())
+ vp << TRUE;
+ else
+ vp << FALSE;
+ return TRUE;
+}
+
+FX_BOOL event::source(OBJ_PROP_PARAMS)
+{
+ if (!vp.IsGetting())return FALSE;
+
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_EventHandler* pEvent = pContext->GetEventHandler();
+ ASSERT(pEvent != NULL);
+
+ vp << pEvent->Source()->GetJSObject();
+ return TRUE;
+}
+
+FX_BOOL event::target(OBJ_PROP_PARAMS)
+{
+ if (!vp.IsGetting())return FALSE;
+
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_EventHandler* pEvent = pContext->GetEventHandler();
+ ASSERT(pEvent != NULL);
+
+ vp<<pEvent->Target_Field()->GetJSObject();
+ return TRUE;
+}
+
+FX_BOOL event::targetName(OBJ_PROP_PARAMS)
+{
+ if (!vp.IsGetting())return FALSE;
+
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_EventHandler* pEvent = pContext->GetEventHandler();
+ ASSERT(pEvent != NULL);
+
+ vp << pEvent->TargetName();
+ return TRUE;
+}
+
+FX_BOOL event::type(OBJ_PROP_PARAMS)
+{
+ if (!vp.IsGetting())return FALSE;
+
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_EventHandler* pEvent = pContext->GetEventHandler();
+ ASSERT(pEvent != NULL);
+
+ vp << pEvent->Type();
+ return TRUE;
+}
+
+FX_BOOL event::value(OBJ_PROP_PARAMS)
+{
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_EventHandler* pEvent = pContext->GetEventHandler();
+ ASSERT(pEvent != NULL);
+
+ 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())
+ {
+ val = vp;
+ }
+ else
+ {
+ vp << val;
+ }
+ return TRUE;
+}
+
+FX_BOOL event::willCommit(OBJ_PROP_PARAMS)
+{
+ if (!vp.IsGetting())return FALSE;
+
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_EventHandler* pEvent = pContext->GetEventHandler();
+ ASSERT(pEvent != NULL);
+
+ if (pEvent->WillCommit())
+ vp << TRUE;
+ else
+ vp << FALSE;
+ return TRUE;
+}
+
diff --git a/fpdfsdk/src/javascript/global.cpp b/fpdfsdk/src/javascript/global.cpp new file mode 100644 index 0000000000..984ba55cb4 --- /dev/null +++ b/fpdfsdk/src/javascript/global.cpp @@ -0,0 +1,550 @@ +// 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 "../../include/javascript/JavaScript.h"
+#include "../../include/javascript/IJavaScript.h"
+#include "../../include/javascript/JS_Define.h"
+#include "../../include/javascript/JS_Object.h"
+#include "../../include/javascript/JS_Value.h"
+#include "../../include/javascript/JS_GlobalData.h"
+#include "../../include/javascript/global.h"
+#include "../../include/javascript/JS_EventHandler.h"
+#include "../../include/javascript/JS_Context.h"
+
+/* ---------------------------- global ---------------------------- */
+
+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, 2)
+END_JS_STATIC_METHOD()
+
+IMPLEMENT_SPECIAL_JS_CLASS(CJS_Global, global_alternate, global);
+
+FX_BOOL CJS_Global::InitInstance(IFXJS_Context* cc)
+{
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+
+ global_alternate* pGlobal = (global_alternate*)GetEmbedObject();
+ ASSERT(pGlobal != NULL);
+
+ pGlobal->Initial(pContext->GetReaderApp());
+
+ return TRUE;
+};
+
+global_alternate::global_alternate(CJS_Object* pJSObject)
+ : CJS_EmbedObj(pJSObject),
+ m_pApp(NULL)
+{
+}
+
+global_alternate::~global_alternate(void)
+{
+ ASSERT(m_pApp != NULL);
+
+// CommitGlobalPersisitentVariables();
+ DestroyGlobalPersisitentVariables();
+
+ CJS_RuntimeFactory* pFactory = m_pApp->m_pJSRuntimeFactory;
+ ASSERT(pFactory);
+
+ pFactory->ReleaseGlobalData();
+}
+
+void global_alternate::Initial(CPDFDoc_Environment* pApp)
+{
+ m_pApp = pApp;
+
+ CJS_RuntimeFactory* pFactory = pApp->m_pJSRuntimeFactory;
+ ASSERT(pFactory);
+ m_pGlobalData = pFactory->NewGlobalData(pApp);
+ UpdateGlobalPersistentVariables();
+}
+
+FX_BOOL global_alternate::QueryProperty(FX_LPCWSTR propname)
+{
+ return CFX_WideString(propname) != L"setPersistent";
+}
+
+FX_BOOL global_alternate::DelProperty(IFXJS_Context* cc, FX_LPCWSTR propname, JS_ErrorString& sError)
+{
+ js_global_data* pData = NULL;
+ CFX_ByteString sPropName = CFX_ByteString::FromUnicode(propname);
+
+ if (m_mapGlobal.Lookup(sPropName, (FX_LPVOID&)pData))
+ {
+ pData->bDeleted = TRUE;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+FX_BOOL global_alternate::DoProperty(IFXJS_Context* cc, FX_LPCWSTR propname, CJS_PropValue& vp, JS_ErrorString& sError)
+{
+ if (vp.IsSetting())
+ {
+ CFX_ByteString sPropName = CFX_ByteString::FromUnicode(propname);
+ switch (vp.GetType())
+ {
+ case VT_number:
+ {
+ double dData;
+ vp >> dData;
+ return SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_NUMBER, dData, false, "", v8::Handle<v8::Object>(), FALSE);
+ }
+ case VT_boolean:
+ {
+ bool bData;
+ vp >> bData;
+ return SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_BOOLEAN, 0, (bool)vp, "", v8::Handle<v8::Object>(), FALSE);
+ }
+ case VT_string:
+ {
+ CFX_ByteString sData;
+ vp >> sData;
+ return SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_STRING, 0, false, sData, v8::Handle<v8::Object>(), FALSE);
+ }
+ case VT_object:
+ {
+ JSObject pData = (JSObject)vp;
+ return SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_OBJECT, 0, false, "", pData, FALSE);
+// else
+// {
+// if (vp.IsArrayObject())
+// {
+// CJS_Array array;
+// vp.ConvertToArray(array);
+// return SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_OBJECT, 0, false, "",
+// (Dobject*)(Darray*)array, FALSE);
+// }
+// else
+// return FALSE;
+// }
+ }
+ case VT_null:
+ {
+ return SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_NULL, 0, false, "", v8::Handle<v8::Object>(), FALSE);
+ }
+ case VT_undefined:
+ {
+ DelProperty(cc, propname, sError);
+ return TRUE;
+ }
+ default:
+ return FALSE;
+ }
+ }
+ else
+ {
+ js_global_data* pData = NULL;
+ CFX_ByteString sPropName = CFX_ByteString::FromUnicode(propname);
+
+ if (m_mapGlobal.Lookup(sPropName, (FX_LPVOID&)pData))
+ {
+ if (pData)
+ {
+ if (!pData->bDeleted)
+ {
+ switch (pData->nType)
+ {
+ case JS_GLOBALDATA_TYPE_NUMBER:
+ vp << pData->dData;
+ break;
+ case JS_GLOBALDATA_TYPE_BOOLEAN:
+ vp << pData->bData;
+ break;
+ case JS_GLOBALDATA_TYPE_STRING:
+ vp << pData->sData;
+ break;
+ case JS_GLOBALDATA_TYPE_OBJECT:
+ {
+ v8::Handle<v8::Object> obj = v8::Local<v8::Object>::New(vp.GetIsolate(),pData->pData);
+ vp << obj;
+ break;
+ }
+ case JS_GLOBALDATA_TYPE_NULL:
+ vp.SetNull();
+ break;
+ default:
+ return FALSE;
+ }
+ return TRUE;
+ }
+ else
+ {
+ return TRUE;
+ }
+ }
+ else
+ {
+ vp.SetNull();
+ return TRUE;
+ }
+ }
+ else
+ {
+ vp.SetNull();
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+FX_BOOL global_alternate::setPersistent(OBJ_METHOD_PARAMS)
+{
+ if (params.size() != 2)
+ {
+ //sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
+ return FALSE;
+ }
+
+ CFX_ByteString sName = params[0];
+
+ js_global_data* pData = NULL;
+ if (m_mapGlobal.Lookup(sName, (FX_LPVOID&)pData))
+ {
+ if (pData && !pData->bDeleted)
+ {
+ pData->bPersistent = (bool)params[1];
+ return TRUE;
+ }
+ }
+
+ //sError = JSGetStringFromID(IDS_JSPARAM_INCORRECT);
+ return FALSE;
+}
+
+void global_alternate::UpdateGlobalPersistentVariables()
+{
+ ASSERT(m_pGlobalData != NULL);
+
+ for (int i=0,sz=m_pGlobalData->GetSize(); i<sz; i++)
+ {
+ CJS_GlobalData_Element* pData = m_pGlobalData->GetAt(i);
+ ASSERT(pData != NULL);
+
+ switch (pData->data.nType)
+ {
+ case JS_GLOBALDATA_TYPE_NUMBER:
+ this->SetGlobalVariables(pData->data.sKey, JS_GLOBALDATA_TYPE_NUMBER, pData->data.dData, false, "", v8::Handle<v8::Object>(), pData->bPersistent == 1);
+ JS_PutObjectNumber(NULL,(JSFXObject)(*m_pJSObject),
+ pData->data.sKey.UTF8Decode(), pData->data.dData);
+ break;
+ case JS_GLOBALDATA_TYPE_BOOLEAN:
+ this->SetGlobalVariables(pData->data.sKey, JS_GLOBALDATA_TYPE_BOOLEAN, 0, (bool)(pData->data.bData == 1), "", v8::Handle<v8::Object>(), pData->bPersistent == 1);
+ JS_PutObjectBoolean(NULL,(JSFXObject)(*m_pJSObject),
+ pData->data.sKey.UTF8Decode(), (bool)(pData->data.bData == 1));
+ break;
+ case JS_GLOBALDATA_TYPE_STRING:
+ this->SetGlobalVariables(pData->data.sKey, JS_GLOBALDATA_TYPE_STRING, 0, false, pData->data.sData, v8::Handle<v8::Object>(), pData->bPersistent == 1);
+ JS_PutObjectString(NULL,(JSFXObject)(*m_pJSObject),
+ pData->data.sKey.UTF8Decode(),
+ pData->data.sData.UTF8Decode());
+ break;
+ case JS_GLOBALDATA_TYPE_OBJECT:
+ {
+ IJS_Runtime* pRuntime = JS_GetRuntime((JSFXObject)(*m_pJSObject));
+ v8::Handle<v8::Object> pObj = JS_NewFxDynamicObj(pRuntime, NULL, -1);
+
+ PutObjectProperty(pObj, &pData->data);
+
+ this->SetGlobalVariables(pData->data.sKey, JS_GLOBALDATA_TYPE_OBJECT, 0, false, "",
+ (JSObject)pObj, pData->bPersistent == 1);
+ JS_PutObjectObject(NULL,(JSFXObject)(*m_pJSObject),
+ pData->data.sKey.UTF8Decode(), (JSObject)pObj);
+ }
+ break;
+ case JS_GLOBALDATA_TYPE_NULL:
+ this->SetGlobalVariables(pData->data.sKey, JS_GLOBALDATA_TYPE_NULL, 0, false, "", v8::Handle<v8::Object>(), pData->bPersistent == 1);
+ JS_PutObjectNull(NULL,(JSFXObject)(*m_pJSObject),
+ pData->data.sKey.UTF8Decode());
+ break;
+ }
+ }
+}
+
+void global_alternate::CommitGlobalPersisitentVariables()
+{
+ ASSERT(m_pGlobalData != NULL);
+
+ FX_POSITION pos = m_mapGlobal.GetStartPosition();
+ while (pos)
+ {
+ CFX_ByteString name;
+ js_global_data* pData = NULL;
+ m_mapGlobal.GetNextAssoc(pos, name, (FX_LPVOID&)pData);
+
+ if (pData)
+ {
+ 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:
+ //if (pData->pData)
+ {
+ CJS_GlobalVariableArray array;
+ v8::Handle<v8::Object> obj = v8::Local<v8::Object>::New(GetJSObject()->GetIsolate(),pData->pData);
+ ObjectToArray(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 global_alternate::ObjectToArray(v8::Handle<v8::Object> pObj, CJS_GlobalVariableArray& array)
+{
+ v8::Handle<v8::Array> pKeyList = JS_GetObjectElementNames(pObj);
+ int nObjElements = pKeyList->Length();
+
+ v8::Local<v8::Context> context = pObj->CreationContext();
+ v8::Isolate* isolate = context->GetIsolate();
+
+ for (int i=0; i<nObjElements; i++)
+ {
+
+ CFX_WideString ws = JS_ToString(JS_GetArrayElemnet(pKeyList, i));
+ CFX_ByteString sKey = ws.UTF8Encode();
+
+ v8::Handle<v8::Value> v = JS_GetObjectElement(isolate, pObj, (const wchar_t*)(FX_LPCWSTR)ws);
+ FXJSVALUETYPE vt = GET_VALUE_TYPE(v);
+ switch (vt)
+ {
+ case VT_number:
+ {
+ CJS_KeyValue* pObjElement = new CJS_KeyValue;
+ pObjElement->nType = JS_GLOBALDATA_TYPE_NUMBER;
+ pObjElement->sKey = sKey;
+ pObjElement->dData = JS_ToNumber(v);
+ array.Add(pObjElement);
+ }
+ break;
+ case VT_boolean:
+ {
+ CJS_KeyValue* pObjElement = new CJS_KeyValue;
+ pObjElement->nType = JS_GLOBALDATA_TYPE_BOOLEAN;
+ pObjElement->sKey = sKey;
+ pObjElement->dData = JS_ToBoolean(v);
+ array.Add(pObjElement);
+ }
+ break;
+ case VT_string:
+ {
+ CFX_ByteString sValue = CJS_Value(isolate, v, VT_string);
+ CJS_KeyValue* pObjElement = new CJS_KeyValue;
+ pObjElement->nType = JS_GLOBALDATA_TYPE_STRING;
+ pObjElement->sKey = sKey;
+ pObjElement->sData = sValue;
+ array.Add(pObjElement);
+ }
+ break;
+ case VT_object:
+ {
+ CJS_KeyValue* pObjElement = new CJS_KeyValue;
+ pObjElement->nType = JS_GLOBALDATA_TYPE_OBJECT;
+ pObjElement->sKey = sKey;
+ ObjectToArray(JS_ToObject(v), pObjElement->objData);
+ array.Add(pObjElement);
+ }
+ break;
+ case VT_null:
+ {
+ CJS_KeyValue* pObjElement = new CJS_KeyValue;
+ pObjElement->nType = JS_GLOBALDATA_TYPE_NULL;
+ pObjElement->sKey = sKey;
+ array.Add(pObjElement);
+ }
+ break;
+ default:
+ break;
+ }
+ }
+}
+
+void global_alternate::PutObjectProperty(v8::Handle<v8::Object> pObj, CJS_KeyValue* pData)
+{
+ ASSERT(pData != NULL);
+
+ for (int i=0,sz=pData->objData.Count(); i<sz; i++)
+ {
+ CJS_KeyValue* pObjData = pData->objData.GetAt(i);
+ ASSERT(pObjData != NULL);
+
+ switch (pObjData->nType)
+ {
+ case JS_GLOBALDATA_TYPE_NUMBER:
+ JS_PutObjectNumber(NULL,(JSObject)pObj, pObjData->sKey.UTF8Decode(), pObjData->dData);
+ break;
+ case JS_GLOBALDATA_TYPE_BOOLEAN:
+ JS_PutObjectBoolean(NULL,(JSObject)pObj, pObjData->sKey.UTF8Decode(), (bool)(pObjData->bData == 1));
+ break;
+ case JS_GLOBALDATA_TYPE_STRING:
+ JS_PutObjectString(NULL,(JSObject)pObj, pObjData->sKey.UTF8Decode(), pObjData->sData.UTF8Decode());
+ break;
+ case JS_GLOBALDATA_TYPE_OBJECT:
+ {
+ IJS_Runtime* pRuntime = JS_GetRuntime((JSFXObject)(*m_pJSObject));
+ v8::Handle<v8::Object> pNewObj = JS_NewFxDynamicObj(pRuntime, NULL, -1);
+ PutObjectProperty(pNewObj, pObjData);
+ JS_PutObjectObject(NULL, (JSObject)pObj, pObjData->sKey.UTF8Decode(), (JSObject)pNewObj);
+ }
+ break;
+ case JS_GLOBALDATA_TYPE_NULL:
+ JS_PutObjectNull(NULL,(JSObject)pObj, pObjData->sKey.UTF8Decode());
+ break;
+ }
+ }
+}
+
+void global_alternate::DestroyGlobalPersisitentVariables()
+{
+ FX_POSITION pos = m_mapGlobal.GetStartPosition();
+ while (pos)
+ {
+ CFX_ByteString name;
+ js_global_data* pData = NULL;
+ m_mapGlobal.GetNextAssoc(pos, name, (FX_LPVOID&)pData);
+ delete pData;
+ }
+
+ m_mapGlobal.RemoveAll();
+}
+
+
+FX_BOOL global_alternate::SetGlobalVariables(FX_LPCSTR propname, int nType,
+ double dData, bool bData, const CFX_ByteString& sData, JSObject pData, bool bDefaultPersistent)
+{
+ if (propname == NULL) return FALSE;
+
+ js_global_data* pTemp = NULL;
+ m_mapGlobal.Lookup(propname, (FX_LPVOID&)pTemp);
+
+ if (pTemp)
+ {
+ 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(JS_GetRuntime(pData), pData);
+ }
+ break;
+ case JS_GLOBALDATA_TYPE_NULL:
+ break;
+ default:
+ return FALSE;
+ }
+
+ return TRUE;
+ }
+
+ js_global_data* pNewData = NULL;
+
+ switch (nType)
+ {
+ case JS_GLOBALDATA_TYPE_NUMBER:
+ {
+ pNewData = new js_global_data;
+ pNewData->nType = JS_GLOBALDATA_TYPE_NUMBER;
+ pNewData->dData = dData;
+ pNewData->bPersistent = bDefaultPersistent;
+ }
+ break;
+ case JS_GLOBALDATA_TYPE_BOOLEAN:
+ {
+ pNewData = new js_global_data;
+ pNewData->nType = JS_GLOBALDATA_TYPE_BOOLEAN;
+ pNewData->bData = bData;
+ pNewData->bPersistent = bDefaultPersistent;
+ }
+ break;
+ case JS_GLOBALDATA_TYPE_STRING:
+ {
+ pNewData = new js_global_data;
+ pNewData->nType = JS_GLOBALDATA_TYPE_STRING;
+ pNewData->sData = sData;
+ pNewData->bPersistent = bDefaultPersistent;
+ }
+ break;
+ case JS_GLOBALDATA_TYPE_OBJECT:
+ {
+ pNewData = new js_global_data;
+ pNewData->nType = JS_GLOBALDATA_TYPE_OBJECT;
+ pNewData->pData.Reset(JS_GetRuntime(pData), pData);
+ pNewData->bPersistent = bDefaultPersistent;
+ }
+ break;
+ case JS_GLOBALDATA_TYPE_NULL:
+ {
+ pNewData = new js_global_data;
+ pNewData->nType = JS_GLOBALDATA_TYPE_NULL;
+ pNewData->bPersistent = bDefaultPersistent;
+ }
+ break;
+ default:
+ return FALSE;
+ }
+
+ m_mapGlobal.SetAt(propname, (FX_LPVOID)pNewData);
+
+ return TRUE;
+}
diff --git a/fpdfsdk/src/javascript/report.cpp b/fpdfsdk/src/javascript/report.cpp new file mode 100644 index 0000000000..5063c68e4c --- /dev/null +++ b/fpdfsdk/src/javascript/report.cpp @@ -0,0 +1,50 @@ +// 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 "../../include/javascript/JavaScript.h"
+#include "../../include/javascript/IJavaScript.h"
+#include "../../include/javascript/JS_Define.h"
+#include "../../include/javascript/JS_Object.h"
+#include "../../include/javascript/JS_Value.h"
+#include "../../include/javascript/report.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, 1)
+ JS_STATIC_METHOD_ENTRY(writeText,1)
+END_JS_STATIC_METHOD()
+
+IMPLEMENT_JS_CLASS(CJS_Report, Report)
+
+Report::Report(CJS_Object* pJSObject) : CJS_EmbedObj(pJSObject)
+{
+
+}
+
+Report::~Report()
+{
+
+}
+
+FX_BOOL Report::writeText(OBJ_METHOD_PARAMS)
+{
+ if (IsSafeMode(cc)) return TRUE;
+ return TRUE;
+}
+
+FX_BOOL Report::save(OBJ_METHOD_PARAMS)
+{
+ if (IsSafeMode(cc)) return TRUE;
+ return TRUE;
+}
+
diff --git a/fpdfsdk/src/javascript/util.cpp b/fpdfsdk/src/javascript/util.cpp new file mode 100644 index 0000000000..b7303a7578 --- /dev/null +++ b/fpdfsdk/src/javascript/util.cpp @@ -0,0 +1,649 @@ +// 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 "../../include/javascript/JavaScript.h"
+#include "../../include/javascript/IJavaScript.h"
+#include "../../include/javascript/JS_Define.h"
+#include "../../include/javascript/JS_Object.h"
+#include "../../include/javascript/JS_Value.h"
+#include "../../include/javascript/util.h"
+#include "../../include/javascript/PublicMethods.h"
+#include "../../include/javascript/resource.h"
+#include "../../include/javascript/JS_Context.h"
+#include "../../include/javascript/JS_EventHandler.h"
+#include "../../include/javascript/JS_Runtime.h"
+
+#if _FX_OS_ == _FX_ANDROID_
+#include <ctype.h>
+#endif
+
+static v8::Isolate* GetIsolate(IFXJS_Context* cc)
+{
+ CJS_Context* pContext = (CJS_Context *)cc;
+ ASSERT(pContext != NULL);
+
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+ ASSERT(pRuntime != NULL);
+
+ return pRuntime->GetIsolate();
+}
+
+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, 3)
+ JS_STATIC_METHOD_ENTRY(printf, 20)
+ JS_STATIC_METHOD_ENTRY(printx, 2)
+ JS_STATIC_METHOD_ENTRY(scand, 2)
+ JS_STATIC_METHOD_ENTRY(byteToChar, 1)
+END_JS_STATIC_METHOD()
+
+IMPLEMENT_JS_CLASS(CJS_Util,util)
+
+util::util(CJS_Object *pJSObject) : CJS_EmbedObj(pJSObject)
+{
+}
+
+util::~util(void)
+{
+}
+
+
+struct stru_TbConvert
+{
+ FX_LPCWSTR lpszJSMark;
+ FX_LPCWSTR lpszCppMark;
+};
+
+const stru_TbConvert fcTable[] = {
+ (FX_LPCWSTR)L"mmmm", (FX_LPCWSTR)L"%B",
+ (FX_LPCWSTR)L"mmm", (FX_LPCWSTR)L"%b",
+ (FX_LPCWSTR)L"mm", (FX_LPCWSTR)L"%m",
+ //"m"
+ (FX_LPCWSTR)L"dddd", (FX_LPCWSTR)L"%A",
+ (FX_LPCWSTR)L"ddd", (FX_LPCWSTR)L"%a",
+ (FX_LPCWSTR)L"dd", (FX_LPCWSTR)L"%d",
+ //"d", "%w",
+ (FX_LPCWSTR)L"yyyy", (FX_LPCWSTR)L"%Y",
+ (FX_LPCWSTR)L"yy", (FX_LPCWSTR)L"%y",
+ (FX_LPCWSTR)L"HH", (FX_LPCWSTR)L"%H",
+ //"H"
+ (FX_LPCWSTR)L"hh", (FX_LPCWSTR)L"%I",
+ //"h"
+ (FX_LPCWSTR)L"MM", (FX_LPCWSTR)L"%M",
+ //"M"
+ (FX_LPCWSTR)L"ss", (FX_LPCWSTR)L"%S",
+ //"s
+ (FX_LPCWSTR)L"TT", (FX_LPCWSTR)L"%p",
+ //"t"
+#if defined(_WIN32)
+ (FX_LPCWSTR)L"tt", (FX_LPCWSTR)L"%p",
+ (FX_LPCWSTR)L"h", (FX_LPCWSTR)L"%#I",
+#else
+ (FX_LPCWSTR)L"tt", (FX_LPCWSTR)L"%P",
+ (FX_LPCWSTR)L"h", (FX_LPCWSTR)L"%l",
+#endif
+};
+
+#define UTIL_INT 0
+#define UTIL_DOUBLE 1
+#define UTIL_STRING 2
+
+int util::ParstDataType(std::wstring* sFormat)
+{
+ size_t i = 0;
+ bool bPercent = FALSE;
+ for (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;
+ }
+ else if (c == L'e' || c == L'E' || c == L'f' || c == L'g' || c == L'G')
+ {
+ return UTIL_DOUBLE;
+ }
+ else 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;
+ }
+ else if (c == L'.' || c == L'+' || c == L'-' || c == L'#' || c == L' ' || CJS_PublicMethods::IsDigit(c))
+ {
+ continue;
+ }
+ else break;
+ }
+ }
+
+ return -1;
+}
+
+FX_BOOL util::printf(OBJ_METHOD_PARAMS)
+{
+ int iSize = params.size();
+ if (iSize < 1)
+ return FALSE;
+ std::wstring c_ConvChar((const wchar_t*)(FX_LPCWSTR)params[0].operator CFX_WideString());
+ 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((FX_LPCWSTR)c_strFormat.c_str(),(int)params[iIndex]);
+ break;
+ case UTIL_DOUBLE:
+ strSegment.Format((FX_LPCWSTR)c_strFormat.c_str(),(double)params[iIndex]);
+ break;
+ case UTIL_STRING:
+ strSegment.Format((FX_LPCWSTR)c_strFormat.c_str(),(FX_LPCWSTR)params[iIndex].operator CFX_WideString());
+ break;
+ default:
+ strSegment.Format((FX_LPCWSTR)L"%S", (FX_LPCWSTR)c_strFormat.c_str());
+ break;
+ }
+ c_strResult += (wchar_t*)strSegment.GetBuffer(strSegment.GetLength()+1);
+ }
+
+ c_strResult.erase(c_strResult.begin());
+ vRet = (FX_LPCWSTR)c_strResult.c_str();
+ return TRUE;
+}
+
+FX_BOOL util::printd(OBJ_METHOD_PARAMS)
+{
+ v8::Isolate* isolate = GetIsolate(cc);
+
+ int iSize = params.size();
+ if (iSize < 2)
+ return FALSE;
+
+ CJS_Value p1(isolate);
+ p1 = params[0];
+
+ CJS_Value p2 = params[1];
+ CJS_Date jsDate(isolate);
+ 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() == VT_number)
+ {
+ int nFormat = p1;
+
+ CFX_WideString swResult;
+
+ switch (nFormat)
+ {
+ case 0:
+ swResult.Format((FX_LPCWSTR)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((FX_LPCWSTR)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((FX_LPCWSTR)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;
+ return TRUE;
+ }
+ else if (p1.GetType() == VT_string)
+ {
+ std::basic_string<wchar_t> cFormat = (wchar_t*)(FX_LPCWSTR)p1.operator CFX_WideString();
+
+ bool bXFAPicture = false;
+ if (iSize > 2)
+ {
+ //CJS_Value value;
+ bXFAPicture = params[2];
+ }
+
+ if (bXFAPicture)
+ {
+ return FALSE; //currently, it doesn't support XFAPicture.
+ }
+
+ int iIndex;
+ for(iIndex = 0;iIndex<sizeof(fcTable)/sizeof(stru_TbConvert);iIndex++)
+ {
+ int iStart = 0;
+ int iEnd;
+ while((iEnd = cFormat.find((CFX_WideString)fcTable[iIndex].lpszJSMark, iStart)) != -1)
+ {
+ cFormat.replace(iEnd, FXSYS_wcslen(fcTable[iIndex].lpszJSMark), (CFX_WideString)fcTable[iIndex].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 = {0};
+ 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
+ {
+ FX_LPCWSTR lpszJSMark;
+ int iValue;
+ };
+
+ stru_TbConvertAd cTableAd[] ={
+ (FX_LPCWSTR)L"m", iMonth+1,
+ (FX_LPCWSTR)L"d", iDay,
+ (FX_LPCWSTR)L"H", iHour,
+ (FX_LPCWSTR)L"h", iHour>12?iHour-12:iHour,
+ (FX_LPCWSTR)L"M", iMin,
+ (FX_LPCWSTR)L"s", iSec
+ };
+
+ //cFormat = strFormat.GetBuffer(strFormat.GetLength()+1);
+ for(iIndex = 0;iIndex<sizeof(cTableAd)/sizeof(stru_TbConvertAd);iIndex++)
+ {
+ wchar_t tszValue[10];
+ //_itot(cTableAd[iIndex].iValue,tszValue,10);
+ CFX_WideString sValue;
+ sValue.Format((FX_LPCWSTR)L"%d",cTableAd[iIndex].iValue);
+ memcpy(tszValue, (wchar_t *)sValue.GetBuffer(sValue.GetLength()+1),
+ (sValue.GetLength()+1)*sizeof(wchar_t));
+
+ //strFormat.Replace(cTableAd[iIndex].lpszJSMark,"%d");
+ //strFormat.Format(strFormat,cTableAd[iIndex].iValue);
+ int iStart = 0;
+ int iEnd;
+ while((iEnd = cFormat.find((CFX_WideString)cTableAd[iIndex].lpszJSMark,iStart)) != -1)
+ {
+ if (iEnd > 0)
+ {
+ if (cFormat[iEnd-1] == L'%')
+ {
+ iStart = iEnd+1;
+ continue;
+ }
+ }
+ cFormat.replace(iEnd, FXSYS_wcslen(cTableAd[iIndex].lpszJSMark), tszValue);
+ iStart = iEnd;
+ }
+ }
+
+ CFX_WideString strFormat;
+// strFormat.Format((FX_LPCWSTR)L"%d,%d,%d,%d,%d,%d",iYear, iMonth, iDay, iHour, iMin, iSec);
+// CString strFormat = cppTm.Format(cFormat.c_str());
+ wchar_t buf[64] = {0};
+ strFormat = wcsftime(buf, 64, cFormat.c_str(), &time);
+ cFormat = buf;
+ vRet = (FX_LPCWSTR)cFormat.c_str();
+ //rtRet = strFormat.GetBuffer(strFormat.GetLength()+1);
+ 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.
+ }
+
+ int iIndex;
+ for(iIndex = 0;iIndex<sizeof(fcTable)/sizeof(stru_TbConvert);iIndex++)
+ {
+ int iStart = 0;
+ int iEnd;
+ while((iEnd = cFormat.find((CFX_WideString)fcTable[iIndex].lpszJSMark,iStart)) != -1)
+ {
+ cFormat.replace(iEnd,FXSYS_wcslen(fcTable[iIndex].lpszJSMark), (CFX_WideString)fcTable[iIndex].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 = {0};
+ 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
+ {
+ FX_LPCWSTR lpszJSMark;
+ int iValue;
+ };
+
+ stru_TbConvertAd cTableAd[] ={
+ (FX_LPCWSTR)L"m", iMonth+1,
+ (FX_LPCWSTR)L"d", iDay,
+ (FX_LPCWSTR)L"H", iHour,
+ (FX_LPCWSTR)L"h", iHour>12?iHour-12:iHour,
+ (FX_LPCWSTR)L"M", iMin,
+ (FX_LPCWSTR)L"s", iSec
+ };
+
+ //cFormat = strFormat.GetBuffer(strFormat.GetLength()+1);
+ for(iIndex = 0;iIndex<sizeof(cTableAd)/sizeof(stru_TbConvertAd);iIndex++)
+ {
+ wchar_t tszValue[10];
+ //_itot(cTableAd[iIndex].iValue,tszValue,10);
+ CFX_WideString sValue;
+ sValue.Format((FX_LPCWSTR)L"%d",cTableAd[iIndex].iValue);
+ memcpy(tszValue, (wchar_t *)sValue.GetBuffer(sValue.GetLength()+1),sValue.GetLength()*sizeof(wchar_t));
+
+
+ //strFormat.Replace(cTableAd[iIndex].lpszJSMark,"%d");
+ //strFormat.Format(strFormat,cTableAd[iIndex].iValue);
+ int iStart = 0;
+ int iEnd;
+ while((iEnd = cFormat.find((CFX_WideString)cTableAd[iIndex].lpszJSMark,iStart)) != -1)
+ {
+ if (iEnd > 0)
+ {
+ if (cFormat[iEnd-1] == L'%')
+ {
+ iStart = iEnd+1;
+ continue;
+ }
+ }
+ cFormat.replace(iEnd,FXSYS_wcslen(cTableAd[iIndex].lpszJSMark),tszValue);
+ iStart = iEnd;
+ }
+ }
+
+ CFX_WideString strFormat;
+// strFormat.Format((FX_LPCWSTR)L"%d,%d,%d,%d,%d,%d",iYear, iMonth, iDay, iHour, iMin, iSec);
+// CString strFormat = cppTm.Format(cFormat.c_str());
+ wchar_t buf[64] = {0};
+ strFormat = wcsftime(buf, 64, cFormat.c_str(), &time);
+ cFormat = buf;
+ cPurpose = cFormat;
+}
+
+FX_BOOL util::printx(OBJ_METHOD_PARAMS)
+{
+ int iSize = params.size();
+ if (iSize<2)
+ return FALSE;
+ CFX_WideString sFormat = params[0].operator CFX_WideString();
+ CFX_WideString sSource = params[1].operator CFX_WideString();
+ std::string cFormat = (FX_LPCSTR)CFX_ByteString::FromUnicode(sFormat);
+ std::string cSource = (FX_LPCSTR)CFX_ByteString::FromUnicode(sSource);
+ 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.push_back(cSource[itSource]);
+ cPurpose += cSource[itSource];
+ itSource++;
+ break;
+ case 'X':
+ {
+ while(itSource < iSize)
+ {
+ if ((cSource[itSource]>='0'&&cSource[itSource]<='9') || (cSource[itSource]>='a' && cSource[itSource]<='z') || (cSource[itSource]>='A' && cSource[itSource]<='Z'))
+ {
+ //cPurpose.push_back(cSource[itSource]);
+ 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.push_back(cSource[itSource]);
+ cPurpose += cSource[itSource];
+ itSource++;
+ break;
+ }
+ itSource++;
+ }
+ break;
+ }
+ break;
+ case '9':
+ {
+ while(itSource < iSize)
+ {
+ if (cSource[itSource]>='0'&&cSource[itSource]<='9')
+ {
+ //cPurpose.push_back(cSource[itSource]);
+ cPurpose += cSource[itSource];
+ itSource++;
+ break;
+ }
+ itSource++;
+ }
+ break;
+ }
+ case '*':
+ {
+ cPurpose.append(cSource,itSource,iSize-itSource);
+ itSource = iSize-1;
+ break;
+ }
+ case '\\':
+ break;
+ case '>':
+ {
+ for(std::string::iterator it = cSource.begin();it != cSource.end(); it++)
+ {
+ *it = toupper(*it);
+ }
+ break;
+ }
+ case '<':
+ {
+ for(std::string::iterator it = cSource.begin();it != cSource.end(); it++)
+ {
+ *it = tolower(*it);
+ }
+ break;
+ }
+ case '=':
+ break;
+ default:
+ //cPurpose.push_back(letter);
+ cPurpose += letter;
+ break;
+ }
+ }
+}
+
+FX_BOOL util::scand(OBJ_METHOD_PARAMS)
+{
+ v8::Isolate* isolate = GetIsolate(cc);
+ int iSize = params.size();
+ if (iSize < 2)
+ return FALSE;
+ CFX_WideString sFormat = params[0].operator CFX_WideString();
+ CFX_WideString sDate = params[1].operator CFX_WideString();
+
+ double dDate = JS_GetDateTime();
+ if (sDate.GetLength() > 0)
+ {
+ FX_BOOL bWrongFormat = FALSE;
+ dDate = CJS_PublicMethods::MakeRegularDate(sDate,sFormat,bWrongFormat);
+ }
+
+ if (!JS_PortIsNan(dDate))
+ {
+ CJS_Date date(isolate,dDate);
+ vRet = date;
+ }
+ else
+ {
+ vRet.SetNull();
+ }
+
+ return TRUE;
+}
+
+FX_INT64 FX_atoi64(const char *nptr)
+{
+ int c; /* current char */
+ FX_INT64 total; /* current total */
+ int sign; /* if '-', then negative, otherwise positive */
+
+ /* skip whitespace */
+ while ( isspace((int)(unsigned char)*nptr) )
+ ++nptr;
+
+ c = (int)(unsigned char)*nptr++;
+ sign = c; /* save sign indication */
+ if (c == '-' || c == '+')
+ c = (int)(unsigned char)*nptr++; /* skip sign */
+
+ total = 0;
+
+ while (isdigit(c)) {
+ total = 10 * total + (c - '0'); /* accumulate digit */
+ c = (int)(unsigned char)*nptr++; /* get next char */
+ }
+
+ if (sign == '-')
+ return -total;
+ else
+ return total; /* return result, negated if necessary */
+}
+
+FX_BOOL util::byteToChar(OBJ_METHOD_PARAMS)
+{
+ int iSize = params.size();
+ if (iSize == 0)
+ return FALSE;
+ int nByte = (int)params[0];
+ unsigned char cByte = (unsigned char)nByte;
+ CFX_WideString csValue;
+ csValue.Format((FX_LPCWSTR)L"%c", cByte);
+ vRet = csValue;
+ return TRUE;
+}
diff --git a/fpdfsdk/src/jsapi/fxjs_v8.cpp b/fpdfsdk/src/jsapi/fxjs_v8.cpp new file mode 100644 index 0000000000..bbf9eec67d --- /dev/null +++ b/fpdfsdk/src/jsapi/fxjs_v8.cpp @@ -0,0 +1,1043 @@ +// 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/fxcrt/fx_basic.h" +#include "../../../core/include/fxcrt/fx_ext.h" +#include "../../include/jsapi/fxjs_v8.h" +#include "../../include/fsdk_define.h" +#include "time.h" +#include <cmath> +#include <limits> + +#define VALUE_NAME_STRING L"string" +#define VALUE_NAME_NUMBER L"number" +#define VALUE_NAME_BOOLEAN L"boolean" +#define VALUE_NAME_DATE L"date" +#define VALUE_NAME_OBJECT L"object" +#define VALUE_NAME_FXOBJ L"fxobj" +#define VALUE_NAME_NULL L"null" +#define VALUE_NAME_UNDEFINED L"undefined" + +static FX_DWORD g_nan[2] = {0,0x7FF80000 }; +double g_NaN = (*(double *)g_nan); + + +class CJS_PrivateData: public CFX_Object +{ +public: + CJS_PrivateData():ObjDefID(-1), pPrivate(NULL) {} + int ObjDefID; + FX_LPVOID pPrivate; +}; + + +class CJS_ObjDefintion: public CFX_Object +{ +public: + CJS_ObjDefintion(v8::Isolate* isolate, const wchar_t* sObjName, FXJSOBJTYPE eObjType, LP_CONSTRUCTOR pConstructor, LP_DESTRUCTOR pDestructor, unsigned bApplyNew): + objName(sObjName), objType(eObjType), m_pConstructor(pConstructor), m_pDestructor(pDestructor),m_bApplyNew(bApplyNew),m_bSetAsGlobalObject(FALSE) + { + v8::Isolate::Scope isolate_scope(isolate); + HandleScope handle_scope(isolate); + + v8::Handle<ObjectTemplate> objTemplate = ObjectTemplate::New(isolate); + objTemplate->SetInternalFieldCount(1); + m_objTemplate.Reset(isolate, objTemplate); + + //Document as the global object. + if(FXSYS_wcscmp(sObjName, L"Document") == 0) + { + m_bSetAsGlobalObject = TRUE; + } + + } + ~CJS_ObjDefintion() + { + m_objTemplate.Reset(); + m_StaticObj.Reset(); + } +public: + const wchar_t* objName; + FXJSOBJTYPE objType; + LP_CONSTRUCTOR m_pConstructor; + LP_DESTRUCTOR m_pDestructor; + unsigned m_bApplyNew; + FX_BOOL m_bSetAsGlobalObject; + + v8::Persistent<ObjectTemplate> m_objTemplate; + v8::Persistent<v8::Object> m_StaticObj; +}; + +int JS_DefineObj(IJS_Runtime* pJSRuntime, const wchar_t* sObjName, FXJSOBJTYPE eObjType, LP_CONSTRUCTOR pConstructor, LP_DESTRUCTOR pDestructor, unsigned bApplyNew) +{ + v8::Isolate* isolate = (v8::Isolate*)pJSRuntime; + v8::Isolate::Scope isolate_scope(isolate); + HandleScope handle_scope(isolate); + CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0); + if(!pArray) + { + pArray = FX_NEW CFX_PtrArray(); + isolate->SetData(0, pArray); + } + CJS_ObjDefintion* pObjDef = FX_NEW CJS_ObjDefintion(isolate, sObjName, eObjType, pConstructor, pDestructor, bApplyNew); + pArray->Add(pObjDef); + return pArray->GetSize()-1; +} + +int JS_DefineObjMethod(IJS_Runtime* pJSRuntime, int nObjDefnID, const wchar_t* sMethodName, FunctionCallback pMethodCall, unsigned nParamNum) +{ + v8::Isolate* isolate = (v8::Isolate*)pJSRuntime; + v8::Isolate::Scope isolate_scope(isolate); + HandleScope handle_scope(isolate); + + CFX_WideString ws = CFX_WideString((FX_LPCWSTR)sMethodName); + CFX_ByteString bsMethodName = ws.UTF8Encode(); + + CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0); + if(!pArray) return 0; + + if(nObjDefnID<0 || nObjDefnID>= pArray->GetSize()) return 0; + CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(nObjDefnID); + v8::Local<ObjectTemplate> objTemp = v8::Local<ObjectTemplate>::New(isolate, pObjDef->m_objTemplate); + objTemp->Set(v8::String::NewFromUtf8(isolate, FX_LPCSTR(bsMethodName)), FunctionTemplate::New(isolate, pMethodCall), ReadOnly); + pObjDef->m_objTemplate.Reset(isolate,objTemp); + return 0; +} + +int JS_DefineObjProperty(IJS_Runtime* pJSRuntime, int nObjDefnID, const wchar_t* sPropName, AccessorGetterCallback pPropGet, AccessorSetterCallback pPropPut) +{ + v8::Isolate* isolate = (v8::Isolate*)pJSRuntime; + v8::Isolate::Scope isolate_scope(isolate); + HandleScope handle_scope(isolate); + + CFX_WideString ws = CFX_WideString((FX_LPCWSTR)sPropName); + CFX_ByteString bsPropertyName = ws.UTF8Encode(); + + CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0); + if(!pArray) return 0; + + if(nObjDefnID<0 || nObjDefnID>= pArray->GetSize()) return 0; + CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(nObjDefnID); + v8::Local<ObjectTemplate> objTemp = v8::Local<ObjectTemplate>::New(isolate, pObjDef->m_objTemplate); + objTemp->SetAccessor(v8::String::NewFromUtf8(isolate, FX_LPCSTR(bsPropertyName)), pPropGet, pPropPut); + pObjDef->m_objTemplate.Reset(isolate,objTemp); + return 0; +} + +int JS_DefineObjAllProperties(IJS_Runtime* pJSRuntime, int nObjDefnID, NamedPropertyQueryCallback pPropQurey, NamedPropertyGetterCallback pPropGet, NamedPropertySetterCallback pPropPut, NamedPropertyDeleterCallback pPropDel) +{ + v8::Isolate* isolate = (v8::Isolate*)pJSRuntime; + v8::Isolate::Scope isolate_scope(isolate); + HandleScope handle_scope(isolate); + + CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0); + if(!pArray) return 0; + + if(nObjDefnID<0 || nObjDefnID>= pArray->GetSize()) return 0; + CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(nObjDefnID); + v8::Local<ObjectTemplate> objTemp = v8::Local<ObjectTemplate>::New(isolate, pObjDef->m_objTemplate); + objTemp->SetNamedPropertyHandler(pPropGet, pPropPut, pPropQurey, pPropDel); + pObjDef->m_objTemplate.Reset(isolate,objTemp); + return 0; +} + +int JS_DefineObjConst(IJS_Runtime* pJSRuntime, int nObjDefnID, const wchar_t* sConstName, v8::Handle<v8::Value> pDefault) +{ + v8::Isolate* isolate = (v8::Isolate*)pJSRuntime; + v8::Isolate::Scope isolate_scope(isolate); + HandleScope handle_scope(isolate); + + CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0); + if(!pArray) return 0; + + CFX_WideString ws = CFX_WideString((FX_LPCWSTR)sConstName); + CFX_ByteString bsConstName = ws.UTF8Encode(); + + if(nObjDefnID<0 || nObjDefnID>= pArray->GetSize()) return 0; + CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(nObjDefnID); + v8::Local<ObjectTemplate> objTemp = v8::Local<ObjectTemplate>::New(isolate, pObjDef->m_objTemplate); + objTemp->Set(isolate, FX_LPCSTR(bsConstName), pDefault); + pObjDef->m_objTemplate.Reset(isolate,objTemp); + return 0; +} + +static v8::Persistent<ObjectTemplate>& _getGlobalObjectTemplate(IJS_Runtime* pJSRuntime) +{ + v8::Isolate* isolate = (v8::Isolate*)pJSRuntime; + v8::Isolate::Scope isolate_scope(isolate); + HandleScope handle_scope(isolate); + + CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0); + ASSERT(pArray != NULL); + for(int i=0; i<pArray->GetSize(); i++) + { + CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(i); + if(pObjDef->m_bSetAsGlobalObject) + return pObjDef->m_objTemplate; + } + static v8::Persistent<ObjectTemplate> gloabalObjectTemplate; + return gloabalObjectTemplate; +} + +int JS_DefineGlobalMethod(IJS_Runtime* pJSRuntime, const wchar_t* sMethodName, FunctionCallback pMethodCall, unsigned nParamNum) +{ + v8::Isolate* isolate = (v8::Isolate*)pJSRuntime; + v8::Isolate::Scope isolate_scope(isolate); + HandleScope handle_scope(isolate); + + CFX_WideString ws = CFX_WideString((FX_LPCWSTR)sMethodName); + CFX_ByteString bsMethodName = ws.UTF8Encode(); + + v8::Local<FunctionTemplate> funTempl = FunctionTemplate::New(isolate, pMethodCall); + v8::Local<ObjectTemplate> objTemp; + + v8::Persistent<ObjectTemplate>& globalObjTemp = _getGlobalObjectTemplate(pJSRuntime); + if(globalObjTemp.IsEmpty()) + objTemp = ObjectTemplate::New(isolate); + else + objTemp = v8::Local<ObjectTemplate>::New(isolate, globalObjTemp); + objTemp->Set(v8::String::NewFromUtf8(isolate, FX_LPCSTR(bsMethodName)), funTempl, ReadOnly); + + globalObjTemp.Reset(isolate,objTemp); + + return 0; +} + +int JS_DefineGlobalConst(IJS_Runtime* pJSRuntime, const wchar_t* sConstName, v8::Handle<v8::Value> pDefault) +{ + v8::Isolate* isolate = (v8::Isolate*)pJSRuntime; + v8::Isolate::Scope isolate_scope(isolate); + HandleScope handle_scope(isolate); + + CFX_WideString ws = CFX_WideString((FX_LPCWSTR)sConstName); + CFX_ByteString bsConst= ws.UTF8Encode(); + + v8::Local<ObjectTemplate> objTemp; + + v8::Persistent<ObjectTemplate>& globalObjTemp = _getGlobalObjectTemplate(pJSRuntime); + if(globalObjTemp.IsEmpty()) + objTemp = ObjectTemplate::New(isolate); + else + objTemp = v8::Local<ObjectTemplate>::New(isolate, globalObjTemp); + objTemp->Set(v8::String::NewFromUtf8(isolate, FX_LPCSTR(bsConst)), pDefault, ReadOnly); + + globalObjTemp.Reset(isolate,objTemp); + + return 0; +} + + +void JS_InitialRuntime(IJS_Runtime* pJSRuntime,IFXJS_Runtime* pFXRuntime, IFXJS_Context* context, v8::Persistent<v8::Context>& v8PersistentContext) +{ + v8::Isolate* isolate = (v8::Isolate*)pJSRuntime; + v8::Isolate::Scope isolate_scope(isolate); + HandleScope handle_scope(isolate); + + v8::Persistent<ObjectTemplate>& globalObjTemp = _getGlobalObjectTemplate(pJSRuntime); + v8::Handle<v8::Context> v8Context = v8::Context::New(isolate, NULL, v8::Local<ObjectTemplate>::New(isolate, globalObjTemp)); + v8::Context::Scope context_scope(v8Context); + + v8::Handle<External> ptr = External::New(isolate, pFXRuntime); + v8Context->SetEmbedderData(1, ptr); + + CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0); + if(!pArray) return; + + for(int i=0; i<pArray->GetSize(); i++) + { + CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(i); + CFX_WideString ws = CFX_WideString(pObjDef->objName); + CFX_ByteString bs = ws.UTF8Encode(); + v8::Handle<v8::String> objName = v8::String::NewFromUtf8(isolate,(FX_LPCSTR)bs, v8::String::kNormalString, bs.GetLength()); + + + if(pObjDef->objType == JS_DYNAMIC) + { + //Document is set as global object, need to construct it first. + if(ws.Equal(L"Document")) + { + + CJS_PrivateData* pPrivateData = FX_NEW CJS_PrivateData; + pPrivateData->ObjDefID = i; + v8::Handle<External> ptr = External::New(isolate, pPrivateData); + + v8Context->Global()->GetPrototype()->ToObject()->SetInternalField(0, ptr); + + if(pObjDef->m_pConstructor) + pObjDef->m_pConstructor(context, v8Context->Global()->GetPrototype()->ToObject(), v8Context->Global()->GetPrototype()->ToObject()); + } + } + else + { + v8::Handle<v8::Object> obj = JS_NewFxDynamicObj(pJSRuntime, context, i); + v8Context->Global()->Set(objName, obj); + pObjDef->m_StaticObj.Reset(isolate, obj); + } + } + v8PersistentContext.Reset(isolate, v8Context); +} + +void JS_ReleaseRuntime(IJS_Runtime* pJSRuntime, v8::Persistent<v8::Context>& v8PersistentContext) +{ + v8::Isolate* isolate = (v8::Isolate*)pJSRuntime; + v8::Isolate::Scope isolate_scope(isolate); + HandleScope handle_scope(isolate); + v8::Local<v8::Context> context = v8::Local<v8::Context>::New(isolate, v8PersistentContext); + v8::Context::Scope context_scope(context); + + CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0); + if(!pArray) return ; + + for(int i=0; i<pArray->GetSize(); i++) + { + CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(i); + if(!pObjDef->m_StaticObj.IsEmpty()) + { + v8::Local<v8::Object> pObj = v8::Local<v8::Object>::New(isolate, pObjDef->m_StaticObj); + if(pObjDef->m_pDestructor) + pObjDef->m_pDestructor(pObj); + JS_FreePrivate(pObj); + } + delete pObjDef; + } + delete pArray; + isolate->SetData(0,NULL); +} + +void JS_Initial() +{ +#ifndef FOXIT_CHROME_BUILD + v8::V8::InitializeICU(); +#endif +} +void JS_Release() +{ + +} +int JS_Parse(IJS_Runtime* pJSRuntime, IFXJS_Context* pJSContext, const wchar_t* script, long length, FXJSErr* perror) +{ + v8::Isolate* isolate = (v8::Isolate*)pJSRuntime; + v8::Isolate::Scope isolate_scope(isolate); + TryCatch try_catch; + + CFX_WideString wsScript(script); + CFX_ByteString bsScript = wsScript.UTF8Encode(); + + + v8::Handle<Script> compiled_script = Script::Compile(v8::String::NewFromUtf8(isolate,(FX_LPCSTR)bsScript,v8::String::kNormalString, bsScript.GetLength())); + if (compiled_script.IsEmpty()) { + v8::String::Utf8Value error(try_catch.Exception()); + return -1; + } + return 0; +} + +int JS_Execute(IJS_Runtime* pJSRuntime, IFXJS_Context* pJSContext, const wchar_t* script, long length, FXJSErr* perror) +{ + v8::Isolate* isolate = (v8::Isolate*)pJSRuntime; + v8::Isolate::Scope isolate_scope(isolate); + TryCatch try_catch; + + CFX_WideString wsScript(script); + CFX_ByteString bsScript = wsScript.UTF8Encode(); + + v8::Handle<Script> compiled_script = Script::Compile(v8::String::NewFromUtf8(isolate,(FX_LPCSTR)bsScript,v8::String::kNormalString, bsScript.GetLength())); + if (compiled_script.IsEmpty()) { + v8::String::Utf8Value error(try_catch.Exception()); + return -1; + } + + v8::Handle<v8::Value> result = compiled_script->Run(); + if (result.IsEmpty()) { + v8::String::Utf8Value error(try_catch.Exception()); + return -1; + } + return 0; +} + +v8::Handle<v8::Object> JS_NewFxDynamicObj(IJS_Runtime* pJSRuntime, IFXJS_Context* pJSContext, int nObjDefnID) +{ + v8::Isolate* isolate = (v8::Isolate*)pJSRuntime; + v8::Isolate::Scope isolate_scope(isolate); + if(-1 == nObjDefnID) + { + v8::Local<ObjectTemplate> objTempl = ObjectTemplate::New(isolate); + return objTempl->NewInstance(); + } + + CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0); + if(!pArray) return v8::Handle<v8::Object>(); + + + if(nObjDefnID<0 || nObjDefnID>= pArray->GetSize()) return v8::Handle<v8::Object>(); + CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(nObjDefnID); + + v8::Local<v8::Context> context = isolate->GetCurrentContext(); + v8::Local<ObjectTemplate> objTemp = v8::Local<ObjectTemplate>::New(isolate, pObjDef->m_objTemplate); + + v8::Local<v8::Object> obj = objTemp->NewInstance(); + + CJS_PrivateData* pPrivateData = FX_NEW CJS_PrivateData; + pPrivateData->ObjDefID = nObjDefnID; + v8::Handle<External> ptr = External::New(isolate, pPrivateData); + obj->SetInternalField(0, ptr); + + if(pObjDef->m_pConstructor) + pObjDef->m_pConstructor(pJSContext, obj, context->Global()->GetPrototype()->ToObject()); + + return obj; +} + +v8::Handle<v8::Object> JS_GetStaticObj(IJS_Runtime* pJSRuntime, int nObjDefnID) +{ + v8::Isolate* isolate = (v8::Isolate*)pJSRuntime; + v8::Isolate::Scope isolate_scope(isolate); + + CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0); + if(!pArray) return v8::Handle<v8::Object>(); + + if(nObjDefnID<0 || nObjDefnID>= pArray->GetSize()) return v8::Handle<v8::Object>(); + CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(nObjDefnID); + v8::Local<v8::Object> obj = v8::Local<v8::Object>::New(isolate,pObjDef->m_StaticObj); + return obj; +} + +void JS_SetThisObj(IJS_Runtime* pJSRuntime, int nThisObjID) +{ + //Do nothing. +} +v8::Handle<v8::Object> JS_GetThisObj(IJS_Runtime * pJSRuntime) +{ + //Return the global object. + v8::Isolate* isolate = (v8::Isolate*)pJSRuntime; + v8::Isolate::Scope isolate_scope(isolate); + + CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0); + if(!pArray) return v8::Handle<v8::Object>(); + + v8::Local<v8::Context> context = isolate->GetCurrentContext(); + return context->Global()->GetPrototype()->ToObject(); +} + +int JS_GetObjDefnID(v8::Handle<v8::Object> pObj) +{ + if(pObj.IsEmpty() || !pObj->InternalFieldCount()) return -1; + v8::Handle<External> field = v8::Handle<External>::Cast(pObj->GetInternalField(0)); + CJS_PrivateData* pPrivateData = (CJS_PrivateData*)field->Value(); + if(pPrivateData) + return pPrivateData->ObjDefID; + return -1; +} + +IJS_Runtime* JS_GetRuntime(v8::Handle<v8::Object> pObj) +{ + if(pObj.IsEmpty()) return NULL; + v8::Local<v8::Context> context = pObj->CreationContext(); + if(context.IsEmpty()) return NULL; + return context->GetIsolate(); +} + +int JS_GetObjDefnID(IJS_Runtime * pJSRuntime, const wchar_t* pObjName) +{ + v8::Isolate* isolate = (v8::Isolate*)pJSRuntime; + v8::Isolate::Scope isolate_scope(isolate); + + CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0); + if(!pArray) return -1; + + for(int i=0; i<pArray->GetSize(); i++) + { + CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(i); + if(FXSYS_wcscmp(pObjDef->objName, pObjName) == 0) + return i; + } + return -1; +} + +void JS_Error(v8::Value * pError,const wchar_t * main,const wchar_t * sub) +{ + +} + +unsigned JS_CalcHash(const wchar_t* main, unsigned nLen) +{ + return (unsigned)FX_HashCode_String_GetW(main, nLen); +} + +unsigned JS_CalcHash(const wchar_t* main) +{ + return (unsigned)FX_HashCode_String_GetW(main, FXSYS_wcslen(main)); +} +const wchar_t* JS_GetTypeof(v8::Handle<v8::Value> pObj) +{ + if(pObj.IsEmpty()) return NULL; + if(pObj->IsString()) + return VALUE_NAME_STRING; + if(pObj->IsNumber()) + return VALUE_NAME_NUMBER; + if(pObj->IsBoolean()) + return VALUE_NAME_BOOLEAN; + if(pObj->IsDate()) + return VALUE_NAME_DATE; + if(pObj->IsObject()) + return VALUE_NAME_OBJECT; + if(pObj->IsNull()) + return VALUE_NAME_NULL; + if(pObj->IsUndefined()) + return VALUE_NAME_UNDEFINED; + return NULL; + +} +const wchar_t* JS_GetClassname(v8::Handle<v8::Object> pObj) +{ + return NULL; +} + +void JS_SetPrivate(v8::Handle<v8::Object> pObj, void* p) +{ + JS_SetPrivate(NULL, pObj, p); +} + +void* JS_GetPrivate(v8::Handle<v8::Object> pObj) +{ + return JS_GetPrivate(NULL,pObj); +} + +void JS_SetPrivate(IJS_Runtime* pJSRuntime, v8::Handle<v8::Object> pObj, void* p) +{ + if(pObj.IsEmpty() || !pObj->InternalFieldCount()) return; + v8::Handle<External> ptr = v8::Handle<External>::Cast(pObj->GetInternalField(0)); + CJS_PrivateData* pPrivateData = (CJS_PrivateData*)ptr->Value(); + if(!pPrivateData) return; + pPrivateData->pPrivate = p; +} + +void* JS_GetPrivate(IJS_Runtime* pJSRuntime, v8::Handle<v8::Object> pObj) +{ + if(pObj.IsEmpty()) return NULL; + v8::Local<v8::Value> value; + if(pObj->InternalFieldCount()) + value = pObj->GetInternalField(0); + else + { + //It could be a global proxy object. + v8::Local<v8::Value> v = pObj->GetPrototype(); + if(v->IsObject()) + value = v->ToObject()->GetInternalField(0); + } + if(value.IsEmpty() || value->IsUndefined()) return NULL; + v8::Handle<External> ptr = v8::Handle<External>::Cast(value); + CJS_PrivateData* pPrivateData = (CJS_PrivateData*)ptr->Value(); + if(!pPrivateData) return NULL; + return pPrivateData->pPrivate; +} + +void JS_FreePrivate(v8::Handle<v8::Object> pObj) +{ + if(pObj.IsEmpty() || !pObj->InternalFieldCount()) return; + v8::Handle<External> ptr = v8::Handle<External>::Cast(pObj->GetInternalField(0)); + delete (CJS_PrivateData*)ptr->Value(); + v8::Local<v8::Context> context = pObj->CreationContext(); + + pObj->SetInternalField(0, External::New(context->GetIsolate(), NULL)); +} + + +v8::Handle<v8::Value> JS_GetObjectValue(v8::Handle<v8::Object> pObj) +{ + return pObj; +} + +v8::Handle<String> WSToJSString(IJS_Runtime* pJSRuntime, const wchar_t* PropertyName, int Len = -1) +{ + CFX_WideString ws = CFX_WideString(PropertyName,Len); + CFX_ByteString bs = ws.UTF8Encode(); + if(!pJSRuntime) pJSRuntime = v8::Isolate::GetCurrent(); + return v8::String::NewFromUtf8(pJSRuntime, (FX_LPCSTR)bs); +} + +v8::Handle<v8::Value> JS_GetObjectElement(IJS_Runtime* pJSRuntime, v8::Handle<v8::Object> pObj,const wchar_t* PropertyName) +{ + if(pObj.IsEmpty()) return v8::Handle<v8::Value>(); + return pObj->Get(WSToJSString(pJSRuntime,PropertyName)); +} + +v8::Handle<v8::Array> JS_GetObjectElementNames(v8::Handle<v8::Object> pObj) +{ + if(pObj.IsEmpty()) return v8::Handle<v8::Array>(); + return pObj->GetPropertyNames(); +} + +void JS_PutObjectString(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj, const wchar_t* PropertyName, const wchar_t* sValue) //VT_string +{ + if(pObj.IsEmpty()) return; + pObj->Set(WSToJSString(pJSRuntime, PropertyName), WSToJSString(pJSRuntime, sValue)); +} + +void JS_PutObjectNumber(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj, const wchar_t* PropertyName, int nValue) +{ + if(pObj.IsEmpty()) return; + pObj->Set(WSToJSString(pJSRuntime,PropertyName),Int32::New(pJSRuntime, nValue)); +} + +void JS_PutObjectNumber(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj, const wchar_t* PropertyName, float fValue) +{ + if(pObj.IsEmpty()) return; + pObj->Set(WSToJSString(pJSRuntime,PropertyName),Number::New(pJSRuntime, (double)fValue)); +} + +void JS_PutObjectNumber(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj, const wchar_t* PropertyName, double dValue) +{ + if(pObj.IsEmpty()) return; + pObj->Set(WSToJSString(pJSRuntime,PropertyName),Number::New(pJSRuntime, (double)dValue)); +} + +void JS_PutObjectBoolean(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj, const wchar_t* PropertyName, bool bValue) +{ + if(pObj.IsEmpty()) return; + pObj->Set(WSToJSString(pJSRuntime,PropertyName),v8::Boolean::New(pJSRuntime, bValue)); +} + +void JS_PutObjectObject(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj, const wchar_t* PropertyName, v8::Handle<v8::Object> pPut) +{ + if(pObj.IsEmpty()) return; + pObj->Set(WSToJSString(pJSRuntime,PropertyName),pPut); +} + +void JS_PutObjectNull(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj, const wchar_t* PropertyName) +{ + if(pObj.IsEmpty()) return; + pObj->Set(WSToJSString(pJSRuntime,PropertyName),v8::Handle<v8::Object>()); +} + +v8::Handle<v8::Array> JS_NewArray(IJS_Runtime* pJSRuntime) +{ + return v8::Array::New(pJSRuntime); +} + +unsigned JS_PutArrayElement(v8::Handle<v8::Array> pArray,unsigned index,v8::Handle<v8::Value> pValue,FXJSVALUETYPE eType) +{ + if(pArray.IsEmpty()) return 0; + pArray->Set(index, pValue); + return 1; +} + +v8::Handle<v8::Value> JS_GetArrayElemnet(v8::Handle<v8::Array> pArray,unsigned index) +{ + if(pArray.IsEmpty()) return v8::Handle<v8::Value>(); + return pArray->Get(index); +} + +unsigned JS_GetArrayLength(v8::Handle<v8::Array> pArray) +{ + if(pArray.IsEmpty()) return 0; + return pArray->Length(); +} + +v8::Handle<v8::Value> JS_NewNumber(IJS_Runtime* pJSRuntime,int number) +{ + return Int32::New(pJSRuntime, number); +} + +v8::Handle<v8::Value> JS_NewNumber(IJS_Runtime* pJSRuntime,double number) +{ + return Number::New(pJSRuntime, number); +} + +v8::Handle<v8::Value> JS_NewNumber(IJS_Runtime* pJSRuntime,float number) +{ + return Number::New(pJSRuntime, (float)number); +} + +v8::Handle<v8::Value> JS_NewBoolean(IJS_Runtime* pJSRuntime,bool b) +{ + return v8::Boolean::New(pJSRuntime, b); +} + +v8::Handle<v8::Value> JS_NewObject(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj) +{ + if(pObj.IsEmpty()) return v8::Handle<v8::Value>(); + return pObj->Clone(); +} + +v8::Handle<v8::Value> JS_NewObject2(IJS_Runtime* pJSRuntime,v8::Handle<v8::Array> pObj) +{ + if(pObj.IsEmpty()) return v8::Handle<v8::Value>(); + return pObj->Clone(); +} + + +v8::Handle<v8::Value> JS_NewString(IJS_Runtime* pJSRuntime,const wchar_t* string) +{ + return WSToJSString(pJSRuntime, string); +} + +v8::Handle<v8::Value> JS_NewString(IJS_Runtime* pJSRuntime,const wchar_t* string, unsigned nLen) +{ + return WSToJSString(pJSRuntime, string, nLen); +} + +v8::Handle<v8::Value> JS_NewNull() +{ + return v8::Handle<v8::Value>(); +} + +v8::Handle<v8::Value> JS_NewDate(IJS_Runtime* pJSRuntime,double d) +{ + return Date::New(pJSRuntime, d); +} + +v8::Handle<v8::Value> JS_NewValue(IJS_Runtime* pJSRuntime) +{ + return v8::Handle<v8::Value>(); +} + +v8::Handle<v8::Value> JS_GetListValue(v8::Handle<v8::Value> pList, int index) +{ + + if(!pList.IsEmpty() && pList->IsObject()) + { + v8::Local<v8::Object> obj = pList->ToObject(); + return obj->Get(index); + } + return v8::Handle<v8::Value>(); +} + +int JS_ToInt32(v8::Handle<v8::Value> pValue) +{ + if(pValue.IsEmpty()) return 0; + return pValue->ToInt32()->Value(); +} + +bool JS_ToBoolean(v8::Handle<v8::Value> pValue) +{ + if(pValue.IsEmpty()) return false; + return pValue->ToBoolean()->Value(); +} + +double JS_ToNumber(v8::Handle<v8::Value> pValue) +{ + if(pValue.IsEmpty()) return 0.0; + return pValue->ToNumber()->Value(); +} + +v8::Handle<v8::Object> JS_ToObject(v8::Handle<v8::Value> pValue) +{ + if(pValue.IsEmpty()) return v8::Handle<v8::Object>(); + return pValue->ToObject(); +} + +CFX_WideString JS_ToString(v8::Handle<v8::Value> pValue) +{ + if(pValue.IsEmpty()) return L""; + v8::String::Utf8Value s(pValue->ToString()); + return CFX_WideString::FromUTF8(*s); +} + +v8::Handle<v8::Array> JS_ToArray(v8::Handle<v8::Value> pValue) +{ + if(pValue.IsEmpty()) return v8::Handle<v8::Array>(); + return v8::Handle<v8::Array>::Cast(pValue->ToObject()); +} + +void JS_ValueCopy(v8::Handle<v8::Value>& pTo, v8::Handle<v8::Value> pFrom) +{ + pTo = pFrom; +} + + +//JavaScript time implement begin. + +double _getLocalTZA() +{ + if(!FSDK_IsSandBoxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS)) + return 0; + time_t t = 0; + time(&t); + localtime(&t); + 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 == NULL) + 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 ((double)86400000) * _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 +(int)(t/(365.0*86400000)); + if (_TimeFromYear(y) <= t) + { + while(_TimeFromYear(y+1) <= t) y++; + } + else + while(_TimeFromYear(y-1) > 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* string) +{ + v8::Isolate* pIsolate = v8::Isolate::GetCurrent(); + v8::Isolate::Scope isolate_scope(pIsolate); + HandleScope scope(pIsolate); + + v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); + + //Use the built-in object method. + v8::Local<v8::Value> v = context->Global()->Get(v8::String::NewFromUtf8(pIsolate, "Date")); + if(v->IsObject()) + { + v8::Local<v8::Object> o = v->ToObject(); + v = o->Get(v8::String::NewFromUtf8(pIsolate, "parse")); + if(v->IsFunction()) + { + v8::Local<Function> funC = v8::Handle<Function>::Cast(v); + + const int argc = 1; + v8::Local<v8::String> timeStr = WSToJSString(pIsolate, string); + v8::Handle<v8::Value> argv[argc] = {timeStr}; + v = funC->Call(context->Global(), argc, argv); + if(v->IsNumber()) + { + double date = v->ToNumber()->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 g_NaN; + 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 g_NaN; + 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 g_NaN; + + 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 g_NaN; + + return day * 86400000 + time; +} + +bool JS_PortIsNan(double d) +{ + return d != d; +} + +double JS_LocalTime(double d) +{ + return JS_GetDateTime() + _getDaylightSavingTA(d); +} + +//JavaScript time implement End.
\ No newline at end of file diff --git a/fpdfsdk/src/pdfwindow/PWL_Button.cpp b/fpdfsdk/src/pdfwindow/PWL_Button.cpp new file mode 100644 index 0000000000..c71e5cc8b4 --- /dev/null +++ b/fpdfsdk/src/pdfwindow/PWL_Button.cpp @@ -0,0 +1,53 @@ +// 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 "../../include/pdfwindow/PDFWindow.h"
+#include "../../include/pdfwindow/PWL_Wnd.h"
+#include "../../include/pdfwindow/PWL_Button.h"
+#include "../../include/pdfwindow/PWL_Utils.h"
+
+/* ------------------------------- CPWL_Button ---------------------------------- */
+
+CPWL_Button::CPWL_Button() :
+ m_bMouseDown(FALSE)
+{
+}
+
+CPWL_Button::~CPWL_Button()
+{
+// PWL_TRACE("~CPWL_Button\n");
+}
+
+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 CPDF_Point & point, FX_DWORD nFlag)
+{
+ CPWL_Wnd::OnLButtonDown(point, nFlag);
+
+ m_bMouseDown = TRUE;
+ SetCapture();
+
+ return TRUE;
+}
+
+FX_BOOL CPWL_Button::OnLButtonUp(const CPDF_Point & 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 new file mode 100644 index 0000000000..e54538ea73 --- /dev/null +++ b/fpdfsdk/src/pdfwindow/PWL_Caret.cpp @@ -0,0 +1,197 @@ +// 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 "../../include/pdfwindow/PDFWindow.h"
+#include "../../include/pdfwindow/PWL_Wnd.h"
+#include "../../include/pdfwindow/PWL_Caret.h"
+#include "../../include/pdfwindow/PWL_Utils.h"
+
+#define PWL_CARET_FLASHINTERVAL 500
+
+//////////////////////////////////////////////////////////////////////
+// Construction/Destruction
+//////////////////////////////////////////////////////////////////////
+
+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,CPDF_Point(0.0f,0.0f));
+}
+
+void CPWL_Caret::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)
+{
+ if (IsVisible() && m_bFlash)
+ {
+ CPDF_Rect rcRect = GetCaretRect();
+ CPDF_Rect 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 CPDF_Point & ptOffset)
+{
+ if (IsVisible() && m_bFlash)
+ {
+ CFX_ByteTextBuf sCaret;
+
+ CPDF_Rect rcRect = GetCaretRect();
+ CPDF_Rect 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 CPDF_Point & 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();
+ }
+}
+
+CPDF_Rect CPWL_Caret::GetCaretRect() const
+{
+ return CPDF_Rect(m_ptFoot.x,
+ m_ptFoot.y,
+ m_ptHead.x + this->m_fWidth,
+ m_ptHead.y);
+}
+
+void CPWL_Caret::SetCaret(FX_BOOL bVisible, const CPDF_Point & ptHead, const CPDF_Point & 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)
+ {
+ this->m_ptHead = ptHead;
+ this->m_ptFoot = ptFoot;
+
+ m_bFlash = TRUE;
+ //Move(GetCaretRect(),FALSE,TRUE);
+ Move(m_rcInvalid, FALSE, TRUE);
+ }
+ }
+ else
+ {
+ this->m_ptHead = ptHead;
+ this->m_ptFoot = ptFoot;
+
+ EndTimer();
+ BeginTimer(PWL_CARET_FLASHINTERVAL);
+
+ CPWL_Wnd::SetVisible(TRUE);
+ m_bFlash = TRUE;
+
+ //Move(GetCaretRect(),FALSE,TRUE);
+ Move(m_rcInvalid, FALSE, TRUE);
+ }
+ }
+ else
+ {
+ this->m_ptHead = CPDF_Point(0,0);
+ this->m_ptFoot = CPDF_Point(0,0);
+
+ m_bFlash = FALSE;
+ if (IsVisible())
+ {
+ EndTimer();
+ CPWL_Wnd::SetVisible(FALSE);
+ }
+ }
+}
+
+void CPWL_Caret::InvalidateRect(CPDF_Rect * pRect)
+{
+ if (pRect)
+ {
+ CPDF_Rect 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 new file mode 100644 index 0000000000..7650a23e5b --- /dev/null +++ b/fpdfsdk/src/pdfwindow/PWL_ComboBox.cpp @@ -0,0 +1,662 @@ +// 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 "../../include/pdfwindow/PDFWindow.h"
+#include "../../include/pdfwindow/PWL_Wnd.h"
+#include "../../include/pdfwindow/PWL_EditCtrl.h"
+#include "../../include/pdfwindow/PWL_Edit.h"
+#include "../../include/pdfwindow/PWL_ListBox.h"
+#include "../../include/pdfwindow/PWL_ComboBox.h"
+#include "../../include/pdfwindow/PWL_Utils.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))
+
+
+/* ---------------------------- CPWL_CBListBox ---------------------------- */
+
+FX_BOOL CPWL_CBListBox::OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag)
+{
+ CPWL_Wnd::OnLButtonUp(point,nFlag);
+
+ if (m_bMouseDown)
+ {
+ ReleaseCapture();
+ m_bMouseDown = FALSE;
+
+ if (this->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::OnKeyDown(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::OnChar(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;
+}
+
+/* ---------------------------- CPWL_CBButton ---------------------------- */
+
+void CPWL_CBButton::GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream)
+{
+ CPWL_Wnd::GetThisAppearanceStream(sAppStream);
+
+ CPDF_Rect rectWnd = CPWL_Wnd::GetWindowRect();
+
+ if (IsVisible() && !rectWnd.IsEmpty())
+ {
+ CFX_ByteTextBuf sButton;
+
+ CPDF_Point ptCenter = this->GetCenterPoint();
+
+ CPDF_Point pt1(ptCenter.x - PWL_CBBUTTON_TRIANGLE_HALFLEN,ptCenter.y + PWL_CBBUTTON_TRIANGLE_HALFLEN * 0.5f);
+ CPDF_Point pt2(ptCenter.x + PWL_CBBUTTON_TRIANGLE_HALFLEN,ptCenter.y + PWL_CBBUTTON_TRIANGLE_HALFLEN * 0.5f);
+ CPDF_Point 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, CPDF_Matrix* pUser2Device)
+{
+ CPWL_Wnd::DrawThisAppearance(pDevice,pUser2Device);
+
+ CPDF_Rect rectWnd = CPWL_Wnd::GetWindowRect();
+
+ if (IsVisible() && !rectWnd.IsEmpty())
+ {
+ CPDF_Point ptCenter = this->GetCenterPoint();
+
+ CPDF_Point pt1(ptCenter.x - PWL_CBBUTTON_TRIANGLE_HALFLEN,ptCenter.y + PWL_CBBUTTON_TRIANGLE_HALFLEN * 0.5f);
+ CPDF_Point pt2(ptCenter.x + PWL_CBBUTTON_TRIANGLE_HALFLEN,ptCenter.y + PWL_CBBUTTON_TRIANGLE_HALFLEN * 0.5f);
+ CPDF_Point 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 CPDF_Point & 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 CPDF_Point & point, FX_DWORD nFlag)
+{
+ CPWL_Wnd::OnLButtonUp(point, nFlag);
+
+ ReleaseCapture();
+
+ return TRUE;
+}
+
+/* ---------------------------- CPWL_ComboBox ---------------------------- */
+
+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(FX_LPCWSTR text)
+{
+ if (m_pEdit)
+ m_pEdit->SetText(text);
+}
+
+void CPWL_ComboBox::AddString(FX_LPCWSTR string)
+{
+ if (m_pList)
+ m_pList->AddString(string);
+}
+
+FX_INT32 CPWL_ComboBox::GetSelect() const
+{
+ return m_nSelectItem;
+}
+
+void CPWL_ComboBox::SetSelect(FX_INT32 nItemIndex)
+{
+ if (m_pList)
+ m_pList->Select(nItemIndex);
+
+ m_pEdit->SetText(m_pList->GetText());
+
+ m_nSelectItem = nItemIndex;
+}
+
+void CPWL_ComboBox::SetEditSel(FX_INT32 nStartChar,FX_INT32 nEndChar)
+{
+ if (m_pEdit)
+ {
+ m_pEdit->SetSel(nStartChar,nEndChar);
+ }
+}
+
+void CPWL_ComboBox::GetEditSel(FX_INT32 & nStartChar, FX_INT32 & 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 = CPDF_Rect(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 = CPDF_Rect(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()
+{
+ CPDF_Rect rcClient = GetClientRect();
+
+ if (m_bPopup)
+ {
+ CPDF_Rect rclient = GetClientRect();
+ CPDF_Rect rcButton = rclient;
+ CPDF_Rect rcEdit = rcClient;
+ CPDF_Rect 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
+ {
+ CPDF_Rect 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);
+
+ CPDF_Rect 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();
+}
+
+CPDF_Rect CPWL_ComboBox::GetFocusRect() const
+{
+ return CPDF_Rect();
+}
+
+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)
+ {
+ FX_INT32 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;
+
+ CPDF_Rect 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);
+ }
+ }
+ }
+ 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;
+ if (m_pList->OnKeyDown(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;
+ if (m_pList->OnKeyDown(nChar,bExit,nFlag))
+ {
+ if (bExit) return FALSE;
+ SetSelectText();
+ }
+ }
+ return TRUE;
+ }
+
+ if (HasFlag(PCBS_ALLOWCUSTOMTEXT))
+ return m_pEdit->OnKeyDown(nChar,nFlag);
+ else
+ 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;
+ FX_BOOL bExit = FALSE;
+
+ if (HasFlag(PCBS_ALLOWCUSTOMTEXT))
+ {
+ return m_pEdit->OnChar(nChar,nFlag);
+ }
+ else
+ {
+ if (m_pList->OnChar(nChar,bExit,nFlag))
+ {
+ return bExit;
+ }
+ else
+ return FALSE;
+ }
+}
+
+void CPWL_ComboBox::OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam, FX_INTPTR 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());
+ m_pEdit->SelectAll();
+
+ m_nSelectItem = m_pList->GetCurSel();
+}
+
+FX_BOOL CPWL_ComboBox::IsModified() const
+{
+ return m_pEdit->IsModified();
+}
+
+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 new file mode 100644 index 0000000000..87ddd87fb0 --- /dev/null +++ b/fpdfsdk/src/pdfwindow/PWL_Edit.cpp @@ -0,0 +1,1316 @@ +// 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 "../../include/pdfwindow/PDFWindow.h"
+#include "../../include/pdfwindow/PWL_Wnd.h"
+#include "../../include/pdfwindow/PWL_EditCtrl.h"
+#include "../../include/pdfwindow/PWL_Edit.h"
+#include "../../include/pdfwindow/PWL_ScrollBar.h"
+#include "../../include/pdfwindow/PWL_Utils.h"
+#include "../../include/pdfwindow/PWL_Caret.h"
+#include "../../include/pdfwindow/PWL_FontMap.h"
+
+/* ---------------------------- CPWL_Edit ------------------------------ */
+
+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(FX_LPCWSTR csText)
+{
+ CFX_WideString swText = csText;
+
+ if (HasFlag(PES_RICH))
+ {
+ CFX_ByteString sValue = CFX_ByteString::FromUnicode(swText);
+
+ if (CXML_Element * pXML = CXML_Element::Parse((FX_LPCSTR)sValue,sValue.GetLength()))
+ {
+ FX_INT32 nCount = pXML->CountChildren();
+ FX_BOOL bFirst = TRUE;
+
+ swText.Empty();
+
+ for (FX_INT32 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(FX_INT32 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);
+}
+
+void CPWL_Edit::RePosChildWnd()
+{
+ if (CPWL_ScrollBar * pVSB = this->GetVScrollBar())
+ {
+ //if (pVSB->IsVisible())
+ {
+ CPDF_Rect rcWindow = m_rcOldWindow;
+ CPDF_Rect rcVScroll = CPDF_Rect(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();
+}
+
+CPDF_Rect CPWL_Edit::GetClientRect() const
+{
+ CPDF_Rect rcClient = CPWL_Utils::DeflateRect(GetWindowRect(),(FX_FLOAT)(GetBorderWidth()+GetInnerBorderWidth()));
+
+ if (CPWL_ScrollBar * pVSB = this->GetVScrollBar())
+ {
+ if (pVSB->IsVisible())
+ {
+ rcClient.right -= PWL_SCROLLBAR_WIDTH;
+ }
+ }
+
+ return rcClient;
+}
+
+void CPWL_Edit::SetAlignFormatH(PWL_EDIT_ALIGNFORMAT_H nFormat, FX_BOOL bPaint/* = TRUE*/)
+{
+ m_pEdit->SetAlignmentH((FX_INT32)nFormat, bPaint);
+}
+
+void CPWL_Edit::SetAlignFormatV(PWL_EDIT_ALIGNFORMAT_V nFormat, FX_BOOL bPaint/* = TRUE*/)
+{
+ m_pEdit->SetAlignmentV((FX_INT32)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(TRUE, GetAttachedData(), 0 , swClipboard, strChangeEx, nSelStart, nSelEnd, TRUE, bRC, bExit, 0);
+ if (!bRC) return;
+ if (bExit) return;
+ }
+
+ if (swClipboard.GetLength() > 0)
+ {
+ Clear();
+ InsertText(swClipboard);
+ }
+
+ if (m_pFillerNotify)
+ {
+ FX_BOOL bExit = FALSE;
+ m_pFillerNotify->OnAfterKeyStroke(TRUE, GetAttachedData(), bExit,0);
+ if (bExit) return;
+ }
+}
+
+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(CPDF_Rect(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);
+
+ CPDF_Rect rcClient = GetClientRect();
+ CFX_ByteTextBuf sLine;
+
+ FX_INT32 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 (FX_INT32 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 (FX_INT32 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;
+
+ CPDF_Point ptOffset = CPDF_Point(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)
+ {
+ CPDF_Rect rcClient = this->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, CPDF_Matrix* pUser2Device)
+{
+ CPWL_Wnd::DrawThisAppearance(pDevice,pUser2Device);
+
+ CPDF_Rect rcClient = GetClientRect();
+ CFX_ByteTextBuf sLine;
+
+ FX_INT32 nCharArray = m_pEdit->GetCharArray();
+
+ if (nCharArray > 0)
+ {
+ switch (GetBorderStyle())
+ {
+ case PBS_SOLID:
+ {
+ CFX_GraphStateData gsd;
+ gsd.m_LineWidth = (FX_FLOAT)GetBorderWidth();
+
+ CFX_PathData path;
+ path.SetPointCount((nCharArray-1)*2);
+
+ for (FX_INT32 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((nCharArray-1)*2);
+
+ for (FX_INT32 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;
+ }
+ }
+
+ CPDF_Rect 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(),this->GetTransparency()),
+ CPWL_Utils::PWLColorToFXColor(GetTextStrokeColor(),this->GetTransparency()),
+ rcClip,CPDF_Point(0.0f,0.0f),pRange, pSysHandler, m_pFormFiller);
+
+ if (HasFlag(PES_SPELLCHECK))
+ {
+ CPWL_Utils::DrawEditSpellCheck(pDevice,pUser2Device,m_pEdit,rcClip,
+ CPDF_Point(0.0f,0.0f),pRange, this->GetCreationParam().pSpellCheck);
+ }
+}
+
+FX_BOOL CPWL_Edit::OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag)
+{
+ CPWL_Wnd::OnLButtonDown(point,nFlag);
+
+ if (HasFlag(PES_TEXTOVERFLOW) || ClientHitTest(point))
+ {
+ if (m_bMouseDown)
+ this->InvalidateRect();
+
+ m_bMouseDown = TRUE;
+ SetCapture();
+
+ m_pEdit->OnMouseDown(point,IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
+ }
+
+ return TRUE;
+}
+
+FX_BOOL CPWL_Edit::OnLButtonDblClk(const CPDF_Point & 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 CPDF_Point & 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;
+
+ this->SetFocus();
+
+ CPVT_WordRange wrLatin = GetLatinWordsRange(point);
+ CFX_WideString swLatin = m_pEdit->GetRangeText(wrLatin);
+
+ FX_HMENU hPopup = pSH->CreatePopupMenu();
+ if (!hPopup) return FALSE;
+
+ CFX_ByteStringArray sSuggestWords;
+ CPDF_Point 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);
+
+ FX_INT32 nSuggest = sSuggestWords.GetSize();
+
+ for (FX_INT32 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 = this->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(this->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);
+ }
+
+ FX_INT32 x, y;
+ PWLtoWnd(ptPopup, x, y);
+ pSH->ClientToScreen(GetAttachedHWnd(), x, y);
+ pSH->SetCursor(FXCT_ARROW);
+ FX_INT32 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:
+ this->CutText();
+ break;
+ case WM_PWLEDIT_COPY:
+ this->CopyText();
+ break;
+ case WM_PWLEDIT_PASTE:
+ this->PasteText();
+ break;
+ case WM_PWLEDIT_DELETE:
+ this->Clear();
+ break;
+ case WM_PWLEDIT_SELECTALL:
+ this->SelectAll();
+ break;
+ case WM_PWLEDIT_SUGGEST + 0:
+ SetSel(m_pEdit->WordPlaceToWordIndex(wrLatin.BeginPos),m_pEdit->WordPlaceToWordIndex(wrLatin.EndPos));
+ ReplaceSel(sSuggestWords[0].UTF8Decode());
+ break;
+ case WM_PWLEDIT_SUGGEST + 1:
+ SetSel(m_pEdit->WordPlaceToWordIndex(wrLatin.BeginPos),m_pEdit->WordPlaceToWordIndex(wrLatin.EndPos));
+ ReplaceSel(sSuggestWords[1].UTF8Decode());
+ break;
+ case WM_PWLEDIT_SUGGEST + 2:
+ SetSel(m_pEdit->WordPlaceToWordIndex(wrLatin.BeginPos),m_pEdit->WordPlaceToWordIndex(wrLatin.EndPos));
+ ReplaceSel(sSuggestWords[2].UTF8Decode());
+ break;
+ case WM_PWLEDIT_SUGGEST + 3:
+ SetSel(m_pEdit->WordPlaceToWordIndex(wrLatin.BeginPos),m_pEdit->WordPlaceToWordIndex(wrLatin.EndPos));
+ ReplaceSel(sSuggestWords[3].UTF8Decode());
+ break;
+ case WM_PWLEDIT_SUGGEST + 4:
+ SetSel(m_pEdit->WordPlaceToWordIndex(wrLatin.BeginPos),m_pEdit->WordPlaceToWordIndex(wrLatin.EndPos));
+ ReplaceSel(sSuggestWords[4].UTF8Decode());
+ 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, CPDF_Point(0.0f,0.0f), CPDF_Point(0.0f,0.0f));
+
+ SetCharSet(0);
+
+ if (!IsReadOnly())
+ {
+ if (IPWL_FocusHandler* pFocusHandler = GetFocusHandler())
+ pFocusHandler->OnKillFocus(this);
+ }
+
+ m_bFocus = FALSE;
+}
+
+void CPWL_Edit::SetHorzScale(FX_INT32 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 CPDF_Point & ptOffset) const
+{
+ CPVT_WordRange wr = GetSelectWordRange();
+ return CPWL_Utils::GetEditSelAppStream(m_pEdit,ptOffset,&wr);
+}
+
+CPVT_WordRange CPWL_Edit::GetSelectWordRange() const
+{
+ if (m_pEdit->IsSelected())
+ {
+ FX_INT32 nStart = -1;
+ FX_INT32 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 CPDF_Point & 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 CPDF_Point & ptOffset) const
+{
+ if (m_pEditCaret)
+ return m_pEditCaret->GetCaretAppearanceStream(ptOffset);
+
+ return CFX_ByteString();
+}
+
+CPDF_Point CPWL_Edit::GetWordRightBottomPoint(const CPVT_WordPlace& wpWord)
+{
+ CPDF_Point 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 = CPDF_Point(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 CPDF_Rect& rcPlate, FX_INT32 nCharArray)
+{
+ if (pFont && !pFont->IsStandardFont())
+ {
+ FX_RECT rcBBox;
+ pFont->GetFontBBox(rcBBox);
+
+ CPDF_Rect 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(FX_INT32 nCharArray)
+{
+ if (HasFlag(PES_CHARARRAY) && nCharArray > 0)
+ {
+ m_pEdit->SetCharArray(nCharArray);
+ m_pEdit->SetTextOverflow(TRUE);
+
+ if (HasFlag(PWS_AUTOFONTSIZE))
+ {
+ if (IFX_Edit_FontMap* pFontMap = this->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(FX_INT32 nLimitChar)
+{
+ m_pEdit->SetLimitChar(nLimitChar);
+}
+
+void CPWL_Edit::ReplaceSel(FX_LPCWSTR csText)
+{
+ m_pEdit->Clear();
+ m_pEdit->InsertText(csText);
+}
+
+CPDF_Rect CPWL_Edit::GetFocusRect() const
+{
+ return CPDF_Rect();
+}
+
+void CPWL_Edit::ShowVScrollBar(FX_BOOL bShow)
+{
+ if (CPWL_ScrollBar * pScroll = GetVScrollBar())
+ {
+ if (bShow)
+ {
+ if (!pScroll->IsVisible())
+ {
+ pScroll->SetVisible(TRUE);
+ CPDF_Rect 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(TRUE, GetAttachedData(), FWL_VKEY_Delete, strChange, strChangeEx, nSelStart, nSelEnd, TRUE, bRC, bExit, nFlag);
+ if (!bRC) return FALSE;
+ if (bExit) return FALSE;
+ }
+ }
+
+ FX_BOOL bRet = CPWL_EditCtrl::OnKeyDown(nChar, nFlag);
+
+ if (nChar == FWL_VKEY_Delete)
+ {
+ if (m_pFillerNotify)
+ {
+ FX_BOOL bExit = FALSE;
+ m_pFillerNotify->OnAfterKeyStroke(TRUE, GetAttachedData(), bExit,nFlag);
+ if (bExit) return FALSE;
+ }
+ }
+
+ //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:
+ break;
+ }
+ 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;
+
+ FX_BOOL bCtrl = IsCTRLpressed(nFlag);
+ if (!bCtrl)
+ {
+ if (m_pFillerNotify)
+ {
+ CFX_WideString swChange;
+ FX_INT32 nKeyCode;
+
+ int nSelStart = 0;
+ int nSelEnd = 0;
+ GetSel(nSelStart, nSelEnd);
+
+ switch (nChar)
+ {
+ case FWL_VKEY_Back:
+ nKeyCode = nChar;
+ if (nSelStart == nSelEnd)
+ nSelStart = nSelEnd - 1;
+ break;
+ case FWL_VKEY_Return:
+ nKeyCode = nChar;
+ break;
+ default:
+ nKeyCode = 0;
+ swChange += nChar;
+ break;
+ }
+
+ CFX_WideString strChangeEx;
+ m_pFillerNotify->OnBeforeKeyStroke(TRUE, GetAttachedData(), nKeyCode, swChange, strChangeEx, nSelStart, nSelEnd, TRUE, bRC, bExit, nFlag);
+ }
+ }
+
+ if (!bRC) return TRUE;
+ if (bExit) return FALSE;
+
+ if (IFX_Edit_FontMap * pFontMap = GetFontMap())
+ {
+ FX_INT32 nOldCharSet = GetCharSet();
+ FX_INT32 nNewCharSet = pFontMap->CharSetFromUnicode(nChar, DEFAULT_CHARSET);
+ if(nOldCharSet != nNewCharSet)
+ {
+ SetCharSet(nNewCharSet);
+ }
+ }
+ FX_BOOL bRet = CPWL_EditCtrl::OnChar(nChar,nFlag);
+
+ if (!bCtrl)
+ {
+ if (m_pFillerNotify)
+ {
+ m_pFillerNotify->OnAfterKeyStroke(TRUE, GetAttachedData(), bExit,nFlag);
+ if (bExit) return FALSE;
+ }
+ }
+
+ return bRet;
+}
+
+FX_BOOL CPWL_Edit::OnMouseWheel(short zDelta, const CPDF_Point & point, FX_DWORD nFlag)
+{
+ if (HasFlag(PES_MULTILINE))
+ {
+ CPDF_Point ptScroll = GetScrollPos();
+
+ if (zDelta > 0)
+ {
+ ptScroll.y += this->GetFontSize();
+ }
+ else
+ {
+ ptScroll.y -= this->GetFontSize();
+ }
+ this->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 CPDF_Point& 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))
+ {
+ wpEnd = pIterator->GetAt();
+ continue;
+ }
+ else
+ break;
+ };
+ }
+ else if (bArabic)
+ {
+ while (pIterator->NextWord())
+ {
+ if (pIterator->GetWord(wordinfo) && PWL_ISARABICWORD(wordinfo.Word))
+ {
+ wpEnd = pIterator->GetAt();
+ continue;
+ }
+ else
+ break;
+ };
+ }
+
+ pIterator->SetAt(place);
+
+ if (bLatin)
+ {
+ do
+ {
+ if (pIterator->GetWord(wordinfo) && FX_EDIT_ISLATINWORD(wordinfo.Word))
+ {
+ continue;
+ }
+ else
+ {
+ wpStart = pIterator->GetAt();
+ break;
+ }
+ }
+ while (pIterator->PrevWord());
+ }
+ else if (bArabic)
+ {
+ do
+ {
+ if (pIterator->GetWord(wordinfo) && PWL_ISARABICWORD(wordinfo.Word))
+ {
+ continue;
+ }
+ else
+ {
+ wpStart = pIterator->GetAt();
+ break;
+ }
+ }
+ while (pIterator->PrevWord());
+ }
+
+ range.Set(wpStart,wpEnd);
+ }
+
+ return range;
+}
+
+void CPWL_Edit::AjustArabicWords(const CPVT_WordRange& wr)
+{
+}
+
+void CPWL_Edit::GeneratePageObjects(CPDF_PageObjects* pPageObjects,
+ const CPDF_Point& ptOffset, CFX_ArrayTemplate<CPDF_TextObject*>& ObjArray)
+{
+ IFX_Edit::GeneratePageObjects(pPageObjects, m_pEdit, ptOffset, NULL, CPWL_Utils::PWLColorToFXColor(GetTextColor(),GetTransparency()), ObjArray);
+}
+
+void CPWL_Edit::GeneratePageObjects(CPDF_PageObjects* pPageObjects,
+ const CPDF_Point& ptOffset)
+{
+ CFX_ArrayTemplate<CPDF_TextObject*> ObjArray;
+ IFX_Edit::GeneratePageObjects(pPageObjects, 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 new file mode 100644 index 0000000000..25628223ec --- /dev/null +++ b/fpdfsdk/src/pdfwindow/PWL_EditCtrl.cpp @@ -0,0 +1,728 @@ +// 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 "../../include/pdfwindow/PDFWindow.h"
+#include "../../include/pdfwindow/PWL_Wnd.h"
+#include "../../include/pdfwindow/PWL_EditCtrl.h"
+#include "../../include/pdfwindow/PWL_ScrollBar.h"
+#include "../../include/pdfwindow/PWL_Utils.h"
+#include "../../include/pdfwindow/PWL_Caret.h"
+#include "../../include/pdfwindow/PWL_FontMap.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::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 != NULL);
+}
+
+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(this->GetCreationParam().fFontSize);
+
+ m_pEdit->SetFontMap(this->GetFontMap());
+ m_pEdit->SetNotify(this);
+ m_pEdit->Initialize();
+}
+
+FX_BOOL CPWL_EditCtrl::IsWndHorV()
+{
+ CPDF_Matrix mt = GetWindowMatrix();
+ CPDF_Point point1(0,1);
+ CPDF_Point 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, FX_INTPTR wParam, FX_INTPTR 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(CPDF_Point(m_pEdit->GetScrollPos().x,fPos));
+ break;
+ }
+ }
+ break;
+ case PNM_SETCARETINFO:
+ {
+ if (PWL_CARET_INFO * pCaretInfo = (PWL_CARET_INFO *)wParam)
+ {
+ this->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 = CPDF_Rect(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:
+ this->CopyText();
+ return TRUE;
+ case 'V' - 'A' + 1:
+ this->PasteText();
+ return TRUE;
+ case 'X' - 'A' + 1:
+ this->CutText();
+ return TRUE;
+ case 'A' - 'A' + 1:
+ this->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, this->GetCharSet());
+ break;
+ }
+
+ return TRUE;
+}
+
+FX_BOOL CPWL_EditCtrl::OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag)
+{
+ CPWL_Wnd::OnLButtonDown(point,nFlag);
+
+ if (ClientHitTest(point))
+ {
+ if (m_bMouseDown)
+ this->InvalidateRect();
+
+ m_bMouseDown = TRUE;
+ SetCapture();
+
+ m_pEdit->OnMouseDown(point,IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
+ }
+
+ return TRUE;
+}
+
+FX_BOOL CPWL_EditCtrl::OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag)
+{
+ CPWL_Wnd::OnLButtonUp(point,nFlag);
+
+ if (m_bMouseDown)
+ {
+ //can receive keybord message
+ if (ClientHitTest(point) && !this->IsFocused())
+ SetFocus();
+
+ ReleaseCapture();
+ m_bMouseDown = FALSE;
+ }
+
+ return TRUE;
+}
+
+FX_BOOL CPWL_EditCtrl::OnMouseMove(const CPDF_Point & point, FX_DWORD nFlag)
+{
+ CPWL_Wnd::OnMouseMove(point,nFlag);
+
+ if (m_bMouseDown)
+ m_pEdit->OnMouseMove(point,FALSE,FALSE);
+
+ return TRUE;
+}
+
+CPDF_Rect CPWL_EditCtrl::GetContentRect() const
+{
+ return m_pEdit->GetContentRect();
+}
+
+void CPWL_EditCtrl::SetEditCaret(FX_BOOL bVisible)
+{
+ CPDF_Point ptHead(0,0),ptFoot(0,0);
+
+ if (bVisible)
+ {
+ GetCaretInfo(ptHead,ptFoot);
+ }
+
+ CPVT_WordPlace wpTemp = m_pEdit->GetCaretWordPlace();
+ this->IOnSetCaret(bVisible,ptHead,ptFoot,wpTemp);
+}
+
+void CPWL_EditCtrl::GetCaretInfo(CPDF_Point & ptHead, CPDF_Point & 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(FX_INT32& x, FX_INT32& y) const
+{
+ CPDF_Point ptHead(0,0), ptFoot(0,0);
+
+ GetCaretInfo(ptHead,ptFoot);
+
+ PWLtoWnd(ptHead, x, y);
+}
+
+void CPWL_EditCtrl::SetCaret(FX_BOOL bVisible, const CPDF_Point & ptHead, const CPDF_Point & ptFoot)
+{
+ if (m_pEditCaret)
+ {
+ if (!IsFocused() || m_pEdit->IsSelected())
+ bVisible = FALSE;
+
+ m_pEditCaret->SetCaret(bVisible, ptHead, ptFoot);
+ }
+}
+
+FX_BOOL CPWL_EditCtrl::IsModified() const
+{
+ return m_pEdit->IsModified();
+}
+
+CFX_WideString CPWL_EditCtrl::GetText() const
+{
+ return m_pEdit->GetText();
+}
+
+void CPWL_EditCtrl::SetSel(FX_INT32 nStartChar,FX_INT32 nEndChar)
+{
+ m_pEdit->SetSel(nStartChar, nEndChar);
+}
+
+void CPWL_EditCtrl::GetSel(FX_INT32 & nStartChar, FX_INT32 & 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);
+}
+
+FX_INT32 CPWL_EditCtrl::GetCaret() const
+{
+ if (m_pEdit)
+ return m_pEdit->GetCaret();
+
+ return -1;
+}
+
+void CPWL_EditCtrl::SetCaret(FX_INT32 nPos)
+{
+ if (m_pEdit)
+ m_pEdit->SetCaret(nPos);
+}
+
+FX_INT32 CPWL_EditCtrl::GetTotalWords() const
+{
+ if (m_pEdit)
+ return m_pEdit->GetTotalWords();
+
+ return 0;
+}
+
+void CPWL_EditCtrl::SetScrollPos(const CPDF_Point& point)
+{
+ if (m_pEdit)
+ m_pEdit->SetScrollPos(point);
+}
+
+CPDF_Point CPWL_EditCtrl::GetScrollPos() const
+{
+ if (m_pEdit)
+ return m_pEdit->GetScrollPos();
+
+ return CPDF_Point(0.0f, 0.0f);
+}
+
+CPDF_Font * CPWL_EditCtrl::GetCaretFont() const
+{
+ FX_INT32 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);
+ else
+ 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(FX_LPCWSTR 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(FX_LPCWSTR csText)
+{
+ if (!IsReadOnly())
+ m_pEdit->InsertText(csText);
+}
+
+void CPWL_EditCtrl::InsertWord(FX_WORD word, FX_INT32 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;
+
+ this->OnNotify(this,PNM_SETSCROLLINFO,SBT_VSCROLL,(FX_INTPTR)&Info);
+
+// PWL_TRACE("set scroll info:%f\n",fContentMax - fContentMin);
+
+ if (IsFloatBigger(Info.fPlateWidth,Info.fContentMax-Info.fContentMin)
+ || IsFloatEqual(Info.fPlateWidth,Info.fContentMax-Info.fContentMin))
+ {
+ this->ShowVScrollBar(FALSE);
+ }
+ else
+ {
+ this->ShowVScrollBar(TRUE);
+ }
+}
+
+void CPWL_EditCtrl::IOnSetScrollPosY(FX_FLOAT fy)
+{
+// PWL_TRACE("set scroll position:%f\n",fy);
+ this->OnNotify(this,PNM_SETSCROLLPOS,SBT_VSCROLL,(FX_INTPTR)&fy);
+}
+
+void CPWL_EditCtrl::IOnSetCaret(FX_BOOL bVisible, const CPDF_Point & ptHead, const CPDF_Point & ptFoot, const CPVT_WordPlace& place)
+{
+ PWL_CARET_INFO cInfo;
+ cInfo.bVisible = bVisible;
+ cInfo.ptHead = ptHead;
+ cInfo.ptFoot = ptFoot;
+
+ this->OnNotify(this,PNM_SETCARETINFO,(FX_INTPTR)&cInfo,(FX_INTPTR)NULL);
+}
+
+void CPWL_EditCtrl::IOnCaretChange(const CPVT_SecProps & secProps, const CPVT_WordProps & wordProps)
+{
+}
+
+void CPWL_EditCtrl::IOnContentChange(const CPDF_Rect& rcContent)
+{
+ if (this->IsValid())
+ {
+ if (m_pEditNotify)
+ {
+ m_pEditNotify->OnContentChange(rcContent);
+ }
+ }
+}
+
+void CPWL_EditCtrl::IOnInvalidateRect(CPDF_Rect * pRect)
+{
+ this->InvalidateRect(pRect);
+}
+
+FX_INT32 CPWL_EditCtrl::GetCharSet() const
+{
+ if (m_nCharSet < 0)
+ return DEFAULT_CHARSET;
+ else
+ return m_nCharSet;
+}
+
+void CPWL_EditCtrl::GetTextRange(const CPDF_Rect& rect, FX_INT32 & nStartChar, FX_INT32 & nEndChar) const
+{
+ nStartChar = m_pEdit->WordPlaceToWordIndex(m_pEdit->SearchWordPlace(CPDF_Point(rect.left, rect.top)));
+ nEndChar = m_pEdit->WordPlaceToWordIndex(m_pEdit->SearchWordPlace(CPDF_Point(rect.right, rect.bottom)));
+}
+
+CFX_WideString CPWL_EditCtrl::GetText(FX_INT32 & nStartChar, FX_INT32 & 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 new file mode 100644 index 0000000000..1e2259fe50 --- /dev/null +++ b/fpdfsdk/src/pdfwindow/PWL_FontMap.cpp @@ -0,0 +1,601 @@ +// 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 "../../include/pdfwindow/PDFWindow.h"
+#include "../../include/pdfwindow/PWL_Wnd.h"
+#include "../../include/pdfwindow/PWL_FontMap.h"
+
+#define DEFAULT_FONT_NAME "Helvetica"
+
+/* ------------------------------ CPWL_FontMap ------------------------------ */
+
+CPWL_FontMap::CPWL_FontMap(IFX_SystemHandler* pSystemHandler) :
+ m_pPDFDoc(NULL),
+ m_pSystemHandler(pSystemHandler)
+{
+ ASSERT(m_pSystemHandler != NULL);
+}
+
+CPWL_FontMap::~CPWL_FontMap()
+{
+ if (m_pPDFDoc)
+ {
+ 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 = FX_NEW CPDF_Document;
+ m_pPDFDoc->CreateNewDoc();
+ }
+ }
+
+ return m_pPDFDoc;
+}
+
+CPDF_Font* CPWL_FontMap::GetPDFFont(FX_INT32 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(FX_INT32 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(FX_INT32 nFontIndex, FX_WORD word)
+{
+ if (nFontIndex >=0 && nFontIndex < m_aData.GetSize())
+ {
+ if (m_aData.GetAt(nFontIndex))
+ {
+ return CharCodeFromUnicode(nFontIndex, word) >= 0;
+ }
+ }
+
+ return FALSE;
+}
+
+FX_INT32 CPWL_FontMap::GetWordFontIndex(FX_WORD word, FX_INT32 nCharset, FX_INT32 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;
+ }
+ }
+ }
+ }
+
+ FX_INT32 nNewFontIndex = -1;
+
+ nNewFontIndex = this->GetFontIndex(GetNativeFontName(nCharset), nCharset, TRUE);
+ if (nNewFontIndex >= 0)
+ {
+ if (KnowWord(nNewFontIndex, word))
+ return nNewFontIndex;
+ }
+
+ nNewFontIndex = this->GetFontIndex("Arial Unicode MS", DEFAULT_CHARSET, FALSE);
+ if (nNewFontIndex >= 0)
+ {
+ if (KnowWord(nNewFontIndex, word))
+ return nNewFontIndex;
+ }
+
+ return -1;
+}
+
+FX_INT32 CPWL_FontMap::CharCodeFromUnicode(FX_INT32 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;
+ }
+ else
+ {
+ if (word < 0xFF)
+ return word;
+ }
+ }
+ }
+
+ return -1;
+}
+
+CFX_ByteString CPWL_FontMap::GetNativeFontName(FX_INT32 nCharset)
+{
+ //searching native font is slow, so we must save time
+ for (FX_INT32 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 (FX_INT32 i=0, sz=m_aData.GetSize(); i<sz; i++)
+ delete m_aData.GetAt(i);
+
+ m_aData.RemoveAll();
+ }
+ {
+ for (FX_INT32 i=0, sz=m_aNativeFont.GetSize(); i<sz; i++)
+ delete m_aNativeFont.GetAt(i);
+
+ m_aNativeFont.RemoveAll();
+ }
+}
+
+void CPWL_FontMap::Initial(FX_LPCSTR fontname)
+{
+ CFX_ByteString sFontName = fontname;
+
+ if (sFontName.IsEmpty())
+ sFontName = DEFAULT_FONT_NAME;
+
+ GetFontIndex(sFontName, ANSI_CHARSET, FALSE);
+
+ //GetFontIndex(this->GetNativeFontName(nCharset), nCharset);
+}
+
+
+/*
+List of currently supported standard fonts:
+Courier, Courier-Bold, Courier-BoldOblique, Courier-Oblique
+Helvetica, Helvetica-Bold, Helvetica-BoldOblique, Helvetica-Oblique
+Times-Roman, Times-Bold, Times-Italic, Times-BoldItalic
+Symbol, ZapfDingbats
+*/
+
+const char* 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"};
+
+FX_BOOL CPWL_FontMap::IsStandardFont(const CFX_ByteString& sFontName)
+{
+ for (FX_INT32 i=0; i<14; i++)
+ {
+ if (sFontName == g_sDEStandardFontName[i])
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+FX_INT32 CPWL_FontMap::FindFont(const CFX_ByteString& sFontName, FX_INT32 nCharset)
+{
+ for (FX_INT32 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;
+}
+
+FX_INT32 CPWL_FontMap::GetFontIndex(const CFX_ByteString& sFontName, FX_INT32 nCharset, FX_BOOL bFind)
+{
+ FX_INT32 nFontIndex = FindFont(EncodeFontAlias(sFontName, nCharset), nCharset);
+ if (nFontIndex >= 0) return nFontIndex;
+
+// nFontIndex = FindFont("", 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);
+
+ /*
+ if (FindFont(sAlias))
+ {
+ sAlias = EncodeFontAlias(sTemp, nCharset);
+ }
+ else
+ */
+ {
+ sAlias = EncodeFontAlias(sTemp, nCharset);
+ }
+ }
+
+ AddedFont(pFont, sAlias);
+
+ return AddFontData(pFont, sAlias, nCharset);
+}
+
+FX_INT32 CPWL_FontMap::GetPWLFontIndex(FX_WORD word, FX_INT32 nCharset)
+{
+ FX_INT32 nFind = -1;
+
+ for (FX_INT32 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;
+
+ /*
+ if (CPDF_Font* pFont = GetPDFFont(nFind))
+ {
+ PWLFont.AddWordToFontDict(pFontDict, word);
+ }
+ */
+
+#ifdef FOXIT_CHROME_BUILD
+ CFX_ByteString sAlias = EncodeFontAlias("Arial_Chrome", nCharset);
+#else
+ CFX_ByteString sAlias = EncodeFontAlias("Arial_Foxit", nCharset);
+#endif
+ AddedFont(pNewFont, sAlias);
+
+ return AddFontData(pNewFont, sAlias, nCharset);
+}
+
+CPDF_Font* CPWL_FontMap::FindFontSameCharset(CFX_ByteString& sFontAlias, FX_INT32 nCharset)
+{
+ return NULL;
+}
+
+FX_INT32 CPWL_FontMap::AddFontData(CPDF_Font* pFont, const CFX_ByteString& sFontAlias, FX_INT32 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(FX_INT32 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(FX_INT32 nCharset)
+{
+ CFX_ByteString sFontName;
+
+ if (nCharset == DEFAULT_CHARSET)
+ nCharset = GetNativeCharset();
+
+ 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, FX_BYTE nCharset)
+{
+ if (IsStandardFont(sFontName))
+ return AddStandardFont(pDoc, sFontName);
+ else
+ 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, FX_BYTE 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, FX_INT32 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;
+}
+
+FX_INT32 CPWL_FontMap::GetFontMapCount() const
+{
+ return m_aData.GetSize();
+}
+
+const CPWL_FontMap_Data* CPWL_FontMap::GetFontMapData(FX_INT32 nIndex) const
+{
+ if (nIndex >=0 && nIndex < m_aData.GetSize())
+ {
+ return m_aData.GetAt(nIndex);
+ }
+
+ return NULL;
+}
+
+FX_INT32 CPWL_FontMap::GetNativeCharset()
+{
+ FX_BYTE nCharset = ANSI_CHARSET;
+ FX_INT32 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" },
+ { EASTEUROPE_CHARSET, "Tahoma" },
+ { ARABIC_CHARSET, "Arial" },
+ { -1, NULL }
+};
+
+CFX_ByteString CPWL_FontMap::GetDefaultFontByCharset(FX_INT32 nCharset)
+{
+ int i = 0;
+ while (defaultTTFMap[i].charset != -1) {
+ if (nCharset == defaultTTFMap[i].charset)
+ return defaultTTFMap[i].fontname;
+ ++i;
+ }
+ return "";
+}
+
+FX_INT32 CPWL_FontMap::CharSetFromUnicode(FX_WORD word, FX_INT32 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::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 new file mode 100644 index 0000000000..a859a52de7 --- /dev/null +++ b/fpdfsdk/src/pdfwindow/PWL_Icon.cpp @@ -0,0 +1,272 @@ +// 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 "../../include/pdfwindow/PDFWindow.h"
+#include "../../include/pdfwindow/PWL_Wnd.h"
+#include "../../include/pdfwindow/PWL_Icon.h"
+#include "../../include/pdfwindow/PWL_Utils.h"
+
+/* ------------------------------- CPWL_Image ---------------------------------- */
+
+CPWL_Image::CPWL_Image() : m_pPDFStream(NULL)
+{
+}
+
+CPWL_Image::~CPWL_Image()
+{
+}
+
+CFX_ByteString CPWL_Image::GetImageAppStream()
+{
+ CFX_ByteTextBuf sAppStream;
+
+ CFX_ByteString sAlias = this->GetImageAlias();
+ CPDF_Rect rcPlate = GetClientRect();
+ CPDF_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 this->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())
+ {
+ CPDF_Rect rect = pDict->GetRect("BBox");
+
+ fWidth = rect.right - rect.left;
+ fHeight = rect.top - rect.bottom;
+ }
+ }
+}
+
+CPDF_Matrix CPWL_Image::GetImageMatrix()
+{
+ if (m_pPDFStream)
+ {
+ if (CPDF_Dictionary * pDict = m_pPDFStream->GetDict())
+ {
+ return pDict->GetMatrix("Matrix");
+ }
+ }
+
+ return CPDF_Matrix();
+}
+
+CFX_ByteString CPWL_Image::GetImageAlias()
+{
+ if (m_sImageAlias.IsEmpty())
+ {
+ if (m_pPDFStream)
+ {
+ if (CPDF_Dictionary * pDict = m_pPDFStream->GetDict())
+ {
+ return pDict->GetString("Name");
+ }
+ }
+ }
+ else
+ return m_sImageAlias;
+
+ return CFX_ByteString();
+}
+
+void CPWL_Image::SetImageAlias(FX_LPCSTR 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::CPWL_Icon() : m_pIconFit(NULL)
+{
+}
+
+CPWL_Icon::~CPWL_Icon()
+{
+}
+
+FX_INT32 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)
+ {
+ //m_pIconFit->GetIconPosition(fLeft,fBottom);
+ fLeft = 0.0f;
+ fBottom = 0.0f;
+ CPDF_Array* pA = m_pIconFit->m_pDict->GetArray("A");
+ if (pA != NULL)
+ {
+ FX_DWORD dwCount = pA->GetCount();
+ if (dwCount > 0) fLeft = pA->GetNumber(0);
+ if (dwCount > 1) fBottom = pA->GetNumber(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;
+
+ CPDF_Rect rcPlate = this->GetClientRect();
+ fPlateWidth = rcPlate.right - rcPlate.left;
+ fPlateHeight = rcPlate.top - rcPlate.bottom;
+
+ GetImageSize(fImageWidth,fImageHeight);
+
+ FX_INT32 nScaleMethod = this->GetScaleMethod();
+
+ /*
+ enum ScaleMethod
+ {
+ Always = 0, //A, Always scale
+ Bigger, //B, Scale only when the icon is bigger than the annotation rectangle
+ Smaller, //S, Scale only when the icon is smaller then the annotation rectangle
+ Never //N, Never scale
+ };
+ */
+
+ 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;
+
+ this->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;
+ CPDF_Rect rcPlate = this->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 new file mode 100644 index 0000000000..09b66786db --- /dev/null +++ b/fpdfsdk/src/pdfwindow/PWL_IconList.cpp @@ -0,0 +1,592 @@ +// 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 "../../include/pdfwindow/PDFWindow.h"
+#include "../../include/pdfwindow/PWL_Wnd.h"
+#include "../../include/pdfwindow/PWL_ListCtrl.h"
+#include "../../include/pdfwindow/PWL_IconList.h"
+#include "../../include/pdfwindow/PWL_Utils.h"
+#include "../../include/pdfwindow/PWL_ScrollBar.h"
+#include "../../include/pdfwindow/PWL_Label.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::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, CPDF_Matrix* pUser2Device)
+{
+ CPDF_Rect rcClient = GetClientRect();
+
+ if (m_bSelected)
+ {
+ if (this->IsEnabled())
+ {
+ CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcClient,
+ CPWL_Utils::PWLColorToFXColor(PWL_DEFAULT_SELBACKCOLOR,this->GetTransparency()));
+ }
+ else
+ {
+ CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcClient,
+ CPWL_Utils::PWLColorToFXColor(PWL_DEFAULT_LIGHTGRAYCOLOR,this->GetTransparency()));
+ }
+ }
+
+ CPDF_Rect 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(), this->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(FX_INT32 nIconIndex)
+{
+ m_nIconIndex = nIconIndex;
+}
+
+void CPWL_IconList_Item::SetText(const CFX_WideString& str)
+{
+ m_pText->SetText(str);
+}
+
+CFX_WideString CPWL_IconList_Item::GetText() const
+{
+ return m_pText->GetText();
+}
+
+void CPWL_IconList_Item::RePosChildWnd()
+{
+ CPDF_Rect 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);
+
+ this->InvalidateRect();
+}
+
+void CPWL_IconList_Item::OnDisabled()
+{
+ m_pText->SetTextColor(PWL_DEFAULT_HEAVYGRAYCOLOR);
+
+ this->InvalidateRect();
+}
+
+/* ----------------- CPWL_IconList_Content ----------------- */
+
+CPWL_IconList_Content::CPWL_IconList_Content(FX_INT32 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 (FX_INT32 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);
+ }
+
+ this->SetItemSpace(PWL_IconList_ITEM_SPACE);
+ this->ResetContent(0);
+
+ if (CPWL_Wnd * pParent = this->GetParentWindow())
+ {
+ CPDF_Rect rcScroll = this->GetScrollArea();
+ this->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, (FX_INTPTR)&sInfo);
+ }
+}
+
+FX_BOOL CPWL_IconList_Content::OnLButtonDown(const CPDF_Point & point)
+{
+ SetFocus();
+
+ SetCapture();
+ m_bMouseDown = TRUE;
+
+ FX_INT32 nItemIndex = FindItemIndex(point);
+ SetSelect(nItemIndex);
+ ScrollToItem(nItemIndex);
+
+ return TRUE;
+}
+
+FX_BOOL CPWL_IconList_Content::OnLButtonUp(const CPDF_Point & point)
+{
+ m_bMouseDown = FALSE;
+ ReleaseCapture();
+
+ return TRUE;
+}
+
+FX_BOOL CPWL_IconList_Content::OnMouseMove(const CPDF_Point & point)
+{
+ if (m_bMouseDown)
+ {
+ FX_INT32 nItemIndex = FindItemIndex(point);
+ SetSelect(nItemIndex);
+ ScrollToItem(nItemIndex);
+ }
+
+ return TRUE;
+}
+
+FX_BOOL CPWL_IconList_Content::OnKeyDown(FX_WORD nChar)
+{
+ switch (nChar)
+ {
+ case FWL_VKEY_Up:
+ if (m_nSelectIndex > 0)
+ {
+ FX_INT32 nItemIndex = m_nSelectIndex - 1;
+ SetSelect(nItemIndex);
+ ScrollToItem(nItemIndex);
+ }
+ return TRUE;
+ case FWL_VKEY_Down:
+ if (m_nSelectIndex < m_nListCount-1)
+ {
+ FX_INT32 nItemIndex = m_nSelectIndex + 1;
+ SetSelect(nItemIndex);
+ ScrollToItem(nItemIndex);
+ }
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+FX_INT32 CPWL_IconList_Content::FindItemIndex(const CPDF_Point& point)
+{
+ FX_INT32 nIndex = 0;
+ for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)
+ {
+ if (CPWL_Wnd * pChild = m_aChildren.GetAt(i))
+ {
+ CPDF_Rect rcWnd = pChild->ChildToParent(pChild->GetWindowRect());
+
+ if (point.y < rcWnd.top)
+ {
+ nIndex = i;
+ }
+ }
+ }
+
+ return nIndex;
+}
+
+void CPWL_IconList_Content::ScrollToItem(FX_INT32 nItemIndex)
+{
+ CPDF_Rect rcClient = GetClientRect();
+
+ if (CPWL_IconList_Item* pItem = GetListItem(nItemIndex))
+ {
+ CPDF_Rect rcOrigin = pItem->GetWindowRect();
+ CPDF_Rect rcWnd = pItem->ChildToParent(rcOrigin);
+
+ if (!(rcWnd.bottom > rcClient.bottom && rcWnd.top < rcClient.top))
+ {
+ CPDF_Point ptScroll = GetScrollPos();
+
+ if (rcWnd.top > rcClient.top)
+ {
+ ptScroll.y = rcOrigin.top;
+ }
+ else if (rcWnd.bottom < rcClient.bottom)
+ {
+ ptScroll.y = rcOrigin.bottom + rcClient.Height();
+ }
+
+ this->SetScrollPos(ptScroll);
+ this->ResetFace();
+ this->InvalidateRect();
+ if (CPWL_Wnd* pParent = this->GetParentWindow())
+ {
+ pParent->OnNotify(this, PNM_SETSCROLLPOS, SBT_VSCROLL, (FX_INTPTR)&ptScroll.y);
+ }
+ }
+ }
+}
+
+void CPWL_IconList_Content::SetSelect(FX_INT32 nIndex)
+{
+ if (m_nSelectIndex != nIndex)
+ {
+ SelectItem(m_nSelectIndex, FALSE);
+ SelectItem(nIndex, TRUE);
+ m_nSelectIndex = nIndex;
+
+ if (IPWL_IconList_Notify* pNotify = GetNotify())
+ pNotify->OnNoteListSelChanged(nIndex);
+ }
+}
+
+FX_INT32 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(FX_INT32 nItemIndex, FX_BOOL bSelect)
+{
+ if (CPWL_IconList_Item* pItem = GetListItem(nItemIndex))
+ {
+ pItem->SetSelect(bSelect);
+ pItem->InvalidateRect();
+ }
+}
+
+CPWL_IconList_Item* CPWL_IconList_Content::GetListItem(FX_INT32 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(FX_INT32 nItemIndex, void* pData)
+{
+ if (CPWL_IconList_Item* pItem = GetListItem(nItemIndex))
+ pItem->SetData(pData);
+}
+
+void CPWL_IconList_Content::SetListIcon(FX_INT32 nItemIndex, FX_INT32 nIconIndex)
+{
+ if (CPWL_IconList_Item* pItem = GetListItem(nItemIndex))
+ pItem->SetIcon(nIconIndex);
+}
+
+void CPWL_IconList_Content::SetListString(FX_INT32 nItemIndex, const CFX_WideString& str)
+{
+ if (CPWL_IconList_Item* pItem = GetListItem(nItemIndex))
+ pItem->SetText(str);
+}
+
+CFX_WideString CPWL_IconList_Content::GetListString(FX_INT32 nItemIndex) const
+{
+ if (CPWL_IconList_Item* pItem = GetListItem(nItemIndex))
+ return pItem->GetText();
+
+ return L"";
+}
+
+void CPWL_IconList_Content::SetIconFillColor(const CPWL_Color& color)
+{
+ for (FX_INT32 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::CPWL_IconList(FX_INT32 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 = this->GetVScrollBar())
+ {
+ pScrollBar->RemoveFlag(PWS_AUTOTRANSPARENT);
+ pScrollBar->SetTransparency(255);
+ pScrollBar->SetNotifyForever(TRUE);
+ }
+}
+
+void CPWL_IconList::OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam, FX_INTPTR 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 = this->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(CPDF_Point(0.0f,0.0f));
+ }
+
+ pScrollBar->OnNotify(pWnd,PNM_SETSCROLLINFO,wParam,lParam);
+ }
+ }
+ return;
+ case PNM_SCROLLWINDOW:
+ if (m_pListContent)
+ {
+ m_pListContent->SetScrollPos(CPDF_Point(0.0f, *(FX_FLOAT*)lParam));
+ m_pListContent->ResetFace();
+ m_pListContent->InvalidateRect(NULL);
+ }
+ return;
+ case PNM_SETSCROLLPOS:
+ if (CPWL_ScrollBar* pScrollBar = this->GetVScrollBar())
+ pScrollBar->OnNotify(pWnd,PNM_SETSCROLLPOS,wParam,lParam);
+ return;
+ }
+ }
+}
+
+void CPWL_IconList::SetSelect(FX_INT32 nIndex)
+{
+ m_pListContent->SetSelect(nIndex);
+}
+
+void CPWL_IconList::SetTopItem(FX_INT32 nIndex)
+{
+ m_pListContent->ScrollToItem(nIndex);
+}
+
+FX_INT32 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(FX_INT32 nItemIndex, void* pData)
+{
+ m_pListContent->SetListData(nItemIndex, pData);
+}
+
+void CPWL_IconList::SetListIcon(FX_INT32 nItemIndex, FX_INT32 nIconIndex)
+{
+ m_pListContent->SetListIcon(nItemIndex, nIconIndex);
+}
+
+void CPWL_IconList::SetListString(FX_INT32 nItemIndex, const CFX_WideString& str)
+{
+ m_pListContent->SetListString(nItemIndex, str);
+}
+
+CFX_WideString CPWL_IconList::GetListString(FX_INT32 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 CPDF_Point & point)
+{
+ CPDF_Point ptScroll = m_pListContent->GetScrollPos();
+ CPDF_Rect rcScroll = m_pListContent->GetScrollArea();
+ CPDF_Rect rcContents = m_pListContent->GetClientRect();
+
+ if (rcScroll.top - rcScroll.bottom > rcContents.Height())
+ {
+ CPDF_Point 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 = this->GetVScrollBar())
+ pScrollBar->OnNotify(this, PNM_SETSCROLLPOS, SBT_VSCROLL, (FX_INTPTR)&ptNew.y);
+
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
diff --git a/fpdfsdk/src/pdfwindow/PWL_Label.cpp b/fpdfsdk/src/pdfwindow/PWL_Label.cpp new file mode 100644 index 0000000000..e1b8522248 --- /dev/null +++ b/fpdfsdk/src/pdfwindow/PWL_Label.cpp @@ -0,0 +1,187 @@ +// 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 "../../include/pdfwindow/PDFWindow.h"
+#include "../../include/pdfwindow/PWL_Wnd.h"
+#include "../../include/pdfwindow/PWL_Label.h"
+#include "../../include/pdfwindow/PWL_Utils.h"
+
+/* ---------------------------- CPWL_Label ------------------------------ */
+
+CPWL_Label::CPWL_Label() : m_pEdit(NULL)
+{
+ m_pEdit = IFX_Edit::NewEdit();
+
+ ASSERT(m_pEdit != NULL);
+}
+
+CPWL_Label::~CPWL_Label()
+{
+ IFX_Edit::DelEdit(m_pEdit);
+}
+
+CFX_ByteString CPWL_Label::GetClassName() const
+{
+ return "CPWL_Label";
+}
+
+void CPWL_Label::OnCreated()
+{
+ SetParamByFlag();
+ SetFontSize(this->GetCreationParam().fFontSize);
+
+ m_pEdit->SetFontMap(this->GetFontMap());
+ m_pEdit->Initialize();
+
+ if (HasFlag(PES_TEXTOVERFLOW))
+ {
+ SetClipRect(CPDF_Rect(0.0f,0.0f,0.0f,0.0f));
+ m_pEdit->SetTextOverflow(TRUE);
+ }
+}
+
+void CPWL_Label::SetText(FX_LPCWSTR 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, CPDF_Matrix* pUser2Device)
+{
+ CPWL_Wnd::DrawThisAppearance(pDevice,pUser2Device);
+
+ GetClientRect();
+
+ CPDF_Rect 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(), this->GetTransparency()),
+ CPWL_Utils::PWLColorToFXColor(GetTextStrokeColor(), this->GetTransparency()),
+ rcClip, CPDF_Point(0.0f,0.0f), pRange,pSysHandler, NULL);
+}
+
+void CPWL_Label::SetHorzScale(FX_INT32 nHorzScale)
+{
+ m_pEdit->SetHorzScale(nHorzScale);
+}
+
+void CPWL_Label::SetCharSpace(FX_FLOAT fCharSpace)
+{
+ m_pEdit->SetCharSpace(fCharSpace);
+}
+
+CPDF_Rect CPWL_Label::GetContentRect() const
+{
+ return m_pEdit->GetContentRect();
+}
+
+void CPWL_Label::GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream)
+{
+ CPWL_Wnd::GetThisAppearanceStream(sAppStream);
+
+ sAppStream << GetTextAppearanceStream(CPDF_Point(0.0f, 0.0f));
+}
+
+CFX_ByteString CPWL_Label::GetTextAppearanceStream(const CPDF_Point & 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(FX_INT32 nLimitChar)
+{
+ m_pEdit->SetLimitChar(nLimitChar);
+}
+
+FX_INT32 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 new file mode 100644 index 0000000000..951ed93f79 --- /dev/null +++ b/fpdfsdk/src/pdfwindow/PWL_ListBox.cpp @@ -0,0 +1,632 @@ +// 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 "../../include/pdfwindow/PDFWindow.h"
+#include "../../include/pdfwindow/PWL_Wnd.h"
+#include "../../include/pdfwindow/PWL_ListBox.h"
+#include "../../include/pdfwindow/PWL_Utils.h"
+#include "../../include/pdfwindow/PWL_ScrollBar.h"
+#include "../../include/pdfwindow/PWL_EditCtrl.h"
+#include "../../include/pdfwindow/PWL_Edit.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_List_Notify(CPWL_ListBox* pList) : m_pList(pList)
+{
+ ASSERT(m_pList != NULL);
+}
+
+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,(FX_INTPTR)&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,(FX_INTPTR)&fy);
+}
+
+void CPWL_List_Notify::IOnInvalidateRect(CPDF_Rect * pRect)
+{
+ m_pList->InvalidateRect(pRect);
+}
+
+/* --------------------------- CPWL_ListBox ---------------------------- */
+
+CPWL_ListBox::CPWL_ListBox() :
+ m_pList(NULL),
+ m_pListNotify(NULL),
+ m_bMouseDown(FALSE),
+ m_bHoverSel(FALSE),
+ m_pFillerNotify(NULL)
+{
+ m_pList = IFX_List::NewList();
+
+ ASSERT(m_pList != NULL);
+}
+
+CPWL_ListBox::~CPWL_ListBox()
+{
+ IFX_List::DelList(m_pList);
+
+ if (m_pListNotify)
+ {
+ delete m_pListNotify;
+ m_pListNotify = NULL;
+ }
+}
+
+CFX_ByteString CPWL_ListBox::GetClassName() const
+{
+ return "CPWL_ListBox";
+}
+
+void CPWL_ListBox::OnCreated()
+{
+ if (m_pList)
+ {
+ if (m_pListNotify) 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(this->GetCreationParam().fFontSize);
+
+ m_bHoverSel = HasFlag(PLBS_HOVERSEL);
+ }
+}
+
+void CPWL_ListBox::OnDestroy()
+{
+ if (m_pListNotify)
+ {
+ delete m_pListNotify;
+ m_pListNotify = NULL;
+ }
+}
+
+void CPWL_ListBox::GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream)
+{
+ CPWL_Wnd::GetThisAppearanceStream(sAppStream);
+
+ CFX_ByteTextBuf sListItems;
+
+ if (m_pList)
+ {
+ CPDF_Rect rcPlate = m_pList->GetPlateRect();
+ for (FX_INT32 i=0,sz=m_pList->GetCount(); i<sz; i++)
+ {
+ CPDF_Rect rcItem = m_pList->GetItemRect(i);
+
+ if (rcItem.bottom > rcPlate.top || rcItem.top < rcPlate.bottom) continue;
+
+ CPDF_Point 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;
+ CPDF_Rect rcClient = this->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, CPDF_Matrix* pUser2Device)
+{
+ CPWL_Wnd::DrawThisAppearance(pDevice,pUser2Device);
+
+ if (m_pList)
+ {
+ CPDF_Rect rcPlate = m_pList->GetPlateRect();
+ CPDF_Rect rcList = GetListRect();
+ CPDF_Rect rcClient = GetClientRect();
+
+ for (FX_INT32 i=0,sz=m_pList->GetCount(); i<sz; i++)
+ {
+ CPDF_Rect rcItem = m_pList->GetItemRect(i);
+ if (rcItem.bottom > rcPlate.top || rcItem.top < rcPlate.bottom) continue;
+
+ CPDF_Point ptOffset(rcItem.left, (rcItem.top + rcItem.bottom) * 0.5f);
+ if (IFX_Edit* pEdit = m_pList->GetItemEdit(i))
+ {
+ CPDF_Rect rcContent = pEdit->GetContentRect();
+ if (rcContent.Width() > rcClient.Width())
+ rcItem.Intersect(rcList);
+ else
+ rcItem.Intersect(rcClient);
+ }
+
+ if (m_pList->IsItemSelected(i))
+ {
+ // CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcItem, ArgbEncode(255,0,51,113));
+ 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 CPDF_Point & 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 CPDF_Point & 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 CPDF_Point & 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, FX_INTPTR wParam, FX_INTPTR 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(CPDF_Point(0,fPos));
+ break;
+ }
+ break;
+ }
+}
+
+void CPWL_ListBox::KillFocus()
+{
+ CPWL_Wnd::KillFocus();
+
+ /*
+ if (this->IsMultipleSel())
+ {
+ for(FX_INT32 i=0;i<this->GetCount();i++)
+ {
+ if (this->IsListItemSelected(i))
+ {
+ if (!IsListItemVisible(i))
+ this->ScrollToListItem(i);
+ break;
+ }
+ }
+ }
+ else
+ {
+ if (!IsListItemVisible(this->GetCurSel()))
+ this->ScrollToListItem(this->GetCurSel());
+ }
+
+ SetListItemCaret(m_nCaretIndex,FALSE);
+ */
+}
+
+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)
+ {
+ FX_BOOL bRC = TRUE;
+ CFX_WideString swChange = GetText();
+ CFX_WideString strChangeEx;
+ int nSelStart = 0;
+ int nSelEnd = swChange.GetLength();
+ m_pFillerNotify->OnBeforeKeyStroke(FALSE, GetAttachedData(), 0, swChange, strChangeEx, nSelStart, nSelEnd, bKeyDown, bRC, bExit, nFlag);
+ if (bExit) return;
+
+ m_pFillerNotify->OnAfterKeyStroke(FALSE, GetAttachedData(), bExit,nFlag);
+ }
+}
+
+CPDF_Rect CPWL_ListBox::GetFocusRect() const
+{
+ if (m_pList && m_pList->IsMultipleSel())
+ {
+ CPDF_Rect rcCaret = m_pList->GetItemRect(m_pList->GetCaret());
+ rcCaret.Intersect(GetClientRect());
+ return rcCaret;
+ }
+
+ return CPWL_Wnd::GetFocusRect();
+}
+
+void CPWL_ListBox::AddString(FX_LPCWSTR string)
+{
+ if (m_pList)
+ {
+ m_pList->AddString(string);
+ }
+}
+
+void CPWL_ListBox::SetText(FX_LPCWSTR csText,FX_BOOL bRefresh)
+{
+ //return CPDF_List::SetText(csText,bRefresh);
+}
+
+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(FX_INT32 nItemIndex)
+{
+ if (m_pList)
+ m_pList->Select(nItemIndex);
+}
+
+void CPWL_ListBox::SetCaret(FX_INT32 nItemIndex)
+{
+ if (m_pList)
+ m_pList->SetCaret(nItemIndex);
+}
+
+void CPWL_ListBox::SetTopVisibleIndex(FX_INT32 nItemIndex)
+{
+ if (m_pList)
+ m_pList->SetTopItem(nItemIndex);
+}
+
+void CPWL_ListBox::ScrollToListItem(FX_INT32 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;
+}
+
+FX_INT32 CPWL_ListBox::GetCaretIndex() const
+{
+ if (m_pList)
+ return m_pList->GetCaret();
+
+ return -1;
+}
+
+FX_INT32 CPWL_ListBox::GetCurSel() const
+{
+ if (m_pList)
+ return m_pList->GetSelect();
+
+ return -1;
+}
+
+FX_BOOL CPWL_ListBox::IsItemSelected(FX_INT32 nItemIndex) const
+{
+ if (m_pList)
+ return m_pList->IsItemSelected(nItemIndex);
+
+ return FALSE;
+}
+
+FX_INT32 CPWL_ListBox::GetTopVisibleIndex() const
+{
+ if (m_pList)
+ {
+ m_pList->ScrollToListItem(m_pList->GetFirstSelected());
+ return m_pList->GetTopItem();
+ }
+
+ return -1;
+}
+
+FX_INT32 CPWL_ListBox::GetCount() const
+{
+ if (m_pList)
+ return m_pList->GetCount();
+
+ return 0;
+}
+
+FX_INT32 CPWL_ListBox::FindNext(FX_INT32 nIndex,FX_WCHAR nChar) const
+{
+ if (m_pList)
+ return m_pList->FindNext(nIndex,nChar);
+
+ return nIndex;
+}
+
+CPDF_Rect CPWL_ListBox::GetContentRect() const
+{
+ if (m_pList)
+ return m_pList->GetContentRect();
+
+ return CPDF_Rect();
+}
+
+FX_FLOAT CPWL_ListBox::GetFirstHeight() const
+{
+ if (m_pList)
+ return m_pList->GetFirstHeight();
+
+ return 0.0f;
+}
+
+CPDF_Rect CPWL_ListBox::GetListRect() const
+{
+ return CPWL_Utils::DeflateRect(GetWindowRect(),(FX_FLOAT)(GetBorderWidth()+GetInnerBorderWidth()));
+}
+
+FX_BOOL CPWL_ListBox::OnMouseWheel(short zDelta, const CPDF_Point & 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 new file mode 100644 index 0000000000..603bb4a139 --- /dev/null +++ b/fpdfsdk/src/pdfwindow/PWL_ListCtrl.cpp @@ -0,0 +1,245 @@ +// 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 "../../include/pdfwindow/PDFWindow.h"
+#include "../../include/pdfwindow/PWL_Wnd.h"
+#include "../../include/pdfwindow/PWL_ListCtrl.h"
+
+/* ---------------------------- CPWL_ListCtrl ---------------------------- */
+
+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 CPDF_Point& 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;
+}
+
+CPDF_Point CPWL_ListCtrl::GetScrollPos() const
+{
+ return m_ptScroll;
+}
+
+CPDF_Rect CPWL_ListCtrl::GetScrollArea() const
+{
+ return m_rcContent;
+}
+
+void CPWL_ListCtrl::ResetFace()
+{
+ ResetAll(FALSE, 0);
+}
+
+void CPWL_ListCtrl::ResetContent(FX_INT32 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)this->GetBorderWidth();
+
+ if (fLimitWidth > fBorderWidth* 2)
+ {
+ for (FX_INT32 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, FX_INT32 nStart)
+{
+ CPDF_Rect 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 (FX_INT32 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(
+ CPDF_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(CPDF_Rect(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, CPDF_Matrix* pUser2Device)
+{
+ pDevice->SaveState();
+ CPDF_Rect rcClient = GetClientRect();
+ CPDF_Rect rcTemp = rcClient;
+ pUser2Device->TransformRect(rcTemp);
+ FX_RECT rcClip((FX_INT32)rcTemp.left,
+ (FX_INT32)rcTemp.bottom,
+ (FX_INT32)rcTemp.right,
+ (FX_INT32)rcTemp.top);
+
+ pDevice->SetClip_Rect(&rcClip);
+
+ for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)
+ {
+ if (CPWL_Wnd * pChild = m_aChildren.GetAt(i))
+ {
+ CPDF_Rect rcChild = pChild->ChildToParent(pChild->GetWindowRect());
+ if (!(rcChild.top < rcClient.bottom || rcChild.bottom > rcClient.top))
+ {
+ CPDF_Matrix mt = pChild->GetChildMatrix();
+ if (mt.IsIdentity())
+ {
+ pChild->DrawAppearance(pDevice,pUser2Device);
+ }
+ else
+ {
+ mt.Concat(*pUser2Device);
+ pChild->DrawAppearance(pDevice,&mt);
+ }
+ }
+ }
+ }
+
+ pDevice->RestoreState();
+}
+
+FX_INT32 CPWL_ListCtrl::GetItemIndex(CPWL_Wnd* pItem)
+{
+ for (FX_INT32 i=0, sz=m_aChildren.GetSize(); i<sz; i++)
+ {
+ if (pItem == m_aChildren.GetAt(i))
+ return i;
+ }
+
+ return -1;
+}
+
+CPDF_Point CPWL_ListCtrl::InToOut(const CPDF_Point& point) const
+{
+ CPDF_Rect rcClient = GetClientRect();
+
+ return CPDF_Point(point.x + rcClient.left - m_ptScroll.x,
+ point.y + rcClient.top - m_ptScroll.y);
+}
+
+CPDF_Point CPWL_ListCtrl::OutToIn(const CPDF_Point& point) const
+{
+ CPDF_Rect rcClient = GetClientRect();
+
+ return CPDF_Point(point.x - rcClient.left + m_ptScroll.x,
+ point.y - rcClient.top + m_ptScroll.y);
+}
+
+CPDF_Rect CPWL_ListCtrl::InToOut(const CPDF_Rect& rect) const
+{
+ CPDF_Rect rcClient = GetClientRect();
+
+ return CPDF_Rect(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);
+}
+
+CPDF_Rect CPWL_ListCtrl::OutToIn(const CPDF_Rect& rect) const
+{
+ CPDF_Rect rcClient = GetClientRect();
+
+ return CPDF_Rect(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 new file mode 100644 index 0000000000..3c6d8661c6 --- /dev/null +++ b/fpdfsdk/src/pdfwindow/PWL_Note.cpp @@ -0,0 +1,1779 @@ +// 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 "../../include/pdfwindow/PDFWindow.h"
+#include "../../include/pdfwindow/PWL_Wnd.h"
+#include "../../include/pdfwindow/PWL_Button.h"
+#include "../../include/pdfwindow/PWL_EditCtrl.h"
+#include "../../include/pdfwindow/PWL_Edit.h"
+#include "../../include/pdfwindow/PWL_ListCtrl.h"
+#include "../../include/pdfwindow/PWL_ScrollBar.h"
+#include "../../include/pdfwindow/PWL_Note.h"
+#include "../../include/pdfwindow/PWL_Label.h"
+#include "../../include/pdfwindow/PWL_Edit.h"
+#include "../../include/pdfwindow/PWL_ScrollBar.h"
+#include "../../include/pdfwindow/PWL_Utils.h"
+#include "../../include/pdfwindow/PWL_Caret.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::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 (this->IsValid())
+ {
+ ASSERT(m_pText != NULL);
+
+ CPDF_Rect 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(CPDF_Rect(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);
+}
+
+void CPWL_Note_Options::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)
+{
+ CPWL_Wnd::DrawThisAppearance(pDevice, pUser2Device);
+
+ CPDF_Rect rcClient = GetClientRect();
+ rcClient.left = rcClient.right - 15.0f;
+
+ CPDF_Point ptCenter = CPDF_Point((rcClient.left + rcClient.right) * 0.5f, (rcClient.top + rcClient.bottom) * 0.5f);
+
+ CPDF_Point pt1(ptCenter.x - 2.0f, ptCenter.y + 2.0f * 0.5f);
+ CPDF_Point pt2(ptCenter.x + 2.0f, ptCenter.y + 2.0f * 0.5f);
+ CPDF_Point 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);
+}
+
+CPDF_Rect CPWL_Note_Options::GetContentRect() const
+{
+ ASSERT(m_pText != NULL);
+
+ CPDF_Rect rcText = m_pText->GetContentRect();
+ rcText.right += 15.0f;
+ return rcText;
+}
+
+/* ------------------------------- CPWL_Note_Edit ------------------------------ */
+
+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 = this->GetContentRect().Height();
+}
+
+void CPWL_Note_Edit::SetText(FX_LPCWSTR csText)
+{
+ m_bEnableNotify = FALSE;
+ CPWL_Edit::SetText(csText);
+ m_bEnableNotify = TRUE;
+ m_fOldItemHeight = this->GetContentRect().Height();
+}
+
+void CPWL_Note_Edit::OnSetFocus()
+{
+ m_bEnableNotify = FALSE;
+ CPWL_Edit::OnSetFocus();
+ m_bEnableNotify = TRUE;
+
+ this->EnableSpellCheck(TRUE);
+}
+
+void CPWL_Note_Edit::OnKillFocus()
+{
+ this->EnableSpellCheck(FALSE);
+
+ if (CPWL_Wnd* pParent = this->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, FX_INTPTR wParam, FX_INTPTR 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 = this->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 = this->ChildToParent(pInfo->ptHead);
+ newInfo.ptFoot = this->ChildToParent(pInfo->ptFoot);
+
+ if (CPWL_Wnd * pParent = this->GetParentWindow())
+ {
+ pParent->OnNotify(this, PNM_SETCARETINFO, (FX_INTPTR)&newInfo, 0);
+ }
+ }
+ break;
+ }
+ }
+}
+
+FX_FLOAT CPWL_Note_Edit::GetItemHeight(FX_FLOAT fLimitWidth)
+{
+ if (fLimitWidth > 0)
+ {
+ if (!m_bSizeChanged)
+ return m_fOldItemHeight;
+
+ m_bSizeChanged = FALSE;
+
+ this->EnableNotify(FALSE);
+ this->EnableRefresh(FALSE);
+ m_pEdit->EnableNotify(FALSE);
+
+ //CPDF_Rect rcOld = this->GetWindowRect();
+
+ this->Move(CPDF_Rect(0,0,fLimitWidth,0), TRUE, FALSE);
+ FX_FLOAT fRet = this->GetContentRect().Height();
+
+ //this->Move(rcOld, TRUE, FALSE);
+
+ m_pEdit->EnableNotify(TRUE);
+ this->EnableNotify(TRUE);
+ this->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::~CPWL_Note_LBBox()
+{
+}
+
+void CPWL_Note_LBBox::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)
+{
+ CPDF_Rect rcClient = this->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(),this->GetTransparency()), FXFILL_ALTERNATE);
+}
+
+/* -------------------------------- CPWL_Note_RBBox --------------------------------*/
+
+CPWL_Note_RBBox::CPWL_Note_RBBox()
+{
+}
+
+CPWL_Note_RBBox::~CPWL_Note_RBBox()
+{
+}
+
+void CPWL_Note_RBBox::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)
+{
+ CPDF_Rect rcClient = this->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(),this->GetTransparency()), FXFILL_ALTERNATE);
+}
+
+/* --------------------------------- CPWL_Note_Icon ---------------------------------- */
+
+CPWL_Note_Icon::CPWL_Note_Icon() : m_nType(0)
+{
+}
+
+CPWL_Note_Icon::~CPWL_Note_Icon()
+{
+}
+
+void CPWL_Note_Icon::SetIconType(FX_INT32 nType)
+{
+ m_nType = nType;
+}
+
+void CPWL_Note_Icon::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)
+{
+ CPWL_Utils::DrawIconAppStream(pDevice, pUser2Device, m_nType, GetClientRect(),
+ this->GetBackgroundColor(), PWL_DEFAULT_BLACKCOLOR, this->GetTransparency());
+}
+
+/* --------------------------------- CPWL_Note_CloseBox ---------------------------------- */
+
+CPWL_Note_CloseBox::CPWL_Note_CloseBox() : m_bMouseDown(FALSE)
+{
+}
+
+CPWL_Note_CloseBox::~CPWL_Note_CloseBox()
+{
+}
+
+void CPWL_Note_CloseBox::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)
+{
+ CPWL_Button::DrawThisAppearance(pDevice, pUser2Device);
+
+ CPDF_Rect rcClient = this->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(),this->GetTransparency()), FXFILL_ALTERNATE);
+}
+
+FX_BOOL CPWL_Note_CloseBox::OnLButtonDown(const CPDF_Point & 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 CPDF_Point & point, FX_DWORD nFlag)
+{
+ m_bMouseDown = FALSE;
+
+ SetBorderStyle(PBS_BEVELED);
+ InvalidateRect(NULL);
+
+ return CPWL_Button::OnLButtonUp(point,nFlag);
+}
+
+/* ------------------------------ CPWL_Note_Contents ------------------------------- */
+
+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);
+ 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 = this->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 = this->GetSystemHandler())
+ st = pSH->GetLocalTime();
+ pNoteItem->SetDateTime(st);
+
+ pNoteItem->SetContents(L"");
+
+ this->OnNotify(pNoteItem, PNM_NOTEEDITCHANGED, 0, 0);
+
+ return pNoteItem;
+}
+
+FX_INT32 CPWL_Note_Contents::CountSubItems() const
+{
+ return m_aChildren.GetSize() - 1;
+}
+
+IPWL_NoteItem* CPWL_Note_Contents::GetSubItems(FX_INT32 index) const
+{
+ FX_INT32 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)
+{
+ FX_INT32 nIndex = this->GetItemIndex((CPWL_NoteItem*)pNoteItem);
+
+ if (nIndex > 0)
+ {
+ if (CPWL_NoteItem* pPWLNoteItem = (CPWL_NoteItem*)pNoteItem)
+ {
+ pPWLNoteItem->KillFocus();
+ pPWLNoteItem->Destroy();
+ delete pPWLNoteItem;
+ }
+
+ for (FX_INT32 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);
+ }
+ }
+
+ this->OnNotify(this, PNM_NOTEEDITCHANGED, 0, 0);
+ }
+}
+
+IPWL_NoteItem* CPWL_Note_Contents::GetHitNoteItem(const CPDF_Point& point)
+{
+ CPDF_Point pt = this->ParentToChild(point);
+
+ for (FX_INT32 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, FX_INTPTR wParam, FX_INTPTR lParam)
+{
+ switch (msg)
+ {
+ case PNM_NOTEEDITCHANGED:
+ {
+ FX_INT32 nIndex = this->GetItemIndex(pWnd);
+ if (nIndex < 0) nIndex = 0;
+
+ m_pEdit->EnableNotify(FALSE);
+ this->ResetContent(nIndex);
+ m_pEdit->EnableNotify(TRUE);
+
+ for (FX_INT32 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 = this->GetParentWindow())
+ {
+ pParent->OnNotify(this, PNM_NOTEEDITCHANGED, 0, 0);
+ }
+ }
+ return;
+ case PNM_SCROLLWINDOW:
+ this->SetScrollPos(CPDF_Point(0.0f, *(FX_FLOAT*)lParam));
+ this->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 = this->ChildToParent(pInfo->ptHead);
+ newInfo.ptFoot = this->ChildToParent(pInfo->ptFoot);
+
+ if (CPWL_Wnd * pParent = this->GetParentWindow())
+ {
+ pParent->OnNotify(this, PNM_SETCARETINFO, (FX_INTPTR)&newInfo, 0);
+ }
+ }
+ return;
+ case PNM_NOTERESET:
+ {
+ m_pEdit->EnableNotify(FALSE);
+ this->ResetContent(0);
+ m_pEdit->EnableNotify(TRUE);
+
+ for (FX_INT32 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);
+ this->ResetContent(0);
+ m_pEdit->EnableNotify(TRUE);
+ }
+ return;
+ }
+
+ CPWL_Wnd::OnNotify(pWnd, msg, wParam, lParam);
+}
+
+FX_BOOL CPWL_Note_Contents::OnLButtonDown(const CPDF_Point & 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 (FX_INT32 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 (FX_INT32 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::CPWL_NoteItem() :
+ m_pPrivateData(NULL),
+ m_pSubject(NULL),
+ m_pDateTime(NULL),
+ m_pContents(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(this->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 = PWL_DEFAULT_WHITECOLOR;
+ 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 (this->IsValid())
+ {
+ ASSERT(m_pSubject != NULL);
+ ASSERT(m_pDateTime != NULL);
+ ASSERT(m_pContents != NULL);
+
+ CPDF_Rect rcClient = GetClientRect();
+
+ CPDF_Rect 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));
+
+ CPDF_Rect 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));
+
+ CPDF_Rect 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;
+ this->SetBackgroundColor(sBK);
+
+ CPWL_Color sTextColor;
+
+ if (CPWL_Utils::IsBlackOrWhite(sBK))
+ sTextColor = PWL_DEFAULT_WHITECOLOR;
+ else
+ sTextColor = PWL_DEFAULT_BLACKCOLOR;
+
+ this->SetTextColor(sTextColor);
+ if (m_pSubject)
+ m_pSubject->SetTextColor(sTextColor);
+ if (m_pDateTime)
+ m_pDateTime->SetTextColor(sTextColor);
+
+ this->InvalidateRect(NULL);
+
+ if (IPWL_NoteNotify* pNotify = GetNoteNotify())
+ {
+ pNotify->OnSetBkColor(this);
+ }
+}
+
+void CPWL_NoteItem::SetSubjectName(const CFX_WideString& sName)
+{
+ if (m_pSubject)
+ {
+ m_pSubject->SetText(sName);
+ }
+
+ 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(FX_INT32 nItemIndex)
+{
+ if (nItemIndex < 0)
+ {
+ if (CPWL_Wnd* pParent = this->GetParentWindow())
+ {
+ ASSERT(pParent->GetClassName() == "CPWL_Note_Contents");
+
+ CPWL_Note_Contents* pContents = (CPWL_Note_Contents*)pParent;
+ nItemIndex = pContents->GetItemIndex(this);
+ }
+ }
+
+ const CPWL_Note* pNote = GetNote();
+ ASSERT(pNote != NULL);
+
+ CFX_WideString sSubject;
+ sSubject.Format(pNote->GetReplyString(), nItemIndex);
+
+ if (!m_sAuthor.IsEmpty())
+ {
+
+ sSubject += L" - ";
+ sSubject += m_sAuthor;
+ }
+ this->SetSubjectName(sSubject);
+ this->RePosChildWnd();
+}
+
+void CPWL_NoteItem::SetDateTime(FX_SYSTEMTIME time)
+{
+ m_dtNote = time;
+
+ CFX_WideString swTime;
+ swTime.Format((FX_LPCWSTR)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);
+ }
+
+ this->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 = this->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 this->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();
+}
+
+FX_INT32 CPWL_NoteItem::CountSubItems() const
+{
+ if (m_pContents)
+ return m_pContents->CountSubItems();
+
+ return 0;
+}
+
+IPWL_NoteItem* CPWL_NoteItem::GetSubItems(FX_INT32 index) const
+{
+ if (m_pContents)
+ return m_pContents->GetSubItems(index);
+
+ return NULL;
+}
+
+void CPWL_NoteItem::DeleteSubItem(IPWL_NoteItem* pNoteItem)
+{
+ this->KillFocus();
+
+ if (IPWL_NoteNotify* pNotify = GetNoteNotify())
+ {
+ pNotify->OnItemDelete(pNoteItem);
+ }
+
+ if (m_pContents)
+ m_pContents->DeleteSubItem(pNoteItem);
+}
+
+IPWL_NoteItem* CPWL_NoteItem::GetHitNoteItem(const CPDF_Point& point)
+{
+ CPDF_Point pt = this->ParentToChild(point);
+
+ if (this->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 = this->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;
+
+ ASSERT(m_pSubject != NULL);
+ ASSERT(m_pDateTime != NULL);
+ ASSERT(m_pContents != NULL);
+
+ FX_FLOAT fRet = m_pDateTime->GetContentRect().Height();
+ FX_FLOAT fBorderWidth = (FX_FLOAT)this->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 CPDF_Point& 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 CPDF_Point & 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, FX_INTPTR wParam, FX_INTPTR lParam)
+{
+ switch (msg)
+ {
+ case PNM_NOTEEDITCHANGED:
+ m_bSizeChanged = TRUE;
+
+ if (CPWL_Wnd* pParent = this->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 = this->ChildToParent(pInfo->ptHead);
+ newInfo.ptFoot = this->ChildToParent(pInfo->ptFoot);
+
+ if (CPWL_Wnd * pParent = this->GetParentWindow())
+ {
+ pParent->OnNotify(this, PNM_SETCARETINFO, (FX_INTPTR)&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 CPDF_Point& point)
+{
+ if (IPWL_NoteNotify* pNotify = GetNoteNotify())
+ {
+ FX_INT32 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 = this->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::CPWL_Note(IPopup_Note* pPopupNote, IPWL_NoteNotify* pNoteNotify, IPWL_NoteHandler* pNoteHandler) :
+ m_pAuthor(NULL),
+ m_pIcon(NULL),
+ m_pCloseBox(NULL),
+ m_pContentsBar(NULL),
+ m_pLBBox(NULL),
+ m_pRBBox(NULL),
+ m_pOptions(NULL),
+ m_bResizing(FALSE),
+ m_rcCaption(0,0,0,0),
+ m_pNoteNotify(pNoteNotify),
+ m_bEnalbleNotify(TRUE),
+ m_pPopupNote(pPopupNote),
+ m_pNoteHandler(pNoteHandler)
+{
+}
+
+CPWL_Note::~CPWL_Note()
+{
+}
+
+IPWL_NoteItem* CPWL_Note::Reply()
+{
+ return CreateNoteItem();
+}
+
+void CPWL_Note::EnableNotify(FX_BOOL bEnabled)
+{
+ m_bEnalbleNotify = bEnabled;
+}
+
+void CPWL_Note::RePosChildWnd()
+{
+ RePosNoteChildren();
+ m_pContents->OnNotify(this, PNM_NOTERESET, 0, 0);
+ ResetScrollBar();
+ m_pContents->OnNotify(this, PNM_NOTERESET, 0, 0);
+ this->OnNotify(this, PNM_NOTEEDITCHANGED, 0, 0);
+ //ͬ²½
+ if (const CPWL_Wnd* pWnd = this->GetFocused())
+ {
+ if (pWnd->GetClassName() == "CPWL_Edit")
+ {
+ CPWL_Edit* pEdit = (CPWL_Edit*)pWnd;
+ pEdit->SetCaret(pEdit->GetCaret());
+ }
+ }
+ //CPDF_Point ptNew = m_pContents->GetScrollPos();
+ //m_pContentsBar->OnNotify(this, PNM_SETSCROLLPOS, SBT_VSCROLL, (FX_INTPTR)&ptNew.y);
+}
+
+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)
+ {
+ CPDF_Rect rcNote = this->GetClientRect();
+ CPDF_Rect 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(CPDF_Point(0.0f,0.0f));
+ m_pContents->InvalidateRect(NULL);
+ }
+
+ return bScrollChanged;
+}
+
+FX_BOOL CPWL_Note::ScrollBarShouldVisible()
+{
+ CPDF_Rect rcContentsFact = m_pContents->GetScrollArea();
+ CPDF_Rect 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 (this->IsValid())
+ {
+ ASSERT(m_pSubject != NULL);
+ ASSERT(m_pDateTime != NULL);
+ ASSERT(m_pContents != NULL);
+ ASSERT(m_pAuthor != NULL);
+ ASSERT(m_pCloseBox != NULL);
+ ASSERT(m_pIcon != NULL);
+ ASSERT(m_pLBBox != NULL);
+ ASSERT(m_pRBBox != NULL);
+ ASSERT(m_pContentsBar != NULL);
+ ASSERT(m_pOptions != NULL);
+
+ CPDF_Rect rcClient = GetClientRect();
+
+ CPDF_Rect 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));
+
+ CPDF_Rect 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));
+
+ CPDF_Rect 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));
+
+ CPDF_Rect 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));
+
+ CPDF_Rect 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));
+
+ CPDF_Rect 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));
+
+ CPDF_Rect 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));
+
+ CPDF_Rect 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));
+
+ CPDF_Rect 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));
+
+ CPDF_Rect rcContentsBar = rcContents;
+ rcContentsBar.right = rcClient.right - 3.0f;
+ rcContentsBar.left = rcContentsBar.right - PWL_SCROLLBAR_WIDTH;
+ rcContentsBar.Normalize();
+ m_pContentsBar->Move(rcContentsBar, TRUE, FALSE);
+
+ m_rcCaption = rcClient;
+ m_rcCaption.bottom = rcContents.top;
+ }
+
+ m_bResizing = FALSE;
+}
+
+//0-normal / 1-caption / 2-leftbottom corner / 3-rightbottom corner / 4-close / 5-options
+FX_INT32 CPWL_Note::NoteHitTest(const CPDF_Point& point) const
+{
+ ASSERT(m_pSubject != NULL);
+ ASSERT(m_pDateTime != NULL);
+ ASSERT(m_pContents != NULL);
+ ASSERT(m_pAuthor != NULL);
+ ASSERT(m_pIcon != NULL);
+ ASSERT(m_pContentsBar != NULL);
+
+ ASSERT(m_pCloseBox != NULL);
+ ASSERT(m_pLBBox != NULL);
+ ASSERT(m_pRBBox != NULL);
+ ASSERT(m_pOptions != NULL);
+
+ GetClientRect();
+
+ if (m_pSubject->WndHitTest(m_pSubject->ParentToChild(point))) return 1;
+ if (m_pDateTime->WndHitTest(m_pDateTime->ParentToChild(point))) return 1;
+ if (m_pAuthor->WndHitTest(m_pAuthor->ParentToChild(point))) return 1;
+ if (m_pIcon->WndHitTest(m_pIcon->ParentToChild(point))) return 1;
+
+ if (m_pContents->WndHitTest(m_pContents->ParentToChild(point))) return 0;
+ if (m_pContentsBar->WndHitTest(m_pContentsBar->ParentToChild(point))) return 0;
+
+ if (m_pCloseBox->WndHitTest(m_pCloseBox->ParentToChild(point))) return 4;
+ if (m_pLBBox->WndHitTest(m_pLBBox->ParentToChild(point))) return 2;
+ if (m_pRBBox->WndHitTest(m_pRBBox->ParentToChild(point))) return 3;
+ if (m_pOptions->WndHitTest(m_pOptions->ParentToChild(point))) return 5;
+
+ return 1;
+}
+
+void CPWL_Note::CreateChildWnd(const PWL_CREATEPARAM & cp)
+{
+ CPWL_NoteItem::CreateChildWnd(cp);
+
+ CPWL_Color sTextColor;
+
+ if (CPWL_Utils::IsBlackOrWhite(this->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);
+ 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 CPDF_Point & point, FX_DWORD nFlag)
+{
+ CPDF_Point ptScroll = m_pContents->GetScrollPos();
+ CPDF_Rect rcScroll = m_pContents->GetScrollArea();
+ CPDF_Rect rcContents = m_pContents->GetClientRect();
+
+ if (rcScroll.top - rcScroll.bottom > rcContents.Height())
+ {
+ CPDF_Point 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, (FX_INTPTR)&ptNew.y);
+ m_pContentsBar->OnNotify(this, PNM_SETSCROLLPOS, SBT_VSCROLL, (FX_INTPTR)&ptNew.y);
+
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+void CPWL_Note::OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam, FX_INTPTR lParam)
+{
+ switch (msg)
+ {
+ case PNM_NOTEEDITCHANGED:
+ {
+ CPDF_Rect 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) //·ÀÖ¹ËÀÑ»· mantis:15759
+ {
+ bScrollChanged = ResetScrollBar();
+ if (bScrollChanged)
+ {
+ lParam++;
+ m_pContents->OnNotify(this, PNM_NOTERESET, 0, 0);
+ this->OnNotify(this, PNM_NOTEEDITCHANGED, 0, lParam);
+ }
+ }
+
+ if (!bScrollChanged)
+ {
+ if (m_pContentsBar->IsVisible())
+ {
+ m_pContentsBar->OnNotify(pWnd, PNM_SETSCROLLINFO, SBT_VSCROLL, (FX_INTPTR)&sInfo);
+ m_OldScrollInfo = sInfo;
+
+ CPDF_Point ptScroll = m_pContents->GetScrollPos();
+ CPDF_Point 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, (FX_INTPTR)&ptScroll.y);
+ m_pContentsBar->InvalidateRect(NULL);
+ m_pContents->OnNotify(this, PNM_SCROLLWINDOW, SBT_VSCROLL, (FX_INTPTR)&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)
+ {
+ CPDF_Rect rcClient = m_pContents->GetClientRect();
+ if (pInfo->ptHead.y > rcClient.top)
+ {
+ CPDF_Point pt = m_pContents->OutToIn(pInfo->ptHead);
+ m_pContents->OnNotify(this, PNM_SCROLLWINDOW, SBT_VSCROLL, (FX_INTPTR)&pt.y);
+
+ CPDF_Point ptScroll = m_pContents->GetScrollPos();
+ m_pContentsBar->OnNotify(this, PNM_SETSCROLLPOS, SBT_VSCROLL, (FX_INTPTR)&ptScroll.y);
+
+ return;
+ }
+
+ if (pInfo->ptFoot.y < rcClient.bottom)
+ {
+ CPDF_Point pt = m_pContents->OutToIn(pInfo->ptFoot);
+ pt.y += rcClient.Height();
+ m_pContents->OnNotify(this, PNM_SCROLLWINDOW, SBT_VSCROLL, (FX_INTPTR)&pt.y);
+
+ CPDF_Point ptScroll = m_pContents->GetScrollPos();
+ m_pContentsBar->OnNotify(this, PNM_SETSCROLLPOS, SBT_VSCROLL, (FX_INTPTR)&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 CPDF_Point& point, FX_DWORD nFlag)
+{
+ if (m_pOptions->WndHitTest(m_pOptions->ParentToChild(point)))
+ {
+ if (IPWL_NoteNotify* pNotify = this->GetNoteNotify())
+ {
+ FX_INT32 x, y;
+ PWLtoWnd(point, x, y);
+ if (IFX_SystemHandler* pSH = GetSystemHandler())
+ pSH->ClientToScreen(GetAttachedHWnd(), x, y);
+ this->KillFocus();
+ pNotify->OnPopupMenu(x, y);
+
+ return TRUE;
+ }
+ }
+
+ return CPWL_Wnd::OnLButtonDown(point,nFlag);
+}
+
+FX_BOOL CPWL_Note::OnRButtonUp(const CPDF_Point & 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
+{
+ if (m_bEnalbleNotify)
+ return m_pNoteNotify;
+
+ return NULL;
+}
+
+void CPWL_Note::SetIconType(FX_INT32 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& string)
+{
+ m_sReplyString = string;
+}
+
diff --git a/fpdfsdk/src/pdfwindow/PWL_ScrollBar.cpp b/fpdfsdk/src/pdfwindow/PWL_ScrollBar.cpp new file mode 100644 index 0000000000..d51de4db75 --- /dev/null +++ b/fpdfsdk/src/pdfwindow/PWL_ScrollBar.cpp @@ -0,0 +1,1353 @@ +// 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 "../../include/pdfwindow/PDFWindow.h"
+#include "../../include/pdfwindow/PWL_Wnd.h"
+#include "../../include/pdfwindow/PWL_ScrollBar.h"
+#include "../../include/pdfwindow/PWL_Utils.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::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::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::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;
+
+ CPDF_Rect rectWnd = GetWindowRect();
+
+ if (rectWnd.IsEmpty()) return;
+
+ sAppStream << "q\n";
+
+ CPDF_Point ptCenter = this->GetCenterPoint();
+
+ switch (this->m_eScrollBarType)
+ {
+ case SBT_HSCROLL:
+ switch (this->m_eSBButtonType)
+ {
+ case PSBT_MIN:
+ {
+ CPDF_Point pt1(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f,ptCenter.y);
+ CPDF_Point pt2(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f,ptCenter.y + PWL_TRIANGLE_HALFLEN);
+ CPDF_Point 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:
+ {
+ CPDF_Point pt1(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f,ptCenter.y);
+ CPDF_Point pt2(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f,ptCenter.y + PWL_TRIANGLE_HALFLEN);
+ CPDF_Point 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(this->m_eSBButtonType)
+ {
+ case PSBT_MIN:
+ {
+ CPDF_Point pt1(ptCenter.x - PWL_TRIANGLE_HALFLEN,ptCenter.y - PWL_TRIANGLE_HALFLEN * 0.5f);
+ CPDF_Point pt2(ptCenter.x + PWL_TRIANGLE_HALFLEN,ptCenter.y - PWL_TRIANGLE_HALFLEN * 0.5f);
+ CPDF_Point 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:
+ {
+ CPDF_Point pt1(ptCenter.x - PWL_TRIANGLE_HALFLEN,ptCenter.y + PWL_TRIANGLE_HALFLEN * 0.5f);
+ CPDF_Point pt2(ptCenter.x + PWL_TRIANGLE_HALFLEN,ptCenter.y + PWL_TRIANGLE_HALFLEN * 0.5f);
+ CPDF_Point 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, CPDF_Matrix* pUser2Device)
+{
+ if (!IsVisible()) return;
+
+ CPDF_Rect rectWnd = GetWindowRect();
+ if (rectWnd.IsEmpty()) return;
+
+ CPDF_Point ptCenter = this->GetCenterPoint();
+ FX_INT32 nTransparancy = this->GetTransparency();
+
+ switch (this->m_eScrollBarType)
+ {
+ case SBT_HSCROLL:
+ CPWL_Wnd::DrawThisAppearance(pDevice,pUser2Device);
+ switch (this->m_eSBButtonType)
+ {
+ case PSBT_MIN:
+ {
+ CPDF_Point pt1(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f,ptCenter.y);
+ CPDF_Point pt2(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f,ptCenter.y + PWL_TRIANGLE_HALFLEN);
+ CPDF_Point 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:
+ {
+ CPDF_Point pt1(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f,ptCenter.y);
+ CPDF_Point pt2(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f,ptCenter.y + PWL_TRIANGLE_HALFLEN);
+ CPDF_Point 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(this->m_eSBButtonType)
+ {
+ case PSBT_MIN:
+ {
+ //draw border
+ CPDF_Rect 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 (this->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;
+ CPDF_Point pts[7] = {
+ CPDF_Point(fX+2.5f, fY+4.0f),
+ CPDF_Point(fX+2.5f, fY+3.0f),
+ CPDF_Point(fX+4.5f, fY+5.0f),
+ CPDF_Point(fX+6.5f, fY+3.0f),
+ CPDF_Point(fX+6.5f, fY+4.0f),
+ CPDF_Point(fX+4.5f, fY+6.0f),
+ CPDF_Point(fX+2.5f, fY+4.0f)};
+
+
+ if (this->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
+ CPDF_Rect 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 (this->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;
+
+ CPDF_Point pts[7] = {
+ CPDF_Point(fX+2.5f, fY+5.0f),
+ CPDF_Point(fX+2.5f, fY+6.0f),
+ CPDF_Point(fX+4.5f, fY+4.0f),
+ CPDF_Point(fX+6.5f, fY+6.0f),
+ CPDF_Point(fX+6.5f, fY+5.0f),
+ CPDF_Point(fX+4.5f, fY+3.0f),
+ CPDF_Point(fX+2.5f, fY+5.0f)};
+
+
+ if (this->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:
+ {
+ //CPWL_Wnd::DrawThisAppearance(pDevice,pUser2Device);
+
+ //draw border
+ CPDF_Rect 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 (this->IsEnabled())
+ {
+ //draw shadow effect
+
+ CPDF_Point ptTop = CPDF_Point(rectWnd.left,rectWnd.top-1.0f);
+ CPDF_Point ptBottom = CPDF_Point(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 (!this->IsEnabled())
+ crStroke = CPWL_Utils::PWLColorToFXColor(PWL_DEFAULT_HEAVYGRAYCOLOR,255);
+
+ FX_FLOAT nFrictionWidth = 5.0f;
+ FX_FLOAT nFrictionHeight = 5.5f;
+
+ CPDF_Point ptLeft = CPDF_Point(ptCenter.x - nFrictionWidth / 2.0f, ptCenter.y - nFrictionHeight / 2.0f + 0.5f);
+ CPDF_Point ptRight = CPDF_Point(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);
+
+ /*
+ ptLeft.y += 1.5f;
+ ptRight.y += 1.5f;
+
+ CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptLeft, ptRight,
+ ArgbEncode(nTransparancy,150,150,150),1.0f);
+ */
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+FX_BOOL CPWL_SBButton::OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag)
+{
+ CPWL_Wnd::OnLButtonDown(point,nFlag);
+
+ if (CPWL_Wnd * pParent = GetParentWindow())
+ pParent->OnNotify(this,PNM_LBUTTONDOWN,0,(FX_INTPTR)&point);
+
+ m_bMouseDown = TRUE;
+ SetCapture();
+
+ return TRUE;
+}
+
+FX_BOOL CPWL_SBButton::OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag)
+{
+ CPWL_Wnd::OnLButtonUp(point,nFlag);
+
+ if (CPWL_Wnd * pParent = GetParentWindow())
+ pParent->OnNotify(this,PNM_LBUTTONUP,0,(FX_INTPTR)&point);
+
+ m_bMouseDown = FALSE;
+ ReleaseCapture();
+
+ return TRUE;
+}
+
+FX_BOOL CPWL_SBButton::OnMouseMove(const CPDF_Point & point, FX_DWORD nFlag)
+{
+ CPWL_Wnd::OnMouseMove(point,nFlag);
+
+ if (CPWL_Wnd * pParent = GetParentWindow())
+ {
+ pParent->OnNotify(this,PNM_MOUSEMOVE,0,(FX_INTPTR)&point);
+
+ /*
+ if (m_bMouseDown && (m_eSBButtonType == PSBT_MIN || m_eSBButtonType == PSBT_MAX))
+ {
+ if (!pParent->OnNotify(this,PNM_LBUTTONDOWN,nFlags,(FX_INTPTR)&point))
+ return FALSE;
+ }
+ */
+ }
+
+ return TRUE;
+}
+
+/* ------------------------------- CPWL_ScrollBar ---------------------------------- */
+
+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()
+{
+ CPDF_Rect rcClient = this->GetClientRect();
+
+/*
+ switch(m_sbType)
+ {
+ case SBT_HSCROLL:
+ if (rcClient.right - rcClient.left < PWL_SCROLLBAR_WIDTH ||
+ rcClient.top - rcClient.bottom < PWL_SCROLLBAR_WIDTH)
+ {
+ SetVisible(FALSE);
+ }
+ break;
+ case SBT_VSCROLL:
+ if (rcClient.right - rcClient.left < PWL_SCROLLBAR_WIDTH ||
+ rcClient.top - rcClient.bottom < PWL_SCROLLBAR_WIDTH)
+ {
+ SetVisible(FALSE);
+ }
+ break;
+ }
+*/
+ CPDF_Rect 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 = CPDF_Rect(rcClient.left,rcClient.bottom,
+ rcClient.left + PWL_SCROLLBAR_BUTTON_WIDTH,rcClient.top);
+ rcMaxButton = CPDF_Rect(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 = CPDF_Rect(rcClient.left,rcClient.bottom,
+ rcClient.left + fBWidth,rcClient.top);
+ rcMaxButton = CPDF_Rect(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 = CPDF_Rect(rcClient.left,rcClient.top - PWL_SCROLLBAR_BUTTON_WIDTH,
+ rcClient.right,rcClient.top);
+ rcMaxButton = CPDF_Rect(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 = CPDF_Rect(rcClient.left,rcClient.top - fBWidth,
+ rcClient.right,rcClient.top);
+ rcMaxButton = CPDF_Rect(rcClient.left,rcClient.bottom,
+ rcClient.right,rcClient.bottom + fBWidth);
+ }
+ else SetVisible(FALSE);
+ }
+ break;
+ }
+
+// if (IsVisible())
+ {
+ 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)
+{
+ CPDF_Rect 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, CPDF_Matrix* pUser2Device)
+{
+// CPWL_Wnd::DrawThisAppearance(pDevice,pUser2Device);
+ CPDF_Rect rectWnd = GetWindowRect();
+
+ if (IsVisible() && !rectWnd.IsEmpty())
+ {
+ CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rectWnd, this->GetBackgroundColor(), GetTransparency());
+
+ CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device,
+ CPDF_Point(rectWnd.left+2.0f,rectWnd.top-2.0f), CPDF_Point(rectWnd.left+2.0f,rectWnd.bottom+2.0f),
+ ArgbEncode(this->GetTransparency(),100,100,100),1.0f);
+
+ CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device,
+ CPDF_Point(rectWnd.right-2.0f,rectWnd.top-2.0f), CPDF_Point(rectWnd.right-2.0f,rectWnd.bottom+2.0f),
+ ArgbEncode(this->GetTransparency(),100,100,100),1.0f);
+ }
+}
+
+FX_BOOL CPWL_ScrollBar::OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag)
+{
+ CPWL_Wnd::OnLButtonDown(point,nFlag);
+
+ //SetFocus();
+
+ if (HasFlag(PWS_AUTOTRANSPARENT))
+ {
+ if (GetTransparency() != 255)
+ {
+ SetTransparency(255);
+ InvalidateRect();
+ }
+ }
+
+ CPDF_Rect rcMinArea,rcMaxArea;
+
+ if (m_pPosButton && m_pPosButton->IsVisible())
+ {
+ CPDF_Rect rcClient = this->GetClientRect();
+ CPDF_Rect rcPosButton = m_pPosButton->GetWindowRect();
+
+ switch (m_sbType)
+ {
+ case SBT_HSCROLL:
+ rcMinArea = CPDF_Rect(rcClient.left + PWL_SCROLLBAR_BUTTON_WIDTH,rcClient.bottom,
+ rcPosButton.left,rcClient.top);
+ rcMaxArea = CPDF_Rect(rcPosButton.right,rcClient.bottom,
+ rcClient.right - PWL_SCROLLBAR_BUTTON_WIDTH,rcClient.top);
+
+ break;
+ case SBT_VSCROLL:
+ rcMinArea = CPDF_Rect(rcClient.left,rcPosButton.top,
+ rcClient.right,rcClient.top - PWL_SCROLLBAR_BUTTON_WIDTH);
+ rcMaxArea = CPDF_Rect(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 CPDF_Point & 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, FX_INTPTR wParam, FX_INTPTR lParam)
+{
+ CPWL_Wnd::OnNotify(pWnd,msg,wParam,lParam);
+
+ switch (msg)
+ {
+ case PNM_LBUTTONDOWN:
+ if (pWnd == m_pMinButton)
+ {
+ OnMinButtonLBDown(*(CPDF_Point*)lParam);
+ }
+
+ if (pWnd == m_pMaxButton)
+ {
+ OnMaxButtonLBDown(*(CPDF_Point*)lParam);
+ }
+
+ if (pWnd == m_pPosButton)
+ {
+ OnPosButtonLBDown(*(CPDF_Point*)lParam);
+ }
+ break;
+ case PNM_LBUTTONUP:
+ if (pWnd == m_pMinButton)
+ {
+ OnMinButtonLBUp(*(CPDF_Point*)lParam);
+ }
+
+ if (pWnd == m_pMaxButton)
+ {
+ OnMaxButtonLBUp(*(CPDF_Point*)lParam);
+ }
+
+ if (pWnd == m_pPosButton)
+ {
+ OnPosButtonLBUp(*(CPDF_Point*)lParam);
+ }
+ break;
+ case PNM_MOUSEMOVE:
+ if (pWnd == m_pMinButton)
+ {
+ OnMinButtonMouseMove(*(CPDF_Point*)lParam);
+ }
+
+ if (pWnd == m_pMaxButton)
+ {
+ OnMaxButtonMouseMove(*(CPDF_Point*)lParam);
+ }
+
+ if (pWnd == m_pPosButton)
+ {
+ OnPosButtonMouseMove(*(CPDF_Point*)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;
+ this->SetScrollRange(0,fMax, pInfo->fPlateWidth);
+ this->SetScrollStep(pInfo->fBigStep,pInfo->fSmallStep);
+ }
+ }
+ }
+ break;
+ case PNM_SETSCROLLPOS:
+ {
+ FX_FLOAT fPos = *(FX_FLOAT*)lParam;
+ switch (this->m_sbType)
+ {
+ case SBT_HSCROLL:
+ fPos = fPos - m_OriginInfo.fContentMin;
+ break;
+ case SBT_VSCROLL:
+ fPos = m_OriginInfo.fContentMax - fPos;
+ break;
+ }
+ this->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_pPosButton != NULL);
+ ASSERT (m_pMinButton != NULL);
+ ASSERT (m_pMaxButton != NULL);
+
+ if (m_pPosButton->IsVisible())
+ {
+
+
+
+
+ CPDF_Rect rcClient;
+ CPDF_Rect rcPosArea,rcPosButton;
+
+ rcClient = this->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 = CPDF_Rect(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 = CPDF_Rect(rcPosArea.left,
+ fBottom,
+ rcPosArea.right,
+ fTop);
+
+ break;
+ }
+
+ m_pPosButton->Move(rcPosButton,TRUE,bRefresh);
+ }
+}
+
+void CPWL_ScrollBar::OnMinButtonLBDown(const CPDF_Point & point)
+{
+ m_sData.SubSmall();
+ MovePosButton(TRUE);
+ NotifyScrollWindow();
+
+ m_bMinOrMax = TRUE;
+
+ EndTimer();
+ BeginTimer(100);
+}
+
+void CPWL_ScrollBar::OnMinButtonLBUp(const CPDF_Point & point)
+{
+}
+
+void CPWL_ScrollBar::OnMinButtonMouseMove(const CPDF_Point & point)
+{
+}
+
+void CPWL_ScrollBar::OnMaxButtonLBDown(const CPDF_Point & point)
+{
+ m_sData.AddSmall();
+ MovePosButton(TRUE);
+ NotifyScrollWindow();
+
+ m_bMinOrMax = FALSE;
+
+ EndTimer();
+ BeginTimer(100);
+}
+
+void CPWL_ScrollBar::OnMaxButtonLBUp(const CPDF_Point & point)
+{
+}
+
+void CPWL_ScrollBar::OnMaxButtonMouseMove(const CPDF_Point & point)
+{
+}
+
+void CPWL_ScrollBar::OnPosButtonLBDown(const CPDF_Point & point)
+{
+ m_bMouseDown = TRUE;
+
+ if (m_pPosButton)
+ {
+ CPDF_Rect 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 CPDF_Point & point)
+{
+ if (m_bMouseDown)
+ {
+ if (!m_bNotifyForever)
+ NotifyScrollWindow();
+ }
+ m_bMouseDown = FALSE;
+}
+
+void CPWL_ScrollBar::OnPosButtonMouseMove(const CPDF_Point & 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 = this->GetParentWindow())
+ {
+ FX_FLOAT fPos;
+ switch (this->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,(FX_INTPTR)m_sbType,(FX_INTPTR)&fPos);
+ }
+}
+
+CPDF_Rect CPWL_ScrollBar::GetScrollArea() const
+{
+ CPDF_Rect rcClient = GetClientRect();
+ CPDF_Rect rcArea;
+
+ if (!m_pMinButton || !m_pMaxButton)return rcClient;
+
+ CPDF_Rect rcMin = m_pMinButton->GetWindowRect();
+ CPDF_Rect 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 = CPDF_Rect(rcClient.left + fMinWidth + 1,rcClient.bottom,
+ rcClient.right - fMaxWidth - 1,rcClient.top);
+ }
+ else
+ {
+ rcArea = CPDF_Rect(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 = CPDF_Rect(rcClient.left,rcClient.bottom + fMinHeight + 1,
+ rcClient.right,rcClient.top - fMaxHeight - 1);
+ }
+ else
+ {
+ rcArea = CPDF_Rect(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)
+{
+ CPDF_Rect 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)
+{
+ CPDF_Rect 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();
+ }
+}
+
+/*
+void CPWL_ScrollBar::OnSetFocus()
+{
+ if (GetTransparency() != 255)
+ {
+ SetTransparency(255);
+ InvalidateRect();
+ }
+}
+
+void CPWL_ScrollBar::OnKillFocus()
+{
+ if (GetTransparency() != PWL_SCROLLBAR_TRANSPARANCY)
+ {
+ SetTransparency(PWL_SCROLLBAR_TRANSPARANCY);
+ InvalidateRect();
+ }
+}
+*/
+
diff --git a/fpdfsdk/src/pdfwindow/PWL_Signature.cpp b/fpdfsdk/src/pdfwindow/PWL_Signature.cpp new file mode 100644 index 0000000000..36297f3d92 --- /dev/null +++ b/fpdfsdk/src/pdfwindow/PWL_Signature.cpp @@ -0,0 +1,220 @@ +// 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 "../../include/pdfwindow/PDFWindow.h"
+#include "../../include/pdfwindow/PWL_Wnd.h"
+#include "../../include/pdfwindow/PWL_Icon.h"
+#include "../../include/pdfwindow/PWL_Signature.h"
+#include "../../include/pdfwindow/PWL_Label.h"
+#include "../../include/pdfwindow/PWL_Utils.h"
+
+/* --------------------------------- CPWL_Signature_Image --------------------------------- */
+
+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, CPDF_Matrix* pUser2Device)
+{
+ CPWL_Wnd::DrawThisAppearance(pDevice, pUser2Device);
+
+ if (m_pImage)
+ {
+ CPDF_Rect rcClient = GetClientRect();
+
+ FX_FLOAT x, y;
+ pUser2Device->Transform(rcClient.left, rcClient.top, x, y);
+
+ pDevice->StretchDIBits(m_pImage, (FX_INT32)x, (FX_INT32)y,
+ (FX_INT32)rcClient.Width(), (FX_INT32)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);
+
+ CPDF_Rect rcClient = GetClientRect();
+
+ fHScale = rcClient.Width() / fImageW;
+ fVScale = rcClient.Height() / fImageH;
+}
+
+/* --------------------------------- CPWL_Signature --------------------------------- */
+
+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(FX_LPCWSTR sText)
+{
+ m_pText->SetText(sText);
+
+ RePosChildWnd();
+}
+
+void CPWL_Signature::SetDescription(FX_LPCWSTR string)
+{
+ m_pDescription->SetText(string);
+
+ RePosChildWnd();
+}
+
+void CPWL_Signature::SetImage(CFX_DIBSource* pImage)
+{
+ m_pImage->SetImage(pImage);
+
+ RePosChildWnd();
+}
+
+void CPWL_Signature::SetImageStream(CPDF_Stream * pStream, FX_LPCSTR sImageAlias)
+{
+ m_pImage->SetPDFStream(pStream);
+ m_pImage->SetImageAlias(sImageAlias);
+
+ RePosChildWnd();
+}
+
+void CPWL_Signature::RePosChildWnd()
+{
+ CPDF_Rect rcClient = GetClientRect();
+
+ CPDF_Rect rcText = rcClient;
+ CPDF_Rect 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, CPDF_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);
+
+ /*
+ CPDF_Rect rcClient = GetClientRect();
+
+ CFX_PathData path;
+
+ path.SetPointCount(2);
+ path.SetPoint(0, rcClient.left, (rcClient.top + rcClient.bottom) * 0.5f, FXPT_MOVETO);
+ path.SetPoint(1, rcClient.right, (rcClient.top + rcClient.bottom) * 0.5f, FXPT_LINETO);
+
+ CFX_GraphStateData gsd;
+ gsd.SetDashCount(2);
+ gsd.m_DashArray[0] = 6.0f;
+ gsd.m_DashArray[1] = 6.0f;
+ gsd.m_DashPhase = 0;
+
+ gsd.m_LineWidth = 10.0f;
+ pDevice->DrawPath(&path, pUser2Device, &gsd, 0, ArgbEncode(255,255,0,0), FXFILL_ALTERNATE);
+ */
+}
+
+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 new file mode 100644 index 0000000000..aabf503f98 --- /dev/null +++ b/fpdfsdk/src/pdfwindow/PWL_SpecialButton.cpp @@ -0,0 +1,110 @@ +// 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 "../../include/pdfwindow/PDFWindow.h"
+#include "../../include/pdfwindow/PWL_Wnd.h"
+#include "../../include/pdfwindow/PWL_Button.h"
+#include "../../include/pdfwindow/PWL_SpecialButton.h"
+#include "../../include/pdfwindow/PWL_Utils.h"
+
+/* --------------------------- CPWL_PushButton ---------------------------- */
+
+CPWL_PushButton::CPWL_PushButton()
+{
+}
+
+CPWL_PushButton::~CPWL_PushButton()
+{
+}
+
+CFX_ByteString CPWL_PushButton::GetClassName() const
+{
+ return "CPWL_PushButton";
+}
+
+CPDF_Rect CPWL_PushButton::GetFocusRect() const
+{
+ return CPWL_Utils::DeflateRect(this->GetWindowRect(),(FX_FLOAT)GetBorderWidth());
+}
+
+/* --------------------------- CPWL_CheckBox ---------------------------- */
+
+CPWL_CheckBox::CPWL_CheckBox() : m_bChecked(FALSE)
+{
+}
+
+CPWL_CheckBox::~CPWL_CheckBox()
+{
+}
+
+CFX_ByteString CPWL_CheckBox::GetClassName() const
+{
+ return "CPWL_CheckBox";
+}
+
+void CPWL_CheckBox::SetCheck(FX_BOOL bCheck)
+{
+ m_bChecked = bCheck;
+}
+
+FX_BOOL CPWL_CheckBox::IsChecked() const
+{
+ return m_bChecked;
+}
+
+FX_BOOL CPWL_CheckBox::OnLButtonUp(const CPDF_Point & point)
+{
+ if (IsReadOnly()) return FALSE;
+
+ SetCheck(!IsChecked());
+ return TRUE;
+}
+
+FX_BOOL CPWL_CheckBox::OnChar(FX_WORD nChar)
+{
+ SetCheck(!IsChecked());
+ return TRUE;
+}
+
+/* --------------------------- CPWL_RadioButton ---------------------------- */
+
+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 CPDF_Point & point)
+{
+ if (IsReadOnly()) return FALSE;
+
+ SetCheck(TRUE);
+ return TRUE;
+}
+
+void CPWL_RadioButton::SetCheck(FX_BOOL bCheck)
+{
+ m_bChecked = bCheck;
+}
+
+FX_BOOL CPWL_RadioButton::IsChecked() const
+{
+ return m_bChecked;
+}
+
+FX_BOOL CPWL_RadioButton::OnChar(FX_WORD nChar)
+{
+ SetCheck(TRUE);
+ return TRUE;
+}
+
diff --git a/fpdfsdk/src/pdfwindow/PWL_Utils.cpp b/fpdfsdk/src/pdfwindow/PWL_Utils.cpp new file mode 100644 index 0000000000..aec1d4db45 --- /dev/null +++ b/fpdfsdk/src/pdfwindow/PWL_Utils.cpp @@ -0,0 +1,2844 @@ +// 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 "../../include/pdfwindow/PDFWindow.h"
+#include "../../include/pdfwindow/PWL_Wnd.h"
+#include "../../include/pdfwindow/PWL_Utils.h"
+#include "../../include/pdfwindow/PWL_Icon.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_Utils ------------------------------ */
+
+CFX_ByteString CPWL_Utils::GetAppStreamFromArray(const CPWL_PathData* pPathData, FX_INT32 nCount)
+{
+ CFX_ByteTextBuf csAP;
+
+ for (FX_INT32 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, FX_INT32 nCount)
+{
+ path.SetPointCount(nCount);
+
+ for (FX_INT32 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;
+ }
+ }
+}
+
+
+CPDF_Rect CPWL_Utils::MaxRect(const CPDF_Rect & rect1,const CPDF_Rect & rect2)
+{
+ CPDF_Rect 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;
+}
+
+CPDF_Rect CPWL_Utils::OffsetRect(const CPDF_Rect & rect,FX_FLOAT x,FX_FLOAT y)
+{
+ return CPDF_Rect(rect.left + x,rect.bottom + y,
+ rect.right + x,rect.top + y);
+}
+
+FX_BOOL CPWL_Utils::ContainsRect(const CPDF_Rect& rcParent, const CPDF_Rect& rcChild)
+{
+ return rcChild.left >= rcParent.left && rcChild.bottom >= rcParent.bottom &&
+ rcChild.right <= rcParent.right && rcChild.top <= rcParent.top;
+}
+
+FX_BOOL CPWL_Utils::IntersectRect(const CPDF_Rect& rect1, const CPDF_Rect& 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;
+}
+
+CPDF_Point CPWL_Utils::OffsetPoint(const CPDF_Point& point,FX_FLOAT x,FX_FLOAT y)
+{
+ return CPDF_Point(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 CPDF_Rect & crBBox)
+{
+ CFX_ByteTextBuf csAP;
+
+ FX_FLOAT fWidth = crBBox.right - crBBox.left;
+ FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
+
+ const FX_INT32 num = 8;
+
+ CPWL_Point pts[num*3] =
+ {
+ //1
+ CPWL_Point(0.28f, 0.52f),
+ CPWL_Point(0.27f, 0.48f),
+ CPWL_Point(0.29f, 0.40f),
+
+ //2
+ CPWL_Point(0.30f, 0.33f),
+ CPWL_Point(0.31f, 0.29f),
+ CPWL_Point(0.31f, 0.28f),
+
+ //3
+ CPWL_Point(0.39f, 0.28f),
+ CPWL_Point(0.49f, 0.29f),
+ CPWL_Point(0.77f, 0.67f),
+
+ //4
+ CPWL_Point(0.76f, 0.68f),
+ CPWL_Point(0.78f, 0.69f),
+ CPWL_Point(0.76f, 0.75f),
+
+ //5
+ CPWL_Point(0.76f, 0.75f),
+ CPWL_Point(0.73f, 0.80f),
+ CPWL_Point(0.68f, 0.75f),
+
+ //6
+ CPWL_Point(0.68f, 0.74f),
+ CPWL_Point(0.68f, 0.74f),
+ CPWL_Point(0.44f, 0.47f),
+
+ //7
+ CPWL_Point(0.43f, 0.47f),
+ CPWL_Point(0.40f, 0.47f),
+ CPWL_Point(0.41f, 0.58f),
+
+ //8
+ CPWL_Point(0.40f, 0.60f),
+ CPWL_Point(0.28f, 0.66f),
+ CPWL_Point(0.30f, 0.56f)
+ };
+
+ for (FX_INT32 j=0; j<num*3; j++)
+ {
+ pts[j].x *= fWidth;
+ pts[j].x += crBBox.left;
+
+ pts[j].y *= fHeight;
+ pts[j].y += crBBox.bottom;
+ }
+
+ csAP << pts[0].x << " " << pts[0].y << " m\n";
+
+ for (FX_INT32 i=0; i<num; i++)
+ {
+ FX_INT32 nCur = i*3;
+ FX_INT32 n1 = i*3 + 1;
+ FX_INT32 n2 = i*3 + 2;
+ FX_INT32 nNext = (i < num-1 ? (i+1)*3 : 0);
+
+ FX_FLOAT px1 = pts[n1].x - pts[nCur].x;
+ FX_FLOAT py1 = pts[n1].y - pts[nCur].y;
+ FX_FLOAT px2 = pts[n2].x - pts[nNext].x;
+ FX_FLOAT py2 = pts[n2].y - pts[nNext].y;
+
+ csAP << pts[nCur].x + px1 * PWL_BEZIER << " " << pts[nCur].y + py1 * PWL_BEZIER << " "
+ << pts[nNext].x + px2 * PWL_BEZIER << " " << pts[nNext].y + py2 * PWL_BEZIER << " "
+ << pts[nNext].x << " " << pts[nNext].y << " c\n";
+ }
+
+ return csAP.GetByteString();
+}
+
+CFX_ByteString CPWL_Utils::GetAP_Circle(const CPDF_Rect & crBBox)
+{
+ CFX_ByteTextBuf csAP;
+
+ FX_FLOAT fWidth = crBBox.right - crBBox.left;
+ FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
+
+ CPDF_Point pt1(crBBox.left,crBBox.bottom + fHeight / 2);
+ CPDF_Point pt2(crBBox.left + fWidth / 2,crBBox.top);
+ CPDF_Point pt3(crBBox.right,crBBox.bottom + fHeight / 2);
+ CPDF_Point 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 * PWL_BEZIER << " "
+ << pt2.x - px * PWL_BEZIER << " " << pt2.y << " "
+ << pt2.x << " " << pt2.y << " c\n";
+
+ px = pt3.x - pt2.x;
+ py = pt2.y - pt3.y;
+
+ csAP << pt2.x + px * PWL_BEZIER << " " << pt2.y << " "
+ << pt3.x << " " << pt3.y + py * PWL_BEZIER << " "
+ << pt3.x << " " << pt3.y << " c\n";
+
+ px = pt3.x - pt4.x;
+ py = pt3.y - pt4.y;
+
+ csAP << pt3.x << " " << pt3.y - py * PWL_BEZIER << " "
+ << pt4.x + px * PWL_BEZIER << " " << pt4.y << " "
+ << pt4.x << " " << pt4.y << " c\n";
+
+ px = pt4.x - pt1.x;
+ py = pt1.y - pt4.y;
+
+ csAP << pt4.x - px * PWL_BEZIER << " " << pt4.y << " "
+ << pt1.x << " " << pt1.y - py * PWL_BEZIER << " "
+ << pt1.x << " " << pt1.y << " c\n";
+
+ return csAP.GetByteString();
+}
+
+CFX_ByteString CPWL_Utils::GetAP_Cross(const CPDF_Rect & 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 CPDF_Rect & crBBox)
+{
+ CFX_ByteTextBuf csAP;
+
+ FX_FLOAT fWidth = crBBox.right - crBBox.left;
+ FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
+
+ CPDF_Point pt1(crBBox.left,crBBox.bottom + fHeight / 2);
+ CPDF_Point pt2(crBBox.left + fWidth / 2,crBBox.top);
+ CPDF_Point pt3(crBBox.right,crBBox.bottom + fHeight / 2);
+ CPDF_Point 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 CPDF_Rect & 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 CPDF_Rect & crBBox)
+{
+ CFX_ByteTextBuf csAP;
+
+ FX_FLOAT fRadius = (crBBox.top - crBBox.bottom)/(1+(FX_FLOAT)cos(PWL_PI/5.0f));
+ CPDF_Point ptCenter = CPDF_Point((crBBox.left + crBBox.right) / 2.0f,(crBBox.top + crBBox.bottom) / 2.0f);
+
+ FX_FLOAT px[5],py[5];
+
+ FX_FLOAT fAngel = PWL_PI/10.0f;
+
+ for (FX_INT32 i=0; i<5; i++)
+ {
+ px[i] = ptCenter.x + fRadius * (FX_FLOAT)cos(fAngel);
+ py[i] = ptCenter.y + fRadius * (FX_FLOAT)sin(fAngel);
+
+ fAngel += PWL_PI * 2 / 5.0f;
+ }
+
+ csAP << px[0] << " " << py[0] << " m\n";
+
+ FX_INT32 nNext = 0;
+ for (FX_INT32 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 CPDF_Rect & crBBox,FX_FLOAT fRotate)
+{
+ CFX_ByteTextBuf csAP;
+
+ FX_FLOAT fWidth = crBBox.right - crBBox.left;
+ FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
+
+ CPDF_Point pt1(-fWidth/2,0);
+ CPDF_Point pt2(0,fHeight/2);
+ CPDF_Point 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 * PWL_BEZIER << " "
+ << pt2.x - px * PWL_BEZIER << " " << pt2.y << " "
+ << pt2.x << " " << pt2.y << " c\n";
+
+ px = pt3.x - pt2.x;
+ py = pt2.y - pt3.y;
+
+ csAP << pt2.x + px * PWL_BEZIER << " " << pt2.y << " "
+ << pt3.x << " " << pt3.y + py * PWL_BEZIER << " "
+ << pt3.x << " " << pt3.y << " c\n";
+
+ return csAP.GetByteString();
+}
+
+
+CPDF_Rect CPWL_Utils::InflateRect(const CPDF_Rect & rcRect, FX_FLOAT fSize)
+{
+ if (rcRect.IsEmpty()) return rcRect;
+
+ CPDF_Rect rcNew(rcRect.left - fSize,
+ rcRect.bottom - fSize,
+ rcRect.right + fSize,
+ rcRect.top + fSize);
+ rcNew.Normalize();
+ return rcNew;
+}
+
+CPDF_Rect CPWL_Utils::DeflateRect(const CPDF_Rect & rcRect, FX_FLOAT fSize)
+{
+ if (rcRect.IsEmpty()) return rcRect;
+
+ CPDF_Rect rcNew(rcRect.left + fSize,
+ rcRect.bottom + fSize,
+ rcRect.right - fSize,
+ rcRect.top - fSize);
+ rcNew.Normalize();
+ return rcNew;
+}
+
+CPDF_Rect CPWL_Utils::ScaleRect(const CPDF_Rect & rcRect,FX_FLOAT fScale)
+{
+ FX_FLOAT fHalfWidth = (rcRect.right - rcRect.left) / 2.0f;
+ FX_FLOAT fHalfHeight = (rcRect.top - rcRect.bottom) / 2.0f;
+
+ CPDF_Point ptCenter = CPDF_Point((rcRect.left + rcRect.right) / 2,(rcRect.top + rcRect.bottom) / 2);
+
+ return CPDF_Rect(ptCenter.x - fHalfWidth * fScale,
+ ptCenter.y - fHalfHeight * fScale,
+ ptCenter.x + fHalfWidth * fScale,
+ ptCenter.y + fHalfHeight * fScale);
+}
+
+CFX_ByteString CPWL_Utils::GetRectFillAppStream(const CPDF_Rect & 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 CPDF_Rect & 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();
+}
+
+CPDF_Rect CPWL_Utils::GetCenterSquare(const CPDF_Rect & 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 CPDF_Rect(fCenterX - fRadius,fCenterY - fRadius,fCenterX + fRadius,fCenterY + fRadius);
+}
+
+CFX_ByteString CPWL_Utils::GetEditAppStream(IFX_Edit* pEdit, const CPDF_Point & 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 CPDF_Point & 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;
+ FX_INT32 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 CPDF_Point & 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 CPDF_Point & ptOffset,
+ const CPVT_WordRange * pRange)
+{
+ ASSERT(pEdit != NULL);
+ ASSERT(pSpellCheck != NULL);
+
+ 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 CPDF_Rect & rcBBox,IFX_Edit_FontMap * pFontMap,
+ const CFX_WideString & sText, FX_INT32 nAlignmentH, FX_INT32 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);
+
+ CFX_ByteString sEdit = CPWL_Utils::GetEditAppStream(pEdit, CPDF_Point(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 CPDF_Rect & rcBBox,
+ IFX_Edit_FontMap * pFontMap,
+ CPDF_Stream * pIconStream,
+ CPDF_IconFit & IconFit,
+ const CFX_WideString & sLabel,
+ const CPWL_Color & crText,
+ FX_FLOAT fFontSize,
+ FX_INT32 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);
+
+ CPDF_Rect rcLabelContent = pEdit->GetContentRect();
+
+ CPWL_Icon Icon;
+ PWL_CREATEPARAM cp;
+ cp.dwFlags = PWS_VISIBLE;
+ Icon.Create(cp);
+ Icon.SetIconFit(&IconFit);
+ Icon.SetPDFStream(pIconStream);
+
+ CPDF_Rect rcLabel = CPDF_Rect(0,0,0,0);
+ CPDF_Rect rcIcon = CPDF_Rect(0,0,0,0);
+ FX_FLOAT fWidth = 0.0f;
+ FX_FLOAT fHeight = 0.0f;
+
+ switch (nLayOut)
+ {
+ case PPBL_LABEL:
+ rcLabel = rcBBox;
+ rcIcon = CPDF_Rect(0,0,0,0);
+ break;
+ case PPBL_ICON:
+ rcIcon = rcBBox;
+ rcLabel = CPDF_Rect(0,0,0,0);
+ break;
+ case PPBL_ICONTOPLABELBOTTOM:
+
+ if (pIconStream)
+ {
+ if (IsFloatZero(fFontSize))
+ {
+ fHeight = rcBBox.top - rcBBox.bottom;
+ rcLabel = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcBBox.right,rcBBox.bottom + fHeight * fAutoFontScale);
+ rcIcon = CPDF_Rect(rcBBox.left,rcLabel.top,rcBBox.right,rcBBox.top);
+ }
+ else
+ {
+ fHeight = rcLabelContent.Height();
+
+ if (rcBBox.bottom + fHeight > rcBBox.top)
+ {
+ rcIcon = CPDF_Rect(0,0,0,0);
+ rcLabel = rcBBox;
+ }
+ else
+ {
+ rcLabel = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcBBox.right,rcBBox.bottom + fHeight);
+ rcIcon = CPDF_Rect(rcBBox.left,rcLabel.top,rcBBox.right,rcBBox.top);
+ }
+ }
+ }
+ else
+ {
+ rcLabel = rcBBox;
+ rcIcon = CPDF_Rect(0,0,0,0);
+ }
+
+ break;
+ case PPBL_LABELTOPICONBOTTOM:
+
+ if (pIconStream)
+ {
+ if (IsFloatZero(fFontSize))
+ {
+ fHeight = rcBBox.top - rcBBox.bottom;
+ rcLabel = CPDF_Rect(rcBBox.left,rcBBox.top - fHeight * fAutoFontScale ,rcBBox.right,rcBBox.top);
+ rcIcon = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcBBox.right,rcLabel.bottom);
+ }
+ else
+ {
+ fHeight = rcLabelContent.Height();
+
+ if (rcBBox.bottom + fHeight > rcBBox.top)
+ {
+ rcIcon = CPDF_Rect(0,0,0,0);
+ rcLabel = rcBBox;
+ }
+ else
+ {
+ rcLabel = CPDF_Rect(rcBBox.left,rcBBox.top - fHeight,rcBBox.right,rcBBox.top);
+ rcIcon = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcBBox.right,rcLabel.bottom);
+ }
+ }
+ }
+ else
+ {
+ rcLabel = rcBBox;
+ rcIcon = CPDF_Rect(0,0,0,0);
+ }
+
+ break;
+ case PPBL_ICONLEFTLABELRIGHT:
+
+ if (pIconStream)
+ {
+ if (IsFloatZero(fFontSize))
+ {
+ fWidth = rcBBox.right - rcBBox.left;
+ rcLabel = CPDF_Rect(rcBBox.right - fWidth * fAutoFontScale,rcBBox.bottom,rcBBox.right,rcBBox.top);
+ rcIcon = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcLabel.left,rcBBox.top);
+
+ if (rcLabelContent.Width() < fWidth * fAutoFontScale)
+ {
+ }
+ else
+ {
+ if (rcLabelContent.Width() < fWidth)
+ {
+ rcLabel = CPDF_Rect(rcBBox.right - rcLabelContent.Width(),rcBBox.bottom,rcBBox.right,rcBBox.top);
+ rcIcon = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcLabel.left,rcBBox.top);
+ }
+ else
+ {
+ rcLabel = rcBBox;
+ rcIcon = CPDF_Rect(0,0,0,0);
+ }
+ }
+ }
+ else
+ {
+ fWidth = rcLabelContent.Width();
+
+ if (rcBBox.left + fWidth > rcBBox.right)
+ {
+ rcLabel = rcBBox;
+ rcIcon = CPDF_Rect(0,0,0,0);
+ }
+ else
+ {
+ rcLabel = CPDF_Rect(rcBBox.right - fWidth,rcBBox.bottom,rcBBox.right,rcBBox.top);
+ rcIcon = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcLabel.left,rcBBox.top);
+ }
+ }
+ }
+ else
+ {
+ rcLabel = rcBBox;
+ rcIcon = CPDF_Rect(0,0,0,0);
+ }
+
+ break;
+ case PPBL_LABELLEFTICONRIGHT:
+
+ if (pIconStream)
+ {
+ if (IsFloatZero(fFontSize))
+ {
+ fWidth = rcBBox.right - rcBBox.left;
+ rcLabel = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcBBox.left + fWidth * fAutoFontScale,rcBBox.top);
+ rcIcon = CPDF_Rect(rcLabel.right,rcBBox.bottom,rcBBox.right,rcBBox.top);
+
+ if (rcLabelContent.Width() < fWidth * fAutoFontScale)
+ {
+ }
+ else
+ {
+ if (rcLabelContent.Width() < fWidth)
+ {
+ rcLabel = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcBBox.left + rcLabelContent.Width(),rcBBox.top);
+ rcIcon = CPDF_Rect(rcLabel.right,rcBBox.bottom,rcBBox.right,rcBBox.top);
+ }
+ else
+ {
+ rcLabel = rcBBox;
+ rcIcon = CPDF_Rect(0,0,0,0);
+ }
+ }
+ }
+ else
+ {
+ fWidth = rcLabelContent.Width();
+
+ if (rcBBox.left + fWidth > rcBBox.right)
+ {
+ rcLabel = rcBBox;
+ rcIcon = CPDF_Rect(0,0,0,0);
+ }
+ else
+ {
+ rcLabel = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcBBox.left + fWidth,rcBBox.top);
+ rcIcon = CPDF_Rect(rcLabel.right,rcBBox.bottom,rcBBox.right,rcBBox.top);
+ }
+ }
+ }
+ else
+ {
+ rcLabel = rcBBox;
+ rcIcon = CPDF_Rect(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,CPDF_Point(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 CPDF_Rect & rect, FX_FLOAT fWidth,
+ const CPWL_Color & color, const CPWL_Color & crLeftTop, const CPWL_Color & crRightBottom,
+ FX_INT32 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 CPDF_Rect & rect, FX_FLOAT fWidth,
+ const CPWL_Color & color, const CPWL_Color & crLeftTop, const CPWL_Color & crRightBottom,
+ FX_INT32 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),PWL_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),PWL_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),PWL_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),PWL_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 CPDF_Rect & 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 CPDF_Rect & 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 CPDF_Rect & 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 CPDF_Rect & 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 CPDF_Rect & 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 CPDF_Rect & 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 CPDF_Rect & rcBBox,
+ FX_INT32 nStyle,
+ const CPWL_Color & crText)
+{
+ CPDF_Rect 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 CPDF_Rect & rcBBox,
+ FX_INT32 nStyle,
+ const CPWL_Color & crText)
+{
+ CPDF_Rect 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 CPDF_Rect & 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";
+
+ CPDF_Point ptCenter = CPDF_Point((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 - FX_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 - FX_MIN(1.0f, dC + dK);
+ dG = 1.0f - FX_MIN(1.0f, dM + dK);
+ dB = 1.0f - FX_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 = FX_MIN(dC, FX_MIN(dM, dY));
+}
+
+void CPWL_Utils::PWLColorToARGB(const CPWL_Color& color, FX_INT32& 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, FX_INT32 nTransparancy)
+{
+ FX_INT32 nAlpha = nTransparancy;
+ FX_FLOAT dRed = 0;
+ FX_FLOAT dGreen = 0;
+ FX_FLOAT dBlue = 0;
+
+ PWLColorToARGB(color, nAlpha, dRed, dGreen, dBlue);
+
+ return ArgbEncode(nAlpha, (FX_INT32)(dRed*255), (FX_INT32)(dGreen*255), (FX_INT32)(dBlue*255));
+}
+
+void CPWL_Utils::DrawFillRect(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,const CPDF_Rect & rect,
+ const FX_COLORREF & color)
+{
+ CFX_PathData path;
+ CPDF_Rect 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, CPDF_Matrix* pUser2Device,
+ const CPDF_Point* pPts, FX_INT32 nCount, const FX_COLORREF& color)
+{
+ CFX_PathData path;
+ path.SetPointCount(nCount);
+
+ path.SetPoint(0, pPts[0].x, pPts[0].y, FXPT_MOVETO);
+ for (FX_INT32 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, CPDF_Matrix* pUser2Device,const CPDF_Rect & rect,
+ const FX_COLORREF & color, FX_FLOAT fWidth)
+{
+ CFX_PathData path;
+ CPDF_Rect 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, CPDF_Matrix* pUser2Device,
+ const CPDF_Point & ptMoveTo, const CPDF_Point & 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, CPDF_Matrix* pUser2Device,const CPDF_Rect & rect,
+ const CPWL_Color & color, FX_INT32 nTransparancy)
+{
+ CPWL_Utils::DrawFillRect(pDevice,pUser2Device,rect,PWLColorToFXColor(color,nTransparancy));
+}
+
+void CPWL_Utils::DrawShadow(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
+ FX_BOOL bVertical, FX_BOOL bHorizontal, CPDF_Rect rect,
+ FX_INT32 nTransparancy, FX_INT32 nStartGray, FX_INT32 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)
+ {
+ FX_INT32 nGray = nStartGray + (FX_INT32)(fStepGray * (fy-rect.bottom));
+ CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, CPDF_Point(rect.left, fy),
+ CPDF_Point(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)
+ {
+ FX_INT32 nGray = nStartGray + (FX_INT32)(fStepGray * (fx-rect.left));
+ CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, CPDF_Point(fx, rect.bottom),
+ CPDF_Point(fx, rect.top), ArgbEncode(nTransparancy, nGray, nGray, nGray), 1.5f);
+ }
+ }
+}
+
+void CPWL_Utils::DrawBorder(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
+ const CPDF_Rect & rect, FX_FLOAT fWidth,
+ const CPWL_Color & color, const CPWL_Color & crLeftTop, const CPWL_Color & crRightBottom,
+ FX_INT32 nStyle, const CPWL_Dash & dash, FX_INT32 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;
+ FX_INT32 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, CPDF_Matrix* pUser2Device, IFX_Edit* pEdit,
+ const CPDF_Rect& rcClip, const CPDF_Point& 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())
+ {
+ CPDF_Rect rcTemp = rcClip;
+ pUser2Device->TransformRect(rcTemp);
+ FX_RECT rcDevClip;
+ rcDevClip.left = (FX_INT32)rcTemp.left;
+ rcDevClip.right = (FX_INT32)rcTemp.right;
+ rcDevClip.top = (FX_INT32)rcTemp.top;
+ rcDevClip.bottom = (FX_INT32)rcTemp.bottom;
+ pDevice->SetClip_Rect(&rcDevClip);
+ }
+
+ 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(FX_INT32 nType, const CPDF_Rect& 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, CPDF_Matrix* pUser2Device,
+ FX_INT32 nType, const CPDF_Rect & rect, const CPWL_Color& crFill, const CPWL_Color& crStroke, const FX_INT32 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 CPDF_Rect& 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 + PWL_BEZIER*(fWidth / 7.0f - fWidth / 15.0f),
+ crBBox.bottom + fHeight * 2 / 5.0f + PWL_BEZIER*(fHeight * 2 / 7.0f - fHeight * 2 / 5.0f)), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 4.5f + PWL_BEZIER*(fWidth / 5.0f - fWidth / 4.5f),
+ crBBox.bottom + fHeight / 16.0f + PWL_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 + PWL_BEZIER*(fWidth / 4.4f - fWidth / 4.5f),
+ crBBox.bottom + fHeight / 16.0f - PWL_BEZIER*fHeight / 16.0f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 3.0f + PWL_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 + PWL_BEZIER*fWidth*(1/7.0f + 2/15.0f),
+ crBBox.bottom + PWL_BEZIER*fHeight * 4 / 5.0f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 14 / 15.0f + PWL_BEZIER*fWidth*(1/7.0f - 7/15.0f),
+ crBBox.bottom + fHeight * 15/16.0f + PWL_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 + PWL_BEZIER*(fWidth * 7 / 15.0f - fWidth * 14 / 15.0f),
+ crBBox.bottom + fHeight * 15 / 16.0f + PWL_BEZIER*(fHeight * 8 / 7.0f - fHeight * 15 / 16.0f)), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 3.6f + PWL_BEZIER*(fWidth / 3.4f - fWidth / 3.6f),
+ crBBox.bottom + fHeight / 3.5f + PWL_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 + PWL_BEZIER*(fHeight / 4.0f - fHeight / 3.5f)), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 15.0f + PWL_BEZIER*(fWidth / 3.5f - fWidth / 15.0f),
+ crBBox.bottom + fHeight * 2 / 5.0f + PWL_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 CPDF_Rect& 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 + PWL_BEZIER*(fHeight*14/15.0f - fHeight/2.0f)), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f - PWL_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 + PWL_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 + PWL_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 - PWL_BEZIER*(fHeight/2.0f - fHeight/15.0f)), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f + PWL_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 - PWL_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 - PWL_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 + PWL_BEZIER*(fHeight*4/5.0f - fHeight/2.0f)), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f - PWL_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 + PWL_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 + PWL_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 - PWL_BEZIER*(fHeight*4/5.0f - fHeight/2.0f)), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f + PWL_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 - PWL_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 - PWL_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 CPDF_Rect& 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 + PWL_BEZIER*(fHeight/6.0f - fHeight/10.0f)), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*2/15.0f - PWL_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 + PWL_BEZIER*fWidth/15.0f, crBBox.top - fHeight/10.0f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15.0f, crBBox.top - fHeight/6 + PWL_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 + PWL_BEZIER*fHeight/15.0f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*2/15.0f + PWL_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 + PWL_BEZIER*fHeight*2/15.0f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*5/15.0f - PWL_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 + PWL_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 + PWL_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 - PWL_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 - PWL_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 CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
+{
+ FX_FLOAT fWidth = crBBox.right - crBBox.left;
+ FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
+ //FX_FLOAT fcatercorner = (FX_FLOAT)sqrt(fWidth*fWidth + fHeight*fHeight);
+ 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 CPDF_Rect& 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 + PWL_BEZIER*(fHeight/60.0f - fHeight/2.0f)), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f - PWL_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 + PWL_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 + PWL_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 + PWL_BEZIER*fHeight*29/60.0f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f + PWL_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 - PWL_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 + PWL_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 + PWL_BEZIER*fHeight*0.23f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f - PWL_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 + PWL_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 + PWL_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 + PWL_BEZIER*fHeight*0.13f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f + PWL_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 - PWL_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 + PWL_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 + PWL_BEZIER*fHeight*0.055f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.505f - PWL_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 + PWL_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 + PWL_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 - PWL_BEZIER*fHeight*0.055f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.505f + PWL_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 - PWL_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 - PWL_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 CPDF_Rect& 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 CPDF_Rect& 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 CPDF_Rect& 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 CPDF_Rect& 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 CPDF_Rect& 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 CPDF_Rect& 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 CPDF_Rect& 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 CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
+{
+ FX_FLOAT fLongRadius = (crBBox.top - crBBox.bottom)/(1+(FX_FLOAT)cos(PWL_PI/5.0f));
+ fLongRadius = fLongRadius * 0.7f;
+ FX_FLOAT fShortRadius = fLongRadius * 0.55f;
+ CPDF_Point ptCenter = CPDF_Point((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 = PWL_PI/10.0f;
+
+ for (FX_INT32 i=0; i<5; i++)
+ {
+ px1[i] = ptCenter.x + fLongRadius * (FX_FLOAT)cos(fAngel);
+ py1[i] = ptCenter.y + fLongRadius * (FX_FLOAT)sin(fAngel);
+
+ fAngel += PWL_PI * 2 / 5.0f;
+ }
+
+ fAngel = PWL_PI/5.0f + PWL_PI/10.0f;
+
+ for (FX_INT32 j=0; j<5; j++)
+ {
+ px2[j] = ptCenter.x + fShortRadius * (FX_FLOAT)cos(fAngel);
+ py2[j] = ptCenter.y + fShortRadius * (FX_FLOAT)sin(fAngel);
+
+ fAngel += PWL_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(FX_INT32 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 CPDF_Rect& 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 CPDF_Rect& 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 CPDF_Rect& 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 CPDF_Rect& 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 CPDF_Rect& 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 CPDF_Rect& 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 CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
+{
+ FX_FLOAT fOutWidth = crBBox.right - crBBox.left;
+ FX_FLOAT fOutHeight = crBBox.top - crBBox.bottom;
+
+ CPDF_Rect 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 - PWL_BEZIER * fHeight * 0.4f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.45f - PWL_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 - PWL_BEZIER * fHeight * 0.7f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.75f - PWL_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 + PWL_BEZIER * fWidth*0.60f, crInBox.top - fHeight*0.55f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crInBox.left + fWidth * 0.60f, crInBox.top - PWL_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 - PWL_BEZIER * fHeight * 0.85f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.90f - PWL_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),
+
+ /*
+ CPWL_PathData(CPWL_Point(crBBox.left, crBBox.top), PWLPT_MOVETO),
+ CPWL_PathData(CPWL_Point(crBBox.right, crBBox.top), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.right, crBBox.bottom), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left, crBBox.bottom), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left, crBBox.top), PWLPT_LINETO),
+
+ CPWL_PathData(CPWL_Point(crBBox.left+fOutWidth*0.04f, crBBox.top-fOutHeight*0.04f), PWLPT_MOVETO),
+ CPWL_PathData(CPWL_Point(crBBox.right-fOutWidth*0.04f, crBBox.top-fOutHeight*0.04f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.right-fOutWidth*0.04f, crBBox.bottom+fOutHeight*0.04f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left+fOutWidth*0.04f, crBBox.bottom+fOutHeight*0.04f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left+fOutWidth*0.04f, crBBox.top-fOutHeight*0.04f), PWLPT_LINETO),
+ */
+ };
+
+ if(type == PWLPT_STREAM)
+ sPathData = GetAppStreamFromArray(PathArray, 23);
+ else
+ GetPathDataFromArray(path, PathArray, 23);
+}
+
+void CPWL_Color::ConvertColorType(FX_INT32 nColorType)
+{
+ switch (this->nColorType)
+ {
+ case COLORTYPE_TRANSPARENT:
+ break;
+ case COLORTYPE_GRAY:
+ switch (nColorType)
+ {
+ case COLORTYPE_RGB:
+ CPWL_Utils::ConvertGRAY2RGB(this->fColor1, this->fColor1, this->fColor2, this->fColor3);
+ break;
+ case COLORTYPE_CMYK:
+ CPWL_Utils::ConvertGRAY2CMYK(this->fColor1, this->fColor1, this->fColor2, this->fColor3, this->fColor4);
+ break;
+ }
+ break;
+ case COLORTYPE_RGB:
+ switch (nColorType)
+ {
+ case COLORTYPE_GRAY:
+ CPWL_Utils::ConvertRGB2GRAY(this->fColor1, this->fColor2, this->fColor3, this->fColor1);
+ break;
+ case COLORTYPE_CMYK:
+ CPWL_Utils::ConvertRGB2CMYK(this->fColor1, this->fColor2, this->fColor3, this->fColor1, this->fColor2, this->fColor3, this->fColor4);
+ break;
+ }
+ break;
+ case COLORTYPE_CMYK:
+ switch (nColorType)
+ {
+ case COLORTYPE_GRAY:
+ CPWL_Utils::ConvertCMYK2GRAY(this->fColor1, this->fColor2, this->fColor3, this->fColor4, this->fColor1);
+ break;
+ case COLORTYPE_RGB:
+ CPWL_Utils::ConvertCMYK2RGB(this->fColor1, this->fColor2, this->fColor3, this->fColor4, this->fColor1, this->fColor2, this->fColor3);
+ break;
+ }
+ break;
+ }
+ this->nColorType = nColorType;
+}
+
+
diff --git a/fpdfsdk/src/pdfwindow/PWL_Wnd.cpp b/fpdfsdk/src/pdfwindow/PWL_Wnd.cpp new file mode 100644 index 0000000000..035ffbbf4d --- /dev/null +++ b/fpdfsdk/src/pdfwindow/PWL_Wnd.cpp @@ -0,0 +1,1342 @@ +// 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 "../../include/pdfwindow/PDFWindow.h"
+#include "../../include/pdfwindow/PWL_Wnd.h"
+#include "../../include/pdfwindow/PWL_Utils.h"
+#include "../../include/pdfwindow/PWL_ScrollBar.h"
+
+/* -------------------------- CPWL_Timer -------------------------- */
+
+static CFX_MapPtrTemplate<FX_INT32, CPWL_Timer*> g_TimeMap;
+
+CPWL_Timer::CPWL_Timer(CPWL_TimerHandler* pAttached, IFX_SystemHandler* pSystemHandler) :
+ m_pAttached(pAttached),
+ m_nTimerID(0),
+ m_pSystemHandler(pSystemHandler)
+{
+ ASSERT(m_pAttached != NULL);
+ ASSERT(m_pSystemHandler != NULL);
+}
+
+CPWL_Timer::~CPWL_Timer()
+{
+ KillPWLTimer();
+}
+
+FX_INT32 CPWL_Timer::SetPWLTimer(FX_INT32 nElapse)
+{
+ if (m_nTimerID != 0) KillPWLTimer();
+ m_nTimerID = m_pSystemHandler->SetTimer(nElapse, TimerProc);
+ g_TimeMap.SetAt(m_nTimerID, this);
+ return m_nTimerID;
+}
+
+void CPWL_Timer::KillPWLTimer()
+{
+ if (m_nTimerID != 0)
+ {
+ m_pSystemHandler->KillTimer(m_nTimerID);
+ g_TimeMap.RemoveKey(m_nTimerID);
+ m_nTimerID = 0;
+ }
+}
+
+void CPWL_Timer::TimerProc(FX_INT32 idEvent)
+{
+ CPWL_Timer* pTimer = NULL;
+ if (g_TimeMap.Lookup(idEvent, pTimer))
+ {
+ if (pTimer)
+ {
+ if (pTimer->m_pAttached)
+ pTimer->m_pAttached->TimerProc();
+ }
+ }
+}
+
+/* -------------------------- CPWL_TimerHandler -------------------------- */
+
+CPWL_TimerHandler::CPWL_TimerHandler() : m_pTimer(NULL)
+{
+}
+
+CPWL_TimerHandler::~CPWL_TimerHandler()
+{
+ if (m_pTimer) delete m_pTimer;
+}
+
+void CPWL_TimerHandler::BeginTimer(FX_INT32 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()
+{
+}
+
+/* --------------------------- CPWL_MsgControl ---------------------------- */
+
+class CPWL_MsgControl
+{
+ friend class CPWL_Wnd;
+
+public:
+ CPWL_MsgControl(CPWL_Wnd * pWnd)
+ {
+// PWL_TRACE("new CPWL_MsgControl\n");
+ m_pCreatedWnd = pWnd;
+ Default();
+ }
+
+ ~CPWL_MsgControl()
+ {
+// PWL_TRACE("~CPWL_MsgControl\n");
+ 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( FX_INT32 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( FX_INT32 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::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 = CPDF_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::Destroy()
+{
+ KillFocus();
+
+ OnDestroy();
+
+ if (m_bCreated)
+ {
+ for (FX_INT32 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 CPDF_Rect & rcNew, FX_BOOL bReset,FX_BOOL bRefresh)
+{
+ if (IsValid())
+ {
+ CPDF_Rect rcOld = this->GetWindowRect();
+
+ m_rcWindow = rcNew;
+ m_rcWindow.Normalize();
+ //m_rcClip = CPWL_Utils::InflateRect(m_rcWindow,1.0f); //for special caret
+
+ 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 CPDF_Rect & rcOld, const CPDF_Rect & rcNew)
+{
+ CPDF_Rect rcUnion = rcOld;
+ rcUnion.Union(rcNew);
+
+ InvalidateRect(&rcUnion);
+
+ /*
+ CPDF_Rect SubArray[4];
+
+ rcOld.Substract4(rcNew,SubArray);
+ for (FX_INT32 i=0;i<4;i++)
+ {
+ if (SubArray[i].left == 0 &&
+ SubArray[i].right == 0 &&
+ SubArray[i].top == 0 &&
+ SubArray[i].bottom == 0)continue;
+
+ InvalidateRect(&CPWL_Utils::InflateRect(SubArray[i],2));
+ }
+
+ rcNew.Substract4(rcOld,SubArray);
+ for (FX_INT32 j=0;j<4;j++)
+ {
+ if (SubArray[j].left == 0 &&
+ SubArray[j].right == 0 &&
+ SubArray[j].top == 0 &&
+ SubArray[j].bottom == 0)continue;
+
+ InvalidateRect(&CPWL_Utils::InflateRect(SubArray[j],2));
+ }
+ */
+}
+
+void CPWL_Wnd::GetAppearanceStream(CFX_ByteString & sAppStream)
+{
+ if (IsValid())
+ {
+ CFX_ByteTextBuf sTextBuf;
+ GetAppearanceStream(sTextBuf);
+ sAppStream += sTextBuf.GetByteString();
+ }
+}
+
+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)
+{
+ CPDF_Rect rectWnd = GetWindowRect();
+ if (!rectWnd.IsEmpty())
+ {
+ CFX_ByteTextBuf sThis;
+
+ if (HasFlag(PWS_BACKGROUND))
+ sThis << CPWL_Utils::GetRectFillAppStream(rectWnd,this->GetBackgroundColor());
+
+ if (HasFlag(PWS_BORDER))
+ sThis << CPWL_Utils::GetBorderAppStream(rectWnd,
+ (FX_FLOAT)GetBorderWidth(),
+ GetBorderColor(),
+ this->GetBorderLeftTopColor(this->GetBorderStyle()),
+ this->GetBorderRightBottomColor(this->GetBorderStyle()),
+ this->GetBorderStyle(),
+ this->GetBorderDash());
+
+ sAppStream << sThis;
+ }
+}
+
+void CPWL_Wnd::GetChildAppearanceStream(CFX_ByteTextBuf & sAppStream)
+{
+ for (FX_INT32 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, CPDF_Matrix* pUser2Device)
+{
+ if (IsValid() && IsVisible())
+ {
+ DrawThisAppearance(pDevice,pUser2Device);
+ DrawChildAppearance(pDevice,pUser2Device);
+ }
+}
+
+void CPWL_Wnd::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)
+{
+ CPDF_Rect rectWnd = GetWindowRect();
+ if (!rectWnd.IsEmpty())
+ {
+ if (HasFlag(PWS_BACKGROUND))
+ {
+ CPDF_Rect rcClient = CPWL_Utils::DeflateRect(rectWnd,(FX_FLOAT)(GetBorderWidth()+GetInnerBorderWidth()));
+ CPWL_Utils::DrawFillRect(pDevice,pUser2Device,rcClient,this->GetBackgroundColor(),GetTransparency());
+ }
+
+ if (HasFlag(PWS_BORDER))
+ CPWL_Utils::DrawBorder(pDevice,
+ pUser2Device,
+ rectWnd,
+ (FX_FLOAT)GetBorderWidth(),
+ GetBorderColor(),
+ this->GetBorderLeftTopColor(this->GetBorderStyle()),
+ this->GetBorderRightBottomColor(this->GetBorderStyle()),
+ this->GetBorderStyle(),
+ this->GetBorderDash(),
+ GetTransparency());
+ }
+}
+
+void CPWL_Wnd::DrawChildAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)
+{
+ for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)
+ {
+ if (CPWL_Wnd * pChild = m_aChildren.GetAt(i))
+ {
+ CPDF_Matrix mt = pChild->GetChildMatrix();
+ if (mt.IsIdentity())
+ {
+ pChild->DrawAppearance(pDevice,pUser2Device);
+ }
+ else
+ {
+ mt.Concat(*pUser2Device);
+ pChild->DrawAppearance(pDevice,&mt);
+ }
+ }
+ }
+}
+
+void CPWL_Wnd::InvalidateRect(CPDF_Rect* pRect)
+{
+ if (IsValid())
+ {
+ CPDF_Rect rcRefresh = pRect ? *pRect : GetWindowRect();
+
+ if (!HasFlag(PWS_NOREFRESHCLIP))
+ {
+ CPDF_Rect 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 (FX_INT32 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 CPDF_Point & point, FX_DWORD nFlag)\
+{\
+ if (IsValid() && IsVisible() && IsEnabled())\
+ {\
+ if (IsWndCaptureMouse(this))\
+ {\
+ for (FX_INT32 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 (FX_INT32 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 (this->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(OnRButtonDblClk)
+PWL_IMPLEMENT_MOUSE_METHOD(OnRButtonDown)
+PWL_IMPLEMENT_MOUSE_METHOD(OnRButtonUp)
+PWL_IMPLEMENT_MOUSE_METHOD(OnMouseMove)
+
+FX_BOOL CPWL_Wnd::OnMouseWheel(short zDelta, const CPDF_Point & point, FX_DWORD nFlag)
+{
+ if (IsValid() && IsVisible() && IsEnabled())
+ {
+ SetCursor();
+ if (IsWndCaptureKeyboard(this))
+ {
+ for (FX_INT32 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 (FX_INT32 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, FX_INTPTR wParam, FX_INTPTR lParam)
+{
+ switch (msg)
+ {
+ case PNM_ADDCHILD:
+ this->AddChild(pWnd);
+ break;
+ case PNM_REMOVECHILD:
+ this->RemoveChild(pWnd);
+ break;
+ default:
+ break;
+ }
+}
+
+FX_BOOL CPWL_Wnd::IsValid() const
+{
+ return m_bCreated;
+}
+
+PWL_CREATEPARAM CPWL_Wnd::GetCreationParam() const
+{
+ return m_sPrivateParam;
+}
+
+CPWL_Wnd* CPWL_Wnd::GetParentWindow() const
+{
+ return m_sPrivateParam.pParentWnd;
+}
+
+CPDF_Rect CPWL_Wnd::GetOriginWindowRect() const
+{
+ return m_sPrivateParam.rcRectWnd;
+}
+
+CPDF_Rect CPWL_Wnd::GetWindowRect() const
+{
+ return m_rcWindow;
+}
+
+CPDF_Rect CPWL_Wnd::GetClientRect() const
+{
+ CPDF_Rect rcWindow = GetWindowRect();
+ CPDF_Rect rcClient = CPWL_Utils::DeflateRect(rcWindow,(FX_FLOAT)(GetBorderWidth()+GetInnerBorderWidth()));
+
+ if (CPWL_ScrollBar * pVSB = this->GetVScrollBar())
+ rcClient.right -= pVSB->GetScrollBarWidth();
+
+ rcClient.Normalize();
+
+ if (rcWindow.Contains(rcClient))
+ return rcClient;
+ else
+ return CPDF_Rect();
+}
+
+CPDF_Point CPWL_Wnd::GetCenterPoint() const
+{
+ CPDF_Rect rcClient = GetClientRect();
+
+ return CPDF_Point((rcClient.left + rcClient.right) * 0.5f,
+ (rcClient.top + rcClient.bottom) * 0.5f);
+}
+
+CPDF_Rect CPWL_Wnd::GetClientCenterSquare() const
+{
+ return CPWL_Utils::GetCenterSquare(GetClientRect());
+}
+
+CPDF_Rect CPWL_Wnd::GetWindowCenterSquare() const
+{
+ return CPWL_Utils::GetCenterSquare(CPWL_Utils::DeflateRect(GetWindowRect(),0.1f));
+}
+
+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;
+}
+
+FX_INT32 CPWL_Wnd::GetBorderStyle() const
+{
+ return m_sPrivateParam.nBorderStyle;
+}
+
+void CPWL_Wnd::SetBorderStyle(FX_INT32 nBorderStyle)
+{
+ if (HasFlag(PWS_BORDER))
+ m_sPrivateParam.nBorderStyle = nBorderStyle;
+}
+
+FX_INT32 CPWL_Wnd::GetBorderWidth() const
+{
+ if (HasFlag(PWS_BORDER))
+ return m_sPrivateParam.dwBorderWidth;
+
+ return 0;
+}
+
+FX_INT32 CPWL_Wnd::GetInnerBorderWidth() const
+{
+ /*
+ switch (GetBorderStyle())
+ {
+ case PBS_BEVELED:
+ case PBS_INSET:
+ return GetBorderWidth() / 2;
+ }
+ */
+ return 0;
+}
+
+void CPWL_Wnd::SetBorderWidth(FX_INT32 nBorderWidth)
+{
+ if (HasFlag(PWS_BORDER))
+ m_sPrivateParam.dwBorderWidth = nBorderWidth;
+}
+
+CPWL_Color CPWL_Wnd::GetBorderColor() const
+{
+ if (HasFlag(PWS_BORDER))
+ return m_sPrivateParam.sBorderColor;
+
+ return CPWL_Color();
+}
+
+void CPWL_Wnd::SetBorderColor(const CPWL_Color & color)
+{
+ if (HasFlag(PWS_BORDER))
+ m_sPrivateParam.sBorderColor = color;
+}
+
+CPWL_Dash CPWL_Wnd::GetBorderDash() const
+{
+ return m_sPrivateParam.sDash;
+}
+
+void* CPWL_Wnd::GetAttachedData() const
+{
+ return m_sPrivateParam.pAttachedData;
+}
+
+void CPWL_Wnd::SetBorderDash(const CPWL_Dash & sDash)
+{
+ if (HasFlag(PWS_BORDER))
+ m_sPrivateParam.sDash = sDash;
+}
+
+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;
+
+ if ((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 (FX_INT32 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 CPDF_Point & point) const
+{
+ return IsValid() && IsVisible() && GetWindowRect().Contains(point.x,point.y);
+}
+
+FX_BOOL CPWL_Wnd::ClientHitTest(const CPDF_Point & 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();
+ else
+ return this;
+}
+
+void CPWL_Wnd::SetVisible(FX_BOOL bVisible)
+{
+ if (IsValid())
+ {
+ for (FX_INT32 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 CPDF_Rect & rect)
+{
+ m_rcClip = rect;
+ m_rcClip.Normalize();
+}
+
+CPDF_Rect CPWL_Wnd::GetClipRect() const
+{
+ return m_rcClip;
+}
+
+FX_BOOL CPWL_Wnd::IsReadOnly() const
+{
+ return HasFlag(PWS_READONLY);
+}
+
+void CPWL_Wnd::RePosChildWnd()
+{
+ CPDF_Rect rcContent = CPWL_Utils::DeflateRect(GetWindowRect(),(FX_FLOAT)(GetBorderWidth()+GetInnerBorderWidth()));
+
+ CPWL_ScrollBar * pVSB = this->GetVScrollBar();
+
+ CPDF_Rect rcVScroll = CPDF_Rect(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())
+ {
+ FX_INT32 nCursorType = this->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;
+}
+
+CPDF_Rect CPWL_Wnd::GetFocusRect() const
+{
+ return CPWL_Utils::InflateRect(this->GetWindowRect(),1);
+}
+
+FX_FLOAT CPWL_Wnd::GetFontSize() const
+{
+ return this->m_sPrivateParam.fFontSize;
+}
+
+void CPWL_Wnd::SetFontSize(FX_FLOAT fFontSize)
+{
+ this->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(FX_INT32 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(FX_INT32 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;
+}
+
+/* ----------------------------------------------------------------- */
+
+FX_INT32 CPWL_Wnd::GetTransparency()
+{
+ return m_sPrivateParam.nTransparency;
+}
+
+void CPWL_Wnd::SetTransparency(FX_INT32 nTransparency)
+{
+ for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)
+ {
+ if (CPWL_Wnd* pChild = m_aChildren.GetAt(i))
+ {
+ pChild->SetTransparency(nTransparency);
+ }
+ }
+
+ m_sPrivateParam.nTransparency = nTransparency;
+}
+
+CPDF_Matrix CPWL_Wnd::GetWindowMatrix() const
+{
+ CPDF_Matrix mt = this->GetChildToRoot();
+
+ if (IPWL_Provider* pProvider = GetProvider())
+ {
+ mt.Concat(pProvider->GetWindowMatrix(GetAttachedData()));
+ return mt;
+ }
+
+/*
+ if (CReader_App* pApp = CPWL_Module::GetReaderApp())
+ if (CReader_Document* pDocument = pApp->GetCurrentDocument())
+ if (CReader_DocView* pDocView = pDocument->GetCurrentDocView())
+ {
+ CPDF_Matrix mtPageView;
+ pDocView->GetCurrentMatrix(mtPageView);
+ mt.Concat(mtPageView);
+ return mt;
+ }
+
+*/
+
+ return mt;
+}
+
+void CPWL_Wnd::PWLtoWnd(const CPDF_Point& point, FX_INT32& x, FX_INT32& y) const
+{
+ CPDF_Matrix mt = GetWindowMatrix();
+ CPDF_Point pt = point;
+ mt.Transform(pt.x,pt.y);
+ x = (FX_INT32)(pt.x+0.5);
+ y = (FX_INT32)(pt.y+0.5);
+}
+
+FX_RECT CPWL_Wnd::PWLtoWnd(const CPDF_Rect & rect) const
+{
+ CPDF_Rect rcTemp = rect;
+ CPDF_Matrix mt = GetWindowMatrix();
+ mt.TransformRect(rcTemp);
+ return FX_RECT((FX_INT32)(rcTemp.left+0.5), (FX_INT32)(rcTemp.bottom+0.5), (FX_INT32)(rcTemp.right+0.5), (FX_INT32)(rcTemp.top+0.5));
+}
+
+FX_HWND CPWL_Wnd::GetAttachedHWnd() const
+{
+ return m_sPrivateParam.hAttachedWnd;
+}
+
+CPDF_Point CPWL_Wnd::ChildToParent(const CPDF_Point& point) const
+{
+ CPDF_Matrix mt = GetChildMatrix();
+ if (mt.IsIdentity())
+ return point;
+ else
+ {
+ CPDF_Point pt = point;
+ mt.Transform(pt.x,pt.y);
+ return pt;
+ }
+}
+
+CPDF_Rect CPWL_Wnd::ChildToParent(const CPDF_Rect& rect) const
+{
+ CPDF_Matrix mt = GetChildMatrix();
+ if (mt.IsIdentity())
+ return rect;
+ else
+ {
+ CPDF_Rect rc = rect;
+ mt.TransformRect(rc);
+ return rc;
+ }
+}
+
+CPDF_Point CPWL_Wnd::ParentToChild(const CPDF_Point& point) const
+{
+ CPDF_Matrix mt = GetChildMatrix();
+ if (mt.IsIdentity())
+ return point;
+ else
+ {
+ mt.SetReverse(mt);
+ CPDF_Point pt = point;
+ mt.Transform(pt.x,pt.y);
+ return pt;
+ }
+}
+
+CPDF_Rect CPWL_Wnd::ParentToChild(const CPDF_Rect& rect) const
+{
+ CPDF_Matrix mt = GetChildMatrix();
+ if (mt.IsIdentity())
+ return rect;
+ else
+ {
+ mt.SetReverse(mt);
+ CPDF_Rect rc = rect;
+ mt.TransformRect(rc);
+ return rc;
+ }
+}
+
+CPDF_Matrix CPWL_Wnd::GetChildToRoot() const
+{
+ CPDF_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;
+}
+
+CPDF_Matrix CPWL_Wnd::GetChildMatrix() const
+{
+ if (HasFlag(PWS_CHILD))
+ return m_sPrivateParam.mtChild;
+
+ return CPDF_Matrix(1,0,0,1,0,0);
+}
+
+void CPWL_Wnd::SetChildMatrix(const CPDF_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 (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)
+ {
+ if (CPWL_Wnd* pChild = m_aChildren.GetAt(i))
+ {
+ pChild->EnableWindow(bEnable);
+ }
+ }
+
+ this->m_bEnabled = bEnable;
+
+ if (bEnable)
+ this->OnEnabled();
+ else
+ this->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;
+}
+
diff --git a/fpdfsdk/src/resource.h b/fpdfsdk/src/resource.h new file mode 100644 index 0000000000..e97d1d5451 --- /dev/null +++ b/fpdfsdk/src/resource.h @@ -0,0 +1,21 @@ +// 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
+
+//{{NO_DEPENDENCIES}}
+// Microsoft Developer Studio generated include file.
+// Used by fpdfsdkdll.rc
+//
+
+// Next default values for new objects
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE 104
+#define _APS_NEXT_COMMAND_VALUE 40001
+#define _APS_NEXT_CONTROL_VALUE 1000
+#define _APS_NEXT_SYMED_VALUE 101
+#endif
+#endif
|