package org.eclipse.jface.tests.viewers;

/*
 * Licensed Materials - Property of IBM,
 * WebSphere Studio Workbench
 * (c) Copyright IBM Corp 1999, 2000
 */

import org.eclipse.jface.*;
import org.eclipse.jface.resource.*;
import org.eclipse.jface.viewers.*;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;
import java.util.*;
import junit.framework.*;

public class TableViewerTest extends StructuredItemViewerTest {
public static class TableTestLabelProvider
	extends TestLabelProvider
	implements ITableLabelProvider {
	public boolean fExtended = false;

	public String getText(Object element) {
		if (fExtended)
			return providedString((String) element);
		return element.toString();
	}
	public String getColumnText(Object element, int index) {
		if (fExtended)
			return providedString((TestElement) element);
		return element.toString();
	}
	public Image getColumnImage(Object element, int columnIndex) {
		return null;
	}
}
public TableViewerTest(String name) {
	super(name);
}
/**
 * Creates the viewer used by this test, under the given parent widget.
 */
protected StructuredViewer createViewer(Composite parent) {
	TableViewer viewer = new TableViewer(parent);
	viewer.setContentProvider(new TestModelContentProvider());
	viewer.setLabelProvider(new TableTestLabelProvider());
	viewer.getTable().setLinesVisible(true);

	TableLayout layout = new TableLayout();
	viewer.getTable().setLayout(layout);
	viewer.getTable().setHeaderVisible(true);
	String headers[] = { "column 1 header", "column 2 header" };

	ColumnLayoutData layouts[] =
		{ new ColumnWeightData(100), new ColumnWeightData(100)};

	final TableColumn columns[] = new TableColumn[headers.length];

	for (int i = 0; i < headers.length; i++) {
		layout.addColumnData(layouts[i]);
		TableColumn tc = new TableColumn(viewer.getTable(), SWT.NONE, i);
		tc.setResizable(layouts[i].resizable);
		tc.setText(headers[i]);
		columns[i] = tc;
	}

	return viewer;
}
protected int getItemCount() {
	TestElement first = fRootElement.getFirstChild();
	TableItem ti = (TableItem) fViewer.testFindItem(first);
	Table table = ti.getParent();
	return table.getItemCount();
}
protected String getItemText(int at) {
	Table table = (Table) fViewer.getControl();
	return table.getItem(at).getText();
}
public static void main(String args[]) {
	junit.textui.TestRunner.run(TableViewerTest.class);
}
public void testLabelProvider() {

	TableViewer viewer = (TableViewer) fViewer;
	TableTestLabelProvider provider = (TableTestLabelProvider) viewer.getLabelProvider();

	provider.fExtended = true;
	// BUG 1FZ5SDC: JFUIF:WINNT - TableViewerColumn should listen for LabelProvider changes
	fViewer.refresh();
	TestElement first = fRootElement.getFirstChild();
	String newLabel = providedString(first);
	assertEquals("rendered label", newLabel, getItemText(0));
	provider.fExtended = false;
	// BUG 1FZ5SDC: JFUIF:WINNT - TableViewerColumn should listen for LabelProvider changes
}
public void testLabelProviderStateChange() {
	TableViewer tableviewer = (TableViewer) fViewer;
	TableColumn column = tableviewer.getTable().getColumn(0);
	TableTestLabelProvider provider = (TableTestLabelProvider) tableviewer.getLabelProvider();

	provider.fExtended = true;
	provider.setSuffix("added suffix");
	// BUG 1FZ5SDC: JFUIF:WINNT - TableViewerColumn should listen for LabelProvider changes
	tableviewer.refresh();
	TestElement first = fRootElement.getFirstChild();
	String newLabel = providedString(first);
	assertEquals("rendered label", newLabel, getItemText(0));
	provider.fExtended = false;
	// BUG 1FZ5SDC: JFUIF:WINNT - TableViewerColumn should listen for LabelProvider changes
	fViewer.refresh();
}
}
