f23ce12e8f41a76c0c3176fbbb9013b0cd87a211
[reactos.git] / base / applications / mspaint / registry.cpp
1 /*
2 * PROJECT: PAINT for ReactOS
3 * LICENSE: LGPL
4 * FILE: base/applications/mspaint/registry.cpp
5 * PURPOSE: Offering functions dealing with registry values
6 * PROGRAMMERS: Benedikt Freisen
7 * Katayama Hirofumi MZ
8 */
9
10 /* INCLUDES *********************************************************/
11
12 #include "precomp.h"
13 #include <winreg.h>
14 #include <wincon.h>
15 #include <shlobj.h>
16
17 /* FUNCTIONS ********************************************************/
18 static void ReadDWORD(CRegKey &key, LPCTSTR lpName, DWORD &dwValue)
19 {
20 DWORD dwTemp;
21 if (key.QueryDWORDValue(lpName, dwTemp) == ERROR_SUCCESS)
22 dwValue = dwTemp;
23 }
24
25 static void ReadString(CRegKey &key, LPCTSTR lpName, CString &strValue, LPCTSTR lpDefault = TEXT(""))
26 {
27 CString strTemp;
28 ULONG nChars = MAX_PATH;
29 LPTSTR psz = strTemp.GetBuffer(nChars);
30 LONG error = key.QueryStringValue(lpName, psz, &nChars);
31 strTemp.ReleaseBuffer();
32
33 if (error == ERROR_SUCCESS)
34 strValue = strTemp;
35 else
36 strValue = lpDefault;
37 }
38
39 void RegistrySettings::SetWallpaper(LPCTSTR szFileName, RegistrySettings::WallpaperStyle style)
40 {
41 CRegKey desktop;
42 if (desktop.Open(HKEY_CURRENT_USER, _T("Control Panel\\Desktop")) == ERROR_SUCCESS)
43 {
44 desktop.SetStringValue(_T("Wallpaper"), szFileName);
45
46 desktop.SetStringValue(_T("WallpaperStyle"), (style == RegistrySettings::STRETCHED) ? _T("2") : _T("0"));
47 desktop.SetStringValue(_T("TileWallpaper"), (style == RegistrySettings::TILED) ? _T("1") : _T("0"));
48 }
49
50 SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, (PVOID) szFileName, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
51 }
52
53 void RegistrySettings::LoadPresets(INT nCmdShow)
54 {
55 BMPHeight = GetSystemMetrics(SM_CYSCREEN) / 2;
56 BMPWidth = GetSystemMetrics(SM_CXSCREEN) / 2;
57 GridExtent = 1;
58 NoStretching = 0;
59 ShowThumbnail = 0;
60 SnapToGrid = 0;
61 ThumbHeight = 100;
62 ThumbWidth = 120;
63 ThumbXPos = 180;
64 ThumbYPos = 200;
65 UnitSetting = 0;
66 Bold = FALSE;
67 Italic = FALSE;
68 Underline = FALSE;
69 CharSet = DEFAULT_CHARSET;
70 PointSize = 14;
71 FontsPositionX = 0;
72 FontsPositionY = 0;
73 ShowTextTool = TRUE;
74 ShowStatusBar = TRUE;
75 ShowPalette = TRUE;
76
77 LOGFONT lf;
78 GetObject(GetStockObject(DEFAULT_GUI_FONT), sizeof(lf), &lf);
79 strFontName = lf.lfFaceName;
80
81 ZeroMemory(&WindowPlacement, sizeof(WindowPlacement));
82 RECT& rc = WindowPlacement.rcNormalPosition;
83 rc.left = rc.top = CW_USEDEFAULT;
84 rc.right = rc.left + 544;
85 rc.bottom = rc.top + 375;
86 WindowPlacement.showCmd = nCmdShow;
87 }
88
89 void RegistrySettings::Load(INT nCmdShow)
90 {
91 LoadPresets(nCmdShow);
92
93 CRegKey paint;
94 if (paint.Open(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Windows\\CurrentVersion\\Applets\\Paint"), KEY_READ) != ERROR_SUCCESS)
95 return;
96
97 CRegKey view;
98 if (view.Open(paint, _T("View"), KEY_READ) == ERROR_SUCCESS)
99 {
100 ReadDWORD(view, _T("BMPHeight"), BMPHeight);
101 ReadDWORD(view, _T("BMPWidth"), BMPWidth);
102 ReadDWORD(view, _T("GridExtent"), GridExtent);
103 ReadDWORD(view, _T("NoStretching"), NoStretching);
104 ReadDWORD(view, _T("ShowThumbnail"), ShowThumbnail);
105 ReadDWORD(view, _T("SnapToGrid"), SnapToGrid);
106 ReadDWORD(view, _T("ThumbHeight"), ThumbHeight);
107 ReadDWORD(view, _T("ThumbWidth"), ThumbWidth);
108 ReadDWORD(view, _T("ThumbXPos"), ThumbXPos);
109 ReadDWORD(view, _T("ThumbYPos"), ThumbYPos);
110 ReadDWORD(view, _T("UnitSetting"), UnitSetting);
111 ReadDWORD(view, _T("ShowStatusBar"), ShowStatusBar);
112
113 ULONG pnBytes = sizeof(WINDOWPLACEMENT);
114 view.QueryBinaryValue(_T("WindowPlacement"), &WindowPlacement, &pnBytes);
115 }
116
117 CRegKey files;
118 if (files.Open(paint, _T("Recent File List"), KEY_READ) == ERROR_SUCCESS)
119 {
120 TCHAR szName[64];
121 for (INT i = 0; i < MAX_RECENT_FILES; ++i)
122 {
123 wsprintf(szName, _T("File%u"), i + 1);
124 ReadString(files, szName, strFiles[i]);
125 }
126 }
127
128 CRegKey text;
129 if (text.Open(paint, _T("Text"), KEY_READ) == ERROR_SUCCESS)
130 {
131 ReadDWORD(text, _T("Bold"), Bold);
132 ReadDWORD(text, _T("Italic"), Italic);
133 ReadDWORD(text, _T("Underline"), Underline);
134 ReadDWORD(text, _T("CharSet"), CharSet);
135 ReadDWORD(text, _T("PointSize"), PointSize);
136 ReadDWORD(text, _T("PositionX"), FontsPositionX);
137 ReadDWORD(text, _T("PositionY"), FontsPositionY);
138 ReadDWORD(text, _T("ShowTextTool"), ShowTextTool);
139 ReadString(text, _T("TypeFaceName"), strFontName, strFontName);
140 }
141
142 CRegKey bar4;
143 if (bar4.Open(paint, _T("General-Bar4"), KEY_READ) == ERROR_SUCCESS)
144 {
145 ReadDWORD(bar4, _T("Visible"), ShowPalette);
146 }
147
148 // Fix the bitmap size if too large
149 if (BMPWidth > 5000)
150 BMPWidth = (GetSystemMetrics(SM_CXSCREEN) * 6) / 10;
151 if (BMPHeight > 5000)
152 BMPHeight = (GetSystemMetrics(SM_CYSCREEN) * 6) / 10;
153 }
154
155 void RegistrySettings::Store()
156 {
157 CRegKey paint;
158 if (paint.Create(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Windows\\CurrentVersion\\Applets\\Paint")) != ERROR_SUCCESS)
159 return;
160
161 CRegKey view;
162 if (view.Create(paint, _T("View")) == ERROR_SUCCESS)
163 {
164 view.SetDWORDValue(_T("BMPHeight"), BMPHeight);
165 view.SetDWORDValue(_T("BMPWidth"), BMPWidth);
166 view.SetDWORDValue(_T("GridExtent"), GridExtent);
167 view.SetDWORDValue(_T("NoStretching"), NoStretching);
168 view.SetDWORDValue(_T("ShowThumbnail"), ShowThumbnail);
169 view.SetDWORDValue(_T("SnapToGrid"), SnapToGrid);
170 view.SetDWORDValue(_T("ThumbHeight"), ThumbHeight);
171 view.SetDWORDValue(_T("ThumbWidth"), ThumbWidth);
172 view.SetDWORDValue(_T("ThumbXPos"), ThumbXPos);
173 view.SetDWORDValue(_T("ThumbYPos"), ThumbYPos);
174 view.SetDWORDValue(_T("UnitSetting"), UnitSetting);
175 view.SetDWORDValue(_T("ShowStatusBar"), ShowStatusBar);
176
177 view.SetBinaryValue(_T("WindowPlacement"), &WindowPlacement, sizeof(WINDOWPLACEMENT));
178 }
179
180 CRegKey files;
181 if (files.Create(paint, _T("Recent File List")) == ERROR_SUCCESS)
182 {
183 TCHAR szName[64];
184 for (INT iFile = 0; iFile < MAX_RECENT_FILES; ++iFile)
185 {
186 wsprintf(szName, _T("File%u"), iFile + 1);
187 files.SetStringValue(szName, strFiles[iFile]);
188 }
189 }
190
191 CRegKey text;
192 if (text.Create(paint, _T("Text")) == ERROR_SUCCESS)
193 {
194 text.SetDWORDValue(_T("Bold"), Bold);
195 text.SetDWORDValue(_T("Italic"), Italic);
196 text.SetDWORDValue(_T("Underline"), Underline);
197 text.SetDWORDValue(_T("CharSet"), CharSet);
198 text.SetDWORDValue(_T("PointSize"), PointSize);
199 text.SetDWORDValue(_T("PositionX"), FontsPositionX);
200 text.SetDWORDValue(_T("PositionY"), FontsPositionY);
201 text.SetDWORDValue(_T("ShowTextTool"), ShowTextTool);
202 text.SetStringValue(_T("TypeFaceName"), strFontName);
203 }
204
205 CRegKey bar4;
206 if (bar4.Create(paint, _T("General-Bar4")) == ERROR_SUCCESS)
207 {
208 bar4.SetDWORDValue(_T("Visible"), ShowPalette);
209 }
210 }
211
212 void RegistrySettings::SetMostRecentFile(LPCTSTR szPathName)
213 {
214 // Register the file to the user's 'Recent' folder
215 if (szPathName && szPathName[0])
216 SHAddToRecentDocs(SHARD_PATHW, szPathName);
217
218 // If szPathName is present in strFiles, move it to the top of the list
219 for (INT i = MAX_RECENT_FILES - 1, iFound = -1; i > 0; --i)
220 {
221 if (iFound < 0 && strFiles[i].CompareNoCase(szPathName) == 0)
222 iFound = i;
223
224 if (iFound >= 0)
225 {
226 CString tmp = strFiles[i];
227 strFiles[i] = strFiles[i - 1];
228 strFiles[i - 1] = tmp;
229 }
230 }
231
232 // If szPathName is not the first item in strFiles, insert it at the top of the list
233 if (strFiles[0].CompareNoCase(szPathName) != 0)
234 {
235 for (INT i = MAX_RECENT_FILES - 1; i > 0; --i)
236 strFiles[i] = strFiles[i - 1];
237
238 strFiles[0] = szPathName;
239 }
240 }