/*******************************************************************************
 * Copyright (c) 2004, 2005 IBM Corporation and others.
 * 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.debug.internal.ui.views.memory.renderings;

import java.math.BigInteger;

import org.eclipse.debug.core.model.MemoryByte;
import org.eclipse.debug.internal.ui.DebugPluginImages;
import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
import org.eclipse.debug.ui.memory.AbstractTableRendering;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.graphics.Image;

/**
 * Abstract label provider for an ITableMemoryViewTab
 * 
 * @since 3.0
 */
abstract public class AbstractTableRenderingLabelProvider extends LabelProvider implements ITableLabelProvider{

	protected AbstractTableRendering fRendering;
	
	/**
	 * 
	 * Constructor for MemoryViewLabelProvider
	 */
	public AbstractTableRenderingLabelProvider() {
		super();
	}
	
	public AbstractTableRenderingLabelProvider(AbstractTableRendering rendering){
		fRendering = rendering;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
	 */
	public void dispose() {
		fRendering = null;
		super.dispose();
	}

	/**
	 * @see ITableLabelProvider#getColumnImage(Object, int)
	 */
	public Image getColumnImage(Object element, int columnIndex) {
		
		if (columnIndex == 0)
		{
			return DebugPluginImages.getImage(IInternalDebugUIConstants.IMG_OBJECT_MEMORY);	
		}
		else if (columnIndex > (fRendering.getBytesPerLine()/fRendering.getBytesPerColumn()))
		{
			return DebugPluginImages.getImage(IInternalDebugUIConstants.IMG_OBJECT_MEMORY);	
		}
		else
		{	
			// if memory in the range has changed, return delta icon
			int startOffset = (columnIndex-1)*fRendering.getBytesPerColumn();
			int endOffset = startOffset + fRendering.getBytesPerColumn() - 1;
			if (((TableRenderingLine)element).isRangeChange(startOffset, endOffset)) {
				return DebugPluginImages.getImage(IInternalDebugUIConstants.IMG_OBJECT_MEMORY_CHANGED);
			}
			return DebugPluginImages.getImage(IInternalDebugUIConstants.IMG_OBJECT_MEMORY);	
		}
	}
	
	
	/* (non-Javadoc)
	 * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int)
	 */
	public String getColumnText(Object element, int columnIndex) {
		String columnLabel = null;

		if (columnIndex == 0)
		{
			columnLabel = ((TableRenderingLine)element).getAddress();
			
			// consult model presentation for address presentation
		}
		else if (columnIndex > (fRendering.getBytesPerLine()/fRendering.getBytesPerColumn()))
		{
			columnLabel = " "; //$NON-NLS-1$
		}
		else
		{	
			int start = (columnIndex-1)*fRendering.getBytesPerColumn();
			int end = start + fRendering.getBytesPerColumn();

			MemoryByte[] bytes = ((TableRenderingLine)element).getBytes(start, end);
			BigInteger address = new BigInteger(((TableRenderingLine)element).getAddress(), 16);
			address = address.add(BigInteger.valueOf(start)); 
			
			columnLabel = fRendering.getString(fRendering.getRenderingId(), address, bytes);
		}
		return columnLabel;
	}
}
