/*******************************************************************************
 * Copyright (c) 2004, 2006 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.core.runtime.Assert;
import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.common.command.CompoundCommand;
import org.eclipse.emf.edit.command.AddCommand;
import org.eclipse.emf.edit.command.RemoveCommand;
import org.eclipse.emf.edit.command.SetCommand;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
import org.eclipse.jst.jsf.facesconfig.emf.FacetNameType;
import org.eclipse.jst.jsf.facesconfig.emf.FacetType;
import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
import org.eclipse.jst.jsf.facesconfig.ui.dialog.AddEditFacetDialog;
import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.ui.forms.IManagedForm;
import org.eclipse.ui.forms.widgets.FormToolkit;

/**
 * Section for facets
 *
 */
public class FacetSection extends AbstractFacesConfigSection {

	private static final int TABLE_DEFAULT_HEIGHT = 160;

	private TableViewer tableViewer;

	private Button removeButton;

	private Button editButton;

	/**
	 * 
	 * @param parent
	 * @param managedForm
	 * @param page
	 * @param toolkit
	 */
	public FacetSection(Composite parent, IManagedForm managedForm,
			IFacesConfigPage page, FormToolkit toolkit) {
		super(parent, managedForm, page, toolkit, null, null);
		this.getSection().setText(EditorMessages.FacetSection_Name);
		this.getSection().setDescription(
				EditorMessages.FacetSection_Description);

	}

	/**
	 * 
	 */
	protected void createContents(Composite container, FormToolkit toolkit) {
		GridLayout gl = new GridLayout();
		gl.horizontalSpacing = 0;
		gl.marginWidth = 0;
		gl.numColumns = 2;
		container.setLayout(gl);
		GridData td = new GridData(GridData.FILL_BOTH);
		container.setLayoutData(td);

		toolkit.paintBordersFor(container);

		Composite facetSection = toolkit.createComposite(container);
		GridLayout gl2 = new GridLayout();
		gl2.horizontalSpacing = 0;
		gl2.marginWidth = 0;
		gl2.numColumns = 2;
		facetSection.setLayout(gl2);
		GridData gd = new GridData(GridData.FILL_BOTH
				| GridData.VERTICAL_ALIGN_BEGINNING);
		facetSection.setLayoutData(gd);

		createTableSection(facetSection, toolkit);
		createButtonsSection(facetSection, toolkit);

	}

	/**
	 * create facet table section
	 * 
	 * @param container
	 * @param toolkit
	 */
	private void createTableSection(Composite container, FormToolkit toolkit) {
		Composite tableContainer = toolkit.createComposite(container);
		GridData gd = new GridData(GridData.FILL_BOTH
				| GridData.GRAB_HORIZONTAL);
		tableContainer.setLayoutData(gd);
		toolkit.paintBordersFor(tableContainer);

		GridLayout gl = new GridLayout();
		tableContainer.setLayout(gl);

		Table table = new Table(tableContainer, SWT.H_SCROLL | SWT.V_SCROLL
				| SWT.FULL_SELECTION | SWT.BORDER);
		gd = new GridData(GridData.FILL_BOTH);
		gd.horizontalSpan = 1;
		gd.heightHint = TABLE_DEFAULT_HEIGHT;
		table.setLayoutData(gd);

		table.setHeaderVisible(true);
		table.setLinesVisible(true);
		TableLayout layout = new TableLayout();
		table.setLayout(layout);

		TableColumn facetNameCol = new TableColumn(table, SWT.NONE);
		layout.addColumnData(new ColumnWeightData(1, true));
		facetNameCol
				.setText(EditorMessages.FacetSection_Table_FacetNameColumn);
		TableColumn displayNameCol = new TableColumn(table, SWT.NONE);
		layout.addColumnData(new ColumnWeightData(1, true));
		displayNameCol
				.setText(EditorMessages.FacetSection_Table_DisplayNameColumn);

		TableColumn descriptionCol = new TableColumn(table, SWT.NONE);
		layout.addColumnData(new ColumnWeightData(1, true));
		descriptionCol
				.setText(EditorMessages.FacetSection_Table_DescriptionColumn);

		table.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(SelectionEvent e) {
				updateButtons();
			}
		});

		table.addMouseListener(new MouseAdapter() {
			public void mouseDoubleClick(MouseEvent e) {
				if (((IStructuredSelection) tableViewer.getSelection()).size() > 0)
					editButtonSelected();
			}
		});

		tableViewer = new TableViewer(table);
		tableViewer.setContentProvider(new AdapterFactoryContentProvider(
				getAdapterFactory()));
		tableViewer.setLabelProvider(new AdapterFactoryLabelProvider(
				getAdapterFactory()));

		tableViewer.addFilter(new ViewerFilter() {
			public boolean select(Viewer viewer, Object parentElement,
					Object element) {
				return FacesConfigPackage.eINSTANCE.getFacetType().isInstance(
						element);
			}
		});
		
		tableViewer.addSelectionChangedListener(this);
	}

	/**
	 * create buttons
	 * 
	 * @param container
	 * @param toolkit
	 */
	private void createButtonsSection(Composite container, FormToolkit toolkit) {
		// create operation buttons's container
		Composite operationContainer = toolkit.createComposite(container);
		GridData gd = new GridData(GridData.FILL_VERTICAL
				| GridData.VERTICAL_ALIGN_BEGINNING);
		operationContainer.setLayoutData(gd);
		GridLayout gl = new GridLayout();
		operationContainer.setLayout(gl);

		Button addButton = toolkit.createButton(operationContainer,
				EditorMessages.UI_Button_Add_more,
				SWT.PUSH);
		gd = new GridData(GridData.FILL_HORIZONTAL
				| GridData.VERTICAL_ALIGN_BEGINNING);
		gd.grabExcessHorizontalSpace = false;
		addButton.setLayoutData(gd);

		editButton = toolkit.createButton(operationContainer,
				EditorMessages.UI_Button_Edit_more,
				SWT.PUSH);
		gd = new GridData(GridData.FILL_HORIZONTAL
				| GridData.VERTICAL_ALIGN_BEGINNING);
		gd.grabExcessHorizontalSpace = false;
		editButton.setLayoutData(gd);

		removeButton = toolkit.createButton(operationContainer,
				EditorMessages.UI_Button_Remove,
				SWT.PUSH);
		gd = new GridData(GridData.FILL_HORIZONTAL
				| GridData.VERTICAL_ALIGN_BEGINNING);
		gd.grabExcessHorizontalSpace = false;
		removeButton.setLayoutData(gd);

		addButton.addSelectionListener(new SelectionAdapter() {

			public void widgetSelected(SelectionEvent e) {
				addButtonSelected();
			}
		});

		editButton.addSelectionListener(new SelectionAdapter() {

			public void widgetSelected(SelectionEvent e) {
				editButtonSelected();
			}
		});
		removeButton.addSelectionListener(new SelectionAdapter() {

			public void widgetSelected(SelectionEvent e) {
				removeButtonSelected();
			}
		});
	}

	/**
	 * refresh the table viewer and update buttons.
	 */
	public void refresh() {
		super.refresh();
		tableViewer.refresh();
		updateButtons();
	}

	public void refreshAll() {
		tableViewer.setInput(getInput());
		updateButtons();
	}

	/**
	 * Update the buttons' enable status.
	 */
	private void updateButtons() {
		if (((IStructuredSelection) tableViewer.getSelection()).size() > 0) {
			editButton.setEnabled(true);
			removeButton.setEnabled(true);
		} else {
			editButton.setEnabled(false);
			removeButton.setEnabled(false);
		}
	}

	/**
	 * add a facet.
	 * 
	 */
	private void addButtonSelected() {

		Shell shell = EditorPlugin.getActiveShell();

		AddEditFacetDialog dialog = new AddEditFacetDialog(shell, true);
		if (dialog.open() == Dialog.OK) {

			String newFacetName = dialog.getFacetName();
			String newDisplayName = dialog.getDisplayName();
			String newDescription = dialog.getDescription();

			FacetType newFacet = FacesConfigFactory.eINSTANCE.createFacetType();
			if (newFacetName.length() > 0) {
				FacetNameType facetNameType = FacesConfigFactory.eINSTANCE
						.createFacetNameType();
				facetNameType.setTextContent(newFacetName);
				newFacet.setFacetName(facetNameType);
			}

			if (newDisplayName.length() > 0) {
				DisplayNameType displayNameType = FacesConfigFactory.eINSTANCE
						.createDisplayNameType();
				displayNameType.setTextContent(newDisplayName);
				newFacet.getDisplayName().add(displayNameType);
			}

			if (newDescription.length() > 0) {
				DescriptionType descriptionType = FacesConfigFactory.eINSTANCE
						.createDescriptionType();
				descriptionType.setTextContent(newDescription);
				newFacet.getDescription().add(descriptionType);
			}

			Command addCommand = AddCommand.create(this.getEditingDomain(),
					getInput(), FacesConfigPackage.eINSTANCE
							.getComponentType_Facet(), newFacet);
			if (addCommand.canExecute()) {
				this.getEditingDomain().getCommandStack().execute(addCommand);

			}
		}

	}

	/**
	 * edit a facet.
	 * 
	 */
	private void editButtonSelected() {
		FacetType facet = (FacetType) ((IStructuredSelection) tableViewer
				.getSelection()).getFirstElement();

		Assert.isNotNull(facet);

		Shell shell = EditorPlugin.getActiveShell();

		AddEditFacetDialog dialog = new AddEditFacetDialog(shell, false);
		if (facet.getFacetName() != null)
			dialog.setFacetName(facet.getFacetName().getTextContent());

		if (facet.getDisplayName().size() > 0) {
			dialog.setDisplayName(((DisplayNameType) facet.getDisplayName()
					.get(0)).getTextContent());
		}

		if (facet.getDescription().size() > 0) {
			dialog.setDescription(((DescriptionType) facet.getDescription()
					.get(0)).getTextContent());
		}

		if (dialog.open() == Dialog.OK) {
			List commands = new ArrayList(3);

			String newFacetName = dialog.getFacetName();
			String newDisplayName = dialog.getDisplayName();
			String newDescription = dialog.getDescription();
			if (facet.getFacetName() != null) {
				Command cmd1 = SetCommand.create(getEditingDomain(), facet
						.getFacetName(), FacesConfigPackage.eINSTANCE
						.getFacetNameType_TextContent(), newFacetName);
				commands.add(cmd1);
			} else if (newFacetName.length() > 0) {
				FacetNameType newFacetNameType = FacesConfigFactory.eINSTANCE
						.createFacetNameType();
				newFacetNameType.setTextContent(newFacetName);
				Command cmd2 = AddCommand.create(getEditingDomain(), facet,
						FacesConfigPackage.eINSTANCE.getFacetType_FacetName(),
						newFacetNameType);
				commands.add(cmd2);
			}

			if (facet.getDisplayName().size() > 0) {
				DisplayNameType displayNameType = (DisplayNameType) facet
						.getDisplayName().get(0);
				Command cmd3 = SetCommand.create(this.getEditingDomain(),
						displayNameType, FacesConfigPackage.eINSTANCE
								.getDisplayNameType_TextContent(),
						newDisplayName);
				commands.add(cmd3);
			} else if (newDisplayName.length() > 0) {
				DisplayNameType newDisplayNameType = FacesConfigFactory.eINSTANCE
						.createDisplayNameType();
				newDisplayNameType.setTextContent(newDisplayName);
				Command cmd4 = AddCommand
						.create(this.getEditingDomain(), facet,
								FacesConfigPackage.eINSTANCE
										.getFacetType_DisplayName(),
								newDisplayNameType);
				commands.add(cmd4);
			}

			if (facet.getDescription().size() > 0) {
				DescriptionType descriptionType = (DescriptionType) facet
						.getDescription().get(0);
				Command cmd5 = SetCommand.create(this.getEditingDomain(),
						descriptionType, FacesConfigPackage.eINSTANCE
								.getDescriptionType_TextContent(),
						newDescription);
				commands.add(cmd5);
			} else if (newDescription.length() > 0) {
				DescriptionType newDescriptionType = FacesConfigFactory.eINSTANCE
						.createDescriptionType();
				newDescriptionType.setTextContent(newDescription);
				Command cmd6 = AddCommand
						.create(this.getEditingDomain(), facet,
								FacesConfigPackage.eINSTANCE
										.getFacetType_Description(),
								newDescriptionType);
				commands.add(cmd6);
			}

			CompoundCommand command = new CompoundCommand(commands);
			if (command.canExecute()) {
				getEditingDomain().getCommandStack().execute(command);
				tableViewer.refresh(facet);
			}
		}

	}

	/**
	 * remove a facet.
	 * 
	 */
	private void removeButtonSelected() {
		FacetType facet = (FacetType) ((IStructuredSelection) tableViewer
				.getSelection()).getFirstElement();

		Assert.isNotNull(facet);
		Command removeCommand = RemoveCommand.create(this.getEditingDomain(),
				getInput(), FacesConfigPackage.eINSTANCE
						.getComponentType_Facet(), facet);

		if (removeCommand.canExecute()) {
			this.getEditingDomain().getCommandStack().execute(removeCommand);
			refreshAll();
		}

	}

	/* (non-Javadoc)
	 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
	 */
	public ISelection getSelection() {
		return tableViewer.getSelection();
	}


	/* (non-Javadoc)
	 * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
	 */
	public void setSelection(ISelection selection) {

		tableViewer.setSelection(selection);
	}
}
