#include <stdio.h>

#include "..\include\boywin.h"


//	BOY WINDOWS 自 2.0 版本起,提供文本编缉功能,增强了信息处理能力.

//	注: 凡是注有"(保留)"字样的宏定义和变量,请用户不要改动.

#define Default                 -1
		//      当用户对 EDIT 结构中的可缺省参数进行缺省赋值时,
		//      使用 Default 即可.
		//      例如:   BOY_EDIT.TextFont = Default;
		//		BOY_EDIT.InsertStatus = Default;

#define DefaultFileName         "BOYTEXT.TXT"
		//	EDIT 结构中 EditFileName 的缺省.
#define MaxSubNumber            1024
		//	(保留)
#define SizeofArray             100
		//	(保留)  编缉缓冲区大小
#define MaxColInLine            256
		//	(保留)  编缉行最大长度
#define MaxBlockSize            16384
		//	(保留)	内部定义块的长度的最大值
#define RowSpace                0
		//	(保留)	行间距
#define ColSpace                0
		//	(保留)	列间距
#define FontHeight              16
		//	(保留)	字体高度
#define FontWidth               8
		//	(保留)	字体宽度



struct EditType{
	int  GLeft;
		//	编缉区左上角横坐标
		//		以像素点为单位,使用绝对坐标.
	int  GTop;
		//	编缉区左上角纵坐标
		//		以像素点为单位,使用绝对坐标.
	int  GRight;
		//	编缉区右下角横坐标
		//		以像素点为单位,使用绝对坐标.
	int  GBottom;
		//	编缉区右下角纵坐标
		//		以像素点为单位,使用绝对坐标.
	int  TextFont;
		//	编缉窗中文本显示字体
		//		只限 BOYWINDOWS 支持的字体
		//			16 点阵 :  	0.宋
		//					1.楷
	int  TextColor;
		//	编缉区中正文前景颜色
		//		支持 Borlandc 标准 BGI 颜色
	int  BackColor;
		//	编缉区中正文背景颜色
		//		支持 Borlandc 标准 BGI 颜色
	int  BlockTextColor;
		//	编缉区中块前景颜色
		//		支持 Borlandc 标准 BGI 颜色
	int  BlockBackColor;
		//	编缉区中块背景颜色
		//		支持 Borlandc 标准 BGI 颜色
	int  InsertStatus;
		//	编缉区编缉状态
		//              0:覆盖状态
		//		1:插入状态
	char EditFileName[MaxPath];
		//	编缉文件名,含有完整的路径和文件名 ( 注:"\\")
	int  Enable;
		//	编缉器是否能够被激活的标志位.
		//		当 Enable 为 0 时,
		//			编缉器处于不可激活状态,
		//			此时不接收任何编缉器内部的键盘
		//				和鼠标操作;
		//			但接收和处理用户从外部强行追加的
		//				编缉操作.
		//		当 Enable 为 1 时,
		//			编缉器处于可以激活状态.
		//
	int  Active;
		//	编缉器是否为激活状态的标志位.
		//		当 Active 为 0 时,
		//			编缉器处于未激活状态,
		//			等待激活消息.
		//			此时不接收任何编缉器内部的键盘
		//				和鼠标操作;
		//			但接收和处理用户从外部强行追加的
		//				编缉操作,
		//		当 Enable 为 1 时,
		//			编缉器处于激活状态.
		//
		//
	int  Index;
		//	编缉器命令索引值和返回值.
		//		索引用法:
		//			在进入编缉器内部之前,
		//			可以设置一个索引值,
		//                      索引值参见"编缉器功能索引表";
		//			当进入编缉器内部之后,
		//			在按照优先级进行完键盘和鼠标操作后,
		//			进行索引操作.
		//		返回用法:
		//			从编缉器内部返回时,
		//			将返回值保存于 Index 中,
		//			返回值参见"编缉器返回值表".

/**************以下为(保留)参数,供编缉器内部调用*******************/

	long LastLineInFile;
		//	(保留)	文本总行数
	long LinesReadInFile;
		//	(保留)
	long CurLineInFile;
		//	(保留)	编缉文本中当前所在行
	int  CurColInFile;
		//	(保留)	编缉文本中当前所在列
	int  CurLineInArray;
		//	(保留)
	int  LinesInArray;
		//	(保留)
	int  CurLineInEditArea;
		//	(保留)	编缉区当前所在行
	int  CurColInEditArea;
		//	(保留)	编缉区当前所在列
	int  CurScreen;
		//	(保留)	编缉区当前所在屏
	long BlockStartLine;
		//	(保留)	编缉块操作中块首所在行
	int  BlockStartColumn;
		//	(保留)	编缉块操作中块首所在列
	long BlockEndLine;
		//	(保留)	编缉块操作中块尾所在行
	int  BlockEndColumn;
		//	(保留)	编缉块操作中块尾所在列
	int  MarkBlockFlag;
		//	(保留)	编缉块操作中块标志
	int  OldFileFlag;
		//	(保留)	是否存在旧文件标志
	int  FileChangeFlag;
		//	(保留)	文件修改标志
	int  ReachFileEndFlag;
		//	(保留)
//	unsigned char *BlockTempBuffer;
		//	(保留)
//	unsigned char *BlockTempBufferStart;
		//	(保留)
	int  SubA;
		//	(保留)
	int  SubB;
		//	(保留)
	long PointerInFileA[MaxSubNumber];
		//	(保留)
	long PointerInFileB[MaxSubNumber];
		//	(保留)
	char BackFile[MaxPath];
		//	(保留)	*.BAK 文件
	char TempFileNameA[MaxPath];
		//	(保留)  *.$$$ 临时文件
	char TempFileNameB[MaxPath];
		//	(保留)	*.### 临时文件
	FILE *EditFile;
		//	(保留)
	FILE *TempFileA;
		//	(保留)
	FILE *TempFileB;
		//	(保留)
	unsigned char *TextArray[SizeofArray];
		//	(保留)  编缉缓冲区

/******************以上为(保留)参数,供编缉器内部调用*******************/
	};
		//	Total allocate about 3K mem_area.

typedef struct EditType EDIT;
		//	定义结构 EDIT

extern SETPATH EDITPATH;
		//	Enviament for editor.
extern char EDIT_FILE_NAME[MaxPath];
		//
extern int  LK_CursorColor;
		//	光标颜色
extern int  LK_TabSize;
		//	TAB 键的大小
extern char LK_FindString[MaxInputTextLen];
		//	FIND 功能所调用的全局变量
		//		存放所要查找的字符串
extern char LK_ReplaceString[MaxInputTextLen];
		//	REPLACE 功能所调用的全局变量
		//		存放所要被替换掉的字符串
extern char LK_ReplaceWithString[MaxInputTextLen];
		//	REPLACE 功能所调用的全局变量
		//		存放所要被替换成的字符串



//	BOY WINDOWS 之 BOY EDITOR 文本编缉器的主要函数只有四个:
//		下面分别进行介绍:

int  CREATE_BOY_EDIT(EDIT *LK_EDITOR);
		//	BOY WINDOWS 文本编缉器的创建函数
		//		说明:
		//			用于创建一个文本编缉区的初始环境,
		//			它只在一个编缉区建立时使用一次.
		//			在 BOY_SETUP_ALL 初始化完毕后,
		//			才可以调用 CREATE_BOY_EDIT函数
		//			来建立一个编缉区.
		//
		//      	返回值:
		//			1:	创建成功.
		//			0:
		//			-1:	文件打开错误!
		//			-2:	无权编缉文件!
		//			-3:	内存不够!
		//			-4:	can't open any file!
		//
		//		示例:
		//			创建一个编缉区.
		//
		//			EDIT BOY_EDIT;
		//
		//			if(CREATE_BOY_EDIT(&BOY_EDIT)!=1)
		//                      {
		//                              当编缉区创建失败时,
		//				执行的代码......
		//			}
		//			或者
		//			switch(CREATE_BOY_EDIT(&BOY_EDIT)
		//			{
		//				case -1:
		//					.....
		//				case -2:
		//					.....
		//				.....
		//			}

int  BOY_EDIT_TEST(EDIT *LK_EDITOR,TEST *Test);
		//      BOY WINDOWS 文本编缉器的检测函数
		//		说明:
		//              返回:
void REDRAW_EDIT(long x,EDIT *LK_EDITOR);
void BOY_EDIT_CLOSE_ALL(EDIT *LK_EDITOR);

void FUNC_NormalCharacter(TEST *Test,EDIT *LK_EDITOR);
void FUNC_DeleteFirstHalfLine(EDIT *LK_EDITOR);
void FUNC_DeleteLine(EDIT *LK_EDITOR);
void FUNC_DeleteRestLine(EDIT *LK_EDITOR);
void FUNC_MoveToBlockStart(EDIT *LK_EDITOR);
void FUNC_MoveToBlockEnd(EDIT *LK_EDITOR);
void FUNC_InsertStatus(EDIT *LK_EDITOR);
void FUNC_DeleteCharacter(EDIT *LK_EDITOR);
void FUNC_Enter(EDIT *LK_EDITOR);
void FUNC_BackSpace(EDIT *LK_EDITOR);
void FUNC_InsertLine(EDIT *LK_EDITOR);
void FUNC_DeleteBlock(EDIT *LK_EDITOR);
void FUNC_CopyBlock(EDIT *LK_EDITOR);
void FUNC_MoveBlock(EDIT *LK_EDITOR);
void FUNC_CopyToClipBoard(EDIT *LK_EDITOR);
void FUNC_CopyFromClipBoard(EDIT *LK_EDITOR);
void FUNC_PgUp(EDIT *LK_EDITOR);
void FUNC_PgDn(EDIT *LK_EDITOR);
void FUNC_Right(EDIT *LK_EDITOR);
void FUNC_Left(EDIT *LK_EDITOR);
void FUNC_Up(EDIT *LK_EDITOR);
void FUNC_Down(EDIT *LK_EDITOR);
void FUNC_Home(EDIT *LK_EDITOR);
void FUNC_End(EDIT *LK_EDITOR);
void FUNC_Tab(EDIT *LK_EDITOR);
void FUNC_MoveToFileStart(EDIT *LK_EDITOR);
void FUNC_MoveToFileEnd(EDIT *LK_EDITOR);
void FUNC_MarkBlockStart(EDIT *LK_EDITOR);
void FUNC_MarkBlockEnd(EDIT *LK_EDITOR);
void FUNC_CancelBlockMark(EDIT *LK_EDITOR);
void FUNC_Research(EDIT *LK_EDITOR);
int  FUNC_Find(EDIT *LK_EDITOR);
int  FUNC_Replace(EDIT *LK_EDITOR);
int  FUNC_GoToLineNumber(EDIT *LK_EDITOR);
int  FUNC_SaveAs(EDIT *LK_EDITOR);
int  FUNC_LoadFile(EDIT *LK_EDITOR);
int  FUNC_SaveFile(EDIT *LK_EDITOR);
void FUNC_DosShell(WINDOWS *BOY_WINDOWS,TYPE *BOY_TYPE,int BOY_TOTAL,
			int BOY_TAB,EDIT *LK_EDITOR);
