#include <windows.h>
#include <richedit.h>
#include <stdio.h>
#include <string.h>
#include <winlib/winlib.h>

#include "wintest.h"


HINSTANCE hInst;


LRESULT CALLBACK MainWndProc(HWND hwnd, UINT msg, WPARAM wParam,
               LPARAM lParam)
{
       static HWND hwndStatus, hwndEdit, hwndInput;
       static HWND oldFocus;
       WORD id;
       RECT rect, statusRect;
       CHARFORMAT cf;
       PARAFORMAT pf;
       HFONT hfnt = GetStockObject(ANSI_FIXED_FONT);
       CHARRANGE cr;
       char tmp[80], *p;
       int val;
       static int count = 1;

       switch (msg) {
               case WM_CREATE:
                       hwndStatus = CreateStatusWnd(hInst, hwnd, 2);

                       hwndEdit = CreateWindowEx(
                               WS_EX_CLIENTEDGE,
                               "RichEdit20A", NULL,
                               WS_CHILD | WS_HSCROLL | WS_VSCROLL | WS_VISIBLE |
                               ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL,
                               0, 0, 0, 0,
                               hwnd, NULL, hInst, NULL);

                       memset(&cf, 0, sizeof(CHARFORMAT));
                       cf.cbSize = sizeof(CHARFORMAT);
                       cf.dwMask = CFM_FACE | CFM_SIZE | CFM_BOLD;
                       cf.dwEffects = 0;
                       cf.yHeight = 8 * 20;
                       strcpy(cf.szFaceName, "Andale Mono");

                       memset(&pf, 0, sizeof(PARAFORMAT));
                       pf.cbSize = sizeof(PARAFORMAT);
                       pf.dwMask = PFM_STARTINDENT;
                       pf.dxStartIndent = 25;

                       SendMessage(hwndEdit, EM_SETCHARFORMAT, SCF_ALL,
                                       (LPARAM)&cf);
                       SendMessage(hwndEdit, EM_SETPARAFORMAT,
                                       (WPARAM)0, (LPARAM)&pf);

                       hwndInput = CreateWindowEx(
                               WS_EX_CLIENTEDGE,
                               "RichEdit20A", NULL,
                               WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL,
                               0, 0, 0, 0,
                               hwnd, NULL, hInst, NULL);

                       SendMessage(hwndInput, EM_SETCHARFORMAT, SCF_ALL,
                                       (LPARAM)&cf);
                       SendMessage(hwndInput, EM_SETPARAFORMAT,
                                       (WPARAM)0, (LPARAM)&pf);

                       SetFocus(hwndInput);
                       break;

               case WM_SIZE:
                       SendMessage(hwndStatus, WM_SIZE, wParam, lParam);
                       SetStatusParts(hwndStatus, 2);

                       GetClientRect(hwnd, &rect);
                       GetWindowRect(hwndStatus, &statusRect);

                       MoveWindow(hwndEdit,
                                       0, 0, rect.right,
                                       rect.bottom - (statusRect.bottom - statusRect.top) - 24,
                                       TRUE);

                       MoveWindow(hwndInput,
                                       0, rect.bottom - (statusRect.bottom - statusRect.top) - 24,
                                       rect.right, 24,
                                       TRUE);
                       break;

               case WM_COMMAND:
                       id = LOWORD(wParam);

                       switch (id) {
                               case IDM_EXIT:
                                       PostQuitMessage(0);
                                       break;

                               case IDM_CLEAR:
                                       SetWindowText(hwndEdit, (LPCTSTR)NULL);
                                       break;

                               case IDM_INPUT:
                                       p = GetInput(hwnd, "Input", "", 300);
                                       if (p) {
                                               val = atoi(p);
                                               EditPrintf(hwndEdit, 10000, "%d\n", val * 1000);
                                       }
                                       break;

                               case IDM_COMMAND:
                                       GetWindowText(hwndInput, tmp, 80);
                                       val = atoi(tmp);
                                       EditPrintf(hwndEdit, 1000, "%d\n", val * 1000);
                                       break;

                               default:
                                       return FALSE;
                       }
                       break;

               case WM_ACTIVATE:
                       if (LOWORD(wParam) == WA_INACTIVE)
                               oldFocus = GetFocus();
                       else
                               if (oldFocus)
                                       SetFocus(oldFocus);
                       break;

               case WM_DESTROY:
                       PostQuitMessage(0);
                       break;

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


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
               LPSTR lpCmdLine, INT nCmdShow)
{
       WNDCLASS wc;
       HWND hwnd;
       MSG msg;
       HACCEL hAccel;

       hInst = hInstance;

       if (! LoadLibrary("riched20.dll")) {
               MessageBox(NULL, "Couldn't load riched20.dll", "SQLBase",
                               MB_OK | MB_ICONERROR);
               return 0;
       }

       wc.style = CS_HREDRAW | CS_VREDRAW;
       wc.lpfnWndProc = (WNDPROC)MainWndProc;
       wc.cbClsExtra = 0;
       wc.cbWndExtra = 0;
       wc.hInstance = hInst;
       wc.hIcon = LoadIcon(hInst, IDI_WINLOGO);
       wc.hCursor = LoadCursor(NULL, IDC_ARROW);
       wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
       wc.lpszMenuName = "MainMenu";
       wc.lpszClassName = "MainWndClass";
       if (! RegisterClass(&wc))
               return 0;

       hwnd = CreateWindow(
               "MainWndClass",
               "wintest",
               WS_OVERLAPPEDWINDOW,
               CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
               NULL, NULL, hInst, NULL);

       ShowWindow(hwnd, nCmdShow);

       if (! (hAccel = LoadAccelerators(hInst, "Accel")))
               return 0;

       while (GetMessage (&msg, NULL, 0, 0)) {
               if (! TranslateAccelerator(hwnd, hAccel, &msg)) {
                       TranslateMessage(&msg);
                       DispatchMessage(&msg);
               }
       }

       return msg.wParam;
}