/*******************************************************************************
 * Copyright (c) 2004, 2008 Sybase, Inc. and others.
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * 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);
	}
}
