/*******************************************************************************
 * Copyright (c) 2005, 2008 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:
 *    Kentarou FUKUDA - initial API and implementation
 *******************************************************************************/
package org.eclipse.actf.visualization.ui.report.table;

import java.io.File;
import java.util.Vector;

import org.eclipse.actf.model.IModelService;
import org.eclipse.actf.model.IWebBrowserACTF;
import org.eclipse.actf.model.events.IModelServiceEventListener;
import org.eclipse.actf.visualization.IVisualizationView;
import org.eclipse.actf.visualization.eval.IEvaluationResult;
import org.eclipse.actf.visualization.eval.guideline.GuidelineData;
import org.eclipse.actf.visualization.eval.guideline.GuidelineHolder;
import org.eclipse.actf.visualization.eval.guideline.GuidelineSelectionChangedEvent;
import org.eclipse.actf.visualization.eval.guideline.IGuidelineSlectionChangedListener;
import org.eclipse.actf.visualization.eval.problem.ProblemConst;
import org.eclipse.actf.visualization.events.IVisualizationEventListener;
import org.eclipse.actf.visualization.events.VisualizationEvent;
import org.eclipse.actf.visualization.ui.report.ReportPlugin;
import org.eclipse.actf.visualization.ui.report.table.popup.ClearSelectionAction;
import org.eclipse.actf.visualization.ui.report.table.popup.GuidelineSubMenu;
import org.eclipse.actf.visualization.ui.report.table.popup.ShowDescriptionAction;
import org.eclipse.actf.visualization.ui.report.table.popup.SrcHighlightAction;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;


public class ResultTableViewer implements IGuidelineSlectionChangedListener,
		IVisualizationEventListener, IModelServiceEventListener {

	private class ColumnSelectionAdapter extends SelectionAdapter {
		private int column;

		public ColumnSelectionAdapter(int column) {
			this.column = column;
		}

		public void widgetSelected(SelectionEvent arg0) {
			tableViewer.setSelection(null);
			if (tableSorter instanceof IResultTableSorter) {
				((IResultTableSorter) tableSorter).setCurColumn(column);
			}
			tableViewer.refresh();
		}
	}

	private GuidelineHolder guidelineHolder = GuidelineHolder
			.getInstance();

	private int mode = IVisualizationView.MODE_DEFAULT;

	private Table table;

	private ViewerSorter tableSorter = new ResultTableSorter();

	private ResultTableFilter tableFilter;

	private TableViewer tableViewer;

	private SrcViewerForPT srcViewerForPT;

	private int curMode = -1;

	private File currentSoruceFile;

	private SrcHighlightAction srcHighlightAction;

	private boolean isShowAllGuidelineItems = false;

	public ResultTableViewer(Composite parent) {

		tableViewer = new TableViewer(parent, SWT.BORDER | SWT.FULL_SELECTION
				| SWT.MULTI);
		table = tableViewer.getTable();
		table.setLinesVisible(true);
		table.setHeaderVisible(true);

		srcViewerForPT = SrcViewerForPT.initSrcViewerForPT(parent.getShell());

		initColumns();

		changeColumnLayout();

		tableViewer.setContentProvider(new ArrayContentProvider());
		tableFilter = new ResultTableFilter();
		tableViewer.addFilter(tableFilter);

		MenuManager popupMenu = new MenuManager();
		popupMenu.add(new ClearSelectionAction(tableViewer));
		popupMenu.add(new GuidelineSubMenu(this));
		popupMenu.add(new ShowDescriptionAction(tableViewer));
		srcHighlightAction = new SrcHighlightAction(this);
		srcHighlightAction.setEnabled(false);
		popupMenu.add(srcHighlightAction);
		table.setMenu(popupMenu.createContextMenu(table));

		guidelineHolder.addGuidelineSelectionChangedListener(this);
	}

	public TableViewer getTableViewer() {
		return tableViewer;
	}

	private void changeColumnLayout() {
		srcViewerForPT.setSrcChanged(true);
		switch (mode) {
		case IVisualizationView.MODE_LOWVISION:
			initLVMode();
			// srcViewerForPT.updateSrcViewer(mode);
			break;
		case IVisualizationView.MODE_DEFAULT:
		default:
			initDefaultMode();
			// srcViewerForPT.updateSrcViewer(mode);
			break;
		}
	}

	public void refresh() {
		// change checker setting
		// TODO
		tableViewer.refresh();
	}

	private void initColumns() {
		int columnSize = 3 + guidelineHolder.getGuidelineData().length
				+ guidelineHolder.getMetricsNames().length;
		int lvColumn = 3 + 6 + guidelineHolder.getGuidelineData().length;

		if (lvColumn > columnSize) {
			columnSize = lvColumn;
		}

		for (int i = 0; i < columnSize; i++) {
			TableColumn column = new TableColumn(table, SWT.LEFT);
			column.addSelectionListener(new ColumnSelectionAdapter(i));
		}

	}

	private void initDefaultMode() {
		// table.clearAll();

		TableColumn[] columns = table.getColumns();
		int curPos = 0;

		for (int i = 0; i < columns.length; i++) {
			columns[i].setImage(null);
			columns[i].setResizable(true);
		}

		columns[curPos].setText(ProblemConst.TITLE_HIGHLIGHT);
		columns[curPos].setWidth(25);
		curPos++;

		String[] tmpSarray = guidelineHolder.getMetricsNames();
		boolean[] enabledMetrics = guidelineHolder.getMatchedMetrics();
		for (int i = 0; i < tmpSarray.length; i++) {
			columns[curPos].setText(tmpSarray[i]);
			switch (i % 5) {
			case 0:
				columns[curPos].setImage(ReportPlugin
						.imageDescriptorFromPlugin(ReportPlugin.PLUGIN_ID,
								"icons/IconRed.gif").createImage());
				break;
			case 1:
				columns[curPos].setImage(ReportPlugin
						.imageDescriptorFromPlugin(ReportPlugin.PLUGIN_ID,
								"icons/IconYellow.gif").createImage());
				break;
			case 2:
				columns[curPos].setImage(ReportPlugin
						.imageDescriptorFromPlugin(ReportPlugin.PLUGIN_ID,
								"icons/IconBlue.gif").createImage());
				break;
			case 3:
				columns[curPos].setImage(ReportPlugin
						.imageDescriptorFromPlugin(ReportPlugin.PLUGIN_ID,
								"icons/IconGreen.gif").createImage());
				break;
			case 4:
				columns[curPos].setImage(ReportPlugin
						.imageDescriptorFromPlugin(ReportPlugin.PLUGIN_ID,
								"icons/IconPink.gif").createImage());
				break;
			default:
			}
			if (enabledMetrics[i]) {
				columns[curPos].setWidth(75);
			} else {
				columns[curPos].setWidth(0);
				columns[curPos].setResizable(false);
			}
			curPos++;
		}

		GuidelineData[] dataArray = guidelineHolder.getGuidelineData();
		for (int i = 0; i < dataArray.length; i++) {
			columns[curPos].setText(dataArray[i].getGuidelineName());
			if (dataArray[i].isMatched()) {
				columns[curPos].setWidth(65);
			} else {
				columns[curPos].setWidth(0);
				columns[curPos].setResizable(false);
			}
			curPos++;
		}

		columns[curPos].setText(ProblemConst.TITLE_LINE);
		columns[curPos].setWidth(60);
		curPos++;

		columns[curPos].setText(ProblemConst.TITLE_DESCRIPTION);
		columns[curPos].setWidth(1000);
		curPos++;

		for (int i = curPos; i < columns.length; i++) {
			columns[i].setWidth(0);
			columns[i].setResizable(false);
		}

	}

	private void initLVMode() {

		TableColumn[] columns = table.getColumns();
		int curPos = 0;

		for (int i = 0; i < columns.length; i++) {
			columns[i].setImage(null);
			columns[i].setResizable(true);
		}

		columns[curPos].setText(ProblemConst.TITLE_ICON);
		columns[curPos].setWidth(45);
		curPos++;

		GuidelineData[] dataArray = guidelineHolder.getGuidelineData();
		for (int i = 0; i < dataArray.length; i++) {
			columns[curPos].setText(dataArray[i].getGuidelineName());
			columns[curPos].setWidth(70);
			curPos++;
		}

		columns[curPos].setText(ProblemConst.TITLE_SEVERITY);
		columns[curPos].setWidth(60);
		curPos++;
		columns[curPos].setText(ProblemConst.TITLE_FORECOLOR);
		columns[curPos].setWidth(100);
		curPos++;
		columns[curPos].setText(ProblemConst.TITLE_BACKCOLOR);
		columns[curPos].setWidth(100);
		curPos++;
		columns[curPos].setText(ProblemConst.TITLE_X);
		columns[curPos].setWidth(50);
		curPos++;
		columns[curPos].setText(ProblemConst.TITLE_Y);
		columns[curPos].setWidth(50);
		curPos++;
		columns[curPos].setText(ProblemConst.TITLE_AREA);
		columns[curPos].setWidth(70);
		curPos++;

		columns[curPos].setText(ProblemConst.TITLE_DESCRIPTION);
		columns[curPos].setWidth(1000);
		curPos++;

		for (int i = curPos; i < columns.length; i++) {
			columns[i].setWidth(0);
			columns[i].setResizable(false);
		}

		// tableViewer.setLabelProvider(new ResultTableLabelProviderLV());
		// tableViewer.setSorter(tableSorterLV);

	}

	public void changeFilterType(int type) {
		tableFilter.setSeverity(type);
		refresh();
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.actf.visualization.eval.guideline.IGuidelineSlectionChangedListener#selectionChanged(org.eclipse.actf.visualization.eval.guideline.GuidelineSelectionChangedEvent)
	 */
	public void selectionChanged(GuidelineSelectionChangedEvent e) {
		changeColumnLayout();
		// tableFilter.setEnabledMetrics(guidelineHolder.getEnabledMetrics());
		refresh();
	}

	public void visualizerChanged(VisualizationEvent vizEvent) {
		IVisualizationView checker = vizEvent.getVisualizationView();
		IEvaluationResult result = vizEvent.getEvaluationResult();
		mode = checker.getResultTableMode();

		currentSoruceFile = result.getSourceFile();
		isShowAllGuidelineItems = result.isShowAllGuidelineItems();
		tableSorter = checker.getTableSorter();

		if (curMode != checker.getResultTableMode()) {
			tableViewer.setInput(new Vector());
			changeColumnLayout();
		}

		tableViewer.setLabelProvider(checker.getLabelProvider());
		tableViewer.setSorter(tableSorter);

		tableViewer.setInput(result.getProblemList());

		// tableSorter.reset();
		// tableSorterLV.reset();

		srcViewerForPT.setSrcChanged(true);
		srcViewerForPT.updateSrcViewer(result.getSourceFile());

	}

	public File getCurrentSoruceFile() {
		return currentSoruceFile;
	}

	public boolean isShowAllGuidelineItems() {
		return isShowAllGuidelineItems;
	}

	public void modelserviceChanged(IModelService modelService) {
		// for HTML source viewer
		srcHighlightAction.setEnabled(modelService instanceof IWebBrowserACTF);
	}

	public void inputChanged(IModelService modelService) {
		// TODO Auto-generated method stub

	}

}
