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};
37 static LRESULT
registry_get_handle(HKEY
*hKey
, LPDWORD action
, LPCWSTR subKey
)
40 static const WCHAR wszProgramKey
[] = {'S','o','f','t','w','a','r','e','\\',
41 'M','i','c','r','o','s','o','f','t','\\',
42 'W','i','n','d','o','w','s','\\',
43 'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\',
44 'A','p','p','l','e','t','s','\\',
45 'W','o','r','d','p','a','d',0};
46 LPWSTR key
= (LPWSTR
)wszProgramKey
;
50 WCHAR backslash
[] = {'\\',0};
51 key
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
,
52 (lstrlenW(wszProgramKey
)+lstrlenW(subKey
)+lstrlenW(backslash
)+1)
58 lstrcpyW(key
, wszProgramKey
);
59 lstrcatW(key
, backslash
);
60 lstrcatW(key
, subKey
);
65 ret
= RegCreateKeyExW(HKEY_CURRENT_USER
, key
, 0, NULL
, REG_OPTION_NON_VOLATILE
,
66 KEY_READ
| KEY_WRITE
, NULL
, hKey
, action
);
69 ret
= RegOpenKeyExW(HKEY_CURRENT_USER
, key
, 0, KEY_READ
| KEY_WRITE
, hKey
);
73 HeapFree(GetProcessHeap(), 0, key
);
78 void registry_set_options(HWND hMainWnd
)
83 if(registry_get_handle(&hKey
, &action
, (LPWSTR
)key_options
) == ERROR_SUCCESS
)
87 GetWindowRect(hMainWnd
, &rc
);
89 RegSetValueExW(hKey
, var_framerect
, 0, REG_BINARY
, (LPBYTE
)&rc
, sizeof(RECT
));
91 registry_set_pagemargins(hKey
);
97 void registry_read_winrect(RECT
* rc
)
100 DWORD size
= sizeof(RECT
);
102 if(registry_get_handle(&hKey
, 0, (LPWSTR
)key_options
) != ERROR_SUCCESS
||
103 RegQueryValueExW(hKey
, var_framerect
, 0, NULL
, (LPBYTE
)rc
, &size
) !=
104 ERROR_SUCCESS
|| size
!= sizeof(RECT
))
115 static void truncate_path(LPWSTR file
, LPWSTR out
, LPWSTR pos1
, LPWSTR pos2
)
117 static const WCHAR dots
[] = {'.','.','.',0};
126 static void format_filelist_filename(LPWSTR file
, LPWSTR out
)
129 LPWSTR truncpos1
, truncpos2
;
130 WCHAR myDocs
[MAX_STRING_LEN
];
132 SHGetFolderPathW(NULL
, CSIDL_PERSONAL
, NULL
, SHGFP_TYPE_CURRENT
, (LPWSTR
)&myDocs
);
133 pos_basename
= file_basename(file
);
137 *(pos_basename
-1) = 0;
138 if(!lstrcmpiW(file
, myDocs
) || (lstrlenW(pos_basename
) > FILELIST_ENTRY_LENGTH
))
140 truncpos1
= pos_basename
;
141 *(pos_basename
-1) = '\\';
145 BOOL morespace
= FALSE
;
147 *(pos_basename
-1) = '\\';
149 for(pos
= file
; pos
< pos_basename
; pos
++)
151 if(*pos
== '\\' || *pos
== '/')
155 if((pos
- file
+ lstrlenW(pos_basename
)) > FILELIST_ENTRY_LENGTH
)
163 if((pos
- file
+ lstrlenW(pos_basename
)) > FILELIST_ENTRY_LENGTH
)
172 for(pos
= pos_basename
; pos
>= truncpos1
; pos
--)
174 if(*pos
== '\\' || *pos
== '/')
176 if((truncpos1
- file
+ lstrlenW(pos_basename
) + pos_basename
- pos
) > FILELIST_ENTRY_LENGTH
)
185 if(truncpos1
== pos_basename
)
186 lstrcatW(out
, pos_basename
);
187 else if(truncpos1
== truncpos2
|| !truncpos2
)
190 truncate_path(file
, out
, truncpos1
, truncpos2
);
193 void registry_read_filelist(HWND hMainWnd
)
197 if(registry_get_handle(&hFileKey
, 0, key_recentfiles
) == ERROR_SUCCESS
)
199 WCHAR itemText
[MAX_PATH
+3], buffer
[MAX_PATH
];
200 /* The menu item name is not the same as the file name, so we need to store
201 the file name here */
202 static WCHAR file1
[MAX_PATH
], file2
[MAX_PATH
], file3
[MAX_PATH
], file4
[MAX_PATH
];
203 WCHAR numFormat
[] = {'&','%','d',' ',0};
204 LPWSTR pFile
[] = {file1
, file2
, file3
, file4
};
205 DWORD pathSize
= MAX_PATH
*sizeof(WCHAR
);
209 HMENU hMenu
= GetMenu(hMainWnd
);
211 mi
.cbSize
= sizeof(MENUITEMINFOW
);
212 mi
.fMask
= MIIM_ID
| MIIM_DATA
| MIIM_STRING
| MIIM_FTYPE
;
213 mi
.fType
= MFT_STRING
;
214 mi
.dwTypeData
= itemText
;
215 mi
.wID
= ID_FILE_RECENT1
;
217 RemoveMenu(hMenu
, ID_FILE_RECENT_SEPARATOR
, MF_BYCOMMAND
);
218 for(i
= 0; i
< FILELIST_ENTRIES
; i
++)
220 wsprintfW(key
, var_file
, i
+1);
221 RemoveMenu(hMenu
, ID_FILE_RECENT1
+i
, MF_BYCOMMAND
);
222 if(RegQueryValueExW(hFileKey
, (LPWSTR
)key
, 0, NULL
, (LPBYTE
)pFile
[i
], &pathSize
)
226 mi
.dwItemData
= (ULONG_PTR
)pFile
[i
];
227 wsprintfW(itemText
, numFormat
, i
+1);
229 lstrcpyW(buffer
, pFile
[i
]);
231 format_filelist_filename(buffer
, itemText
);
233 InsertMenuItemW(hMenu
, ID_FILE_EXIT
, FALSE
, &mi
);
235 pathSize
= MAX_PATH
*sizeof(WCHAR
);
237 mi
.fType
= MFT_SEPARATOR
;
238 mi
.fMask
= MIIM_FTYPE
| MIIM_ID
;
239 InsertMenuItemW(hMenu
, ID_FILE_EXIT
, FALSE
, &mi
);
241 RegCloseKey(hFileKey
);
245 void registry_set_filelist(LPCWSTR newFile
, HWND hMainWnd
)
250 if(registry_get_handle(&hKey
, &action
, key_recentfiles
) == ERROR_SUCCESS
)
252 LPCWSTR pFiles
[FILELIST_ENTRIES
];
254 HMENU hMenu
= GetMenu(hMainWnd
);
258 mi
.cbSize
= sizeof(MENUITEMINFOW
);
259 mi
.fMask
= MIIM_DATA
;
261 for(i
= 0; i
< FILELIST_ENTRIES
; i
++)
264 for(i
= 0; GetMenuItemInfoW(hMenu
, ID_FILE_RECENT1
+i
, FALSE
, &mi
); i
++)
265 pFiles
[i
] = (LPWSTR
)mi
.dwItemData
;
267 if(lstrcmpiW(newFile
, pFiles
[0]))
269 for(i
= 0; pFiles
[i
] && i
< FILELIST_ENTRIES
; i
++)
271 if(!lstrcmpiW(pFiles
[i
], newFile
))
274 for(j
= 0; pFiles
[j
] && j
< i
; j
++)
276 pFiles
[i
-j
] = pFiles
[i
-j
-1];
288 for(i
= 0; pFiles
[i
] && i
< FILELIST_ENTRIES
-1; i
++)
289 pFiles
[FILELIST_ENTRIES
-1-i
] = pFiles
[FILELIST_ENTRIES
-2-i
];
294 for(i
= 0; pFiles
[i
] && i
< FILELIST_ENTRIES
; i
++)
296 wsprintfW(buffer
, var_file
, i
+1);
297 RegSetValueExW(hKey
, (LPWSTR
)&buffer
, 0, REG_SZ
, (LPBYTE
)pFiles
[i
],
298 (lstrlenW(pFiles
[i
])+1)*sizeof(WCHAR
));
303 registry_read_filelist(hMainWnd
);
306 int reg_formatindex(WPARAM format
)
308 return (format
& SF_TEXT
) ? 1 : 0;
311 void registry_read_options(void)
315 if(registry_get_handle(&hKey
, 0, key_options
) != ERROR_SUCCESS
)
316 registry_read_pagemargins(NULL
);
318 registry_read_pagemargins(hKey
);
323 static void registry_read_formatopts(int index
, LPCWSTR key
, DWORD barState
[], DWORD wordWrap
[])
327 BOOL fetched
= FALSE
;
331 if(registry_get_handle(&hKey
, &action
, key
) != ERROR_SUCCESS
)
334 if(action
== REG_OPENED_EXISTING_KEY
)
336 DWORD size
= sizeof(DWORD
);
338 if(RegQueryValueExW(hKey
, var_barstate0
, 0, NULL
, (LPBYTE
)&barState
[index
],
339 &size
) == ERROR_SUCCESS
)
344 barState
[index
] = (1 << BANDID_TOOLBAR
) | (1 << BANDID_FORMATBAR
) | (1 << BANDID_RULER
) | (1 << BANDID_STATUSBAR
);
346 if(index
== reg_formatindex(SF_RTF
))
347 wordWrap
[index
] = ID_WORDWRAP_WINDOW
;
348 else if(index
== reg_formatindex(SF_TEXT
))
349 wordWrap
[index
] = ID_WORDWRAP_WINDOW
; /* FIXME: should be ID_WORDWRAP_NONE once we support it */
354 void registry_read_formatopts_all(DWORD barState
[], DWORD wordWrap
[])
356 registry_read_formatopts(reg_formatindex(SF_RTF
), key_rtf
, barState
, wordWrap
);
357 registry_read_formatopts(reg_formatindex(SF_TEXT
), key_text
, barState
, wordWrap
);
360 static void registry_set_formatopts(int index
, LPCWSTR key
, DWORD barState
[])
365 if(registry_get_handle(&hKey
, &action
, key
) == ERROR_SUCCESS
)
367 RegSetValueExW(hKey
, var_barstate0
, 0, REG_DWORD
, (LPBYTE
)&barState
[index
],
374 void registry_set_formatopts_all(DWORD barState
[])
376 registry_set_formatopts(reg_formatindex(SF_RTF
), key_rtf
, barState
);
377 registry_set_formatopts(reg_formatindex(SF_TEXT
), key_text
, barState
);