From 1e210559a2dcdff0cae42c202f96180b7be449f9 Mon Sep 17 00:00:00 2001 From: Andreas Buchen Date: Thu, 29 May 2014 10:18:07 +0200 Subject: [PATCH] Added taxonomy columns to statement of assets and security performance views --- .../ui/util/ShowHideColumnHelper.java | 10 +- .../ui/views/DividendsPerformanceView.java | 9 ++ .../portfolio/ui/views/SecuritiesTable.java | 94 +------------- .../ui/views/StatementOfAssetsViewer.java | 80 ++++++++---- .../ui/views/columns/TaxonomyColumn.java | 118 ++++++++++++++++++ .../security/SecurityPerformanceRecord.java | 3 + 6 files changed, 199 insertions(+), 115 deletions(-) create mode 100644 name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/views/columns/TaxonomyColumn.java diff --git a/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/util/ShowHideColumnHelper.java b/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/util/ShowHideColumnHelper.java index 6cec03af96..ea70bd6b77 100644 --- a/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/util/ShowHideColumnHelper.java +++ b/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/util/ShowHideColumnHelper.java @@ -477,7 +477,15 @@ private void doAddGroup(String group, Map> visible) if (visible.containsKey(column)) continue; - policy.create(column, null, column.getDefaultSortDirection(), column.getDefaultWidth()); + if (column.hasOptions()) + { + for (Integer option : column.getOptions()) + policy.create(column, option, column.getDefaultSortDirection(), column.getDefaultWidth()); + } + else + { + policy.create(column, null, column.getDefaultSortDirection(), column.getDefaultWidth()); + } } } finally diff --git a/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/views/DividendsPerformanceView.java b/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/views/DividendsPerformanceView.java index bc9138c33b..2e82a555ea 100644 --- a/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/views/DividendsPerformanceView.java +++ b/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/views/DividendsPerformanceView.java @@ -8,6 +8,7 @@ import name.abuchen.portfolio.model.AttributeTypes; import name.abuchen.portfolio.model.PortfolioTransaction; import name.abuchen.portfolio.model.Security; +import name.abuchen.portfolio.model.Taxonomy; import name.abuchen.portfolio.model.Transaction; import name.abuchen.portfolio.model.Values; import name.abuchen.portfolio.snapshot.ReportingPeriod; @@ -35,6 +36,7 @@ import name.abuchen.portfolio.ui.views.columns.IsinColumn; import name.abuchen.portfolio.ui.views.columns.NameColumn; import name.abuchen.portfolio.ui.views.columns.NoteColumn; +import name.abuchen.portfolio.ui.views.columns.TaxonomyColumn; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.ActionContributionItem; @@ -401,6 +403,13 @@ public String getText(Object r) private void createAdditionalColumns() { + for (Taxonomy taxonomy : getClient().getTaxonomies()) + { + Column column = new TaxonomyColumn(taxonomy); + column.setVisible(false); + recordColumns.addColumn(column); + } + for (final AttributeType attribute : AttributeTypes.available(Security.class)) { Column column = new AttributeColumn(attribute); diff --git a/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/views/SecuritiesTable.java b/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/views/SecuritiesTable.java index 04c131f325..195e361f87 100644 --- a/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/views/SecuritiesTable.java +++ b/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/views/SecuritiesTable.java @@ -1,14 +1,12 @@ package name.abuchen.portfolio.ui.views; import java.text.MessageFormat; -import java.util.ArrayList; import java.util.Comparator; import java.util.Date; import java.util.List; import name.abuchen.portfolio.model.AttributeType; import name.abuchen.portfolio.model.AttributeTypes; -import name.abuchen.portfolio.model.Classification; import name.abuchen.portfolio.model.Client; import name.abuchen.portfolio.model.LatestSecurityPrice; import name.abuchen.portfolio.model.PortfolioTransaction; @@ -29,7 +27,6 @@ import name.abuchen.portfolio.ui.util.ColumnEditingSupport; import name.abuchen.portfolio.ui.util.ColumnEditingSupport.ModificationListener; import name.abuchen.portfolio.ui.util.ColumnViewerSorter; -import name.abuchen.portfolio.ui.util.OptionLabelProvider; import name.abuchen.portfolio.ui.util.ShowHideColumnHelper; import name.abuchen.portfolio.ui.util.SimpleListContentProvider; import name.abuchen.portfolio.ui.util.StringEditingSupport; @@ -38,6 +35,7 @@ import name.abuchen.portfolio.ui.views.columns.AttributeColumn; import name.abuchen.portfolio.ui.views.columns.IsinColumn; import name.abuchen.portfolio.ui.views.columns.NoteColumn; +import name.abuchen.portfolio.ui.views.columns.TaxonomyColumn; import name.abuchen.portfolio.ui.wizards.datatransfer.ImportQuotesWizard; import name.abuchen.portfolio.ui.wizards.security.EditSecurityDialog; import name.abuchen.portfolio.ui.wizards.splits.StockSplitWizard; @@ -102,7 +100,11 @@ public SecuritiesTable(Composite parent, AbstractFinanceView view) addColumnDateOfLatestHistoricalPrice(); for (Taxonomy taxonomy : getClient().getTaxonomies()) - addTaxonomyColumn(support, taxonomy); + { + Column column = new TaxonomyColumn(taxonomy); + column.setVisible(false); + support.addColumn(column); + } addAttributeColumns(); @@ -195,90 +197,6 @@ public String getText(Object e) support.addColumn(column); } - private void addTaxonomyColumn(ShowHideColumnHelper support, final Taxonomy taxonomy) - { - String name = taxonomy.getName(); - List labels = taxonomy.getDimensions(); - - List options = new ArrayList(); - - StringBuilder menuLabels = new StringBuilder("{0,choice,"); //$NON-NLS-1$ - StringBuilder columnLabels = new StringBuilder("{0,choice,"); //$NON-NLS-1$ - - int heigth = taxonomy.getHeigth(); - for (int ii = 1; ii < heigth; ii++) // 1 --> skip taxonomy root node - { - options.add(ii); - - if (ii > 1) - { - menuLabels.append('|'); - columnLabels.append('|'); - } - - String label = null; - if (labels != null && ii <= labels.size()) - label = labels.get(ii - 1); - - menuLabels.append(ii).append('#'); - columnLabels.append(ii).append('#'); - - if (label != null) - { - menuLabels.append(label); - columnLabels.append(label); - } - else - { - menuLabels.append(MessageFormat.format(Messages.LabelLevelNumber, ii)); - columnLabels.append(MessageFormat.format(Messages.LabelLevelNameNumber, name, ii)); - } - } - - options.add(100); - - menuLabels.append("|100#" + Messages.LabelFullClassification + "}"); //$NON-NLS-1$ //$NON-NLS-2$ - columnLabels.append("|100#").append(name).append("}"); //$NON-NLS-1$ //$NON-NLS-2$ - - Column column = new Column(taxonomy.getId(), name, SWT.LEFT, 120); - column.setOptions(menuLabels.toString(), columnLabels.toString(), options.toArray(new Integer[0])); - column.setLabelProvider(new OptionLabelProvider() - { - @Override - public String getText(Object e, Integer option) - { - Security security = (Security) e; - List classifications = taxonomy.getClassifications(security); - - if (classifications.isEmpty()) - return null; - - StringBuilder answer = new StringBuilder(); - - for (Classification c : classifications) - { - if (answer.length() > 0) - answer.append(", "); //$NON-NLS-1$ - - if (option == 100) - { - answer.append(c.getPathName(false)); - } - else - { - List path = c.getPathToRoot(); - if (option < path.size()) - answer.append(path.get(option).getName()); - } - } - - return answer.toString(); - } - }); - column.setVisible(false); - support.addColumn(column); - } - private void addColumnLatestPrice() { Column column; diff --git a/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/views/StatementOfAssetsViewer.java b/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/views/StatementOfAssetsViewer.java index a611b3036a..3ac123fa79 100644 --- a/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/views/StatementOfAssetsViewer.java +++ b/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/views/StatementOfAssetsViewer.java @@ -14,6 +14,7 @@ import name.abuchen.portfolio.model.AttributeTypes; import name.abuchen.portfolio.model.Classification; import name.abuchen.portfolio.model.Client; +import name.abuchen.portfolio.model.InvestmentVehicle; import name.abuchen.portfolio.model.Named; import name.abuchen.portfolio.model.Security; import name.abuchen.portfolio.model.Taxonomy; @@ -45,6 +46,7 @@ import name.abuchen.portfolio.ui.views.columns.NameColumn; import name.abuchen.portfolio.ui.views.columns.NameColumn.NameColumnLabelProvider; import name.abuchen.portfolio.ui.views.columns.NoteColumn; +import name.abuchen.portfolio.ui.views.columns.TaxonomyColumn; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IMenuListener; @@ -203,6 +205,11 @@ public boolean canEdit(Object element) }.setMandatory(true).addListener(new MarkDirtyListener(this.owner))); support.addColumn(column); + column = new NoteColumn(); + column.getEditingSupport().addListener(new MarkDirtyListener(this.owner)); + column.setVisible(false); + support.addColumn(column); + column = new Column("2", Messages.ColumnTicker, SWT.None, 60); //$NON-NLS-1$ column.setLabelProvider(new ColumnLabelProvider() { @@ -215,12 +222,25 @@ public String getText(Object e) }); support.addColumn(column); + column = new Column("12", Messages.ColumnWKN, SWT.None, 60); //$NON-NLS-1$ + column.setLabelProvider(new ColumnLabelProvider() + { + @Override + public String getText(Object e) + { + Element element = (Element) e; + return element.isSecurity() ? element.getSecurity().getWkn() : null; + } + }); + column.setVisible(false); + support.addColumn(column); + column = new IsinColumn("3"); //$NON-NLS-1$ column.getEditingSupport().addListener(new MarkDirtyListener(this.owner)); column.setVisible(false); support.addColumn(column); - column = new Column(Messages.ColumnQuote, SWT.RIGHT, 60); + column = new Column("4", Messages.ColumnQuote, SWT.RIGHT, 60); //$NON-NLS-1$ column.setLabelProvider(new ColumnLabelProvider() { @Override @@ -233,7 +253,7 @@ public String getText(Object e) }); support.addColumn(column); - column = new Column(Messages.ColumnMarketValue, SWT.RIGHT, 80); + column = new Column("5", Messages.ColumnMarketValue, SWT.RIGHT, 80); //$NON-NLS-1$ column.setLabelProvider(new ColumnLabelProvider() { @Override @@ -251,7 +271,7 @@ public Font getFont(Object e) }); support.addColumn(column); - column = new Column(Messages.ColumnShareInPercent, SWT.RIGHT, 80); + column = new Column("6", Messages.ColumnShareInPercent, SWT.RIGHT, 80); //$NON-NLS-1$ column.setLabelProvider(new ColumnLabelProvider() { @Override @@ -274,7 +294,7 @@ public Font getFont(Object e) }); support.addColumn(column); - column = new Column(Messages.ColumnPurchasePrice, SWT.RIGHT, 60); + column = new Column("7", Messages.ColumnPurchasePrice, SWT.RIGHT, 60); //$NON-NLS-1$ column.setLabelProvider(new ColumnLabelProvider() { @Override @@ -292,7 +312,7 @@ public String getText(Object e) column.setVisible(false); support.addColumn(column); - column = new Column(Messages.ColumnPurchaseValue, SWT.RIGHT, 80); + column = new Column("8", Messages.ColumnPurchaseValue, SWT.RIGHT, 80); //$NON-NLS-1$ column.setLabelProvider(new ColumnLabelProvider() { @Override @@ -312,7 +332,7 @@ public Font getFont(Object e) column.setVisible(false); support.addColumn(column); - column = new Column(Messages.ColumnProfitLoss, SWT.RIGHT, 80); + column = new Column("9", Messages.ColumnProfitLoss, SWT.RIGHT, 80); //$NON-NLS-1$ column.setLabelProvider(new ColumnLabelProvider() { @Override @@ -346,7 +366,7 @@ public Font getFont(Object e) column.setVisible(false); support.addColumn(column); - column = new Column(Messages.ColumnIRRPerformance, SWT.RIGHT, 80); + column = new Column("10", Messages.ColumnIRRPerformance, SWT.RIGHT, 80); //$NON-NLS-1$ column.setOptions(Messages.LabelReportingYears, Messages.ColumnIRRPerformanceOption, 1, 2, 3, 4, 5, 10); column.setLabelProvider(new OptionLabelProvider() { @@ -384,7 +404,7 @@ else if (irr > 0) column.setVisible(false); support.addColumn(column); - column = new Column(Messages.ColumnTotalProfitLoss, SWT.RIGHT, 80); + column = new Column("11", Messages.ColumnTotalProfitLoss, SWT.RIGHT, 80); //$NON-NLS-1$ column.setOptions(Messages.LabelReportingYears, Messages.ColumnTotalProfitLossOption, 1, 2, 3, 4, 5, 10); column.setLabelProvider(new OptionLabelProvider() { @@ -422,24 +442,7 @@ else if (delta > 0) column.setVisible(false); support.addColumn(column); - column = new Column(Messages.ColumnWKN, SWT.None, 60); - column.setLabelProvider(new ColumnLabelProvider() - { - @Override - public String getText(Object e) - { - Element element = (Element) e; - return element.isSecurity() ? element.getSecurity().getWkn() : null; - } - }); - column.setVisible(false); - support.addColumn(column); - - column = new NoteColumn(); - column.getEditingSupport().addListener(new MarkDirtyListener(this.owner)); - column.setVisible(false); - support.addColumn(column); - + addTaxonomyColumns(); addAttributeColumns(); support.createColumns(); @@ -469,6 +472,16 @@ private void addAttributeColumns() } } + private void addTaxonomyColumns() + { + for (Taxonomy taxonomy : client.getTaxonomies()) + { + Column column = new TaxonomyColumn(taxonomy); + column.setVisible(false); + support.addColumn(column); + } + } + public void hookMenuListener(IMenuManager manager, final AbstractFinanceView view) { Element element = (Element) ((IStructuredSelection) assets.getSelection()).getFirstElement(); @@ -748,9 +761,13 @@ else if (category != null) public T adapt(Class type) { if (type == Security.class) + { return type.cast(getSecurity()); + } else if (type == Attributable.class) + { return type.cast(getSecurity()); + } else if (type == Named.class) { if (isSecurity()) @@ -762,8 +779,19 @@ else if (isCategory()) else return null; } + else if (type == InvestmentVehicle.class) + { + if (isSecurity()) + return type.cast(getSecurity()); + else if (isAccount()) + return type.cast(getAccount()); + else + return null; + } else + { return null; + } } } diff --git a/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/views/columns/TaxonomyColumn.java b/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/views/columns/TaxonomyColumn.java new file mode 100644 index 0000000000..7999eda6bd --- /dev/null +++ b/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/views/columns/TaxonomyColumn.java @@ -0,0 +1,118 @@ +package name.abuchen.portfolio.ui.views.columns; + +import java.text.MessageFormat; +import java.util.ArrayList; +import java.util.List; + +import name.abuchen.portfolio.model.Adaptor; +import name.abuchen.portfolio.model.Classification; +import name.abuchen.portfolio.model.InvestmentVehicle; +import name.abuchen.portfolio.model.Taxonomy; +import name.abuchen.portfolio.ui.Messages; +import name.abuchen.portfolio.ui.util.Column; +import name.abuchen.portfolio.ui.util.OptionLabelProvider; + +import org.eclipse.swt.SWT; + +public class TaxonomyColumn extends Column +{ + public static final class TaxonomyLabelProvider extends OptionLabelProvider + { + private final Taxonomy taxonomy; + + public TaxonomyLabelProvider(Taxonomy taxonomy) + { + this.taxonomy = taxonomy; + } + + @Override + public String getText(Object e, Integer option) + { + InvestmentVehicle vehicle = Adaptor.adapt(InvestmentVehicle.class, e); + if (vehicle == null) + return null; + + List classifications = taxonomy.getClassifications(vehicle); + if (classifications.isEmpty()) + return null; + + StringBuilder answer = new StringBuilder(); + + for (Classification c : classifications) + { + if (answer.length() > 0) + answer.append(", "); //$NON-NLS-1$ + + if (option == 100) + { + answer.append(c.getPathName(false)); + } + else + { + List path = c.getPathToRoot(); + if (option < path.size()) + answer.append(path.get(option).getName()); + } + } + + return answer.toString(); + } + } + + public TaxonomyColumn(final Taxonomy taxonomy) + { + super(taxonomy.getId(), taxonomy.getName(), SWT.LEFT, 120); + + setGroupLabel("Klassifizierungen"); + prepareOptions(taxonomy); + + this.setLabelProvider(new TaxonomyLabelProvider(taxonomy)); + } + + private void prepareOptions(final Taxonomy taxonomy) + { + List labels = taxonomy.getDimensions(); + + List options = new ArrayList(); + + StringBuilder menuLabels = new StringBuilder("{0,choice,"); //$NON-NLS-1$ + StringBuilder columnLabels = new StringBuilder("{0,choice,"); //$NON-NLS-1$ + + int heigth = taxonomy.getHeigth(); + for (int ii = 1; ii < heigth; ii++) // 1 --> skip taxonomy root node + { + options.add(ii); + + if (ii > 1) + { + menuLabels.append('|'); + columnLabels.append('|'); + } + + String label = null; + if (labels != null && ii <= labels.size()) + label = labels.get(ii - 1); + + menuLabels.append(ii).append('#'); + columnLabels.append(ii).append('#'); + + if (label != null) + { + menuLabels.append(label); + columnLabels.append(label); + } + else + { + menuLabels.append(MessageFormat.format(Messages.LabelLevelNumber, ii)); + columnLabels.append(MessageFormat.format(Messages.LabelLevelNameNumber, taxonomy.getName(), ii)); + } + } + + options.add(100); + + menuLabels.append("|100#" + Messages.LabelFullClassification + "}"); //$NON-NLS-1$ //$NON-NLS-2$ + columnLabels.append("|100#").append(taxonomy.getName()).append("}"); //$NON-NLS-1$ //$NON-NLS-2$ + + setOptions(menuLabels.toString(), columnLabels.toString(), options.toArray(new Integer[0])); + } +} diff --git a/name.abuchen.portfolio/src/name/abuchen/portfolio/snapshot/security/SecurityPerformanceRecord.java b/name.abuchen.portfolio/src/name/abuchen/portfolio/snapshot/security/SecurityPerformanceRecord.java index 573f1bcaad..33421f4080 100644 --- a/name.abuchen.portfolio/src/name/abuchen/portfolio/snapshot/security/SecurityPerformanceRecord.java +++ b/name.abuchen.portfolio/src/name/abuchen/portfolio/snapshot/security/SecurityPerformanceRecord.java @@ -9,6 +9,7 @@ import name.abuchen.portfolio.model.Adaptable; import name.abuchen.portfolio.model.Attributable; import name.abuchen.portfolio.model.Client; +import name.abuchen.portfolio.model.InvestmentVehicle; import name.abuchen.portfolio.model.Named; import name.abuchen.portfolio.model.Security; import name.abuchen.portfolio.model.Transaction; @@ -192,6 +193,8 @@ else if (type == Attributable.class) return type.cast(security); else if (type == Named.class) return type.cast(security); + else if (type == InvestmentVehicle.class) + return type.cast(security); else return null; }