using System; using System.Drawing; using System.Drawing.Printing; namespace FastColoredTextBoxNS { /// /// Item of autocomplete menu /// public class AutocompleteItem { public string Text; public int ImageIndex = -1; public object Tag; string toolTipTitle; string toolTipText; string menuText; public AutocompleteMenu Parent { get; internal set; } public AutocompleteItem() { } public AutocompleteItem(string text) { Text = text; } public AutocompleteItem(string text, int imageIndex) : this(text) { this.ImageIndex = imageIndex; } public AutocompleteItem(string text, int imageIndex, string menuText) : this(text, imageIndex) { this.menuText = menuText; } public AutocompleteItem(string text, int imageIndex, string menuText, string toolTipTitle, string toolTipText) : this(text, imageIndex, menuText) { this.toolTipTitle = toolTipTitle; this.toolTipText = toolTipText; } /// /// Returns text for inserting into Textbox /// public virtual string GetTextForReplace() { return Text; } /// /// Compares fragment text with this item /// public virtual CompareResult Compare(string fragmentText) { if (Text.StartsWith(fragmentText, StringComparison.InvariantCultureIgnoreCase) && Text != fragmentText) return CompareResult.VisibleAndSelected; return CompareResult.Hidden; } /// /// Returns text for display into popup menu /// public override string ToString() { return menuText ?? Text; } /// /// This method is called after item inserted into text /// public virtual void OnSelected(AutocompleteMenu popupMenu, SelectedEventArgs e) { ; } /// /// Title for tooltip. /// /// Return null for disable tooltip for this item public virtual string ToolTipTitle { get { return toolTipTitle; } set { toolTipTitle = value; } } /// /// Tooltip text. /// /// For display tooltip text, ToolTipTitle must be not null public virtual string ToolTipText { get{ return toolTipText; } set { toolTipText = value; } } /// /// Menu text. This text is displayed in the drop-down menu. /// public virtual string MenuText { get { return menuText; } set { menuText = value; } } /// /// Fore color of text of item /// public virtual Color ForeColor { get { return Color.Transparent; } set { throw new NotImplementedException("Override this property to change color"); } } /// /// Back color of item /// public virtual Color BackColor { get { return Color.Transparent; } set { throw new NotImplementedException("Override this property to change color"); } } } public enum CompareResult { /// /// Item do not appears /// Hidden, /// /// Item appears /// Visible, /// /// Item appears and will selected /// VisibleAndSelected } /// /// Autocomplete item for code snippets /// /// Snippet can contain special char ^ for caret position. public class SnippetAutocompleteItem : AutocompleteItem { public SnippetAutocompleteItem(string snippet) { Text = snippet.Replace("\r", ""); ToolTipTitle = "Code snippet:"; ToolTipText = Text; } public override string ToString() { return MenuText ?? Text.Replace("\n", " ").Replace("^", ""); } public override string GetTextForReplace() { return Text; } public override void OnSelected(AutocompleteMenu popupMenu, SelectedEventArgs e) { e.Tb.BeginUpdate(); e.Tb.Selection.BeginUpdate(); //remember places var p1 = popupMenu.Fragment.Start; var p2 = e.Tb.Selection.Start; //do auto indent if (e.Tb.AutoIndent) { for (int iLine = p1.iLine + 1; iLine <= p2.iLine; iLine++) { e.Tb.Selection.Start = new Place(0, iLine); e.Tb.DoAutoIndent(iLine); } } e.Tb.Selection.Start = p1; //move caret position right and find char ^ while (e.Tb.Selection.CharBeforeStart != '^') if (!e.Tb.Selection.GoRightThroughFolded()) break; //remove char ^ e.Tb.Selection.GoLeft(true); e.Tb.InsertText(""); // e.Tb.Selection.EndUpdate(); e.Tb.EndUpdate(); } /// /// Compares fragment text with this item /// public override CompareResult Compare(string fragmentText) { if (Text.StartsWith(fragmentText, StringComparison.InvariantCultureIgnoreCase) && Text != fragmentText) return CompareResult.Visible; return CompareResult.Hidden; } } /// /// This autocomplete item appears after dot /// public class MethodAutocompleteItem : AutocompleteItem { string firstPart; string lowercaseText; public MethodAutocompleteItem(string text) : base(text) { lowercaseText = Text.ToLower(); } public override CompareResult Compare(string fragmentText) { int i = fragmentText.LastIndexOf('.'); if (i < 0) return CompareResult.Hidden; string lastPart = fragmentText.Substring(i + 1); firstPart = fragmentText.Substring(0, i); if(lastPart=="") return CompareResult.Visible; if(Text.StartsWith(lastPart, StringComparison.InvariantCultureIgnoreCase)) return CompareResult.VisibleAndSelected; if(lowercaseText.Contains(lastPart.ToLower())) return CompareResult.Visible; return CompareResult.Hidden; } public override string GetTextForReplace() { return firstPart + "." + Text; } } /// /// This Item does not check correspondence to current text fragment. /// SuggestItem is intended for dynamic menus. /// public class SuggestItem : AutocompleteItem { public SuggestItem(string text, int imageIndex):base(text, imageIndex) { } public override CompareResult Compare(string fragmentText) { return CompareResult.Visible; } } }