📄 editor.cs
字号:
///BUG:
///1、中文输入有问题(Event KeyUp)--采用SelectionChanged事件处理--Great work!(OK)
///2、CUT、COPY、PASTE有STA问题(在main前加[STAThreadAttribute]修饰)。(OK)
///3、开始时焦点问题。(OK)
///4、CLOSE时应该提示是否需要保存。(OK)
///5、UNDO与REDO没有作用(怎么解决呢?)
///6、看来还有一个容量问题(比如打开本文件时出错...)?
///REVIEW:richard stone
///DATE:2002-07-27
using System;
using System.IO;
using System.Windows.Forms;
using System.Drawing;
using System.ComponentModel;//有什么用呢?---CancalEventHandler有用.
class Editor:Form
{
ToolBar tbEditor;
static bool IsContentModified=false;
StatusBar sbEditor;
ImageList imlEditor;
RichTextBox txtEditor;
Timer tmrEditor;
MainMenu mnuMain;
MenuItem mnuFile;
MenuItem mnuEdit;
MenuItem mnuFormat;
MenuItem mnuHelp;
static bool IsDirectionDownward=true; //true means "Down" false means "Up"
static string TextToFind="";
static string TextToReplace="";
//构造函数(属性与事件设置、加入父窗体)
public Editor()
{
tbEditor=new ToolBar();
tbEditor.ButtonClick+=new ToolBarButtonClickEventHandler(ToolBarButton_Click);
sbEditor=new StatusBar();
sbEditor.ShowPanels=true;
imlEditor=new ImageList();
tbEditor.ImageList=imlEditor;
LoadToolBarButton();
LoadStatusBarPanel();
txtEditor=new RichTextBox();
txtEditor.Location=new Point(0,tbEditor.Top+tbEditor.Height+2);
txtEditor.Size=new Size(this.Width-10,this.Height-tbEditor.Height-sbEditor.Height-30);
txtEditor.Anchor=AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Bottom;
txtEditor.Multiline=true;
txtEditor.AcceptsTab=true;
txtEditor.HideSelection=false;
txtEditor.ScrollBars=RichTextBoxScrollBars.Both;
// txtEditor.KeyUp+=new KeyEventHandler(TextBox_KeyUp);//对中文输入有影响
// txtEditor.KeyPress+=new KeyPressEventHandler(TextBox_KeyPress);
// txtEditor.MouseDown+=new MouseEventHandler(TextBox_MouseDown);
txtEditor.TextChanged+=new EventHandler(TextBox_Change);
txtEditor.SelectionChanged+=new EventHandler(TextBox_SelectionChanged);//解决问题的办法
txtEditor.WordWrap=true;
txtEditor.AutoSize=false;
mnuMain=new MainMenu();
LoadMainMenu();
LoadFileMenu();
LoadEditMenu();
LoadFormatMenu();
LoadHelpMenu();
//this.SuspendLayout();
this.Controls.Add(tbEditor);
this.Controls.Add(sbEditor);
this.Controls.Add(txtEditor);
this.Text="Untitled";
this.Menu=mnuMain;
this.WindowState=FormWindowState.Maximized;
//注册窗体启动事件
this.Load+=new EventHandler(Form_Load);
this.Closing+=new CancelEventHandler(Form_Closing);
//this.ResumeLayout(false);
}
//set the richtextbox to be focused when the form load first
private void Form_Load(object sender,EventArgs eArgs)
{
txtEditor.Focus();
}
private void Form_Closing(object sender,CancelEventArgs cArgs)
{
if (!WarnSave())
cArgs.Cancel=true;
}
//To set the Content modified flag--是否更改过--提示保存用
private void TextBox_Change(object sender,EventArgs eArgs)
{
IsContentModified=true;
}
//To Set Line,Col in StatusBar--显示光标位置--GOOD IDEA!
private void TextBox_SelectionChanged(object sender,EventArgs eArgs)
{
ShowInform();
}
//To Set Line,Col in StatusBar
//对中文输入有影响
// private void TextBox_KeyUp(object sender,KeyEventArgs kArgs)
// {
// ShowInform();
// }
//To Set Line,Col in StatusBar
// private void TextBox_KeyPress(object sender,KeyPressEventArgs kpArgs)
// {
// ShowInform();
// }
//
// //To Set Line,Col in StatusBar
// private void TextBox_MouseDown(object sender,MouseEventArgs mArgs)
// {
// ShowInform();
// }
//To Load MainMenu Entires
private void LoadMainMenu()
{
mnuFile=new MenuItem();
mnuFile.Text="&File";
mnuEdit=new MenuItem();
mnuEdit.Text="&Edit";
mnuFormat=new MenuItem();
mnuFormat.Text="F&ormat";
mnuHelp=new MenuItem();
mnuHelp.Text="&Help";
mnuMain.MenuItems.Add(mnuFile);
mnuMain.MenuItems.Add(mnuEdit);
mnuMain.MenuItems.Add(mnuFormat);
mnuMain.MenuItems.Add(mnuHelp);
}
private void LoadFileMenu()
{
string[] MenuCaption={"&New","&Open...","&Save","Save &As...","-","E&xit"};//,"Page Setup","Print","-"
for(int i=0;i<MenuCaption.Length;i++)
{
MenuItem mnuItem=new MenuItem();
mnuItem.Text=MenuCaption[i];
mnuItem.Click+=new EventHandler(Menu_Click);
switch(MenuCaption[i])
{
case "&New":
mnuItem.Shortcut=Shortcut.CtrlN;
break;
case "&Open":
mnuItem.Shortcut=Shortcut.CtrlO;
break;
case "&Save":
mnuItem.Shortcut=Shortcut.CtrlS;
break;
case "&Print":
mnuItem.Shortcut=Shortcut.CtrlP;
break;
}
mnuFile.MenuItems.Add(mnuItem);
}
}
private void LoadEditMenu()
{
string[] MenuCaption={"Undo","-","Cut","Copy","Paste","Delete","-","Find...","FindNext","Replace...","Go To...","-","Select All","Time/Date"};
Shortcut[] shortKey={Shortcut.CtrlZ,Shortcut.None,Shortcut.CtrlX,Shortcut.CtrlC,Shortcut.CtrlV,Shortcut.Del,Shortcut.None,Shortcut.CtrlF,Shortcut.F3,Shortcut.CtrlH,Shortcut.CtrlG,Shortcut.None,Shortcut.CtrlA,Shortcut.F5};
for(int i=0;i<MenuCaption.Length;i++)
{
MenuItem mnuItem=new MenuItem();
mnuItem.Text=MenuCaption[i];
mnuItem.Click+=new EventHandler(Menu_Click);
mnuItem.Shortcut=shortKey[i];
mnuEdit.MenuItems.Add(mnuItem);
}
}
private void LoadFormatMenu()
{
string[] MenuCaption={"WordWrap","Font..."};
for(int i=0;i<MenuCaption.Length;i++)
{
MenuItem mnuItem=new MenuItem();
mnuItem.Text=MenuCaption[i];
if(i==0)
{
mnuItem.Checked=true;
txtEditor.WordWrap=true;
}
mnuItem.Click+=new EventHandler(Menu_Click);
mnuFormat.MenuItems.Add(mnuItem);
}
}
private void LoadHelpMenu()
{
string[] MenuCaption={"About"};
for(int i=0;i<MenuCaption.Length;i++)
{
MenuItem mnuItem=new MenuItem();
mnuItem.Text=MenuCaption[i];
mnuItem.Click+=new EventHandler(Menu_Click);
mnuHelp.MenuItems.Add(mnuItem);
}
}
//To Load ToolBar Buttons
//是否有资源编辑器呢?并且能打包资源呢?
private void LoadToolBarButton()
{
string[] strToolTip={"New","Open","Save","","Cut","Copy","Paste","","Undo","Redo"};//,"","Print","Preview"};
ToolBarButton[] tbButton=new ToolBarButton[strToolTip.Length];
for(int i=0;i<strToolTip.Length;i++)
{
tbButton[i]=new ToolBarButton();
if(strToolTip[i].Length>0)
{
Image img=Image.FromFile("images/" + strToolTip[i] + ".bmp");
imlEditor.Images.Add(img);
tbButton[i].ImageIndex=imlEditor.Images.Count-1;
tbButton[i].ToolTipText=strToolTip[i];
}
else
{
tbButton[i].Style=ToolBarButtonStyle.Separator;
}
tbEditor.Buttons.Add(tbButton[i]);
}
}
//To Load StatusBar Panels
private void LoadStatusBarPanel()
{
string[] strToolTip={"Line:1","Col:1","","Time"};
for(int i=0;i<strToolTip.Length;i++)
{
StatusBarPanel sbPanel=new StatusBarPanel();
sbPanel.Text=strToolTip[i];
sbPanel.BorderStyle=StatusBarPanelBorderStyle.Sunken;
if(strToolTip[i].Length==0)
sbPanel.Width=500;
sbEditor.Panels.Add(sbPanel);
if(strToolTip[i]=="Time")
Timer_Tick(null,null);
}
tmrEditor=new Timer();
tmrEditor.Interval=1000;
tmrEditor.Tick+=new EventHandler(Timer_Tick);
tmrEditor.Start();
}
//To Show Time in StatusBar
private void Timer_Tick(object sender,EventArgs eArgs)
{
DateTime CurrentTime=DateTime.Now;
int h=CurrentTime.Hour;
int m=CurrentTime.Minute;
int s=CurrentTime.Second;
string TimeInString=(h>9)?h.ToString():"0" + h.ToString();
TimeInString+=":";
TimeInString+=(m>9)?m.ToString():"0" + m.ToString();
TimeInString+=":";
TimeInString+=(s>9)?s.ToString():"0" + s.ToString();
sbEditor.Panels[sbEditor.Panels.Count-1].Text=TimeInString;
}
//ToolBar Button Click Event Handler
//这里有点奇怪?这里的事件处理机制有点象SIGN/SIGNAL----VERY USEFUL
private void ToolBarButton_Click(object sender,ToolBarButtonClickEventArgs tbArgs)
{
//这里有点奇怪?--MenuToolBarEventHandler是一个自定义函数
MenuToolBarEventHandler(((ToolBar)sender).Buttons.IndexOf(tbArgs.Button));
}
public void Menu_Click(object sender,EventArgs eArgs)
{
string MenuCaption=((MenuItem)sender).Text;
switch(MenuCaption)
{
case "&New":
DoNew();
break;
case "&Open...":
DoOpen();
break;
case "&Save":
DoSave();
break;
case "Save &As...":
DoSaveAs(true);
break;
case "Print":
break;
case "PageSetup":
break;
case "E&xit":
WarnSave();//提示是否存盘
this.Dispose();//立即释放资源
Application.Exit();//类似MFC中的CWinApp???
break;
case "Undo":
DoUndo();
break;
case "Cut":
DoCut();
break;
case "Copy":
DoCopy();
break;
case "Paste":
DoPaste();
break;
case "Delete":
if(txtEditor.SelectionLength==0)
txtEditor.SelectionLength=1;
txtEditor.SelectedText="";
break;
case "Find...":
ShowFind();
break;
case "FindNext":
Find_Click(null,null);//调用事件处理函数???
break;
case "Replace...":
ShowReplace();
break;
case "Go To...":
int LineNumber=GoTo(sbEditor.Panels[0].Text.Substring(6).Trim());
if(LineNumber>0)
{
MoveToLine(LineNumber);
}
else
{
if(LineNumber<0)
MessageBox.Show("Invalid Line Number.");
}
break;
case "Select All":
txtEditor.SelectionStart=0;
txtEditor.SelectionLength=txtEditor.Text.Length;
break;
case "Time/Date":
txtEditor.SelectedText=DateTime.Now.ToString();
break;
case "WordWrap":
((MenuItem)sender).Checked=!((MenuItem)sender).Checked;
txtEditor.WordWrap=((MenuItem)sender).Checked;
break;
case "Font...":
SetFont();
break;
case "About":
MessageBox.Show("C# Editor By H.Prasad\n\nReviewed by Richard Stone");//Modified...
break;
}
}
public void MenuToolBarEventHandler(int OperationIndex)
{
switch(OperationIndex)
{
case 0: //New
DoNew();
break;
case 1: //Open
DoOpen();
break;
case 2: //Save as
DoSaveAs(true);
break;
case 3: //speratebar
break;
case 4: //Cut
DoCut();
break;
case 5: //Copy
DoCopy();
break;
case 6: //Paste
DoPaste();
break;
case 7://speratebar
break;
case 8: //Undo
DoUndo();
break;
case 9: //Redo
DoRedo();
break;
case 11: //Print
break;
case 12: //Preview
break;
case 13: //Page Setup
break;
}
}
//定位到指定的行--写得比较巧妙--注意IsMoved的运用
public void MoveToLine(int LineNumber)
{
int CRPosition=txtEditor.Text.IndexOf("\n");
int LineCount=0;
bool IsMoved=false;
while(CRPosition >-1 && !IsMoved)
{
LineCount++;
if(LineNumber==LineCount)
{
txtEditor.SelectionStart=CRPosition-1;
//ShowInform();
IsMoved=true;
}
CRPosition=txtEditor.Text.IndexOf("\n",CRPosition+1);
}
if(!IsMoved)
{
if(LineNumber==LineCount+1)
txtEditor.SelectionStart=txtEditor.Text.Length;
else
MessageBox.Show("Line Number Out of Range");
}
}
private void DoCut()
{
if(txtEditor.SelectedText!="")
{
txtEditor.Cut();
ShowInform();
}
}
private void DoCopy()
{
if(txtEditor.SelectedText!="")
{
txtEditor.Copy();
ShowInform();
}
}
private void DoPaste()
{
if(Clipboard.GetDataObject().GetDataPresent("System.String")==true)
{
txtEditor.Paste();
ShowInform();
}
}
//好象没什么用啊
private void DoUndo()
{
if(txtEditor.CanUndo)
{
txtEditor.Undo();
ShowInform();
}
}
//好象没什么用啊
private void DoRedo()
{
if(txtEditor.CanUndo)
{
txtEditor.Undo();
ShowInform();
}
}
public void DoSaveAs(bool ShowDialog)
{
bool CanWrite=false;
SaveFileDialog dlgSave=new SaveFileDialog();
dlgSave.Filter="Text Files (*.txt)|*.txt|C# Files(*.cs)|*.cs|All Files (*.*)|*.*";
dlgSave.FilterIndex=2;
dlgSave.RestoreDirectory=true;
string FileName="";
if(ShowDialog)
{
if(dlgSave.ShowDialog()==DialogResult.OK)
{
FileName=dlgSave.FileName;
CanWrite=true;
}
}
else
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -