/*******************************************************************************
 * Copyright (c) 2012, 2014 Remain BV 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:
 * Wim Jongman <wim.jongman@remainsoftware.com> - initial API and implementation
 * Steven Spungin <steve@spungin.tv> -Bug 439284 - [model editor] make list a combo with autocomplete for add part
 * descriptor
 * Toni Umbreit - Bug 440289
 ******************************************************************************/
package org.eclipse.e4.tools.emf.ui.internal.common.uistructure;

import javax.inject.Inject;

import org.eclipse.e4.core.contexts.ContextInjectionFactory;
import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.e4.core.services.nls.Translation;
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.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;

/**
 * A viewer with buttons.
 *
 * @author wim.jongman@remainsoftware.com
 *
 */
public class ViewerElement {

	Messages Messages;

	private StructuredViewer viewer;
	private final AbstractComponentEditor editor;
	private ComboViewer dropDown;
	private Button addButton;
	private final Composite parent;

	private Button removeButton;

	private Button downButton;

	private Button upButton;

	/**
	 * @param parent
	 * @param editor
	 */
	@Inject
	public ViewerElement(@Translation Messages Messages, Composite parent, AbstractComponentEditor editor) {
		this.parent = parent;
		this.editor = editor;
		this.Messages = Messages;
		createControl();
	}

	public StructuredViewer getViewer() {
		return viewer;
	}

	public void createControl() {

		createTopButtons();

		if (viewer == null) {
			viewer = new TableViewer(parent);
		}

		final GridData gd = new GridData(GridData.FILL, GridData.FILL, true, true, 3, 1);
		viewer.getControl().setLayoutData(gd);

		createBottomButtons();

	}

	private void createBottomButtons() {
		final Composite buttonCompBot = new Composite(parent, SWT.NONE);
		buttonCompBot.setLayoutData(new GridData(GridData.FILL, GridData.END, false, false, 3, 1));
		final GridLayout gl = new GridLayout(3, false);
		gl.marginLeft = 0;
		gl.marginRight = 0;
		gl.marginWidth = 0;
		gl.marginHeight = 0;
		buttonCompBot.setLayout(gl);

		upButton = new Button(buttonCompBot, SWT.PUSH | SWT.FLAT);
		upButton.setText(Messages.ModelTooling_Common_Up);
		upButton.setImage(editor.createImage(ResourceProvider.IMG_Obj16_arrow_up));
		upButton.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false, 1, 1));

		downButton = new Button(buttonCompBot, SWT.PUSH | SWT.FLAT);
		downButton.setText(Messages.ModelTooling_Common_Down);
		downButton.setImage(editor.createImage(ResourceProvider.IMG_Obj16_arrow_down));
		downButton.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false, 1, 1));

		removeButton = new Button(buttonCompBot, SWT.PUSH | SWT.FLAT);
		removeButton.setText(Messages.ModelTooling_Common_Remove);
		removeButton.setImage(editor.createImage(ResourceProvider.IMG_Obj16_table_delete));
		removeButton.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false, 1, 1));

	}

	/**
	 * Returns the button that removes an element from the list. Use it to add
	 * your {@link SelectionListener} to it.
	 *
	 * @return the {@link Button}
	 */
	public Button getButtonRemove() {
		return removeButton;
	}

	/**
	 * Returns the button that adds an element to the list. Use it to add your {@link SelectionListener} to it.
	 *
	 * @return the {@link Button}
	 */
	public Button getButtonAdd() {
		return addButton;
	}

	/**
	 * Returns the button that moves an element down in the list. Use it to add
	 * your {@link SelectionListener} to it.
	 *
	 * @return the {@link Button}
	 */
	public Button getButtonDown() {
		return downButton;
	}

	/**
	 * Returns the button that moves an element up in the list. Use it to add
	 * your {@link SelectionListener} to it.
	 *
	 * @return the {@link Button}
	 */
	public Button getButtonUp() {
		return upButton;
	}

	private void createTopButtons() {
		final Composite buttonCompTop = new Composite(parent, SWT.NONE);
		buttonCompTop.setLayoutData(new GridData(GridData.FILL, GridData.END, false, false, 3, 1));
		final GridLayout buttonCompTopLayout = new GridLayout(2, false);
		buttonCompTopLayout.marginLeft = 0;
		buttonCompTopLayout.marginRight = 0;
		buttonCompTopLayout.marginWidth = 0;
		buttonCompTopLayout.marginHeight = 0;
		buttonCompTop.setLayout(buttonCompTopLayout);

		dropDown = new ComboViewer(buttonCompTop, SWT.READ_ONLY | SWT.DROP_DOWN);
		dropDown.getControl().setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false));

		addButton = new Button(buttonCompTop, SWT.PUSH | SWT.FLAT);
		addButton.setImage(editor.createImage(ResourceProvider.IMG_Obj16_table_add));
		addButton.setText(Messages.ModelTooling_Common_AddEllipsis);
		addButton.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, false, false));

	}

	public ComboViewer getDropDown() {
		return dropDown;
	}

	/**
	 * Creates and returns a new instance of this class based on the supplied
	 * context.
	 *
	 * @param parentContext
	 * @param parent
	 * @param editor
	 * @return a new {@link ViewerElement}
	 */
	public static ViewerElement create(IEclipseContext parentContext, Composite parent, AbstractComponentEditor editor) {
		final IEclipseContext mycontext = parentContext.createChild();
		mycontext.set(Composite.class, parent);
		mycontext.set(AbstractComponentEditor.class, editor);
		return ContextInjectionFactory.make(ViewerElement.class, mycontext);
	}
}
