ReactOS 0.4.15-dev-5666-gc548b97
wordpad.c
Go to the documentation of this file.
1/*
2 * Wordpad implementation
3 *
4 * Copyright 2004 by Krzysztof Foltman
5 * Copyright 2007-2008 by Alexander N. Sørnes <alex@thehandofagony.com>
6 * Copyright 2020 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
7 *
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
12 *
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21 */
22
23#define WIN32_LEAN_AND_MEAN
24
25#include <stdio.h>
26#include <assert.h>
27#include <windef.h>
28#include <winbase.h>
29#include <wingdi.h>
30#include <winuser.h>
31#include <richedit.h>
32#include <commctrl.h>
33#include <commdlg.h>
34#include <shellapi.h>
35#include <shlobj.h>
36#include <wine/unicode.h>
37
38#include "wordpad.h"
39
40#ifdef NONAMELESSUNION
41# define U(x) (x).u
42# define U2(x) (x).u2
43# define U3(x) (x).u3
44#else
45# define U(x) (x)
46# define U2(x) (x)
47# define U3(x) (x)
48#endif
49
50/* use LoadString */
51static const WCHAR wszAppTitle[] = {'W','o','r','d','p','a','d',0};
52
53static const WCHAR wszMainWndClass[] = {'W','O','R','D','P','A','D','T','O','P',0};
54
55static const WCHAR stringFormat[] = {'%','2','d','\0'};
56
57const WCHAR wszPreviewWndClass[] = {'P','r','t','P','r','e','v','i','e','w',0};
59
64
66
67static DWORD wordWrap[2];
68static DWORD barState[2];
70
79
81
82typedef enum
83{
88
89typedef struct
90{
91 int endPos;
93 WCHAR findBuffer[128];
95
96/* Load string resources */
97static void DoLoadStrings(void)
98{
100 static const WCHAR files_rtf[] = {'*','.','r','t','f','\0'};
101 static const WCHAR files_txt[] = {'*','.','t','x','t','\0'};
102 static const WCHAR files_all[] = {'*','.','*','\0'};
103
105
107 p += lstrlenW(p) + 1;
108 lstrcpyW(p, files_rtf);
109 p += lstrlenW(p) + 1;
111 p += lstrlenW(p) + 1;
112 lstrcpyW(p, files_txt);
113 p += lstrlenW(p) + 1;
115 p += lstrlenW(p) + 1;
116 lstrcpyW(p, files_txt);
117 p += lstrlenW(p) + 1;
119 p += lstrlenW(p) + 1;
120 lstrcpyW(p, files_all);
121 p += lstrlenW(p) + 1;
122 *p = '\0';
123
126
129
134}
135
136/* Show a message box with resource strings */
137static int MessageBoxWithResStringW(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType)
138{
140
141 params.cbSize = sizeof(params);
142 params.hwndOwner = hWnd;
143 params.hInstance = GetModuleHandleW(0);
144 params.lpszText = lpText;
145 params.lpszCaption = lpCaption;
146 params.dwStyle = uType;
147 params.lpszIcon = NULL;
148 params.dwContextHelpId = 0;
149 params.lpfnMsgBoxCallback = NULL;
150 params.dwLanguageId = 0;
152}
153
154
155static void AddButton(HWND hwndToolBar, int nImage, int nCommand)
156{
158
159 ZeroMemory(&button, sizeof(button));
160 button.iBitmap = nImage;
161 button.idCommand = nCommand;
162 button.fsState = TBSTATE_ENABLED;
163 button.fsStyle = BTNS_BUTTON;
164 button.dwData = 0;
165 button.iString = -1;
166 SendMessageW(hwndToolBar, TB_ADDBUTTONSW, 1, (LPARAM)&button);
167}
168
169static void AddSeparator(HWND hwndToolBar)
170{
172
173 ZeroMemory(&button, sizeof(button));
174 button.iBitmap = -1;
175 button.idCommand = 0;
176 button.fsState = 0;
177 button.fsStyle = BTNS_SEP;
178 button.dwData = 0;
179 button.iString = -1;
180 SendMessageW(hwndToolBar, TB_ADDBUTTONSW, 1, (LPARAM)&button);
181}
182
184{
186 DWORD read;
187
188 if(!ReadFile(hFile, buffer, cb, &read, 0))
189 return 1;
190
191 *pcb = read;
192
193 return 0;
194}
195
197{
198 DWORD written;
199 int ret;
201
202 ret = WriteFile(hFile, buffer, cb, &written, 0);
203
204 if(!ret || (cb != written))
205 return 1;
206
207 *pcb = cb;
208
209 return 0;
210}
211
213{
215
216 while(pos > path)
217 {
218 if(*pos == '\\' || *pos == '/')
219 {
220 pos++;
221 break;
222 }
223 pos--;
224 }
225 return pos;
226}
227
228static void set_caption(LPCWSTR wszNewFileName)
229{
230 static const WCHAR wszSeparator[] = {' ','-',' '};
231 WCHAR *wszCaption;
232 SIZE_T length = 0;
233
234 if(!wszNewFileName)
235 wszNewFileName = wszDefaultFileName;
236 else
237 wszNewFileName = file_basename((LPWSTR)wszNewFileName);
238
240 lstrlenW(wszNewFileName)*sizeof(WCHAR)+sizeof(wszSeparator)+sizeof(wszAppTitle));
241
242 if(!wszCaption)
243 return;
244
245 memcpy(wszCaption, wszNewFileName, lstrlenW(wszNewFileName)*sizeof(WCHAR));
246 length += lstrlenW(wszNewFileName);
247 memcpy(wszCaption + length, wszSeparator, sizeof(wszSeparator));
248 length += sizeof(wszSeparator) / sizeof(WCHAR);
249 memcpy(wszCaption + length, wszAppTitle, sizeof(wszAppTitle));
250
251 SetWindowTextW(hMainWnd, wszCaption);
252
253 HeapFree(GetProcessHeap(), 0, wszCaption);
254}
255
256static BOOL validate_endptr(LPCWSTR endptr, UNIT *punit)
257{
258 if(punit != NULL)
259 *punit = UNIT_CM;
260 if(!endptr)
261 return FALSE;
262 if(!*endptr)
263 return TRUE;
264
265 while(*endptr == ' ')
266 endptr++;
267
268 if(punit == NULL)
269 return *endptr == '\0';
270
271 if(!lstrcmpW(endptr, units_cmW))
272 {
273 *punit = UNIT_CM;
274 endptr += lstrlenW(units_cmW);
275 }
276 else if (!lstrcmpW(endptr, units_inW))
277 {
278 *punit = UNIT_INCH;
279 endptr += lstrlenW(units_inW);
280 }
281 else if (!lstrcmpW(endptr, units_inchW))
282 {
283 *punit = UNIT_INCH;
284 endptr += lstrlenW(units_inchW);
285 }
286 else if (!lstrcmpW(endptr, units_ptW))
287 {
288 *punit = UNIT_PT;
289 endptr += lstrlenW(units_ptW);
290 }
291
292 return *endptr == '\0';
293}
294
295static BOOL number_from_string(LPCWSTR string, float *num, UNIT *punit)
296{
297 double ret;
298 WCHAR *endptr;
299
300 *num = 0;
301 errno = 0;
302 ret = wcstod(string, &endptr);
303
304 if (punit != NULL)
305 *punit = UNIT_CM;
306 if((ret == 0 && errno != 0) || endptr == string || !validate_endptr(endptr, punit))
307 {
308 return FALSE;
309 } else
310 {
311 *num = (float)ret;
312 return TRUE;
313 }
314}
315
316static void set_size(float size)
317{
319
320 ZeroMemory(&fmt, sizeof(fmt));
321 fmt.cbSize = sizeof(fmt);
322 fmt.dwMask = CFM_SIZE;
323 fmt.yHeight = (int)(size * 20.0);
325}
326
327static void on_sizelist_modified(HWND hwndSizeList, LPWSTR wszNewFontSize)
328{
329 WCHAR sizeBuffer[MAX_STRING_LEN];
331
332 ZeroMemory(&format, sizeof(format));
333 format.cbSize = sizeof(format);
335
336 wsprintfW(sizeBuffer, stringFormat, format.yHeight / 20);
337 if(lstrcmpW(sizeBuffer, wszNewFontSize))
338 {
339 float size = 0;
340 if(number_from_string(wszNewFontSize, &size, NULL)
341 && size > 0)
342 {
343 set_size(size);
344 } else
345 {
346 SetWindowTextW(hwndSizeList, sizeBuffer);
349 }
350 }
351}
352
353static void add_size(HWND hSizeListWnd, unsigned size)
354{
355 WCHAR buffer[3];
356 COMBOBOXEXITEMW cbItem;
357 cbItem.mask = CBEIF_TEXT;
358 cbItem.iItem = -1;
359
361 cbItem.pszText = buffer;
362 SendMessageW(hSizeListWnd, CBEM_INSERTITEMW, 0, (LPARAM)&cbItem);
363}
364
365static void populate_size_list(HWND hSizeListWnd)
366{
367 HWND hReBarWnd = GetDlgItem(hMainWnd, IDC_REBAR);
368 HWND hFontListWnd = GetDlgItem(hReBarWnd, IDC_FONTLIST);
369 COMBOBOXEXITEMW cbFontItem;
371 HWND hListEditWnd = (HWND)SendMessageW(hSizeListWnd, CBEM_GETEDITCONTROL, 0, 0);
373 static const unsigned choices[] = {8,9,10,11,12,14,16,18,20,22,24,26,28,36,48,72};
374 WCHAR buffer[3];
375 size_t i;
377
378 ZeroMemory(&fmt, sizeof(fmt));
379 fmt.cbSize = sizeof(fmt);
381
382 cbFontItem.mask = CBEIF_LPARAM;
383 cbFontItem.iItem = SendMessageW(hFontListWnd, CB_FINDSTRINGEXACT, -1, (LPARAM)fmt.szFaceName);
384 SendMessageW(hFontListWnd, CBEM_GETITEMW, 0, (LPARAM)&cbFontItem);
385
386 fontStyle = (DWORD)LOWORD(cbFontItem.lParam);
387
388 SendMessageW(hSizeListWnd, CB_RESETCONTENT, 0, 0);
389
390 if((fontStyle & RASTER_FONTTYPE) && cbFontItem.iItem)
391 {
392 add_size(hSizeListWnd, (BYTE)MulDiv(HIWORD(cbFontItem.lParam), 72,
394 } else
395 {
396 for(i = 0; i < sizeof(choices)/sizeof(choices[0]); i++)
397 add_size(hSizeListWnd, choices[i]);
398 }
399
400 wsprintfW(buffer, stringFormat, fmt.yHeight / 20);
401 SendMessageW(hListEditWnd, WM_SETTEXT, 0, (LPARAM)buffer);
402}
403
404static void update_size_list(void)
405{
407 HWND hwndSizeList = GetDlgItem(hReBar, IDC_SIZELIST);
408 HWND hwndSizeListEdit = (HWND)SendMessageW(hwndSizeList, CBEM_GETEDITCONTROL, 0, 0);
409 WCHAR fontSize[MAX_STRING_LEN], sizeBuffer[MAX_STRING_LEN];
411
412 ZeroMemory(&fmt, sizeof(fmt));
413 fmt.cbSize = sizeof(fmt);
414
416
417 SendMessageW(hwndSizeListEdit, WM_GETTEXT, MAX_PATH, (LPARAM)fontSize);
418 wsprintfW(sizeBuffer, stringFormat, fmt.yHeight / 20);
419
420 if(lstrcmpW(fontSize, sizeBuffer))
421 SendMessageW(hwndSizeListEdit, WM_SETTEXT, 0, (LPARAM)sizeBuffer);
422}
423
424static void update_font_list(void)
425{
427 HWND hFontList = GetDlgItem(hReBar, IDC_FONTLIST);
428 HWND hFontListEdit = (HWND)SendMessageW(hFontList, CBEM_GETEDITCONTROL, 0, 0);
431
432 ZeroMemory(&fmt, sizeof(fmt));
433 fmt.cbSize = sizeof(fmt);
434
436 if (!SendMessageW(hFontListEdit, WM_GETTEXT, MAX_PATH, (LPARAM)fontName)) return;
437
438 if(lstrcmpW(fontName, fmt.szFaceName))
439 {
440 SendMessageW(hFontListEdit, WM_SETTEXT, 0, (LPARAM)fmt.szFaceName);
442 } else
443 {
445 }
446}
447
448static void clear_formatting(void)
449{
450 PARAFORMAT2 pf;
451
452 pf.cbSize = sizeof(pf);
454 pf.wAlignment = PFA_LEFT;
456}
457
459{
460 int number = 0;
461
462 if(format == SF_TEXT)
463 {
464 number = 1;
465 } else if (format == (SF_TEXT | SF_UNICODE))
466 {
467 number = 2;
468 }
469 return number;
470}
471
473{
475
476 return flags[format];
477}
478
479static void set_font(LPCWSTR wszFaceName)
480{
481 HWND hReBarWnd = GetDlgItem(hMainWnd, IDC_REBAR);
482 HWND hSizeListWnd = GetDlgItem(hReBarWnd, IDC_SIZELIST);
483 HWND hFontListWnd = GetDlgItem(hReBarWnd, IDC_FONTLIST);
484 HWND hFontListEditWnd = (HWND)SendMessageW(hFontListWnd, CBEM_GETEDITCONTROL, 0, 0);
486
487 ZeroMemory(&fmt, sizeof(fmt));
488
489 fmt.cbSize = sizeof(fmt);
490 fmt.dwMask = CFM_FACE;
491
492 lstrcpyW(fmt.szFaceName, wszFaceName);
493
495
496 populate_size_list(hSizeListWnd);
497
498 SendMessageW(hFontListEditWnd, WM_SETTEXT, 0, (LPARAM)wszFaceName);
499}
500
501static void set_default_font(void)
502{
503 static const WCHAR richTextFont[] = {'T','i','m','e','s',' ','N','e','w',' ',
504 'R','o','m','a','n',0};
505 static const WCHAR plainTextFont[] = {'C','o','u','r','i','e','r',' ','N','e','w',0};
508
509 ZeroMemory(&fmt, sizeof(fmt));
510
511 fmt.cbSize = sizeof(fmt);
513 fmt.dwEffects = 0;
514
515 if(fileFormat & SF_RTF)
516 font = richTextFont;
517 else
518 font = plainTextFont;
519
520 lstrcpyW(fmt.szFaceName, font);
521
523}
524
525static void on_fontlist_modified(LPWSTR wszNewFaceName)
526{
528 ZeroMemory(&format, sizeof(format));
529 format.cbSize = sizeof(format);
531
532 if(lstrcmpW(format.szFaceName, wszNewFaceName))
533 set_font(wszNewFaceName);
534}
535
536static void add_font(LPCWSTR fontName, DWORD fontType, HWND hListWnd, const NEWTEXTMETRICEXW *ntmc)
537{
538 COMBOBOXEXITEMW cbItem;
540 int fontHeight = 0;
541
542 cbItem.mask = CBEIF_TEXT;
543 cbItem.pszText = buffer;
544 cbItem.cchTextMax = MAX_STRING_LEN;
545 cbItem.iItem = 0;
546
547 while(SendMessageW(hListWnd, CBEM_GETITEMW, 0, (LPARAM)&cbItem))
548 {
549 if(lstrcmpiW(cbItem.pszText, fontName) <= 0)
550 cbItem.iItem++;
551 else
552 break;
553 }
554 cbItem.pszText = HeapAlloc( GetProcessHeap(), 0, (lstrlenW(fontName) + 1)*sizeof(WCHAR) );
555 lstrcpyW( cbItem.pszText, fontName );
556
557 cbItem.mask |= CBEIF_LPARAM;
558 if(fontType & RASTER_FONTTYPE)
560
561 cbItem.lParam = MAKELONG(fontType,fontHeight);
562 SendMessageW(hListWnd, CBEM_INSERTITEMW, 0, (LPARAM)&cbItem);
563 HeapFree( GetProcessHeap(), 0, cbItem.pszText );
564}
565
566static void dialog_choose_font(void)
567{
569 LOGFONTW lf;
572
573 ZeroMemory(&cf, sizeof(cf));
574 cf.lStructSize = sizeof(cf);
575 cf.hwndOwner = hMainWnd;
576 cf.lpLogFont = &lf;
578
579 ZeroMemory(&fmt, sizeof(fmt));
580 fmt.cbSize = sizeof(fmt);
581
583 lstrcpyW(cf.lpLogFont->lfFaceName, fmt.szFaceName);
584 cf.lpLogFont->lfItalic = (fmt.dwEffects & CFE_ITALIC) != 0;
585 cf.lpLogFont->lfWeight = (fmt.dwEffects & CFE_BOLD) ? FW_BOLD : FW_NORMAL;
586 cf.lpLogFont->lfUnderline = (fmt.dwEffects & CFE_UNDERLINE) != 0;
587 cf.lpLogFont->lfStrikeOut = (fmt.dwEffects & CFE_STRIKEOUT) != 0;
588 cf.lpLogFont->lfHeight = -MulDiv(fmt.yHeight / 20, GetDeviceCaps(hDC, LOGPIXELSY), 72);
589 cf.rgbColors = fmt.crTextColor;
590
591 if(ChooseFontW(&cf))
592 {
593 ZeroMemory(&fmt, sizeof(fmt));
594 fmt.cbSize = sizeof(fmt);
596 fmt.yHeight = cf.iPointSize * 2;
597
598 if(cf.nFontType & BOLD_FONTTYPE)
599 fmt.dwEffects |= CFE_BOLD;
600 if(cf.nFontType & ITALIC_FONTTYPE)
601 fmt.dwEffects |= CFE_ITALIC;
602 if(cf.lpLogFont->lfUnderline)
603 fmt.dwEffects |= CFE_UNDERLINE;
604 if(cf.lpLogFont->lfStrikeOut)
605 fmt.dwEffects |= CFE_STRIKEOUT;
606
607 fmt.crTextColor = cf.rgbColors;
608
610 set_font(cf.lpLogFont->lfFaceName);
611 }
612}
613
614
615static int CALLBACK enum_font_proc(const LOGFONTW *lpelfe, const TEXTMETRICW *lpntme,
616 DWORD FontType, LPARAM lParam)
617{
618 HWND hListWnd = (HWND) lParam;
619
620 if (lpelfe->lfFaceName[0] == '@') return 1; /* ignore vertical fonts */
621
622 if(SendMessageW(hListWnd, CB_FINDSTRINGEXACT, -1, (LPARAM)lpelfe->lfFaceName) == CB_ERR)
623 {
624
625 add_font(lpelfe->lfFaceName, FontType, hListWnd, (const NEWTEXTMETRICEXW*)lpntme);
626 }
627
628 return 1;
629}
630
631static void populate_font_list(HWND hListWnd)
632{
634 LOGFONTW fontinfo;
635 HWND hListEditWnd = (HWND)SendMessageW(hListWnd, CBEM_GETEDITCONTROL, 0, 0);
637
638 fontinfo.lfCharSet = DEFAULT_CHARSET;
639 *fontinfo.lfFaceName = '\0';
640 fontinfo.lfPitchAndFamily = 0;
641
643 (LPARAM)hListWnd, 0);
644
645 ZeroMemory(&fmt, sizeof(fmt));
646 fmt.cbSize = sizeof(fmt);
648 SendMessageW(hListEditWnd, WM_SETTEXT, 0, (LPARAM)fmt.szFaceName);
649}
650
651static void update_window(void)
652{
653 RECT rect;
654
656
658}
659
660static BOOL is_bar_visible(int bandId)
661{
662 return barState[reg_formatindex(fileFormat)] & (1 << bandId);
663}
664
665static void store_bar_state(int bandId, BOOL show)
666{
667 int formatIndex = reg_formatindex(fileFormat);
668
669 if(show)
670 barState[formatIndex] |= (1 << bandId);
671 else
672 barState[formatIndex] &= ~(1 << bandId);
673}
674
675static void set_toolbar_state(int bandId, BOOL show)
676{
677 HWND hwndReBar = GetDlgItem(hMainWnd, IDC_REBAR);
678
679 SendMessageW(hwndReBar, RB_SHOWBAND, SendMessageW(hwndReBar, RB_IDTOINDEX, bandId, 0), show);
680
681 if(bandId == BANDID_TOOLBAR)
682 {
683 REBARBANDINFOW rbbinfo;
684 int index = SendMessageW(hwndReBar, RB_IDTOINDEX, BANDID_FONTLIST, 0);
685
687 rbbinfo.fMask = RBBIM_STYLE;
688
689 SendMessageW(hwndReBar, RB_GETBANDINFOW, index, (LPARAM)&rbbinfo);
690
691 if(!show)
692 rbbinfo.fStyle &= ~RBBS_BREAK;
693 else
694 rbbinfo.fStyle |= RBBS_BREAK;
695
696 SendMessageW(hwndReBar, RB_SETBANDINFOW, index, (LPARAM)&rbbinfo);
697 }
698
699 if(bandId == BANDID_TOOLBAR || bandId == BANDID_FORMATBAR || bandId == BANDID_RULER)
700 store_bar_state(bandId, show);
701}
702
703static void set_statusbar_state(BOOL show)
704{
706
709}
710
711static void set_bar_states(void)
712{
719
721}
722
724{
727
730
732
733 SetMenu(hMainWnd, hMenu);
735
737}
738
740{
742
746}
747
749{
751
752 switch(Code)
753 {
756 break;
757
758 default:
760 }
762}
763
764static void DoOpenFile(LPCWSTR szOpenFileName)
765{
768 char fileStart[5];
769 DWORD readOut;
771
775 {
777 return;
778 }
779
780 ReadFile(hFile, fileStart, 5, &readOut, NULL);
782
783 if(readOut >= 2 && (BYTE)fileStart[0] == 0xff && (BYTE)fileStart[1] == 0xfe)
784 {
787 } else if(readOut >= 5)
788 {
789 static const char header[] = "{\\rtf";
790 static const BYTE STG_magic[] = { 0xd0,0xcf,0x11,0xe0 };
791
792 if(!memcmp(header, fileStart, 5))
793 format = SF_RTF;
794 else if (!memcmp(STG_magic, fileStart, sizeof(STG_magic)))
795 {
799 return;
800 }
801 }
802
803 es.dwCookie = (DWORD_PTR)hFile;
804 es.pfnCallback = stream_in;
805
809
811
813
814 set_caption(szOpenFileName);
815 if (szOpenFileName[0])
816 SHAddToRecentDocs(SHARD_PATHW, szOpenFileName);
817
818 lstrcpyW(wszFileName, szOpenFileName);
820 registry_set_filelist(szOpenFileName, hMainWnd);
822}
823
825{
827
828 switch(Code)
829 {
832 break;
833
834 default:
836 }
838}
839
840static BOOL DoSaveFile(LPCWSTR wszSaveFileName, WPARAM format)
841{
844 LRESULT ret;
845
846 hFile = CreateFileW(wszSaveFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
848
850 {
852 return FALSE;
853 }
854
855 if(format == (SF_TEXT | SF_UNICODE))
856 {
857 static const BYTE unicode[] = {0xff,0xfe};
858 DWORD writeOut;
859 WriteFile(hFile, &unicode, sizeof(unicode), &writeOut, 0);
860
861 if(writeOut != sizeof(unicode))
862 {
864 return FALSE;
865 }
866 }
867
868 stream.dwCookie = (DWORD_PTR)hFile;
869 stream.pfnCallback = stream_out;
870
872
874
876
877 if(!ret)
878 {
880 gt.flags = GTL_DEFAULT;
881 gt.codepage = 1200;
882
884 return FALSE;
885 }
886
887 lstrcpyW(wszFileName, wszSaveFileName);
889 if (wszFileName[0])
891
894
895 return TRUE;
896}
897
899{
901
902 WCHAR wszFile[MAX_PATH] = {'\0'};
903 static const WCHAR wszDefExt[] = {'r','t','f','\0'};
904
905 ZeroMemory(&sfn, sizeof(sfn));
906
907 sfn.lStructSize = sizeof(sfn);
913 sfn.lpstrDefExt = wszDefExt;
915
916 while(GetSaveFileNameW(&sfn))
917 {
919 {
922 continue;
923 }
925 }
926 return FALSE;
927}
928
930{
931 if(!wszFileName[0])
932 {
934 gt.flags = GTL_NUMCHARS;
935 gt.codepage = 1200;
937 return TRUE;
938 }
939
941 {
942 return TRUE;
943 } else
944 {
945 LPWSTR displayFileName;
946 WCHAR *text;
947 int ret;
948
949 if(!wszFileName[0])
950 displayFileName = wszDefaultFileName;
951 else
952 displayFileName = file_basename(wszFileName);
953
955 (lstrlenW(displayFileName)+lstrlenW(wszSaveChanges))*sizeof(WCHAR));
956
957 if(!text)
958 return FALSE;
959
960 wsprintfW(text, wszSaveChanges, displayFileName);
961
963
965
966 switch(ret)
967 {
968 case IDNO:
969 return TRUE;
970
971 case IDYES:
972 if(wszFileName[0])
974 return DialogSaveFile();
975
976 default:
977 return FALSE;
978 }
979 }
980}
981
982static void DialogOpenFile(void)
983{
985
986 WCHAR wszFile[MAX_PATH] = {'\0'};
987 static const WCHAR wszDefExt[] = {'r','t','f','\0'};
988
989 ZeroMemory(&ofn, sizeof(ofn));
990
991 ofn.lStructSize = sizeof(ofn);
997 ofn.lpstrDefExt = wszDefExt;
999
1000 if(GetOpenFileNameW(&ofn))
1001 {
1004 }
1005}
1006
1007static void dialog_about(void)
1008{
1011}
1012
1014{
1015 switch(message)
1016 {
1017 case WM_INITDIALOG:
1018 {
1020 int wrap = -1;
1021 char id[4];
1023
1024 sprintf(id, "%d\n", (int)ps->lParam);
1025 SetWindowTextA(hIdWnd, id);
1026 if(wordWrap[ps->lParam] == ID_WORDWRAP_NONE)
1028 else if(wordWrap[ps->lParam] == ID_WORDWRAP_WINDOW)
1030 else if(wordWrap[ps->lParam] == ID_WORDWRAP_MARGIN)
1032
1033 if(wrap != -1)
1036
1037 if(barState[ps->lParam] & (1 << BANDID_TOOLBAR))
1039 if(barState[ps->lParam] & (1 << BANDID_FORMATBAR))
1041 if(barState[ps->lParam] & (1 << BANDID_RULER))
1043 if(barState[ps->lParam] & (1 << BANDID_STATUSBAR))
1045 }
1046 break;
1047
1048 case WM_COMMAND:
1049 switch(LOWORD(wParam))
1050 {
1051 case IDC_PAGEFMT_WN:
1052 case IDC_PAGEFMT_WW:
1053 case IDC_PAGEFMT_WM:
1055 LOWORD(wParam));
1056 break;
1057
1058 case IDC_PAGEFMT_TB:
1059 case IDC_PAGEFMT_FB:
1060 case IDC_PAGEFMT_RU:
1061 case IDC_PAGEFMT_SB:
1064 break;
1065 }
1066 break;
1067 case WM_NOTIFY:
1068 {
1070 if(header->code == PSN_APPLY)
1071 {
1073 char sid[4];
1074 int id;
1075
1076 GetWindowTextA(hIdWnd, sid, 4);
1077 id = atoi(sid);
1084
1086 barState[id] |= (1 << BANDID_TOOLBAR);
1087 else
1088 barState[id] &= ~(1 << BANDID_TOOLBAR);
1089
1091 barState[id] |= (1 << BANDID_FORMATBAR);
1092 else
1093 barState[id] &= ~(1 << BANDID_FORMATBAR);
1094
1096 barState[id] |= (1 << BANDID_RULER);
1097 else
1098 barState[id] &= ~(1 << BANDID_RULER);
1099
1101 barState[id] |= (1 << BANDID_STATUSBAR);
1102 else
1103 barState[id] &= ~(1 << BANDID_STATUSBAR);
1104 }
1105 }
1106 break;
1107 }
1108 return FALSE;
1109}
1110
1111static void dialog_viewproperties(void)
1112{
1113 PROPSHEETPAGEW psp[2];
1114 PROPSHEETHEADERW psh;
1115 size_t i;
1118
1119 psp[0].dwSize = sizeof(PROPSHEETPAGEW);
1120 psp[0].dwFlags = PSP_USETITLE;
1121 U(psp[0]).pszTemplate = MAKEINTRESOURCEW(IDD_FORMATOPTS);
1122 psp[0].pfnDlgProc = formatopts_proc;
1123 psp[0].hInstance = hInstance;
1124 psp[0].lParam = reg_formatindex(SF_TEXT);
1125 psp[0].pfnCallback = NULL;
1127 for(i = 1; i < sizeof(psp)/sizeof(psp[0]); i++)
1128 {
1129 psp[i].dwSize = psp[0].dwSize;
1130 psp[i].dwFlags = psp[0].dwFlags;
1131 U(psp[i]).pszTemplate = U(psp[0]).pszTemplate;
1132 psp[i].pfnDlgProc = psp[0].pfnDlgProc;
1133 psp[i].hInstance = psp[0].hInstance;
1135 psp[i].pfnCallback = psp[0].pfnCallback;
1137 }
1138
1139 psh.dwSize = sizeof(psh);
1141 psh.hwndParent = hMainWnd;
1142 psh.hInstance = hInstance;
1144 psh.nPages = sizeof(psp)/sizeof(psp[0]);
1145 U3(psh).ppsp = ppsp;
1146 U(psh).pszIcon = MAKEINTRESOURCEW(IDI_WORDPAD);
1147
1148 if(fileFormat & SF_RTF)
1149 U2(psh).nStartPage = 1;
1150 else
1151 U2(psh).nStartPage = 0;
1152 PropertySheetW(&psh);
1155}
1156
1158{
1160 BOOL opt_print = FALSE;
1161
1162 /* skip white space */
1163 while (*cmdline == ' ') cmdline++;
1164
1165 /* skip executable name */
1166 delimiter = (*cmdline == '"' ? '"' : ' ');
1167
1168 if (*cmdline == delimiter) cmdline++;
1169 while (*cmdline && *cmdline != delimiter) cmdline++;
1170 if (*cmdline == delimiter) cmdline++;
1171
1172 while (*cmdline)
1173 {
1174 while (isspace(*cmdline)) cmdline++;
1175
1176 if (*cmdline == '-' || *cmdline == '/')
1177 {
1178 if (!cmdline[2] || isspace(cmdline[2]))
1179 {
1180 switch (cmdline[1])
1181 {
1182 case 'P':
1183 case 'p':
1184 opt_print = TRUE;
1185 cmdline += 2;
1186 continue;
1187 }
1188 }
1189 /* a filename starting by / */
1190 }
1191 break;
1192 }
1193
1194 if (*cmdline)
1195 {
1196 /* file name is passed on the command line */
1197 if (cmdline[0] == '"')
1198 {
1199 cmdline++;
1200 cmdline[lstrlenW(cmdline) - 1] = 0;
1201 }
1204 }
1205
1206 if (opt_print)
1208}
1209
1211{
1212 if(pFr->Flags & FR_DIALOGTERM)
1213 {
1214 hFindWnd = 0;
1215 pFr->Flags = FR_FINDNEXT;
1216 return 0;
1217 }
1218
1219 if(pFr->Flags & FR_FINDNEXT || pFr->Flags & FR_REPLACE || pFr->Flags & FR_REPLACEALL)
1220 {
1221 FINDREPLACE_custom *custom_data = (FINDREPLACE_custom*)pFr->lCustData;
1222 DWORD flags;
1223 FINDTEXTEXW ft;
1224 CHARRANGE sel;
1225 LRESULT ret = -1;
1226 HMENU hMenu = GetMenu(hMainWnd);
1228
1229 mi.cbSize = sizeof(mi);
1230 mi.fMask = MIIM_DATA;
1231 mi.dwItemData = 1;
1233
1234 /* Make sure find field is saved. */
1235 if (pFr->lpstrFindWhat != custom_data->findBuffer)
1236 {
1237 lstrcpynW(custom_data->findBuffer, pFr->lpstrFindWhat,
1238 sizeof(custom_data->findBuffer) / sizeof(WCHAR));
1239 pFr->lpstrFindWhat = custom_data->findBuffer;
1240 }
1241
1242 SendMessageW(hEditorWnd, EM_GETSEL, (WPARAM)&sel.cpMin, (LPARAM)&sel.cpMax);
1243 if(custom_data->endPos == -1) {
1244 custom_data->endPos = sel.cpMin;
1245 custom_data->wrapped = FALSE;
1246 }
1247
1248 flags = FR_DOWN | (pFr->Flags & (FR_MATCHCASE | FR_WHOLEWORD));
1249 ft.lpstrText = pFr->lpstrFindWhat;
1250
1251 /* Only replace the existing selection if it is an exact match. */
1252 if (sel.cpMin != sel.cpMax &&
1253 (pFr->Flags & FR_REPLACE || pFr->Flags & FR_REPLACEALL))
1254 {
1255 ft.chrg = sel;
1257 if (ft.chrgText.cpMin == sel.cpMin && ft.chrgText.cpMax == sel.cpMax) {
1259 SendMessageW(hEditorWnd, EM_GETSEL, (WPARAM)&sel.cpMin, (LPARAM)&sel.cpMax);
1260 }
1261 }
1262
1263 /* Search from the start of the selection, but exclude the first character
1264 * from search if there is a selection. */
1265 ft.chrg.cpMin = sel.cpMin;
1266 if (sel.cpMin != sel.cpMax)
1267 ft.chrg.cpMin++;
1268
1269 /* Search to the end, then wrap around and search from the start. */
1270 if (!custom_data->wrapped) {
1271 ft.chrg.cpMax = -1;
1273 if (ret == -1) {
1274 custom_data->wrapped = TRUE;
1275 ft.chrg.cpMin = 0;
1276 }
1277 }
1278
1279 if (ret == -1) {
1280 ft.chrg.cpMax = custom_data->endPos + lstrlenW(pFr->lpstrFindWhat) - 1;
1281 if (ft.chrg.cpMax > ft.chrg.cpMin)
1283 }
1284
1285 if (ret == -1) {
1286 custom_data->endPos = -1;
1291 } else {
1292 SendMessageW(hEditorWnd, EM_SETSEL, ft.chrgText.cpMin, ft.chrgText.cpMax);
1294
1295 if (pFr->Flags & FR_REPLACEALL)
1296 return handle_findmsg(pFr);
1297 }
1298 }
1299
1300 return 0;
1301}
1302
1304{
1305 static WCHAR selBuffer[128];
1306 static WCHAR replaceBuffer[128];
1307 static FINDREPLACE_custom custom_data;
1308 static const WCHAR endl = '\r';
1309 FINDTEXTW ft;
1310
1311 /* Allow only one search/replace dialog to open */
1312 if(hFindWnd != NULL)
1313 {
1315 return;
1316 }
1317
1318 ZeroMemory(fr, sizeof(FINDREPLACEW));
1319 fr->lStructSize = sizeof(FINDREPLACEW);
1320 fr->hwndOwner = hMainWnd;
1321 fr->Flags = FR_HIDEUPDOWN;
1322 /* Find field is filled with the selected text if it is non-empty
1323 * and stays within the same paragraph, otherwise the previous
1324 * find field is used. */
1326 (LPARAM)&ft.chrg.cpMax);
1327 ft.lpstrText = &endl;
1328 if (ft.chrg.cpMin != ft.chrg.cpMax &&
1330 {
1331 /* Use a temporary buffer for the selected text so that the saved
1332 * find field is only overwritten when a find/replace is clicked. */
1333 GETTEXTEX gt = {sizeof(selBuffer), GT_SELECTION, 1200, NULL, NULL};
1334 SendMessageW(hEditorWnd, EM_GETTEXTEX, (WPARAM)&gt, (LPARAM)selBuffer);
1335 fr->lpstrFindWhat = selBuffer;
1336 } else {
1337 fr->lpstrFindWhat = custom_data.findBuffer;
1338 }
1339 fr->lpstrReplaceWith = replaceBuffer;
1340 custom_data.endPos = -1;
1341 custom_data.wrapped = FALSE;
1342 fr->lCustData = (LPARAM)&custom_data;
1343 fr->wFindWhatLen = sizeof(custom_data.findBuffer);
1344 fr->wReplaceWithLen = sizeof(replaceBuffer);
1345
1346 if(replace)
1347 hFindWnd = ReplaceTextW(fr);
1348 else
1349 hFindWnd = FindTextW(fr);
1350}
1351
1352static int units_to_twips(UNIT unit, float number)
1353{
1354 int twips = 0;
1355
1356 switch(unit)
1357 {
1358 case UNIT_CM:
1359 twips = (int)(number * 1000.0 / (float)CENTMM_PER_INCH * (float)TWIPS_PER_INCH);
1360 break;
1361
1362 case UNIT_INCH:
1363 twips = (int)(number * (float)TWIPS_PER_INCH);
1364 break;
1365
1366 case UNIT_PT:
1367 twips = (int)(number * (0.0138 * (float)TWIPS_PER_INCH));
1368 break;
1369 }
1370
1371 return twips;
1372}
1373
1375{
1376 static const WCHAR space[] = {' ', 0};
1379}
1380
1382{
1383 static const WCHAR fmt[] = {'%','.','2','f',' ','%','s','\0'};
1384 float converted = (float)number / (float)TWIPS_PER_INCH *(float)CENTMM_PER_INCH / 1000.0;
1385
1386 sprintfW(buffer, fmt, converted, units_cmW);
1387}
1388
1390{
1391 COMBOBOXEXITEMW cbItem;
1392 COMBOBOXINFO cbInfo;
1393 HWND hCombo, hList;
1394 int idx, result;
1395
1396 hCombo = (HWND)SendMessageW(hComboEx, CBEM_GETCOMBOCONTROL, 0, 0);
1397 if (!hCombo)
1398 return FALSE;
1399 cbInfo.cbSize = sizeof(COMBOBOXINFO);
1400 result = SendMessageW(hCombo, CB_GETCOMBOBOXINFO, 0, (LPARAM)&cbInfo);
1401 if (!result)
1402 return FALSE;
1403 hList = cbInfo.hwndList;
1405 if (idx < 0)
1406 return FALSE;
1407
1408 ZeroMemory(&cbItem, sizeof(cbItem));
1409 cbItem.mask = CBEIF_TEXT;
1410 cbItem.iItem = idx;
1411 cbItem.pszText = wszBuffer;
1412 cbItem.cchTextMax = bufferLength-1;
1413 result = SendMessageW(hComboEx, CBEM_GETITEMW, 0, (LPARAM)&cbItem);
1414
1415 return result != 0;
1416}
1417
1419{
1420 switch(message)
1421 {
1422 case WM_INITDIALOG:
1423 {
1425 SYSTEMTIME st;
1426 HWND hListWnd = GetDlgItem(hWnd, IDC_DATETIME);
1427 GetLocalTime(&st);
1428
1431 SendMessageW(hListWnd, LB_ADDSTRING, 0, (LPARAM)&buffer);
1434 SendMessageW(hListWnd, LB_ADDSTRING, 0, (LPARAM)&buffer);
1436 SendMessageW(hListWnd, LB_ADDSTRING, 0, (LPARAM)&buffer);
1437
1438 SendMessageW(hListWnd, LB_SETSEL, TRUE, 0);
1439 }
1440 break;
1441
1442 case WM_COMMAND:
1443 switch(LOWORD(wParam))
1444 {
1445 case IDC_DATETIME:
1446 if (HIWORD(wParam) != LBN_DBLCLK)
1447 break;
1448 /* Fall through */
1449
1450 case IDOK:
1451 {
1452 LRESULT index;
1453 HWND hListWnd = GetDlgItem(hWnd, IDC_DATETIME);
1454
1455 index = SendMessageW(hListWnd, LB_GETCURSEL, 0, 0);
1456
1457 if(index != LB_ERR)
1458 {
1460 SendMessageW(hListWnd, LB_GETTEXT, index, (LPARAM)&buffer);
1462 }
1463 }
1464 /* Fall through */
1465
1466 case IDCANCEL:
1468 return TRUE;
1469 }
1470 }
1471 return FALSE;
1472}
1473
1475{
1476 switch(message)
1477 {
1478 case WM_INITDIALOG:
1479 {
1482 HWND hListWnd = GetDlgItem(hWnd, IDC_NEWFILE);
1483
1485 SendMessageW(hListWnd, LB_ADDSTRING, 0, (LPARAM)&buffer);
1487 SendMessageW(hListWnd, LB_ADDSTRING, 0, (LPARAM)&buffer);
1489 SendMessageW(hListWnd, LB_ADDSTRING, 0, (LPARAM)&buffer);
1490
1491 SendMessageW(hListWnd, LB_SETSEL, TRUE, 0);
1492 }
1493 break;
1494
1495 case WM_COMMAND:
1496 switch(LOWORD(wParam))
1497 {
1498 case IDOK:
1499 {
1500 LRESULT index;
1501 HWND hListWnd = GetDlgItem(hWnd, IDC_NEWFILE);
1502 index = SendMessageW(hListWnd, LB_GETCURSEL, 0, 0);
1503
1504 if(index != LB_ERR)
1506 }
1507 return TRUE;
1508
1509 case IDCANCEL:
1511 return TRUE;
1512 }
1513 }
1514 return FALSE;
1515}
1516
1518{
1519 static const WORD ALIGNMENT_VALUES[] = {PFA_LEFT, PFA_RIGHT, PFA_CENTER};
1520
1521 switch(message)
1522 {
1523 case WM_INITDIALOG:
1524 {
1527 HWND hListWnd = GetDlgItem(hWnd, IDC_PARA_ALIGN);
1528 HWND hLeftWnd = GetDlgItem(hWnd, IDC_PARA_LEFT);
1529 HWND hRightWnd = GetDlgItem(hWnd, IDC_PARA_RIGHT);
1530 HWND hFirstWnd = GetDlgItem(hWnd, IDC_PARA_FIRST);
1531 PARAFORMAT2 pf;
1532 int index = 0;
1533
1536 SendMessageW(hListWnd, CB_ADDSTRING, 0, (LPARAM)buffer);
1539 SendMessageW(hListWnd, CB_ADDSTRING, 0, (LPARAM)buffer);
1542 SendMessageW(hListWnd, CB_ADDSTRING, 0, (LPARAM)buffer);
1543
1544 pf.cbSize = sizeof(pf);
1548
1549 if(pf.wAlignment == PFA_RIGHT)
1550 index ++;
1551 else if(pf.wAlignment == PFA_CENTER)
1552 index += 2;
1553
1554 SendMessageW(hListWnd, CB_SETCURSEL, index, 0);
1555
1557 SetWindowTextW(hLeftWnd, buffer);
1559 SetWindowTextW(hRightWnd, buffer);
1561 SetWindowTextW(hFirstWnd, buffer);
1562 }
1563 break;
1564
1565 case WM_COMMAND:
1566 switch(LOWORD(wParam))
1567 {
1568 case IDOK:
1569 {
1570 HWND hListWnd = GetDlgItem(hWnd, IDC_PARA_ALIGN);
1571 HWND hLeftWnd = GetDlgItem(hWnd, IDC_PARA_LEFT);
1572 HWND hRightWnd = GetDlgItem(hWnd, IDC_PARA_RIGHT);
1573 HWND hFirstWnd = GetDlgItem(hWnd, IDC_PARA_FIRST);
1575 int index;
1576 float num;
1577 int ret = 0;
1578 PARAFORMAT pf;
1579 UNIT unit;
1580
1581 index = SendMessageW(hListWnd, CB_GETCURSEL, 0, 0);
1582 pf.wAlignment = ALIGNMENT_VALUES[index];
1583
1586 ret++;
1590 ret++;
1594 ret++;
1596
1597 if(ret != 3)
1598 {
1601 return FALSE;
1602 } else
1603 {
1604 if (pf.dxOffset + pf.dxStartIndent < 0
1605 && pf.dxStartIndent < 0)
1606 {
1607 /* The first line is before the left edge, so
1608 * make sure it is at the left edge. */
1609 pf.dxOffset = -pf.dxStartIndent;
1610 } else if (pf.dxOffset < 0) {
1611 /* The second and following lines are before
1612 * the left edge, so set it to be at the left
1613 * edge, and adjust the first line since it
1614 * is relative to it. */
1615 pf.dxStartIndent = max(pf.dxStartIndent + pf.dxOffset, 0);
1616 pf.dxOffset = 0;
1617 }
1618 /* Internally the dxStartIndent is the absolute
1619 * offset for the first line and dxOffset is
1620 * to it value as opposed how it is displayed with
1621 * the first line being the relative value.
1622 * These two lines make the adjustments. */
1624 pf.dxOffset = pf.dxOffset - pf.dxStartIndent;
1625
1626 pf.cbSize = sizeof(pf);
1630 }
1631 }
1632 /* Fall through */
1633
1634 case IDCANCEL:
1636 return TRUE;
1637 }
1638 }
1639 return FALSE;
1640}
1641
1643{
1644 switch(message)
1645 {
1646 case WM_INITDIALOG:
1647 {
1649 PARAFORMAT pf;
1651 int i;
1652
1653 pf.cbSize = sizeof(pf);
1654 pf.dwMask = PFM_TABSTOPS;
1657
1658 for(i = 0; i < pf.cTabCount; i++)
1659 {
1662 }
1664 }
1665 break;
1666
1667 case WM_COMMAND:
1668 switch(LOWORD(wParam))
1669 {
1670 case IDC_TABSTOPS:
1671 {
1673 HWND hAddWnd = GetDlgItem(hWnd, ID_TAB_ADD);
1674 HWND hDelWnd = GetDlgItem(hWnd, ID_TAB_DEL);
1675 HWND hEmptyWnd = GetDlgItem(hWnd, ID_TAB_EMPTY);
1676
1678 EnableWindow(hAddWnd, TRUE);
1679 else
1680 EnableWindow(hAddWnd, FALSE);
1681
1682 if(SendMessageW(hTabWnd, CB_GETCOUNT, 0, 0))
1683 {
1684 EnableWindow(hEmptyWnd, TRUE);
1685
1687 EnableWindow(hDelWnd, FALSE);
1688 else
1689 EnableWindow(hDelWnd, TRUE);
1690 } else
1691 {
1692 EnableWindow(hEmptyWnd, FALSE);
1693 }
1694 }
1695 break;
1696
1697 case ID_TAB_ADD:
1698 {
1701 UNIT unit;
1702
1705
1707 {
1708 float number = 0;
1709 int item_count = SendMessageW(hTabWnd, CB_GETCOUNT, 0, 0);
1710
1712 {
1715 } else if (item_count >= MAX_TAB_STOPS) {
1718 } else {
1719 int i;
1720 float next_number = -1;
1721 int next_number_in_twips = -1;
1722 int insert_number = units_to_twips(unit, number);
1723
1724 /* linear search for position to insert the string */
1725 for(i = 0; i < item_count; i++)
1726 {
1728 number_from_string(buffer, &next_number, &unit);
1729 next_number_in_twips = units_to_twips(unit, next_number);
1730 if (insert_number <= next_number_in_twips)
1731 break;
1732 }
1733 if (insert_number != next_number_in_twips)
1734 {
1735 number_with_units(buffer, insert_number);
1738 }
1739 }
1740 }
1742 }
1743 break;
1744
1745 case ID_TAB_DEL:
1746 {
1748 LRESULT ret;
1750 if(ret != CB_ERR)
1752 }
1753 break;
1754
1755 case ID_TAB_EMPTY:
1756 {
1760 }
1761 break;
1762
1763 case IDOK:
1764 {
1766 int i;
1768 PARAFORMAT pf;
1769 float number;
1770 UNIT unit;
1771
1772 pf.cbSize = sizeof(pf);
1773 pf.dwMask = PFM_TABSTOPS;
1774
1775 for(i = 0; SendMessageW(hTabWnd, CB_GETLBTEXT, i,
1776 (LPARAM)&buffer) != CB_ERR &&
1777 i < MAX_TAB_STOPS; i++)
1778 {
1781 }
1782 pf.cTabCount = i;
1784 }
1785 /* Fall through */
1786 case IDCANCEL:
1788 return TRUE;
1789 }
1790 }
1791 return FALSE;
1792}
1793
1795{
1796 HWND hToolBarWnd, hFormatBarWnd, hReBarWnd, hFontListWnd, hSizeListWnd, hRulerWnd;
1798 HANDLE hDLL;
1800 int nStdBitmaps = 0;
1801 REBARINFO rbi;
1802 REBARBANDINFOW rbb;
1803 static const WCHAR wszRichEditDll[] = {'R','I','C','H','E','D','2','0','.','D','L','L','\0'};
1804 static const WCHAR wszRichEditText[] = {'R','i','c','h','E','d','i','t',' ','t','e','x','t','\0'};
1805
1807
1811
1812 rbi.cbSize = sizeof(rbi);
1813 rbi.fMask = 0;
1814 rbi.himl = NULL;
1815 if(!SendMessageW(hReBarWnd, RB_SETBARINFO, 0, (LPARAM)&rbi))
1816 return -1;
1817
1821 NULL, 0,
1822 24, 24, 16, 16, sizeof(TBBUTTON));
1823
1824 ab.hInst = HINST_COMMCTRL;
1825 ab.nID = IDB_STD_SMALL_COLOR;
1826 nStdBitmaps = SendMessageW(hToolBarWnd, TB_ADDBITMAP, 0, (LPARAM)&ab);
1827
1828 AddButton(hToolBarWnd, nStdBitmaps+STD_FILENEW, ID_FILE_NEW);
1829 AddButton(hToolBarWnd, nStdBitmaps+STD_FILEOPEN, ID_FILE_OPEN);
1830 AddButton(hToolBarWnd, nStdBitmaps+STD_FILESAVE, ID_FILE_SAVE);
1831 AddSeparator(hToolBarWnd);
1832 AddButton(hToolBarWnd, nStdBitmaps+STD_PRINT, ID_PRINT_QUICK);
1833 AddButton(hToolBarWnd, nStdBitmaps+STD_PRINTPRE, ID_PREVIEW);
1834 AddSeparator(hToolBarWnd);
1835 AddButton(hToolBarWnd, nStdBitmaps+STD_FIND, ID_FIND);
1836 AddSeparator(hToolBarWnd);
1837 AddButton(hToolBarWnd, nStdBitmaps+STD_CUT, ID_EDIT_CUT);
1838 AddButton(hToolBarWnd, nStdBitmaps+STD_COPY, ID_EDIT_COPY);
1839 AddButton(hToolBarWnd, nStdBitmaps+STD_PASTE, ID_EDIT_PASTE);
1840 AddButton(hToolBarWnd, nStdBitmaps+STD_UNDO, ID_EDIT_UNDO);
1841 AddButton(hToolBarWnd, nStdBitmaps+STD_REDOW, ID_EDIT_REDO);
1842 AddSeparator(hToolBarWnd);
1843 AddButton(hToolBarWnd, 0, ID_DATETIME);
1844
1845 SendMessageW(hToolBarWnd, TB_AUTOSIZE, 0, 0);
1846
1850 rbb.cx = 0;
1851 rbb.hwndChild = hToolBarWnd;
1852 rbb.cxMinChild = 0;
1853 rbb.cyChild = rbb.cyMinChild = HIWORD(SendMessageW(hToolBarWnd, TB_GETBUTTONSIZE, 0, 0));
1854 rbb.wID = BANDID_TOOLBAR;
1855
1856 SendMessageW(hReBarWnd, RB_INSERTBANDW, -1, (LPARAM)&rbb);
1857
1858 hFontListWnd = CreateWindowExW(0, WC_COMBOBOXEXW, NULL,
1860 0, 0, 200, 150, hReBarWnd, (HMENU)IDC_FONTLIST, hInstance, NULL);
1861
1862 rbb.hwndChild = hFontListWnd;
1863 rbb.cx = 200;
1864 rbb.wID = BANDID_FONTLIST;
1865
1866 SendMessageW(hReBarWnd, RB_INSERTBANDW, -1, (LPARAM)&rbb);
1867
1868 hSizeListWnd = CreateWindowExW(0, WC_COMBOBOXEXW, NULL,
1870 0, 0, 50, 150, hReBarWnd, (HMENU)IDC_SIZELIST, hInstance, NULL);
1871
1872 rbb.hwndChild = hSizeListWnd;
1873 rbb.cx = 50;
1874 rbb.fStyle ^= RBBS_BREAK;
1875 rbb.wID = BANDID_SIZELIST;
1876
1877 SendMessageW(hReBarWnd, RB_INSERTBANDW, -1, (LPARAM)&rbb);
1878
1879 hFormatBarWnd = CreateToolbarEx(hReBarWnd,
1881 IDC_FORMATBAR, 8, hInstance, IDB_FORMATBAR, NULL, 0, 16, 16, 16, 16, sizeof(TBBUTTON));
1882
1883 AddButton(hFormatBarWnd, 0, ID_FORMAT_BOLD);
1884 AddButton(hFormatBarWnd, 1, ID_FORMAT_ITALIC);
1885 AddButton(hFormatBarWnd, 2, ID_FORMAT_UNDERLINE);
1886 AddButton(hFormatBarWnd, 3, ID_FORMAT_COLOR);
1887 AddSeparator(hFormatBarWnd);
1888 AddButton(hFormatBarWnd, 4, ID_ALIGN_LEFT);
1889 AddButton(hFormatBarWnd, 5, ID_ALIGN_CENTER);
1890 AddButton(hFormatBarWnd, 6, ID_ALIGN_RIGHT);
1891 AddSeparator(hFormatBarWnd);
1892 AddButton(hFormatBarWnd, 7, ID_BULLET);
1893
1894 SendMessageW(hFormatBarWnd, TB_AUTOSIZE, 0, 0);
1895
1896 rbb.hwndChild = hFormatBarWnd;
1897 rbb.wID = BANDID_FORMATBAR;
1898
1899 SendMessageW(hReBarWnd, RB_INSERTBANDW, -1, (LPARAM)&rbb);
1900
1902 0, 0, 200, 10, hReBarWnd, (HMENU)IDC_RULER, hInstance, NULL);
1903
1904
1905 rbb.hwndChild = hRulerWnd;
1906 rbb.wID = BANDID_RULER;
1907 rbb.fStyle |= RBBS_BREAK;
1908
1909 SendMessageW(hReBarWnd, RB_INSERTBANDW, -1, (LPARAM)&rbb);
1910
1911 hDLL = LoadLibraryW(wszRichEditDll);
1912 if(!hDLL)
1913 {
1916 PostQuitMessage(1);
1917 }
1918
1922 0, 0, 1000, 100, hWnd, (HMENU)IDC_EDITOR, hInstance, NULL);
1923
1924 if (!hEditorWnd)
1925 {
1926 fprintf(stderr, "Error code %u\n", GetLastError());
1927 return -1;
1928 }
1930
1934
1936
1937 populate_font_list(hFontListWnd);
1938 populate_size_list(hSizeListWnd);
1939 DoLoadStrings();
1941
1943
1948
1949 return 0;
1950}
1951
1953{
1954 HWND hwndEditor = GetDlgItem(hWnd, IDC_EDITOR);
1955 HWND hwndReBar = GetDlgItem(hWnd, IDC_REBAR);
1956 HWND hwndToolBar = GetDlgItem(hwndReBar, IDC_TOOLBAR);
1957 HWND hwndFormatBar = GetDlgItem(hwndReBar, IDC_FORMATBAR);
1958 int from, to;
1960 PARAFORMAT2 pf;
1961 GETTEXTLENGTHEX gt;
1962
1963 ZeroMemory(&fmt, sizeof(fmt));
1964 fmt.cbSize = sizeof(fmt);
1965
1966 ZeroMemory(&pf, sizeof(pf));
1967 pf.cbSize = sizeof(pf);
1968
1969 gt.flags = GTL_NUMCHARS;
1970 gt.codepage = 1200;
1971
1972 SendMessageW(hwndToolBar, TB_ENABLEBUTTON, ID_FIND,
1973 SendMessageW(hwndEditor, EM_GETTEXTLENGTHEX, (WPARAM)&gt, 0) ? 1 : 0);
1974
1975 SendMessageW(hwndEditor, EM_GETCHARFORMAT, TRUE, (LPARAM)&fmt);
1976
1977 SendMessageW(hwndEditor, EM_GETSEL, (WPARAM)&from, (LPARAM)&to);
1979 SendMessageW(hwndEditor, EM_CANUNDO, 0, 0));
1981 SendMessageW(hwndEditor, EM_CANREDO, 0, 0));
1982 SendMessageW(hwndToolBar, TB_ENABLEBUTTON, ID_EDIT_CUT, from == to ? 0 : 1);
1983 SendMessageW(hwndToolBar, TB_ENABLEBUTTON, ID_EDIT_COPY, from == to ? 0 : 1);
1984
1985 SendMessageW(hwndFormatBar, TB_CHECKBUTTON, ID_FORMAT_BOLD, (fmt.dwMask & CFM_BOLD) &&
1986 (fmt.dwEffects & CFE_BOLD));
1987 SendMessageW(hwndFormatBar, TB_INDETERMINATE, ID_FORMAT_BOLD, !(fmt.dwMask & CFM_BOLD));
1988 SendMessageW(hwndFormatBar, TB_CHECKBUTTON, ID_FORMAT_ITALIC, (fmt.dwMask & CFM_ITALIC) &&
1989 (fmt.dwEffects & CFE_ITALIC));
1990 SendMessageW(hwndFormatBar, TB_INDETERMINATE, ID_FORMAT_ITALIC, !(fmt.dwMask & CFM_ITALIC));
1991 SendMessageW(hwndFormatBar, TB_CHECKBUTTON, ID_FORMAT_UNDERLINE, (fmt.dwMask & CFM_UNDERLINE) &&
1992 (fmt.dwEffects & CFE_UNDERLINE));
1994
1995 SendMessageW(hwndEditor, EM_GETPARAFORMAT, 0, (LPARAM)&pf);
1999
2001 return 0;
2002}
2003
2005{
2006 HWND hwndEditor = GetDlgItem(hWnd, IDC_EDITOR);
2007 HWND hwndReBar = GetDlgItem(hWnd, IDC_REBAR);
2008 NMHDR *pHdr = (NMHDR *)lParam;
2009 HWND hwndFontList = GetDlgItem(hwndReBar, IDC_FONTLIST);
2010 HWND hwndSizeList = GetDlgItem(hwndReBar, IDC_SIZELIST);
2011
2012 if (pHdr->hwndFrom == hwndFontList || pHdr->hwndFrom == hwndSizeList)
2013 {
2014 if (pHdr->code == CBEN_ENDEDITW)
2015 {
2016 NMCBEENDEDITW *endEdit = (NMCBEENDEDITW *)lParam;
2017 if(pHdr->hwndFrom == hwndFontList)
2018 {
2019 on_fontlist_modified(endEdit->szText);
2020 } else if (pHdr->hwndFrom == hwndSizeList)
2021 {
2022 on_sizelist_modified(hwndSizeList,endEdit->szText);
2023 }
2024 }
2025 return 0;
2026 }
2027
2028 if (pHdr->hwndFrom != hwndEditor)
2029 return 0;
2030
2031 if (pHdr->code == EN_SELCHANGE)
2032 {
2033 SELCHANGE *pSC = (SELCHANGE *)lParam;
2034 char buf[128];
2035
2037
2038 sprintf( buf,"selection = %d..%d, line count=%ld",
2039 pSC->chrg.cpMin, pSC->chrg.cpMax,
2040 SendMessageW(hwndEditor, EM_GETLINECOUNT, 0, 0));
2042 SendMessageW(hWnd, WM_USER, 0, 0);
2043 return 1;
2044 }
2045 return 0;
2046}
2047
2048/* Copied from dlls/comdlg32/fontdlg.c */
2049static const COLORREF textcolors[]=
2050{
2051 0x00000000L,0x00000080L,0x00008000L,0x00008080L,
2052 0x00800000L,0x00800080L,0x00808000L,0x00808080L,
2053 0x00c0c0c0L,0x000000ffL,0x0000ff00L,0x0000ffffL,
2054 0x00ff0000L,0x00ff00ffL,0x00ffff00L,0x00FFFFFFL
2055};
2056
2058{
2059 HWND hwndEditor = GetDlgItem(hWnd, IDC_EDITOR);
2060 static FINDREPLACEW findreplace;
2061
2062 if ((HWND)lParam == hwndEditor)
2063 return 0;
2064
2065 switch(LOWORD(wParam))
2066 {
2067
2068 case ID_FILE_EXIT:
2069 PostMessageW(hWnd, WM_CLOSE, 0, 0);
2070 break;
2071
2072 case ID_FILE_NEW:
2073 {
2076
2077 if(ret != ID_NEWFILE_ABORT)
2078 {
2080 {
2081 SETTEXTEX st;
2082
2084 wszFileName[0] = '\0';
2085
2087
2088 st.flags = ST_DEFAULT;
2089 st.codepage = 1200;
2091
2095 }
2096 }
2097 }
2098 break;
2099
2100 case ID_FILE_OPEN:
2102 break;
2103
2104 case ID_FILE_SAVE:
2105 if(wszFileName[0])
2106 {
2108 break;
2109 }
2110 /* Fall through */
2111
2112 case ID_FILE_SAVEAS:
2114 break;
2115
2116 case ID_FILE_RECENT1:
2117 case ID_FILE_RECENT2:
2118 case ID_FILE_RECENT3:
2119 case ID_FILE_RECENT4:
2120 {
2121 HMENU hMenu = GetMenu(hWnd);
2123
2124 mi.cbSize = sizeof(MENUITEMINFOW);
2125 mi.fMask = MIIM_DATA;
2126 if(GetMenuItemInfoW(hMenu, LOWORD(wParam), FALSE, &mi))
2127 DoOpenFile((LPWSTR)mi.dwItemData);
2128 }
2129 break;
2130
2131 case ID_FIND:
2132 dialog_find(&findreplace, FALSE);
2133 break;
2134
2135 case ID_FIND_NEXT:
2136 handle_findmsg(&findreplace);
2137 break;
2138
2139 case ID_REPLACE:
2140 dialog_find(&findreplace, TRUE);
2141 break;
2142
2143 case ID_FONTSETTINGS:
2145 break;
2146
2147 case ID_PRINT:
2150 break;
2151
2152 case ID_PRINT_QUICK:
2155 break;
2156
2157 case ID_PREVIEW:
2158 {
2160 DWORD tmp = barState[index];
2163 barState[index] = tmp;
2165
2167
2168 SetMenu(hWnd, NULL);
2169 InvalidateRect(0, 0, TRUE);
2170 }
2171 break;
2172
2173 case ID_PRINTSETUP:
2176 break;
2177
2178 case ID_FORMAT_BOLD:
2179 case ID_FORMAT_ITALIC:
2181 {
2183 int effects = CFE_BOLD;
2184
2185 ZeroMemory(&fmt, sizeof(fmt));
2186 fmt.cbSize = sizeof(fmt);
2188
2189 fmt.dwMask = CFM_BOLD;
2190
2192 {
2193 effects = CFE_ITALIC;
2194 fmt.dwMask = CFM_ITALIC;
2195 } else if (LOWORD(wParam) == ID_FORMAT_UNDERLINE)
2196 {
2197 effects = CFE_UNDERLINE;
2198 fmt.dwMask = CFM_UNDERLINE;
2199 }
2200
2201 fmt.dwEffects ^= effects;
2202
2204 break;
2205 }
2206
2207 case ID_FORMAT_COLOR:
2208 {
2209 HWND hReBarWnd = GetDlgItem(hWnd, IDC_REBAR);
2210 HWND hFormatBarWnd = GetDlgItem(hReBarWnd, IDC_FORMATBAR);
2211 HMENU hPop;
2212 RECT itemrc;
2213 POINT pt;
2214 int mid;
2215 int itemidx = SendMessageW(hFormatBarWnd, TB_COMMANDTOINDEX, ID_FORMAT_COLOR, 0);
2216
2217 SendMessageW(hFormatBarWnd, TB_GETITEMRECT, itemidx, (LPARAM)&itemrc);
2218 pt.x = itemrc.left;
2219 pt.y = itemrc.bottom;
2220 ClientToScreen(hFormatBarWnd, &pt);
2221 hPop = GetSubMenu(hColorPopupMenu, 0);
2224 pt.x, pt.y, 0, hWnd, 0);
2225 if (mid >= ID_COLOR_FIRST && mid <= ID_COLOR_AUTOMATIC)
2226 {
2228
2229 ZeroMemory(&fmt, sizeof(fmt));
2230 fmt.cbSize = sizeof(fmt);
2232
2233 fmt.dwMask = CFM_COLOR;
2234
2235 if (mid < ID_COLOR_AUTOMATIC) {
2236 fmt.crTextColor = textcolors[mid - ID_COLOR_FIRST];
2237 fmt.dwEffects &= ~CFE_AUTOCOLOR;
2238 } else {
2239 fmt.dwEffects |= CFE_AUTOCOLOR;
2240 }
2241
2243 }
2244 break;
2245 }
2246
2247 case ID_EDIT_CUT:
2248 PostMessageW(hwndEditor, WM_CUT, 0, 0);
2249 break;
2250
2251 case ID_EDIT_COPY:
2252 PostMessageW(hwndEditor, WM_COPY, 0, 0);
2253 break;
2254
2255 case ID_EDIT_PASTE:
2256 PostMessageW(hwndEditor, WM_PASTE, 0, 0);
2257 break;
2258
2259 case ID_EDIT_CLEAR:
2260 PostMessageW(hwndEditor, WM_CLEAR, 0, 0);
2261 break;
2262
2263 case ID_EDIT_SELECTALL:
2264 {
2265 CHARRANGE range = {0, -1};
2266 SendMessageW(hwndEditor, EM_EXSETSEL, 0, (LPARAM)&range);
2267 /* SendMessage(hwndEditor, EM_SETSEL, 0, -1); */
2268 return 0;
2269 }
2270
2271 case ID_EDIT_GETTEXT:
2272 {
2273 int nLen = GetWindowTextLengthW(hwndEditor);
2274 LPWSTR data = HeapAlloc( GetProcessHeap(), 0, (nLen+1)*sizeof(WCHAR) );
2275 TEXTRANGEW tr;
2276
2277 GetWindowTextW(hwndEditor, data, nLen+1);
2279
2281 data = HeapAlloc(GetProcessHeap(), 0, (nLen+1)*sizeof(WCHAR));
2282 tr.chrg.cpMin = 0;
2283 tr.chrg.cpMax = nLen;
2284 tr.lpstrText = data;
2285 SendMessageW(hwndEditor, EM_GETTEXTRANGE, 0, (LPARAM)&tr);
2287 HeapFree( GetProcessHeap(), 0, data );
2288
2289 /* SendMessage(hwndEditor, EM_SETSEL, 0, -1); */
2290 return 0;
2291 }
2292
2293 case ID_EDIT_CHARFORMAT:
2295 {
2297
2298 ZeroMemory(&cf, sizeof(cf));
2299 cf.cbSize = sizeof(cf);
2300 cf.dwMask = 0;
2301 SendMessageW(hwndEditor, EM_GETCHARFORMAT,
2303 return 0;
2304 }
2305
2306 case ID_EDIT_PARAFORMAT:
2307 {
2308 PARAFORMAT2 pf;
2309 ZeroMemory(&pf, sizeof(pf));
2310 pf.cbSize = sizeof(pf);
2311 SendMessageW(hwndEditor, EM_GETPARAFORMAT, 0, (LPARAM)&pf);
2312 return 0;
2313 }
2314
2316 {
2317 CHARRANGE range = {0, -1};
2318 char buf[128];
2319 WCHAR *data = NULL;
2320
2321 SendMessageW(hwndEditor, EM_EXGETSEL, 0, (LPARAM)&range);
2322 data = HeapAlloc(GetProcessHeap(), 0, sizeof(*data) * (range.cpMax-range.cpMin+1));
2323 SendMessageW(hwndEditor, EM_GETSELTEXT, 0, (LPARAM)data);
2324 sprintf(buf, "Start = %d, End = %d", range.cpMin, range.cpMax);
2325 MessageBoxA(hWnd, buf, "Editor", MB_OK);
2328 /* SendMessage(hwndEditor, EM_SETSEL, 0, -1); */
2329 return 0;
2330 }
2331
2332 case ID_EDIT_READONLY:
2333 {
2334 LONG nStyle = GetWindowLongW(hwndEditor, GWL_STYLE);
2335 if (nStyle & ES_READONLY)
2336 SendMessageW(hwndEditor, EM_SETREADONLY, 0, 0);
2337 else
2338 SendMessageW(hwndEditor, EM_SETREADONLY, 1, 0);
2339 return 0;
2340 }
2341
2342 case ID_EDIT_MODIFIED:
2343 if (SendMessageW(hwndEditor, EM_GETMODIFY, 0, 0))
2344 SendMessageW(hwndEditor, EM_SETMODIFY, 0, 0);
2345 else
2346 SendMessageW(hwndEditor, EM_SETMODIFY, 1, 0);
2347 return 0;
2348
2349 case ID_EDIT_UNDO:
2350 SendMessageW(hwndEditor, EM_UNDO, 0, 0);
2351 return 0;
2352
2353 case ID_EDIT_REDO:
2354 SendMessageW(hwndEditor, EM_REDO, 0, 0);
2355 return 0;
2356
2357 case ID_BULLET:
2358 {
2359 PARAFORMAT pf;
2360
2361 pf.cbSize = sizeof(pf);
2362 pf.dwMask = PFM_NUMBERING;
2363 SendMessageW(hwndEditor, EM_GETPARAFORMAT, 0, (LPARAM)&pf);
2364
2365 pf.dwMask |= PFM_OFFSET;
2366
2367 if(pf.wNumbering == PFN_BULLET)
2368 {
2369 pf.wNumbering = 0;
2370 pf.dxOffset = 0;
2371 } else
2372 {
2374 pf.dxOffset = 720;
2375 }
2376
2377 SendMessageW(hwndEditor, EM_SETPARAFORMAT, 0, (LPARAM)&pf);
2378 }
2379 break;
2380
2381 case ID_ALIGN_LEFT:
2382 case ID_ALIGN_CENTER:
2383 case ID_ALIGN_RIGHT:
2384 {
2385 PARAFORMAT2 pf;
2386
2387 pf.cbSize = sizeof(pf);
2388 pf.dwMask = PFM_ALIGNMENT;
2389 switch(LOWORD(wParam)) {
2390 case ID_ALIGN_LEFT: pf.wAlignment = PFA_LEFT; break;
2391 case ID_ALIGN_CENTER: pf.wAlignment = PFA_CENTER; break;
2392 case ID_ALIGN_RIGHT: pf.wAlignment = PFA_RIGHT; break;
2393 }
2394 SendMessageW(hwndEditor, EM_SETPARAFORMAT, 0, (LPARAM)&pf);
2395 break;
2396 }
2397
2398 case ID_BACK_1:
2399 SendMessageW(hwndEditor, EM_SETBKGNDCOLOR, 1, 0);
2400 break;
2401
2402 case ID_BACK_2:
2403 SendMessageW(hwndEditor, EM_SETBKGNDCOLOR, 0, RGB(255,255,192));
2404 break;
2405
2406 case ID_TOGGLE_TOOLBAR:
2408 update_window();
2409 break;
2410
2415 update_window();
2416 break;
2417
2420 update_window();
2421 break;
2422
2423 case ID_TOGGLE_RULER:
2425 update_window();
2426 break;
2427
2428 case ID_DATETIME:
2430 break;
2431
2432 case ID_PARAFORMAT:
2434 break;
2435
2436 case ID_TABSTOPS:
2438 break;
2439
2440 case ID_ABOUT:
2441 dialog_about();
2442 break;
2443
2444 case ID_VIEWPROPERTIES:
2446 break;
2447
2448 case IDC_FONTLIST:
2449 if (HIWORD(wParam) == CBN_SELENDOK)
2450 {
2452 HWND hwndFontList = (HWND)lParam;
2455 }
2456 break;
2457
2458 case IDC_SIZELIST:
2459 if (HIWORD(wParam) == CBN_SELENDOK)
2460 {
2462 HWND hwndSizeList = (HWND)lParam;
2464 on_sizelist_modified(hwndSizeList, buffer);
2465 }
2466 break;
2467
2468 default:
2469 SendMessageW(hwndEditor, WM_COMMAND, wParam, lParam);
2470 break;
2471 }
2472 return 0;
2473}
2474
2476{
2477 HMENU hMenu = (HMENU)wParam;
2478 HWND hwndEditor = GetDlgItem(hWnd, IDC_EDITOR);
2480 PARAFORMAT pf;
2481 int nAlignment = -1;
2482 int selFrom, selTo;
2483 GETTEXTLENGTHEX gt;
2484 LRESULT textLength;
2486
2487 SendMessageW(hEditorWnd, EM_GETSEL, (WPARAM)&selFrom, (LPARAM)&selTo);
2488 EnableMenuItem(hMenu, ID_EDIT_COPY, (selFrom == selTo) ? MF_GRAYED : MF_ENABLED);
2489 EnableMenuItem(hMenu, ID_EDIT_CUT, (selFrom == selTo) ? MF_GRAYED : MF_ENABLED);
2490
2491 pf.cbSize = sizeof(PARAFORMAT);
2492 SendMessageW(hwndEditor, EM_GETPARAFORMAT, 0, (LPARAM)&pf);
2496 SendMessageW(hwndEditor, EM_GETMODIFY, 0, 0) ? MF_CHECKED : MF_UNCHECKED);
2497 if (pf.dwMask & PFM_ALIGNMENT)
2498 nAlignment = pf.wAlignment;
2499 CheckMenuItem(hMenu, ID_ALIGN_LEFT, (nAlignment == PFA_LEFT) ? MF_CHECKED : MF_UNCHECKED);
2500 CheckMenuItem(hMenu, ID_ALIGN_CENTER, (nAlignment == PFA_CENTER) ? MF_CHECKED : MF_UNCHECKED);
2501 CheckMenuItem(hMenu, ID_ALIGN_RIGHT, (nAlignment == PFA_RIGHT) ? MF_CHECKED : MF_UNCHECKED);
2503 EnableMenuItem(hMenu, ID_EDIT_UNDO, SendMessageW(hwndEditor, EM_CANUNDO, 0, 0) ?
2505 EnableMenuItem(hMenu, ID_EDIT_REDO, SendMessageW(hwndEditor, EM_CANREDO, 0, 0) ?
2507
2510
2513
2516
2518
2519 gt.flags = GTL_NUMCHARS;
2520 gt.codepage = 1200;
2521 textLength = SendMessageW(hEditorWnd, EM_GETTEXTLENGTHEX, (WPARAM)&gt, 0);
2522 EnableMenuItem(hMenu, ID_FIND, textLength ? MF_ENABLED : MF_GRAYED);
2523
2524 mi.cbSize = sizeof(mi);
2525 mi.fMask = MIIM_DATA;
2526
2528
2529 EnableMenuItem(hMenu, ID_FIND_NEXT, (textLength && mi.dwItemData) ? MF_ENABLED : MF_GRAYED);
2530
2531 EnableMenuItem(hMenu, ID_REPLACE, textLength ? MF_ENABLED : MF_GRAYED);
2532
2533 return 0;
2534}
2535
2537{
2538 int nStatusSize = 0;
2539 RECT rc;
2541 HWND hwndStatusBar = GetDlgItem(hWnd, IDC_STATUSBAR);
2542 HWND hwndReBar = GetDlgItem(hWnd, IDC_REBAR);
2543 HWND hRulerWnd = GetDlgItem(hwndReBar, IDC_RULER);
2544 int rebarHeight = 0;
2545
2546 if (hwndStatusBar)
2547 {
2548 SendMessageW(hwndStatusBar, WM_SIZE, 0, 0);
2549 if (IsWindowVisible(hwndStatusBar))
2550 {
2551 GetClientRect(hwndStatusBar, &rc);
2552 nStatusSize = rc.bottom - rc.top;
2553 } else
2554 {
2555 nStatusSize = 0;
2556 }
2557 }
2558 if (hwndReBar)
2559 {
2560 rebarHeight = SendMessageW(hwndReBar, RB_GETBARHEIGHT, 0, 0);
2561
2562 MoveWindow(hwndReBar, 0, 0, LOWORD(lParam), rebarHeight, TRUE);
2563 }
2564 if (hwndEditor)
2565 {
2566 GetClientRect(hWnd, &rc);
2567 MoveWindow(hwndEditor, 0, rebarHeight, rc.right, rc.bottom-nStatusSize-rebarHeight, TRUE);
2568 }
2569
2570 redraw_ruler(hRulerWnd);
2571
2573}
2574
2576{
2577 if(msg == ID_FINDMSGSTRING)
2579
2580 switch(msg)
2581 {
2582 case WM_CREATE:
2583 return OnCreate( hWnd );
2584
2585 case WM_USER:
2586 return OnUser( hWnd );
2587
2588 case WM_NOTIFY:
2589 return OnNotify( hWnd, lParam );
2590
2591 case WM_COMMAND:
2592 if(preview_isactive())
2593 {
2594 return preview_command( hWnd, wParam );
2595 }
2596
2597 return OnCommand( hWnd, wParam, lParam );
2598
2599 case WM_DESTROY:
2600 PostQuitMessage(0);
2601 break;
2602
2603 case WM_CLOSE:
2604 if(preview_isactive())
2605 {
2607 } else if(prompt_save_changes())
2608 {
2611 PostQuitMessage(0);
2612 }
2613 break;
2614
2615 case WM_ACTIVATE:
2616 if (LOWORD(wParam))
2618 return 0;
2619
2620 case WM_INITMENUPOPUP:
2621 return OnInitPopupMenu( hWnd, wParam );
2622
2623 case WM_SIZE:
2624 return OnSize( hWnd, wParam, lParam );
2625
2626 case WM_CONTEXTMENU:
2627 return DefWindowProcW(hWnd, msg, wParam, lParam);
2628
2629 case WM_DROPFILES:
2630 {
2632 DragQueryFileW((HDROP)wParam, 0, file, MAX_PATH);
2633 DragFinish((HDROP)wParam);
2634
2637 }
2638 break;
2639 case WM_PAINT:
2640 if(!preview_isactive())
2641 return DefWindowProcW(hWnd, msg, wParam, lParam);
2642
2643 default:
2644 return DefWindowProcW(hWnd, msg, wParam, lParam);
2645 }
2646
2647 return 0;
2648}
2649
2650int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hOldInstance, LPSTR szCmdParagraph, int nCmdShow)
2651{
2653 HACCEL hAccel;
2654 WNDCLASSEXW wc;
2655 MSG msg;
2656 RECT rc;
2657 UINT_PTR hPrevRulerProc;
2658 HWND hRulerWnd;
2659 POINTL EditPoint;
2660 DWORD bMaximized;
2661 static const WCHAR wszAccelTable[] = {'M','A','I','N','A','C','C','E','L',
2662 'T','A','B','L','E','\0'};
2663
2664 InitCommonControlsEx(&classes);
2665
2666 switch (GetUserDefaultUILanguage())
2667 {
2670 break;
2671
2672 default:
2673 break;
2674 }
2675
2676 hAccel = LoadAcceleratorsW(hInstance, wszAccelTable);
2677
2678 wc.cbSize = sizeof(wc);
2679 wc.style = 0;
2680 wc.lpfnWndProc = WndProc;
2681 wc.cbClsExtra = 0;
2682 wc.cbWndExtra = 4;
2683 wc.hInstance = hInstance;
2691 RegisterClassExW(&wc);
2692
2693 wc.style = 0;
2695 wc.cbClsExtra = 0;
2696 wc.cbWndExtra = 0;
2697 wc.hInstance = hInstance;
2698 wc.hIcon = NULL;
2699 wc.hIconSm = NULL;
2701 wc.hbrBackground = NULL;
2702 wc.lpszMenuName = NULL;
2704 RegisterClassExW(&wc);
2705
2708 rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, NULL, NULL, hInstance, NULL);
2709 registry_read_maximized(&bMaximized);
2710 if ((nCmdShow == SW_SHOWNORMAL || nCmdShow == SW_SHOWDEFAULT)
2711 && bMaximized)
2712 nCmdShow = SW_SHOWMAXIMIZED;
2713 ShowWindow(hMainWnd, nCmdShow);
2714
2721
2724 hPrevRulerProc = SetWindowLongPtrW(hRulerWnd, GWLP_WNDPROC, (UINT_PTR)ruler_proc);
2725 SendMessageW(hRulerWnd, WM_USER, (WPARAM)&EditPoint, hPrevRulerProc);
2726
2728
2729 while(GetMessageW(&msg,0,0,0))
2730 {
2732 continue;
2733
2735 continue;
2738 if (!PeekMessageW(&msg, 0, 0, 0, PM_NOREMOVE))
2740 }
2741
2742 return 0;
2743}
static HDC hDC
Definition: 3dtext.c:33
basic_ostream< _CharT, _Traits > &_STLP_CALL endl(basic_ostream< _CharT, _Traits > &__os)
Definition: _ostream.h:357
#define isspace(c)
Definition: acclib.h:69
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
Definition: utclib.c:112
#define read
Definition: acwin.h:96
int fontHeight
Definition: appswitch.c:47
#define msg(x)
Definition: auth_time.c:54
HWND hWnd
Definition: settings.c:17
#define MAX_STRING_LEN
Definition: precomp.h:36
#define IDC_STATUSBAR
Definition: resource.h:12
#define index(s, c)
Definition: various.h:29
#define ID_EDIT_COPY
Definition: resource.h:48
#define ID_FILE_EXIT
Definition: resource.h:46
#define ID_EDIT_PASTE
Definition: resource.h:49
#define ID_FILE_OPEN
Definition: resource.h:41
#define ID_FILE_SAVEAS
Definition: resource.h:43
#define ID_FILE_NEW
Definition: resource.h:40
#define ID_FILE_SAVE
Definition: resource.h:42
#define IDM_MAINMENU
Definition: resources.h:3
void redraw_ruler(HWND hRulerWnd)
Definition: print.c:288
void print_quick(HWND hMainWnd, LPWSTR wszFileName)
Definition: print.c:537
LRESULT CALLBACK ruler_proc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
Definition: print.c:410
void get_default_printer_opts(void)
Definition: print.c:521
void target_device(HWND hMainWnd, DWORD wordWrap)
Definition: print.c:209
void dialog_printsetup(HWND hMainWnd)
Definition: print.c:498
void init_preview(HWND hMainWnd, LPWSTR wszFileName)
Definition: print.c:735
BOOL preview_isactive(void)
Definition: print.c:779
void dialog_print(HWND hMainWnd, LPWSTR wszFileName)
Definition: print.c:549
LRESULT preview_command(HWND hWnd, WPARAM wParam)
Definition: print.c:1203
void close_preview(HWND hMainWnd)
Definition: print.c:751
int reg_formatindex(WPARAM format)
Definition: registry.c:330
void registry_set_filelist(LPCWSTR newFile, HWND hMainWnd)
Definition: registry.c:269
void registry_read_formatopts_all(DWORD barState[], DWORD wordWrap[])
Definition: registry.c:398
void registry_set_formatopts_all(DWORD barState[], DWORD wordWrap[])
Definition: registry.c:419
void registry_read_winrect(RECT *rc)
Definition: registry.c:111
void registry_read_maximized(DWORD *bMaximized)
Definition: registry.c:124
void registry_read_options(void)
Definition: registry.c:335
void registry_set_options(HWND hMainWnd)
Definition: registry.c:83
void registry_read_filelist(HWND hMainWnd)
Definition: registry.c:217
static void dialog_about(void)
Definition: wordpad.c:1007
static void DoOpenFile(LPCWSTR szOpenFileName)
Definition: wordpad.c:764
static void DoLoadStrings(void)
Definition: wordpad.c:97
static BOOL is_bar_visible(int bandId)
Definition: wordpad.c:660
static void set_toolbar_state(int bandId, BOOL show)
Definition: wordpad.c:675
static const WCHAR wszMainWndClass[]
Definition: wordpad.c:53
static BOOL validate_endptr(LPCWSTR endptr, UNIT *punit)
Definition: wordpad.c:256
static void dialog_choose_font(void)
Definition: wordpad.c:566
static HMENU hColorPopupMenu
Definition: wordpad.c:63
static void populate_font_list(HWND hListWnd)
Definition: wordpad.c:631
static void set_statusbar_state(BOOL show)
Definition: wordpad.c:703
static void clear_formatting(void)
Definition: wordpad.c:448
static void ShowOpenError(DWORD Code)
Definition: wordpad.c:748
static LRESULT OnCreate(HWND hWnd)
Definition: wordpad.c:1794
static void number_with_units(LPWSTR buffer, int number)
Definition: wordpad.c:1381
static void update_size_list(void)
Definition: wordpad.c:404
static void set_bar_states(void)
Definition: wordpad.c:711
static int CALLBACK enum_font_proc(const LOGFONTW *lpelfe, const TEXTMETRICW *lpntme, DWORD FontType, LPARAM lParam)
Definition: wordpad.c:615
#define U(x)
Definition: wordpad.c:45
static void append_current_units(LPWSTR buffer)
Definition: wordpad.c:1374
#define U3(x)
Definition: wordpad.c:47
static LRESULT OnSize(HWND hWnd, WPARAM wParam, LPARAM lParam)
Definition: wordpad.c:2536
static INT_PTR CALLBACK newfile_proc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
Definition: wordpad.c:1474
static int fileformat_number(WPARAM format)
Definition: wordpad.c:458
static void update_window(void)
Definition: wordpad.c:651
static WCHAR wszFileName[MAX_PATH]
Definition: wordpad.c:71
static void AddButton(HWND hwndToolBar, int nImage, int nCommand)
Definition: wordpad.c:155
static WCHAR wszDefaultFileName[MAX_STRING_LEN]
Definition: wordpad.c:73
static BOOL prompt_save_changes(void)
Definition: wordpad.c:929
static WCHAR units_ptW[MAX_STRING_LEN]
Definition: wordpad.c:78
static void set_font(LPCWSTR wszFaceName)
Definition: wordpad.c:479
static HWND hFindWnd
Definition: wordpad.c:62
static INT_PTR CALLBACK tabstops_proc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
Definition: wordpad.c:1642
static DWORD wordWrap[2]
Definition: wordpad.c:67
static WCHAR wszFilter[MAX_STRING_LEN *4+6 *3+5]
Definition: wordpad.c:72
static DWORD barState[2]
Definition: wordpad.c:68
static UINT ID_FINDMSGSTRING
Definition: wordpad.c:65
static HWND hMainWnd
Definition: wordpad.c:60
static void preview_exit(HWND hMainWnd)
Definition: wordpad.c:723
#define U2(x)
Definition: wordpad.c:46
static BOOL get_comboexlist_selection(HWND hComboEx, LPWSTR wszBuffer, UINT bufferLength)
Definition: wordpad.c:1389
static HWND hEditorWnd
Definition: wordpad.c:61
static WCHAR units_inchW[MAX_STRING_LEN]
Definition: wordpad.c:77
static WCHAR wszSaveChanges[MAX_STRING_LEN]
Definition: wordpad.c:74
static void set_fileformat(WPARAM format)
Definition: wordpad.c:739
static WPARAM fileFormat
Definition: wordpad.c:69
static INT_PTR CALLBACK datetime_proc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
Definition: wordpad.c:1418
static void dialog_viewproperties(void)
Definition: wordpad.c:1111
int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hOldInstance, LPSTR szCmdParagraph, int nCmdShow)
Definition: wordpad.c:2650
static BOOL number_from_string(LPCWSTR string, float *num, UNIT *punit)
Definition: wordpad.c:295
static void update_font_list(void)
Definition: wordpad.c:424
static LRESULT OnCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
Definition: wordpad.c:2057
static void add_size(HWND hSizeListWnd, unsigned size)
Definition: wordpad.c:353
static void on_sizelist_modified(HWND hwndSizeList, LPWSTR wszNewFontSize)
Definition: wordpad.c:327
static INT_PTR CALLBACK paraformat_proc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
Definition: wordpad.c:1517
const WCHAR wszPreviewWndClass[]
Definition: wordpad.c:57
static void ShowWriteError(DWORD Code)
Definition: wordpad.c:824
static void set_default_font(void)
Definition: wordpad.c:501
static LRESULT OnUser(HWND hWnd)
Definition: wordpad.c:1952
static void dialog_find(LPFINDREPLACEW fr, BOOL replace)
Definition: wordpad.c:1303
static void AddSeparator(HWND hwndToolBar)
Definition: wordpad.c:169
static void store_bar_state(int bandId, BOOL show)
Definition: wordpad.c:665
static LRESULT OnInitPopupMenu(HWND hWnd, WPARAM wParam)
Definition: wordpad.c:2475
static const WCHAR stringFormat[]
Definition: wordpad.c:55
static WCHAR units_inW[MAX_STRING_LEN]
Definition: wordpad.c:76
static void DialogOpenFile(void)
Definition: wordpad.c:982
static DWORD CALLBACK stream_out(DWORD_PTR cookie, LPBYTE buffer, LONG cb, LONG *pcb)
Definition: wordpad.c:196
static void add_font(LPCWSTR fontName, DWORD fontType, HWND hListWnd, const NEWTEXTMETRICEXW *ntmc)
Definition: wordpad.c:536
static BOOL DoSaveFile(LPCWSTR wszSaveFileName, WPARAM format)
Definition: wordpad.c:840
static WPARAM fileformat_flags(int format)
Definition: wordpad.c:472
static LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
Definition: wordpad.c:2575
static void on_fontlist_modified(LPWSTR wszNewFaceName)
Definition: wordpad.c:525
static int MessageBoxWithResStringW(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType)
Definition: wordpad.c:137
static DWORD CALLBACK stream_in(DWORD_PTR cookie, LPBYTE buffer, LONG cb, LONG *pcb)
Definition: wordpad.c:183
static void populate_size_list(HWND hSizeListWnd)
Definition: wordpad.c:365
LPWSTR file_basename(LPWSTR path)
Definition: wordpad.c:212
static const COLORREF textcolors[]
Definition: wordpad.c:2049
static LRESULT handle_findmsg(LPFINDREPLACEW pFr)
Definition: wordpad.c:1210
UNIT
Definition: wordpad.c:83
@ UNIT_PT
Definition: wordpad.c:86
@ UNIT_INCH
Definition: wordpad.c:85
@ UNIT_CM
Definition: wordpad.c:84
static INT_PTR CALLBACK formatopts_proc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
Definition: wordpad.c:1013
static void set_size(float size)
Definition: wordpad.c:316
static int units_to_twips(UNIT unit, float number)
Definition: wordpad.c:1352
LRESULT CALLBACK preview_proc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
Definition: print.c:1016
static LRESULT OnNotify(HWND hWnd, LPARAM lParam)
Definition: wordpad.c:2004
static const WCHAR wszAppTitle[]
Definition: wordpad.c:51
static WCHAR units_cmW[MAX_STRING_LEN]
Definition: wordpad.c:75
static void HandleCommandLine(LPWSTR cmdline)
Definition: wordpad.c:1157
static BOOL DialogSaveFile(void)
Definition: wordpad.c:898
static void set_caption(LPCWSTR wszNewFileName)
Definition: wordpad.c:228
FT_UInt sid
Definition: cffcmap.c:139
HWND hStatusWnd
Definition: charmap.c:22
HINSTANCE hInstance
Definition: charmap.c:19
#define ID_ABOUT
Definition: charmap.c:17
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
BOOL WINAPI InitCommonControlsEx(const INITCOMMONCONTROLSEX *lpInitCtrls)
Definition: commctrl.c:893
HWND WINAPI CreateStatusWindowW(LONG style, LPCWSTR text, HWND parent, UINT wid)
Definition: commctrl.c:795
HWND WINAPI CreateToolbarEx(HWND hwnd, DWORD style, UINT wID, INT nBitmaps, HINSTANCE hBMInst, UINT_PTR wBMID, LPCTBBUTTON lpButtons, INT iNumButtons, INT dxButton, INT dyButton, INT dxBitmap, INT dyBitmap, UINT uStructSize)
Definition: commctrl.c:929
#define FR_WHOLEWORD
Definition: commdlg.h:145
#define OFN_OVERWRITEPROMPT
Definition: commdlg.h:116
#define OFN_EXPLORER
Definition: commdlg.h:104
#define CF_EFFECTS
Definition: commdlg.h:68
#define FR_REPLACE
Definition: commdlg.h:142
#define FR_DIALOGTERM
Definition: commdlg.h:126
#define FR_REPLACEALL
Definition: commdlg.h:143
#define CF_INITTOLOGFONTSTRUCT
Definition: commdlg.h:66
#define CF_NOVERTFONTS
Definition: commdlg.h:86
#define BOLD_FONTTYPE
Definition: commdlg.h:90
#define OFN_HIDEREADONLY
Definition: commdlg.h:107
#define OFN_ENABLESIZING
Definition: commdlg.h:101
#define FINDMSGSTRINGW
Definition: commdlg.h:28
#define OFN_FILEMUSTEXIST
Definition: commdlg.h:106
#define FR_MATCHCASE
Definition: commdlg.h:136
#define CF_NOSCRIPTSEL
Definition: commdlg.h:85
#define OFN_PATHMUSTEXIST
Definition: commdlg.h:117
#define ITALIC_FONTTYPE
Definition: commdlg.h:91
#define FR_DOWN
Definition: commdlg.h:127
#define FR_HIDEUPDOWN
Definition: commdlg.h:132
#define CF_SCREENFONTS
Definition: commdlg.h:59
#define FR_FINDNEXT
Definition: commdlg.h:131
#define LF_FACESIZE
Definition: dimm.idl:39
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
unsigned int idx
Definition: utils.c:41
INT_PTR WINAPI PropertySheetW(LPCPROPSHEETHEADERW lppsh)
Definition: propsheet.c:2905
BOOL WINAPI GetOpenFileNameW(OPENFILENAMEW *ofn)
Definition: filedlg.c:4677
BOOL WINAPI GetSaveFileNameW(LPOPENFILENAMEW ofn)
Definition: filedlg.c:4742
HWND WINAPI FindTextW(LPFINDREPLACEW pfr)
Definition: finddlg.c:492
HWND WINAPI ReplaceTextW(LPFINDREPLACEW pfr)
Definition: finddlg.c:526
BOOL WINAPI ChooseFontW(LPCHOOSEFONTW lpChFont)
Definition: fontdlg.c:184
#define CloseHandle
Definition: compat.h:739
#define GetProcessHeap()
Definition: compat.h:736
#define FILE_BEGIN
Definition: compat.h:761
#define OPEN_EXISTING
Definition: compat.h:775
#define ReadFile(a, b, c, d, e)
Definition: compat.h:742
#define SetFilePointer
Definition: compat.h:743
HANDLE HWND
Definition: compat.h:19
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define HeapAlloc
Definition: compat.h:733
#define GENERIC_READ
Definition: compat.h:135
#define MAX_PATH
Definition: compat.h:34
#define HeapFree(x, y, z)
Definition: compat.h:735
#define CreateFileW
Definition: compat.h:741
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:137
#define CALLBACK
Definition: compat.h:35
#define lstrcpyW
Definition: compat.h:749
#define LoadLibraryW(x)
Definition: compat.h:747
#define ERROR_ACCESS_DENIED
Definition: compat.h:97
#define FILE_SHARE_READ
Definition: compat.h:136
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
#define lstrcpynW
Definition: compat.h:738
#define lstrlenW
Definition: compat.h:750
BOOL WINAPI WriteFile(IN HANDLE hFile, IN LPCVOID lpBuffer, IN DWORD nNumberOfBytesToWrite OPTIONAL, OUT LPDWORD lpNumberOfBytesWritten, IN LPOVERLAPPED lpOverlapped OPTIONAL)
Definition: rw.c:24
HMODULE WINAPI GetModuleHandleW(LPCWSTR lpModuleName)
Definition: loader.c:838
LPWSTR WINAPI GetCommandLineW(VOID)
Definition: proc.c:2013
VOID WINAPI GetLocalTime(OUT LPSYSTEMTIME lpSystemTime)
Definition: time.c:286
const WCHAR * text
Definition: package.c:1799
void WINAPI DragFinish(HDROP h)
Definition: shellole.c:538
UINT WINAPI DragQueryFileW(HDROP hDrop, UINT lFile, LPWSTR lpszwFile, UINT lLength)
Definition: shellole.c:622
void WINAPI DragAcceptFiles(HWND hWnd, BOOL b)
Definition: shellole.c:522
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
Definition: typeof.h:31
static const WCHAR Message[]
Definition: register.c:74
#define assert(x)
Definition: debug.h:53
#define pt(x, y)
Definition: drawing.c:79
#define RGB(r, g, b)
Definition: precomp.h:62
#define wrap(journal, var)
Definition: recovery.c:207
OPENFILENAMEW sfn
Definition: eventvwr.c:101
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
unsigned short WORD
Definition: ntddk_ex.h:93
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLint GLint GLsizei GLsizei GLsizei GLint GLenum format
Definition: gl.h:1546
GLsizeiptr size
Definition: glext.h:5919
GLuint buffer
Definition: glext.h:5915
GLenum const GLvoid GLbitfield fontStyle
Definition: glext.h:11715
GLuint index
Definition: glext.h:6031
GLenum GLint * range
Definition: glext.h:7539
GLenum const GLfloat * params
Definition: glext.h:5645
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLbitfield flags
Definition: glext.h:7161
GLuint GLsizei GLsizei * length
Definition: glext.h:6040
GLfloat GLfloat p
Definition: glext.h:8902
GLuint GLuint num
Definition: glext.h:9618
GLuint64EXT * result
Definition: glext.h:11304
GLenum const GLvoid * fontName
Definition: glext.h:11715
GLuint id
Definition: glext.h:5910
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
OPENFILENAME ofn
Definition: main.cpp:37
#define es
Definition: i386-dis.c:441
#define stderr
Definition: stdio.h:100
_Check_return_opt_ _CRTIMP int __cdecl fprintf(_Inout_ FILE *_File, _In_z_ _Printf_format_string_ const char *_Format,...)
_Check_return_ int __cdecl atoi(_In_z_ const char *_Str)
_Check_return_ double __cdecl wcstod(_In_z_ const wchar_t *_Str, _Out_opt_ _Deref_post_z_ wchar_t **_EndPtr)
LANGID WINAPI GetUserDefaultUILanguage(void)
Definition: lang.c:810
INT WINAPI GetTimeFormatW(LCID lcid, DWORD dwFlags, const SYSTEMTIME *lpTime, LPCWSTR lpFormat, LPWSTR lpTimeStr, INT cchOut)
Definition: lcformat.c:1079
INT WINAPI GetDateFormatW(LCID lcid, DWORD dwFlags, const SYSTEMTIME *lpTime, LPCWSTR lpFormat, LPWSTR lpDateStr, INT cchOut)
Definition: lcformat.c:979
HWND hList
Definition: livecd.c:10
int WINAPI lstrcmpiW(LPCWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:194
LPWSTR WINAPI lstrcatW(LPWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:274
int WINAPI lstrcmpW(LPCWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:170
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define CREATE_ALWAYS
Definition: disk.h:72
HACCEL hAccel
Definition: main.c:47
#define sprintf(buf, format,...)
Definition: sprintf.c:55
HDC hdc
Definition: main.c:9
UCHAR ab[sizeof("Hello World!") -1]
Definition: fdi.c:106
DWORD button
Definition: button.c:166
static HDC
Definition: imagelist.c:92
static HICON
Definition: imagelist.c:84
static unsigned int number
Definition: dsound.c:1479
static HMODULE MODULEINFO DWORD cb
Definition: module.c:33
const char * delimiter
Definition: string.c:1566
static float(__cdecl *square_half_float)(float x
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:60
HWND hTabWnd
Definition: msconfig.c:22
unsigned __int3264 UINT_PTR
Definition: mstsclib_h.h:274
_In_ HANDLE hFile
Definition: mswsock.h:90
INT WINAPI MulDiv(INT nNumber, INT nNumerator, INT nDenominator)
Definition: muldiv.c:25
Definition: mk_font.cpp:20
unsigned int UINT
Definition: ndis.h:50
#define STRING_ALL_FILES
Definition: notepad_res.h:80
#define STRING_TEXT_FILES_TXT
Definition: notepad_res.h:81
#define DWORD
Definition: nt_native.h:44
#define GENERIC_WRITE
Definition: nt_native.h:90
#define LOCALE_USER_DEFAULT
HRESULT setup_richedit_olecallback(HWND hEditorWnd)
Definition: olecallback.c:203
#define LOWORD(l)
Definition: pedump.c:82
#define WS_CHILD
Definition: pedump.c:617
#define WS_OVERLAPPEDWINDOW
Definition: pedump.c:637
#define ES_READONLY
Definition: pedump.c:675
#define ES_AUTOVSCROLL
Definition: pedump.c:671
#define ES_WANTRETURN
Definition: pedump.c:676
#define WS_BORDER
Definition: pedump.c:625
#define ES_NOHIDESEL
Definition: pedump.c:673
#define WS_VSCROLL
Definition: pedump.c:627
#define WS_VISIBLE
Definition: pedump.c:620
long LONG
Definition: pedump.c:60
#define WS_CLIPSIBLINGS
Definition: pedump.c:618
#define WS_HSCROLL
Definition: pedump.c:628
#define WS_CLIPCHILDREN
Definition: pedump.c:619
#define ES_MULTILINE
Definition: pedump.c:667
png_const_structrp png_const_inforp int * unit
Definition: png.h:2159
#define PSP_USETITLE
Definition: prsht.h:26
#define PSN_APPLY
Definition: prsht.h:117
struct _PROPSHEETPAGEW PROPSHEETPAGEW
#define PSH_PROPSHEETPAGE
Definition: prsht.h:43
struct _PROPSHEETPAGEW * LPPROPSHEETPAGEW
#define PSH_USEICONID
Definition: prsht.h:42
const PROPSHEETPAGEW * LPCPROPSHEETPAGEW
Definition: prsht.h:245
#define PSH_NOAPPLYNOW
Definition: prsht.h:47
#define STD_COPY
Definition: commctrl.h:1072
#define RB_SETBANDINFOW
Definition: commctrl.h:1584
#define BTNS_BUTTON
Definition: commctrl.h:998
#define RB_GETBARHEIGHT
Definition: commctrl.h:1608
#define RBBS_BREAK
Definition: commctrl.h:1489
#define REBARBANDINFOW_V6_SIZE
Definition: commctrl.h:1542
#define TB_AUTOSIZE
Definition: commctrl.h:1137
#define STD_PRINT
Definition: commctrl.h:1085
#define STD_FILENEW
Definition: commctrl.h:1077
#define ICC_USEREX_CLASSES
Definition: commctrl.h:68
#define REBARCLASSNAMEW
Definition: commctrl.h:1463
#define RBBIM_CHILDSIZE
Definition: commctrl.h:1507
#define RB_INSERTBANDW
Definition: commctrl.h:1583
#define CBEN_ENDEDITW
Definition: commctrl.h:3876
#define TBSTYLE_TOOLTIPS
Definition: commctrl.h:989
#define BTNS_SEP
Definition: commctrl.h:999
#define CBEM_GETITEMW
Definition: commctrl.h:3843
#define HINST_COMMCTRL
Definition: commctrl.h:1063
#define STD_PASTE
Definition: commctrl.h:1073
#define RBBIM_CHILD
Definition: commctrl.h:1506
#define CBEM_GETCOMBOCONTROL
Definition: commctrl.h:3832
#define TB_CHECKBUTTON
Definition: commctrl.h:1043
#define STD_PRINTPRE
Definition: commctrl.h:1080
#define TB_GETBUTTONSIZE
Definition: commctrl.h:1160
#define WC_COMBOBOXEXW
Definition: commctrl.h:3781
#define CBEIF_TEXT
Definition: commctrl.h:3786
#define STD_FILEOPEN
Definition: commctrl.h:1078
#define RBBS_NOGRIPPER
Definition: commctrl.h:1497
#define RB_GETBANDINFOW
Definition: commctrl.h:1609
#define TB_ENABLEBUTTON
Definition: commctrl.h:1042
#define RBBS_CHILDEDGE
Definition: commctrl.h:1491
#define STD_CUT
Definition: commctrl.h:1071
#define STD_FILESAVE
Definition: commctrl.h:1079
#define RB_SHOWBAND
Definition: commctrl.h:1618
#define CCS_NODIVIDER
Definition: commctrl.h:2248
#define CCS_TOP
Definition: commctrl.h:2242
#define STD_UNDO
Definition: commctrl.h:1074
#define RB_IDTOINDEX
Definition: commctrl.h:1588
#define TB_GETITEMRECT
Definition: commctrl.h:1133
#define STD_REDOW
Definition: commctrl.h:1075
#define TBSTATE_ENABLED
Definition: commctrl.h:974
#define RBBIM_ID
Definition: commctrl.h:1510
#define CBEM_INSERTITEMW
Definition: commctrl.h:3841
#define RBS_VARHEIGHT
Definition: commctrl.h:1471
#define ICC_COOL_CLASSES
Definition: commctrl.h:69
#define CCS_NOPARENTALIGN
Definition: commctrl.h:2246
#define TB_INDETERMINATE
Definition: commctrl.h:1046
#define CBEIF_LPARAM
Definition: commctrl.h:3791
#define TB_ADDBUTTONSW
Definition: commctrl.h:1266
#define CCS_NOMOVEY
Definition: commctrl.h:2243
#define ICC_BAR_CLASSES
Definition: commctrl.h:60
#define RBBIM_STYLE
Definition: commctrl.h:1502
#define RB_SETBARINFO
Definition: commctrl.h:1578
#define RBBIM_SIZE
Definition: commctrl.h:1508
#define STD_FIND
Definition: commctrl.h:1083
#define WC_STATICW
Definition: commctrl.h:4680
#define TB_COMMANDTOINDEX
Definition: commctrl.h:1111
#define TB_ADDBITMAP
Definition: commctrl.h:1056
#define IDB_STD_SMALL_COLOR
Definition: commctrl.h:1064
#define CBEM_GETEDITCONTROL
Definition: commctrl.h:3833
#define sprintfW
Definition: unicode.h:58
INT replace(TCHAR source[MAX_PATH], TCHAR dest[MAX_PATH], DWORD dwFlags, BOOL *doMore)
Definition: replace.c:47
#define MAX_TAB_STOPS
Definition: richedit.h:218
#define EM_CANREDO
Definition: richedit.h:118
#define EM_SCROLLCARET
Definition: richedit.h:81
#define PFA_RIGHT
Definition: richedit.h:922
#define PFA_CENTER
Definition: richedit.h:923
#define EM_REDO
Definition: richedit.h:117
#define PFM_NUMBERING
Definition: richedit.h:843
#define CFM_STRIKEOUT
Definition: richedit.h:335
#define EM_GETSELTEXT
Definition: richedit.h:95
#define ST_DEFAULT
Definition: richedit.h:1070
#define CFE_STRIKEOUT
Definition: richedit.h:409
#define CFE_BOLD
Definition: richedit.h:406
#define PFA_LEFT
Definition: richedit.h:921
#define CFE_AUTOCOLOR
Definition: richedit.h:414
#define EM_STREAMIN
Definition: richedit.h:106
#define EM_SETEVENTMASK
Definition: richedit.h:102
#define GTL_DEFAULT
Definition: richedit.h:1054
static const WCHAR RICHEDIT_CLASS20W[]
Definition: richedit.h:50
#define SF_RTF
Definition: richedit.h:721
#define CFE_ITALIC
Definition: richedit.h:407
#define SCF_SELECTION
Definition: richedit.h:235
#define PFM_OFFSET
Definition: richedit.h:840
#define EM_SETBKGNDCOLOR
Definition: richedit.h:100
#define EM_SETTEXTEX
Definition: richedit.h:131
#define EM_POSFROMCHAR
Definition: richedit.h:77
#define SCF_DEFAULT
Definition: richedit.h:234
#define EM_GETCHARFORMAT
Definition: richedit.h:91
#define EN_SELCHANGE
Definition: richedit.h:193
#define GTL_NUMCHARS
Definition: richedit.h:1058
#define EM_SETCHARFORMAT
Definition: richedit.h:101
#define WM_CONTEXTMENU
Definition: richedit.h:64
#define ENM_SELCHANGE
Definition: richedit.h:478
#define EM_GETPARAFORMAT
Definition: richedit.h:94
#define PFM_RIGHTINDENT
Definition: richedit.h:839
#define CFE_UNDERLINE
Definition: richedit.h:408
#define PFN_BULLET
Definition: richedit.h:905
#define CFM_ITALIC
Definition: richedit.h:333
#define EM_GETTEXTRANGE
Definition: richedit.h:108
#define CFM_SIZE
Definition: richedit.h:362
#define EM_FINDTEXTW
Definition: richedit.h:147
#define EM_EXSETSEL
Definition: richedit.h:88
#define GT_SELECTION
Definition: richedit.h:1038
#define PFM_ALIGNMENT
Definition: richedit.h:841
#define SF_TEXT
Definition: richedit.h:720
#define PFM_TABSTOPS
Definition: richedit.h:842
#define EM_GETTEXTLENGTHEX
Definition: richedit.h:129
#define SF_UNICODE
Definition: richedit.h:724
#define CFM_BOLD
Definition: richedit.h:332
#define ES_SELECTIONBAR
Definition: richedit.h:230
#define CFM_FACE
Definition: richedit.h:360
#define WM_NOTIFY
Definition: richedit.h:61
#define EM_GETTEXTEX
Definition: richedit.h:128
#define EM_SETPARAFORMAT
Definition: richedit.h:104
#define CFM_UNDERLINE
Definition: richedit.h:334
#define CFM_COLOR
Definition: richedit.h:361
#define EM_FINDTEXTEXW
Definition: richedit.h:148
#define PFM_STARTINDENT
Definition: richedit.h:838
#define EM_EXGETSEL
Definition: richedit.h:85
struct _paraformat PARAFORMAT
#define EM_STREAMOUT
Definition: richedit.h:107
#define errno
Definition: errno.h:18
#define MAKELANGID(p, s)
Definition: nls.h:15
#define LANG_HEBREW
Definition: nls.h:67
#define SUBLANG_DEFAULT
Definition: nls.h:168
BOOL WINAPI ShellAboutW(HWND hWnd, LPCWSTR szApp, LPCWSTR szOtherStuff, HICON hIcon)
void WINAPI SHAddToRecentDocs(UINT uFlags, LPCVOID pv)
Definition: shellord.c:809
#define SHARD_PATHW
Definition: shlobj.h:1103
HWND hwndStatus
Definition: solitaire.cpp:13
CardRegion * from
Definition: spigame.cpp:19
& rect
Definition: startmenu.cpp:1413
TCHAR * cmdline
Definition: stretchblt.cpp:32
DWORD Flags
Definition: commdlg.h:319
HWND hwndOwner
Definition: commdlg.h:317
WORD wReplaceWithLen
Definition: commdlg.h:323
WORD wFindWhatLen
Definition: commdlg.h:322
LPWSTR lpstrReplaceWith
Definition: commdlg.h:321
DWORD lStructSize
Definition: commdlg.h:316
LPWSTR lpstrFindWhat
Definition: commdlg.h:320
LPARAM lCustData
Definition: commdlg.h:324
WCHAR findBuffer[128]
Definition: wordpad.c:93
WCHAR lfFaceName[LF_FACESIZE]
Definition: dimm.idl:72
BYTE lfCharSet
Definition: dimm.idl:67
BYTE lfPitchAndFamily
Definition: dimm.idl:71
WCHAR szText[CBEMAXSTRLEN]
Definition: commctrl.h:3914
HINSTANCE hInstance
Definition: prsht.h:296
DWORD dwSize
Definition: prsht.h:293
DWORD dwFlags
Definition: prsht.h:294
HWND hwndParent
Definition: prsht.h:295
LPCWSTR pszCaption
Definition: prsht.h:301
DLGPROC pfnDlgProc
Definition: prsht.h:226
DWORD dwSize
Definition: prsht.h:214
DWORD dwFlags
Definition: prsht.h:215
LPARAM lParam
Definition: prsht.h:227
LPCWSTR pszTitle
Definition: prsht.h:225
HINSTANCE hInstance
Definition: prsht.h:216
LPCWSTR lpszClassName
Definition: winuser.h:3216
LPCWSTR lpszMenuName
Definition: winuser.h:3215
HBRUSH hbrBackground
Definition: winuser.h:3214
WNDPROC lpfnWndProc
Definition: winuser.h:3208
UINT cbSize
Definition: winuser.h:3206
int cbWndExtra
Definition: winuser.h:3210
HCURSOR hCursor
Definition: winuser.h:3213
HICON hIconSm
Definition: winuser.h:3217
HINSTANCE hInstance
Definition: winuser.h:3211
UINT style
Definition: winuser.h:3207
int cbClsExtra
Definition: winuser.h:3209
HICON hIcon
Definition: winuser.h:3212
LONG cpMax
Definition: richedit.h:501
LONG cpMin
Definition: richedit.h:500
CHARRANGE chrg
Definition: richedit.h:586
LPCWSTR lpstrText
Definition: richedit.h:587
WORD wAlignment
Definition: richedit.h:673
LONG dxRightIndent
Definition: richedit.h:671
DWORD dwMask
Definition: richedit.h:667
LONG dxOffset
Definition: richedit.h:672
UINT cbSize
Definition: richedit.h:666
WORD wNumbering
Definition: richedit.h:668
LONG dxStartIndent
Definition: richedit.h:670
DWORD dwMask
Definition: richedit.h:654
LONG dxOffset
Definition: richedit.h:659
WORD wAlignment
Definition: richedit.h:660
LONG dxRightIndent
Definition: richedit.h:658
UINT cbSize
Definition: richedit.h:653
LONG dxStartIndent
Definition: richedit.h:657
SHORT cTabCount
Definition: richedit.h:661
WORD wNumbering
Definition: richedit.h:655
LONG rgxTabs[MAX_TAB_STOPS]
Definition: richedit.h:662
CHARRANGE chrg
Definition: richedit.h:686
UINT codepage
Definition: richedit.h:1066
DWORD flags
Definition: richedit.h:1065
CHARRANGE chrg
Definition: richedit.h:514
LPWSTR lpstrText
Definition: richedit.h:515
Definition: cookie.c:34
Definition: fci.c:127
Definition: dsound.c:943
Definition: tftpd.h:60
Definition: parse.h:23
DWORD cbSize
Definition: winuser.h:3774
NEWTEXTMETRICW ntmTm
Definition: wingdi.h:2675
LONG tmInternalLeading
Definition: wingdi.h:2647
UINT code
Definition: winuser.h:3149
HWND hwndFrom
Definition: winuser.h:3147