/* MDICHILD.CLS - This class contains the modifcations
  necessary to make a window work as an MDI Child
  window.  Any application that is intended for use in
  MDI as a child window should descend from this class.
  In order to use this class with existing code one
  should either make a copy of it and descend it from
  that class, or descend your window class from this
  one. */!!

inherit(Window, #MDIChild, nil, 2, nil)!!

now(class(MDIChild))!!

now(MDIChild)!!

/* This message is received whenever the focus changes to a new MDI child
  window. The MDI client window is notified that that this window is
  either being activated or deactivated.
  NOTE: This message must be passed on to the default child procedure */
Def WM_MDIACTIVATE(self, wP, lP)
{ if wP == 0
  then deactivateMDIChild(parent, self);
  else activateMDIChild(parent, self);
  endif;
}!!

/* Default for dialogs is to do nothing. Return 0
  to let Windows do normal processing.
  WARNING: Do not remove this method! May be redefined
  in descendants if they register a private window
  class with Windows for their dialogs. */
Def defWndProc(self, msgNum, wP, lP)
{ ^Call DefMDIChildProc(getHWnd(self), msgNum, wP, lP);
}!!

/* Destroy the MDI Child window by passing the WM_MDIDESTROY message
  to the MDI Client window. */
Def destroy(self)
{ Call SendMessage(getHWnd(parent), messageID(#WM_MDIDESTROY),
    getHWnd(self), 0L);
}!!

/* This message will be received whenever the window has been resized.
  NOTE: This message must be passed on to the default child procedure */
Def WM_SIZE(self, wP, lP)
{ WM_SIZE(self:ancestor, wP, lP);
  execWindowProc(self, #WM_SIZE, wP, lP);
}!!

/* Set up this windows default procedure so that it will execute the
  DefMDIChildProc if the message is not handled by the Actor system.
  For MDI child windows in Actor, WM_DESTROY and WM_NCDESTROY messages
  are passed to the correct Def Proc this way, WM_SIZE and WM_COMMAND
  are handled differently */
Def execWindowProc(self, windMsg, wP, lP)
{ ^Call DefMDIChildProc(getHWnd(self), messageID(windMsg), wP, lP);
}!!

/* Create an MDI child window according to certain specifications.  par is
  the parent of this child.  It should be set to the Frame window
  that controls the MDI application.  wName is the text that will appear
  in the caption bar.  rect is a rectangle representing the are in which
  the window should be displayed.  style defines what attributes the
  window should have.  It should be noted that, once the WM_MDICREATE
  message is sent to the MDIClient, a window will be created AND shown. */
Def create(self, par, wName, rect, style | wndCls, childStruct, childRect)
{ parent := par;
  wndCls := wndClass(class(self));
  if Call GetClassInfo(HInstance, asciiz(wndCls), new(Struct, 26)) = 0
  then register(class(self));
  endif;
  caption := wName;
  wStyle := style;
  setCurWindow(System, self);
  childStruct := new(Struct, 26);
  putLong(childStruct, asciiz(wndCls), 0);
  putLong(childStruct, asciiz(caption), 4);
  putWord(childStruct, HInstance, 8);
  childRect := rect cor
    rect(CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT);
  putWord(childStruct, left(childRect), 10);
  putWord(childStruct, top(childRect), 12);
  putWord(childStruct, width(childRect), 14);
  putWord(childStruct, height(childRect), 16);
  putLong(childStruct, style, 18);
  putLong(childStruct, 0L, 22);
  hWnd := Call SendMessage(getHWnd(parent),
    messageID(#WM_MDICREATE), 0, childStruct);
  if hWnd = 0
  then alert(System, self, #windCreateError);
  endif;
  add(Windows, self);
}!!
