// * // * Copyright (C) 2008 Roger Alsing : http://www.RogerAlsing.com // * // * This library is free software; you can redistribute it and/or modify it // * under the terms of the GNU Lesser General Public License 2.1 or later, as // * published by the Free Software Foundation. See the included license.txt // * or http://www.gnu.org/copyleft/lesser.html for details. // * // * using System; using System.ComponentModel; using System.Drawing; using System.Runtime.InteropServices; using System.Windows.Forms; namespace Alsing.Windows.Forms.SyntaxBox { /// /// Summary description for AutoListForm. /// [ToolboxItem(false)] public class AutoListForm : Form { private IContainer components; /// /// The imagelist that should be used by the AutoListForm /// public ImageList Images; private TabListBox LB; private ToolTip tooltip; /// /// Default AltoListControl constructor. /// public AutoListForm() { // This call is required by the Windows.Forms Form Designer. InitializeComponent(); //SetStyle(ControlStyles.ContainerControl ,false); SetStyle(ControlStyles.Selectable, true); // TODO: Add any initialization after the InitForm call } /// /// Gets the "insert text" from the selected item. /// public string SelectedText { get { if (LB.SelectedItem == null) return ""; var li = (ListItem) LB.SelectedItem; return li.InsertText; } } [DllImport("user32.dll", EntryPoint = "SendMessage")] private static extern int SendMessage(IntPtr hWnd, int message, int _data, int _id); public void SendKey(int KeyCode) { SendMessage(LB.Handle, (int) WindowMessage.WM_KEYDOWN, KeyCode, 0); } /// /// /// protected override void OnPaint(PaintEventArgs e) { e.Graphics.Clear(SystemColors.Control); ControlPaint.DrawBorder3D(e.Graphics, 0, 0, Width, Height, Border3DStyle.Raised); } public void SelectItem(string text) { text = text.ToLowerInvariant(); for (int i = 0; i < LB.Items.Count; i++) { var li = (ListItem) LB.Items[i]; string lis = li.Text.ToLowerInvariant(); if (lis.StartsWith(text)) { LB.SelectedIndex = i; break; } } } private void LB_KeyDown(object sender, KeyEventArgs e) { OnKeyDown(e); // e.Handled =true; } private void LB_KeyPress(object sender, KeyPressEventArgs e) { OnKeyPress(e); // e.Handled =true; } private void LB_KeyUp(object sender, KeyEventArgs e) { OnKeyUp(e); // e.Handled =true; } /// /// For public use only. /// /// /// protected override bool IsInputKey(Keys keyData) { return true; } /// /// For public use only. /// /// /// protected override bool IsInputChar(char charCode) { return true; } /// /// Adds a new ListItem to the AutoListForm. /// /// Text of the new ListItem /// Image index that should be assigned to the new ListItem /// public ListItem Add(string text, int ImageIndex) { return Add(text, text, ImageIndex); } /// /// Adds a new ListItem to the AutoListForm. /// /// Text of the new ListItem /// text to insert when this item is selected /// Image index that should be assigned to the new ListItem /// public ListItem Add(string text, string InsertText, int ImageIndex) { var li = new ListItem(text, ImageIndex, "", InsertText); LB.Items.Add(li); //this.LB.Sorted =true; return li; } public ListItem Add(string text, string InsertText, string ToolTip, int ImageIndex) { var li = new ListItem(text, ImageIndex, "", InsertText); LB.Items.Add(li); li.ToolTip = ToolTip; //this.LB.Sorted =true; return li; } /// /// Clears the content of the AutoList. /// public void Clear() { LB.Items.Clear(); } private void LB_DrawItem(object sender, DrawItemEventArgs e) { bool selected = (e.State & DrawItemState.Selected) == DrawItemState.Selected; if (e.Index == - 1) return; const int Offset = 24; var li = (ListItem) LB.Items[e.Index]; string text = li.Text; Brush bg, fg; if (selected) { bg = SystemBrushes.Highlight; fg = SystemBrushes.HighlightText; //fg=Brushes.Black; } else { bg = SystemBrushes.Window; fg = SystemBrushes.WindowText; //bg=Brushes.White; //fg=Brushes.Black; } if (!selected) { e.Graphics.FillRectangle(bg, 0, e.Bounds.Top, e.Bounds.Width, LB.ItemHeight); //e.Graphics.FillRectangle (SystemBrushes.Highlight,0,e.Bounds.Top,27 ,LB.ItemHeight); } else { e.Graphics.FillRectangle(SystemBrushes.Window, Offset, e.Bounds.Top, e.Bounds.Width - Offset, LB.ItemHeight); e.Graphics.FillRectangle(SystemBrushes.Highlight, new Rectangle(Offset + 1, e.Bounds.Top + 1, e.Bounds.Width - Offset - 2, LB.ItemHeight - 2)); //e.Graphics.FillRectangle (SystemBrushes.Highlight,27,e.Bounds.Top,e.Bounds.Width-27 ,LB.ItemHeight); //e.Graphics.FillRectangle (new SolidBrush(Color.FromArgb (182,189,210)),new Rectangle (1+27,e.Bounds.Top+1,e.Bounds.Width-2- ,LB.ItemHeight-2)); ControlPaint.DrawFocusRectangle(e.Graphics, new Rectangle(Offset, e.Bounds.Top, e.Bounds.Width - Offset, LB.ItemHeight)); } e.Graphics.DrawString(text, e.Font, fg, Offset + 2, e.Bounds.Top + 1); if (Images != null) e.Graphics.DrawImage(Images.Images[li.Type], 6, e.Bounds.Top + 0); } private void LB_DoubleClick(object sender, EventArgs e) { OnDoubleClick(e); } public void BeginLoad() { LB.Sorted = false; LB.DrawMode = DrawMode.Normal; LB.SuspendLayout(); } public void EndLoad() { LB.ResumeLayout(); LB.Sorted = true; LB.DrawMode = DrawMode.OwnerDrawFixed; //set height Height = 0; if (LB.Items.Count > 10) { Height = LB.ItemHeight*11 + 12; } else { Height = LB.ItemHeight*(LB.Items.Count) + 12; } int max = 0; Graphics g = LB.CreateGraphics(); foreach (ListItem li in LB.Items) { int w = (int) g.MeasureString(li.Text, LB.Font).Width + 45; if (w > max) max = w; } Width = max + SystemInformation.VerticalScrollBarWidth; Refresh(); g.Dispose(); } private void AutoListForm_Resize(object sender, EventArgs e) { LB.Size = new Size(Width - 8, Height - 8); } private void LB_SelectedIndexChanged(object sender, EventArgs e) { var li = (ListItem) LB.SelectedItem; if (li.ToolTip != "") { tooltip.ShowAlways = true; tooltip.SetToolTip(LB, li.ToolTip); tooltip.InitialDelay = 2; tooltip.Active = true; } } private void LB_MouseDown(object sender, MouseEventArgs e) { SelectItem(e.X, e.Y); } private void SelectItem(int x, int y) { var p = new Point(x, y); int r = (p.Y/LB.ItemHeight) + LB.TopIndex; if (r != LB.SelectedIndex) { if (r < LB.Items.Count && r >= 0) { LB.SelectedIndex = r; } } } private void LB_MouseMove(object sender, MouseEventArgs e) { if (e.Button != 0) { SelectItem(e.X, e.Y); } } #region Component Designer generated code /// /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// private void InitializeComponent() { this.components = new System.ComponentModel.Container(); this.LB = new Alsing.Windows.Forms.SyntaxBox.TabListBox(); this.tooltip = new System.Windows.Forms.ToolTip(this.components); this.SuspendLayout(); // // LB // this.LB.BorderStyle = System.Windows.Forms.BorderStyle.None; this.LB.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed; this.LB.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ( (System.Byte) (0))); this.LB.IntegralHeight = false; this.LB.ItemHeight = 16; this.LB.Location = new System.Drawing.Point(4, 4); this.LB.Name = "LB"; this.LB.Size = new System.Drawing.Size(168, 184); this.LB.Sorted = true; this.LB.TabIndex = 0; this.LB.KeyDown += new System.Windows.Forms.KeyEventHandler (this.LB_KeyDown); this.LB.MouseDown += new System.Windows.Forms.MouseEventHandler (this.LB_MouseDown); this.LB.KeyPress += new System.Windows.Forms.KeyPressEventHandler (this.LB_KeyPress); this.LB.DoubleClick += new System.EventHandler(this.LB_DoubleClick); this.LB.KeyUp += new System.Windows.Forms.KeyEventHandler(this.LB_KeyUp); this.LB.SelectedIndexChanged += new System.EventHandler (this.LB_SelectedIndexChanged); this.LB.MouseMove += new System.Windows.Forms.MouseEventHandler (this.LB_MouseMove); this.LB.DrawItem += new System.Windows.Forms.DrawItemEventHandler (this.LB_DrawItem); // // tooltip // this.tooltip.AutoPopDelay = 5000; this.tooltip.InitialDelay = 100; this.tooltip.ReshowDelay = 100; // // AutoListForm // this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); this.ClientSize = new System.Drawing.Size(168, 165); this.Controls.AddRange(new System.Windows.Forms.Control[] { this.LB } ); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; this.Name = "AutoListForm"; this.ShowInTaskbar = false; this.StartPosition = System.Windows.Forms.FormStartPosition.Manual; this.Resize += new System.EventHandler(this.AutoListForm_Resize); this.ResumeLayout(false); } #endregion } }