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

📄 editor.cs

📁 C#做的编辑器源代码,是学习文本编辑器编程的好资料
💻 CS
📖 第 1 页 / 共 2 页
字号:
///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 + -