using System; using System.IO; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Windows.Data; using System.Windows.Forms; using System.ComponentModel; using System.Diagnostics; using System.Linq; using System.Text; using MarketData; using System.Reflection; namespace TradeBlotter.ViewModels { public class WorkspaceViewModelPersistenceHolder { public WorkspaceViewModel Workspace { get; set; } public SaveParameters WorkspaceParameters { get; set; } } public class WorkspaceViewModelPersistenceCollection : List { } public class WorkspacePersistenceHelper { public static String PARAMS_FILE="saveparams.config"; private WorkspacePersistenceHelper() { } public static void Save(String pathFileName, ObservableCollection workspaces) { try { StreamWriter streamWriter = null; FileStream outStream = null; if(null==workspaces||0==workspaces.Count)return; MDTrace.WriteLine(LogLevel.DEBUG, String.Format("Writing {0} to {1}", pathFileName, Directory.GetCurrentDirectory())); if (!File.Exists(pathFileName)) streamWriter = File.CreateText(pathFileName); else { outStream = new FileStream(pathFileName, FileMode.Truncate); streamWriter = new StreamWriter(outStream); } foreach (WorkspaceViewModel workspaceViewModel in workspaces) { if (workspaceViewModel.CanPersist()) { SaveParameters workspaceViewModelParams = workspaceViewModel.GetSaveParameters(); if (null == workspaceViewModelParams) continue; streamWriter.WriteLine(workspaceViewModelParams.ToString()); } } streamWriter.Flush(); streamWriter.Close(); streamWriter.Dispose(); } catch (Exception exception) { Debug.Write(exception.ToString()); } } public static void Load(String pathFileName, ObservableCollection workspaces,InstantiateWorkspace workspaceInstantiator) { try { Dictionary loadedItems=new Dictionary (); WorkspaceViewModelPersistenceCollection workspaceViewModelPersistenceCollection = new WorkspaceViewModelPersistenceCollection(); if(!File.Exists(PARAMS_FILE)) { MDTrace.WriteLine(LogLevel.DEBUG,String.Format("Unable to load params file : {0}",PARAMS_FILE)); return; } FileStream inStream = new FileStream(PARAMS_FILE, FileMode.Open); StreamReader streamReader = new StreamReader(inStream); String strLine = null; while (null != (strLine = streamReader.ReadLine())) { SaveParameters workspaceViewModelParams = null; try { workspaceViewModelParams = SaveParameters.Parse(strLine); } catch (Exception exception) { MDTrace.WriteLine(LogLevel.DEBUG,String.Format("Error parsing line from configuration file. The line was : {0}",strLine)); MDTrace.WriteLine(LogLevel.DEBUG,String.Format("The exception was : {0}",exception.ToString())); continue; } if(loadedItems.ContainsKey(workspaceViewModelParams.Key)) { MDTrace.WriteLine(LogLevel.DEBUG,"Item already loaded, details follow..."); foreach(KeyValuePair kvp in workspaceViewModelParams) { MDTrace.WriteLine(LogLevel.DEBUG,String.Format("Key:{0} Value:{1}",kvp.Key,kvp.Value)); } continue; } else loadedItems.Add(workspaceViewModelParams.Key,workspaceViewModelParams); var itemType = from KeyValuePair item in workspaceViewModelParams where item.Key.Equals("Type") select item; KeyValuePair selectedItem = itemType.FirstOrDefault(); WorkspaceViewModel workspaceViewModel = null; Type[] booleanTypes=new Type[1]; booleanTypes[0]=typeof(bool); ConstructorInfo constructorInfo=Type.GetType(selectedItem.Value).GetConstructor(BindingFlags.Instance|BindingFlags.Public,null,CallingConventions.HasThis,booleanTypes,null); if(null!=constructorInfo)workspaceViewModel = (WorkspaceViewModel)Activator.CreateInstance(Type.GetType(selectedItem.Value), new object[] { true }); else workspaceViewModel = (WorkspaceViewModel)Activator.CreateInstance(Type.GetType(selectedItem.Value)); workspaceViewModel.WorkspaceInstantiator = workspaceInstantiator; WorkspaceViewModelPersistenceHolder workspaceViewModelPersistenceHolder = new WorkspaceViewModelPersistenceHolder(); workspaceViewModelPersistenceHolder.Workspace = workspaceViewModel; workspaceViewModelPersistenceHolder.WorkspaceParameters = workspaceViewModelParams; workspaceViewModelPersistenceCollection.Add(workspaceViewModelPersistenceHolder); } streamReader.Close(); for (int index = 0; index < workspaceViewModelPersistenceCollection.Count; index++) { WorkspaceViewModelPersistenceHolder workspaceViewModelPersistenceHolder = workspaceViewModelPersistenceCollection[index]; workspaces.Add(workspaceViewModelPersistenceHolder.Workspace); workspaceViewModelPersistenceHolder.Workspace.SetSaveParameters(workspaceViewModelPersistenceHolder.WorkspaceParameters); if (index == workspaceViewModelPersistenceCollection.Count - 1) { ICollectionView collectionView = CollectionViewSource.GetDefaultView(workspaces); if (null != collectionView) collectionView.MoveCurrentTo(workspaceViewModelPersistenceHolder.Workspace); } } } catch (Exception exception) { MDTrace.WriteLine(LogLevel.DEBUG,exception); } } public static WorkspaceViewModel Load(SaveParameters saveParams, ObservableCollection workspaces, InstantiateWorkspace workspaceInstantiator) { var itemType = from KeyValuePair item in saveParams where item.Key.Equals("Type") select item; KeyValuePair selectedItem = itemType.FirstOrDefault(); WorkspaceViewModel workspaceViewModel = null; Type[] booleanTypes=new Type[1]; booleanTypes[0]=typeof(bool); ConstructorInfo constructorInfo=Type.GetType(selectedItem.Value).GetConstructor(BindingFlags.Instance|BindingFlags.Public,null,CallingConventions.HasThis,booleanTypes,null); if(null!=constructorInfo)workspaceViewModel = (WorkspaceViewModel)Activator.CreateInstance(Type.GetType(selectedItem.Value), new object[] { true }); else workspaceViewModel = (WorkspaceViewModel)Activator.CreateInstance(Type.GetType(selectedItem.Value)); workspaceViewModel.WorkspaceInstantiator = workspaceInstantiator; WorkspaceViewModelPersistenceHolder workspaceViewModelPersistenceHolder = new WorkspaceViewModelPersistenceHolder(); workspaceViewModelPersistenceHolder.Workspace = workspaceViewModel; workspaceViewModelPersistenceHolder.WorkspaceParameters = saveParams; workspaces.Add(workspaceViewModelPersistenceHolder.Workspace); workspaceViewModelPersistenceHolder.Workspace.SetSaveParameters(workspaceViewModelPersistenceHolder.WorkspaceParameters); ICollectionView collectionView = CollectionViewSource.GetDefaultView(workspaces); if (null != collectionView) collectionView.MoveCurrentTo(workspaceViewModelPersistenceHolder.Workspace); return workspaceViewModel; } } public class SaveParametersList : List> { public int Key { get { StringBuilder sb=new StringBuilder(); foreach(KeyValuePair kvp in this) { sb.Append(kvp.Key).Append(",").Append(kvp.Value); } return sb.ToString().GetHashCode(); } } } public class SaveParameters : SaveParametersList { public WorkspaceViewModel Referer{get;set;} public bool ContainsKey(String key) { foreach(KeyValuePair item in this) { if(item.Key.Equals(key))return true; } return false; } public override String ToString() { StringBuilder sb = new StringBuilder(); for (int index = 0; index < Count; index++) { KeyValuePair item = this[index]; sb.Append(item.Key).Append(",").Append(item.Value); if (index < Count - 1) sb.Append(","); } return sb.ToString(); } public static SaveParameters Parse(String strLine) { if (null == strLine) return null; String[] strArray = strLine.Split(','); if (null == strArray || 0 == strArray.Length) return null; SaveParameters saveParameters = new SaveParameters(); for (int index = 0; index < strArray.Length; index += 2) { KeyValuePair savedParameter = new KeyValuePair(strArray[index], strArray[index + 1]); saveParameters.Add(savedParameter); } return saveParameters; } } }