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_rtf
[] = {'R','T','F',0};
31 static const WCHAR key_text
[] = {'T','e','x','t',0};
33 static const WCHAR var_file
[] = {'F','i','l','e','%','d',0};
34 static const WCHAR var_framerect
[] = {'F','r','a','m','e','R','e','c','t',0};
35 static const WCHAR var_barstate0
[] = {'B','a','r','S','t','a','t','e','0',0};
36 static const WCHAR var_maximized
[] = {'M','a','x','i','m','i','z','e','d',0};
38 static LRESULT
registry_get_handle(HKEY
*hKey
, LPDWORD action
, LPCWSTR subKey
)
41 static const WCHAR wszProgramKey
[] = {'S','o','f','t','w','a','r','e','\\',
42 'M','i','c','r','o','s','o','f','t','\\',
43 'W','i','n','d','o','w','s','\\',
44 'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\',
45 'A','p','p','l','e','t','s','\\',
46 'W','o','r','d','p','a','d',0};
47 LPWSTR key
= (LPWSTR
)wszProgramKey
;
51 WCHAR backslash
[] = {'\\',0};
52 key
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
,
53 (lstrlenW(wszProgramKey
)+lstrlenW(subKey
)+lstrlenW(backslash
)+1)
59 lstrcpyW(key
, wszProgramKey
);
60 lstrcatW(key
, backslash
);
61 lstrcatW(key
, subKey
);
66 ret
= RegCreateKeyExW(HKEY_CURRENT_USER
, key
, 0, NULL
, REG_OPTION_NON_VOLATILE
,
67 KEY_READ
| KEY_WRITE
, NULL
, hKey
, action
);
70 ret
= RegOpenKeyExW(HKEY_CURRENT_USER
, key
, 0, KEY_READ
| KEY_WRITE
, hKey
);
74 HeapFree(GetProcessHeap(), 0, key
);
79 void registry_set_options(HWND hMainWnd
)
84 if(registry_get_handle(&hKey
, &action
, key_options
) == ERROR_SUCCESS
)
89 wp
.length
= sizeof(WINDOWPLACEMENT
);
90 GetWindowPlacement(hMainWnd
, &wp
);
91 isMaximized
= (wp
.showCmd
== SW_SHOWMAXIMIZED
);
93 RegSetValueExW(hKey
, var_framerect
, 0, REG_BINARY
, (LPBYTE
)&wp
.rcNormalPosition
, sizeof(RECT
));
94 RegSetValueExW(hKey
, var_maximized
, 0, REG_DWORD
, (LPBYTE
)&isMaximized
, sizeof(DWORD
));
96 registry_set_pagemargins(hKey
);
102 void registry_read_winrect(RECT
* rc
)
105 DWORD size
= sizeof(RECT
);
107 if(registry_get_handle(&hKey
, 0, key_options
) != ERROR_SUCCESS
||
108 RegQueryValueExW(hKey
, var_framerect
, 0, NULL
, (LPBYTE
)rc
, &size
) !=
109 ERROR_SUCCESS
|| size
!= sizeof(RECT
))
120 void registry_read_maximized(DWORD
*bMaximized
)
123 DWORD size
= sizeof(DWORD
);
125 if(registry_get_handle(&hKey
, 0, key_options
) != ERROR_SUCCESS
||
126 RegQueryValueExW(hKey
, var_maximized
, 0, NULL
, (LPBYTE
)bMaximized
, &size
) !=
127 ERROR_SUCCESS
|| size
!= sizeof(DWORD
))
135 static void truncate_path(LPWSTR file
, LPWSTR out
, LPWSTR pos1
, LPWSTR pos2
)
137 static const WCHAR dots
[] = {'.','.','.',0};
146 static void format_filelist_filename(LPWSTR file
, LPWSTR out
)
149 LPWSTR truncpos1
, truncpos2
;
150 WCHAR myDocs
[MAX_STRING_LEN
];
152 SHGetFolderPathW(NULL
, CSIDL_PERSONAL
, NULL
, SHGFP_TYPE_CURRENT
, (LPWSTR
)&myDocs
);
153 pos_basename
= file_basename(file
);
157 *(pos_basename
-1) = 0;
158 if(!lstrcmpiW(file
, myDocs
) || (lstrlenW(pos_basename
) > FILELIST_ENTRY_LENGTH
))
160 truncpos1
= pos_basename
;
161 *(pos_basename
-1) = '\\';
165 BOOL morespace
= FALSE
;
167 *(pos_basename
-1) = '\\';
169 for(pos
= file
; pos
< pos_basename
; pos
++)
171 if(*pos
== '\\' || *pos
== '/')
175 if((pos
- file
+ lstrlenW(pos_basename
)) > FILELIST_ENTRY_LENGTH
)
183 if((pos
- file
+ lstrlenW(pos_basename
)) > FILELIST_ENTRY_LENGTH
)
192 for(pos
= pos_basename
; pos
>= truncpos1
; pos
--)
194 if(*pos
== '\\' || *pos
== '/')
196 if((truncpos1
- file
+ lstrlenW(pos_basename
) + pos_basename
- pos
) > FILELIST_ENTRY_LENGTH
)
205 if(truncpos1
== pos_basename
)
206 lstrcatW(out
, pos_basename
);
207 else if(truncpos1
== truncpos2
|| !truncpos2
)
210 truncate_path(file
, out
, truncpos1
, truncpos2
);
213 void registry_read_filelist(HWND hMainWnd
)
217 if(registry_get_handle(&hFileKey
, 0, key_recentfiles
) == ERROR_SUCCESS
)
219 WCHAR itemText
[MAX_PATH
+3], buffer
[MAX_PATH
];
220 /* The menu item name is not the same as the file name, so we need to store
221 the file name here */
222 static WCHAR file1
[MAX_PATH
], file2
[MAX_PATH
], file3
[MAX_PATH
], file4
[MAX_PATH
];
223 WCHAR numFormat
[] = {'&','%','d',' ',0};
224 LPWSTR pFile
[] = {file1
, file2
, file3
, file4
};
225 DWORD pathSize
= MAX_PATH
*sizeof(WCHAR
);
229 HMENU hMenu
= GetMenu(hMainWnd
);
231 mi
.cbSize
= sizeof(MENUITEMINFOW
);
232 mi
.fMask
= MIIM_ID
| MIIM_DATA
| MIIM_STRING
| MIIM_FTYPE
;
233 mi
.fType
= MFT_STRING
;
234 mi
.dwTypeData
= itemText
;
235 mi
.wID
= ID_FILE_RECENT1
;
237 RemoveMenu(hMenu
, ID_FILE_RECENT_SEPARATOR
, MF_BYCOMMAND
);
238 for(i
= 0; i
< FILELIST_ENTRIES
; i
++)
240 wsprintfW(key
, var_file
, i
+1);
241 RemoveMenu(hMenu
, ID_FILE_RECENT1
+i
, MF_BYCOMMAND
);
242 if(RegQueryValueExW(hFileKey
, (LPWSTR
)key
, 0, NULL
, (LPBYTE
)pFile
[i
], &pathSize
)
246 mi
.dwItemData
= (ULONG_PTR
)pFile
[i
];
247 wsprintfW(itemText
, numFormat
, i
+1);
249 lstrcpyW(buffer
, pFile
[i
]);
251 format_filelist_filename(buffer
, itemText
);
253 InsertMenuItemW(hMenu
, ID_FILE_EXIT
, FALSE
, &mi
);
255 pathSize
= MAX_PATH
*sizeof(WCHAR
);
257 mi
.fType
= MFT_SEPARATOR
;
258 mi
.fMask
= MIIM_FTYPE
| MIIM_ID
;
259 InsertMenuItemW(hMenu
, ID_FILE_EXIT
, FALSE
, &mi
);
261 RegCloseKey(hFileKey
);
265 void registry_set_filelist(LPCWSTR newFile
, HWND hMainWnd
)
270 if(registry_get_handle(&hKey
, &action
, key_recentfiles
) == ERROR_SUCCESS
)
272 LPCWSTR pFiles
[FILELIST_ENTRIES
];
274 HMENU hMenu
= GetMenu(hMainWnd
);
278 mi
.cbSize
= sizeof(MENUITEMINFOW
);
279 mi
.fMask
= MIIM_DATA
;
281 for(i
= 0; i
< FILELIST_ENTRIES
; i
++)
284 for(i
= 0; GetMenuItemInfoW(hMenu
, ID_FILE_RECENT1
+i
, FALSE
, &mi
); i
++)
285 pFiles
[i
] = (LPWSTR
)mi
.dwItemData
;
287 if(lstrcmpiW(newFile
, pFiles
[0]))
289 for(i
= 0; pFiles
[i
] && i
< FILELIST_ENTRIES
; i
++)
291 if(!lstrcmpiW(pFiles
[i
], newFile
))
294 for(j
= 0; pFiles
[j
] && j
< i
; j
++)
296 pFiles
[i
-j
] = pFiles
[i
-j
-1];
308 for(i
= 0; i
< FILELIST_ENTRIES
-1; i
++)
309 pFiles
[FILELIST_ENTRIES
-1-i
] = pFiles
[FILELIST_ENTRIES
-2-i
];
314 for(i
= 0; pFiles
[i
] && i
< FILELIST_ENTRIES
; i
++)
316 wsprintfW(buffer
, var_file
, i
+1);
317 RegSetValueExW(hKey
, (LPWSTR
)&buffer
, 0, REG_SZ
, (const BYTE
*)pFiles
[i
],
318 (lstrlenW(pFiles
[i
])+1)*sizeof(WCHAR
));
323 registry_read_filelist(hMainWnd
);
326 int reg_formatindex(WPARAM format
)
328 return (format
& SF_TEXT
) ? 1 : 0;
331 void registry_read_options(void)
335 if(registry_get_handle(&hKey
, 0, key_options
) != ERROR_SUCCESS
)
336 registry_read_pagemargins(NULL
);
338 registry_read_pagemargins(hKey
);
343 static void registry_read_formatopts(int index
, LPCWSTR key
, DWORD barState
[], DWORD wordWrap
[])
347 BOOL fetched
= FALSE
;
351 if(registry_get_handle(&hKey
, &action
, key
) != ERROR_SUCCESS
)
354 if(action
== REG_OPENED_EXISTING_KEY
)
356 DWORD size
= sizeof(DWORD
);
358 if(RegQueryValueExW(hKey
, var_barstate0
, 0, NULL
, (LPBYTE
)&barState
[index
],
359 &size
) == ERROR_SUCCESS
)
364 barState
[index
] = (1 << BANDID_TOOLBAR
) | (1 << BANDID_FORMATBAR
) | (1 << BANDID_RULER
) | (1 << BANDID_STATUSBAR
);
366 if(index
== reg_formatindex(SF_RTF
))
367 wordWrap
[index
] = ID_WORDWRAP_WINDOW
;
368 else if(index
== reg_formatindex(SF_TEXT
))
369 wordWrap
[index
] = ID_WORDWRAP_WINDOW
; /* FIXME: should be ID_WORDWRAP_NONE once we support it */
374 void registry_read_formatopts_all(DWORD barState
[], DWORD wordWrap
[])
376 registry_read_formatopts(reg_formatindex(SF_RTF
), key_rtf
, barState
, wordWrap
);
377 registry_read_formatopts(reg_formatindex(SF_TEXT
), key_text
, barState
, wordWrap
);
380 static void registry_set_formatopts(int index
, LPCWSTR key
, DWORD barState
[])
385 if(registry_get_handle(&hKey
, &action
, key
) == ERROR_SUCCESS
)
387 RegSetValueExW(hKey
, var_barstate0
, 0, REG_DWORD
, (LPBYTE
)&barState
[index
],
394 void registry_set_formatopts_all(DWORD barState
[])
396 registry_set_formatopts(reg_formatindex(SF_RTF
), key_rtf
, barState
);
397 registry_set_formatopts(reg_formatindex(SF_TEXT
), key_text
, barState
);