blob: 61f1dcf1de696d4381984b5e8ba0f124688628bd [file] [log] [blame]
/*******************************************************************************
* 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.model.application.ui.basic.MStackElement;
import org.eclipse.e4.ui.widgets.CTabFolder;
import org.eclipse.e4.ui.workbench.IPresentationEngine;
import org.eclipse.e4.ui.workbench.modeling.EPartService;
import org.eclipse.swt.graphics.Point;
/**
*
*/
public class PartDragAgent extends DragAgent {
public PartDragAgent(DnDManager manager) {
super(manager);
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.e4.ui.workbench.addons.dndaddon.DragAgent#getElementToDrag(org.eclipse.e4.ui.
* workbench.addons.dndaddon.CursorInfo)
*/
@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;
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;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.e4.ui.workbench.addons.dndaddon.DragAgent#dragStart(org.eclipse.e4.ui.model.
* application.ui.MUIElement)
*/
@Override
public void dragStart(MUIElement element, DnDInfo info) {
super.dragStart(element, info);
if (dndManager.getFeedbackStyle() != DnDManager.SIMPLE)
dndManager.hostElement(element, 16, 10);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.e4.ui.workbench.addons.dndaddon.DragAgent#dragFinished()
*/
@Override
public void dragFinished() {
if (dragElement instanceof MPart) {
EPartService ps = dndManager.getDragWindow().getContext().get(EPartService.class);
ps.activate((MPart) dragElement);
}
super.dragFinished();
}
}