/*******************************************************************************
 * Copyright (c) 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.jst.ws.internal.consumption.ui.widgets.object;

import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.IContentProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
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.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;
import org.eclipse.wst.command.internal.env.ui.widgets.SimpleWidgetDataContributor;
import org.eclipse.wst.command.internal.env.ui.widgets.WidgetDataEvents;
import org.eclipse.wst.command.internal.provisional.env.core.common.MessageUtils;
import org.eclipse.wst.command.internal.provisional.env.core.common.StatusUtils;
import org.eclipse.wst.wsdl.validation.internal.IValidationMessage;


public class ValidationMessageViewerWidget extends SimpleWidgetDataContributor
{
  private int DEFAULT_TABLE_HEIGHT_HINT = 100;
  private TableViewer tableViewer_;
  private Table table_;
  private String message = null;
  static final String columns_[] = {"severity", "line", "column", "message"};
  static final int columnsWidth_[] = {10, 10, 10, 60};

  

  public ValidationMessageViewerWidget()
  {
  }

  public WidgetDataEvents addControls( Composite parent, Listener statusListener )
  { 
    String       pluginId = "org.eclipse.jst.ws.consumption.ui";
    MessageUtils msgUtils = new MessageUtils( pluginId + ".plugin", this );
    
	Composite  composite = new Composite(parent, SWT.NONE);
	GridLayout gl        = new GridLayout();
	
	gl.marginHeight = 0;
	gl.marginWidth = 0;
	composite.setLayout(gl);
	composite.setLayoutData(new GridData(GridData.FILL_BOTH));
	
    Label messageLabel = new Label( composite, SWT.WRAP);
    messageLabel.setText( msgUtils.getMessage("LABEL_VALIDATE_MESSAGES"));
    GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
    messageLabel.setLayoutData(gd);
    messageLabel.setToolTipText( msgUtils.getMessage("TOOLTIP_VALIDATE_TEXT_MESSAGE") );

	table_ = new Table(composite, SWT.SINGLE | SWT.FULL_SELECTION | SWT.BORDER);
	gd = new GridData(GridData.FILL_BOTH);
	gd.heightHint = DEFAULT_TABLE_HEIGHT_HINT;
	table_.setLayoutData(gd);
	table_.setHeaderVisible(true);
	table_.setLinesVisible(true);
	table_.setToolTipText(msgUtils.getMessage("TOOLTIP_TABLE_VALIDATE_MESSAGE") );
	TableLayout tableLayout = new TableLayout();
	for (int i = 0; i < columns_.length; i++)
	{
	  TableColumn tableColumn = new TableColumn(table_, SWT.NONE);
	  tableColumn.setText(columns_[i]);
	  tableColumn.pack();
	  ColumnWeightData columnData = new ColumnWeightData(columnsWidth_[i], columnsWidth_[i], true);
	  tableLayout.addColumnData(columnData);
	}
	table_.setLayout(tableLayout);

	tableViewer_ = new TableViewer(table_);

	tableViewer_.setContentProvider(new ListContentProvider());
	tableViewer_.setLabelProvider(new ListLabelProvider());

	Composite buttonComposite = new Composite(composite, SWT.NONE);
	gl = new GridLayout();
	gl.numColumns = 3;
	gl.makeColumnsEqualWidth = true;
	buttonComposite.setLayout(gl);
	buttonComposite.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_BEGINNING));

	
	return this;
  }

  public void setInput(IValidationMessage[] messages)
  {
  	tableViewer_.setInput(messages);
  	tableViewer_.refresh();
  }
  
  public void clearInput()
  {
	  IValidationMessage emptyMessages[] = {};
	  this.setInput(emptyMessages);
  }
  
  public IContentProvider getContentProvider()
  {
	  return tableViewer_.getContentProvider();
  }

  public IStatus getStatus()
  {
    return message == null ? Status.OK_STATUS : 
                             StatusUtils.errorStatus(message );
  }

  public void refresh()
  {
	tableViewer_.refresh();
  }

  public TableItem[] getItems()
  {
	//internalRefresh();
	return table_.getItems();
  }

  public void setEnabled(boolean enabled)
  {
  }

  public void dispose()
  {	
	if (table_ != null)
	  table_.dispose();
  }

  protected class ListContentProvider implements IStructuredContentProvider
  {
	public void dispose()
	{
	}

	public void inputChanged(Viewer viewer, Object oldInput, Object newInput)
	{
	  tableViewer_.add(getElements(newInput));
	}

	public Object[] getElements(Object inputElement)
	{
		if (inputElement instanceof IValidationMessage[])
	  {
			IValidationMessage[] valMessages = (IValidationMessage[]) inputElement;
		  return valMessages;
	  }
	  else
		return new Object[0];
	}
  }

  protected class ListLabelProvider implements ITableLabelProvider
  {
	public Image getColumnImage(Object element, int columnIndex)
	{
		if (element instanceof IValidationMessage)
		{
			IValidationMessage msg = (IValidationMessage) element;
			
			if (columnIndex == 0)
			{	
				int severity = msg.getSeverity();
				if (severity == 0) {
					return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJS_ERROR_TSK);
				} else if (severity == 1) {
					return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJS_WARN_TSK);
				} else if (severity == 2) {
					return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJS_INFO_TSK);
				}
			}
		}	
	  return null;
	}

	public String getColumnText(Object element, int columnIndex)
	{
		String text = "";
		if (element instanceof IValidationMessage)
		{
			IValidationMessage msg = (IValidationMessage) element;
			
			switch (columnIndex) {
			case 0:		
				// no text to display, only display severity as image
				break;
			case 1:
				text = (new Integer(msg.getLine())).toString();
				break;
			case 2:
				text = (new Integer(msg.getColumn())).toString();
				break;
			case 3:
				text = msg.getMessage();
				break;		
				
			default:
				break;
			} 
		}
		return text;
	}

	public void addListener(ILabelProviderListener listener)
	{
	}

	public void removeListener(ILabelProviderListener listener)
	{
	}

	public boolean isLabelProperty(Object element, String property)
	{
	  return true;
	}

	public void dispose()
	{
	}
  }
 }
