/* ｗｍｅｎｕでマウスの座標から何がセレクトされているかを調べる */

#include <iocslib.h>
#include "defines.h"
#include "menu.h"

int menu_mouse(btn,sp,wsp,sx,sy,ex,ey,lt,all,mnlen,clm,fup,fdown,md,rcode)
int btn,*sp,*wsp,sx,sy,ex,ey,lt,all,mnlen,clm,fup,fdown,rcode[2];
_MENU_DATA *md;
{
int x,y,x1,y1,i,lb,rb;
	/* ボタン状態 */
	rb=btn&0xffff;
	lb=btn>>16;
	
	/* 右ボタン */
	if (rb==-1) { /* 押されっぱなし */
		/* なおかつ、左は押されていないか押されっぱなし：無効 */
		if (lb!=1) return(0);
		/* 左が押された */
		rb=0; /* 右無効 */
	}
	if (rb==1) return(ESC); /* 押された */
	if ((md->mouse&BIT7) && !lb) return(0); /* 左ボタンが押されていなければ以後無効 */
	
	/* マウス座標取得 -> テキスト座標化 */
	x=MS_CURGT();
	y=(x&0xffff)/16;
	x>>=(16+3); /* >>16/8 */
	
	/* 項目選択有効座標範囲判定 */
	x1=sx+1+md->lcol;
	y1=sy+1+md->aline;
	
	if (x<x1 || x>(ex-1-md->rcol) || y<y1 || y>(ey-1-md->bline)) {
		/* 項目選択有効範囲ではない */
		rcode[0]=rcode[1]=-1;
		if (!lb) return(0); /* 左ボタンが押されてなかったら無効 */
		
		/* 特殊動作選択かどうかの判定 */
		/* 上下スクロールでは押されっぱなしもＯＫ */
		if (x==ex) {
			if (fup   && y==sy+1) return(-2); /* 上スクロール */
			if (fdown && y==ey-1) return(-3); /* 下スクロール */
		}
		if (x>=sx+1 && x<=ex-1) {
			if (y==sy && lb==1) return(-CheckMESXY()); /* 移動 */
			if (fup && md->aline>0) {
				if (y>=sy+1 && y<=sy+md->aline) return(-2);
				/* 上スクロール */
			}
			if (fdown && md->bline>0) {
				if (y>=ey-md->bline && y<=ey-1) return(-3);
				/* 下スクロール */
			}
		}
		return(0); /* 無効 */
	}
	
	/* 相対座標化 */
	x-=x1;
	y-=y1;
	
	/* 位置決定 */
	x1=0;
	y1=rcode[0]&0xffff;
	for (i=0;i<clm;i++) { /* 左から右に順に調べる */
		if ((lt+y+1-1)*clm+i+1>all) break; /* ここには項目はない */
		if (x>=x1 && x<x1+mnlen) { /* この範囲内にあった */
			if (i!=*wsp || *sp!=y+1) { /* ポイントが動いた時のみ */
				/* キーによりポイントが移動したがマウスは動いていない時無効 */
				if (x1==y1 && y==rcode[1]) return(0); /* 無効 */
				*wsp=i;
				*sp=y+1;
				rcode[0]=(x<<16)|x1;
				rcode[1]=y;
				return(2); /* 2 = point move in active window */
			}
			/* ポイントは動いていない */
			rcode[0]=(x<<16)|x1;
			rcode[1]=y;
			/* 左ボタンが押されている：リターン */
			/* 左ボタンは押されていないか押されっぱなし：無効 */
			return(lb==1? CR:0);
		}
		x1+=(mnlen+md->wcol); /* 次の項目へ */
	}
	/* 項目上にない */
	rcode[0]=rcode[1]=-1;
	return(0); /* 無効 */
}
