📄 edit.cpp
字号:
}
}
else
{
// 菜单未打开
// 隐藏当前菜单
mnuCool[NowMenu].InactiveMenu();
// 设置菜单打开标志
MenuOn = true;
// 设置当前菜单为Edit
NowMenu = MenuEdit;
// 激活当前菜单
mnuCool[NowMenu].ActiveMenu();
}
break;
case 'F':
if (MenuOn)
{
// 菜单已经打开
switch (NowMenu)
{
case MenuEdit:
// 当前菜单为Edit
// 隐藏当前菜单
mnuCool[NowMenu].InactiveMenu();
// 解释执行Find菜单项
Explain(NowMenu, ItemFind);
break;
}
}
else
{
// 菜单未打开
// 隐藏当前菜单
mnuCool[NowMenu].InactiveMenu();
// 设置菜单打开标志
MenuOn = true;
// 设置当前菜单为File
NowMenu = MenuFile;
// 激活当前菜单
mnuCool[NowMenu].ActiveMenu();
}
break;
case 'G':
if (MenuOn)
{
// 菜单已经打开
switch (NowMenu)
{
case MenuRun:
// 当前菜单为Run
// 隐藏当前菜单
mnuCool[NowMenu].InactiveMenu();
// 解释执行GoToCursor菜单项
Explain(NowMenu, ItemGoToCursor);
break;
}
}
break;
case 'H':
if (MenuOn)
{
// 菜单已经打开
switch (NowMenu)
{
case MenuHelp:
// 当前菜单为Help
// 隐藏当前菜单
mnuCool[NowMenu].InactiveMenu();
// 解释执行HelpEdit菜单项
Explain(NowMenu, ItemHelpEdit);
break;
}
}
else
{
// 菜单未打开
// 隐藏当前菜单项
mnuCool[NowMenu].InactiveMenu();
// 设置菜单打开标志
MenuOn = true;
// 设置当前菜单为Help
NowMenu = MenuHelp;
// 激活当前菜单
mnuCool[NowMenu].ActiveMenu();
}
break;
case 'M':
if (MenuOn)
{
// 菜单已经打开
switch (NowMenu)
{
case MenuEdit:
// 当前菜单为Edit
// 隐藏当前菜单
mnuCool[NowMenu].InactiveMenu();
// 解释执行Mark菜单项
Explain(NowMenu, ItemMark);
break;
}
}
break;
case 'N':
if (MenuOn)
{
// 菜单已经打开
switch (NowMenu)
{
case MenuFile:
// 当前菜单为File
// 隐藏当前菜单项
mnuCool[NowMenu].InactiveMenu();
// 解释执行New菜单项
Explain(NowMenu, ItemNew);
break;
case MenuEdit:
// 当前菜单为Edit
// 隐藏当前菜单
mnuCool[NowMenu].InactiveMenu();
// 解释执行Following菜单项
Explain(NowMenu, ItemFollowing);
break;
}
}
break;
case 'O':
if (MenuOn)
{
// 菜单已经打开
switch (NowMenu)
{
case MenuFile:
// 当前菜单为File
// 隐藏当前菜单
mnuCool[NowMenu].InactiveMenu();
// 解释执行Open菜单项
Explain(NowMenu, ItemOpen);
break;
case MenuRun:
// 当前菜单为Run
// 隐藏当前菜单
mnuCool[NowMenu].InactiveMenu();
// 解释执行Output菜单项
Explain(NowMenu, ItemOutput);
break;
}
}
break;
case 'P':
if (MenuOn)
{
// 菜单已经打开
switch (NowMenu)
{
case MenuFile:
// 当前菜单为File
// 隐藏当前菜单
mnuCool[NowMenu].InactiveMenu();
// 解释执行Print菜单项
Explain(NowMenu, ItemPrint);
break;
case MenuEdit:
// 当前菜单为Edit
// 隐藏当前菜单项
mnuCool[NowMenu].InactiveMenu();
// 解释执行Previous菜单项
Explain(NowMenu, ItemPrevious);
break;
}
}
break;
case 'Q':
if (MenuOn)
{
// 菜单已经打开
switch (NowMenu)
{
case MenuFile:
// 当前菜单为File
// 隐藏当前菜单
mnuCool[NowMenu].InactiveMenu();
// 解释执行Quit菜单项
Explain(NowMenu, ItemQuit);
break;
}
}
break;
case 'R':
if (MenuOn)
{
// 菜单已经打开
switch (NowMenu)
{
case MenuRun:
// 当前菜单为Run
// 隐藏当前菜单
mnuCool[NowMenu].InactiveMenu();
// 解释执行Run菜单项
Explain(NowMenu, ItemRun);
break;
}
}
else
{
// 菜单未打开
// 隐藏当前菜单
mnuCool[NowMenu].InactiveMenu();
// 设置菜单打开标志
MenuOn = true;
// 设置当前菜单为Run
NowMenu = MenuRun;
// 激活当前菜单
mnuCool[NowMenu].ActiveMenu();
}
break;
case 'S':
if (MenuOn)
{
// 菜单已经打开
switch (NowMenu)
{
case MenuFile:
// 当前菜单为File
// 隐藏当前菜单
mnuCool[NowMenu].InactiveMenu();
// 解释执行Save菜单项
Explain(NowMenu, ItemSave);
break;
case MenuEdit:
// 当前菜单为Edit
// 隐藏当前菜单
mnuCool[NowMenu].InactiveMenu();
// 解释执行SearchAgain菜单项
Explain(NowMenu, ItemSearchAgain);
break;
case MenuRun:
// 当前菜单为Run
// 隐藏当前菜单
mnuCool[NowMenu].InactiveMenu();
// 解释执行SearchAgain菜单项
Explain(NowMenu, ItemSearchAgain);
break;
case MenuDebug:
// 当前菜单为Debug
// 隐藏当前菜单
mnuCool[NowMenu].InactiveMenu();
// 解释执行StopDebugging菜单项
Explain(NowMenu, ItemStopDebugging);
break;
}
}
break;
case 'T':
if (MenuOn)
{
// 菜单已经打开
switch (NowMenu)
{
case MenuEdit:
// 当前菜单为Edit
// 隐藏当前菜单
mnuCool[NowMenu].InactiveMenu();
// 解释执行Standardize菜单项
Explain(NowMenu, ItemStandardize);
break;
case MenuRun:
// 当前菜单为Run
// 隐藏当前菜单
mnuCool[NowMenu].InactiveMenu();
// 解释执行StepInto菜单项
Explain(NowMenu, ItemStepInto);
break;
case MenuHelp:
// 当前菜单为Help
// 隐藏当前菜单
mnuCool[NowMenu].InactiveMenu();
// 解释执行Thanks菜单项
Explain(NowMenu, ItemThanks);
break;
}
}
break;
case 'W':
if (MenuOn)
{
// 菜单已经打开
switch (NowMenu)
{
case MenuDebug:
// 当前菜单为Debug
// 隐藏当前菜单
mnuCool[NowMenu].InactiveMenu();
// 解释执行Watch菜单项
Explain(NowMenu, ItemWatch);
break;
}
}
}
}
void ChangeMode(const Mode ModeCode)
{
// 切换系统状态(编辑状态,菜单状态)
// 修改状态变量
SystemMode = ModeCode;
switch (SystemMode)
{
case EditMode:
// 修改为编辑状态
// 打印底部信息栏
PrintMessages();
// 设置光标
SetCursor();
break;
case MenuMode:
// 修改为菜单状态
// 隐藏光标
_setcursortype(_NOCURSOR);
break;
}
}
void PressRight()
{
// 处理输入右键
if (TextY < MaxY - 1)
{
// 光标不在行末尾
// 文本Y坐标加1
TextY++;
// 屏幕Y坐标加1
NowY++;
// 输出位置
ShowPosition();
}
}
void PressLeft()
{
// 处理输入左键
if (TextY > 0)
{
// 光标不在行首
// 文本Y坐标减1
TextY--;
// 屏幕Y坐标减1
NowY--;
// 输出位置
ShowPosition();
}
}
void PressDel()
{
// 处理输入Del
// 当前行长度,不包括行末空格
int Len = LengthOf(TextX);
if (TextY < Len)
{
// 光标在行末之前
if (Text[TextX]->Line[TextY] == ' ' && TextY <= PreviousTab(HeadOf(TextX)))
{
// 当前行的光标之前的部分只有空格
// 将当前行首(非空格)移动到它的前一个Tab区
// 当前行向前移动的字符数
int Plus = HeadOf(TextX) - PreviousTab(HeadOf(TextX));
// 移动当前行文本
for (int i = 0; i < Len - Plus; i++)
{
Text[TextX]->Line[i] = Text[TextX]->Line[i + Plus];
}
// 尾部多余部分置空格
for (i = Len - 1; i >= Len - Plus; i--)
{
Text[TextX]->Line[i] = ' ';
}
}
else
{
// 光标处有非空格字符,或行首(非空格)已在第1个Tab区
// 当前行文本前移1位
for (int i = TextY; i < Len; i++)
{
Text[TextX]->Line[i] = Text[TextX]->Line[i + 1];
}
if (LengthOf(TextX) == 0)
{
// 当前行已空
// 删除标记和断点
Text[TextX]->Mark = false;
Text[TextX]->Break = false;
}
}
// 本行需重新着色
Text[TextX]->Sign[0] = ' ';
// 重新打印当前行
PrintLine(TextX);
// 设置修改标志
ShowSaved(false);
}
else if (TextX < EndLine)
{
// 光标在行末,且下面还有文本行
if (TextY + LengthOf(TextX + 1) < MaxY)
{
// 新的当前行长度不超过编辑窗口宽度
if (Len > 0)
{
// 当前行非空
// 删除当前行的标记和断点
Text[TextX + 1]->Mark = false;
Text[TextX + 1]->Break = false;
// 以后各行依次向上移动
for (int i = 0; i < LengthOf(TextX + 1); i++)
{
Text[TextX]->Line[i + TextY] = Text[TextX + 1]->Line[i];
}
}
else
{
// 当前行为空
if (TextY > 0)
{
// 光标不在行首
// 将下一行文本添加至当前行文本的末尾
for (int i = 0; i < LengthOf(TextX + 1); i++)
{
Text[TextX]->Line[i + TextY] = Text[TextX + 1]->Line[i];
}
}
else
{
// 光标在行首
// 直接复制当前
strcpy(Text[TextX]->Line, Text[TextX + 1]->Line);
}
Text[TextX]->Mark = Text[TextX + 1]->Mark;
Text[TextX]->Break = Text[TextX + 1]->Break;
}
// 当前行需重新着色
Text[TextX]->Sign[0] = ' ';
// 依次移动当前行(不含)后面的各行向上一行(文本,着色码,标记,断点)
for (int i = TextX + 1; i < EndLine; i++)
{
strcpy(Text[i]->Line, Text[i + 1]->Line);
strcpy(Text[i]->Sign, Text[i + 1]->Sign);
Text[i]->Mark = Text[i + 1]->Mark;
Text[i]->Break = Text[i + 1]->Break;
}
// 原最后一行清空
strset(Text[EndLine]->Line, ' ');
Text[EndLine]->Sign[0] = ' ';
Text[EndLine]->Mark = false;
Text[EndLine]->Break = false;
DelLine();
EndLine--;
// 修改编辑窗口的文本高度
winEdit.SetTotHigh(EndLine);
// 重新打印当前行以下的各行文本
PrintText(NowX);
// 设置修改标志
ShowSaved(false);
}
}
SetCursor();
}
void PressBackSpace()
{
// 处理输入BackSpace
if (TextX == 0 && TextY == 0)
{
// 光标在文本左上角,无法前移
return;
}
else if (TextY == 0 && TextX > 0 && LengthOf(TextX) + LengthOf(TextX - 1) > MaxY)
{
// 若退至前一行,新的行宽大于编辑窗口的宽度
Sound();
return;
}
else if (TextY == 0 && TextX > 0 && LengthOf(TextX) + LengthOf(TextX - 1) <= MaxY)
{
// 在行首,非第1行,且产生的新的上一行行宽不大于编辑窗口的宽度
if (LengthOf(TextX - 1) > 0)
{
// 上一行非空
// 删除上一行和当前行的标记和断点
Text[TextX]->Mark = false;
Text[TextX]->Break = false;
Text[TextX - 1]->Mark = false;
Text[TextX - 1]->Break = false;
}
else
{
// 上一行为空行
// 复制当前行状态至上一行
Text[TextX - 1]->Mark = Text[TextX]->Mark;
Text[TextX - 1]->Break = Text[TextX]->Break;
}
// 设置修改标志
ShowSaved(false);
// 设置文本Y坐标为上一行的末尾
TextY = LengthOf(TextX - 1);
// 将当前行添加至上一行末尾
for (int i = 0; i < LengthOf(TextX); i++)
{
Text[TextX - 1]->Line[i + TextY] = Text[TextX]->Line[i];
}
// 上一行需重新着色
Text[TextX - 1]->Sign[0] = ' ';
// 依次移动当前行(含)后面的各行向上一行(文本,着色码,标记,断点)
for (i = TextX; i < EndLine; i++)
{
strcpy(Text[i]->Line, Text[i + 1]->Line);
strcpy(Text[i]->Sign, Text[i + 1]->Sign);
Text[i]->Mark = Text[i + 1]->Mark;
Text[i]->Break = Text[i + 1]->Break;
}
// 原最后一行清空
strset(Text[EndLine]->Line, ' ');
Text[EndLine]->Sign[0] = ' ';
Text[EndLine]->Mark = false;
Text[EndLine]->Break = false;
DelLine();
EndLine--;
// 修改编辑窗口的文本高度
winEdit.SetTotHigh(EndLine);
// 文本X坐标上移
TextX--;
if (TextX < x0)
{
// 当前行超出编辑窗口当前屏
// 光标在编辑窗口顶行
NowX = winEdit.Top() + 1;
// 修改编辑窗口的首行为当前行
x0 = TextX;
}
else
{
// 当前行未超出编辑窗口的当前屏
// 光标上移
NowX--;
}
// 设置光标Y坐标
NowY = TextY + winEdit.Left() + 1;
ShowPosition();
// 重新打印当前行后面的各行
PrintText(NowX);
// 输出编辑窗口垂直滚动条
winEdit.ScrollVertical(TextX);
}
else
{
// 不会影响上一行
if (TextY == 1)
{
// 删除后当前行空
// 删除当前行的标记和断点
Text[TextX]->Mark = false;
Text[TextX]->Break = false;
}
if (TextY <= HeadOf(TextX) || LengthOf(TextX) == 0)
{
// 当前行光标前只有空格,或当前行为空
// 整行前移至前一个Tab区
// 前移的位数
int Plus = TextY - PreviousTab(TextY);
// 当前行的长度(非空格)
int Len = LengthOf(TextX);
// 整行前移至前一个Tab区
for (int i = HeadOf(TextX) - Plus; i < Len - Plus; i++)
{
Text[TextX]->Line[i] = Text[TextX]->Line[i + Plus];
}
// 后部多余的部分清空
for (i = Len - 1; i >= Len - Plus; i--)
{
Text[TextX]->Line[i] = ' ';
}
// 本行需重新着色
Text[TextX]->Sign[0] = ' ';
// 计算新的文本Y坐标
TextY -= Plus;
// 设置光标Y坐标
NowY = TextY + winEdit.Left() + 1;
// 重新打印当前行
PrintLine(TextX);
}
else if (LengthOf(TextX) > 0 || TextX == 0)
{
// 只会删除前一个字符
// 文本Y坐标前移1位
TextY--;
// 当前行前移1位
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -