/* GanttProject is an opensource project management tool. License: GPL3 Copyright (C) 2012 GanttProject Team This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package net.sourceforge.ganttproject.chart; import biz.ganttproject.core.chart.canvas.Canvas; import biz.ganttproject.core.chart.canvas.Canvas.HAlignment; import biz.ganttproject.core.chart.canvas.Canvas.Label; import biz.ganttproject.core.chart.canvas.Canvas.Text; import biz.ganttproject.core.chart.canvas.Canvas.VAlignment; import biz.ganttproject.core.chart.canvas.TextMetrics; import biz.ganttproject.core.chart.canvas.TextSelector; import biz.ganttproject.core.chart.grid.Offset; import biz.ganttproject.core.chart.grid.OffsetLookup; import net.sourceforge.ganttproject.task.Task; import net.sourceforge.ganttproject.task.TaskActivity; import java.util.Collection; import java.util.Date; import java.util.List; /** * Renders labels on the timeline. * * @author dbarashev (Dmitry Barashev) */ public class TimelineLabelRendererImpl extends ChartRendererBase { private static final int MAX_TIMELINE_LABEL_WIDTH = 200; private OffsetLookup myOffsetLookup; private Canvas myLabelsLayer; private ChartModelApi myChartModel; /** * This class dependencies interface */ protected interface ChartModelApi { int getTimelineTopLineHeight(); List<Offset> getDefaultUnitOffsets(); Date getStartDate(); Collection<Task> getTimelineTasks(); } TimelineLabelRendererImpl(ChartModelApi chartModel) { super(null); myChartModel = chartModel; myOffsetLookup = new OffsetLookup(); getPrimitiveContainer().createLayers(5); myLabelsLayer = getPrimitiveContainer().getLayer(4); } @Override public void render() { List<Offset> offsets = myChartModel.getDefaultUnitOffsets(); TaskActivity leadActivity = null; for (Task t : myChartModel.getTimelineTasks()) { for (TaskActivity activity : t.getActivities()) { if (activity.getIntensity() > 0f) { leadActivity = activity; break; } } if (leadActivity == null || leadActivity.getEnd().before(myChartModel.getStartDate())) { continue; } int[] bounds = myOffsetLookup.getBounds(leadActivity.getStart(), leadActivity.getEnd(), offsets); Canvas.Text timelineLabel = createTimelineLabel(bounds[0], t); timelineLabel.setAlignment(HAlignment.LEFT, VAlignment.BOTTOM); timelineLabel.setForegroundColor(t.getColor()); } } private Text createTimelineLabel(int leftX, final Task task) { final Text text = myLabelsLayer.createText(leftX, myChartModel.getTimelineTopLineHeight(), ""); text.setSelector(new TextSelector() { @Override public Label[] getLabels(TextMetrics textLengthCalculator) { int height = textLengthCalculator.getTextHeight(task.getName()); int fullLength = textLengthCalculator.getTextLength(task.getName()); Label result; if (fullLength <= MAX_TIMELINE_LABEL_WIDTH) { result = text.createLabel(task.getName(), fullLength, height); } else { int idLength = textLengthCalculator.getTextLength(String.valueOf(task.getTaskID())); result = text.createLabel("#" + String.valueOf(task.getTaskID()), idLength, height); } return new Label[] {result}; } }); text.setStyle("text.timeline.label"); myLabelsLayer.bind(text, task); return text; } Canvas getLabelLayer() { return myLabelsLayer; } }