How to load intellisense popup with different collections based on keywords in WinForms SyntaxEditor (EditControl)?
Load intellisence popup
As like in Microsoft Visual Studio Code Editor, EditControl has support for Intellisence Popup and helps end users to configure own Key combination to display the Intellisence Popup . The ContextChoice events will be helpful in this scenario.
For example
In this example, we are explaining this configuration capability of EditControl to open with different collection based on display Keywords. i.e. tables keyword to display tables collection and function keyword to display function collection.
The following code demonstrates the same.
C#
// Ensure that the context choice popup is displayed if the invoking lexems are "function" or "tables" only
private void editControl1_ContextChoiceBeforeOpen(object sender, System.ComponentModel.CancelEventArgs e)
{
ILexem lex;
ILexemLine lexemLine = this.editControl1.GetLine(this.editControl1.CurrentLine);
//Gets the index of the current word in that line
int ind = GetContextChoiceCharIndex(lexemLine);
if (ind<=0)
{
e.Cancel = true;
return;
}
lex = lexemLine.LineLexems[ind-1] as ILexem;
// If the count is less than '2', do not show the ContextChoice popup
if (lexemLine.LineLexems.Count<2)
e.Cancel = true;
else
{
// Display ContextChoice popup if the lexem used to invoke them is "function" or "tables" only
//Check if current line text is "function" or "tables"
if ((lex.Text == "function") || (lex.Text == "tables"))
//Open Context Choice list
e.Cancel = false;
else
{
//Cancel request
e.Cancel = true;
}
}
}
// Populate the context choice list on popup
private void
editControl1_ContextChoiceOpen(Syncfusion.Windows.Forms.Edit.Interfaces.IContextChoiceController controller)
{
ILexem lex;
ILexemLine lexemLine = this.editControl1.GetLine(this.editControl1.CurrentLine);
//Gets the index of the current word in that line
int ind = GetContextChoiceCharIndex(lexemLine);
if (ind <= 0)
{
return;
}
lex = lexemLine.LineLexems[ind - 1] as ILexem;
if (lexemLine.LineLexems.Count < 2)
return;
else
{
// Display ContextChoice popup if the lexem used to invoke them is "function" or "tables" only
//Add Context choice list for "function" word
if (lex.Text == "function")
{
controller.Items.Add("Function 1", "This is Function 1", this.editControl1.ContextChoiceController.Images["Image0"]);
controller.Items.Add("Function 2", "This is Function 2", this.editControl1.ContextChoiceController.Images["Image1"]);
controller.Items.Add("Function 3", "This is Function 3", this.editControl1.ContextChoiceController.Images["Image2"]);
controller.Items.Add("Function 4", "This is Function 4", this.editControl1.ContextChoiceController.Images["Image3"]);
}
//Add context choice list for "tables" word
else if(lex.Text == "tables")
{
controller.Items.Add("Table 1", "This is Table 1", this.editControl1.ContextChoiceController.Images["Image0"]);
controller.Items.Add("Table 2", "This is Table 2", this.editControl1.ContextChoiceController.Images["Image1"]);
controller.Items.Add("Table 3", "This is Table 3", this.editControl1.ContextChoiceController.Images["Image2"]);
controller.Items.Add("Table 4", "This is Table 4", this.editControl1.ContextChoiceController.Images["Image3"]);
}
}
}
Code Example: [VB]
' Ensure that the context choice popup is displayed if the invoking lexems are "function" or "tables" only
Private Sub editControl1_ContextChoiceBeforeOpen(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles editControl1.ContextChoiceBeforeOpen
Dim lex As ILexem
Dim lexemLine As ILexemLine = Me.editControl1.GetLine(Me.editControl1.CurrentLine)
'Gets the index of the current word in that line
Dim ind As Integer = GetContextChoiceCharIndex(lexemLine)
If ind<=0 Then
e.Cancel = True
Return
End If
lex = TryCast(lexemLine.LineLexems(ind-1), ILexem)
' If the count is less than '2', do not show the ContextChoice popup
If lexemLine.LineLexems.Count<2 Then
e.Cancel = True
Else
' Display ContextChoice popup if the lexem used to invoke them is "function" or "tables" only
If (lex.Text = "function") OrElse (lex.Text = "tables") Then
e.Cancel = False
Else
e.Cancel = True
End If
End If
End Sub
' Populate the context choice list on popup
Private Sub editControl1_ContextChoiceOpen(ByVal controller As
Syncfusion.Windows.Forms.Edit.Interfaces.IContextChoiceController) Handles
editControl1.ContextChoiceOpen
Dim lex As ILexem
Dim lexemLine As ILexemLine = Me.editControl1.GetLine(Me.editControl1.CurrentLine)
'Gets the index of the current word in that line
Dim ind As Integer = GetContextChoiceCharIndex(lexemLine)
If ind <= 0 Then
Return
End If
lex = TryCast(lexemLine.LineLexems(ind - 1), ILexem)
If lexemLine.LineLexems.Count < 2 Then
Return
Else
'Display ContextChoice popup if the lexem used to invoke them is "function” or "tables" only
'Add Context choice list for "function" word
If lex.Text = "function" Then
controller.Items.Add("Function 1", "This is Function 1",
Me.editControl1.ContextChoiceController.Images("Image0"))
controller.Items.Add("Function 2", "This is Function 2",
Me.editControl1.ContextChoiceController.Images("Image1"))
controller.Items.Add("Function 3", "This is Function 3",
Me.editControl1.ContextChoiceController.Images("Image2"))
controller.Items.Add("Function 4", "This is Function 4",
Me.editControl1.ContextChoiceController.Images("Image3"))
'Add Context choice list for "tables" word
ElseIf lex.Text = "tables" Then
controller.Items.Add("Table 1", "This is Table 1",
Me.editControl1.ContextChoiceController.Images("Image0"))
controller.Items.Add("Table 2", "This is Table 2", Me.editControl1.ContextChoiceController.Images("Image1"))
controller.Items.Add("Table 3", "This is Table 3", Me.editControl1.ContextChoiceController.Images("Image2"))
controller.Items.Add("Table 4", "This is Table 4", Me.editControl1.ContextChoiceController.Images("Image3"))
End If
End If
End Sub
Screenshot

Figure: ContextChoice popup open for after entering “function” word.

Figure: ContextChoice popup open for after entering “tables.” word
Samples:
Reference link: https://help.syncfusion.com/windowsforms/syntax-editor/intellisense