/*************************************************************************
*	"edi.cci" : テキストエディタ
*************************************************************************/

#include	"ediofs.h"

/*	edi から txd を得るマクロ (edi->txd)	*/
#define	EDI_TXDPTR(edi)	EdiGetTxdPtr(edi)

/* メタキー設定データ	*/
char	*EdiTbl_metakey[26] =
{
	/* A */	"$swave(note,cmd,len,Tn,wn,&,x,sp,ep,sin,amp,ang,spd,amp,sub)",
	/* B */	"$cho(note,len,n,x,sp,ep)",
	/* C */	"continue",
	/* D */	"#define\\t",
	/* E */	"#endif",
	/* F */	"fprintf(\x22",
	/* G */	"fgets(buf,len,fp);",
	/* H */	".mmltype\\tfb386\\n.fm\\t\\t\\tfmtone2\\n.pcm\\t\\tensam01\\n",
	/* I */	"#include\\t",
	/* J */	"#ifdef\\n#\\tdefine\\tEXT\\n#else\\n#\\tdefine\\tEXT\\textern\\n#endif\\n",
	/* K */	"iskanji\x28",
#if	0
	/* L */	"/*\\t:*****************************************************************\\n\\t:\\n\\t:*****************************************************************\\n*/\\n",
#else
	/* L */	"/*************************************************************************\\n*\\n*************************************************************************/\\n",
#endif
	/* M */	"void\\tmain(int argc,char *argv[])\\n{\\t",
	/* N */	"NORMAL",
	/* O */	"if ( (fp = fopen(filename,\x22rb\x22))==NULL )\\n",
	/* P */	"printf(\x22",
	/* Q */	"exit();",
	/* R */	"return",
	/* S */	"$slide(note,cmd,n,&,x,sp,ep)",
	/* T */	"typedef",
	/* U */	"unsigned",
	/* V */	"$vib(note,len,n,sin,sp,a,spd,ang)",
	/* W */	"$wave(note,cmd,n,&,sin,sp,a,spd,ang)",
	/* X */	"FALSE",
	/* Y */	"TRUE",
	/* Z */	"register"
};

/*************************************************************************
*	テキストエディタ・システムの初期化
*************************************************************************/

int		EdiUsr_sysInit()
{
	int		i;

	EdiHistFlag = TRUE;	/* 編集履歴有効	*/
	for ( i = 0; i < 26; ++i )
		EdiMetaKeySet( 'A'+i, EdiTbl_metakey[i]);

	/* 検索パターンの登録	--------------------------------------------*/
	TxdSetSearchPattern("NIFTY TITLE", "[0-9]..../[0-9].... ........  .* .*\\|[0-9]../[0-9]..   ...[0-9]....  .* .*" );
	TxdSetSearchPattern("C FUNCTION" , "^[A-Za-z_].*[ \\t]*[a-zA-Z_].*(.*)" );
	TxdSetSearchPattern("TITLE"      ,
	    "^[ \\t]*[★☆●○◎■□◆◇・§]\\|^[ \\t]*[(（【《][ 0-9０-９]*[)）】》]" );
	TxdSetSearchPattern("#ifdef〜else〜endif" ,
	    "^#[ \\t]*if\\|^#[ \\t]*else\\|^#[ \\t]*endif" );
	return (NORMAL);
}

int		EdiUsr_sysTerm()
{
	return (NORMAL);
}

/*************************************************************************
*	操作ガイドメッセージのオン／オフ
*************************************************************************/

int		EdiUsr_guideMsg()
{
	int		y, x1,y1,x2,y2;

	x1 = EdiFr[0];
	y1 = EdiFr[1];
	x2 = EdiFr[2];
	y2 = y1 + 14*2 - 1;

	EdiFr[1] = y2 + 1;

	DSP_writePage(0);
	DSP_boxf(x1,y1,x2,y2,PSET,C_MBLACK);
	y = y1 + 1;
	DSP_putf12(x1,y,C_HYELLOW,C_MBLACK,
" ^Y:行削除 ^T:左削除 ^U:右削除  ^A:１単語戻る ^F:１単語進む  ^W:１行上 ^Z:１行下  ^R:１頁上 ^C:１頁下 ");
	y += 14;
	DSP_putf12(x1,y,C_HYELLOW,C_MBLACK,
" ^B:UNDO ^~B:REDO ^O:TAB･改行表\示切替 ^Q:拡張1 ^K:拡張2 ^P:ﾎﾟｹｯﾄ ^L:行削除ﾊﾞｯﾌｧ･ﾍﾟｰｽﾄ ^J･G:ガイド･オフ");
	return (NORMAL);
}

/*************************************************************************
*	ウィンドゥがオープンされたときに呼び出される
*-------------------------------------------------------------------------
*	キーカスタマイズ等はここで行うと良い
*************************************************************************/

int		EdiUsr_openFunc( char *edi )
{
	char	*txd;

#ifdef	CT
#	undef	CT
#endif
#define	CT	KA_BIT_CTRL
#ifdef	SH
#	undef	SH
#endif
#define	SH	KA_BIT_SHIFT

	txd = EDI_TXDPTR(edi);
	TXD_cstSetKey( txd, SH|CT|KA_INS   , TXD_CALLUSRFNC, 0, "dup_line	行複写");
	TXD_cstSetKey( txd,    CT|KA_RETURN, TXD_CALLUSRFNC, 0, "template	テンプレート");

	TXD_cstSetPfxKey( txd, CT|KA_Q     , KA_W, TXD_CALLUSRFNC, 0, "word_help	キーワード説明");
	TXD_cstSetPfxKey( txd, CT|KA_K     , KA_W, TXD_CALLUSRFNC, 0, "cut_word		１単語選択");
	TXD_cstSetPfxKey( txd, SH|CT|KA_J  , KA_U, TXD_CALLUSRFNC, 0, "undo_info	UNDO/REDO情報の表\示");
	TXD_cstSetPfxKey( txd, SH|CT|KA_J  , KA_C, TXD_CALLUSRFNC, 0, "clear_undo_buffer	撤回用バッファの削除");
	TXD_cstSetPfxKey( txd, CT|KA_K     , SH|KA_R,
	                                           TXD_CALLUSRFNC, 0, "auto_rect_edit	罫線内の矩形編集");
	TXD_cstSetPfxKey( txd, CT|KA_Q     , KA_W, TXD_CALLUSRFNC, 0, "word_help	キーワード説明");
	TXD_cstSetPfxKey( txd, SH|CT|KA_M  , KA_T, TXD_CALLUSRFNC, 0, "mml_toneGen	mml generate");

#ifdef	_TAROPYON_SYSTEM
	TXD_cstSetPfxKey( txd, CT|KA_J     , KA_1, TXD_CALLUSRFNC, 0, "form_1	Ｃ言語ソ\ース編集");
	TXD_cstSetPfxKey( txd, CT|KA_J     , KA_2, TXD_CALLUSRFNC, 0, "form_2	原稿整理／編集(19)");
#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		EdiUsr_saveFunc( char *edi, char *fn )
{
	return (NORMAL);
}

/*************************************************************************
*	編集を終了するときに呼ばれる
*************************************************************************/

int		EdiUsr_quitFunc( char *edi )
{
	return (NORMAL);
}

/*************************************************************************
*	イベント処理関数
*************************************************************************/

int		ediUsr_evtFunc( int evtNo, char *sbj )
{
	return	EDI_cmdJump( GET_EVTSBJ_PTR(sbj), evtNo );
}

/*************************************************************************
*	新規にファイルオープンしたときに呼び出される
*************************************************************************/

int		EdiUsr_setPathname( char *edi, char *pn )
{
	return (NORMAL);
}

int		EDI_menu_1( char *edi, int x, int y )
{
	int			ret;
	char		*mnu;
	char		*obj;
	char		*func;

	func = "ediUsr_evtFunc";
	obj = MNU_alloc(11);
#ifndef	_MSG_JPN
	MNU_setObj(obj, 0, MNU_NOR, 'O', "File Open"      ,	NULL, EDICMD_FILEOPEN    ,func, edi );
	MNU_setObj(obj, 1, MNU_NOR, 'C', "File Close"     ,	NULL, EDICMD_FILECLOSE   ,func, edi );
	MNU_setObj(obj, 2, MNU_BLK,  0,   NULL            ,	NULL, 0,                  NULL, NULL);
	MNU_setObj(obj, 3, MNU_NOR, 'W', "Write file"     ,	NULL, EDICMD_FILEWRITE   ,func, edi );
	MNU_setObj(obj, 4, MNU_NOR, 'R', "Read file"      ,	NULL, EDICMD_FILEREAD    ,func, edi );
	MNU_setObj(obj, 5, MNU_NOR, 'U', "Update file"    ,	NULL, EDICMD_FILEUPDATE  ,func, edi );
	MNU_setObj(obj, 6, MNU_NOR, 'F', "Change Filename",	NULL, EDICMD_CHANGENAME  ,func, edi );
	MNU_setObj(obj, 7, MNU_NOR, 'E', "Edit original"  ,	NULL, EDICMD_EDITORIGINAL,func, edi );
	MNU_setObj(obj, 8, MNU_BLK,  0,   NULL            ,	NULL, 0,                  NULL, NULL);
	MNU_setObj(obj, 9, MNU_NOR, 'P', "UPdate all"     ,	NULL, EDICMD_UPDATEALL   ,func, edi );
	MNU_setObj(obj,10, MNU_NOR, 'N', "New window"     ,	NULL, EDICMD_NEWWINDOW   ,func, edi );
	mnu = MNU_open( x, y, MNUATT_EXIT, obj, "MENU1 (FILE)" );
#else
	MNU_setObj(obj, 0, MNU_NOR, 'O', "ファイルを開く",					NULL, EDICMD_FILEOPEN    ,func, edi );
	MNU_setObj(obj, 1, MNU_NOR, 'C', "ファイルを閉じる",				NULL, EDICMD_FILECLOSE   ,func, edi );
	MNU_setObj(obj, 2, MNU_BLK,  0,   NULL,								NULL, 0,                  NULL, NULL);
	MNU_setObj(obj, 3, MNU_NOR, 'W', "編集ファイルの書出",				NULL, EDICMD_FILEWRITE   ,func, edi );
	MNU_setObj(obj, 4, MNU_NOR, 'R', "別ファイルの読込",				NULL, EDICMD_FILEREAD    ,func, edi );
	MNU_setObj(obj, 5, MNU_NOR, 'U', "編集ファイルの更新（保存）",		NULL, EDICMD_FILEUPDATE  ,func, edi );
	MNU_setObj(obj, 6, MNU_NOR, 'F', "ファイル名の変更",				NULL, EDICMD_CHANGENAME  ,func, edi );
	MNU_setObj(obj, 7, MNU_NOR, 'E', "ｵﾘｼﾞﾅﾙ･ﾌｧｲﾙ読込（再編集）",		NULL, EDICMD_EDITORIGINAL,func, edi );
	MNU_setObj(obj, 8, MNU_BLK,  0,   NULL,								NULL, 0,                  NULL, NULL);
	MNU_setObj(obj, 9, MNU_NOR, 'P', "全編集ファイルを更新（保存）",	NULL, EDICMD_UPDATEALL   ,func, edi );
	MNU_setObj(obj,10, MNU_NOR, 'N', "新しい編集ファイルを開く",		NULL, EDICMD_NEWWINDOW   ,func, edi );
	mnu = MNU_open( x, y, MNUATT_EXIT, obj, "メニュー１（ファイル）" );
#endif

	ret = MNU_start ( mnu );
	MNU_close(mnu);
	MNU_free(obj);

	return (ret);
}

/*************************************************************************
*	指定行に飛ぶ
*************************************************************************/

int		edi_evt_jump( int evtNo, char *sbj )
{
	char	*edi;
	char	*txd;
	char	*dlg;
	int		ret, ln;
	char	buf[16];

	edi = GET_EVTSBJ_PTR(sbj);
	dlg = DLG_getsOpen( DLGPOS_MOS_SET_HOME, DLGPOS_MOS_SET_HOME, 320,
#ifndef	_MSG_JPN
	    "Input line number ?"
#else
	    "行番号を入力してください。"
#endif
	  );
	DLG_getsSetTitle( dlg, "JUMP" );
	buf[0] = '\0';
	ret = DLG_getsStart( dlg, 15, buf );
	if ( ret > 0 && (ln = atoi(buf)) > 0 )
	{
		txd = EDI_TXDPTR(edi);
		TXD_jumpLine( txd, ln - 1 );
	}
	DLG_getsClose(dlg);
	return (0);
}

/*************************************************************************
*	カットバッファを置換検索パターンに
*************************************************************************/

int		_ediSetRplPtn( int evtNo, char *sbj )
{
	char	*edi;
	char	*txd;
	char	buf[256];

	edi = GET_EVTSBJ_PTR(sbj);
	txd = EDI_TXDPTR(edi);
	memset( buf, 0, 256);
	if ( TXD_getCutBuf(txd,buf,256) >= 0 )
		TXD_setReplacePtn( txd, buf );

	return (evtNo);
}

/*************************************************************************
*	カットバッファを置換文字列に
*************************************************************************/

int		_ediSetRplStr( int evtNo, char *sbj )
{
	char	*edi;	/* EDI_T	*/
	char	*txd;	/* TXD_T	*/
	char	buf[256];

	edi = GET_EVTSBJ_PTR(sbj);
	txd = EDI_TXDPTR(edi);
	memset( buf, 0, 256);
	if ( TXD_getCutBuf(txd,buf,256) >= 0 )
		TXD_setReplaceStr( txd, buf );

	return (evtNo);
}

/*************************************************************************
*	カットバッファを検索パターンに
*************************************************************************/

int		_ediSetSearch( int evtNo, char *sbj )
{
	char	*edi;
	char	*txd;
	int		len;
	char	buf[256];

	edi = GET_EVTSBJ_PTR(sbj);
	txd = EDI_TXDPTR(edi);
	if ( (len = TXD_getCutBuf(txd,buf,256)) >= 0 )
		TXD_setSearchPtn( txd, buf, len );

	return (evtNo);
}

/*************************************************************************
*	[MENU2]
*************************************************************************/

int		EDI_menu_2( char *edi, int x, int y )
{
	int			ret;
	char		*mnu;	/* MNU_T	*/
	char		*obj;	/* MNUOBJ_T	*/

	obj = MNU_alloc(13);
#ifndef	_MSG_JPN
	MNU_setObj(obj, 0, MNU_NOR, 'F', "Find & jump",         NULL, TXD_SEARCHALL     , NULL, edi );
	MNU_setObj(obj, 1, MNU_NOR, 'S', "Search",              NULL, EDICMD_SEARCH     , NULL, edi );
	MNU_setObj(obj, 2, MNU_NOR, 'R', "Replace",             NULL, EDICMD_REPLACE    , NULL, edi );
	MNU_setObj(obj, 3, MNU_NOR, 'A', "Multi replace All",   NULL, TXD_MREPLACE      , NULL, edi );
	MNU_setObj(obj, 4, MNU_NOR, '1', "Set repalce pattern", NULL, 0,       "_ediSetRplPtn", edi );
	MNU_setObj(obj, 5, MNU_NOR, '2', "Set repalce strings", NULL, 0,       "_ediSetRplStr", edi );
	MNU_setObj(obj, 6, MNU_NOR, '3', "Set search pattern",  NULL, 0,       "_ediSetSearch", edi );
	MNU_setObj(obj, 7, MNU_BLK,  0,   NULL,                 NULL, 0,                NULL, NULL);
	MNU_setObj(obj, 8, MNU_NOR, 'J', "Jump",				NULL, 0, "edi_evt_jump"     , edi );
	MNU_setObj(obj, 9, MNU_NOR, 'T', "Top of text",			NULL, EDICMD_TOPOFTEXT  , NULL, edi );
	MNU_setObj(obj,10, MNU_NOR, 'B', "Bottom of text",		NULL, EDICMD_LASTOFTEXT , NULL, edi );
	MNU_setObj(obj,11, MNU_NOR, 'L', "Last touch",			NULL, EDICMD_LASTTOUCH  , NULL, edi );
	MNU_setObj(obj,12, MNU_NOR, 'M', "Mark",				NULL, EDICMD_MARK       , NULL, edi );
	mnu = MNU_open( x, y, MNUATT_EXIT, obj, "MENU2 (EDIT)" );
#else
	MNU_setObj(obj, 0, MNU_NOR, 'F', "全検索（一覧表示）"           , NULL, TXD_SEARCHALL     , NULL, edi );
	MNU_setObj(obj, 1, MNU_NOR, 'S', "検索"                         , NULL, EDICMD_SEARCH     , NULL, edi );
	MNU_setObj(obj, 2, MNU_NOR, 'R', "置換"                         , NULL, EDICMD_REPLACE    , NULL, edi );
	MNU_setObj(obj, 3, MNU_NOR, 'A', "複数ﾊﾟﾀｰﾝの一括置換"          , NULL, TXD_MREPLACE      , NULL, edi );
	MNU_setObj(obj, 4, MNU_NOR, '1', "ｶｯﾄﾊﾞｯﾌｧを置換検索ﾊﾟﾀｰﾝに転送", NULL, 0,       "_ediSetRplPtn", edi );
	MNU_setObj(obj, 5, MNU_NOR, '2', "ｶｯﾄﾊﾞｯﾌｧを置換文字列に転送"   , NULL, 0,       "_ediSetRplStr", edi );
	MNU_setObj(obj, 6, MNU_NOR, '3', "ｶｯﾄﾊﾞｯﾌｧを検索ﾊﾟﾀｰﾝに転送"    , NULL, 0,       "_ediSetSearch", edi );
	MNU_setObj(obj, 7, MNU_BLK,  0,   NULL                          , NULL, 0,                NULL, NULL);
	MNU_setObj(obj, 8, MNU_NOR, 'J', "指定行番号に移動"             , NULL, 0, "edi_evt_jump"     , edi );
	MNU_setObj(obj, 9, MNU_NOR, 'T', "テキストの先頭に移動"         , NULL, EDICMD_TOPOFTEXT  , NULL, edi );
	MNU_setObj(obj,10, MNU_NOR, 'B', "テキストの最後に移動"         , NULL, EDICMD_LASTOFTEXT , NULL, edi );
	MNU_setObj(obj,11, MNU_NOR, 'L', "最後に変更があった場所に移動" , NULL, EDICMD_LASTTOUCH  , NULL, edi );
	MNU_setObj(obj,12, MNU_NOR, 'M', "マーク＆ジャンプ"             , NULL, EDICMD_MARK       , NULL, edi );
	mnu = MNU_open( x, y, MNUATT_EXIT, obj, "メニュー２（編集･移動）" );
#endif

	ret = MNU_start ( mnu );
	MNU_close(mnu);
	MNU_free(obj);

	if ( ret > 0 )
		return EDI_cmdJump(edi,ret);
	else
		return (ret);
}

/*************************************************************************
*	[MENU3]
*************************************************************************/

int		EDI_menu_3( char *edi, int x, int y )
{
	int			ret;
	char		*mnu;	/* MNU_T	*/
	char		*obj;	/* MNUOBJ_T	*/
	char		*txd;
	int			md;
	unsigned	u[4];
	char		undoMsg[80], redoMsg[80];

	txd = EDI_TXDPTR(edi);

	obj = MNU_alloc(12);
	if ( TXD_getUndoInfo( txd, u ) == NORMAL && u[3] > 0 )
	{
		md = MNU_NOR;
#ifndef	_MSG_JPN
		sprintf( undoMsg, "Undo (%4d)", u[3] );
#else
		sprintf( undoMsg, "撤回       (%4d)", u[3] );
#endif
	} else
	{
		md = MNU_NOR | MNU_IGN;
#ifndef	_MSG_JPN
		strcpy( undoMsg, "Undo");
#else
		strcpy( undoMsg, "撤回");
#endif
	}
	MNU_setObj(obj, 0, md, 'U', undoMsg , NULL, TXD_UNDO, NULL, edi );

	if ( TXD_getRedoInfo( txd, u ) == NORMAL && u[3] > 0 )
	{
		md = MNU_NOR;
#ifndef	_MSG_JPN
		sprintf( redoMsg, "Redo (%4d)", u[3] );
#else
		sprintf( redoMsg, "撤回の撤回 (%4d)", u[3] );
#endif
	} else
	{
		md = MNU_NOR | MNU_IGN;
#ifndef	_MSG_JPN
		strcpy( redoMsg, "Redo");
#else
		strcpy( redoMsg, "撤回の撤回");
#endif
	}
	MNU_setObj(obj, 1, md, 'R', redoMsg, NULL, TXD_REDO, NULL, edi );

	MNU_setObj(obj, 2, MNU_BLK,  0,   NULL,                 NULL, 0                 , NULL, NULL);

#ifndef	_MSG_JPN
	MNU_setObj(obj, 3, MNU_NOR, '1', "Split 1 left/right",	NULL, EDICMD_SPLIT_1,   NULL, edi );
	MNU_setObj(obj, 4, MNU_NOR, '2', "Split 2 up/down",		NULL, EDICMD_SPLIT_2,   NULL, edi );
	MNU_setObj(obj, 5, MNU_BLK,  0,   NULL,					NULL, 0,                NULL, NULL);
	MNU_setObj(obj, 6, MNU_NOR, 'P', "Print CUT-BUFFER",	NULL, EDICMD_PRINTCBUF, NULL, edi );
	MNU_setObj(obj, 7, MNU_NOR, 'T', "Text printout",		NULL, EDICMD_PRINTOUT , NULL, edi );
	MNU_setObj(obj, 8, MNU_BLK,  0,   NULL,					NULL, 0,                NULL, NULL);
	MNU_setObj(obj, 9, MNU_NOR, 'C', "Calculator",			NULL, EDICMD_CALC,      NULL, edi );
	MNU_setObj(obj,10, MNU_NOR, 'A', "Ascii code list",		NULL, EDICMD_ASCIICODE, NULL, edi );
	MNU_setObj(obj,11, MNU_NOR, 'K', "Kanji code list",		NULL, EDICMD_KANJICODE, NULL, edi );
	mnu = MNU_open( x, y, MNUATT_EXIT, obj, "MENU3 (UTILITY)" );
#else
	MNU_setObj(obj, 3, MNU_NOR, '1', "画面分割（左右）"    , NULL, EDICMD_SPLIT_1,   NULL, edi );
	MNU_setObj(obj, 4, MNU_NOR, '2', "画面分割（上下）"    , NULL, EDICMD_SPLIT_2,   NULL, edi );
	MNU_setObj(obj, 5, MNU_BLK,  0,   NULL                 , NULL, 0,                NULL, NULL);
	MNU_setObj(obj, 6, MNU_NOR, 'P', "ｶｯﾄﾊﾞｯﾌｧの内容を表示", NULL, EDICMD_PRINTCBUF, NULL, edi );
	MNU_setObj(obj, 7, MNU_NOR, 'T', "印字"                , NULL, EDICMD_PRINTOUT , NULL, edi );
	MNU_setObj(obj, 8, MNU_BLK,  0,   NULL                 , NULL, 0,                NULL, NULL);
	MNU_setObj(obj, 9, MNU_NOR, 'C', "数式計算"            , NULL, EDICMD_CALC,      NULL, edi );
	MNU_setObj(obj,10, MNU_NOR, 'A', "アスキーコード一覧"  , NULL, EDICMD_ASCIICODE, NULL, edi );
	MNU_setObj(obj,11, MNU_NOR, 'K', "漢字コード一覧"      , NULL, EDICMD_KANJICODE, NULL, edi );
	mnu = MNU_open( x, y, MNUATT_EXIT, obj, "メニュー３（ﾕｰﾃｨﾘﾃｨ）" );
#endif

	ret = MNU_start ( mnu );
	MNU_close(mnu);
	MNU_free(obj);

	if ( ret > 0 )
		return EDI_cmdJump(edi,ret);
	else
		return (ret);
}


#define	EDI_KST_SNAM	".kst"
#define	EDI_KST_WILD	"*.kst"

int		_ediSaveSetup( int evtNo, char *sbj )
{
	char	*edi;
	char	*txd;
	char	*fdl;
	int		ret;
	char	tmp[128], *fn;

	edi = GET_EVTSBJ_PTR(sbj);
	txd = EDI_TXDPTR(edi);

	if ( (fdl = FDL_open(0)) == NULL )
		return (ERR);
	FDL_set_title( fdl,"SAVE SETUP");
	FDL_set_wildcard( fdl, EDI_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, EDI_KST_SNAM );
	EDI_saveKeySetup(edi,tmp);
	FDL_close(fdl);

	return (NORMAL);
}


int		_ediLoadSetup( int evtNo, char *sbj )
{
	char	*edi;
	char	*txd;
	char	*fdl;
	int		ret;
	char	tmp[128], *fn;

	edi = GET_EVTSBJ_PTR(sbj);
	txd = EDI_TXDPTR(edi);

	if ( (fdl = FDL_open(0)) == NULL )
		return (ERR);
	FDL_set_title( fdl,"LOAD SETUP");
	FDL_set_wildcard( fdl, EDI_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, EDI_KST_SNAM );
	EDI_loadKeySetup(edi,tmp);
	FDL_close(fdl);

	return (NORMAL);
}

int		_ediCallCCI( int evtNo, char *sbj )
{
	char	*edi;
	char	*pn;

	edi = GET_EVTSBJ_PTR(sbj);
	pn = EdiGet_pn(edi);		/* 編集ファイル名の取得	*/
	cci_call_menu(pn);

	return (NORMAL);
}

int		_ediCallHE386( int evtNo, char *sbj )
{
	char	*edi;
	char	*pn;

	edi = GET_EVTSBJ_PTR(sbj);
	pn = EdiGet_pn(edi);		/* 編集ファイル名の取得	*/
	he386_menu( pn );

	return (NORMAL);
}

int		_ediCallGSPLAY( int evtNo, char *sbj )
{
	AplDtaInit();						/* DTA 領域の設定	*/
	AplPclExec( "GSPLAY.EXP",  7 );		/* GSPLAYの起動		*/

	return (NORMAL);
}

int		_ediCallExpPath( int evtNo, char *sbj )
{
	CCI_setExpSearchPath();
	return (NORMAL);
}

/*************************************************************************
*	[MENU4]
*************************************************************************/

int		EDI_menu_4( char *edi, int x, int y )
{
	int			ret;
	char		*mnu;
	char		*obj;

	obj = MNU_alloc(10);
#ifndef	_MSG_JPN
	MNU_setObj(obj, 0, MNU_NOR, 'A', "Alphabet buffer"    , NULL, EDICMD_ALBUF_MENU   , NULL, edi );
	MNU_setObj(obj, 1, MNU_NOR, 'K', "Key customize"      , NULL, EDICMD_KEYCUSTOMIZE , NULL, edi );
	MNU_setObj(obj, 2, MNU_NOR, 'S', "Save key setup data", NULL, 0, "_ediSaveSetup"  , edi );
	MNU_setObj(obj, 3, MNU_NOR, 'L', "Load key setup data", NULL, 0, "_ediLoadSetup"  , edi );
	MNU_setObj(obj, 4, MNU_BLK,  0 , NULL                 , NULL, 0, NULL             , NULL);
	MNU_setObj(obj, 5, MNU_NOR, 'C', "CCI"                , NULL, 0, "_ediCallCCI"    , edi );
	MNU_setObj(obj, 6, MNU_NOR, 'M', "MML Compile"        , NULL, 0, "_ediCallHE386"  , edi );
	MNU_setObj(obj, 7, MNU_NOR, 'G', "GSPLAY"             , NULL, 0, "_ediCallGSPLAY" , edi );
	MNU_setObj(obj, 8, MNU_BLK,  0 , NULL                 , NULL, 0, NULL             , NULL);
	MNU_setObj(obj, 9, MNU_NOR, 'P', "EXP search path"    , NULL, 0, "_ediCallExpPath", edi );
	mnu = MNU_open( x, y, MNUATT_EXIT, obj, "MENU4 (OTHER)" );
#else
	MNU_setObj(obj, 0, MNU_NOR, 'A', "英字バッファ"         , NULL, EDICMD_ALBUF_MENU   , NULL, edi );
	MNU_setObj(obj, 1, MNU_NOR, 'K', "キーカスタマイズ"     , NULL, EDICMD_KEYCUSTOMIZE , NULL, edi );
	MNU_setObj(obj, 2, MNU_NOR, 'S', "ｷｰ･ｶｽﾀﾏｲｽﾞ･ﾃﾞｰﾀの保存", NULL, 0, "_ediSaveSetup"  , edi );
	MNU_setObj(obj, 3, MNU_NOR, 'L', "ｷｰ･ｶｽﾀﾏｲｽﾞ･ﾃﾞｰﾀの読込", NULL, 0, "_ediLoadSetup"  , edi );
	MNU_setObj(obj, 4, MNU_BLK,  0 , NULL                   , NULL, 0, NULL             , NULL);
	MNU_setObj(obj, 5, MNU_NOR, 'C', "CCI"                  , NULL, 0, "_ediCallCCI"    , edi );
	MNU_setObj(obj, 6, MNU_NOR, 'M', "MML コンパイラ"       , NULL, 0, "_ediCallHE386"  , edi );
	MNU_setObj(obj, 7, MNU_NOR, 'G', "GSPLAY"               , NULL, 0, "_ediCallGSPLAY" , edi );
	MNU_setObj(obj, 8, MNU_BLK,  0 , NULL                   , NULL, 0, NULL             , NULL);
	MNU_setObj(obj, 9, MNU_NOR, 'P', "EXPﾌﾟﾛｸﾞﾗﾑ検索ﾊﾟｽ設定", NULL, 0, "_ediCallExpPath", edi );
	mnu = MNU_open( x, y, MNUATT_EXIT, obj, "メニュー４（その他）" );
#endif

	ret = MNU_start ( mnu );
	MNU_close(mnu);
	MNU_free(obj);

	if ( ret > 0 )
		return EDI_cmdJump(edi,ret);
	else
		return (ret);
}


int		EDI_menu_5( char *edi )	{	return (ERR); }
int		EDI_menu_6( char *edi )	{	return (ERR); }
int		EDI_menu_7( char *edi )	{	return (ERR); }
int		EDI_menu_8( char *edi )	{	return (ERR); }

int		_ediSaveColTbl( int evtNo, char *sbj )	/* カラーテーブルの保存	*/
{
	char	*edi;
	char	*txd;

	edi = GET_EVTSBJ_PTR(sbj);
	txd = EDI_TXDPTR(edi);
	TxdUsr_saveColTbl( txd );
	return (NORMAL);
}

/*************************************************************************
*	[SETUP2]
*************************************************************************/

int		EDI_setup2( char *edi )
{
	int			ret;
	char		*mnu;
	char		*obj;

	obj = MNU_alloc(2);
#ifndef	_MSG_JPN
	MNU_setObj(obj, 0, MNU_NOR, 'C' , "Change color table",	NULL, EDICMD_CHGCOLOR , NULL            , edi );
	MNU_setObj(obj, 1, MNU_NOR, 'S' , "Save color table"  ,	NULL, 0               , "_ediSaveColTbl", edi );
	mnu = MNU_open( DLGPOS_MOS_SET_CENTER, DLGPOS_MOS_SET_CENTER,
	    MNUATT_EXIT, obj, "SETUP2" );
#else
	MNU_setObj(obj, 0, MNU_NOR, 'C' , "カラーテーブルの変更", NULL, EDICMD_CHGCOLOR , NULL            , edi );
	MNU_setObj(obj, 1, MNU_NOR, 'S' , "カラーテーブルの保存" , NULL, 0               , "_ediSaveColTbl", edi );
	mnu = MNU_open( DLGPOS_MOS_SET_CENTER, DLGPOS_MOS_SET_CENTER,
	    MNUATT_EXIT, obj, "設定２" );
#endif

	ret = MNU_start( mnu );
	MNU_close(mnu);
	MNU_free(obj);

	if ( ret > 0 )
		return EDI_cmdJump(edi,ret);
	else
		return (ret);
}

/*************************************************************************
*	カーソル位置の位置単語をカットバッファに格納
*************************************************************************/

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];
	unsigned	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_form_1( char *txd )
{
	char	*edi;

	edi = TxdGet_ptr(txd);
	EdiSet_marginAdjust(edi,0);

	TxdSet_linDspFlag(txd,0);	/* 行番号OFF		*/
	TxdSet_linDspMode(txd,1);	/* 論理行			*/
	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);
}

/*************************************************************************
*	原稿モード
*************************************************************************/

int		TxdUsr_form_2( char *txd )
{
	char	*edi;

	edi = TxdGet_ptr(txd);
	EdiSet_marginAdjust(edi,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);
}

#ifdef	_ESC_MARK_JUMP
int TxdUsr_jump_mark_0( UINT txd ){ UINT edi; edi = TxdGet_ptr(txd); return EDI_markJump(edi,0);}
int TxdUsr_jump_mark_1( UINT txd ){ UINT edi; edi = TxdGet_ptr(txd); return EDI_markJump(edi,1);}
int TxdUsr_jump_mark_2( UINT txd ){ UINT edi; edi = TxdGet_ptr(txd); return EDI_markJump(edi,2);}
int TxdUsr_jump_mark_3( UINT txd ){ UINT edi; edi = TxdGet_ptr(txd); return EDI_markJump(edi,3);}
int TxdUsr_jump_mark_4( UINT txd ){ UINT edi; edi = TxdGet_ptr(txd); return EDI_markJump(edi,4);}
int TxdUsr_jump_mark_5( UINT txd ){ UINT edi; edi = TxdGet_ptr(txd); return EDI_markJump(edi,5);}
int TxdUsr_jump_mark_6( UINT txd ){ UINT edi; edi = TxdGet_ptr(txd); return EDI_markJump(edi,6);}
int TxdUsr_jump_mark_7( UINT txd ){ UINT edi; edi = TxdGet_ptr(txd); return EDI_markJump(edi,7);}
int TxdUsr_jump_mark_8( UINT txd ){ UINT edi; edi = TxdGet_ptr(txd); return EDI_markJump(edi,8);}
int TxdUsr_jump_mark_9( UINT txd ){ UINT edi; edi = TxdGet_ptr(txd); return EDI_markJump(edi,9);}
#endif


#include	"edimml.cci"
#include	"ediwhlp.cci"
#include	"editmp.cci"
