Merge to XFA: Use stdint.h types throughout PDFium.
[pdfium.git] / xfa / src / fwl / src / lightwidget / widget.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 "../../src/core/include/fwl_noteimp.h"\r
9 #include "../core/include/fwl_targetimp.h"\r
10 #include "../core/include/fwl_noteimp.h"\r
11 #include "../core/include/fwl_widgetimp.h"\r
12 #include "../core/include/fwl_widgetmgrimp.h"\r
13 IFWL_Widget* CFWL_Widget::GetWidget()\r
14 {\r
15     return m_pImp;\r
16 }\r
17 FX_DWORD CFWL_Widget::Release()\r
18 {\r
19     _FWL_RETURN_VALUE_IF_FAIL(m_pImp, 0);\r
20     FX_DWORD dwRef = m_pImp->GetRefCount();\r
21     if (dwRef == 1) {\r
22         m_pImp->Finalize();\r
23     }\r
24     m_pImp->Release();\r
25     if (dwRef == 1) {\r
26         m_pImp = NULL;\r
27         delete this;\r
28     }\r
29     return dwRef - 1;\r
30 }\r
31 CFWL_Widget* CFWL_Widget::Retain()\r
32 {\r
33     _FWL_RETURN_VALUE_IF_FAIL(m_pImp, NULL);\r
34     m_pImp->Retain();\r
35     return this;\r
36 }\r
37 FX_DWORD CFWL_Widget::GetRefCount() const\r
38 {\r
39     _FWL_RETURN_VALUE_IF_FAIL(m_pImp, 1);\r
40     return m_pImp->GetRefCount();\r
41 }\r
42 FWL_ERR CFWL_Widget::GetClassName(CFX_WideString &wsClass) const\r
43 {\r
44     _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite);\r
45     return m_pImp->GetClassName(wsClass);\r
46 }\r
47 FX_DWORD CFWL_Widget::GetClassID() const\r
48 {\r
49     _FWL_RETURN_VALUE_IF_FAIL(m_pImp, 0);\r
50     return m_pImp->GetClassID();\r
51 }\r
52 FX_BOOL CFWL_Widget::IsInstance(FX_WSTR wsClass) const\r
53 {\r
54     _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FALSE);\r
55     return m_pImp->IsInstance(wsClass);\r
56 }\r
57 static FX_LPVOID gs_pFWLWidget = (FX_LPVOID)FXBSTR_ID('l', 'i', 'g', 't');\r
58 FWL_ERR CFWL_Widget::Initialize(const CFWL_WidgetProperties *pProperties )\r
59 {\r
60     _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite);\r
61     return m_pImp->SetPrivateData(gs_pFWLWidget, this, NULL);\r
62 }\r
63 FWL_ERR CFWL_Widget::GetWidgetRect(CFX_RectF &rect, FX_BOOL bAutoSize )\r
64 {\r
65     _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite);\r
66     return m_pImp->GetWidgetRect(rect, bAutoSize);\r
67 }\r
68 FWL_ERR CFWL_Widget::GetGlobalRect(CFX_RectF &rect)\r
69 {\r
70     _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite);\r
71     return m_pImp->GetGlobalRect(rect);\r
72 }\r
73 FWL_ERR CFWL_Widget::SetWidgetRect(const CFX_RectF &rect)\r
74 {\r
75     _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite);\r
76     return m_pImp->SetWidgetRect(rect);\r
77 }\r
78 FWL_ERR CFWL_Widget::GetClientRect(CFX_RectF &rect)\r
79 {\r
80     _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite);\r
81     return m_pImp->GetClientRect(rect);\r
82 }\r
83 CFWL_Widget* CFWL_Widget::GetParent()\r
84 {\r
85     _FWL_RETURN_VALUE_IF_FAIL(m_pImp, NULL);\r
86     IFWL_Widget *parent = m_pImp->GetParent();\r
87     if (parent) {\r
88         return (CFWL_Widget*)parent->GetPrivateData(gs_pFWLWidget);\r
89     }\r
90     return NULL;\r
91 }\r
92 FWL_ERR CFWL_Widget::SetParent(CFWL_Widget *pParent)\r
93 {\r
94     _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite);\r
95     return m_pImp->SetParent(pParent ? pParent->GetWidget() : NULL);\r
96 }\r
97 CFWL_Widget* CFWL_Widget::GetOwner()\r
98 {\r
99     _FWL_RETURN_VALUE_IF_FAIL(m_pImp, NULL);\r
100     return NULL;\r
101 }\r
102 FWL_ERR CFWL_Widget::SetOwner(CFWL_Widget *pOwner)\r
103 {\r
104     _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite);\r
105     return FWL_ERR_Succeeded;\r
106 }\r
107 FX_DWORD CFWL_Widget::GetStyles()\r
108 {\r
109     _FWL_RETURN_VALUE_IF_FAIL(m_pImp, 0);\r
110     return m_pImp->GetStyles();\r
111 }\r
112 FWL_ERR CFWL_Widget::ModifyStyles(FX_DWORD dwStylesAdded, FX_DWORD dwStylesRemoved)\r
113 {\r
114     _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite);\r
115     return m_pImp->ModifyStyles(dwStylesAdded, dwStylesRemoved);\r
116 }\r
117 FX_DWORD CFWL_Widget::GetStylesEx()\r
118 {\r
119     _FWL_RETURN_VALUE_IF_FAIL(m_pImp, 0);\r
120     return m_pImp->GetStylesEx();\r
121 }\r
122 FWL_ERR CFWL_Widget::ModifyStylesEx(FX_DWORD dwStylesExAdded, FX_DWORD dwStylesExRemoved)\r
123 {\r
124     return m_pImp->ModifyStylesEx(dwStylesExAdded, dwStylesExRemoved);\r
125 }\r
126 FX_DWORD CFWL_Widget::GetStates()\r
127 {\r
128     _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite);\r
129     return m_pImp->GetStates();\r
130 }\r
131 FWL_ERR CFWL_Widget::SetStates(FX_DWORD dwStates, FX_BOOL bSet )\r
132 {\r
133     _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite);\r
134     return m_pImp->SetStates(dwStates, bSet);\r
135 }\r
136 FWL_ERR CFWL_Widget::SetPrivateData(FX_LPVOID module_id, FX_LPVOID pData, PD_CALLBACK_FREEDATA callback)\r
137 {\r
138     _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite);\r
139     return m_pImp->SetPrivateData(module_id, pData, callback);\r
140 }\r
141 FX_LPVOID CFWL_Widget::GetPrivateData(FX_LPVOID module_id)\r
142 {\r
143     _FWL_RETURN_VALUE_IF_FAIL(m_pImp, NULL);\r
144     return m_pImp->GetPrivateData(module_id);\r
145 }\r
146 FWL_ERR CFWL_Widget::Update()\r
147 {\r
148     _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite);\r
149     return m_pImp->Update();\r
150 }\r
151 FWL_ERR CFWL_Widget::LockUpdate()\r
152 {\r
153     _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite);\r
154     return m_pImp->LockUpdate();\r
155 }\r
156 FWL_ERR CFWL_Widget::UnlockUpdate()\r
157 {\r
158     _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite);\r
159     return m_pImp->UnlockUpdate();\r
160 }\r
161 FX_DWORD CFWL_Widget::HitTest(FX_FLOAT fx, FX_FLOAT fy)\r
162 {\r
163     _FWL_RETURN_VALUE_IF_FAIL(m_pImp, 0);\r
164     return m_pImp->HitTest(fx, fy);\r
165 }\r
166 FWL_ERR CFWL_Widget::TransformTo(CFWL_Widget *pWidget, FX_FLOAT &fx, FX_FLOAT &fy)\r
167 {\r
168     _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite);\r
169     return m_pImp->TransformTo(pWidget ? pWidget->GetWidget() : NULL, fx, fy);\r
170 }\r
171 FWL_ERR CFWL_Widget::TransformTo(CFWL_Widget *pWidget, CFX_RectF &rt)\r
172 {\r
173     _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite);\r
174     return m_pImp->TransformTo(pWidget ? pWidget->GetWidget() : NULL, rt);\r
175 }\r
176 FWL_ERR CFWL_Widget::GetMatrix(CFX_Matrix &matrix, FX_BOOL bGlobal )\r
177 {\r
178     _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite);\r
179     return m_pImp->GetMatrix(matrix, bGlobal);\r
180 }\r
181 FWL_ERR CFWL_Widget::SetMatrix(const CFX_Matrix &matrix)\r
182 {\r
183     _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite);\r
184     return m_pImp->SetMatrix(matrix);\r
185 }\r
186 FWL_ERR CFWL_Widget::DrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix )\r
187 {\r
188     _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite);\r
189     return m_pImp->DrawWidget(pGraphics, pMatrix);\r
190 }\r
191 FWL_ERR CFWL_Widget::GetProperties(CFWL_WidgetProperties &properties)\r
192 {\r
193     properties.m_ctmOnParent = m_pProperties->m_ctmOnParent;\r
194     properties.m_rtWidget = m_pProperties->m_rtWidget;\r
195     properties.m_dwStyles = m_pProperties->m_dwStyles;\r
196     properties.m_dwStyleExes = m_pProperties->m_dwStyleExes;\r
197     properties.m_dwStates = m_pProperties->m_dwStates;\r
198     properties.m_pParent = m_pProperties->m_pParent;\r
199     properties.m_pOwner = m_pProperties->m_pOwner;\r
200     properties.m_wsWindowclass = m_pProperties->m_wsWindowclass;\r
201     return FWL_ERR_Succeeded;\r
202 }\r
203 FWL_ERR CFWL_Widget::SetProperties(const CFWL_WidgetProperties &properties)\r
204 {\r
205     m_pProperties->m_ctmOnParent = properties.m_ctmOnParent;\r
206     m_pProperties->m_rtWidget = properties.m_rtWidget;\r
207     m_pProperties->m_dwStyles = properties.m_dwStyles;\r
208     m_pProperties->m_dwStyleExes = properties.m_dwStyleExes;\r
209     m_pProperties->m_dwStates = properties.m_dwStates;\r
210     m_pProperties->m_pParent = properties.m_pParent;\r
211     m_pProperties->m_pOwner = properties.m_pOwner;\r
212     m_pProperties->m_wsWindowclass = properties.m_wsWindowclass;\r
213     return FWL_ERR_Succeeded;\r
214 }\r
215 IFWL_WidgetDelegate* CFWL_Widget::SetDelegate(IFWL_WidgetDelegate* pDelegate)\r
216 {\r
217     _FWL_RETURN_VALUE_IF_FAIL(m_pImp, NULL);\r
218     m_pDelegate = m_pImp->SetDelegate(pDelegate);\r
219     return m_pDelegate;\r
220 }\r
221 CFWL_Widget::CFWL_Widget()\r
222     : m_pImp(NULL)\r
223     , m_pDelegate(NULL)\r
224     , m_pProperties(NULL)\r
225 {\r
226     m_pProperties = FX_NEW CFWL_WidgetProperties;\r
227     m_pWidgetMgr = (CFWL_WidgetMgr*)FWL_GetWidgetMgr();\r
228     FXSYS_assert(m_pWidgetMgr != NULL);\r
229 }\r
230 CFWL_Widget::~CFWL_Widget()\r
231 {\r
232     if (m_pProperties) {\r
233         delete m_pProperties;\r
234         m_pProperties = NULL;\r
235     }\r
236     if (m_pImp) {\r
237         m_pImp->Finalize();\r
238         m_pImp->Release();\r
239         m_pImp = NULL;\r
240     }\r
241 }\r
242 FWL_ERR CFWL_Widget::Repaint(const CFX_RectF *pRect)\r
243 {\r
244     _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite);\r
245     CFX_RectF rect;\r
246     if (pRect) {\r
247         rect = *pRect;\r
248     } else {\r
249         m_pImp->GetWidgetRect(rect);\r
250         rect.left = rect.top = 0;\r
251     }\r
252     return m_pWidgetMgr->RepaintWidget(m_pImp, &rect);\r
253 }\r
254 FWL_ERR CFWL_Widget::SetFocus(FX_BOOL bFocus)\r
255 {\r
256     _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite);\r
257     IFWL_NoteThread *pThread = m_pImp->GetOwnerThread();\r
258     _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite);\r
259     IFWL_NoteDriver *pDriver = pThread->GetNoteDriver();\r
260     _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite);\r
261     if (bFocus) {\r
262         pDriver->SetFocus(m_pImp);\r
263     } else {\r
264         if (((CFWL_NoteDriver*)pDriver)->GetFocus() == m_pImp) {\r
265             pDriver->SetFocus(NULL);\r
266         }\r
267     }\r
268     return FWL_ERR_Succeeded;\r
269 }\r
270 FWL_ERR CFWL_Widget::SetGrab(FX_BOOL bSet)\r
271 {\r
272     _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite);\r
273     IFWL_NoteThread *pThread = m_pImp->GetOwnerThread();\r
274     _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite);\r
275     CFWL_NoteDriver *pDriver = (CFWL_NoteDriver*)pThread->GetNoteDriver();\r
276     _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite);\r
277     pDriver->SetGrab(m_pImp, bSet);\r
278     return FWL_ERR_Succeeded;\r
279 }\r
280 void CFWL_Widget::RegisterEventTarget(CFWL_Widget *pEventSource , FX_DWORD dwFilter )\r
281 {\r
282     _FWL_RETURN_IF_FAIL(m_pImp);\r
283     IFWL_NoteThread *pThread = m_pImp->GetOwnerThread();\r
284     _FWL_RETURN_IF_FAIL(pThread);\r
285     IFWL_NoteDriver *pNoteDriver = pThread->GetNoteDriver();\r
286     _FWL_RETURN_IF_FAIL(pNoteDriver);\r
287     IFWL_Widget *pEventSourceImp = !pEventSource ? NULL : pEventSource->GetWidget();\r
288     pNoteDriver->RegisterEventTarget(GetWidget(), pEventSourceImp, dwFilter);\r
289 }\r
290 void CFWL_Widget::DispatchEvent(CFWL_Event *pEvent)\r
291 {\r
292     _FWL_RETURN_IF_FAIL(m_pImp);\r
293     if (m_pImp->GetOuter()) {\r
294         return;\r
295     }\r
296     IFWL_NoteThread *pThread = m_pImp->GetOwnerThread();\r
297     _FWL_RETURN_IF_FAIL(pThread);\r
298     IFWL_NoteDriver *pNoteDriver = pThread->GetNoteDriver();\r
299     _FWL_RETURN_IF_FAIL(pNoteDriver);\r
300     pNoteDriver->SendNote(pEvent);\r
301 }\r
302 #define FWL_WGT_CalcHeight                              2048\r
303 #define FWL_WGT_CalcWidth                               2048\r
304 #define FWL_WGT_CalcMultiLineDefWidth   120.0f\r
305 CFX_SizeF CFWL_Widget::CalcTextSize(const CFX_WideString &wsText, FX_BOOL bMultiLine , int32_t iLineWidth )\r
306 {\r
307     CFX_SizeF sz;\r
308     sz.Set(0, 0);\r
309     _FWL_RETURN_VALUE_IF_FAIL(m_pImp, sz);\r
310     IFWL_ThemeProvider *pTheme = m_pImp->GetThemeProvider();\r
311     _FWL_RETURN_VALUE_IF_FAIL(pTheme, sz);\r
312     CFWL_ThemeText calPart;\r
313     calPart.m_pWidget = m_pImp;\r
314     calPart.m_wsText = wsText;\r
315     calPart.m_dwTTOStyles = bMultiLine ? FDE_TTOSTYLE_LineWrap : FDE_TTOSTYLE_SingleLine;\r
316     calPart.m_iTTOAlign = FDE_TTOALIGNMENT_TopLeft;\r
317     CFX_RectF rect;\r
318     FX_FLOAT fWidth = bMultiLine ?\r
319                       (iLineWidth > 0 ? (FX_FLOAT)iLineWidth : FWL_WGT_CalcMultiLineDefWidth) :\r
320                       FWL_WGT_CalcWidth;\r
321     rect.Set(0, 0, fWidth, FWL_WGT_CalcHeight);\r
322     pTheme->CalcTextRect(&calPart, rect);\r
323     sz.x = rect.width;\r
324     sz.y = rect.height;\r
325     return sz;\r
326 }\r
327 CFWL_WidgetDelegate::CFWL_WidgetDelegate()\r
328 {\r
329 }\r
330 CFWL_WidgetDelegate::~CFWL_WidgetDelegate()\r
331 {\r
332 }\r
333 int32_t CFWL_WidgetDelegate::OnProcessMessage(CFWL_Message *pMessage)\r
334 {\r
335     return 1;\r
336 }\r
337 FWL_ERR CFWL_WidgetDelegate::OnProcessEvent(CFWL_Event *pEvent)\r
338 {\r
339     return FWL_ERR_Succeeded;\r
340 }\r
341 FWL_ERR CFWL_WidgetDelegate::OnDrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix )\r
342 {\r
343     return FWL_ERR_Succeeded;\r
344 }\r