package org.eclipse.emf.ecp.e4.view;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

import org.eclipse.e4.ui.di.Focus;
import org.eclipse.e4.ui.workbench.modeling.ESelectionService;
import org.eclipse.e4.ui.workbench.swt.modeling.EMenuService;
import org.eclipse.emf.ecp.ui.common.TreeViewerFactory;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.widgets.Composite;

public class ECPRepositoryView {

	private TreeViewer repositoryTree;

	public ECPRepositoryView() {

	}

	@PostConstruct
	public void create(Composite composite, EMenuService menuService,
			final ESelectionService selectionService) {
		repositoryTree = TreeViewerFactory.createRepositoryExplorerViewer(
				composite, null);
		menuService.registerContextMenu(repositoryTree.getTree(),
				"org.eclipse.emf.ecp.e4.application.popupmenu.repository");
		repositoryTree
				.addSelectionChangedListener(new ISelectionChangedListener() {

					@Override
					public void selectionChanged(SelectionChangedEvent event) {
						ISelection selection = event.getSelection();
						if (IStructuredSelection.class.isInstance(selection)) {
							IStructuredSelection structuredSelection = (IStructuredSelection) selection;
							if (!structuredSelection.isEmpty()) {
								selectionService
										.setSelection(structuredSelection
												.getFirstElement());
							}
						}
					}
				});
	}

	@Focus
	public void setFocus() {
		repositoryTree.getTree().setFocus();
	}

	@PreDestroy
	public void dispose() {

	}
}
