home *** CD-ROM | disk | FTP | other *** search
/ Programming in Microsoft Windows with C# / Programacion en Microsoft Windows con C#.iso / Original Code / Edit List and Spin / NotepadCloneWithFile / NotepadCloneWithFile.cs next >
Encoding:
Text File  |  2001-01-15  |  12.0 KB  |  365 lines

  1. //---------------------------------------------------
  2. // NotepadCloneWithFile.cs ⌐ 2001 by Charles Petzold
  3. //---------------------------------------------------
  4. using Microsoft.Win32;             // For registry classes
  5. using System;
  6. using System.ComponentModel;       // For CancelEventArgs class
  7. using System.Drawing;
  8. using System.IO;
  9. using System.Text;                 // For Encoding class
  10. using System.Windows.Forms;
  11.  
  12. class NotepadCloneWithFile: NotepadCloneWithRegistry
  13. {
  14.                                                             // Fields
  15.      protected string strFileName;
  16.      const     string strEncoding = "Encoding";        // For registry
  17.      const     string strFilter = 
  18.                          "Text Documents(*.txt)|*.txt|All Files(*.*)|*.*";
  19.      MenuItem         miEncoding;
  20.      MenuItemEncoding mieChecked;
  21.                                                             // Entry point
  22.      public new static void Main()
  23.      {
  24.           Application.Run(new NotepadCloneWithFile());
  25.      }
  26.                                                             // Constructor
  27.      public NotepadCloneWithFile()
  28.      {
  29.           strProgName = "Notepad Clone with File";
  30.           MakeCaption();
  31.           Menu = new MainMenu();
  32.  
  33.                // File menu
  34.  
  35.           MenuItem mi = new MenuItem("&File");
  36.           Menu.MenuItems.Add(mi);
  37.           int index = Menu.MenuItems.Count - 1;
  38.  
  39.                // File New
  40.  
  41.           mi = new MenuItem("&New");
  42.           mi.Click += new EventHandler(MenuFileNewOnClick);
  43.           mi.Shortcut = Shortcut.CtrlN;
  44.           Menu.MenuItems[index].MenuItems.Add(mi);
  45.  
  46.                // File Open
  47.  
  48.           MenuItem miFileOpen = new MenuItem("&Open...");
  49.           miFileOpen.Click += new EventHandler(MenuFileOpenOnClick);
  50.           miFileOpen.Shortcut = Shortcut.CtrlO;
  51.           Menu.MenuItems[index].MenuItems.Add(miFileOpen);
  52.  
  53.                // File Save
  54.  
  55.           MenuItem miFileSave  = new MenuItem("&Save");
  56.           miFileSave.Click += new EventHandler(MenuFileSaveOnClick);
  57.           miFileSave.Shortcut = Shortcut.CtrlS;
  58.           Menu.MenuItems[index].MenuItems.Add(miFileSave);
  59.  
  60.                // File Save As
  61.  
  62.           mi = new MenuItem("Save &As...");
  63.           mi.Click += new EventHandler(MenuFileSaveAsOnClick);
  64.           Menu.MenuItems[index].MenuItems.Add(mi);
  65.  
  66.                // File Encoding
  67.  
  68.           miEncoding = new MenuItem("&Encoding");
  69.           Menu.MenuItems[index].MenuItems.Add(miEncoding);
  70.           Menu.MenuItems[index].MenuItems.Add("-");
  71.  
  72.                // File Encoding submenu
  73.  
  74.           EventHandler eh = new EventHandler(MenuFileEncodingOnClick);
  75.  
  76.           string[] astrEncodings = { "&ASCII", "&Unicode", 
  77.                                      "&Big-Endian Unicode",
  78.                                      "UTF-&7", "&UTF-&8" };
  79.  
  80.           Encoding[] aenc = { Encoding.ASCII, Encoding.Unicode, 
  81.                               Encoding.BigEndianUnicode, 
  82.                               Encoding.UTF7, Encoding.UTF8 };
  83.  
  84.           for (int i = 0; i < astrEncodings.Length; i++)
  85.           {
  86.                MenuItemEncoding mie = new MenuItemEncoding();
  87.                mie.Text = astrEncodings[i];
  88.                mie.Encoding = aenc[i];
  89.                mie.RadioCheck = true;
  90.                mie.Click += eh;
  91.  
  92.                miEncoding.MenuItems.Add(mie);
  93.           }
  94.           mieChecked = (MenuItemEncoding) miEncoding.MenuItems[4];  // UTF-8
  95.           mieChecked.Checked = true;
  96.  
  97.                // File Page Setup
  98.  
  99.           mi = new MenuItem("Page Set&up...");
  100.           mi.Click += new EventHandler(MenuFileSetupOnClick);
  101.           Menu.MenuItems[index].MenuItems.Add(mi);
  102.  
  103.                // File Print Preview
  104.  
  105.           mi = new MenuItem("Print Pre&view...");
  106.           mi.Click += new EventHandler(MenuFilePreviewOnClick);
  107.           Menu.MenuItems[index].MenuItems.Add(mi);
  108.  
  109.                // File Print
  110.  
  111.           mi = new MenuItem("&Print...");
  112.           mi.Click += new EventHandler(MenuFilePrintOnClick);
  113.           mi.Shortcut = Shortcut.CtrlP;
  114.           Menu.MenuItems[index].MenuItems.Add(mi);
  115.           Menu.MenuItems[index].MenuItems.Add("-");
  116.  
  117.                // File Exit
  118.  
  119.           mi = new MenuItem("E&xit");
  120.           mi.Click += new EventHandler(MenuFileExitOnClick);
  121.           Menu.MenuItems[index].MenuItems.Add(mi);
  122.  
  123.                // Set system event.
  124.  
  125.           SystemEvents.SessionEnding += 
  126.                               new SessionEndingEventHandler(OnSessionEnding);
  127.      }
  128.                                                        // Event overrides
  129.      protected override void OnLoad(EventArgs ea)
  130.      {
  131.           base.OnLoad(ea);     
  132.  
  133.                // Deal with the command-line argument.
  134.  
  135.           string[] astrArgs = Environment.GetCommandLineArgs();
  136.  
  137.           if (astrArgs.Length > 1)      // First argument is program name!
  138.           {
  139.                if (File.Exists(astrArgs[1]))
  140.                {
  141.                     LoadFile(astrArgs[1]);
  142.                }
  143.                else
  144.                {
  145.                     DialogResult dr = 
  146.                          MessageBox.Show("Cannot find the " +
  147.                                          Path.GetFileName(astrArgs[1]) + 
  148.                                          " file.\r\n\r\n" +
  149.                                          "Do you want to create a new file?",
  150.                                          strProgName,
  151.                                          MessageBoxButtons.YesNoCancel,
  152.                                          MessageBoxIcon.Question);
  153.                     switch(dr)
  154.                     {
  155.                     case DialogResult.Yes:   // Create and close file.
  156.                          File.Create(strFileName = astrArgs[1]).Close();
  157.                          MakeCaption();
  158.                          break;
  159.  
  160.                     case DialogResult.No:
  161.                          break;
  162.  
  163.                     case DialogResult.Cancel:
  164.                          Close();
  165.                          break;
  166.                     }
  167.                }
  168.           }
  169.      }
  170.      protected override void OnClosing(CancelEventArgs cea)
  171.      {
  172.           base.OnClosing(cea);
  173.  
  174.           cea.Cancel = !OkToTrash();
  175.      }
  176.                                                             // Event handlers
  177.      void OnSessionEnding(object obj, SessionEndingEventArgs seea)
  178.      {
  179.           seea.Cancel = !OkToTrash();          
  180.      }
  181.                                                             // Menu items
  182.      void MenuFileNewOnClick(object obj, EventArgs ea)
  183.      {
  184.           if (!OkToTrash())
  185.                return;
  186.  
  187.           txtbox.Clear();
  188.           txtbox.ClearUndo();
  189.           txtbox.Modified = false;
  190.  
  191.           strFileName = null;
  192.           MakeCaption();
  193.      }
  194.      void MenuFileOpenOnClick(object obj, EventArgs ea)
  195.      {
  196.           if (!OkToTrash())
  197.                return;
  198.  
  199.           OpenFileDialog ofd = new OpenFileDialog();
  200.           ofd.Filter = strFilter;
  201.           ofd.FileName = "*.txt";
  202.  
  203.           if (ofd.ShowDialog() == DialogResult.OK)
  204.                LoadFile(ofd.FileName);
  205.      }
  206.      void MenuFileEncodingOnClick(object obj, EventArgs ea)
  207.      {
  208.           mieChecked.Checked = false;
  209.           mieChecked = (MenuItemEncoding) obj;
  210.           mieChecked.Checked = true;
  211.      }
  212.      void MenuFileSaveOnClick(object obj, EventArgs ea)
  213.      {
  214.           if (strFileName == null || strFileName.Length == 0)
  215.                SaveFileDlg();
  216.           else
  217.                SaveFile();
  218.      }
  219.      void MenuFileSaveAsOnClick(object obj, EventArgs ea)
  220.      {
  221.           SaveFileDlg();
  222.      }
  223.      protected virtual void MenuFileSetupOnClick(object obj, EventArgs ea)
  224.      {
  225.           MessageBox.Show("Page Setup not yet implemented!", strProgName);
  226.      }
  227.      protected virtual void MenuFilePreviewOnClick(object obj, EventArgs ea)
  228.      {
  229.           MessageBox.Show("Print Preview not yet implemented!", strProgName);
  230.      }
  231.      protected virtual void MenuFilePrintOnClick(object obj, EventArgs ea)
  232.      {
  233.           MessageBox.Show("Print not yet implemented!", strProgName);
  234.      }
  235.      void MenuFileExitOnClick(object obj, EventArgs ea)
  236.      {
  237.           if (OkToTrash())
  238.                Application.Exit();
  239.      }
  240.                                                        // Method overrides
  241.      protected override void LoadRegistryInfo(RegistryKey regkey)
  242.      {
  243.           base.LoadRegistryInfo(regkey);
  244.  
  245.                // Set encoding setting.
  246.  
  247.           int index = (int) regkey.GetValue(strEncoding, 4);
  248.  
  249.           mieChecked.Checked = false;
  250.           mieChecked = (MenuItemEncoding) miEncoding.MenuItems[index];
  251.           mieChecked.Checked = true;
  252.  
  253.      }
  254.      protected override void SaveRegistryInfo(RegistryKey regkey)
  255.      {
  256.           base.SaveRegistryInfo(regkey);
  257.           regkey.SetValue(strEncoding, mieChecked.Index);
  258.      }
  259.                                                        // Utility routines
  260.      protected void LoadFile(string strFileName)
  261.      {
  262.           StreamReader sr;
  263.  
  264.           try
  265.           {
  266.                sr = new StreamReader(strFileName);
  267.           }
  268.           catch (Exception exc)
  269.           {
  270.                MessageBox.Show(exc.Message, strProgName, 
  271.                                MessageBoxButtons.OK,
  272.                                MessageBoxIcon.Asterisk);
  273.                return;
  274.           }
  275.           txtbox.Text = sr.ReadToEnd();
  276.           sr.Close();
  277.  
  278.           this.strFileName = strFileName;
  279.           MakeCaption();
  280.  
  281.           txtbox.SelectionStart = 0;
  282.           txtbox.SelectionLength = 0;
  283.           txtbox.Modified = false;
  284.           txtbox.ClearUndo();
  285.      }
  286.      void SaveFile()
  287.      {
  288.           try
  289.           {
  290.                StreamWriter sw = new StreamWriter(strFileName, false,
  291.                                                   mieChecked.Encoding);
  292.                sw.Write(txtbox.Text);
  293.                sw.Close();
  294.           }
  295.           catch (Exception exc)
  296.           {
  297.                MessageBox.Show(exc.Message, strProgName,
  298.                                MessageBoxButtons.OK,
  299.                                MessageBoxIcon.Asterisk);
  300.                return;
  301.           }
  302.           txtbox.Modified = false;
  303.      }
  304.      bool SaveFileDlg()
  305.      {
  306.           SaveFileDialog sfd = new SaveFileDialog();
  307.           
  308.           if (strFileName != null && strFileName.Length > 1)
  309.                sfd.FileName = strFileName;
  310.           else
  311.                sfd.FileName = "*.txt";
  312.  
  313.           sfd.Filter = strFilter;
  314.  
  315.           if (sfd.ShowDialog() == DialogResult.OK)
  316.           {
  317.                strFileName = sfd.FileName;
  318.                SaveFile();
  319.                MakeCaption();
  320.                return true;
  321.           }
  322.           else
  323.           {
  324.                return false;       // Return values are for OkToTrash.
  325.           }
  326.      }
  327.      protected void MakeCaption()
  328.      {
  329.           Text = strProgName + " - " + FileTitle();
  330.      }
  331.      protected string FileTitle()
  332.      {
  333.           return (strFileName != null && strFileName.Length > 1) ?
  334.                          Path.GetFileName(strFileName) : "Untitled";
  335.      }
  336.      protected bool OkToTrash()
  337.      {
  338.           if (!txtbox.Modified)
  339.                return true;
  340.  
  341.           DialogResult dr = 
  342.                     MessageBox.Show("The text in the " + FileTitle() +
  343.                                     " file has changed.\r\n\r\n" +
  344.                                     "Do you want to save the changes?",
  345.                                     strProgName,
  346.                                     MessageBoxButtons.YesNoCancel,
  347.                                     MessageBoxIcon.Exclamation);
  348.           switch (dr)
  349.           {
  350.           case DialogResult.Yes:
  351.                return SaveFileDlg();
  352.  
  353.           case DialogResult.No:
  354.                return true;
  355.  
  356.           case DialogResult.Cancel:
  357.                return false;
  358.           }
  359.           return false;
  360.      }
  361. }          
  362. class MenuItemEncoding: MenuItem
  363. {
  364.      public Encoding Encoding;
  365. }