📄 form1.cs
字号:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace PlxCompiler
{
//当前编辑窗口的信息结构体
public struct Infor
{
public Edit editFirst;
public string filename;
public string projectPath;
public string projectName;
}
public partial class Form1 : Form
{
PlxCompiler.Information infor;
PlxCompiler.OutPut output;
string projectfolder;
PlxCompile plx;
Infor InforPro;//当前激活的源文件指针
Infor[] projectStack;//项目文件标签
const int MaxFileCount = 100;//一个项目中文件的最大数目
int FileCount;
public Form1()
{
InitializeComponent();
infor = new PlxCompiler.Information(this);
projectStack = new Infor[MaxFileCount];
plx = new PlxCompile(this);
FileCount = 0;
//show the plx file
infor.Show();
项目信息ToolStripMenuItem.Enabled = true;
output = new PlxCompiler.OutPut(this);
output.Show();
this.debugToolStripMenuItem.Visible = false;
//infor.treeView1.Nodes.Add(String.Format("project_plx"));
//infor.AddNodes(String.Format("Untitled.plx"));
//infor.
}
//新建源文件
private void 源文件FToolStripMenuItem_Click(object sender, EventArgs e)
{
PlxCompiler.CreateFile createFile = new CreateFile(this, infor,InforPro);
createFile.Show();
/*string dir=createFile.getFileName();
PlxCompiler.Edit edit = new PlxCompiler.Edit(this);
edit.Name = dir;
edit.Show();
//show the plx file
infor.AddNodes(dir);*/
}
//建立工程
private void 工程PToolStripMenuItem_Click(object sender, EventArgs e)
{
PlxCompiler.CreateProject createPro = new PlxCompiler.CreateProject(this, infor);
//create new Project
createPro.Show();
}
//修改工程路径栏
public bool modifyProject(string folder)
{
projectfolder = folder;
projectName.Text = projectfolder;
return true;
}
public string getProjectFolder()
{
return projectfolder;
}
//项目信息栏显示与否
private void 项目信息ToolStripMenuItem_Click(object sender, EventArgs e)
{
if (项目信息ToolStripMenuItem.Checked) infor.Show();
else if (!项目信息ToolStripMenuItem.Checked) infor.Hide();
}
private void 输出信息ToolStripMenuItem_Click(object sender, EventArgs e)
{
if (输出信息ToolStripMenuItem.Checked) output.Show();
else if (!输出信息ToolStripMenuItem.Checked) output.Hide();
}
public void set输出信息()
{
if (输出信息ToolStripMenuItem.Checked) 输出信息ToolStripMenuItem.Checked = false;
else 输出信息ToolStripMenuItem.Checked = true;
}
private void 状态栏ToolStripMenuItem_Click(object sender, EventArgs e)
{
if (状态栏ToolStripMenuItem.Checked) statusStrip1.Show();
else if (!状态栏ToolStripMenuItem.Checked) statusStrip1.Hide();
}
private void 菜单栏ToolStripMenuItem_Click(object sender, EventArgs e)
{
if (菜单栏ToolStripMenuItem.Checked) toolStrip1.Show();
else if (!菜单栏ToolStripMenuItem.Checked) toolStrip1.Hide();
}
private void 打开工程ToolStripMenuItem_Click(object sender, EventArgs e)
{
}
private void 打开文件ToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
//string dir = Environment.GetFolderPath(Environment.SpecialFolder.Templates);
OpenFileDialog dlg = new OpenFileDialog();
//dlg.InitialDirectory = dir;
dlg.Title = "Open PLX File";
dlg.Filter = "PLX source file(*.plx)|*.plx|All Files|*.*";
if (dlg.ShowDialog() == DialogResult.OK)
{
string filename = dlg.FileName;
if (!isOpen(filename))
{
open(filename);
//richTextBox1.Clear();
infor.AddNodes(filename);
}
}
}
catch (IOException ex)
{
MessageBox.Show(ex.Message, "PlxCompiler",
MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}
private void 另存为AToolStripMenuItem_Click(object sender, EventArgs e)
{
SaveFileDialog dlg = new SaveFileDialog();
dlg.Title = "Save as PLX File";
dlg.Filter = "PLX source file(*.plx)|*.plx|All Files|*.*";
if (dlg.ShowDialog() == DialogResult.OK)
{
InforPro.editFirst.Save_file(dlg.FileName);
}
}
private void 保存SToolStripMenuItem_Click(object sender, EventArgs e)
{
InforPro.editFirst.Save_file();
}
private void 撤消UToolStripMenuItem_Click(object sender, EventArgs e)
{
if (InforPro.editFirst != null)
{
InforPro.editFirst.Menu_Undo(sender,e);
}
}
private void 重复RToolStripMenuItem_Click(object sender, EventArgs e)
{
if (InforPro.editFirst != null)
{
InforPro.editFirst.Menu_Redo(sender,e);
}
}
private void 剪切TToolStripMenuItem_Click(object sender, EventArgs e)
{
if (InforPro.editFirst != null)
{
InforPro.editFirst.Menu_Cut(sender, e);
}
}
private void 复制CToolStripMenuItem_Click(object sender, EventArgs e)
{
if (InforPro.editFirst != null)
{
InforPro.editFirst.Menu_Copy(sender, e);
}
}
private void 粘贴PToolStripMenuItem_Click(object sender, EventArgs e)
{
if (InforPro.editFirst != null)
{
InforPro.editFirst.Menu_Paste(sender, e);
}
}
private void 全选AToolStripMenuItem_Click(object sender, EventArgs e)
{
if (InforPro.editFirst != null)
{
InforPro.editFirst.Menu_Select(sender, e);
}
}
private void 编译CToolStripMenuItem_Click(object sender, EventArgs e)
{
if (FileCount == 0) return;
output.shows("Save to " + InforPro.editFirst.Text+"\r\n",0);
if (InforPro.editFirst.changed) InforPro.editFirst.Save_file();
plx.FileOpen(InforPro.editFirst.Text);
output.shows_add("Compiling..."+"\r\n",0);
plx.Compiler();
if (plx.errornum == 0)
{
output.shows_add("Succeed..." + "\r\n",0);
}
else
{
output.shows_add("总共 "+plx.errornum + " errors",-1);
}
//Console.WriteLine(plx.lineIndex);
}
private void 构建BToolStripMenuItem_Click(object sender, EventArgs e)
{
if (FileCount == 0) return;
plx.showCode();
char[] a = new char[] { '.' };
int bb = InforPro.editFirst.Text.LastIndexOfAny(a);
string middleCodePath =InforPro.editFirst.Text.Substring(0,bb)+".mcp";
try
{
FileStream saveFile = new FileStream(middleCodePath, FileMode.OpenOrCreate);
StreamWriter fileWrite = new StreamWriter(saveFile, Encoding.UTF8);
fileWrite.Write(plx.codeSource);
fileWrite.Close();
}
catch (IOException ee)
{
}
output.shows("Save middleCode to " + middleCodePath + "\r\n", 0);
output.shows_add(plx.codeSource,0);
}
private void 运行RToolStripMenuItem_Click(object sender, EventArgs e)
{
if (FileCount == 0) return;
if (InforPro.editFirst.changed)
{
plx.FileOpen(InforPro.editFirst.Text);
plx.Compiler();
if (plx.errornum == 0)
{
output.shows_add("Succed..." + "\r\n", 0);
}
else
{
output.shows_add("总共 " + plx.errornum + " errors", -1);
}
}
plx.interpret();
output.shows("程序运行结果如下:\r\n", 0);
output.shows_add(plx.result,0);
}
private void 关于AToolStripMenuItem_Click(object sender, EventArgs e)
{
AboutBox1 about = new AboutBox1();
about.Show();
}
private void 字体CToolStripMenuItem_Click(object sender, EventArgs e)
{
if (fontDialog1.ShowDialog() == DialogResult.OK && InforPro.editFirst != null)
{
InforPro.editFirst.font(fontDialog1.Font);
}
}
//注册窗口
public void registeEdit(Edit edit1)
{
InforPro.editFirst = edit1;
projectStack[FileCount].editFirst = edit1;
//projectStack[FileCount].filename = filename;
FileCount++;
}
//显示选中的文件
public void open(string filename)//
{
if (isOpen(filename))
{
return;
}
PlxCompiler.Edit edit = new PlxCompiler.Edit(this, filename);
char[] a = new char[] { '\\' };
int bb = filename.LastIndexOfAny(a);
string temp = filename.Substring(0, bb);
bb = temp.LastIndexOfAny(a);
temp = temp.Substring(bb + 1);
InforPro.editFirst = edit;
InforPro.filename = filename;
InforPro.projectName = temp;
projectStack[FileCount].editFirst = edit;
projectStack[FileCount].filename = filename;
projectStack[FileCount].projectName = temp;
FileCount++;
edit.Show();
edit.Load_File(filename);
}
//判断该接点的窗口是否打开
public bool isOpen(string name)
{
for (int i = 0; i < FileCount; i++)
{
if (name.Equals(projectStack[i].editFirst.Text))
{
projectStack[i].editFirst.Activate();
InforPro.editFirst = projectStack[i].editFirst;
InforPro.filename = projectStack[i].filename;
InforPro.projectName = projectStack[i].projectName;
InforPro.projectPath = projectStack[i].projectPath;
return true;
}
}
return false;
}
//关闭窗口
public void close_window(string name)
{
int i;
for (i = 0; i < FileCount; i++)
{
if (name.Equals(projectStack[i].editFirst.Text))
{
FileCount--;
break;
}
}
for (int j = i; j < FileCount; j++)
{
projectStack[j].editFirst = projectStack[j + 1].editFirst;
projectStack[j].projectName = projectStack[j + 1].projectName;
projectStack[j].filename = projectStack[j + 1].filename;
InforPro.editFirst = projectStack[j + 1].editFirst;
}
}//
//任务栏的显示
public void setColumRow(string total,string row, string colum)
{
Total.Text = total;
Colum.Text = colum;
Row.Text = row;
}
public void saveFile(string filename)
{
try
{
FileStream saveFile = new FileStream(filename, FileMode.OpenOrCreate);
StreamWriter fileWrite = new StreamWriter(saveFile, System.Text.Encoding.Default);
fileWrite.Write(filename);
//this.richTextBox1.SaveFile(this.Text, RichTextBoxStreamType.PlainText);
output.shows_add("已保存文件 " +filename+"\r\n",0);
fileWrite.Close();
}
catch (IOException e)
{
;
}
}
public void outerror(string a)
{
output.shows_add(a, -1);
}
public void show(string a)
{
output.shows_add(a, 0);
}
private void 清空输出窗口CToolStripMenuItem_Click(object sender, EventArgs e)
{
output.shows("", 0);
}
private void 退出XToolStripMenuItem_Click(object sender, EventArgs e)
{
this.Dispose();
}
private void 保存中间代码MToolStripMenuItem_Click(object sender, EventArgs e)
{
SaveFileDialog dlg = new SaveFileDialog();
dlg.Title = "Save PLX File";
dlg.Filter = "PLX Middle Code file(*.mcp)|*.mcp|All Files|*.*";
if (dlg.ShowDialog() == DialogResult.OK && plx != null)
{
try
{
FileStream saveFile = new FileStream(dlg.FileName, FileMode.OpenOrCreate);
StreamWriter fileWrite = new StreamWriter(saveFile, Encoding.UTF8);
fileWrite.Write(plx.codeSource);
fileWrite.Close();
}
catch (IOException e22)
{
output.shows("Failed!",-1);
}
}
}
private void debugToolStripMenuItem_Click(object sender, EventArgs e)
{
}
private void statusStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -