#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winb.h>
#include <te.h>
#include <fntb.h>
#include <gui.h>

#include <egb.h>
#include <guidbg.h>

#include "ysmacro.h"
#include "ysgui.h"
#include "ysmalloc.h"
#include "ysrename.h"


static char ext[16]="*.*";

extern int Ys11Id;
extern int pdSrcId;

int pdFileClearFunc()
{
	int yn,nf;

	FlNumFiles(&nf);
	if(nf!=0)
	{
		yn=YsYesNoQuestion
			(Ys11Id,"登録内容をクリアします.","やっちゃう","やめてくれ");
		if(yn!=YSYES)
		{
			return NOERR;
		}
		FlClear();
		LmClearListMenu();
		LmSetListMenu();
		LmCurrentDir();
	}

	return NOERR;
}


int	pdFileSingleFunc()
{
	int yn,er;
	char ful[80],*cur;

	FlGetCurrentDirPtr(&cur);

	yn=YSYES;
	while(yn==YSYES)
	{
		yn=YsFileSelect(Ys11Id,ful,cur,"1個ずつ追加","追加","戻る",ext);
		if(yn==YSYES)
		{
			if((er=FlInsertFile(ful))!=FL_NOERR)
			{
				goto INSERR;
			}
			LmClearListMenu();
			LmSetListMenu();
			LmSetScrollBarToTheEnd();
			LmCurrentDir();
		}
	}

	return NOERR ;

INSERR:
	PrintFlError(er,ful);
	LmClearListMenu();
	LmSetListMenu();
	LmCurrentDir();
	return NOERR;
}

int	pdFilePararelFunc()
{
	int yn,i,nf,er;
	char ful[80],*cur;

	FlGetCurrentDirPtr(&cur);

	yn=YsParaFileSelect(Ys11Id,cur,&nf,"まとめて追加","追加","戻る",ext);

	if(yn!=YSYES)
	{
		return YSTRUE;
	}

	for(i=0; i<nf; i++)
	{
		YsParaFileGetPathName(ful,i);
		if((er=FlInsertFile(ful))!=FL_NOERR)
		{
			goto INSERR;
		}
	}
	LmClearListMenu();
	LmSetListMenu();
	LmSetScrollBarToTheEnd();
	LmCurrentDir();
	return NOERR ;

INSERR:
	PrintFlError(er,ful);
	LmClearListMenu();
	LmSetListMenu();
	LmCurrentDir();
	return NOERR;
}

static int pdFileDeleteGetSwitches(int *sw,int nf);
static void pdFileDeleteExecFunc(int nf,char *(*lst),int *sw);

int	pdFileDeleteFunc()
{
	int n,nf;
	char *(*lst);
	int *sw;

	FlNumFiles(&nf);

	lst = (char *(*))MALLOCFUNC(sizeof(char *)*nf);
	sw = (int *)MALLOCFUNC(sizeof(int)*nf);
	if(lst==NULL || sw==NULL)
	{
		YsConfirm(Ys11Id,"メモリが足りなくて削除できません(;_;)",NULL);
		return NOERR;
	}

	FlGetFileList(lst);
	n=pdFileDeleteGetSwitches(sw,nf);
	if(n==0)
	{
		YsConfirm(Ys11Id,"まず削除するファイルを選んでください",NULL);
		return NOERR;
	}

	LmClearListMenu();
	pdFileDeleteExecFunc(nf,lst,sw);
	LmSetListMenu();
	LmCurrentDir();

	FREEFUNC(lst);
	FREEFUNC(sw);

	return NOERR ;
}

static int pdFileDeleteGetSwitches(int *sw,int nf)
{
	int i,n,row,clm;
	LISTITEML40 *itm;

	MMI_SendMessage(pdSrcId,MM_GETLMENUPTR,3,&itm,&row,&clm);
	n=0;
	for(i=0; i<nf; i++)
	{
		if(itm[i].selectFlag == TRUE)
		{
			sw[i]=YSON;
			n++;
		}
		else
		{
			sw[i]=YSOFF;
		}
	}
	return n;
}

static void pdFileDeleteExecFunc(int nf,char *(*lst),int *sw)
{
	int i;

	for(i=0; i<nf; i++)
	{
		if(sw[i]==YSON)
		{
			FlDelete(lst[i]);
		}
	}
}


int PrintFlError(int er,char *para)
{
	char *mes[3];

	switch(er)
	{
	default:
		mes[0]=NULL;
		mes[1]="謎のエラーです(^_^;)";
		mes[2]=NULL;
		break;
	case FL_NOERR:
		return YSTRUE;
	case FL_NOMEMORY:
		mes[0]="メモリ不足でこれ以上ファイルを追加";
		mes[1]="できません.                       ";
		mes[2]=NULL;
		break;
	case FL_SAME:
		mes[0]="同名のファイルを追加することはでき";
		mes[1]="ません.                           ";
		mes[2]=para;
		break;
	case FL_NOTSAMEDIR:
		mes[0]="異なるディレクトリのファイルを追加";
		mes[1]="することはできません.             ";
		mes[2]=para;
		break;
	case FL_TOOMANY:
		mes[0]="追加ファイル数が多すぎます.       ";
		mes[1]="アルファベット A→Z で表現しきれま";
		mes[2]="せん.                             ";
		break;
	}
	YsConfirm3(Ys11Id,mes,NULL);
	return YSTRUE;
}


static int dspFlag=YSOFF;

extern int extDlg;
extern int extInputId;

int pdFileSetExtFunc()
{
	HYPER bas,eid;
	int dx,dy;

	if(dspFlag==YSON)
	{
		return YSTRUE;
	}

	MMI_SendMessage(Ys11Id,MM_GETHYPER,1,&bas);
	MMI_SendMessage(extDlg,MM_GETHYPER,1,&eid);
	dx=bas.fr.lupx-eid.fr.lupx;
	dy=bas.fr.lupy-eid.fr.lupy;
	dx+=16;
	dy+=16;
	MMI_SendMessage(extDlg,MM_MOVE,2,dx,dy);

	MMI_SendMessage(extInputId,MM_SETTEXT,3,ext,12,FALSE);

	MMI_SendMessage(extDlg,MM_ATTACH,1,MMI_GetBaseObj());
	MMI_SendMessage(extDlg,MM_SHOW,0);
	MMI_SendMessage(extInputId,MM_WAKE,0);

	dspFlag=YSON;

	return NOERR;
}

int extEndFunc()
{
	MMI_SendMessage(extDlg,MM_ERASE,0);
	MMI_SendMessage(extDlg,MM_DETACH,0);

	MMI_SendMessage(extInputId,MM_GETTEXT,3,ext,12,FALSE);

	dspFlag=YSOFF;

	return NOERR;
}

