blob: 59678d2489917326dc97df512c96aad781fab752 [file] [log] [blame]
/*******************************************************************************
* 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.Collections;
import java.util.List;
import org.eclipse.core.runtime.Assert;
import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.RectangleFigure;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.gef.Request;
import org.eclipse.gef.RequestConstants;
import org.eclipse.gef.editpolicies.NonResizableEditPolicy;
import org.eclipse.gef.requests.LocationRequest;
import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
import org.eclipse.jst.pagedesigner.parts.NonVisualComponentEditPart;
import org.eclipse.swt.graphics.Color;
import org.w3c.dom.Element;
/**
* An edit policy for non visual child edit parts
* @author cbateman
*
*/
public class NonVisualChildGraphicalEditPolicy extends NonResizableEditPolicy
{
// the number of pixels to offset the top left of tooltop feedback
// below the current mouse cursor location
private static final int TOOLTIP_VERTICAL_OFFSET = 25;
private final static Color HOVER_FEEDBACK_COLOR = ColorConstants.blue;
private BasicLabelToolTip _toolTip;
private boolean _showLabelFeedback;
private RectangleFigure _mouseOverBorder;
public void showTargetFeedback(Request request) {
if (RequestConstants.REQ_SELECTION_HOVER.equals(request.getType())) {
removeToolTipLabel();
removeMouseOverBorder();
Assert.isTrue(request instanceof LocationRequest);
// don't show tooltip if drag is active
_showLabelFeedback = !((NodeEditPart)getHost()).isDragActive();
showHoverFeedback((LocationRequest)request);
} else {
super.showTargetFeedback(request);
}
}
public void eraseTargetFeedback(Request request) {
removeToolTipLabel();
removeMouseOverBorder();
}
/**
* @param request
*/
private void showHoverFeedback(LocationRequest request)
{
if (_showLabelFeedback)
{
addMouseOverBorder();
_toolTip = new BasicLabelToolTip(getTooltipText());
addFeedback(_toolTip);
// use mouse cursor plus an offset so the tooltip doesn't
// appear z-ordered below the mouse cursor
AbsolutePointLocator locator = AbsolutePointLocator.getInstance();
locator.setReferencePoint(request.getLocation(), 0, TOOLTIP_VERTICAL_OFFSET);
// to avoid enlargemeent of the feedback layer
locator.setIntersectFigure(getFeedbackLayer());
locator.relocate(_toolTip);
}
}
private String getTooltipText() {
Element element = (Element) ((NonVisualComponentEditPart)getHost()).getDOMNode();
StringBuffer text = new StringBuffer(element.getTagName());
return text.toString();
}
private void addMouseOverBorder()
{
if (_mouseOverBorder == null)
{
_mouseOverBorder = new RectangleFigure();
_mouseOverBorder.setFill(false);
_mouseOverBorder.setOutline(true);
_mouseOverBorder.setLineWidth(1);
_mouseOverBorder.setForegroundColor(HOVER_FEEDBACK_COLOR);
}
addFeedback(_mouseOverBorder);
IFigure hostFigure = getHostFigure();
Rectangle r = hostFigure.getBounds().getCopy().expand(1, 1);
hostFigure.translateToAbsolute(r);
_mouseOverBorder.translateToRelative(r);
_mouseOverBorder.setBounds(r);
}
/**
*
*/
private void removeMouseOverBorder()
{
if (_mouseOverBorder != null) {
removeFeedback(_mouseOverBorder);
_mouseOverBorder = null;
}
}
protected List createSelectionHandles() {
// return super.createSelectionHandles();
return Collections.EMPTY_LIST;
}
/**
*
*/
private void removeToolTipLabel()
{
if (_toolTip != null) {
removeFeedback(_toolTip);
_toolTip = null;
}
}
}