/*******************************************************************************
 * Copyright (c) 2010, 2019 Mia-Software and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v2.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v20.html
 *
 * Contributors:
 *    Nicolas Bros (Mia-Software) - initial API and implementation
 *******************************************************************************/
package org.eclipse.modisco.infra.browser.uicore.examples.cnf;

import org.eclipse.core.resources.IFile;
import org.eclipse.modisco.infra.browser.uicore.CustomizableModelContentProvider;
import org.eclipse.modisco.infra.common.core.logging.MoDiscoLogger;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.navigator.resources.ProjectExplorer;

/**
 * @deprecated Will be replaced by EMF Facet,
 *             cf. https://bugs.eclipse.org/bugs/show_bug.cgi?id=470715
 */
@Deprecated
public class MoDiscoContentProvider extends CustomizableModelContentProvider {

	public MoDiscoContentProvider() {
		super(Activator.getDefault().getCustomizationManager());
	}

	@Override
	public Object[] getChildren(final Object parentElement) {
		if (parentElement instanceof IFile) {
			// hook the custom painter at the moment the extension is
			// effectively used
			hookCustomPainter();
			return getElements(parentElement);
		}
		return super.getChildren(parentElement);
	}

	@Override
	public boolean hasChildren(final Object element) {
		if (element instanceof IFile) {
			return true;
		}
		return super.hasChildren(element);
	}

	private static final String CUSTOM_PAINTER_INSTALLED = "modiscoCustomPainterInstalled"; //$NON-NLS-1$

	/**
	 * Hook the custom painter to the Project Explorer's tree widget, if it is
	 * not already installed. This painter is necessary to display some
	 * customizations, like struckthrough and underlined, Facet overlay icons,
	 * and a down-pointing arrow on ordered references.
	 */
	private void hookCustomPainter() {
		try {
			IViewPart viewPart = PlatformUI.getWorkbench().getActiveWorkbenchWindow()
					.getActivePage().findView(ProjectExplorer.VIEW_ID);
			if (viewPart instanceof ProjectExplorer) {
				ProjectExplorer projectExplorer = (ProjectExplorer) viewPart;
				Tree tree = projectExplorer.getCommonViewer().getTree();
				if (tree.getData(MoDiscoContentProvider.CUSTOM_PAINTER_INSTALLED) == null) {
					Activator.getDefault().getCustomizationManager().installCustomPainter(tree);
					tree.setData(MoDiscoContentProvider.CUSTOM_PAINTER_INSTALLED, Boolean.TRUE);
				}
			}
		} catch (Exception e) {
			MoDiscoLogger.logError(e, Activator.getDefault());
		}
	}
}
