/****************************************************************************/
/* 横多段、多項目型メニュー						    */
/****************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include "defines.h"
#include "menu.h"
#include "aigtext.h"
#include "amacro.h"

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

int n_wmenu(x,y,sp,wsp,llt,n,all,colum,ms,msatr,mdata,colors,wget,rcode,limit,sel)
int *x,*y,sp,*wsp,*llt,n,all,*colum,msatr[],rcode[MRCODE],limit,sel[];
unchar *ms[],*(*wget);
_MENU_DATA *mdata;
MCOLORS *colors;
/*
	limit : 同時選択可能数。０なら全て(=all)

    リターン値
	何番の項目を選んでリターンしたか。０＝ＥＳＣ，＜０＝ＥＸＩＴ
	（wmenu()と同じ）
	sel[0]:
		セレクトした数（１〜ｌｉｍｉｔまたはａｌｌ）
		ＥＳＣでもＥＸＩＴでもそれまでにセレクトされていた数が入る
	sel[1〜] : 選択された項目の番号。
		[1]〜[sel[0]]に番号が入っている
*/
{
int nsel,i,c,cur,j,k,lx,ly,msc,mcx,mcy;
int *cmsatr;
_MENU_DATA mdata2;
	/* 初期設定 */
	cmsatr=(int *)newmalloc((all+1)*sizeof(int));
	if (cmsatr==NULL) return(-10003); /* get sub msatr[] */
	
	c=EX_COLOR(-1);
	cur=curmode(-1);
	if (!mdata->cursor) curoff(); /* カーソルoff mode */
	
	/* cursor save */
	cursor(&lx,&ly);
	
	if (mdata->mouse==1||mdata->mouse==2) { /* マウス初期化 */
		msc=ms_set(&mcx,&mcy,-1,-1,1);
	}
	
	if (limit>all || limit==0) limit=all; /* 最大数制限＆limit=0のときは最大数制限無し */
	
	/* mdataコピー（かなり変更されるから）*/
	mdata2=*mdata;
	
	/* msatr[]のコピー */
	nsel=0;
	if (mdata2.md_spcol){ /* 特殊色がすでに有効な時 */
		for(i=1;i<=all;i++) {
			cmsatr[i]=msatr[i];
			/* msatr[]のBIT10=1のものはなら選択済みと見なす */
			if (msatr[i]&BIT10) nsel++;
		}
	} else { /* msatrがないとき */
		for(i=1;i<=all;i++) cmsatr[i]=0;
	}
	
	if (mdata2.n_ret==-1) mdata2.n_ret=all;	/* リターン番号 */
	mdata2.popdown=0;  /* popdown cut */
	mdata2.md_spcol=1; /* ここでは特殊色使用 */
	
	if (mdata2.n_init && sel[0]>0) { /* sel[] set !! */
		nsel=0;
		for (i=1;i<=all;i++) cmsatr[i]&=(~BIT10); /* BIT10解除 */
		for (i=1;i<=sel[0];i++) {
			cmsatr[sel[i]]|=BIT10;
			nsel++;
		}
	}
	if (nsel>limit) { /* 既に同時選択可能最大数を越えている */
		i=-10005;
		goto NWEND;
	}
	
	if (mdata2.mouse==1) mdata2.mouse=2;
	while (1) { /* セレクト */
		i=wmenu(x,y,sp,wsp,llt,n,all,colum,ms,cmsatr,&mdata2,colors,wget,rcode);
		if (i<-10000) goto NWEND; /* error in wmenu() */
		if (i<=0||i>=10000) break; /* ESC / EXIT / Top,Last EXIT */
		
		if (mdata2.n_ret!=0) {
			if (mdata2.n_ret==-2) {
				if (cmsatr[i]&BIT11) break; /* 指定番号リターン */
			} else {
				if (i>=mdata2.n_ret) break; /* return menu */
			}
		}
		
		if (cmsatr[i]&BIT10) { /* すでに選択されているところを再選択した時 */
			switch (mdata2.re_select) {
				case 1: /* ベル -> non select */
					beep();
				case 0: /* 無視 */
					goto NEXT_SEL;
				case 2: /* 取り消し */
					cmsatr[i]&=~(BIT10);
					nsel--;
					goto NEXT_SEL;
			}
		}
		/* '選択されました'の登録 */
		if (nsel==limit) { /* 選択項目数が最大数になっている */
			if (mdata2.limit_over) break; /* リターン */
			/* ベル２回＆登録しない */
			bell(2);
		} else { /* まだ大丈夫！ */
			cmsatr[i]|=BIT10;
			nsel++;
		}
	    NEXT_SEL:
		/* 次の選択のために・・・ */
		sp=rcode[4];
		mdata2.remake=1; /* non remake menu */
		if (mdata2.mouse) mdata2.mouse=3;
	}
	
	/* リターン処理 */
	/* popdown : もしpopdownの指定がある時は最後に行う */
	if (mdata->popdown) { /* menu close */
		if (!(mdata->popdown==1 && i!=0)) {
			/* ESC onlyのときにESCでなかった場合を除く */
			popdown3s(*x,*y,rcode[1],rcode[2],colors->waku,mdata->pwait,mdata2.udmode);
			/* under window put */
			puttext(*x,*y,*wget);
		}
	}
	
	/* 選択されているところの番号を取り出す */
	sel[0]=nsel; /* 選択されている数 */
	for (j=1,k=1;k<=all;k++) {
		if (cmsatr[k]&BIT10) sel[j++]=k;
	}
	
    NWEND:;
	free(cmsatr);
	if (mdata->mouse==1) ms_reset(msc,mcx,mcy); /* マウス後処理 */
	EX_COLOR(c);
	B_LOCATE(lx,ly);
	curmode(cur);
	return(i);
}

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