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

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

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

static int t_lines(_MENU_DATA *mdata)
/* タイトル＋テイル＋上下空行数 */
{
int yy=0;
	if (mdata->title[0]!=0) {
		yy++;
		if (mdata->ti_mode&BIT1) yy++; /* 24dot mode */
	}
	if (mdata->tale[0]!=0) {
		yy++;
		if (mdata->ta_mode&BIT1) yy++; /* 24dot mode */
	}
	yy+=(mdata->aline+mdata->bline); /* +上下空行 */
	return(yy);
}

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

int tmenu_width(x,y,all,ms,mdata,code)
int 	x,y;		/* メニュー左上座標 */
int 	all;		/* 項目数 */
unchar 	*ms[];		/* 項目 */
_MENU_DATA *mdata;	/* メニューデータ */
int	code[];		/* メニュー状態情報 */
{
int xx,xxx,yy,c,wd,mlen,ex,ey,cc;
	
	/* 移動可能範囲修正 -> 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;
	
	if (all>=10) all=9; /* 項目数は9まで */
	
	/* メニューとして使える縦幅算出 */
	yy=mdata->endy-mdata->starty+1-t_lines(mdata); /* -（上下空行+タイトル+テイル幅）*/
	
	/* 縦幅により表示項目数制限 */
	if (all>yy) return(-3); /* 表示できない */
	
	/* メニュー縦幅設定 */
	yy=all; /* 項目数 */
	if (mdata->md_mes&BIT1) yy*=2; /* 24dot mode */
	yy+=(mdata->wy*(all-1)+t_lines(mdata)); /* 項目間空行+上下空行+タイトル+テイル幅 */
	
	/* window Y-area 補正 */
	if (y+yy-1>mdata->endy) {
		y=mdata->endy-yy-1;
		if (y<mdata->starty) return(-2); /* error */
	}
	if (y<mdata->starty) y=mdata->starty;
	ey=y+yy-1; /* メニュー終点ｙ座標 */
	
	/* メニュー縦幅ｙｙは２４ドットモード修正済み */
	
	
	/* メニュー横幅設定 */
	/* 番号+":" */
	wd=klen2(mdata->sep);
	if (mdata->num) wd++; /* 番号は必ず１桁 */
	
	/* mlenは１項目当たりの長さ */
	mlen=maxlen2(ms,all,1); /* 項目のうち見た目で一番長いもの */
	
	/* 項目から計算したメニュー全体幅計算 */
	xxx=xx=mlen+wd;
	if (mdata->md_mes&BIT1) xxx=(xxx*3)/2;
	wd=xxx; /* 実項目最大表示幅 */
	
	/* タイトル、テイル長さでメニュー幅修正 */
	c=klen2(mdata->title); if (mdata->ti_mode&BIT1) c=(c*3)/2;
	cc=klen2(mdata->tale); if (mdata->ta_mode&BIT1) cc=(cc*3)/2;
	if (c>xxx)  xxx=c;
	if (cc>xxx) xxx=cc;
	/* c  =実タイトル表示幅 */
	/* cc =実テイル表示幅	*/
	/* xxx=実全表示幅	*/
	if (xxx<mdata->wx) xxx=mdata->wx; /* xxx>0だからmdata->wx>0の時しかここに来ない */
	
	/* window X-area 補正 */
	if (x+xxx-1>mdata->endx) {
		x=mdata->endx-xxx-1;
		if (x<mdata->startx) return(-1); /* error */
	}
	if (x<mdata->startx) x=mdata->startx;
	ex=x+xxx-1; /* メニュー終点ｘ座標 */
	
	/* 情報 store */
	code[0]=x;
	code[1]=y;
	code[2]=ex;
	code[3]=ey;
	
	code[4]=xx;	/* 常に１６ドットモード数値 */
	code[5]=xxx;	/* 実表示Ｘ幅 */
	code[6]=yy;	/* 実表示Ｙ幅 */
	
	/* active area calc */
	code[7]=x; /* asx */
	if (mdata->md_mes&BIT0) code[7]+=((xxx-wd)/2); /* センタリング */
	code[8]=code[7]+wd-1; /* aex */
	
	y+=mdata->aline;
	if (mdata->title[0]!=0) {
		y++;
		if (mdata->ti_mode&BIT1) y++; /* 24dot mode */
	}
	code[9]=y; /* asy */
	
	if (mdata->tale[0]!=0) {
		ey--;
		if (mdata->ta_mode&BIT1) ey--; /* 24dot mode */
	}
	ey-=mdata->bline;
	code[10]=ey; /* aey */
	
	/* タイトル表示Ｘ座標 */
	code[11]=x;
	if (mdata->ti_mode&BIT0) code[11]=x+(xxx-c)/2; /* タイトルセンタリング */
	/* テイル表示Ｘ座標 */
	code[12]=x;
	if (mdata->ta_mode&BIT0) code[12]=x+(xxx-cc)/2; /* テイルセンタリング */
	
	code[13]=all;
	
	/* タイトル表示ｅｘ */
	code[14]=code[11]+c-1;
	
	return(mlen);
}

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