forked from portfolio-performance/portfolio
-
Notifications
You must be signed in to change notification settings - Fork 0
/
LimitExceededWidget.java
139 lines (113 loc) · 5.28 KB
/
LimitExceededWidget.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
package name.abuchen.portfolio.ui.views.dashboard;
import java.text.MessageFormat;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.function.Supplier;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import name.abuchen.portfolio.model.AttributeType;
import name.abuchen.portfolio.model.Dashboard.Widget;
import name.abuchen.portfolio.model.LimitPrice;
import name.abuchen.portfolio.model.LimitPriceSettings;
import name.abuchen.portfolio.model.Security;
import name.abuchen.portfolio.model.SecurityPrice;
import name.abuchen.portfolio.money.Values;
import name.abuchen.portfolio.ui.Messages;
import name.abuchen.portfolio.ui.util.Colors;
import name.abuchen.portfolio.ui.util.FormDataFactory;
import name.abuchen.portfolio.ui.util.LogoManager;
import name.abuchen.portfolio.ui.util.swt.ColoredLabel;
import name.abuchen.portfolio.ui.util.swt.StyledLabel;
import name.abuchen.portfolio.ui.views.columns.AttributeColumn;
import name.abuchen.portfolio.ui.views.settings.AttributeFieldType;
import name.abuchen.portfolio.ui.views.settings.SettingsView;
public class LimitExceededWidget extends AbstractSecurityListWidget<LimitExceededWidget.LimitItem>
{
public static class LimitItem extends AbstractSecurityListWidget.Item
{
private LimitPrice limit;
private SecurityPrice price;
private AttributeType attributeType;
public LimitItem(Security security, LimitPrice limit, SecurityPrice price, AttributeType type)
{
super(security);
this.limit = limit;
this.price = price;
this.attributeType = type;
}
}
public LimitExceededWidget(Widget widget, DashboardData data)
{
super(widget, data);
addConfig(new AttributesConfig(this, t -> t.getTarget() == Security.class && t.getType() == LimitPrice.class));
addConfig(new ChartHeightConfig(this));
}
@Override
public Supplier<List<LimitItem>> getUpdateTask()
{
return () -> {
List<AttributeType> types = get(AttributesConfig.class).getTypes();
List<LimitItem> items = new ArrayList<>();
for (Security security : getClient().getSecurities())
{
for (AttributeType t : types)
{
Object attribute = security.getAttributes().get(t);
if (!(attribute instanceof LimitPrice limit))
continue;
SecurityPrice latest = security.getSecurityPrice(LocalDate.now());
if (latest != null && limit.isExceeded(latest))
{
items.add(new LimitItem(security, limit, latest, t));
}
}
}
Collections.sort(items, (r, l) -> Double.compare(AttributeColumn.LimitPriceComparator.calculateNormalizedDistance(l.limit, l.price), AttributeColumn.LimitPriceComparator.calculateNormalizedDistance(r.limit, r.price)));
return items;
};
}
@Override
protected Composite createItemControl(Composite parent, LimitItem item)
{
Composite composite = new Composite(parent, SWT.NONE);
composite.setLayout(new FormLayout());
Label logo = new Label(composite, SWT.NONE);
logo.setImage(LogoManager.instance().getDefaultColumnImage(item.getSecurity(), getClient().getSettings()));
Label name = new Label(composite, SWT.NONE);
name.setText(item.getSecurity().getName());
ColoredLabel price = new ColoredLabel(composite, SWT.RIGHT);
// determine colors
LimitPriceSettings settings = new LimitPriceSettings(item.attributeType.getProperties());
Color bgColor = item.limit.getRelationalOperator().isGreater()
? settings.getLimitExceededPositivelyColor(Colors.theme().greenBackground())
: settings.getLimitExceededNegativelyColor(Colors.theme().redBackground());
price.setBackdropColor(bgColor);
price.setForeground(Colors.getTextColor(bgColor));
price.setText(Values.Quote.format(item.getSecurity().getCurrencyCode(), item.price.getValue()));
Label limit = new Label(composite, SWT.NONE);
limit.setText(settings.getFullLabel(item.limit, item.price));
composite.addMouseListener(mouseUpAdapter);
name.addMouseListener(mouseUpAdapter);
limit.addMouseListener(mouseUpAdapter);
price.addMouseListener(mouseUpAdapter);
FormDataFactory.startingWith(logo).thenRight(name).right(new FormAttachment(100)).thenBelow(price)
.thenRight(limit);
return composite;
}
@Override
protected void createEmptyControl(Composite parent)
{
if (get(AttributesConfig.class).hasTypes())
return;
title = new StyledLabel(parent, SWT.WRAP);
title.setText(MessageFormat.format(Messages.MsgHintNoAttributesConfigured,
AttributeFieldType.LIMIT_PRICE.toString()));
title.setOpenLinkHandler(d -> view.getPart().activateView(SettingsView.class, 1));
}
}