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