📄 edit.cpp
字号:
/////////////////////////////////////////////////////////
// //
// Edit.cpp //
// 编辑模块 //
// 接受用户菜单、快捷键输入,指向Explain解释模块 //
// 接受并直接处理代码输入 //
// 最后更新时间:2004年4月23日16:04 //
// //
/////////////////////////////////////////////////////////
#include <conio.h>
#include <ctype.h>
#include <string.h>
#include "Edit.h"
void EditProgram
(
int &NowMenu, // 菜单值
int &NowItem // 菜单项值
)
{
int Key;
gotoxy(NowY, NowX);
// 菜单未打开
MenuOn = false;
do
{
// 读入用户输入
Receive(Key);
if (SystemMode == MenuMode)
{
// 当前系统处于菜单状态
switch (Key)
{
case KeyRight:
// 输入为右键
// 项目序号赋值
NowItem = 0;
// 隐藏当前菜单
mnuCool[NowMenu].InactiveMenu();
// 计算下一个菜单序号
NowMenu = (NowMenu + 1) % Menu::TotMenu;
// 激活新的菜单
mnuCool[NowMenu].ActiveMenu();
break;
case KeyLeft:
// 输入为左键
// 项目序号赋值
NowItem = 0;
// 隐藏当前菜单
mnuCool[NowMenu].InactiveMenu();
// 计算前一个菜单的序号
NowMenu--;
if (NowMenu < 0)
{
NowMenu = Menu::TotMenu - 1;
}
// 激活新的菜单
mnuCool[NowMenu].ActiveMenu();
break;
case KeyUp:
// 输入为上键
if (MenuOn)
{
// 菜单已经打开
// 隐藏当前菜单项
mnuCool[NowMenu].InactiveItem(NowItem);
// 计算上一个菜单项,注意越过菜单项之间的分隔符
do
{
NowItem--;
if (NowItem < 0)
{
NowItem = mnuCool[NowMenu].TotMenuItem() - 1;
}
} while (mnuCool[NowMenu].IsSeparator(NowItem));
// 激活新的菜单项
mnuCool[NowMenu].ActiveItem(NowItem);
}
break;
case KeyDown:
// 输入为下键
if (MenuOn)
{
// 菜单已经打开
// 隐藏当前菜单项
mnuCool[NowMenu].InactiveItem(NowItem);
// 计算下一个菜单项注意越过菜单项之间的分隔符
do
{
NowItem = (NowItem + 1) % mnuCool[NowMenu].TotMenuItem();
} while (mnuCool[NowMenu].IsSeparator(NowItem));
// 激活新的菜单项
mnuCool[NowMenu].ActiveItem(NowItem);
}
else
{
// 菜单未打开
// 打开菜单
MenuOn = true;
mnuCool[NowMenu].Open();
}
break;
case KeyEnter:
// 输入为回车键
if (MenuOn)
{
// 菜单已经打开
// 隐藏当前菜单
mnuCool[NowMenu].InactiveMenu();
// 设置菜单打开标志
MenuOn = false;
return;
}
else
{
// 菜单未打开
// 设置菜单打开标志
MenuOn = true;
// 设置当前菜单项
NowItem = 0;
// 打开当前菜单
mnuCool[NowMenu].Open();
}
break;
case KeyEsc:
// 输入为Esc键
// 隐藏当前菜单
mnuCool[NowMenu].InactiveMenu();
// 设置系统状态为编辑状态
ChangeMode(EditMode);
gotoxy(NowY, NowX);
break;
default:
// 输入为菜单快捷字母键
PressMenuLetterKey(Key, NowMenu);
}
}
else
{
// 当前系统处于编辑状态
switch (Key)
{
case KeyF1:
// 输入为F1
// 打开语法帮助窗口
// 设置当前菜单为Help
NowMenu = MenuHelp;
// 设置当前菜单项为Syntax
NowItem = ItemHelpEdit;
return;
case KeyF2:
// 输入为F2
// 存盘
// 设置当前菜单为File
NowMenu = MenuFile;
// 设置当前菜单项为Save
NowItem = ItemSave;
return;
case KeyF3:
// 输入为F3
// 打开文件
// 设置当前菜单为File
NowMenu = MenuFile;
// 设置当前菜单项为Open
NowItem = ItemOpen;
return;
case KeyF4:
// 输入为F4
// 运行到光标当前行
// 设置当前菜单为Run
NowMenu = MenuRun;
// 设置当前菜单项为GoToCursor
NowItem = ItemGoToCursor;
return;
case KeyF7:
// 输入为F7
// 单步执行,进入Sub
// 设置当前菜单为Run
NowMenu = MenuRun;
// 设置当前菜单项为StepInto
NowItem = ItemStepInto;
return;
case KeyF8:
// 输入为F8
// 单步执行,不进入Sub
// 设置当前菜单为Run
NowMenu = MenuRun;
// 设置当前菜单项为StepOver
NowItem = ItemStepOver;
return;
case KeyF10:
// 输入为F10
// 选择菜单
// 改变系统状态为菜单状态
ChangeMode(MenuMode);
// 设置菜单打开标志
MenuOn = false;
// 激活当前菜单
mnuCool[NowMenu].ActiveMenu();
break;
case KeyAltF6:
// 输入为Alt + F6
// 查看输出窗口
// 设置当前菜单为Run
NowMenu = MenuRun;
// 设置当前菜单项为Output
NowItem = ItemOutput;
return;
case KeyCtrlF1:
// 输入为Ctrl + F1
// 查看语法帮助窗口
// 设置当前菜单为Help
NowMenu = MenuHelp;
// 设置当前菜单项为HelpOnSyntax
NowItem = ItemHelpSyntax;
return;
case KeyCtrlF2:
// 输入为Ctrl + F2
// 停止单步调试
// 设置当前菜单为Run
NowMenu = MenuRun;
// 设置当前菜单项为StopDebugging
NowItem = ItemStopDebugging;
return;
case KeyCtrlF7:
// 输入为Ctrl + F7
// 监视表达式的值
// 设置当前菜单为Debug
NowMenu = MenuDebug;
// 设置当前菜单项为Watch
NowItem = ItemWatch;
return;
case KeyCtrlF9:
// 输入为Ctrl + F9
// 解释执行当前程序
// 设置当前菜单为Run
NowMenu = MenuRun;
// 设置当前菜单项为Run
NowItem = ItemRun;
return;
case KeyInsert:
// 输入为Insert
// 在插入和改写状态之间切换
// 显示并改变Insert标志
ShowInsert(true + false - Insert);
break;
case KeyAltF:
// 输入为Alt + F
// 打开File菜单
// 改变系统为菜单状态
ChangeMode(MenuMode);
// 设置菜单打开标志
MenuOn = true;
// 设置当前菜单为File
NowMenu = MenuFile;
// 设置当前菜单项
NowItem = 0;
// 激活File菜单
mnuCool[NowMenu].ActiveMenu();
break;
case KeyAltE:
// 输入为Alt + E
// 打开Edit菜单
// 改变系统为菜单状态
ChangeMode(MenuMode);
// 设置菜单打开标志
MenuOn = true;
// 设置当前菜单为Edit
NowMenu = MenuEdit;
// 设置当前菜单项
NowItem = 0;
// 激活Edit菜单
mnuCool[NowMenu].ActiveMenu();
break;
case KeyAltR:
// 输入为Alt + R
// 打开Run菜单
// 改变系统为菜单状态
ChangeMode(MenuMode);
// 设置菜单打开标志
MenuOn = true;
// 设置当前菜单为Run
NowMenu = MenuRun;
// 设置当前菜单项
NowItem = 0;
// 激活Run菜单
mnuCool[NowMenu].ActiveMenu();
break;
case KeyAltD:
// 输入为Alt + D
// 打开Debug菜单
// 改变系统为菜单状态
ChangeMode(MenuMode);
// 设置菜单打开标志
MenuOn = true;
// 设置当前菜单为Run
NowMenu = MenuDebug;
// 设置当前菜单项
NowItem = 0;
// 激活Run菜单
mnuCool[NowMenu].ActiveMenu();
break;
case KeyAltH:
// 输入为Alt + H
// 打开Help菜单
// 改变系统为菜单状态
ChangeMode(MenuMode);
// 设置菜单打开标志
MenuOn = true;
// 设置当前菜单为Help
NowMenu = MenuHelp;
// 设置当前菜单项
NowItem = 0;
// 激活Help菜单
mnuCool[NowMenu].ActiveMenu();
break;
case KeyCtrlEnter:
// 输入为Ctrl + Enter
// 给光标当前行添加或删除标记
// 设置当前菜单为Edit
NowMenu = MenuEdit;
// 设置当前菜单项为Mark
NowItem = ItemMark;
return;
case KeyCtrlF8:
// 输入为Ctrl + F8
// 给光标当前行添加或删除断点
// 设置当前菜单为Debug
NowMenu = MenuDebug;
// 设置当前菜单项为Break
NowItem = ItemBreak;
return;
case KeyCtrlLeftBracket:
// 输入为Ctrl + [
// 将光标移动到前一个标记行处
// 设置当前菜单为Edit
NowMenu = MenuEdit;
// 设置当前菜单项为Previous
NowItem = ItemPrevious;
return;
case KeyCtrlRightBracket:
// 输入为Ctrl + ]
// 将光标移动到下一个标记行处
// 设置当前菜单为Edit
NowMenu = MenuEdit;
// 设置当前菜单项为Following
NowItem = ItemFollowing;
return;
case KeyRight:
// 输入为右键
// 光标右移一位
PressRight();
break;
case KeyLeft:
// 输入为左键
// 光标左移一位
PressLeft();
break;
case KeyDown:
// 输入为下键
// 光标下移一行
PressDown();
break;
case KeyUp:
// 输入为上键
// 光标上移一行
PressUp();
break;
case KeyPageUp:
// 输入为PageUp
// 向上翻一屏
PressPageUp();
break;
case KeyPageDown:
// 输入为PageDown
// 向下翻一屏
PressPageDown();
break;
case KeyCtrlPageUp:
// 输入为Ctrl + PageUp
// 到程序开头
PressCtrlPageUp();
break;
case KeyCtrlPageDown:
// 输入为Ctrl + PageDown
// 到程序末尾
PressCtrlPageDown();
break;
case KeyCtrlL:
// 输入为Ctrl + L
// 搜索下一个目标字符串
// 设置当前菜单为Edit
NowMenu = MenuEdit;
// 设置当前菜单项为SearchAgain
NowItem = ItemSearchAgain;
return;
case KeyDel:
// 输入为Delete
// 删除光标当前字符
PressDel();
break;
case KeyBackSpace:
// 输入为BackSpace
// 删除光标前一位置字符
PressBackSpace();
break;
case KeyCtrlY:
// 输入为Ctrl + Y
// 删除光标当前行
PressCtrlY();
break;
case KeyTab:
// 输入为Tab
// 将光标移动到下一个Tab区
PressTab();
break;
case KeyEnter:
// 输入为Enter
// 移动光标至下一行开头
PressEnter();
break;
case KeyHome:
// 输入为Home
// 移动光标到行首
// 设置文本Y坐标
TextY = 0;
// 设置屏幕Y坐标
NowY = winEdit.Left() + 1;
// 输出位置
ShowPosition();
break;
case KeyEnd:
// 输入为End
// 移动光标到行末
// 设置文本Y坐标
TextY = LengthOf(TextX);
// 设置屏幕Y坐标
NowY = TextY + winEdit.Left() + 1;
// 输出位置
ShowPosition();
break;
default:
// 输入的是文本字符
PressText(Key);
}
}
gotoxy(NowY, NowX);
} while (Key != KeyAltX);
// 设置当前菜单为File
NowMenu = MenuFile;
// 设置当前菜单项为Quit
NowItem = ItemQuit;
}
void PressMenuLetterKey(const int Key, int &NowMenu)
{
// 处理菜单快捷字母的输入
switch (toupper((char)Key))
{
case 'A':
if (MenuOn)
{
// 菜单已经打开
switch (NowMenu)
{
case MenuFile:
// 当前菜单为File
// 隐藏当前菜单
mnuCool[NowMenu].InactiveMenu();
// 解释执行SaveAs菜单项
Explain(NowMenu, ItemSaveAs);
break;
case MenuEdit:
// 当前菜单为Edit
// 隐藏当前菜单
mnuCool[NowMenu].InactiveMenu();
// 解释执行StandardLine菜单项
Explain(NowMenu, ItemStandLine);
break;
case MenuHelp:
// 当前菜单为Help
// 隐藏当前菜单
mnuCool[NowMenu].InactiveMenu();
// 解释执行AboutCBasic菜单项
Explain(NowMenu, ItemAboutCBasic);
break;
}
}
break;
case 'B':
if (MenuOn)
{
// 菜单已经打开
switch (NowMenu)
{
case MenuDebug:
// 当前菜单为Debug
// 隐藏当前菜单
mnuCool[NowMenu].InactiveMenu();
// 解释执行Break菜单项
Explain(NowMenu, ItemBreak);
break;
case MenuHelp:
// 当前菜单为Help
// 隐藏当前菜单
mnuCool[NowMenu].InactiveMenu();
// 解释执行AboutMe菜单项
Explain(NowMenu, ItemAboutMe);
break;
}
}
break;
case 'C':
if (MenuOn)
{
// 菜单已经打开
switch (NowMenu)
{
case MenuEdit:
// 当前菜单为Edit
// 隐藏当前菜单
mnuCool[NowMenu].InactiveMenu();
// 解释执行ClearAllMark菜单项
Explain(NowMenu, ItemClearMark);
break;
case MenuDebug:
// 当前菜单为Debug
// 隐藏当前菜单
mnuCool[NowMenu].InactiveMenu();
// 解释执行ClearAllBreak菜单项
Explain(NowMenu, ItemClearBreak);
break;
}
}
break;
case 'D':
if (!MenuOn)
{
// 菜单未打开
// 隐藏当前菜单
mnuCool[NowMenu].InactiveMenu();
// 设置菜单打开标志
MenuOn = true;
// 设置当前菜单为Debug
NowMenu = MenuDebug;
// 激活当前菜单
mnuCool[NowMenu].ActiveMenu();
}
break;
case 'E':
if (MenuOn)
{
// 菜单已经打开
switch (NowMenu)
{
case MenuRun:
// 当前菜单为Run
// 隐藏当前菜单
mnuCool[NowMenu].InactiveMenu();
// 解释执行StepOver菜单项
Explain(NowMenu, ItemStepOver);
break;
case MenuHelp:
// 当前菜单为Help
// 隐藏当前菜单
mnuCool[NowMenu].InactiveMenu();
// 解释执行HelpSyntax菜单项
Explain(NowMenu, ItemHelpSyntax);
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -