/****************************************************************************/
/*
	メニュー幅計算ルーチン
*/
/****************************************************************************/

#include <stdio.h>
#include "defines.h"
#include "aig.h"
#include "menu.h"

/****************************************************************************/

static int waku_lines(struct MENU_DATA *mdata,int bline)
{
int y=2; /* 2=上下枠分 */
	if (mdata->cwaku==0) { /* 枠は無いけれど */
		y=0;
		if (mdata->title[0]!=0) y++; /* 上枠分 */
		if (mdata->tale[0] !=0) y++; /* 下枠分 */
	}
	y+=(mdata->aline+bline); /* 上下空行 */
	return(y);
}

/****************************************************************************/

int wmenu_width(x,y,n,all,clm,ms,mdata,code)
int 	x,y;			/* メニュー左上座標 */
int 	n,all;			/* 項目数 */
int	clm;			/* 項目横段数 */
unchar 	*ms[];			/* 項目 */
struct 	MENU_DATA *mdata;	/* メニューデータ */
int	code[];			/* メニュー状態情報 */
{
int xx,yy,c,wd,mlen,nlen,all1,ex,ey,bline;

	if (all>10000) all=10000; /* 項目数は10000まで：こんなに設定できないだろうけど */
	if (clm<1) clm=1; /* 横段数補正 */
	
	/* 移動可能範囲修正 -> endx,endy：移動可能範囲内にメニュー枠が収まる */
	xx=TWIDTH(&yy);
	if (mdata->endx==0||mdata->endx>=xx  ) mdata->endx=xx-1;
	if (mdata->endy==0||mdata->endy>=yy-2) mdata->endy=yy-2;
	
    RECALC:
	bline=mdata->bline; /* 再計算時に最初のblineを使うため */
	
	/* スクロールシンボル表示のための補正 -> bline */
	/* スクロールシンボル表示には上下枠を除き最低３ライン必要だから */
	if (n+mdata->aline+bline<3) bline=3-n-mdata->aline;
	
	
	/* メニューとして使える縦幅算出 */
	/* (1) 枠、上下空行を含めた使用可能行数 */
	c=mdata->endy-mdata->starty+1;
	if (mdata->wy>0) { /* 縦幅固定モードの時 */
		if (mdata->wy>c) mdata->wy=c; /* 縦枠が広過ぎるので修正 */
		c=mdata->wy; /* wyがメニューとして使える縦幅になる */
	}
	/* (2) 項目のみの使用可能行数 = yy */
	yy=c-waku_lines(mdata,bline); /* -上下空行-枠 */
	if (n>yy) n=yy;	/* 縦幅により表示項目数制限 */
	
	
	/* 項目数制限処理 */
	/* (1) 番号モードによる項目数制限 */
	c=mdata->num0;
	switch (mdata->num) {
		case 1: /* A-Z */
			if (all>26) all=26;
			break;
		case 2: /* (0)1-9,A-Z */
			if (all>35+c) all=35+c;
			break;
		case 3: /* (0)1-99 */
			if (all>99+c) all=99+c;
			break;
		case 4: /* (0)1-999 */
			if (all>999+c) all=999+c;
			break;
		case 5: /* (00)01-FF */
			if (all>0xff+c) all=0xff+c;
			break;
	}
	if (n>all) n=all;
	if (clm>all) clm=all;
	
	/* (2) 横段数によって表示項目数制限 */
	all1=(all+(clm-1))/clm; /* １行当たりの項目数：clmに満たない行も１行と数える */
	
	
	/* メニュー縦幅 再計算＆設定 */
	yy=waku_lines(mdata,bline); /* 上下空行＋枠 */
	
	if (mdata->wy<=0) { /* 固定枠幅でない時 */
		if (n>all1) n=all1; /* clmの指定が優先される */
		yy+=n;
	} else { /* 固定縦枠幅モード */
		/* 画面上１桁の表示行数がそれに満たない時 */
		/* 画面上１桁の表示行数がそれより多い時 */
		/* どちらも同じ処理 */
		n=mdata->wy-yy; /* 足りない行数を全てnに入れてしまう */
		if (n>all1) {
			bline+=(n-all1);
			n=all1;
		}
		yy=mdata->wy;
	}
	
	
	/* メニュー横幅設定 */
	
	/* 必要桁数の算出：メニュー幅の内、項目を除いた部分の長さの合計 */
	wd=mdata->lcol+mdata->rcol+mdata->wcol*(clm-1); /* 左右空き桁＋段間スペース */
	if (mdata->cwaku!=0) wd+=2; /* ＋枠 */
	
	/* 番号+":" */
	/*if (mdata->direct) mdata->num=1;*//* ﾀﾞｲﾚｸﾄｷｰｾﾚｸﾄがある時はそれを表示するから */
	nlen=klen2(mdata->sep);
	c=mdata->num;
	if (c!=0) {
		nlen++; /* +1=番号最低桁数 */
		if (c>=3) nlen++; /* ２桁 */
		if (c==4) nlen++; /* ３桁 */
		wd+=(nlen*clm); /* これを段数分必要桁数に加える */
	}
	
	/* mlenは１項目当たりの長さ（１行ではない）*/
	if (mdata->md_wxcut) { /* 固定枠幅 cut mode */
		if (mdata->wx>0) { /* 横幅指定有 */
			xx=mdata->wx;	  /* メニュー全体幅 */
			mlen=(xx-wd)/clm; /* １項目あたりの幅 */
		} else mdata->md_wxcut=0; /* wx=0ならモード解除 */
	}
	/* elseはだめ。なぜなら固定枠幅modeの中でmode解除されることがあるから */
	if (!mdata->md_wxcut) { /* 固定枠幅 強制cut modeでない */
		mlen=maxlen2(ms,all,1); /* 項目のうち見た目で一番長いもの */
		
		/* メニュー全体幅計算 */
		xx=mlen*clm+wd;
		
		/* タイトル、テイル長さでメニュー幅修正 */
		c=klen2(mdata->title);
		if (c<strlen(mdata->tale)) c=strlen(mdata->tale);
		if (c+2>xx) { /* +2=枠両端 */
			xx=c+2;
			mlen=(xx-wd)/clm; /* 必ず１番長い項目より長くなる */
		}
		
		if (mdata->wx>xx) { /* 固定枠幅モード */
			xx=mdata->wx;
			mlen=(xx-wd)/clm; /* 必ず１番長い項目より長くなる */
		}
	}
	
	
	/* window area 補正 */
	if (x+xx-1>mdata->endx) {
		x=mdata->endx-xx-1;
		if (x<mdata->startx) {
			if (clm>1) { /* 項目横段数を減らして再計算 */
				clm--;
				goto RECALC;
			}
			return(-1); /* error */
		}
	}
	if (y+yy-1>mdata->endy) {
		y=mdata->endy-yy-1;
		if (y<mdata->starty) {
			if (clm>1) { /* 項目横段数を減らして再計算 */
				clm--;
				goto RECALC;
			}
			return(-2); /* error */
		}
	}
	if (x<mdata->startx) x=mdata->startx;
	if (y<mdata->starty) y=mdata->starty;
	
	ex=x+xx-1; /* メニュー終点ｘ座標 */
	ey=y+yy-1; /* メニュー終点ｙ座標 */
	
	/* 情報 store */
	code[ 0]=x;
	code[ 1]=y;
	code[ 2]=xx;
	code[ 3]=yy;
	code[ 4]=ex;
	code[ 5]=ey;
	
	y+=(mdata->aline+1);	/* 上枠＋上空行 */
	ey-=(bline+1);		/* 下枠＋下空行 */
	if (mdata->cwaku==0) { /* 枠は無いけれど */
		if (mdata->title[0]==0) y--;	/* タイトルもなし */
		if (mdata->tale[0] ==0) ey++;	/* テイルなし */
	}
	code[ 7]=y;	/* active window area sy */
	code[ 9]=ey;	/* active window area ey */
	
	code[ 6]= x+mdata->lcol+(mdata->cwaku>0); /* active window area sx */
	code[ 8]=ex-mdata->rcol-(mdata->cwaku>0); /* active window area ex */
	
	code[10]=n;
	code[11]=all;
	code[12]=clm;
	code[13]=all1;
	code[14]=nlen;
	mdata->bline=bline;
	return(mlen);
}

/****************************************************************************/
