/*******************************************************************************
 * Copyright (c) 2011 The University of York.
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 * 
 * Contributors:
 *     Louis Rose - initial API and implementation
 ******************************************************************************/
package org.eclipse.epsilon.egl.dt.traceability.editor;

import java.util.Collection;
import java.util.LinkedList;
import java.util.List;

import org.eclipse.emf.common.ui.viewer.IViewerProvider;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.custom.CTabItem;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.ui.IEditorPart;

public class TabbedEditor<T extends IEditorPart> extends Composite {

	private final CTabFolder folder;
	private final List<T> innerEditors;
	
	public TabbedEditor(Composite parent, Collection<T> innerEditors) {
		super(parent, SWT.NONE);
		this.innerEditors = new LinkedList<T>(innerEditors);
		
		this.setLayout(new FillLayout());
		
		folder = createFolder();
		populateFolderWithEditors(innerEditors);
		
		if (innerEditors.size() > 0) switchTo(innerEditors.iterator().next());
	}
	
	private CTabFolder createFolder(String... tabItemNames) {
		final CTabFolder folder = new CTabFolder(this, SWT.BORDER);
		
		final ToolBar t = new ToolBar(folder, SWT.HORIZONTAL | SWT.FLAT);
		final ToolBarManager tbm = new ToolBarManager(t);

		tbm.update(true);
		folder.setTabPosition(SWT.BOTTOM);
		folder.setSimple(true);
		t.setVisible(true);
		
		folder.addSelectionListener(new SelectionListener(){

			public void widgetDefaultSelected(SelectionEvent e) {}

			public void widgetSelected(SelectionEvent e) {
				if (e.item != null && e.item instanceof CTabItem) {
					((CTabItem) e.item).getControl().setFocus();
				}
			}
			
		});
		
		return folder;
	}
	
	private void populateFolderWithEditors(Collection<T> innerEditors) {
		for (T innerEditor : innerEditors) {
			populateFolderWithEditor(innerEditor);
		}
	}
	
	private void populateFolderWithEditor(final T innerEditor) {
		final CTabItem item = new CTabItem(folder, SWT.NONE);
		item.setText(innerEditor.getEditorInput().getName());
		
		Composite content = new Composite(folder, SWT.NONE);
		content.setLayout(new FillLayout());
		innerEditor.createPartControl(content);
		
		item.setControl(content);
		
//		parent.addListener(SWT.Activate, new Listener() {
//            public void handleEvent(Event event) {
//                if (event.type == SWT.Activate) {
//					activateEditor(innerEditor);
//				}
//            }
//        });
	}
	
	public void addMouseListenerToEditors(MouseListener listener) {
		for (T innerEditor : innerEditors) {
			if (innerEditor instanceof IViewerProvider) {
				((IViewerProvider) innerEditor).getViewer().getControl().addMouseListener(listener);
			}
		}
	}
	
	public T getActiveEditor() {
		return innerEditors.get(folder.getSelectionIndex());
	}

	public void switchTo(T innerEditor) {
		if (indexOf(innerEditor) >= 0) {
			folder.setSelection(indexOf(innerEditor));
		}
	}

	private int indexOf(T innerEditor) {
		return innerEditors.indexOf(innerEditor);
	}
}
