/*******************************************************************************
 * Copyright (c) 2011 University of Illinois 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: 
 * 	Albert L. Rossi - design and implementation
 ******************************************************************************/
package org.eclipse.ptp.rm.jaxb.ui.model;

import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.CheckboxCellEditor;
import org.eclipse.jface.viewers.ComboBoxCellEditor;
import org.eclipse.jface.viewers.ICheckable;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.ptp.rm.jaxb.core.variables.LCVariableMap;
import org.eclipse.ptp.rm.jaxb.ui.ICellEditorUpdateModel;
import org.eclipse.ptp.rm.jaxb.ui.cell.SpinnerCellEditor;
import org.eclipse.ptp.rm.jaxb.ui.handlers.ValueUpdateHandler;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;

/**
 * Specialized base class for the Viewer cell editor models.
 * 
 * @author arossi
 * 
 */
public abstract class CellEditorUpdateModel extends AbstractUpdateModel implements ICellEditorUpdateModel {

	protected boolean readOnly;
	protected String tooltip;
	protected String description;
	protected String status;
	protected Color[] foreground;
	protected Color[] background;
	protected Font[] font;
	protected CellEditor editor;
	protected ViewerUpdateModel viewer;

	protected String stringValue;
	protected int index;
	protected String[] items;
	protected boolean booleanValue;
	protected int integerValue;

	/**
	 * @param name
	 *            of the model, which will correspond to the name of a Property
	 *            or Attribute the value is to be saved to
	 * @param handler
	 *            the handler for notifying other widgets to refresh their
	 *            values
	 * @param editor
	 *            the cell editor for the value cell
	 * @param items
	 *            if this is a combo editor, the selection items
	 * @param readOnly
	 *            if this is a text box, whether it is editable
	 * @param tooltip
	 *            to display
	 * @param description
	 *            to display
	 * @param status
	 *            the attribute's status value, if any
	 */
	protected CellEditorUpdateModel(String name, ValueUpdateHandler handler, CellEditor editor, String[] items, boolean readOnly,
			String tooltip, String description, String status) {
		super(name, handler);
		this.editor = editor;
		this.readOnly = readOnly;
		this.items = items;
		this.tooltip = tooltip;
		this.description = description;
		this.status = status;
	}

	/*
	 * The combo cell editor does not allow write-ins. So effectively the only
	 * widget which can be "read-only" is a text box. We must allow edit on the
	 * others for them to appear. (non-Javadoc)
	 * 
	 * @see org.eclipse.ptp.rm.jaxb.ui.ICellEditorUpdateModel#canEdit()
	 */
	public boolean canEdit() {
		return isChecked() && !((editor instanceof TextCellEditor) && readOnly);
	}

	/*
	 * Return the background color for the column, if set. (non-Javadoc)
	 * 
	 * @see
	 * org.eclipse.jface.viewers.ITableColorProvider#getBackground(java.lang
	 * .Object, int)
	 */
	public Color getBackground(Object element, int columnIndex) {
		if (background == null) {
			return null;
		}
		return background[columnIndex];
	}

	/*
	 * The cell editor for this row or node. (non-Javadoc)
	 * 
	 * @see org.eclipse.ptp.rm.jaxb.ui.ICellEditorUpdateModel#getCellEditor()
	 */
	public CellEditor getCellEditor() {
		return editor;
	}

	public Image getColumnImage(String columnName) {
		return null;
	}

	/*
	 * Returns cell editor. @see #getCellEditor() (non-Javadoc)
	 * 
	 * @see org.eclipse.ptp.rm.jaxb.ui.model.AbstractUpdateModel#getControl()
	 */
	@Override
	public Object getControl() {
		return editor;
	}

	/*
	 * Returns the description string. (non-Javadoc)
	 * 
	 * @see
	 * org.eclipse.ptp.rm.jaxb.ui.IColumnViewerLabelSupport#getDescription()
	 */
	public String getDescription() {
		return description;
	}

	/*
	 * Return the font for the column, if set. (non-Javadoc)
	 * 
	 * @see
	 * org.eclipse.jface.viewers.ITableFontProvider#getFont(java.lang.Object,
	 * int)
	 */
	public Font getFont(Object element, int columnIndex) {
		if (font == null) {
			return null;
		}
		return font[columnIndex];
	}

	/*
	 * Return the foreground color for the column, if set. (non-Javadoc)
	 * 
	 * @see
	 * org.eclipse.jface.viewers.ITableFontProvider#getFont(java.lang.Object,
	 * int)
	 */
	public Color getForeground(Object element, int columnIndex) {
		if (foreground == null) {
			return null;
		}
		return foreground[columnIndex];
	}

	/*
	 * For generating a templated string using all the names and values in the
	 * viewer rows. Skips non-checked items. (non-Javadoc)
	 * 
	 * @see
	 * org.eclipse.ptp.rm.jaxb.ui.ICellEditorUpdateModel#getReplacedValue(java
	 * .lang.String)
	 */
	public String getReplacedValue(String pattern) {
		if (!isChecked()) {
			return ZEROSTR;
		}
		String value = getValueAsString();
		if (ZEROSTR.equals(value)) {
			return ZEROSTR;
		}
		String result = pattern.replaceAll(NAME_TAG, name);
		result = result.replaceAll(VALUE_TAG, value);
		return result;
	}

	/*
	 * Returns the tooltip string. (non-Javadoc)
	 * 
	 * @see org.eclipse.ptp.rm.jaxb.ui.ICellEditorUpdateModel#getTooltip()
	 */
	public String getTooltip() {
		return tooltip;
	}

	/**
	 * @return the type of the value (Boolean, Integer or String)
	 */
	public String getType() {
		if (editor instanceof CheckboxCellEditor) {
			return Boolean.TYPE.getCanonicalName();
		} else if (editor instanceof SpinnerCellEditor) {
			return Integer.TYPE.getCanonicalName();
		}
		return STRING;
	}

	/*
	 * The editor needs the selection index for a combo box; otherwise the value
	 * is of the same type as the stored value. (non-Javadoc)
	 * 
	 * @see
	 * org.eclipse.ptp.rm.jaxb.ui.ICellEditorUpdateModel#getValueForEditor()
	 */
	public Object getValueForEditor() {
		if (editor instanceof TextCellEditor) {
			return stringValue;
		} else if (editor instanceof CheckboxCellEditor) {
			return booleanValue;
		} else if (editor instanceof SpinnerCellEditor) {
			return integerValue;
		} else if (editor instanceof ComboBoxCellEditor) {
			return index;
		}
		return null;
	}

	/*
	 * The most recent update on the map value (@see #setValueFromEditor)
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ptp.rm.jaxb.ui.IUpdateModel#getValueFromControl()
	 */
	public Object getValueFromControl() {
		return mapValue;
	}

	/*
	 * Also sets whether this model is currently on a checked viewer item.
	 * (non-Javadoc)
	 * 
	 * @see
	 * org.eclipse.ptp.rm.jaxb.ui.model.AbstractUpdateModel#initialize(org.eclipse
	 * .ptp.rm.jaxb.core.variables.LCVariableMap)
	 */
	@Override
	public void initialize(LCVariableMap lcMap) {
		super.initialize(lcMap);
		this.lcMap = lcMap;
	}

	/*
	 * Whether the model item is checked in the viewer. (non-Javadoc)
	 * 
	 * @see org.eclipse.ptp.rm.jaxb.ui.ICellEditorUpdateModel#isChecked()
	 */
	public boolean isChecked() {
		return ((ICheckable) viewer.getControl()).getChecked(this);
	}

	/*
	 * Casts or converts the map value to the proper type to set it to the
	 * correct internal field. For combo box editors both the string value of
	 * the selection and the index are maintained.(non-Javadoc)
	 * 
	 * @see org.eclipse.ptp.rm.jaxb.ui.IUpdateModel#refreshValueFromMap()
	 */
	public void refreshValueFromMap() {
		refreshing = true;
		mapValue = lcMap.get(name);
		if (editor instanceof TextCellEditor) {
			stringValue = ZEROSTR;
			if (mapValue != null) {
				stringValue = (String) mapValue;
			}
		} else if (editor instanceof CheckboxCellEditor) {
			booleanValue = false;
			if (mapValue != null) {
				if (mapValue instanceof String) {
					booleanValue = Boolean.parseBoolean((String) mapValue);
				} else {
					booleanValue = (Boolean) mapValue;
				}
			}
		} else if (editor instanceof SpinnerCellEditor) {
			SpinnerCellEditor e = (SpinnerCellEditor) editor;
			integerValue = e.getMin();
			if (mapValue != null) {
				if (mapValue instanceof String) {
					integerValue = Integer.parseInt((String) mapValue);
				} else {
					integerValue = (Integer) mapValue;
				}
			}
		} else if (editor instanceof ComboBoxCellEditor) {
			if (mapValue == null) {
				index = UNDEFINED;
				stringValue = ZEROSTR;
			} else {
				stringValue = (String) mapValue;
				for (int i = 0; i < items.length; i++) {
					if (items[i].equals(stringValue)) {
						index = i;
						break;
					}
				}
				if (index == items.length) {
					index = UNDEFINED;
					stringValue = ZEROSTR;
				}
			}
		}
		refreshing = false;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * org.eclipse.ptp.rm.jaxb.ui.ICellEditorUpdateModel#setBackground(org.eclipse
	 * .swt.graphics.Color[])
	 */
	public void setBackground(Color[] background) {
		this.background = background;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * org.eclipse.ptp.rm.jaxb.ui.ICellEditorUpdateModel#setFont(org.eclipse
	 * .swt.graphics.Font[])
	 */
	public void setFont(Font[] font) {
		this.font = font;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * org.eclipse.ptp.rm.jaxb.ui.ICellEditorUpdateModel#setForeground(org.eclipse
	 * .swt.graphics.Color[])
	 */
	public void setForeground(Color[] foreground) {
		this.foreground = foreground;
	}

	/*
	 * Casts the value to its appropriate field. For combo boxes, also sets the
	 * selection string from the index. Calls storeValue on the viewer to update
	 * the viewer template string; this in turn calls #getReplacedValue on all
	 * its cell models. Finishes with call to store value on the current cell
	 * value.(non-Javadoc)
	 * 
	 * @see
	 * org.eclipse.ptp.rm.jaxb.ui.ICellEditorUpdateModel#setValueFromEditor(
	 * java.lang.Object)
	 */
	public void setValueFromEditor(Object value) {
		if (editor instanceof TextCellEditor) {
			stringValue = ZEROSTR;
			if (value != null) {
				stringValue = (String) value;
			}
			mapValue = stringValue;
		} else if (editor instanceof CheckboxCellEditor) {
			if (value == null) {
				booleanValue = false;
			} else {
				booleanValue = (Boolean) value;
			}
			mapValue = booleanValue;
		} else if (editor instanceof SpinnerCellEditor) {
			SpinnerCellEditor e = (SpinnerCellEditor) editor;
			if (value == null) {
				integerValue = e.getMin();
			} else {
				integerValue = (Integer) value;
			}
			mapValue = integerValue;
		} else if (editor instanceof ComboBoxCellEditor) {
			if (value == null || ((Integer) value) == UNDEFINED) {
				index = UNDEFINED;
				stringValue = ZEROSTR;
			} else {
				index = (Integer) value;
				stringValue = items[index];
			}
			mapValue = stringValue;
		}
		viewer.storeValue();
		storeValue();
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * org.eclipse.ptp.rm.jaxb.ui.ICellEditorUpdateModel#setViewer(org.eclipse
	 * .ptp.rm.jaxb.ui.model.ViewerUpdateModel)
	 */
	public void setViewer(ViewerUpdateModel viewer) {
		this.viewer = viewer;
	}

	/**
	 * @return appropriate string value for current editor value.
	 */
	protected String getValueAsString() {
		if (editor instanceof TextCellEditor || editor instanceof ComboBoxCellEditor) {
			return stringValue;
		} else if (editor instanceof CheckboxCellEditor) {
			return String.valueOf(booleanValue);
		} else if (editor instanceof SpinnerCellEditor) {
			return String.valueOf(integerValue);
		}
		return ZEROSTR;
	}
}
