blob: 0fb951e2b9bff04a9cecb7cebc7f33beb443e9ce [file] [log] [blame]
// RAP [rh] DnD not supported
///*******************************************************************************
// * Copyright (c) 2004, 2008 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.ui.internal;
//
//import java.util.Iterator;
//import java.util.List;
//
//import org.eclipse.jface.util.Geometry;
//import org.eclipse.swt.SWT;
//import org.eclipse.swt.graphics.Cursor;
//import org.eclipse.swt.graphics.Point;
//import org.eclipse.swt.graphics.Rectangle;
//import org.eclipse.swt.widgets.Composite;
//import org.eclipse.swt.widgets.Control;
//import org.eclipse.ui.internal.dnd.DragBorder;
//import org.eclipse.ui.internal.dnd.DragUtil;
//import org.eclipse.ui.internal.dnd.IDragOverListener;
//import org.eclipse.ui.internal.dnd.IDropTarget;
//import org.eclipse.ui.internal.dnd.IDropTarget2;
//import org.eclipse.ui.internal.layout.IWindowTrim;
//import org.eclipse.ui.internal.layout.LayoutUtil;
//import org.eclipse.ui.internal.layout.TrimDescriptor;
//import org.eclipse.ui.internal.layout.TrimLayout;
//import org.eclipse.ui.internal.layout.TrimToolBarBase;
//
///**
// */
///*package*/class TrimDropTarget implements IDragOverListener {
//
// private final class ActualTrimDropTarget implements IDropTarget2 {
// public IWindowTrim draggedTrim;
//
// // tracking parameters
// private DragBorder border = null;
// private int dockedArea;
//
// // Holder for the position of trim that is 'floating' with the cursor
// private int cursorAreaId;
// private int initialAreaId;
// private IWindowTrim initialInsertBefore;
// private Rectangle initialLocation;
//
// /**
// * Constructor
// */
// private ActualTrimDropTarget() {
// super();
//
// draggedTrim = null;
// dockedArea = SWT.NONE;
//
// initialAreaId = SWT.NONE;
// initialInsertBefore = null;
// }
//
// /**
// * This method is used to delineate separate trims dragging events. The -first- drag
// * event will set this and then it will remain constant until the drag gesture is done;
// * either by dropping or escaping. Once the gesture is finished the trim value is set
// * back to 'null'.
// *
// * @param trim The trim item currently being dragged.
// */
// public void startDrag(IWindowTrim trim) {
// // Are we starting a new drag?
// if (draggedTrim != trim) {
// // remember the dragged trim
// draggedTrim = trim;
//
// // Remember the location that we were in initially so we
// // can go back there on an cancel...
// initialAreaId = layout.getTrimAreaId(draggedTrim.getControl());
//
// // Determine who we were placed 'before' in the trim
// initialInsertBefore = getInsertBefore(initialAreaId, draggedTrim);
//
// // Remember the location that the control used to be at for animation purposes
// initialLocation = DragUtil.getDisplayBounds(draggedTrim.getControl());
//
// // The dragged trim is always initially docked
// dockedArea = initialAreaId;
// }
// }
//
// /**
// * Determine the trim area from the point. To avoid clashing at the 'corners' due to extending the trim area's
// * rectangles we first ensure that the point is not actually -within- a trim area before we check the extended
// * rectangles.
// *
// * @param pos The current cursor pos
// * @return the Trim area that the cursor is in or SWT.NONE if the point is not in an area
// */
// private int getTrimArea(Point pos) {
// // First, check if we're actually -within- a trim area (i.e. no boundary extensions)
// int areaId = getTrimArea(pos, 0);
//
// // If we are not inside a trim area...are we 'close' to one?
// if (areaId == SWT.NONE) {
// areaId = getTrimArea(pos, TrimDragPreferences.getThreshold());
// }
//
// // not inside any trim area
// return areaId;
// }
//
// /**
// * Checks the trims areas against the given position. Each trim area is 'extended' into
// * the workbench page by the value of <code>extendedBoundaryWidth</code> before the checking
// * takes place.
// *
// * @param pos The point to check against
// * @param extendedBoundaryWidth The amount to extend the trim area's 'inner' edge by
// *
// * @return The trim area or SWT.NONE if the point is not within any extended trim area's rect.
// */
// private int getTrimArea(Point pos, int extendedBoundaryWidth) {
// int[] areaIds = layout.getAreaIds();
// for (int i = 0; i < areaIds.length; i++) {
// Rectangle trimRect = layout.getTrimRect(windowComposite, areaIds[i]);
// trimRect = Geometry.toControl(windowComposite, trimRect);
//
// // Only check 'valid' sides
// if ( (areaIds[i] & getValidSides()) != SWT.NONE) {
// // TODO: more confusion binding 'areaIds' to SWT 'sides'
// switch (areaIds[i]) {
// case SWT.LEFT:
// trimRect.width += extendedBoundaryWidth;
//
// if (pos.y >= trimRect.y &&
// pos.y <= (trimRect.y+trimRect.height) &&
// pos.x <= (trimRect.x+trimRect.width)) {
// return areaIds[i];
// }
// break;
// case SWT.RIGHT:
// trimRect.x -= extendedBoundaryWidth;
// trimRect.width += extendedBoundaryWidth;
//
// if (pos.y >= trimRect.y &&
// pos.y <= (trimRect.y+trimRect.height) &&
// pos.x >= trimRect.x) {
// return areaIds[i];
// }
// break;
// case SWT.TOP:
// trimRect.height += extendedBoundaryWidth;
//
// if (pos.x >= trimRect.x &&
// pos.x <= (trimRect.x+trimRect.width) &&
// pos.y <= (trimRect.y+trimRect.height)) {
// return areaIds[i];
// }
// break;
// case SWT.BOTTOM:
// trimRect.y -= extendedBoundaryWidth;
// trimRect.height += extendedBoundaryWidth;
//
// if (pos.x >= trimRect.x &&
// pos.x <= (trimRect.x+trimRect.width) &&
// pos.y >= trimRect.y) {
// return areaIds[i];
// }
// break;
// }
// }
// }
//
// // not inside any trim area
// return SWT.NONE;
// }
//
// /**
// * Determine the window trim that the currently dragged trim should be inserted
// * before.
// * @param areaId The area id that is being checked
// * @param pos The position used to determine the correct insertion trim
// * @return The trim to 'dock' the draggedTrim before
// */
// private IWindowTrim getInsertBefore(int areaId, Point pos) {
// boolean isHorizontal = (areaId == SWT.TOP) || (areaId == SWT.BOTTOM);
//
// // Walk the trim area and return the first one that the positon
// // is 'after'.
// List tDescs = layout.getTrimArea(areaId).getDescriptors();
// for (Iterator iter = tDescs.iterator(); iter.hasNext();) {
// TrimDescriptor desc = (TrimDescriptor) iter.next();
//
// // Skip ourselves
// if (desc.getTrim() == draggedTrim) {
// continue;
// }
//
// // Now, check
// Rectangle bb = desc.getCache().getControl().getBounds();
// Point center = Geometry.centerPoint(bb);
// if (isHorizontal) {
// if (pos.x < center.x) {
// return desc.getTrim();
// }
// }
// else {
// if (pos.y < center.y) {
// return desc.getTrim();
// }
// }
// }
//
// return null;
// }
//
// /**
// * Returns the trim that is 'before' the given trim in the given area
// *
// * @param areaId The areaId of the trim
// * @param trim The trim to find the element after
// *
// * @return The trim that the given trim is 'before'
// */
// private IWindowTrim getInsertBefore(int areaId, IWindowTrim trim) {
// List tDescs = layout.getTrimArea(areaId).getDescriptors();
// for (Iterator iter = tDescs.iterator(); iter.hasNext();) {
// TrimDescriptor desc = (TrimDescriptor) iter.next();
// if (desc.getTrim() == trim) {
// if (iter.hasNext()) {
// desc = (TrimDescriptor) iter.next();
// return desc.getTrim();
// }
// return null;
// }
// }
//
// return null;
// }
//
// /**
// * Recalculates the drop information based on the current cursor pos.
// *
// * @param pos The cursor position
// */
// public void track(Point pos) {
// // Convert the mouse positon into 'local' coords
// Rectangle r = new Rectangle(pos.x, pos.y, 1,1);
// r = Geometry.toControl(windowComposite, r);
// pos.x = r.x;
// pos.y = r.y;
//
// // Are we 'inside' a trim area ?
// cursorAreaId = getTrimArea(pos);
//
// // Provide tracking for the appropriate 'mode'
// if (cursorAreaId != SWT.NONE) {
// trackInsideTrimArea(pos);
// } else {
// trackOutsideTrimArea(pos);
// }
// }
//
// /**
// * Perform the feedback used when the cursor is 'inside' a particular trim area.
// * The current implementation will place the dragged trim into the trim area at
// * the location determined by the supplied point.
// *
// * @param pos The point to use to determine where in the trim area the dragged trim
// * should be located.
// */
// private void trackInsideTrimArea(Point pos) {
// // Where should we be?
// int newArea = getTrimArea(pos);
// IWindowTrim newInsertBefore = getInsertBefore(newArea, pos);
//
// // if we're currently undocked then we should dock
// boolean shouldDock = dockedArea == SWT.NONE;
//
// // If we're already docked then only update if there's a change in area or position
// if (dockedArea != SWT.NONE) {
// // Where are we now?
// IWindowTrim curInsertBefore = getInsertBefore(dockedArea, draggedTrim);
//
// // If we're already docked we should only update if there's a change
// shouldDock = dockedArea != newArea || curInsertBefore != newInsertBefore;
// }
//
// // Do we have to do anything?
// if (shouldDock) {
// // (Re)dock the trim in the new location
// dock(newArea, newInsertBefore);
// }
// }
//
// /**
// * Provide the dragging feedback when the cursor is -not- explicitly inside
// * a particular trim area.
// *
// */
// private void trackOutsideTrimArea(Point pos) {
// // If we -were- docked then undock
// if (dockedArea != SWT.NONE) {
// undock();
// }
//
// border.setLocation(pos, SWT.BOTTOM);
// }
//
// /**
// * Return the set of valid sides that a piece of trim can be docked on. We
// * arbitrarily extend this to include any areas that won't cause a change in orientation
// *
// * @return The extended drop 'side' set
// */
// private int getValidSides() {
// int result = draggedTrim.getValidSides();
// if (result == SWT.NONE) {
// return result;
// }
//
// // For now, if we can dock...we can dock -anywhere-
// return SWT.TOP | SWT.BOTTOM | SWT.LEFT | SWT.RIGHT;
// }
//
// /**
// * The user either cancelled the drag or tried to drop the trim in an invalid
// * area...put the trim back in the last location it was in
// */
// private void redock() {
// // animate the 'redock'
// Rectangle startRect = DragUtil.getDisplayBounds(draggedTrim.getControl());
// AnimationEngine.createTweakedAnimation(windowComposite.getShell(), 400, startRect, initialLocation);
//
// dock(initialAreaId, initialInsertBefore);
// }
//
// /* (non-Javadoc)
// * @see org.eclipse.ui.internal.dnd.IDropTarget#drop()
// */
// public void drop() {
// // If we aren't docked then restore the initial location
// if (dockedArea == SWT.NONE) {
// redock();
// }
// }
//
// /**
// * Remove the trim frmo its current 'docked' location and attach it
// * to the cursor...
// */
// private void undock() {
// // Remove the trim from the layout
// layout.removeTrim(draggedTrim);
// LayoutUtil.resize(draggedTrim.getControl());
//
// // Re-orient the widget to its -original- side and size
// draggedTrim.dock(initialAreaId);
// draggedTrim.getControl().setSize(initialLocation.width, initialLocation.height);
//
// // Create a new dragging border onto the dragged trim
// // Special check for TrimPart...should be generalized
// boolean wantsFrame = !(draggedTrim instanceof TrimToolBarBase);
// border = new DragBorder(windowComposite, draggedTrim.getControl(), wantsFrame);
//
// dockedArea = SWT.NONE;
// }
//
// /**
// * Return the 'undocked' trim to its previous location in the layout
// */
// private void dock(int areaId, IWindowTrim insertBefore) {
// // remove the drag 'border'
// if (border != null) {
// border.dispose();
// border = null;
// }
//
// // Update the trim's orientation if necessary
// draggedTrim.dock(areaId);
//
// // Add the trim into the layout
// layout.addTrim(areaId, draggedTrim, insertBefore);
// LayoutUtil.resize(draggedTrim.getControl());
//
// // Remember the area that we're currently docked in
// dockedArea = areaId;
// }
//
// /* (non-Javadoc)
// * @see org.eclipse.ui.internal.dnd.IDropTarget#getCursor()
// */
// public Cursor getCursor() {
// // If the trim isn't docked then show the 'no smoking' sign
// if (cursorAreaId == SWT.NONE) {
// return windowComposite.getDisplay().getSystemCursor(SWT.CURSOR_NO);
// }
//
// // It's docked; show the four-way arrow cursor
// return windowComposite.getDisplay().getSystemCursor(SWT.CURSOR_SIZEALL);
// }
//
// /* (non-Javadoc)
// * @see org.eclipse.ui.internal.dnd.IDropTarget#getSnapRectangle()
// */
// public Rectangle getSnapRectangle() {
// // TODO: KLUDGE!! We don't want to show -any- snap rect
// // but Tracker won't allow that so place it where it won't be visible
// return new Rectangle(100000, 0,0,0);
// }
//
// /* (non-Javadoc)
// * @see org.eclipse.ui.internal.dnd.IDropTarget2#dragFinished(boolean)
// */
// public void dragFinished(boolean dropPerformed) {
// // If we didn't perform a drop then restore the original position
// if (!dropPerformed && dockedArea == SWT.NONE) {
// // Force the dragged trim back into its original position...
// redock();
// }
//
// // Set the draggedTrim to null. This indicates that we're no longer
// // dragging the trim. The first call to the TrimDropTarget's 'drag' method
// // will reset this the next time a drag starts.
// draggedTrim = null;
// }
// }
//
// private ActualTrimDropTarget dropTarget;
//
// private TrimLayout layout;
// private Composite windowComposite;
//
// /**
// * Create a new drop target capable of accepting IWindowTrim items
// *
// * @param someComposite The control owning the TrimLayout
// * @param theWindow the workbenchWindow
// */
// public TrimDropTarget(Composite someComposite, WorkbenchWindow theWindow) {
// layout = (TrimLayout) someComposite.getLayout();
// windowComposite = someComposite;
//
// // Create an instance of a drop target to use
// dropTarget = new ActualTrimDropTarget();
// }
//
// /* (non-Javadoc)
// * @see org.eclipse.ui.internal.dnd.IDragOverListener#drag(org.eclipse.swt.widgets.Control, java.lang.Object, org.eclipse.swt.graphics.Point, org.eclipse.swt.graphics.Rectangle)
// */
// public IDropTarget drag(Control currentControl, Object draggedObject,
// Point position, final Rectangle dragRectangle) {
//
// // Have to be dragging trim
// if (!(draggedObject instanceof IWindowTrim)) {
// return null;
// }
//
// // OK, we're dragging trim. is it from -this- shell?
// IWindowTrim trim = (IWindowTrim) draggedObject;
// if (trim.getControl().getShell() != windowComposite.getShell()) {
// return null;
// }
//
// // If this is the -first- drag then inform the drop target
// if (dropTarget.draggedTrim == null) {
// dropTarget.startDrag(trim);
// }
//
// // Forward on to the 'actual' drop target for feedback
// dropTarget.track(position);
//
// // Spin the paint loop after every track
// windowComposite.getDisplay().update();
//
// return dropTarget;
// }
//}