From cd3d342b0ba0510c1a4c2fa1659537bc22590f36 Mon Sep 17 00:00:00 2001 From: Ged Murphy Date: Thu, 6 Apr 2006 15:54:59 +0000 Subject: [PATCH] Start a rewrite of an MDI WordPad. svn path=/trunk/; revision=21477 --- reactos/base/applications/wordpad/En.rc | 167 +++++ reactos/base/applications/wordpad/about.c | 54 ++ reactos/base/applications/wordpad/dialogs.c | 131 ++++ reactos/base/applications/wordpad/editwnd.c | 202 ++++++ reactos/base/applications/wordpad/mainwnd.c | 663 ++++++++++++++++++ .../base/applications/wordpad/manifest.xml | 24 + reactos/base/applications/wordpad/misc.c | 204 ++++++ reactos/base/applications/wordpad/opensave.c | 87 +++ reactos/base/applications/wordpad/precomp.h | 160 +++++ .../base/applications/wordpad/res/toolbar.bmp | Bin 0 -> 5558 bytes .../base/applications/wordpad/res/wordpad.ico | Bin 0 -> 25214 bytes reactos/base/applications/wordpad/resource.h | 102 +++ reactos/base/applications/wordpad/wordpad.c | 84 +++ .../base/applications/wordpad/wordpad.rbuild | 28 + reactos/base/applications/wordpad/wordpad.rc | 26 + 15 files changed, 1932 insertions(+) create mode 100644 reactos/base/applications/wordpad/En.rc create mode 100644 reactos/base/applications/wordpad/about.c create mode 100644 reactos/base/applications/wordpad/dialogs.c create mode 100644 reactos/base/applications/wordpad/editwnd.c create mode 100644 reactos/base/applications/wordpad/mainwnd.c create mode 100644 reactos/base/applications/wordpad/manifest.xml create mode 100644 reactos/base/applications/wordpad/misc.c create mode 100644 reactos/base/applications/wordpad/opensave.c create mode 100644 reactos/base/applications/wordpad/precomp.h create mode 100644 reactos/base/applications/wordpad/res/toolbar.bmp create mode 100644 reactos/base/applications/wordpad/res/wordpad.ico create mode 100644 reactos/base/applications/wordpad/resource.h create mode 100644 reactos/base/applications/wordpad/wordpad.c create mode 100644 reactos/base/applications/wordpad/wordpad.rbuild create mode 100644 reactos/base/applications/wordpad/wordpad.rc diff --git a/reactos/base/applications/wordpad/En.rc b/reactos/base/applications/wordpad/En.rc new file mode 100644 index 00000000000..48c1c532723 --- /dev/null +++ b/reactos/base/applications/wordpad/En.rc @@ -0,0 +1,167 @@ +IDR_MAINMENU MENU +BEGIN + POPUP "&File" + BEGIN + MENUITEM "&New...", ID_NEW + MENUITEM "&Open...", ID_OPEN + MENUITEM SEPARATOR + MENUITEM "&Close\tCtrl+F4", ID_CLOSE, GRAYED + MENUITEM "C&lose all", ID_CLOSEALL, GRAYED + MENUITEM SEPARATOR + MENUITEM "&Save", ID_SAVE, GRAYED + MENUITEM "Save &As...", ID_SAVEAS, GRAYED + MENUITEM SEPARATOR + MENUITEM "Print Pre&view", ID_PRINTPRE, GRAYED + MENUITEM "&Print...", ID_PRINT, GRAYED + MENUITEM SEPARATOR + MENUITEM "Page Set&up...", ID_PAGESETUP, GRAYED + MENUITEM SEPARATOR + MENUITEM "E&xit\tAlt+F4", ID_EXIT + END + POPUP "&Edit" + BEGIN + MENUITEM "&Undo", ID_UNDO, GRAYED + MENUITEM "&Redo", ID_REDO, GRAYED + MENUITEM SEPARATOR + MENUITEM "Cu&t", ID_CUT, GRAYED + MENUITEM "&Copy", ID_COPY, GRAYED + MENUITEM "&Paste", ID_PASTE, GRAYED + MENUITEM SEPARATOR + MENUITEM "Clear", -1, GRAYED + MENUITEM "Select &All", ID_SELALL, GRAYED + MENUITEM SEPARATOR + MENUITEM "&Find...\tCtrl+F",-1, GRAYED + MENUITEM "Find Next", -1, GRAYED + MENUITEM "Replace\tCtrl+H", -1, GRAYED + MENUITEM SEPARATOR + MENUITEM "Object Properties",-1, GRAYED + MENUITEM "Object", -1, GRAYED + END + POPUP "&View" + BEGIN + MENUITEM "&Toolbar", -1, CHECKED + MENUITEM "&Format Bar", -1, CHECKED + MENUITEM "&Ruler", -1, CHECKED + MENUITEM "&Status Bar", ID_STATUSBAR, CHECKED + END + POPUP "&Insert" + BEGIN + MENUITEM "&Date and Time...",-1, GRAYED + MENUITEM "&Object...", -1, GRAYED + END + POPUP "&Format" + BEGIN + MENUITEM "&Font...", -1 GRAYED + MENUITEM "Bulletstyle", -1, GRAYED + MENUITEM "Paragraph...", -1, GRAYED + MENUITEM "tabs...", -1, GRAYED + END + POPUP "&Window" + BEGIN + MENUITEM "&Cascade", ID_WINDOW_CASCADE + MENUITEM "Tile &Horizontally", ID_WINDOW_TILE_HORZ + MENUITEM "Tile &Vertiacally", ID_WINDOW_TILE_VERT + MENUITEM "&Arrange Icons", ID_WINDOW_ARRANGE + MENUITEM SEPARATOR + MENUITEM "Nex&t\tCtrl+F6", ID_WINDOW_NEXT + END + POPUP "&Help" + BEGIN + MENUITEM "&About...", ID_ABOUT + END +END + +IDR_POPUP MENU +BEGIN + POPUP "popup" + BEGIN + + MENUITEM SEPARATOR + + END +END + + +IDD_NEWDOCSEL DIALOGEX 6,6,159,67 +CAPTION "New" +FONT 8,"Tahoma",0,0 +STYLE WS_BORDER | WS_DLGFRAME | DS_MODALFRAME +BEGIN + LTEXT "New document Type:", IDC_STATIC, 4, 3, 72, 9 + LISTBOX IDC_LIST, 4, 16, 104, 46, WS_TABSTOP + PUSHBUTTON "&OK", IDOK, 112, 16, 44, 13 + PUSHBUTTON "&Cancel", IDCANCEL, 112, 33, 44, 13 +END + + +IDD_ABOUTBOX DIALOGEX 22,16,190,182 +CAPTION "About WordPad" +FONT 8,"Tahoma",0,0 +STYLE WS_BORDER | WS_DLGFRAME | WS_SYSMENU | DS_MODALFRAME +BEGIN + LTEXT "WordPad II v0.1\nCopyright (C) 2006\nGed Murphy (gedmurphy@gmail.com)", IDC_STATIC, 48, 7, 150, 36 + PUSHBUTTON "Close", IDOK, 65, 162, 44, 15 + ICON IDI_ICON, IDC_STATIC, 10, 10, 7, 30 + EDITTEXT IDC_LICENSE_EDIT, 8, 40, 174, 110, WS_VISIBLE | WS_VSCROLL | WS_TABSTOP | ES_READONLY | ES_MULTILINE +END + + +STRINGTABLE DISCARDABLE +BEGIN + IDS_LICENSE "This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.\r\n\r\nThis program 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 General Public License for more details.\r\n\r\nYou should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA." + IDS_DEFAULT_NAME "Document %1!u!" + IDS_READY " Ready." +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_DOC_TYPE_RICH_TEXT "Rich Text Document" + IDS_DOC_TYPE_UNICODE_TEXT "Text Document" + IDS_DOC_TYPE_TEXT "Unicode Text Document" +END + + + +/* Tooltips */ +STRINGTABLE DISCARDABLE +BEGIN + IDS_TOOLTIP_NEW "New" + IDS_TOOLTIP_OPEN "Open" + IDS_TOOLTIP_SAVE "Save" + IDS_TOOLTIP_PRINTPRE "Print preview" + IDS_TOOLTIP_PRINT "Print" + IDS_TOOLTIP_CUT "Cut" + IDS_TOOLTIP_COPY "Copy" + IDS_TOOLTIP_PASTE "Paste" + IDS_TOOLTIP_UNDO "Undo" + IDS_TOOLTIP_REDO "Redo" +END + +/* Hints */ +STRINGTABLE DISCARDABLE +BEGIN + IDS_HINT_BLANK " " + IDS_HINT_NEW " Creates a new document." + IDS_HINT_OPEN " Opens an existing document." + IDS_HINT_CLOSE " Closes this window." + IDS_HINT_CLOSEALL " Closes all windows." + IDS_HINT_SAVE " Saves the active document." + IDS_HINT_SAVEAS " Saves the active document with a new name." + IDS_HINT_PRINT " Prints the active document." + IDS_HINT_PRINTPRE " Previews the printed document." + IDS_HINT_PAGESETUP " Changes page layout settings." + IDS_HINT_EXIT " Exits this application." + + IDS_HINT_CASCADE " Arrange windows so they overlap." + IDS_HINT_TILE_HORZ " Arrange windows as non-overlapping tiles." + IDS_HINT_TILE_VERT " Arrange windows as non-overlapping tiles." + IDS_HINT_ARRANGE " Arrange icons at the bottom of the window." + IDS_HINT_NEXT " Activates the next window." + + IDS_HINT_SYS_RESTORE " Restores this window to normal size." + IDS_HINT_SYS_MOVE " Moves this window." + IDS_HINT_SYS_SIZE " Resizes this window." + IDS_HINT_SYS_MINIMIZE " Collapses this window to an icon." + IDS_HINT_SYS_MAXIMIZE " Expands this window to fill this screen." +END + diff --git a/reactos/base/applications/wordpad/about.c b/reactos/base/applications/wordpad/about.c new file mode 100644 index 00000000000..a52ed3f2d37 --- /dev/null +++ b/reactos/base/applications/wordpad/about.c @@ -0,0 +1,54 @@ +#include "precomp.h" + +INT_PTR CALLBACK +AboutDialogProc(HWND hDlg, + UINT message, + WPARAM wParam, + LPARAM lParam) +{ + HWND hLicenseEditWnd; + HICON hIcon = NULL; + TCHAR strLicense[700]; + + switch (message) + { + case WM_INITDIALOG: + + hIcon = LoadImage(hInstance, + MAKEINTRESOURCE(IDI_ICON), + IMAGE_ICON, + 16, + 16, + 0); + + SendMessage(hDlg, + WM_SETICON, + ICON_SMALL, + (LPARAM)hIcon); + + hLicenseEditWnd = GetDlgItem(hDlg, + IDC_LICENSE_EDIT); + + LoadString(hInstance, + IDS_LICENSE, + strLicense, + sizeof(strLicense) / sizeof(TCHAR)); + + SetWindowText(hLicenseEditWnd, + strLicense); + return TRUE; + + case WM_COMMAND: + if ((LOWORD(wParam) == IDOK) || (LOWORD(wParam) == IDCANCEL)) + { + DestroyIcon(hIcon); + EndDialog(hDlg, + LOWORD(wParam)); + return TRUE; + } + + break; + } + + return FALSE; +} diff --git a/reactos/base/applications/wordpad/dialogs.c b/reactos/base/applications/wordpad/dialogs.c new file mode 100644 index 00000000000..ff61502959a --- /dev/null +++ b/reactos/base/applications/wordpad/dialogs.c @@ -0,0 +1,131 @@ +#include "precomp.h" + +INT_PTR CALLBACK +NewDocSelDlgProc(HWND hDlg, + UINT message, + WPARAM wParam, + LPARAM lParam) +{ + switch (message) + { + static HWND hList; + + case WM_INITDIALOG: + { + LPTSTR lpDocType; + INT i; + + hList = GetDlgItem(hDlg, + IDC_LIST); + + for (i = IDS_DOC_TYPE_RICH_TEXT; i <= IDS_DOC_TYPE_TEXT; i++) + { + if (AllocAndLoadString(&lpDocType, + hInstance, + i)) + { + ListBox_AddString(hList, + lpDocType); + LocalFree((HLOCAL)lpDocType); + } + } + + SendMessage(hList, + LB_SETCURSEL, + 0, + 0); + + return TRUE; + } + + case WM_COMMAND: + { + INT LbSel; + + if (HIWORD(wParam) == LBN_DBLCLK) + { + LbSel = (INT)SendMessage(hList, + LB_GETCURSEL, + 0, + 0); + EndDialog(hDlg, + LbSel); + return TRUE; + } + + switch (LOWORD(wParam)) + { + case IDOK: + LbSel = (INT)SendMessage(hList, + LB_GETCURSEL, + 0, + 0); + EndDialog(hDlg, + LbSel); + return TRUE; + + case IDCANCEL: + EndDialog(hDlg, -1); + return TRUE; + } + } + } + + return FALSE; +} + + + +INT_PTR CALLBACK +AboutDialogProc(HWND hDlg, + UINT message, + WPARAM wParam, + LPARAM lParam) +{ + HWND hLicenseEditWnd; + HICON hIcon = NULL; + TCHAR strLicense[700]; + + switch (message) + { + case WM_INITDIALOG: + + hIcon = LoadImage(hInstance, + MAKEINTRESOURCE(IDI_ICON), + IMAGE_ICON, + 16, + 16, + 0); + + SendMessage(hDlg, + WM_SETICON, + ICON_SMALL, + (LPARAM)hIcon); + + hLicenseEditWnd = GetDlgItem(hDlg, + IDC_LICENSE_EDIT); + + LoadString(hInstance, + IDS_LICENSE, + strLicense, + sizeof(strLicense) / sizeof(TCHAR)); + + SetWindowText(hLicenseEditWnd, + strLicense); + return TRUE; + + case WM_COMMAND: + if ((LOWORD(wParam) == IDOK) || (LOWORD(wParam) == IDCANCEL)) + { + DestroyIcon(hIcon); + EndDialog(hDlg, + LOWORD(wParam)); + return TRUE; + } + + break; + } + + return FALSE; +} + diff --git a/reactos/base/applications/wordpad/editwnd.c b/reactos/base/applications/wordpad/editwnd.c new file mode 100644 index 00000000000..ffc93eac686 --- /dev/null +++ b/reactos/base/applications/wordpad/editwnd.c @@ -0,0 +1,202 @@ +#include "precomp.h" + +static const TCHAR szEditWndClass[] = TEXT("WordPadEditWndClass"); + + +static BOOL +InitEditWnd(PEDIT_WND_INFO Info) +{ + HANDLE hDLL; + HFONT hfDefault; + + hDLL = LoadLibrary(_T("RICHED20.DLL")); + if (hDLL == NULL) + { + GetError(0); + return FALSE; + } + + Info->hEdit = CreateWindowEx(0, //WS_EX_CLIENTEDGE, + RICHEDIT_CLASS, + NULL, + WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | + ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL, + 0, + 0, + 100, + 100, + Info->hSelf, + NULL, + hInstance, + NULL); + if(Info->hEdit == NULL) + { + GetError(0); + + return FALSE; + } + + hfDefault = GetStockObject(DEFAULT_GUI_FONT); + SendMessage(Info->hEdit, + WM_SETFONT, + (WPARAM)hfDefault, + MAKELPARAM(FALSE, 0)); + + return TRUE; +} + + +static LRESULT CALLBACK +EditWndProc(HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) +{ + PEDIT_WND_INFO Info; + LRESULT Ret = 0; + + /* Get the window context */ + Info = (PEDIT_WND_INFO)GetWindowLongPtr(hwnd, + GWLP_USERDATA); + if (Info == NULL && uMsg != WM_CREATE) + { + goto HandleDefaultMessage; + } + + switch (uMsg) + { + case WM_CREATE: + { + Info = (PEDIT_WND_INFO)(((LPMDICREATESTRUCT)((LPCREATESTRUCT)lParam)->lpCreateParams)->lParam); + Info->hSelf = hwnd; + + SetWindowLongPtr(hwnd, + GWLP_USERDATA, + (LONG_PTR)Info); + + if (!InitEditWnd(Info)) + { + Ret = (LRESULT)-1; + break; + } + break; + } + + case WM_SIZE: + { + RECT rcClient; + + if (GetClientRect(Info->hSelf, + &rcClient)) + { + SetWindowPos(Info->hEdit, + NULL, + 0, + 0, + rcClient.right, + rcClient.bottom, + SWP_NOZORDER); + } + } + + default: +HandleDefaultMessage: + Ret = DefMDIChildProc(hwnd, + uMsg, + wParam, + lParam); + break; + } + + return Ret; + +} + + +VOID +SetEditorEnvironment(PEDIT_WND_INFO Info, + BOOL Setup) +{ + if (Setup) + { + /* FIXME - setup editor environment (e.g. show toolbars, enable menus etc) */ + } + else + { + /* FIXME - cleanup editor environment (e.g. hide toolbars, disable menus etc) */ + } +} + + +BOOL +CreateEditWindow(struct _MAIN_WND_INFO *MainWnd, + POPEN_EDIT_INFO OpenInfo) +{ + PEDIT_WND_INFO Info; + HWND hWndEditor; + + Info = HeapAlloc(ProcessHeap, + 0, + sizeof(EDIT_WND_INFO)); + if (Info != NULL) + { + ZeroMemory(Info, + sizeof(EDIT_WND_INFO)); + Info->MainWnd = MainWnd; + Info->MdiEditorType = metImageEditor; + Info->OpenInfo = OpenInfo; + + hWndEditor = CreateMDIWindow(szEditWndClass, + OpenInfo->lpImageName, + WS_MAXIMIZE, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + MainWnd->hMdiClient, + hInstance, + (LPARAM)Info); + + if (hWndEditor != NULL) + return TRUE; + + + HeapFree(ProcessHeap, + 0, + Info); + } + + return FALSE; +} + +BOOL +InitEditWindowImpl(VOID) +{ + WNDCLASSEX wc = {0}; + + wc.cbSize = sizeof(WNDCLASSEX); + wc.lpfnWndProc = EditWndProc; + wc.hInstance = hInstance; + wc.hIcon = LoadIcon(hInstance, + MAKEINTRESOURCE(IDI_ICON)); + wc.hCursor = LoadCursor(NULL, + IDC_ARROW); + wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1); + wc.lpszMenuName = NULL; + wc.lpszClassName = szEditWndClass; + wc.hIconSm = (HICON)LoadImage(hInstance, + MAKEINTRESOURCE(IDI_ICON), + IMAGE_ICON, + 16, + 16, + LR_SHARED); + + return RegisterClassEx(&wc) != (ATOM)0; +} + +VOID +UninitEditWindowImpl(VOID) +{ + UnregisterClass(szEditWndClass, + hInstance); +} diff --git a/reactos/base/applications/wordpad/mainwnd.c b/reactos/base/applications/wordpad/mainwnd.c new file mode 100644 index 00000000000..4f18f03f524 --- /dev/null +++ b/reactos/base/applications/wordpad/mainwnd.c @@ -0,0 +1,663 @@ +#include "precomp.h" + +static const TCHAR szMainWndClass[] = TEXT("WordPadMainWndClass"); + +#define ID_MDI_FIRSTCHILD 50000 +#define ID_MDI_WINDOWMENU 5 + +/* menu hints */ +static const MENU_HINT MainMenuHintTable[] = { + /* File Menu */ + {ID_BLANK, IDS_HINT_BLANK}, + {ID_NEW, IDS_HINT_NEW}, + {ID_OPEN, IDS_HINT_OPEN}, + {ID_CLOSE, IDS_HINT_CLOSE}, + {ID_CLOSEALL, IDS_HINT_CLOSEALL}, + {ID_SAVE, IDS_HINT_SAVE}, + {ID_SAVEAS, IDS_HINT_SAVEAS}, + {ID_PRINT, IDS_HINT_PRINT}, + {ID_PRINTPRE, IDS_HINT_PRINTPRE}, + {ID_PAGESETUP, IDS_HINT_PAGESETUP}, + {ID_EXIT, IDS_HINT_EXIT}, + + /* Window Menu */ + {ID_WINDOW_NEXT, IDS_HINT_NEXT}, + {ID_WINDOW_CASCADE, IDS_HINT_CASCADE}, + {ID_WINDOW_TILE_HORZ, IDS_HINT_TILE_HORZ}, + {ID_WINDOW_TILE_VERT, IDS_HINT_TILE_VERT}, + {ID_WINDOW_ARRANGE, IDS_HINT_ARRANGE} +}; + +static const MENU_HINT SystemMenuHintTable[] = { + {SC_RESTORE, IDS_HINT_SYS_RESTORE}, + {SC_MOVE, IDS_HINT_SYS_MOVE}, + {SC_SIZE, IDS_HINT_SYS_SIZE}, + {SC_MINIMIZE, IDS_HINT_SYS_MINIMIZE}, + {SC_MAXIMIZE, IDS_HINT_SYS_MAXIMIZE}, + {SC_CLOSE, IDS_HINT_CLOSE}, + {SC_NEXTWINDOW, IDS_HINT_NEXT}, +}; + + +static VOID +CreateToolbars(PMAIN_WND_INFO Info) +{ + +} + +static VOID CALLBACK +MainWndResize(PVOID Context, + WORD cx, + WORD cy) +{ + RECT rcClient = {0}; + RECT rcStatus = {0}; + HDWP dwp; + PMAIN_WND_INFO Info = (PMAIN_WND_INFO)Context; + + /* Calculate the MDI client rectangle */ + rcClient.right = cx; + rcClient.bottom = cy; + + if (Info->hStatus != NULL) + { + GetWindowRect(Info->hStatus, + &rcStatus); + rcClient.bottom -= (rcStatus.bottom - rcStatus.top); + } + + + dwp = BeginDeferWindowPos(2); + if (dwp != NULL) + { + /* Update the MDI client */ + if (Info->hMdiClient != NULL) + { + dwp = DeferWindowPos(dwp, + Info->hMdiClient, + NULL, + rcClient.left, + rcClient.top, + rcClient.right - rcClient.left, + rcClient.bottom - rcClient.top, + SWP_NOZORDER); + if (dwp == NULL) + return; + } + + /* Update the status bar */ + if (Info->hStatus != NULL) + { + dwp = DeferWindowPos(dwp, + Info->hStatus, + NULL, + 0, + cy - (rcStatus.bottom - rcStatus.top), + cx, + rcStatus.bottom - rcStatus.top, + SWP_NOZORDER); + if (dwp == NULL) + return; + } + + EndDeferWindowPos(dwp); + } +} + +static VOID +InitMainWnd(PMAIN_WND_INFO Info) +{ + CLIENTCREATESTRUCT ccs; + INT statwidths[] = {110, -1}; + + /* FIXME - create controls and initialize the application */ + + /* create the status bar */ + Info->hStatus = CreateWindowEx(0, + STATUSCLASSNAME, + NULL, + WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS | CCS_NOPARENTALIGN | SBARS_SIZEGRIP, + 0, + 0, + 0, + 0, + Info->hSelf, + (HMENU)IDC_STATUSBAR, + hInstance, + NULL); + + if (Info->hStatus != NULL) + SendMessage(Info->hStatus, + SB_SETPARTS, + sizeof(statwidths)/sizeof(int), + (LPARAM)statwidths); + + /* create the MDI client window */ + ccs.hWindowMenu = GetSubMenu(GetMenu(Info->hSelf), + ID_MDI_WINDOWMENU); + ccs.idFirstChild = ID_MDI_FIRSTCHILD; + Info->hMdiClient = CreateWindowEx(WS_EX_ACCEPTFILES | WS_EX_CLIENTEDGE, + TEXT("MDICLIENT"), + NULL, + WS_VISIBLE | WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_VSCROLL | WS_HSCROLL, + 0, + 0, + 0, + 0, + Info->hSelf, + NULL, + hInstance, + &ccs); + + CreateToolbars(Info); + + /* initialize file open/save structure */ + FileInitialize(Info->hSelf); +} + +static VOID +MainWndCommand(PMAIN_WND_INFO Info, + WORD CmdId, + HWND hControl) +{ + //static TCHAR szFileName[MAX_PATH]; + //static TCHAR szImageName[MAX_PATH]; + + UNREFERENCED_PARAMETER(hControl); + + switch (CmdId) + { + case ID_NEW: + { + OPEN_EDIT_INFO OpenInfo; + INT Ret; + + OpenInfo.CreateNew = TRUE; + + LoadAndFormatString(hInstance, + IDS_DEFAULT_NAME, + &OpenInfo.lpImageName, + ++Info->ImagesCreated); + + Ret = DialogBox(hInstance, + MAKEINTRESOURCE(IDD_NEWDOCSEL), + Info->hSelf, + NewDocSelDlgProc); + if (Ret != -1) + { + OpenInfo.DocType = Ret; + + CreateEditWindow(Info, + &OpenInfo); + } + + } + break; + + case ID_BOLD: + MessageBox(NULL, _T("Bingo"), NULL, 0); + break; + + case ID_OPEN: + { +/* OPEN_EDIT_INFO OpenInfo; + + if (DoOpenFile(Info->hSelf, + szFileName, / * full file path * / + szImageName)) / * file name * / + { + OpenInfo.CreateNew = FALSE; + + OpenInfo.Open.lpImagePath = szFileName; + OpenInfo.lpImageName = szImageName; + + CreateEditWindow(Info, + &OpenInfo); + } +*/ + } + break; + + case ID_EXIT: + SendMessage(Info->hSelf, + WM_CLOSE, + 0, + 0); + break; + + /* Window Menu */ + case ID_WINDOW_TILE_HORZ: + SendMessage(Info->hMdiClient, + WM_MDITILE, + MDITILE_HORIZONTAL, + 0); + break; + + case ID_WINDOW_TILE_VERT: + SendMessage(Info->hMdiClient, + WM_MDITILE, + MDITILE_VERTICAL, + 0); + break; + + case ID_WINDOW_CASCADE: + SendMessage(Info->hMdiClient, + WM_MDICASCADE, + 0, + 0); + break; + + case ID_WINDOW_ARRANGE: + SendMessage(Info->hMdiClient, + WM_MDIICONARRANGE, + 0, + 0); + break; + + case ID_WINDOW_NEXT: + SendMessage(Info->hMdiClient, + WM_MDINEXT, + 0, + 0); + break; + + /* Help Menu */ + case ID_ABOUT: + DialogBox(hInstance, + MAKEINTRESOURCE(IDD_ABOUTBOX), + Info->hSelf, + AboutDialogProc); + break; + } +} + +static VOID +DestroyMainWnd(PMAIN_WND_INFO Info) +{ + /* FIXME - cleanup allocated resources */ +} + + +static VOID +UpdateMainStatusBar(PMAIN_WND_INFO Info) +{ + if (Info->hStatus != NULL) + { + SendMessage(Info->hStatus, + SB_SIMPLE, + (WPARAM)Info->InMenuLoop, + 0); + } +} + +static BOOL +MainWndMenuHint(PMAIN_WND_INFO Info, + WORD CmdId, + const MENU_HINT *HintArray, + DWORD HintsCount, + UINT DefHintId) +{ + BOOL Found = FALSE; + const MENU_HINT *LastHint; + UINT HintId = DefHintId; + + LastHint = HintArray + HintsCount; + while (HintArray != LastHint) + { + if (HintArray->CmdId == CmdId) + { + HintId = HintArray->HintId; + Found = TRUE; + break; + } + HintArray++; + } + + StatusBarLoadString(Info->hStatus, + SB_SIMPLEID, + hInstance, + HintId); + + return Found; +} + +static LRESULT CALLBACK +MainWndProc(HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) +{ + PMAIN_WND_INFO Info; + LRESULT Ret = 0; + static RECT wndOldPos; + + /* Get the window context */ + Info = (PMAIN_WND_INFO)GetWindowLongPtr(hwnd, + GWLP_USERDATA); + if (Info == NULL && uMsg != WM_CREATE) + { + goto HandleDefaultMessage; + } + + switch (uMsg) + { + case WM_CREATE: + { + Info = (PMAIN_WND_INFO)(((LPCREATESTRUCT)lParam)->lpCreateParams); + + /* Initialize the main window context */ + Info->hSelf = hwnd; + + SetWindowLongPtr(hwnd, + GWLP_USERDATA, + (LONG_PTR)Info); + + InitMainWnd(Info); + + /* Show the window */ + ShowWindow(hwnd, + Info->nCmdShow); + /* get the windows position */ + GetWindowRect(hwnd, + &wndOldPos); + + break; + } + + case WM_SIZE: + { + MainWndResize(Info, + LOWORD(lParam), + HIWORD(lParam)); + /* NOTE - do *not* forward this message to DefFrameProc! Otherwise the MDI client + will attempt to resize itself */ + + break; + } + + case WM_MOVE: + { + + } + break; + + case WM_NOTIFY: + { + + /* FIXME - handle other notifications */ + break; + } + + case WM_COMMAND: + { + MainWndCommand(Info, + LOWORD(wParam), + (HWND)lParam); + goto HandleDefaultMessage; + } + + case WM_MENUSELECT: + { + if (Info->hStatus != NULL) + { + if (!MainWndMenuHint(Info, + LOWORD(wParam), + MainMenuHintTable, + sizeof(MainMenuHintTable) / sizeof(MainMenuHintTable[0]), + IDS_HINT_BLANK)) + { + MainWndMenuHint(Info, + LOWORD(wParam), + SystemMenuHintTable, + sizeof(SystemMenuHintTable) / sizeof(SystemMenuHintTable[0]), + IDS_HINT_BLANK); + } + } + break; + } + + case WM_ENTERMENULOOP: + { + Info->InMenuLoop = TRUE; + UpdateMainStatusBar(Info); + break; + } + + case WM_EXITMENULOOP: + { + Info->InMenuLoop = FALSE; + UpdateMainStatusBar(Info); + break; + } + + case WM_CLOSE: + { + DestroyWindow(hwnd); + break; + } + + case WM_ENABLE: + { + + goto HandleDefaultMessage; + } + + case WM_NCACTIVATE: + { + + goto HandleDefaultMessage; + } + + case WM_ACTIVATEAPP: + { + + goto HandleDefaultMessage; + } + + case WM_DESTROY: + { + DestroyMainWnd(Info); + + /* FIXME: set the windows position in registry*/ + //wndOldPos + + HeapFree(ProcessHeap, + 0, + Info); + SetWindowLongPtr(hwnd, + GWLP_USERDATA, + 0); + + /* Break the message queue loop */ + PostQuitMessage(0); + break; + } + + default: + { +HandleDefaultMessage: + if (Info != NULL && Info->hMdiClient != NULL) + { + Ret = DefFrameProc(hwnd, + Info->hMdiClient, + uMsg, + wParam, + lParam); + } + else + { + Ret = DefWindowProc(hwnd, + uMsg, + wParam, + lParam); + } + break; + } + } + + return Ret; +} + +MDI_EDITOR_TYPE +MainWndGetCurrentEditor(PMAIN_WND_INFO MainWnd, + PVOID *Info) +{ + MDI_EDITOR_TYPE EditorType; + + if (MainWnd->ActiveEditor != NULL) + { + EditorType = *((PMDI_EDITOR_TYPE)MainWnd->ActiveEditor); + *Info = MainWnd->ActiveEditor; + } + else + { + EditorType = metUnknown; + *Info = NULL; + } + + return EditorType; +} + +VOID +MainWndSwitchEditorContext(PMAIN_WND_INFO Info, + HWND hDeactivate, + HWND hActivate) +{ + PMDI_EDITOR_TYPE EditorType; + + /* FIXME - optimize light weight switching + when switching from and to an editor of same type */ + + if (hDeactivate != NULL) + { + EditorType = (PMDI_EDITOR_TYPE)GetWindowLongPtr(hDeactivate, + GWLP_USERDATA); + if (EditorType != NULL) + { + switch (*EditorType) + { + case metImageEditor: + SetEditorEnvironment((PEDIT_WND_INFO)EditorType, + FALSE); + break; + + default: + break; + } + + Info->ActiveEditor = NULL; + } + } + + if (hActivate != NULL) + { + EditorType = (PMDI_EDITOR_TYPE)GetWindowLongPtr(hActivate, + GWLP_USERDATA); + if (EditorType != NULL) + { + Info->ActiveEditor = EditorType; + + switch (*EditorType) + { + case metImageEditor: + SetEditorEnvironment((PEDIT_WND_INFO)EditorType, + TRUE); + break; + + default: + break; + } + } + } +} + +HWND +CreateMainWindow(LPCTSTR lpCaption, + int nCmdShow) +{ + PMAIN_WND_INFO Info; + HWND hMainWnd = NULL; + + Info = HeapAlloc(ProcessHeap, + 0, + sizeof(MAIN_WND_INFO)); + if (Info != NULL) + { + ZeroMemory(Info, + sizeof(MAIN_WND_INFO)); + Info->nCmdShow = nCmdShow; + + /* FIXME - load the window position from the registry */ + + hMainWnd = CreateWindowEx(WS_EX_WINDOWEDGE, + szMainWndClass, + lpCaption, + WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + NULL, + NULL, + hInstance, + Info); + if (hMainWnd == NULL) + { + HeapFree(ProcessHeap, + 0, + Info); + } + } + + return hMainWnd; +} + +BOOL +MainWndTranslateMDISysAccel(HWND hwnd, + LPMSG lpMsg) +{ + PMAIN_WND_INFO Info; + + /* Get the window context */ + Info = (PMAIN_WND_INFO)GetWindowLongPtr(hwnd, + GWLP_USERDATA); + if (Info != NULL && Info->hMdiClient != NULL) + { + return TranslateMDISysAccel(Info->hMdiClient, + lpMsg); + } + + return FALSE; +} + +BOOL +InitMainWindowImpl(VOID) +{ + WNDCLASSEX wc = {0}; + + wc.cbSize = sizeof(WNDCLASSEX); + wc.lpfnWndProc = MainWndProc; + wc.hInstance = hInstance; + wc.hIcon = LoadIcon(hInstance, + MAKEINTRESOURCE(IDI_ICON)); + wc.hCursor = LoadCursor(NULL, + IDC_ARROW); + wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1); + wc.lpszMenuName = MAKEINTRESOURCE(IDR_MAINMENU); + wc.lpszClassName = szMainWndClass; + wc.hIconSm = (HICON)LoadImage(hInstance, + MAKEINTRESOURCE(IDI_ICON), + IMAGE_ICON, + 16, + 16, + LR_SHARED); + + return RegisterClassEx(&wc) != (ATOM)0; +} + +VOID +UninitMainWindowImpl(VOID) +{ + UnregisterClass(szMainWndClass, + hInstance); +} diff --git a/reactos/base/applications/wordpad/manifest.xml b/reactos/base/applications/wordpad/manifest.xml new file mode 100644 index 00000000000..8807ca4fdaa --- /dev/null +++ b/reactos/base/applications/wordpad/manifest.xml @@ -0,0 +1,24 @@ + + + + ReactOS VMware(r) SVGA driver Installer + + + + + + + + diff --git a/reactos/base/applications/wordpad/misc.c b/reactos/base/applications/wordpad/misc.c new file mode 100644 index 00000000000..314ebf343c8 --- /dev/null +++ b/reactos/base/applications/wordpad/misc.c @@ -0,0 +1,204 @@ +#include "precomp.h" + +static INT +LengthOfStrResource(IN HINSTANCE hInst, + IN UINT uID) +{ + HRSRC hrSrc; + HGLOBAL hRes; + LPWSTR lpName, lpStr; + + if (hInst == NULL) + { + return -1; + } + + /* There are always blocks of 16 strings */ + lpName = (LPWSTR)MAKEINTRESOURCE((uID >> 4) + 1); + + /* Find the string table block */ + if ((hrSrc = FindResourceW(hInst, lpName, (LPWSTR)RT_STRING)) && + (hRes = LoadResource(hInst, hrSrc)) && + (lpStr = LockResource(hRes))) + { + UINT x; + + /* Find the string we're looking for */ + uID &= 0xF; /* position in the block, same as % 16 */ + for (x = 0; x < uID; x++) + { + lpStr += (*lpStr) + 1; + } + + /* Found the string */ + return (int)(*lpStr); + } + return -1; +} + +INT +AllocAndLoadString(OUT LPTSTR *lpTarget, + IN HINSTANCE hInst, + IN UINT uID) +{ + INT ln; + + ln = LengthOfStrResource(hInst, + uID); + if (ln++ > 0) + { + (*lpTarget) = (LPWSTR)LocalAlloc(LMEM_FIXED, + ln * sizeof(TCHAR)); + if ((*lpTarget) != NULL) + { + INT Ret; + if (!(Ret = LoadString(hInst, uID, *lpTarget, ln))) + { + LocalFree((HLOCAL)(*lpTarget)); + } + return Ret; + } + } + return 0; +} + +DWORD +LoadAndFormatString(IN HINSTANCE hInstance, + IN UINT uID, + OUT LPTSTR *lpTarget, + ...) +{ + DWORD Ret = 0; + LPTSTR lpFormat; + va_list lArgs; + + if (AllocAndLoadString(&lpFormat, + hInstance, + uID) > 0) + { + va_start(lArgs, lpTarget); + /* let's use FormatMessage to format it because it has the ability to allocate + memory automatically */ + Ret = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_STRING, + lpFormat, + 0, + 0, + (LPTSTR)lpTarget, + 0, + &lArgs); + va_end(lArgs); + + LocalFree((HLOCAL)lpFormat); + } + + return Ret; +} + +BOOL +StatusBarLoadAndFormatString(IN HWND hStatusBar, + IN INT PartId, + IN HINSTANCE hInstance, + IN UINT uID, + ...) +{ + BOOL Ret = FALSE; + LPTSTR lpFormat, lpStr; + va_list lArgs; + + if (AllocAndLoadString(&lpFormat, + hInstance, + uID) > 0) + { + va_start(lArgs, uID); + /* let's use FormatMessage to format it because it has the ability to allocate + memory automatically */ + Ret = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_STRING, + lpFormat, + 0, + 0, + (LPTSTR)&lpStr, + 0, + &lArgs); + va_end(lArgs); + + if (lpStr != NULL) + { + Ret = (BOOL)SendMessage(hStatusBar, + SB_SETTEXT, + (WPARAM)PartId, + (LPARAM)lpStr); + LocalFree((HLOCAL)lpStr); + } + + LocalFree((HLOCAL)lpFormat); + } + + return Ret; +} + +BOOL +StatusBarLoadString(IN HWND hStatusBar, + IN INT PartId, + IN HINSTANCE hInstance, + IN UINT uID) +{ + BOOL Ret = FALSE; + LPTSTR lpStr; + + if (AllocAndLoadString(&lpStr, + hInstance, + uID) > 0) + { + Ret = (BOOL)SendMessage(hStatusBar, + SB_SETTEXT, + (WPARAM)PartId, + (LPARAM)lpStr); + LocalFree((HLOCAL)lpStr); + } + + return Ret; +} + + +INT +GetTextFromEdit(OUT LPTSTR lpString, + IN HWND hDlg, + IN UINT Res) +{ + INT len = GetWindowTextLength(GetDlgItem(hDlg, Res)); + if(len > 0) + { + GetDlgItemText(hDlg, + Res, + lpString, + len + 1); + } + else + lpString = NULL; + + return len; +} + + +VOID GetError(DWORD err) +{ + LPVOID lpMsgBuf; + + if (err == 0) + err = GetLastError(); + + FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + err, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPTSTR) &lpMsgBuf, + 0, + NULL ); + + MessageBox(NULL, lpMsgBuf, _T("Error!"), MB_OK | MB_ICONERROR); + + LocalFree(lpMsgBuf); +} + diff --git a/reactos/base/applications/wordpad/opensave.c b/reactos/base/applications/wordpad/opensave.c new file mode 100644 index 00000000000..9578f014114 --- /dev/null +++ b/reactos/base/applications/wordpad/opensave.c @@ -0,0 +1,87 @@ +#include "precomp.h" + +static OPENFILENAME ofn; + +/* + * Initialize file open / save structure + */ +VOID FileInitialize(HWND hwnd) +{ + ZeroMemory(&ofn, sizeof(ofn)); + ofn.lStructSize = sizeof(OPENFILENAME); + ofn.hwndOwner = hwnd; + ofn.nMaxFile = MAX_PATH; + ofn.nMaxFileTitle = MAX_PATH; + ofn.lpstrDefExt = _T("bmp"); +} + + +static BOOL +DoWriteFile(LPCTSTR pszFileName) +{ + return TRUE; +} + + +BOOL +DoOpenFile(HWND hwnd, + LPTSTR szFileName, + LPTSTR szTitleName) +{ + DWORD err; + /*static TCHAR Filter[] = _T("All image files (*.gif,*.bmp,*.jpg,*.jpeg,*.tif,*.png)\0*.gif,*.bmp,*.jpg,*.jpeg,*.tif,*.png\0") \ + _T("All files (*.*)\0*.*\0") \ + _T("Graphics Interchange format (*gif)\0*.gif\0") \ + _T("Windows Bitmap (*bmp)\0*.bmp\0") \ + _T("JPEG File Interchange Format (*jpg,*.jpeg)\0*.jpg,*.jpeg\0") \ + _T("TAG Image File Format (*tif)\0*.tif\0") \ + _T("Portable Network Graphics (*png)\0*.png\0\0");*/ + + static TCHAR Filter[] = _T("Windows Bitmap (*.bmp)\0*.bmp\0"); + + ofn.lpstrFilter = Filter; + ofn.lpstrFile = szFileName; + ofn.lpstrFileTitle = szTitleName; + ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY; + + if (GetOpenFileName(&ofn)) + { + return TRUE; + } + + err = CommDlgExtendedError(); + + if (err != CDERR_GENERALCODES) + MessageBox(NULL, _T("Open file failed"), NULL, 0); + + return FALSE; +} + + + +BOOL +DoSaveFile(HWND hwnd) +{ + TCHAR szFileName[MAX_PATH] = _T(""); + static TCHAR Filter[] = _T("Graphics Interchange format (*gif)\0*.gif\0") \ + _T("Windows Bitmap (*bmp)\0*.bmp\0") \ + _T("JPEG File Interchange Format (*jpg,*.jpeg)\0*.jpg,*.jpeg\0") \ + _T("TAG Image File Format (*tif)\0*.tif\0") \ + _T("Portable Network Graphics (*png)\0*.png\0\0"); + + ofn.lpstrFilter = Filter; + ofn.lpstrFile = szFileName; + ofn.Flags = OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT; + + if (GetSaveFileName(&ofn)) + { + if (DoWriteFile(szFileName)) + return TRUE; + } + + if (CommDlgExtendedError() != CDERR_GENERALCODES) + MessageBox(NULL, _T("Save to file failed"), NULL, 0); + + return FALSE; +} + diff --git a/reactos/base/applications/wordpad/precomp.h b/reactos/base/applications/wordpad/precomp.h new file mode 100644 index 00000000000..140e3d7ab2e --- /dev/null +++ b/reactos/base/applications/wordpad/precomp.h @@ -0,0 +1,160 @@ +#ifndef __WORDPAD_PRECOMP_H +#define __WORDPAD_PRECOMP_H + +//#define WIN32_LEAN_AND_MEAN +#include +#include /* GET_X/Y_LPARAM */ +#include +#include +#include +#include +#include "resource.h" + +/* FIXME - add to headers !!! */ +#ifndef SB_SIMPLEID +#define SB_SIMPLEID 0xFF +#endif + +#define MAX_KEY_LENGTH 256 + +#define DOC_TYPE_RICH_TEXT 0 +#define DOC_TYPE_UNICODE_TEXT 1 +#define DOC_TYPE_TEXT 2 + +#ifdef _MSC_VER +#pragma warning(disable : 4100) +#endif + +/* generic definitions and forward declarations */ +struct _MAIN_WND_INFO; +struct _EDIT_WND_INFO; + +typedef enum _MDI_EDITOR_TYPE { + metUnknown = 0, + metImageEditor, +} MDI_EDITOR_TYPE, *PMDI_EDITOR_TYPE; + + +/* wordpad.c */ +extern HINSTANCE hInstance; +extern HANDLE ProcessHeap; + + +/* editwnd.c */ +typedef struct _OPEN_EDIT_INFO +{ + BOOL CreateNew; + union + { + UINT DocType; /* new */ + LPTSTR lpImagePath; /* open */ + }; + LPTSTR lpImageName; + +} OPEN_EDIT_INFO, *POPEN_EDIT_INFO; + +typedef struct _EDIT_WND_INFO +{ + MDI_EDITOR_TYPE MdiEditorType; /* Must be first member! */ + + HWND hSelf; + HWND hEdit; + struct _MAIN_WND_INFO *MainWnd; + struct _EDIT_WND_INFO *Next; + POINT ScrollPos; + USHORT Zoom; + + POPEN_EDIT_INFO OpenInfo; /* Only valid during initialization */ + + LONG Width; + LONG Height; + +} EDIT_WND_INFO, *PEDIT_WND_INFO; + +BOOL InitEditWindowImpl(VOID); +VOID UninitEditWindowImpl(VOID); +BOOL CreateEditWindow(struct _MAIN_WND_INFO *MainWnd, + POPEN_EDIT_INFO OpenInfo); +VOID SetEditorEnvironment(PEDIT_WND_INFO Info, + BOOL Setup); + + +/* mainwnd.c */ +typedef struct _MENU_HINT +{ + WORD CmdId; + UINT HintId; +} MENU_HINT, *PMENU_HINT; + +typedef struct _MAIN_WND_INFO +{ + HWND hSelf; + HWND hMdiClient; + HWND hStatus; + int nCmdShow; + + /* Editors */ + PEDIT_WND_INFO ImageEditors; + UINT ImagesCreated; + PVOID ActiveEditor; + + /* status flags */ + BOOL InMenuLoop : 1; +} MAIN_WND_INFO, *PMAIN_WND_INFO; + +BOOL InitMainWindowImpl(VOID); +VOID UninitMainWindowImpl(VOID); +HWND CreateMainWindow(LPCTSTR lpCaption, + int nCmdShow); +BOOL MainWndTranslateMDISysAccel(HWND hwnd, + LPMSG lpMsg); +VOID MainWndSwitchEditorContext(PMAIN_WND_INFO Info, + HWND hDeactivate, + HWND hActivate); +MDI_EDITOR_TYPE MainWndGetCurrentEditor(PMAIN_WND_INFO MainWnd, + PVOID *Info); + + + +/* misc.c */ +INT AllocAndLoadString(OUT LPTSTR *lpTarget, + IN HINSTANCE hInst, + IN UINT uID); + +DWORD LoadAndFormatString(IN HINSTANCE hInstance, + IN UINT uID, + OUT LPTSTR *lpTarget, + ...); + +BOOL StatusBarLoadAndFormatString(IN HWND hStatusBar, + IN INT PartId, + IN HINSTANCE hInstance, + IN UINT uID, + ...); + +BOOL StatusBarLoadString(IN HWND hStatusBar, + IN INT PartId, + IN HINSTANCE hInstance, + IN UINT uID); + +INT GetTextFromEdit(OUT LPTSTR lpString, + IN HWND hDlg, + IN UINT Res); + +VOID GetError(DWORD err); + + +/* opensave.c */ +VOID FileInitialize(HWND hwnd); +BOOL DoOpenFile(HWND hwnd, LPTSTR lpFileName, LPTSTR lpName); +BOOL DoSaveFile(HWND hwnd); + +/* about.c */ +INT_PTR CALLBACK +AboutDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); + +INT_PTR CALLBACK +NewDocSelDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); + + +#endif /* __WORDPAD_PRECOMP_H */ diff --git a/reactos/base/applications/wordpad/res/toolbar.bmp b/reactos/base/applications/wordpad/res/toolbar.bmp new file mode 100644 index 0000000000000000000000000000000000000000..2ae64622eb1296ea2b5f30220a8e26ca3bb23d79 GIT binary patch literal 5558 zcmeHJ+flb)D??LPa@rM99^7qDNiiFLYVV6SM$9A>e|> zU02<&+9mc1OsRld)KY9!4=1E^Z8(>zRv}epUaLLiLg$suvTXH!CAsm)y3ILPBJ~ES zYhza+W1RPYK&2Z07&sxFt84&VDq1#9YeO2NTnOD_A+?8Epsl)Ji-{XAfqX;N-d#wM z-_ImpVwtBGU*<$1-rsg^J(qB8%7#r| zruUxQ^bWZRHAoAnGym`WZUTXguD*5Od!PSjCpnq&n{v+dIVD8>=uh;)2T#F&oHh?6 zvL&JsBQ){$$A}oxo_b0Xf3qJ^+n)&e3Hb+;?~_DN{#oSjjt?e^eo^Gt#5WHhT0N>K z{|NFOO_cdYPkzLaZ|Cfu{3B@d<3!J`CVCS%pb1(F5O@h^pz);e!+#9$5h(@+8V`RF z1Q?J~sl*2^{SxOQ1i+6-5`X?hXJXJ-1tv0climODVX(~HTqe_fNB%PxnDOQoCgO`r>bwiQf92FH)-9q$ZvHJ9^quJ%eTKYGbvrTsM1@-Zk+-cMs}8YP+6XPhbDATwh#PHqKnM+3`Bl`P&*LP)6nI>L=J@HI${EmtR0o;$xTdT?Ixhb+}z~2ls;JGZn_NUES3nRi-DGb#>Q6Qf4W;gjZKj{=r@Nf|(%i0=DY*E@KUzgo?UEU7{S? zkePJXPv&C&35Wdc>aP1UacEZ;KH-}=`bhp@>JH}Ss7aK$hKi2f&re-lTvMP+VDw;T|p)x%aH9RMfoMfd&T znt10Rjc?FT^1GxxjB^8xk0=dAQ2B_D&mvuX7QToIUvj~@jJWY zQhiA8@qg-0@9|l8yvGO1Qa$&5gYLNU5x=QB-s6h~(GC~>6!@Y+;fscP`)H`&QKX9o zIer0CBwuTarazPK_opU~sPz3|Uz{@|09t^abB1u{_3aEa9g1@WApm|v68`)P=ZvW8 zfy4amHLnrFzR~k_uoUfCZz86~1}HPpmP!o9+7f32cJ2>QLW=3CvG<$o-HlxhyRq(O z%~^o_*blLxn_}z631IXA4OU|x)Z2``7Ue~K*dvgnE7!e-jp!+{Ph%lsZ*50~qJFVW zwwuV*V(%9l)nJqpyJovwW-e_MA|%5Ojjelqmoy`?+XZ}P;f&owg{7XWk2;K9b~cFbJNSYvTw493+&PiA5;7?VgYyCY6l9M2dy zj8D6Wqpzibl}5cC$aHZGHTKwQ}kP2w9s z zJ#rgm$Lyl4*j_N&;I!MLIyQxrlgvwI2sU-C% zRp;o_*iFai<83Es!e%3yq-{pi_ME0UdMD|NgO)T4uuK0Ktvhm(RvX&UV#Bkv`s6v< zWMB%~4e8*CV|3`05p6W{pj~G?X{WU>9dHPuB7ewznZ`2WxUZXG3S5?a9s2h+Lh_$j!xqoIRWq6Q9}4}a(A^PPd6*_aCx2fj3iY?6@E}Ku4s#+0 zzW_Ss7D1;xBgoV@jy$~Gk=KK~y*bb`_qrj(g{ zj+6>dN=XW*qznZWr5vOD6mu#`J5E(O$EYmxBvoXaQhus6Whq@KH`SR`xfWEFZ$o7{ zXQ`&}EY%h}|%!3*${3u-+L8+;6l$oZWl$0b&&rG76%y>%4PNcGe7%DGR zP)%6`sY(*4raY0FD!i#l;rBGph8kH5N zQbkD$)l{TXeN{S@m1I+SX%3Z^7EpOv0Tq|$ld8Oss#ST^P?JLy6(v+zSx!}zWmHj9 zN_92mR9|0B&9&*&QlCrB^~KcGSW8tcRn*a%Ms3acbm>AKU1=|%^G&7HalVwUc9hcj zmKwU;QAeGZD(L!^8oJThK<(-lx_Y^lu3hP%&MVDy>xc7n`$h+K-M&os?*4$i0=w@2 zvXfic{ALWStcsi9^xyg|CFIJcrsk&V^6F}bom>A&3AuaI`SZwIo{^DJUaj1@bLX&M zY(nnVbm9E@a-X=YtgMW5{Ir}${>^>nm%CP9xNxC7{F4vIOr7e10xA?KZ#sbjgPvQo z>ftgD)fYN0l*f6D*P1?k%A`q?MrNQuxhku?#d+txodcd;yyW5h=gY&t9?2v$US1@7&MU8R+-guUSDV5vwvE!Lc%9{mdHDM=CsczO&pDy zM~)mhY9tyMHFEU(s!D;9`UhJbofif#SSj)+Ag{;_H)-^!*G7#V{n~_4qbIyJ8g7iY zy0Nk{tL?m-zW&RP&s!(eKYRA{=_2>%pKFOcqeo91GX_~le>P@}78+2i+f?l(I{K^o z&s{I&519@(6F<|ZkC`-P(r0j!#!k|jG)C()Ev@i26@EIJ_4PMC_VflRKh2sxd)D+B zZ~2L2h^pqxl%nYv?bLPwmnG-TYG$q{lsal^;{rvOkT3Qh( zpl6_=5}BiYbsz>x0hiDD!d9}^Q95*iu;H)oDS&kWEtUfp@Q^M`VM zqk&*>^|+XL;c{}KW6+RP1mw&KK%wbcnd-}JUFY?Up6GR1$Q7C4(1dWIaFL-QC@^!@ zjPaeFZJizZhJSg04^duDp5!$7ffyPJ4Fy)yXJ}=1cHX#asQ+B={P}r#`NE-zcr+p) zCKR0vLgswkd8xC@R{#0l`AK9h$S)9$#OLMZCZL3b5=v;bb#`_+7(U;NUZR4cqN0ML zg8c4=^5SEnK!(6+&K%Fq>v#S1pBJ~v2d?Ona0PHhmx>DVB#b1|L*|Sx=)9*id?dff zef83%BJt-ET8YoWkJMFjLcBWfmFvGS|3T#I#$CTu1hha;o+uzt8sB-Z#qfoN z59g=r!ri-m{i;L?P!p|)0(0gB-aD`V;)CU@DR}AL_1m{^-MT6ey4nfUP(YA@{L^pz zVDz`;kJL~1Zr{Eu@?S+O_$#3$kuYbD;;zxl-#wbY^XH#`z6JO5t=qSO7FqxeF;SvV zXCZ(0^6FLUHt@OqGk!!s6e!5c$%zsLLb7aMIo&I#CMX(^-0h#QODzsUD0 zmio8;Qcg{JHCegnyIGZ_UHtWY_rF%(5B+}`&^#=~yGb~WKV0Mghi^3n{qaA_x9WbU zKHh7p^?Ij1J9Q@u_L75S&@ZS86G9uPdO4vrqh}?*G=Q_%W+D4htJ2Y?3*ez5LzYTBCom7~( zlhUL1Qd+dG^#06=+l#c_l%v>3c?tU|KXE^0#vP&D1UvyR~)mWMKTxKf6RampEyoOWhdzSlg@O= z+={fVyy>WO2pO0hBg50iWM*}mtSyd{rS&PYw3CyQ{V8&BG$j{jbFw;XO^!}y$lm2F zxjUU8S7$l7pR*)qcRO-)b0i-(V{-Q}rPyF2yg~8KbhDJ+n*LsRcX~QgkiQFs1iDaI zfEAf~M^R9qD+LAN?HCk5A;Cd-Ke|y!s1Nx?1ygi{FGWTM5N;|Ik2hmNTrh=)hvME7 zMTzlY6q^u1v9ZyV9dAHsai^uXV|J1mWhGirb~4_E$Hp9kV?~! z15QwRrU~AXGWaK{Jo_}>lxCEZ;!K4ZE}Hjbp5{$ip6Am2rgV_rm31X9l%L^AWqCeS zU+P8;SjH8^aWGchEvb;z^Wkreblc}LHhAN5`cxNV3 zb$K%0nLg4xv!yzST5Ce-d~GCa zn@I%)Ie2%b;T@Vm)n!VmuE2X#l|^-x>3EZ-QA2eGRg~r7Jz9vjXaQAKq} zT0j@i7tm#Oe)s#dgj$*^>3p*a@6=-Ho!Zh=O;;{z-l;!asim8pjfiXBskg4T((Rjg zpWeDmce}39-8-Fhuj^lVrylIJkvtkSI+j;cacuab$x>W)Ft4_vATq2Vd)+_Y0}f_4 z6quj(jt&b8i>_I>?ytRTFv@Bu@Roo2;rOwmqYDcQqiYYZdwTGK2RXb=KOH}Q?7MHh z_}ojU#rI0tjuivub$|D_`R1#!@4fr>i_bm#%rnothVO;N*_+q&pDVuGd^6+gug8D* z_KPn*``ok7Kll9eqvgeL)$4Zkn~l%@Uw<`u{N!=tUV7=J(JyHpO0PE+Hx*yov+J>0 zqWt8^lfS^v=np>}J?{Mvg&XJGgztxUJ^qCFPG4BUSxx@*v&rK=9VfX@o12=h$@UHe zTM^F1-rmLD#m3U|3*jbz`sw6JKFv+nvUmNZ`=#LG?(XU7ZZDh-GEM(t^3=BGwu)Ut zAXXR7-`~&Q&(8(U(cZ@1#s-xHwRK$E_2eAQcZyRe6bb&Q!_~#r#olK67hhPmwRP

GX`pH;lo!;KPdv|SFx9$54t2XFA{F$mlwyava?fY%p_8hdxs(a+4 zh}P-L`b_U5>mQe-xu5-CkvnwXQ^eh*$Mw3WEZm_>Yxe5Vce}J{+rdK=<28@seHW0z zZz(1CFO&GunUU+jd)|V(z;?<8?^zkPn+g(krmVEr2C?V2{ zWInMZ_g9dYpC|bRxKmh&2PtBMz=sW|xQ9_&7>VPNcjfBg#uQ1amHCc18=Xj;jk)Q5I3InfqQDR5 zqboI*dr@6E_^QPT_s_c4>JW*iD$cqK_0iy~CR0aqa`$r<$yHj`Q#aPHt7x_CYVXHYh&TUB(eqlB(>sOaj&dWj$U!__*vdA%8Y&npt& zvuDWuUDX9+1CK;h6Uq&VQ-<+n9Hzjs350zF9aNGCQ~_L!S84zyY5wUi@~y z7ijWxL;f;wFx-<%7r*z|>k!U8`|O`3_vMQDkH10m)nuIVA3yWVkg+S4JuixXHDl`J zNfXCEJ7o6S7e#y?_^UI&nmlpb__Z&KIL%u#Z{F+~QzwmEK1_;l*tl`cnt8LonmFZ6 zDNf(Rt(!M<^0?PDaoW6T{nBZpM~(VhcYNV1!$*vG>)nsKqrc`!Z)jW?{usIC2&pLp z=-U0q{johTb?WDjO_=z};Fn){`N?6!UKucS=##xqvp=@6KcKd0)28;DGG+3B4?Y<4 zyw>NF7pz~u&id?G+X^?2a}6U$4O>5W@Sqn#!+<}asXwF&Ev+g2zWQp~> zLooU6m3;Z-7yUo`?9(T;v?hPLbm^i)CMHI4iHV9Uz?D^2ma|G#DXXj~=H(^XtgJYV zL$=8v(`1n8a!31o-5-1Gv9SXO4iMM=f9sr@G2`pU(9cgmruF{(`QPp` zFgOwx6CKfp{{6YSTE(lY%2`!qDN~i@@`~a#R#ue6@CN6Q@3QiuI9^_?WaXu~EF&X{ zJDokn1PuZfFPxPM+@}M?jyb4bzsLR%It0E`r)mwxe0XE-+}Ypj=TtbTAb( zaA$|p{G{=LEB*S>HsC&&`t_U8f8d~JpZM!@|E)Qtt-ZVdtl2Y%ef#aK<-2z6aQ60g zuPiGo`mw&ghCxov>gy^oA5t0Q?<^_eC|3k-Wr;!SSx($eo*lcBDWgs>@Hjw2JgY28 zVpV0Sys}iuDvIKPe+;WANyEG<=6Dz~@Rpds-`?)jPfxuwsp73!D_f@RIevZY!VQW2 z`aeE`9_tSc?%zJAT+f{y>FVl~UtFBu)!0zWAV+774b_+rX*?(897~Bl&Y&m4(;~OC zy!hP=yf&U6w~=K>tzsGB%XvoFN*3+46u2sYa}ooeMgYRethzjvSCt|TTErN{#so?D zg9h$ke~P^_Z3Tl)4FB?w75nCp^^g4q4AcVd&j5b&9u*OA;&D}ZZlwx+maTN+%1C_< zJr@rCAumYW%Zrou@B+mKo*liKXGW~x>0!%xYRFQa9Jq)l_|4}E@3}lNa1~DoJ@&aF@9}}+ z_!HDtx?;6+K=tR#6iD~R97a-!GptVq$v zD;apD96CBIF<>E!2hMTc^H_}6ToEsu1c&7wT!u`stqm_Kn0d@NR5nZW_*{}l9p z0_K#0)u{4#MR^fB=OhOR8srSRO6>I|d-&x2=IrmgPF)=Em#3b6Y~WzQS$+t2h5wp< z(ca5HjPYHy1Gu}Ugl#IyjoVyV7{4yJFm739PWY^B;QLc{)Ee~hYV`3+^zkzE@e-cs zzlg{CF60WI1swWIJlbO}k8%gzZr$LHxW_!M@L$c7qm0o1Dcz9D>#9Hppr$;D*Qm02 zE!Mr4hYfdiHkSZ8R2+I&e9}HM{@Jcm^{>xd^N=>DGGy&*@d0Z*Q^UWnEJ)Z|Rh+Oc zw@9%pBRg!mG9&2o#1y~J;*-2TiB-6N6rJcdt1TsXIZF;)$`bvTumry)T;aQj#dc@ECv$T-!`;tWuqE5I8Fa_^#673kgdHaf(eDqr?3m3KMT#Y9IpJR?0pIvk|IcER zyeCA*yMGiBb8bvnq~qJcVfL>F1X+*r3$gz&Ex~^&Q}`}naXyO$@Hm7Oe#?-y3}Nw2 z0?@S#^JqCs@L$2>{g+E&#CcNiMh2ZC)>xCx8*6e{eN`3*ExQ^Yja@aehmGN(fxZAX5OW;KEM~Sj8Y;;7LJiSW@s>DU3Mw zPsD@P@Z_MiEIIf)0X#KqGlR|>Yp6=+0ML=en`(36XR`XrRNh!u#&WWf?&H7zxFLIL z(h?5+G&W}A@vuknPY#^-Y?9wBpHSOZJ%X%;yZT$a?BZwsl9P}81xIhQ=g)eXK4%ZG z^EQ3n&fDw-+h~tjEy*G4xH5D-PYK(=p+m=^OQ!*m2Ebg@K-fl29w{Hfp&NNx_$Hnf zv4iKP*zv~d3<(;l1udx@{AJ$ST*WI@B^)|w5*V7E;Lu6r&@JTed}rYPDE=az;5&C| zu-%)^zUD95`O06g^^w15<7@tsji33;HvSgF03&PyEJxY|T8*-fa-Euy9p6X}!e^F+|CyI911yJG23n7@ z47M3<6=M5_RfyeN)}d$Lu?};1&nn#EeXA(fzx(IJ?ZdgM&9dXPd3M}h_^1nl6@X+)mg0(chuOr)nr?c$JYu;$t<;GY9J@>ok<7KbhwYi+J& z0e;Th+rx%AIGeMlCeG(?F5kyqTYlg~U-*l(c%N^zV%-037k2g?i*U#HEhC&hw2X53 z*ecp}f>n&$r`ECVpIOIwOtw~der}f=uY0#J`3Q#&B?n)N7bG3z`H2D!@VrDl4joHP zI6;@^#_t1NdwEXW9t|Lzo1lYoM|fh$PT-y`@aN6Iy{RUZw_rS=@5W=I0?_|9+|$#B zKl}HE{EemB{Iz9zzaVbcP?Z|G>O_p&M2lGWNtOyPEvtB+X;z88)2);IXILi(%(PYp z&bCno&auf$&}}bCGh(G_M!Yl~e)31=r9J~47@tGJ*MyS~f|mUfEf@oq6tat-2kvdnMSubh zVCwU=tgs+mn*Rd-cfMWCUt7F~y}DHQ0gL??2+4}swnyLyu*-^Cdp0{}y+dy7_l~)7 zo1AhLTL4>~3zGEGtMaXQWu6sR=;xfLesxD_SucP~mg5>s7h&#DXU zI6(NUy1<54M%(3GfJYdYJ0}L`?tdac;bB-&+wOPmc z5~gkzG-R>%^D1_}rB>k2ygh6gbhUy19)bU7_YwV-0M^>-lGMYV#Y#PolGH<8&PlVPMyZj8^F0U(bX5jO(+9C&DTXdGyfEF<}RRuPzs=$^>W0Yeq z=)fE^!B}98D37qhqyxZTSE3^&YzwPb#juMPN;qVP>~cpfyK=cr+J8LVtl9K+TlvUE z0{{K*{R-OmKVhBysU+RVwLH_vw<62LUzKwzpfcAiurf~`RGDWkAh^EFqpPvPi$fQf zLuLzb1uZTdv>?r$*8@bnrsyn(9x>*ZDdv+gFG&~k=@^IJH|En}%%_85-SgBaJ>GG? zh^w1(c*lh@e)UQl4-ImY_Mo}n@8+*A*~dmM(dk>vcpviz0qlp0`oP*I9u|MG0PZGEXrR706-G-Tp2jpZJ(jTN2}G*t$wTWi8Nk=mHk^wzfq!k0qqIh<@~s(U47@T|jx{33e8PBOzY=>@3Ggq$9t@pveyOd9U1?Xb z>zx<5GBHAfKl*>zf;~5fFVyZ9LH;`KJzqh?2hjIUK>sGRR0k$P9-jofl3Hs7gg3P{ z#PYWKXx`SK;O))HyuB%js~Zy#kK-*>K^OxuzucrbRa0n>aj@mkMVEYO|H>8n)=6HP z0UFW_ImUpu)+zZ#%%iK9n|Wqh9M*s>pO5|@ws7yYVGH&?bocMU^Vj@}9804Mb&;tT z>Y~!nziDj^G3mfN{X%_QZF_SP+Dd1Tm#|A0vJlQ-paWwOj(HWtKs&>n;utsKOJS@P zX}wn$*kS**U@Ea!Wr=g+1S`!j;W>#Wm_LQ=8t^a7OO^V6!RFn3#A2O)qLJ1&6{VS` zFSS&Mr2*IM_GV>HM~ep9n^UT;sPp;N_9Aw*y%12qF9Cmbqk@4}jyc3ys)EJb;?SEA zG$9mGrBMc)|y z^VEtQt8JGrWEWlP2IxqXT)S9S-+5WZp{EZhAUMbdeaq4kikZR7M=g%AJ%DFhdV0Xh`nZGCVpJUp0 zj;aF3AJT1u{Djs=U3DP4CBKDT_O#1 zu{O{k#sM^R&m~vs+<@GWL7s>)Fy>|H$8k5+W>+uP@(ZoCQvZLqcRwGoU{`G4*!{Lt zRi6F)>sPAlZ+12{Lk8FaXa)X1cU~&z*DjXus~uQ#9fiE}as|JBxk?%r$PWb_9ODKW zQZX)xSliv>P#J)A;U&&LoDaB%U_TQ0m!^v`Fyxhme*D_iOH%)D)H%RMFV*q=ZJ73* ztFF|$e@jht`0X1P+5|vfrWy7fcdw)WuU}R%j0p#A4C(B~wR(=Ylz#1EsWcW?-%QLe zbz?mC*eI-rP^<+XCY^DGVjbX&&N?aee`%T_%ZNF^uU%rMQ|wFW_xpaJ7kD$OM^uR5BQ zOx+Nt!5@24ed#%z(e~obAMLpG`#EfCEj)GB1fFxzS+h>9|wJ)0poC`x_d4ab7_sVW{5H9 zUdv(*c}jB#XFT@PGuVr8e@!>Uo_dn!CY$icFfYFC;1T}*N}VHpp!2(vYKlFEU%OP< zbgv6aFQ*6?_6b&i3>W|om(C3&P}zT0prjt%_T9%ut$k?t~n!`5~MvA`zg){ zoDaBb;GAYf>6RRJSq!##4EA>%c6cnv$ArQ5jeoFe|IXiy>@O6kFZVzEu6fVtT2Ww0^iiqPW>HiT@~QA0jq{eiW=fX?quZd8R1z1&t*{o{|f?|}~f1~kE#(Fr_HSG++sk1K$zk8e&15><-N~54o{yik)JEEI z2Ae*1?(A^}n>`-jW6NP5$Y8U_7VkTDW!g@IkAF9!zfz#C%x{IjU+fXlVQvgId>l4{ z47Q&vT^Y_{d&u0J&oDnPJ02S7$Xx7Cu!vws=I&&~JkFhA5h0Gu$2Ko(F4%Thc7cHvWX=A!(<<>RM+fNwv)&%|)tbY5armE=2FEpfPWv0cm zL`4`2@V4jvUUn=d!j-u?o#rtSUJN#q%-zkNIeR(&wD0Jl8!m26_g3%O-Eh{`p>3C* zcD2!IqdI3dhjQJ6y9=UXg367I59S8?xn8ocJW&v>2+6l}I2n445}RxWlmmbMmG7j9mY?&I&?yne^J)Q~X0Dr-wwlar%G zOMt&?v%9-pZFFL2s#oy2=&0ndGmbvCI$;?R)4dfwZv>@>KJOXs-rqIE<#*pVd*k=d z!bvINqY~3%BI0utdX{#lQiFp$+sx$0i^D>^&pSC=s3PNoGdzNv{p0f!EWD#Uw}+>N zul7^;j`3Icy%HE7Fd#6_{~;d!KWp#b@jX3XxhO6+*f}!NZ?CVv%jU3zpqbvW-Xnt3 z!v+N;20Rv&6!gE28GYa|EXuz{c9S3C!Dpno?vTh6{J)qT!f7aSCwUO*z)k~By-4Tv^i|GcwXEVo)i5YPYC=D`Zoze z@1q-%Bz+vA_W`>lE_6O%TgG66#$j8<|2*t%VGdp3C2k^IN?hvRmu4uvKX}QOgPo6dOBpW7a{hVHMZtVJwB-$RbIf z0k(0_T@X4L8i2i-SlL zF<8rC%Ozy?64U~ZI_QE_s){6i3D}--*avdhyz%$f8;tE~KQm&fnbLP+WW4*>uxRIZ z1EEvk7icxY%h&vG?%wj3y`e+!GxP)?kC$ZfLM|`q%m}%B4RdLv`kT zfGrh=9hAhYg^e4BZ6b%=9e;2Au~&QAPYzu0QH0}rUI7-bKu-OVqmS7OXCY6wgAaN2 zOSZ5-Y!k9{*au3G3SWXAS^9l{6J*fah3pn`eRMve?w@=gHc z$nYUM7V=~c+eAt3+ESMd9MU;#yEts{gv^G+7L&sklfAk6h|trz@6g68vF?*?Bb+|4 zh&ngUGS+R9Rh-8ZYlYY6*65#zLLr}%phqsOk<|&AFyy9O$V?@GOgKAkABVjihuoCI zCJl1y5)RusseRad^3hB7-M-&&uK;AcYZLvxvQh@jwoVP65Bcb#Zu#gcS4kEs$q!}V z$(sn-E@TVGAagq^&5B-kHb=-cA=Au@-|j4Ag^*+367n+e)xl5fmT3x}9OO==>5x4^{#OiK zB$+Z~mqPvz+d?68TU%B3Nyz2oK~?z{!BzQ|A!xf%$QvN{k>qbeCMV=`b?|E-UsOR} zB4miL*F-<)OY*mD#Xb)EN#Fokz~xpBds4pR&=Dc8O1R%(AAv%p!9?(Gqcrj-OX>r@DR2;SH6c?2-x}*f^uYnhE{i#A zUpZ`=`73jG9{Y#J`bbda+CF`;H8T(V<|go>TYk7w!z8{x`atkICHVm40HR+Y#{dor z^h21CBVkO=p%1VwgsuVRB}mNSqvL$!g5BDEG}mVmc*^SqKe<~b@uP;9-v}PE z;Dgt5@LvTFT*5)j3n7CL^Ha1h^ah0NLA0NrbdTJN`Mb-tr}wV^w}inT4hKK>Cy5{1b)DZq`-|093}t|GN>XT}lbh|2CZ+~gWoF0Q&1}tEO|8vZ zPg~1t&e)hW*xJeKon5Reyo251y#idk{G)x2`Nw!~@{aKM(k5NkJb4B?P<>oE-eS-WNUf{}w+!FisH{N*tW!T?M9x!0QZ<>d% zzB=l^mMmU0@APSzb!f1!3ihlF|Eqy**|bXem%ltA(CY_y$Zc4^ZlX+f;-sJV*}VJ= zpC4h1i#w;j#tx)75pUH@4qIQYHFr_T@NrWPqp*a_(S1{14RTq$I5X}*8f=O=Y>e@a zTm~KW1<>oB$6>R}p+gTyRQ-*%^ zQoKC@ey9U)B-kkPdg!df4wu7bn8U`If3)RTa2-&%9nSd>4iJ#kRH_cY@K?=P&A{b$<1exzJ; z?>#2n!SnGJfNeB~Z8G$4b2)5)IqaeN=w-V1&F}Gs`b^xXh0Y!B2H8T-PTXT9T{`Fn zLWd5zfBQLXkU8vxIqay#eObJfCAamviT!Z5GOa1H3x|9>OWb*&3xo5{N7CI9cR!)8 z13PGbxxJEO59Y(>Z0+^$0f>^q4!(=KQ!38td~t6O_ZQeWqYiIL*G$}<1YNLS=CIl3 zFMYj!W>5P)eoJ-uNu0a2&=C+wUp z4!(r@Lp|;lKS8c8-6h1`M(CA@`wR3gq&E(1!};H|7QNq7uD5@oG5H{5lRpdjFzl## z1Kyjk=jN~_=ddkjurX&=_QpRA*P8co?{Yn18?!A>6y_z?IXRuV3z^OjXC2R6bpSZK z+BDj`+QwU-vvx4Bm5uMo-|VI?-9 fG6PYeSe4yi0AGL-(9{i`@TLE|I|aN`Y(oDJwc^ut literal 0 HcmV?d00001 diff --git a/reactos/base/applications/wordpad/resource.h b/reactos/base/applications/wordpad/resource.h new file mode 100644 index 00000000000..fae0b3abb3c --- /dev/null +++ b/reactos/base/applications/wordpad/resource.h @@ -0,0 +1,102 @@ +#define IDC_STATIC -1 + +#define IDI_ICON 50 + +#define IDS_APPNAME 101 +#define IDS_VERSION 102 +#define IDS_LICENSE 103 +#define IDS_DEFAULT_NAME 104 +#define IDS_READY 105 + +#define IDC_STATUSBAR 500 + +#define ID_NEW 2000 +#define ID_OPEN 2001 +#define ID_CLOSE 2002 +#define ID_CLOSEALL 2003 +#define ID_SAVE 2004 +#define ID_SAVEAS 2005 +#define ID_PRINTPRE 2006 +#define ID_PRINT 2007 +#define ID_PAGESETUP 2008 +#define ID_CUT 2009 +#define ID_COPY 2010 +#define ID_PASTE 2011 +#define ID_UNDO 2013 +#define ID_REDO 2014 +#define ID_SELALL 2015 +#define ID_EXIT 2016 +#define ID_STATUSBAR 2019 +#define ID_BOLD 2030 +#define ID_ITALIC 2031 +#define ID_ULINE 2032 +#define ID_TXTLEFT 2033 +#define ID_TXTCENTER 2034 +#define ID_TXTRIGHT 2035 +#define ID_BLANK 2036 + +#define ID_REFRESH 3000 +#define ID_HELP 3001 +#define ID_WINDOW_TILE_HORZ 3002 +#define ID_WINDOW_TILE_VERT 3003 +#define ID_WINDOW_CASCADE 3004 +#define ID_WINDOW_NEXT 3005 +#define ID_WINDOW_ARRANGE 3006 + + +/* menu hints */ +#define IDS_HINT_BLANK 20000 +#define IDS_HINT_NEW 20001 +#define IDS_HINT_OPEN 20002 +#define IDS_HINT_CLOSE 21006 +#define IDS_HINT_CLOSEALL 21007 +#define IDS_HINT_SAVE 20003 +#define IDS_HINT_SAVEAS 20004 +#define IDS_HINT_PRINT 20005 +#define IDS_HINT_PRINTPRE 20006 +#define IDS_HINT_PAGESETUP 20007 +#define IDS_HINT_EXIT 20008 + +#define IDS_HINT_CASCADE 21009 +#define IDS_HINT_TILE_HORZ 21010 +#define IDS_HINT_TILE_VERT 21011 +#define IDS_HINT_ARRANGE 21012 +#define IDS_HINT_NEXT 21013 + +/* system menu hints */ +#define IDS_HINT_SYS_RESTORE 21001 +#define IDS_HINT_SYS_MOVE 21002 +#define IDS_HINT_SYS_SIZE 21003 +#define IDS_HINT_SYS_MINIMIZE 21004 +#define IDS_HINT_SYS_MAXIMIZE 21005 +#define IDS_HINT_SYS_CLOSE 21006 + +/* tooltips */ +#define IDS_TOOLTIP_NEW 6000 +#define IDS_TOOLTIP_OPEN 6001 +#define IDS_TOOLTIP_SAVE 6002 +#define IDS_TOOLTIP_PRINTPRE 6003 +#define IDS_TOOLTIP_PRINT 6004 +#define IDS_TOOLTIP_CUT 6005 +#define IDS_TOOLTIP_COPY 6006 +#define IDS_TOOLTIP_PASTE 6007 +#define IDS_TOOLTIP_UNDO 6008 +#define IDS_TOOLTIP_REDO 6009 + + +/* about box info */ +#define IDD_ABOUTBOX 200 +#define IDC_LICENSE_EDIT 201 + +/* new doc type */ +#define IDD_NEWDOCSEL 220 +#define IDC_LIST 221 +#define IDS_DOC_TYPE_RICH_TEXT 230 +#define IDS_DOC_TYPE_UNICODE_TEXT 231 +#define IDS_DOC_TYPE_TEXT 232 + + +/* Menu */ +#define IDR_MAINMENU 102 +#define IDR_POPUP 103 +#define ID_ABOUT 4031 diff --git a/reactos/base/applications/wordpad/wordpad.c b/reactos/base/applications/wordpad/wordpad.c new file mode 100644 index 00000000000..f00e42523b5 --- /dev/null +++ b/reactos/base/applications/wordpad/wordpad.c @@ -0,0 +1,84 @@ +#include "precomp.h" + +HINSTANCE hInstance; +HANDLE ProcessHeap; + +int WINAPI +WinMain(HINSTANCE hThisInstance, + HINSTANCE hPrevInstance, + LPSTR lpCmdLine, + int nCmdShow) +{ + LPTSTR lpAppName, lpVersion, lpTitle; + HWND hMainWnd; + MSG Msg; + BOOL bRet; + int Ret = 1; + size_t len; + INITCOMMONCONTROLSEX icex; + + hInstance = hThisInstance; + ProcessHeap = GetProcessHeap(); + + icex.dwSize = sizeof(INITCOMMONCONTROLSEX); + icex.dwICC = ICC_BAR_CLASSES | ICC_COOL_CLASSES; + InitCommonControlsEx(&icex); + + if (!AllocAndLoadString(&lpAppName, hInstance, IDS_APPNAME) || + !AllocAndLoadString(&lpVersion, hInstance, IDS_VERSION) ) + { + MessageBox(NULL, + _T("Error loading resource "), + NULL, + 0); + return 1; + } + + len = _tcslen(lpAppName) + _tcslen(lpVersion); + lpTitle = HeapAlloc(ProcessHeap, + 0, + (len + 2) * sizeof(TCHAR)); + + wsprintf(lpTitle, + _T("%s %s"), + lpAppName, + lpVersion); + + if (InitMainWindowImpl()) + { + if (InitEditWindowImpl()) + { + hMainWnd = CreateMainWindow(lpTitle, + nCmdShow); + if (hMainWnd != NULL) + { + /* pump the message queue */ + while((bRet = GetMessage(&Msg, + NULL, + 0, + 0) != 0)) + { + if (bRet != (BOOL)-1) + { + if (!MainWndTranslateMDISysAccel(hMainWnd, + &Msg)) + { + TranslateMessage(&Msg); + DispatchMessage(&Msg); + } + } + } + + Ret = 0; + } + + UninitEditWindowImpl(); + } + + UninitMainWindowImpl(); + } + + LocalFree((HLOCAL)lpAppName); + + return Ret; +} diff --git a/reactos/base/applications/wordpad/wordpad.rbuild b/reactos/base/applications/wordpad/wordpad.rbuild new file mode 100644 index 00000000000..64d8d1bcf89 --- /dev/null +++ b/reactos/base/applications/wordpad/wordpad.rbuild @@ -0,0 +1,28 @@ + + + + . + + + + 0x0600 + 0x0501 + kernel32 + user32 + gdi32 + comdlg32 + advapi32 + shell32 + comctl32 + + dialogs.c + editwnd.c + mainwnd.c + misc.c + opensave.c + wordpad.c + + wordpad.rc + precomp.h + + \ No newline at end of file diff --git a/reactos/base/applications/wordpad/wordpad.rc b/reactos/base/applications/wordpad/wordpad.rc new file mode 100644 index 00000000000..c8ff16a5c76 --- /dev/null +++ b/reactos/base/applications/wordpad/wordpad.rc @@ -0,0 +1,26 @@ +#include +#include +#include "resource.h" + +#define REACTOS_STR_FILE_DESCRIPTION "ReactOS Document Editor\0" +#define REACTOS_STR_INTERNAL_NAME "wordpad\0" +#define REACTOS_STR_ORIGINAL_FILENAME "wordpad.exe\0" +//#include + +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +1 24 DISCARDABLE "manifest.xml" + +STRINGTABLE DISCARDABLE +BEGIN + IDS_APPNAME "WordPad" + IDS_VERSION "v0.1" +END + +IDI_ICON ICON "res/wordpad.ico" + +/* main toolbar icons */ +IDB_TEXTTOOLBAR BITMAP DISCARDABLE "res/toolbar.bmp" + +#include "En.rc" +/* please do not add any other languages whilst this is being developed */