trace/tracebuilder/com.nokia.tracebuilder.view/src/com/nokia/tracebuilder/view/TraceLabelProvider.java
author Jussi Ryoma <ext-jussi.s.ryoma@nokia.com>
Tue, 24 Aug 2010 14:01:48 +0300
changeset 16 72f198be1c1d
parent 10 ed1c9f64298a
permissions -rw-r--r--
Crash Analyser Carbide Extension 1.4.0

/*
* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:
*
* Converts tree model objects to strings to be displayed in the view
*
*/
package com.nokia.tracebuilder.view;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;

import com.nokia.carbide.cdt.builder.CarbideBuilderPlugin;
import com.nokia.tracebuilder.engine.LastKnownLocation;
import com.nokia.tracebuilder.engine.TraceBuilderConfiguration;
import com.nokia.tracebuilder.engine.TraceBuilderGlobals;
import com.nokia.tracebuilder.engine.TraceLocation;
import com.nokia.tracebuilder.engine.TraceLocationList;
import com.nokia.tracebuilder.engine.TraceViewNameExtension;
import com.nokia.tracebuilder.file.FileUtils;
import com.nokia.tracebuilder.model.TraceConstantTableEntry;
import com.nokia.tracebuilder.model.TraceObject;
import com.nokia.tracebuilder.model.TraceParameter;

/**
 * Converts tree model objects to strings to be displayed in the view
 * 
 */
final class TraceLabelProvider extends LabelProvider {

	/**
	 * Separator to component name and component id fields
	 */
	final String COMPONENT_SEPARATOR = ", "; //$NON-NLS-1$	

	/**
	 * Default tree node image
	 */
	private Image defaultImage;

	/**
	 * Image for trace
	 */
	private Image traceImage;

	/**
	 * Image for trace group
	 */
	private Image groupImage;

	/**
	 * Image for parameter
	 */
	private Image parameterImage;

	/**
	 * Image for property
	 */
	private Image propertyImage;

	/**
	 * Unrelated location icon
	 */
	private Image unrelatedLocationImage;

	/**
	 * Unrelated locations list icon
	 */
	private Image unrelatedLocationsImage;

	/**
	 * List navigator image
	 */
	private Image navigatorImage;

	/**
	 * Constructor
	 */
	public TraceLabelProvider() {
		defaultImage = TraceViewPlugin.getImageDescriptor(
				"icons/view/default.gif").createImage(); //$NON-NLS-1$
		traceImage = TraceViewPlugin
				.getImageDescriptor("icons/view/trace.gif").createImage(); //$NON-NLS-1$
		groupImage = TraceViewPlugin
				.getImageDescriptor("icons/view/group.gif").createImage(); //$NON-NLS-1$
		parameterImage = TraceViewPlugin.getImageDescriptor(
				"icons/view/parameter.gif").createImage(); //$NON-NLS-1$
		propertyImage = TraceViewPlugin.getImageDescriptor(
				"icons/view/property.gif").createImage(); //$NON-NLS-1$
		unrelatedLocationImage = TraceViewPlugin.getImageDescriptor(
				"icons/view/unrelated_location.gif").createImage(); //$NON-NLS-1$
		unrelatedLocationsImage = TraceViewPlugin.getImageDescriptor(
				"icons/view/unrelated_locations_list.gif").createImage(); //$NON-NLS-1$
		navigatorImage = TraceViewPlugin.getImageDescriptor(
				"icons/view/navigator.gif").createImage(); //$NON-NLS-1$
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
	 */
	@Override
	public void dispose() {
		defaultImage.dispose();
		traceImage.dispose();
		groupImage.dispose();
		parameterImage.dispose();
		propertyImage.dispose();
		unrelatedLocationImage.dispose();
		unrelatedLocationsImage.dispose();
		navigatorImage.dispose();
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
	 */
	@Override
	public String getText(Object obj) {
		String text;
		if (obj instanceof TraceLocationWrapper) {
			text = traceLocationWrapperToString((TraceLocationWrapper) obj);
		} else if (obj instanceof PropertyWrapper) {
			text = propertyWrapperToString((PropertyWrapper) obj);
		} else if (obj instanceof TraceObjectWrapper) {
			text = traceObjectWrapperToString((TraceObjectWrapper) obj);
		} else if (obj instanceof LastKnownLocationWrapper) {
			text = LastKnownLocationWrapperToString((LastKnownLocationWrapper) obj);
		} else if (obj instanceof TraceLocationListWrapper) {
			text = locationListWrapperToString((TraceLocationListWrapper) obj);
		} else if (obj instanceof LastKnownLocationListWrapper) {
			text = LastKnownLocationListWrapperToString((LastKnownLocationListWrapper) obj);
		} else if (obj instanceof ObjectWrapper) {
			text = ((ObjectWrapper) obj).getObject().toString();
		} else if (obj instanceof ListNavigator) {
			text = listNavigatorToString((ListNavigator) obj);
		} else if (obj instanceof TraceViewExtensionWrapper) {
			text = ((TraceViewExtensionWrapper) obj).getExtension().toString();
		} else if (obj instanceof TraceParameterListWrapper) {
			text = Messages.getString("TraceLabelProvider.Parameters"); //$NON-NLS-1$
		} else if (obj instanceof TraceGroupListWrapper) {
			text = Messages.getString("TraceLabelProvider.TraceGroups"); //$NON-NLS-1$
		} else if (obj instanceof TraceListWrapper) {
			text = Messages.getString("TraceLabelProvider.Traces"); //$NON-NLS-1$
		} else if (obj instanceof ConstantTableListWrapper) {
			text = Messages.getString("TraceLabelProvider.ConstantTables"); //$NON-NLS-1$
		} else if (obj instanceof TraceLocationListsWrapper) {
			text = Messages.getString("TraceLabelProvider.LocationListsTitle"); //$NON-NLS-1$
		} else {
			text = obj.toString();
		}
		return text;
	}

	/**
	 * Converts the list navigator to string
	 * 
	 * @param navigator
	 *            the list navigator
	 * @return the string representation
	 */
	private String listNavigatorToString(ListNavigator navigator) {
		StringBuffer text = new StringBuffer();
		String start;
		String end;
		WrapperBase parent = navigator.getParent();
		if (parent instanceof TraceListWrapper) {
			start = Messages
					.getString("TraceLabelProvider.NavigatorTitleStartTraces"); //$NON-NLS-1$
			end = Messages
					.getString("TraceLabelProvider.NavigatorTitleEndTraces"); //$NON-NLS-1$
		} else if (parent instanceof TraceGroupListWrapper) {
			start = Messages
					.getString("TraceLabelProvider.NavigatorTitleStartGroups"); //$NON-NLS-1$
			end = Messages
					.getString("TraceLabelProvider.NavigatorTitleEndGroups"); //$NON-NLS-1$
		} else if (parent instanceof TraceLocationListWrapper) {
			start = Messages
					.getString("TraceLabelProvider.NavigatorTitleStartLocations"); //$NON-NLS-1$
			end = Messages
					.getString("TraceLabelProvider.NavigatorTitleEndLocations"); //$NON-NLS-1$
		} else {
			start = null;
			end = null;
			text.append(Messages
					.getString("TraceLabelProvider.NavigatorTitleInvalid")); //$NON-NLS-1$
		}
		if (start != null) {
			String separator = Messages
					.getString("TraceLabelProvider.NavigatorTitleValueSeparator"); //$NON-NLS-1$
			text.append(start);
			text.append(navigator.getStartIndex());
			text.append(separator);
			int max = navigator.getStartIndex() + navigator.getVisibleCount();
			text.append(max);
			separator = Messages
					.getString("TraceLabelProvider.NavigatorTitleTotalCountSeparator"); //$NON-NLS-1$
			text.append(separator);
			text.append(navigator.getTotalCount());
			text.append(end);
		}
		return text.toString();
	}

	/**
	 * Converts a property wrapper to string
	 * 
	 * @param wrapper
	 *            the property wrapper
	 * @return the string representation
	 */
	private String propertyWrapperToString(PropertyWrapper wrapper) {
		String text = null;
		// Get component id's from mmp files
		if (wrapper.getType().equals(
				Messages.getString("TraceObjectWrapper.ModelID"))) { //$NON-NLS-1$
			text = getComponentIdString(wrapper.getType());
			// Get component names from mmp files
		} else if (wrapper.getType().equals(
				Messages.getString("TraceObjectWrapper.ModelName"))) { //$NON-NLS-1$
			text = getComponentNameString(wrapper.getType());
		} else {
			text = wrapper.getType()
					+ Messages
							.getString("TraceLabelProvider.PropertySeparator") //$NON-NLS-1$
					+ wrapper.getProperty();
		}

		return text;
	}

	/**
	 * Get component name string
	 * 
	 * @param prefix
	 *            prefix text
	 * @return the component name string
	 */
	private String getComponentNameString(String prefix) {
		IFile file = getActiveFile();
		String propertySeparator = Messages
				.getString("TraceLabelProvider.PropertySeparator"); //$NON-NLS-1$
		
		// Set default text in case that component name is not available
		String text = prefix + propertySeparator
		+ Messages.getString("PropertyWrapper.NoProperty"); //$NON-NLS-1$;
		if (file != null) {
			IProject project = file.getProject();

			// Check that project is Carbide project
			boolean isCarbideProject = CarbideBuilderPlugin.getBuildManager()
					.isCarbideProject(project);
			if (isCarbideProject) {

				// Check if file is not source file
				if (isSourceFile(file)) {
					String componentNameString = TraceBuilderGlobals
							.getCurrentSoftwareComponentName();
					if (componentNameString != null) {
						text = prefix + propertySeparator + componentNameString;
					}
				}

				// Even file is source file it could be that we do know
				// component name, because it could be that file is not included
				// to MMP file
				if (text == null) {
					text = prefix
							+ propertySeparator
							+ Messages
									.getString("PropertyWrapper.NotAvailable"); //$NON-NLS-1$;
				}
			}
		}
		return text;
	}

	/**
	 * Get active file in editor
	 * 
	 * @return the active file in editor
	 */
	private IFile getActiveFile() {

		IFile file = null;

		IWorkbenchWindow window = PlatformUI.getWorkbench()
				.getActiveWorkbenchWindow();
		if (window != null) {
			IWorkbenchPage page = window.getActivePage();
			if (page != null) {
				IEditorPart editor = page.getActiveEditor();
				if (editor != null) {
					IEditorInput input = editor.getEditorInput();
					if (input instanceof IFileEditorInput) {
						file = ((IFileEditorInput) input).getFile();
					}
				}
			}
		}

		return file;
	}

	/**
	 * Get component id string
	 * 
	 * @param prefix
	 *            prefix text
	 * @return the component id string
	 */
	private String getComponentIdString(String prefix) {
		IFile file = getActiveFile();
		String propertySeparator = Messages
				.getString("TraceLabelProvider.PropertySeparator"); //$NON-NLS-1$

		// Set default text in case that component ID is not available
		String text = prefix + propertySeparator
		+ Messages.getString("PropertyWrapper.NoProperty"); //$NON-NLS-1$;;		
		
		if (file != null) {
			IProject project = file.getProject();

			// Check that project is Carbide project
			boolean isCarbideProject = CarbideBuilderPlugin.getBuildManager()
					.isCarbideProject(project);
			if (isCarbideProject) {

				// Check if file is not source file
				if (isSourceFile(file)) {
					String uidString = TraceBuilderGlobals
							.getCurrentSoftwareComponentId();
					if (uidString != null) {
						text = prefix + propertySeparator + uidString;
					}
				}

				// Even file is source file it could be that we do know
				// component id, because it could be that file is not included
				// to MMP file
				if (text == null) {
					text = prefix
							+ propertySeparator
							+ Messages
									.getString("PropertyWrapper.NotAvailable"); //$NON-NLS-1$;
				}
			}
		}
		
		return text; // CodForChk_Dis_Exits
	}

	/**
	 * Converts a trace object wrapper to string
	 * 
	 * @param obj
	 *            the object wrapper
	 * @return the string representation
	 */
	private String traceObjectWrapperToString(TraceObjectWrapper obj) {
		String text;
		if (obj instanceof ConstantTableWrapper) {
			text = constantTableWrapperToString((ConstantTableWrapper) obj);
		} else if (obj instanceof ConstantTableEntryWrapper) {
			text = constantTableEntryWrapperToString((ConstantTableEntryWrapper) obj);
		} else if (obj instanceof TraceParameterWrapper) {
			text = traceParameterWrapperToString((TraceParameterWrapper) obj);
		} else {
			text = commonTraceObjectWrapperToString(obj);
		}
		return text;
	}

	/**
	 * Converts a parameter wrapper to a string
	 * 
	 * @param wrapper
	 *            the parameter wrapper
	 * @return the string representation
	 */
	private String traceParameterWrapperToString(TraceParameterWrapper wrapper) {
		String text = commonTraceObjectWrapperToString(wrapper);
		text += Messages.getString("TraceLabelProvider.ParameterTypeSeparator") //$NON-NLS-1$
				+ TraceViewMessages
						.parameterTypeToString((TraceParameter) wrapper
								.getTraceObject());
		if (wrapper.isArrayType()) {
			text += Messages.getString("TraceParameterWrapper.ArrayTag"); //$NON-NLS-1$
		}
		return text;
	}

	/**
	 * Converts a trace object wrapper to string
	 * 
	 * @param wrapper
	 *            the trace object wrapper
	 * @return the string representation
	 */
	private String commonTraceObjectWrapperToString(TraceObjectWrapper wrapper) {
		String text = null;
		TraceObject object = wrapper.getTraceObject();
		// If object is null, it has been deleted but view is not refreshed yet
		if (object != null) {
			String name = object.getName();
			if (name.length() > 0) {
				TraceViewNameExtension nameExt = wrapper.getTraceObject()
						.getExtension(TraceViewNameExtension.class);
				if (nameExt != null) {
					text = nameExtensionToString(name, nameExt);
				} else {
					text = name;
				}
			}
		}
		if (text == null) {
			text = Messages.getString("TraceLabelProvider.Unnamed"); //$NON-NLS-1$
		}
		return text;
	}

	/**
	 * Merges a name and name extension together
	 * 
	 * @param name
	 *            the object name
	 * @param nameExt
	 *            the name extension
	 * @return the merged name
	 */
	private String nameExtensionToString(String name,
			TraceViewNameExtension nameExt) {
		StringBuffer text = new StringBuffer();
		text.append(name);
		text.append(Messages
				.getString("TraceLabelProvider.NameExtensionPrefix")); //$NON-NLS-1$
		text.append(nameExt.getNameExtension());
		text.append(Messages
				.getString("TraceLabelProvider.NameExtensionPostfix")); //$NON-NLS-1$
		return text.toString();
	}

	/**
	 * Converts a constant table entry wrapper to string
	 * 
	 * @param wrapper
	 *            the constant table entry wrapper
	 * @return the string representation
	 */
	private String constantTableEntryWrapperToString(
			ConstantTableEntryWrapper wrapper) {
		String text;
		// Constant table entry wrappers extend TraceObjectWrapper, but
		// representation is different
		TraceConstantTableEntry entry = (TraceConstantTableEntry) wrapper
				.getTraceObject();
		if (entry != null) {
			StringBuffer sb = new StringBuffer();
			sb.append(entry.getID());
			sb.append(Messages
					.getString("TraceLabelProvider.ConstantValueSeparator")); //$NON-NLS-1$
			sb.append(entry.getName());
			text = sb.toString();
		} else {
			text = Messages.getString("TraceLabelProvider.Unnamed"); //$NON-NLS-1$
		}
		return text;
	}

	/**
	 * Converts a constant table wrapper to string
	 * 
	 * @param wrapper
	 *            the constant table wrapper
	 * @return the string representation
	 */
	private String constantTableWrapperToString(ConstantTableWrapper wrapper) {
		String text = null;
		TraceObject object = wrapper.getTraceObject();
		if (object != null) {
			String name = object.getName();
			if (name != null && name.length() > 0) {
				text = createConstantTableName(wrapper, name);
			}
		}
		if (text == null) {
			text = Messages.getString("TraceLabelProvider.Unnamed"); //$NON-NLS-1$
		}
		return text;
	}

	/**
	 * Creates a constant table name
	 * 
	 * @param wrapper
	 *            the constant table
	 * @param name
	 *            the original table name
	 * @return the name shown in view
	 */
	private String createConstantTableName(ConstantTableWrapper wrapper,
			String name) {
		String text;
		StringBuffer sb = new StringBuffer();
		// Constant tables in the model's list of tables do not need
		// the "Type: " tag
		if (!(wrapper.getParent() instanceof ConstantTableListWrapper)) {
			sb.append(Messages
					.getString("TraceLabelProvider.ConstantTableNameTypeTag")); //$NON-NLS-1$
		}
		sb.append(Messages
				.getString("TraceLabelProvider.ConstantTableNamePrefix")); //$NON-NLS-1$
		sb.append(name);
		sb.append(Messages
				.getString("TraceLabelProvider.ConstantTableNamePostfix")); //$NON-NLS-1$
		text = sb.toString();
		return text;
	}

	/**
	 * Converts a location list wrapper to string
	 * 
	 * @param wrapper
	 *            the location list wrapper
	 * @return the string representation
	 */
	private String locationListWrapperToString(TraceLocationListWrapper wrapper) {
		String text;
		WrapperBase parent = wrapper.getParent();
		if (parent instanceof TraceWrapper) {
			text = Messages.getString("TraceLabelProvider.Locations"); //$NON-NLS-1$
		} else {
			text = wrapper.getLocationList().getListTitle();
			if (text == null) {
				text = Messages
						.getString("TraceLabelProvider.UnrelatedLocations"); //$NON-NLS-1$
			}
		}
		return text;
	}

	/**
	 * Converts a last known location list wrapper to string
	 * 
	 * @param wrapper
	 *            the location list wrapper
	 * @return the string representation
	 */
	private String LastKnownLocationListWrapperToString(
			LastKnownLocationListWrapper wrapper) {
		return Messages.getString("TraceLabelProvider.LastKnownLocations"); //$NON-NLS-1$
	}

	/**
	 * Converts a location wrapper to string
	 * 
	 * @param wrapper
	 *            the location wrapper
	 * @return the string representation
	 */
	private String traceLocationWrapperToString(TraceLocationWrapper wrapper) {
		String text = null;
		TraceLocation loc = wrapper.getLocation();
		if (loc != null) {
			StringBuffer sb = new StringBuffer();
			if (loc.getTrace() == null) {
				sb.append(loc.getFileName());
				sb.append(Messages
						.getString("TraceLabelProvider.FileLineSeparator")); //$NON-NLS-1$
				sb.append(loc.getLineNumber());
				sb.append(Messages
						.getString("TraceLabelProvider.LocationNameStart")); //$NON-NLS-1$
				sb.append(loc.getOriginalName());
				sb.append(Messages
						.getString("TraceLabelProvider.LocationNameEnd")); //$NON-NLS-1$
			} else {
				sb.append(loc.getFileName());
				sb.append(Messages
						.getString("TraceLabelProvider.FileLineSeparator")); //$NON-NLS-1$
				sb.append(loc.getLineNumber());
			}
			if (TraceBuilderConfiguration.SHOW_LOCATION_TAG_IN_VIEW) {
				sb.append(" ["); //$NON-NLS-1$
				sb.append(loc.getTag());
				sb.append("]"); //$NON-NLS-1$
			}
			text = sb.toString();
		}
		if (text == null) {
			text = Messages.getString("TraceLabelProvider.Unnamed"); //$NON-NLS-1$
		}
		return text;
	}

	/**
	 * Converts a last known location wrapper to string
	 * 
	 * @param wrapper
	 *            the location wrapper
	 * @return the string representation
	 */
	private String LastKnownLocationWrapperToString(
			LastKnownLocationWrapper wrapper) {
		String text = null;
		LastKnownLocation loc = wrapper.getLocation();
		if (loc != null) {
			StringBuffer sb = new StringBuffer();
			sb.append(loc.getFileName());
			sb.append(Messages
					.getString("TraceLabelProvider.FileLineSeparator")); //$NON-NLS-1$
			sb.append(loc.getLineNumber());
			String start = Messages
					.getString("TraceLabelProvider.LocationNameSeparatorStart"); //$NON-NLS-1$
			sb.append(start);
			sb.append(loc.getFilePath());
			sb.append(Messages
					.getString("TraceLabelProvider.LocationNameSeparatorEnd")); //$NON-NLS-1$
			text = sb.toString();
		}
		if (text == null) {
			text = Messages.getString("TraceLabelProvider.Unnamed"); //$NON-NLS-1$
		}
		return text;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
	 */
	@Override
	public Image getImage(Object element) {
		Image retval = defaultImage;
		if (element instanceof TraceLocationWrapper) {
			TraceLocation loc = ((TraceLocationWrapper) element).getLocation();
			if (loc != null && loc.getTrace() == null) {
				TraceLocationList list = loc.getLocationList();
				if (list != null) {
					String text = list.getListTitle();
					if (text == null) {
						retval = unrelatedLocationImage;
					}
				}
			}
		} else if (element instanceof TraceLocationListWrapper) {
			WrapperBase parent = ((WrapperBase) element).getParent();
			if (!(parent instanceof TraceWrapper)) {
				TraceLocationList list = ((TraceLocationListWrapper) element)
						.getLocationList();
				if (list != null) {
					String text = list.getListTitle();
					if (text == null) {
						retval = unrelatedLocationsImage;
					}
				}
			}
		} else if (element instanceof TraceWrapper) {
			retval = traceImage;
		} else if (element instanceof TraceGroupWrapper) {
			retval = groupImage;
		} else if (element instanceof TraceParameterWrapper) {
			retval = parameterImage;
		} else if (element instanceof PropertyWrapper) {
			retval = propertyImage;
		} else if (element instanceof ListNavigator) {
			retval = navigatorImage;
		}
		return retval;
	}

	/**
	 * Check that is file source file
	 * 
	 * @param file
	 *            file that need to be check
	 * @return true if file is source file, false if not
	 */
	private boolean isSourceFile(IFile file) {
		boolean retVal = false;

		String extension = file.getFileExtension();

		if (extension != null
				&& (extension.equalsIgnoreCase(FileUtils.CPP_EXTENSION) || extension
						.equalsIgnoreCase(FileUtils.C_EXTENSION))) {
			retVal = true;
		}
		return retVal;
	}	
	
}