blob: 78affcf748b394b8c5b9bae257347e07625965c3 [file] [log] [blame]
/*******************************************************************************
* 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.jsf.ui.elementedit.jsfhtml;
import java.util.Iterator;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.EditPartViewer;
import org.eclipse.gef.EditPolicy;
import org.eclipse.gef.GraphicalEditPart;
import org.eclipse.jst.jsf.common.dom.TagIdentifier;
import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
import org.eclipse.jst.pagedesigner.editpolicies.ColumnHelper;
import org.eclipse.jst.pagedesigner.editpolicies.ColumnResizableEditPolicy;
import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
import org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator;
import org.eclipse.jst.pagedesigner.validation.caret.Target;
import org.eclipse.jst.pagedesigner.viewer.CaretPositionResolver;
import org.eclipse.jst.pagedesigner.viewer.DefaultDropLocationStrategy;
import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
import org.eclipse.jst.pagedesigner.viewer.IDropLocationStrategy;
import org.w3c.dom.Element;
/**
* @author mengbo
* @version 1.5
*/
public class ColumnElementEdit extends DefaultJSFHTMLElementEdit
{
/* (non-Javadoc)
* @see org.eclipse.jst.pagedesigner.elementedit.AbstractElementEdit#handleModelChange(org.w3c.dom.Element, org.eclipse.jst.pagedesigner.parts.ElementEditPart)
*/
public boolean handleModelChange(Element ele, ElementEditPart part, boolean recursive)
{
EditPart parent = part.getParent();
if (parent instanceof ElementEditPart)
{
((ElementEditPart) parent).refreshModelChange(recursive);
return true;
}
return false;
}
/* (non-Javadoc)
* @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#createEditPolicies(org.eclipse.jst.pagedesigner.parts.ElementEditPart)
*/
public void createEditPolicies(ElementEditPart part)
{
part.installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, new ColumnResizableEditPolicy());
}
public IDropLocationStrategy getDropRequestorLocationStrategy(TagIdentifier tag, EditPartViewer viewer) {
return new MyDropLocationStrategy(viewer);
}
private static class MyDropLocationStrategy extends DefaultDropLocationStrategy
{
/**
* @param viewer
*/
public MyDropLocationStrategy(EditPartViewer viewer) {
super(viewer);
}
public DesignPosition calculateDesignPosition(EditPart target,
Point p, IPositionMediator validator)
{
// get the nearest ancestor part to target that is
// editable or target if it is editable
target = validator.getEditableContainer(new Target(target));
// target must be an element part
if (target instanceof ElementEditPart)
{
// can only try to drop a column into a table. If we are
// targetting a column, then we can see if its table will take it
TagIdentifier tagId = ((ElementEditPart)target).getTagIdentifier();
if (IJSFConstants.TAG_IDENTIFIER_DATA_TABLE.isSameTagType(tagId))
{
// if we're on the table, try to figure out which column we are above
for (Iterator it = target.getChildren().iterator(); it.hasNext();)
{
final NodeEditPart nodeEditPart = (NodeEditPart) it.next();
TagIdentifier tagId2 = nodeEditPart.getTagIdentifier();
if (IJSFConstants.TAG_IDENTIFIER_COLUMN.isSameTagType(tagId2))
{
final Rectangle columnBounds =
ColumnHelper.getAdjustedColumnBoundingRectangle(nodeEditPart);
if (columnBounds.contains(p))
{
target = nodeEditPart;
break;
}
}
}
}
// recalculate the id because it may have changed
tagId = ((ElementEditPart)target).getTagIdentifier();
if (IJSFConstants.TAG_IDENTIFIER_COLUMN.isSameTagType(tagId))
{
DesignPosition position = null;
final Rectangle columnBounds =
ColumnHelper.getAdjustedColumnBoundingRectangle((GraphicalEditPart) target);
if (CaretPositionResolver.toXMiddle(columnBounds, p) < 0)
{
position = DesignPosition.createPositionBeforePart(target);
}
else
{
position = DesignPosition.createPositionAfterPart(target);
}
if (validator.isValidPosition(position))
{
return position;
}
}
}
// otherwise, no valid position
return null;
}
protected Rectangle createCaretBounds(DesignPosition position) {
Rectangle bounds = super.createCaretBounds(position);
// we want to extend the insert caret to be the height of the column container (i.e. dataTable)
// and positioned so it starts at the top of the container in the column where the insertion will occur
GraphicalEditPart parent =
(GraphicalEditPart) position.getContainerPart();
Rectangle containerBounds = parent.getFigure().getBounds().getCopy();
parent.getFigure().translateToAbsolute(containerBounds);
bounds.height = containerBounds.height;
bounds.y = containerBounds.y;
return bounds;
}
}
}