/*
 * MDI (Multiple Document Interface) stuff
 */
#include "main.h"
#include "mdi.h"
#include "resource.h"

#ifdef LOG
#include <xlog.h>
#endif

/* initialize MDI stuff */
bool InitMDI( void )
{
    WNDCLASS wc;

    memset(&wc,0,sizeof(WNDCLASS));

    wc.lpfnWndProc = (WNDPROC)MDIWndProc;
    wc.style = CS_HREDRAW|CS_VREDRAW |CS_DBLCLKS ;
    wc.hInstance = hInstance;
    wc.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
    wc.hCursor = LoadCursor(NULL,IDC_ARROW);
    wc.lpszMenuName = (LPCTSTR) NULL;
    wc.lpszClassName = MDI_CHILD_CLASS;
    
    /* icons */
    wc.hIcon = LoadIcon(NULL,MAKEINTRESOURCE(IDI_ICON));

    if ( !RegisterClass(&wc))
     return FALSE;
   
    return TRUE;
}

/* client window! */
HWND CreateClientWnd(void)
{
  CLIENTCREATESTRUCT c;

  c.hWindowMenu = (HANDLE)GetSubMenu(GetMenu(hWindow), 2);
  c.idFirstChild = IDM_WINDOWCHILD;

  return CreateWindow("MDICLIENT", (LPCTSTR)NULL, WS_CHILD|WS_CLIPCHILDREN|WS_VSCROLL,
		0,0,0,0,
		hWindow,
		NULL,
//		(HMENU) 0xCAC,
		hInstance,
		(LPSTR) &c);
}

/*
 * Make a new child window, link it into master list
 */
HWND APIENTRY NewChild( TCHAR *pName )
{
  HWND hwnd;
  TCHAR sz[160];
  MDICREATESTRUCT mcs;

  if ( !pName || pName[0] == '\0' )
  {
       LoadString(hInstance, IDS_UNTITLED, sz, sizeof(sz)/sizeof(TCHAR));
       mcs.szTitle = (LPCTSTR)sz;
  }
  else
  {
     strcpy(sz,pName);
     mcs.szTitle = (LPCTSTR)sz;
  }
  
  mcs.szClass = (LPCTSTR)MDI_CHILD_CLASS;
  mcs.hOwner = hInstance;
  mcs.x = mcs.cx = CW_USEDEFAULT;
  mcs.y = mcs.cy = CW_USEDEFAULT;

  mcs.style = WS_MAXIMIZEBOX|WS_MINIMIZEBOX|WS_CAPTION|WS_CLIPSIBLINGS|WS_SYSMENU|WS_OVERLAPPED|WS_VISIBLE|WS_CHILD;

  
  /* have client window make the child */
  hwnd = (HWND) SendMessage(hClient, WM_MDICREATE, 0, (LONG)(LPMDICREATESTRUCT) &mcs);
  
  ShowWindow(hwnd,SW_SHOW);

  /* return the child */
  return hwnd;
}

/* kill kids! */
void cleanup_children( void )
{
  HWND h;
  
  while ( (h = get_active()) != (HWND)NULL )
   kill_child(h);
}

/* just for kids! */
LRESULT CALLBACK MDIWndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
	switch (msg)
    {
        case WM_CHILDACTIVATE:
             DefMDIChildProc(hwnd,msg,wParam,lParam);
             break;

        case WM_GETMINMAXINFO:
             DefMDIChildProc(hwnd,msg,wParam,lParam);
             break;

        case WM_MENUCHAR:
             DefMDIChildProc(hwnd,msg,wParam,lParam);
             break;

        case WM_MOVE:
             DefMDIChildProc(hwnd,msg,wParam,lParam);
             break;

        case WM_SETFOCUS:
             DefMDIChildProc(hwnd,msg,wParam,lParam);
             break;

        case WM_SIZE:
             DefMDIChildProc(hwnd,msg,wParam,lParam);
             break;

        case WM_SYSCOMMAND:
             DefMDIChildProc(hwnd,msg,wParam,lParam);
             break;

    	default:
    		return DefMDIChildProc(hwnd,msg,wParam,lParam);
	}
	return 0;
}

/* unalloc a child */
bool kill_child( HWND c )
{
  if ( c == NULL )
   return FALSE;

  /* switch activity */
  SendMessage( hClient, (UINT)WM_MDINEXT, (WPARAM)(HWND)c, 1 ); /* switch to previous window */

  /* kill the window */
  SendMessage( hClient, (UINT)WM_MDIDESTROY, (WPARAM)(HWND)c, 0 );
  
  return TRUE;
}

/* get the active window */
HWND get_active( void )
{
   HWND h = (HWND)SendMessage( hClient, (UINT)WM_MDIGETACTIVE, 0, (LPARAM)NULL );
   
   if ( h == (HWND)NULL )
    return (HWND)NULL;

   return h;
}