/********************************************************************************************
	Clean OS Windows library module version 1.2.1.
	This module is part of the Clean Object I/O library, version 1.2.1,
	for the Windows platform.
********************************************************************************************/

/********************************************************************************************
	About this module:
	Routines related to window/dialog handling.
********************************************************************************************/
#include "cCCallWindows_121.h"
#include "cCrossCallWindows_121.h"

OS WinInvalidateWindow (GtkWidget *widget, OS ios)
{
    rprintf("WinInvalidateWindow\n");
	gtk_widget_queue_draw(widget);
    return ios;
}

OS WinInvalidateRect (GtkWidget *widget, int left, int top, int right,
                int bottom, OS ios)
{
    /* rprintf("WinInvalidateRect\n"); */
	gint temp;
	GdkRectangle* rect = g_new(GdkRectangle,1);
	if (top > bottom) {
		temp = top;
		top = bottom;
		bottom = top;
	}
	rect->x = (gint)left;
	rect->y = (gint)top;
	rect->width = (gint)(right - left);
	rect->height = (gint)(bottom - top);
	gdk_window_invalidate_rect(GDK_WINDOW(widget),rect, 1);
	/* FIXME: destroy the Rectangle here? */
    return ios;
}

OS WinValidateRect (GtkWidget *widget, int left, int top, int right, int bottom,
                OS ios)
{
    /* GTK Automatically calculates valid regions. */
    return ios;
}

OS WinValidateRgn (GtkWidget *widget, GdkRegion *region, OS ios)
{
    /* GTK Automatically calculates valid regions. */
    return ios;
}

/*	Win(M/S)DIClientToOuterSizeDims returns the width and height needed to add/subtract
	from the client/outer size to obtain the outer/client size.
	These values must be the same as used by W95AdjustClean(M/S)DIWindowDimensions!
*/
void WinMDIClientToOuterSizeDims (int styleFlags, OS ios, int *dw, int *dh, OS* oos)
{
/*	if ((styleFlags&WS_THICKFRAME) != 0)
	{	// resizable window
		*dw = 2 * GetSystemMetrics (SM_CXSIZEFRAME);
		*dh = 2 * GetSystemMetrics (SM_CYSIZEFRAME) + GetSystemMetrics (SM_CYCAPTION);
	} else
	{	// fixed size window
		*dw = 2 * GetSystemMetrics (SM_CXFIXEDFRAME);
		*dh = 2 * GetSystemMetrics (SM_CYFIXEDFRAME) + GetSystemMetrics (SM_CYCAPTION);
	}
*/
	*dw = 0;
    *dh = 0;
	printf("WinMDIClientOuterSizeDims -> not implemented\n");
    *oos = ios;
}

void WinSDIClientToOuterSizeDims (int styleFlags, OS ios, int *dw, int *dh, OS *oos)
{
	*dw = 0; //2 * GetSystemMetrics (SM_CXSIZEFRAME);
	*dh = 0; //2 * GetSystemMetrics (SM_CYSIZEFRAME) + GetSystemMetrics (SM_CYCAPTION);
	printf("WinSDIClientOuterSizeDims -> not implemented\n");
    *oos = ios;
}


/*	UpdateWindowScrollbars updates any window scrollbars and non-client area if present.
	Uses the following access procedures to the GWL_STYLE of a windowhandle:
		GetGWL_STYLE (hwnd) returns the GWL_STYLE value of hwnd;
		WindowHasHScroll (hwnd) returns TRUE iff hwnd has a horizontal scrollbar;
		WindowHasVScroll (hwnd) returns TRUE iff hwnd has a vertical scrollbar;
*/

void UpdateWindowScrollbars (GtkWidget *widget)
{
/*	int w,h;
	RECT rect;

	GetWindowRect (hwnd, &rect);
	w = rect.right -rect.left;
	h = rect.bottom-rect.top;

	if (WindowHasHScroll (hwnd))
	{
		rect.left   = 0;
		rect.top    = h-GetSystemMetrics (SM_CYHSCROLL);
		rect.right  = w;
		rect.bottom = h;
		InvalidateRect (hwnd,&rect,FALSE);
		RedrawWindow (hwnd,&rect,NULL,RDW_FRAME | RDW_VALIDATE | RDW_UPDATENOW | RDW_NOCHILDREN);
		ValidateRect (hwnd,&rect);
	}
	if (WindowHasVScroll (hwnd))
	{
		rect.left   = w-GetSystemMetrics (SM_CXVSCROLL);
		rect.top    = 0;
		rect.right  = w;
		rect.bottom = h;
		InvalidateRect (hwnd,&rect,FALSE);
		RedrawWindow (hwnd,&rect,NULL,RDW_FRAME | RDW_VALIDATE | RDW_UPDATENOW | RDW_NOCHILDREN);
		ValidateRect (hwnd,&rect);
	}
*/
	printf("UpdateWindowScrollbars -> not implemented\n");
}


void WinScreenYSize (OS ios, int *py, OS *oos)
{
    rprintf("WinScreenYSize\n");
	*py = gdk_screen_height();
    *oos = ios;
}

void WinScreenXSize (OS ios, int *px, OS *oos)
{
    rprintf("WinScreenXSize\n");
	*px = gdk_screen_width();
    *oos = ios;
}

void WinMinimumWinSize (int *mx, int *my)
{
    rprintf("WinMinimumWinSize\n");
	*mx = 48;
	*my = 0;
}

/*	WinScrollbarSize determines system metrics of width and height of scrollbars.
*/
void WinScrollbarSize (OS ios, int *width, int *height, OS *oos)
{
    GtkRequisition req;
    GtkWidget *vbar, *hbar;
    printf ("WinScrollbarSize\n");

    vbar = gtk_vscrollbar_new(NULL);
    hbar = gtk_hscrollbar_new(NULL);
    

    gtk_widget_size_request(vbar, &req);
	*width  = req.width; /* Width of the vertical arrow */
    gtk_widget_size_request(hbar, &req);
	*height = req.height; /* Height of the horizontal bar */

    gtk_widget_destroy(vbar);
    gtk_widget_destroy(hbar);

    *oos = ios;
}

void WinMaxFixedWindowSize (int *mx, int *my)
{
    rprintf("WinMaxFixedWindowSize\n");
    *mx = gdk_screen_width();
    *my = gdk_screen_height();
}

void WinMaxScrollWindowSize (int *mx, int *my)
{
    rprintf("WinMaxScrollWindowSize\n");
    *mx = gdk_screen_width();
    *my = gdk_screen_height();
}