/*******************************************************************************
 * Copyright (c) 2000, 2018 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/

package org.eclipse.team.internal.ui.preferences;

import java.util.Collection;
import java.util.List;

import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ComboBoxCellEditor;
import org.eclipse.jface.viewers.ICellModifier;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.osgi.util.TextProcessor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.TableEditor;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.team.core.Team;
import org.eclipse.team.internal.ui.PixelConverter;
import org.eclipse.team.internal.ui.SWTUtils;
import org.eclipse.team.internal.ui.TeamUIMessages;


public class FileTypeTable implements ICellModifier, IStructuredContentProvider, ITableLabelProvider {

	private final static int COMBO_INDEX_BINARY= 0;
	private final static int COMBO_INDEX_TEXT= 1;
	private final static String [] MODES_TEXT= { TeamUIMessages.FileTypeTable_0, TeamUIMessages.FileTypeTable_1 }; //

	private final static int COMBO_INDEX_SAVE= 0;
	private final static int COMBO_INDEX_DONT_SAVE= 1;
	private static final String [] SAVE_TEXT= { TeamUIMessages.FileTypeTable_2, TeamUIMessages.FileTypeTable_3 }; //

	private static final class FileTypeComparator extends ViewerComparator {

		public FileTypeComparator() {
		}

		private int getCategory(Object element) {
			if (element instanceof Extension)
				return 0;
			if (element instanceof Name) {
				return 1;
			}
			return 2;
		}

		@Override
		public int compare(Viewer viewer,Object e1,Object e2) {
			final int compare= getCategory(e1) - getCategory(e2);
			if (compare != 0)
				return compare;
			return super.compare(viewer, ((Item)e1).name,  ((Item)e2).name);
		}
	}

	public abstract static class Item implements Comparable {
		public final String name;
		public boolean save;
		public int mode;
		public boolean contributed;

		public Item(String name, boolean contributed) { this.name= name; this.contributed = contributed; save= true; mode= Team.BINARY; }

		@Override
		public int compareTo(Object o) {
			return name.compareTo(((Item)o).name);
		}
	}

	public static class Extension extends Item {
		public Extension(String name, boolean contributed) { super(name, contributed); }
	}

	public static class Name extends Item {
		public Name(String name, boolean contributed) { super(name, contributed); }
	}

	private final static int COLUMN_PADDING = 5;

	protected static final String ITEM = "item"; //$NON-NLS-1$
	protected static final String PROPERTY_MODE= "mode"; //$NON-NLS-1$
	protected static final String PROPERTY_SAVE= "save"; //$NON-NLS-1$

	private final TableViewer fTableViewer;
	private final List fItems;
	private final boolean fShowSaveColumn;

	public FileTypeTable(Composite composite, List items, boolean showSaveColumn) {

		fShowSaveColumn= showSaveColumn;
		fItems= items;


		/**
		 * Create a table.
		 */
		final Table table = new Table(composite, SWT.V_SCROLL | SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION);
		table.setLayoutData(SWTUtils.createHVFillGridData());
		table.setLinesVisible(true);
		table.setHeaderVisible(true);

		final PixelConverter converter= SWTUtils.createDialogPixelConverter(composite);

		/**
		 * The 'Extension' column
		 */
		final TableColumn fileColumn = new TableColumn(table, SWT.NONE, 0);
		fileColumn.setWidth(converter.convertWidthInCharsToPixels(TeamUIMessages.FileTypeTable_4.length() + COLUMN_PADDING));
		fileColumn.setText(TeamUIMessages.FileTypeTable_4);

		/**
		 * The 'Mode' column
		 */
		final TableColumn modeColumn = new TableColumn(table, SWT.NONE, 1);
		int length;
		try {
			length = TeamUIMessages.FileTypeTable_5.length();
			length = Math.max(length, TeamUIMessages.FileTypeTable_0.length());
			length = Math.max(length, TeamUIMessages.FileTypeTable_1.length());
		} catch (RuntimeException e) {
			// There may be an unbound message so just pick a reasonable length
			length = 15;
		}
		modeColumn.setWidth(converter.convertWidthInCharsToPixels(length + COLUMN_PADDING));
		modeColumn.setText(TeamUIMessages.FileTypeTable_5);

		/**
		 * The 'Save' column
		 */
		if (fShowSaveColumn) {
			final TableColumn saveColumn = new TableColumn(table, SWT.NONE, 2);
			saveColumn.setWidth(converter.convertWidthInCharsToPixels(TeamUIMessages.FileTypeTable_6.length() + COLUMN_PADDING));
			saveColumn.setText(TeamUIMessages.FileTypeTable_6);
		}

		/**
		 * Create a viewer for the table.
		 */
		fTableViewer = new TableViewer(table);
		fTableViewer.setContentProvider(this);
		fTableViewer.setLabelProvider(this);
		fTableViewer.setComparator(new FileTypeComparator());

		/**
		 * Add a cell editor in the Keyword Substitution Mode column
		 */
		new TableEditor(table);

		final CellEditor modeEditor = new ComboBoxCellEditor(table, MODES_TEXT, SWT.READ_ONLY);
		final CellEditor saveEditor= new ComboBoxCellEditor(table, SAVE_TEXT, SWT.READ_ONLY);

		if (fShowSaveColumn) {
			fTableViewer.setCellEditors(new CellEditor[] { null, modeEditor, saveEditor });
			fTableViewer.setColumnProperties(new String [] { ITEM, PROPERTY_MODE, PROPERTY_SAVE });
		} else {
			fTableViewer.setCellEditors(new CellEditor [] { null, modeEditor });
			fTableViewer.setColumnProperties(new String [] { ITEM, PROPERTY_MODE });
		}

		fTableViewer.setCellModifier(this);

		fTableViewer.setInput(fItems);
	}


	@Override
	public Object getValue(Object element, String property) {

		final Item item= (Item)element;

		if (PROPERTY_MODE.equals(property)) {
			if (item.mode == Team.BINARY)
				return Integer.valueOf(COMBO_INDEX_BINARY);
			if (item.mode == Team.TEXT)
				return Integer.valueOf(COMBO_INDEX_TEXT);
		}

		if (fShowSaveColumn && PROPERTY_SAVE.equals(property)) {
			return Integer.valueOf(item.save ? COMBO_INDEX_SAVE : COMBO_INDEX_DONT_SAVE);
		}
		return null;
	}

	@Override
	public boolean canModify(Object element, String property) {
		return PROPERTY_MODE.equals(property) || (fShowSaveColumn && PROPERTY_SAVE.equals(property));
	}

	@Override
	public void modify(Object element, String property, Object value) {

		final IStructuredSelection selection = fTableViewer.getStructuredSelection();
		final Item item= (Item)selection.getFirstElement();
		if (item == null)
			return;

		final int comboIndex = ((Integer)value).intValue();

		if (PROPERTY_MODE.equals(property)) {
			if (comboIndex == COMBO_INDEX_BINARY)
				item.mode= Team.BINARY;
			if (comboIndex == COMBO_INDEX_TEXT)
				item.mode= Team.TEXT;
		}

		if (fShowSaveColumn && PROPERTY_SAVE.equals(property)) {
			item.save= COMBO_INDEX_SAVE == comboIndex;
		}
		fTableViewer.refresh(item);
	}

	@Override
	public Image getColumnImage(Object element, int columnIndex) {
		return null;
	}

	@Override
	public String getColumnText(Object element, int columnIndex) {

		final Item item= (Item) element;

		if (columnIndex == 0) {
			String label = (item instanceof Extension ? "*." : "") + item.name; //$NON-NLS-1$ //$NON-NLS-2$
			label = TextProcessor.process(label, ".*"); //$NON-NLS-1$
			return label;
		}

		if (columnIndex == 1) {
			if (item.mode == Team.BINARY) {
				return MODES_TEXT[COMBO_INDEX_BINARY];
			} else if (item.mode == Team.TEXT) {
				return MODES_TEXT[COMBO_INDEX_TEXT];
			}
		}

		if (columnIndex == 2) {
			if (fShowSaveColumn) return SAVE_TEXT[item.save ? COMBO_INDEX_SAVE : COMBO_INDEX_DONT_SAVE];
		}

		return null;
	}

	@Override
	public void addListener(ILabelProviderListener listener) {}

	@Override
	public void dispose() {}

	@Override
	public boolean isLabelProperty(Object element, String property) {
		return false;
	}

	@Override
	public void removeListener(ILabelProviderListener listener) {}

	@Override
	public Object[] getElements(Object inputElement) {
		return ((Collection)inputElement).toArray();
	}

	@Override
	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {}

	public IStructuredSelection getSelection() {
		return fTableViewer.getStructuredSelection();
	}

	public void setInput(List items) {
		fItems.clear();
		fItems.addAll(items);
		fTableViewer.refresh();
	}

	public TableViewer getViewer() {
		return fTableViewer;
	}
}
