/*******************************************************************************
* Copyright (c) 2013, 2015 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.internal.workbench.swt.AbstractPartRenderer;
import org.eclipse.e4.ui.model.application.MApplication;
import org.eclipse.e4.ui.model.application.ui.MElementContainer;
import org.eclipse.e4.ui.model.application.ui.MUIElement;
import org.eclipse.e4.ui.model.application.ui.basic.MBasicFactory;
import org.eclipse.e4.ui.model.application.ui.basic.MWindow;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
class DragHost {
public static final String DragHostId = "dragHost"; //$NON-NLS-1$
MUIElement dragElement;
MElementContainer<MUIElement> originalParent;
int originalIndex;
MWindow baseWindow;
int xOffset = 20;
int yOffset = 20;
private MWindow dragWindow;
public DragHost(Shell shell) {
dragWindow = (MWindow) shell.getData(AbstractPartRenderer.OWNING_ME);
baseWindow = (MWindow) shell.getParent().getData(
AbstractPartRenderer.OWNING_ME);
dragElement = dragWindow.getChildren().get(0);
}
public DragHost(MUIElement element) {
assert (dragElement != null);
dragElement = element;
originalParent = dragElement.getParent();
originalIndex = originalParent.getChildren().indexOf(element);
baseWindow = getWindow();
assert (baseWindow != null && baseWindow.getWidget() != null);
attach();
}
public Shell getShell() {
return (Shell) dragWindow.getWidget();
}
public MWindow getModel() {
return dragWindow;
}
public void setLocation(int x, int y) {
getShell().setLocation(x + xOffset, y + yOffset);
}
private MWindow getWindow() {
MUIElement pe = originalParent;
while (pe != null && !(pe instanceof MApplication)) {
if (pe instanceof MWindow) {
return (MWindow) pe;
}
pe = pe.getParent();
}
return null;
}
private void attach() {
dragElement.getParent().getChildren().remove(dragElement);
((Shell) baseWindow.getWidget()).getDisplay().update();
dragWindow = MBasicFactory.INSTANCE.createWindow();
dragWindow.getTags().add(DragHostId);
// define the initial location and size for the window
Point cp = ((Shell) baseWindow.getWidget()).getDisplay()
.getCursorLocation();
Point size = new Point(200, 200);
if (dragElement.getWidget() instanceof Control) {
Control ctrl = (Control) dragElement.getWidget();
size = ctrl.getSize();
} else if (dragElement.getWidget() instanceof ToolItem) {
ToolItem ti = (ToolItem) dragElement.getWidget();
Rectangle bounds = ti.getBounds();
size = new Point(bounds.width + 3, bounds.height + 3);
}
dragWindow.setX(cp.x + xOffset);
dragWindow.setY(cp.y + yOffset);
dragWindow.setWidth(size.x);
dragWindow.setHeight(size.y);
// add the window as a child of the base window
baseWindow.getWindows().add(dragWindow);
getShell().layout(getShell().getChildren(), SWT.CHANGED | SWT.DEFER);
getShell().setVisible(true);
}
public void drop(MElementContainer<MUIElement> newContainer, int itemIndex) {
if (dragElement.getParent() != null) {
dragElement.getParent().getChildren().remove(dragElement);
}
if (itemIndex >= 0) {
newContainer.getChildren().add(itemIndex, dragElement);
} else {
newContainer.getChildren().add(dragElement);
}
newContainer.setSelectedElement(dragElement);
if (dragElement.getWidget() instanceof ToolItem) {
ToolItem ti = (ToolItem) dragElement.getWidget();
ToolBar tb = ti.getParent();
tb.layout(true);
tb.getParent()
.layout(new Control[] { tb }, SWT.CHANGED | SWT.DEFER);
}
baseWindow.getWindows().remove(dragWindow);
newContainer.setSelectedElement(dragElement);
if (getShell() != null) {
getShell().dispose();
}
}
public void cancel() {
drop(originalParent, originalIndex);
}
public MUIElement getDragElement() {
return dragElement;
}
/**
*
*/
public void dispose() {
// TODO Auto-generated method stub
}
}