/* * Notepad * * Copyright 2000 Mike McCormack * Copyright 1997,98 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 * */ #define UNICODE #include #include #include "main.h" #include "dialog.h" #include "notepad_res.h" NOTEPAD_GLOBALS Globals; static ATOM aFINDMSGSTRING; /*********************************************************************** * * SetFileName * * Sets Global File Name. */ VOID SetFileName(LPCWSTR szFileName) { lstrcpy(Globals.szFileName, szFileName); Globals.szFileTitle[0] = 0; GetFileTitle(szFileName, Globals.szFileTitle, sizeof(Globals.szFileTitle)); } /*********************************************************************** * * NOTEPAD_MenuCommand * * All handling of main menu events */ static int NOTEPAD_MenuCommand(WPARAM wParam) { switch (wParam) { case CMD_NEW: DIALOG_FileNew(); break; case CMD_OPEN: DIALOG_FileOpen(); break; case CMD_SAVE: DIALOG_FileSave(); break; case CMD_SAVE_AS: DIALOG_FileSaveAs(); break; case CMD_PRINT: DIALOG_FilePrint(); break; case CMD_PAGE_SETUP: DIALOG_FilePageSetup(); break; case CMD_PRINTER_SETUP: DIALOG_FilePrinterSetup();break; case CMD_EXIT: DIALOG_FileExit(); break; case CMD_UNDO: DIALOG_EditUndo(); break; case CMD_CUT: DIALOG_EditCut(); break; case CMD_COPY: DIALOG_EditCopy(); break; case CMD_PASTE: DIALOG_EditPaste(); break; case CMD_DELETE: DIALOG_EditDelete(); break; case CMD_SELECT_ALL: DIALOG_EditSelectAll(); break; case CMD_TIME_DATE: DIALOG_EditTimeDate();break; case CMD_SEARCH: DIALOG_Search(); break; case CMD_SEARCH_NEXT: DIALOG_SearchNext(); break; case CMD_WRAP: DIALOG_EditWrap(); break; case CMD_FONT: DIALOG_SelectFont(); break; case CMD_HELP_CONTENTS: DIALOG_HelpContents(); break; case CMD_HELP_SEARCH: DIALOG_HelpSearch(); break; case CMD_HELP_ON_HELP: DIALOG_HelpHelp(); break; case CMD_LICENSE: DIALOG_HelpLicense(); break; case CMD_NO_WARRANTY: DIALOG_HelpNoWarranty(); break; case CMD_ABOUT_WINE: DIALOG_HelpAboutWine(); break; default: break; } return 0; } /*********************************************************************** * Data Initialization */ static VOID NOTEPAD_InitData(VOID) { LPWSTR p = Globals.szFilter; static const WCHAR txt_files[] = { '*','.','t','x','t',0 }; static const WCHAR all_files[] = { '*','.','*',0 }; LoadString(Globals.hInstance, STRING_TEXT_FILES_TXT, p, MAX_STRING_LEN); p += lstrlen(p) + 1; lstrcpy(p, txt_files); p += lstrlen(p) + 1; LoadString(Globals.hInstance, STRING_ALL_FILES, p, MAX_STRING_LEN); p += lstrlen(p) + 1; lstrcpy(p, all_files); p += lstrlen(p) + 1; *p = '\0'; } /*********************************************************************** * * NOTEPAD_WndProc */ static LRESULT WINAPI NOTEPAD_WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_CREATE: { static const WCHAR editW[] = { 'e','d','i','t',0 }; RECT rc; GetClientRect(hWnd, &rc); Globals.hEdit = CreateWindow(editW, NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | ES_AUTOVSCROLL | ES_MULTILINE, 0, 0, rc.right, rc.bottom, hWnd, NULL, Globals.hInstance, NULL); break; } case WM_COMMAND: NOTEPAD_MenuCommand(LOWORD(wParam)); break; case WM_DESTROYCLIPBOARD: /*MessageBox(Globals.hMainWnd, "Empty clipboard", "Debug", MB_ICONEXCLAMATION);*/ break; case WM_CLOSE: if (DoCloseFile()) { DestroyWindow(hWnd); } break; case WM_DESTROY: PostQuitMessage(0); break; case WM_SIZE: SetWindowPos(Globals.hEdit, NULL, 0, 0, LOWORD(lParam), HIWORD(lParam), SWP_NOOWNERZORDER | SWP_NOZORDER); break; case WM_SETFOCUS: SetFocus(Globals.hEdit); break; case WM_DROPFILES: { WCHAR szFileName[MAX_PATH]; HANDLE hDrop = (HANDLE) wParam; DragQueryFile(hDrop, 0, szFileName, SIZEOF(szFileName)); DragFinish(hDrop); DoOpenFile(szFileName); break; } default: return DefWindowProc(hWnd, msg, wParam, lParam); } return 0; } static int AlertFileDoesNotExist(LPCWSTR szFileName) { int nResult; WCHAR szMessage[MAX_STRING_LEN]; WCHAR szResource[MAX_STRING_LEN]; LoadString(Globals.hInstance, STRING_DOESNOTEXIST, szResource, SIZEOF(szResource)); wsprintf(szMessage, szResource, szFileName); LoadString(Globals.hInstance, STRING_ERROR, szResource, SIZEOF(szResource)); nResult = MessageBox(Globals.hMainWnd, szMessage, szResource, MB_ICONEXCLAMATION | MB_YESNO); return(nResult); } static void HandleCommandLine(LPWSTR cmdline) { WCHAR delimiter; /* skip white space */ while (*cmdline && *cmdline == ' ') cmdline++; /* skip executable name */ delimiter = ' '; if (*cmdline == '"') delimiter = '"'; do { cmdline++; } while (*cmdline && *cmdline != delimiter); if (*cmdline == delimiter) cmdline++; while (*cmdline && (*cmdline == ' ' || *cmdline == '-')) { WCHAR option; if (*cmdline++ == ' ') continue; option = *cmdline; if (option) cmdline++; while (*cmdline && *cmdline == ' ') cmdline++; switch(option) { case 'p': case 'P': printf("Print file: "); /* TODO - not yet able to print a file */ break; } } if (*cmdline) { /* file name is passed in the command line */ LPCWSTR file_name; BOOL file_exists; WCHAR buf[MAX_PATH]; if (cmdline[0] == '"') { cmdline++; cmdline[lstrlen(cmdline) - 1] = 0; } if (FileExists(cmdline)) { file_exists = TRUE; file_name = cmdline; } else { static const WCHAR txtW[] = { '.','t','x','t',0 }; /* try to find file with ".txt" extension */ if (!lstrcmp(txtW, cmdline + lstrlen(cmdline) - lstrlen(txtW))) { file_exists = FALSE; file_name = cmdline; } else { lstrcpyn(buf, cmdline, MAX_PATH - lstrlen(txtW) - 1); lstrcat(buf, txtW); file_name = buf; file_exists = FileExists(buf); } } if (file_exists) { DoOpenFile(file_name); InvalidateRect(Globals.hMainWnd, NULL, FALSE); } else { switch (AlertFileDoesNotExist(file_name)) { case IDYES: DoOpenFile(file_name); break; case IDNO: break; } } } } /*********************************************************************** * * WinMain */ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE prev, LPSTR cmdline, int show) { MSG msg; HACCEL hAccel; WNDCLASSEX class; static const WCHAR className[] = {'N','P','C','l','a','s','s',0}; static const WCHAR winName[] = {'N','o','t','e','p','a','d',0}; aFINDMSGSTRING = RegisterWindowMessage(FINDMSGSTRING); ZeroMemory(&Globals, sizeof(Globals)); Globals.hInstance = hInstance; ZeroMemory(&class, sizeof(class)); class.cbSize = sizeof(class); class.lpfnWndProc = NOTEPAD_WndProc; class.hInstance = Globals.hInstance; class.hIcon = LoadIcon(0, IDI_APPLICATION); class.hCursor = LoadCursor(0, IDC_ARROW); class.hbrBackground = (HBRUSH)(COLOR_WINDOW); class.lpszMenuName = MAKEINTRESOURCE(MAIN_MENU); class.lpszClassName = className; if (!RegisterClassEx(&class)) return FALSE; /* Setup windows */ Globals.hMainWnd = CreateWindow(className, winName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, Globals.hInstance, NULL); if (!Globals.hMainWnd) { ShowLastError(); ExitProcess(1); } NOTEPAD_InitData(); DIALOG_FileNew(); ShowWindow(Globals.hMainWnd, show); UpdateWindow(Globals.hMainWnd); DragAcceptFiles(Globals.hMainWnd, TRUE); HandleCommandLine(GetCommandLine()); hAccel = LoadAccelerators( hInstance, MAKEINTRESOURCE(ID_ACCEL) ); while (GetMessage(&msg, 0, 0, 0)) { if (!TranslateAccelerator(Globals.hMainWnd, hAccel, &msg) && !IsDialogMessage(Globals.hFindReplaceDlg, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } return msg.wParam; }