/**
 * Copyright (c) 2011, 2014 - Lunifera GmbH (Gross Enzersdorf)
 * 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: 
 * 		Florian Pirchner - Initial implementation
 */

 package org.eclipse.osbp.vaaclipse.addons.common.ui;

import org.eclipse.osbp.vaaclipse.addons.common.api.ResourceUtil;
import org.eclipse.osbp.vaaclipse.publicapi.theme.Theme;

import com.vaadin.server.Resource;
import com.vaadin.shared.ui.combobox.FilteringMode;
import com.vaadin.ui.ComboBox;
import com.vaadin.ui.Component;
import com.vaadin.ui.CustomField;

/**
 * The Class ThemeIconsComboBox.
 */
@SuppressWarnings("serial")
public class ThemeIconsComboBox extends CustomField<String> {

	/** The theme. */
	private Theme theme;
	
	/** The cb. */
	private ComboBox cb;

	/**
	 * Instantiates a new theme icons combo box.
	 *
	 * @param caption
	 *            the caption
	 * @param theme
	 *            the theme
	 */
	public ThemeIconsComboBox(String caption, Theme theme) {
		this.theme = theme;
		setCaption(caption);
	}

	/* (non-Javadoc)
	 * @see com.vaadin.ui.CustomField#initContent()
	 */
	@SuppressWarnings("unchecked")
	@Override
	protected Component initContent() {

		cb = new ComboBox();
		cb.setSizeFull();
		cb.setImmediate(true);
		cb.setBuffered(false);
		cb.setInvalidAllowed(true);
		cb.setFilteringMode(FilteringMode.CONTAINS);
		cb.addContainerProperty("icon", Resource.class, null);
		cb.addContainerProperty("name", String.class, "");
		cb.addContainerProperty("uri", String.class, "");

		cb.setItemIconPropertyId("icon");
		cb.setItemCaptionPropertyId("name");

		for (String uri : theme.getImageURIs()) {
			Object id = cb.addItem();
			cb.getItem(id).getItemProperty("icon")
					.setValue(ResourceUtil.getResource(uri));
			cb.getItem(id).getItemProperty("name").setValue(extractName(uri));
			cb.getItem(id).getItemProperty("uri").setValue(uri);
		}

		if (getInternalValue() != null) {
			// set the selection to the combo box
			setInternalValue(getInternalValue());
		}

		cb.addValueChangeListener(e -> setInternalSelection(cb.getValue()));

		return cb;
	}

	/**
	 * Sets the internal selection.
	 *
	 * @param value
	 *            the new internal selection
	 */
	private void setInternalSelection(Object value) {
		if (value == null) {
			return;
		}
		String internalSelected = (String) cb.getItem(value)
				.getItemProperty("uri").getValue();
		setConvertedValue(internalSelected);
	}

	/**
	 * Extract name.
	 *
	 * @param uri
	 *            the uri
	 * @return the string
	 */
	private String extractName(String uri) {
		String[] path = uri.split("/");
		return path[path.length - 1];
	}

	/* (non-Javadoc)
	 * @see com.vaadin.ui.AbstractField#getType()
	 */
	@Override
	public Class<String> getType() {
		return String.class;
	}

	/* (non-Javadoc)
	 * @see com.vaadin.ui.AbstractField#setInternalValue(java.lang.Object)
	 */
	@Override
	protected void setInternalValue(String newValue) {
		super.setInternalValue(newValue);

		if (cb != null) {
			for (Object id : cb.getItemIds()) {
				if (newValue.equals(cb.getItem(id).getItemProperty("uri").getValue())) {
					cb.setValue(id);
				}
			}
		}
	}
}
