382 lines
14 KiB
C#
382 lines
14 KiB
C#
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<String> accounts;
|
|
private List<String> symbols;
|
|
private String selectedAccounts;
|
|
|
|
private String selectedSymbols;
|
|
private ObservableCollection<String> selectedSymbolsOverride = new ObservableCollection<String>();
|
|
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<String, String>("Type", GetType().Namespace + "." + GetType().Name));
|
|
saveParams.Add(new KeyValuePair<String, String>("SelectedSymbols", Utility.ListToString(Utility.ToList(selectedSymbols),'|')));
|
|
saveParams.Add(new KeyValuePair<String, String>("SelectedAccounts", Utility.ListToString(Utility.ToList(selectedAccounts),'|')));
|
|
saveParams.Add(new KeyValuePair<String, String>("Symbols", Utility.ListToString(symbols,'|')));
|
|
saveParams.Add(new KeyValuePair<String, String>("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<String,String> item in saveParameters where item.Key.Equals("SelectedSymbols") select item).FirstOrDefault().Value,'|'),',');
|
|
if(saveParameters.ContainsKey("SelectedAccounts")) selectedAccounts=Utility.ListToString(Utility.ToList((from KeyValuePair<String,String> item in saveParameters where item.Key.Equals("SelectedAccounts") select item).FirstOrDefault().Value,'|'),',');
|
|
if(saveParameters.ContainsKey("Symbols")) symbols=Utility.ToList((from KeyValuePair<String,String> item in saveParameters where item.Key.Equals("Symbols") select item).FirstOrDefault().Value,'|');
|
|
if(saveParameters.ContainsKey("Accounts")) accounts=Utility.ToList((from KeyValuePair<String,String> 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<DividendPaymentModel> 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<String> selectedAccountsInternal = GetSelectedItemsInternal(accounts);
|
|
List<String> 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<String> selectedAccountsInternal = GetSelectedItemsInternal(selectedAccounts);
|
|
List<String> 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<String> 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<String> selectedAccountsList = Utility.ToList(value);
|
|
if (selectedAccountsList.Count > 1) selectedAccountsList.Remove(Constants.CONST_ALL);
|
|
selectedAccounts = Utility.ListToString(selectedAccountsList);
|
|
base.OnPropertyChanged("SelectedAccounts");
|
|
}
|
|
}
|
|
private static List<String> GetSelectedItemsInternal(String selectedItemsStr)
|
|
{
|
|
List<String> selectedItems = Utility.ToList(selectedItemsStr);
|
|
List<String> selectedItemsInternal = new List<String>();
|
|
foreach (String selectedItem in selectedItems)
|
|
{
|
|
selectedItemsInternal.Add(selectedItem);
|
|
}
|
|
return selectedItemsInternal;
|
|
}
|
|
public List<String> 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<String> 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<String> 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<CenteredTextMarker> centeredTextMarkers = new List<CenteredTextMarker>();
|
|
//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;
|
|
}
|
|
}
|
|
}
|
|
} |