- New implementation of SendMessage, ReceiveMessage, ReplyMessage functions
[wine] / programs / notepad / main.c
1 /*
2  *  Notepad
3  *
4  *  Copyright 1997,98 Marcel Baur <mbaur@g26.ethz.ch>
5  *  To be distributed under the Wine License
6  */
7
8 #include <stdio.h>
9 #include "windows.h"
10
11 #ifdef LCC
12 #include "lcc.h"
13 #else
14 #include "shell.h"
15 #endif
16
17 #include "main.h"
18 #include "license.h"
19 #include "dialog.h"
20 #include "language.h"
21
22 #ifdef WINELIB
23 #include "options.h"
24 #include "resource.h"
25 #include "shell.h"
26 void LIBWINE_Register_Da();
27 void LIBWINE_Register_De();
28 void LIBWINE_Register_En();
29 void LIBWINE_Register_Es();
30 void LIBWINE_Register_Fi();
31 void LIBWINE_Register_Fr();
32 void LIBWINE_Register_Sw();
33 #endif
34
35 NOTEPAD_GLOBALS Globals;
36
37 /***********************************************************************
38  *
39  *           NOTEPAD_MenuCommand
40  *
41  *  All handling of main menu events
42  */
43
44 int NOTEPAD_MenuCommand (WPARAM wParam)
45 {  
46    switch (wParam) {
47      case NP_FILE_NEW:          DIALOG_FileNew(); break;
48      case NP_FILE_OPEN:         DIALOG_FileOpen(); break;
49      case NP_FILE_SAVE:         DIALOG_FileSave(); break;
50      case NP_FILE_SAVEAS:       DIALOG_FileSaveAs(); break;
51      case NP_FILE_PRINT:        DIALOG_FilePrint(); break;
52      case NP_FILE_PAGESETUP:    DIALOG_FilePageSetup(); break;
53      case NP_FILE_PRINTSETUP:   DIALOG_FilePrinterSetup();break;
54      case NP_FILE_EXIT:         DIALOG_FileExit(); break;
55
56      case NP_EDIT_UNDO:         DIALOG_EditUndo(); break;
57      case NP_EDIT_CUT:          DIALOG_EditCut(); break;
58      case NP_EDIT_COPY:         DIALOG_EditCopy(); break;
59      case NP_EDIT_PASTE:        DIALOG_EditPaste(); break;
60      case NP_EDIT_DELETE:       DIALOG_EditDelete(); break;
61      case NP_EDIT_SELECTALL:    DIALOG_EditSelectAll(); break;
62      case NP_EDIT_TIMEDATE:     DIALOG_EditTimeDate();break;
63      case NP_EDIT_WRAP:         DIALOG_EditWrap(); break;
64
65      case NP_SEARCH_SEARCH:     DIALOG_Search(); break;
66      case NP_SEARCH_NEXT:       DIALOG_SearchNext(); break;
67
68      case NP_HELP_CONTENTS:     DIALOG_HelpContents(); break;
69      case NP_HELP_SEARCH:       DIALOG_HelpSearch(); break;
70      case NP_HELP_ON_HELP:      DIALOG_HelpHelp(); break;
71      case NP_HELP_LICENSE:      DIALOG_HelpLicense(); break;
72      case NP_HELP_NO_WARRANTY:  DIALOG_HelpNoWarranty(); break;
73      case NP_HELP_ABOUT_WINE:   DIALOG_HelpAboutWine(); break;
74      
75      /* Handle languages */
76      default:
77       LANGUAGE_DefaultHandle(wParam);
78    }
79    return 0;
80 }
81
82
83
84 /***********************************************************************
85  *
86  *           NOTEPAD_WndProc
87  */
88
89 LRESULT NOTEPAD_WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
90 {
91     PAINTSTRUCT ps;
92     HDC hContext;
93     HANDLE hDrop;                      /* drag & drop */
94     CHAR szFileName[MAX_STRING_LEN];
95     RECT Windowsize;
96
97     lstrcpy(szFileName, "");
98
99     switch (msg) {
100
101        case WM_CREATE:
102         break;
103
104        case WM_PAINT:
105           hContext = BeginPaint(hWnd, &ps);
106           TextOut(hContext, 1, 1, Globals.Buffer, strlen(Globals.Buffer));
107           EndPaint(hWnd, &ps);
108         break;
109
110        case WM_COMMAND:
111           NOTEPAD_MenuCommand(wParam);
112           break;
113
114        case WM_DESTROYCLIPBOARD:
115           MessageBox(Globals.hMainWnd, "Empty clipboard", "Debug", MB_ICONEXCLAMATION);
116           break;
117
118        case WM_CLOSE:
119           if (DoCloseFile()) {
120              PostQuitMessage(0);
121           }
122           break;
123
124        case WM_DESTROY:
125              PostQuitMessage (0);
126           break;
127
128        case WM_SIZE:
129           GetClientRect(Globals.hMainWnd, &Windowsize);
130           break;
131
132        case WM_DROPFILES:
133           /* User has dropped a file into main window */
134           hDrop = (HANDLE) wParam;
135           DragQueryFile(hDrop, 0, (CHAR *) &szFileName, sizeof(szFileName));
136           DragFinish(hDrop);
137           DoOpenFile(szFileName);
138           break;        
139
140        default:
141           return DefWindowProc (hWnd, msg, wParam, lParam);
142     }
143     return 0l;
144 }
145
146
147
148 /***********************************************************************
149  *
150  *           WinMain
151  */
152
153 int PASCAL WinMain (HANDLE hInstance, HANDLE prev, LPSTR cmdline, int show)
154 {
155     MSG      msg;
156     WNDCLASS class;
157     char className[] = "NPClass";  /* To make sure className >= 0x10000 */
158     char winName[]   = "Notepad";
159
160     #if defined(WINELIB) && !defined(HAVE_WINE_CONSTRUCTOR)
161       /* Register resources */
162       LIBWINE_Register_Da();
163       LIBWINE_Register_De();
164       LIBWINE_Register_En();
165       LIBWINE_Register_Es();
166       LIBWINE_Register_Fi();
167       LIBWINE_Register_Fr();
168       LIBWINE_Register_Sw();
169     #endif
170
171     /* Select Language */
172     LANGUAGE_Init();
173
174
175     /* Setup Globals */
176
177     lstrcpy(Globals.lpszIniFile, "notepad.ini");
178     lstrcpy(Globals.lpszIcoFile, "notepad.ico");
179
180     Globals.hInstance       = hInstance;
181
182 #ifndef LCC
183     Globals.hMainIcon       = ExtractIcon(Globals.hInstance, 
184                                         Globals.lpszIcoFile, 0);
185 #endif
186     if (!Globals.hMainIcon) {
187         Globals.hMainIcon = LoadIcon(0, MAKEINTRESOURCE(DEFAULTICON));
188     }
189
190     lstrcpy(Globals.szFindText,     "");
191     lstrcpy(Globals.szFileName,     "");
192     lstrcpy(Globals.szMarginTop,    "25 mm");
193     lstrcpy(Globals.szMarginBottom, "25 mm");
194     lstrcpy(Globals.szMarginLeft,   "20 mm");
195     lstrcpy(Globals.szMarginRight,  "20 mm");
196     lstrcpy(Globals.szHeader,       "&n");
197     lstrcpy(Globals.szFooter,       "Page &s");
198     lstrcpy(Globals.Buffer, "Hello World");
199
200     if (!prev){
201         class.style         = CS_HREDRAW | CS_VREDRAW;
202         class.lpfnWndProc   = NOTEPAD_WndProc;
203         class.cbClsExtra    = 0;
204         class.cbWndExtra    = 0;
205         class.hInstance     = Globals.hInstance;
206         class.hIcon         = LoadIcon (0, IDI_APPLICATION);
207         class.hCursor       = LoadCursor (0, IDC_ARROW);
208         class.hbrBackground = GetStockObject (WHITE_BRUSH);
209         class.lpszMenuName  = 0;
210         class.lpszClassName = className;
211     }
212
213     if (!RegisterClass (&class)) return FALSE;
214
215     /* Setup windows */
216
217
218     Globals.hMainWnd = CreateWindow (className, winName, 
219        WS_OVERLAPPEDWINDOW + WS_HSCROLL + WS_VSCROLL,
220        CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, 0, 
221        LoadMenu(Globals.hInstance, STRING_MENU_Xx),
222        Globals.hInstance, 0);
223
224     Globals.hFindReplaceDlg = 0;
225
226     LANGUAGE_SelectByName(Globals.lpszLanguage);
227
228     SetMenu(Globals.hMainWnd, Globals.hMainMenu);               
229                         
230     ShowWindow (Globals.hMainWnd, show);
231     UpdateWindow (Globals.hMainWnd);
232
233     /* Set up dialogs */
234
235     /* Identify Messages originating from FindReplace */
236
237     Globals.nCommdlgFindReplaceMsg = RegisterWindowMessage("commdlg_FindReplace");
238     if (Globals.nCommdlgFindReplaceMsg==0) {
239        MessageBox(Globals.hMainWnd, "Could not register commdlg_FindReplace window message", 
240                   "Error", MB_ICONEXCLAMATION);
241     }
242
243     /* now handle command line */
244     
245     while (*cmdline && (*cmdline == ' ' || *cmdline == '-')) 
246     
247     {
248         CHAR   option;
249 /*      LPCSTR topic_id; */
250
251         if (*cmdline++ == ' ') continue;
252
253         option = *cmdline;
254         if (option) cmdline++;
255         while (*cmdline && *cmdline == ' ') cmdline++;
256
257         switch(option)
258         {
259             case 'p':
260             case 'P': printf("Print file: ");
261                       /* Not yet able to print a file */
262                       break;
263         }
264     }
265
266     /* Set up Drag&Drop */
267
268     DragAcceptFiles(Globals.hMainWnd, TRUE);
269
270     MessageBox(Globals.hMainWnd, "BEWARE!\nThis is ALPHA software that may destroy your file system.\nPlease take care.", 
271     "A note from the developer...", MB_ICONEXCLAMATION);
272
273     /* now enter mesage loop     */
274     
275     while (GetMessage (&msg, 0, 0, 0)) {
276         if (IsDialogMessage(Globals.hFindReplaceDlg, &msg)!=0) {
277           /* Message belongs to FindReplace dialog */
278           /* We just let IsDialogMessage handle it */
279         } 
280           else
281         { 
282           /* Message belongs to the Notepad Main Window */
283           TranslateMessage (&msg);
284           DispatchMessage (&msg);
285         }
286     }
287     return 0;
288 }