Changeset 14 for Common/RichTextBoxEx.cs


Ignore:
Timestamp:
Aug 2, 2022, 11:46:25 AM (22 months ago)
Author:
chronos
Message:
  • Modified: Various improvements.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • Common/RichTextBoxEx.cs

    r13 r14  
    99    public partial class RichTextBoxEx : RichTextBox
    1010    {
    11         private bool linksActive = false;
     11        private bool linksActive;
    1212        public delegate void LinkClickHandler(string link);
    1313        public event LinkClickHandler LinkClick;
    1414        public string Title { get; set; }
    15         public Form parentForm;
    16         public List<LinkMatch> linkMatches;
    17         public FormFind formFind;
    18         public string previousRtf;
     15        public Form ParentForm;
     16        public List<LinkMatch> LinkMatches;
     17        public FormFind FormFind;
     18        public string PreviousRtf;
    1919        private ToolStripMenuItem tsmiUndo;
    2020        private ToolStripMenuItem tsmiRedo;
     
    3131        {
    3232            //InitializeComponent();
    33             KeyDown += new System.Windows.Forms.KeyEventHandler(this.HandleKeyDown);
    34             KeyUp += new System.Windows.Forms.KeyEventHandler(this.HandleKeyUp);
    35             MouseClick += new System.Windows.Forms.MouseEventHandler(this.HandleMouseClick);
    36             MouseLeave += new EventHandler(this.HandleMouseLeave);
    37             Leave += new EventHandler(this.HandleLeave);
    38             SelectionChanged += delegate (object sender, EventArgs e)
     33            KeyDown += HandleKeyDown;
     34            KeyUp += HandleKeyUp;
     35            MouseClick += HandleMouseClick;
     36            MouseLeave += HandleMouseLeave;
     37            Leave += HandleLeave;
     38            SelectionChanged += delegate
    3939            {
    4040                if (interfaceUpdateEnabled) UpdateInterface();
    4141            };
    4242            AddContextMenu();
    43             linkMatches = new List<LinkMatch>();
     43            LinkMatches = new List<LinkMatch>();
    4444        }
    4545
     
    5454            ReadOnly = false;
    5555            interfaceUpdateEnabled = false;
    56             previousRtf = Rtf;
     56            PreviousRtf = Rtf;
    5757            RichTextBoxContext context = new RichTextBoxContext();
    5858            context.SaveContext(this);
    5959            List<int> linkMatchStart = new List<int>();
    60             foreach (var linkMatch in linkMatches)
     60            foreach (var linkMatch in LinkMatches)
     61            {
    6162                linkMatchStart.Add(-2);
     63            }
     64
    6265            List<string> linkMatchStartString = new List<string>();
    63             foreach (var linkMatch in linkMatches)
    64                 linkMatchStartString.Add(linkMatch.startString.ToLowerInvariant());
     66            foreach (var linkMatch in LinkMatches)
     67                linkMatchStartString.Add(linkMatch.StartString.ToLowerInvariant());
    6568
    6669            string content = richTextBox.Text;
     
    7174
    7275            int contentStart = 0;
    73             int selectionStart = 0;
    7476            do
    7577            {
     
    7981                {
    8082                    int i = 0;
    81                     foreach (var linkMatch in linkMatches)
     83                    foreach (var linkMatch in LinkMatches)
    8284                    {
    8385                        if ((linkMatchStart[i] < contentStart) && (linkMatchStart[i] != -1))
    8486                        {
    85                             if (linkMatch.caseSensitive)
     87                            if (linkMatch.CaseSensitive)
    8688                            {
    87                                 linkMatchStart[i] = content.IndexOf(linkMatch.startString, contentStart, StringComparison.Ordinal);
     89                                linkMatchStart[i] = content.IndexOf(linkMatch.StartString, contentStart, StringComparison.Ordinal);
    8890                            } else
    8991                            {
     
    103105
    104106                int index = firstIndex;
    105                 string startString = firstMatch.startString;
     107                string startString = firstMatch.StartString;
    106108
    107109                int linkLength = startString.Length;
    108                 selectionStart = index;
    109 
    110                 string linkTextAfter = "";
    111                 if (firstMatch.ExecuteMatch(content, index + startString.Length, out linkTextAfter))
    112                 {
    113                     if ((firstMatch.startString != "") || ((firstMatch.startString == "") && (linkTextAfter.Length == 5) &&
     110                var selectionStart = index;
     111
     112                if (firstMatch.ExecuteMatch(content, index + startString.Length, out var linkTextAfter))
     113                {
     114                    if ((firstMatch.StartString != "") || ((firstMatch.StartString == "") && (linkTextAfter.Length == 5) &&
    114115                        ((index < 1) ||
    115116                        ((index >= 1) && ((content[index - 1] == ' ') || (content[index - 1] == '\n'))))
     
    175176        public void UndoUnknownActions()
    176177        {
     178            int i = 0;
    177179            while (CanUndo && (UndoActionId == UndoNameId.Unknown))
    178180            {
    179181                Undo();
    180             }
    181         }
    182 
    183         private void HideRichTextBoxLinks(RichTextBox richTextBox)
     182                i++;
     183                if (i > 1000) break;
     184            }
     185        }
     186
     187        private void HideRichTextBoxLinks()
    184188        {
    185189            bool lastReadOnlyState = ReadOnly;
     
    188192            RichTextBoxContext context = new RichTextBoxContext();
    189193            context.SaveContext(this);
    190             Rtf = previousRtf;
     194            Rtf = PreviousRtf;
    191195            UndoUnknownActions();
    192196
     
    219223            if ((e.KeyCode == Keys.ControlKey) && linksActive)
    220224            {
    221                 HideRichTextBoxLinks(this);
     225                HideRichTextBoxLinks();
    222226                linksActive = false;
    223227            }
     
    228232            if ((e.Button == MouseButtons.Left) && linksActive)
    229233            {
    230                 int linkStart = 0;
    231                 int linkEnd = 0;
     234                int linkStart;
     235                int linkEnd;
    232236                int mousePointerCharIndex = GetCharIndexFromPosition(e.Location);
    233237                SelectionStart = mousePointerCharIndex;
     
    238242                    {
    239243                        SelectionStart -= 1;
    240                         continue;
    241244                    }
    242245                    else
     
    257260                    {
    258261                        SelectionStart += 1;
    259                         continue;
    260262                    }
    261263                    else
     
    273275                    if (link != "")
    274276                    {
    275                         foreach (var linkMatch in linkMatches)
     277                        foreach (var linkMatch in LinkMatches)
    276278                        {
    277                             if ((link.Length >= linkMatch.startString.Length) && (
    278                                 (linkMatch.caseSensitive && (link.Substring(0, linkMatch.startString.Length) == linkMatch.startString)) ||
    279                                 (!linkMatch.caseSensitive && (link.ToLowerInvariant().Substring(0, linkMatch.startString.Length) == linkMatch.startString.ToLower()))))
     279                            if ((link.Length >= linkMatch.StartString.Length) && (
     280                                (linkMatch.CaseSensitive && (link.Substring(0, linkMatch.StartString.Length) == linkMatch.StartString)) ||
     281                                (!linkMatch.CaseSensitive && (link.ToLowerInvariant().Substring(0, linkMatch.StartString.Length) == linkMatch.StartString.ToLower()))))
    280282                            {
    281                                 string linkNumber = link.Substring(linkMatch.startString.Length).Trim(new char[] { ' ', '#' });
     283                                string linkNumber = link.Substring(linkMatch.StartString.Length).Trim(new char[] { ' ', '#' });
    282284                                if (int.TryParse(linkNumber, out int number))
    283285                                {
     
    287289                            }
    288290                        }
    289                         if (LinkClick != null) LinkClick(link);
    290                         HideRichTextBoxLinks(this);
     291
     292                        LinkClick?.Invoke(link);
     293                        HideRichTextBoxLinks();
    291294                        linksActive = false;
    292295                    }
     
    297300        public void ShowInWindow()
    298301        {
    299             Form textForm = new Form()
     302            Form textForm = new Form
    300303            {
    301304                Name = "FormRichTextBox",
     
    304307                FormBorderStyle = FormBorderStyle.Sizable,
    305308                Text = Title,
    306                 Font = new Font(this.Font.FontFamily, this.Font.Size),
     309                Font = new Font(Font.FontFamily, Font.Size),
    307310                StartPosition = FormStartPosition.CenterScreen,
     311                Icon = Icon.ExtractAssociatedIcon(Application.ExecutablePath),
    308312            };
    309             textForm.Icon = Icon.ExtractAssociatedIcon(Application.ExecutablePath);
    310             RichTextBoxEx richTextBox = new RichTextBoxEx();
    311             richTextBox.parentForm = textForm;
    312             richTextBox.Dock = DockStyle.Fill;
    313             richTextBox.Text = this.Text;
    314             richTextBox.Title = this.Title;
    315             richTextBox.linkMatches = this.linkMatches;
    316             richTextBox.ReadOnly = this.ReadOnly;
    317             richTextBox.LinkClick = delegate (string linkText)
    318             {
    319                 if (this.LinkClick != null) this.LinkClick.Invoke(linkText);
     313            RichTextBoxEx richTextBox = new RichTextBoxEx
     314            {
     315                ParentForm = textForm,
     316                Dock = DockStyle.Fill,
     317                Text = Text,
     318                Title = Title,
     319                LinkMatches = LinkMatches,
     320                ReadOnly = ReadOnly,
     321                LinkClick = delegate(string linkText) { LinkClick?.Invoke(linkText); }
    320322            };
    321323            textForm.Controls.Add(richTextBox);
    322             textForm.Load += delegate (object sender3, EventArgs e3)
     324            textForm.Load += delegate
    323325            {
    324326                Theme.UseTheme(textForm);
    325327                DpiScaling.Apply(textForm);
    326                 new FormDimensions().Load(textForm, parentForm);
     328                new FormDimensions().Load(textForm, ParentForm);
    327329                richTextBox.ClearUndo();
    328330            };
    329             textForm.FormClosing += delegate (object sender2, FormClosingEventArgs e2)
    330             {
    331                 new FormDimensions().Save(textForm, parentForm);
     331            textForm.FormClosing += delegate
     332            {
     333                new FormDimensions().Save(textForm, ParentForm);
    332334            };
    333335            textForm.Show();
     
    336338        private void UpdateInterface()
    337339        {
    338             tsmiUndo.Enabled = CanUndo && !this.ReadOnly;
    339             tsmiRedo.Enabled = CanRedo && !this.ReadOnly;
    340             tsmiCut.Enabled = (SelectionLength != 0) && !this.ReadOnly;
     340            tsmiUndo.Enabled = CanUndo && !ReadOnly;
     341            tsmiRedo.Enabled = CanRedo && !ReadOnly;
     342            tsmiCut.Enabled = (SelectionLength != 0) && !ReadOnly;
    341343            tsmiCopy.Enabled = SelectionLength != 0;
    342             tsmiPaste.Enabled = Clipboard.ContainsText() && !this.ReadOnly;
    343             tsmiDelete.Enabled = (SelectionLength != 0) && !this.ReadOnly;
     344            tsmiPaste.Enabled = Clipboard.ContainsText() && !ReadOnly;
     345            tsmiDelete.Enabled = (SelectionLength != 0) && !ReadOnly;
    344346            tsmiSelectAll.Enabled = (TextLength > 0) && (SelectionLength < TextLength);
    345347        }
     
    349351            if (linksActive)
    350352            {
    351                 HideRichTextBoxLinks(this);
     353                HideRichTextBoxLinks();
    352354                linksActive = false;
    353355            }
     
    435437                tsmiFind.Click += (sender, e) => {
    436438                    HideLinks();
    437                     if (formFind == null)
    438                     {
    439                         formFind = new FormFind();
    440                         formFind.richTextBox = this;
    441                         formFind.Owner = parentForm;
    442                     }
    443                     formFind.Show();
    444                     formFind.BringToFront();
     439                    if (FormFind == null)
     440                    {
     441                        FormFind = new FormFind();
     442                        FormFind.richTextBox = this;
     443                        FormFind.Owner = ParentForm;
     444                    }
     445                    FormFind.Show();
     446                    FormFind.BringToFront();
    445447                };
    446448                tsmiFind.ShortcutKeys = Keys.F | Keys.Control;
     
    514516    public class LinkMatch
    515517    {
    516         public string startString;
    517         public bool caseSensitive;
     518        public string StartString;
     519        public bool CaseSensitive;
    518520        public delegate bool MatchHandler(string inContent, int startIndex, out string outContent);
    519521        public delegate void LinkActionHandler(int number);
     
    523525        public LinkMatch(string startString, MatchHandler matchHandler, LinkActionHandler action)
    524526        {
    525             this.startString = startString;
     527            StartString = startString;
    526528            Match = matchHandler;
    527529            LinkAction = action;
     
    551553
    552554            // Try to connect to following number
    553             string number;
    554555            numberStart = startIndex;
    555556            while (((content.Length - numberStart) >= 1) && ((content[numberStart] == ' ') || (content[numberStart] == '#')))
     
    564565                i++;
    565566            }
    566             number = content.Substring(numberStart, i);
     567            var number = content.Substring(numberStart, i);
    567568
    568569            if (int.TryParse(number, out int intNumber))
Note: See TracChangeset for help on using the changeset viewer.