edbd9c927aef3dff08323ffab96d48ca91b75055
[reactos.git] / subsys / system / explorer / Seashell / SeaShellExt / LocaleInfo.cpp
1 //*******************************************************************************
2 // COPYRIGHT NOTES
3 // ---------------
4 // You may use this source code, compile or redistribute it as part of your application 
5 // for free. You cannot redistribute it as a part of a software development 
6 // library without the agreement of the author. If the sources are 
7 // distributed along with the application, you should leave the original 
8 // copyright notes in the source code without any changes.
9 // This code can be used WITHOUT ANY WARRANTIES at your own risk.
10 // 
11 // For the latest updates to this code, check this site:
12 // http://www.masmex.com 
13 // after Sept 2000
14 // 
15 // Copyright(C) 2000 Philip Oldaker <email: philip@masmex.com>
16 //*******************************************************************************
17
18 // LocaleInfo.cpp: implementation of the CLocaleInfo class.
19 //
20 //////////////////////////////////////////////////////////////////////
21
22 #include "stdafx.h"
23 #include "LocaleInfo.h"
24 #include "TextParse.h"
25
26 //////////////////////////////////////////////////////////////////////
27 // Construction/Destruction
28 //////////////////////////////////////////////////////////////////////
29 // static
30 CLocaleInfo *CLocaleInfo::Instance()
31 {
32         static CLocaleInfo data;
33         return &data;
34 }
35
36 CLocaleInfo::CLocaleInfo()
37 {
38         m_pszNegativeSign = NULL;
39         m_pszDecimalSep = NULL;
40         m_pszThousandSep = NULL;
41         m_pszLongDate = NULL;
42         m_pszShortDate = NULL;
43         m_pszShortTime = NULL;
44         m_pszLongTime = NULL;
45         m_pszDateSep = NULL;
46         m_pszTimeSep = NULL;
47         GetAllLocaleInfo();
48 }
49
50 CLocaleInfo::~CLocaleInfo()
51 {
52         delete []m_pszNegativeSign;
53         delete []m_pszDecimalSep;
54         delete []m_pszThousandSep;
55         delete []m_pszLongDate;
56         delete []m_pszShortDate;
57         delete []m_pszShortTime;
58         delete []m_pszLongTime;
59         delete []m_pszDateSep;
60         delete []m_pszTimeSep;
61 }
62
63 void CLocaleInfo::GetAllLocaleInfo()
64 {               
65         m_pszShortTime = new TCHAR[MAX_PATH];
66         lstrcpy(m_pszShortTime,_T("H:mm"));
67         AllocLocaleInfo(LOCALE_STIMEFORMAT,&m_pszLongTime);
68         AllocLocaleInfo(LOCALE_SSHORTDATE,&m_pszShortDate);
69         AllocLocaleInfo(LOCALE_SLONGDATE,&m_pszLongDate);
70         AllocLocaleInfo(LOCALE_SDATE,&m_pszDateSep);
71         AllocLocaleInfo(LOCALE_STIME,&m_pszTimeSep);
72         AllocLocaleInfo(LOCALE_SNEGATIVESIGN,&m_pszNegativeSign);
73         AllocLocaleInfo(LOCALE_SDECIMAL,&m_pszDecimalSep);
74         AllocLocaleInfo(LOCALE_STHOUSAND,&m_pszThousandSep);
75 }
76
77 void CLocaleInfo::AllocLocaleInfo(LCTYPE lctype,LPTSTR *pszInfo)
78 {
79         int nLen = GetLocaleInfo(LOCALE_USER_DEFAULT,lctype,NULL,0);
80         if (nLen)
81         {
82                 *pszInfo = new TCHAR[nLen];
83                 GetLocaleInfo(LOCALE_USER_DEFAULT,lctype,*pszInfo,nLen);
84         }
85 }
86
87 CString CLocaleInfo::FormatDateTime(const COleDateTime &oleDateTime)
88 {
89         CString sDate, sTime;
90         sDate = oleDateTime.Format(ConvertStdToWinFormat(GetShortDate()));
91         sTime = oleDateTime.Format(ConvertStdToWinFormat(GetLongTime()));
92         return sDate + _T(" ") + sTime;
93 }
94
95 CString CLocaleInfo::FormatDateTime(const FILETIME &ft)
96 {
97         COleDateTime oleDateTime(ft);
98         return FormatDateTime(oleDateTime);
99 }
100
101 static struct FormatCodes
102 {
103         LPCTSTR szWinFormat;
104         LPCTSTR szStdFormat;
105 } FC[] = { 
106         { _T("M"), _T("%#m") },
107         { _T("MM"),_T("%m") },
108         { _T("MMM"),_T("%b") },
109         { _T("MMMM"),_T("%B") },
110         { _T("d"),_T("%#d") },
111         { _T("dd"),_T("%d") },
112         { _T("dddd"),_T("%A") },
113         { _T("yy"),_T("%y") },
114         { _T("yyyy"),_T("%Y") },
115         { _T("H"),_T("%#H") },
116         { _T("HH"),_T("%H") },
117         { _T("h"),_T("%#I") },
118         { _T("hh"),_T("%I") },
119         { _T("mm"),_T("%M") },
120         { _T("ss"),_T("%S") },
121         { _T("tt"),_T("%p") },
122 {  NULL, NULL }
123 };
124
125 // Short Format
126 // M/d/yyyy
127 // M/d/yy
128 // MM/dd/yy
129 // MM/dd/yyyy
130 // yy/MM/dd
131 // yyyy-MM-dd
132 // dd-MMM-yy
133
134 // Long Format
135 // dddd, MMMM dd, yyyy
136 // MMMM dd, yyyy
137 // dddd, dd MMMM, yyyy
138 // dd MMMM, yyyy
139
140 // Time
141 // H:mm:ss
142 // h:mm:ss tt
143 // hh:mm:ss tt
144 // HH:mm:ss
145
146 CString CLocaleInfo::ConvertStdToWinFormat(LPCTSTR pszFormat)
147 {
148         CString sCode;
149         CString sWinFormat;
150         CTextParse parse(pszFormat);
151         CString sSeparators(_T(" -/,.:"));
152         while (!parse.IsEnd())
153         {
154                         if (parse.CharAtCurrent(sSeparators))
155                         {
156                                 sCode = parse.CopyWhileChar(sSeparators);
157                         }
158                         else
159                         {
160                                 sCode = parse.CopyUntilChar(sSeparators);
161                         }
162                         StdToWinFormatCode(sCode);
163                         sWinFormat += sCode;
164         }
165         return sWinFormat;
166 }
167
168 void CLocaleInfo::StdToWinFormatCode(CString &sCode)
169 {
170         for(int i=0;FC[i].szWinFormat != NULL;i++) 
171         {
172                 if (sCode == FC[i].szWinFormat)
173                 {
174                         sCode = FC[i].szStdFormat;
175                         break;
176                 }
177         }
178 }