using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Drawing;

namespace OnTopReplica {
    class ImageComboBox : ComboBox {

        public ImageComboBox() {
            DrawMode = DrawMode.OwnerDrawFixed;
        }

        protected override void OnDrawItem(DrawItemEventArgs ea) {
            ea.DrawBackground();
            ea.DrawFocusRectangle();

            if (ea.Index == -1)
                return;

            Rectangle bounds = ea.Bounds;
            var foreBrush = new SolidBrush(ea.ForeColor);
            int textLeftBound = (IconList == null) ? bounds.Left : bounds.Left + IconList.ImageSize.Width;

            var drawObject = Items[ea.Index];
            if (drawObject is ImageComboBoxItem) {
                var drawItem = (ImageComboBoxItem)drawObject;

                if (drawItem.ImageListIndex != -1 && IconList != null) {
                    //ea.Graphics.FillRectangle(Brushes.Gray, bounds.Left, bounds.Top, IconList.ImageSize.Width, IconList.ImageSize.Height);
                    ea.Graphics.DrawImage(IconList.Images[drawItem.ImageListIndex], bounds.Left, bounds.Top);
                }

                ea.Graphics.DrawString(drawItem.Text, ea.Font, foreBrush, textLeftBound, bounds.Top);
            }
            else {
                ea.Graphics.DrawString(drawObject.ToString(), ea.Font, foreBrush, textLeftBound, bounds.Top);
            }

            base.OnDrawItem(ea);
        }

        public ImageList IconList { get; set; }

    }

    class ImageComboBoxItem {

        public ImageComboBoxItem() {
            Text = "";
            ImageListIndex = -1;
        }

        public ImageComboBoxItem(string text) {
            if (text == null)
                throw new ArgumentNullException();

            Text = text;
            ImageListIndex = -1;
        }

        public ImageComboBoxItem(string text, int imageListIndex) {
            if (text == null)
                throw new ArgumentNullException();

            Text = text;
            ImageListIndex = imageListIndex;
        }

        public string Text { get; private set; }

        public int ImageListIndex { get; private set; }

        public object Tag { get; set; }

    }
}
