package name.abuchen.portfolio.ui.views.taxonomy;
import javax.inject.Inject;
import org.apache.commons.lang3.StringEscapeUtils;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.browser.BrowserFunction;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import com.ibm.icu.text.MessageFormat;
import name.abuchen.portfolio.money.Money;
import name.abuchen.portfolio.money.Values;
import name.abuchen.portfolio.ui.Messages;
import name.abuchen.portfolio.ui.PortfolioPlugin;
import name.abuchen.portfolio.ui.util.EmbeddedBrowser;
/* package */class PieChartViewer extends AbstractChartPage
{
private EmbeddedBrowser browser;
@Inject
public PieChartViewer(TaxonomyModel model, TaxonomyNodeRenderer renderer)
{
super(model, renderer);
}
@Override
public Control createControl(Composite container)
{
browser = new EmbeddedBrowser("/META-INF/html/flare.html"); //$NON-NLS-1$
return browser.createControl(container, b -> new LoadDataFunction(b, "loadData")); //$NON-NLS-1$
}
@Override
public void beforePage()
{}
@Override
public void afterPage()
{}
@Override
public void nodeChange(TaxonomyNode node)
{
browser.refresh();
}
@Override
public void onConfigChanged()
{
browser.refresh();
}
private final class LoadDataFunction extends BrowserFunction
{
private LoadDataFunction(Browser browser, String name)
{
super(browser, name);
}
@Override
public Object function(Object[] arguments)
{
try
{
TaxonomyNode root = getModel().getChartRenderingRootNode();
StringBuilder buffer = new StringBuilder();
printNode(buffer, root, root.getActual());
return buffer.toString();
}
catch (Throwable e) // NOSONAR
{
PortfolioPlugin.log(e);
return "{}"; //$NON-NLS-1$
}
}
@SuppressWarnings("nls")
private void printNode(StringBuilder buffer, TaxonomyNode node, Money total)
{
String name = StringEscapeUtils.escapeJson(node.getName());
long actual = node.isRoot() ? total.getAmount() : node.getActual().getAmount();
long base = node.isRoot() ? total.getAmount() : node.getParent().getActual().getAmount();
String totalPercentage = "";
if (node.getParent() != null && !node.getParent().isRoot())
totalPercentage = "; " + MessageFormat.format(Messages.LabelTotalValuePercent,
Values.Percent2.format(actual / (double) total.getAmount()));
buffer.append("{\"name\":\"").append(name);
buffer.append("\",\"caption\":\"");
buffer.append(name).append(" ").append(Values.Amount.format(actual)).append(" (")
.append(Values.Percent2.format(actual / (double) base)).append(totalPercentage)
.append(")\",");
buffer.append("\"value\":").append(node.getActual().getAmount());
buffer.append(",\"color\":\"").append(node.getColor()).append("\"");
boolean isFirst = true;
for (TaxonomyNode child : node.getChildren())
{
if (child.getActual().isZero())
continue;
if (isFirst)
buffer.append(",\"children\": [");
else
buffer.append(",");
printNode(buffer, child, total);
isFirst = false;
}
if (!isFirst)
buffer.append("]");
buffer.append("}");
}
}
}