Implementing the remaining ten methods
Now that you have implemented open, you can implement the remaining ten methods of class Chooser. The first seven methods define different parts of the user interface. The remaining three methods add items to a list box and perform functions when a push button is pressed or when the window closes.
Method createWindow
Method createWindow defines the window for DevelopChooser. To implement the method, do the following:
1. From the Applications Browser opened on DevelopChooser, select public underneath the list of methods so the method settings change to private and instance.
2. Add a new category: Window Creation.
3. From the Methods menu, select New Method Template.
4. Revise the displayed template so it reads as follows:
Method createWindow
createWindow
"Private - Creates a window."
shell := CwTopLevelShell
createApplicationShell: 'shell'
argBlock: [:w | w
width: 220;
height: 175].
shell
title: 'Applications';
addCallback: XmNdestroyCallback
receiver: self
selector: #destroyCallback:clientData:callData: "Call if window closes"
clientData: nil.
5. Save the method. If you typed in the text shown above, createWindow is displayed in the list of methods.
Follow the above steps to create the following six more methods for the Window Creation category.
Method createForm
createForm
"Private - Creates a form to hold other user interface elements."
widgetManager := shell
createForm: 'widgetManager' "Positions the label, list box, and button"
argBlock: nil.
widgetManager manageChild.
Method createLabel
createLabel
"Private - Creates a label."
instructions := widgetManager
createLabel: 'Select an application: '
argBlock: [:w | w
marginHeight: 10;
leftAttachment: XmATTACHFORM;
topAttachment: XmATTACHFORM ;
rightAttachment: XmATTACHFORM].
instructions manageChild.
Method createList
createList
"Private - Creates a list box to hold application names."
listBox := widgetManager "Define a list box."
createScrolledList: 'listBox'
argBlock: [:w | w
items: self addApplicationsToList; "Add list of applications"
visibleItemCount: 5;
selectionPolicy: XmEXTENDEDSELECT].
listBox parent
topAttachment: XmATTACHWIDGET;
topWidget: instructions;
leftAttachment: XmATTACHFORM;
rightAttachment: XmATTACHFORM.
listBox
addCallback: XmNdefaultActionCallback
receiver: self
selector: #executeCallback:clientData:callData: "Call if button pressed"
clientData: nil.
listBox manageChild.
Method createButton
createButton
"Private - Define a push button."
openButton := widgetManager
createPushButton: 'Open'
argBlock: [:w | w
leftAttachment: XmATTACHFORM;
topAttachment: XmATTACHWIDGET;
topWidget: listBox;
rightAttachment: XmATTACHFORM;
bottomAttachment: XmATTACHFORM].
openButton
alignment: XmALIGNMENTCENTER;
addCallback: XmNactivateCallback
receiver: self
selector: #executeCallback:clientData:callData:
clientData: nil;
manageChild.
Method displayWindow
displayWindow
"Private - Show the window."
shell realizeWidget.
Method setCursorBusy
setCursorBusy
"Private - Create a cursor."
busyCursor := shell display createFontCursor: XCWatch.
Method addApplicationsToList
Method addApplicationsToList defines what application names are shown in the list box. To implement it, do the following:
1. From the Applications Browser opened on DevelopChooser, select public underneath the list of methods so the method settings change to private and instance.
2. Add the category List Operations.
3. From the Methods menu, select New Method Template.
4. Revise the displayed template so it reads as follows:
addApplicationsToList
"Private - Answer a list of application classes to go into the list box."
^#(
Stopwatch
TextEditor
TimeLogger) select: [:className |
(Smalltalk classAt: className asSymbol) notNil]
5. Save the method.
Stopwatch, TextEditor, and TimeLogger are the names of main classes in other applications that you can create by completing the examples in this book.
Method destroyCallback:clientData:callData:
The method destroyCallback:clientData:callData: enables you to close the window for DevelopChooser when you are finished using it. To implement the method, do the following:
1. Ensure that the method settings refer to private instance methods and add the category Event Handlers.
2. From the Methods menu, select New Method Template.
3. Type the following into the source pane:
destroyCallback: aWidget clientData: clientData callData: callData
"Private - The receiver has been destroyed, free all resources."
busyCursor freeCursor
4. Save the method.
Method executeCallback:clientData:callData:
The method executeCallback:clientData:callData: enables you to open one of the applications named in the list box. To implement the method, do the following:
1. Ensure that the method settings refer to private, instance methods in the category Event Handlers.
2. From the Methods menu, select New Method Template, Or, you can simply delete the current text.
3. Type the following into the description pane:
executeCallback: aWidget clientData: aString callData: callData
"Private - Open the selected application."
listBox selectedItems do:[ :className |
(Smalltalk classAt: className asSymbol) new open].
4. Save the method.
Note the words new open in this method. The classes Chooser, Stopwatch, TextEditor, and TimeLogger, when completed, each open an instance when their class name followed by new open is evaluated in a Transcript or Workspace window.
If you are using views created with the Composition Editor, you can generally open the views by replacing new open with newPart openWidget.