/// <summary>
        /// Inserts an element into the <see cref="T:System.Collections.ObjectModel.Collection`1" /> at the specified index.
        /// </summary>
        /// <param name="index">The zero-based index at which <paramref name="item" /> should be inserted.</param>
        /// <param name="item">The object to insert.</param>
        protected override void InsertItem(int index, Color item)
        {
            ColourCollectionEventArgs e;
            int key;

            base.InsertItem(index, item);

#if USENAMEHACK
            this.SwatchNames.Insert(index, string.Empty);
#endif
            key = item.ToArgb();

            if (_indexedLookup != null && index == this.Count - 1 && !_indexedLookup.ContainsKey(key))
            {
                lock (_lock)
                {
                    if (!_indexedLookup.ContainsKey(key))
                    {
                        _indexedLookup.Add(key, index);
                    }
                }
            }
            else
            {
                _indexedLookup = null;
            }

            e = new ColourCollectionEventArgs(index, item);
            this.OnItemInserted(e);
            this.OnCollectionChanged(e);
        }
        /// <summary>
        /// Removes the element at the specified index of the <see cref="T:System.Collections.ObjectModel.Collection`1" />.
        /// </summary>
        /// <param name="index">The zero-based index of the element to remove.</param>
        protected override void RemoveItem(int index)
        {
            Color item;
            ColourCollectionEventArgs e;
            int key;

#if USENAMEHACK
            this.SwatchNames.RemoveAt(index);
#endif

            item = this[index];
            key  = item.ToArgb();

            if (_indexedLookup != null && _indexedLookup.ContainsKey(key))
            {
                lock (_lock)
                {
                    _indexedLookup.Remove(key);
                }
            }

            base.RemoveItem(index);

            e = new ColourCollectionEventArgs(index, item);
            this.OnItemRemoved(e);
            this.OnCollectionChanged(e);
        }
        /// <summary>
        /// Raises the <see cref="ItemsCleared" /> event.
        /// </summary>
        /// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
        protected virtual void OnItemsCleared(ColourCollectionEventArgs e)
        {
            EventHandler <ColourCollectionEventArgs> handler;

            handler = this.ItemsCleared;

            if (handler != null)
            {
                handler(this, e);
            }
        }
        /// <summary>
        /// Removes all elements from the <see cref="T:System.Collections.ObjectModel.Collection`1" />.
        /// </summary>
        protected override void ClearItems()
        {
            ColourCollectionEventArgs e;

            base.ClearItems();

            _indexedLookup = null;

#if USENAMEHACK
            this.SwatchNames.Clear();
#endif

            e = new ColourCollectionEventArgs(-1, Color.Empty);
            this.OnItemInserted(e);
            this.OnCollectionChanged(e);
        }
        /// <summary>
        /// Replaces the element at the specified index.
        /// </summary>
        /// <param name="index">The zero-based index of the element to replace.</param>
        /// <param name="item">The new value for the element at the specified index.</param>
        protected override void SetItem(int index, Color item)
        {
            Color oldItem;

            oldItem = this[index];

            if (oldItem != item)
            {
                ColourCollectionEventArgs e;

                if (_indexedLookup != null)
                {
                    int key;
                    int oldKey;

                    key    = item.ToArgb();
                    oldKey = oldItem.ToArgb();

                    lock (_lock)
                    {
                        if (_indexedLookup.ContainsKey(oldKey))
                        {
                            _indexedLookup.Remove(oldKey);
                        }
                        if (!_indexedLookup.ContainsKey(key))
                        {
                            _indexedLookup.Add(key, index);
                        }
                    }
                }

                base.SetItem(index, item);

                e = new ColourCollectionEventArgs(index, item);
                this.OnItemReplaced(e);
                this.OnCollectionChanged(e);
            }
        }