00001 using System;
00002 using System.Collections.Generic;
00003 using System.Collections;
00004 using System.Text;
00005 using System.Runtime.Serialization;
00006 using System.IO;
00007 using System.Runtime.Serialization.Formatters.Binary;
00008 using System.Reflection;
00009
00010 namespace HouseOver.THARM
00011 {
00016 [Serializable]
00017 public class CatalogueData : ICollection<Customer>
00018 {
00019 private List<Customer> customers;
00020 private Dictionary<Customer, List<Profile>> customerProfiles;
00021 private Dictionary<Customer, List<Sale>> customerSales;
00022
00026 public CatalogueData()
00027 {
00028 this.customers = new List<Customer>();
00029 this.customerProfiles = new Dictionary<Customer, List<Profile>>();
00030 this.customerSales = new Dictionary<Customer, List<Sale>>();
00031 }
00032
00037 public CatalogueData(string fromFile)
00038 {
00039 this.customers = new List<Customer>();
00040 this.customerProfiles = new Dictionary<Customer, List<Profile>>();
00041 this.customerSales = new Dictionary<Customer, List<Sale>>();
00042
00043 this.Deserialize(fromFile);
00044 }
00045
00050 public void Serialize(string fileName)
00051 {
00052 IFormatter f = new BinaryFormatter();
00053
00054 FileStream fs = new FileStream(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)
00055 + Path.DirectorySeparatorChar + Path.DirectorySeparatorChar + fileName, FileMode.Create);
00056
00057 f.Serialize(fs, this);
00058 fs.Dispose();
00059 }
00060
00065 private void Deserialize(string fileName)
00066 {
00067 IFormatter f = new BinaryFormatter();
00068
00069 FileStream fs = new FileStream(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)
00070 + Path.DirectorySeparatorChar + Path.DirectorySeparatorChar + fileName, FileMode.Open);
00071
00072 CatalogueData temp = (CatalogueData)f.Deserialize(fs);
00073
00074 this.customers = temp.customers;
00075 this.customerSales = temp.customerSales;
00076 this.customerProfiles = temp.customerProfiles;
00077
00078 fs.Close();
00079 }
00080
00086 public Customer GetCustomer(int id)
00087 {
00088 foreach (Customer c in customers)
00089 {
00090 if (c.ID == id) return c;
00091 }
00092
00093 return null;
00094 }
00095
00099 public void Clear()
00100 {
00101 customerProfiles.Clear();
00102 customers.Clear();
00103 customerSales.Clear();
00104 }
00105
00111 public bool Contains(Customer item)
00112 {
00113 return customers.Contains(item);
00114 }
00115
00122 public void CopyTo(Customer[] array, int arrayIndex)
00123 {
00124 customers.CopyTo(array, arrayIndex);
00125 }
00126
00130 public int Count
00131 {
00132 get { return customers.Count; }
00133 }
00134
00138 public bool IsReadOnly
00139 {
00140 get { return false; }
00141 }
00142
00148 public bool Remove(Customer c)
00149 {
00150 return this.RemoveCustomer(c);
00151 }
00152
00157 public void Add(Customer item)
00158 {
00159 customers.Add(item);
00160 }
00161
00167 private bool RemoveCustomer(Customer c)
00168 {
00169 customerSales.Remove(c);
00170 customerProfiles.Remove(c);
00171 return customers.Remove(c);
00172 }
00173
00179 public List<Profile> GetProfiles(Customer c)
00180 {
00181 if (!customerProfiles.ContainsKey(c))
00182 return new List<Profile>();
00183 return customerProfiles[c];
00184 }
00185
00191 public List<Sale> GetSales(Customer c)
00192 {
00193 if (!customerSales.ContainsKey(c))
00194 return new List<Sale>();
00195 return customerSales[c];
00196 }
00197
00202 public void Add(Profile p)
00203 {
00204 if (!customerProfiles.ContainsKey(p.Owner))
00205 customerProfiles.Add(p.Owner, new List<Profile>());
00206
00207 customerProfiles[p.Owner].Add(p);
00208 }
00209
00214 public void Remove(Profile p)
00215 {
00216 if (customerProfiles.ContainsKey(p.Owner))
00217 {
00218 customerProfiles[p.Owner].Remove(p);
00219 if (customerProfiles[p.Owner].Count == 0)
00220 customerProfiles.Remove(p.Owner);
00221 }
00222 }
00228 public void Add(Sale s)
00229 {
00230 if (!customerSales.ContainsKey(s.Seller))
00231 customerSales.Add(s.Seller, new List<Sale>());
00232
00233 customerSales[s.Seller].Add(s);
00234 }
00239 public void Remove(Sale s)
00240 {
00241 if (customerSales.ContainsKey(s.Seller))
00242 {
00243 customerSales[s.Seller].Remove(s);
00244 if (customerSales[s.Seller].Count == 0)
00245 customerSales.Remove(s.Seller);
00246 }
00247 }
00248
00252 public CustomerInformationWrapper<Sale> Sales
00253 {
00254 get { return new CustomerInformationWrapper<Sale>(customerSales.Values); }
00255 }
00256
00260 public CustomerInformationWrapper<Profile> Profiles
00261 {
00262 get { return new CustomerInformationWrapper<Profile>(customerProfiles.Values); }
00263 }
00264
00268 public List<Customer> CustomersWithProfiles
00269 {
00270 get { return new List<Customer>(customerProfiles.Keys); }
00271 }
00272
00276 public List<Customer> CustomersWithSales
00277 {
00278 get { return new List<Customer>(customerSales.Keys); }
00279 }
00280
00285 public IEnumerator<Sale> GetSaleEnumerator()
00286 {
00287 return new CustomerStuffEnumerator<Sale>(customerSales.Values);
00288 }
00289
00294 public IEnumerator<Customer> GetEnumerator()
00295 {
00296 return customers.GetEnumerator();
00297 }
00298
00303 IEnumerator IEnumerable.GetEnumerator()
00304 {
00305 return customers.GetEnumerator();
00306 }
00307
00312 private class CustomerStuffEnumerator<T> : IEnumerator<T>
00313 {
00314
00315 IEnumerator<T> currentList;
00316 IEnumerator<List<T>> currentPos;
00317
00322 public CustomerStuffEnumerator(Dictionary<Customer, List<T>>.ValueCollection source)
00323 {
00324 currentPos = source.GetEnumerator();
00325 }
00326
00330 public T Current
00331 {
00332 get {
00333 if (currentList == null)
00334 return default(T);
00335 else
00336 return currentList.Current;
00337 }
00338 }
00339
00343 public void Dispose()
00344 {
00345
00346 }
00347
00351 object IEnumerator.Current
00352 {
00353 get {
00354 if (currentList == null)
00355 return null;
00356 else
00357 return currentList.Current;
00358 }
00359 }
00360
00365 public bool MoveNext()
00366 {
00367 while(currentList == null || !currentList.MoveNext())
00368 {
00369 if (currentPos.MoveNext())
00370 currentList = currentPos.Current.GetEnumerator();
00371 else
00372 return false;
00373 }
00374
00375 return true;
00376 }
00377
00381 public void Reset()
00382 {
00383 currentPos.Reset();
00384 currentList = null;
00385 }
00386
00387 }
00388
00393 public class CustomerInformationWrapper<T> : IEnumerable<T>
00394 {
00395 private Dictionary<Customer, List<T>>.ValueCollection collection;
00396
00401 public CustomerInformationWrapper(Dictionary<Customer, List<T>>.ValueCollection customerSales)
00402 {
00403 collection = customerSales;
00404 }
00405
00410 public IEnumerator<T> GetEnumerator()
00411 {
00412 return new CustomerStuffEnumerator<T>(collection);
00413 }
00414
00419 IEnumerator IEnumerable.GetEnumerator()
00420 {
00421 return new CustomerStuffEnumerator<T>(collection);
00422 }
00423
00424 }
00425
00426
00427 }
00428 }