using System; using System.Windows.Input; using System.ComponentModel; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Collections.Specialized; using System.Windows; using System.Linq; using System.Text; using System.Threading.Tasks; using Microsoft.Research.DynamicDataDisplay.DataSources; using Microsoft.Research.DynamicDataDisplay.PointMarkers; using MarketData; using MarketData.Utils; using MarketData.DataAccess; using MarketData.MarketDataModel; using TradeBlotter.DataAccess; using TradeBlotter.Command; using TradeBlotter.Model; using System.Runtime.CompilerServices; namespace TradeBlotter.ViewModels { public class DividendPaymentViewModel : WorkspaceViewModel { private List accounts; private List symbols; private String selectedAccounts; private String selectedSymbols; private ObservableCollection selectedSymbolsOverride = new ObservableCollection(); private DividendPaymentModelCollection dividendPaymentModelCollection = null; private String saveDocument; private RelayCommand saveCommand; private RelayCommand refreshCommand; private bool showLabels = true; private bool busyIndicator = false; private bool ignoreSelectedSymbols = true; private CompositeDataSource valuePointsCompositeDataSource; private CompositeDataSource valuesCompositeDataSource; public DividendPaymentViewModel(bool loadedFromParams=false) { base.DisplayName = "Dividend Payments"; accounts = DividendPaymentDA.GetDividendPaymentAccounts(); accounts.Insert(0, Constants.CONST_ALL); selectedAccounts = accounts.Find(x => x.Equals(Constants.CONST_ALL)); symbols = DividendPaymentDA.GetDividendPaymentSymbols(selectedAccounts); symbols.Insert(0, Constants.CONST_ALL); selectedSymbols = symbols[0]; PropertyChanged += OnViewModelPropertyChanged; if (!loadedFromParams) { base.OnPropertyChanged("SelectedAccounts"); base.OnPropertyChanged("SelectedItemsOverride"); } } public void CreateCompositeDataSources() { if (null == dividendPaymentModelCollection) return; valuePointsCompositeDataSource = dividendPaymentModelCollection.CollectionToCompositeDataSource(true); valuesCompositeDataSource = dividendPaymentModelCollection.ToCompositeDataSource(true); } public void InitializeDataSources() { dividendPaymentModelCollection = null; if (valuePointsCompositeDataSource != null) valuePointsCompositeDataSource.Clear(); if (valuesCompositeDataSource != null) valuesCompositeDataSource.Clear(); base.OnPropertyChanged("DividendPayments"); base.OnPropertyChanged("Values"); base.OnPropertyChanged("ValuePoints"); base.OnPropertyChanged("Markers"); } public override SaveParameters GetSaveParameters() { SaveParameters saveParams = new SaveParameters(); saveParams.Add(new KeyValuePair("Type", GetType().Namespace + "." + GetType().Name)); saveParams.Add(new KeyValuePair("SelectedSymbols", Utility.ListToString(Utility.ToList(selectedSymbols),'|'))); saveParams.Add(new KeyValuePair("SelectedAccounts", Utility.ListToString(Utility.ToList(selectedAccounts),'|'))); saveParams.Add(new KeyValuePair("Symbols", Utility.ListToString(symbols,'|'))); saveParams.Add(new KeyValuePair("Accounts", Utility.ListToString(accounts, '|'))); return saveParams; } public override void SetSaveParameters(SaveParameters saveParameters) { try { Referer = saveParameters.Referer; if(saveParameters.ContainsKey("SelectedSymbols")) selectedSymbols=Utility.ListToString(Utility.ToList((from KeyValuePair item in saveParameters where item.Key.Equals("SelectedSymbols") select item).FirstOrDefault().Value,'|'),','); if(saveParameters.ContainsKey("SelectedAccounts")) selectedAccounts=Utility.ListToString(Utility.ToList((from KeyValuePair item in saveParameters where item.Key.Equals("SelectedAccounts") select item).FirstOrDefault().Value,'|'),','); if(saveParameters.ContainsKey("Symbols")) symbols=Utility.ToList((from KeyValuePair item in saveParameters where item.Key.Equals("Symbols") select item).FirstOrDefault().Value,'|'); if(saveParameters.ContainsKey("Accounts")) accounts=Utility.ToList((from KeyValuePair item in saveParameters where item.Key.Equals("Accounts") select item).FirstOrDefault().Value,'|'); ignoreSelectedSymbols = false; base.OnPropertyChanged("SelectedSymbols"); } catch (Exception exception) { MDTrace.WriteLine(LogLevel.DEBUG,String.Format("Exception:{0}",exception.ToString())); } } public override bool CanPersist() { return true; } public ObservableCollection DividendPayments { get { return dividendPaymentModelCollection; } } public bool BusyIndicator { get { return busyIndicator; } set { busyIndicator = value; base.OnPropertyChanged("BusyIndicator"); } } private void OnViewModelPropertyChanged(object sender, PropertyChangedEventArgs eventArgs) { if (eventArgs.PropertyName.Equals("SelectedSymbols") && ignoreSelectedSymbols) { ignoreSelectedSymbols = false; return; } else if (eventArgs.PropertyName.Equals("SelectedSymbols")) { BusyIndicator = true; Task workerTask = Task.Factory.StartNew(() => { InitializeDataSources(); CheckSelectedItems(); String accounts = null; if (selectedAccounts.Equals(Constants.CONST_ALL)) accounts = Utility.ListToString(DividendPaymentDA.GetDividendPaymentAccounts()); else accounts = selectedAccounts; if (!"".Equals(selectedSymbols)) { List selectedAccountsInternal = GetSelectedItemsInternal(accounts); List selectedSymbolsInternal = GetSelectedItemsInternal(selectedSymbols); DividendPayments dividendPayments = DividendPaymentDA.GetDividendPaymentsForAccountsAndSymbols(selectedAccountsInternal, selectedSymbolsInternal); dividendPaymentModelCollection = new DividendPaymentModelCollection(dividendPayments); CreateCompositeDataSources(); } }); workerTask.ContinueWith((continuation) => { BusyIndicator = false; base.OnPropertyChanged("DividendPayments"); base.OnPropertyChanged("Values"); base.OnPropertyChanged("ValuePoints"); base.OnPropertyChanged("Markers"); }); } else if (eventArgs.PropertyName.Equals("SelectedAccounts")) { BusyIndicator = true; Task workerTask = Task.Factory.StartNew(() => { InitializeDataSources(); ignoreSelectedSymbols = true; if (selectedAccounts.Equals(Constants.CONST_ALL)) symbols = DividendPaymentDA.GetDividendPaymentSymbols(); else symbols = DividendPaymentDA.GetDividendPaymentSymbols(GetSelectedItemsInternal(selectedAccounts)); if (symbols.Count > 1) symbols.Insert(0, Constants.CONST_ALL); Symbols = symbols; if (symbols.Count > 0) { SelectedSymbols = symbols[0]; // SetSelectedItems(symbols[0]); List selectedAccountsInternal = GetSelectedItemsInternal(selectedAccounts); List selectedSymbolsInternal = GetSelectedItemsInternal(selectedSymbols); DividendPayments dividendPayments = DividendPaymentDA.GetDividendPaymentsForAccountsAndSymbols(selectedAccountsInternal, selectedSymbolsInternal); dividendPaymentModelCollection = new DividendPaymentModelCollection(dividendPayments); CreateCompositeDataSources(); } else dividendPaymentModelCollection = null; }); workerTask.ContinueWith((continuation) => { BusyIndicator = false; ignoreSelectedSymbols = false; base.OnPropertyChanged("DividendPayments"); base.OnPropertyChanged("Values"); base.OnPropertyChanged("ValuePoints"); base.OnPropertyChanged("Markers"); }); } } public override String Title { get { return "Dividend Payments"; } } public List Accounts { get { return accounts; } set { ;} } // Note : if more than one item is selected in the Symbols list we remove {All} from the selection list. However, WPFToolkit CheckBoxCombo does not update the check mark on the {All} item // so it remains visibly checked even though it is not checked. public String SelectedAccounts { get { return selectedAccounts ; } set { List selectedAccountsList = Utility.ToList(value); if (selectedAccountsList.Count > 1) selectedAccountsList.Remove(Constants.CONST_ALL); selectedAccounts = Utility.ListToString(selectedAccountsList); base.OnPropertyChanged("SelectedAccounts"); } } private static List GetSelectedItemsInternal(String selectedItemsStr) { List selectedItems = Utility.ToList(selectedItemsStr); List selectedItemsInternal = new List(); foreach (String selectedItem in selectedItems) { selectedItemsInternal.Add(selectedItem); } return selectedItemsInternal; } public List Symbols { get { return symbols; } set { symbols = value; base.OnPropertyChanged("Symbols"); } } // Note : if more than one item is selected in the Symbols list we remove {All} from the selection list. However, WPFToolkit CheckBoxCombo does not update the check mark on the {All} item // so it remains visibly checked even though it is not checked. public String SelectedSymbols { get { return selectedSymbols; } set { if (null != value) { List selectedSymbolsList = Utility.ToList(value); if (selectedSymbolsList.Count > 1) selectedSymbolsList.Remove(Constants.CONST_ALL); selectedSymbols = Utility.ListToString(selectedSymbolsList); base.OnPropertyChanged("SelectedSymbols"); } } } private void CheckSelectedItems() { Application.Current.Dispatcher.Invoke((System.Windows.Forms.MethodInvoker)delegate() { if (null == selectedSymbolsOverride) return; if (selectedSymbolsOverride.Count > 1) { selectedSymbolsOverride.Remove(Constants.CONST_ALL); } else if (0 == selectedSymbolsOverride.Count) { // select {All} selectedSymbolsOverride.Add(Constants.CONST_ALL); } }); } public ObservableCollection SelectedItemsOverride { get { return selectedSymbolsOverride; } set { selectedSymbolsOverride = value; } } public CompositeDataSource ValuePoints { get { if (null == dividendPaymentModelCollection) return null; return valuePointsCompositeDataSource; } } public CompositeDataSource Values { get { if (null == dividendPaymentModelCollection) return null; return valuesCompositeDataSource; } } // This just adds a lot of noise to the screen public CenteredTextMarker[] Markers { get { return null; //if (!showLabels) return null; //if (null == dividendPaymentModelCollection) return null; //List centeredTextMarkers = new List(); //for (int index = 0; index < dividendPaymentModelCollection.Count; index++) //{ // CenteredTextMarker centerTextMarker = new CenteredTextMarker(); // DividendPaymentModel dividendPaymentModel = dividendPaymentModelCollection[index]; // StringBuilder sb = new StringBuilder(); // sb.Append("(").Append(Utility.FormatCurrency(dividendPaymentModel.TotalAmount)).Append(")"); // centerTextMarker.Text = sb.ToString(); // centeredTextMarkers.Add(centerTextMarker); //} //return centeredTextMarkers.ToArray(); } } private void Refresh() { accounts = DividendPaymentDA.GetDividendPaymentAccounts(); accounts.Insert(0, Constants.CONST_ALL); selectedAccounts = accounts.Find(x => x.Equals(Constants.CONST_ALL)); symbols = DividendPaymentDA.GetDividendPaymentSymbols(selectedAccounts); symbols.Insert(0, Constants.CONST_ALL); selectedSymbols = symbols[0]; base.OnPropertyChanged("SelectedAccounts"); } private bool CanRefresh { get { return true; } } public ICommand RefreshCommand { get { if (refreshCommand == null) { refreshCommand = new RelayCommand(param => this.Refresh(), param => this.CanRefresh); } return refreshCommand; } } public String SaveDocument { get { return saveDocument; } set { saveDocument = value; base.OnPropertyChanged("SaveDocument"); } } private void Save() { StringBuilder sb = new StringBuilder(); sb.Append("DividendPayments_").Append(DateTime.Now.ToShortDateString()).Append(".xls"); SaveDocument = sb.ToString(); } private bool CanSave { get { return true; } } public ICommand SaveCommand { get { if (saveCommand == null) { saveCommand = new RelayCommand(param => this.Save(), param => this.CanSave); } return saveCommand; } } } }