/* * Copyright (c) 2012, 2013 Hemanta Sapkota. * 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: * Hemanta Sapkota (laex.pearl@gmail.com) */ package com.laex.cg2d.screeneditor.palette; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.draw2d.geometry.Point; import org.eclipse.draw2d.geometry.Rectangle; import org.eclipse.gef.EditPartViewer; import org.eclipse.gef.tools.MarqueeSelectionTool; import org.eclipse.gef.ui.parts.ScrollingGraphicalViewer; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseListener; import org.eclipse.swt.widgets.Control; import com.laex.cg2d.model.adapter.RectAdapter; import com.laex.cg2d.model.model.Shape; import com.laex.cg2d.model.model.ShapesDiagram; /*** * Class has to be public. * * @author hemantasapkota * */ public class CloneTool extends MarqueeSelectionTool { /** The start location. */ private Point startLocation; /** The end location. */ private Point endLocation; /** * Instantiates a new clone tool. */ public CloneTool() { super(); } /* * (non-Javadoc) * * @see org.eclipse.gef.tools.AbstractTool#activate() */ @Override public void activate() { super.activate(); } /* * (non-Javadoc) * * @see org.eclipse.gef.tools.MarqueeSelectionTool#setViewer(org.eclipse.gef. * EditPartViewer) */ @Override public void setViewer(EditPartViewer viewer) { super.setViewer(viewer); ScrollingGraphicalViewer epv = (ScrollingGraphicalViewer) getCurrentViewer(); if (epv == null) { return; } Control cntrl = epv.getContents().getViewer().getControl(); cntrl.addMouseListener(new MouseListener() { @Override public void mouseUp(MouseEvent e) { endLocation = new Point(e.x, e.y); } @Override public void mouseDown(MouseEvent e) { startLocation = new Point(e.x, e.y); } @Override public void mouseDoubleClick(MouseEvent e) { } }); } /* * (non-Javadoc) * * @see org.eclipse.gef.tools.MarqueeSelectionTool#getCommandName() */ @Override protected String getCommandName() { return "Clone"; } /* * (non-Javadoc) * * @see org.eclipse.gef.tools.MarqueeSelectionTool#handleButtonUp(int) */ @Override protected boolean handleButtonUp(int button) { boolean fromSuper = super.handleButtonUp(button); if (getOperationSet().size() == 0 || getOperationSet().size() > 1) { // clone of multiple different shapes is not defined return fromSuper; } // Clone here // Rectangle area = calculateArea(); // Shape shape = (Shape) ((IAdaptable) // getOperationSet().get(0)).getAdapter(Shape.class); // ShapesDiagram diagram = (ShapesDiagram) // getCurrentViewer().getContents().getModel(); // // for (int i = area.y; i < area.y + area.height; i += // shape.getBounds().height) { // for (int j = area.x; j < area.x + area.width; j += // shape.getBounds().width) { // Shape newShape = shape.cloneShape(); // // Rectangle newBounds = RectAdapter.d2dRect(newShape.getBounds()); // newBounds.x = j; // newBounds.y = i; // // newShape.setBounds(RectAdapter.gdxRect(newBounds)); // diagram.addChild(newShape); // newShape.getParentLayer().add(newShape); // } // } // // // remove the cloned item // diagram.removeChild(shape); // shape.getParentLayer().remove(shape); return fromSuper; } /** * Calculate area. * * @return the rectangle */ private Rectangle calculateArea() { return new Rectangle(startLocation, getLocation()); } }