Package org.eclipse.jst.pagedesigner.editpolicies

Source Code of org.eclipse.jst.pagedesigner.editpolicies.DropEditPolicy

/*******************************************************************************
* Copyright (c) 2001, 2007 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.pagedesigner.editpolicies;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.eclipse.draw2d.IFigure;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.Request;
import org.eclipse.gef.editpolicies.GraphicalEditPolicy;
import org.eclipse.gef.requests.DropRequest;
import org.eclipse.gef.requests.GroupRequest;
import org.eclipse.jst.jsf.common.dom.TagIdentifier;
import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
import org.eclipse.jst.pagedesigner.editors.palette.IDropSourceData;
import org.eclipse.jst.pagedesigner.editors.palette.ITagDropSourceData;
import org.eclipse.jst.pagedesigner.elementedit.ElementEditFactoryRegistry;
import org.eclipse.jst.pagedesigner.elementedit.IElementEdit;
import org.eclipse.jst.pagedesigner.itemcreation.ItemCreationRequest;
import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
import org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator;
import org.eclipse.jst.pagedesigner.validation.caret.DropActionData.DropData;
import org.eclipse.jst.pagedesigner.viewer.DefaultDropLocationStrategy;
import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
import org.eclipse.jst.pagedesigner.viewer.IDropLocationStrategy;

/**
* @author cbateman
*
*/
public abstract class DropEditPolicy extends GraphicalEditPolicy
{
    private List        _feedbackFigures;

    /**
     * @param r
     * @return a mediator that can validate valid model drops into the
     * host's edit part
     */
    protected IPositionMediator createDropChildValidator(DropRequest r)
    {
        // sub-class may override to customize the drop container validator
        return null;
    }
   
    /**
     * @param r
     * @return the appropriate design position for the drop request
     */
    protected abstract DesignPosition findPosition(DropRequest r);
   
    /**
     * @param data
     * @return a default validation mediator to be used if nothing custom is provided
     */
    protected abstract IPositionMediator createDefaultDropChildValidator(DropData data);
   
    /**
     * @param r
     * @return the validator to be used to validate the 'request' to drop
     * the edit parts specified by 'r' into this policy's host edit part
     */
    protected final IPositionMediator getDropChildValidator(DropRequest r)
    {
        IPositionMediator mediator = createDropChildValidator(r);
       
        if (mediator == null)
        {
            DropData data = createDropData(r);
           
            if (data == null)
            {
                return null;
            }
            mediator = createDefaultDropChildValidator(data);
        }
      
        return mediator;
    }
   
    /**
     * @param request
     * @return the data about the drop request
     */
    protected DropData createDropData(DropRequest request)
    {
        if (request instanceof GroupRequest)
        {
            List editParts = ((GroupRequest)request).getEditParts();
           
            // TODO: currently we only support one drop item
            if (editParts.size() > 0)
            {
                EditPart part = (EditPart) editParts.get(0);
                if (part instanceof NodeEditPart)
                {
                    NodeEditPart nodePart = (NodeEditPart) part;
                    TagIdentifier tagId = nodePart.getTagIdentifier();
                    if (tagId != null)
                    {
                        List tagIds = new ArrayList();
                        tagIds.add(tagId);
                        return new DropData(tagIds);
                    }
                }
            }
        }
        else if (request instanceof ItemCreationRequest)
        {
            IDropSourceData creationProvider =
                ((ItemCreationRequest)request).getTagCreationProvider();
            String tagName = creationProvider.getId();
            if (creationProvider instanceof ITagDropSourceData)
            {
                tagName = ((ITagDropSourceData)creationProvider).getTagName();
            }
            TagIdentifier tagId =
                TagIdentifierFactory.
                    createJSPTagWrapper(creationProvider.getNamespace(),
                            tagName);
            List tagIds = new ArrayList();
            tagIds.add(tagId);
            return new DropData(tagIds);
        }
       
        return null;
    }
   
    /**
     * @param r
     * @return the drop location strategy
     */
    protected final IDropLocationStrategy createDropLocationStrategy(DropRequest r)
    {
        DropData dropData = createDropData(r);
        if (dropData != null && dropData.getTagIdentifiers().size() > 0)
        {
            // TODO: only supporting single item drop currently
            TagIdentifier tagIdentifier =
                (TagIdentifier) dropData.getTagIdentifiers().get(0);

            IElementEdit elementEdit =
                ElementEditFactoryRegistry.getInstance()
                    .createElementEdit(tagIdentifier);

            // element edit not guaranteed to exist
            if (elementEdit != null)
            {
                IDropLocationStrategy strategy =
                    elementEdit.getDropRequestorLocationStrategy(tagIdentifier, getHost().getViewer());
               
                if (strategy != null)
                {
                    return strategy;
                }
            }
        }
       
        // by default, return the default strategy
        return new DefaultDropLocationStrategy(getHost().getViewer());
    }

    /*
     * (non-Javadoc)
     *
     * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#eraseTargetFeedback(org.eclipse.gef.Request)
     */
    public void eraseTargetFeedback(Request request) {
        if (_feedbackFigures != null)
        {
            for (final Iterator it = _feedbackFigures.iterator(); it.hasNext();)
            {
                final IFigure figure = (IFigure) it.next();
               
                if (figure != null)
                {
                    removeFeedback(figure);
                }
            }
           
            _feedbackFigures.clear();
            _feedbackFigures = null;
        }
    }
   
    public void showTargetFeedback(Request request)
    {
        if (request instanceof DropRequest)
        {
            DesignPosition position = findPosition((DropRequest)request);
            if (position != null) {
                // erase any prior feedback
                eraseTargetFeedback(request);
                // add figures to feedback layer and save them in _feedbackFigures
                // for later.
                _feedbackFigures = createDropLocationStrategy((DropRequest)request).showTargetFeedback(getHost(), position, (DropRequest)request);
            }
        }
    }
}
TOP

Related Classes of org.eclipse.jst.pagedesigner.editpolicies.DropEditPolicy

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.