/*******************************************************************************
 * Copyright (c) 2014 TwelveTone LLC 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:
 *     Steven Spungin <steven@spungin.tv> - initial API and implementation, Ongoing Maintenance
 *     Olivier Prouvost <olivier.prouvost@opcoach.com> - Bug 466731
 *******************************************************************************/

package org.eclipse.e4.tools.emf.ui.internal.common;

import java.util.Arrays;
import java.util.List;

import org.eclipse.e4.tools.emf.ui.common.component.AbstractComponentEditor;
import org.eclipse.e4.tools.emf.ui.internal.Messages;
import org.eclipse.e4.tools.emf.ui.internal.ResourceProvider;
import org.eclipse.e4.ui.model.application.MApplicationElement;
import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.edit.command.AddCommand;
import org.eclipse.emf.edit.command.MoveCommand;
import org.eclipse.emf.edit.command.RemoveCommand;
import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusAdapter;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
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.Label;
import org.eclipse.swt.widgets.Text;

/**
 * A PickList for creating a string list. Action include ordering, adding,
 * removing, and replacing.
 *
 * @author Steven Spungin
 *
 */
public class E4StringPickList extends AbstractPickList {

	private Text text;
	private Button tiReplace;
	private AbstractComponentEditor editor;
	private EStructuralFeature feature;

	public E4StringPickList(Composite parent, int flags, List<PickListFeatures> list, Messages messages, AbstractComponentEditor editor, EStructuralFeature feature) {
		super(parent, flags, Arrays.asList(PickListFeatures.NO_PICKER), messages, editor);

		this.editor = editor;
		this.feature = feature;

		// TODO does not respect NO_ORDER yet

		tiReplace = new Button(getToolBar(), SWT.PUSH);
		tiReplace.setToolTipText(messages.E4StringPickList_Replace);
		tiReplace.setImage(editor.createImage(ResourceProvider.IMG_Obj16_world_edit));
		tiReplace.setFont(getButtonFont());

		Composite valueParent = new Composite(getToolBar().getParent(), SWT.BORDER);
		valueParent.setLayout(new GridLayout(5, false));
		valueParent.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));

		Label l = new Label(valueParent, SWT.NONE);
		l.setText(messages.E4StringPickList_NewValue);
		l.setToolTipText(messages.E4StringPickList_ToolTipNewValue);
		text = new Text(valueParent, SWT.SINGLE | SWT.LEAD | SWT.BORDER);
		text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
		text.setToolTipText(messages.E4StringPickList_ToolTipNewValue);

		tiReplace.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {
				handleReplaceText();
			}
		});

		getList().setContentProvider(new ObservableListContentProvider());

		text.addModifyListener(new ModifyListener() {

			@Override
			public void modifyText(ModifyEvent e) {
				updateUiState();
			}
		});

		text.addFocusListener(new FocusAdapter() {

			@Override
			public void focusGained(FocusEvent e) {
				updateUiState();

			}
		});

		updateUiState();

	}

	@Override
	protected void moveUpPressed() {
		if (!viewer.getSelection().isEmpty()) {
			IStructuredSelection s = (IStructuredSelection) viewer.getSelection();
			if (s.size() == 1) {
				Object obj = s.getFirstElement();
				Object container = editor.getMaster().getValue();
				tryEObjectMove(obj, (EObject) container, -1);
			}
		}
	}

	@Override
	protected void moveDownPressed() {
		if (!viewer.getSelection().isEmpty()) {
			IStructuredSelection s = (IStructuredSelection) viewer.getSelection();
			if (s.size() == 1) {
				Object obj = s.getFirstElement();
				Object container = editor.getMaster().getValue();
				tryEObjectMove(obj, (EObject) container, 1);
			}
		}
	}

	@Override
	protected void removePressed() {
		if (!viewer.getSelection().isEmpty()) {
			List<?> keybinding = ((IStructuredSelection) viewer.getSelection()).toList();
			Command cmd = RemoveCommand.create(editor.getEditingDomain(), editor.getMaster().getValue(), feature, keybinding);
			if (cmd.canExecute()) {
				editor.getEditingDomain().getCommandStack().execute(cmd);
			}
		}
	}

	protected void handleReplaceText() {
		if (getTextWidget().getText().trim().length() > 0) {
			if (!viewer.getSelection().isEmpty()) {
				String[] tags = getTextWidget().getText().split(";"); //$NON-NLS-1$
				for (int i = 0; i < tags.length; i++) {
					tags[i] = tags[i].trim();
				}

				MApplicationElement appEl = (MApplicationElement) editor.getMaster().getValue();
				EObject el = (EObject) editor.getMaster().getValue();
				List<?> ids = ((IStructuredSelection) viewer.getSelection()).toList();
				Object curVal = ((IStructuredSelection) viewer.getSelection()).getFirstElement();
				EObject container = (EObject) editor.getMaster().getValue();
				List<?> l = (List<?>) container.eGet(feature);
				int idx = l.indexOf(curVal);
				if (idx >= 0) {
					Command cmdRemove = RemoveCommand.create(editor.getEditingDomain(), el, feature, ids);
					Command cmdInsert = AddCommand.create(editor.getEditingDomain(), appEl, feature, Arrays.asList(tags), idx);
					if (cmdRemove.canExecute() && cmdInsert.canExecute()) {
						editor.getEditingDomain().getCommandStack().execute(cmdRemove);
						editor.getEditingDomain().getCommandStack().execute(cmdInsert);
					}
					getTextWidget().setText(""); //$NON-NLS-1$
				}
			}
		}
	}

	@Override
	public void updateUiState() {
		super.updateUiState();

		if (text != null) {
			IStructuredSelection sel = (IStructuredSelection) viewer.getSelection();
			Object firstViewerElement = sel.getFirstElement();
			String txt = text.getText();
			boolean diff = !txt.equals(firstViewerElement);
			tiReplace.setEnabled(firstViewerElement != null && !getTextWidget().getText().isEmpty() && diff);
			tiAdd.setEnabled(txt.length() > 0 && text.isFocusControl());
		}
	}

	@Override
	protected int getItemCount() {
		if (viewer.getContentProvider() == null || viewer.getInput() == null) {
			return 0;
		}
		return ((ObservableListContentProvider) viewer.getContentProvider()).getElements(viewer.getInput()).length;
	}

	protected Button getReplaceWidget() {
		return tiReplace;
	}

	public Text getTextWidget() {
		return text;
	}

	protected void tryEObjectMove(Object obj, EObject container, int delta) {
		List<?> l = (List<?>) container.eGet(feature);
		int idx = l.indexOf(obj) + delta;
		if ((delta > 0 && idx < l.size()) || (delta < 0 && idx >= 0)) {
			Command cmd = MoveCommand.create(editor.getEditingDomain(), editor.getMaster().getValue(), feature, obj, idx);

			if (cmd.canExecute()) {
				editor.getEditingDomain().getCommandStack().execute(cmd);
				viewer.setSelection(new StructuredSelection(obj));
			}
		}
	}
}
