2 * Wordpad implementation
4 * Copyright 2004 by Krzysztof Foltman
5 * Copyright 2007-2008 by Alexander N. Sørnes <alex@thehandofagony.com>
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
22 #define WIN32_LEAN_AND_MEAN
23 #define _WIN32_IE 0x0400
35 #include <wine/unicode.h>
39 #ifdef NONAMELESSUNION
50 static const WCHAR wszAppTitle
[] = {'W','i','n','e',' ','W','o','r','d','p','a','d',0};
52 static const WCHAR wszMainWndClass
[] = {'W','O','R','D','P','A','D','T','O','P',0};
54 static const WCHAR stringFormat
[] = {'%','2','d','\0'};
56 const WCHAR wszPreviewWndClass
[] = {'P','r','t','P','r','e','v','i','e','w',0};
57 LRESULT CALLBACK
preview_proc(HWND hWnd
, UINT msg
, WPARAM wParam
, LPARAM lParam
);
60 static HWND hEditorWnd
;
62 static HMENU hColorPopupMenu
;
64 static UINT ID_FINDMSGSTRING
;
66 static DWORD wordWrap
[2];
67 static DWORD barState
[2];
68 static WPARAM fileFormat
= SF_RTF
;
70 static WCHAR wszFileName
[MAX_PATH
];
71 static WCHAR wszFilter
[MAX_STRING_LEN
*4+6*3+5];
72 static WCHAR wszDefaultFileName
[MAX_STRING_LEN
];
73 static WCHAR wszSaveChanges
[MAX_STRING_LEN
];
74 static WCHAR units_cmW
[MAX_STRING_LEN
];
75 static WCHAR units_inW
[MAX_STRING_LEN
];
76 static WCHAR units_inchW
[MAX_STRING_LEN
];
77 static WCHAR units_ptW
[MAX_STRING_LEN
];
79 static LRESULT
OnSize( HWND hWnd
, WPARAM wParam
, LPARAM lParam
);
92 WCHAR findBuffer
[128];
95 /* Load string resources */
96 static void DoLoadStrings(void)
99 static const WCHAR files_rtf
[] = {'*','.','r','t','f','\0'};
100 static const WCHAR files_txt
[] = {'*','.','t','x','t','\0'};
101 static const WCHAR files_all
[] = {'*','.','*','\0'};
103 HINSTANCE hInstance
= GetModuleHandleW(0);
105 LoadStringW(hInstance
, STRING_RICHTEXT_FILES_RTF
, p
, MAX_STRING_LEN
);
106 p
+= lstrlenW(p
) + 1;
107 lstrcpyW(p
, files_rtf
);
108 p
+= lstrlenW(p
) + 1;
109 LoadStringW(hInstance
, STRING_TEXT_FILES_TXT
, p
, MAX_STRING_LEN
);
110 p
+= lstrlenW(p
) + 1;
111 lstrcpyW(p
, files_txt
);
112 p
+= lstrlenW(p
) + 1;
113 LoadStringW(hInstance
, STRING_TEXT_FILES_UNICODE_TXT
, p
, MAX_STRING_LEN
);
114 p
+= lstrlenW(p
) + 1;
115 lstrcpyW(p
, files_txt
);
116 p
+= lstrlenW(p
) + 1;
117 LoadStringW(hInstance
, STRING_ALL_FILES
, p
, MAX_STRING_LEN
);
118 p
+= lstrlenW(p
) + 1;
119 lstrcpyW(p
, files_all
);
120 p
+= lstrlenW(p
) + 1;
123 p
= wszDefaultFileName
;
124 LoadStringW(hInstance
, STRING_DEFAULT_FILENAME
, p
, MAX_STRING_LEN
);
127 LoadStringW(hInstance
, STRING_PROMPT_SAVE_CHANGES
, p
, MAX_STRING_LEN
);
129 LoadStringW(hInstance
, STRING_UNITS_CM
, units_cmW
, MAX_STRING_LEN
);
130 LoadStringW(hInstance
, STRING_UNITS_IN
, units_inW
, MAX_STRING_LEN
);
131 LoadStringW(hInstance
, STRING_UNITS_INCH
, units_inchW
, MAX_STRING_LEN
);
132 LoadStringW(hInstance
, STRING_UNITS_PT
, units_ptW
, MAX_STRING_LEN
);
135 /* Show a message box with resource strings */
136 static int MessageBoxWithResStringW(HWND hWnd
, LPCWSTR lpText
, LPCWSTR lpCaption
, UINT uType
)
138 MSGBOXPARAMSW params
;
140 params
.cbSize
= sizeof(params
);
141 params
.hwndOwner
= hWnd
;
142 params
.hInstance
= GetModuleHandleW(0);
143 params
.lpszText
= lpText
;
144 params
.lpszCaption
= lpCaption
;
145 params
.dwStyle
= uType
;
146 params
.lpszIcon
= NULL
;
147 params
.dwContextHelpId
= 0;
148 params
.lpfnMsgBoxCallback
= NULL
;
149 params
.dwLanguageId
= 0;
150 return MessageBoxIndirectW(¶ms
);
154 static void AddButton(HWND hwndToolBar
, int nImage
, int nCommand
)
158 ZeroMemory(&button
, sizeof(button
));
159 button
.iBitmap
= nImage
;
160 button
.idCommand
= nCommand
;
161 button
.fsState
= TBSTATE_ENABLED
;
162 button
.fsStyle
= BTNS_BUTTON
;
165 SendMessageW(hwndToolBar
, TB_ADDBUTTONSW
, 1, (LPARAM
)&button
);
168 static void AddSeparator(HWND hwndToolBar
)
172 ZeroMemory(&button
, sizeof(button
));
174 button
.idCommand
= 0;
176 button
.fsStyle
= BTNS_SEP
;
179 SendMessageW(hwndToolBar
, TB_ADDBUTTONSW
, 1, (LPARAM
)&button
);
182 static DWORD CALLBACK
stream_in(DWORD_PTR cookie
, LPBYTE buffer
, LONG cb
, LONG
*pcb
)
184 HANDLE hFile
= (HANDLE
)cookie
;
187 if(!ReadFile(hFile
, buffer
, cb
, &read
, 0))
195 static DWORD CALLBACK
stream_out(DWORD_PTR cookie
, LPBYTE buffer
, LONG cb
, LONG
*pcb
)
199 HANDLE hFile
= (HANDLE
)cookie
;
201 ret
= WriteFile(hFile
, buffer
, cb
, &written
, 0);
203 if(!ret
|| (cb
!= written
))
211 LPWSTR
file_basename(LPWSTR path
)
213 LPWSTR pos
= path
+ lstrlenW(path
);
217 if(*pos
== '\\' || *pos
== '/')
227 static void set_caption(LPCWSTR wszNewFileName
)
229 static const WCHAR wszSeparator
[] = {' ','-',' '};
234 wszNewFileName
= wszDefaultFileName
;
236 wszNewFileName
= file_basename((LPWSTR
)wszNewFileName
);
238 wszCaption
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
,
239 lstrlenW(wszNewFileName
)*sizeof(WCHAR
)+sizeof(wszSeparator
)+sizeof(wszAppTitle
));
244 memcpy(wszCaption
, wszNewFileName
, lstrlenW(wszNewFileName
)*sizeof(WCHAR
));
245 length
+= lstrlenW(wszNewFileName
);
246 memcpy(wszCaption
+ length
, wszSeparator
, sizeof(wszSeparator
));
247 length
+= sizeof(wszSeparator
) / sizeof(WCHAR
);
248 memcpy(wszCaption
+ length
, wszAppTitle
, sizeof(wszAppTitle
));
250 SetWindowTextW(hMainWnd
, wszCaption
);
252 HeapFree(GetProcessHeap(), 0, wszCaption
);
255 static BOOL
validate_endptr(LPCWSTR endptr
, UNIT
*punit
)
264 while(*endptr
== ' ')
268 return *endptr
== '\0';
270 if(!lstrcmpW(endptr
, units_cmW
))
273 endptr
+= lstrlenW(units_cmW
);
275 else if (!lstrcmpW(endptr
, units_inW
))
278 endptr
+= lstrlenW(units_inW
);
280 else if (!lstrcmpW(endptr
, units_inchW
))
283 endptr
+= lstrlenW(units_inchW
);
285 else if (!lstrcmpW(endptr
, units_ptW
))
288 endptr
+= lstrlenW(units_ptW
);
291 return *endptr
== '\0';
294 static BOOL
number_from_string(LPCWSTR string
, float *num
, UNIT
*punit
)
301 ret
= wcstod(string
, &endptr
);
305 if((ret
== 0 && errno
!= 0) || endptr
== string
|| !validate_endptr(endptr
, punit
))
315 static void set_size(float size
)
319 ZeroMemory(&fmt
, sizeof(fmt
));
320 fmt
.cbSize
= sizeof(fmt
);
321 fmt
.dwMask
= CFM_SIZE
;
322 fmt
.yHeight
= (int)(size
* 20.0);
323 SendMessageW(hEditorWnd
, EM_SETCHARFORMAT
, SCF_SELECTION
, (LPARAM
)&fmt
);
326 static void on_sizelist_modified(HWND hwndSizeList
, LPWSTR wszNewFontSize
)
328 WCHAR sizeBuffer
[MAX_STRING_LEN
];
331 ZeroMemory(&format
, sizeof(format
));
332 format
.cbSize
= sizeof(format
);
333 SendMessageW(hEditorWnd
, EM_GETCHARFORMAT
, SCF_SELECTION
, (LPARAM
)&format
);
335 wsprintfW(sizeBuffer
, stringFormat
, format
.yHeight
/ 20);
336 if(lstrcmpW(sizeBuffer
, wszNewFontSize
))
339 if(number_from_string(wszNewFontSize
, &size
, NULL
)
345 SetWindowTextW(hwndSizeList
, sizeBuffer
);
346 MessageBoxWithResStringW(hMainWnd
, MAKEINTRESOURCEW(STRING_INVALID_NUMBER
),
347 wszAppTitle
, MB_OK
| MB_ICONINFORMATION
);
352 static void add_size(HWND hSizeListWnd
, unsigned size
)
355 COMBOBOXEXITEMW cbItem
;
356 cbItem
.mask
= CBEIF_TEXT
;
359 wsprintfW(buffer
, stringFormat
, size
);
360 cbItem
.pszText
= buffer
;
361 SendMessageW(hSizeListWnd
, CBEM_INSERTITEMW
, 0, (LPARAM
)&cbItem
);
364 static void populate_size_list(HWND hSizeListWnd
)
366 HWND hReBarWnd
= GetDlgItem(hMainWnd
, IDC_REBAR
);
367 HWND hFontListWnd
= GetDlgItem(hReBarWnd
, IDC_FONTLIST
);
368 COMBOBOXEXITEMW cbFontItem
;
370 HWND hListEditWnd
= (HWND
)SendMessageW(hSizeListWnd
, CBEM_GETEDITCONTROL
, 0, 0);
371 HDC hdc
= GetDC(hMainWnd
);
372 static const unsigned choices
[] = {8,9,10,11,12,14,16,18,20,22,24,26,28,36,48,72};
377 ZeroMemory(&fmt
, sizeof(fmt
));
378 fmt
.cbSize
= sizeof(fmt
);
379 SendMessageW(hEditorWnd
, EM_GETCHARFORMAT
, SCF_SELECTION
, (LPARAM
)&fmt
);
381 cbFontItem
.mask
= CBEIF_LPARAM
;
382 cbFontItem
.iItem
= SendMessageW(hFontListWnd
, CB_FINDSTRINGEXACT
, -1, (LPARAM
)fmt
.szFaceName
);
383 SendMessageW(hFontListWnd
, CBEM_GETITEMW
, 0, (LPARAM
)&cbFontItem
);
385 fontStyle
= (DWORD
)LOWORD(cbFontItem
.lParam
);
387 SendMessageW(hSizeListWnd
, CB_RESETCONTENT
, 0, 0);
389 if((fontStyle
& RASTER_FONTTYPE
) && cbFontItem
.iItem
)
391 add_size(hSizeListWnd
, (BYTE
)MulDiv(HIWORD(cbFontItem
.lParam
), 72,
392 GetDeviceCaps(hdc
, LOGPIXELSY
)));
395 for(i
= 0; i
< sizeof(choices
)/sizeof(choices
[0]); i
++)
396 add_size(hSizeListWnd
, choices
[i
]);
399 wsprintfW(buffer
, stringFormat
, fmt
.yHeight
/ 20);
400 SendMessageW(hListEditWnd
, WM_SETTEXT
, 0, (LPARAM
)buffer
);
403 static void update_size_list(void)
405 HWND hReBar
= GetDlgItem(hMainWnd
, IDC_REBAR
);
406 HWND hwndSizeList
= GetDlgItem(hReBar
, IDC_SIZELIST
);
407 HWND hwndSizeListEdit
= (HWND
)SendMessageW(hwndSizeList
, CBEM_GETEDITCONTROL
, 0, 0);
408 WCHAR fontSize
[MAX_STRING_LEN
], sizeBuffer
[MAX_STRING_LEN
];
411 ZeroMemory(&fmt
, sizeof(fmt
));
412 fmt
.cbSize
= sizeof(fmt
);
414 SendMessageW(hEditorWnd
, EM_GETCHARFORMAT
, SCF_SELECTION
, (LPARAM
)&fmt
);
416 SendMessageW(hwndSizeListEdit
, WM_GETTEXT
, MAX_PATH
, (LPARAM
)fontSize
);
417 wsprintfW(sizeBuffer
, stringFormat
, fmt
.yHeight
/ 20);
419 if(lstrcmpW(fontSize
, sizeBuffer
))
420 SendMessageW(hwndSizeListEdit
, WM_SETTEXT
, 0, (LPARAM
)sizeBuffer
);
423 static void update_font_list(void)
425 HWND hReBar
= GetDlgItem(hMainWnd
, IDC_REBAR
);
426 HWND hFontList
= GetDlgItem(hReBar
, IDC_FONTLIST
);
427 HWND hFontListEdit
= (HWND
)SendMessageW(hFontList
, CBEM_GETEDITCONTROL
, 0, 0);
428 WCHAR fontName
[MAX_STRING_LEN
];
431 ZeroMemory(&fmt
, sizeof(fmt
));
432 fmt
.cbSize
= sizeof(fmt
);
434 SendMessageW(hEditorWnd
, EM_GETCHARFORMAT
, SCF_SELECTION
, (LPARAM
)&fmt
);
435 if (!SendMessageW(hFontListEdit
, WM_GETTEXT
, MAX_PATH
, (LPARAM
)fontName
)) return;
437 if(lstrcmpW(fontName
, fmt
.szFaceName
))
439 SendMessageW(hFontListEdit
, WM_SETTEXT
, 0, (LPARAM
)fmt
.szFaceName
);
440 populate_size_list(GetDlgItem(hReBar
, IDC_SIZELIST
));
447 static void clear_formatting(void)
451 pf
.cbSize
= sizeof(pf
);
452 pf
.dwMask
= PFM_ALIGNMENT
;
453 pf
.wAlignment
= PFA_LEFT
;
454 SendMessageW(hEditorWnd
, EM_SETPARAFORMAT
, 0, (LPARAM
)&pf
);
457 static int fileformat_number(WPARAM format
)
461 if(format
== SF_TEXT
)
464 } else if (format
== (SF_TEXT
| SF_UNICODE
))
471 static WPARAM
fileformat_flags(int format
)
473 WPARAM flags
[] = { SF_RTF
, SF_TEXT
, SF_TEXT
| SF_UNICODE
};
475 return flags
[format
];
478 static void set_font(LPCWSTR wszFaceName
)
480 HWND hReBarWnd
= GetDlgItem(hMainWnd
, IDC_REBAR
);
481 HWND hSizeListWnd
= GetDlgItem(hReBarWnd
, IDC_SIZELIST
);
482 HWND hFontListWnd
= GetDlgItem(hReBarWnd
, IDC_FONTLIST
);
483 HWND hFontListEditWnd
= (HWND
)SendMessageW(hFontListWnd
, CBEM_GETEDITCONTROL
, 0, 0);
486 ZeroMemory(&fmt
, sizeof(fmt
));
488 fmt
.cbSize
= sizeof(fmt
);
489 fmt
.dwMask
= CFM_FACE
;
491 lstrcpyW(fmt
.szFaceName
, wszFaceName
);
493 SendMessageW(hEditorWnd
, EM_SETCHARFORMAT
, SCF_SELECTION
, (LPARAM
)&fmt
);
495 populate_size_list(hSizeListWnd
);
497 SendMessageW(hFontListEditWnd
, WM_SETTEXT
, 0, (LPARAM
)wszFaceName
);
500 static void set_default_font(void)
502 static const WCHAR richTextFont
[] = {'T','i','m','e','s',' ','N','e','w',' ',
503 'R','o','m','a','n',0};
504 static const WCHAR plainTextFont
[] = {'C','o','u','r','i','e','r',' ','N','e','w',0};
508 ZeroMemory(&fmt
, sizeof(fmt
));
510 fmt
.cbSize
= sizeof(fmt
);
511 fmt
.dwMask
= CFM_FACE
| CFM_BOLD
| CFM_ITALIC
| CFM_UNDERLINE
;
514 if(fileFormat
& SF_RTF
)
517 font
= plainTextFont
;
519 lstrcpyW(fmt
.szFaceName
, font
);
521 SendMessageW(hEditorWnd
, EM_SETCHARFORMAT
, SCF_DEFAULT
, (LPARAM
)&fmt
);
524 static void on_fontlist_modified(LPWSTR wszNewFaceName
)
527 ZeroMemory(&format
, sizeof(format
));
528 format
.cbSize
= sizeof(format
);
529 SendMessageW(hEditorWnd
, EM_GETCHARFORMAT
, SCF_SELECTION
, (LPARAM
)&format
);
531 if(lstrcmpW(format
.szFaceName
, wszNewFaceName
))
532 set_font(wszNewFaceName
);
535 static void add_font(LPCWSTR fontName
, DWORD fontType
, HWND hListWnd
, const NEWTEXTMETRICEXW
*ntmc
)
537 COMBOBOXEXITEMW cbItem
;
538 WCHAR buffer
[MAX_PATH
];
541 cbItem
.mask
= CBEIF_TEXT
;
542 cbItem
.pszText
= buffer
;
543 cbItem
.cchTextMax
= MAX_STRING_LEN
;
546 while(SendMessageW(hListWnd
, CBEM_GETITEMW
, 0, (LPARAM
)&cbItem
))
548 if(lstrcmpiW(cbItem
.pszText
, fontName
) <= 0)
553 cbItem
.pszText
= HeapAlloc( GetProcessHeap(), 0, (lstrlenW(fontName
) + 1)*sizeof(WCHAR
) );
554 lstrcpyW( cbItem
.pszText
, fontName
);
556 cbItem
.mask
|= CBEIF_LPARAM
;
557 if(fontType
& RASTER_FONTTYPE
)
558 fontHeight
= ntmc
->ntmTm
.tmHeight
- ntmc
->ntmTm
.tmInternalLeading
;
560 cbItem
.lParam
= MAKELONG(fontType
,fontHeight
);
561 SendMessageW(hListWnd
, CBEM_INSERTITEMW
, 0, (LPARAM
)&cbItem
);
562 HeapFree( GetProcessHeap(), 0, cbItem
.pszText
);
565 static void dialog_choose_font(void)
570 HDC hDC
= GetDC(hMainWnd
);
572 ZeroMemory(&cf
, sizeof(cf
));
573 cf
.lStructSize
= sizeof(cf
);
574 cf
.hwndOwner
= hMainWnd
;
576 cf
.Flags
= CF_SCREENFONTS
| CF_NOSCRIPTSEL
| CF_INITTOLOGFONTSTRUCT
| CF_EFFECTS
;
578 ZeroMemory(&fmt
, sizeof(fmt
));
579 fmt
.cbSize
= sizeof(fmt
);
581 SendMessageW(hEditorWnd
, EM_GETCHARFORMAT
, SCF_SELECTION
, (LPARAM
)&fmt
);
582 lstrcpyW(cf
.lpLogFont
->lfFaceName
, fmt
.szFaceName
);
583 cf
.lpLogFont
->lfItalic
= (fmt
.dwEffects
& CFE_ITALIC
) ? TRUE
: FALSE
;
584 cf
.lpLogFont
->lfWeight
= (fmt
.dwEffects
& CFE_BOLD
) ? FW_BOLD
: FW_NORMAL
;
585 cf
.lpLogFont
->lfUnderline
= (fmt
.dwEffects
& CFE_UNDERLINE
) ? TRUE
: FALSE
;
586 cf
.lpLogFont
->lfStrikeOut
= (fmt
.dwEffects
& CFE_STRIKEOUT
) ? TRUE
: FALSE
;
587 cf
.lpLogFont
->lfHeight
= -MulDiv(fmt
.yHeight
/ 20, GetDeviceCaps(hDC
, LOGPIXELSY
), 72);
588 cf
.rgbColors
= fmt
.crTextColor
;
592 ZeroMemory(&fmt
, sizeof(fmt
));
593 fmt
.cbSize
= sizeof(fmt
);
594 fmt
.dwMask
= CFM_BOLD
| CFM_ITALIC
| CFM_SIZE
| CFM_UNDERLINE
| CFM_STRIKEOUT
| CFM_COLOR
;
595 fmt
.yHeight
= cf
.iPointSize
* 2;
597 if(cf
.nFontType
& BOLD_FONTTYPE
)
598 fmt
.dwEffects
|= CFE_BOLD
;
599 if(cf
.nFontType
& ITALIC_FONTTYPE
)
600 fmt
.dwEffects
|= CFE_ITALIC
;
601 if(cf
.lpLogFont
->lfUnderline
== TRUE
)
602 fmt
.dwEffects
|= CFE_UNDERLINE
;
603 if(cf
.lpLogFont
->lfStrikeOut
== TRUE
)
604 fmt
.dwEffects
|= CFE_STRIKEOUT
;
606 fmt
.crTextColor
= cf
.rgbColors
;
608 SendMessageW(hEditorWnd
, EM_SETCHARFORMAT
, SCF_SELECTION
, (LPARAM
)&fmt
);
609 set_font(cf
.lpLogFont
->lfFaceName
);
614 static int CALLBACK
enum_font_proc(const LOGFONTW
*lpelfe
, const TEXTMETRICW
*lpntme
,
615 DWORD FontType
, LPARAM lParam
)
617 HWND hListWnd
= (HWND
) lParam
;
619 if(SendMessageW(hListWnd
, CB_FINDSTRINGEXACT
, -1, (LPARAM
)lpelfe
->lfFaceName
) == CB_ERR
)
622 add_font(lpelfe
->lfFaceName
, FontType
, hListWnd
, (const NEWTEXTMETRICEXW
*)lpntme
);
628 static void populate_font_list(HWND hListWnd
)
630 HDC hdc
= GetDC(hMainWnd
);
632 HWND hListEditWnd
= (HWND
)SendMessageW(hListWnd
, CBEM_GETEDITCONTROL
, 0, 0);
635 fontinfo
.lfCharSet
= DEFAULT_CHARSET
;
636 *fontinfo
.lfFaceName
= '\0';
637 fontinfo
.lfPitchAndFamily
= 0;
639 EnumFontFamiliesExW(hdc
, &fontinfo
, enum_font_proc
,
640 (LPARAM
)hListWnd
, 0);
642 ZeroMemory(&fmt
, sizeof(fmt
));
643 fmt
.cbSize
= sizeof(fmt
);
644 SendMessageW(hEditorWnd
, EM_GETCHARFORMAT
, SCF_DEFAULT
, (LPARAM
)&fmt
);
645 SendMessageW(hListEditWnd
, WM_SETTEXT
, 0, (LPARAM
)fmt
.szFaceName
);
648 static void update_window(void)
652 GetClientRect(hMainWnd
, &rect
);
654 OnSize(hMainWnd
, SIZE_RESTORED
, MAKELPARAM(rect
.right
, rect
.bottom
));
657 static BOOL
is_bar_visible(int bandId
)
659 return barState
[reg_formatindex(fileFormat
)] & (1 << bandId
);
662 static void store_bar_state(int bandId
, BOOL show
)
664 int formatIndex
= reg_formatindex(fileFormat
);
667 barState
[formatIndex
] |= (1 << bandId
);
669 barState
[formatIndex
] &= ~(1 << bandId
);
672 static void set_toolbar_state(int bandId
, BOOL show
)
674 HWND hwndReBar
= GetDlgItem(hMainWnd
, IDC_REBAR
);
676 SendMessageW(hwndReBar
, RB_SHOWBAND
, SendMessageW(hwndReBar
, RB_IDTOINDEX
, bandId
, 0), show
);
678 if(bandId
== BANDID_TOOLBAR
)
680 REBARBANDINFOW rbbinfo
;
681 int index
= SendMessageW(hwndReBar
, RB_IDTOINDEX
, BANDID_FONTLIST
, 0);
683 rbbinfo
.cbSize
= REBARBANDINFOW_V6_SIZE
;
684 rbbinfo
.fMask
= RBBIM_STYLE
;
686 SendMessageW(hwndReBar
, RB_GETBANDINFO
, index
, (LPARAM
)&rbbinfo
);
689 rbbinfo
.fStyle
&= ~RBBS_BREAK
;
691 rbbinfo
.fStyle
|= RBBS_BREAK
;
693 SendMessageW(hwndReBar
, RB_SETBANDINFO
, index
, (LPARAM
)&rbbinfo
);
696 if(bandId
== BANDID_TOOLBAR
|| bandId
== BANDID_FORMATBAR
|| bandId
== BANDID_RULER
)
697 store_bar_state(bandId
, show
);
700 static void set_statusbar_state(BOOL show
)
702 HWND hStatusWnd
= GetDlgItem(hMainWnd
, IDC_STATUSBAR
);
704 ShowWindow(hStatusWnd
, show
? SW_SHOW
: SW_HIDE
);
705 store_bar_state(BANDID_STATUSBAR
, show
);
708 static void set_bar_states(void)
710 set_toolbar_state(BANDID_TOOLBAR
, is_bar_visible(BANDID_TOOLBAR
));
711 set_toolbar_state(BANDID_FONTLIST
, is_bar_visible(BANDID_FORMATBAR
));
712 set_toolbar_state(BANDID_SIZELIST
, is_bar_visible(BANDID_FORMATBAR
));
713 set_toolbar_state(BANDID_FORMATBAR
, is_bar_visible(BANDID_FORMATBAR
));
714 set_toolbar_state(BANDID_RULER
, is_bar_visible(BANDID_RULER
));
715 set_statusbar_state(is_bar_visible(BANDID_STATUSBAR
));
720 static void preview_exit(HWND hMainWnd
)
722 HMENU hMenu
= LoadMenuW(GetModuleHandleW(0), MAKEINTRESOURCEW(IDM_MAINMENU
));
723 HWND hEditorWnd
= GetDlgItem(hMainWnd
, IDC_EDITOR
);
726 ShowWindow(hEditorWnd
, TRUE
);
728 close_preview(hMainWnd
);
730 SetMenu(hMainWnd
, hMenu
);
731 registry_read_filelist(hMainWnd
);
736 static void set_fileformat(WPARAM format
)
742 target_device(hMainWnd
, wordWrap
[reg_formatindex(fileFormat
)]);
745 static void ShowOpenError(DWORD Code
)
751 case ERROR_ACCESS_DENIED
:
752 Message
= MAKEINTRESOURCEW(STRING_OPEN_ACCESS_DENIED
);
756 Message
= MAKEINTRESOURCEW(STRING_OPEN_FAILED
);
758 MessageBoxW(hMainWnd
, Message
, wszAppTitle
, MB_ICONEXCLAMATION
| MB_OK
);
761 static void DoOpenFile(LPCWSTR szOpenFileName
)
767 WPARAM format
= SF_TEXT
;
769 hFile
= CreateFileW(szOpenFileName
, GENERIC_READ
, FILE_SHARE_READ
, NULL
,
770 OPEN_EXISTING
, FILE_ATTRIBUTE_NORMAL
, NULL
);
771 if (hFile
== INVALID_HANDLE_VALUE
)
773 ShowOpenError(GetLastError());
777 ReadFile(hFile
, fileStart
, 5, &readOut
, NULL
);
778 SetFilePointer(hFile
, 0, NULL
, FILE_BEGIN
);
780 if(readOut
>= 2 && (BYTE
)fileStart
[0] == 0xff && (BYTE
)fileStart
[1] == 0xfe)
782 format
= SF_TEXT
| SF_UNICODE
;
783 SetFilePointer(hFile
, 2, NULL
, FILE_BEGIN
);
784 } else if(readOut
>= 5)
786 static const char header
[] = "{\\rtf";
787 static const BYTE STG_magic
[] = { 0xd0,0xcf,0x11,0xe0 };
789 if(!memcmp(header
, fileStart
, 5))
791 else if (!memcmp(STG_magic
, fileStart
, sizeof(STG_magic
)))
794 MessageBoxWithResStringW(hMainWnd
, MAKEINTRESOURCEW(STRING_OLE_STORAGE_NOT_SUPPORTED
),
795 wszAppTitle
, MB_OK
| MB_ICONEXCLAMATION
);
800 es
.dwCookie
= (DWORD_PTR
)hFile
;
801 es
.pfnCallback
= stream_in
;
804 set_fileformat(format
);
805 SendMessageW(hEditorWnd
, EM_STREAMIN
, format
, (LPARAM
)&es
);
809 SetFocus(hEditorWnd
);
811 set_caption(szOpenFileName
);
813 lstrcpyW(wszFileName
, szOpenFileName
);
814 SendMessageW(hEditorWnd
, EM_SETMODIFY
, FALSE
, 0);
815 registry_set_filelist(szOpenFileName
, hMainWnd
);
819 static void ShowWriteError(DWORD Code
)
825 case ERROR_ACCESS_DENIED
:
826 Message
= MAKEINTRESOURCEW(STRING_WRITE_ACCESS_DENIED
);
830 Message
= MAKEINTRESOURCEW(STRING_WRITE_FAILED
);
832 MessageBoxW(hMainWnd
, Message
, wszAppTitle
, MB_ICONEXCLAMATION
| MB_OK
);
835 static void DoSaveFile(LPCWSTR wszSaveFileName
, WPARAM format
)
841 hFile
= CreateFileW(wszSaveFileName
, GENERIC_WRITE
, 0, NULL
, CREATE_ALWAYS
,
842 FILE_ATTRIBUTE_NORMAL
, NULL
);
844 if(hFile
== INVALID_HANDLE_VALUE
)
846 ShowWriteError(GetLastError());
850 if(format
== (SF_TEXT
| SF_UNICODE
))
852 static const BYTE unicode
[] = {0xff,0xfe};
854 WriteFile(hFile
, &unicode
, sizeof(unicode
), &writeOut
, 0);
856 if(writeOut
!= sizeof(unicode
))
863 stream
.dwCookie
= (DWORD_PTR
)hFile
;
864 stream
.pfnCallback
= stream_out
;
866 ret
= SendMessageW(hEditorWnd
, EM_STREAMOUT
, format
, (LPARAM
)&stream
);
870 SetFocus(hEditorWnd
);
875 gt
.flags
= GTL_DEFAULT
;
878 if(SendMessageW(hEditorWnd
, EM_GETTEXTLENGTHEX
, (WPARAM
)>
, 0))
882 lstrcpyW(wszFileName
, wszSaveFileName
);
883 set_caption(wszFileName
);
884 SendMessageW(hEditorWnd
, EM_SETMODIFY
, FALSE
, 0);
885 set_fileformat(format
);
888 static void DialogSaveFile(void)
892 WCHAR wszFile
[MAX_PATH
] = {'\0'};
893 static const WCHAR wszDefExt
[] = {'r','t','f','\0'};
895 ZeroMemory(&sfn
, sizeof(sfn
));
897 sfn
.lStructSize
= sizeof(sfn
);
898 sfn
.Flags
= OFN_HIDEREADONLY
| OFN_PATHMUSTEXIST
| OFN_OVERWRITEPROMPT
| OFN_ENABLESIZING
;
899 sfn
.hwndOwner
= hMainWnd
;
900 sfn
.lpstrFilter
= wszFilter
;
901 sfn
.lpstrFile
= wszFile
;
902 sfn
.nMaxFile
= MAX_PATH
;
903 sfn
.lpstrDefExt
= wszDefExt
;
904 sfn
.nFilterIndex
= fileformat_number(fileFormat
)+1;
906 while(GetSaveFileNameW(&sfn
))
908 if(fileformat_flags(sfn
.nFilterIndex
-1) != SF_RTF
)
910 if(MessageBoxWithResStringW(hMainWnd
, MAKEINTRESOURCEW(STRING_SAVE_LOSEFORMATTING
),
911 wszAppTitle
, MB_YESNO
| MB_ICONEXCLAMATION
) != IDYES
)
916 DoSaveFile(sfn
.lpstrFile
, fileformat_flags(sfn
.nFilterIndex
-1));
921 DoSaveFile(sfn
.lpstrFile
, fileformat_flags(sfn
.nFilterIndex
-1));
927 static BOOL
prompt_save_changes(void)
932 gt
.flags
= GTL_NUMCHARS
;
934 if(!SendMessageW(hEditorWnd
, EM_GETTEXTLENGTHEX
, (WPARAM
)>
, 0))
938 if(!SendMessageW(hEditorWnd
, EM_GETMODIFY
, 0, 0))
943 LPWSTR displayFileName
;
948 displayFileName
= wszDefaultFileName
;
950 displayFileName
= file_basename(wszFileName
);
952 text
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
,
953 (lstrlenW(displayFileName
)+lstrlenW(wszSaveChanges
))*sizeof(WCHAR
));
958 wsprintfW(text
, wszSaveChanges
, displayFileName
);
960 ret
= MessageBoxW(hMainWnd
, text
, wszAppTitle
, MB_YESNOCANCEL
| MB_ICONEXCLAMATION
);
962 HeapFree(GetProcessHeap(), 0, text
);
971 DoSaveFile(wszFileName
, fileFormat
);
982 static void DialogOpenFile(void)
986 WCHAR wszFile
[MAX_PATH
] = {'\0'};
987 static const WCHAR wszDefExt
[] = {'r','t','f','\0'};
989 ZeroMemory(&ofn
, sizeof(ofn
));
991 ofn
.lStructSize
= sizeof(ofn
);
992 ofn
.Flags
= OFN_HIDEREADONLY
| OFN_FILEMUSTEXIST
| OFN_PATHMUSTEXIST
| OFN_ENABLESIZING
;
993 ofn
.hwndOwner
= hMainWnd
;
994 ofn
.lpstrFilter
= wszFilter
;
995 ofn
.lpstrFile
= wszFile
;
996 ofn
.nMaxFile
= MAX_PATH
;
997 ofn
.lpstrDefExt
= wszDefExt
;
998 ofn
.nFilterIndex
= fileformat_number(fileFormat
)+1;
1000 if(GetOpenFileNameW(&ofn
))
1002 if(prompt_save_changes())
1003 DoOpenFile(ofn
.lpstrFile
);
1007 static void dialog_about(void)
1009 HICON icon
= LoadImageW(GetModuleHandleW(0), MAKEINTRESOURCEW(IDI_WORDPAD
), IMAGE_ICON
, 48, 48, LR_SHARED
);
1010 ShellAboutW(hMainWnd
, wszAppTitle
, 0, icon
);
1013 static INT_PTR CALLBACK
formatopts_proc(HWND hWnd
, UINT message
, WPARAM wParam
, LPARAM lParam
)
1019 LPPROPSHEETPAGEW ps
= (LPPROPSHEETPAGEW
)lParam
;
1022 HWND hIdWnd
= GetDlgItem(hWnd
, IDC_PAGEFMT_ID
);
1024 sprintf(id
, "%d\n", (int)ps
->lParam
);
1025 SetWindowTextA(hIdWnd
, id
);
1026 if(wordWrap
[ps
->lParam
] == ID_WORDWRAP_NONE
)
1027 wrap
= IDC_PAGEFMT_WN
;
1028 else if(wordWrap
[ps
->lParam
] == ID_WORDWRAP_WINDOW
)
1029 wrap
= IDC_PAGEFMT_WW
;
1030 else if(wordWrap
[ps
->lParam
] == ID_WORDWRAP_MARGIN
)
1031 wrap
= IDC_PAGEFMT_WM
;
1034 CheckRadioButton(hWnd
, IDC_PAGEFMT_WN
,
1035 IDC_PAGEFMT_WM
, wrap
);
1037 if(barState
[ps
->lParam
] & (1 << BANDID_TOOLBAR
))
1038 CheckDlgButton(hWnd
, IDC_PAGEFMT_TB
, TRUE
);
1039 if(barState
[ps
->lParam
] & (1 << BANDID_FORMATBAR
))
1040 CheckDlgButton(hWnd
, IDC_PAGEFMT_FB
, TRUE
);
1041 if(barState
[ps
->lParam
] & (1 << BANDID_RULER
))
1042 CheckDlgButton(hWnd
, IDC_PAGEFMT_RU
, TRUE
);
1043 if(barState
[ps
->lParam
] & (1 << BANDID_STATUSBAR
))
1044 CheckDlgButton(hWnd
, IDC_PAGEFMT_SB
, TRUE
);
1049 switch(LOWORD(wParam
))
1051 case IDC_PAGEFMT_WN
:
1052 case IDC_PAGEFMT_WW
:
1053 case IDC_PAGEFMT_WM
:
1054 CheckRadioButton(hWnd
, IDC_PAGEFMT_WN
, IDC_PAGEFMT_WM
,
1058 case IDC_PAGEFMT_TB
:
1059 case IDC_PAGEFMT_FB
:
1060 case IDC_PAGEFMT_RU
:
1061 case IDC_PAGEFMT_SB
:
1062 CheckDlgButton(hWnd
, LOWORD(wParam
),
1063 !IsDlgButtonChecked(hWnd
, LOWORD(wParam
)));
1069 LPNMHDR header
= (LPNMHDR
)lParam
;
1070 if(header
->code
== PSN_APPLY
)
1072 HWND hIdWnd
= GetDlgItem(hWnd
, IDC_PAGEFMT_ID
);
1076 GetWindowTextA(hIdWnd
, sid
, 4);
1078 if(IsDlgButtonChecked(hWnd
, IDC_PAGEFMT_WN
))
1079 wordWrap
[id
] = ID_WORDWRAP_NONE
;
1080 else if(IsDlgButtonChecked(hWnd
, IDC_PAGEFMT_WW
))
1081 wordWrap
[id
] = ID_WORDWRAP_WINDOW
;
1082 else if(IsDlgButtonChecked(hWnd
, IDC_PAGEFMT_WM
))
1083 wordWrap
[id
] = ID_WORDWRAP_MARGIN
;
1085 if(IsDlgButtonChecked(hWnd
, IDC_PAGEFMT_TB
))
1086 barState
[id
] |= (1 << BANDID_TOOLBAR
);
1088 barState
[id
] &= ~(1 << BANDID_TOOLBAR
);
1090 if(IsDlgButtonChecked(hWnd
, IDC_PAGEFMT_FB
))
1091 barState
[id
] |= (1 << BANDID_FORMATBAR
);
1093 barState
[id
] &= ~(1 << BANDID_FORMATBAR
);
1095 if(IsDlgButtonChecked(hWnd
, IDC_PAGEFMT_RU
))
1096 barState
[id
] |= (1 << BANDID_RULER
);
1098 barState
[id
] &= ~(1 << BANDID_RULER
);
1100 if(IsDlgButtonChecked(hWnd
, IDC_PAGEFMT_SB
))
1101 barState
[id
] |= (1 << BANDID_STATUSBAR
);
1103 barState
[id
] &= ~(1 << BANDID_STATUSBAR
);
1111 static void dialog_viewproperties(void)
1113 PROPSHEETPAGEW psp
[2];
1114 PROPSHEETHEADERW psh
;
1116 HINSTANCE hInstance
= GetModuleHandleW(0);
1117 LPCPROPSHEETPAGEW ppsp
= (LPCPROPSHEETPAGEW
)&psp
;
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
;
1126 psp
[0].pszTitle
= MAKEINTRESOURCEW(STRING_VIEWPROPS_TEXT
);
1127 for(i
= 1; i
< sizeof(psp
)/sizeof(psp
[0]); i
++)
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
;
1134 psp
[i
].lParam
= reg_formatindex(SF_RTF
);
1135 psp
[i
].pfnCallback
= psp
[0].pfnCallback
;
1136 psp
[i
].pszTitle
= MAKEINTRESOURCEW(STRING_VIEWPROPS_RICHTEXT
);
1139 psh
.dwSize
= sizeof(psh
);
1140 psh
.dwFlags
= PSH_USEICONID
| PSH_PROPSHEETPAGE
| PSH_NOAPPLYNOW
;
1141 psh
.hwndParent
= hMainWnd
;
1142 psh
.hInstance
= hInstance
;
1143 psh
.pszCaption
= MAKEINTRESOURCEW(STRING_VIEWPROPS_TITLE
);
1144 psh
.nPages
= sizeof(psp
)/sizeof(psp
[0]);
1145 U3(psh
).ppsp
= ppsp
;
1146 U(psh
).pszIcon
= MAKEINTRESOURCEW(IDI_WORDPAD
);
1148 if(fileFormat
& SF_RTF
)
1149 U2(psh
).nStartPage
= 1;
1151 U2(psh
).nStartPage
= 0;
1152 PropertySheetW(&psh
);
1154 target_device(hMainWnd
, wordWrap
[reg_formatindex(fileFormat
)]);
1157 static void HandleCommandLine(LPWSTR cmdline
)
1162 /* skip white space */
1163 while (*cmdline
== ' ') cmdline
++;
1165 /* skip executable name */
1166 delimiter
= (*cmdline
== '"' ? '"' : ' ');
1168 if (*cmdline
== delimiter
) cmdline
++;
1169 while (*cmdline
&& *cmdline
!= delimiter
) cmdline
++;
1170 if (*cmdline
== delimiter
) cmdline
++;
1174 while (isspace(*cmdline
)) cmdline
++;
1176 if (*cmdline
== '-' || *cmdline
== '/')
1178 if (!cmdline
[2] || isspace(cmdline
[2]))
1189 /* a filename starting by / */
1196 /* file name is passed on the command line */
1197 if (cmdline
[0] == '"')
1200 cmdline
[lstrlenW(cmdline
) - 1] = 0;
1202 DoOpenFile(cmdline
);
1203 InvalidateRect(hMainWnd
, NULL
, FALSE
);
1207 MessageBoxWithResStringW(hMainWnd
, MAKEINTRESOURCEW(STRING_PRINTING_NOT_IMPLEMENTED
), wszAppTitle
, MB_OK
);
1210 static LRESULT
handle_findmsg(LPFINDREPLACEW pFr
)
1212 if(pFr
->Flags
& FR_DIALOGTERM
)
1215 pFr
->Flags
= FR_FINDNEXT
;
1219 if(pFr
->Flags
& FR_FINDNEXT
|| pFr
->Flags
& FR_REPLACE
|| pFr
->Flags
& FR_REPLACEALL
)
1221 FINDREPLACE_custom
*custom_data
= (FINDREPLACE_custom
*)pFr
->lCustData
;
1226 HMENU hMenu
= GetMenu(hMainWnd
);
1229 mi
.cbSize
= sizeof(mi
);
1230 mi
.fMask
= MIIM_DATA
;
1232 SetMenuItemInfoW(hMenu
, ID_FIND_NEXT
, FALSE
, &mi
);
1234 /* Make sure find field is saved. */
1235 if (pFr
->lpstrFindWhat
!= custom_data
->findBuffer
)
1237 lstrcpynW(custom_data
->findBuffer
, pFr
->lpstrFindWhat
,
1238 sizeof(custom_data
->findBuffer
));
1239 pFr
->lpstrFindWhat
= custom_data
->findBuffer
;
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
;
1248 flags
= FR_DOWN
| (pFr
->Flags
& (FR_MATCHCASE
| FR_WHOLEWORD
));
1249 ft
.lpstrText
= pFr
->lpstrFindWhat
;
1251 /* Only replace existing selectino if it is an exact match. */
1252 if (sel
.cpMin
!= sel
.cpMax
&&
1253 (pFr
->Flags
& FR_REPLACE
|| pFr
->Flags
& FR_REPLACEALL
))
1256 SendMessageW(hEditorWnd
, EM_FINDTEXTEXW
, flags
, (LPARAM
)&ft
);
1257 if (ft
.chrgText
.cpMin
== sel
.cpMin
&& ft
.chrgText
.cpMax
== sel
.cpMax
) {
1258 SendMessageW(hEditorWnd
, EM_REPLACESEL
, TRUE
, (LPARAM
)pFr
->lpstrReplaceWith
);
1259 SendMessageW(hEditorWnd
, EM_GETSEL
, (WPARAM
)&sel
.cpMin
, (LPARAM
)&sel
.cpMax
);
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
)
1269 /* Search to the end, then wrap around and search from the start. */
1270 if (!custom_data
->wrapped
) {
1272 ret
= SendMessageW(hEditorWnd
, EM_FINDTEXTEXW
, flags
, (LPARAM
)&ft
);
1274 custom_data
->wrapped
= TRUE
;
1280 ft
.chrg
.cpMax
= custom_data
->endPos
+ lstrlenW(pFr
->lpstrFindWhat
) - 1;
1281 if (ft
.chrg
.cpMax
> ft
.chrg
.cpMin
)
1282 ret
= SendMessageW(hEditorWnd
, EM_FINDTEXTEXW
, flags
, (LPARAM
)&ft
);
1286 custom_data
->endPos
= -1;
1287 EnableWindow(hMainWnd
, FALSE
);
1288 MessageBoxWithResStringW(hFindWnd
, MAKEINTRESOURCEW(STRING_SEARCH_FINISHED
),
1289 wszAppTitle
, MB_OK
| MB_ICONASTERISK
| MB_TASKMODAL
);
1290 EnableWindow(hMainWnd
, TRUE
);
1292 SendMessageW(hEditorWnd
, EM_SETSEL
, ft
.chrgText
.cpMin
, ft
.chrgText
.cpMax
);
1293 SendMessageW(hEditorWnd
, EM_SCROLLCARET
, 0, 0);
1295 if (pFr
->Flags
& FR_REPLACEALL
)
1296 return handle_findmsg(pFr
);
1303 static void dialog_find(LPFINDREPLACEW fr
, BOOL replace
)
1305 static WCHAR selBuffer
[128];
1306 static WCHAR replaceBuffer
[128];
1307 static FINDREPLACE_custom custom_data
;
1308 static const WCHAR endl
= '\r';
1311 /* Allow only one search/replace dialog to open */
1312 if(hFindWnd
!= NULL
)
1314 SetActiveWindow(hFindWnd
);
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. */
1325 SendMessageW(hEditorWnd
, EM_GETSEL
, (WPARAM
)&ft
.chrg
.cpMin
,
1326 (LPARAM
)&ft
.chrg
.cpMax
);
1327 ft
.lpstrText
= &endl
;
1328 if (ft
.chrg
.cpMin
!= ft
.chrg
.cpMax
&&
1329 SendMessageW(hEditorWnd
, EM_FINDTEXTW
, FR_DOWN
, (LPARAM
)&ft
) == -1)
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
)>
, (LPARAM
)selBuffer
);
1335 fr
->lpstrFindWhat
= selBuffer
;
1337 fr
->lpstrFindWhat
= custom_data
.findBuffer
;
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
);
1347 hFindWnd
= ReplaceTextW(fr
);
1349 hFindWnd
= FindTextW(fr
);
1352 static int units_to_twips(UNIT unit
, float number
)
1359 twips
= (int)(number
* 1000.0 / (float)CENTMM_PER_INCH
* (float)TWIPS_PER_INCH
);
1363 twips
= (int)(number
* (float)TWIPS_PER_INCH
);
1367 twips
= (int)(number
* (0.0138 * (float)TWIPS_PER_INCH
));
1374 static void append_current_units(LPWSTR buffer
)
1376 static const WCHAR space
[] = {' ', 0};
1377 lstrcatW(buffer
, space
);
1378 lstrcatW(buffer
, units_cmW
);
1381 static void number_with_units(LPWSTR buffer
, int number
)
1383 static const WCHAR fmt
[] = {'%','.','2','f',' ','%','s','\0'};
1384 float converted
= (float)number
/ (float)TWIPS_PER_INCH
*(float)CENTMM_PER_INCH
/ 1000.0;
1386 sprintfW(buffer
, fmt
, converted
, units_cmW
);
1389 static BOOL
get_comboexlist_selection(HWND hComboEx
, LPWSTR wszBuffer
, UINT bufferLength
)
1391 COMBOBOXEXITEMW cbItem
;
1392 COMBOBOXINFO cbInfo
;
1396 hCombo
= (HWND
)SendMessage(hComboEx
, CBEM_GETCOMBOCONTROL
, 0, 0);
1399 cbInfo
.cbSize
= sizeof(COMBOBOXINFO
);
1400 result
= SendMessage(hCombo
, CB_GETCOMBOBOXINFO
, 0, (LPARAM
)&cbInfo
);
1403 hList
= cbInfo
.hwndList
;
1404 idx
= SendMessage(hList
, LB_GETCURSEL
, 0, 0);
1408 ZeroMemory(&cbItem
, sizeof(cbItem
));
1409 cbItem
.mask
= CBEIF_TEXT
;
1411 cbItem
.pszText
= wszBuffer
;
1412 cbItem
.cchTextMax
= bufferLength
-1;
1413 result
= SendMessageW(hComboEx
, CBEM_GETITEMW
, 0, (LPARAM
)&cbItem
);
1418 static INT_PTR CALLBACK
datetime_proc(HWND hWnd
, UINT message
, WPARAM wParam
, LPARAM lParam
)
1424 WCHAR buffer
[MAX_STRING_LEN
];
1426 HWND hListWnd
= GetDlgItem(hWnd
, IDC_DATETIME
);
1429 GetDateFormatW(LOCALE_USER_DEFAULT
, DATE_SHORTDATE
, &st
, 0, (LPWSTR
)&buffer
,
1431 SendMessageW(hListWnd
, LB_ADDSTRING
, 0, (LPARAM
)&buffer
);
1432 GetDateFormatW(LOCALE_USER_DEFAULT
, DATE_LONGDATE
, &st
, 0, (LPWSTR
)&buffer
,
1434 SendMessageW(hListWnd
, LB_ADDSTRING
, 0, (LPARAM
)&buffer
);
1435 GetTimeFormatW(LOCALE_USER_DEFAULT
, 0, &st
, 0, (LPWSTR
)&buffer
, MAX_STRING_LEN
);
1436 SendMessageW(hListWnd
, LB_ADDSTRING
, 0, (LPARAM
)&buffer
);
1438 SendMessageW(hListWnd
, LB_SETSEL
, TRUE
, 0);
1443 switch(LOWORD(wParam
))
1446 if (HIWORD(wParam
) != LBN_DBLCLK
)
1453 HWND hListWnd
= GetDlgItem(hWnd
, IDC_DATETIME
);
1455 index
= SendMessageW(hListWnd
, LB_GETCURSEL
, 0, 0);
1459 WCHAR buffer
[MAX_STRING_LEN
];
1460 SendMessageW(hListWnd
, LB_GETTEXT
, index
, (LPARAM
)&buffer
);
1461 SendMessageW(hEditorWnd
, EM_REPLACESEL
, TRUE
, (LPARAM
)&buffer
);
1467 EndDialog(hWnd
, wParam
);
1474 static INT_PTR CALLBACK
newfile_proc(HWND hWnd
, UINT message
, WPARAM wParam
, LPARAM lParam
)
1480 HINSTANCE hInstance
= GetModuleHandleW(0);
1481 WCHAR buffer
[MAX_STRING_LEN
];
1482 HWND hListWnd
= GetDlgItem(hWnd
, IDC_NEWFILE
);
1484 LoadStringW(hInstance
, STRING_NEWFILE_RICHTEXT
, buffer
, MAX_STRING_LEN
);
1485 SendMessageW(hListWnd
, LB_ADDSTRING
, 0, (LPARAM
)&buffer
);
1486 LoadStringW(hInstance
, STRING_NEWFILE_TXT
, buffer
, MAX_STRING_LEN
);
1487 SendMessageW(hListWnd
, LB_ADDSTRING
, 0, (LPARAM
)&buffer
);
1488 LoadStringW(hInstance
, STRING_NEWFILE_TXT_UNICODE
, buffer
, MAX_STRING_LEN
);
1489 SendMessageW(hListWnd
, LB_ADDSTRING
, 0, (LPARAM
)&buffer
);
1491 SendMessageW(hListWnd
, LB_SETSEL
, TRUE
, 0);
1496 switch(LOWORD(wParam
))
1501 HWND hListWnd
= GetDlgItem(hWnd
, IDC_NEWFILE
);
1502 index
= SendMessageW(hListWnd
, LB_GETCURSEL
, 0, 0);
1505 EndDialog(hWnd
, MAKELONG(fileformat_flags(index
),0));
1510 EndDialog(hWnd
, MAKELONG(ID_NEWFILE_ABORT
,0));
1517 static INT_PTR CALLBACK
paraformat_proc(HWND hWnd
, UINT message
, WPARAM wParam
, LPARAM lParam
)
1519 static const WORD ALIGNMENT_VALUES
[] = {PFA_LEFT
, PFA_RIGHT
, PFA_CENTER
};
1525 HINSTANCE hInstance
= GetModuleHandleW(0);
1526 WCHAR buffer
[MAX_STRING_LEN
];
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
);
1534 LoadStringW(hInstance
, STRING_ALIGN_LEFT
, buffer
,
1536 SendMessageW(hListWnd
, CB_ADDSTRING
, 0, (LPARAM
)buffer
);
1537 LoadStringW(hInstance
, STRING_ALIGN_RIGHT
, buffer
,
1539 SendMessageW(hListWnd
, CB_ADDSTRING
, 0, (LPARAM
)buffer
);
1540 LoadStringW(hInstance
, STRING_ALIGN_CENTER
, buffer
,
1542 SendMessageW(hListWnd
, CB_ADDSTRING
, 0, (LPARAM
)buffer
);
1544 pf
.cbSize
= sizeof(pf
);
1545 pf
.dwMask
= PFM_ALIGNMENT
| PFM_OFFSET
| PFM_RIGHTINDENT
|
1547 SendMessageW(hEditorWnd
, EM_GETPARAFORMAT
, 0, (LPARAM
)&pf
);
1549 if(pf
.wAlignment
== PFA_RIGHT
)
1551 else if(pf
.wAlignment
== PFA_CENTER
)
1554 SendMessageW(hListWnd
, CB_SETCURSEL
, index
, 0);
1556 number_with_units(buffer
, pf
.dxStartIndent
+ pf
.dxOffset
);
1557 SetWindowTextW(hLeftWnd
, buffer
);
1558 number_with_units(buffer
, pf
.dxRightIndent
);
1559 SetWindowTextW(hRightWnd
, buffer
);
1560 number_with_units(buffer
, -pf
.dxOffset
);
1561 SetWindowTextW(hFirstWnd
, buffer
);
1566 switch(LOWORD(wParam
))
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
);
1574 WCHAR buffer
[MAX_STRING_LEN
];
1581 index
= SendMessageW(hListWnd
, CB_GETCURSEL
, 0, 0);
1582 pf
.wAlignment
= ALIGNMENT_VALUES
[index
];
1584 GetWindowTextW(hLeftWnd
, buffer
, MAX_STRING_LEN
);
1585 if(number_from_string(buffer
, &num
, &unit
))
1587 pf
.dxOffset
= units_to_twips(unit
, num
);
1588 GetWindowTextW(hRightWnd
, buffer
, MAX_STRING_LEN
);
1589 if(number_from_string(buffer
, &num
, &unit
))
1591 pf
.dxRightIndent
= units_to_twips(unit
, num
);
1592 GetWindowTextW(hFirstWnd
, buffer
, MAX_STRING_LEN
);
1593 if(number_from_string(buffer
, &num
, &unit
))
1595 pf
.dxStartIndent
= units_to_twips(unit
, num
);
1599 MessageBoxWithResStringW(hMainWnd
, MAKEINTRESOURCEW(STRING_INVALID_NUMBER
),
1600 wszAppTitle
, MB_OK
| MB_ICONASTERISK
);
1604 if (pf
.dxOffset
+ pf
.dxStartIndent
< 0
1605 && pf
.dxStartIndent
< 0)
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);
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. */
1623 pf
.dxStartIndent
= pf
.dxStartIndent
+ pf
.dxOffset
;
1624 pf
.dxOffset
= pf
.dxOffset
- pf
.dxStartIndent
;
1626 pf
.cbSize
= sizeof(pf
);
1627 pf
.dwMask
= PFM_ALIGNMENT
| PFM_OFFSET
| PFM_RIGHTINDENT
|
1629 SendMessageW(hEditorWnd
, EM_SETPARAFORMAT
, 0, (LPARAM
)&pf
);
1635 EndDialog(hWnd
, wParam
);
1642 static INT_PTR CALLBACK
tabstops_proc(HWND hWnd
, UINT message
, WPARAM wParam
, LPARAM lParam
)
1648 HWND hTabWnd
= GetDlgItem(hWnd
, IDC_TABSTOPS
);
1650 WCHAR buffer
[MAX_STRING_LEN
];
1653 pf
.cbSize
= sizeof(pf
);
1654 pf
.dwMask
= PFM_TABSTOPS
;
1655 SendMessageW(hEditorWnd
, EM_GETPARAFORMAT
, 0, (LPARAM
)&pf
);
1656 SendMessageW(hTabWnd
, CB_LIMITTEXT
, MAX_STRING_LEN
-1, 0);
1658 for(i
= 0; i
< pf
.cTabCount
; i
++)
1660 number_with_units(buffer
, pf
.rgxTabs
[i
]);
1661 SendMessageW(hTabWnd
, CB_ADDSTRING
, 0, (LPARAM
)&buffer
);
1668 switch(LOWORD(wParam
))
1672 HWND hTabWnd
= (HWND
)lParam
;
1673 HWND hAddWnd
= GetDlgItem(hWnd
, ID_TAB_ADD
);
1674 HWND hDelWnd
= GetDlgItem(hWnd
, ID_TAB_DEL
);
1675 HWND hEmptyWnd
= GetDlgItem(hWnd
, ID_TAB_EMPTY
);
1677 if(GetWindowTextLengthW(hTabWnd
))
1678 EnableWindow(hAddWnd
, TRUE
);
1680 EnableWindow(hAddWnd
, FALSE
);
1682 if(SendMessageW(hTabWnd
, CB_GETCOUNT
, 0, 0))
1684 EnableWindow(hEmptyWnd
, TRUE
);
1686 if(SendMessageW(hTabWnd
, CB_GETCURSEL
, 0, 0) == CB_ERR
)
1687 EnableWindow(hDelWnd
, FALSE
);
1689 EnableWindow(hDelWnd
, TRUE
);
1692 EnableWindow(hEmptyWnd
, FALSE
);
1699 HWND hTabWnd
= GetDlgItem(hWnd
, IDC_TABSTOPS
);
1700 WCHAR buffer
[MAX_STRING_LEN
];
1703 GetWindowTextW(hTabWnd
, buffer
, MAX_STRING_LEN
);
1704 append_current_units(buffer
);
1706 if(SendMessageW(hTabWnd
, CB_FINDSTRINGEXACT
, -1, (LPARAM
)&buffer
) == CB_ERR
)
1709 int item_count
= SendMessage(hTabWnd
, CB_GETCOUNT
, 0, 0);
1711 if(!number_from_string(buffer
, &number
, &unit
))
1713 MessageBoxWithResStringW(hWnd
, MAKEINTRESOURCEW(STRING_INVALID_NUMBER
),
1714 wszAppTitle
, MB_OK
| MB_ICONINFORMATION
);
1715 } else if (item_count
>= MAX_TAB_STOPS
) {
1716 MessageBoxWithResStringW(hWnd
, MAKEINTRESOURCEW(STRING_MAX_TAB_STOPS
),
1717 wszAppTitle
, MB_OK
| MB_ICONINFORMATION
);
1720 float next_number
= -1;
1721 int next_number_in_twips
= -1;
1722 int insert_number
= units_to_twips(unit
, number
);
1724 /* linear search for position to insert the string */
1725 for(i
= 0; i
< item_count
; i
++)
1727 SendMessageW(hTabWnd
, CB_GETLBTEXT
, i
, (LPARAM
)&buffer
);
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
)
1733 if (insert_number
!= next_number_in_twips
)
1735 number_with_units(buffer
, insert_number
);
1736 SendMessageW(hTabWnd
, CB_INSERTSTRING
, i
, (LPARAM
)&buffer
);
1737 SetWindowTextW(hTabWnd
, 0);
1747 HWND hTabWnd
= GetDlgItem(hWnd
, IDC_TABSTOPS
);
1749 ret
= SendMessageW(hTabWnd
, CB_GETCURSEL
, 0, 0);
1751 SendMessageW(hTabWnd
, CB_DELETESTRING
, ret
, 0);
1757 HWND hTabWnd
= GetDlgItem(hWnd
, IDC_TABSTOPS
);
1758 SendMessageW(hTabWnd
, CB_RESETCONTENT
, 0, 0);
1765 HWND hTabWnd
= GetDlgItem(hWnd
, IDC_TABSTOPS
);
1767 WCHAR buffer
[MAX_STRING_LEN
];
1772 pf
.cbSize
= sizeof(pf
);
1773 pf
.dwMask
= PFM_TABSTOPS
;
1775 for(i
= 0; SendMessageW(hTabWnd
, CB_GETLBTEXT
, i
,
1776 (LPARAM
)&buffer
) != CB_ERR
&&
1777 i
< MAX_TAB_STOPS
; i
++)
1779 number_from_string(buffer
, &number
, &unit
);
1780 pf
.rgxTabs
[i
] = units_to_twips(unit
, number
);
1783 SendMessageW(hEditorWnd
, EM_SETPARAFORMAT
, 0, (LPARAM
)&pf
);
1787 EndDialog(hWnd
, wParam
);
1794 static LRESULT
OnCreate( HWND hWnd
)
1796 HWND hToolBarWnd
, hFormatBarWnd
, hReBarWnd
, hFontListWnd
, hSizeListWnd
, hRulerWnd
;
1797 HINSTANCE hInstance
= GetModuleHandleW(0);
1800 int nStdBitmaps
= 0;
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'};
1806 CreateStatusWindowW(CCS_NODIVIDER
|WS_CHILD
|WS_VISIBLE
, wszRichEditText
, hWnd
, IDC_STATUSBAR
);
1808 hReBarWnd
= CreateWindowExW(WS_EX_TOOLWINDOW
, REBARCLASSNAMEW
, NULL
,
1809 CCS_NODIVIDER
|WS_CHILD
|WS_VISIBLE
|WS_CLIPSIBLINGS
|WS_CLIPCHILDREN
|RBS_VARHEIGHT
|CCS_TOP
,
1810 CW_USEDEFAULT
, CW_USEDEFAULT
, 0, 0, hWnd
, (HMENU
)IDC_REBAR
, hInstance
, NULL
);
1812 rbi
.cbSize
= sizeof(rbi
);
1815 if(!SendMessageW(hReBarWnd
, RB_SETBARINFO
, 0, (LPARAM
)&rbi
))
1818 hToolBarWnd
= CreateToolbarEx(hReBarWnd
, CCS_NOPARENTALIGN
|CCS_NOMOVEY
|WS_VISIBLE
|WS_CHILD
|TBSTYLE_TOOLTIPS
|BTNS_BUTTON
,
1820 1, hInstance
, IDB_TOOLBAR
,
1822 24, 24, 16, 16, sizeof(TBBUTTON
));
1824 ab
.hInst
= HINST_COMMCTRL
;
1825 ab
.nID
= IDB_STD_SMALL_COLOR
;
1826 nStdBitmaps
= SendMessageW(hToolBarWnd
, TB_ADDBITMAP
, 0, (LPARAM
)&ab
);
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
);
1845 SendMessageW(hToolBarWnd
, TB_AUTOSIZE
, 0, 0);
1847 rbb
.cbSize
= REBARBANDINFOW_V6_SIZE
;
1848 rbb
.fMask
= RBBIM_SIZE
| RBBIM_CHILDSIZE
| RBBIM_CHILD
| RBBIM_STYLE
| RBBIM_ID
;
1849 rbb
.fStyle
= RBBS_CHILDEDGE
| RBBS_BREAK
| RBBS_NOGRIPPER
;
1851 rbb
.hwndChild
= hToolBarWnd
;
1853 rbb
.cyChild
= rbb
.cyMinChild
= HIWORD(SendMessageW(hToolBarWnd
, TB_GETBUTTONSIZE
, 0, 0));
1854 rbb
.wID
= BANDID_TOOLBAR
;
1856 SendMessageW(hReBarWnd
, RB_INSERTBAND
, -1, (LPARAM
)&rbb
);
1858 hFontListWnd
= CreateWindowExW(0, WC_COMBOBOXEXW
, NULL
,
1859 WS_BORDER
| WS_VISIBLE
| WS_CHILD
| CBS_DROPDOWN
| CBS_SORT
,
1860 0, 0, 200, 150, hReBarWnd
, (HMENU
)IDC_FONTLIST
, hInstance
, NULL
);
1862 rbb
.hwndChild
= hFontListWnd
;
1864 rbb
.wID
= BANDID_FONTLIST
;
1866 SendMessageW(hReBarWnd
, RB_INSERTBAND
, -1, (LPARAM
)&rbb
);
1868 hSizeListWnd
= CreateWindowExW(0, WC_COMBOBOXEXW
, NULL
,
1869 WS_BORDER
| WS_VISIBLE
| WS_CHILD
| CBS_DROPDOWN
,
1870 0, 0, 50, 150, hReBarWnd
, (HMENU
)IDC_SIZELIST
, hInstance
, NULL
);
1872 rbb
.hwndChild
= hSizeListWnd
;
1874 rbb
.fStyle
^= RBBS_BREAK
;
1875 rbb
.wID
= BANDID_SIZELIST
;
1877 SendMessageW(hReBarWnd
, RB_INSERTBAND
, -1, (LPARAM
)&rbb
);
1879 hFormatBarWnd
= CreateToolbarEx(hReBarWnd
,
1880 CCS_NOPARENTALIGN
| CCS_NOMOVEY
| WS_VISIBLE
| TBSTYLE_TOOLTIPS
| BTNS_BUTTON
,
1881 IDC_FORMATBAR
, 8, hInstance
, IDB_FORMATBAR
, NULL
, 0, 16, 16, 16, 16, sizeof(TBBUTTON
));
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
);
1894 SendMessageW(hFormatBarWnd
, TB_AUTOSIZE
, 0, 0);
1896 rbb
.hwndChild
= hFormatBarWnd
;
1897 rbb
.wID
= BANDID_FORMATBAR
;
1899 SendMessageW(hReBarWnd
, RB_INSERTBAND
, -1, (LPARAM
)&rbb
);
1901 hRulerWnd
= CreateWindowExW(0, WC_STATICW
, NULL
, WS_VISIBLE
| WS_CHILD
,
1902 0, 0, 200, 10, hReBarWnd
, (HMENU
)IDC_RULER
, hInstance
, NULL
);
1905 rbb
.hwndChild
= hRulerWnd
;
1906 rbb
.wID
= BANDID_RULER
;
1907 rbb
.fStyle
|= RBBS_BREAK
;
1909 SendMessageW(hReBarWnd
, RB_INSERTBAND
, -1, (LPARAM
)&rbb
);
1911 hDLL
= LoadLibraryW(wszRichEditDll
);
1914 MessageBoxWithResStringW(hWnd
, MAKEINTRESOURCEW(STRING_LOAD_RICHED_FAILED
), wszAppTitle
,
1915 MB_OK
| MB_ICONEXCLAMATION
);
1919 hEditorWnd
= CreateWindowExW(WS_EX_CLIENTEDGE
, RICHEDIT_CLASS20W
, NULL
,
1920 WS_CHILD
|WS_VISIBLE
|ES_SELECTIONBAR
|ES_MULTILINE
|ES_AUTOVSCROLL
1921 |ES_WANTRETURN
|WS_VSCROLL
|ES_NOHIDESEL
|WS_HSCROLL
,
1922 0, 0, 1000, 100, hWnd
, (HMENU
)IDC_EDITOR
, hInstance
, NULL
);
1926 fprintf(stderr
, "Error code %u\n", GetLastError());
1931 setup_richedit_olecallback(hEditorWnd
);
1932 SetFocus(hEditorWnd
);
1933 SendMessageW(hEditorWnd
, EM_SETEVENTMASK
, 0, ENM_SELCHANGE
);
1937 populate_font_list(hFontListWnd
);
1938 populate_size_list(hSizeListWnd
);
1940 SendMessageW(hEditorWnd
, EM_SETMODIFY
, FALSE
, 0);
1942 ID_FINDMSGSTRING
= RegisterWindowMessageW(FINDMSGSTRINGW
);
1944 registry_read_filelist(hWnd
);
1945 registry_read_formatopts_all(barState
, wordWrap
);
1946 registry_read_options();
1947 DragAcceptFiles(hWnd
, TRUE
);
1952 static LRESULT
OnUser( HWND hWnd
)
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
);
1963 ZeroMemory(&fmt
, sizeof(fmt
));
1964 fmt
.cbSize
= sizeof(fmt
);
1966 ZeroMemory(&pf
, sizeof(pf
));
1967 pf
.cbSize
= sizeof(pf
);
1969 gt
.flags
= GTL_NUMCHARS
;
1972 SendMessageW(hwndToolBar
, TB_ENABLEBUTTON
, ID_FIND
,
1973 SendMessageW(hwndEditor
, EM_GETTEXTLENGTHEX
, (WPARAM
)>
, 0) ? 1 : 0);
1975 SendMessageW(hwndEditor
, EM_GETCHARFORMAT
, TRUE
, (LPARAM
)&fmt
);
1977 SendMessageW(hwndEditor
, EM_GETSEL
, (WPARAM
)&from
, (LPARAM
)&to
);
1978 SendMessageW(hwndToolBar
, TB_ENABLEBUTTON
, ID_EDIT_UNDO
,
1979 SendMessageW(hwndEditor
, EM_CANUNDO
, 0, 0));
1980 SendMessageW(hwndToolBar
, TB_ENABLEBUTTON
, ID_EDIT_REDO
,
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);
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
));
1993 SendMessageW(hwndFormatBar
, TB_INDETERMINATE
, ID_FORMAT_UNDERLINE
, !(fmt
.dwMask
& CFM_UNDERLINE
));
1995 SendMessageW(hwndEditor
, EM_GETPARAFORMAT
, 0, (LPARAM
)&pf
);
1996 SendMessageW(hwndFormatBar
, TB_CHECKBUTTON
, ID_ALIGN_LEFT
, (pf
.wAlignment
== PFA_LEFT
));
1997 SendMessageW(hwndFormatBar
, TB_CHECKBUTTON
, ID_ALIGN_CENTER
, (pf
.wAlignment
== PFA_CENTER
));
1998 SendMessageW(hwndFormatBar
, TB_CHECKBUTTON
, ID_ALIGN_RIGHT
, (pf
.wAlignment
== PFA_RIGHT
));
2000 SendMessageW(hwndFormatBar
, TB_CHECKBUTTON
, ID_BULLET
, (pf
.wNumbering
& PFN_BULLET
));
2004 static LRESULT
OnNotify( HWND hWnd
, LPARAM lParam
)
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
);
2012 if (pHdr
->hwndFrom
== hwndFontList
|| pHdr
->hwndFrom
== hwndSizeList
)
2014 if (pHdr
->code
== CBEN_ENDEDITW
)
2016 NMCBEENDEDIT
*endEdit
= (NMCBEENDEDIT
*)lParam
;
2017 if(pHdr
->hwndFrom
== hwndFontList
)
2019 on_fontlist_modified((LPWSTR
)endEdit
->szText
);
2020 } else if (pHdr
->hwndFrom
== hwndSizeList
)
2022 on_sizelist_modified(hwndFontList
,(LPWSTR
)endEdit
->szText
);
2028 if (pHdr
->hwndFrom
!= hwndEditor
)
2031 if (pHdr
->code
== EN_SELCHANGE
)
2033 SELCHANGE
*pSC
= (SELCHANGE
*)lParam
;
2038 sprintf( buf
,"selection = %d..%d, line count=%ld",
2039 pSC
->chrg
.cpMin
, pSC
->chrg
.cpMax
,
2040 SendMessage(hwndEditor
, EM_GETLINECOUNT
, 0, 0));
2041 SetWindowTextA(GetDlgItem(hWnd
, IDC_STATUSBAR
), buf
);
2042 SendMessage(hWnd
, WM_USER
, 0, 0);
2048 /* Copied from dlls/comdlg32/fontdlg.c */
2049 static const COLORREF textcolors
[]=
2051 0x00000000L
,0x00000080L
,0x00008000L
,0x00008080L
,
2052 0x00800000L
,0x00800080L
,0x00808000L
,0x00808080L
,
2053 0x00c0c0c0L
,0x000000ffL
,0x0000ff00L
,0x0000ffffL
,
2054 0x00ff0000L
,0x00ff00ffL
,0x00ffff00L
,0x00FFFFFFL
2057 static LRESULT
OnCommand( HWND hWnd
, WPARAM wParam
, LPARAM lParam
)
2059 HWND hwndEditor
= GetDlgItem(hWnd
, IDC_EDITOR
);
2060 static FINDREPLACEW findreplace
;
2062 if ((HWND
)lParam
== hwndEditor
)
2065 switch(LOWORD(wParam
))
2069 PostMessageW(hWnd
, WM_CLOSE
, 0, 0);
2074 HINSTANCE hInstance
= GetModuleHandleW(0);
2075 int ret
= DialogBox(hInstance
, MAKEINTRESOURCE(IDD_NEWFILE
), hWnd
,
2078 if(ret
!= ID_NEWFILE_ABORT
)
2080 if(prompt_save_changes())
2085 wszFileName
[0] = '\0';
2089 st
.flags
= ST_DEFAULT
;
2091 SendMessageW(hEditorWnd
, EM_SETTEXTEX
, (WPARAM
)&st
, 0);
2093 SendMessageW(hEditorWnd
, EM_SETMODIFY
, FALSE
, 0);
2094 set_fileformat(ret
);
2108 DoSaveFile(wszFileName
, fileFormat
);
2113 case ID_FILE_SAVEAS
:
2117 case ID_FILE_RECENT1
:
2118 case ID_FILE_RECENT2
:
2119 case ID_FILE_RECENT3
:
2120 case ID_FILE_RECENT4
:
2122 HMENU hMenu
= GetMenu(hWnd
);
2125 mi
.cbSize
= sizeof(MENUITEMINFOW
);
2126 mi
.fMask
= MIIM_DATA
;
2127 if(GetMenuItemInfoW(hMenu
, LOWORD(wParam
), FALSE
, &mi
))
2128 DoOpenFile((LPWSTR
)mi
.dwItemData
);
2133 dialog_find(&findreplace
, FALSE
);
2137 handle_findmsg(&findreplace
);
2141 dialog_find(&findreplace
, TRUE
);
2144 case ID_FONTSETTINGS
:
2145 dialog_choose_font();
2149 dialog_print(hWnd
, wszFileName
);
2150 target_device(hMainWnd
, wordWrap
[reg_formatindex(fileFormat
)]);
2153 case ID_PRINT_QUICK
:
2154 print_quick(hMainWnd
, wszFileName
);
2155 target_device(hMainWnd
, wordWrap
[reg_formatindex(fileFormat
)]);
2160 int index
= reg_formatindex(fileFormat
);
2161 DWORD tmp
= barState
[index
];
2162 barState
[index
] = 1 << BANDID_STATUSBAR
;
2164 barState
[index
] = tmp
;
2165 ShowWindow(hEditorWnd
, FALSE
);
2167 init_preview(hWnd
, wszFileName
);
2169 SetMenu(hWnd
, NULL
);
2170 InvalidateRect(0, 0, TRUE
);
2175 dialog_printsetup(hWnd
);
2176 target_device(hMainWnd
, wordWrap
[reg_formatindex(fileFormat
)]);
2179 case ID_FORMAT_BOLD
:
2180 case ID_FORMAT_ITALIC
:
2181 case ID_FORMAT_UNDERLINE
:
2184 int effects
= CFE_BOLD
;
2186 ZeroMemory(&fmt
, sizeof(fmt
));
2187 fmt
.cbSize
= sizeof(fmt
);
2188 SendMessageW(hwndEditor
, EM_GETCHARFORMAT
, SCF_SELECTION
, (LPARAM
)&fmt
);
2190 fmt
.dwMask
= CFM_BOLD
;
2192 if (LOWORD(wParam
) == ID_FORMAT_ITALIC
)
2194 effects
= CFE_ITALIC
;
2195 fmt
.dwMask
= CFM_ITALIC
;
2196 } else if (LOWORD(wParam
) == ID_FORMAT_UNDERLINE
)
2198 effects
= CFE_UNDERLINE
;
2199 fmt
.dwMask
= CFM_UNDERLINE
;
2202 fmt
.dwEffects
^= effects
;
2204 SendMessageW(hwndEditor
, EM_SETCHARFORMAT
, SCF_SELECTION
, (LPARAM
)&fmt
);
2208 case ID_FORMAT_COLOR
:
2210 HWND hReBarWnd
= GetDlgItem(hWnd
, IDC_REBAR
);
2211 HWND hFormatBarWnd
= GetDlgItem(hReBarWnd
, IDC_FORMATBAR
);
2216 int itemidx
= SendMessage(hFormatBarWnd
, TB_COMMANDTOINDEX
, ID_FORMAT_COLOR
, 0);
2218 SendMessage(hFormatBarWnd
, TB_GETITEMRECT
, itemidx
, (LPARAM
)&itemrc
);
2220 pt
.y
= itemrc
.bottom
;
2221 ClientToScreen(hFormatBarWnd
, &pt
);
2222 hPop
= GetSubMenu(hColorPopupMenu
, 0);
2223 mid
= TrackPopupMenu(hPop
, TPM_LEFTALIGN
| TPM_TOPALIGN
| TPM_LEFTBUTTON
|
2224 TPM_RETURNCMD
| TPM_NONOTIFY
,
2225 pt
.x
, pt
.y
, 0, hWnd
, 0);
2226 if (mid
>= ID_COLOR_FIRST
&& mid
<= ID_COLOR_AUTOMATIC
)
2230 ZeroMemory(&fmt
, sizeof(fmt
));
2231 fmt
.cbSize
= sizeof(fmt
);
2232 SendMessageW(hwndEditor
, EM_GETCHARFORMAT
, SCF_SELECTION
, (LPARAM
)&fmt
);
2234 fmt
.dwMask
= CFM_COLOR
;
2236 if (mid
< ID_COLOR_AUTOMATIC
) {
2237 fmt
.crTextColor
= textcolors
[mid
- ID_COLOR_FIRST
];
2238 fmt
.dwEffects
&= ~CFE_AUTOCOLOR
;
2240 fmt
.dwEffects
|= CFE_AUTOCOLOR
;
2243 SendMessageW(hwndEditor
, EM_SETCHARFORMAT
, SCF_SELECTION
, (LPARAM
)&fmt
);
2249 PostMessageW(hwndEditor
, WM_CUT
, 0, 0);
2253 PostMessageW(hwndEditor
, WM_COPY
, 0, 0);
2257 PostMessageW(hwndEditor
, WM_PASTE
, 0, 0);
2261 PostMessageW(hwndEditor
, WM_CLEAR
, 0, 0);
2264 case ID_EDIT_SELECTALL
:
2266 CHARRANGE range
= {0, -1};
2267 SendMessageW(hwndEditor
, EM_EXSETSEL
, 0, (LPARAM
)&range
);
2268 /* SendMessage(hwndEditor, EM_SETSEL, 0, -1); */
2272 case ID_EDIT_GETTEXT
:
2274 int nLen
= GetWindowTextLengthW(hwndEditor
);
2275 LPWSTR data
= HeapAlloc( GetProcessHeap(), 0, (nLen
+1)*sizeof(WCHAR
) );
2278 GetWindowTextW(hwndEditor
, data
, nLen
+1);
2279 MessageBoxW(NULL
, data
, wszAppTitle
, MB_OK
);
2281 HeapFree( GetProcessHeap(), 0, data
);
2282 data
= HeapAlloc(GetProcessHeap(), 0, (nLen
+1)*sizeof(WCHAR
));
2284 tr
.chrg
.cpMax
= nLen
;
2285 tr
.lpstrText
= data
;
2286 SendMessage (hwndEditor
, EM_GETTEXTRANGE
, 0, (LPARAM
)&tr
);
2287 MessageBoxW(NULL
, data
, wszAppTitle
, MB_OK
);
2288 HeapFree( GetProcessHeap(), 0, data
);
2290 /* SendMessage(hwndEditor, EM_SETSEL, 0, -1); */
2294 case ID_EDIT_CHARFORMAT
:
2295 case ID_EDIT_DEFCHARFORMAT
:
2299 ZeroMemory(&cf
, sizeof(cf
));
2300 cf
.cbSize
= sizeof(cf
);
2302 SendMessageW(hwndEditor
, EM_GETCHARFORMAT
,
2303 LOWORD(wParam
) == ID_EDIT_CHARFORMAT
, (LPARAM
)&cf
);
2307 case ID_EDIT_PARAFORMAT
:
2310 ZeroMemory(&pf
, sizeof(pf
));
2311 pf
.cbSize
= sizeof(pf
);
2312 SendMessageW(hwndEditor
, EM_GETPARAFORMAT
, 0, (LPARAM
)&pf
);
2316 case ID_EDIT_SELECTIONINFO
:
2318 CHARRANGE range
= {0, -1};
2322 SendMessage(hwndEditor
, EM_EXGETSEL
, 0, (LPARAM
)&range
);
2323 data
= HeapAlloc(GetProcessHeap(), 0, sizeof(*data
) * (range
.cpMax
-range
.cpMin
+1));
2324 SendMessage(hwndEditor
, EM_GETSELTEXT
, 0, (LPARAM
)data
);
2325 sprintf(buf
, "Start = %d, End = %d", range
.cpMin
, range
.cpMax
);
2326 MessageBoxA(hWnd
, buf
, "Editor", MB_OK
);
2327 MessageBoxW(hWnd
, data
, wszAppTitle
, MB_OK
);
2328 HeapFree( GetProcessHeap(), 0, data
);
2329 /* SendMessage(hwndEditor, EM_SETSEL, 0, -1); */
2333 case ID_EDIT_READONLY
:
2335 LONG nStyle
= GetWindowLong(hwndEditor
, GWL_STYLE
);
2336 if (nStyle
& ES_READONLY
)
2337 SendMessageW(hwndEditor
, EM_SETREADONLY
, 0, 0);
2339 SendMessageW(hwndEditor
, EM_SETREADONLY
, 1, 0);
2343 case ID_EDIT_MODIFIED
:
2344 if (SendMessageW(hwndEditor
, EM_GETMODIFY
, 0, 0))
2345 SendMessageW(hwndEditor
, EM_SETMODIFY
, 0, 0);
2347 SendMessageW(hwndEditor
, EM_SETMODIFY
, 1, 0);
2351 SendMessageW(hwndEditor
, EM_UNDO
, 0, 0);
2355 SendMessageW(hwndEditor
, EM_REDO
, 0, 0);
2362 pf
.cbSize
= sizeof(pf
);
2363 pf
.dwMask
= PFM_NUMBERING
;
2364 SendMessageW(hwndEditor
, EM_GETPARAFORMAT
, 0, (LPARAM
)&pf
);
2366 pf
.dwMask
|= PFM_OFFSET
;
2368 if(pf
.wNumbering
== PFN_BULLET
)
2374 pf
.wNumbering
= PFN_BULLET
;
2378 SendMessageW(hwndEditor
, EM_SETPARAFORMAT
, 0, (LPARAM
)&pf
);
2383 case ID_ALIGN_CENTER
:
2384 case ID_ALIGN_RIGHT
:
2388 pf
.cbSize
= sizeof(pf
);
2389 pf
.dwMask
= PFM_ALIGNMENT
;
2390 switch(LOWORD(wParam
)) {
2391 case ID_ALIGN_LEFT
: pf
.wAlignment
= PFA_LEFT
; break;
2392 case ID_ALIGN_CENTER
: pf
.wAlignment
= PFA_CENTER
; break;
2393 case ID_ALIGN_RIGHT
: pf
.wAlignment
= PFA_RIGHT
; break;
2395 SendMessageW(hwndEditor
, EM_SETPARAFORMAT
, 0, (LPARAM
)&pf
);
2400 SendMessageW(hwndEditor
, EM_SETBKGNDCOLOR
, 1, 0);
2404 SendMessageW(hwndEditor
, EM_SETBKGNDCOLOR
, 0, RGB(255,255,192));
2407 case ID_TOGGLE_TOOLBAR
:
2408 set_toolbar_state(BANDID_TOOLBAR
, !is_bar_visible(BANDID_TOOLBAR
));
2412 case ID_TOGGLE_FORMATBAR
:
2413 set_toolbar_state(BANDID_FONTLIST
, !is_bar_visible(BANDID_FORMATBAR
));
2414 set_toolbar_state(BANDID_SIZELIST
, !is_bar_visible(BANDID_FORMATBAR
));
2415 set_toolbar_state(BANDID_FORMATBAR
, !is_bar_visible(BANDID_FORMATBAR
));
2419 case ID_TOGGLE_STATUSBAR
:
2420 set_statusbar_state(!is_bar_visible(BANDID_STATUSBAR
));
2424 case ID_TOGGLE_RULER
:
2425 set_toolbar_state(BANDID_RULER
, !is_bar_visible(BANDID_RULER
));
2430 DialogBoxW(GetModuleHandleW(0), MAKEINTRESOURCEW(IDD_DATETIME
), hWnd
, datetime_proc
);
2434 DialogBoxW(GetModuleHandleW(0), MAKEINTRESOURCEW(IDD_PARAFORMAT
), hWnd
, paraformat_proc
);
2438 DialogBoxW(GetModuleHandleW(0), MAKEINTRESOURCEW(IDD_TABSTOPS
), hWnd
, tabstops_proc
);
2445 case ID_VIEWPROPERTIES
:
2446 dialog_viewproperties();
2450 if (HIWORD(wParam
) == CBN_SELENDOK
)
2452 WCHAR buffer
[LF_FACESIZE
];
2453 HWND hwndFontList
= (HWND
)lParam
;
2454 get_comboexlist_selection(hwndFontList
, buffer
, LF_FACESIZE
);
2455 on_fontlist_modified(buffer
);
2460 if (HIWORD(wParam
) == CBN_SELENDOK
)
2462 WCHAR buffer
[MAX_STRING_LEN
+1];
2463 HWND hwndSizeList
= (HWND
)lParam
;
2464 get_comboexlist_selection(hwndSizeList
, buffer
, MAX_STRING_LEN
+1);
2465 on_sizelist_modified(hwndSizeList
, buffer
);
2470 SendMessageW(hwndEditor
, WM_COMMAND
, wParam
, lParam
);
2476 static LRESULT
OnInitPopupMenu( HWND hWnd
, WPARAM wParam
)
2478 HMENU hMenu
= (HMENU
)wParam
;
2479 HWND hwndEditor
= GetDlgItem(hWnd
, IDC_EDITOR
);
2480 HWND hwndStatus
= GetDlgItem(hWnd
, IDC_STATUSBAR
);
2482 int nAlignment
= -1;
2488 SendMessageW(hEditorWnd
, EM_GETSEL
, (WPARAM
)&selFrom
, (LPARAM
)&selTo
);
2489 EnableMenuItem(hMenu
, ID_EDIT_COPY
, MF_BYCOMMAND
|(selFrom
== selTo
) ? MF_GRAYED
: MF_ENABLED
);
2490 EnableMenuItem(hMenu
, ID_EDIT_CUT
, MF_BYCOMMAND
|(selFrom
== selTo
) ? MF_GRAYED
: MF_ENABLED
);
2492 pf
.cbSize
= sizeof(PARAFORMAT
);
2493 SendMessageW(hwndEditor
, EM_GETPARAFORMAT
, 0, (LPARAM
)&pf
);
2494 CheckMenuItem(hMenu
, ID_EDIT_READONLY
,
2495 MF_BYCOMMAND
|(GetWindowLong(hwndEditor
, GWL_STYLE
)&ES_READONLY
? MF_CHECKED
: MF_UNCHECKED
));
2496 CheckMenuItem(hMenu
, ID_EDIT_MODIFIED
,
2497 MF_BYCOMMAND
|(SendMessage(hwndEditor
, EM_GETMODIFY
, 0, 0) ? MF_CHECKED
: MF_UNCHECKED
));
2498 if (pf
.dwMask
& PFM_ALIGNMENT
)
2499 nAlignment
= pf
.wAlignment
;
2500 CheckMenuItem(hMenu
, ID_ALIGN_LEFT
, MF_BYCOMMAND
|(nAlignment
== PFA_LEFT
) ?
2501 MF_CHECKED
: MF_UNCHECKED
);
2502 CheckMenuItem(hMenu
, ID_ALIGN_CENTER
, MF_BYCOMMAND
|(nAlignment
== PFA_CENTER
) ?
2503 MF_CHECKED
: MF_UNCHECKED
);
2504 CheckMenuItem(hMenu
, ID_ALIGN_RIGHT
, MF_BYCOMMAND
|(nAlignment
== PFA_RIGHT
) ?
2505 MF_CHECKED
: MF_UNCHECKED
);
2506 CheckMenuItem(hMenu
, ID_BULLET
, MF_BYCOMMAND
| ((pf
.wNumbering
== PFN_BULLET
) ?
2507 MF_CHECKED
: MF_UNCHECKED
));
2508 EnableMenuItem(hMenu
, ID_EDIT_UNDO
, MF_BYCOMMAND
|(SendMessageW(hwndEditor
, EM_CANUNDO
, 0, 0)) ?
2509 MF_ENABLED
: MF_GRAYED
);
2510 EnableMenuItem(hMenu
, ID_EDIT_REDO
, MF_BYCOMMAND
|(SendMessageW(hwndEditor
, EM_CANREDO
, 0, 0)) ?
2511 MF_ENABLED
: MF_GRAYED
);
2513 CheckMenuItem(hMenu
, ID_TOGGLE_TOOLBAR
, MF_BYCOMMAND
|(is_bar_visible(BANDID_TOOLBAR
)) ?
2514 MF_CHECKED
: MF_UNCHECKED
);
2516 CheckMenuItem(hMenu
, ID_TOGGLE_FORMATBAR
, MF_BYCOMMAND
|(is_bar_visible(BANDID_FORMATBAR
)) ?
2517 MF_CHECKED
: MF_UNCHECKED
);
2519 CheckMenuItem(hMenu
, ID_TOGGLE_STATUSBAR
, MF_BYCOMMAND
|IsWindowVisible(hwndStatus
) ?
2520 MF_CHECKED
: MF_UNCHECKED
);
2522 CheckMenuItem(hMenu
, ID_TOGGLE_RULER
, MF_BYCOMMAND
|(is_bar_visible(BANDID_RULER
)) ? MF_CHECKED
: MF_UNCHECKED
);
2524 gt
.flags
= GTL_NUMCHARS
;
2526 textLength
= SendMessageW(hEditorWnd
, EM_GETTEXTLENGTHEX
, (WPARAM
)>
, 0);
2527 EnableMenuItem(hMenu
, ID_FIND
, MF_BYCOMMAND
|(textLength
? MF_ENABLED
: MF_GRAYED
));
2529 mi
.cbSize
= sizeof(mi
);
2530 mi
.fMask
= MIIM_DATA
;
2532 GetMenuItemInfoW(hMenu
, ID_FIND_NEXT
, FALSE
, &mi
);
2534 EnableMenuItem(hMenu
, ID_FIND_NEXT
, MF_BYCOMMAND
|((textLength
&& mi
.dwItemData
) ?
2535 MF_ENABLED
: MF_GRAYED
));
2537 EnableMenuItem(hMenu
, ID_REPLACE
, MF_BYCOMMAND
|(textLength
? MF_ENABLED
: MF_GRAYED
));
2542 static LRESULT
OnSize( HWND hWnd
, WPARAM wParam
, LPARAM lParam
)
2544 int nStatusSize
= 0;
2546 HWND hwndEditor
= preview_isactive() ? GetDlgItem(hWnd
, IDC_PREVIEW
) : GetDlgItem(hWnd
, IDC_EDITOR
);
2547 HWND hwndStatusBar
= GetDlgItem(hWnd
, IDC_STATUSBAR
);
2548 HWND hwndReBar
= GetDlgItem(hWnd
, IDC_REBAR
);
2549 HWND hRulerWnd
= GetDlgItem(hwndReBar
, IDC_RULER
);
2550 int rebarHeight
= 0;
2554 SendMessageW(hwndStatusBar
, WM_SIZE
, 0, 0);
2555 if (IsWindowVisible(hwndStatusBar
))
2557 GetClientRect(hwndStatusBar
, &rc
);
2558 nStatusSize
= rc
.bottom
- rc
.top
;
2566 rebarHeight
= SendMessageW(hwndReBar
, RB_GETBARHEIGHT
, 0, 0);
2568 MoveWindow(hwndReBar
, 0, 0, LOWORD(lParam
), rebarHeight
, TRUE
);
2572 GetClientRect(hWnd
, &rc
);
2573 MoveWindow(hwndEditor
, 0, rebarHeight
, rc
.right
, rc
.bottom
-nStatusSize
-rebarHeight
, TRUE
);
2576 redraw_ruler(hRulerWnd
);
2578 return DefWindowProcW(hWnd
, WM_SIZE
, wParam
, lParam
);
2581 static LRESULT CALLBACK
WndProc(HWND hWnd
, UINT msg
, WPARAM wParam
, LPARAM lParam
)
2583 if(msg
== ID_FINDMSGSTRING
)
2584 return handle_findmsg((LPFINDREPLACEW
)lParam
);
2589 return OnCreate( hWnd
);
2592 return OnUser( hWnd
);
2595 return OnNotify( hWnd
, lParam
);
2598 if(preview_isactive())
2600 return preview_command( hWnd
, wParam
);
2603 return OnCommand( hWnd
, wParam
, lParam
);
2610 if(preview_isactive())
2613 } else if(prompt_save_changes())
2615 registry_set_options(hMainWnd
);
2616 registry_set_formatopts_all(barState
, wordWrap
);
2623 SetFocus(GetDlgItem(hWnd
, IDC_EDITOR
));
2626 case WM_INITMENUPOPUP
:
2627 return OnInitPopupMenu( hWnd
, wParam
);
2630 return OnSize( hWnd
, wParam
, lParam
);
2632 case WM_CONTEXTMENU
:
2633 return DefWindowProcW(hWnd
, msg
, wParam
, lParam
);
2637 WCHAR file
[MAX_PATH
];
2638 DragQueryFileW((HDROP
)wParam
, 0, file
, MAX_PATH
);
2639 DragFinish((HDROP
)wParam
);
2641 if(prompt_save_changes())
2646 if(!preview_isactive())
2647 return DefWindowProcW(hWnd
, msg
, wParam
, lParam
);
2650 return DefWindowProcW(hWnd
, msg
, wParam
, lParam
);
2656 int CALLBACK
WinMain(HINSTANCE hInstance
, HINSTANCE hOldInstance
, LPSTR szCmdParagraph
, int nCmdShow
)
2658 INITCOMMONCONTROLSEX classes
= {8, ICC_BAR_CLASSES
|ICC_COOL_CLASSES
|ICC_USEREX_CLASSES
};
2663 UINT_PTR hPrevRulerProc
;
2667 static const WCHAR wszAccelTable
[] = {'M','A','I','N','A','C','C','E','L',
2668 'T','A','B','L','E','\0'};
2670 InitCommonControlsEx(&classes
);
2672 hAccel
= LoadAcceleratorsW(hInstance
, wszAccelTable
);
2674 wc
.cbSize
= sizeof(wc
);
2676 wc
.lpfnWndProc
= WndProc
;
2679 wc
.hInstance
= hInstance
;
2680 wc
.hIcon
= LoadIconW(hInstance
, MAKEINTRESOURCEW(IDI_WORDPAD
));
2681 wc
.hIconSm
= LoadImageW(hInstance
, MAKEINTRESOURCEW(IDI_WORDPAD
), IMAGE_ICON
,
2682 GetSystemMetrics(SM_CXSMICON
), GetSystemMetrics(SM_CYSMICON
), LR_SHARED
);
2683 wc
.hCursor
= LoadCursor(NULL
, IDC_IBEAM
);
2684 wc
.hbrBackground
= GetSysColorBrush(COLOR_WINDOW
);
2685 wc
.lpszMenuName
= MAKEINTRESOURCEW(IDM_MAINMENU
);
2686 wc
.lpszClassName
= wszMainWndClass
;
2687 RegisterClassExW(&wc
);
2690 wc
.lpfnWndProc
= preview_proc
;
2693 wc
.hInstance
= hInstance
;
2696 wc
.hCursor
= LoadCursor(NULL
, IDC_IBEAM
);
2697 wc
.hbrBackground
= NULL
;
2698 wc
.lpszMenuName
= NULL
;
2699 wc
.lpszClassName
= wszPreviewWndClass
;
2700 RegisterClassExW(&wc
);
2702 registry_read_winrect(&rc
);
2703 hMainWnd
= CreateWindowExW(0, wszMainWndClass
, wszAppTitle
, WS_CLIPCHILDREN
|WS_OVERLAPPEDWINDOW
,
2704 rc
.left
, rc
.top
, rc
.right
-rc
.left
, rc
.bottom
-rc
.top
, NULL
, NULL
, hInstance
, NULL
);
2705 registry_read_maximized(&bMaximized
);
2706 if ((nCmdShow
== SW_SHOWNORMAL
|| nCmdShow
== SW_SHOWDEFAULT
)
2708 nCmdShow
= SW_SHOWMAXIMIZED
;
2709 ShowWindow(hMainWnd
, nCmdShow
);
2713 set_fileformat(SF_RTF
);
2714 hColorPopupMenu
= LoadMenuW(hInstance
, MAKEINTRESOURCEW(IDM_COLOR_POPUP
));
2715 get_default_printer_opts();
2716 target_device(hMainWnd
, wordWrap
[reg_formatindex(fileFormat
)]);
2718 hRulerWnd
= GetDlgItem(GetDlgItem(hMainWnd
, IDC_REBAR
), IDC_RULER
);
2719 SendMessageW(GetDlgItem(hMainWnd
, IDC_EDITOR
), EM_POSFROMCHAR
, (WPARAM
)&EditPoint
, 0);
2720 hPrevRulerProc
= SetWindowLongPtrW(hRulerWnd
, GWLP_WNDPROC
, (UINT_PTR
)ruler_proc
);
2721 SendMessageW(hRulerWnd
, WM_USER
, (WPARAM
)&EditPoint
, hPrevRulerProc
);
2723 HandleCommandLine(GetCommandLineW());
2725 while(GetMessageW(&msg
,0,0,0))
2727 if (IsDialogMessage(hFindWnd
, &msg
))
2730 if (TranslateAcceleratorW(hMainWnd
, hAccel
, &msg
))
2732 TranslateMessage(&msg
);
2733 DispatchMessageW(&msg
);
2734 if (!PeekMessageW(&msg
, 0, 0, 0, PM_NOREMOVE
))
2735 SendMessageW(hMainWnd
, WM_USER
, 0, 0);