namespace CADPythonShell { /// /// Display a listbox with a list of completions for a given string. /// public class CompletionToolTip { private ListBox _lstCompletions; private TextBox _lblDocumentation; private CompletionToolTipWindow _dialog; private bool _cancel = false; private IEnumerable _documentations; private class CompletionToolTipWindow : Form { private ListBox _completions; private TextBox _documentation; public CompletionToolTipWindow(ListBox completions, TextBox documentation) { _completions = completions; _documentation = documentation; FormBorderStyle = FormBorderStyle.None; StartPosition = FormStartPosition.Manual; TopMost = true; ShowInTaskbar = false; BackColor = Color.White; Opacity = 0.9; Controls.Add(completions); Controls.Add(documentation); Width = completions.PreferredSize.Width; Height = completions.Height + documentation.Height; completions.Width = Width; documentation.Width = Width; documentation.Location = new Point(completions.Location.X, completions.Location.Y + completions.Height); completions.Show(); documentation.Show(); } public void resize() { Width = _completions.PreferredSize.Width; Height = _completions.Height + _documentation.Height; _documentation.Location = new Point(_completions.Location.X, _completions.Location.Y + _completions.Height); } protected override void OnShown(EventArgs e) { base.OnShown(e); _completions.Focus(); } } /// /// Show a listbox with possible completions for the uncompleted string. /// When the user chooses one and presses enter (or clicks it with the mouse), /// return the chosen completion. Or, when the user presses escape, then /// close the window and return null. /// public string ShowTooltip(string uncompleted, IEnumerable completions, IEnumerable documentations, Point location) { _lstCompletions = new ListBox(); _lstCompletions.ScrollAlwaysVisible = true; _lstCompletions.Items.AddRange(completions.ToArray()); _lstCompletions.SelectionMode = SelectionMode.One; _lstCompletions.AutoSize = false; _lstCompletions.SelectedIndexChanged += new EventHandler(selectedIndexChanged); _lstCompletions.Click += new EventHandler(lstCompletionsClicked); int maxWidth = 0; for (int i = 0; i < _lstCompletions.Items.Count; i++) { if (_lstCompletions.GetItemRectangle(i).Width > maxWidth) maxWidth = _lstCompletions.GetItemRectangle(i).Width; } _lstCompletions.Width = maxWidth; if (_lstCompletions.Items.Count > 0) _lstCompletions.Height = _lstCompletions.GetItemHeight(0) * 10; _documentations = documentations; _lblDocumentation = new TextBox(); _lblDocumentation.WordWrap = true; _lblDocumentation.Width = _lstCompletions.Width; _lblDocumentation.BackColor = SystemColors.ControlLight; if (_documentations != null && _documentations.Count() > 0) _lblDocumentation.Text = _documentations.ElementAt(0); _lblDocumentation.ScrollBars = ScrollBars.Vertical; _lblDocumentation.Multiline = true; _lblDocumentation.AutoSize = true; _lblDocumentation.Height = 100; _lblDocumentation.ReadOnly = true; _dialog = new CompletionToolTipWindow(_lstCompletions, _lblDocumentation); _dialog.KeyDown += new KeyEventHandler(dialog_KeyDown); _dialog.Location = location; _dialog.KeyPreview = true; _dialog.ShowDialog(); if (_cancel || _lstCompletions.SelectedIndex < 0) return null; return (string)_lstCompletions.SelectedItem; } private void selectedIndexChanged(object sender, EventArgs e) { try { _lblDocumentation.Text = _documentations.ElementAt(_lstCompletions.SelectedIndex); } catch { _lblDocumentation.Text = ""; } _dialog.resize(); } private void dialog_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter || e.KeyCode == Keys.Tab || e.KeyCode == Keys.Return) { _dialog.Hide(); } else if (e.KeyCode == Keys.Escape) { _cancel = true; _dialog.Hide(); } } private void lstCompletionsClicked(object sender, EventArgs e) { _dialog.Hide(); } } }