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 
29 static 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 
67 class 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 
MyDocument(const char * name,XsMDICanvas * canvas)101 MyDocument::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 
~MyDocument()113 MyDocument::~MyDocument ( )
114 {
115    // Empty
116 }
117 
118 // _buildClientArea (called to create document contents)
119 
_buildClientArea(Widget parent)120 void 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 
_newWindow()217 void 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 
_newWindowCallback(Widget,XtPointer clientData,XtPointer)231 void MyDocument::_newWindowCallback (Widget, XtPointer clientData, XtPointer)
232 {
233    MyDocument *obj = (MyDocument*)clientData;
234    obj->_newWindow ( );
235 }
236 
237 // _doNothingCallback
238 
_doNothingCallback(Widget w,XtPointer,XtPointer)239 void MyDocument::_doNothingCallback (Widget w, XtPointer, XtPointer)
240 {
241    XBell (XtDisplayOfObject (w), 100);
242 }
243 
244 /*
245    ----------------------------------------------------------------------------
246    MyDocument2 class
247 */
248 
249 class 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 
MyDocument2(const char * name)272 MyDocument2::MyDocument2 (const char *name) : XsMotifWindow (name)
273 {
274    _canvas = 0;
275    _win1 = 0;
276 }
277 
278 // Destructor
279 
~MyDocument2()280 MyDocument2::~MyDocument2 ( )
281 {
282    delete _canvas;
283    delete _win1;
284 }
285 
286 // _buildClientArea
287 
_buildClientArea(Widget parent)288 void 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 
_destroyCallback(Widget,XtPointer clientData,XtPointer)320 static void _destroyCallback (Widget, XtPointer clientData, XtPointer)
321 {
322    Boolean *quit = (Boolean*)clientData;
323    *quit = True;
324 }
325 
main(int argc,char ** argv)326 int 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 }
392