`

Bendpoint随着图元位置的变化而变化

阅读更多
我这里以gef.tutorial.step为例,在此工程基础修改代码实现该功能

首先将ContentsEditPart的布局做如下调整
	protected IFigure createFigure() {
		Layer figure = new Layer() {
			public void paint(Graphics graphics) {
					graphics.setAntialias(SWT.ON);
					graphics.setTextAntialias(SWT.ON);
				super.paint(graphics);
			}
		};
		figure.setLayoutManager(new XYLayout());
		ConnectionLayer layer = (ConnectionLayer) getLayer(LayerConstants.CONNECTION_LAYER);
		layer.setConnectionRouter(ConnectionRouter.NULL);
		return figure;
	}


然后实现连线转折点模型:
/*******************************************************************************
 * Copyright (c) 2005-2011, Chinese Eclipse Community(CEC) 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.ceclipse.org
 *
 * Contributors:
 *   Ming.He <heming@ceclipse.com> - initial API and implementation 
 *******************************************************************************/

package gef.tutorial.step.parts;

import java.io.Serializable;

import org.eclipse.draw2d.Bendpoint;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Point;

/**
 * TODO 此处填写 class 信息
 * 
 * @author Ming.He
 * @date 2011-4-15
 */
public class ConnectionBendpoint implements Serializable, Bendpoint {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private float weight = 0.5f;

    private Dimension d1 = null;

    private Dimension d2 = null;

    public ConnectionBendpoint() {
    	// ignore
    }

    public ConnectionBendpoint(Dimension dim1, Dimension dim2) {
    	d1 = dim1;
        d2 = dim2;
    }

    public Dimension getFirstRelativeDimension() {
        return d1;
    }

    public Point getLocation() {
        return null;
    }

    public Dimension getSecondRelativeDimension() {
        return d2;
    }

    public float getWeight() {
        return weight;
    }

    public void setRelativeDimensions(Dimension dim1, Dimension dim2) {
        d1 = dim1;
        d2 = dim2;
    }

    public void setWeight(float w) {
        weight = w;
    }
}


在来实现Command:
关于转折点的命令这里做了个基类以便添加删除移动实现的方便BendpointCommand:
/*******************************************************************************
 * Copyright (c) 2005-2011, Chinese Eclipse Community(CEC) 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.ceclipse.org
 *
 * Contributors:
 *   Ming.He <heming@ceclipse.com> - initial API and implementation 
 *******************************************************************************/
package gef.tutorial.step.commands;

import gef.tutorial.step.model.AbstractConnectionModel;

import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.gef.commands.Command;

/**
 * TODO 此处填写 class 信息
 * 
 * @author Ming.He
 * @date 2011-4-15
 */
public class BendpointCommand extends Command {
	protected int index = 0;
	protected Point location = null;
	protected AbstractConnectionModel connectionModel = null;
	private Dimension d1 = null;
	private Dimension d2 = null;

	protected Dimension getFirstRelativeDimension() {
		return d1;
	}

	protected Dimension getSecondRelativeDimension() {
		return d2;
	}

	protected int getIndex() {
		return index;
	}

	@SuppressWarnings("unused")
	protected Point getLocation() {
		return location;
	}

	protected AbstractConnectionModel getConnectionModel() {
		return connectionModel;
	}

	public void redo() {
		execute();
	}

	public void setRelativeDimensions(Dimension dim1, Dimension dim2) {
		d1 = dim1;
		d2 = dim2;
	}

	public void setIndex(int i) {
		index = i;
	}

	public void setLocation(Point p) {
		location = p;
	}

	public void setConnectionModel(AbstractConnectionModel connection) {
		connectionModel = connection;
	}
}


CreateBendpointCommand:
/*******************************************************************************
 * Copyright (c) 2005-2011, Chinese Eclipse Community(CEC) 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.ceclipse.org
 *
 * Contributors:
 *   Ming.He <heming@ceclipse.com> - initial API and implementation 
 *******************************************************************************/

package gef.tutorial.step.commands;

import gef.tutorial.step.parts.ConnectionBendpoint;

/**
 * TODO 此处填写 class 信息
 * 
 * @author Ming.He
 * @date 2011-4-15
 */
public class CreateBendpointCommand extends BendpointCommand {
	public void execute() {
		ConnectionBendpoint rbp = new ConnectionBendpoint(getFirstRelativeDimension(), getSecondRelativeDimension());
		getConnectionModel().addBendpoint(getIndex(), rbp);
		super.execute();
	}

	public void undo() {
		super.undo();
		getConnectionModel().removeBendpoint(getIndex());
	}
}

MoveBendpointCommand:
/*******************************************************************************
 * Copyright (c) 2005-2011, Chinese Eclipse Community(CEC) 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.ceclipse.org
 *
 * Contributors:
 *   Ming.He <heming@ceclipse.com> - initial API and implementation 
 *******************************************************************************/

package gef.tutorial.step.commands;

import gef.tutorial.step.parts.ConnectionBendpoint;

/**
 * TODO 此处填写 class 信息
 * 
 * @author Ming.He
 * @date 2011-4-15
 */
public class MoveBendpointCommand extends BendpointCommand {
	private ConnectionBendpoint bendpoint = null;

	public void execute() {
		bendpoint = (ConnectionBendpoint) getConnectionModel().getBendpoints().get(getIndex());
		getConnectionModel().removeBendpoint(getIndex());
		super.execute();
	}

	public void undo() {
		super.undo();
		getConnectionModel().addBendpoint(getIndex(), bendpoint);
	}
}

DeleteBendpointCommand:
/*******************************************************************************
 * Copyright (c) 2005-2011, Chinese Eclipse Community(CEC) 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.ceclipse.org
 *
 * Contributors:
 *   Ming.He <heming@ceclipse.com> - initial API and implementation 
 *******************************************************************************/

package gef.tutorial.step.commands;

import gef.tutorial.step.parts.ConnectionBendpoint;

/**
 * TODO 此处填写 class 信息
 * 
 * @author Ming.He
 * @date 2011-4-15
 */
public class DeleteBendpointCommand extends BendpointCommand {
	private ConnectionBendpoint bendpoint = null;

	public void execute() {
		bendpoint = (ConnectionBendpoint) getConnectionModel().getBendpoints().get(getIndex());
		getConnectionModel().removeBendpoint(getIndex());
		super.execute();
	}

	public void undo() {
		super.undo();
		getConnectionModel().addBendpoint(getIndex(), bendpoint);
	}

}


对应的Plicy做如下修改:
/*******************************************************************************
 * Copyright (c) 2005-2011, Chinese Eclipse Community(CEC) 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.ceclipse.org
 *
 * Contributors:
 *   Ming.He <heming@ceclipse.com> - initial API and implementation 
 *******************************************************************************/

package gef.tutorial.step.policies;

import gef.tutorial.step.commands.BendpointCommand;
import gef.tutorial.step.commands.CreateBendpointCommand;
import gef.tutorial.step.commands.DeleteBendpointCommand;
import gef.tutorial.step.commands.MoveBendpointCommand;
import gef.tutorial.step.model.AbstractConnectionModel;

import org.eclipse.draw2d.Connection;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.editpolicies.BendpointEditPolicy;
import org.eclipse.gef.requests.BendpointRequest;

/**
 * TODO 此处填写 class 信息
 * 
 * @author Ming.He
 * @date 2011-4-15
 */
public class CustomBendpointEditPolicy extends BendpointEditPolicy {

	
	protected Command getCreateBendpointCommand(BendpointRequest request) {
		 CreateBendpointCommand command = new CreateBendpointCommand();
         Point p = request.getLocation();
         Connection conn = getConnection();

         conn.translateToRelative(p);

         command.setLocation(p);
         Point ref1 = getConnection().getSourceAnchor().getReferencePoint();
         Point ref2 = getConnection().getTargetAnchor().getReferencePoint();

         conn.translateToRelative(ref1);
         conn.translateToRelative(ref2);

         command.setRelativeDimensions(p.getDifference(ref1), p.getDifference(ref2));
         command.setConnectionModel((AbstractConnectionModel) request.getSource().getModel());
         command.setIndex(request.getIndex());
         return command;
	}

	
	protected Command getDeleteBendpointCommand(BendpointRequest request) {
		 BendpointCommand command = new DeleteBendpointCommand();
         Point p = request.getLocation();
         command.setLocation(p);
         command.setConnectionModel((AbstractConnectionModel) request.getSource().getModel());
         command.setIndex(request.getIndex());
         return command;
	}

	
	protected Command getMoveBendpointCommand(BendpointRequest request) {
		// ������bend����
		  MoveBendpointCommand command = new MoveBendpointCommand();
          Point p = request.getLocation();
          Connection conn = getConnection();

          conn.translateToRelative(p);

          command.setLocation(p);

          Point ref1 = getConnection().getSourceAnchor().getReferencePoint();
          Point ref2 = getConnection().getTargetAnchor().getReferencePoint();

          conn.translateToRelative(ref1);
          conn.translateToRelative(ref2);

          command.setRelativeDimensions(p.getDifference(ref1), p.getDifference(ref2));
          command.setConnectionModel((AbstractConnectionModel) request.getSource().getModel());
          command.setIndex(request.getIndex());
          return command;
	}

}
  • 大小: 2.3 KB
  • 大小: 2.2 KB
3
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics