]> git.saurik.com Git - wxWidgets.git/blame_incremental - src/motif/mdi/test/MDItest.C
Better fix for modal/modeless wizards.
[wxWidgets.git] / src / motif / mdi / test / MDItest.C
... / ...
CommitLineData
1/*
2 Copyright (C) 1996 Scott W. Sadler
3 All rights reserved.
4*/
5
6/*
7 MDItest.c
8
9 History
10 03-Mar-96 1.0; Scott W. Sadler (sws@iti-oh.com)
11 Created
12*/
13
14// Includes
15
16#include <assert.h>
17#include <Xm/MainW.h>
18#include <Xm/RowColumn.h>
19#include <Xm/CascadeBG.h>
20#include <Xm/Text.h>
21#include <Xm/PushBG.h>
22#include <Xm/AtomMgr.h>
23#include <Xm/Protocols.h>
24#include "XsMDICanvas.h"
25#include "XsMotifWindow.h"
26
27// Fallback resources
28
29static char *fallbacks[] = {
30 "*MDItest.height: 500",
31 "*MDItest.width: 500",
32 "*MDIinner.width: 300",
33 "*MDIinner.height: 300",
34
35 "*fileMenu.labelString: File",
36 "*fileMenu.mnemonic: F",
37 "*openMenuItem.labelString: Open...",
38 "*openMenuItem.mnemonic: O",
39 "*newMenuItem.labelString: New...",
40 "*newMenuItem.mnemonic: N",
41 "*editMenu.labelString: Edit",
42 "*editMenu.mnemonic: E",
43 "*cutMenuItem.labelString: Cut",
44 "*cutMenuItem.mnemonic: t",
45 "*copyMenuItem.labelString: Copy",
46 "*copyMenuItem.mnemonic: C",
47 "*pasteMenuItem.labelString: Paste",
48 "*pasteMenuItem.mnemonic: P",
49 "*helpMenu.labelString: Help",
50 "*helpMenu.mnemonic: H",
51 "*aboutMenuItem.labelString: About",
52 "*aboutMenuItem.mnemonic: A",
53 "*scrolledText.rows: 10",
54 "*scrolledText.columns: 30",
55
56 "*background: grey",
57 "*fontList: -*-helvetica-medium-r-normal-*-14-*-*-*-*-*-iso8859-1",
58
59 NULL
60};
61
62/*
63 ----------------------------------------------------------------------------
64 MyDocument class
65*/
66
67class MyDocument : public XsMotifWindow {
68
69 public:
70
71// Constructor/Destructor
72
73 MyDocument (const char *name, XsMDICanvas *canvas);
74 virtual ~MyDocument ( );
75
76 protected:
77
78// This member function is called to create the document contents
79
80 virtual void _buildClientArea (Widget);
81
82// Implementation
83
84 XsMDICanvas *_canvas;
85
86// Callbacks
87
88 void _newWindow ( );
89 void _doNothing ( );
90
91 private:
92
93// Callbacks
94
95 static void _newWindowCallback (Widget, XtPointer, XtPointer);
96 static void _doNothingCallback (Widget, XtPointer, XtPointer);
97};
98
99// Constructor
100
101MyDocument::MyDocument (const char *name, XsMDICanvas *canvas) :
102 XsMotifWindow (name)
103{
104 assert (canvas != 0);
105
106// Initialize
107
108 _canvas = canvas;
109}
110
111// Destructor
112
113MyDocument::~MyDocument ( )
114{
115 // Empty
116}
117
118// _buildClientArea (called to create document contents)
119
120void MyDocument::_buildClientArea (Widget parent)
121{
122 assert (parent != 0);
123
124 Widget pulldown;
125 Widget cascade;
126 Widget button;
127
128// Create a main window with some dummy menus
129
130 Widget mainW = XtVaCreateWidget ("mainWin", xmMainWindowWidgetClass, parent,
131 XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM,
132 XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM,
133 NULL);
134
135// Create a menubar
136
137 Widget menuBar = XmCreateMenuBar (mainW, "menuBar", NULL, 0);
138
139// Create the "file" menu
140
141 pulldown = XmCreatePulldownMenu (menuBar, "pulldown", NULL, 0);
142 cascade = XtVaCreateManagedWidget ("fileMenu", xmCascadeButtonGadgetClass,
143 menuBar, XmNsubMenuId, pulldown, NULL);
144
145 button = XtVaCreateManagedWidget ("openMenuItem", xmPushButtonGadgetClass,
146 pulldown, NULL);
147 XtAddCallback (button, XmNactivateCallback, _doNothingCallback, (XtPointer)this);
148
149 button = XtVaCreateManagedWidget ("newMenuItem", xmPushButtonGadgetClass,
150 pulldown, NULL);
151 XtAddCallback (button, XmNactivateCallback, _newWindowCallback, (XtPointer)this);
152
153// Create the "edit" menu
154
155 pulldown = XmCreatePulldownMenu (menuBar, "pulldown", NULL, 0);
156 cascade = XtVaCreateManagedWidget ("editMenu", xmCascadeButtonGadgetClass,
157 menuBar, XmNsubMenuId, pulldown, NULL);
158
159 button = XtVaCreateManagedWidget ("cutMenuItem", xmPushButtonGadgetClass,
160 pulldown, NULL);
161 XtAddCallback (button, XmNactivateCallback, _doNothingCallback, (XtPointer)this);
162
163 button = XtVaCreateManagedWidget ("copyMenuItem", xmPushButtonGadgetClass,
164 pulldown, NULL);
165 XtAddCallback (button, XmNactivateCallback, _doNothingCallback, (XtPointer)this);
166
167 button = XtVaCreateManagedWidget ("pasteMenuItem", xmPushButtonGadgetClass,
168 pulldown, NULL);
169 XtAddCallback (button, XmNactivateCallback, _doNothingCallback, (XtPointer)this);
170
171// Create the help menu
172
173 pulldown = XmCreatePulldownMenu (menuBar, "pulldown", NULL, 0);
174 cascade = XtVaCreateManagedWidget ("helpMenu", xmCascadeButtonGadgetClass,
175 menuBar, XmNsubMenuId, pulldown, NULL);
176
177 button = XtVaCreateManagedWidget ("aboutMenuItem", xmPushButtonGadgetClass,
178 pulldown, NULL);
179 XtAddCallback (button, XmNactivateCallback, _doNothingCallback, (XtPointer)this);
180
181 XtVaSetValues (menuBar, XmNmenuHelpWidget, cascade, NULL);
182
183// Manage the menubar
184
185 XtManageChild (menuBar);
186
187// Create the work area
188
189 const int nargs = 8;
190 Arg args[nargs];
191 int n;
192
193 n = 0;
194 XtSetArg (args[n], XmNscrollingPolicy, XmAUTOMATIC); n++;
195 XtSetArg (args[n], XmNhighlightThickness, (Dimension)0); n++;
196 XtSetArg (args[n], XmNeditMode, XmMULTI_LINE_EDIT); n++;
197 XtSetArg (args[n], XmNeditable, True); n++;
198 XtSetArg (args[n], XmNwordWrap, False); n++;
199 XtSetArg (args[n], XmNcursorPositionVisible, True); n++;
200 XtSetArg (args[n], XmNverifyBell, True); n++;
201
202 assert (n <= nargs);
203
204 Widget scrolledText = XmCreateScrolledText (mainW, "scrolledText", args, n);
205 XtManageChild (scrolledText);
206
207// Set the main window area
208
209 XtVaSetValues (mainW, XmNmenuBar, menuBar, XmNworkWindow,
210 XtParent (scrolledText), NULL);
211
212 XtManageChild (mainW);
213}
214
215// _newWindow
216
217void MyDocument::_newWindow ( )
218{
219
220// Create a new document (this will leak, but who cares?)
221
222 MyDocument *newDoc = new MyDocument ("Document", _canvas);
223
224// Add it to the canvas
225
226 _canvas->add (newDoc);
227}
228
229// _newWindowCallback
230
231void MyDocument::_newWindowCallback (Widget, XtPointer clientData, XtPointer)
232{
233 MyDocument *obj = (MyDocument*)clientData;
234 obj->_newWindow ( );
235}
236
237// _doNothingCallback
238
239void MyDocument::_doNothingCallback (Widget w, XtPointer, XtPointer)
240{
241 XBell (XtDisplayOfObject (w), 100);
242}
243
244/*
245 ----------------------------------------------------------------------------
246 MyDocument2 class
247*/
248
249class MyDocument2 : public XsMotifWindow {
250
251 public:
252
253// Constructor/Destructor
254
255 MyDocument2 (const char *name);
256 virtual ~MyDocument2 ( );
257
258 protected:
259
260// This member function is called to create the document contents
261
262 virtual void _buildClientArea (Widget);
263
264// Implementation
265
266 XsMDICanvas *_canvas;
267 MyDocument *_win1;
268};
269
270// Constructor
271
272MyDocument2::MyDocument2 (const char *name) : XsMotifWindow (name)
273{
274 _canvas = 0;
275 _win1 = 0;
276}
277
278// Destructor
279
280MyDocument2::~MyDocument2 ( )
281{
282 delete _canvas;
283 delete _win1;
284}
285
286// _buildClientArea
287
288void MyDocument2::_buildClientArea (Widget parent)
289{
290 assert (parent != 0);
291
292// Create a nested MDI canvas
293
294 _canvas = new XsMDICanvas ("MDIinner", parent);
295
296// Attach it up
297
298 XtVaSetValues (_canvas->base ( ), XmNtopAttachment, XmATTACH_FORM,
299 XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM,
300 XmNrightAttachment, XmATTACH_FORM, NULL);
301
302// Create a document
303
304 _win1 = new MyDocument ("InnerWin", _canvas);
305
306// Add the document to the canvas
307
308 _canvas->add (_win1);
309
310// Show the canvas
311
312 _canvas->show ( );
313}
314
315/*
316 ----------------------------------------------------------------------------
317 main
318*/
319
320static void _destroyCallback (Widget, XtPointer clientData, XtPointer)
321{
322 Boolean *quit = (Boolean*)clientData;
323 *quit = True;
324}
325
326int main (int argc, char **argv)
327{
328 XtAppContext appContext;
329 Widget topLevel;
330 Boolean quit = False;
331
332// Initialize toolkit
333
334 topLevel = XtVaAppInitialize (&appContext, "MDI", NULL, 0, &argc, argv,
335 fallbacks, XmNdeleteResponse, XmDO_NOTHING, NULL);
336
337 Display *dpy = XtDisplay (topLevel);
338
339// Add protocols
340
341 Atom WM_DELETE_WINDOW = XmInternAtom (dpy, "WM_DELETE_WINDOW", False);
342
343 XmAddWMProtocolCallback (topLevel, WM_DELETE_WINDOW, _destroyCallback,
344 &quit);
345
346// Create the MDI canvas
347
348 XsMDICanvas *canvas = new XsMDICanvas ("MDItest", topLevel);
349
350// Create the MDI documents
351
352 MyDocument *win1 = new MyDocument ("Document", canvas);
353 MyDocument2 *win2 = new MyDocument2 ("Document 2");
354
355// Add documents to MDI canvas
356
357 canvas->add (win1);
358 canvas->add (win2);
359
360// Show the canvas
361
362 canvas->show ( );
363
364// Realize everything
365
366 XtRealizeWidget (topLevel);
367
368// Let 'er rip
369
370 XEvent event;
371
372 while (!quit)
373 {
374 XtAppNextEvent (appContext, &event);
375 XtDispatchEvent (&event);
376 }
377
378// Cleanup
379
380 delete win1;
381 delete win2;
382 delete canvas;
383
384// Close the X connection
385
386 XtDestroyWidget (topLevel);
387 XtCloseDisplay (dpy);
388 XtDestroyApplicationContext (appContext);
389
390 return (0);
391}