/*************************************************************************
*	"tdp.c" : テキストエディタ
*************************************************************************/

#include	"tdpofs.h"

#ifndef	TXD_CUTBUF_MODE_NORMAL
#	define	TXD_CUTBUF_MODE_NORMAL	(0)
#	define	TXD_CUTBUF_MODE_LINE	(1)	/* 行選択モード		*/
#	define	TXD_CUTBUF_MODE_RECT	(2)	/* 矩形選択モード	*/
#endif

/*	tdp から txd を得るマクロ (tdp->txd)	*/
#define	TDP_TXDPTR(tdp)	TdpGetTxdPtr(tdp)

/*************************************************************************
*	テキストエディタ・システムの初期化
*************************************************************************/

int		TdpUsr_sysInit()
{
	int		i;

	TdpHistFlag = TRUE;	/* 編集履歴有効	*/
	Apl_stdWinSizeSet( APL_TYPE_TDP, (2+ 4+(6*80)+20+2), (358-12*3) );

	/* 検索パターンの登録	--------------------------------------------*/
	TxdSetSearchPattern("NIFTY TITLE", "[0-9]..../[0-9].... ........  .* .*\\|[0-9]../[0-9]..   ...[0-9]....  .* .*" );
	TxdSetSearchPattern("C FUNCTION" , "^[A-Za-z_].*[ \\t]*[a-zA-Z_].*(.*)" );
#if	0
	TxdSetSearchPattern("TITLE"      ,
	    "^[ \\t]*[★☆●○◎■□◆◇・§]\\|^[ \\t]*[(（【《][ 0-9０-９]*[)）】》]" );
	TxdSetSearchPattern("#ifdef〜else〜endif" ,
	    "^#[ \\t]*if\\|^#[ \\t]*else\\|^#[ \\t]*endif" );
#endif
	return (NORMAL);
}

int		TdpUsr_sysTerm()
{
	return (NORMAL);
}

/*************************************************************************
*	ウィンドゥがオープンされたときに呼び出される
*-------------------------------------------------------------------------
*	キーカスタマイズ等はここで行うと良い
*************************************************************************/

int		TdpUsr_openFunc( char *tdp )
{
	char	*txd;
#ifdef	CT
#	undef	CT
#endif
#define	CT	KA_BIT_CTRL
#ifdef	SH
#	undef	SH
#endif
#define	SH	KA_BIT_SHIFT

	txd = TDP_TXDPTR(tdp);
	TXD_cstSetKey(    txd, SH|CT|KA_INS       , TXD_CALLUSRFNC, 0, "dup_line	dup line");
	TXD_cstSetKey(    txd,    CT|KA_RETURN    , TXD_CALLUSRFNC, 0, "template");
	TXD_cstSetKey(    txd, SH|CT|KA_F         , TXD_CALLUSRFNC, 0, "getxt_searchPattern	set search pattern from text");

	TXD_cstSetPfxKey( txd, CT|KA_Q   , KA_W   , TXD_CALLUSRFNC, 0, "pg_help	program helper");
/*	TXD_cstSetPfxKey( txd, CT|KA_Q   , KA_W   , TXD_CALLUSRFNC, 0, "word_help	word help");	*/
	TXD_cstSetPfxKey( txd, CT|KA_Q   , SH|KA_F, TXD_CALLUSRFNC, 0, "set_searchPattern	set search pattern list");

	TXD_cstSetPfxKey( txd, CT|KA_K   , KA_W   , TXD_CALLUSRFNC, 0, "cut_word	cut word");
	TXD_cstSetPfxKey( txd, SH|CT|KA_J, KA_U   , TXD_CALLUSRFNC, 0, "undo_info	undo information");
	TXD_cstSetPfxKey( txd, SH|CT|KA_J, KA_C   , TXD_CALLUSRFNC, 0, "clear_undo_buffer	clear undo buffer");
	TXD_cstSetPfxKey( txd, CT|KA_K   , SH|KA_R, TXD_CALLUSRFNC, 0, "auto_rect_edit	auto rectangle edit");
	TXD_cstSetPfxKey( txd, SH|CT|KA_J, KA_F   , TXD_CALLUSRFNC, 0, "extra_filter		extra command filter");
	TXD_cstSetPfxKey( txd, SH|CT|KA_J, KA_B   , TXD_CALLUSRFNC, 0, "extra_filter2	extra command filter2");
	TXD_cstSetPfxKey( txd, SH|CT|KA_J, KA_H   , TXD_CALLUSRFNC, 0, "spc_zen2han		space code convert");
#ifdef	_XTR_MENU
	TXD_cstSetPfxKey( txd, SH|CT|KA_J, KA_X   , TXD_CALLUSRFNC, 0, "xtr_menu			xtr menu");
	TXD_cstSetPfxKey( txd, SH|CT|KA_J, KA_T   , TXD_CALLUSRFNC, 0, "xtr_transform	xtr transform");
	TXD_cstSetPfxKey( txd, SH|CT|KA_J, KA_P   , TXD_CALLUSRFNC, 0, "xtr_printout		xtr printout");
#endif

	TXD_cstSetPfxKey( txd, SH|CT|KA_M, KA_T   , TXD_CALLUSRFNC, 0, "mml_toneGen	mml generate");


#ifdef	_TAROPYON_SYSTEM
	TXD_cstSetPfxKey( txd, SH|CT|KA_K, KA_1   , TXD_CALLUSRFNC, 0, "form_1	C programming" );
	TXD_cstSetPfxKey( txd, SH|CT|KA_K, KA_2   , TXD_CALLUSRFNC, 0, "form_2	manuscript(19)");
	TXD_cstSetPfxKey( txd, SH|CT|KA_K, KA_3   , TXD_CALLUSRFNC, 0, "form_3	manuscript(35)");
	TXD_cstSetPfxKey( txd, SH|CT|KA_K, KA_4   , TXD_CALLUSRFNC, 0, "form_4	manuscript(38)");
#endif

#ifdef	_ESC_MARK_JUMP
	TXD_cstSetPfxKey( txd, KA_ESC, 0x0B00, TXD_CALLUSRFNC, 0, "jump_mark_0");
	TXD_cstSetPfxKey( txd, KA_ESC, 0x0200, TXD_CALLUSRFNC, 0, "jump_mark_1");
	TXD_cstSetPfxKey( txd, KA_ESC, 0x0300, TXD_CALLUSRFNC, 0, "jump_mark_2");
	TXD_cstSetPfxKey( txd, KA_ESC, 0x0400, TXD_CALLUSRFNC, 0, "jump_mark_3");
	TXD_cstSetPfxKey( txd, KA_ESC, 0x0500, TXD_CALLUSRFNC, 0, "jump_mark_4");
	TXD_cstSetPfxKey( txd, KA_ESC, 0x0600, TXD_CALLUSRFNC, 0, "jump_mark_5");
	TXD_cstSetPfxKey( txd, KA_ESC, 0x0700, TXD_CALLUSRFNC, 0, "jump_mark_6");
	TXD_cstSetPfxKey( txd, KA_ESC, 0x0800, TXD_CALLUSRFNC, 0, "jump_mark_7");
	TXD_cstSetPfxKey( txd, KA_ESC, 0x0900, TXD_CALLUSRFNC, 0, "jump_mark_8");
	TXD_cstSetPfxKey( txd, KA_ESC, 0x0A00, TXD_CALLUSRFNC, 0, "jump_mark_9");
#endif
	return (NORMAL);
#undef	CT
#undef	SH
}

/*************************************************************************
*	セーブして編集を終了するときに呼ばれる
*************************************************************************/

int		TdpUsr_saveFunc( char *tdp, char *fn )
{
	return (NORMAL);
}

/*************************************************************************
*	編集を終了するときに呼ばれる
*************************************************************************/

int		TdpUsr_quitFunc( char *tdp )
{
	return (NORMAL);
}


/*************************************************************************
*	イベント処理関数
*************************************************************************/

char	*TDPUSR_EVTFUNC = "tdpUsr_evtFunc";

int		tdpUsr_evtFunc( int evtNo, char *sbj )
{
	return	TDP_cmdJump( GET_EVTSBJ_PTR(sbj), evtNo );
}

/*************************************************************************
*	新規にファイルオープンしたときに呼び出される
*************************************************************************/

int		TdpUsr_setPathname( char *tdp, char *pn )
{
	return (NORMAL);
}

int		TDP_menu_1( char *tdp, int x, int y )
{
	int			ret;
	char		*mnu;
	char		*obj;

	obj = MNU_alloc(12);
	MNU_setObj(obj, 0, MNU_NOR, 'O', "File Open"      , NULL, TDPCMD_FILEOPEN    ,TDPUSR_EVTFUNC, tdp );
	MNU_setObj(obj, 1, MNU_NOR, 'C', "File Close"     , NULL, TDPCMD_FILECLOSE   ,TDPUSR_EVTFUNC, tdp );
	MNU_setObj(obj, 2, MNU_BLK,  0,   NULL            , NULL, 0,                  NULL          , NULL);
	MNU_setObj(obj, 3, MNU_NOR, 'W', "Write file"     , NULL, TDPCMD_FILEWRITE   ,TDPUSR_EVTFUNC, tdp );
	MNU_setObj(obj, 4, MNU_NOR, 'R', "Read file"      , NULL, TDPCMD_FILEREAD    ,TDPUSR_EVTFUNC, tdp );
	MNU_setObj(obj, 5, MNU_NOR, 'U', "Update file"    , NULL, TDPCMD_FILEUPDATE  ,TDPUSR_EVTFUNC, tdp );
	MNU_setObj(obj, 6, MNU_NOR, 'F', "Change Filename", NULL, TDPCMD_CHANGENAME  ,TDPUSR_EVTFUNC, tdp );
	MNU_setObj(obj, 7, MNU_NOR, 'E', "Edit original"  , NULL, TDPCMD_EDITORIGINAL,TDPUSR_EVTFUNC, tdp );
	MNU_setObj(obj, 8, MNU_BLK,  0,   NULL            , NULL, 0,                  NULL          , NULL);
	MNU_setObj(obj, 9, MNU_NOR, 'P', "UPdate all"     , NULL, TDPCMD_UPDATEALL   ,TDPUSR_EVTFUNC, tdp );
	MNU_setObj(obj,10, MNU_NOR, 'N', "New window"     , NULL, TDPCMD_NEWWINDOW   ,TDPUSR_EVTFUNC, tdp );
	MNU_setObj(obj,11, MNU_NOR, 'M', "Multi file open", NULL, TDPCMD_MULTIOPEN   ,TDPUSR_EVTFUNC, tdp );

	mnu = MNU_open( x, y, MNUATT_EXIT, obj, "MENU1 (FILE)" );
	ret = MNU_start ( mnu );
	MNU_close(mnu);
	MNU_free(obj);

	return (ret);
}

/*************************************************************************
*	指定行に飛ぶ
*************************************************************************/

int		tdp_evt_jump( int evtNo, char *sbj )
{
	char	*tdp;	/* TDP_T	*/
	char	*txd;	/* TXD_T	*/
	char	*dlg;	/* DLG_T	*/
	int		ret, ln;
	char	buf[16];

	tdp = GET_EVTSBJ_PTR(sbj);
	dlg = DLG_getsOpen( DLGPOS_MOS_SET_HOME, DLGPOS_MOS_SET_HOME, 320,
	                    "行番号を入力してください。");
	DLG_getsSetTitle( dlg, "JUMP" );
	buf[0] = '\0';
	ret = DLG_getsStart( dlg, 15, buf );
	if ( ret > 0 && (ln = atoi(buf)) > 0 )
	{
		txd = TDP_TXDPTR(tdp);
		TXD_jumpLine( txd, ln - 1 );
	}
	DLG_getsClose(dlg);
	return (0);
}

/*************************************************************************
*	カットバッファを置換検索パターンに
*************************************************************************/

int		_tdpSetRplPtn( int evtNo, char *sbj )
{
	char	*tdp;
	char	*txd;
	char	buf[256];

	tdp = GET_EVTSBJ_PTR(sbj);
	txd = TDP_TXDPTR(tdp);
	memset( buf, 0, 256);
	if ( TXD_getCutBuf(txd,buf,256) >= 0 )
		TXD_setReplacePtn( txd, buf );

	return (evtNo);
}

/*************************************************************************
*	カットバッファを置換文字列に
*************************************************************************/

int		_tdpSetRplStr( int evtNo, char *sbj )
{
	char	*tdp;
	char	*txd;
	char	buf[256];

	tdp = GET_EVTSBJ_PTR(sbj);
	txd = TDP_TXDPTR(tdp);
	memset( buf, 0, 256);
	if ( TXD_getCutBuf(txd,buf,256) >= 0 )
		TXD_setReplaceStr( txd, buf );

	return (evtNo);
}

/*************************************************************************
*	カットバッファを検索パターンに
*************************************************************************/

int		_tdpSetSearch( int evtNo, char *sbj )
{
	char	*tdp;
	char	*txd;
	int		len;
	char	buf[256];

	tdp = GET_EVTSBJ_PTR(sbj);
	txd = TDP_TXDPTR(tdp);
	if ( (len = TXD_getCutBuf(txd,buf,256)) >= 0 )
		TXD_setSearchPtn( txd, buf, len );

	return (evtNo);
}

/*************************************************************************
*	[MENU2]
*************************************************************************/

int		TDP_menu_2( char *tdp, int x, int y )
{
	int			ret;
	char		*mnu;
	char		*obj;

	obj = MNU_alloc(13);
	MNU_setObj(obj, 0, MNU_NOR, 'F', "Find & jump"        , NULL, TXD_SEARCHALL     , NULL, tdp );
	MNU_setObj(obj, 1, MNU_NOR, 'S', "Search"             , NULL, TDPCMD_SEARCH     , NULL, tdp );
	MNU_setObj(obj, 2, MNU_NOR, 'R', "Replace"            , NULL, TDPCMD_REPLACE    , NULL, tdp );
	MNU_setObj(obj, 3, MNU_NOR, 'A', "Multi replace All"  , NULL, TXD_MREPLACE      , NULL, tdp );
	MNU_setObj(obj, 4, MNU_NOR, '1', "Set repalce pattern", NULL, 0,       "_tdpSetRplPtn", tdp );
	MNU_setObj(obj, 5, MNU_NOR, '2', "Set repalce strings", NULL, 0,       "_tdpSetRplStr", tdp );
	MNU_setObj(obj, 6, MNU_NOR, '3', "Set search pattern" , NULL, 0,       "_tdpSetSearch", tdp );
	MNU_setObj(obj, 7, MNU_BLK,  0,   NULL,                 NULL, 0,                NULL, NULL);
	MNU_setObj(obj, 8, MNU_NOR, 'J', "Jump"               , NULL, 0, "tdp_evt_jump"     , tdp );
	MNU_setObj(obj, 9, MNU_NOR, 'T', "Top of text"        , NULL, TDPCMD_TOPOFTEXT  , NULL, tdp );
	MNU_setObj(obj,10, MNU_NOR, 'B', "Bottom of text"     , NULL, TDPCMD_LASTOFTEXT , NULL, tdp );
	MNU_setObj(obj,11, MNU_NOR, 'L', "Last touch"         , NULL, TDPCMD_LASTTOUCH  , NULL, tdp );
	MNU_setObj(obj,12, MNU_NOR, 'M', "Mark"               , NULL, TDPCMD_MARK       , NULL, tdp );

	mnu = MNU_open( x, y, MNUATT_EXIT, obj, "MENU2 (EDIT)" );
	ret = MNU_start ( mnu );
	MNU_close(mnu);
	MNU_free(obj);

	if ( ret > 0 )
		return TDP_cmdJump(tdp,ret);
	else
		return (ret);
}

/*************************************************************************
*	[MENU3]
*************************************************************************/

int		TDP_menu_3( char *tdp, int x, int y )
{
	int			ret;
	char		*mnu;
	char		*obj;
	char		*txd;
	int			md;
	UINT		u[4];
	char		undoMsg[80], redoMsg[80];

	txd = TDP_TXDPTR(tdp);

	obj = MNU_alloc(12);
	if ( TXD_getUndoInfo( txd, u ) == NORMAL && u[3] > 0 )
	{
		md = MNU_NOR;
		sprintf( undoMsg, "Undo (%4d)", u[3] );
	} else
	{
		md = MNU_NOR | MNU_IGN;
		strcpy( undoMsg, "Undo");
	}
	MNU_setObj(obj, 0, md, 'U', undoMsg , NULL, TXD_UNDO, NULL, tdp );

	if ( TXD_getRedoInfo( txd, u ) == NORMAL && u[3] > 0 )
	{
		md = MNU_NOR;
		sprintf( redoMsg, "Redo (%4d)", u[3] );
	} else
	{
		md = MNU_NOR | MNU_IGN;
		strcpy( redoMsg, "Redo");
	}

	MNU_setObj(obj, 1, md     , 'R', redoMsg             , NULL, TXD_REDO        , NULL, tdp );
	MNU_setObj(obj, 2, MNU_BLK,  0 ,  NULL               , NULL, 0               , NULL, NULL);
	MNU_setObj(obj, 3, MNU_NOR, '1', "Split 1 left/right", NULL, TDPCMD_SPLIT_1  , NULL, tdp );
	MNU_setObj(obj, 4, MNU_NOR, '2', "Split 2 up/down"   , NULL, TDPCMD_SPLIT_2  , NULL, tdp );
	MNU_setObj(obj, 5, MNU_BLK,  0,   NULL               , NULL, 0               , NULL, NULL);
	MNU_setObj(obj, 6, MNU_NOR, 'P', "Print CUT-BUFFER"  , NULL, TDPCMD_PRINTCBUF, NULL, tdp );
	MNU_setObj(obj, 7, MNU_NOR, 'T', "Text printout"     , NULL, TDPCMD_PRINTOUT , NULL, tdp );
	MNU_setObj(obj, 8, MNU_BLK,  0,   NULL               , NULL, 0               , NULL, NULL);
	MNU_setObj(obj, 9, MNU_NOR, 'C', "Calculator"        , NULL, TDPCMD_CALC     , NULL, tdp );
	MNU_setObj(obj,10, MNU_NOR, 'A', "Ascii code list"   , NULL, TDPCMD_ASCIICODE, NULL, tdp );
	MNU_setObj(obj,11, MNU_NOR, 'K', "Kanji code list"   , NULL, TDPCMD_KANJICODE, NULL, tdp );

	mnu = MNU_open( x, y, MNUATT_EXIT, obj, "MENU3 (UTILITY)" );
	ret = MNU_start ( mnu );
	MNU_close(mnu);
	MNU_free(obj);

	if ( ret > 0 )
		return TDP_cmdJump(tdp,ret);
	else
		return (ret);
}

#define	TDP_KST_SNAM	".kst"
#define	TDP_KST_WILD	"*.kst"

int		_tdpSaveSetup( int evtNo, char *sbj )
{
	char	   *tdp;
	char	   *txd;
	char	   *fdl;
	int			ret;
	char		tmp[256], *fn;

	tdp = GET_EVTSBJ_PTR(sbj);
	txd = TDP_TXDPTR(tdp);

	if ( (fdl = FDL_open(0)) == NULL )
		return (ERR);
	FDL_set_title( fdl,"SAVE SETUP");
	FDL_set_wildcard( fdl, TDP_KST_WILD );
	ret = FDL_start(fdl);
	fn  = FDL_get_filename(fdl);
	if ( ret != NORMAL || strlen(fn) == 0 )
	{
		FDL_close(fdl);
		return (ERR);
	}
	FS_appendSnam( tmp, fn, TDP_KST_SNAM );
	TDP_saveKeySetup(tdp,tmp);
	FDL_close(fdl);

	return (NORMAL);
}

int		_tdpLoadSetup( int evtNo, char *sbj )
{
	char	   *tdp;
	char	   *txd;
	char	   *fdl;
	int			ret;
	char		tmp[256], *fn;

	tdp = GET_EVTSBJ_PTR(sbj);
	txd = TDP_TXDPTR(tdp);

	if ( (fdl = FDL_open(0)) == NULL )
		return (ERR);
	FDL_set_title( fdl,"LOAD SETUP");
	FDL_set_wildcard( fdl, TDP_KST_WILD );
	ret = FDL_start(fdl);
	fn  = FDL_get_filename(fdl);
	if ( ret != NORMAL || strlen(fn) == 0 )
	{
		FDL_close(fdl);
		return (ERR);
	}
	FS_appendSnam( tmp, fn, TDP_KST_SNAM );
	TDP_loadKeySetup(tdp,tmp);
	FDL_close(fdl);

	return (NORMAL);
}

int		_tdpCallHE386( int evtNo, char *sbj )
{
	char	*tdp;
	char	*pn;

	tdp = GET_EVTSBJ_PTR(sbj);
	pn = TdpGet_pn(tdp);		/* 編集ファイル名の取得	*/
	he386_menu( pn );

	return (NORMAL);
}

int		_tdpCallGSPLAY( int evtNo, char *sbj )
{
	char	   *tdp;
	char	   *pn;

	tdp = GET_EVTSBJ_PTR(sbj);
	pn = TdpGet_pn(tdp);		/* 編集ファイル名の取得	*/

	/* DTA 領域の設定	*/
	AplDtaInit();
	AplPclExec( "GSPLAY.EXP",  7 );

	return (NORMAL);
}

int		_tdpCallHighC( int evtNo, char *sbj )
{
	char	   *tdp;
	char	   *pn;

	tdp = GET_EVTSBJ_PTR(sbj);
	pn = TdpGet_pn(tdp);		/* 編集ファイル名の取得	*/

	highc_menu(pn);

	return (NORMAL);
}

/*************************************************************************
*	[MENU4]
*************************************************************************/

int		TDP_menu_4( char *tdp, int x, int y )
{
	int			ret;
	char		*mnu;
	char		*obj;

	obj = MNU_alloc(10);
	MNU_setObj(obj, 0, MNU_NOR, 'A', "Alphabet buffer"    , NULL, TDPCMD_ALBUF_MENU  , NULL            , tdp );
	MNU_setObj(obj, 1, MNU_NOR, 'K', "Key customize"      , NULL, TDPCMD_KEYCUSTOMIZE, NULL            , tdp );
	MNU_setObj(obj, 2, MNU_NOR, 'S', "Save key setup data", NULL, 0                  , "_tdpSaveSetup" , tdp );
	MNU_setObj(obj, 3, MNU_NOR, 'L', "Load key setup data", NULL, 0                  , "_tdpLoadSetup" , tdp );
	MNU_setObj(obj, 4, MNU_BLK,  0 , NULL                 , NULL, 0                  , NULL            , NULL);
	MNU_setObj(obj, 5, MNU_NOR, 'U', "Upload"             , NULL, TDPCMD_NTM_UPLOAD  , NULL            , tdp );
	MNU_setObj(obj, 6, MNU_BLK,  0 , NULL                 , NULL, 0                  , NULL            , NULL);
	MNU_setObj(obj, 7, MNU_NOR, 'H', "High C compiler"    , NULL, 0                  , "_tdpCallHighC" , tdp );
	MNU_setObj(obj, 8, MNU_NOR, 'M', "MML Compile"        , NULL, 0                  , "_tdpCallHE386" , tdp );
	MNU_setObj(obj, 9, MNU_NOR, 'G', "GSPLAY"             , NULL, 0                  , "_tdpCallGSPLAY", tdp );

	mnu = MNU_open( x, y, MNUATT_EXIT, obj, "MENU4 (OTHER)" );
	ret = MNU_start ( mnu );
	MNU_close(mnu);
	MNU_free(obj);

	if ( ret > 0 )
		return TDP_cmdJump(tdp,ret);
	else
		return (ret);
}


/*************************************************************************
*	英字バッファのロード（ファイルマネージャから呼ばれる）
*-------------------------------------------------------------------------
*	アイテム登録可能（パラメータ必須）
*	パラメータ:	<ファイル名>
*************************************************************************/

int		CCI_loadKbl( int argc, char **argv )
{
	if ( argc > 1 )
	{
		DLG_tmpMsgTime( DLGPOS_MOS_SET_CENTER, DLGPOS_MOS_SET_CENTER,
		    C_MBLACK, C_DLGBASE, COLMIX(C_TIMEBOX,C_GRAY),
		    2, "%s : \n  Load alphabet buffer  ", argv[1] );
		TDP_loadAlBuf(NULL, argv[1]);
	}
	return (NORMAL);
}

/*************************************************************************
*	マルチリプレースデータのロード（ファイルマネージャから呼ばれる）
*-------------------------------------------------------------------------
*	アイテム登録可能（パラメータ必須）
*	パラメータ:	<ファイル名>
*************************************************************************/

int		CCI_loadRpl( int argc, char **argv )
{
	if ( argc > 1 )
	{
		DLG_tmpMsgTime( DLGPOS_MOS_SET_CENTER, DLGPOS_MOS_SET_CENTER,
		    C_MBLACK, C_DLGBASE, COLMIX(C_TIMEBOX,C_GRAY),
		    2, "%s : \n  Load multi replace data  ", argv[1] );
		TXD_loadRplBuf( argv[1] );
	}
	return (NORMAL);
}

int		TDP_menu_5( char *tdp )	{ return (ERR); }
int		TDP_menu_6( char *tdp )	{ return (ERR); }
int		TDP_menu_7( char *tdp )	{ return (ERR); }
int		TDP_menu_8( char *tdp )	{ return (ERR); }

/*************************************************************************
*	[SETUP2]
*************************************************************************/

int		TDP_setup2( char *tdp )
{
	char	   *txd;
	int			ret;
	char	   *mnu;
	char	   *obj;
	char	   *fn;

	txd = TDP_TXDPTR(tdp);
	fn  = NULL;

	obj = MNU_alloc(11);
	MNU_setObj(obj, 0, MNU_NOR, '0', "Natural  (black /white)", NULL,  1, NULL, NULL );
	MNU_setObj(obj, 1, MNU_NOR, '1', "Flat     (black /gray) ", NULL,  2, NULL, NULL );
	MNU_setObj(obj, 2, MNU_NOR, '2', "Standard (white /black)", NULL,  3, NULL, NULL );
	MNU_setObj(obj, 3, MNU_NOR, '3', "Cool     (blue  /black)", NULL,  4, NULL, NULL );
	MNU_setObj(obj, 4, MNU_NOR, '4', "Chic     (green /black)", NULL,  5, NULL, NULL );
	MNU_setObj(obj, 5, MNU_NOR, '5', "Light    (yellow/black)", NULL,  6, NULL, NULL );
	MNU_setObj(obj, 6, MNU_NOR, '6', "Cobalt   (white /blue)" , NULL,  7, NULL, NULL );
	MNU_setObj(obj, 7, MNU_NOR, '7', "Fever    (white /red)"  , NULL,  8, NULL, NULL );
	MNU_setObj(obj, 8, MNU_BLK,  0 , NULL                      , NULL,  0, NULL, NULL );
	MNU_setObj(obj, 9, MNU_NOR, 'C', "Change color table"      , NULL, 10, NULL, NULL );
	MNU_setObj(obj,10, MNU_NOR, 'S', "Save color table"        , NULL, 11, NULL, NULL );

	mnu = MNU_open( DLGPOS_MOS_SET_CENTER, DLGPOS_MOS_SET_CENTER,
	    MNUATT_EXIT, obj, "SETUP2" );
	ret = MNU_start ( mnu );
	MNU_close(mnu);
	MNU_free(obj);

	switch ( ret )
	{
		case  1:	fn = "tdpcol70.tbl";	break;
		case  2:	fn = "tdpcol80.tbl";	break;
		case  3:	fn = "tdpcol07.tbl";	break;
		case  4:	fn = "tdpcol05.tbl";	break;
		case  5:	fn = "tdpcol04.tbl";	break;
		case  6:	fn = "tdpcol06.tbl";	break;
		case  7:	fn = "tdpcol17.tbl";	break;
		case  8:	fn = "tdpcol27.tbl";	break;
		case 10:
			TDP_cmdJump(tdp,TDPCMD_CHGCOLOR);
			break;
		case 11:
			TxdUsr_saveColTbl( txd );
			break;
	}
	if ( fn )
	{
		TXD_loadColTbl( txd, fn );
	}
	return (NORMAL);
}

/*************************************************************************
*	カーソル位置の位置単語をカットバッファに格納
*************************************************************************/

int		TxdUsr_cut_word(char *txd )
{
	if ( TxdGet_selFlag(txd) != 0 )		/* 選択中なら処理しない	*/
		return (0);
	TXD_cmdJump( txd, TXD_CUTSTART );
	TXD_cmdJump( txd, TXD_NEXTWORD );
	TXD_cmdJump( txd, TXD_CUTEND   );
	return (NORMAL);
}

/*************************************************************************
*	行の二重化
*************************************************************************/

int		TxdUsr_dup_line( char *txd )
{
	if ( TxdGet_selFlag(txd) != 0 )		/* 選択中なら処理しない				*/
		return (0);
	TXD_cmdJump( txd, TXD_TOPOFLINE );	/* カーソルを行頭に					*/
	TXD_cmdJump( txd, TXD_SCBUFSET  );	/* 行末まで行カットバッファに格納	*/
	TXD_cmdJump( txd, TXD_CUR_DOWN  );	/* カーソルを下に					*/
	TXD_cmdJump( txd, TXD_SCBUFPASTE);	/* 行カットバッファをペースト		*/

	return (NORMAL);
}

int		_txd_printUndoInf( char *dlg, int *ubuf )
{
	DLG_msgPrintf(dlg,"  最大バッファサイズ %8d bytes\r\n", ubuf[0] );
	DLG_msgPrintf(dlg,"  使用バッファサイズ %8d bytes\r\n", ubuf[1]);
	DLG_msgPrintf(dlg,"  最大回数           %8d 回\r\n"   , ubuf[2] );
	DLG_msgPrintf(dlg,"  現在有効数         %8d 回"       , ubuf[3] );
}

/*************************************************************************
*	UNDO情報の表示
*************************************************************************/

int		TxdUsr_undo_info( char *txd )
{
	char	*dlg;
	int		ch, x, y;
	int		u[4];
	UINT	ec;

	DSP_writePage(1);
	dlg = DLG_msgOpen( DLGPOS_MOS_SET_CENTER,DLGPOS_MOS_SET_CENTER,
	    8*38,16*10,C_MBLACK,C_DLGBASE,COLMIX(C_HGREEN,C_GRAY),
	    "UNDO/REDO BUFFER INFORMATION");
	if ( dlg == NULL )
		return (ERR);
	DLG_msgClear( dlg, -1 );

	if ( TXD_getUndoInfo( txd, u ) == NORMAL )
	{
		DLG_msgPuts(  dlg,"- UNDO -\r\n" );
		_txd_printUndoInf( dlg, u );
		if ( TXD_getRedoInfo( txd, u ) == NORMAL )
		{
			DLG_msgPuts(  dlg,"\r\n- REDO -\r\n" );
			_txd_printUndoInf( dlg, u );
		} else
		{
			DLG_msgPuts(dlg,"\r\n\n　REDO機能は使用されていません。\r\n" );
		}
	} else
	{
		DLG_msgPuts(dlg,"\r\n　UNDO機能は使用されていません。\r\n" );
	}

	while ( 1 )
	{
		ch = EVT_getkey(&ec);
		if ( ch != 0xFFFF || EVT_mos_pget(&x,&y) )
			break;
		EVT_idl();
	}
	DLG_msgClose(dlg);
	EVT_mos_waitBO();

	return (NORMAL);
}

/*************************************************************************
*	UNDOバッファの初期化
*************************************************************************/

int		TxdUsr_clear_undo_buffer( char *txd )
{
	TXD_undo_freeAll( txd );
	return (NORMAL);
}

#define	_TXDBOX_APEX		(0)	/*	角	*/
#define	_TXDBOX_VERTICAL	(1)	/*	縦	*/
#define	_TXDBOX_HORIZON		(2)	/*	横	*/

int		_txd_isRectCha(int ch)
{
	switch ( ch )
	{
		case 0x84A1:
		case 0x84A4:
		case 0x84A5:
		case 0x84A3:
		case 0x84A2:
		case 0x84A7:
		case 0x84A8:
		case 0x84A6:
		case 0x84A9:
			return _TXDBOX_APEX;
		case 0x84A0:
			return _TXDBOX_VERTICAL;
		case 0x849F:
			return _TXDBOX_HORIZON;

		case 0x84AC:
		case 0x84AD:
		case 0x84AE:
		case 0x84AF:
		case 0x84B0:
		case 0x84B1:
		case 0x84B2:
		case 0x84B3:
		case 0x84B4:
			return _TXDBOX_APEX;
		case 0x84AB:
			return _TXDBOX_VERTICAL;
		case 0x84AA:
			return _TXDBOX_HORIZON;

		case 0x84CC:
		case 0x84CD:
		case 0x84CE:
		case 0x84CF:
		case 0x84D0:
		case 0x84D1:
		case 0x84D2:
		case 0x84D3:
		case 0x84D4:
			return _TXDBOX_APEX;
		case 0x84CB:
			return _TXDBOX_VERTICAL;
		case 0x84CA:
			return _TXDBOX_HORIZON;

		default:
			return (-1);
	}
}

/*************************************************************************
*	罫線で囲まれている範囲を矩形編集
*************************************************************************/

int		TxdUsr_auto_rect_edit( char *txd )
{
	int		saveLnL;
	int		saveOfs;
	int		typ, x, y;
	int		x1, y1, x2, y2;
	int		pos1LnL, pos1Ofs;
	int		pos2LnL, pos2Ofs;

	/* 現在カーソル位置を保存	*/
	saveLnL = TxdGet_curPosLnL(txd);
	saveOfs = TxdGet_curPosOfs(txd);
	if ( saveLnL == 0 || TxdGet_curLin(txd) == NULL || TxdGet_curX(txd) == 0 )
		return (NORMAL);
	if ( _txd_isRectCha(TXD_getch(txd)) >= 0 )
		return (NORMAL);	/* 罫線上ならエラー	*/

	/* 左端まで移動	----------------------------------------------------*/
	for(;;)
	{
		TXD_cmdJump(txd,TXD_CUR_LEFT);
		typ = _txd_isRectCha(TXD_getch(txd));
		if ( typ == _TXDBOX_VERTICAL )
		{	/* OK */
			x1 = TxdGet_curX(txd);
			break;
		} else if ( TxdGet_curX(txd) == 0 )
			goto _ERR;
	}

	/* 上限まで移動	----------------------------------------------------*/
	for(;;)
	{
		TXD_cmdJump(txd,TXD_CUR_UP);
		x = TxdGet_curX(txd);
		if ( x != x1 )
			goto _ERR;
		typ = _txd_isRectCha(TXD_getch(txd));
		if ( typ == _TXDBOX_APEX )
		{	/* OK */
			y1 = TxdGet_curPosLnD(txd);
			break;
		} else if ( typ != _TXDBOX_VERTICAL )
			goto _ERR;
	}

	pos1LnL = TxdGet_curPosLnL(txd);
	pos1Ofs = TxdGet_curPosOfs(txd);

	/* 下限まで移動	----------------------------------------------------*/
	for(;;)
	{
		TXD_cmdJump(txd,TXD_CUR_DOWN);
		x = TxdGet_curX(txd);
		if ( x != x1 )
			goto _ERR;
		typ = _txd_isRectCha(TXD_getch(txd));
		if ( typ == _TXDBOX_APEX )
		{	/* OK */
			y2 = TxdGet_curPosLnD(txd);
			break;
		} else if ( typ != _TXDBOX_VERTICAL )
			goto _ERR;
	}

	/* 右端まで移動	----------------------------------------------------*/
	for(;;)
	{
		TXD_cmdJump(txd,TXD_CUR_RIGHT);
		y = TxdGet_curPosLnD(txd);
		if ( y != y2 )
			goto _ERR;
		typ = _txd_isRectCha(TXD_getch(txd));
		if ( typ == _TXDBOX_APEX )
		{	/* OK */
			x2 = TxdGet_curX(txd);
			break;
		} else if ( typ != _TXDBOX_HORIZON )	/* 横線と異なる	*/
			goto _ERR;
	}

	if ( x1 >= x2 || y1 >= y2 )
		goto _ERR;

	pos2LnL = TxdGet_curPosLnL(txd);
	pos2Ofs = TxdGet_curPosOfs(txd);

	TXD_jumpPos( txd, pos1LnL, pos1Ofs );
	TXD_cmdJump(txd,TXD_CUR_RIGHT);
	TXD_cmdJump(txd,TXD_CUR_DOWN);
	TXD_cmdJump(txd,TXD_RECTSTART);

	TXD_jumpPos( txd, pos2LnL, pos2Ofs );
	TXD_cmdJump(txd,TXD_CUR_UP);
	TXD_cmdJump(txd,TXD_RECTEND);

	return (NORMAL);

_ERR:
	TXD_jumpPos( txd, saveLnL, saveOfs );
	return (NORMAL);
}

#undef	_TXDBOX_APEX
#undef	_TXDBOX_VERTICAL
#undef	_TXDBOX_HORIZON

/*************************************************************************
*	カーソル位置の単語を検索パターンに設定
*************************************************************************/

int		TxdUsr_getxt_searchPattern( char *txd )
{
	size_t		curLnL, curOfs;
	int			ret, ch, len;
	char		ptn[256+4];

	/* 現在カーソル位置を取得	*/
	curLnL = TxdGet_curPosLnL(txd);
	curOfs = TxdGet_curPosOfs(txd);

	if ( (ch = TXD_getch(txd)) > 0 )
	{
		len = 0;
		while( len < 256 )
		{
			ch = TXD_getch(txd);
			TXD_cmdJump( txd, TXD_CUR_RIGHT );
			if ( (ch & 0xFF) < 0x20 )
				break;
			if ( ch < 256 )
			{
				if ( isdigit(ch) || isalpha(ch) || ch == '_' )
					ptn[len++] = ch;
				else
					break;
			} else
			{	/* 漢字	*/
				ptn[len++] = (ch>>8) & 0xFF;
				ptn[len++] = ch & 0xFF;
			}
		}
		ptn[len] = '\0';
		TXD_jumpPos( txd, curLnL, curOfs );
		if ( len == 0 )
			return (NORMAL);

		if ( TXD_setSearchPtn( txd, ptn, len ) == NORMAL )
		{
			DSP_writePage(1);
			DLG_tmpMsgTime( DLGPOS_MOS_SET_CENTER, DLGPOS_MOS_SET_CENTER,
			    C_MBLACK, C_DLGBASE, COLMIX(C_TIMEBOX,C_GRAY),
			    2, "Sear search pattern \n %s ", ptn );
		}
	}
	return (NORMAL);
}

/*************************************************************************
*	検索パターンリストへの登録
*************************************************************************/

int		TxdUsr_set_searchPattern( char *txd )
{
	int			ret;
	char	   *dlg;
	char		ttl[20+4], *ptn;

	DSP_writePage(1);
	ttl[0] = '\0';
	dlg = DLG_getsOpen(DLGPOS_MOS_SET_CENTER, DLGPOS_MOS_SET_CENTER,320,
	    "タイトルを入力してください。" );
	if ( dlg == NULL )
		return (ERR);
	DLG_getsSetTitle( dlg, "検索パターン登録" );
	ret = DLG_getsStart( dlg, 20, ttl);
	DLG_getsClose(dlg);

	if ( ret >= 0 )
	{
		ptn = TxdGet_searchStr(txd);
		TxdSetSearchPattern( ttl, ptn);
	}
	return (NORMAL);
}


/*************************************************************************
*	Ｃ言語ソース編集
*************************************************************************/

int		TxdUsr_form_1( char *txd )
{
	char	*tdp;

	tdp = TxdGet_ptr(txd);
	TdpSet_marginAdjust(tdp,0);

	TxdSet_linDspFlag(txd,0);	/* 行番号OFF		*/
	TxdSet_linDspMode(txd,0);	/* 表示行			*/
	TxdSet_dspTab(txd,1);		/* タブコード表示	*/
	TxdSet_tabSpace(txd,0);		/* タブ展開OFF		*/
	TxdSet_dspKS(txd,1);		/* 全角スペース表示	*/
	TxdSet_dspCUL(txd,1);		/* ｶｰｿﾙ行ｱﾝﾀﾞｰﾗｲﾝON	*/
	TxdSet_dspColum(txd,0);		/* 桁位置ｹﾞｰｼﾞOFF	*/
	TxdSet_fntX(txd, 6);		/* フォント8×16	*/
	TxdSet_fntY(txd,12);
	TxdSet_xsL(txd,256);		/* 右マージン38		*/
	TxdSet_tab(txd,4);			/* タブサイズ2		*/

	TXD_chgSize(txd);

	return (NORMAL);
}

/*************************************************************************
*	原稿モード（20文字）
*************************************************************************/

int		TxdUsr_form_2( char *txd )
{
	char	*tdp;

	tdp = TxdGet_ptr(txd);
	TdpSet_marginAdjust(tdp,0);

	TxdSet_linDspFlag(txd,1);	/* 行番号ON			*/
	TxdSet_linDspMode(txd,0);	/* 表示行			*/
	TxdSet_dspTab(txd,1);		/* タブコード表示	*/
	TxdSet_tabSpace(txd,1);		/* タブ展開			*/
	TxdSet_dspKS(txd,1);		/* 全角スペース表示	*/
	TxdSet_dspCUL(txd,1);		/* ｶｰｿﾙ行ｱﾝﾀﾞｰﾗｲﾝON	*/
	TxdSet_dspColum(txd,0);		/* 桁位置ｹﾞｰｼﾞOFF	*/
	TxdSet_fntX(txd, 8);		/* フォント8×16	*/
	TxdSet_fntY(txd,16);
	TxdSet_xsL(txd,38);			/* 右マージン38		*/
	TxdSet_tab(txd,2);			/* タブサイズ2		*/

	TXD_chgSize(txd);

	return (NORMAL);
}

/*************************************************************************
*	原稿モード（35文字）
*************************************************************************/

int		TxdUsr_form_3( char *txd )
{
	char	*tdp;

	tdp = TxdGet_ptr(txd);
	TdpSet_marginAdjust(tdp,0);

	TxdSet_linDspFlag(txd,1);	/* 行番号ON			*/
	TxdSet_linDspMode(txd,0);	/* 表示行			*/
	TxdSet_dspTab(txd,1);		/* タブコード表示	*/
	TxdSet_tabSpace(txd,1);		/* タブ展開			*/
	TxdSet_dspKS(txd,1);		/* 全角スペース表示	*/
	TxdSet_dspCUL(txd,1);		/* ｶｰｿﾙ行ｱﾝﾀﾞｰﾗｲﾝON	*/
	TxdSet_dspColum(txd,0);		/* 桁位置ｹﾞｰｼﾞOFF	*/
	TxdSet_fntX(txd, 6);		/* フォント6×12	*/
	TxdSet_fntY(txd,12);
	TxdSet_xsL(txd,70);			/* 右マージン(36)	*/
	TxdSet_tab(txd,2);			/* タブサイズ2		*/

	TXD_chgSize(txd);

	return (NORMAL);
}

/*************************************************************************
*	原稿モード（38文字）
*************************************************************************/

int		TxdUsr_form_4( char *txd )
{
	char	*tdp;

	tdp = TxdGet_ptr(txd);
	TdpSet_marginAdjust(tdp,0);

	TxdSet_linDspFlag(txd,0);	/* 行番号OFF		*/
	TxdSet_linDspMode(txd,0);	/* 表示行			*/
	TxdSet_dspTab(txd,1);		/* タブコード表示	*/
	TxdSet_tabSpace(txd,1);		/* タブ展開			*/
	TxdSet_dspKS(txd,1);		/* 全角スペース表示	*/
	TxdSet_dspCUL(txd,1);		/* ｶｰｿﾙ行ｱﾝﾀﾞｰﾗｲﾝON	*/
	TxdSet_dspColum(txd,0);		/* 桁位置ｹﾞｰｼﾞOFF	*/
	TxdSet_fntX(txd, 6);		/* フォント6×12	*/
	TxdSet_fntY(txd,12);
	TxdSet_xsL(txd,76);			/* 右マージン38		*/
	TxdSet_tab(txd,2);			/* タブサイズ2		*/

	TXD_chgSize(txd);

	return (NORMAL);
}

#ifdef	_ESC_MARK_JUMP
int TxdUsr_jump_mark_0( UINT txd ){ UINT tdp; tdp = TxdGet_ptr(txd); return TDP_markJump(tdp,0);}
int TxdUsr_jump_mark_1( UINT txd ){ UINT tdp; tdp = TxdGet_ptr(txd); return TDP_markJump(tdp,1);}
int TxdUsr_jump_mark_2( UINT txd ){ UINT tdp; tdp = TxdGet_ptr(txd); return TDP_markJump(tdp,2);}
int TxdUsr_jump_mark_3( UINT txd ){ UINT tdp; tdp = TxdGet_ptr(txd); return TDP_markJump(tdp,3);}
int TxdUsr_jump_mark_4( UINT txd ){ UINT tdp; tdp = TxdGet_ptr(txd); return TDP_markJump(tdp,4);}
int TxdUsr_jump_mark_5( UINT txd ){ UINT tdp; tdp = TxdGet_ptr(txd); return TDP_markJump(tdp,5);}
int TxdUsr_jump_mark_6( UINT txd ){ UINT tdp; tdp = TxdGet_ptr(txd); return TDP_markJump(tdp,6);}
int TxdUsr_jump_mark_7( UINT txd ){ UINT tdp; tdp = TxdGet_ptr(txd); return TDP_markJump(tdp,7);}
int TxdUsr_jump_mark_8( UINT txd ){ UINT tdp; tdp = TxdGet_ptr(txd); return TDP_markJump(tdp,8);}
int TxdUsr_jump_mark_9( UINT txd ){ UINT tdp; tdp = TxdGet_ptr(txd); return TDP_markJump(tdp,9);}
#endif

#include	"tdptmp.c"
#include	"tdpmml.c"
/*#include	"tdpwhlp.c"*/
#include	"tdppghlp.c"
#include	"tdptool.c"
#ifdef	_XTR_MENU
#	include	"tdpxtr.c"
#endif
