
/*
 * Iconification functions
 *
 * Copyright 1994 John Richardson
 */

static char Copyright[] = "Copyright  John Richardson, 1994";

#include "win.h"
#include "class.h"
#include "message.h"
#include "sysmetrics.h"
#include "user.h"
#include "scroll.h"
#include "menu.h"
#include "icon.h"

RECT myrect;


ICON_Iconify(HWND hwnd)
{
	WND *wndPtr = WIN_FindWndPtr( hwnd );
	GC testgc;
	WND *parwPtr;
	
#ifdef DEBUG_ICON
	printf("ICON_Iconify %d\n", hwnd);
#endif

	parwPtr = WIN_FindWndPtr(wndPtr->hwndParent);
	if (parwPtr == NULL) {
		printf("argh, the parent is NULL, what to do?\n");
		exit(1);
	}
	wndPtr->dwStyle |= WS_MINIMIZE; 
 	XUnmapWindow(display, wndPtr->window); 
	if (wndPtr->icon == NULL) {
		printf("argh, couldn't find icon\n");
		exit(1);
	}
#ifdef DEBUG_ICON
	printf("parent edge values are %d, %d\n",  parwPtr->rectWindow.left,
				parwPtr->rectWindow.bottom);
#endif
	wndPtr->ptIconPos.x = parwPtr->rectWindow.left + 10;
	wndPtr->ptIconPos.y = parwPtr->rectWindow.bottom - 80;

#ifdef NOT
        wndPtr->rectWindow.right = 100;
        wndPtr->rectWindow.bottom = 32;
        wndPtr->rectNormal.right = 1000;
        wndPtr->rectNormal.bottom = 32;
        wndPtr->rectClient.top= wndPtr->ptIconPos.y;
	wndPtr->rectClient.left= wndPtr->ptIconPos.x;

        wndPtr->rectClient.right = 100;
	wndPtr->rectClient.bottom = 64;
#endif
	wndPtr->rectClientSave = wndPtr->rectNormal;
	myrect = wndPtr->rectClient;

	MoveWindow(hwnd, wndPtr->ptIconPos.x, wndPtr->ptIconPos.y,
			100, 64+20, FALSE);

	XMoveWindow(display, wndPtr->icon, 
		wndPtr->ptIconPos.x, wndPtr->ptIconPos.y);

	XMapWindow(display, wndPtr->icon);

	SendMessage(hwnd, WM_PAINTICON, 0, 0);
#ifdef DEBUG_ICON
        printf("done with iconify\n");
#endif
}


BOOL ICON_isAtPoint(HWND hwnd, POINT pt)
{
       	WND *wndPtr = WIN_FindWndPtr( hwnd );
	int iconWidth, iconHeight;

/****************
	if (wndPtr->hwndParent != GetDesktopWindow()) { 
        	pt.x -= wndPtr->rectClient.left;
        	pt.y -= wndPtr->rectClient.top;
	} 
*****************/
 
	
	if (wndPtr->hIcon != (HICON)NULL) {
		ICONALLOC   *lpico;
      		lpico = (ICONALLOC *)GlobalLock(wndPtr->hIcon);
      		iconWidth = (int)lpico->descriptor.Width;
      		iconHeight = (int)lpico->descriptor.Height;
    	} else {
      		iconWidth = 64;
      		iconHeight = 64;
    	}	

#ifdef DEBUG_ICON
        printf("icon x,y is %d,%d\n",
		wndPtr->ptIconPos.x, wndPtr->ptIconPos.y);

        printf("icon end x,y is %d,%d\n",
		wndPtr->ptIconPos.x + 100, 
		wndPtr->ptIconPos.y + iconHeight + 20);

        printf("mouse pt x,y is %d,%d\n", pt.x, pt.y);

	printf("%d\n", IsIconic(hwnd));
	printf("%d\n", (pt.x >= wndPtr->ptIconPos.x));
	printf("%d\n", (pt.x < wndPtr->ptIconPos.x + 100));
	printf("%d\n", (pt.y >= wndPtr->ptIconPos.y));
	printf("%d\n", (pt.y < wndPtr->ptIconPos.y + iconHeight + 20));
	printf("%d\n", !(wndPtr->dwStyle & WS_DISABLED));
	printf("%d\n",  (wndPtr->dwStyle & WS_VISIBLE));
	printf("%d\n", !(wndPtr->dwExStyle & WS_EX_TRANSPARENT));
#endif
	
        if ( IsIconic(hwnd) &&
            (pt.x >= wndPtr->ptIconPos.x) &&
            (pt.x < wndPtr->ptIconPos.x + 100) &&
            (pt.y >= wndPtr->ptIconPos.y) &&
            (pt.y < wndPtr->ptIconPos.y + iconHeight + 20) &&
            !(wndPtr->dwStyle & WS_DISABLED) &&
            (wndPtr->dwStyle & WS_VISIBLE) &&
            !(wndPtr->dwExStyle & WS_EX_TRANSPARENT))
        {
#ifdef DEBUG_ICON
		printf("got a winner!\n");
#endif
		return 1;
        } 
 
	return 0;
	
}

HWND ICON_findIconFromPoint(POINT pt)
{
    	HWND hwnd = GetTopWindow( GetDesktopWindow() );
    	WND *wndPtr;
	HWND hwndRet = 0;

    	while (hwnd) {

        	if ( !(wndPtr=WIN_FindWndPtr(hwnd)))  return 0;
      		if (ICON_isAtPoint(hwnd, pt))  {
#ifdef DEBUG_ICON
			printf("returning\n");
#endif
			return hwndRet = hwnd;
		} else {
#ifdef DEBUG_ICON
			printf("checking child\n");
#endif
      			hwnd = wndPtr->hwndChild;
		}
    	}
	return hwndRet;
}


ICON_Deiconify(HWND hwnd)
{
	WND *wndPtr = WIN_FindWndPtr( hwnd );

#ifdef DEBUG_ICON
	printf("deiconifying\n");
#endif
	XUnmapWindow(display, wndPtr->icon); 
	wndPtr->dwStyle &= ~WS_MINIMIZE;
/*	wndPtr->rectNormal = myrect;
*/
	MoveWindow(hwnd, 
		wndPtr->rectClientSave.left, 
		wndPtr->rectClientSave.top,
		wndPtr->rectClientSave.right - wndPtr->rectClientSave.left, 
		wndPtr->rectClientSave.bottom - wndPtr->rectClientSave.top, 
		FALSE);

	XMapWindow(display, wndPtr->window);
}


