/*
 *(c) Copyright QNX Software Systems Ltd. 2002.
 * All Rights Reserved.
 * 
 */

package org.eclipse.cdt.debug.ui.sourcelookup;

import org.eclipse.cdt.debug.core.sourcelookup.IDirectorySourceLocation;
import org.eclipse.cdt.debug.core.sourcelookup.IProjectSourceLocation;
import org.eclipse.cdt.debug.internal.ui.CDebugImages;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.graphics.Image;


public class SourceLookupLabelProvider extends LabelProvider implements ITableLabelProvider
{
	public Image getColumnImage( Object element, int columnIndex )
	{
		if ( columnIndex == 0 )
		{
			if ( element instanceof IProjectSourceLocation )
			{
				if ( ((IProjectSourceLocation)element).getProject().isOpen() )
					return CDebugImages.get( CDebugImages.IMG_OBJS_PROJECT );
				else
					return CDebugImages.get( CDebugImages.IMG_OBJS_CLOSED_PROJECT );
			}
			if ( element instanceof IDirectorySourceLocation )
			{
				return CDebugImages.get( CDebugImages.IMG_OBJS_FOLDER );
			}
		}
		return null;
	}

	public String getColumnText( Object element, int columnIndex )
	{
		if ( columnIndex == 0 )
		{
			if ( element instanceof IProjectSourceLocation )
			{
				return ((IProjectSourceLocation)element).getProject().getName();
			}
			if ( element instanceof IDirectorySourceLocation )
			{
				return ((IDirectorySourceLocation)element).getDirectory().toOSString();
			}
		}
		else if ( columnIndex == 1 )
		{
			if ( element instanceof IDirectorySourceLocation && ((IDirectorySourceLocation)element).getAssociation() != null )
			{
				return ((IDirectorySourceLocation)element).getAssociation().toOSString();
			}
		}
		else if ( columnIndex == 2 )
		{
			if ( element instanceof IDirectorySourceLocation )
				return  ( ((IDirectorySourceLocation)element).searchSubfolders() ) ? SourceListDialogField.YES_VALUE : SourceListDialogField.NO_VALUE;
		}
		return "";
	}
}