/******************************************************************************* * Copyright (c) 2014, 2015 Cisco Systems, 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 * *******************************************************************************/ package com.cisco.yangide.ext.model.editor.figures; import org.eclipse.gef.EditPart; import org.eclipse.gef.EditPolicy; import org.eclipse.gef.Request; import org.eclipse.gef.RequestConstants; import org.eclipse.gef.commands.Command; import org.eclipse.gef.editpolicies.GraphicalEditPolicy; import org.eclipse.graphiti.features.context.IContext; import org.eclipse.graphiti.features.context.ITargetContext; import org.eclipse.graphiti.internal.command.CommandContainer; import org.eclipse.graphiti.internal.command.ICommand; import org.eclipse.graphiti.internal.command.MoveShapeFeatureCommandWithContext; import org.eclipse.graphiti.ui.internal.command.CreateModelObjectCommand; import org.eclipse.graphiti.ui.internal.command.GefCommandWrapper; /** * @author Konstantin Zaitsev * @date Aug 22, 2014 */ @SuppressWarnings("restriction") public class FeedbackEditPolicy extends GraphicalEditPolicy { private FeedbackFigure feedbackFigure; private EditPolicy editPolicy; /** * @param feedbackFigure * @param editPolicy */ public FeedbackEditPolicy(FeedbackFigure feedbackFigure, EditPolicy editPolicy) { this.feedbackFigure = feedbackFigure; this.editPolicy = editPolicy; } @Override public EditPart getTargetEditPart(Request request) { return editPolicy.getTargetEditPart(request); } @Override public void eraseTargetFeedback(Request request) { editPolicy.eraseTargetFeedback(request); feedbackFigure.setVisible(false); } @Override public void showTargetFeedback(Request request) { if (request.getType().equals(RequestConstants.REQ_CREATE) || request.getType().equals(RequestConstants.REQ_ADD) || request.getType().equals(RequestConstants.REQ_MOVE_CHILDREN) || request.getType().equals(RequestConstants.REQ_MOVE)) { if (request.getType().equals(RequestConstants.REQ_MOVE)) { request.setType(RequestConstants.REQ_MOVE_CHILDREN); } Command command = getHost().getCommand(request); if (command.canExecute()) { int position = 0; IContext context = getCommandContext(command); EditPart container = getHost(); if (context instanceof ITargetContext) { while (!container.getModel().equals(((ITargetContext) context).getTargetContainer())) { container = container.getParent(); } } if (null != context && null != context.getProperty("parent_position")) { position = (int) context.getProperty("parent_position"); } EditPolicy policy = container.getEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE); if (policy instanceof FeedbackEditPolicy) { ((FeedbackEditPolicy) policy).showFeedback(request, position); } } else { hideFeedback(); } } } public void showFeedback(Request request, int position) { feedbackFigure.setPosition(position); feedbackFigure.setVisible(true); feedbackFigure.repaint(); editPolicy.showTargetFeedback(request); } public void hideFeedback() { feedbackFigure.setVisible(false); feedbackFigure.repaint(); } protected IContext getCommandContext(Command command) { if (command instanceof CreateModelObjectCommand) { return ((CreateModelObjectCommand) command).getContext(); } if (command instanceof GefCommandWrapper) { return getCommandContext(((GefCommandWrapper) command).getCommand()); } return null; } protected IContext getCommandContext(ICommand command) { if (command instanceof MoveShapeFeatureCommandWithContext) { return ((MoveShapeFeatureCommandWithContext) command).getContext(); } if (command instanceof CommandContainer) { for (ICommand c : ((CommandContainer) command).getCommands()) { IContext result = getCommandContext(c); if (null != result) { return result; } } } return null; } }