/*******************************************************************************
 * Copyright (c) 2011 Luis Carlos Moreira da Costa.
 * 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:
 *     Luis Carlos Moreira da Costa (tcljava at gmail dot com) - initial API and implementation
 *******************************************************************************/
package org.mihalis.opal.dynamictablecolumns;

import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TreeColumn;

/**
 * 
 * DynamicColumnData
 * 
 * <p>Sets the dynamic properties of a column.</p>
 * <p>The objects of this class must be registered and
 * handled by an instance of <code>DynamicColumnManager</code></p>
 * @see org.mihalis.opal.dynamictablecolumns.DynamicTableColumnLayout
 */
public class DynamicColumnData {

	/** The preferred length. */
	private DynamicLength preferredLength = null;
	
	/** The min length. */
	private DynamicLength minLength = null;
	
	/** The visible. */
	private boolean visible = true;

	/** The table column. */
	private TableColumn tableColumn = null;
	
	/** The tree column. */
	private TreeColumn treeColumn = null;

	/**
	 * <p>Create a dynamic column definition in order to specify
	 *  the measures required for a <code>TableColumn</code>.</p>
	 * 
	 * <p><b>Definition of length</b>
	 * <br>The lengths are specified using a <code>String</code>, containing
	 *  the number, followed by an identifier of measurement.
	 * <br>Ex.: "355px", "100%"</p>
	 * 
	 * @param tableColumn     TableColumn The column (a table) that should be controlled length.
	 * @param preferredLength String      That defines or <i>desired length</i> as column.
	 * @param minLength       String      That defines or <i>minimum length</i> as column.
	 * 
	 * @see org.eclipse.swt.widgets.TableColumn
	 */
	public DynamicColumnData(final TableColumn tableColumn, final String preferredLength, final String minLength) {
		this(tableColumn, DynamicLengthFormat.parse(preferredLength), DynamicLengthFormat.parse(minLength));
	}

	/**
	 * <p>Create a dynamic column definition in order to specify
	 * steps required for a <code>TableColumn</code>.</p>
	 * <p><i>!Builder alternative avoids setting minimum length,
	 * using default 0px !</i></p>
	 * 
	 * <p><b>Definition of length</b>
	 * <br>The lengths are specified using a <code>String</code>, containing
	 * quantity, followed by an identifier of measurement.
	 * <br>Ex.: "355px", "100%"</p>
	 * 
	 * @param tableColumn     TableColumn The column (a table) that should be controlled length.
	 * @param preferredLength String      That defines or <i>desired length</i> as column.
	 * 
	 * @see org.eclipse.swt.widgets.TableColumn
	 */
	public DynamicColumnData(final TableColumn tableColumn, final String preferredLength) {
		this(tableColumn, DynamicLengthFormat.parse(preferredLength), new DynamicLength(0d, DynamicLengthMeasure.PIXEL));
	}

	/**
	 * <p>Create a dynamic column definition in order to specify
	 * steps required for a <code>TreeColumn</code>.</p>
	 * 
	 * <p><b>Definition of length</b>
	 * <br>The lengths are specified using a <code>String</code>, containing
	 * quantity, followed by an identifier of measurement.
	 * <br>Ex.: "355px", "100%"</p>
	 * 
	 * @param treeColumn      TreeColumn Column (a tree) you want to control the length.
	 * @param preferredLength String     That defines or <i>desired length</i> as column.
	 * @param minLength       String     That defines or <i>minimum length</i> as column.
	 * 
	 * @see org.eclipse.swt.widgets.TreeColumn
	 */
	public DynamicColumnData(final TreeColumn treeColumn, final String preferredLength, final String minLength) {
		this(treeColumn, DynamicLengthFormat.parse(preferredLength), DynamicLengthFormat.parse(minLength));
	}

	/**
	 * <p>Create a dynamic column definition in order to specify
	 * steps required for a <code>TreeColumn</code>.</p>
	 * <p><i>!Builder alternative avoids setting minimum length,
	 * using as standard 0px !</i></p>
	 * 
	 * <p><b>Definition of length</b>
	 * <br>The lengths are specified using a <code>String</code>, containing
	 * quantity, followed by an identifier of measurement.
	 * <br>Ex.: "355px", "100%"</p>
	 * 
	 * @param treeColumn      TreeColumn Column (a tree) you want to control the length.
	 * @param preferredLength String     That defines or <i>desired length</i> as column.
	 * 
	 * @see org.eclipse.swt.widgets.TreeColumn
	 */
	public DynamicColumnData(final TreeColumn treeColumn, final String preferredLength) {
		this(treeColumn, DynamicLengthFormat.parse(preferredLength), new DynamicLength(0d, DynamicLengthMeasure.PIXEL));
	}

	/**
	 * Create a dynamic column definition in order to specify
	 * steps required for a <code>TableColumn</code>.
	 * 
	 * @param tableColumn     TableColumn   The column (a table) that should be controlled length.
	 * @param preferredLength DynamicLength The <i>desired length</i> as column.
	 * @param minLength       DynamicLength The <i>minimum length</i> as column.
	 * 
	 * @see org.eclipse.swt.widgets.TableColumn
	 */
	DynamicColumnData(final TableColumn tableColumn, final DynamicLength preferredLength, final DynamicLength minLength) {
		this.tableColumn = tableColumn;
		this.preferredLength = preferredLength;
		this.minLength = minLength;
	}

	/**
	 * Create a dynamic column definition in order to specify
	 * measures required for a <code>TreeColumn</code>.
	 * 
	 * @param treeColumn       TreColumn     Column (a tree) you want to control the length.
	 * @param preferredLength  DynamicLength The <i>desired length</i> as column.
	 * @param minLength        DynamicLength The <i>minimum length</i> as column.
	 * 
	 * @see org.eclipse.swt.widgets.TreeColumn
	 */
	DynamicColumnData(final TreeColumn treeColumn, final DynamicLength preferredLength, final DynamicLength minLength) {
		this.treeColumn = treeColumn;
		this.preferredLength = preferredLength;
		this.minLength = minLength;
	}

	/**
	 * Get preferred length.
	 *
	 * @return the preferred length
	 */
	public DynamicLength getPreferredLength() {
		return this.preferredLength;
	}

	/**
	 * Set preferred length.
	 *
	 * @param preferredLength DynamicLength
	 */
	public void setPreferredLength(final DynamicLength preferredLength) {
		this.preferredLength = preferredLength;
	}

	/**
	 * Get minimal length.
	 *
	 * @return DynamicLength
	 */
	public DynamicLength getMinLength() {
		return this.minLength;
	}

	/**
	 * Set minimal length.
	 *
	 * @param minLength DynamicLength
	 */
	public void setMinLength(final DynamicLength minLength) {
		this.minLength = minLength;
	}

	/**
	 * Get table column.
	 *
	 * @return TableColumn
	 */
	public TableColumn getTableColumn() {
		return this.tableColumn;
	}

	/**
	 * Set table column.
	 *
	 * @param tableColumn TableColumn
	 */
	public void setTableColumn(final TableColumn tableColumn) {
		this.tableColumn = tableColumn;
	}

	/**
	 * Get tree column.
	 *
	 * @return TreeColumn
	 */
	public TreeColumn getTreeColumn() {
		return this.treeColumn;
	}

	/**
	 * Set tree column.
	 *
	 * @param treeColumn TreeColumn
	 */
	public void setTreeColumn(final TreeColumn treeColumn) {
		this.treeColumn = treeColumn;
	}

	/**
	 * Is visible.
	 *
	 * @return boolean
	 */
	public boolean isVisible() {
		return this.visible;
	}

	/**
	 * Set visible.
	 *
	 * @param visible boolean
	 */
	public void setVisible(final boolean visible) {
		this.visible = visible;
	}

}