/*******************************************************************************
 * Copyright (c) 2010 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.e4.ui.workbench.addons.dndaddon;

import org.eclipse.e4.ui.model.application.ui.MUIElement;
import org.eclipse.e4.ui.model.application.ui.basic.MPart;
import org.eclipse.e4.ui.model.application.ui.basic.MPartStack;
import org.eclipse.e4.ui.workbench.swt.internal.AbstractPartRenderer;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.custom.CTabItem;
import org.eclipse.swt.graphics.Rectangle;

/**
 *
 */
public class StackDropAgent extends DropAgent {
	@Override
	public boolean canDrop(MUIElement dragElement, CursorInfo info) {
		if (info.curElement == dragElement.getParent()) {
			if (dragElement.getParent().getWidget() instanceof CTabFolder) {
				CTabFolder ctf = (CTabFolder) dragElement.getParent().getWidget();
				return ctf.getItemCount() > 1;
			}
		}

		if (dragElement instanceof MPart && info.curElement instanceof MPartStack)
			return true;

		return false;
	}

	@Override
	public boolean drop(MUIElement dragElement, CursorInfo info) {
		MPartStack dropStack = (MPartStack) info.curElement;

		if (dragElement.getParent() == info.curElement) {
			CTabFolder ctf = (CTabFolder) dropStack.getWidget();
			for (CTabItem cti : ctf.getItems()) {
				if (cti.getData(AbstractPartRenderer.OWNING_ME) == dragElement) {
					if (info.itemIndex >= 0 && ctf.indexOf(cti) < info.itemIndex)
						info.itemIndex--;
				}
			}
		}

		if (dragElement.getParent() != null) {
			dragElement.getParent().getChildren().remove(dragElement);
		}

		if (info.itemIndex == -1) {
			dropStack.getChildren().add((MPart) dragElement);
		} else {
			dropStack.getChildren().add(info.itemIndex, (MPart) dragElement);
		}
		dropStack.setSelectedElement((MPart) dragElement);

		return true;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.e4.workbench.ui.renderers.swt.dnd.DropAgent#getRectangle
	 * (org.eclipse.e4.ui.model.application.ui.MUIElement,
	 * org.eclipse.e4.workbench.ui.renderers.swt.dnd.CursorInfo)
	 */
	@Override
	public Rectangle getRectangle(MUIElement dragElement, CursorInfo info) {
		CTabFolder ctf = (CTabFolder) info.curElement.getWidget();
		if (info.itemElement != null) {
			if (info.curElement.getWidget() instanceof CTabFolder) {
				for (CTabItem cti : ctf.getItems()) {
					if (cti.getData(AbstractPartRenderer.OWNING_ME) == info.itemElement) {
						Rectangle itemRect = cti.getBounds();
						itemRect.width = 3;
						return cti.getDisplay().map(cti.getParent(), null, itemRect);
					}
				}
			}
		} else {
			if (ctf.getItemCount() == 0) {
				Rectangle ctfBounds = ctf.getBounds();
				ctfBounds.height = ctf.getTabHeight();
				ctfBounds.width = 3;
				return ctf.getDisplay().map(ctf, null, ctfBounds);
			}

			CTabItem cti = ctf.getItem(ctf.getItemCount() - 1);
			Rectangle itemRect = cti.getBounds();
			itemRect.x = (itemRect.x + itemRect.width) - 3;
			itemRect.width = 3;
			return cti.getDisplay().map(cti.getParent(), null, itemRect);
		}
		return null;
	}

}
