/*************************************************************************
*	"find2.cci" : パターン検索
*************************************************************************/

#include	"ccilib.h"

/*	パレットデータ（HEwin 配色）	*/
char	PltDat[3][16] =
{
	/* G R  B								*/
	{ 0, 0, 0},	/* C_BALCK, C_THROUGH		*/
	{ 0, 0, 0},	/* C_BLUE , C_MBLACK 		*/
	{ 7, 7, 8},	/* C_RED					*/
	{12,12,13},	/* C_MAGENTA				*/
	{ 6, 5, 7},	/* C_GREEN					*/
	{ 8, 7, 9},	/* C_CYAN					*/
	{10, 9,11},	/* C_YELLOW					*/
	{11,11,12},	/* C_WHITE					*/

	{ 5, 5, 6},	/* C_HBALCK					*/
	{ 0, 0,11},	/* C_HBLUE					*/
	{ 0,11, 0},	/* C_HRED					*/
	{ 0,11,11},	/* C_HMAGENTA				*/
	{11, 0, 0},	/* C_HGEEN					*/
	{11, 0,11},	/* C_HCYAN					*/
	{11,11, 0},	/* C_HYELLOW				*/
	{14,14,15}	/* C_HWHITE					*/
};

/*************************************************************************
*	初期化
*************************************************************************/

int		init()
{
	DSP_sysInit(0);			/* 表示システム初期化		*/
	KBF_sysInit();			/* キーボードシステム初期化	*/
	KBF_kan_off();
	FDL_sysInit();			/* ファイルダイアログ初期化	*/

	sdk_control(0);			/* サイドワーク起動禁止		*/

	DSP_writePage(0);		/* 書き込みページ			*/
	DSP_setPlt( PltDat );	/* パレット設定				*/
	DSP_boxf(0,24,639,463,PSET,COLMIX(5,6));

	DSP_writePage(1);		/* 書き込みページ			*/
	DSP_setPlt( PltDat );	/* パレット設定				*/
	DSP_title("FIND2","0.99",15,7,0,0);
	evt_setDspTime( 1, 432, 4, 7, 0 );	/* 時刻表示アイドリング処理設定	*/
	SYL_clear();
}

/*************************************************************************
*	終了
*************************************************************************/

int		term()
{
	FDL_sysEnd();
	KBF_sysEnd();
	DSP_sysEnd();
}

int			Upcase = 0;
char		Ptn[BUFSIZ] = {'\0'};
char		*RePtn = NULL;

char		*TxtPtr = NULL;

#define		TABSIZE	(8)
#define		TXT_XS	(80)
#define		TXT_YS	(20)


/*************************************************************************
*	大文字，小文字を区別するモードの切り換え
*************************************************************************/

int		upcase_func( int evtNo, char *sbj )
{
	Upcase = Upcase ?  0 : 1;

	/* 検索パターンの再コンパイル */
	if ( RePtn )
		RePtnFree(RePtn);
	RePtn = RePtnAlloc(Ptn,Upcase);

	return (evtNo);
}

/*************************************************************************
*	検索パターンの入力
*************************************************************************/

int		pattern_func( int evtNo, char *sbj )
{
	int		ret, x, y;
	char	*dlg;

	x = y = DLGPOS_MOS_SET_HOME;
	dlg = DLG_getsOpen( x, y, 320, "検索パターンを入力してください。");
	if ( dlg == NULL )
		return (evtNo);	/* error */
	DLG_getsSetTitle( dlg, "INPUT PATTERN" );
	ret = DLG_getsStart( dlg, BUFSIZ-1, Ptn );
	if ( ret > 0 )
	{	/* 入力あり */
		if ( RePtn )
			RePtnFree(RePtn);
		if ( (RePtn = RePtnAlloc(Ptn,Upcase)) == NULL )
		{
			DLG_tmpMsgBox( x, y, C_MBLACK, C_DLGBASE, COLMIX(C_ERROR,C_GRAY),
			    "    Pattern error!!   " );
		}
	}
	DLG_getsClose(dlg);

	return (evtNo);
}

int		find( char *dlg, char *fn )
{
	char	*fp;
	char	buf[BUFSIZ];
	int		count;
	long	ln;				/* 行番号	*/

	DLG_msgPrintf(dlg,"\r\n- %s -\r\n", fn );
	TxtPtr = DLG_txtSetLinBuf( TxtPtr, TABSIZE, TXT_XS, "- %s -", fn );

	if ( (fp = fopen(fn,"r")) == NULL )
	{
		DLG_msgPrintf(dlg,"File open error!! (%s)\r\n", fn );
		return (ERR);
	}

	count = 0;
	ln = 0;
	while ( fgets(buf,BUFSIZ,fp) != NULL )
	{
		++ln;
		if ( RePtnMatch( RePtn, buf ) >= 0 )
		{	/* マッチング */
			++count;
			DLG_msgPrintf(dlg,"%6d : %s\r", ln, buf );
			TxtPtr = DLG_txtSetLinBuf( TxtPtr, TABSIZE, TXT_XS, "%s", buf );
		}
	}

	fclose(fp);
	return (count);
}

/*************************************************************************
*	検索開始
*************************************************************************/

int		find_func( int evtNo, char *sbj )
{
	int		i, x, y, ret;
	int		mdFdl;
	char	*fdl;
	char	*fn;
	char	*dlg;

	if ( RePtn == NULL )
	{
		x = y = DLGPOS_CENTER_OF_SCN;
		MNU_sure( x, y, C_MBLACK, C_DLGBASE, COLMIX(C_ERROR,C_GRAY),
		    SELBTN_ATT_CENTER, "    検索パターンが指定されていません。  " );
		return (ERR);
	}

	mdFdl = FDL_MODE_MULTI | FDL_MODE_BIT_DIRIGN | FDL_MODE_BIT_SIDEWORK;
	if ( (fdl = FDL_open(mdFdl)) == NULL )
		return (ERR);
	FDL_set_title( fdl, "FIND");
	FDL_set_wildcard( fdl, "*.*");
	SYL_puts(C_HGREEN,"検索するファイルを指定してください。");
	ret = FDL_start(fdl);
	SYL_clear();
	if ( ret != NORMAL )
	{
		FDL_close(fdl);
		return (evtNo);
	}

	i = 0;
	while ( FDL_getMarkFile(fdl, i) != NULL )
		++i;
	if ( i == 0 )
	{	/* ファイルが指定されていない */
		FDL_close(fdl);
		return (evtNo);
	}

	x = y = DLGPOS_CENTER_OF_SCN;
	ret = MNU_sure( x, y, C_MBLACK, C_DLGBASE, COLMIX(C_INFO,C_GRAY),
	    SELBTN_ATT_CENTER,
	    "    %d 個のファイルが指定されています。  \n    検索を実行します。  ",
	    i );
	if ( ret < 0 )
	{
		FDL_close(fdl);
		return (evtNo);
	}

	dlg = DLG_msgOpen( x, y, 80*6, 23*12,
	    C_MBLACK, C_DLGBASE, COLMIX(C_INFO,C_GRAY), 
	    "***** FIND *****" );
	if ( dlg == NULL )
	{
		FDL_close(fdl);
		return (evtNo);
	}
	DLG_msgSetConfig( dlg, 8, 6, 12 );
	DLG_msgClear( dlg, C_HWHITE );

	i = ret = 0;
	while ( (fn = FDL_getMarkFile(fdl, i)) != NULL )
	{
		if ( find( dlg, fn ) > 0 )
			ret = 1;
		++i;
	}
	DLG_msgClose(dlg);
	FDL_close(fdl);

	if ( ret )
	{
		dlg = DLG_txtOpen( x, y, TXT_XS, TXT_YS, TxtPtr, 0 );
		if ( dlg == NULL )
			return (evtNo);
		DLG_txtSetTitle( dlg, "FIND" );
		DLG_txtStart( dlg );
		DLG_txtClose( dlg );
	} else
	{
		MNU_sure( x, y, C_MBLACK, C_DLGBASE, COLMIX(C_ERROR,C_GRAY),
		    SELBTN_ATT_CENTER, "    Pattern not found!!    " );
	}

	return (evtNo);
}


/*************************************************************************
*	メニュー設定
*************************************************************************/

int		set_menudat( char *obj )
{
	char	*s;

	s = Upcase ? "Upcase [ON]" : "Upcase [OFF]";
	MNU_setObj(obj, 0, MNU_NOR, 'U', s               , NULL, 1, "upcase_func" , NULL );
	MNU_setObj(obj, 1, MNU_NOR, 'P', "Input pattern ", NULL, 2, "pattern_func", NULL );
	MNU_setObj(obj, 2, MNU_BLK,  0 , NULL            , NULL, 0, NULL          , NULL );
	MNU_setObj(obj, 3, MNU_NOR, 'F', "Find"          , NULL, 3, "find_func"   , NULL );
}

/*************************************************************************
*	検索のためのメニュー
*************************************************************************/

int		find_menu()
{
	int		ret, x, y;
	char	*mnu;
	char	*obj;

	if ( (obj = MNU_alloc(4)) == NULL )
		return (ERR);

	set_menudat(obj);
	x = y = DLGPOS_CENTER_OF_SCN;
	mnu = MNU_open( x, y, MNUATT_EXIT, obj, "FIND MENU" );
	if ( mnu == NULL )
		return (ERR);

	for(;;)
	{
		if ( (ret = MNU_start( mnu )) < 0 )
			break;
		set_menudat(obj);
	}

	MNU_close(mnu);
	MNU_free(obj);

	return (NORMAL);
}

/*************************************************************************
*	MAIN
*************************************************************************/

int		main( int argc, char **argv )
{
	init();

	find_menu();

	term();
	return (0);
}
