/*******************************************************************************
 * Copyright (c) 2004, 2005 Sybase, Inc. and others.
 *
 * 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:
 *     Sybase, Inc. - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.jsf.facesconfig.ui.section;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.common.command.CompoundCommand;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.impl.AdapterImpl;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.edit.command.AddCommand;
import org.eclipse.emf.edit.command.RemoveCommand;
import org.eclipse.emf.edit.command.SetCommand;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.jst.jsf.facesconfig.emf.ApplicationType;
import org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType;
import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
import org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType;
import org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType;
import org.eclipse.jst.jsf.facesconfig.ui.dialog.DialogUtil;
import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
import org.eclipse.jst.jsf.facesconfig.ui.page.OthersPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.forms.IManagedForm;
import org.eclipse.ui.forms.widgets.FormToolkit;

/**
 * @author Zhi-peng Zhang, sfshi
 * @version
 */
public class LocaleConfigSection extends ApplicationSection implements
		ICheckStateListener {
	/**
	 * 
	 * @param componentClass
	 * @param parent
	 * @param managedForm
	 * @param page
	 * @param toolkit
	 * @param helpContextId
	 * @param helpTooltip
	 */
	public LocaleConfigSection(EClass componentClass, Composite parent,
			IManagedForm managedForm, IFacesConfigPage page,
			FormToolkit toolkit, String helpContextId, String helpTooltip) {
		super(componentClass, parent, managedForm, page, toolkit,
				helpContextId, helpTooltip);
	}

	/**
	 * 
	 * @param componentClass
	 * @param parent
	 * @param managedForm
	 * @param page
	 * @param toolkit
	 */
	public LocaleConfigSection(EClass componentClass, Composite parent,
			IManagedForm managedForm, IFacesConfigPage page, FormToolkit toolkit) {
		this(componentClass, parent, managedForm, page, toolkit, null, null);
	}

	/**
	 * create a CheckboxTableViewer for this section.
	 */
	protected TableViewer createTableViewer(Composite parent) {
		CheckboxTableViewer tableViewer1 = CheckboxTableViewer.newCheckList(
				parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
		tableViewer1.addCheckStateListener(this);
		tableViewer1.setSorter(new ViewerSorter());
		return tableViewer1;
	}

	/**
	 * Add a filter for this table viewer, only <supported-locale> and
	 * <default-locale> elements would be listed.
	 */
	protected void configTableViewer(TableViewer tableViewer1) {
		tableViewer1.addFilter(new ViewerFilter() {
			public boolean select(Viewer viewer, Object parentElement,
					Object element) {
				return FacesConfigPackage.eINSTANCE.getSupportedLocaleType()
						.isInstance(element)
						|| FacesConfigPackage.eINSTANCE.getDefaultLocaleType()
								.isInstance(element);
			}
		});
	}

	/**
	 * Pop up a dialog for user to select a locale string, then create a
	 * <supported-locale> element with the string as value.
	 * 
	 * @return
	 */
	public SupportedLocaleType createSupportedLocaleObject() {
		ArrayList locales = new ArrayList();

		/**
		 * Compute the locales that already declared in this <locale-config>
		 * element. If user select a locale that already declared, then a
		 * warning message will be shown in the dialog.
		 */

		if (getInput() instanceof ApplicationType
				&& ((ApplicationType) getInput()).getLocaleConfig().size() > 0) {
			LocaleConfigType localeConfigType = (LocaleConfigType) ((ApplicationType) getInput())
					.getLocaleConfig().get(0);
			if (localeConfigType.getDefaultLocale() != null) {
				String locale = localeConfigType.getDefaultLocale()
						.getTextContent();
				if (locale != null) {
					locales.add(locale);
				}
			}
			List list = localeConfigType.getSupportedLocale();
			for (int i = 0, n = list.size(); i < n; i++) {
				String locale = ((SupportedLocaleType) list.get(i))
						.getTextContent();
				if (locale != null) {
					locales.add(locale);
				}
			}
		}
		String result = DialogUtil.openLocaleDialog(getSection().getShell(),
				locales);
		if (result != null) {
			SupportedLocaleType component = FacesConfigFactory.eINSTANCE
					.createSupportedLocaleType();
			component.setTextContent(result);
			return component;
		}
		return null;
	}

	/**
	 * When user click "Add" button on this section, pop up a dialog to create a
	 * <supported-locale> element, then add it onto <locale-config> element, if
	 * the <locale-config> or <application> doesn't exist, create them together.
	 */
	void addButtonSelected(SelectionEvent e) {
		SupportedLocaleType obj = createSupportedLocaleObject();
		if (obj != null) {

			boolean needRefreshAll = false;
			Command command = null;

			if (getInput() instanceof ApplicationType) {
				/** the <application> element exists. */
				ApplicationType application = (ApplicationType) getInput();
				if (application.getLocaleConfig().size() > 0) {
					/** the <locale-config> element exists. */
					LocaleConfigType localeConfig = (LocaleConfigType) application
							.getLocaleConfig().get(0);
					command = AddCommand.create(this.getEditingDomain(),
							localeConfig, null, obj);
				} else {
					/** the <locale-config> element doesn't exist, create it. */
					LocaleConfigType localeConfig = FacesConfigFactory.eINSTANCE
							.createLocaleConfigType();
					localeConfig.getSupportedLocale().add(obj);
					command = AddCommand.create(getEditingDomain(),
							application, null, localeConfig);
				}
			} else {
				/**
				 * the <application> element doesn't exist, then create it,
				 * after execute, reset the input for all the application
				 * sections.
				 */
				needRefreshAll = true;
				ApplicationType application = FacesConfigFactory.eINSTANCE
						.createApplicationType();
				LocaleConfigType localeConfig = FacesConfigFactory.eINSTANCE
						.createLocaleConfigType();
				localeConfig.getSupportedLocale().add(obj);
				application.getLocaleConfig().add(localeConfig);
				command = AddCommand.create(getEditingDomain(), this.getPage()
						.getInput(), null, application);
			}

			if (command.canExecute()) {
				getEditingDomain().getCommandStack().execute(command);
				if (needRefreshAll)
					/** reset input for all the application sections. */
					((OthersPage) this.getPage()).resetApplicationInput();
			}
		}

	}

	/**
	 * when user click on the CheckboxTableViewer, perform some actions to
	 * set/unset <default-locale> and <supported-locale> elements.
	 * 
	 * If an item is selected, that means it's a <default-locale>, otherwise
	 * it's a <supported-locale>.
	 * 
	 * @see org.eclipse.jface.viewers.ICheckStateListener#checkStateChanged(org.eclipse.jface.viewers.CheckStateChangedEvent)
	 */
	public void checkStateChanged(CheckStateChangedEvent event) {
		boolean checked = event.getChecked();

		if (event.getElement() == null) {
			return;
		}

		EObject node = (EObject) event.getElement();
		LocaleConfigType localeConfigType = (LocaleConfigType) ((ApplicationType) getInput())
				.getLocaleConfig().get(0);
		CompoundCommand compoundCommand = new CompoundCommand();

		if (checked) {
			/** user checked one item, going to set it as <default-locale>. */
			if (localeConfigType.getDefaultLocale() != null) {
				/**
				 * Change the <default-locale> value to <supported-locale>.
				 */
				Command command = RemoveCommand.create(getEditingDomain(),
						localeConfigType, null, localeConfigType
								.getDefaultLocale());

				compoundCommand.append(command);

				SupportedLocaleType supportedLocale = FacesConfigFactory.eINSTANCE
						.createSupportedLocaleType();
				supportedLocale.setTextContent(localeConfigType
						.getDefaultLocale().getTextContent());
				command = AddCommand.create(getEditingDomain(),
						localeConfigType, FacesConfigPackage.eINSTANCE
								.getLocaleConfigType_SupportedLocale(),
						supportedLocale);
				compoundCommand.append(command);
			}

			/**
			 * Change the selected item from <supported-locale> to
			 * <default-locale>
			 */
			SupportedLocaleType supportedLocale = (SupportedLocaleType) node;
			Command command = RemoveCommand.create(getEditingDomain(),
					localeConfigType, FacesConfigPackage.eINSTANCE
							.getLocaleConfigType_SupportedLocale(),
					supportedLocale);
			compoundCommand.append(command);

			DefaultLocaleType defaultLocale = FacesConfigFactory.eINSTANCE
					.createDefaultLocaleType();
			defaultLocale.setTextContent(supportedLocale.getTextContent());
			command = SetCommand
					.create(getEditingDomain(), localeConfigType,
							FacesConfigPackage.eINSTANCE
									.getLocaleConfigType_DefaultLocale(),
							defaultLocale);
			compoundCommand.append(command);

		} else {
			/**
			 * User unchecked one item, going to change it from <default-locale>
			 * to <supported-locale>.
			 */
			DefaultLocaleType defaultLocale = (DefaultLocaleType) node;
			Command command = RemoveCommand.create(getEditingDomain(),
					localeConfigType, null, defaultLocale);
			compoundCommand.append(command);

			SupportedLocaleType supportedLocale = FacesConfigFactory.eINSTANCE
					.createSupportedLocaleType();
			supportedLocale.setTextContent(defaultLocale.getTextContent());
			command = AddCommand.create(getEditingDomain(), localeConfigType,
					null, supportedLocale);
			compoundCommand.append(command);
		}

		if (compoundCommand.canExecute()) {
			getEditingDomain().getCommandStack().execute(compoundCommand);
			this.refresh();
			setTableViewerCheckedState();
		}
	}

	/**
	 * Set the checked state for items in the checkbox table viewer. This method
	 * could be used for refresh the checked state of the table viewer.
	 */
	private void setTableViewerCheckedState() {
		if (getInput() instanceof ApplicationType) {
			ApplicationType application = (ApplicationType) getInput();
			if (application.getLocaleConfig().size() > 0) {

				LocaleConfigType localeConfigType = (LocaleConfigType) application
						.getLocaleConfig().get(0);
				if (localeConfigType.getDefaultLocale() != null) {
					((CheckboxTableViewer) getTableViewer()).setChecked(
							localeConfigType.getDefaultLocale(), true);
				}
			}
		}
	}

	/**
	 * set the structuredViewer's input. Set the first LocaleConfig as input.
	 * 
	 * @param input
	 */
	protected void setViewerInput(Object input) {
		if (input instanceof ApplicationType) {
			ApplicationType application = (ApplicationType) input;
			if (EcoreUtil.getExistingAdapter(application,
					LocaleConfigSection.class) == null) {
				application.eAdapters().add(new LocaleConfigAdapter());
			}
			if (application.getLocaleConfig().size() > 0) {
				tableViewer.setInput(application.getLocaleConfig().get(0));
			} else
				tableViewer.setInput(null);
		} else
			tableViewer.setInput(null);

	}

	public void refreshAll() {
		super.refreshAll();
		setTableViewerCheckedState();
	}

	/**
	 * A listener that is be adapted on the input <application> element, to
	 * listen the event that the first <locale-config> being created and
	 * removed, then reset the input of the tabel viewer.
	 * 
	 * @author sfshi
	 * 
	 */
	class LocaleConfigAdapter extends AdapterImpl {
		public boolean isAdapterForType(Object type) {
			if (type == LocaleConfigSection.class)
				return true;
			return false;
		}

		public void notifyChanged(Notification msg) {
			if (msg.getEventType() == Notification.ADD
					|| msg.getEventType() == Notification.REMOVE) {
				if (msg.getFeature() == FacesConfigPackage.eINSTANCE
						.getApplicationType_LocaleConfig()) {
					/**
					 * a <locale-config> was created or removed, notify this
					 * section to reset it's input.
					 */
					setInput(getInput());

				}
			}
		}

	}
}
