| /******************************************************************************* |
| * 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; |
| } |
| } |
| } |