/******************************************************************************* * Copyright (c) 2012, 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 * Patrik Suzzi <psuzzi@gmail.com> - Bug 473184 ******************************************************************************/ 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.MTrimElement; import org.eclipse.e4.ui.model.application.ui.menu.MToolControl; import org.eclipse.e4.ui.widgets.ImageBasedFrame; import org.eclipse.e4.ui.workbench.IPresentationEngine; import org.eclipse.e4.ui.workbench.addons.minmax.TrimStack; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Shell; /** * */ public class IBFDragAgent extends DragAgent { private ImageBasedFrame frame; private Shell ds; /** * @param manager */ public IBFDragAgent(DnDManager manager) { super(manager); } @Override public MUIElement getElementToDrag(DnDInfo info) { if (!(info.curCtrl instanceof ImageBasedFrame)) { return null; } if (!(info.curElement instanceof MTrimElement)) { return null; } // Prevents dragging of trim elements tagged with 'NoMove'. if (info.curElement.getTags().contains(IPresentationEngine.NO_MOVE)) { return null; } ImageBasedFrame frame = (ImageBasedFrame) info.curCtrl; Rectangle handleRect = frame.getHandleRect(); handleRect = frame.getDisplay().map(frame, null, handleRect); if (handleRect.contains(info.cursorPos)) { dragElement = info.curElement; return info.curElement; } return null; } @Override public void dragStart(DnDInfo info) { super.dragStart(info); if (dragElement instanceof MToolControl) { MToolControl tc = (MToolControl) dragElement; if (tc.getObject() instanceof TrimStack) { TrimStack ts = (TrimStack) tc.getObject(); ts.showStack(false); } } if (dropAgent == null) { attachToCursor(info); } } private void attachToCursor(DnDInfo info) { frame = (ImageBasedFrame) dragElement.getWidget(); dragElement.setVisible(false); dragElement.getTags().add("LockVisibility"); if (ds == null) { ds = new Shell(dndManager.getDragShell(), SWT.NO_TRIM); } frame.setParent(ds); frame.setLocation(0, 0); ds.setSize(frame.getSize()); ds.setLocation(info.cursorPos.x - 5, info.cursorPos.y - 5); ds.open(); info.update(); } @Override public void track(DnDInfo info) { super.track(info); if (dropAgent != null && ds != null && !ds.isDisposed() && ds.getChildren().length == 0) { ds.dispose(); ds = null; } if (dropAgent == null) { attachToCursor(info); } if (ds != null) { ds.setLocation(info.cursorPos.x - 5, info.cursorPos.y - 5); } } @Override public void dragFinished(boolean performDrop, DnDInfo info) { dragElement.getTags().remove("LockVisibility"); dragElement.setVisible(true); super.dragFinished(performDrop, info); // NOTE: the dragElement should no longer be a child of the shell if (ds != null && !ds.isDisposed()) { ds.dispose(); } ds = null; } }