Skip to content

Commit

Permalink
Removed need for ILMerge
Browse files Browse the repository at this point in the history
  • Loading branch information
MarkMpn committed Aug 2, 2023
1 parent ba9ea8b commit abf6f95
Show file tree
Hide file tree
Showing 36 changed files with 6,057 additions and 51 deletions.
4 changes: 0 additions & 4 deletions MarkMpn.Sql4Cds.Tests/MarkMpn.Sql4Cds.Tests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -81,10 +81,6 @@
<None Include="app.config" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\AutocompleteMenu\AutocompleteMenu-ScintillaNET.csproj">
<Project>{43CBC9AA-6A8E-463F-83A9-AFF3124AFDB6}</Project>
<Name>AutocompleteMenu-ScintillaNET</Name>
</ProjectReference>
<ProjectReference Include="..\MarkMpn.Sql4Cds.Engine.NetFx\MarkMpn.Sql4Cds.Engine.NetFx.csproj">
<Project>{23288bb2-0d6f-4329-9a5c-4c659567a652}</Project>
<Name>MarkMpn.Sql4Cds.Engine.NetFx</Name>
Expand Down
14 changes: 0 additions & 14 deletions MarkMpn.Sql4Cds.sln
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MarkMpn.Sql4Cds.Engine.Test
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MarkMpn.Sql4Cds", "MarkMpn.Sql4Cds\MarkMpn.Sql4Cds.csproj", "{A7AF5D13-A44E-426D-B3FC-AE390832C7DF}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AutocompleteMenu-ScintillaNET", "AutocompleteMenu\AutocompleteMenu-ScintillaNET.csproj", "{43CBC9AA-6A8E-463F-83A9-AFF3124AFDB6}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MarkMpn.Sql4Cds.Tests", "MarkMpn.Sql4Cds.Tests\MarkMpn.Sql4Cds.Tests.csproj", "{081AA0FB-A019-430A-B05A-F55CAC7C50FD}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MarkMpn.Sql4Cds.Engine.FetchXml.Tests", "MarkMpn.Sql4Cds.Engine.FetchXml.Tests\MarkMpn.Sql4Cds.Engine.FetchXml.Tests.csproj", "{69F7D111-3542-4E31-A0F8-E544F9FFA587}"
Expand Down Expand Up @@ -75,18 +73,6 @@ Global
{A7AF5D13-A44E-426D-B3FC-AE390832C7DF}.Release|arm64.Build.0 = Release|Any CPU
{A7AF5D13-A44E-426D-B3FC-AE390832C7DF}.Release|x86.ActiveCfg = Release|Any CPU
{A7AF5D13-A44E-426D-B3FC-AE390832C7DF}.Release|x86.Build.0 = Release|Any CPU
{43CBC9AA-6A8E-463F-83A9-AFF3124AFDB6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{43CBC9AA-6A8E-463F-83A9-AFF3124AFDB6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{43CBC9AA-6A8E-463F-83A9-AFF3124AFDB6}.Debug|arm64.ActiveCfg = Debug|Any CPU
{43CBC9AA-6A8E-463F-83A9-AFF3124AFDB6}.Debug|arm64.Build.0 = Debug|Any CPU
{43CBC9AA-6A8E-463F-83A9-AFF3124AFDB6}.Debug|x86.ActiveCfg = Debug|Any CPU
{43CBC9AA-6A8E-463F-83A9-AFF3124AFDB6}.Debug|x86.Build.0 = Debug|Any CPU
{43CBC9AA-6A8E-463F-83A9-AFF3124AFDB6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{43CBC9AA-6A8E-463F-83A9-AFF3124AFDB6}.Release|Any CPU.Build.0 = Release|Any CPU
{43CBC9AA-6A8E-463F-83A9-AFF3124AFDB6}.Release|arm64.ActiveCfg = Release|Any CPU
{43CBC9AA-6A8E-463F-83A9-AFF3124AFDB6}.Release|arm64.Build.0 = Release|Any CPU
{43CBC9AA-6A8E-463F-83A9-AFF3124AFDB6}.Release|x86.ActiveCfg = Release|Any CPU
{43CBC9AA-6A8E-463F-83A9-AFF3124AFDB6}.Release|x86.Build.0 = Release|Any CPU
{081AA0FB-A019-430A-B05A-F55CAC7C50FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{081AA0FB-A019-430A-B05A-F55CAC7C50FD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{081AA0FB-A019-430A-B05A-F55CAC7C50FD}.Debug|arm64.ActiveCfg = Debug|Any CPU
Expand Down
159 changes: 159 additions & 0 deletions MarkMpn.Sql4Cds/Autocomplete/AutocompleteItem.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,159 @@
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Text;

namespace AutocompleteMenuNS
{
/// <summary>
/// Item of autocomplete menu
/// </summary>
public class AutocompleteItem
{
public object Tag;
string toolTipTitle;
string toolTipText;
string menuText;

/// <summary>
/// Parent AutocompleteMenu
/// </summary>
public AutocompleteMenu Parent { get; internal set; }

/// <summary>
/// Text for inserting into textbox
/// </summary>
public string Text { get; set; }

/// <summary>
/// Image index for this item
/// </summary>
public int ImageIndex{get; set; }

/// <summary>
/// Alignment. The direction the text shows.
/// </summary>
public StringAlignment Alignment { get; set; }

/// <summary>
/// Title for tooltip.
/// </summary>
/// <remarks>Return null for disable tooltip for this item</remarks>
public virtual string ToolTipTitle
{
get { return toolTipTitle; }
set { toolTipTitle = value; }
}

/// <summary>
/// Tooltip text.
/// </summary>
/// <remarks>For display tooltip text, ToolTipTitle must be not null</remarks>
public virtual string ToolTipText
{
get { return toolTipText; }
set { toolTipText = value; }
}

/// <summary>
/// Menu text. This text is displayed in the drop-down menu.
/// </summary>
public virtual string MenuText
{
get { return menuText; }
set { menuText = value; }
}

public AutocompleteItem()
{
ImageIndex = -1;
}

public AutocompleteItem(string text):this()
{
Text = text;
Alignment = StringAlignment.Near;
}

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;
}

/// <summary>
/// Returns text for inserting into Textbox
/// </summary>
public virtual string GetTextForReplace()
{
return Text;
}

/// <summary>
/// Compares fragment text with this item
/// </summary>
public virtual CompareResult Compare(string fragmentText)
{
if (Text.StartsWith(fragmentText, StringComparison.InvariantCultureIgnoreCase) &&
Text != fragmentText)
return CompareResult.VisibleAndSelected;

return CompareResult.Hidden;
}

/// <summary>
/// Returns text for display into popup menu
/// </summary>
public override string ToString()
{
return menuText ?? Text;
}

/// <summary>
/// This method is called after item was inserted into text
/// </summary>
public virtual void OnSelected(SelectedEventArgs e)
{
}

public virtual void OnPaint(PaintItemEventArgs e)
{
using(var brush = new SolidBrush(e.IsSelected ? e.Colors.SelectedForeColor : e.Colors.ForeColor))
e.Graphics.DrawString(ToString(), e.Font, brush, e.TextRect, new StringFormat() {Alignment = Alignment});
}
}

public interface IAutoCompleteMenuItemCustomReplace
{
int ReplaceLength { get; }
}

public enum CompareResult
{
/// <summary>
/// Item do not appears
/// </summary>
Hidden,
/// <summary>
/// Item appears
/// </summary>
Visible,
/// <summary>
/// Item appears and will selected
/// </summary>
VisibleAndSelected
}
}
199 changes: 199 additions & 0 deletions MarkMpn.Sql4Cds/Autocomplete/AutocompleteItems.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,199 @@
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace AutocompleteMenuNS
{
/// <summary>
/// This autocomplete item appears after dot
/// </summary>
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;
}
}

/// <summary>
/// Autocomplete item for code snippets
/// </summary>
/// <remarks>Snippet can contain special char ^ for caret position.</remarks>
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(SelectedEventArgs e)
{
var tb = Parent.TargetControlWrapper;
//
if (!Text.Contains("^"))
return;
var text = tb.Text;
for (int i = Parent.Fragment.Start; i < text.Length; i++)
if (text[i] == '^')
{
tb.SelectionStart = i;
tb.SelectionLength = 1;
tb.SelectedText = "";
return;
}
}

/// <summary>
/// Compares fragment text with this item
/// </summary>
public override CompareResult Compare(string fragmentText)
{
if (Text.StartsWith(fragmentText, StringComparison.InvariantCultureIgnoreCase) &&
Text != fragmentText)
return CompareResult.Visible;

return CompareResult.Hidden;
}
}

/// <summary>
/// This class finds items by substring
/// </summary>
public class SubstringAutocompleteItem : AutocompleteItem
{
protected readonly string lowercaseText;
protected readonly bool ignoreCase;

public SubstringAutocompleteItem(string text, bool ignoreCase = true)
: base(text)
{
this.ignoreCase = ignoreCase;
if(ignoreCase)
lowercaseText = text.ToLower();
}

public override CompareResult Compare(string fragmentText)
{
if(ignoreCase)
{
if (lowercaseText.Contains(fragmentText.ToLower()))
return CompareResult.Visible;
}
else
{
if (Text.Contains(fragmentText))
return CompareResult.Visible;
}

return CompareResult.Hidden;
}
}

/// <summary>
/// This item draws multicolumn menu
/// </summary>
public class MulticolumnAutocompleteItem : SubstringAutocompleteItem
{
public bool CompareBySubstring { get; set; }
public string[] MenuTextByColumns { get; set; }
public int[] ColumnWidth { get; set; }
public StringAlignment[] Alignments { get; set; }

public MulticolumnAutocompleteItem(string[] menuTextByColumns, string insertingText, bool compareBySubstring = true, bool ignoreCase = true)
: base(insertingText, ignoreCase)
{
this.CompareBySubstring = compareBySubstring;
this.MenuTextByColumns = menuTextByColumns;
var tmp = new List<StringAlignment>();
for(int i = 0; i < menuTextByColumns.Length; i++)
tmp.Add(StringAlignment.Near);
this.Alignments = tmp.ToArray();
}

public override CompareResult Compare(string fragmentText)
{
if (CompareBySubstring)
return base.Compare(fragmentText);

if(ignoreCase)
{
if (Text.StartsWith(fragmentText, StringComparison.InvariantCultureIgnoreCase))
return CompareResult.VisibleAndSelected;
} else
if (Text.StartsWith(fragmentText))
return CompareResult.VisibleAndSelected;

return CompareResult.Hidden;
}

public override void OnPaint(PaintItemEventArgs e)
{
if (ColumnWidth != null && ColumnWidth.Length != MenuTextByColumns.Length)
throw new Exception("ColumnWidth.Length != MenuTextByColumns.Length");

int[] columnWidth = ColumnWidth;
if(columnWidth == null)
{
columnWidth = new int[MenuTextByColumns.Length];
float step = e.TextRect.Width/MenuTextByColumns.Length;
for (int i = 0; i < MenuTextByColumns.Length; i++)
columnWidth[i] = (int)step;
}

//draw columns
Pen pen = Pens.Silver;
float x = e.TextRect.X;
e.StringFormat.FormatFlags = e.StringFormat.FormatFlags | StringFormatFlags.NoWrap;

using (var brush = new SolidBrush(e.IsSelected ? e.Colors.SelectedForeColor : e.Colors.ForeColor))
for (int i=0;i<MenuTextByColumns.Length;i++)
{
var width = columnWidth[i];
var rect = new RectangleF(x, e.TextRect.Top, width, e.TextRect.Height);
e.Graphics.DrawLine(pen, new PointF(x, e.TextRect.Top), new PointF(x, e.TextRect.Bottom));
e.Graphics.DrawString(MenuTextByColumns[i], e.Font, brush, rect, new StringFormat() {Alignment = Alignments[i]});
x += width;
}
}
}
}
Loading

0 comments on commit abf6f95

Please sign in to comment.