/*******************************************************************************
 * Copyright (c) 2000, 2017 IBM Corporation 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.dltk.ui.browsing;

import java.util.List;

import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.ListenerList;
import org.eclipse.dltk.core.IScriptFolder;
import org.eclipse.jface.viewers.IBaseLabelProvider;
import org.eclipse.jface.viewers.IContentProvider;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.IOpenListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.swt.events.HelpListener;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Item;
import org.eclipse.swt.widgets.Widget;

/**
 * Wrapper who transfers listeners and filters and to which clients can refer.
 *
 * @deprecated needs to be replaced by a manager who handles transfer of
 *             listeners and filters
 */
@Deprecated
class PackageViewerWrapper extends StructuredViewer {

	private StructuredViewer fViewer;
	private ListenerList fListenerList;
	private ListenerList<ISelectionChangedListener> fSelectionChangedListenerList;
	private ListenerList<ISelectionChangedListener> fPostSelectionChangedListenerList;

	public PackageViewerWrapper() {
		fListenerList = new ListenerList(ListenerList.IDENTITY);
		fPostSelectionChangedListenerList = new ListenerList<>(
				ListenerList.IDENTITY);
		fSelectionChangedListenerList = new ListenerList<>(
				ListenerList.IDENTITY);
	}

	public void setViewer(StructuredViewer viewer) {
		Assert.isNotNull(viewer);

		StructuredViewer oldViewer = fViewer;
		fViewer = viewer;

		if (fViewer.getContentProvider() != null)
			super.setContentProvider(fViewer.getContentProvider());
		transferFilters(oldViewer);
		transferListeners();
	}

	StructuredViewer getViewer() {
		return fViewer;
	}

	private void transferFilters(StructuredViewer oldViewer) {
		// set filters
		if (oldViewer != null) {
			ViewerFilter[] filters = oldViewer.getFilters();
			for (int i = 0; i < filters.length; i++) {
				ViewerFilter filter = filters[i];
				fViewer.addFilter(filter);
			}
		}
	}

	private void transferListeners() {

		for (ISelectionChangedListener listener : fPostSelectionChangedListenerList) {
			fViewer.addPostSelectionChangedListener(listener);
		}

		for (ISelectionChangedListener listener : fSelectionChangedListenerList) {
			fViewer.addSelectionChangedListener(listener);
		}

		// Add all other listeners
		Object[] listeners = fListenerList.getListeners();
		for (int i = 0; i < listeners.length; i++) {
			Object object = listeners[i];

			if (object instanceof IOpenListener) {
				IOpenListener listener = (IOpenListener) object;
				addOpenListener(listener);
			} else if (object instanceof HelpListener) {
				HelpListener listener = (HelpListener) object;
				addHelpListener(listener);
			} else if (object instanceof IDoubleClickListener) {
				IDoubleClickListener listener = (IDoubleClickListener) object;
				addDoubleClickListener(listener);
			}
		}
	}

	@Override
	public void setSelection(ISelection selection, boolean reveal) {
		if (selection instanceof IStructuredSelection) {
			IStructuredSelection sel = (IStructuredSelection) selection;

			// try and give the two a common super class
			IContentProvider provider = getContentProvider();
			if (provider instanceof LogicalPackagesProvider) {
				LogicalPackagesProvider fprovider = (LogicalPackagesProvider) provider;

				Object object = sel.getFirstElement();
				if (object instanceof IScriptFolder) {
					IScriptFolder pkgFragment = (IScriptFolder) object;
					LogicalPackage logicalPkg = fprovider
							.findLogicalPackage(pkgFragment);
					if (logicalPkg != null)
						object = logicalPkg;
					else
						object = pkgFragment;
				}
				if (object != null)
					fViewer.setSelection(new StructuredSelection(object),
							reveal);
				else
					fViewer.setSelection(StructuredSelection.EMPTY, reveal);
			}
		} else
			fViewer.setSelection(selection, reveal);
	}

	@Override
	public void addPostSelectionChangedListener(
			ISelectionChangedListener listener) {
		fPostSelectionChangedListenerList.add(listener);
		fViewer.addPostSelectionChangedListener(listener);
	}

	@Override
	public void addSelectionChangedListener(
			ISelectionChangedListener listener) {
		fSelectionChangedListenerList.add(listener);
		fViewer.addSelectionChangedListener(listener);
	}

	@Override
	public void addDoubleClickListener(IDoubleClickListener listener) {
		fViewer.addDoubleClickListener(listener);
		fListenerList.add(listener);
	}

	@Override
	public void addOpenListener(IOpenListener listener) {
		fViewer.addOpenListener(listener);
		fListenerList.add(listener);
	}

	@Override
	public void addHelpListener(HelpListener listener) {
		fViewer.addHelpListener(listener);
		fListenerList.add(listener);
	}

	@Override
	public void removeSelectionChangedListener(
			ISelectionChangedListener listener) {
		fViewer.removeSelectionChangedListener(listener);
		fSelectionChangedListenerList.remove(listener);
	}

	@Override
	public void removePostSelectionChangedListener(
			ISelectionChangedListener listener) {
		fViewer.removePostSelectionChangedListener(listener);
		fPostSelectionChangedListenerList.remove(listener);
	}

	@Override
	public void removeHelpListener(HelpListener listener) {
		fListenerList.remove(listener);
		fViewer.removeHelpListener(listener);
	}

	@Override
	public void removeDoubleClickListener(IDoubleClickListener listener) {
		fViewer.removeDoubleClickListener(listener);
		fListenerList.remove(listener);
	}

	@Override
	public void removeOpenListener(IOpenListener listener) {
		fViewer.removeOpenListener(listener);
		fListenerList.remove(listener);
	}

	// --------- simply delegate to wrapped viewer ---------
	@Override
	public Control getControl() {
		return fViewer.getControl();
	}

	@Override
	public void addFilter(ViewerFilter filter) {
		fViewer.addFilter(filter);
	}

	@Override
	public void setFilters(ViewerFilter... filters) {
		fViewer.setFilters(filters);
	}

	@Override
	public void refresh() {
		fViewer.refresh();
	}

	@Override
	public void removeFilter(ViewerFilter filter) {
		fViewer.removeFilter(filter);
	}

	@Override
	public ISelection getSelection() {
		return fViewer.getSelection();
	}

	@Override
	public void refresh(boolean updateLabels) {
		fViewer.refresh(updateLabels);
	}

	@Override
	public void refresh(Object element, boolean updateLabels) {
		fViewer.refresh(element, updateLabels);
	}

	@Override
	public void refresh(Object element) {
		fViewer.refresh(element);
	}

	@Override
	public void resetFilters() {
		fViewer.resetFilters();
	}

	@Override
	public void reveal(Object element) {
		fViewer.reveal(element);
	}

	@Override
	public void setContentProvider(IContentProvider contentProvider) {
		fViewer.setContentProvider(contentProvider);
	}

	@Override
	public void setSorter(ViewerSorter sorter) {
		fViewer.setSorter(sorter);
	}

	@Override
	public void setComparator(ViewerComparator comparator) {
		fViewer.setComparator(comparator);
	}

	@Override
	public void setUseHashlookup(boolean enable) {
		fViewer.setUseHashlookup(enable);
	}

	@Override
	public Widget testFindItem(Object element) {
		return fViewer.testFindItem(element);
	}

	@Override
	public void update(Object element, String[] properties) {
		fViewer.update(element, properties);
	}

	@Override
	public void update(Object[] elements, String[] properties) {
		fViewer.update(elements, properties);
	}

	@Override
	public IContentProvider getContentProvider() {
		return fViewer.getContentProvider();
	}

	@Override
	public Object getInput() {
		return fViewer.getInput();
	}

	@Override
	public IBaseLabelProvider getLabelProvider() {
		return fViewer.getLabelProvider();
	}

	@Override
	public void setLabelProvider(IBaseLabelProvider labelProvider) {
		fViewer.setLabelProvider(labelProvider);
	}

	@Override
	public Object getData(String key) {
		return fViewer.getData(key);
	}

	@Override
	public Item scrollDown(int x, int y) {
		return fViewer.scrollDown(x, y);
	}

	@Override
	public Item scrollUp(int x, int y) {
		return fViewer.scrollUp(x, y);
	}

	@Override
	public void setData(String key, Object value) {
		fViewer.setData(key, value);
	}

	@Override
	public void setSelection(ISelection selection) {
		fViewer.setSelection(selection);
	}

	@Override
	public boolean equals(Object obj) {
		return fViewer.equals(obj);
	}

	@Override
	public int hashCode() {
		return fViewer.hashCode();
	}

	@Override
	public String toString() {
		return fViewer.toString();
	}

	public void setViewerInput(Object input) {
		fViewer.setInput(input);
	}

	// need to provide implementation for abstract methods
	@Override
	protected Widget doFindInputItem(Object element) {
		return ((IPackagesViewViewer) fViewer).doFindInputItem(element);
	}

	@Override
	protected Widget doFindItem(Object element) {
		return ((IPackagesViewViewer) fViewer).doFindItem(element);
	}

	@Override
	protected void doUpdateItem(Widget item, Object element, boolean fullMap) {
		((IPackagesViewViewer) fViewer).doUpdateItem(item, element, fullMap);
	}

	@Override
	protected List getSelectionFromWidget() {
		return ((IPackagesViewViewer) fViewer).getSelectionFromWidget();
	}

	@Override
	protected void internalRefresh(Object element) {
		((IPackagesViewViewer) fViewer).internalRefresh(element);
	}

	@Override
	protected void setSelectionToWidget(List l, boolean reveal) {
		((IPackagesViewViewer) fViewer).setSelectionToWidget(l, reveal);
	}

}
