blob: dc086aaac5bb43e73d0ec8cdc7f10f7c1400fd74 [file] [log] [blame]
/**
* Copyright (c) 2008 Oracle 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:
* Oracle Corporation - initial API and implementation
*/
package org.eclipse.jst.jsf.apache.trinidad.tagsupport.elementedit;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.gef.DragTracker;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.EditPolicy;
import org.eclipse.gef.GraphicalEditPart;
import org.eclipse.gef.requests.DropRequest;
import org.eclipse.gef.requests.LocationRequest;
import org.eclipse.jst.jsf.apache.trinidad.tagsupport.ITrinidadConstants;
import org.eclipse.jst.jsf.apache.trinidad.tagsupport.TrinidadUtils;
import org.eclipse.jst.jsf.common.dom.TagIdentifier;
import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
import org.eclipse.jst.pagedesigner.editpolicies.DragMoveEditPolicy;
import org.eclipse.jst.pagedesigner.editpolicies.ElementResizableEditPolicy;
import org.eclipse.jst.pagedesigner.itemcreation.ItemCreationEditPolicy;
import org.eclipse.jst.pagedesigner.itemcreation.ItemCreationRequest;
import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
import org.eclipse.jst.pagedesigner.tools.ObjectModeDragTracker;
import org.eclipse.jst.pagedesigner.validation.caret.ActionData;
import org.eclipse.jst.pagedesigner.validation.caret.DefaultPositionRule;
import org.eclipse.jst.pagedesigner.validation.caret.DnDPositionValidator;
import org.eclipse.jst.pagedesigner.validation.caret.DropActionData;
import org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator;
import org.eclipse.jst.pagedesigner.validation.caret.Target;
import org.eclipse.jst.pagedesigner.validation.caret.DropActionData.DropData;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
/**
* IElementEdit implementation for Trinidad's panelTabbed tag.
*
* @author Ian Trimble - Oracle
*/
public class PanelTabbedElementEdit extends DefaultTrinidadCoreElementEdit {
/* (non-Javadoc)
* @see org.eclipse.jst.pagedesigner.elementedit.AbstractElementEdit#createEditPolicies(org.eclipse.jst.pagedesigner.parts.ElementEditPart)
*/
@Override
public void createEditPolicies(ElementEditPart part) {
part.installEditPolicy(
EditPolicy.SELECTION_FEEDBACK_ROLE,
new PanelTabbedElementResizableEditPolicy());
part.installEditPolicy(
EditPolicy.PRIMARY_DRAG_ROLE,
new PanelTabbedDragMoveEditPolicy());
part.installEditPolicy(
ItemCreationRequest.REQ_ITEM_CREATION,
new PanelTabbedItemCreationEditPolicy());
}
/**
* Extends ElementResizableEditPolicy to determine if tab is clicked and
* respond accordingly.
*
* @author Ian Trimble - Oracle
*/
public static class PanelTabbedElementResizableEditPolicy extends ElementResizableEditPolicy {
/* (non-Javadoc)
* @see org.eclipse.jst.pagedesigner.editpolicies.ElementResizableEditPolicy#getSelectionDragTracker(org.eclipse.gef.requests.LocationRequest)
*/
@Override
public DragTracker getSelectionDragTracker(LocationRequest request) {
return getSelectionTracker(request);
}
/* (non-Javadoc)
* @see org.eclipse.jst.pagedesigner.editpolicies.ElementResizableEditPolicy#getSelectionTracker(org.eclipse.gef.requests.LocationRequest)
*/
@Override
protected DragTracker getSelectionTracker(LocationRequest request) {
final GraphicalEditPart part = (GraphicalEditPart)getHost();
if (part instanceof NodeEditPart) {
final Node node = ((NodeEditPart)part).getDOMNode();
if (getShowDetailItemCount(node) > 0) {
ObjectModeDragTracker dragTracker = new ObjectModeDragTracker(getHost()) {
protected boolean handleButtonDown(int button) {
if (button == 1) {
final int tabIndex = getTabIndex(getLocation());
final EditPart editPart = getSourceEditPart();
if (editPart instanceof ElementEditPart) {
final Node node = ((ElementEditPart)editPart).getDOMNode();
if (TrinidadUtils.setCurrentChildIndex(node, tabIndex)) {
((ElementEditPart)editPart).refresh(true);
}
}
}
return super.handleButtonDown(button);
}
};
return dragTracker;
}
}
return new ObjectModeDragTracker(getHost());
}
private int getTabIndex(Point location) {
int tabIndex = -1;
final GraphicalEditPart part = (GraphicalEditPart)getHost();
if (part instanceof NodeEditPart) {
final Node node = ((NodeEditPart)part).getDOMNode();
final IFigure figure = part.getFigure();
Point relLocation = location.getCopy();
figure.translateToRelative(relLocation);
final int showDetailItemCount = getShowDetailItemCount(node);
if (showDetailItemCount > 0) {
final int tabWidth = figure.getBounds().width / showDetailItemCount;
tabIndex = relLocation.x / tabWidth;
if (tabIndex > showDetailItemCount - 1) {
tabIndex = showDetailItemCount - 1;
}
}
}
return tabIndex;
}
private int getShowDetailItemCount(Node node) {
int count = 0;
if (node != null) {
NodeList childNodes = node.getChildNodes();
for (int i = 0; i < childNodes.getLength(); i++) {
Node childNode = childNodes.item(i);
if (childNode instanceof Element) {
if (ITrinidadConstants.TAG_IDENTIFIER_SHOWDETAILITEM.isSameTagType(
TagIdentifierFactory.createDocumentTagWrapper((Element)childNode))) {
count++;
}
}
}
}
return count;
}
}
/**
* Extends DragMoveEditPolicy to add OnlyShowDetailItemsRule as a rule.
*
* @author Ian Trimble - Oracle
*/
public static class PanelTabbedDragMoveEditPolicy extends DragMoveEditPolicy {
/*
* (non-Javadoc)
* @see org.eclipse.jst.pagedesigner.editpolicies.DropEditPolicy#createDropChildValidator(org.eclipse.gef.requests.DropRequest)
*/
@Override
protected IPositionMediator createDropChildValidator(DropRequest r) {
DropData dropData = createDropData(r);
if (dropData != null) {
DnDPositionValidator validator =
new DnDPositionValidator(new DropActionData(
ActionData.COMPONENT_MOVE, dropData));
validator.addRule(new OnlyShowDetailItemsRule(validator.getActionData()));
return validator;
}
return null;
}
}
/**
* Extends ItemCreationEditPolicy to add OnlyShowDetailItemsRule as a rule.
*
* @author Ian Trimble - Oracle
*/
public static class PanelTabbedItemCreationEditPolicy extends ItemCreationEditPolicy {
/* (non-Javadoc)
* @see org.eclipse.jst.pagedesigner.editpolicies.DropEditPolicy#createDropChildValidator(org.eclipse.gef.requests.DropRequest)
*/
@Override
protected IPositionMediator createDropChildValidator(DropRequest r) {
DropData dropData = createDropData(r);
if (dropData != null) {
DnDPositionValidator validator =
new DnDPositionValidator(new DropActionData(
ActionData.PALETTE_DND, dropData));
validator.addRule(new OnlyShowDetailItemsRule(validator.getActionData()));
return validator;
}
return null;
}
}
/**
* Extends DefaultPositionRule to only allow showDetailItem tags to be
* dropped on panelTabbed tag.
*
* @author Ian Trimble - Oracle
*/
private static class OnlyShowDetailItemsRule extends DefaultPositionRule {
/**
* Instantiates an instance.
*
* @param actionData ActionData instance.
*/
public OnlyShowDetailItemsRule(ActionData actionData) {
super(actionData);
}
/*
* (non-Javadoc)
* @see org.eclipse.jst.pagedesigner.validation.caret.DefaultPositionRule#isEditable(org.eclipse.jst.pagedesigner.validation.caret.Target)
*/
@Override
public boolean isEditable(Target target) {
if (ITrinidadConstants.TAG_IDENTIFIER_PANELTABBED.isSameTagType(
target.getTagWrapper())) {
return isDataDroppable();
}
return true;
}
private boolean isDataDroppable() {
ActionData actionData = getActionData();
if (actionData instanceof DropActionData) {
DropActionData dropActionData = (DropActionData)actionData;
TagIdentifier tagIdentifier =
(TagIdentifier)dropActionData.getDropData().getTagIdentifiers().get(0);
if (ITrinidadConstants.TAG_IDENTIFIER_SHOWDETAILITEM.isSameTagType(
tagIdentifier)) {
return true;
}
}
return false;
}
}
}