/***   [window.c]
*
*	ウィンドウ関連 描画		(C)ささがわ
*
*	For GNU C Compiler (GCC)   Version 1.39
*
***/

#include <string.h>
#include "graph.h"
#include "mos.h"
#include "window.h"
#include "icn.h"
#include "others.h"

extern int	PAL_Black;
extern int	PAL_Button;

/* ｳｨﾝﾄﾞｳ描画関数 */
#define X1	(ow->x1)
#define Y1	(ow->y1)
#define X2	(ow->x2)
#define Y2	(ow->y2)
void drawWindow(struct opnwin_t *ow) {
	int		i, ii, r, l;
	
	if (ow->shdw) {		/* 影の描画 */
		EGB_boxf(X2 + 1, Y1 + 5, X2 + 5, Y2 + 5, PAL_Black, PAL_Black);
		EGB_boxf(X1 + 5, Y2 + 1, X2 + 5, Y2 + 5, PAL_Black, PAL_Black);
	}
	
	EGB_boxf(X1, Y1, X1 + 4, Y2, 4, 4);		/* 枠の描画 */
	EGB_boxf(X2 - 4, Y1, X2, Y2, 4, 4);
	EGB_boxf(X1, Y1, X2, Y1 + 4, 4, 4);
	EGB_boxf(X1, Y2 - 4, X2, Y2, 4, 4);
	
	if (ow->canb) {		/* ｷｬﾝｾﾙ･ﾎﾞﾀﾝの描画 */
		l = X1 + 26;
		EGB_boxf(X1 + 5, Y1 + 5, X1 + 26, Y1 + 26, PAL_Black, PAL_Button);
		EGB_line(X1 + 5, Y1 + 5, X1 + 26, Y1 + 26, PAL_Black);
		EGB_line(X1 + 26, Y1 + 5, X1 + 5, Y1 + 26, PAL_Black);
	} else {
		l = X1 + 5;
	}
	for (r = X2 - 5, i = 0; i < ow->nopt; i++) {	/* ｵﾌﾟｼｮﾝの描画 */
		ii = 8 * ow->wopt[i] + 5;
		EGB_boxf(r - ii, Y1 + 5, r, Y1 + 26, PAL_Black, PAL_Button);
		r -= ii;
	}
	EGB_boxf(l, Y1 + 5, r, Y1 + 26, PAL_Black, 13);		/* ﾀｲﾄﾙ背景 */
	
	if (ow->ord) {		/* ｽｸﾛｰﾙ･ﾊﾞ-と背景の描画 */
		EGB_boxf(X1 + 5, Y1 + 26, X2 - 21, Y2 - 21, PAL_Black, 7);
		DrawScrollbar(0, X2 - 21, Y1 + 26, Y2 - Y1 - 46);
		DrawScrollbar(1, X1 + 5, Y2 - 21, X2 - X1 - 25);
		EGB_box(X2 - 21, Y2 - 21, X2 - 5, Y2 - 5, PAL_Black);
	} else {
		EGB_boxf(X1 + 5, Y1 + 26, X2 - 5, Y2 - 5, PAL_Black, 7);
	}
	
	if (ow->expb)	/* 伸縮ﾎﾞﾀﾝ */
		EGB_boxf(X2 - 20, Y2 - 20, X2 - 6, Y2 - 6, PAL_Button, PAL_Button);
	else
		EGB_boxf(X2 - 20, Y2 - 20, X2 - 6, Y2 - 6, 7, 7);
	
	ii = ((r - l + 1) - 8 * strlen(ow->title)) / 2 + l;		/* ﾀｲﾄﾙ描画 */
	for (i = 0; i < 2; i++)
		EGB_str2(ow->title, i + ii, Y1 + 23, PAL_Black);
}
#undef	X1
#undef	Y1
#undef	X2
#undef	Y2

void DrawScrollbar(int horv, int x, int y, int len) {
	switch (horv) {
		case 0:
			EGB_boxf(x, y + 16, x + 16, y + len - 17, PAL_Black, 6);
			DrawButton(1, x, y, x + 16, y + 16);
			ICN_ya(0, x + 2, y + 2);
			DrawButton(1, x, y + len - 17, x + 16, y + len - 1);
			ICN_ya(1, x + 2, y + len - 15);
			break;
		
		case 1:
			EGB_boxf(x + 16, y, x + len - 17, y + 16, PAL_Black, 6);
			DrawButton(1, x, y, x + 16, y + 16);
			ICN_ya(2, x + 2, y + 2);
			DrawButton(1, x + len - 17, y, x + len - 1, y + 16);
			ICN_ya(3, x + len - 15, y + 2);
			break;
	}
}

void DrawButton(int fl, int x1, int y1, int x2, int y2) {
	if (fl) {
		EGB_box(x1, y1, x2, y2, PAL_Black);
	} else {
		x1--;
		y1--;
		x2++;
		y2++;
	}
	EGB_line(x1 + 1, y1 + 1, x2 - 1, y1 + 1, 7);
	EGB_line(x2 - 1, y1 + 1 + 1, x2 - 1, y2 - 1, 8);
	EGB_line(x1 + 1, y2 - 1, x2 - 1, y2 - 1, 8);
	EGB_line(x1 + 1, y1 + 1, x1 + 1, y2 - 1 - 1, 7);
	EGB_boxf(x1 + 2, y1 + 2, x2 - 2, y2 - 2, PAL_Button, PAL_Button);
}

int Button(int x1, int y1, int x2, int y2) {
	int		a, mx, my, flag = 0;
	char	mb;
	
	do {
		MOS_rdpos(&mb, &mx, &my);
		a = x1 <= mx && mx <= x2 && y1 <= my && my <= y2;
		if (a && !flag || !a && flag) {
			EGB_rev(1, x1, y1, x2, y2);
			flag = !flag;
		}
	} while (mb & 1);
	
	return flag;
}

int dragWindow(int x, int y, struct RECT *w, struct RECT *s, int wx, int wy) {
	int		mx, my, px, py;
	char	mb;
	struct RECT	p;
	
	ICN_mos(3);
	EGB_writeMode(EGB_work, 4);
	MOS_horizon(s->x1 + (x - w->x1), s->x2 - (w->x2 - x));
	MOS_vertical(s->y1 + (y - w->y1), s->y2 - (w->y2 - y));
	MOS_disp(0);
	EGB_box(w->x1, w->y1, w->x2, w->y2, 15);
	MOS_disp(1);
	
	p = *w;	px = mx = x;	py = my = y;
	do {
		if (px == mx && py == my)
			continue;
		
		MOS_disp(0);
		EGB_box(p.x1, p.y1, p.x2, p.y2, 15);
		p.x1 = mx - (x - w->x1);	p.y1 = my - (y - w->y1);
		p.x2 = mx + (w->x2 - x);	p.y2 = my + (w->y2 - y);
		EGB_box(p.x1, p.y1, p.x2, p.y2, 15);
		MOS_disp(1);
		px = mx;	py = my;
	} while (MOS_rdpos(&mb, &mx, &my), mb & 1);
	
	MOS_disp(0);
	EGB_box(p.x1, p.y1, p.x2, p.y2, 15);
	MOS_disp(1);
	EGB_writeMode(EGB_work, 0);
	MOS_horizon(wx, wx + 639);
	MOS_vertical(wy, wy + 479);
	ICN_mos(0);
	
	if (p.x1 != w->x1 || p.y1 != w->y1) {
		*w = p;
		return 1;
	} else
		return 0;
}

void Xpage(int enter, int wx, int wy) {
	int		mx, my;
	char	mb;
	
	MOS_disp(0);
	switch (enter) {
		case 0:		/* ﾍﾟｰｼﾞ 0 を前へ */
			EGB_actPage(0);
			EGB_cls(0);
			EGB_Hscrl(0, 0);
			EGB_displayPage(EGB_work, 0, 3);
			MOS_rdpos(&mb, &mx, &my);
			MOS_writePage(0);
			MOS_horizon(0, 639);
			MOS_vertical(0, 479);
			MOS_setpos(mx - wx, my - wy);
			break;
		default:	/* ﾍﾟｰｼﾞ 1 を前へ */
			MOS_rdpos(&mb, &mx, &my);
			MOS_writePage(1);
			MOS_horizon(wx, wx + 639);
			MOS_vertical(wy, wy + 479);
			MOS_setpos(mx + wx, my + wy);
			EGB_actPage(0);
			EGB_cls(0);
			EGB_displayPage(EGB_work, 1, 3);
			EGB_actPage(1);
			break;
	}
	MOS_disp(1);
}

void afterImage(struct RECT *s, struct RECT *e) {
	int		i;
	struct RECT	p;
	
	MOS_disp(0);
	EGB_writeMode(EGB_work, 4);
	EGB_box(s->x1, s->y1, s->x2, s->y2, 15);
	p = *s;
	for (TIMER_set(1); !TIMER(); );
	for (i = 1; i <= 10; i++) {
		EGB_box(p.x1, p.y1, p.x2, p.y2, 15);
		p.x1 = s->x1 - (s->x1 - e->x1) * i / 10;
		p.y1 = s->y1 - (s->y1 - e->y1) * i / 10;
		p.x2 = s->x2 - (s->x2 - e->x2) * i / 10;
		p.y2 = s->y2 - (s->y2 - e->y2) * i / 10;
		EGB_box(p.x1, p.y1, p.x2, p.y2, 15);
		for (TIMER_set(1); !TIMER(); );
	}
	EGB_writeMode(EGB_work, 0);
	MOS_disp(1);
}

void SCRB_bar(struct sb_t *t, int bar, int *pu) {
	struct sb_t	sb;
	
	sb = *t;
	sb.tl--;	sb.lpp--;
	sb.blen--;	sb.bml--;
	
	if (sb.lpp >= sb.tl) {
		*pu = 0;
		
		return;
	}
	
	if (sb.lpp * sb.blen / sb.tl < sb.bml)
		*pu = (int)((long)(bar - sb.bml / 2) * (sb.tl - sb.lpp) / (sb.blen - sb.bml));
	else
		*pu = (int)((long)bar * sb.tl / sb.blen - sb.lpp / 2);
	
	if (*pu < 0)
		*pu = 0;
	else if (*pu > sb.tl - sb.lpp)
		*pu = sb.tl - sb.lpp;
	
	return;
}

void SCRB_page(struct sb_t *t, int pu, int *bu, int *bl) {
	struct sb_t	sb;
	
	sb = *t;
	sb.tl--;	sb.lpp--;
	sb.blen--;	sb.bml--;
	
	if (sb.lpp >= sb.tl) {
		*bu = 0;	*bl = sb.blen;
		
		return;
	}
	
	if (pu > sb.tl - sb.lpp)
		pu = sb.tl - sb.lpp;
	
	if (sb.lpp * sb.blen / sb.tl < sb.bml) {
		*bu = (int)((long)pu * (sb.blen - sb.bml) / (sb.tl - sb.lpp));
		*bl = *bu + sb.bml;
	} else {
		*bu = (int)((long)pu * sb.blen / sb.tl);
		*bl = (int)((long)(pu + sb.lpp) * sb.blen / sb.tl);
	}
}

