/*************************************************************************
*	テキスト整形ツールXTR
*************************************************************************/

#ifndef	TXD_CUTBUF_MODE_NORMAL
#	define	TXD_CUTBUF_MODE_NORMAL	(0)
#	define	TXD_CUTBUF_MODE_LINE	(1)	/* 行選択モード		*/
#	define	TXD_CUTBUF_MODE_RECT	(2)	/* 矩形選択モード	*/
#endif

char	*MACROKEY_XTR_TRANS_OPTION = "Xtr_transOption";
char	*MACROKEY_XTR_TRANS_SETUP  = "Xtr_transSetup";
char	*MACROKEY_XTR_PRINT_OPTION = "Xtr_printOption";
char	*MACROKEY_XTR_PRINT_SETUP  = "Xtr_printSetup";

int		_xtr_chkCmd( char *cmd )
{
	if ( strlen(cmd) < 127 )
		return (NORMAL);
	DLG_tmpMsgBox( DLGPOS_MOS_SET_CENTER, DLGPOS_MOS_SET_CENTER,
	    C_MBLACK, C_DLGBASE, COLMIX(C_TIMEBOX,C_GRAY),
	    "    コマンドが長すぎます。  " );
	return (ERR);
}

int		_xtr_setTransOption()
{
	int		ret;
	char	*p;
	char	*dlg;
	char	buf[80];

	if ( (p = AMAC_getName( SysMacro, MACROKEY_XTR_TRANS_OPTION)) == NULL )
	{
		p = "";
		AMAC_setKey( SysMacro, MACROKEY_XTR_TRANS_OPTION, p );
	}

	dlg = DLG_getsOpen( DLGPOS_MOS_SET_HOME, DLGPOS_MOS_SET_HOME, 320,
	    "整形時のコマンドを入力してください。");
	DLG_getsSetTitle( dlg, "XTR TRANSFORM OPTION" );
	strcpy(buf,p);
	ret = DLG_getsStart( dlg, 79, buf );
	if ( ret > 0 )
	{
		AMAC_setKey( SysMacro, MACROKEY_XTR_TRANS_OPTION, buf );
	}
	DLG_getsClose(dlg);
	return (NORMAL);
}

int		_xtr_setTransSetup()
{
	int		ret;
	char	*p;
	char	*dlg;
	char	buf[128];

	if ( (p = AMAC_getName( SysMacro, MACROKEY_XTR_TRANS_SETUP)) == NULL )
		p = "";

	dlg = DLG_getsOpen( DLGPOS_MOS_SET_HOME, DLGPOS_MOS_SET_HOME, 320,
	    "整形時の設定ファイル名を入力してください。");
	DLG_getsSetTitle( dlg, "XTR TRANSFORM SETUP FILE" );
	strcpy(buf,p);
	ret = DLG_getsStart( dlg, 127, buf );
	if ( ret > 0 )
	{
		AMAC_setKey( SysMacro, MACROKEY_XTR_TRANS_SETUP, buf );
	}
	DLG_getsClose(dlg);
	return (NORMAL);
}

/*************************************************************************
*	テキスト整形の実行
*************************************************************************/

int		TxdUsr_xtr_transform( char *txd )
{
	int			ret, mode, saveEofRead;
	size_t		len;
	char		*opt, *fnSetup;
	char		*pathtmp, pathsrc[256], pathdst[256], tmp[256];
	char		cmd[1024];

	if ( TxdGet_editIgnore(txd) || TxdGet_writeIgnore(txd) )
		return (ERR);	/* 書き換え禁止	*/

	DSP_writePage(1);
	if ( (pathtmp = getenv("TMP")) == NULL )
		pathtmp = "./";	/* カレント	*/
	len = strlen(pathtmp);
	if ( len > 0 && FS_isdelim(pathtmp[len-1]) == 0 )
	{
		sprintf( tmp,"%s/$xtrtmp.)1(", pathtmp );	FS_unix2dos(pathsrc,tmp);
		sprintf( tmp,"%s/$xtrtmp.)2(", pathtmp );	FS_unix2dos(pathdst,tmp);
	} else
	{
		sprintf( tmp,"%s$xtrtmp.)1(", pathtmp );	FS_unix2dos(pathsrc,tmp);
		sprintf( tmp,"%s$xtrtmp.)2(", pathtmp );	FS_unix2dos(pathdst,tmp);
	}

	if ( TxdGet_selFlag(txd) )
	{	/* 選択範囲が対象	*/
		if ( TxdGet_selMode(txd) == TXD_CUTBUF_MODE_RECT )
			return (ERR);	/* 矩形モードはサポートしない	*/
		mode = 1;
		if ( TXD_cutSave( txd, pathsrc, 0 ) )
			return (ERR);
	} else
	{	/* 全テキスト範囲が対象	*/
		mode = 0;
		if ( TXD_saveFile2(txd,pathsrc,0) )
			return (ERR);
	}

	/* オプションパラメータ	--------------------------------------------*/
	if ( (opt = AMAC_getName( SysMacro, MACROKEY_XTR_TRANS_OPTION)) == NULL )
		opt = "";

	/* 設定ファイル名		--------------------------------------------*/
	if ( (fnSetup = AMAC_getName( SysMacro, MACROKEY_XTR_TRANS_SETUP)) != NULL )
	{
		if ( *fnSetup == '\0' )
			fnSetup = NULL;
	}

	/* xtr の実行	----------------------------------------------------*/
	if ( fnSetup )
	{
		FS_unix2dos(tmp,fnSetup);
		sprintf(cmd,"xtr @%s %s -o=%s %s", tmp, opt, pathdst, pathsrc);
	} else
		sprintf(cmd,"xtr %s -o=%s %s", opt, pathdst, pathsrc);
	if ( _xtr_chkCmd( cmd ) )
		return (ERR);
	ret = MNU_sure ( DLGPOS_CENTER_OF_SCN, DLGPOS_CENTER_OF_SCN, 
	    C_MBLACK, C_DLGBASE, COLMIX(C_INFO,C_GRAY), SELBTN_ATT_LEFT,
	"%10s  XTR によるテキスト整形を行います。%10s\n%s", "","",cmd );
	if ( ret != MENU_SURE_OK )
		return (ERR);
	cci_system("XTR TRANSFORM", cmd);

	saveEofRead = TxdGet_eofRead(txd);
	TxdSet_eofRead(txd,FALSE);
	if ( mode )
	{
		TXD_cmdJump(txd,TXD_CUTDEL);	/* 選択範囲を削除		*/
		TXD_includeFile2(txd,pathdst,0);	/* 他ファイル取り込み	*/
	} else
	{	/* テキスト全体	*/
		TXD_clearBuffer(txd);
		TXD_readFile2(txd,pathdst,0);
	}
	TxdSet_eofRead(txd,saveEofRead);
	TXD_scnFlush(txd);	/* 画面再描画	*/

	return (0);
}

int		_xtr_setPrintOption()
{
	int		ret;
	char	*p;
	char	*dlg;
	char	buf[80];

	if ( (p = AMAC_getName( SysMacro, MACROKEY_XTR_PRINT_OPTION)) == NULL )
	{
		p = "";
		AMAC_setKey( SysMacro, MACROKEY_XTR_PRINT_OPTION, p );
	}

	dlg = DLG_getsOpen( DLGPOS_MOS_SET_HOME, DLGPOS_MOS_SET_HOME, 320,
	    "印刷時のコマンドを入力してください。");
	DLG_getsSetTitle( dlg, "XTR PRINTOUT OPTION" );
	strcpy(buf,p);
	ret = DLG_getsStart( dlg, 79, buf );
	if ( ret > 0 )
	{
		AMAC_setKey( SysMacro, MACROKEY_XTR_PRINT_OPTION, buf );
	}
	DLG_getsClose(dlg);
	return (NORMAL);
}

int		_xtr_setPrintSetup()
{
	int		ret;
	char	*p;
	char	*dlg;
	char	buf[128];

	if ( (p = AMAC_getName( SysMacro, MACROKEY_XTR_PRINT_SETUP)) == NULL )
		p = "";

	dlg = DLG_getsOpen( DLGPOS_MOS_SET_HOME, DLGPOS_MOS_SET_HOME, 320,
	                    "印刷時の設定ファイル名を入力してください。");
	DLG_getsSetTitle( dlg, "XTR PRINTOUT SETUP FILE" );
	strcpy(buf,p);
	ret = DLG_getsStart( dlg, 127, buf );
	if ( ret > 0 )
	{
		AMAC_setKey( SysMacro, MACROKEY_XTR_PRINT_SETUP, buf );
	}
	DLG_getsClose(dlg);
	return (NORMAL);
}

/*************************************************************************
*	テキスト整形／印刷
*************************************************************************/

int		TxdUsr_xtr_printout( char *txd )
{
	int			ret, mode;
	size_t		len;
	char		*opt, *fnSetup;
	char		*pathtmp, pathsrc[256], pathdst[256], tmp[256];
	char		cmd[1024];

	DSP_writePage(1);
	if ( (pathtmp = getenv("TMP")) == NULL )
		pathtmp = "./";	/* カレント	*/
	len = strlen(pathtmp);
	if ( len > 0 && FS_isdelim(pathtmp[len-1]) == 0 )
	{
		sprintf( tmp,"%s/$xtrtmp.)1(", pathtmp );	FS_unix2dos(pathsrc,tmp);
		sprintf( tmp,"%s/$xtrtmp.)2(", pathtmp );	FS_unix2dos(pathdst,tmp);
	} else
	{
		sprintf( tmp,"%s$xtrtmp.)1(", pathtmp );	FS_unix2dos(pathsrc,tmp);
		sprintf( tmp,"%s$xtrtmp.)2(", pathtmp );	FS_unix2dos(pathdst,tmp);
	}

	if ( TxdGet_selFlag(txd) )
	{	/* 選択範囲が対象	*/
		if ( TxdGet_selMode(txd) == TXD_CUTBUF_MODE_RECT )
			return (ERR);	/* 矩形モードはサポートしない	*/
		mode = 1;
		if ( TXD_cutSave( txd, pathsrc, 0 ) )
			return (ERR);
	} else
	{	/* 全テキスト範囲が対象	*/
		mode = 0;
		if ( TXD_saveFile2(txd,pathsrc,0) )
			return (ERR);
	}

	/* オプションパラメータ	--------------------------------------------*/
	if ( (opt = AMAC_getName( SysMacro, MACROKEY_XTR_PRINT_OPTION)) == NULL )
		opt = "";

	/* 設定ファイル名		--------------------------------------------*/
	if ( (fnSetup = AMAC_getName( SysMacro, MACROKEY_XTR_PRINT_SETUP)) != NULL )
	{
		if ( *fnSetup == '\0' )
			fnSetup = NULL;
	}

	/* xtr の実行	----------------------------------------------------*/
	if ( fnSetup )
	{
		FS_unix2dos(tmp,fnSetup);
		sprintf(cmd,"xtr @%s %s -o=prn %s", tmp, opt, pathsrc);
	} else
		sprintf(cmd,"xtr %s -o=prn %s", opt, pathsrc);
	if ( _xtr_chkCmd( cmd ) )
		return (ERR);
	ret = MNU_sure ( DLGPOS_CENTER_OF_SCN, DLGPOS_CENTER_OF_SCN, 
	    C_MBLACK, C_DLGBASE, COLMIX(C_INFO,C_GRAY), SELBTN_ATT_LEFT,
	    "%10s  XTR による印刷を行います。%10s\n%s", "","",cmd );
	if ( ret != MENU_SURE_OK )
		return (ERR);
	cci_system("XTR PRINTOUT", cmd);

	return (0);
}

/*************************************************************************
*	XTR サポートメニュー
*************************************************************************/

int		TxdUsr_xtr_menu( char *txd )
{
	int			ret, len;
	char		*mnu;
	char		*obj;
	char		tmp[128], *p, *msgXtr, *msgPr, msgTS[256], msgPS[256];
	int			mnuXtr;

	DSP_writePage(1);
	mnu = NULL;
	obj = NULL;
	for(;;)
	{
		if ( obj == NULL )
			obj = MNU_alloc(7);

		if ( TxdGet_editIgnore(txd) || TxdGet_writeIgnore(txd) )
			mnuXtr = MNU_NOR | MNU_IGN;
		else
			mnuXtr = MNU_NOR;
		if ( TxdGet_selFlag(txd) )
		{
			msgXtr = "Transform (part)";
			msgPr  = "Printout  (part)";
		} else
		{
			msgXtr = "Transform (text all)";
			msgPr  = "Printout  (text all)";
		}

		strcpy(msgTS,"Transform setup file");
		if ( (p = AMAC_getName( SysMacro, MACROKEY_XTR_TRANS_SETUP)) != NULL )
		{
			if ( *p )
			{
				FS_getFnamPath(tmp,p);
				len = strlen(msgTS);
				sprintf( msgTS + len, " [%s]", tmp);
			}
		}

		strcpy(msgPS,"Printout setup file");
		if ( (p = AMAC_getName( SysMacro, MACROKEY_XTR_PRINT_SETUP)) != NULL )
		{
			if ( *p )
			{
				FS_getFnamPath(tmp,p);
				len = strlen(msgPS);
				sprintf( msgPS + len, "  [%s]", tmp);
			}
		}

		MNU_setObj(obj, 0, mnuXtr , 'T', msgXtr                   , NULL, 1, NULL, NULL );
		MNU_setObj(obj, 1, MNU_NOR, 'S', "Set Transform parameter", NULL, 2, NULL, NULL );
		MNU_setObj(obj, 2, MNU_NOR, 'F', msgTS                    , NULL, 3, NULL, NULL );
		MNU_setObj(obj, 3, MNU_BLK,  0,   NULL                    , NULL, 0, NULL, NULL );
		MNU_setObj(obj, 4, MNU_NOR, 'P', msgPr                    , NULL, 4, NULL, NULL );
		MNU_setObj(obj, 5, MNU_NOR, 'O', "Set printout parameter" , NULL, 5, NULL, NULL );
		MNU_setObj(obj, 6, MNU_STR, 'U', msgPS                    , NULL, 6, NULL, NULL );

		if ( mnu == NULL )
		{
			mnu = MNU_open( DLGPOS_MOS_SET_CENTER, DLGPOS_MOS_SET_CENTER,
			    MNUATT_EXIT, obj, "XTR MENU" );
		}
		ret = MNU_start ( mnu );

		switch ( ret )
		{
			case 1:
				TxdUsr_xtr_transform( txd );
				goto _EXIT;
			case 2:	/* 整形オプションパラメータ	*/
				_xtr_setTransOption();
				break;
			case 3:
				_xtr_setTransSetup();
				break;

			case 4:	/* 印刷	*/
				TxdUsr_xtr_printout( txd );
				goto _EXIT;
			case 5:
				_xtr_setPrintOption();
				break;
			case 6:
				_xtr_setPrintSetup();
				break;

			default:
				goto _EXIT;
		}
	}
_EXIT:
	MNU_close(mnu);
	MNU_free(obj);
	return (NORMAL);
}
