Merge XFA to PDFium master at 4dc95e7 on 10/28/2014
[pdfium.git] / xfa / src / fgas / include / fx_locale.h
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 #ifndef _FX_LOCALE_H_\r
8 #define _FX_LOCALE_H_\r
9 class CFX_Unitime;\r
10 class IFX_Locale;\r
11 class IFX_FormatString;\r
12 class IFX_LocaleMgr;\r
13 enum FX_LOCALENUMSYMBOL {\r
14     FX_LOCALENUMSYMBOL_Decimal,\r
15     FX_LOCALENUMSYMBOL_Grouping,\r
16     FX_LOCALENUMSYMBOL_Percent,\r
17     FX_LOCALENUMSYMBOL_Minus,\r
18     FX_LOCALENUMSYMBOL_Zero,\r
19     FX_LOCALENUMSYMBOL_CurrencySymbol,\r
20     FX_LOCALENUMSYMBOL_CurrencyName,\r
21 };\r
22 enum FX_LOCALEDATETIMESUBCATEGORY {\r
23     FX_LOCALEDATETIMESUBCATEGORY_Default,\r
24     FX_LOCALEDATETIMESUBCATEGORY_Short,\r
25     FX_LOCALEDATETIMESUBCATEGORY_Medium,\r
26     FX_LOCALEDATETIMESUBCATEGORY_Full,\r
27     FX_LOCALEDATETIMESUBCATEGORY_Long,\r
28 };\r
29 enum FX_LOCALENUMSUBCATEGORY {\r
30     FX_LOCALENUMPATTERN_Percent,\r
31     FX_LOCALENUMPATTERN_Currency,\r
32     FX_LOCALENUMPATTERN_Decimal,\r
33     FX_LOCALENUMPATTERN_Integer,\r
34 };\r
35 enum FX_LOCALECATEGORY {\r
36     FX_LOCALECATEGORY_Unknown,\r
37     FX_LOCALECATEGORY_Date,\r
38     FX_LOCALECATEGORY_Time,\r
39     FX_LOCALECATEGORY_DateTime,\r
40     FX_LOCALECATEGORY_Num,\r
41     FX_LOCALECATEGORY_Text,\r
42     FX_LOCALECATEGORY_Zero,\r
43     FX_LOCALECATEGORY_Null,\r
44 };\r
45 enum FX_DATETIMETYPE {\r
46     FX_DATETIMETYPE_Unknown,\r
47     FX_DATETIMETYPE_Date,\r
48     FX_DATETIMETYPE_Time,\r
49     FX_DATETIMETYPE_DateTime,\r
50     FX_DATETIMETYPE_TimeDate,\r
51 };\r
52 class IFX_Locale\r
53 {\r
54 public:\r
55     static IFX_Locale* Create(CXML_Element* pLocaleData);\r
56 \r
57     virtual void        Release() = 0;\r
58 \r
59 \r
60     virtual CFX_WideString GetName() = 0;\r
61 \r
62     virtual void        GetNumbericSymbol(FX_LOCALENUMSYMBOL eType, CFX_WideString& wsNumSymbol) const = 0;\r
63     virtual void        GetDateTimeSymbols(CFX_WideString& wsDtSymbol) const = 0;\r
64     virtual void        GetMonthName(FX_INT32 nMonth, CFX_WideString& wsMonthName, FX_BOOL bAbbr = TRUE) const = 0;\r
65     virtual void        GetDayName(FX_INT32 nWeek, CFX_WideString& wsDayName, FX_BOOL bAbbr = TRUE) const = 0;\r
66     virtual void        GetMeridiemName(CFX_WideString& wsMeridiemName, FX_BOOL bAM = TRUE) const = 0;\r
67     virtual void        GetTimeZone(FX_TIMEZONE& tz) const = 0;\r
68     virtual void        GetEraName(CFX_WideString& wsEraName, FX_BOOL bAD = TRUE) const = 0;\r
69     virtual void        GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY eType, CFX_WideString& wsPattern) const = 0;\r
70     virtual void        GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY eType, CFX_WideString& wsPattern) const = 0;\r
71     virtual void        GetNumPattern(FX_LOCALENUMSUBCATEGORY eType, CFX_WideString& wsPattern) const = 0;\r
72 };\r
73 class IFX_LocaleMgr\r
74 {\r
75 public:\r
76     virtual void                        Release() = 0;\r
77     virtual FX_WORD                     GetDefLocaleID() = 0;\r
78     virtual IFX_Locale*         GetDefLocale() = 0;\r
79     virtual IFX_Locale*         GetLocale(FX_WORD lcid) = 0;\r
80     virtual IFX_Locale*         GetLocaleByName(FX_WSTR wsLocaleName) = 0;\r
81 };\r
82 IFX_LocaleMgr*  FX_LocaleMgr_Create(FX_LPCWSTR pszLocalPath, FX_WORD wDefaultLCID);\r
83 void                    FX_ParseNumString(const CFX_WideString& wsNum, CFX_WideString& wsResult);\r
84 FX_BOOL                 FX_DateFromCanonical(const CFX_WideString& wsDate, CFX_Unitime& datetime);\r
85 FX_BOOL                 FX_TimeFromCanonical(FX_WSTR wsTime, CFX_Unitime& datetime, IFX_Locale* pLocale);\r
86 class IFX_FormatString\r
87 {\r
88 public:\r
89     static IFX_FormatString* Create(IFX_LocaleMgr* pLocaleMgr, FX_BOOL bUseLCID);\r
90 \r
91     virtual void Release() = 0;\r
92     virtual void SplitFormatString(const CFX_WideString& wsFormatString, CFX_WideStringArray& wsPatterns) = 0;\r
93     virtual FX_LOCALECATEGORY   GetCategory(const CFX_WideString& wsPattern) = 0;\r
94     virtual FX_WORD                             GetLCID(const CFX_WideString& wsPattern) = 0;\r
95     virtual CFX_WideString              GetLocaleName(const CFX_WideString& wsPattern) = 0;\r
96     virtual FX_BOOL     ParseText(const CFX_WideString& wsSrcText, const CFX_WideString& wsPattern, CFX_WideString& wsValue) = 0;\r
97     virtual FX_BOOL     ParseNum(const CFX_WideString& wsSrcNum, const CFX_WideString& wsPattern, FX_FLOAT &fValue) = 0;\r
98     virtual FX_BOOL     ParseNum(const CFX_WideString& wsSrcNum, const CFX_WideString& wsPattern, CFX_WideString &wsValue) = 0;\r
99     virtual FX_BOOL     ParseDateTime(const CFX_WideString& wsSrcDateTime, const CFX_WideString& wsPattern, FX_DATETIMETYPE eDateTimeType, CFX_Unitime& dtValue) = 0;\r
100     virtual FX_BOOL ParseZero(const CFX_WideString& wsSrcText, const CFX_WideString& wsPattern) = 0;\r
101     virtual FX_BOOL ParseNull(const CFX_WideString& wsSrcText, const CFX_WideString& wsPattern) = 0;\r
102     virtual FX_BOOL     FormatText(const CFX_WideString& wsSrcText, const CFX_WideString& wsPattern, CFX_WideString& wsOutput) = 0;\r
103     virtual FX_BOOL     FormatNum(const CFX_WideString& wsSrcNum, const CFX_WideString& wsPattern, CFX_WideString& wsOutput) = 0;\r
104     virtual FX_BOOL     FormatNum(FX_FLOAT fNum, const CFX_WideString& wsPattern, CFX_WideString& wsOutput) = 0;\r
105     virtual FX_BOOL     FormatDateTime(const CFX_WideString& wsSrcDateTime, const CFX_WideString& wsPattern, CFX_WideString& wsOutput) = 0;\r
106     virtual FX_BOOL     FormatDateTime(const CFX_WideString& wsSrcDateTime, const CFX_WideString& wsPattern, CFX_WideString& wsOutput, FX_DATETIMETYPE eDateTimeType) = 0;\r
107     virtual FX_BOOL     FormatDateTime(const CFX_Unitime& dt, const CFX_WideString& wsPattern, CFX_WideString& wsOutput) = 0;\r
108     virtual FX_BOOL FormatZero(const CFX_WideString& wsPattern, CFX_WideString& wsOutput) = 0;\r
109     virtual FX_BOOL FormatNull(const CFX_WideString& wsPattern, CFX_WideString& wsOutput) = 0;\r
110 };\r
111 class CFX_Decimal : CFX_Object\r
112 {\r
113 public:\r
114     CFX_Decimal();\r
115     CFX_Decimal(FX_UINT32 val);\r
116     CFX_Decimal(FX_UINT64 val);\r
117     CFX_Decimal(FX_INT32 val);\r
118     CFX_Decimal(FX_INT64 val);\r
119     CFX_Decimal(FX_FLOAT val, FX_UINT8 scale = 3);\r
120     CFX_Decimal(FX_WSTR str);\r
121     CFX_Decimal(FX_BSTR str);\r
122     operator CFX_WideString() const;\r
123     operator double() const;\r
124     FX_BOOL operator == (const CFX_Decimal& val) const;\r
125     FX_BOOL operator <= (const CFX_Decimal& val) const;\r
126     FX_BOOL operator >= (const CFX_Decimal& val) const;\r
127     FX_BOOL operator != (const CFX_Decimal& val) const;\r
128     FX_BOOL operator <  (const CFX_Decimal& val) const;\r
129     FX_BOOL operator >  (const CFX_Decimal& val) const;\r
130     CFX_Decimal operator + (const CFX_Decimal& val) const;\r
131     CFX_Decimal operator - (const CFX_Decimal& val) const;\r
132     CFX_Decimal operator * (const CFX_Decimal& val) const;\r
133     CFX_Decimal operator / (const CFX_Decimal& val) const;\r
134     CFX_Decimal operator % (const CFX_Decimal& val) const;\r
135     void                SetScale(FX_UINT8 newScale);\r
136     FX_UINT8    GetScale();\r
137     void                SetAbs();\r
138     void                SetNegate();\r
139     void                SetFloor();\r
140     void                SetCeiling();\r
141     void                SetTruncate();\r
142 protected:\r
143     CFX_Decimal(FX_UINT32 hi, FX_UINT32 mid, FX_UINT32 lo, FX_BOOL neg, FX_UINT8 scale);\r
144     inline FX_BOOL      IsNotZero() const\r
145     {\r
146         return m_uHi || m_uMid || m_uLo;\r
147     }\r
148     inline FX_INT8      Compare (const CFX_Decimal& val) const;\r
149     inline void         Swap(CFX_Decimal& val);\r
150     inline void         FloorOrCeil(FX_BOOL bFloor);\r
151     CFX_Decimal         AddOrMinus(const CFX_Decimal& val, FX_BOOL isAdding) const;\r
152     CFX_Decimal         Multiply(const CFX_Decimal& val) const;\r
153     CFX_Decimal         Divide(const CFX_Decimal& val) const;\r
154     CFX_Decimal         Modulus(const CFX_Decimal& val) const;\r
155     FX_UINT32           m_uFlags;\r
156     FX_UINT32           m_uHi;\r
157     FX_UINT32           m_uLo;\r
158     FX_UINT32           m_uMid;\r
159 };\r
160 #endif\r