/******************************************************************************* * Copyright (c) 2010, 2014 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.model.application.ui.basic.MStackElement; import org.eclipse.e4.ui.workbench.IPresentationEngine; import org.eclipse.e4.ui.workbench.modeling.EPartService; import org.eclipse.swt.custom.CTabFolder; import org.eclipse.swt.graphics.Point; /** * */ public class PartDragAgent extends DragAgent { public PartDragAgent(DnDManager manager) { super(manager); } @Override public MUIElement getElementToDrag(DnDInfo info) { if (!(info.curElement instanceof MPartStack)) { return null; } MPartStack stack = (MPartStack) info.curElement; // Drag a part that is in a stack if (info.itemElement instanceof MStackElement) { // Prevent dragging 'No Move' parts if (info.itemElement.getTags().contains(IPresentationEngine.NO_MOVE)) { return null; } // If it's an MPart only drag the part itself if (info.itemElement instanceof MPart) { return info.itemElement; } // check if we want to drag the placeholder or default to dragging the whole stack int tbrCount = dndManager.getModelService().countRenderableChildren(stack); if (tbrCount > 1 || dndManager.getModelService().isLastEditorStack(stack)) { dragElement = info.itemElement; return info.itemElement; } } // Drag a complete stack // Only allow a drag to start if we're a CTabFolder if (!(stack.getWidget() instanceof CTabFolder)) { return null; } // Only allow a drag to start if we're inside the 'tab area' of the CTF CTabFolder ctf = (CTabFolder) stack.getWidget(); Point ctfPos = ctf.getDisplay().map(null, ctf, info.cursorPos); if (ctfPos.y > ctf.getTabHeight()) { return null; } // Prevent dragging 'No Move' stacks if (stack.getTags().contains(IPresentationEngine.NO_MOVE)) { return null; } // Prevent dragging the last stack out of the shared area if (dndManager.getModelService().isLastEditorStack(stack)) { return null; } dragElement = info.curElement; return info.curElement; } @Override public void dragStart(DnDInfo info) { super.dragStart(info); if (dndManager.getFeedbackStyle() != DnDManager.SIMPLE) { dndManager.hostElement(dragElement, 16, 10); } } @Override public void dragFinished(boolean performDrop, DnDInfo info) { if (dragElement instanceof MPart) { EPartService ps = dndManager.getDragWindow().getContext().get(EPartService.class); ps.activate((MPart) dragElement); } super.dragFinished(performDrop, info); } }