/*此文件集成了撤消/剪切/拷贝/粘贴/鼠标拖曳选中*/
#ifndef ZXF_PCCP_C_INCLUDE
#define ZXF_PCCP_C_INCLUDE
#include<STDIO.H>
#include<MALLOC.H>
#include<DOS.H>
#include"SELF_INC\\ZXF_MAGE.H"
#include"SELF_INC\\ZXF_EDIT.H"
#include"SELF_INC\\CURSOR.H"
#include"SELF_INC\\CHAR_MSG.H"
#include"SELF_INC\\TEXT_APP.H"
#include"SELF_INC\\ZXF_MOUS.H"
#include"SELF_INC\\ZXF_BASE.H"
#include"SELF_INC\\MSG_BOX.H"
#include"SELF_INC\\EX_PCCP.H"
/*鼠标拖曳选中的两个端点*/
PointType MouseDagSel1;
PointType MouseDagSel2;
PointType MouseDagSelTemp;
int PointCompare(PointType point1,PointType point2); /*比较两个点的高低,-1表示第一个点比第二个点低,
0 表示两个点相同
1 表示第一个点比第二个点高*/
int MouseDaggleSelect(int mousex,int mousey,char flag); /*实现鼠标拖曳选中字符,其中flag为1时,表示拖曳进行的第一次调用,
flag为2时,表示拖曳进行的以后调用*/
int DeleteTwoPointSpace(PointType,PointType,char,char); /*删除两个点之间所有的字符,char中传递插入后是更新显示.
0--不更新显示,1--更新显示,第二个char传入是否作删除前的显示工作(DrawSelectField()),0--不作处理,1--作处理,
返回值为需要重画的行数+2.*/
int InsertStrIntoPoint(PointType,char*,char); /*将字符串插入到指定的位置,char中传递插入后是更新显示.
0--不更新显示(返回值:-1->超过最大设计行,-2->内存不足,-3->插入点不明,需要重画的行数+2),1--更新显示,*/
int InsertStrIntoPoint(PointType PointTemp,char* insertStr,char reDraw) /*将字符串插入到指定的位置*/
{
int temp,temp1,temp2,temp3,temp4,temp5;
int needApplyRow=0; /*用作保存需要再申请多少行空间*/
PointType insertPoint; /*用作字符插入的位置*/
char charStrTemp[TempArrayMaxContent]; /*用作暂时保存字符数据*/
int ReDrawAnotherRow=0; /*标记是否要重画其它行:-1表示重画所有当前行以下的行,0表示只需要重画当前行,大于0表示需要重画当前行的以下的行数*/
char *replaceRow=NULL; /*用作在新建一行时,保存申请的空间*/
int getRow; /*用作在处理有字符溢出时,指示接收溢出的字符的行*/
char tempChar;
TEXT_Char_MSG charMSG;
char forOutString[2]={'\0'};
/*将临时数组数据保存起来*/
for(temp=0;(SaveCharArray[pointSCA][temp]!=-1 || charTempArray[temp]!=-1);temp++)
if(SaveCharArray[pointSCA][temp]!=charTempArray[temp]) /*判断临时数组和保存数据的数组之间的异同,当相异时,才从这个点开始保存临时数组中的数据*/
{
for(temp1=temp;charTempArray[temp1]!=-1;temp1++) /*从临时数组和保存数据的数组的第一个不相同的点开始保存数据*/
SaveCharArray[pointSCA][temp1]=charTempArray[temp1];
SaveCharArray[pointSCA][temp1]=-1; /*设置结束标志*/
break; /*退出本次循环*/
}
/*判断PointTemp是否存在*/
if(PointTemp.row>=maxUsedRow) /*判断PointTemp的row值是否存在*/
{
if(reDraw==1)
{
MouseOff(MouseX,MouseY);
BOX_USE_MSG="插入点不明确!\n";
Draw_APP_Box(180,160,400,260,BUTTON_DOWN,"确定*","错误",APP_BOX_USE_MSG);
BOX_USE_MSG=NULL;
MouseOn(MouseX,MouseY);
return 0;
}
else if(reDraw==0)
return -3;
}
for(temp=0;SaveCharArray[PointTemp.row][temp]!=-1;temp++) ; /*计算PointTemp所在的行字符的字符个数多少*/
if(PointTemp.col>=temp) /*判断PointTemp的col值是否存在*/
{
if(reDraw==1)
{
MouseOff(MouseX,MouseY);
BOX_USE_MSG="插入点不明确!\n";
Draw_APP_Box(180,160,400,260,BUTTON_DOWN,"确定*","错误",APP_BOX_USE_MSG);
BOX_USE_MSG=NULL;
MouseOn(MouseX,MouseY);
return 0;
}
else if(reDraw==0)
return -3;
}
/*判断要插入的字符串是否要申请空间来存放,
如果要申请空间,判断能否能全部申请得到,如果不能,就不执行插入操作,退出函数*/
for(temp=0,temp1=0;insertStr[temp]!='\0';temp++)
if(insertStr[temp]=='\n')
temp1++;
if(temp1==0)
{
for(temp2=0;SaveCharArray[PointTemp.row][temp2]!=-1;temp2++) ;
if(temp2+temp>=TempArrayMaxContent)
{
getRow=PointTemp.row+1;
temp3=temp2+temp-(TempArrayMaxContent-1);
while(1)
{
if(getRow>=maxUsedRow)
{
needApplyRow=1;
break;
}
else
{
for(temp4=0;SaveCharArray[getRow][temp4]!=-1;temp4++) ;
if(temp4+temp3>=TempArrayMaxContent)
{
temp3=temp4+temp3-(TempArrayMaxContent-1);
getRow++;
continue;
}
else
{
needApplyRow=1;
break;
}
}
}
}
else
needApplyRow=0;
}
else
needApplyRow=temp1+2;
if(maxUsedRow+needApplyRow>SavcCharMaxRow) /*当已经使用的行 + 需要申请的行 > 最大设计承受行数*/
{
if(reDraw==1)
{
MouseOff(MouseX,MouseY);
BOX_USE_MSG="已经超过最大设计承受的行数!\n";
Draw_APP_Box(180,160,400,260,BUTTON_DOWN,"确定*","警告",APP_BOX_USE_MSG);
BOX_USE_MSG=NULL;
MouseOn(MouseX,MouseY);
return 0; /*退出函数*/
}
else if(reDraw==0)
{
return -1;
}
}
for(temp=maxUsedRow;SaveCharArray[temp]!=NULL;temp++) ; /*计算已经申请了空间但没有被使用的行数(temp-maxUsedRow)*/
if(temp-maxUsedRow<needApplyRow) /*当已经申请了空间但没有被使用的行数不够本次数使用,就需要动态去申请*/
{
for(needApplyRow-=temp-maxUsedRow,temp1=0;temp1<needApplyRow;temp1++)/*从没有申请空间的行开始申请空间*/
{
if(SaveCharArray[temp]==NULL) /*当没有申请空间*/
{
SaveCharArray[temp]=(char*)malloc(sizeof(char)*TempArrayMaxContent);/*申请一行的空间*/
if(SaveCharArray[temp]==NULL) /*当申请不到空间*/
{
if(reDraw==1)
{
MouseOff(MouseX,MouseY);
BOX_USE_MSG="内存空间不足!\n";
Draw_APP_Box(180,160,400,260,BUTTON_DOWN,"确定*","提示",APP_BOX_USE_MSG);
BOX_USE_MSG=NULL;
MouseOn(MouseX,MouseY);
return 0; /*退出本函数*/
}
else if(reDraw==0)
{
return -2;
}
}
else
temp++;
}
}
}
/*判断能否申请到空间完毕*/
/*通过判断,正式开始插入字符串*/
insertPoint.row=PointTemp.row,insertPoint.col=PointTemp.col; /*设置插入位置*/
/*temp1记录从一个换行符('\n')后到下一个换行符('\n')之间所有字符的多少*/
for(temp=0,temp1=0;insertStr[temp]!='\0';temp++) /*遍历insertStr所在的字符*/
{
if(insertStr[temp]=='\n')
{
/*insertPoint.row后面的行向下移动一行*/
replaceRow=SaveCharArray[maxUsedRow]; /*保存已申请的空间*/
for(temp2=maxUsedRow-1;temp2>insertPoint.row;temp2--) /*向下移动一行*/
SaveCharArray[temp2+1]=SaveCharArray[temp2];
/*把保存的空间的首地址赋给移动后插入点的下一行,并设置结束标记*/
SaveCharArray[insertPoint.row+1]=replaceRow; SaveCharArray[insertPoint.row+1][0]=-1;
/*将PointTemp所在的行中pointTemp后的所有字符拷贝到新建的行中*/
for(temp2=insertPoint.col+1;SaveCharArray[insertPoint.row][temp2]!=-1;temp2++)
SaveCharArray[insertPoint.row+1][temp2-(insertPoint.col+1)]=SaveCharArray[insertPoint.row][temp2];
SaveCharArray[insertPoint.row+1][temp2-(insertPoint.col+1)]=-1;
SaveCharArray[insertPoint.row][insertPoint.col+1]=-1;
insertPoint.row+=1;insertPoint.col=-1; /*设置新插入点*/
maxUsedRow+=1; /*使用的行数增加一行*/
ReDrawAnotherRow=-1; /*需要重画插入点后面所有的行*/
temp1=0; /*temp1重新记录*/
}
else if(insertStr[temp+1]=='\n' || insertStr[temp+1]=='\0')
{
temp1++; /*temp1记录增加一条*/
for(temp2=insertPoint.col+1;SaveCharArray[insertPoint.row][temp2]!=-1;temp2++) ;/*计算插入点所在的行的字符数*/
if(temp2+temp1>=TempArrayMaxContent) /*当需要插入的字符总数+插入点所在的行的字符总数 超过设计的行最大容量时*/
{
if(temp1+insertPoint.col+1>=TempArrayMaxContent) /*当需要插入的字符总数+插入点前面的所有字符总数 超过设计的行最大容量时*/
{
/*由于插入点后面的字符一定会溢出,所以先将插入点后面所有的字符保存在其它行中*/
/*插入点后面的一定会溢出的字符保存在charStrTemp中*/
for(temp2=insertPoint.col+1;SaveCharArray[insertPoint.row][temp2]!=-1;temp2++)
charStrTemp[temp2-(insertPoint.col+1)]=SaveCharArray[insertPoint.row][temp2];
charStrTemp[temp2-(insertPoint.col+1)]=-1; /*设置结束标志*/