public void computeHistogram(Project project, List tasks, List resources,Object[] traces) {
boolean stackCurrentOnTop = traces == (Environment.getStandAlone()?HasTimeDistributedData.histogramTypes:HasTimeDistributedData.serverHistogramTypes);
// Availability
GroupedCalculatedValues availabilityCalculatedValues = (GroupedCalculatedValues) computeAvailability(resources);
// Other Projects
GroupedCalculatedValues otherProjectsCalculatedValues = null;
if (!Environment.getStandAlone()) otherProjectsCalculatedValues=(GroupedCalculatedValues) computeOtherProjects(tasks,resources);
//This Project
GroupedCalculatedValues thisProjectCalculatedValues = (GroupedCalculatedValues) computeTrace(project.getTaskOutlineIterator(), resources, WORK, true, false);
//Selected
GroupedCalculatedValues selectedCalculatedValues = (GroupedCalculatedValues) computeTrace(tasks==null?null:tasks.iterator(),resources, WORK, true, false);
// stack so that order is (from botom to top) other projects, this project, selected
for (int i = 0; i < availabilityCalculatedValues.size(); i++) {
double thisProject = thisProjectCalculatedValues != null ? thisProjectCalculatedValues.getUnscaledValue(i) : 0D;
double allProjects = thisProject;
if (otherProjectsCalculatedValues!=null) allProjects+= otherProjectsCalculatedValues.getUnscaledValue(i); // stack
double selected = selectedCalculatedValues != null ? selectedCalculatedValues.getUnscaledValue(i) : 0D;
if (stackCurrentOnTop) {
if (selectedCalculatedValues != null)
selectedCalculatedValues.setValue(i, allProjects);
if (thisProjectCalculatedValues != null)
thisProjectCalculatedValues.setValue(i, allProjects - selected);
} else {
if (otherProjectsCalculatedValues!=null) otherProjectsCalculatedValues.setValue(i,allProjects);
}