4 * Copyright 1998,99 Marcel Baur <mbaur@g26.ethz.ch>
5 * To be distributed under the Wine License
31 static LRESULT
DIALOG_PAGESETUP_DlgProc(HWND hDlg
, UINT msg
, WPARAM wParam
, LPARAM lParam
);
35 int AlertIDS(UINT ids_message
, UINT ids_caption
, WORD type
) {
37 * Given some ids strings, this acts as a language-aware wrapper for
40 CHAR szMessage
[MAX_STRING_LEN
];
41 CHAR szCaption
[MAX_STRING_LEN
];
43 LoadString(Globals
.hInstance
, ids_message
, szMessage
, sizeof(szMessage
));
44 LoadString(Globals
.hInstance
, ids_caption
, szCaption
, sizeof(szCaption
));
46 return (MessageBox(Globals
.hMainWnd
, szMessage
, szCaption
, type
));
49 void AlertFileNotFound(LPSTR szFileName
) {
52 CHAR szMessage
[MAX_STRING_LEN
];
53 CHAR szRessource
[MAX_STRING_LEN
];
55 /* Load and format szMessage */
56 LoadString(Globals
.hInstance
, IDS_NOTFOUND
, szRessource
, sizeof(szRessource
));
57 wsprintf(szMessage
, szRessource
, szFileName
);
60 LoadString(Globals
.hInstance
, IDS_ERROR
, szRessource
, sizeof(szRessource
));
62 /* Display Modal Dialog */
63 nResult
= MessageBox(Globals
.hMainWnd
, szMessage
, szRessource
, MB_ICONEXCLAMATION
);
67 int AlertFileNotSaved(LPSTR szFileName
) {
70 CHAR szMessage
[MAX_STRING_LEN
];
71 CHAR szRessource
[MAX_STRING_LEN
];
73 /* Load and format Message */
75 LoadString(Globals
.hInstance
, IDS_NOTSAVED
, szRessource
, sizeof(szRessource
));
76 wsprintf(szMessage
, szRessource
, szFileName
);
80 LoadString(Globals
.hInstance
, IDS_ERROR
, szRessource
, sizeof(szRessource
));
83 nResult
= MessageBox(Globals
.hMainWnd
, szMessage
, szRessource
, MB_ICONEXCLAMATION
+ MB_YESNOCANCEL
);
88 VOID
AlertOutOfMemory(void) {
91 nResult
= AlertIDS(IDS_OUT_OF_MEMORY
, IDS_ERROR
, MB_ICONEXCLAMATION
);
96 BOOL
ExistFile(LPCSTR szFilename
) {
98 * Returns: TRUE - if "szFileName" exists
99 * FALSE - if it does not
101 WIN32_FIND_DATA entry
;
104 hFile
= FindFirstFile(szFilename
, &entry
);
106 return (hFile
!=INVALID_HANDLE_VALUE
);
109 VOID
DoSaveFile(VOID
) {
111 /* FIXME: Really Save the file */
112 /* ... (Globals.szFileName); */
116 BOOL
DoCloseFile(void) {
117 /* Return value: TRUE - User agreed to close (both save/don't save) */
118 /* FALSE - User cancelled close by selecting "Cancel" */
122 if (strlen(Globals
.szFileName
)>0) {
123 /* prompt user to save changes */
124 nResult
= AlertFileNotSaved(Globals
.szFileName
);
126 case IDYES
: DoSaveFile();
131 case IDCANCEL
: return(FALSE
);
134 default: return(FALSE
);
139 /* Forget file name */
140 lstrcpy(Globals
.szFileName
, "");
141 LANGUAGE_UpdateWindowCaption();
146 void DoOpenFile(LPCSTR szFileName
) {
148 /* Close any files and prompt to save changes */
150 GetFileTitle(szFileName
, Globals
.szFileName
, sizeof(Globals
.szFileName
));
151 LANGUAGE_UpdateWindowCaption();
153 LoadBufferFromFile(szFileName
);
158 VOID
DIALOG_FileNew(VOID
)
160 /* Close any files and promt to save changes */
166 VOID
DIALOG_FileOpen(VOID
)
168 OPENFILENAME openfilename
;
169 CHAR szPath
[MAX_PATHNAME_LEN
];
170 CHAR szDir
[MAX_PATHNAME_LEN
];
171 CHAR szzFilter
[2 * MAX_STRING_LEN
+ 100];
172 CHAR szDefaultExt
[4];
175 lstrcpy(szDefaultExt
, "txt");
177 LoadString(Globals
.hInstance
, IDS_TEXT_FILES_TXT
, p
, MAX_STRING_LEN
);
181 LoadString(Globals
.hInstance
, IDS_ALL_FILES
, p
, MAX_STRING_LEN
);
187 GetCurrentDirectory(sizeof(szDir
), szDir
);
188 lstrcpy(szPath
,"*.txt");
190 openfilename
.lStructSize
= sizeof(OPENFILENAME
);
191 openfilename
.hwndOwner
= Globals
.hMainWnd
;
192 openfilename
.hInstance
= Globals
.hInstance
;
193 openfilename
.lpstrFilter
= szzFilter
;
194 openfilename
.lpstrCustomFilter
= 0;
195 openfilename
.nMaxCustFilter
= 0;
196 openfilename
.nFilterIndex
= 0;
197 openfilename
.lpstrFile
= szPath
;
198 openfilename
.nMaxFile
= sizeof(szPath
);
199 openfilename
.lpstrFileTitle
= 0;
200 openfilename
.nMaxFileTitle
= 0;
201 openfilename
.lpstrInitialDir
= szDir
;
202 openfilename
.lpstrTitle
= 0;
203 openfilename
.Flags
= OFN_FILEMUSTEXIST
+ OFN_PATHMUSTEXIST
;
204 openfilename
.nFileOffset
= 0;
205 openfilename
.nFileExtension
= 0;
206 openfilename
.lpstrDefExt
= szDefaultExt
;
207 openfilename
.lCustData
= 0;
208 openfilename
.lpfnHook
= 0;
209 openfilename
.lpTemplateName
= 0;
211 if (GetOpenFileName(&openfilename
)) {
213 if (ExistFile(openfilename
.lpstrFile
))
214 DoOpenFile(openfilename
.lpstrFile
);
216 AlertFileNotFound(openfilename
.lpstrFile
);
221 VOID
DIALOG_FileSave(VOID
)
223 /* FIXME: Save File */
228 VOID
DIALOG_FileSaveAs(VOID
)
231 CHAR szPath
[MAX_PATHNAME_LEN
];
232 CHAR szDir
[MAX_PATHNAME_LEN
];
233 CHAR szDefaultExt
[4];
234 CHAR szzFilter
[2 * MAX_STRING_LEN
+ 100];
238 lstrcpy(szDefaultExt
, "txt");
240 LoadString(Globals
.hInstance
, IDS_TEXT_FILES_TXT
, p
, MAX_STRING_LEN
);
244 LoadString(Globals
.hInstance
, IDS_ALL_FILES
, p
, MAX_STRING_LEN
);
250 lstrcpy(szPath
,"*.*");
252 GetCurrentDirectory(sizeof(szDir
), szDir
);
254 saveas
.lStructSize
= sizeof(OPENFILENAME
);
255 saveas
.hwndOwner
= Globals
.hMainWnd
;
256 saveas
.hInstance
= Globals
.hInstance
;
257 saveas
.lpstrFilter
= szzFilter
;
258 saveas
.lpstrCustomFilter
= 0;
259 saveas
.nMaxCustFilter
= 0;
260 saveas
.nFilterIndex
= 0;
261 saveas
.lpstrFile
= szPath
;
262 saveas
.nMaxFile
= sizeof(szPath
);
263 saveas
.lpstrFileTitle
= 0;
264 saveas
.nMaxFileTitle
= 0;
265 saveas
.lpstrInitialDir
= szDir
;
266 saveas
.lpstrTitle
= 0;
267 saveas
.Flags
= OFN_PATHMUSTEXIST
+ OFN_OVERWRITEPROMPT
+ OFN_HIDEREADONLY
;
268 saveas
.nFileOffset
= 0;
269 saveas
.nFileExtension
= 0;
270 saveas
.lpstrDefExt
= szDefaultExt
;
271 saveas
.lCustData
= 0;
273 saveas
.lpTemplateName
= 0;
275 if (GetSaveFileName(&saveas
)) {
276 lstrcpy(Globals
.szFileName
, saveas
.lpstrFile
);
277 LANGUAGE_UpdateWindowCaption();
282 VOID
DIALOG_FilePrint(VOID
)
291 CHAR szDocumentName
[MAX_STRING_LEN
]; /* Name of document */
292 CHAR szPrinterName
[MAX_STRING_LEN
]; /* Name of the printer */
293 CHAR szDeviceName
[MAX_STRING_LEN
]; /* Name of the printer device */
294 CHAR szOutput
[MAX_STRING_LEN
]; /* in which file/device to print */
296 /* LPDEVMODE hDevMode; */
297 /* LPDEVNAMES hDevNames; */
299 /* hDevMode = GlobalAlloc(GMEM_MOVEABLE + GMEM_ZEROINIT, sizeof(DEVMODE)); */
300 /* hDevNames = GlobalAlloc(GMEM_MOVEABLE + GMEM_ZEROINIT, sizeof(DEVNAMES)); */
302 /* Get Current Settings */
304 printer
.lStructSize
= sizeof(PRINTDLG
);
305 printer
.hwndOwner
= Globals
.hMainWnd
;
306 printer
.hInstance
= Globals
.hInstance
;
308 /* Let PrintDlg create a DEVMODE structure */
309 printer
.hDevMode
= 0;
310 printer
.hDevNames
= 0;
312 printer
.Flags
= PD_RETURNDEFAULT
;
313 printer
.nFromPage
= 0;
315 printer
.nMinPage
= 0;
316 printer
.nMaxPage
= 0;
318 printer
.lCustData
= 0;
319 printer
.lpfnPrintHook
= 0;
320 printer
.lpfnSetupHook
= 0;
321 printer
.lpPrintTemplateName
= 0;
322 printer
.lpSetupTemplateName
= 0;
323 printer
.hPrintTemplate
= 0;
324 printer
.hSetupTemplate
= 0;
326 nResult
= PrintDlg(&printer
);
328 /* hContext = CreateDC(, szDeviceName, "TEST.TXT", 0); */
330 /* Congratulations to those Microsoft Engineers responsable */
331 /* for the following pointer acrobatics */
333 assert(printer
.hDevNames
!=0);
335 nBase
= (LONG
)(printer
.hDevNames
);
337 nOffset
= (WORD
)((LPDEVNAMES
) printer
.hDevNames
)->wDriverOffset
;
338 lstrcpy(szPrinterName
, (LPCSTR
) (nBase
+ nOffset
));
340 nOffset
= (WORD
)((LPDEVNAMES
) printer
.hDevNames
)->wDeviceOffset
;
341 lstrcpy(szDeviceName
, (LPCSTR
) (nBase
+ nOffset
));
343 nOffset
= (WORD
)((LPDEVNAMES
) printer
.hDevNames
)->wOutputOffset
;
344 lstrcpy(szOutput
, (LPCSTR
) (nBase
+ nOffset
));
346 MessageBox(Globals
.hMainWnd
, szPrinterName
, "Printer Name", MB_ICONEXCLAMATION
);
347 MessageBox(Globals
.hMainWnd
, szDeviceName
, "Device Name", MB_ICONEXCLAMATION
);
348 MessageBox(Globals
.hMainWnd
, szOutput
, "Output", MB_ICONEXCLAMATION
);
350 /* Set some default flags */
352 bFlags
= PD_RETURNDC
+ PD_SHOWHELP
;
355 /* Remove "Print Selection" if there is no selection */
356 bFlags
= bFlags
+ PD_NOSELECTION
;
359 printer
.Flags
= bFlags
;
361 printer.nFromPage = 0;
363 printer.nMinPage = 0;
364 printer.nMaxPage = 0;
367 /* Let commdlg manage copy settings */
368 printer
.nCopies
= (WORD
)PD_USEDEVMODECOPIES
;
370 if (PrintDlg(&printer
)) {
372 /* initialize DOCINFO */
373 di
.cbSize
= sizeof(DOCINFO
);
374 lstrcpy((LPSTR
)di
.lpszDocName
, szDocumentName
);
375 lstrcpy((LPSTR
)di
.lpszOutput
, szOutput
);
377 hContext
= printer
.hDC
;
379 assert( (int) hContext
!=PD_RETURNDC
);
381 SetMapMode(hContext
, MM_LOMETRIC
);
382 /* SetViewPortExExt(hContext, 10, 10, 0); */
383 SetBkMode(hContext
, OPAQUE
);
385 nResult
= TextOut(hContext
, 0, 0, " ", 1);
386 assert(nResult
!= 0);
388 nResult
= StartDoc(hContext
, &di
);
389 assert(nResult
!= SP_ERROR
);
391 nResult
= StartPage(hContext
);
394 /* FIXME: actually print */
396 nResult
= EndPage(hContext
);
400 MessageBox(Globals
.hMainWnd
, "Generic Error", "Print Engine Error", MB_ICONEXCLAMATION
);
403 MessageBox(Globals
.hMainWnd
, "The print job was aborted.", "Print Engine Error", MB_ICONEXCLAMATION
);
406 MessageBox(Globals
.hMainWnd
, "The print job was aborted using the Print Manager ", "Print Engine Error", MB_ICONEXCLAMATION
);
409 MessageBox(Globals
.hMainWnd
, "Out of disk space", "Print Engine Error", MB_ICONEXCLAMATION
);
415 MessageBox(Globals
.hMainWnd
, "Default", "Print", MB_ICONEXCLAMATION
);
417 nResult
= EndDoc(hContext
);
419 nResult
= DeleteDC(hContext
);
423 /* GlobalFree(hDevNames); */
424 /* GlobalFree(hDevMode); */
427 VOID
DIALOG_FilePageSetup(VOID
)
432 VOID
DIALOG_FilePrinterSetup(VOID
)
436 printer
.lStructSize
= sizeof(PRINTDLG
);
437 printer
.hwndOwner
= Globals
.hMainWnd
;
438 printer
.hInstance
= Globals
.hInstance
;
439 printer
.hDevMode
= 0;
440 printer
.hDevNames
= 0;
442 printer
.Flags
= PD_PRINTSETUP
;
443 printer
.nFromPage
= 0;
445 printer
.nMinPage
= 0;
446 printer
.nMaxPage
= 0;
448 printer
.lCustData
= 0;
449 printer
.lpfnPrintHook
= 0;
450 printer
.lpfnSetupHook
= 0;
451 printer
.lpPrintTemplateName
= 0;
452 printer
.lpSetupTemplateName
= 0;
453 printer
.hPrintTemplate
= 0;
454 printer
.hSetupTemplate
= 0;
456 if (PrintDlg(&printer
)) {
462 VOID
DIALOG_FileExit(VOID
)
469 VOID
DIALOG_EditUndo(VOID
)
471 MessageBox(Globals
.hMainWnd
, "Undo", "Debug", MB_ICONEXCLAMATION
);
475 VOID
DIALOG_EditCut(VOID
)
479 hMem
= GlobalAlloc(GMEM_ZEROINIT
, 99);
481 OpenClipboard(Globals
.hMainWnd
);
484 /* FIXME: Get text */
485 lstrcpy((CHAR
*)hMem
, "Hello World");
487 SetClipboardData(CF_TEXT
, hMem
);
493 VOID
DIALOG_EditCopy(VOID
)
497 hMem
= GlobalAlloc(GMEM_ZEROINIT
, 99);
499 OpenClipboard(Globals
.hMainWnd
);
502 /* FIXME: Get text */
503 lstrcpy((CHAR
*)hMem
, "Hello World");
505 SetClipboardData(CF_TEXT
, hMem
);
511 VOID
DIALOG_EditPaste(VOID
)
515 if (IsClipboardFormatAvailable(CF_TEXT
)) {
516 OpenClipboard(Globals
.hMainWnd
);
517 hClipText
= GetClipboardData(CF_TEXT
);
519 MessageBox(Globals
.hMainWnd
, (CHAR
*)hClipText
, "PASTE", MB_ICONEXCLAMATION
);
523 VOID
DIALOG_EditDelete(VOID
)
528 VOID
DIALOG_EditSelectAll(VOID
)
533 VOID
DIALOG_EditTimeDate(VOID
)
536 LPSYSTEMTIME lpst
= &st
;
537 CHAR szDate
[MAX_STRING_LEN
];
541 GetDateFormat(LOCALE_USER_DEFAULT
, LOCALE_SLONGDATE
, lpst
, NULL
, date
, MAX_STRING_LEN
);
542 GetTimeFormat(LOCALE_USER_DEFAULT
, LOCALE_STIMEFORMAT
, lpst
, NULL
, date
, MAX_STRING_LEN
);
546 VOID
DIALOG_EditWrap(VOID
)
548 Globals
.bWrapLongLines
= !Globals
.bWrapLongLines
;
549 CheckMenuItem(Globals
.hEditMenu
, NP_EDIT_WRAP
, MF_BYCOMMAND
|
550 (Globals
.bWrapLongLines
? MF_CHECKED
: MF_UNCHECKED
));
553 VOID
DIALOG_Search(VOID
)
555 Globals
.find
.lStructSize
= sizeof(Globals
.find
);
556 Globals
.find
.hwndOwner
= Globals
.hMainWnd
;
557 Globals
.find
.hInstance
= Globals
.hInstance
;
558 Globals
.find
.lpstrFindWhat
= (CHAR
*) &Globals
.szFindText
;
559 Globals
.find
.wFindWhatLen
= sizeof(Globals
.szFindText
);
560 Globals
.find
.lpstrReplaceWith
= 0;
561 Globals
.find
.wReplaceWithLen
= 0;
562 Globals
.find
.Flags
= FR_DOWN
;
563 Globals
.find
.lCustData
= 0;
564 Globals
.find
.lpfnHook
= 0;
565 Globals
.find
.lpTemplateName
= 0;
567 /* We only need to create the modal FindReplace dialog which will */
568 /* notify us of incoming events using hMainWnd Window Messages */
570 Globals
.hFindReplaceDlg
= FindText(&Globals
.find
);
571 assert(Globals
.hFindReplaceDlg
!=0);
574 VOID
DIALOG_SearchNext(VOID
)
579 VOID
DIALOG_HelpContents(VOID
)
581 WinHelp(Globals
.hMainWnd
, HELPFILE
, HELP_INDEX
, 0);
584 VOID
DIALOG_HelpSearch(VOID
)
589 VOID
DIALOG_HelpHelp(VOID
)
591 WinHelp(Globals
.hMainWnd
, HELPFILE
, HELP_HELPONHELP
, 0);
594 VOID
DIALOG_HelpLicense(VOID
)
596 WineLicense(Globals
.hMainWnd
, Globals
.lpszLanguage
);
599 VOID
DIALOG_HelpNoWarranty(VOID
)
601 WineWarranty(Globals
.hMainWnd
, Globals
.lpszLanguage
);
604 VOID
DIALOG_HelpAboutWine(VOID
)
606 CHAR szNotepad
[MAX_STRING_LEN
];
608 LoadString(Globals
.hInstance
, IDS_NOTEPAD
, szNotepad
, sizeof(szNotepad
));
609 ShellAbout(Globals
.hMainWnd
, szNotepad
, "Notepad\n" WINE_RELEASE_INFO
, 0);
612 /***********************************************************************
617 VOID
DIALOG_PageSetup(VOID
)
621 lpfnDlg
= MakeProcInstance(DIALOG_PAGESETUP_DlgProc
, Globals
.hInstance
);
622 DialogBox(Globals
.hInstance
, STRING_PAGESETUP_Xx
, Globals
.hMainWnd
, (DLGPROC
)lpfnDlg
);
623 FreeProcInstance(lpfnDlg
);
627 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
629 * DIALOG_PAGESETUP_DlgProc
632 static LRESULT
DIALOG_PAGESETUP_DlgProc(HWND hDlg
, UINT msg
, WPARAM wParam
, LPARAM lParam
)
641 /* save user input and close dialog */
642 GetDlgItemText(hDlg
, NP_PAGESETUP_HEAD
, Globals
.szHeader
, sizeof(Globals
.szHeader
));
643 GetDlgItemText(hDlg
, NP_PAGESETUP_TAIL
, Globals
.szFooter
, sizeof(Globals
.szFooter
));
644 GetDlgItemText(hDlg
, NP_PAGESETUP_TOP
, Globals
.szMarginTop
, sizeof(Globals
.szMarginTop
));
645 GetDlgItemText(hDlg
, NP_PAGESETUP_BOTTOM
, Globals
.szMarginBottom
, sizeof(Globals
.szMarginBottom
));
646 GetDlgItemText(hDlg
, NP_PAGESETUP_LEFT
, Globals
.szMarginLeft
, sizeof(Globals
.szMarginLeft
));
647 GetDlgItemText(hDlg
, NP_PAGESETUP_RIGHT
, Globals
.szMarginRight
, sizeof(Globals
.szMarginRight
));
648 EndDialog(hDlg
, IDOK
);
652 /* discard user input and close dialog */
653 EndDialog(hDlg
, IDCANCEL
);
657 /* FIXME: Bring this to work */
658 MessageBox(Globals
.hMainWnd
, "Sorry, no help available", "Help", MB_ICONEXCLAMATION
);
664 /* fetch last user input prior to display dialog */
665 SetDlgItemText(hDlg
, NP_PAGESETUP_HEAD
, Globals
.szHeader
);
666 SetDlgItemText(hDlg
, NP_PAGESETUP_TAIL
, Globals
.szFooter
);
667 SetDlgItemText(hDlg
, NP_PAGESETUP_TOP
, Globals
.szMarginTop
);
668 SetDlgItemText(hDlg
, NP_PAGESETUP_BOTTOM
, Globals
.szMarginBottom
);
669 SetDlgItemText(hDlg
, NP_PAGESETUP_LEFT
, Globals
.szMarginLeft
);
670 SetDlgItemText(hDlg
, NP_PAGESETUP_RIGHT
, Globals
.szMarginRight
);