package com.windowtester.gef.test.views;
import org.eclipse.draw2d.FigureCanvas;
import org.eclipse.draw2d.MouseEvent;
import org.eclipse.draw2d.MouseListener;
import org.eclipse.draw2d.RectangleFigure;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DragSource;
import org.eclipse.swt.dnd.DragSourceEvent;
import org.eclipse.swt.dnd.DragSourceListener;
import org.eclipse.swt.dnd.DropTarget;
import org.eclipse.swt.dnd.DropTargetAdapter;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.ui.part.ViewPart;
public class DNDDraw2DView extends ViewPart
{
public static final String CANVAS1_NAME = "DNDDraw2DView.canvas1";
public static final String CANVAS2_NAME = "DNDDraw2DView.canvas2";
private static final Color RED = new Color(null, 255, 0, 0);
private static final Color GREEN = new Color(null, 0, 255, 0);
private static final Color BLUE = new Color(null, 0, 0, 255);
private static int _DROP_COUNT = 0;
private static int _CONTEXT_COUNT = 0;
private FigureCanvas _canvas1;
@Override
public void createPartControl(Composite parent)
{
Composite container = new Composite(parent, SWT.NONE);
GridLayout gl = new GridLayout(3, true);
gl.marginHeight=10;
gl.marginWidth=10;
gl.verticalSpacing=10;
container.setLayout(gl);
int operations = DND.DROP_COPY;
Transfer[] types = new Transfer[] { Draw2dTestTransfer.getInstance() };
_canvas1 = new FigureCanvas(container);
_canvas1.setBackground(RED);
_canvas1.setData("name", CANVAS1_NAME);
RectangleFigure figure = new RectangleFigure();
figure.setBounds(new Rectangle(0, 0, 200, 200));
figure.setBackgroundColor(BLUE);
figure.addMouseListener(new PanelMouseAdapter());
_canvas1.setContents(figure);
GridData gd = new GridData();
gd.heightHint = 200;
gd.widthHint = 200;
_canvas1.setLayoutData(gd);
DragSourceListener dragSourceListener = new DragSourceListener()
{
public void dragStart(DragSourceEvent event)
{
event.doit = true;
}
public void dragSetData (DragSourceEvent event)
{
}
public void dragFinished(DragSourceEvent event)
{
}
};
DragSource source = new DragSource(_canvas1, operations);
source.setTransfer(types);
source.addDragListener (dragSourceListener);
Label middleLabel = new Label(container, SWT.NONE);
middleLabel.setText("---DRAG FROM LEFT RO RIGHT-->");
FigureCanvas canvas2 = new FigureCanvas(container);
canvas2.setBackground(GREEN);
canvas2.setData("name", CANVAS2_NAME);
gd = new GridData();
gd.heightHint = 200;
gd.widthHint = 200;
canvas2.setLayoutData(gd);
DropTarget target = new DropTarget(canvas2, operations);
target.setTransfer(types);
target.addDropListener( new DropTargetAdapter()
{
public void dragEnter(DropTargetEvent event)
{
event.detail = DND.DROP_COPY;
return;
}
public void drop(DropTargetEvent event)
{
_DROP_COUNT++;
System.out.println("--> DROPPED: " + _DROP_COUNT);
}
});
}
public void renderContextMenu(int x, int y)
{
final Menu menu = new Menu(_canvas1);
MenuItem mi = new MenuItem(menu, SWT.PUSH);
TestAction action = new TestAction();
EventHandler handler = new EventHandler(action);
mi.addSelectionListener(handler);
mi.setText("Do &Something");
mi.setEnabled(true);
Point p = _canvas1.toDisplay( x, y );
menu.setLocation( p );
menu.setVisible( true );
}
@Override
public void setFocus()
{
// TODO Auto-generated method stub
}
public static int getContextCount()
{
return _CONTEXT_COUNT;
}
public static int getDropCount()
{
return _DROP_COUNT;
}
private class PanelMouseAdapter extends MouseListener.Stub
{
public void mouseReleased(MouseEvent e)
{
if(e.button == 3)
{
renderContextMenu(e.x, e.y);
}
}
}
private class EventHandler implements SelectionListener
{
private IAction _action;
public EventHandler(IAction action)
{
_action = action;
}
public void widgetSelected(SelectionEvent e)
{
_action.run();
}
public void widgetDefaultSelected(SelectionEvent e)
{
}
}
private class TestAction extends Action
{
public void run()
{
_CONTEXT_COUNT++;
System.err.println("====> " + _CONTEXT_COUNT);
}
}
}