/* * Notepad (dialog.c) * * Copyright 1998,99 Marcel Baur * Copyright 2002 Sylvain Petreolle * Copyright 2002 Andriy Palamarchuk * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #include "main.h" #include "license.h" #include "dialog.h" static LRESULT WINAPI DIALOG_PAGESETUP_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam); VOID ShowLastError() { DWORD error = GetLastError(); if (error != NO_ERROR) { LPVOID lpMsgBuf; CHAR szTitle[MAX_STRING_LEN]; LoadString(Globals.hInstance, STRING_ERROR, szTitle, sizeof(szTitle)); FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, error, 0, (LPTSTR) &lpMsgBuf, 0, NULL); MessageBox(NULL, (char*)lpMsgBuf, szTitle, MB_OK | MB_ICONERROR); LocalFree(lpMsgBuf); } } /** * Sets the caption of the main window according to Globals.szFileTitle: * Notepad - (untitled) if no file is open * Notepad - [filename] if a file is given */ void UpdateWindowCaption(void) { CHAR szCaption[MAX_STRING_LEN]; CHAR szUntitled[MAX_STRING_LEN]; LoadString(Globals.hInstance, STRING_NOTEPAD, szCaption, sizeof(szCaption)); if (Globals.szFileTitle[0] != '\0') { lstrcat(szCaption, " - ["); lstrcat(szCaption, Globals.szFileTitle); lstrcat(szCaption, "]"); } else { LoadString(Globals.hInstance, STRING_UNTITLED, szUntitled, sizeof(szUntitled)); lstrcat(szCaption, " - "); lstrcat(szCaption, szUntitled); } SetWindowText(Globals.hMainWnd, szCaption); } int AlertIDS(UINT ids_message, UINT ids_caption, WORD type) { /* * Given some ids strings, this acts as a language-aware wrapper for * "MessageBox" */ CHAR szMessage[MAX_STRING_LEN]; CHAR szCaption[MAX_STRING_LEN]; LoadString(Globals.hInstance, ids_message, szMessage, sizeof(szMessage)); LoadString(Globals.hInstance, ids_caption, szCaption, sizeof(szCaption)); return (MessageBox(Globals.hMainWnd, szMessage, szCaption, type)); } void AlertFileNotFound(LPSTR szFileName) { int nResult; CHAR szMessage[MAX_STRING_LEN]; CHAR szRessource[MAX_STRING_LEN]; /* Load and format szMessage */ LoadString(Globals.hInstance, STRING_NOTFOUND, szRessource, sizeof(szRessource)); wsprintf(szMessage, szRessource, szFileName); /* Load szCaption */ LoadString(Globals.hInstance, STRING_ERROR, szRessource, sizeof(szRessource)); /* Display Modal Dialog */ nResult = MessageBox(Globals.hMainWnd, szMessage, szRessource, MB_ICONEXCLAMATION); } int AlertFileNotSaved(LPSTR szFileName) { int nResult; CHAR szMessage[MAX_STRING_LEN]; CHAR szRessource[MAX_STRING_LEN]; /* Load and format Message */ LoadString(Globals.hInstance, STRING_NOTSAVED, szRessource, sizeof(szRessource)); wsprintf(szMessage, szRessource, szFileName); /* Load Caption */ LoadString(Globals.hInstance, STRING_ERROR, szRessource, sizeof(szRessource)); /* Display modal */ nResult = MessageBox(Globals.hMainWnd, szMessage, szRessource, MB_ICONEXCLAMATION|MB_YESNOCANCEL); return(nResult); } VOID AlertOutOfMemory(void) { int nResult; nResult = AlertIDS(STRING_OUT_OF_MEMORY, STRING_ERROR, MB_ICONEXCLAMATION); PostQuitMessage(1); } /** * Returns: * TRUE - if file exists * FALSE - if file does not exist */ BOOL FileExists(LPSTR szFilename) { WIN32_FIND_DATA entry; HANDLE hFile; hFile = FindFirstFile(szFilename, &entry); FindClose(hFile); return (hFile != INVALID_HANDLE_VALUE); } VOID DoSaveFile(VOID) { HANDLE hFile; DWORD dwNumWrite; BOOL bTest; CHAR *pTemp; int size; hFile = CreateFile(Globals.szFileName, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if(hFile == INVALID_HANDLE_VALUE) { ShowLastError(); return; } size = GetWindowTextLength(Globals.hEdit); pTemp = (LPSTR) GlobalAlloc(GMEM_FIXED, size); if (!pTemp) { ShowLastError(); return; } GetWindowText(Globals.hEdit, pTemp, size); bTest = WriteFile(hFile, pTemp, size, &dwNumWrite, NULL); if(bTest == FALSE) { ShowLastError(); } CloseHandle(hFile); GlobalFree(pTemp); } /** * Returns: * TRUE - User agreed to close (both save/don't save) * FALSE - User cancelled close by selecting "Cancel" */ BOOL DoCloseFile(void) { int nResult; if (Globals.szFileName[0] != 0) { /* prompt user to save changes */ nResult = AlertFileNotSaved(Globals.szFileName); switch (nResult) { case IDYES: DIALOG_FileSave(); break; case IDNO: break; case IDCANCEL: return(FALSE); break; default: return(FALSE); break; } /* switch */ } /* if */ SetFileName(""); UpdateWindowCaption(); return(TRUE); } void DoOpenFile(LPSTR szFileName) { /* Close any files and prompt to save changes */ if (DoCloseFile()) { HANDLE hFile; CHAR *pTemp; DWORD size; DWORD dwNumRead; hFile = CreateFile(szFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if(hFile == INVALID_HANDLE_VALUE) { ShowLastError(); return; } size = GetFileSize(hFile, NULL); if (size == 0xFFFFFFFF) { ShowLastError(); return; } size++; pTemp = (LPSTR) GlobalAlloc(GMEM_FIXED, size); if (!pTemp) { ShowLastError(); return; } if (!ReadFile(hFile, pTemp, size, &dwNumRead, NULL)) { ShowLastError(); return; } CloseHandle(hFile); pTemp[dwNumRead] = '\0'; if (!SetWindowText(Globals.hEdit, pTemp)) { GlobalFree(pTemp); ShowLastError(); return; } SendMessage(Globals.hEdit, EM_EMPTYUNDOBUFFER, 0, 0); GlobalFree(pTemp); SetFocus(Globals.hEdit); SetFileName(szFileName); UpdateWindowCaption(); } } VOID DIALOG_FileNew(VOID) { /* Close any files and promt to save changes */ if (DoCloseFile()) { SetWindowText(Globals.hEdit, ""); SendMessage(Globals.hEdit, EM_EMPTYUNDOBUFFER, 0, 0); SetFocus(Globals.hEdit); } } VOID DIALOG_FileOpen(VOID) { OPENFILENAME openfilename; CHAR szPath[MAX_PATH]; CHAR szDir[MAX_PATH]; CHAR szDefaultExt[] = "txt"; ZeroMemory(&openfilename, sizeof(openfilename)); GetCurrentDirectory(sizeof(szDir), szDir); lstrcpy(szPath,"*.txt"); openfilename.lStructSize = sizeof(openfilename); openfilename.hwndOwner = Globals.hMainWnd; openfilename.hInstance = Globals.hInstance; openfilename.lpstrFilter = Globals.szFilter; openfilename.lpstrFile = szPath; openfilename.nMaxFile = sizeof(szPath); openfilename.lpstrInitialDir = szDir; openfilename.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY; openfilename.lpstrDefExt = szDefaultExt; if (GetOpenFileName(&openfilename)) { if (FileExists(openfilename.lpstrFile)) DoOpenFile(openfilename.lpstrFile); else AlertFileNotFound(openfilename.lpstrFile); } } VOID DIALOG_FileSave(VOID) { if (Globals.szFileName[0] == '\0') DIALOG_FileSaveAs(); else DoSaveFile(); } VOID DIALOG_FileSaveAs(VOID) { OPENFILENAME saveas; CHAR szPath[MAX_PATH]; CHAR szDir[MAX_PATH]; CHAR szDefaultExt[] = "txt"; ZeroMemory(&saveas, sizeof(saveas)); GetCurrentDirectory(sizeof(szDir), szDir); lstrcpy(szPath,"*.*"); saveas.lStructSize = sizeof(OPENFILENAME); saveas.hwndOwner = Globals.hMainWnd; saveas.hInstance = Globals.hInstance; saveas.lpstrFilter = Globals.szFilter; saveas.lpstrFile = szPath; saveas.nMaxFile = sizeof(szPath); saveas.lpstrInitialDir = szDir; saveas.Flags = OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY; saveas.lpstrDefExt = szDefaultExt; if (GetSaveFileName(&saveas)) { SetFileName(szPath); UpdateWindowCaption(); DoSaveFile(); } } VOID DIALOG_FilePrint(VOID) { LONG bFlags, nBase; WORD nOffset; DOCINFO di; int nResult; HDC hContext; PRINTDLG printer; CHAR szDocumentName[MAX_STRING_LEN]; /* Name of document */ CHAR szPrinterName[MAX_STRING_LEN]; /* Name of the printer */ CHAR szDeviceName[MAX_STRING_LEN]; /* Name of the printer device */ CHAR szOutput[MAX_STRING_LEN]; /* in which file/device to print */ /* LPDEVMODE hDevMode; */ /* LPDEVNAMES hDevNames; */ /* hDevMode = GlobalAlloc(GMEM_MOVEABLE + GMEM_ZEROINIT, sizeof(DEVMODE)); */ /* hDevNames = GlobalAlloc(GMEM_MOVEABLE + GMEM_ZEROINIT, sizeof(DEVNAMES)); */ /* Get Current Settings */ ZeroMemory(&printer, sizeof(printer)); printer.lStructSize = sizeof(printer); printer.hwndOwner = Globals.hMainWnd; printer.hInstance = Globals.hInstance; nResult = PrintDlg(&printer); /* hContext = CreateDC(, szDeviceName, "TEST.TXT", 0); */ /* Congratulations to those Microsoft Engineers responsible */ /* for the following pointer acrobatics */ assert(printer.hDevNames!=0); nBase = (LONG)(printer.hDevNames); nOffset = (WORD)((LPDEVNAMES) printer.hDevNames)->wDriverOffset; lstrcpy(szPrinterName, (LPSTR) (nBase + nOffset)); nOffset = (WORD)((LPDEVNAMES) printer.hDevNames)->wDeviceOffset; lstrcpy(szDeviceName, (LPSTR) (nBase + nOffset)); nOffset = (WORD)((LPDEVNAMES) printer.hDevNames)->wOutputOffset; lstrcpy(szOutput, (LPSTR) (nBase + nOffset)); MessageBox(Globals.hMainWnd, szPrinterName, "Printer Name", MB_ICONEXCLAMATION); MessageBox(Globals.hMainWnd, szDeviceName, "Device Name", MB_ICONEXCLAMATION); MessageBox(Globals.hMainWnd, szOutput, "Output", MB_ICONEXCLAMATION); /* Set some default flags */ bFlags = PD_RETURNDC + PD_SHOWHELP; if (TRUE) { /* Remove "Print Selection" if there is no selection */ bFlags = bFlags + PD_NOSELECTION; } printer.Flags = bFlags; /* printer.nFromPage = 0; printer.nToPage = 0; printer.nMinPage = 0; printer.nMaxPage = 0; */ /* Let commdlg manage copy settings */ printer.nCopies = (WORD)PD_USEDEVMODECOPIES; if (PrintDlg(&printer)) { /* initialize DOCINFO */ di.cbSize = sizeof(DOCINFO); lstrcpy((LPSTR)di.lpszDocName, szDocumentName); lstrcpy((LPSTR)di.lpszOutput, szOutput); hContext = printer.hDC; assert(hContext!=0); assert( (int) hContext!=PD_RETURNDC); SetMapMode(hContext, MM_LOMETRIC); /* SetViewPortExExt(hContext, 10, 10, 0); */ SetBkMode(hContext, OPAQUE); nResult = TextOut(hContext, 0, 0, " ", 1); assert(nResult != 0); nResult = StartDoc(hContext, &di); assert(nResult != SP_ERROR); nResult = StartPage(hContext); assert(nResult >0); /* FIXME: actually print */ nResult = EndPage(hContext); switch (nResult) { case SP_ERROR: MessageBox(Globals.hMainWnd, "Generic Error", "Print Engine Error", MB_ICONEXCLAMATION); break; case SP_APPABORT: MessageBox(Globals.hMainWnd, "The print job was aborted.", "Print Engine Error", MB_ICONEXCLAMATION); break; case SP_USERABORT: MessageBox(Globals.hMainWnd, "The print job was aborted using the Print Manager ", "Print Engine Error", MB_ICONEXCLAMATION); break; case SP_OUTOFDISK: MessageBox(Globals.hMainWnd, "Out of disk space", "Print Engine Error", MB_ICONEXCLAMATION); break; case SP_OUTOFMEMORY: AlertOutOfMemory(); break; default: MessageBox(Globals.hMainWnd, "Default", "Print", MB_ICONEXCLAMATION); } /* switch */ nResult = EndDoc(hContext); assert(nResult>=0); nResult = DeleteDC(hContext); assert(nResult!=0); } /* if */ /* GlobalFree(hDevNames); */ /* GlobalFree(hDevMode); */ } VOID DIALOG_FilePageSetup(VOID) { DIALOG_PageSetup(); } VOID DIALOG_FilePrinterSetup(VOID) { PRINTDLG printer; ZeroMemory(&printer, sizeof(printer)); printer.lStructSize = sizeof(printer); printer.hwndOwner = Globals.hMainWnd; printer.hInstance = Globals.hInstance; printer.Flags = PD_PRINTSETUP; printer.nCopies = 1; if (PrintDlg(&printer)) { /* do nothing */ }; } VOID DIALOG_FileExit(VOID) { PostMessage(Globals.hMainWnd, WM_CLOSE, 0, 0l); } VOID DIALOG_EditUndo(VOID) { SendMessage(Globals.hEdit, EM_UNDO, 0, 0); } VOID DIALOG_EditCut(VOID) { HANDLE hMem; hMem = GlobalAlloc(GMEM_ZEROINIT, 99); OpenClipboard(Globals.hMainWnd); EmptyClipboard(); /* FIXME: Get text */ lstrcpy((CHAR *)hMem, "Hello World"); SetClipboardData(CF_TEXT, hMem); CloseClipboard(); GlobalFree(hMem); } VOID DIALOG_EditCopy(VOID) { HANDLE hMem; hMem = GlobalAlloc(GMEM_ZEROINIT, 99); OpenClipboard(Globals.hMainWnd); EmptyClipboard(); /* FIXME: Get text */ lstrcpy((CHAR *)hMem, "Hello World"); SetClipboardData(CF_TEXT, hMem); CloseClipboard(); GlobalFree(hMem); } VOID DIALOG_EditPaste(VOID) { HANDLE hClipText; if (IsClipboardFormatAvailable(CF_TEXT)) { OpenClipboard(Globals.hMainWnd); hClipText = GetClipboardData(CF_TEXT); CloseClipboard(); MessageBox(Globals.hMainWnd, (CHAR *)hClipText, "PASTE", MB_ICONEXCLAMATION); } } VOID DIALOG_EditDelete(VOID) { /* Delete */ } VOID DIALOG_EditSelectAll(VOID) { /* Select all */ } VOID DIALOG_EditTimeDate(VOID) { SYSTEMTIME st; LPSYSTEMTIME lpst = &st; CHAR szDate[MAX_STRING_LEN]; LPSTR date = szDate; GetLocalTime(&st); GetDateFormat(LOCALE_USER_DEFAULT, LOCALE_SLONGDATE, lpst, NULL, date, MAX_STRING_LEN); GetTimeFormat(LOCALE_USER_DEFAULT, LOCALE_STIMEFORMAT, lpst, NULL, date, MAX_STRING_LEN); } VOID DIALOG_EditWrap(VOID) { Globals.bWrapLongLines = !Globals.bWrapLongLines; CheckMenuItem(GetMenu(Globals.hMainWnd), CMD_WRAP, MF_BYCOMMAND | (Globals.bWrapLongLines ? MF_CHECKED : MF_UNCHECKED)); } VOID DIALOG_Search(VOID) { ZeroMemory(&Globals.find, sizeof(Globals.find)); Globals.find.lStructSize = sizeof(Globals.find); Globals.find.hwndOwner = Globals.hMainWnd; Globals.find.hInstance = Globals.hInstance; Globals.find.lpstrFindWhat = (CHAR *) &Globals.szFindText; Globals.find.wFindWhatLen = sizeof(Globals.szFindText); Globals.find.Flags = FR_DOWN; /* We only need to create the modal FindReplace dialog which will */ /* notify us of incoming events using hMainWnd Window Messages */ Globals.hFindReplaceDlg = FindText(&Globals.find); assert(Globals.hFindReplaceDlg !=0); } VOID DIALOG_SearchNext(VOID) { /* Search Next */ } VOID DIALOG_HelpContents(VOID) { WinHelp(Globals.hMainWnd, HELPFILE, HELP_INDEX, 0); } VOID DIALOG_HelpSearch(VOID) { /* Search Help */ } VOID DIALOG_HelpHelp(VOID) { WinHelp(Globals.hMainWnd, HELPFILE, HELP_HELPONHELP, 0); } VOID DIALOG_HelpLicense(VOID) { WineLicense(Globals.hMainWnd); } VOID DIALOG_HelpNoWarranty(VOID) { WineWarranty(Globals.hMainWnd); } VOID DIALOG_HelpAboutWine(VOID) { CHAR szNotepad[MAX_STRING_LEN]; LoadString(Globals.hInstance, STRING_NOTEPAD, szNotepad, sizeof(szNotepad)); ShellAbout(Globals.hMainWnd, szNotepad, "Notepad\n" WINE_RELEASE_INFO, 0); } /*********************************************************************** * * DIALOG_PageSetup */ VOID DIALOG_PageSetup(VOID) { WNDPROC lpfnDlg; lpfnDlg = MakeProcInstance(DIALOG_PAGESETUP_DlgProc, Globals.hInstance); DialogBox(Globals.hInstance, MAKEINTRESOURCE(DIALOG_PAGESETUP), Globals.hMainWnd, (DLGPROC)lpfnDlg); FreeProcInstance(lpfnDlg); } /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * DIALOG_PAGESETUP_DlgProc */ static LRESULT WINAPI DIALOG_PAGESETUP_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_COMMAND: switch (wParam) { case IDOK: /* save user input and close dialog */ GetDlgItemText(hDlg, 0x141, Globals.szHeader, sizeof(Globals.szHeader)); GetDlgItemText(hDlg, 0x143, Globals.szFooter, sizeof(Globals.szFooter)); GetDlgItemText(hDlg, 0x14A, Globals.szMarginTop, sizeof(Globals.szMarginTop)); GetDlgItemText(hDlg, 0x150, Globals.szMarginBottom, sizeof(Globals.szMarginBottom)); GetDlgItemText(hDlg, 0x147, Globals.szMarginLeft, sizeof(Globals.szMarginLeft)); GetDlgItemText(hDlg, 0x14D, Globals.szMarginRight, sizeof(Globals.szMarginRight)); EndDialog(hDlg, IDOK); return TRUE; case IDCANCEL: /* discard user input and close dialog */ EndDialog(hDlg, IDCANCEL); return TRUE; case IDHELP: /* FIXME: Bring this to work */ MessageBox(Globals.hMainWnd, "Sorry, no help available", "Help", MB_ICONEXCLAMATION); return TRUE; } break; case WM_INITDIALOG: /* fetch last user input prior to display dialog */ SetDlgItemText(hDlg, 0x141, Globals.szHeader); SetDlgItemText(hDlg, 0x143, Globals.szFooter); SetDlgItemText(hDlg, 0x14A, Globals.szMarginTop); SetDlgItemText(hDlg, 0x150, Globals.szMarginBottom); SetDlgItemText(hDlg, 0x147, Globals.szMarginLeft); SetDlgItemText(hDlg, 0x14D, Globals.szMarginRight); break; } return FALSE; }