// // System.Windows.Forms.ListBox.cs // // Author: // stubbed out by Daniel Carrera (dcarrera@math.toronto.edu) // Dennis Hayes (dennish@Raytek.com) // Alexandre Pigolkine (pigolkine@gmx.de) // // (C) 2002/3 Ximian, Inc // // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System.Collections; using System.Drawing; using System.Runtime.InteropServices; namespace System.Windows.Forms { // // public class ListBox : ListControl { // // --- Constructor // [MonoTODO] public ListBox() { SubClassWndProc_ = true; BorderStyle_ = BorderStyle.Fixed3D; BackColor = SystemColors.Window; controlStyles_ |= ControlStyles.AllPaintingInWmPaint; } // // --- Protected Fields // internal int ColumnWidth_ = 0; // The columns will have default width internal bool IntegralHeight_ = true; internal ListBox.ObjectCollection Items_ = null; internal ListBox.SelectedIndexCollection SelectedIndices_ = null; internal ListBox.SelectedObjectCollection SelectedObjects_ = null; internal DrawMode DrawMode_ = DrawMode.Normal; internal bool UseTabStops_ = false; internal bool MultiColumn_ = false; int selectedIndex = -1; internal bool Sorted_ = false; internal int prevSelectedIndex = -1; internal BorderStyle BorderStyle_; // // --- Public Fields // public const int DefaultItemHeight = 13;//correct public const int NoMatches = -1 ;//correct // // --- Public Properties // [MonoTODO] public override Color ForeColor { get { //FIXME: return base.ForeColor; } set { //FIXME: base.ForeColor = value; } } [MonoTODO] public override Color BackColor { get { //FIXME: return base.BackColor; } set { //FIXME: base.BackColor = value; } } [MonoTODO] public override Image BackgroundImage { get { //FIXME: return base.BackgroundImage; } set { //FIXME: base.BackgroundImage = value; } } public BorderStyle BorderStyle { get { return BorderStyle_; } set { if( BorderStyle_ != value) { BorderStyle_ = value; if( IsHandleCreated) { } } } } [MonoTODO] public int HorizontalExtent { get { throw new NotImplementedException (); } set { //Fixme } } public bool MultiColumn { get { return MultiColumn_; } set { if( MultiColumn_ != value) { MultiColumn_ = value; RecreateHandle(); } } } [MonoTODO] public override RightToLeft RightToLeft { get { //FIXME: return base.RightToLeft; } set { //FIXME: base.RightToLeft = value; } } [MonoTODO] public bool ScrollAlwaysVisible { get { throw new NotImplementedException (); } set { //FIXME: } } [MonoTODO] public bool HorizontalScrollbar { get { throw new NotImplementedException (); } set { // FIXME } } [MonoTODO] public int PreferredHeight { get { throw new NotImplementedException (); } } [MonoTODO] public override int SelectedIndex { get { if( IsHandleCreated) { return Win32.SendMessage(Handle, (int)ListBoxMessages.LB_GETCURSEL, 0, 0); } else { return selectedIndex; } } set { prevSelectedIndex = selectedIndex; if( selectedIndex != value) { //FIXME: set exception parameters selectedIndex = value; if( IsHandleCreated) { Win32.SendMessage(Handle, (int)ListBoxMessages.LB_SETCURSEL, selectedIndex, 0); } OnSelectedIndexChanged(new EventArgs()); } } } [MonoTODO] public ListBox.SelectedIndexCollection SelectedIndices { get { if( SelectedIndices_ == null) { SelectedIndices_ = new ListBox.SelectedIndexCollection(this); } return SelectedIndices_; } } [MonoTODO] public object SelectedItem { get { throw new NotImplementedException (); } set { //FIXME: } } [MonoTODO] public ListBox.SelectedObjectCollection SelectedItems { get { if( SelectedObjects_ == null) { SelectedObjects_ = new ListBox.SelectedObjectCollection(this); } return SelectedObjects_; } } [MonoTODO] public virtual SelectionMode SelectionMode { get { throw new NotImplementedException (); } set { //FIXME: } } [MonoTODO] public bool Sorted { get { return Sorted_; } set { if( Sorted_ != value){ Sorted_ = value; if( Sorted_) { Items_.SwitchToSortedStyle(); /* object[] items = new object[Items.Count]; Items.CopyTo(items, 0); Items.Clear(); Items.AddRange(items); */ } } } } [MonoTODO] public override string Text { get { return base.Text; } set { base.Text = value; } } [MonoTODO] public int TopIndex { get { throw new NotImplementedException (); } set { //FIXME: } } [MonoTODO] public bool UseTabStops { get { return UseTabStops_; } set { UseTabStops_ = value; } } [MonoTODO] public virtual DrawMode DrawMode { get { return DrawMode_; } set { DrawMode_ = value; // FIXME: change styles of Windows control/ recreate control } } public int ColumnWidth { get { return ColumnWidth_; } set { ColumnWidth_ = value; } } [MonoTODO] public virtual int ItemHeight { get { throw new NotImplementedException (); } set { //FIXME: } } public bool IntegralHeight { get { return IntegralHeight_; } set { IntegralHeight_ = value; } } public ListBox.ObjectCollection Items { get { if( Items_ == null) { Items_ = CreateItemCollection(); } return Items_; } } internal virtual void OnObjectCollectionChanged() { SelectedIndices_ = null; } // // --- Public Methods // [MonoTODO] public void BeginUpdate() { //FIXME: } [MonoTODO] public void ClearSelected() { //FIXME: } [MonoTODO] public void EndUpdate() { //FIXME: } [MonoTODO] public int FindString(string s) { throw new NotImplementedException (); } [MonoTODO] public int FindString(string s, int startIndex) { throw new NotImplementedException (); } [MonoTODO] public int FindStringExact(string s) { throw new NotImplementedException (); } [MonoTODO] public int FindStringExact(string s, int startIndex) { throw new NotImplementedException (); } [MonoTODO] public int GetItemHeight(int index) { throw new NotImplementedException (); } [MonoTODO] public Rectangle GetItemRectangle(int index) { throw new NotImplementedException (); } [MonoTODO] public bool GetSelected(int index) { throw new NotImplementedException (); } [MonoTODO] public int IndexFromPoint(Point p) { throw new NotImplementedException (); } [MonoTODO] public int IndexFromPoint(int x, int y) { throw new NotImplementedException (); } [MonoTODO] public void SetSelected(int index, bool value) { //FIXME: } [MonoTODO] public override string ToString() { //FIXME: return base.ToString(); } // // --- Public Events // [MonoTODO] public event DrawItemEventHandler DrawItem; [MonoTODO] public event MeasureItemEventHandler MeasureItem; public event EventHandler SelectedIndexChanged; // // --- Protected Properties // [MonoTODO] protected override CreateParams CreateParams { get { CreateParams createParams = base.CreateParams; createParams.ClassName = "LISTBOX"; createParams.ExStyle = (int)WindowExStyles.WS_EX_CLIENTEDGE; createParams.Style = (int) ( WindowStyles.WS_CHILD | WindowStyles.WS_VISIBLE | WindowStyles.WS_CLIPSIBLINGS); createParams.Style |= (int) (ListBoxStyles.LBS_NOTIFY | ListBoxStyles.LBS_HASSTRINGS ); if( !IntegralHeight_) { createParams.Style |= (int)ListBoxStyles.LBS_NOINTEGRALHEIGHT; } if( UseTabStops_ ) { createParams.Style |= (int)ListBoxStyles.LBS_USETABSTOPS; } switch( DrawMode_){ case DrawMode.OwnerDrawFixed: createParams.Style |= (int)ListBoxStyles.LBS_OWNERDRAWFIXED; break; case DrawMode.OwnerDrawVariable: createParams.Style |= (int)ListBoxStyles.LBS_OWNERDRAWVARIABLE; break; } if( MultiColumn_) { createParams.Style |= (int)ListBoxStyles.LBS_MULTICOLUMN | (int)WindowStyles.WS_HSCROLL; } else { createParams.Style |= (int)WindowStyles.WS_VSCROLL; } return createParams; } } [MonoTODO] protected override Size DefaultSize { get { return new Size(120,95); } } // // --- Protected Methods // [MonoTODO] protected virtual void AddItemsCore(object [] value) { //Fixme } [MonoTODO] protected virtual ObjectCollection CreateItemCollection() { return new ListBox.ObjectCollection( this); } [MonoTODO] protected override void OnChangeUICues(UICuesEventArgs e) { //FIXME: base.OnChangeUICues(e); } [MonoTODO] protected override void OnDataSourceChanged(EventArgs e) { //FIXME: base.OnDataSourceChanged(e); } [MonoTODO] protected override void OnDisplayMemberChanged(EventArgs e) { //FIXME: base.OnDisplayMemberChanged(e); } [MonoTODO] protected virtual void OnDrawItem(DrawItemEventArgs e) { if( DrawItem != null) { DrawItem(this, e); } } [MonoTODO] protected override void OnFontChanged(EventArgs e) { //FIXME: base.OnFontChanged(e); } [MonoTODO] protected override void OnHandleCreated(EventArgs e) { //FIXME: base.OnHandleCreated(e); if( Items_ != null) { Items_.PopulateControl(); } if( ColumnWidth_ != 0 && MultiColumn_) { Win32.SendMessage( Handle, (int)ListBoxMessages.LB_SETCOLUMNWIDTH, ColumnWidth_, 0); } } [MonoTODO] protected override void OnHandleDestroyed(EventArgs e) { //FIXME: base.OnHandleDestroyed(e); } [MonoTODO] protected virtual void OnMeasureItem(MeasureItemEventArgs e) { if( MeasureItem != null) { MeasureItem(this, e); } } [MonoTODO] protected override void OnParentChanged(EventArgs e) { //FIXME: base.OnParentChanged(e); } [MonoTODO] protected override void OnResize(EventArgs e) { //FIXME: base.OnResize(e); } [MonoTODO] protected override void OnSelectedIndexChanged(EventArgs e) { //FIXME: base.OnSelectedIndexChanged(e); if( SelectedIndexChanged != null) { SelectedIndexChanged(this, e); } } [MonoTODO] protected override void OnSelectedValueChanged(EventArgs e) { //FIXME: base.OnSelectedValueChanged(e); } protected override void RefreshItem(int index) { //FIXME: } public override void Refresh() { // .NET V1.1 Beta base.Refresh(); } [MonoTODO] protected override void SetBoundsCore( int x, int y, int width, int height, BoundsSpecified specified) { //FIXME: base.SetBoundsCore(x, y, width, height, specified); } [MonoTODO] protected override void SetItemCore (int index, object value) { //FIXME: } protected override void SetItemsCore (IList value){ } [MonoTODO] protected virtual void Sort() { //FIXME: } protected virtual void WmReflectCommand(ref Message m){ throw new NotImplementedException (); } [MonoTODO] protected override void WndProc(ref Message m) { switch ((Msg) m.Msg) { case Msg.WM_MEASUREITEM: { MEASUREITEMSTRUCT mis = new MEASUREITEMSTRUCT(); mis = (MEASUREITEMSTRUCT)Marshal.PtrToStructure(m.LParam, mis.GetType()); MeasureItemEventArgs args = new MeasureItemEventArgs(CreateGraphics(),mis.itemID); args.ItemHeight = mis.itemHeight; args.ItemWidth = mis.itemWidth; OnMeasureItem( args); mis.itemHeight = args.ItemHeight; mis.itemWidth = args.ItemWidth; Marshal.StructureToPtr(mis, m.LParam, false); m.Result = (IntPtr)1; } break; case Msg.WM_DRAWITEM: { DRAWITEMSTRUCT dis = new DRAWITEMSTRUCT(); dis = (DRAWITEMSTRUCT)Marshal.PtrToStructure(m.LParam, dis.GetType()); Rectangle rect = new Rectangle(dis.rcItem.left, dis.rcItem.top, dis.rcItem.right - dis.rcItem.left, dis.rcItem.bottom - dis.rcItem.top); DrawItemEventArgs args = new DrawItemEventArgs(Graphics.FromHdc(dis.hDC), Font, rect, dis.itemID, (DrawItemState)dis.itemState); OnDrawItem( args); //Marshal.StructureToPtr(dis, m.LParam, false); m.Result = (IntPtr)1; } break; case Msg.WM_COMMAND: switch(m.HiWordWParam) { case (uint)ListBoxNotifications.LBN_SELCHANGE: SelectedIndex = Win32.SendMessage(Handle, (int)ListBoxMessages.LB_GETCURSEL, 0, 0); m.Result = IntPtr.Zero; CallControlWndProc(ref m); break; default: CallControlWndProc(ref m); break; } break; default: base.WndProc(ref m); break; } } // // // This is a subclass // public class SelectedObjectCollection : IList, ICollection, IEnumerable { ArrayList collection_; ListBox owner_; // // --- Constructor // [MonoTODO] public SelectedObjectCollection(ListBox owner) { owner_ = owner; collection_ = owner_.Items.CreateSelectedObjectsList(); } // // --- Public Properties // [MonoTODO] public int Count { get { return collection_.Count; } } [MonoTODO] public bool IsReadOnly { get { return true; } } [MonoTODO] public object this[int index] { get { return collection_[index]; } set { //FIXME: } } // // --- Public Methods // [MonoTODO] public bool Contains(object selectedObject) { return collection_.Contains(selectedObject);; } [MonoTODO] public void CopyTo(Array dest, int index) { collection_.CopyTo(dest, index); } [MonoTODO] public override bool Equals(object obj) { //FIXME: return base.Equals(obj); } [MonoTODO] public override int GetHashCode() { //FIXME add our proprities return base.GetHashCode(); } [MonoTODO] public IEnumerator GetEnumerator() { return collection_.GetEnumerator(); } [MonoTODO] public int IndexOf(object selectedObject) { return collection_.IndexOf(selectedObject); } /// /// IList Interface implmentation. /// bool IList.IsReadOnly{ get{ // We allow addition, removeal, and editing of items after creation of the list. return false; } } bool IList.IsFixedSize{ get{ // We allow addition and removeal of items after creation of the list. return false; } } //[MonoTODO] #if A object IList.this[int index]{ get{ throw new NotImplementedException (); } set{ throw new NotImplementedException (); } } #endif [MonoTODO] void IList.Clear(){ //FIXME: } [MonoTODO] int IList.Add( object value){ throw new NotImplementedException (); } [MonoTODO] bool IList.Contains( object value){ throw new NotImplementedException (); } [MonoTODO] int IList.IndexOf( object value){ throw new NotImplementedException (); } [MonoTODO] void IList.Insert(int index, object value){ //FIXME: } [MonoTODO] void IList.Remove( object value){ //FIXME: } [MonoTODO] void IList.RemoveAt( int index){ //FIXME: } // End of IList interface /// /// ICollection Interface implmentation. /// int ICollection.Count{ get{ throw new NotImplementedException (); } } bool ICollection.IsSynchronized{ get{ throw new NotImplementedException (); } } object ICollection.SyncRoot{ get{ throw new NotImplementedException (); } } void ICollection.CopyTo(Array array, int index){ throw new NotImplementedException (); } // End Of ICollection }//End of subclass // // public class ObjectCollection : IList, ICollection { internal class ListBoxItem { public object theData_ = null; public string dataRepresentation_ = String.Empty; // FIXME: change those fields to flags //public bool wasSorted_ = false; //public bool wasAddedToControl_ = false; public bool IsAddedToControl_ = false; public bool Selected_ = false; public bool Checked_ = false; public ListBoxItem( object data, string representation) { theData_ = data; dataRepresentation_ = representation; } } internal class ListItemRepresentationComparer : IComparer { public ListItemRepresentationComparer() { } public int Compare(object x, object y) { ListBoxItem left = x as ListBoxItem; ListBoxItem right = y as ListBoxItem; if( left == null || right == null) { throw new ArgumentException(); } return left.dataRepresentation_.CompareTo(right.dataRepresentation_); } } /* internal class ListItemDataComparer : IComparer { public ListItemDataComparer() { } public int Compare(object x, object y) { ListBoxItem left = x as ListBoxItem; ListBoxItem right = y as ListBoxItem; if( left == null || right == null) { throw new ArgumentException(); } return left.theData_.CompareTo(right.dataRepresentation_); } } */ internal ArrayList CreateSelectedIndicesList() { ArrayList result = new ArrayList(); int ordinalNumber = 0; foreach( ListBoxItem lbi in items_) { if( lbi.Selected_) { result.Add(ordinalNumber); } ++ordinalNumber; } return result; } internal ArrayList CreateSelectedObjectsList() { ArrayList result = new ArrayList(); foreach( ListBoxItem lbi in items_) { if( lbi.Selected_) { result.Add(lbi.theData_); } } return result; } internal ArrayList CreateCheckedIndexList() { ArrayList result = new ArrayList(); int ordinalNumber = 0; foreach( ListBoxItem lbi in items_) { if( lbi.Checked_) { result.Add(ordinalNumber); } ++ordinalNumber; } return result; } internal ArrayList CreateCheckedItemList() { ArrayList result = new ArrayList(); foreach( ListBoxItem lbi in items_) { if( lbi.Checked_) { result.Add(lbi.theData_); } } return result; } internal ListBoxItem getItemAt(int index) { return (ListBoxItem)items_[index]; } internal void SwitchToSortedStyle() { if( owner_.IsHandleCreated) { Win32.SendMessage(owner_.Handle, (int)ListBoxMessages.LB_RESETCONTENT, 0, 0); } items_.Sort(new ListItemRepresentationComparer()); if( owner_.IsHandleCreated) { foreach( ListBoxItem lbi in items_) { Win32.SendMessage(owner_.Handle, (int)ListBoxMessages.LB_ADDSTRING, 0, lbi.dataRepresentation_); } } owner_.OnObjectCollectionChanged(); } internal void PopulateControl() { foreach( ListBoxItem lbi in items_) { Win32.SendMessage(owner_.Handle, (int)ListBoxMessages.LB_ADDSTRING, 0, lbi.dataRepresentation_); lbi.IsAddedToControl_ = true; } } internal void DumpItems() { int ordinalNumber = 0; foreach( ListBoxItem lbi in items_) { Console.WriteLine("ListBoxItem {0} order {1} checked {2}", lbi.dataRepresentation_, ordinalNumber, lbi.Checked_); ++ordinalNumber; } } internal class ListBoxItemEnumerator : IEnumerator { private IEnumerator containerEnum_ = null; public ListBoxItemEnumerator( IEnumerator containerEnum) { containerEnum_ = containerEnum; } public object Current { get { return ((ListBoxItem)containerEnum_.Current).theData_; } } public bool MoveNext() { return containerEnum_.MoveNext(); } public void Reset() { containerEnum_.Reset(); } } protected ListBox owner_ = null; protected ArrayList items_ = new ArrayList(); // has ListBoxItem // // --- Constructor // [MonoTODO] public ObjectCollection(ListBox box) { owner_ = box; } [MonoTODO] public ObjectCollection(ListBox box, object[] objs) { owner_ = box; AddRange(objs); } // // --- Public Properties // [MonoTODO] public int Count { get { return items_.Count; } } [MonoTODO] public bool IsReadOnly { get { // FIXME: Is it always not ReadOnly return false; } } [MonoTODO] public virtual object this[int index] { get { return ((ListBoxItem)items_[index]).theData_; } set { ((ListBoxItem)items_[index]).theData_ = value; // FIXME: assing representation and sort if needed } } // // --- Public Methods // [MonoTODO] public int Add(object item) { string representation = owner_.getDisplayMemberOfObj(item); ListBoxItem newItem = new ListBoxItem(item, representation); int result = items_.Add(newItem); if( owner_.Sorted) { items_.Sort(new ListItemRepresentationComparer()); result = items_.BinarySearch(newItem); if( owner_.IsHandleCreated) { Win32.SendMessage(owner_.Handle, (int)ListBoxMessages.LB_INSERTSTRING, result, representation); } owner_.OnObjectCollectionChanged(); } else { if( owner_.IsHandleCreated) { Win32.SendMessage(owner_.Handle, (int)ListBoxMessages.LB_ADDSTRING, 0, representation); } } newItem.IsAddedToControl_ = true; return result; } [MonoTODO] public void AddRange(object[] items) { if( items == null) throw new ArgumentException(); ListBoxItem[] newItems = new ListBoxItem[items.Length]; int idx = 0; foreach( object obj in items ) { newItems[idx] = new ListBoxItem(obj, owner_.getDisplayMemberOfObj(obj)); ++idx; } items_.AddRange(newItems); if( owner_.Sorted) { items_.Sort(new ListItemRepresentationComparer()); if( owner_.IsHandleCreated) { int index = 0; foreach( ListBoxItem lbi in items_) { if(!lbi.IsAddedToControl_){ Win32.SendMessage(owner_.Handle, (int)ListBoxMessages.LB_INSERTSTRING, index, lbi.dataRepresentation_); } ++index; } } owner_.OnObjectCollectionChanged(); } else { if( owner_.IsHandleCreated) { foreach(ListBoxItem lbi in newItems) { Win32.SendMessage(owner_.Handle, (int)ListBoxMessages.LB_ADDSTRING, 0, lbi.dataRepresentation_); lbi.IsAddedToControl_ = true; } } } // FIXME: Add items to control } [MonoTODO] public void AddRange(ListBox.ObjectCollection collection) { //FIXME: } [MonoTODO] public void Clear() { //FIXME: items_.Clear(); if( owner_.IsHandleCreated) { Win32.SendMessage(owner_.Handle, (int)ListBoxMessages.LB_RESETCONTENT, 0, 0); } owner_.OnObjectCollectionChanged(); } [MonoTODO] public bool Contains(object value) { // FIXME: determine whether some of ListBoxItem has value as theData_ foreach( ListBoxItem lbi in items_) { if( lbi.theData_ == value) { return true; } } return false; } [MonoTODO] public void CopyTo(object[] dest, int arrayIndex) { // FIXME: copy theData_ from ListBoxItem, not the ListBoxItems items_.CopyTo(dest, arrayIndex); } [MonoTODO] public override bool Equals(object obj) { //FIXME: return base.Equals(obj); } [MonoTODO] public override int GetHashCode() { //FIXME add our proprities return base.GetHashCode(); } [MonoTODO] public IEnumerator GetEnumerator() { return new ListBoxItemEnumerator(items_.GetEnumerator()); } [MonoTODO] public int IndexOf(object val) { // FIXME: find ListBoxItem object which has the val as theData_ int result = -1; int index = 0; foreach( ListBoxItem lbi in items_) { if( lbi.theData_ == val) { result = index; break; } ++index; } return result; } [MonoTODO] public void Insert(int index, object item) { //FIXME: } [MonoTODO] public void Remove(object val) { // FIXME: use some sort of Comparer ? int pos = 0; foreach(ListBoxItem lbi in items_) { if( lbi.theData_ == val) { RemoveAt(pos); break; } ++pos; } } [MonoTODO] public void RemoveAt(int index) { if( index < 0 || index >= items_.Count) { //FIXME: set exception parameters throw new ArgumentOutOfRangeException(); } items_.RemoveAt(index); if( owner_.IsHandleCreated) { Win32.SendMessage( owner_.Handle, (int)ListBoxMessages.LB_DELETESTRING, index, 0); } owner_.OnObjectCollectionChanged(); } /// /// IList Interface implmentation. /// bool IList.IsReadOnly{ get{ // We allow addition, removeal, and editing of items after creation of the list. return false; } } bool IList.IsFixedSize{ get{ // We allow addition and removeal of items after creation of the list. return false; } } #if A //[MonoTODO] object IList.this[int index]{ get{ throw new NotImplementedException (); } set{ throw new NotImplementedException (); } } #endif [MonoTODO] void IList.Clear(){ //FIXME: } [MonoTODO] int IList.Add( object value){ throw new NotImplementedException (); } [MonoTODO] bool IList.Contains( object value){ throw new NotImplementedException (); } [MonoTODO] int IList.IndexOf( object value){ throw new NotImplementedException (); } [MonoTODO] void IList.Insert(int index, object value){ //FIXME: } [MonoTODO] void IList.Remove( object value){ //FIXME: } [MonoTODO] void IList.RemoveAt( int index){ //FIXME: } // End of IList interface /// /// ICollection Interface implmentation. /// int ICollection.Count{ get{ throw new NotImplementedException (); } } bool ICollection.IsSynchronized{ get{ throw new NotImplementedException (); } } object ICollection.SyncRoot{ get{ throw new NotImplementedException (); } } void ICollection.CopyTo(Array array, int index){ throw new NotImplementedException (); } // End Of ICollection }//end of SubClass // // public class SelectedIndexCollection : IList, ICollection, IEnumerable { ArrayList collection_; ListBox owner_; // // --- Constructor // [MonoTODO] public SelectedIndexCollection(ListBox owner) { owner_ = owner; collection_ = owner_.Items.CreateSelectedIndicesList(); } // // --- Public Properties // [MonoTODO] public int Count { get { return collection_.Count; } } [MonoTODO] public bool IsReadOnly { get { return true; } } [MonoTODO] public int this[int index] { get { return (int)collection_[index]; } } // // --- Public Methods // [MonoTODO] public bool Contains(int selectedIndex) { return collection_.Contains(selectedIndex); } [MonoTODO] public void CopyTo(Array dest, int index) { collection_.CopyTo(dest, index); } [MonoTODO] public override bool Equals(object obj) { //FIXME: return base.Equals(obj); } [MonoTODO] public override int GetHashCode() { //FIXME add our proprities return base.GetHashCode(); } [MonoTODO] public IEnumerator GetEnumerator() { return collection_.GetEnumerator(); } /// /// IList Interface implmentation. /// bool IList.IsReadOnly{ get{ // We allow addition, removeal, and editing of items after creation of the list. return false; } } bool IList.IsFixedSize{ get{ // We allow addition and removeal of items after creation of the list. return false; } } //[MonoTODO] object IList.this[int index]{ get{ throw new NotImplementedException (); } set{ //FIXME: } } [MonoTODO] void IList.Clear(){ //FIXME: } [MonoTODO] int IList.Add( object value){ throw new NotImplementedException (); } [MonoTODO] bool IList.Contains( object value){ throw new NotImplementedException (); } [MonoTODO] int IList.IndexOf( object value){ throw new NotImplementedException (); } [MonoTODO] void IList.Insert(int index, object value){ //FIXME: } [MonoTODO] void IList.Remove( object value){ //FIXME: } [MonoTODO] void IList.RemoveAt( int index){ throw new NotImplementedException (); } // End of IList interface /// /// ICollection Interface implmentation. /// int ICollection.Count{ get{ throw new NotImplementedException (); } } bool ICollection.IsSynchronized{ get{ throw new NotImplementedException (); } } object ICollection.SyncRoot{ get{ throw new NotImplementedException (); } } void ICollection.CopyTo(Array array, int index){ throw new NotImplementedException (); } // End Of ICollection }//End of subclass } }