/*******************************************************************************
* Copyright (c) 2008 Red Hat, Inc.
* 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:
* Kent Sebastian <ksebasti@redhat.com> - initial API and implementation
*******************************************************************************/
package org.eclipse.linuxtools.oprofile.ui.model;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import org.eclipse.linuxtools.internal.oprofile.core.model.OpModelSample;
import org.eclipse.linuxtools.internal.oprofile.core.model.OpModelSymbol;
import org.eclipse.linuxtools.internal.oprofile.ui.OprofileUiMessages;
import org.eclipse.linuxtools.internal.oprofile.ui.OprofileUiPlugin;
import org.eclipse.swt.graphics.Image;
/**
* Children of images in the view -- a function name in the profiled image's
* source code. May or may not have child samples.
*
* @since 1.1
*/
public class UiModelSymbol implements IUiModelElement {
private IUiModelElement parent; // parent element
private OpModelSymbol symbol; // the node in the data model
private UiModelSample samples[]; // this node's children
private int totalCount; // total count of samples for the parent session
/**
* Constructor to the UiModelSymbol class
*
* @param parent
* The parent element
* @param symbol
* The debugging symbol node object in the data model
* @param totalCount
* The total count of samples for the parent session
*/
public UiModelSymbol(IUiModelElement parent, OpModelSymbol symbol,
int totalCount) {
this.parent = parent;
this.symbol = symbol;
this.samples = null;
this.totalCount = totalCount;
refreshModel();
}
/**
* Creates the ui samples from the data model
*/
private void refreshModel() {
ArrayList<UiModelSample> sampleList = new ArrayList<>();
OpModelSample dataModelSamples[] = symbol.getSamples();
for (int i = 0; i < dataModelSamples.length; i++) {
// dont display samples with line number of 0, meaning no line
// number
// was correlated, more likely that no source file exists
if (dataModelSamples[i].getLine() != 0) {
sampleList.add(new UiModelSample(this, dataModelSamples[i],
totalCount));
}
}
samples = new UiModelSample[sampleList.size()];
sampleList.toArray(samples);
}
@Override
public String toString() {
double countPercentage = (double) symbol.getCount()
/ (double) totalCount;
String percentage = OprofileUiPlugin
.getPercentageString(countPercentage);
// a hack to get `basename` type functionality
String fileName = (new File(symbol.getFilePath())).getName();
return percentage
+ " " + OprofileUiMessages.getString("uimodel.percentage.in") + " " + symbol.getName() + (fileName.length() == 0 ? "" : " [" + fileName + "]"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$
}
/**
* Return the file path for the current debugging symbol
*
* @return the file path
*/
public String getFileName() {
return symbol.getFilePath();
}
/**
* Return the debugging symbol function name
*
* @return the function name
*/
public String getFunctionName() {
return symbol.getName();
}
/**
* Return the debugging symbol line number
*
* @return the line number
*/
public int getLineNumber() {
return symbol.getLine();
}
/**
* IUiModelElement functions Returns the text to display in the tree viewer
* as required by the label provider.
*
* @return text describing this element
*/
@Override
public String getLabelText() {
return toString();
}
/**
* Returns the children of this element.
*
* @return An array of child elements or null
*/
@Override
public IUiModelElement[] getChildren() {
if (UiModelRoot.SortType.LINE_NO == UiModelRoot.getSortingType()) {
Arrays.sort(samples, UiModelSorting.getInstance());
return samples;
}
return samples;
}
/**
* Returns if the element has any children.
*
* @return true if the element has children, false otherwise
*/
@Override
public boolean hasChildren() {
return (samples == null || samples.length == 0 ? false : true);
}
/**
* Returns the element's parent.
*
* @return parent The parent element
*/
@Override
public IUiModelElement getParent() {
return parent;
}
/**
* Returns the Image to display next to the text in the tree viewer.
*
* @return an Image object of the icon
*/
@Override
public Image getLabelImage() {
return OprofileUiPlugin
.getImageDescriptor(OprofileUiPlugin.SYMBOL_ICON).createImage();
}
}