/*      $NetBSD: layout.c,v 1.2 2000/01/16 03:07:32 takemura Exp $      */

/*-
* Copyright (c) 1999 Shin Takemura.
* All rights reserved.
*
* This software is part of the PocketBSD.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
*    notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
*    notice, this list of conditions and the following disclaimer in the
*    documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
*    must display the following acknowledgement:
*      This product includes software developed by the PocketBSD project
*      and its contributors.
* 4. Neither the name of the project nor the names of its contributors
*    may be used to endorse or promote products derived from this software
*    without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
*/
#include <pbsdboot.h>
#include <commctrl.h>
#include <res/resource.h>


int
CreateMainWindow(HINSTANCE hInstance, HWND hWnd, LPCTSTR name, int cmdbar_height)
{
       HRSRC res;
       unsigned char *mem;
       int i;
       DLGTEMPLATE dlg;
       DLGITEMTEMPLATE item;
       RECT rect;
       int ratio_x, ratio_y;

       res = FindResource(hInstance, name, RT_DIALOG);
       if (res == NULL) {
               debug_printf(TEXT("error=%d\n"), GetLastError());
       }
       mem = (unsigned char*)LockResource(LoadResource(NULL, res));

       /*
        *      DLGTEMPLATE structure
        */
       dlg = *(DLGTEMPLATE*)mem;
       mem += sizeof(DLGTEMPLATE);

       GetClientRect(hWnd, &rect);
       rect.top += cmdbar_height; /* get client rect w/o command bar */
       ratio_x = (rect.right - rect.left) * 100 / dlg.cx;
       ratio_y = (rect.bottom - rect.top) * 100 / dlg.cy;

       /*
        *  menu resource
        */
       if (*(WORD*)mem == 0xffff) {
               /* predefined menu */
               mem += sizeof(WORD);
               debug_printf(TEXT("Dlg: menu=%04x\n"), *(WORD*)mem);
               mem += sizeof(WORD);
       } else
       if (*(WORD*)mem == 0x0000) {
               /* no menu */
               mem += sizeof(WORD);
               debug_printf(TEXT("Dlg: menu=none\n"));
       } else {
               /* menu resource name */
               debug_printf(TEXT("Dlg: menu=%s\n"), (TCHAR*)mem);
               while (*(WORD*)mem) {   /* zero terminated */
                       mem += sizeof(WORD);
               }
               mem += sizeof(WORD);
       }

       /*
        *  window class
        */
       if (*(WORD*)mem == 0xffff) {
               /* predefined class */
               mem += sizeof(WORD);
               debug_printf(TEXT("Dlg: class=%04x\n"), *(WORD*)mem);
               mem += sizeof(WORD);
       } else
       if (*(WORD*)mem == 0x0000) {
               /* default class */
               mem += sizeof(WORD);
               debug_printf(TEXT("Dlg: class=none\n"));
       } else {
               /* class name */
               debug_printf(TEXT("Dlg: class=%s\n"), (TCHAR*)mem);
               while (*(WORD*)mem) {   /* zero terminated */
                       mem += sizeof(WORD);
               }
               mem += sizeof(WORD);
       }

       /*
        *  window title
        */
       debug_printf(TEXT("Dlg: title=%s\n"), (TCHAR*)mem);
       while (*(WORD*)mem) {   /* zero terminated */
               mem += sizeof(WORD);
       }
       mem += sizeof(WORD);

       if (dlg.style & DS_SETFONT) {
               /* font size */
               debug_printf(TEXT("Dlg: font size=%d\n"), *(WORD*)mem);
               mem += sizeof(WORD);
               /* font name */
               debug_printf(TEXT("Dlg: font name=%s ("), (TCHAR*)mem);
               while (*(WORD*)mem) {   /* zero terminated */
                       debug_printf(TEXT("%04x"), *(WORD*)mem);
                       mem += sizeof(WORD);
               }
               debug_printf(TEXT(")\n"));
               mem += sizeof(WORD);
       }

       /*
        *  for each control
        */
       for (i = 0; i < dlg.cdit; i++) {
               TCHAR *class_name = NULL;
               TCHAR *window_text = NULL;

               /* DWORD alignment */
               if ((long)mem % sizeof(DWORD)) {
                       mem = (unsigned char*)(((long)mem / sizeof(DWORD) + 1) * sizeof(DWORD));
               }

               /*
                *      DLGITEMTEMPLATE structure
                */
               item = *(DLGITEMTEMPLATE*)mem;
               mem += sizeof(DLGITEMTEMPLATE);

               /*
                *  control class
                */
               if (*(WORD*)mem == 0xffff) {
                       /* predefined system class */
                       mem += sizeof(WORD);
                       switch (*(WORD*)mem) {
                       case 0x0080:    class_name = TEXT("BUTTON");    break;
                       case 0x0081:    class_name = TEXT("EDIT");              break;
                       case 0x0082:    class_name = TEXT("STATIC");    break;
                       case 0x0083:    class_name = TEXT("LISTBOX");   break;
                       case 0x0084:    class_name = TEXT("SCROLLBAR"); break;
                       case 0x0085:    class_name = TEXT("COMBOBOX");  break;
                       default:
                               debug_printf(TEXT("class=%04x "), *(WORD*)mem);
                               break;
                       }
                       mem += sizeof(WORD);
               } else {
                       /* class name */
                       class_name = (TCHAR*)mem;
                       while (*(WORD*)mem) {   /* zero terminated */
                               mem += sizeof(WORD);
                       }
                       mem += sizeof(WORD);
               }

               /*
                *  window contents
                */
               if (*(WORD*)mem == 0xffff) {
                       /* resource */
                       mem += sizeof(WORD);
                       debug_printf(TEXT("contents=%04x "), *(WORD*)mem);
                       mem += sizeof(WORD);
               } else {
                       /* text */
                       window_text = (TCHAR*)mem;
                       while (*(WORD*)mem) {   /* zero terminated */
                               mem += sizeof(WORD);
                       }
                       mem += sizeof(WORD);
               }
               if (item.id == 0xffff) {
                       item.id = i + 1;
               }

               if (class_name) {
                       debug_printf(TEXT("Control: %04x "), item.id);
                       debug_printf(TEXT("class=%s "), class_name);
                       debug_printf(TEXT("contents=%s "),
                                       window_text ? window_text : TEXT(""));

                       CreateWindowEx(
                               item.dwExtendedStyle,
                               class_name,                                             // Class
                               window_text,                                    // Title
                               item.style,                                             // Style
                               item.x * ratio_x / 100,
                               item.y * ratio_y / 100 + cmdbar_height,
                               item.cx * ratio_x / 100,
                               item.cy * ratio_y / 100,
                               hWnd,                                                   // Parent handle
                               (HMENU)item.id,                                 // Control ID
                               hInstance,                                              // Instance handle
                               NULL);                                                  // Creation
               }

#if 0
               /* DWORD alignment */
               if ((long)mem % sizeof(DWORD)) {
                       //mem = (unsigned char*)(((long)mem / sizeof(DWORD) + 1) * sizeof(DWORD));
               }
#endif

               /*
                *  creation data
                */
               debug_printf(TEXT("data=0x%x bytes\n"), *(WORD*)mem);
               mem += *(WORD*)mem;
               mem += sizeof(WORD);
       }

       return (0);
}