Package org.eclipse.jst.pagedesigner.editpolicies

Source Code of org.eclipse.jst.pagedesigner.editpolicies.ColumnResizableEditPolicy$ColumnBorderHandleLocator

/*******************************************************************************
* Copyright (c) 2006 Sybase, Inc. 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:
*     Sybase, Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.jst.pagedesigner.editpolicies;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.Graphics;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.Locator;
import org.eclipse.draw2d.PositionConstants;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.gef.DragTracker;
import org.eclipse.gef.GraphicalEditPart;
import org.eclipse.gef.Handle;
import org.eclipse.gef.SharedCursors;
import org.eclipse.gef.handles.MoveHandle;
import org.eclipse.gef.handles.ResizeHandle;
import org.eclipse.gef.handles.SquareHandle;
import org.eclipse.gef.tools.DragEditPartsTracker;
import org.eclipse.gef.tools.SelectEditPartTracker;
import org.eclipse.jst.pagedesigner.PDPlugin;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Cursor;
import org.eclipse.swt.graphics.Image;
import org.w3c.dom.Element;

/**
* @author mengbo
*/
public class ColumnResizableEditPolicy extends ElementResizableEditPolicy {
  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.gef.editpolicies.ResizableEditPolicy#createSelectionHandles()
   */
  protected List createSelectionHandles() {
    String elementName = ((Element) getHost().getModel()).getLocalName();
    if ("column".equalsIgnoreCase(elementName)) { //$NON-NLS-1$
      List list = new ArrayList();

      GraphicalEditPart part = (GraphicalEditPart) getHost();
           
            {
          MoveHandle borderhandle = new MoveHandle(part, new ColumnBorderHandleLocator(
              part));
          list.add(borderhandle);
            }
           
            {
          MyMoveHandle cornerHandle = new MyMoveHandle(part, new ColumnHandleLocator(part, getHostFigure(),
              PositionConstants.NORTH_WEST));
          list.add(cornerHandle);
            }
           
      SelectEditPartTracker tracker = new SelectEditPartTracker(getHost());
      list.add(createHandle(part, PositionConstants.SOUTH_EAST, tracker,
          SharedCursors.ARROW));
      list.add(createHandle(part, PositionConstants.SOUTH_WEST, tracker,
          SharedCursors.ARROW));
      list.add(createHandle(part, PositionConstants.NORTH_WEST, tracker,
          SharedCursors.ARROW));
      list.add(createHandle(part, PositionConstants.NORTH_EAST, tracker,
          SharedCursors.ARROW));
      return list;

    }
    return super.createSelectionHandles();
  }

  private Handle createHandle(GraphicalEditPart owner, int direction,
      DragTracker tracker, Cursor cursor) {
    ResizeHandle handle = new ResizeHandle(owner, new ColumnCornerLocator(
        owner, direction), cursor);
    handle.setCursor(cursor);
    handle.setDragTracker(tracker);
    return handle;
  }

    private class ColumnHandleLocator extends CornerRelativeHandleLocator {
    private GraphicalEditPart editPart;

    /**
     * @param editPart
     * @param reference
     * @param location
     */
    public ColumnHandleLocator(GraphicalEditPart editPart, IFigure reference, int location) {
            super(reference, location);
      this.editPart = editPart;
    }
       
        protected Dimension getNewTargetSize(IFigure relocateFigure) {
            return relocateFigure.getPreferredSize();
        }

        protected Rectangle getCurrentTargetBounds(IFigure relocateFigure) {
            return ColumnHelper.getColumnBounds(editPart, relocateFigure);
        }
  }

  private class ColumnCornerLocator implements Locator {
    private double relativeX;

    private double relativeY;

    private GraphicalEditPart editPart;

    /**
     * Constructs a RelativeLocator with the given reference figure and
     * relative location. The location is a constant from
     * {@link PositionConstants} used as a convenient and readable way to
     * set both the relativeX and relativeY values.
     *
     * @param editPart
     *            the reference figure
     * @param location
     *            one of NORTH, NORTH_EAST, etc.
     */
    public ColumnCornerLocator(GraphicalEditPart editPart, int location) {
      this.editPart = editPart;
      switch (location & PositionConstants.NORTH_SOUTH) {
      case PositionConstants.NORTH:
        relativeY = 0;
        break;
      case PositionConstants.SOUTH:
        relativeY = 1.0;
        break;
      default:
        relativeY = 0.5;
      }

      switch (location & PositionConstants.EAST_WEST) {
      case PositionConstants.WEST:
        relativeX = 0;
        break;
      case PositionConstants.EAST:
        relativeX = 1.0;
        break;
      default:
        relativeX = 0.5;
      }
    }

    /**
     * Relocates the target using the relative offset locations.
     *
     * @see org.eclipse.draw2d.Locator#relocate(org.eclipse.draw2d.IFigure)
     */
    public void relocate(IFigure target) {
      Rectangle targetBounds = ColumnHelper.getColumnBounds(editPart,
          target);

      Dimension targetSize = target.getPreferredSize();

      targetBounds.x += (int) (targetBounds.width * relativeX - ((targetSize.width + 1) / 2));
      targetBounds.y += (int) (targetBounds.height * relativeY - ((targetSize.height + 1) / 2));
      targetBounds.setSize(targetSize);
      target.setBounds(targetBounds);
    }
  }

    private class ColumnBorderHandleLocator implements Locator {
        private GraphicalEditPart editPart;

        /**
         * @param editPart
         */
        public ColumnBorderHandleLocator(GraphicalEditPart editPart) {
            this.editPart = editPart;
        }

        public void relocate(IFigure target) {
            target.setBounds(ColumnHelper.getColumnBounds(editPart, target));
        }
    }
   
    private static class MyMoveHandle extends SquareHandle
    {
        private static final String MOVE_HANDLE_IMAGE_FILE = "MoveHandle.png"; //$NON-NLS-1$

    /**
         * @param owner
         * @param loc
         */
        public MyMoveHandle(GraphicalEditPart owner, Locator loc) {
            super(owner, loc);
            setCursor(SharedCursors.SIZEALL);
        }

        protected void init() {
            setPreferredSize(16,16);
        }

        protected Color getBorderColor() {
            return ColorConstants.black;
        }

        protected Color getFillColor() {
            return ColorConstants.white;
        }

        protected DragTracker createDragTracker() {
            DragTracker tracker = new DragEditPartsTracker(getOwner());
           
            return tracker;
        }

        public void paintFigure(Graphics graphics) {
            super.paintFigure(graphics);
            final  Image moveImage = PDPlugin.getDefault().getImage(MOVE_HANDLE_IMAGE_FILE);
            Point topLeft = getBounds().getTopLeft().getCopy();
            topLeft.performTranslate(3,3);
            graphics.drawImage(moveImage, topLeft);
        }
    }
}
TOP

Related Classes of org.eclipse.jst.pagedesigner.editpolicies.ColumnResizableEditPolicy$ColumnBorderHandleLocator

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.