Merge XFA to PDFium master at 4dc95e7 on 10/28/2014
[pdfium.git] / xfa / src / fwl / src / basewidget / fwl_barcodeimp.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 "../core/include/fwl_targetimp.h"\r
9 #include "../core/include/fwl_noteimp.h"\r
10 #include "../core/include/fwl_widgetimp.h"\r
11 #include "include/fwl_editimp.h"\r
12 #include "include/fwl_barcodeimp.h"\r
13 IFWL_Barcode* IFWL_Barcode::Create()\r
14 {\r
15     return new IFWL_Barcode;\r
16 }\r
17 IFWL_Barcode::IFWL_Barcode()\r
18 {\r
19     m_pData = NULL;\r
20 }\r
21 IFWL_Barcode::~IFWL_Barcode()\r
22 {\r
23     if (m_pData) {\r
24         delete (CFWL_BarcodeImp*)m_pData;\r
25         m_pData = NULL;\r
26     }\r
27 }\r
28 FWL_ERR IFWL_Barcode::Initialize(IFWL_Widget *pOuter)\r
29 {\r
30     m_pData = FX_NEW CFWL_BarcodeImp(pOuter);\r
31     ((CFWL_BarcodeImp*)m_pData)->SetInterface(this);\r
32     return ((CFWL_BarcodeImp*)m_pData)->Initialize();\r
33 }\r
34 FWL_ERR IFWL_Barcode::Initialize(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter)\r
35 {\r
36     m_pData = FX_NEW CFWL_BarcodeImp(properties, pOuter);\r
37     ((CFWL_BarcodeImp*)m_pData)->SetInterface(this);\r
38     return ((CFWL_BarcodeImp*)m_pData)->Initialize();\r
39 }\r
40 void    IFWL_Barcode::SetType(BC_TYPE type)\r
41 {\r
42     ((CFWL_BarcodeImp*)m_pData)->SetType(type);\r
43 }\r
44 FX_BOOL IFWL_Barcode::IsProtectedType()\r
45 {\r
46     return ((CFWL_BarcodeImp*)m_pData)->IsProtectedType();\r
47 }\r
48 CFWL_BarcodeImp::CFWL_BarcodeImp(IFWL_Widget *pOuter )\r
49     : CFWL_EditImp(pOuter)\r
50     , m_pBarcodeEngine(NULL)\r
51     , m_dwStatus(0)\r
52     , m_type(BC_UNKNOWN)\r
53 {\r
54 }\r
55 CFWL_BarcodeImp::CFWL_BarcodeImp(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter )\r
56     : CFWL_EditImp(properties, pOuter)\r
57     , m_pBarcodeEngine(NULL)\r
58     , m_dwStatus(0)\r
59     , m_type(BC_UNKNOWN)\r
60 {\r
61 }\r
62 CFWL_BarcodeImp::~CFWL_BarcodeImp()\r
63 {\r
64     ReleaseBarcodeEngine();\r
65 }\r
66 FWL_ERR CFWL_BarcodeImp::GetClassName(CFX_WideString &wsClass) const\r
67 {\r
68     wsClass = FWL_CLASS_Barcode;\r
69     return FWL_ERR_Succeeded;\r
70 }\r
71 FX_DWORD CFWL_BarcodeImp::GetClassID() const\r
72 {\r
73     return FWL_CLASSHASH_Barcode;\r
74 }\r
75 FWL_ERR CFWL_BarcodeImp::Initialize()\r
76 {\r
77     if (!m_pDelegate) {\r
78         m_pDelegate = (IFWL_WidgetDelegate*) FX_NEW CFWL_BarcodeImpDelegate(this);\r
79     }\r
80     _FWL_ERR_CHECK_RETURN_VALUE_IF_FAIL(CFWL_EditImp::Initialize(), FWL_ERR_Indefinite);\r
81     return FWL_ERR_Succeeded;\r
82 }\r
83 FWL_ERR CFWL_BarcodeImp::Finalize()\r
84 {\r
85     if (m_pDelegate) {\r
86         delete (CFWL_BarcodeImpDelegate*)m_pDelegate;\r
87         m_pDelegate = NULL;\r
88     }\r
89     ReleaseBarcodeEngine();\r
90     return CFWL_EditImp::Finalize();\r
91 }\r
92 FWL_ERR CFWL_BarcodeImp::Update()\r
93 {\r
94     if (IsLocked()) {\r
95         return FWL_ERR_Indefinite;\r
96     }\r
97     FWL_ERR ret = CFWL_EditImp::Update();\r
98     GenerateBarcodeImageCache();\r
99     return ret;\r
100 }\r
101 FWL_ERR CFWL_BarcodeImp::DrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix )\r
102 {\r
103     _FWL_RETURN_VALUE_IF_FAIL(pGraphics, FWL_ERR_Indefinite);\r
104     _FWL_RETURN_VALUE_IF_FAIL(m_pProperties->m_pThemeProvider, FWL_ERR_Indefinite);\r
105     if ((m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) == 0) {\r
106         GenerateBarcodeImageCache();\r
107         if (!m_pBarcodeEngine || (m_dwStatus & XFA_BCS_EncodeSuccess) == 0) {\r
108             return FWL_ERR_Succeeded;\r
109         }\r
110         CFX_Matrix mt;\r
111         mt.e = m_rtClient.left;\r
112         mt.f = m_rtClient.top;\r
113         if (pMatrix) {\r
114             mt.Concat(*pMatrix);\r
115         }\r
116         FX_INT32 errorCode = 0;\r
117         _FWL_RETURN_VALUE_IF_FAIL(m_pBarcodeEngine->RenderDevice(pGraphics->GetRenderDevice(), pMatrix, errorCode), FWL_ERR_Indefinite);\r
118         return FWL_ERR_Succeeded;\r
119     }\r
120     return CFWL_EditImp::DrawWidget(pGraphics, pMatrix);\r
121 }\r
122 void CFWL_BarcodeImp::GenerateBarcodeImageCache()\r
123 {\r
124     if ((m_dwStatus & XFA_BCS_NeedUpdate) == 0) {\r
125         return;\r
126     }\r
127     m_dwStatus = 0;;\r
128     CreateBarcodeEngine();\r
129     IFWL_BarcodeDP *pData = (IFWL_BarcodeDP*)m_pProperties->m_pDataProvider;\r
130     _FWL_RETURN_IF_FAIL(pData);\r
131     _FWL_RETURN_IF_FAIL(m_pBarcodeEngine);\r
132     CFX_WideString wsText;\r
133     _FWL_RETURN_IF_FAIL(GetText(wsText) == FWL_ERR_Succeeded);\r
134     CFWL_ThemePart part;\r
135     part.m_pWidget = m_pInterface;\r
136     IFWL_ThemeProvider *pTheme = GetAvailableTheme();\r
137     IFX_Font* pFont = (IFX_Font*)pTheme->GetCapacity(&part, FWL_WGTCAPACITY_Font);\r
138     CFX_Font* pCXFont = (CFX_Font*)(pFont ? pFont->GetDevFont() : NULL);\r
139     if(pCXFont) {\r
140         m_pBarcodeEngine->SetFont(pCXFont);\r
141     }\r
142     FX_FLOAT* pFontSize = (FX_FLOAT*)pTheme->GetCapacity(&part, FWL_WGTCAPACITY_FontSize);\r
143     if(pFontSize) {\r
144         m_pBarcodeEngine->SetFontSize(*pFontSize);\r
145     }\r
146     FX_ARGB* pFontColor = (FX_ARGB*)pTheme->GetCapacity(&part, FWL_WGTCAPACITY_TextColor);\r
147     if(pFontColor) {\r
148         m_pBarcodeEngine->SetFontColor(*pFontColor);\r
149     }\r
150     m_pBarcodeEngine->SetHeight(FX_INT32(m_rtClient.height));\r
151     m_pBarcodeEngine->SetWidth(FX_INT32(m_rtClient.width));\r
152     FX_DWORD dwAttributeMask = pData->GetBarcodeAttributeMask();\r
153     if (dwAttributeMask & FWL_BCDATTRIBUTE_CHARENCODING)        {\r
154         m_pBarcodeEngine->SetCharEncoding                       (pData->GetCharEncoding());\r
155     }\r
156     if (dwAttributeMask & FWL_BCDATTRIBUTE_MODULEHEIGHT)        {\r
157         m_pBarcodeEngine->SetModuleHeight                       (pData->GetModuleHeight());\r
158     }\r
159     if (dwAttributeMask & FWL_BCDATTRIBUTE_MODULEWIDTH) {\r
160         m_pBarcodeEngine->SetModuleWidth                        (pData->GetModuleWidth());\r
161     }\r
162     if (dwAttributeMask & FWL_BCDATTRIBUTE_DATALENGTH) {\r
163         m_pBarcodeEngine->SetDataLength                         (pData->GetDataLength());\r
164     }\r
165     if (dwAttributeMask & FWL_BCDATTRIBUTE_CALCHECKSUM) {\r
166         m_pBarcodeEngine->SetCalChecksum                        (pData->GetCalChecksum());\r
167     }\r
168     if (dwAttributeMask & FWL_BCDATTRIBUTE_PRINTCHECKSUM)       {\r
169         m_pBarcodeEngine->SetPrintChecksum                      (pData->GetPrintChecksum());\r
170     }\r
171     if (dwAttributeMask & FWL_BCDATTRIBUTE_TEXTLOCATION)        {\r
172         m_pBarcodeEngine->SetTextLocation                       (pData->GetTextLocation());\r
173     }\r
174     if (dwAttributeMask & FWL_BCDATTRIBUTE_WIDENARROWRATIO)     {\r
175         m_pBarcodeEngine->SetWideNarrowRatio            (pData->GetWideNarrowRatio());\r
176     }\r
177     if (dwAttributeMask & FWL_BCDATTRIBUTE_STARTCHAR) {\r
178         m_pBarcodeEngine->SetStartChar                          (pData->GetStartChar());\r
179     }\r
180     if (dwAttributeMask & FWL_BCDATTRIBUTE_ENDCHAR) {\r
181         m_pBarcodeEngine->SetEndChar                            (pData->GetEndChar());\r
182     }\r
183     if (dwAttributeMask & FWL_BCDATTRIBUTE_VERSION) {\r
184         m_pBarcodeEngine->SetVersion                            (pData->GetVersion());\r
185     }\r
186     if (dwAttributeMask & FWL_BCDATTRIBUTE_ECLEVEL) {\r
187         m_pBarcodeEngine->SetErrorCorrectionLevel       (pData->GetErrorCorrectionLevel());\r
188     }\r
189     if (dwAttributeMask & FWL_BCDATTRIBUTE_TRUNCATED) {\r
190         m_pBarcodeEngine->SetTruncated                          (pData->GetTruncated());\r
191     }\r
192     FX_INT32 errorCode = 0;\r
193     m_dwStatus = m_pBarcodeEngine->Encode(wsText, TRUE, errorCode) ? XFA_BCS_EncodeSuccess : 0;\r
194 }\r
195 void CFWL_BarcodeImp::CreateBarcodeEngine()\r
196 {\r
197     if ((m_pBarcodeEngine == NULL) && (m_type != BC_UNKNOWN)) {\r
198         m_pBarcodeEngine = FX_Barcode_Create(m_type);\r
199     }\r
200 }\r
201 void CFWL_BarcodeImp::ReleaseBarcodeEngine()\r
202 {\r
203     if (m_pBarcodeEngine) {\r
204         m_pBarcodeEngine->Release();\r
205         m_pBarcodeEngine = NULL;\r
206     }\r
207 }\r
208 void CFWL_BarcodeImp::SetType(BC_TYPE type)\r
209 {\r
210     if (m_type == type) {\r
211         return;\r
212     }\r
213     ReleaseBarcodeEngine();\r
214     m_type = type;\r
215     m_dwStatus = XFA_BCS_NeedUpdate;\r
216 }\r
217 FWL_ERR CFWL_BarcodeImp::SetText(const CFX_WideString &wsText)\r
218 {\r
219     ReleaseBarcodeEngine();\r
220     m_dwStatus = XFA_BCS_NeedUpdate;\r
221     return CFWL_EditImp::SetText(wsText);\r
222 }\r
223 FX_BOOL CFWL_BarcodeImp::IsProtectedType()\r
224 {\r
225     if (!m_pBarcodeEngine) {\r
226         return TRUE;\r
227     }\r
228     BC_TYPE tEngineType = m_pBarcodeEngine->GetType();\r
229     if (tEngineType == BC_QR_CODE || tEngineType == BC_PDF417 || tEngineType == BC_DATAMATRIX) {\r
230         return TRUE;\r
231     }\r
232     return FALSE;\r
233 }\r
234 CFWL_BarcodeImpDelegate::CFWL_BarcodeImpDelegate(CFWL_BarcodeImp *pOwner)\r
235     : CFWL_EditImpDelegate(pOwner)\r
236 {\r
237 }\r
238 FWL_ERR CFWL_BarcodeImpDelegate::OnProcessEvent(CFWL_Event *pEvent)\r
239 {\r
240     FX_DWORD dwFlag = pEvent->GetClassID();\r
241     if (dwFlag == FWL_EVTHASH_EDT_TextChanged) {\r
242         CFWL_BarcodeImp* pOwner = (CFWL_BarcodeImp*)m_pOwner;\r
243         pOwner->ReleaseBarcodeEngine();\r
244         pOwner->m_dwStatus = XFA_BCS_NeedUpdate;\r
245     }\r
246     return CFWL_EditImpDelegate::OnProcessEvent(pEvent);\r
247 }\r