Skip to content

Commit

Permalink
Reworked adjustment of ranges
Browse files Browse the repository at this point in the history
The default #adjustRanges implementation of the axis set supports no
margins. This can partially cut of lines at the top of the chart.

Issue: #474
  • Loading branch information
buchen committed Mar 25, 2016
1 parent 9f6ff91 commit fea9fc2
Show file tree
Hide file tree
Showing 11 changed files with 132 additions and 72 deletions.
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package name.abuchen.portfolio.ui.util.chart;

import name.abuchen.portfolio.ui.Messages;

import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
Expand All @@ -12,6 +10,8 @@
import org.swtchart.Chart;
import org.swtchart.IAxis;

import name.abuchen.portfolio.ui.Messages;

/* package */class ChartContextMenu
{
private static final String[] EXTENSIONS = new String[] { "*.jpeg", "*.jpg", "*.png" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
Expand Down Expand Up @@ -42,6 +42,8 @@ public void run()
{
if (chart instanceof ScatterChart)
((ScatterChart) chart).adjustRange();
else if (chart instanceof TimelineChart)
((TimelineChart) chart).adjustRange();
else
chart.getAxisSet().adjustRange();

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package name.abuchen.portfolio.ui.util.chart;

import org.swtchart.Chart;
import org.swtchart.IAxis;
import org.swtchart.Range;

public final class ChartUtil
{
public static void addMargins(Chart chart, double zoomRatio)
{
for (IAxis axis : chart.getAxisSet().getAxes())
addMargin(axis, zoomRatio);
}

public static void addYMargins(Chart chart, double zoomRatio)
{
for (IAxis axis : chart.getAxisSet().getYAxes())
addMargin(axis, zoomRatio);
}

public static void addMargin(IAxis axis, double zoomRatio)
{
Range range = axis.getRange();
double midPoint = ((range.upper - range.lower) / 2) + range.lower;
double lower = (range.lower - 2 * zoomRatio * midPoint) / (1 - 2 * zoomRatio);
double upper = (range.upper - 2 * zoomRatio * midPoint) / (1 - 2 * zoomRatio);
axis.setRange(new Range(lower, upper));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,9 @@
import org.swtchart.ILineSeries;
import org.swtchart.ISeries.SeriesType;
import org.swtchart.LineStyle;
import org.swtchart.Range;

public class ScatterChart extends Chart
{
private static final double ZOOM_RATIO = 0.1;
private ChartContextMenu contextMenu;

public ScatterChart(Composite parent)
Expand Down Expand Up @@ -66,26 +64,14 @@ public void adjustRange()
setRedraw(false);

getAxisSet().adjustRange();
for (IAxis axis : getAxisSet().getXAxes())
addMargin(axis);
for (IAxis axis : getAxisSet().getYAxes())
addMargin(axis);
ChartUtil.addMargins(this, 0.1);
}
finally
{
setRedraw(true);
}
}

private void addMargin(IAxis axis)
{
Range range = axis.getRange();
double midPoint = ((range.upper - range.lower) / 2) + range.lower;
double lower = (range.lower - 2 * ZOOM_RATIO * midPoint) / (1 - 2 * ZOOM_RATIO);
double upper = (range.upper - 2 * ZOOM_RATIO * midPoint) / (1 - 2 * ZOOM_RATIO);
axis.setRange(new Range(lower, upper));
}

public void exportMenuAboutToShow(IMenuManager manager, String label)
{
this.contextMenu.exportMenuAboutToShow(manager, label);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@
import java.time.LocalDate;
import java.util.List;

import name.abuchen.portfolio.util.Dates;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.graphics.Color;
Expand All @@ -22,6 +20,8 @@
import org.swtchart.LineStyle;
import org.swtchart.Range;

import name.abuchen.portfolio.util.Dates;

public class StackedTimelineChart extends Chart
{
private TimelineChartToolTip toolTip;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,6 @@
import java.util.Date;
import java.util.List;

import name.abuchen.portfolio.ui.util.Colors;

import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.resource.LocalResourceManager;
Expand All @@ -37,6 +35,8 @@
import org.swtchart.LineStyle;
import org.swtchart.Range;

import name.abuchen.portfolio.ui.util.Colors;

public class TimelineChart extends Chart
{
private static class MarkerLine
Expand Down Expand Up @@ -277,4 +277,19 @@ public static Date[] toJavaUtilDate(LocalDate[] dates)
answer[ii] = Date.from(dates[ii].atStartOfDay().atZone(zoneId).toInstant());
return answer;
}

public void adjustRange()
{
try
{
setRedraw(false);

getAxisSet().adjustRange();
ChartUtil.addYMargins(this, 0.03);
}
finally
{
setRedraw(true);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -131,8 +131,9 @@ protected void createTopTable(Composite parent)

ColumnEditingSupport.prepare(indices);

ShowHideColumnHelper support = new ShowHideColumnHelper(ConsumerPriceIndexListView.class.getSimpleName()
+ "@bottom", getPreferenceStore(), indices, layout); //$NON-NLS-1$
ShowHideColumnHelper support = new ShowHideColumnHelper(
ConsumerPriceIndexListView.class.getSimpleName() + "@bottom", getPreferenceStore(), indices, //$NON-NLS-1$
layout);

Column column = new Column(Messages.ColumnYear, SWT.None, 80);
column.setLabelProvider(new ColumnLabelProvider()
Expand Down Expand Up @@ -246,31 +247,38 @@ protected void createBottomTable(Composite parent)

private void refreshChart()
{
for (ISeries s : chart.getSeriesSet().getSeries())
chart.getSeriesSet().deleteSeries(s.getId());
try
{
chart.suspendUpdate(true);
for (ISeries s : chart.getSeriesSet().getSeries())
chart.getSeriesSet().deleteSeries(s.getId());

if (getClient().getConsumerPriceIndices() == null || getClient().getConsumerPriceIndices().isEmpty())
return;
if (getClient().getConsumerPriceIndices() == null || getClient().getConsumerPriceIndices().isEmpty())
return;

List<ConsumerPriceIndex> indices = new ArrayList<ConsumerPriceIndex>(getClient().getConsumerPriceIndices());
Collections.sort(indices, new ConsumerPriceIndex.ByDate());
List<ConsumerPriceIndex> indices = new ArrayList<ConsumerPriceIndex>(getClient().getConsumerPriceIndices());
Collections.sort(indices, new ConsumerPriceIndex.ByDate());

LocalDate[] dates = new LocalDate[indices.size()];
double[] cpis = new double[indices.size()];
LocalDate[] dates = new LocalDate[indices.size()];
double[] cpis = new double[indices.size()];

int ii = 0;
for (ConsumerPriceIndex index : indices)
{
dates[ii] = LocalDate.of(index.getYear(), index.getMonth(), 1);
cpis[ii] = (double) index.getIndex() / Values.Index.divider();
ii++;
}

chart.addDateSeries(dates, cpis, Colors.CPI, Messages.LabelConsumerPriceIndex);
int ii = 0;
for (ConsumerPriceIndex index : indices)
{
dates[ii] = LocalDate.of(index.getYear(), index.getMonth(), 1);
cpis[ii] = (double) index.getIndex() / Values.Index.divider();
ii++;
}

chart.getAxisSet().adjustRange();
chart.addDateSeries(dates, cpis, Colors.CPI, Messages.LabelConsumerPriceIndex);

chart.redraw();
chart.adjustRange();
}
finally
{
chart.suspendUpdate(false);
chart.redraw();
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,8 @@ protected void createTopTable(Composite parent)

TableViewer indeces = new TableViewer(container, SWT.FULL_SELECTION);

ShowHideColumnHelper support = new ShowHideColumnHelper(
ExchangeRatesListView.class.getSimpleName() + "@top", getPreferenceStore(), indeces, layout); //$NON-NLS-1$
ShowHideColumnHelper support = new ShowHideColumnHelper(ExchangeRatesListView.class.getSimpleName() + "@top", //$NON-NLS-1$
getPreferenceStore(), indeces, layout);

Column column = new Column(Messages.ColumnBaseCurrency, SWT.None, 80);
column.setLabelProvider(new ColumnLabelProvider()
Expand Down Expand Up @@ -129,36 +129,43 @@ protected void createBottomTable(Composite parent)

private void refreshChart(ExchangeRateTimeSeries series)
{
for (ISeries s : chart.getSeriesSet().getSeries())
chart.getSeriesSet().deleteSeries(s.getId());

if (series == null || series.getRates().isEmpty())
try
{
chart.getTitle().setText(Messages.LabelCurrencies);
return;
}
chart.suspendUpdate(true);
for (ISeries s : chart.getSeriesSet().getSeries())
chart.getSeriesSet().deleteSeries(s.getId());

List<ExchangeRate> rates = series.getRates();
if (series == null || series.getRates().isEmpty())
{
chart.getTitle().setText(Messages.LabelCurrencies);
return;
}

LocalDate[] dates = new LocalDate[rates.size()];
double[] values = new double[rates.size()];
List<ExchangeRate> rates = series.getRates();

int ii = 0;
for (ExchangeRate rate : rates)
{
dates[ii] = rate.getTime();
values[ii] = rate.getValue().doubleValue();
ii++;
}
LocalDate[] dates = new LocalDate[rates.size()];
double[] values = new double[rates.size()];

String title = MessageFormat.format("{0}/{1} ({2})", //$NON-NLS-1$
series.getTermCurrency(), series.getBaseCurrency(), series.getProvider().getName());
int ii = 0;
for (ExchangeRate rate : rates)
{
dates[ii] = rate.getTime();
values[ii] = rate.getValue().doubleValue();
ii++;
}

chart.getTitle().setText(title);
chart.addDateSeries(dates, values, Colors.TOTALS, title);
String title = MessageFormat.format("{0}/{1} ({2})", //$NON-NLS-1$
series.getTermCurrency(), series.getBaseCurrency(), series.getProvider().getName());

chart.getAxisSet().adjustRange();
chart.getTitle().setText(title);
chart.addDateSeries(dates, values, Colors.TOTALS, title);

chart.redraw();
chart.adjustRange();
}
finally
{
chart.suspendUpdate(false);
chart.redraw();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,7 @@ protected Composite createBody(Composite parent)
@Override
public void setFocus()
{
chart.getAxisSet().adjustRange();
chart.adjustRange();
chart.setFocus();
}

Expand Down Expand Up @@ -192,7 +192,7 @@ private void updateChart()

setChartSeries();

chart.getAxisSet().adjustRange();
chart.adjustRange();
}
finally
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -732,7 +732,7 @@ private void updateChart(Security security)
lineSeries.setYSeries(values);
lineSeries.setAntialias(SWT.ON);

chart.getAxisSet().adjustRange();
chart.adjustRange();

addChartMarker(security);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -168,10 +168,20 @@ protected Composite createBody(Composite parent)
@Override
public void setFocus()
{
chart.getAxisSet().adjustRange();
try
{
chart.setRedraw(false);
chart.adjustRange();
}
finally
{
chart.setRedraw(true);
}

chart.setFocus();
}


@Override
public void notifyModelUpdated()
{
Expand Down Expand Up @@ -199,7 +209,7 @@ private void updateChart()

setChartSeries();

chart.getAxisSet().adjustRange();
chart.adjustRange();
}
finally
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -300,6 +300,9 @@ public void visit(TaxonomyNode node)

private void rebuildChartSeries(long[] totals, List<SeriesBuilder> series)
{
if (chart.isDisposed())
return;

try
{
chart.suspendUpdate(true);
Expand Down

0 comments on commit fea9fc2

Please sign in to comment.