/*******************************************************************************
 * Copyright (c) 2001, 2004 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.wst.xml.ui.internal.validation.core.errorinfo;

import java.util.List;

import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.ui.ISharedImages;
import org.eclipse.wst.validation.internal.provisional.core.IMessage;
import org.eclipse.wst.xml.core.internal.validation.core.ValidationMessage;
import org.eclipse.wst.xml.ui.internal.XMLUIPlugin;



public class TaskListTableViewer extends TableViewer
{	
  protected static final int COLUMN_ICON = 0;
  protected static final int COLUMN_DESCRIPTION = 1;
  protected static final int COLUMN_RESOURCE = 3;
  protected static final int COLUMN_LOCATION = 2;

  protected static final String LABEL_ICON = "";
  protected static final String LABEL_DESCRIPTION = "Description";
  protected static final String LABEL_RESOURCE = "Resource";
  protected static final String LABEL_LOCATION = "Location";

  protected int visibleRows = -1;

  protected int getColumnWidth(int column)
  {
    int result = 0;
    switch (column)
    {
      case COLUMN_ICON :
        {
          result = 1;
          break;
        }
      case COLUMN_DESCRIPTION :
        {
          result = 20;
          break;
        }
      case COLUMN_RESOURCE :
        {
          result = 3;
          break;
        }
      case COLUMN_LOCATION :
        {
          result = 3;
          break;
        }
    }
    return result;
  }

  public TaskListTableViewer(Composite parent, int visibleRows)
  {
    this(parent, SWT.FULL_SELECTION | SWT.MULTI | SWT.BORDER, visibleRows);
  }

  public TaskListTableViewer(Composite parent, int style, int visibleRows)
  {
    super(new Table(parent, style));
    getTable().setLinesVisible(true);

    Provider provider = new Provider();
    setContentProvider(provider);
    setLabelProvider(provider);

    String[] columnPropertiesArray = { LABEL_ICON, LABEL_DESCRIPTION, LABEL_LOCATION };
    setColumnProperties(columnPropertiesArray);

    Table table = getTable();
    table.setHeaderVisible(true);
    table.setLayoutData(new GridData(GridData.FILL_BOTH));

    TableLayout layout = new TableLayout();

    for (int i = 0; i < columnPropertiesArray.length; i++)
    {
      TableColumn column = new TableColumn(table, i);
      column.setText(columnPropertiesArray[i]);
      column.setAlignment(SWT.LEFT);
      layout.addColumnData(new ColumnWeightData(getColumnWidth(i), true));
    }

    table.setLayout(layout);
   
    this.visibleRows = visibleRows;
  }

  /**
  	* NamespaceInfoTableLabelProvider
  	*/
  protected class Provider extends LabelProvider implements ITableLabelProvider, IStructuredContentProvider
  {
    Viewer viewer;
    Image errorImage; 
    Image warnImage;
    
    public Provider()
    {
      errorImage = XMLUIPlugin.getInstance().getImage(ISharedImages.IMG_OBJS_ERROR_TSK);
       
      warnImage = XMLUIPlugin.getInstance().getImage(ISharedImages.IMG_OBJS_WARN_TSK);
    }

    public void inputChanged(Viewer viewer, Object oldInput, Object newInput)
    {
      this.viewer = viewer;
    }

    public Object[] getElements(Object inputElement)
    {
      List list = (List) viewer.getInput();
      return list != null ? list.toArray() : null;
    }

    public Image getColumnImage(Object object, int columnIndex)
    {
	  ValidationMessage validationMessage = (ValidationMessage) object;    	
      Image result = null; 
      if (columnIndex == 0)
      {
      	int severity = validationMessage.getSeverity();
      	if (severity == IMessage.HIGH_SEVERITY || 
      	    severity == IMessage.NORMAL_SEVERITY)      	    
      	{
			result = errorImage;
      	} 
      	else
      	{
      	  result = warnImage;
      	}
      }
      return result;
    }

    public String getColumnText(Object object, int column)
    {
      ValidationMessage errorMessage = (ValidationMessage) object;
      String result = "";
      switch (column)
      {
        case COLUMN_DESCRIPTION :
          {
            result = errorMessage.getMessage();
            break;
          }
        case COLUMN_LOCATION :
          {
            result = "line " + errorMessage.getLineNumber();
            break;
          }
      }
      return result;
    }
  }
}
