Merge XFA to PDFium master at 4dc95e7 on 10/28/2014
[pdfium.git] / xfa / src / fxfa / src / app / xfa_ffimageedit.cpp
1 // Copyright 2014 PDFium Authors. All rights reserved.\r
2 // Use of this source code is governed by a BSD-style license that can be\r
3 // found in the LICENSE file.\r
4 \r
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\r
6 \r
7 #include "../../../foxitlib.h"\r
8 #include "../common/xfa_common.h"\r
9 #include "xfa_ffwidget.h"\r
10 #include "xfa_fffield.h"\r
11 #include "xfa_ffpageview.h"\r
12 #include "xfa_ffimageedit.h"\r
13 #include "xfa_ffdocview.h"\r
14 #include "xfa_ffdoc.h"\r
15 CXFA_FFImageEdit::CXFA_FFImageEdit(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc)\r
16     : CXFA_FFField(pPageView, pDataAcc)\r
17     , m_pOldDelegate(NULL)\r
18 {\r
19 }\r
20 CXFA_FFImageEdit::~CXFA_FFImageEdit()\r
21 {\r
22     CXFA_FFImageEdit::UnloadWidget();\r
23 }\r
24 FX_BOOL CXFA_FFImageEdit::LoadWidget()\r
25 {\r
26     CFWL_PictureBox* pPictureBox = FX_NEW CFWL_PictureBox;\r
27     if (pPictureBox) {\r
28         pPictureBox->Initialize();\r
29     }\r
30     m_pNormalWidget = (CFWL_Widget*)pPictureBox;\r
31     IFWL_Widget* pWidget = m_pNormalWidget->GetWidget();\r
32     m_pNormalWidget->SetPrivateData(pWidget, this, NULL);\r
33     IFWL_NoteDriver *pNoteDriver = FWL_GetApp()->GetNoteDriver();\r
34     pNoteDriver->RegisterEventTarget(pWidget, pWidget);\r
35     m_pOldDelegate = pPictureBox->SetDelegate(this);\r
36     CXFA_FFField::LoadWidget();\r
37     if (m_pDataAcc->GetImageEditImage() != NULL) {\r
38         return TRUE;\r
39     }\r
40     UpdateFWLData();\r
41     return TRUE;\r
42 }\r
43 void CXFA_FFImageEdit::UnloadWidget()\r
44 {\r
45     m_pDataAcc->SetImageEditImage(NULL);\r
46     CXFA_FFField::UnloadWidget();\r
47 }\r
48 void CXFA_FFImageEdit::RenderWidget(CFX_Graphics* pGS, CFX_Matrix* pMatrix , FX_DWORD dwStatus , FX_INT32 iRotate )\r
49 {\r
50     if (!IsMatchVisibleStatus(dwStatus)) {\r
51         return;\r
52     }\r
53     CFX_Matrix mtRotate;\r
54     GetRotateMatrix(mtRotate);\r
55     if (pMatrix) {\r
56         mtRotate.Concat(*pMatrix);\r
57     }\r
58     CXFA_FFWidget::RenderWidget(pGS, &mtRotate, dwStatus);\r
59     CXFA_Border borderUI = m_pDataAcc->GetUIBorder();\r
60     DrawBorder(pGS, borderUI, m_rtUI, &mtRotate);\r
61     RenderCaption(pGS, &mtRotate);\r
62     if (CFX_DIBitmap* pDIBitmap = m_pDataAcc->GetImageEditImage()) {\r
63         CFX_RectF rtImage;\r
64         m_pNormalWidget->GetWidgetRect(rtImage);\r
65         FX_INT32 iHorzAlign = XFA_ATTRIBUTEENUM_Left;\r
66         FX_INT32 iVertAlign = XFA_ATTRIBUTEENUM_Top;\r
67         if (CXFA_Para para = m_pDataAcc->GetPara()) {\r
68             iHorzAlign = para.GetHorizontalAlign();\r
69             iVertAlign = para.GetVerticalAlign();\r
70         }\r
71         FX_INT32 iAspect = XFA_ATTRIBUTEENUM_Fit;\r
72         if (CXFA_Value value = m_pDataAcc->GetFormValue()) {\r
73             if (CXFA_Image imageObj = value.GetImage()) {\r
74                 iAspect = imageObj.GetAspect();\r
75             }\r
76         }\r
77         FX_INT32 iImageXDpi = 0;\r
78         FX_INT32 iImageYDpi = 0;\r
79         m_pDataAcc->GetImageEditDpi(iImageXDpi, iImageYDpi);\r
80         XFA_DrawImage(pGS, rtImage, &mtRotate, pDIBitmap, iAspect, iImageXDpi, iImageYDpi, iHorzAlign, iVertAlign);\r
81     }\r
82 }\r
83 FX_BOOL CXFA_FFImageEdit::OnLButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy)\r
84 {\r
85     if (m_pDataAcc->GetAccess() != XFA_ATTRIBUTEENUM_Open) {\r
86         return FALSE;\r
87     }\r
88     if (!PtInActiveRect(fx, fy)) {\r
89         return FALSE;\r
90     }\r
91     SetButtonDown(TRUE);\r
92     CFWL_MsgMouse ms;\r
93     ms.m_dwCmd = FWL_MSGMOUSECMD_LButtonDown;\r
94     ms.m_dwFlags = dwFlags;\r
95     ms.m_fx = fx;\r
96     ms.m_fy = fy;\r
97     ms.m_pDstTarget = m_pNormalWidget->m_pImp;\r
98     FWLToClient(ms.m_fx, ms.m_fy);\r
99     TranslateFWLMessage(&ms);\r
100     IXFA_AppProvider* pAppProvider = GetAppProvider();\r
101     if (!pAppProvider) {\r
102         return TRUE;\r
103     }\r
104     CFX_WideString wsTitle;\r
105     CFX_WideString wsFilter;\r
106     pAppProvider->LoadString(XFA_IDS_ImageFilter, wsFilter);\r
107     CFX_WideStringArray wsPathArray;\r
108     pAppProvider->ShowFileDialog(wsTitle, wsFilter, wsPathArray);\r
109     FX_INT32 iSize = wsPathArray.GetSize();\r
110     if (iSize < 1) {\r
111         return TRUE;\r
112     }\r
113     CFX_WideString wsFilePath = wsPathArray[0];\r
114     FX_STRSIZE nLen = wsFilePath.GetLength();\r
115     FX_STRSIZE nIndex = nLen - 1;\r
116     while (nIndex > 0 && wsFilePath[nIndex] != '.') {\r
117         nIndex--;\r
118     }\r
119     if (nIndex <= 0) {\r
120         return TRUE;\r
121     }\r
122     CFX_WideString wsContentType(L"image/");\r
123     wsContentType += wsFilePath.Right(nLen - nIndex - 1);\r
124     wsContentType.MakeLower();\r
125     FXCODEC_IMAGE_TYPE eImageType = XFA_GetImageType(wsContentType);\r
126     if (eImageType == FXCODEC_IMAGE_UNKNOWN) {\r
127         return TRUE;\r
128     }\r
129     CFX_WideString wsImage;\r
130     IFX_FileRead* pFileRead = FX_CreateFileRead(wsFilePath);\r
131     if (pFileRead != NULL) {\r
132         FX_INT32 nDataSize = pFileRead->GetSize();\r
133         if (nDataSize > 0) {\r
134             CFX_ByteString bsBuf;\r
135             FX_LPSTR pImageBuffer = bsBuf.GetBuffer(nDataSize);\r
136             pFileRead->ReadBlock(pImageBuffer, 0, nDataSize);\r
137             bsBuf.ReleaseBuffer();\r
138             if (!bsBuf.IsEmpty()) {\r
139                 FX_LPSTR pData = XFA_Base64Encode(bsBuf, nDataSize);\r
140                 wsImage = CFX_WideString::FromLocal(pData);\r
141                 if (pData != NULL) {\r
142                     FX_Free(pData);\r
143                 }\r
144             }\r
145         }\r
146         m_pDataAcc->SetImageEditImage(NULL);\r
147         pFileRead->Release();\r
148     }\r
149     m_pDataAcc->SetImageEdit(wsContentType, CFX_WideStringC(), wsImage);\r
150     m_pDataAcc->LoadImageEditImage();\r
151     AddInvalidateRect();\r
152     m_pDocView->SetChangeMark();\r
153     return TRUE;\r
154 }\r
155 void CXFA_FFImageEdit::SetFWLRect()\r
156 {\r
157     if (!m_pNormalWidget) {\r
158         return;\r
159     }\r
160     CFX_RectF rtUIMargin;\r
161     m_pDataAcc->GetUIMargin(rtUIMargin);\r
162     CFX_RectF rtImage(m_rtUI);\r
163     rtImage.Deflate(rtUIMargin.left, rtUIMargin.top, rtUIMargin.width, rtUIMargin.height);\r
164     m_pNormalWidget->SetWidgetRect(rtImage);\r
165 }\r
166 FX_BOOL CXFA_FFImageEdit::CommitData()\r
167 {\r
168     return TRUE;\r
169 }\r
170 FX_BOOL CXFA_FFImageEdit::UpdateFWLData()\r
171 {\r
172     m_pDataAcc->SetImageEditImage(NULL);\r
173     m_pDataAcc->LoadImageEditImage();\r
174     return TRUE;\r
175 }\r
176 FX_INT32 CXFA_FFImageEdit::OnProcessMessage(CFWL_Message *pMessage)\r
177 {\r
178     return m_pOldDelegate->OnProcessMessage(pMessage);\r
179 }\r
180 FWL_ERR CXFA_FFImageEdit::OnProcessEvent(CFWL_Event *pEvent)\r
181 {\r
182     CXFA_FFField::OnProcessEvent(pEvent);\r
183     return m_pOldDelegate->OnProcessEvent(pEvent);\r
184 }\r
185 FWL_ERR CXFA_FFImageEdit::OnDrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix )\r
186 {\r
187     return m_pOldDelegate->OnDrawWidget(pGraphics, pMatrix);\r
188 }\r