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_maximized
[] = {'M','a','x','i','m','i','z','e','d',0};
39 static LRESULT
registry_get_handle(HKEY
*hKey
, LPDWORD action
, LPCWSTR subKey
)
42 static const WCHAR wszProgramKey
[] = {'S','o','f','t','w','a','r','e','\\',
43 'M','i','c','r','o','s','o','f','t','\\',
44 'W','i','n','d','o','w','s','\\',
45 'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\',
46 'A','p','p','l','e','t','s','\\',
47 'W','o','r','d','p','a','d',0};
48 LPWSTR key
= (LPWSTR
)wszProgramKey
;
52 WCHAR backslash
[] = {'\\',0};
53 key
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
,
54 (lstrlenW(wszProgramKey
)+lstrlenW(subKey
)+lstrlenW(backslash
)+1)
60 lstrcpyW(key
, wszProgramKey
);
61 lstrcatW(key
, backslash
);
62 lstrcatW(key
, subKey
);
67 ret
= RegCreateKeyExW(HKEY_CURRENT_USER
, key
, 0, NULL
, REG_OPTION_NON_VOLATILE
,
68 KEY_READ
| KEY_WRITE
, NULL
, hKey
, action
);
71 ret
= RegOpenKeyExW(HKEY_CURRENT_USER
, key
, 0, KEY_READ
| KEY_WRITE
, hKey
);
75 HeapFree(GetProcessHeap(), 0, key
);
80 void registry_set_options(HWND hMainWnd
)
85 if(registry_get_handle(&hKey
, &action
, key_options
) == ERROR_SUCCESS
)
90 wp
.length
= sizeof(WINDOWPLACEMENT
);
91 GetWindowPlacement(hMainWnd
, &wp
);
92 isMaximized
= (wp
.showCmd
== SW_SHOWMAXIMIZED
);
94 RegSetValueExW(hKey
, var_framerect
, 0, REG_BINARY
, (LPBYTE
)&wp
.rcNormalPosition
, sizeof(RECT
));
95 RegSetValueExW(hKey
, var_maximized
, 0, REG_DWORD
, (LPBYTE
)&isMaximized
, sizeof(DWORD
));
97 registry_set_pagemargins(hKey
);
101 if(registry_get_handle(&hKey
, &action
, key_settings
) == ERROR_SUCCESS
)
103 registry_set_previewpages(hKey
);
108 void registry_read_winrect(RECT
* rc
)
111 DWORD size
= sizeof(RECT
);
113 if(registry_get_handle(&hKey
, 0, key_options
) != ERROR_SUCCESS
||
114 RegQueryValueExW(hKey
, var_framerect
, 0, NULL
, (LPBYTE
)rc
, &size
) !=
115 ERROR_SUCCESS
|| size
!= sizeof(RECT
))
126 void registry_read_maximized(DWORD
*bMaximized
)
129 DWORD size
= sizeof(DWORD
);
131 if(registry_get_handle(&hKey
, 0, key_options
) != ERROR_SUCCESS
||
132 RegQueryValueExW(hKey
, var_maximized
, 0, NULL
, (LPBYTE
)bMaximized
, &size
) !=
133 ERROR_SUCCESS
|| size
!= sizeof(DWORD
))
141 static void truncate_path(LPWSTR file
, LPWSTR out
, LPWSTR pos1
, LPWSTR pos2
)
143 static const WCHAR dots
[] = {'.','.','.',0};
152 static void format_filelist_filename(LPWSTR file
, LPWSTR out
)
155 LPWSTR truncpos1
, truncpos2
;
156 WCHAR myDocs
[MAX_STRING_LEN
];
158 SHGetFolderPathW(NULL
, CSIDL_PERSONAL
, NULL
, SHGFP_TYPE_CURRENT
, (LPWSTR
)&myDocs
);
159 pos_basename
= file_basename(file
);
163 *(pos_basename
-1) = 0;
164 if(!lstrcmpiW(file
, myDocs
) || (lstrlenW(pos_basename
) > FILELIST_ENTRY_LENGTH
))
166 truncpos1
= pos_basename
;
167 *(pos_basename
-1) = '\\';
171 BOOL morespace
= FALSE
;
173 *(pos_basename
-1) = '\\';
175 for(pos
= file
; pos
< pos_basename
; pos
++)
177 if(*pos
== '\\' || *pos
== '/')
181 if((pos
- file
+ lstrlenW(pos_basename
)) > FILELIST_ENTRY_LENGTH
)
189 if((pos
- file
+ lstrlenW(pos_basename
)) > FILELIST_ENTRY_LENGTH
)
198 for(pos
= pos_basename
; pos
>= truncpos1
; pos
--)
200 if(*pos
== '\\' || *pos
== '/')
202 if((truncpos1
- file
+ lstrlenW(pos_basename
) + pos_basename
- pos
) > FILELIST_ENTRY_LENGTH
)
211 if(truncpos1
== pos_basename
)
212 lstrcatW(out
, pos_basename
);
213 else if(truncpos1
== truncpos2
|| !truncpos2
)
216 truncate_path(file
, out
, truncpos1
, truncpos2
);
219 void registry_read_filelist(HWND hMainWnd
)
223 if(registry_get_handle(&hFileKey
, 0, key_recentfiles
) == ERROR_SUCCESS
)
225 WCHAR itemText
[MAX_PATH
+3], buffer
[MAX_PATH
];
226 /* The menu item name is not the same as the file name, so we need to store
227 the file name here */
228 static WCHAR file1
[MAX_PATH
], file2
[MAX_PATH
], file3
[MAX_PATH
], file4
[MAX_PATH
];
229 WCHAR numFormat
[] = {'&','%','d',' ',0};
230 LPWSTR pFile
[] = {file1
, file2
, file3
, file4
};
231 DWORD pathSize
= MAX_PATH
*sizeof(WCHAR
);
235 HMENU hMenu
= GetMenu(hMainWnd
);
237 mi
.cbSize
= sizeof(MENUITEMINFOW
);
238 mi
.fMask
= MIIM_ID
| MIIM_DATA
| MIIM_STRING
| MIIM_FTYPE
;
239 mi
.fType
= MFT_STRING
;
240 mi
.dwTypeData
= itemText
;
241 mi
.wID
= ID_FILE_RECENT1
;
243 RemoveMenu(hMenu
, ID_FILE_RECENT_SEPARATOR
, MF_BYCOMMAND
);
244 for(i
= 0; i
< FILELIST_ENTRIES
; i
++)
246 wsprintfW(key
, var_file
, i
+1);
247 RemoveMenu(hMenu
, ID_FILE_RECENT1
+i
, MF_BYCOMMAND
);
248 if(RegQueryValueExW(hFileKey
, (LPWSTR
)key
, 0, NULL
, (LPBYTE
)pFile
[i
], &pathSize
)
252 mi
.dwItemData
= (ULONG_PTR
)pFile
[i
];
253 wsprintfW(itemText
, numFormat
, i
+1);
255 lstrcpyW(buffer
, pFile
[i
]);
257 format_filelist_filename(buffer
, itemText
);
259 InsertMenuItemW(hMenu
, ID_FILE_EXIT
, FALSE
, &mi
);
261 pathSize
= MAX_PATH
*sizeof(WCHAR
);
263 mi
.fType
= MFT_SEPARATOR
;
264 mi
.fMask
= MIIM_FTYPE
| MIIM_ID
;
265 InsertMenuItemW(hMenu
, ID_FILE_EXIT
, FALSE
, &mi
);
267 RegCloseKey(hFileKey
);
271 void registry_set_filelist(LPCWSTR newFile
, HWND hMainWnd
)
276 if(registry_get_handle(&hKey
, &action
, key_recentfiles
) == ERROR_SUCCESS
)
278 LPCWSTR pFiles
[FILELIST_ENTRIES
];
280 HMENU hMenu
= GetMenu(hMainWnd
);
284 mi
.cbSize
= sizeof(MENUITEMINFOW
);
285 mi
.fMask
= MIIM_DATA
;
287 for(i
= 0; i
< FILELIST_ENTRIES
; i
++)
290 for(i
= 0; GetMenuItemInfoW(hMenu
, ID_FILE_RECENT1
+i
, FALSE
, &mi
); i
++)
291 pFiles
[i
] = (LPWSTR
)mi
.dwItemData
;
293 if(lstrcmpiW(newFile
, pFiles
[0]))
295 for(i
= 0; pFiles
[i
] && i
< FILELIST_ENTRIES
; i
++)
297 if(!lstrcmpiW(pFiles
[i
], newFile
))
300 for(j
= 0; pFiles
[j
] && j
< i
; j
++)
302 pFiles
[i
-j
] = pFiles
[i
-j
-1];
314 for(i
= 0; i
< FILELIST_ENTRIES
-1; i
++)
315 pFiles
[FILELIST_ENTRIES
-1-i
] = pFiles
[FILELIST_ENTRIES
-2-i
];
320 for(i
= 0; pFiles
[i
] && i
< FILELIST_ENTRIES
; i
++)
322 wsprintfW(buffer
, var_file
, i
+1);
323 RegSetValueExW(hKey
, (LPWSTR
)&buffer
, 0, REG_SZ
, (const BYTE
*)pFiles
[i
],
324 (lstrlenW(pFiles
[i
])+1)*sizeof(WCHAR
));
329 registry_read_filelist(hMainWnd
);
332 int reg_formatindex(WPARAM format
)
334 return (format
& SF_TEXT
) ? 1 : 0;
337 void registry_read_options(void)
341 if(registry_get_handle(&hKey
, 0, key_options
) != ERROR_SUCCESS
)
342 registry_read_pagemargins(NULL
);
345 registry_read_pagemargins(hKey
);
349 if(registry_get_handle(&hKey
, 0, key_settings
) != ERROR_SUCCESS
) {
350 registry_read_previewpages(NULL
);
352 registry_read_previewpages(hKey
);
357 static void registry_read_formatopts(int index
, LPCWSTR key
, DWORD barState
[], DWORD wordWrap
[])
361 BOOL fetched
= FALSE
;
365 if(registry_get_handle(&hKey
, &action
, key
) != ERROR_SUCCESS
)
368 if(action
== REG_OPENED_EXISTING_KEY
)
370 DWORD size
= sizeof(DWORD
);
372 if(RegQueryValueExW(hKey
, var_barstate0
, 0, NULL
, (LPBYTE
)&barState
[index
],
373 &size
) == ERROR_SUCCESS
)
378 barState
[index
] = (1 << BANDID_TOOLBAR
) | (1 << BANDID_FORMATBAR
) | (1 << BANDID_RULER
) | (1 << BANDID_STATUSBAR
);
380 if(index
== reg_formatindex(SF_RTF
))
381 wordWrap
[index
] = ID_WORDWRAP_WINDOW
;
382 else if(index
== reg_formatindex(SF_TEXT
))
383 wordWrap
[index
] = ID_WORDWRAP_NONE
;
388 void registry_read_formatopts_all(DWORD barState
[], DWORD wordWrap
[])
390 registry_read_formatopts(reg_formatindex(SF_RTF
), key_rtf
, barState
, wordWrap
);
391 registry_read_formatopts(reg_formatindex(SF_TEXT
), key_text
, barState
, wordWrap
);
394 static void registry_set_formatopts(int index
, LPCWSTR key
, DWORD barState
[])
399 if(registry_get_handle(&hKey
, &action
, key
) == ERROR_SUCCESS
)
401 RegSetValueExW(hKey
, var_barstate0
, 0, REG_DWORD
, (LPBYTE
)&barState
[index
],
408 void registry_set_formatopts_all(DWORD barState
[])
410 registry_set_formatopts(reg_formatindex(SF_RTF
), key_rtf
, barState
);
411 registry_set_formatopts(reg_formatindex(SF_TEXT
), key_text
, barState
);