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  */
8 
9 /* INCLUDES *********************************************************/
10 
11 #include "precomp.h"
12 
13 #include <winreg.h>
14 
15 /* FUNCTIONS ********************************************************/
16 static DWORD ReadDWORD(CRegKey &key, LPCTSTR lpName, DWORD &dwValue, BOOL bCheckForDef)
17 {
18     DWORD dwPrev = dwValue;
19 
20     if (key.QueryDWORDValue(lpName, dwValue) != ERROR_SUCCESS)
21         dwValue = dwPrev;
22 
23     if (bCheckForDef && dwValue == 0)
24         dwValue = dwPrev;
25 
26     return dwPrev;
27 }
28 
29 static void ReadFileHistory(CRegKey &key, LPCTSTR lpName, CString &strFile)
30 {
31     ULONG nChars = MAX_PATH;
32     LPTSTR szFile = strFile.GetBuffer(nChars);
33     if (key.QueryStringValue(lpName, szFile, &nChars) != ERROR_SUCCESS)
34         szFile[0] = '\0';
35     strFile.ReleaseBuffer();
36 }
37 
38 void RegistrySettings::SetWallpaper(LPCTSTR szFileName, RegistrySettings::WallpaperStyle style)
39 {
40     CRegKey desktop;
41     if (desktop.Open(HKEY_CURRENT_USER, _T("Control Panel\\Desktop")) == ERROR_SUCCESS)
42     {
43         desktop.SetStringValue(_T("Wallpaper"), szFileName);
44 
45         desktop.SetStringValue(_T("WallpaperStyle"), (style == RegistrySettings::STRETCHED) ? _T("2") : _T("0"));
46         desktop.SetStringValue(_T("TileWallpaper"), (style == RegistrySettings::TILED) ? _T("1") : _T("0"));
47     }
48 
49     SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, (PVOID) szFileName, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
50 }
51 
52 void RegistrySettings::LoadPresets()
53 {
54     BMPHeight = 300;
55     BMPWidth = 400;
56     GridExtent = 1;
57     NoStretching = 0;
58     ShowThumbnail = 0;
59     SnapToGrid = 0;
60     ThumbHeight = 100;
61     ThumbWidth = 120;
62     ThumbXPos = 180;
63     ThumbYPos = 200;
64     UnitSetting = 0;
65     const WINDOWPLACEMENT DefaultWindowPlacement = {
66         sizeof(WINDOWPLACEMENT),
67         0,
68         SW_SHOWNORMAL,
69         {0, 0},
70         {-1, -1},
71         {100, 100, 700, 550}
72     };
73     WindowPlacement = DefaultWindowPlacement;
74 }
75 
76 void RegistrySettings::Load()
77 {
78     LoadPresets();
79 
80     CRegKey view;
81     if (view.Open(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Windows\\CurrentVersion\\Applets\\Paint\\View"), KEY_READ) == ERROR_SUCCESS)
82     {
83         ReadDWORD(view, _T("BMPHeight"),     BMPHeight,     TRUE);
84         ReadDWORD(view, _T("BMPWidth"),      BMPWidth,      TRUE);
85         ReadDWORD(view, _T("GridExtent"),    GridExtent,    FALSE);
86         ReadDWORD(view, _T("NoStretching"),  NoStretching,  FALSE);
87         ReadDWORD(view, _T("ShowThumbnail"), ShowThumbnail, FALSE);
88         ReadDWORD(view, _T("SnapToGrid"),    SnapToGrid,    FALSE);
89         ReadDWORD(view, _T("ThumbHeight"),   ThumbHeight,   TRUE);
90         ReadDWORD(view, _T("ThumbWidth"),    ThumbWidth,    TRUE);
91         ReadDWORD(view, _T("ThumbXPos"),     ThumbXPos,     TRUE);
92         ReadDWORD(view, _T("ThumbYPos"),     ThumbYPos,     TRUE);
93         ReadDWORD(view, _T("UnitSetting"),   UnitSetting,   FALSE);
94 
95         ULONG pnBytes = sizeof(WINDOWPLACEMENT);
96         view.QueryBinaryValue(_T("WindowPlacement"), &WindowPlacement, &pnBytes);
97     }
98 
99     CRegKey files;
100     if (files.Open(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Windows\\CurrentVersion\\Applets\\Paint\\Recent File List"), KEY_READ) == ERROR_SUCCESS)
101     {
102         ReadFileHistory(files, _T("File1"), strFile1);
103         ReadFileHistory(files, _T("File2"), strFile2);
104         ReadFileHistory(files, _T("File3"), strFile3);
105         ReadFileHistory(files, _T("File4"), strFile4);
106     }
107 }
108 
109 void RegistrySettings::Store()
110 {
111     CRegKey view;
112     if (view.Create(HKEY_CURRENT_USER,
113                      _T("Software\\Microsoft\\Windows\\CurrentVersion\\Applets\\Paint\\View")) == ERROR_SUCCESS)
114     {
115         view.SetDWORDValue(_T("BMPHeight"),     BMPHeight);
116         view.SetDWORDValue(_T("BMPWidth"),      BMPWidth);
117         view.SetDWORDValue(_T("GridExtent"),    GridExtent);
118         view.SetDWORDValue(_T("NoStretching"),  NoStretching);
119         view.SetDWORDValue(_T("ShowThumbnail"), ShowThumbnail);
120         view.SetDWORDValue(_T("SnapToGrid"),    SnapToGrid);
121         view.SetDWORDValue(_T("ThumbHeight"),   ThumbHeight);
122         view.SetDWORDValue(_T("ThumbWidth"),    ThumbWidth);
123         view.SetDWORDValue(_T("ThumbXPos"),     ThumbXPos);
124         view.SetDWORDValue(_T("ThumbYPos"),     ThumbYPos);
125         view.SetDWORDValue(_T("UnitSetting"),   UnitSetting);
126 
127         view.SetBinaryValue(_T("WindowPlacement"), &WindowPlacement, sizeof(WINDOWPLACEMENT));
128     }
129 
130     CRegKey files;
131     if (files.Create(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Windows\\CurrentVersion\\Applets\\Paint\\Recent File List")) == ERROR_SUCCESS)
132     {
133         if (!strFile1.IsEmpty())
134             files.SetStringValue(_T("File1"), strFile1);
135         if (!strFile2.IsEmpty())
136             files.SetStringValue(_T("File2"), strFile2);
137         if (!strFile3.IsEmpty())
138             files.SetStringValue(_T("File3"), strFile3);
139         if (!strFile4.IsEmpty())
140             files.SetStringValue(_T("File4"), strFile4);
141     }
142 }
143 
144 void RegistrySettings::SetMostRecentFile(LPCTSTR szPathName)
145 {
146     if (strFile1 == szPathName)
147     {
148         // do nothing
149     }
150     else if (strFile2 == szPathName)
151     {
152         CString strTemp = strFile2;
153         strFile2 = strFile1;
154         strFile1 = strTemp;
155     }
156     else if (strFile3 == szPathName)
157     {
158         CString strTemp = strFile3;
159         strFile3 = strFile2;
160         strFile2 = strFile1;
161         strFile1 = strTemp;
162     }
163     else if (strFile4 == szPathName)
164     {
165         CString strTemp = strFile4;
166         strFile4 = strFile3;
167         strFile3 = strFile2;
168         strFile2 = strFile1;
169         strFile1 = strTemp;
170     }
171     else
172     {
173         strFile4 = strFile3;
174         strFile3 = strFile2;
175         strFile2 = strFile1;
176         strFile1 = szPathName;
177     }
178 }
179