2 * Wordpad implementation - Registry functions
4 * Copyright 2007 by Alexander N. Sørnes <alex@thehandofagony.com>
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
27 static const WCHAR key_recentfiles
[] = {'R','e','c','e','n','t',' ','f','i','l','e',
28 ' ','l','i','s','t',0};
29 static const WCHAR key_options
[] = {'O','p','t','i','o','n','s',0};
30 static const WCHAR key_settings
[] = {'S','e','t','t','i','n','g','s',0};
31 static const WCHAR key_rtf
[] = {'R','T','F',0};
32 static const WCHAR key_text
[] = {'T','e','x','t',0};
34 static const WCHAR var_file
[] = {'F','i','l','e','%','d',0};
35 static const WCHAR var_framerect
[] = {'F','r','a','m','e','R','e','c','t',0};
36 static const WCHAR var_barstate0
[] = {'B','a','r','S','t','a','t','e','0',0};
37 static const WCHAR var_wrap
[] = {'W','r','a','p',0};
38 static const WCHAR var_maximized
[] = {'M','a','x','i','m','i','z','e','d',0};
40 static LRESULT
registry_get_handle(HKEY
*hKey
, LPDWORD action
, LPCWSTR subKey
)
43 static const WCHAR wszProgramKey
[] = {'S','o','f','t','w','a','r','e','\\',
44 'M','i','c','r','o','s','o','f','t','\\',
45 'W','i','n','d','o','w','s','\\',
46 'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\',
47 'A','p','p','l','e','t','s','\\',
48 'W','o','r','d','p','a','d',0};
49 LPWSTR key
= (LPWSTR
)wszProgramKey
;
53 WCHAR backslash
[] = {'\\',0};
54 key
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
,
55 (lstrlenW(wszProgramKey
)+lstrlenW(subKey
)+lstrlenW(backslash
)+1)
61 lstrcpyW(key
, wszProgramKey
);
62 lstrcatW(key
, backslash
);
63 lstrcatW(key
, subKey
);
68 ret
= RegCreateKeyExW(HKEY_CURRENT_USER
, key
, 0, NULL
, REG_OPTION_NON_VOLATILE
,
69 KEY_READ
| KEY_WRITE
, NULL
, hKey
, action
);
72 ret
= RegOpenKeyExW(HKEY_CURRENT_USER
, key
, 0, KEY_READ
| KEY_WRITE
, hKey
);
76 HeapFree(GetProcessHeap(), 0, key
);
81 void registry_set_options(HWND hMainWnd
)
86 if(registry_get_handle(&hKey
, &action
, key_options
) == ERROR_SUCCESS
)
91 wp
.length
= sizeof(WINDOWPLACEMENT
);
92 GetWindowPlacement(hMainWnd
, &wp
);
93 isMaximized
= (wp
.showCmd
== SW_SHOWMAXIMIZED
);
95 RegSetValueExW(hKey
, var_framerect
, 0, REG_BINARY
, (LPBYTE
)&wp
.rcNormalPosition
, sizeof(RECT
));
96 RegSetValueExW(hKey
, var_maximized
, 0, REG_DWORD
, (LPBYTE
)&isMaximized
, sizeof(DWORD
));
98 registry_set_pagemargins(hKey
);
102 if(registry_get_handle(&hKey
, &action
, key_settings
) == ERROR_SUCCESS
)
104 registry_set_previewpages(hKey
);
109 void registry_read_winrect(RECT
* rc
)
112 DWORD size
= sizeof(RECT
);
114 if(registry_get_handle(&hKey
, 0, key_options
) != ERROR_SUCCESS
||
115 RegQueryValueExW(hKey
, var_framerect
, 0, NULL
, (LPBYTE
)rc
, &size
) !=
116 ERROR_SUCCESS
|| size
!= sizeof(RECT
))
127 void registry_read_maximized(DWORD
*bMaximized
)
130 DWORD size
= sizeof(DWORD
);
132 if(registry_get_handle(&hKey
, 0, key_options
) != ERROR_SUCCESS
||
133 RegQueryValueExW(hKey
, var_maximized
, 0, NULL
, (LPBYTE
)bMaximized
, &size
) !=
134 ERROR_SUCCESS
|| size
!= sizeof(DWORD
))
142 static void truncate_path(LPWSTR file
, LPWSTR out
, LPWSTR pos1
, LPWSTR pos2
)
144 static const WCHAR dots
[] = {'.','.','.',0};
153 static void format_filelist_filename(LPWSTR file
, LPWSTR out
)
156 LPWSTR truncpos1
, truncpos2
;
157 WCHAR myDocs
[MAX_STRING_LEN
];
159 SHGetFolderPathW(NULL
, CSIDL_PERSONAL
, NULL
, SHGFP_TYPE_CURRENT
, (LPWSTR
)&myDocs
);
160 pos_basename
= file_basename(file
);
164 *(pos_basename
-1) = 0;
165 if(!lstrcmpiW(file
, myDocs
) || (lstrlenW(pos_basename
) > FILELIST_ENTRY_LENGTH
))
167 truncpos1
= pos_basename
;
168 *(pos_basename
-1) = '\\';
172 BOOL morespace
= FALSE
;
174 *(pos_basename
-1) = '\\';
176 for(pos
= file
; pos
< pos_basename
; pos
++)
178 if(*pos
== '\\' || *pos
== '/')
182 if((pos
- file
+ lstrlenW(pos_basename
)) > FILELIST_ENTRY_LENGTH
)
190 if((pos
- file
+ lstrlenW(pos_basename
)) > FILELIST_ENTRY_LENGTH
)
199 for(pos
= pos_basename
; pos
>= truncpos1
; pos
--)
201 if(*pos
== '\\' || *pos
== '/')
203 if((truncpos1
- file
+ lstrlenW(pos_basename
) + pos_basename
- pos
) > FILELIST_ENTRY_LENGTH
)
212 if(truncpos1
== pos_basename
)
213 lstrcatW(out
, pos_basename
);
214 else if(truncpos1
== truncpos2
|| !truncpos2
)
217 truncate_path(file
, out
, truncpos1
, truncpos2
);
220 void registry_read_filelist(HWND hMainWnd
)
224 if(registry_get_handle(&hFileKey
, 0, key_recentfiles
) == ERROR_SUCCESS
)
226 WCHAR itemText
[MAX_PATH
+3], buffer
[MAX_PATH
];
227 /* The menu item name is not the same as the file name, so we need to store
228 the file name here */
229 static WCHAR file1
[MAX_PATH
], file2
[MAX_PATH
], file3
[MAX_PATH
], file4
[MAX_PATH
];
230 WCHAR numFormat
[] = {'&','%','d',' ',0};
231 LPWSTR pFile
[] = {file1
, file2
, file3
, file4
};
232 DWORD pathSize
= MAX_PATH
*sizeof(WCHAR
);
236 HMENU hMenu
= GetMenu(hMainWnd
);
238 mi
.cbSize
= sizeof(MENUITEMINFOW
);
239 mi
.fMask
= MIIM_ID
| MIIM_DATA
| MIIM_STRING
| MIIM_FTYPE
;
240 mi
.fType
= MFT_STRING
;
241 mi
.dwTypeData
= itemText
;
242 mi
.wID
= ID_FILE_RECENT1
;
244 RemoveMenu(hMenu
, ID_FILE_RECENT_SEPARATOR
, MF_BYCOMMAND
);
245 for(i
= 0; i
< FILELIST_ENTRIES
; i
++)
247 wsprintfW(key
, var_file
, i
+1);
248 RemoveMenu(hMenu
, ID_FILE_RECENT1
+i
, MF_BYCOMMAND
);
249 if(RegQueryValueExW(hFileKey
, (LPWSTR
)key
, 0, NULL
, (LPBYTE
)pFile
[i
], &pathSize
)
253 mi
.dwItemData
= (ULONG_PTR
)pFile
[i
];
254 wsprintfW(itemText
, numFormat
, i
+1);
256 lstrcpyW(buffer
, pFile
[i
]);
258 format_filelist_filename(buffer
, itemText
);
260 InsertMenuItemW(hMenu
, ID_FILE_EXIT
, FALSE
, &mi
);
262 pathSize
= MAX_PATH
*sizeof(WCHAR
);
264 mi
.fType
= MFT_SEPARATOR
;
265 mi
.fMask
= MIIM_FTYPE
| MIIM_ID
;
266 InsertMenuItemW(hMenu
, ID_FILE_EXIT
, FALSE
, &mi
);
268 RegCloseKey(hFileKey
);
272 void registry_set_filelist(LPCWSTR newFile
, HWND hMainWnd
)
277 if(registry_get_handle(&hKey
, &action
, key_recentfiles
) == ERROR_SUCCESS
)
279 LPCWSTR pFiles
[FILELIST_ENTRIES
];
281 HMENU hMenu
= GetMenu(hMainWnd
);
285 mi
.cbSize
= sizeof(MENUITEMINFOW
);
286 mi
.fMask
= MIIM_DATA
;
288 for(i
= 0; i
< FILELIST_ENTRIES
; i
++)
291 for(i
= 0; GetMenuItemInfoW(hMenu
, ID_FILE_RECENT1
+i
, FALSE
, &mi
); i
++)
292 pFiles
[i
] = (LPWSTR
)mi
.dwItemData
;
294 if(lstrcmpiW(newFile
, pFiles
[0]))
296 for(i
= 0; pFiles
[i
] && i
< FILELIST_ENTRIES
; i
++)
298 if(!lstrcmpiW(pFiles
[i
], newFile
))
301 for(j
= 0; pFiles
[j
] && j
< i
; j
++)
303 pFiles
[i
-j
] = pFiles
[i
-j
-1];
315 for(i
= 0; i
< FILELIST_ENTRIES
-1; i
++)
316 pFiles
[FILELIST_ENTRIES
-1-i
] = pFiles
[FILELIST_ENTRIES
-2-i
];
321 for(i
= 0; pFiles
[i
] && i
< FILELIST_ENTRIES
; i
++)
323 wsprintfW(buffer
, var_file
, i
+1);
324 RegSetValueExW(hKey
, (LPWSTR
)&buffer
, 0, REG_SZ
, (const BYTE
*)pFiles
[i
],
325 (lstrlenW(pFiles
[i
])+1)*sizeof(WCHAR
));
330 registry_read_filelist(hMainWnd
);
333 int reg_formatindex(WPARAM format
)
335 return (format
& SF_TEXT
) ? 1 : 0;
338 void registry_read_options(void)
342 if(registry_get_handle(&hKey
, 0, key_options
) != ERROR_SUCCESS
)
343 registry_read_pagemargins(NULL
);
346 registry_read_pagemargins(hKey
);
350 if(registry_get_handle(&hKey
, 0, key_settings
) != ERROR_SUCCESS
) {
351 registry_read_previewpages(NULL
);
353 registry_read_previewpages(hKey
);
358 static void registry_read_formatopts(int index
, LPCWSTR key
, DWORD barState
[], DWORD wordWrap
[])
362 BOOL fetched
= FALSE
;
366 if(registry_get_handle(&hKey
, &action
, key
) != ERROR_SUCCESS
)
369 if(action
== REG_OPENED_EXISTING_KEY
)
371 DWORD size
= sizeof(DWORD
);
373 if(RegQueryValueExW(hKey
, var_barstate0
, 0, NULL
, (LPBYTE
)&barState
[index
],
374 &size
) == ERROR_SUCCESS
)
379 barState
[index
] = (1 << BANDID_TOOLBAR
) | (1 << BANDID_FORMATBAR
) | (1 << BANDID_RULER
) | (1 << BANDID_STATUSBAR
);
382 if(action
== REG_OPENED_EXISTING_KEY
)
384 DWORD size
= sizeof(DWORD
);
385 if(RegQueryValueExW(hKey
, var_wrap
, 0, NULL
, (LPBYTE
)&wordWrap
[index
],
386 &size
) == ERROR_SUCCESS
)
392 if(index
== reg_formatindex(SF_RTF
))
393 wordWrap
[index
] = ID_WORDWRAP_WINDOW
;
394 else if(index
== reg_formatindex(SF_TEXT
))
395 wordWrap
[index
] = ID_WORDWRAP_NONE
;
401 void registry_read_formatopts_all(DWORD barState
[], DWORD wordWrap
[])
403 registry_read_formatopts(reg_formatindex(SF_RTF
), key_rtf
, barState
, wordWrap
);
404 registry_read_formatopts(reg_formatindex(SF_TEXT
), key_text
, barState
, wordWrap
);
407 static void registry_set_formatopts(int index
, LPCWSTR key
, DWORD barState
[], DWORD wordWrap
[])
412 if(registry_get_handle(&hKey
, &action
, key
) == ERROR_SUCCESS
)
414 RegSetValueExW(hKey
, var_barstate0
, 0, REG_DWORD
, (LPBYTE
)&barState
[index
],
416 RegSetValueExW(hKey
, var_wrap
, 0, REG_DWORD
, (LPBYTE
)&wordWrap
[index
],
422 void registry_set_formatopts_all(DWORD barState
[], DWORD wordWrap
[])
424 registry_set_formatopts(reg_formatindex(SF_RTF
), key_rtf
, barState
, wordWrap
);
425 registry_set_formatopts(reg_formatindex(SF_TEXT
), key_text
, barState
, wordWrap
);