/*******************************************************************************
 *  Copyright (c) 2007, 2016 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.equinox.internal.p2.ui.viewers;

import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.swt.graphics.FontMetrics;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.widgets.Control;

/**
 * An IUColumnConfig describes a column in a viewer that is showing
 * information about an IIInstallableUnit.
 *
 * @since 3.4
 */
public class IUColumnConfig {
	/**
	 * Constant indicating that the column represents an IInstallableUnit's id
	 */
	public final static int COLUMN_ID = 0;

	/**
	 * Constant indicating that the column represents an IInstallableUnit's name
	 */
	public final static int COLUMN_NAME = 1;

	/**
	 * Constant indicating that the column represents an IInstallableUnit's version
	 */
	public final static int COLUMN_VERSION = 2;

	/**
	 * Constant indicating that the column represents an IInstallableUnit's size
	 */
	public final static int COLUMN_SIZE = 3;

	/**
	 * Constant indicating that the column represents an IInstallableUnit's provider
	 */
	public final static int COLUMN_PROVIDER = 4;

	/**
	 * Constant indicating that the column represents an IInstallableUnit's description
	 */
	public final static int COLUMN_DESCRIPTION = 5;

	private String columnTitle;
	private int columnType;
	private int columnWidth;
	private int columnWidthInPixels;

	/**
	 * Create an IUColumnConfig describing a column with the specified title, type, and
	 * default width.
	 *
	 * @param title the title that should appear for the column
	 * @param columnType the type of column represented.  The type may be used to determine
	 * appropriate size or formatting of the column's content.
	 * @param columnWidthInChars the width (in characters) that should be used for the column if no
	 * other width is specified by the client.
	 */

	public IUColumnConfig(String title, int columnType, int columnWidthInChars) {
		this.columnTitle = title;
		this.columnType = columnType;
		this.columnWidth = columnWidthInChars;
		this.columnWidthInPixels = -1;
	}

	/**
	 * Return the title of the column.
	 * @return the title that should be used for the column.
	 *
	 * @since 3.6
	 */
	public String getColumnTitle() {
		return columnTitle;
	}

	/**
	 * Set the title of the column
	 * @param title the String that should be used when the column's title is shown
	 *
	 * @since 3.6
	 */
	public void setColumnTitle(String title) {
		this.columnTitle = title;
	}

	/**
	 * Return the width of the column in character width units
	 * @return the width (in characters) of the column
	 *
	 * @since 3.6
	 */
	public int getWidthInChars() {
		return columnWidth;
	}

	/**
	 * Set the width of the column in character width units
	 * @param columnWidth the width (in characters) of the column
	 *
	 * @since 3.6
	 */
	public void setWidthInChars(int columnWidth) {
		this.columnWidth = columnWidth;
	}

	/**
	 * Get the width in pixels of this column when displayed in the specified
	 * control.  If a specific width in pixels has already been specified by a client,
	 * that width is used.  Otherwise, the value is computed based on the character
	 * width specified for the column.
	 * @param control
	 * @return the width in pixels that should be used for the column
	 *
	 * @since 3.6
	 *
	 * @see #setWidthInPixels(int)
	 */
	public int getWidthInPixels(Control control) {
		if (columnWidthInPixels >= 0)
			return columnWidthInPixels;

		GC gc = new GC(control);
		FontMetrics fm = gc.getFontMetrics();
		columnWidthInPixels = Dialog.convertWidthInCharsToPixels(fm, columnWidth);
		gc.dispose();
		return columnWidthInPixels;
	}

	/**
	 * Set the width in pixels that should be used for this column.  This width overrides
	 * any character width that has been specified.  This method is useful when the column width
	 * is determined by user action.
	 *
	 * @param width
	 *
	 * @since 3.6
	 */
	public void setWidthInPixels(int width) {
		this.columnWidthInPixels = width;
	}

	/**
	 * Return the type of column.
	 * @return an Integer constant specifying the type of data being shown in the column.
	 *
	 * @since 3.6
	 * @see #COLUMN_ID
	 * @see #COLUMN_NAME
	 * @see #COLUMN_SIZE
	 * @see #COLUMN_VERSION
	 */
	public int getColumnType() {
		return columnType;
	}

	/**
	 * Set the type of column.
	 * @param type an Integer constant specifying the type of data being shown in the column.
	 *
	 * @since 3.6
	 *
	 * @see #COLUMN_ID
	 * @see #COLUMN_NAME
	 * @see #COLUMN_SIZE
	 * @see #COLUMN_VERSION
	 */
	public void setColumnType(int type) {
		this.columnType = type;
	}
}
