⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 edit.cpp

📁 c语言写的VB编译器
💻 CPP
📖 第 1 页 / 共 3 页
字号:
			for (int i = TextY; i < LengthOf(TextX); i++)
			{
				Text[TextX]->Line[i] = Text[TextX]->Line[i + 1];
			}
			Text[TextX]->Line[LengthOf(TextX)] = ' ';

			// 当前行需重新着色
			Text[TextX]->Sign[0] = ' ';

			// 屏幕Y坐标前移1位
			NowY--;

			// 重新打印当前行
			PrintLine(TextX);

			// 设置修改标志
			ShowSaved(false);
		}
	}

	SetCursor();
}

void PressUp()
{
	// 处理输入上键

	if (TextX > 0)
	{
		// 非第1行

		if (LengthOf(TextX) > 0)
		{
			// 当前行非空

			// 标准化当前行
			StandardizeLine(TextX);

			char LineBak[MaxY];
			strcpy(LineBak, Text[TextX]->Line);

			ErrorType ErrorID = CheckLine(Text[TextX]->Line);
			if (ErrorID != NoError)
			{
				gettext(1, 1, 80, 25, TextMirror);
				ShowError(ErrorID, TextX, "");
				Error = NoError;

				strcpy(Text[TextX]->Line, LineBak);
				return;
			}

			// 打印当前行
			PrintLine(TextX);
		}

		// 文本X坐标上移1行
		TextX--;

		if (NowX > winEdit.Top() + 1)
		{
			// 屏幕X坐标未超出编辑窗口当前屏

			// 光标上移1行
			NowX--;
		}
		else
		{
			// 屏幕X坐标超出编辑窗口当前屏

			// 修改编辑窗口首行序号
			x0--;

			// 重新打印编辑窗口当前屏
			PrintText(winEdit.Top() + 1);
		}

		// 输出位置
		ShowPosition();

		// 输出编辑窗口垂直滚动条
		winEdit.ScrollVertical(TextX);
	}

	SetCursor();
}

void PressDown()
{
	// 处理输入下键

	if (TextX < EndLine)
	{
		// 非最后一行

		if (LengthOf(TextX) > 0)
		{
			// 当前行非空

			char LineBak[MaxY];
			strcpy(LineBak, Text[TextX]->Line);

			// 标准化当前行
			StandardizeLine(TextX);

			ErrorType ErrorID = CheckLine(Text[TextX]->Line);
			if (ErrorID != NoError)
			{
				gettext(1, 1, 80, 25, TextMirror);
				ShowError(ErrorID, TextX, "");
				Error = NoError;

				strcpy(Text[TextX]->Line, LineBak);
				return;
			}

			// 重新打印当前行
			PrintLine(TextX);
		}

		// 文本X坐标下移1行
		TextX++;

		if (NowX < winEdit.Bottom() - 1)
		{
			// 屏幕X坐标未超出编辑窗口当前屏

			// 光标下移1行
			NowX++;
		}
		else
		{
			// 屏幕X坐标超出编辑窗口当前屏

			// 修改编辑窗口首行序号
			x0++;

			// 重新打印编辑窗口当前屏
			PrintText(winEdit.Top() + 1);
		}

		// 输出位置
		ShowPosition();

		// 输出编辑窗口垂直滚动条
		winEdit.ScrollVertical(TextX);
	}

	SetCursor();
}

void PressPageUp()
{
	// 处理输入PageUp

	x0 -= winEdit.High() - 1;

	TextX -= winEdit.High() - 1;

	if (x0 < 0)
	{
		x0 = 0;
		TextX = 0;
		NowX = winEdit.Top() + 1;
	}

	// 重新打印编辑窗口当前屏
	PrintText(winEdit.Top() + 1);

	// 输出位置
	ShowPosition();

	// 输出编辑窗口垂直滚动条
	winEdit.ScrollVertical(TextX);

	SetCursor();
}

void PressPageDown()
{
	// 处理输入PageDown

	x0 += winEdit.High() - 1;

	TextX += winEdit.High() - 1;

	if (TextX > EndLine)
	{
		x0 = TextX = EndLine;
		NowX = winEdit.Top() + 1;
	}

	// 重新打印编辑窗口当前屏
	PrintText(winEdit.Top() + 1);

	// 输出位置
	ShowPosition();

	// 输出编辑窗口垂直滚动条
	winEdit.ScrollVertical(TextX);

	SetCursor();
}

void PressCtrlY()
{
	// 处理输入Ctrl + Y
	// 删除当前行

	// 将当前行(不含)以后的各行依次向上移动一行(文本,着色码,标记,断点)
	for (int 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;

	if (TextX < EndLine)
	{
		// 当前行不是最后一行

		DelLine();

		// 删除最后一行
		EndLine--;

		// 修改编辑窗口文本高度
		winEdit.SetTotHigh(EndLine);
	}

	// 修改文本Y坐标至行首
	TextY = 0;

	// 修改光标Y坐标至行首
	NowY = winEdit.Left() + 1;

	// 重新打印当前行(含)后的各行
	PrintText(NowX);

	// 输出位置
	ShowPosition();

	// 输出编辑窗口垂直滚动条
	winEdit.ScrollVertical(TextX);

	// 设置修改标志
	ShowSaved(false);

	SetCursor();
}

void PressCtrlPageUp()
{
	// 处理输入Ctrl + PageUp
	// 到文件开头

	// 修改编辑窗口首行序号
	x0 = 0;

	// 修改文本X坐标至第一行
	TextX = 0;

	// 修改光标X坐标至第一行
	NowX = winEdit.Top() + 1;

	// 重新打印编辑窗口当前屏
	PrintText(winEdit.Top() + 1);

	// 输出位置
	ShowPosition();

	// 输出编辑窗口垂直滚动条
	winEdit.ScrollVertical(TextX);

	SetCursor();
}

void PressCtrlPageDown()
{
	// 输入Ctrl + PageDown
	// 到文件末尾

	// 修改文本X坐标至最后一行
	TextX = EndLine;

	if (EndLine >= winEdit.High())
	{
		// 需要向后翻屏

		// 修改编辑窗口首行序号
		x0 = EndLine - winEdit.High();

		// 修改光标X坐标至最后一行
		NowX = winEdit.Bottom() - 1;

		// 重新打印编辑窗口当前屏
		PrintText(winEdit.Top() + 1);
	}
	else
	{
		// 无需翻屏

		// 修改光标X坐标为最后一行
		NowX = EndLine + winEdit.Top() - x0 + 1;
	}

	// 输出位置
	ShowPosition();

	// 输出编辑窗口垂直滚动条
	winEdit.ScrollVertical(TextX);

	SetCursor();
}

void PressEnter()
{
	// 处理输入Enter

	// 存储旧的着色特征码
	char OldColor[MaxY];
	strcpy(OldColor, Text[TextX]->Sign);

	// 存储旧的当前行文本
	char OldLine[MaxY];
	strcpy(OldLine, Text[TextX]->Line);

	// 取回车后剩余的当前行文本
	char LineTemp[MaxY];
	if (Insert)
	{
        GetMid(Text[TextX]->Line, 0, TextY - 1, LineTemp);
		strcpy(Text[TextX]->Line, LineTemp);
	}

	// 标准化上一行
	StandardizeLine(TextX);

	ErrorType ErrorID = CheckLine(Text[TextX]->Line);
	if (ErrorID != NoError)
	{
		strcpy(Text[TextX]->Sign, OldColor);
		strcpy(Text[TextX]->Line, OldLine);

		gettext(1, 1, 80, 25, TextMirror);
		ShowError(ErrorID, TextX, "");
		Error = NoError;

		TextY = LengthOf(TextX);

		NowX = TextX - x0 + winEdit.Top() + 1;
		NowY = winEdit.Left() + TextY + 1;

		PrintText(TextX - x0 + winEdit.Top() + 1);

		SetCursor();

		return;
	}
	else
	{
		strcpy(Text[TextX]->Line, OldLine);
	}

	if (TextX < MaxX - 1)
	{
		// 当前行小于最大允许行数

		if (Insert)
		{
			// 当前处于插入模式

			if (EndLine == TotRoomLine)
			{
				// 需要申请新的文本行空间

				// 申请新的文本行
				NewLine();

				if (Error)
				{
					// 无空闲内存可申请

					return;
				}
			}

			// 设置修改标志
			ShowSaved(false);

			// 总行数加1
			EndLine++;

			// 修改编辑窗口文本总高度
			winEdit.SetTotHigh(EndLine);

			// 将当前行的下一行(不含)以后的各行依次向下移动一行(文本,着色码,标记,断点)
			for (int i = EndLine; i > TextX + 1; 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[TextX + 1]->Line, ' ');

			// 当前行的下一行需重新着色
			Text[TextX + 1]->Sign[0] = ' ';

			// 当前行的长度(非空格)
			int j = LengthOf(TextX);

			// 处理标记、断点和着色码
			if (0 < TextY && TextY < j)
			{
				// 当前行被截断

				// 删除当前行和下一行的标记和断点
				Text[TextX]->Mark = false;
				Text[TextX]->Break = false;
				Text[TextX + 1]->Mark = false;
				Text[TextX + 1]->Break = false;

				// 当前行和下一行需要重新着色
				Text[TextX]->Sign[0] = ' ';
				Text[TextX + 1]->Sign[0] = ' ';
			}
			else if (TextY >= j)
			{
				// 从当前行末尾处回车,当前行完好

				// 删除下一行的标记和断点
				Text[TextX + 1]->Mark = false;
				Text[TextX + 1]->Break = false;

				// 下一行需要重新着色
				Text[TextX + 1]->Sign[0] = ' ';
			}
			else
			{
				// 当前行被整体移动到下一行

				// 复制当前行的标记和断点至下一行。
				Text[TextX + 1]->Mark = Text[TextX]->Mark;
				Text[TextX + 1]->Break = Text[TextX]->Break;

				// 删除当前行的标记和断点
				Text[TextX]->Mark = false;
				Text[TextX]->Break = false;

				// 当前行需要重新着色
				Text[TextX]->Sign[0] = ' ';

				// 复制当前行的着色码至下一行
				strcpy(Text[TextX + 1]->Sign, Text[TextX]->Sign);
			}

			// 当前行光标处开始的文本被移动到下一行
			for (i = TextY; i < j; i++)
			{
				Text[TextX + 1]->Line[i - TextY] = Text[TextX]->Line[i];
			}

			// 清空当前行后部多余的文本
			for (i = TextY; i < LengthOf(TextX); i++)
			{
				Text[TextX]->Line[i]=' ';
			}
		}
		else if (TextX < EndLine)
		{
			// 当前处于改写模式,且不是最后一行

			// 修改文本坐标
			TextX++;
			TextY = 0;


			if (NowX == winEdit.Bottom() - 1)
			{
				// 光标在编辑窗口的底行,需要向上翻屏

				// 编辑窗口首行序号加1
				x0++;

                // 输出编辑窗口垂直滚动条                
				winEdit.ScrollVertical(TextX);

				// 输出位置
				ShowPosition();
			}
			else
			{
				// 无需翻屏

				// 光标下移一行
				NowX++;
			}

			return;
		}

		StandardizeLine(TextX);

		// 文本X坐标加1
		TextX++;

		// 寻找前一行(非空)的行首位置(非空格),完成自动对齐缩进
		int i = TextX;
		int j;
		do
		{
			i--;
			j = 0;
			while (j < LengthOf(i) && Text[i]->Line[j] == ' ')
			{
				j++;
			}
		} while (i >= 0 && LengthOf(i) == 0);

		if (NextTab(j) > 0 && IsIndent(i))
		{
			// 当前行需要再缩进Tab各字符

			// 当前行的行首位置
			j = NextTab(j);

			if (LengthOf(TextX) > 0)
			{
				// 当前行非空

				// 将当前行文本前移至自动缩进位置
				for (i = LengthOf(TextX) + j; i >= j; i--)
				{
					Text[TextX]->Line[i] = Text[TextX]->Line[i - j];
				}

				// 清空当前行后部多余部分
				for (i = j - 1; i >= 0; i--)
				{
					Text[TextX]->Line[i] = ' ';
				}
			}
		}

		// 修改文本Y坐标为行首(非空格,带自动对齐缩进)
		TextY = j;

		// 修改光标Y坐标
		NowY = j + winEdit.Left() + 1;

		if (TextY > HeadOf(TextX))
		{
			// 当前行的行首位置在当前光标的前面,需要向后移动

			// 将当前行文本向后移动,至行首与光标对齐
			for (i = LengthOf(TextX) + j; i >= j; i--)
			{
				Text[TextX]->Line[i] = Text[TextX]->Line[i - j];
			}

			// 清空前部内容
			for (i = j - 1; i >= 0; i--)
			{
				Text[TextX]->Line[i] = ' ';
			}
		}

		if (NowX < winEdit.Bottom() - 1)
		{
			// 不需要翻屏

			// 光标下移1行
			NowX++;

			// 重新打印自当前行开始的各行
			PrintText(TextX - 1 - x0 + winEdit.Top() + 1);
		}
		else
		{
			// 需要翻屏

			// 编辑窗口首行序号加1
			x0++;

			// 重新打印编辑窗口当前屏
			PrintText(winEdit.Top() + 1);
		}

		// 输出位置
		ShowPosition();

		// 输出编辑窗口垂直滚动条
		winEdit.ScrollVertical(TextX);

		SetCursor();
	}
	else
	{
		// 无法再添加新的文本行

		// 警报
		Sound();
	}
}

void PressTab()
{
	// 处理输入Tab

	// 寻找当前位置后面的Tab区的开始位置
	int i = NextTab(TextY);

	// 当前行需要向后移动的字符数
	int Plus = i - TextY;

	if (i > 0)
	{
		// 后面还有Tab区

		if (Insert && LengthOf(TextX) + Plus < MaxY)
		{
			// 插入模式下,当前行不会超出编辑窗口宽度

			// 当前行向后移动,至行首与新Tab区开始点对齐
			for (int i = LengthOf(TextX); i >= TextY; i--)
			{
				Text[TextX]->Line[i + Plus] = Text[TextX]->Line[i];
			}

			// 清空行首多余部分
			for (i = 0; i < Plus; i++)
			{
				Text[TextX]->Line[i + TextY] = ' ';
			}

			// 当前行需重新着色
			Text[TextX]->Sign[0] = ' ';

			// 重新打印当前行
			PrintLine(TextX);

			// 文本Y坐标后移
			TextY += Plus;

			// 光标后移
			NowY += Plus;

			// 设置修改标志
			ShowSaved(false);
		}
		else if (!Insert && TextY + Plus < MaxY)
		{
			// 改写模式下,光标后面还有Tab区

			// 文本Y坐标后移
			TextY += Plus;

			// 光标后移
			NowY += Plus;
		}

		// 输出位置
		ShowPosition();
	}

	SetCursor();
}

void PressText(const int Key)
{
	// 处理输入其他字符

	if (isprint((char)Key) && 
		TextY < MaxY - 1 && 
		(Insert && LengthOf(TextX) < MaxY - 1 || (!Insert)))
	{
		// 输入的是普通文本

		if (Insert)
		{
			// 当前是插入模式

			// 当前位置后面的字符依次向后移动一个字符
			for (int i = LengthOf(TextX); i > TextY; i--)
			{
				Text[TextX]->Line[i] = Text[TextX]->Line[i - 1];
			}
		}

		// 将输入赋值给当前位置字符
		Text[TextX]->Line[TextY] = Key;

		// 当前行需要重新着色
		Text[TextX]->Sign[0] = ' ';

		// 重新打印当前行
		PrintLine(TextX);

		// 文本Y坐标右移
		TextY++;

		// 光标右移
		NowY++;

		// 设置修改标志
		ShowSaved(false);

		// 输出位置
		ShowPosition();
	}

	SetCursor();
}

int NextTab(const int Now)
{
	// 返回Now位置之后Tab区的开始位置

	int i = Now + 1;
	while (i < MaxY - 1 && !TabStart[i])
	{
		i++;
	}

	if (i < MaxY - 1)
	{
		return i;
	}
	else
	{
		return -1;
	}
}

int PreviousTab(const int Now)
{
	// 返回Now位置之前Tab区的开始位置

	int i = Now - 1;
	while (i > 0 && !TabStart[i])
	{
		i--;
	}

	if (i >= 0)
	{
		return i;
	}
	else
	{
		return -1;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -