The following sample illustrates the source code (C):
/*
* This file was generated by the SOM Compiler and Emitter Framework.
* Generated using SOM Emitter emitctm: 2.40
*/
#ifndef SOM_Module_hello_Source
#define SOM_Module_hello_Source
#endif
#define Hello_Class_Source
#define M_Hello_Class_Source
#define INCL_DOS
#include "hello.ih"
MRESULT EXPENTRY ClientWinProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
// Structure to pass the object pointer and
// use list item to the window procedure
typedef struct
{
WPObject *self; /* Pointer to the object */
USEITEM UseItem; /* Use list item header */
VIEWITEM ViewItem; /* Open view use list item */
} WINDOWDATA;
typedef WINDOWDATA *PWINDOWDATA;
/*
* METHOD: wpFilterPopupMenu
*
* DESCRIPTION: Removes any menu items from the context menu that don't apply.
*
* HOW TO OVERRIDE: No restrictions.
*
* NOTES:
*
* This method is called when an object's context menu has been requested
* (i.e. right click or S-F10 on an object) before displaying the menu. It
* is called before wpModifyPopupMenu.
*/
SOM_Scope ULONG SOMLINK hlo_wpFilterPopupMenu(Hello somSelf,
ULONG ulFlags,
HWND hwndCnr,
BOOL fMultiSelect)
{
/* HelloData *somThis = HelloGetData(somSelf); */
HelloMethodDebug("Hello","hlo_wpFilterPopupMenu");
// Return the parent class' menu bitstring minus the "move bit"
return (parent_wpFilterPopupMenu(somSelf,
ulFlags,
hwndCnr,
fMultiSelect) & ~CTXT_MOVE);
}
/*
* METHOD: wpModifyPopupMenu
*
* DESCRIPTION: Adds the menu items to the context menu.
*
* NOTES:
*
* This method is called when an object's context menu has been requested
* (i.e. right click or S-F10 on an object) before displaying the menu. It
* is called after wpFilterPopupMenu.
*/
SOM_Scope BOOL SOMLINK hlo_wpModifyPopupMenu(Hello somSelf,
HWND hwndMenu,
HWND hwndCnr, ULONG iPosition)
{
HMODULE hmod;
/* HelloData *somThis = HelloGetData(somSelf); */
HelloMethodDebug("Hello","hlo_wpModifyPopupMenu");
/* Get the module handle of the .DLL */
hmod = _clsQueryModuleHandle(_Hello);
/*
* Put the "Say Hello" submenu item in the Open submenu
*/
_wpInsertPopupMenuItems(somSelf, // Object
hwndMenu, // Main context menu
0, // Position to insert menu at
// 0 = top of menu
hmod, // Module of menu to insert
ID_OPENHELLO, // Menu to insert
WPMENUID_OPEN); // Submenu to insert menu in
/*
* Put the "Product Info" menu item at the end of the main context menu
*/
_wpInsertPopupMenuItems(somSelf, // Object
hwndMenu, // Main context menu
iPosition, // Position to insert menu at
// iPosition = next available
hmod, // Module of menu to insert
ID_MSGBOX, // Menu to insert
0); // Submenu to insert menu in
// 0 = main context menu
return (parent_wpModifyPopupMenu(somSelf,
hwndMenu,
hwndCnr,
iPosition));
}
/*
* METHOD: wpMenuItemSelected
*
* DESCRIPTION: Processes input from the menu options that was added.
*
* NOTES:
*
* This method is called when an item in an objects' context menu has been
* selected.
*/
SOM_Scope BOOL SOMLINK hlo_wpMenuItemSelected(Hello somSelf,
HWND hwndFrame,
ULONG ulMenuId)
{
/* HelloData *somThis = HelloGetData(somSelf); */
HelloMethodDebug("Hello","hlo_wpMenuItemSelected");
switch(ulMenuId)
{
case IDM_OPENHELLO:
/*
* Either the object was double clicked on or the Say Hello
* item on the Open submenu was selected.
*
* We could call wpOpen here, but wpOpen will open a new view
* no matter what. wpViewObject only opens a new view if
* no open view exists or if mutliple concurrent views are enabled.
* Otherwise, it will give focus to the current open view.
*
* wpViewObject should be used whenever possible instead of wpOpen
* to prevent creating multiple open views inadvertently.
*/
_wpViewObject(somSelf, // Object
NULLHANDLE, // Workplace Shell
// internal use only
OPEN_HELLO, // View to open. This ID must be the
// same as the menu ID ID_OPENHELLO
0); // parameter passed to wpOpen
break;
case IDM_MSGBOX:
{
// Message Box menu item was selected
WinMessageBox(HWND_DESKTOP,
HWND_DESKTOP,
"Message box displayed from a Hello object's pop-up menu.",
"Workplace Message",
1,
MB_OK |
MB_MOVEABLE |
MB_INFORMATION);
break;
}
default:
return parent_wpMenuItemSelected(somSelf, hwndFrame, ulMenuId);
}
return TRUE; /* We processed it */
}
/*
* METHOD: wpOpen
*
* DESCRIPTION: Opens the Hello Workplace Shell window.
*
* NOTES:
*
* This method is called when a new open view of an object is needed,
* i.e. when an item in an object's Open submenu has been selected or
* when an object is double clicked on. This is equivalent to selecting
* the default item in the object's Open submenu.
*
* wpOpen should always open a new view. The Workplace Shell actually
* calls wpViewObject first when an object is double clicked on or an Open
* submenu item is selected. wpViewObject will then call wpOpen if there
* is currently no open view of the selected Open submenu item or if
* mutliple concurrent views of the object are enabled.
*/
SOM_Scope HWND SOMLINK hlo_wpOpen(Hello somSelf,
HWND hwndCnr,
ULONG ulView,
ULONG param)
{
/* HelloData *somThis = HelloGetData(somSelf); */
HelloMethodDebug("Hello","hlo_wpOpen");
switch (ulView)
{
case OPEN_HELLO:
{
// Request to open a Hello Workplace Shell window
// Create a standard window
HAB hab; // Anchor block handle
HWND hwndClient; // Client window handle
HWND hwndFrame; // Frame window handle
PWINDOWDATA pWindowData;
ULONG flCreate; // Window creation flags
hab = WinQueryAnchorBlock(HWND_DESKTOP);
// Create the class, adding a user word to the window data to
// anchor the object use list item for this open view
WinRegisterClass(hab,
"hello",
ClientWinProc,
CS_SIZEREDRAW,
sizeof(*pWindowData));
flCreate = FCF_SYSMENU |
FCF_SIZEBORDER |
FCF_TITLEBAR |
FCF_MINMAX |
FCF_SHELLPOSITION |
FCF_TASKLIST;
hwndFrame = WinCreateStdWindow(HWND_DESKTOP,
WS_VISIBLE,
&flCreate,
"hello",
_wpQueryTitle(somSelf),
0L,
0,
ID_FRAME,
&hwndClient);
if (hwndFrame)
{
WinSetFocus(HWND_DESKTOP, hwndFrame);
// Now that we have created an open view, add the view to the
// object's use list. This use list is used by wpViewObject and
// wpClose to check for existing open views.
// Get storage for and initialize a use list item
pWindowData = (PWINDOWDATA) _wpAllocMem(somSelf,
sizeof(*pWindowData),
NULL);
memset((PVOID) pWindowData, 0, sizeof(*pWindowData));
pWindowData->self = somSelf;
pWindowData->UseItem.type = USAGE_OPENVIEW;
pWindowData->ViewItem.view = OPEN_HELLO;
pWindowData->ViewItem.handle = hwndFrame;
// Add the use list item to the object's use list
_wpAddToObjUseList(somSelf, &(pWindowData->UseItem));
// Save the pointer to the use item in the window words so that
// the window procedure can remove it from the list when the window
// is closed
WinSetWindowPtr(hwndClient, QWL_USER, pWindowData);
}
return hwndFrame;
}
// Some other view was requested. Pass the request on to the
// parent (WPDataFile) class
default:
return (parent_wpOpen(somSelf, hwndCnr, ulView, param));
} /* end switch (ulView) */
}
/*
* METHOD: clsQueryModuleHandle
*
* DESCRIPTION:
*
* Returns the module handle of this class. If this is the
* first invocation, DosQueryModuleHandle is called to save the handle
* for future invocations.
*
* RETURN:
*
* 0 Unsuccessful
* non-zero Module handle
*
* NOTES:
*
* This method is called when a new open view of an object is needed,
* i.e. when an item in an object's Open submenu has been selected or
* when an object is double clicked on. This is equivalent to selecting
* the default item in the object's Open submenu.
*/
SOM_Scope HMODULE SOMLINK hloM_clsQueryModuleHandle(M_Hello somSelf)
{
M_HelloData *somThis = M_HelloGetData(somSelf);
M_HelloMethodDebug("M_Hello","hloM_clsQueryModuleHandle");
// Make sure we already have the module handle
if (_hmod == NULLHANDLE)
{
zString zsPathName;
somId Id;
// Retrieve registered path name of the module (DLL)
// and query the module handle
Id = somIdFromString("M_Hello");
zsPathName = _somLocateClassFile(SOMClassMgrObject,
Id,
M_Hello_MajorVersion,
M_Hello_MinorVersion);
SOMFree(Id);
DosQueryModuleHandle(zsPathName, &_hmod);
}
return (_hmod);
}
/*
* METHOD: wpclsQueryDefaultView
*
* DESCRIPTION: Returns the default view for a new instance of this object.
*
* REMARKS:
*
* Return the ID of the default view, OPEN_HELLO. This ID must be the
* same as the ID of the Open submenu item, ID_OPENHELLO.
*
* NOTES:
*
* This method is called to determine which view to open when an object
* of class Hello is double clicked on.
*/
SOM_Scope ULONG SOMLINK hloM_wpclsQueryDefaultView(M_Hello somSelf)
{
/* M_HelloData *somThis = M_HelloGetData(somSelf); */
M_HelloMethodDebug("M_Hello","hloM_wpclsQueryDefaultView");
return OPEN_HELLO;
}
/*
* METHOD: wpclsQueryTitle
*
* DESCRIPTION: Returns the string "Hello Workplace Shell".
*
* NOTES:
*
* This method is called by the Workplace Shell to determine the object
* title when an object of class Hello is created.
*/
SOM_Scope PSZ SOMLINK hloM_wpclsQueryTitle(M_Hello somSelf)
{
// M_HelloData *somThis = M_HelloGetData(somSelf);
M_HelloMethodDebug("M_Hello","hloM_wpclsQueryTitle");
return "Hello Workplace Shell";
}
/*
* FUNCTION: ClientWinProc
*
* DESCRIPTION: Window procedure for the Hello, Workplace Shell window.
*/
MRESULT EXPENTRY ClientWinProc (HWND hwnd,
ULONG msg,
MPARAM mp1,
MPARAM mp2)
{
BOOL fSuccess; // Return from function
switch(msg)
{
case WM_PAINT:
{
HPS hps; // Cached PS
RECTL rcl; // Window rectangle
CHAR sz[25]; // String
hps = WinBeginPaint (hwnd , (HPS)0, NULL);
fSuccess = GpiErase (hps);
WinQueryWindowRect (hwnd, &rcl);
strcpy (sz, "Hello, Workplace Shell.");
WinDrawText(hps,
strlen(sz),
sz,
&rcl,
CLR_BLACK,
CLR_WHITE,
DT_CENTER |
DT_VCENTER);
fSuccess = WinEndPaint (hps);
return (MRESULT) NULL;
}
case WM_CLOSE:
{
// Get the object pointer and the use list item from the window
PWINDOWDATA pWindowData = (PWINDOWDATA) WinQueryWindowPtr(hwnd, QWL_USER);
// Remove this window from the object's use list
_wpDeleteFromObjUseList(pWindowData->self,&pWindowData->UseItem);
// Free the use list item. Note that there is no need to supply a
// length since this storage was allocated with wpAllocMem
_wpFreeMem(pWindowData->self,(PBYTE)pWindowData);
// Destroy the window and return
WinDestroyWindow(WinQueryWindow(hwnd, QW_PARENT));
return (MRESULT) NULL;
}
default:
return WinDefWindowProc(hwnd, msg, mp1, mp2);
}
}