/*
        new file select
                      1993.6.27 v1.0
                      copyright Y.Ouchi
*/
#include	<stdio.h>
#include	<string.h>
#include	<stdlib.h>
#include	<sys/extender.h>
#include	"egb.h"
#include	"mos.h"
#include	"bb.h"

	/* ֐vg^Cv錾 */
extern	char	egbwork[];
extern	char	moswork[];
extern	void	linedsp(int, int, char *);
extern	void	linedspv(int, int, char *, int, unsigned int, unsigned int);
extern	void	linedspvl(int,int,char *,int,int,unsigned int,unsigned int);
extern	void	box(int, int, int, int, int, int);
extern	void	line(int, int, int, int, int);
extern	int		panelread(int, struct panel *, int);
extern	void	panelinit(int, struct panel *, char **, int );
extern	int		crfindb(int, char *, int *, int *);
extern	int		crfindl(int, char *, int *, int *);
		void	init_disp(void);
		int		fileheaddsp(char *);
		void	fileheadclr(void);

	char	*drivename[16]={"`","a","c","d","e","f","g","h",
							"i","j","k","l","m","n","o","p"};
	char	driveflag[16]={0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
							0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01};
	struct	panel	n_menu[2];
	char	files[256][15];
	static	int		fdisp;
	static	int		fdispx=0,fdispy=400;
	static	int		px=120,py=50;

char * filesel ( void )
{
static	char	filename[128]={"p:/src/readme.doc"};
		char	flag,fflag,subdir;
		int		i,j,disp_start_no;
		int		atrib,res,file_no,menu_res,cdriveno;
		char	*work_char_ad;
		char	motherdir[8]={".."};
		char	wild[8]={"*.*"};
		char	dirchange[]={".. upper dir"};
		char	cdir[128];
		char	cdrive[4]={"X:"};
		char	path[128];
		char	enqfile[128];
		char	workfile[128];
		char	buf[128];
struct	_disk_space	ds;

					/* initial display */
	init_disp( );
	fileheadclr();

	EGB_writePage(egbwork,0);
	EGB_color(egbwork, 0, TEXT_COL);

					/* current drive & current path get */
	cdriveno=_dos_get_default_disk_number();
	cdrive[0]=0x41+cdriveno;
	getcwd(cdir,128);
	flag=1;
	do{
		box(px+16,py+16,px+53,py+53,BOTAN_COL,1);
		box(px+66,py+36,px+173,py+53,BOTAN_COL,1);
		EGB_color(egbwork, 0, NAME_COL);
		EGB_fontStyle(egbwork, 1);
		if (cdriveno>1) linedsp(px+28,py+42,drivename[cdriveno-1]);
		else linedsp(px+28,py+42,drivename[cdriveno]);
		EGB_fontStyle(egbwork, 0);
		if (strlen(cdir)>1){
			for(i=strlen(cdir)-1;i>=0;i--) if(cdir[i]==0x2f) break;
			linedsp(px+67,py+52,&cdir[i+1]);
			subdir=1;
			files[0][0]=0x00;
			strcpy(files[0],dirchange);
		}
		else{
			linedsp(px+67,py+52,cdir);
			subdir=0;
		}
		EGB_color(egbwork, 0, TEXT_COL);

		path[0]=0x00;
		strcat(path,cdrive);
		strcat(path,cdir);
		i=strlen(path);
		if (path[i-1]!=0x2f){
			path[i]=0x2f;
			path[i+1]=0x00;
		}
		for ( i=0;i<strlen(path);i++) if (path[i]==0x2f) path[i]=0x5c;
		enqfile[0]=0x00;
		strcpy(enqfile,path);
		strcat(enqfile,wild);

					/* file names get */
		_dos_set_disk_transfer_area_address(buf);
		if (subdir==0) file_no=0;
		else file_no=1;
		atrib=22;
		res=_dos_find_first(enqfile,atrib);
		while (res==0){
			work_char_ad=buf+30;
			if (work_char_ad[0]!=0x2e){
				workfile[0]=0x00;
				strcat(workfile,path);
				strcat(workfile,work_char_ad);
				if ((_get_file_mode(workfile) & 0x4000)==0x4000){
					files[file_no][0]=0x20;
					files[file_no][1]=0x00;
					strcat(files[file_no],work_char_ad);
					i=strlen(files[file_no]);
					files[file_no][i]=0x3e;
					files[file_no][i+1]=0x00;
				}
				else{
					files[file_no][0]=0x00;
					strcat(files[file_no],work_char_ad);
				}
				file_no++;
			}
			res=_dos_find_next( )  ;
		}

		if (subdir==0){
			work_char_ad=files[0];
			i=file_no;
		}
		else{
			work_char_ad=files[1];
			i=file_no-1;
		}
		qsort(work_char_ad,i,15,(int *)strcmp);

		for (i=0;i<file_no;i++) if (files[i][0]==0x20) files[i][0]=0x3c;

		disp_start_no=0;
		fflag=1;
		while ( fflag ){
			box(px+15,py+125,px+174,py+324,BACK_COL,1);
			EGB_color(egbwork, 0, TEXT_COL);
			for ( j=0;j<10;j++ ){
				if (disp_start_no+j>=file_no) break;
				linedspv(px+47,py+142+j*20,files[disp_start_no+j],
											0,TEXT_COL,BACK_COL);
			}
			while ( (menu_res = panelread (2, n_menu, 1)) >= 2000 );
			if ( menu_res<100 ){
				if (menu_res==0 || menu_res==1){
					cdriveno=menu_res;
					cdrive[0]=0x41+menu_res;
					_dos_select_disk(menu_res);
					getcwd(cdir,128);
					fflag=0;
				}
				else{


					ds=_dos_get_disk_space(menu_res+2);
					if (ds.nsectors!=0xffff){
						cdriveno=menu_res+1;
						cdrive[0]=0x42+menu_res;
						_dos_select_disk(menu_res+1);
						getcwd(cdir,128);
						fflag=0;
					}
/*****************************************************
					if (driveflag[menu_res]==0x01){
						cdriveno=menu_res+1;
						cdrive[0]=0x42+menu_res;
						_dos_select_disk(menu_res+1);
						getcwd(cdir,128);
						fflag=0;
					}
*****************************************************/


				}
				fileheadclr();
			}
			else{
				if (menu_res==100){
					if (disp_start_no+10<file_no){
						disp_start_no=disp_start_no+10;
					}
				}
				else{
					if ( menu_res==1100 ){
						if (disp_start_no-10>=0){
							disp_start_no=disp_start_no-10;
						}
					}
					else{
						if ( menu_res<1000 ){
							j=disp_start_no+menu_res-101;
							if(j==0 && subdir==1){
								enqfile[0]=0x00;
								strcpy(enqfile,path);
								strcat(enqfile,motherdir);
								chdir(enqfile);
								getcwd(cdir,128);
								fflag=0;
								fileheadclr();
							}
							else{
								if (j<file_no){
									if (files[j][0]==0x3c 
											&& files[j][strlen(files[j])-1]
											==0x3e){
										enqfile[0]=0x00;
										strcpy(enqfile,path);
										strcat(enqfile,&files[j][1]);
										enqfile[strlen(enqfile)-1]=0x00;
										chdir(enqfile);
										getcwd(cdir,128);
										fflag=0;
										fileheadclr();
									}
									else{
										if(j==fdisp){
											filename[0]=0x00;
											strcat(filename,path);
											strcat(filename,files[j]);
											fflag=0;
											flag=0;
										}
										else{
											if(fileheaddsp(files[j])!=0)
																	fdisp=j;
										}
									}
								}
							}
						}
						else{
							filename[0]=0x00;
							fflag=0;
							flag=0;
						}
					}
				}
			}
		}
	}while ( flag );

	MOS_disp( 0 );
	MOS_horizon( 0,639 );
	MOS_vertical( 0,479 );
	EGB_clearScreen(egbwork);
	EGB_color(egbwork, 0, TEXT_COL);
	EGB_color(egbwork, 1, BACK_COL);

	return(filename);

}

/*
		initial panel display
*/

void	init_disp( )
{
	char	pagechar[21]={" page up/down "};
	int		i;
	struct	_disk_space	ds;

	EGB_writePage(egbwork,0);
	box(px,py,px+189,py+339,FILES_BACK_COL,1);

	box(px+15,py+15,px+54,py+54,BOTAN_COL,1);
	box(px+65,py+35,px+174,py+54,BOTAN_COL,1);
	line(px+15,py+15,px+54,py+15,SHADOW);
	line(px+15,py+15,px+15,py+54,SHADOW);
	line(px+15,py+54,px+54,py+54,HILIGHT);
	line(px+54,py+15,px+54,py+54,HILIGHT);

	line(px+65,py+35,px+174,py+35,SHADOW);
	line(px+65,py+35,px+65,py+54,SHADOW);
	line(px+65,py+54,px+174,py+54,HILIGHT);
	line(px+174,py+35,px+174,py+54,HILIGHT);

	box(px+15,py+105,px+174,py+124,BOTAN_COL,1);
	box(px+15,py+125,px+174,py+274,BACK_COL,1);

	EGB_color(egbwork, 0, TEXT_COL);
	linedsp(px+23,py+122,pagechar);

/******************************** test
	for (i=4;i<17;i++){
		ds=_dos_get_disk_space(i);
		if (ds.nclusters>=0xffff){
			drivename[i-2][0]=0x81;
			drivename[i-2][1]=0x7c;
			driveflag[i-2]=0x00;
		}
		else{
			driveflag[i-2]=0x01;
		}
	}
********************************/

	n_menu[0].xpos=px+15;
	n_menu[0].ypos=py+65;
	n_menu[0].xsize=160;
	n_menu[0].ysize=40;
	n_menu[0].xbtnsize=20;
	n_menu[0].ybtnsize=20;
	n_menu[0].ful=1;
	n_menu[0].disp=1;
	n_menu[0].ini_digit=0;

	panelinit(1,n_menu,drivename,1);

	n_menu[1].xpos=px+15;
	n_menu[1].ypos=py+105;
	n_menu[1].xsize=160;
	n_menu[1].ysize=220;
	n_menu[1].xbtnsize=160;
	n_menu[1].ybtnsize=20;
	n_menu[1].ful=0;
	n_menu[1].disp=1;
	n_menu[1].ini_digit=100;

	MOS_horizon( px+15,px+174 );
	MOS_vertical( py+65,py+324 );
	MOS_setpos( px+50, py+135 );
	MOS_disp( 1 );
}

/*
		file head display
*/

int		fileheaddsp(char *fn)
{
	int		filesize;
	int		lineleng,nextp1,nextp2,nextp3;
	FILE	*inFp;
	char	txt[250];

	inFp=fopen(fn,"rb");
	if(inFp==NULL) return(0);
	filesize=fread(txt,1,240,inFp);
	fclose(inFp);
	if (filesize<=0) return(0);

	EGB_writePage(egbwork,0);
	box(fdispx,fdispy,fdispx+639,fdispy+51,BOTAN_COL,1);
	crfindl(filesize,txt,&lineleng,&nextp1);
	linedspvl(fdispx,fdispy+16,txt,lineleng,0,TEXT_COL,BOTAN_COL);
	if(nextp1>0){
		crfindl(filesize-lineleng,&txt[nextp1],&lineleng,&nextp2);
		linedspvl(fdispx,fdispy+33,&txt[nextp1],lineleng,
												0,TEXT_COL,BOTAN_COL);
		if(nextp2>0){
			crfindl(filesize-lineleng,&txt[nextp1+nextp2],&lineleng,&nextp3);
			linedspvl(fdispx,fdispy+50,&txt[nextp1+nextp2],lineleng,
													0,TEXT_COL,BOTAN_COL);
		}
		EGB_color(egbwork, 0, TEXT_COL);
		return(1);
	}
	else{
		EGB_color(egbwork, 0, TEXT_COL);
		return(0);
	}
}

/*
		file head display clear
*/

void	fileheadclr( )
{
	fdisp=-1;
	box(fdispx,fdispy,fdispx+639,fdispy+51,BACK_COL,1);
}

