/*******************************************************************************
* Copyright (c) 2000, 2005 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.gef.examples.logicdesigner.edit;
import java.util.List;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.commands.CompoundCommand;
import org.eclipse.gef.commands.UnexecutableCommand;
import org.eclipse.gef.editpolicies.TreeContainerEditPolicy;
import org.eclipse.gef.requests.ChangeBoundsRequest;
import org.eclipse.gef.requests.CreateRequest;
import org.eclipse.gef.examples.logicdesigner.model.LogicDiagram;
import org.eclipse.gef.examples.logicdesigner.model.LogicSubpart;
import org.eclipse.gef.examples.logicdesigner.model.commands.CreateCommand;
import org.eclipse.gef.examples.logicdesigner.model.commands.ReorderPartCommand;
public class LogicTreeContainerEditPolicy
extends TreeContainerEditPolicy
{
protected Command createCreateCommand(LogicSubpart child, Rectangle r,
int index, String label){
CreateCommand cmd = new CreateCommand();
Rectangle rect;
if(r == null){
rect = new Rectangle();
rect.setSize(new Dimension(-1,-1));
} else {
rect = r;
}
cmd.setLocation(rect);
cmd.setParent((LogicDiagram)getHost().getModel());
cmd.setChild(child);
cmd.setLabel(label);
if(index >= 0)
cmd.setIndex(index);
return cmd;
}
protected Command getAddCommand(ChangeBoundsRequest request){
CompoundCommand command = new CompoundCommand();
command.setDebugLabel("Add in LogicTreeContainerEditPolicy");//$NON-NLS-1$
List editparts = request.getEditParts();
int index = findIndexOfTreeItemAt(request.getLocation());
for(int i = 0; i < editparts.size(); i++){
EditPart child = (EditPart)editparts.get(i);
if(isAncestor(child,getHost()))
command.add(UnexecutableCommand.INSTANCE);
else {
LogicSubpart childModel = (LogicSubpart)child.getModel();
command.add(createCreateCommand(
childModel,
new Rectangle(new org.eclipse.draw2d.geometry.Point(),
childModel.getSize()),
index, "Reparent LogicSubpart"));//$NON-NLS-1$
}
}
return command;
}
protected Command getCreateCommand(CreateRequest request){
LogicSubpart child = (LogicSubpart)request.getNewObject();
int index = findIndexOfTreeItemAt(request.getLocation());
return createCreateCommand(child, null, index, "Create LogicSubpart");//$NON-NLS-1$
}
protected Command getMoveChildrenCommand(ChangeBoundsRequest request){
CompoundCommand command = new CompoundCommand();
List editparts = request.getEditParts();
List children = getHost().getChildren();
int newIndex = findIndexOfTreeItemAt(request.getLocation());
for(int i = 0; i < editparts.size(); i++){
EditPart child = (EditPart)editparts.get(i);
int tempIndex = newIndex;
int oldIndex = children.indexOf(child);
if(oldIndex == tempIndex || oldIndex + 1 == tempIndex){
command.add(UnexecutableCommand.INSTANCE);
return command;
} else if(oldIndex <= tempIndex){
tempIndex--;
}
command.add(new ReorderPartCommand(
(LogicSubpart)child.getModel(),
(LogicDiagram)getHost().getModel(),
tempIndex));
}
return command;
}
protected boolean isAncestor(EditPart source, EditPart target){
if(source == target)
return true;
if(target.getParent() != null)
return isAncestor(source, target.getParent());
return false;
}
}