/**
 * Copyright (c) 2011, 2014 - Lunifera GmbH (Gross Enzersdorf, Austria), Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
 * 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.keybinding.view;

import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.inject.Inject;

import org.eclipse.core.commands.CommandManager;
import org.eclipse.core.commands.common.NotDefinedException;
import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.e4.ui.model.application.MApplication;
import org.eclipse.e4.ui.model.application.commands.MBindingContext;
import org.eclipse.e4.ui.model.application.commands.MBindingTable;
import org.eclipse.e4.ui.model.application.commands.MCommand;
import org.eclipse.e4.ui.model.application.commands.MKeyBinding;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.osbp.runtime.common.i18n.II18nService;
import org.eclipse.osbp.vaaclipse.addons.common.api.IE4Topics;
import org.eclipse.osbp.vaaclipse.addons.keybinding.IKeyBindingService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.vaadin.data.Property;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.util.BeanItemContainer;
import com.vaadin.event.ItemClickEvent;
import com.vaadin.ui.Table;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;

/**
 * View that shows problems.
 */
public class KeybindingView {

	/** The Constant LOGGER. */
	private static final Logger LOGGER = LoggerFactory
			.getLogger(KeybindingView.class);

	/** The parent. */
	private final VerticalLayout parent;
	
	/** The eclipse context. */
	@SuppressWarnings("unused")
	private final IEclipseContext eclipseContext;

	/** The command manager. */
	@Inject
	private CommandManager commandManager;

	/** The i18n service. */
	@Inject
	private II18nService i18nService;

	/** The keybinding service. */
	@Inject
	private IKeyBindingService keybindingService;

	/** The table. */
	private Table table;

	/** The container. */
	private BeanItemContainer<BindingBean> container;

	/**
	 * Instantiates a new keybinding view.
	 *
	 * @param parent
	 *            the parent
	 * @param eclipseContext
	 *            the eclipse context
	 * @param app
	 *            the app
	 */
	@Inject
	public KeybindingView(VerticalLayout parent,
			IEclipseContext eclipseContext, MApplication app) {
		this.parent = parent;
		this.eclipseContext = eclipseContext;
	}

	/**
	 * Inits the.
	 */
	@SuppressWarnings("serial")
	@PostConstruct
	protected void init() {

		table = new Table();
		table.setSelectable(true);
		table.setSizeFull();
		parent.addComponent(table);

		container = new BeanItemContainer<BindingBean>(BindingBean.class);
		table.setContainerDataSource(container);

		List<MKeyBinding> bindings = keybindingService.getAllKeyBindings();
		for (MKeyBinding binding : bindings) {
			container.addBean(new BindingBean(binding));
		}

		table.setVisibleColumns(new Object[] { "name", "description",
				"keySequence", "category", "contextName", "contextDescription" });
		table.setColumnCollapsingAllowed(true);
		table.setColumnCollapsed("category", true);
		table.setColumnCollapsed("contextDescription", true);

		Locale locale = UI.getCurrent().getLocale();
		table.setColumnHeader("name", toViewI18n("name", i18nService, locale));
		table.setColumnHeader("description",
				toViewI18n("description", i18nService, locale));
		table.setColumnHeader("category",
				toViewI18n("category", i18nService, locale));
		table.setColumnHeader("keySequence",
				toViewI18n("keySequence", i18nService, locale));
		table.setColumnHeader("contextName",
				toViewI18n("contextName", i18nService, locale));
		table.setColumnHeader("contextDescription",
				toViewI18n("contextDescription", i18nService, locale));

		table.addItemClickListener(new ItemClickEvent.ItemClickListener() {
			@Override
			public void itemClick(ItemClickEvent event) {
				if (event.isDoubleClick()) {
				}
			}
		});

		table.addValueChangeListener(new Property.ValueChangeListener() {
			@Override
			public void valueChange(ValueChangeEvent event) {
				// showDetailMessage((StatusBean)
				// event.getProperty().getValue());
			}
		});

		// parent.setExpandRatio(table, 0.85f);

	}

	/**
	 * To view i18n.
	 *
	 * @param key
	 *            the key
	 * @param i18nService
	 *            the i18n service
	 * @param locale
	 *            the locale
	 * @return the string
	 */
	private static String toViewI18n(String key, II18nService i18nService,
			Locale locale) {
		String result = i18nService.getValue(
				"org.eclipse.osbp.vaaclipse.addons.keybinding.view.KeybindingView."
						+ key, locale);
		if (result == null || result.equals("")) {
			return key;
		}

		return result;
	}

	/**
	 * To common i18n.
	 *
	 * @param key
	 *            the key
	 * @param i18nService
	 *            the i18n service
	 * @param locale
	 *            the locale
	 * @return the string
	 */
	@SuppressWarnings("unused")
	private static String toCommonI18n(String key, II18nService i18nService,
			Locale locale) {
		if (key == null) {
			return "";
		}
		String result = i18nService.getValue(key, locale);
		if (result == null || result.equals("")) {
			return key;
		}

		return result;
	}

	/**
	 * Creates an event to focus a field in a MPart.
	 *
	 * @param mPartId
	 *            the m part id
	 * @param fieldId
	 *            the field id
	 * @return the map
	 */
	protected Map<String, Object> createFocusFieldEvent(String mPartId,
			String fieldId) {
		Map<String, Object> properties = new HashMap<String, Object>();
		properties.put(IE4Topics.PartEvents.PROP_MPART_ID, mPartId);
		properties.put(IE4Topics.PartEvents.PROP_FIELD_ID, fieldId);
		return properties;
	}

	/**
	 * Dispose.
	 */
	@PreDestroy
	protected void dispose() {
		table = null;
		container = null;
	}

	/**
	 * The Class BindingBean.
	 */
	public static class BindingBean {

		/** The binding. */
		private MKeyBinding binding;
		
		/** The binding table. */
		private MBindingTable bindingTable;
		
		/** The binding context. */
		private MBindingContext bindingContext;
		
		/** The command. */
		private MCommand command;

		/**
		 * Instantiates a new binding bean.
		 *
		 * @param binding
		 *            the binding
		 */
		public BindingBean(MKeyBinding binding) {
			super();
			this.binding = binding;
			this.command = binding.getCommand();
			this.bindingTable = (MBindingTable) ((EObject) binding)
					.eContainer();
			this.bindingContext = bindingTable.getBindingContext();
		}

		/**
		 * Gets the description.
		 *
		 * @return the description
		 * @throws NotDefinedException
		 *             the not defined exception
		 */
		public final String getDescription() throws NotDefinedException {
			return command.getDescription();
		}

		/**
		 * Gets the name.
		 *
		 * @return the name
		 * @throws NotDefinedException
		 *             the not defined exception
		 */
		public final String getName() throws NotDefinedException {
			return command.getCommandName();
		}

		/**
		 * Gets the id.
		 *
		 * @return the id
		 */
		public final String getId() {
			return command.getElementId();
		}

		/**
		 * Gets the category.
		 *
		 * @return the category
		 * @throws NotDefinedException
		 *             the not defined exception
		 */
		public final String getCategory() throws NotDefinedException {
			try {
				return command.getCategory().getName();
			} catch (Exception e) {
				return "";
			}
		}

		/**
		 * Gets the key sequence.
		 *
		 * @return the key sequence
		 */
		public final String getKeySequence() {
			return binding.getKeySequence();
		}

		/**
		 * Gets the context name.
		 *
		 * @return the context name
		 */
		public final String getContextName() {
			return bindingContext.getName();
		}

		/**
		 * Gets the context description.
		 *
		 * @return the context description
		 */
		public final String getContextDescription() {
			return bindingContext.getDescription();
		}

	}

}
