private IDrawableRuler computeScaler(final GanttRenderingData data) { final Rectangle dataScreenArea = getDataArea(data); if (data.isLog()) { List<Span> spans = new ArrayList<Span>(Span.valueOfDurations(data.getDurations())); if (data.getDurations().size() > 0) { ITaskDuration first = data.getDurations().get(0); ITaskDuration last = data.getDurations().get(data.getDurations().size() - 1); Span emptyBefore = Span.valueOf(data.getLogspan().getStart(), first.getStartTime()); spans.add(0, emptyBefore); Span emptyAfter = Span.valueOf(last.getStartTime() + last.getDurationTime(), data.getLogspan().getEnd()); spans.add(emptyAfter); } return new FixedMidPointRuler( dataScreenArea.x, dataScreenArea.width, data.getTransform(), data.getMarker(), spans); } else { long firstDuration = data.getLogspan().getStart(); long lastDuration = 0; if (data.getMarker() <= 0) { lastDuration = (long) (firstDuration + ((TIME_RANGE / data.getZoomLevel()) / 2)); } else { firstDuration = (long) (data.getMarker() - ((TIME_RANGE / data.getZoomLevel()) / 2)); if (firstDuration < 0) { firstDuration = data.getLogspan().getStart(); } lastDuration = (long) (data.getMarker() + ((TIME_RANGE / data.getZoomLevel()) / 2)); } return new SimpleLinearScaleRuler( data.getMarker(), Span.valueOf(firstDuration, lastDuration), Span.valueOf(dataScreenArea.x, dataScreenArea.width)); } }