/*******************************************************************************
* Copyright (c) 2009 STMicroelectronics.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Xavier Raynaud <xavier.raynaud@st.com> - initial API and implementation
*******************************************************************************/
package org.eclipse.linuxtools.internal.gprof.view.fields;
import org.eclipse.linuxtools.dataviewers.abstractviewers.AbstractSTDataViewersField;
import org.eclipse.linuxtools.dataviewers.abstractviewers.AbstractSTTreeViewer;
import org.eclipse.linuxtools.dataviewers.charts.provider.IChartField;
import org.eclipse.linuxtools.internal.gprof.Messages;
import org.eclipse.linuxtools.internal.gprof.parser.GmonDecoder;
import org.eclipse.linuxtools.internal.gprof.parser.HistogramDecoder;
import org.eclipse.linuxtools.internal.gprof.view.GmonView;
import org.eclipse.linuxtools.internal.gprof.view.histogram.HistFile;
import org.eclipse.linuxtools.internal.gprof.view.histogram.HistFunction;
import org.eclipse.linuxtools.internal.gprof.view.histogram.HistLine;
import org.eclipse.linuxtools.internal.gprof.view.histogram.HistRoot;
import org.eclipse.linuxtools.internal.gprof.view.histogram.TreeElement;
import org.eclipse.swt.graphics.Color;
/**
* Column "Samples" of displayed elements
*
* @author Xavier Raynaud <xavier.raynaud@st.com>
*/
public class SampleProfField extends AbstractSTDataViewersField implements IChartField{
private boolean samples = true;
protected final AbstractSTTreeViewer viewer;
protected final static double UNINITIALIZED = 0;
/**
* Constructor
* @param viewer the gmon viewer
*/
public SampleProfField(AbstractSTTreeViewer viewer) {
this.viewer = viewer;
}
@Override
public int compare(Object obj1, Object obj2) {
TreeElement e1 = (TreeElement) obj1;
TreeElement e2 = (TreeElement) obj2;
int s1 = e1.getSamples();
int s2 = e2.getSamples();
return s1 - s2;
}
@Override
public String getColumnHeaderText() {
if (samples) {
return Messages.SampleProfField_SAMPLE_HDR;
}
return Messages.SampleProfField_TIME_HDR;
}
@Override
public String getColumnHeaderTooltip() {
return null;
}
@Override
public String getValue(Object obj) {
TreeElement e = (TreeElement) obj;
int i = e.getSamples();
if (i == -1) {
return ""; //$NON-NLS-1$
}
if (samples) {
return String.valueOf(i);
} else {
double prof_rate = getProfRate();
if (prof_rate == UNINITIALIZED) {
return "?"; //$NON-NLS-1$
}
return getValue(i, prof_rate);
}
}
/**
* Get the time value with the best unit display
* @param i nbr of samples
* @param profRate profiling frequency
* @return time value with the best adapted time unit
*/
public static String getValue(double i, double profRate)
{
long timeInNs = (long) (i/profRate);
long ns = timeInNs%1000;
long timeInUs = timeInNs/1000;
if (timeInUs == 0) {
return ns + "ns"; //$NON-NLS-1$
}
long us = timeInUs%1000;
long timeInMs = timeInUs/1000;
if (timeInMs == 0) {
String ns_s = "" + ns; //$NON-NLS-1$
while (ns_s.length() < 3) {
ns_s = "0" + ns_s; //$NON-NLS-1$
}
return us + "." + ns_s + "us"; //$NON-NLS-1$ //$NON-NLS-2$
}
long ms = timeInMs%1000;
long timeInS = timeInMs/1000;
if (timeInS == 0) {
String us_s = "" + us; //$NON-NLS-1$
while (us_s.length() < 3) {
us_s = "0" + us_s; //$NON-NLS-1$
}
return ms + "." + us_s + "ms"; //$NON-NLS-1$ //$NON-NLS-2$
}
long s = timeInS%60;
long timeInMin = timeInS/60;
if (timeInMin == 0) {
String ms_s = "" + ms; //$NON-NLS-1$
while (ms_s.length() < 3) {
ms_s = "0" + ms_s; //$NON-NLS-1$
}
return s + "." + ms_s + "s"; //$NON-NLS-1$ //$NON-NLS-2$
}
long min = timeInMin%60;
long timeInHour = timeInMin/60;
if (timeInHour == 0) {
return min + "min " + s + "s"; //$NON-NLS-1$ //$NON-NLS-2$
}
return timeInHour + "h " + min + "min"; //$NON-NLS-1$ //$NON-NLS-2$
}
protected double getProfRate() {
double prof_rate = UNINITIALIZED;
Object o = viewer.getViewer().getInput();
if (o instanceof GmonDecoder) {
GmonDecoder decoder = (GmonDecoder) o;
HistogramDecoder histo = decoder.getHistogramDecoder();
prof_rate = histo.getProfRate();
char tUnit = histo.getTimeDimension();
switch (tUnit) {
case 's': prof_rate /= 1000000000; break;
case 'm': prof_rate /= 1000000; break;
case 'u': prof_rate /= 1000; break;
}
}
return prof_rate;
}
@Override
public Color getBackground(Object element) {
return GmonView.getBackground(element);
}
@Override
public String getToolTipText(Object element) {
if (element instanceof HistRoot) {
return Messages.SampleProfField_TOTAL_TIME_SPENT;
} else if (element instanceof HistFunction) {
return Messages.SampleProfField_TIME_SPENT_IN_FUNCTION;
} else if (element instanceof HistFile) {
return Messages.SampleProfField_TIME_SPENT_IN_FILE;
} else if (element instanceof HistLine) {
return Messages.SampleProfField_TIME_SPENT_AT_LOCATION;
}
return null;
}
/**
* Switch from samples to time ans vice-versa
*/
public void toggle() {
this.samples = !this.samples;
}
@Override
public Number getNumber(Object obj) {
TreeElement e = (TreeElement) obj;
int i = e.getSamples();
if (i == -1) {
return 0L;
}
return i;
}
}