/* * VsqEventList.cs * Copyright (c) 2008-2009 kbinani * * This file is part of Boare.Lib.Vsq. * * Boare.Lib.Vsq is free software; you can redistribute it and/or * modify it under the terms of the BSD License. * * Boare.Lib.Vsq is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. */ using System; using System.Collections.Generic; namespace Boare.Lib.Vsq { /// /// 固有ID付きのVsqEventのリストを取り扱う /// [Serializable] public class VsqEventList { public List Events; private List m_ids; /// /// コンストラクタ /// public VsqEventList() { Events = new List(); m_ids = new List(); } public VsqEvent findFromID( int internal_id ) { foreach ( VsqEvent item in Events ) { if ( item.InternalID == internal_id ) { return item; } } return null; } public void setForID( int internal_id, VsqEvent value ) { int c = Events.Count; for ( int i = 0; i < c; i++ ) { if ( Events[i].InternalID == internal_id ) { Events[i] = value; break; } } } public void sort() { lock ( this ) { Events.Sort(); updateIDList(); } } public void clear() { Events.Clear(); m_ids.Clear(); } public Iterator iterator() { updateIDList(); return new ListIterator( Events ); } public void add( VsqEvent item ) { updateIDList(); int new_id = getNextId( 0 ); item.InternalID = new_id; Events.Add( item ); m_ids.Add( new_id ); Events.Sort(); for ( int i = 0; i < Events.Count; i++ ) { m_ids[i] = Events[i].InternalID; } } public void removeAt( int index ) { updateIDList(); Events.RemoveAt( index ); m_ids.RemoveAt( index ); } private int getNextId( int next ) { updateIDList(); int index = -1; List current = new List( m_ids ); int nfound = 0; while ( true ) { index++; if ( !current.Contains( index ) ) { nfound++; if ( nfound == next + 1 ) { return index; } else { current.Add( index ); } } } } public int getCount() { return Events.Count; } public VsqEvent getElement( int index ) { return Events[index]; } public void setElement( int index, VsqEvent value ) { Events[index] = value; } public void updateIDList() { if ( m_ids.Count != Events.Count ) { m_ids.Clear(); for ( int i = 0; i < Events.Count; i++ ) { m_ids.Add( Events[i].InternalID ); } } else { for ( int i = 0; i < Events.Count; i++ ) { m_ids[i] = Events[i].InternalID; } } } } }