/*********************************************************************
* Copyright (c) 2005, 2019 SAP SE
*
* 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:
*    SAP SE - initial API, implementation and documentation
*    mwenz - Bug 502091 - NPE in GFDirectEditManager.bringDown
*
* SPDX-License-Identifier: EPL-2.0
**********************************************************************/
package org.eclipse.graphiti.ui.internal.editor;

import org.eclipse.draw2d.Figure;
import org.eclipse.draw2d.LightweightSystem;
import org.eclipse.draw2d.MarginBorder;
import org.eclipse.draw2d.Viewport;
import org.eclipse.gef.GraphicalViewer;
import org.eclipse.gef.LayerConstants;
import org.eclipse.gef.editparts.LayerManager;
import org.eclipse.gef.editparts.SimpleRootEditPart;
import org.eclipse.graphiti.ui.internal.fixed.FixedScrollableThumbnail;
import org.eclipse.graphiti.ui.internal.services.GraphitiUiInternal;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IPartListener;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.part.ViewPart;

/**
 * A Thumbnail view for <code>GraphicalViewers</code>. The class scans all
 * editparts and viewparts of the active WorkbenchPage for GraphicalViewer
 * Adapters and shows a thumbnail view for the first one found. Views are
 * scanned first.
 * 
 * @noinstantiate This class is not intended to be instantiated by clients.
 * @noextend This class is not intended to be subclassed by clients.
 */
public class ThumbNailView extends ViewPart implements IPartListener {

	public static final String VIEW_ID = "org.eclipse.graphiti.ui.internal.editor.thumbnailview"; //$NON-NLS-1$

	private FixedScrollableThumbnail _thumbnail;

	private LightweightSystem _lws;

	private IWorkbenchPart _workbenchPart;

	private GraphicalViewer _graphicalViewer;

	/**
	 * Creates a new ThumbNailView, which registers as PartListener at the
	 * active WorkbenchWindow.
	 */
	public ThumbNailView() {
		IWorkbenchWindow workbenchWindow = GraphitiUiInternal.getWorkbenchService().getActiveOrFirstWorkbenchWindow();
		workbenchWindow.getPartService().addPartListener(this);
	}

	@Override
	public void createPartControl(Composite parent) {
		Canvas overview = new Canvas(parent, SWT.NONE);
		_lws = new LightweightSystem(overview);
		refreshThumbnailViewer();
	}

	@Override
	public void setFocus() {
		// nothing to do
	}

	@Override
	public void dispose() {
		IWorkbenchWindow workbenchWindow = GraphitiUiInternal.getWorkbenchService().getActiveOrFirstWorkbenchWindow();
		if (workbenchWindow != null) {
			workbenchWindow.getPartService().removePartListener(this);
			super.dispose();
			clearThumbnail();
		}
	}

	public void partActivated(IWorkbenchPart part) {
		if (!part.equals(_workbenchPart)) {
			GraphicalViewer viewer = (GraphicalViewer) part.getAdapter(GraphicalViewer.class);
			if (viewer != null) {
				createThumbNailViewer(part);
			}
		}
	}

	public void partBroughtToTop(IWorkbenchPart part) {
		// nothing to do
	}

	public void partClosed(IWorkbenchPart part) {
		if (part.equals(_workbenchPart)) {
			refreshThumbnailViewer();
		}
	}

	public void partDeactivated(IWorkbenchPart part) {
		// clearThumbnail();
	}

	private void clearThumbnail() {
		if (_thumbnail != null) {
			_thumbnail.deactivate();
			_thumbnail = null;
		}
	}

	public void partOpened(IWorkbenchPart part) {
		GraphicalViewer viewer = (GraphicalViewer) part.getAdapter(GraphicalViewer.class);
		if (viewer != null) {
			createThumbNailViewer(part);
		}
	}

	private void refreshThumbnailViewer() {
		IWorkbenchPart part = findGraphicalViewerAdaptable();
		createThumbNailViewer(part);
	}

	private IWorkbenchPart findGraphicalViewerAdaptable() {
		IWorkbenchWindow window = GraphitiUiInternal.getWorkbenchService().getActiveOrFirstWorkbenchWindow();
		if (window == null)
			return null;
		IWorkbenchPage page = window.getActivePage();
		if (page == null)
			return null;

		IWorkbenchPart activePart = page.getActivePart();
		if (activePart == null) {
			return null;
		}

		GraphicalViewer currentViewer = (GraphicalViewer) activePart.getAdapter(GraphicalViewer.class);
		if (currentViewer != null) {
			return activePart;
		}

		return null;
	}

	private void createThumbNailViewer(IWorkbenchPart part) {
		if (part != null) {
			_graphicalViewer = (GraphicalViewer) part.getAdapter(GraphicalViewer.class);
			_workbenchPart = part;
			if (_graphicalViewer != null) {
				SimpleRootEditPart rootEditPart = (SimpleRootEditPart) _graphicalViewer.getRootEditPart();
				_thumbnail = new FixedScrollableThumbnail((Viewport) rootEditPart.getFigure());
				_thumbnail.setBorder(new MarginBorder(3));
				if (rootEditPart instanceof LayerManager)
					_thumbnail.setSource(((LayerManager) rootEditPart).getLayer(LayerConstants.PRINTABLE_LAYERS));
				_lws.setContents(_thumbnail);
			}
		} else {
			_graphicalViewer = null;
			_workbenchPart = null;
			_lws.setContents(new Figure());
		}
	}

}