Files
CMLeonOS/Editor.cs
2026-01-30 21:55:35 +08:00

302 lines
11 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
namespace CMLeonOS
{
// 简单的代码编辑器类
// 支持基本的文本编辑功能,如输入、删除、移动光标等
// 支持文件的加载和保存
public class Editor
{
private string fileName; // 要编辑的文件名
private List<string> lines; // 文件内容的行列表
private int currentLine; // 当前光标所在行
private int currentColumn; // 当前光标所在列
private bool isRunning; // 编辑器是否正在运行
private FileSystem fileSystem; // 文件系统实例,用于读写文件
// 构造函数
// 参数fileName - 要编辑的文件名
// 参数fs - 文件系统实例
public Editor(string fileName, FileSystem fs)
{
this.fileName = fileName;
this.fileSystem = fs;
this.lines = new List<string>();
this.currentLine = 0;
this.currentColumn = 0;
this.isRunning = true;
LoadFile();
}
// 运行编辑器
// 主循环:渲染界面 -> 处理输入 -> 重复
public void Run()
{
while (isRunning)
{
Render();
HandleInput();
}
}
// 加载文件内容
private void LoadFile()
{
try
{
// 尝试从文件系统读取文件内容
string content = fileSystem.ReadFile(fileName);
if (!string.IsNullOrEmpty(content))
{
// 分割内容为行
string[] fileLines = content.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.None);
foreach (string line in fileLines)
{
lines.Add(line);
}
}
else
{
// 文件不存在或为空,创建新文件
lines.Add("");
}
}
catch
{
// 文件不存在,创建新文件
lines.Add("");
}
}
// 保存文件内容
private void SaveFile()
{
try
{
// 简化实现,避免可能导致栈损坏的操作
string content = "";
for (int i = 0; i < lines.Count; i++)
{
content += lines[i];
if (i < lines.Count - 1)
{
content += "\n";
}
}
// 直接使用CreateFile因为它会覆盖现有文件
try
{
fileSystem.CreateFile(fileName, content);
Console.WriteLine($"File saved: {fileName}");
}
catch (Exception ex)
{
Console.WriteLine($"Error saving file: {ex.Message}");
}
}
catch (Exception ex)
{
Console.WriteLine($"Error in SaveFile: {ex.Message}");
}
}
// 渲染编辑器界面
private void Render()
{
Console.Clear();
// 显示标题栏
Console.WriteLine($"CMLeonOS Editor - {fileName}");
Console.WriteLine("--------------------------------");
Console.WriteLine("Commands: Esc = Exit");
Console.WriteLine();
// 显示文件内容(限制显示行数,避免超出控制台高度)
int maxVisibleLines = 15; // 假设控制台高度为25行留10行给其他内容
int startLine = Math.Max(0, currentLine - maxVisibleLines / 2);
int endLine = Math.Min(lines.Count, startLine + maxVisibleLines);
for (int i = startLine; i < endLine; i++)
{
string line = lines[i];
Console.WriteLine($"{i + 1}: {line}");
}
// 显示光标位置
Console.WriteLine();
Console.WriteLine($"Cursor: Line {currentLine + 1}, Column {currentColumn + 1}");
Console.WriteLine($"Lines: {lines.Count}");
// 计算光标位置,确保不超出控制台高度
int consoleHeight = 25; // 假设控制台高度为25行
int titleLines = 4; // 标题栏占用的行数
int visibleLines = endLine - startLine;
int cursorY = titleLines + (currentLine - startLine);
// 确保光标Y位置在有效范围内
cursorY = Math.Max(titleLines, Math.Min(cursorY, consoleHeight - 5)); // 留5行给状态信息
// 设置光标位置
try
{
Console.SetCursorPosition(currentColumn + 4, cursorY);
}
catch
{
// 如果设置光标位置失败,忽略错误
}
}
// 处理用户输入
private void HandleInput()
{
ConsoleKeyInfo keyInfo = Console.ReadKey(true);
switch (keyInfo.Key)
{
case ConsoleKey.Escape:
// 显示保存确认弹窗
ShowSaveConfirmation();
break;
case ConsoleKey.Backspace:
// 删除字符
if (currentColumn > 0)
{
string line = lines[currentLine];
line = line.Remove(currentColumn - 1, 1);
lines[currentLine] = line;
currentColumn--;
}
else if (currentLine > 0)
{
// 如果在行首,合并到上一行
string previousLine = lines[currentLine - 1];
string lineText = lines[currentLine];
lines.RemoveAt(currentLine);
currentLine--;
currentColumn = previousLine.Length;
lines[currentLine] = previousLine + lineText;
}
break;
case ConsoleKey.Enter:
// 插入换行
string currentLineText = lines[currentLine];
string firstPart = currentLineText.Substring(0, currentColumn);
string secondPart = currentLineText.Substring(currentColumn);
lines[currentLine] = firstPart;
lines.Insert(currentLine + 1, secondPart);
currentLine++;
currentColumn = 0;
break;
case ConsoleKey.LeftArrow:
// 左移光标
if (currentColumn > 0)
{
currentColumn--;
}
break;
case ConsoleKey.RightArrow:
// 右移光标
if (currentColumn < lines[currentLine].Length)
{
currentColumn++;
}
break;
case ConsoleKey.UpArrow:
// 上移光标
if (currentLine > 0)
{
currentLine--;
currentColumn = Math.Min(currentColumn, lines[currentLine].Length);
}
break;
case ConsoleKey.DownArrow:
// 下移光标
if (currentLine < lines.Count - 1)
{
currentLine++;
currentColumn = Math.Min(currentColumn, lines[currentLine].Length);
}
break;
default:
// 输入字符
if (char.IsLetterOrDigit(keyInfo.KeyChar) || char.IsPunctuation(keyInfo.KeyChar) || char.IsSymbol(keyInfo.KeyChar) || keyInfo.KeyChar == ' ')
{
string line = lines[currentLine];
line = line.Insert(currentColumn, keyInfo.KeyChar.ToString());
lines[currentLine] = line;
currentColumn++;
}
break;
}
}
// 显示保存确认弹窗
private void ShowSaveConfirmation()
{
// 简化版本避免使用可能在Cosmos中不支持的功能
Console.Clear();
// 显示灰色背景的确认弹窗
Console.BackgroundColor = ConsoleColor.DarkGray;
Console.ForegroundColor = ConsoleColor.White;
// 简单的弹窗显示
Console.WriteLine("+----------------------------+");
Console.WriteLine("| Save File? |");
Console.WriteLine("+----------------------------+");
Console.WriteLine("| Do you want to save the |");
Console.WriteLine("| changes? |");
Console.WriteLine("+----------------------------+");
Console.WriteLine("| Y = Yes, N = No |");
Console.WriteLine("+----------------------------+");
// 等待用户输入
while (true)
{
ConsoleKeyInfo keyInfo;
try
{
keyInfo = Console.ReadKey(true);
}
catch
{
// 如果ReadKey失败直接退出
Console.ResetColor();
Console.Clear();
isRunning = false;
return;
}
if (keyInfo.Key == ConsoleKey.Y)
{
// 保存文件
try
{
SaveFile();
}
catch
{
Console.WriteLine("Error saving file");
}
Console.ResetColor();
Console.Clear();
isRunning = false;
break;
}
else if (keyInfo.Key == ConsoleKey.N)
{
// 不保存文件
Console.ResetColor();
Console.Clear();
isRunning = false;
break;
}
}
}
}
}