| /******************************************************************************* |
| * 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.parts; |
| |
| import org.eclipse.core.runtime.IAdaptable; |
| 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.Request; |
| import org.eclipse.gef.RequestConstants; |
| import org.eclipse.gef.editparts.AbstractGraphicalEditPart; |
| import org.eclipse.gef.requests.LocationRequest; |
| import org.eclipse.jst.jsf.common.dom.TagIdentifier; |
| import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory; |
| import org.eclipse.jst.pagedesigner.dnd.LocalDropRequest; |
| import org.eclipse.jst.pagedesigner.dnd.internal.LocalDropEditPolicy; |
| import org.eclipse.jst.pagedesigner.editpolicies.DragMoveEditPolicy; |
| import org.eclipse.jst.pagedesigner.itemcreation.ItemCreationEditPolicy; |
| import org.eclipse.jst.pagedesigner.itemcreation.ItemCreationRequest; |
| import org.eclipse.jst.pagedesigner.tools.RangeDragTracker; |
| import org.eclipse.swt.graphics.Cursor; |
| import org.eclipse.ui.views.properties.IPropertySource; |
| import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter; |
| import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier; |
| import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument; |
| import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode; |
| import org.w3c.dom.Element; |
| import org.w3c.dom.Node; |
| |
| /** |
| * @author mengbo |
| */ |
| public abstract class NodeEditPart extends AbstractGraphicalEditPart implements |
| INodeAdapter { |
| |
| private IDOMDocument _destDocument; |
| private boolean _isDragActive; |
| |
| /** |
| * this method is called from the HTMLEditPartsFactory directly after the |
| * part's creation. |
| * |
| * @param doc |
| */ |
| public void setDestDocumentForDesign(IDOMDocument doc) { |
| this._destDocument = doc; |
| } |
| |
| /** |
| * @return to owner document of this part's model node |
| */ |
| public IDOMDocument getDestDocumentForDesign() { |
| if (this._destDocument == null) { |
| return (IDOMDocument) this.getIDOMNode().getOwnerDocument(); |
| } |
| return this._destDocument; |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.gef.editparts.AbstractEditPart#createEditPolicies() |
| */ |
| protected void createEditPolicies() { |
| installEditPolicy(EditPolicy.NODE_ROLE, null); |
| installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE, null); |
| installEditPolicy(LocalDropRequest.REQ_LOCAL_DROP, |
| new LocalDropEditPolicy()); |
| installEditPolicy(ItemCreationRequest.REQ_ITEM_CREATION, |
| new ItemCreationEditPolicy()); |
| installEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE, |
| new DragMoveEditPolicy()); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see com.ibm.sse.model.INodeAdapter#isAdapterForType(java.lang.Object) |
| */ |
| public boolean isAdapterForType(Object type) { |
| return type == EditPart.class; |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#addNotify() |
| */ |
| public void addNotify() { |
| Object obj = getModel(); |
| if (obj instanceof INodeNotifier) { |
| ((INodeNotifier) obj).addAdapter(this); |
| } |
| super.addNotify(); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#removeNotify() |
| */ |
| public void removeNotify() { |
| super.removeNotify(); |
| Object obj = getModel(); |
| if (obj instanceof INodeNotifier) { |
| ((INodeNotifier) obj).removeAdapter(this); |
| } |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.gef.EditPart#deactivate() |
| */ |
| public void deactivate() { |
| LocationRequest hoverRequest = new LocationRequest(); |
| hoverRequest.setType(RequestConstants.REQ_SELECTION_HOVER); |
| this.eraseTargetFeedback(hoverRequest); |
| super.deactivate(); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#getAdapter(java.lang.Class) |
| */ |
| public Object getAdapter(Class key) { |
| Object obj = getModel(); |
| if (key == IPropertySource.class) { |
| if (obj instanceof INodeNotifier) { |
| return ((INodeNotifier) obj) |
| .getAdapterFor(IPropertySource.class); |
| } |
| } |
| |
| if (obj instanceof IAdaptable) { |
| Object ret = ((IAdaptable) obj).getAdapter(key); |
| if (ret != null) |
| return ret; |
| } |
| return super.getAdapter(key); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#getDragTracker(org.eclipse.gef.Request) |
| */ |
| public DragTracker getDragTracker(Request request) { |
| return new RangeDragTracker(this); |
| } |
| |
| /** |
| * @return the model node as an IDOMNode |
| */ |
| public IDOMNode getIDOMNode() { |
| return ((IDOMNode) getModel()); |
| } |
| |
| /** |
| * @return the model node as a node |
| */ |
| public Node getDOMNode() |
| { |
| return ((Node)getModel()); |
| } |
| |
| /** |
| * @return if this edit part's model is an Element, then returns |
| * the tag identifier. Otherwise, null. |
| */ |
| public TagIdentifier getTagIdentifier() |
| { |
| Node node = getDOMNode(); |
| |
| if (node instanceof Element) |
| { |
| return TagIdentifierFactory.createDocumentTagWrapper(((Element)node)); |
| } |
| |
| return null; |
| } |
| |
| /** |
| * if a EditPart don't support caret inside it, and don't can't have child |
| * edit part, then we call it as a widget. |
| * |
| * @return true if this part represents a widget |
| */ |
| public boolean isWidget() { |
| return false; // child class must override. |
| } |
| |
| /** |
| * whether this EditPart allow the selection range to have one edge in the |
| * edit part and one edge outside the edit part. |
| * |
| * @return true if selection range across is allowed |
| */ |
| public boolean allowSelectionRangeAcross() { |
| return true; |
| } |
| |
| /** |
| * @return true if this part is resizable |
| */ |
| public boolean isResizable() { |
| return false; |
| } |
| |
| /** |
| * @return true if drag is active on this part |
| */ |
| public boolean isDragActive() { |
| return _isDragActive; |
| } |
| |
| /** |
| * @param newValue |
| */ |
| public void setDragActive(boolean newValue) |
| { |
| _isDragActive = newValue; |
| } |
| |
| /** |
| * @param mouseLocation |
| * @return this edit part's cursor or null if this edit part |
| * does not wish to specify a specific cursor (the default |
| * should be used). |
| * Note that this is only called when no drag tracker is active, |
| * when the mouse enters the edit part with the RangeSelectionTool |
| * and the current state is INITIAL. This allows the editpart to |
| * specify a custom mouse-over tool cursor |
| * TODO: perhaps getCursor is not a specific enough a name |
| */ |
| public Cursor getCursor(Point mouseLocation) |
| { |
| return null; |
| } |
| } |