| /* |
| * Copyright (C) 2010 The Android Open Source Project |
| * |
| * Licensed under the Eclipse Public License, Version 1.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.eclipse.org/org/documents/epl-v10.php |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.ide.eclipse.adt.internal.editors.layout.gle2; |
| |
| import static com.android.ide.eclipse.adt.internal.editors.layout.gle2.SwtDrawingStyle.HOVER; |
| import static com.android.ide.eclipse.adt.internal.editors.layout.gle2.SwtDrawingStyle.HOVER_SELECTION; |
| |
| import org.eclipse.swt.graphics.Color; |
| import org.eclipse.swt.graphics.Device; |
| import org.eclipse.swt.graphics.GC; |
| import org.eclipse.swt.graphics.Rectangle; |
| |
| import java.util.List; |
| |
| /** |
| * The {@link HoverOverlay} paints an optional hover on top of the layout, |
| * highlighting the currently hovered view. |
| */ |
| public class HoverOverlay extends Overlay { |
| private final LayoutCanvas mCanvas; |
| |
| /** Hover border color. Must be disposed, it's NOT a system color. */ |
| private Color mHoverStrokeColor; |
| |
| /** Hover fill color. Must be disposed, it's NOT a system color. */ |
| private Color mHoverFillColor; |
| |
| /** Hover border select color. Must be disposed, it's NOT a system color. */ |
| private Color mHoverSelectStrokeColor; |
| |
| /** Hover fill select color. Must be disposed, it's NOT a system color. */ |
| private Color mHoverSelectFillColor; |
| |
| /** Vertical scaling & scrollbar information. */ |
| private CanvasTransform mVScale; |
| |
| /** Horizontal scaling & scrollbar information. */ |
| private CanvasTransform mHScale; |
| |
| /** |
| * Current mouse hover border rectangle. Null when there's no mouse hover. |
| * The rectangle coordinates do not take account of the translation, which |
| * must be applied to the rectangle when drawing. |
| */ |
| private Rectangle mHoverRect; |
| |
| /** |
| * Constructs a new {@link HoverOverlay} linked to the given view hierarchy. |
| * |
| * @param canvas the associated canvas |
| * @param hScale The {@link CanvasTransform} to use to transfer horizontal layout |
| * coordinates to screen coordinates. |
| * @param vScale The {@link CanvasTransform} to use to transfer vertical layout |
| * coordinates to screen coordinates. |
| */ |
| public HoverOverlay(LayoutCanvas canvas, CanvasTransform hScale, CanvasTransform vScale) { |
| mCanvas = canvas; |
| mHScale = hScale; |
| mVScale = vScale; |
| } |
| |
| @Override |
| public void create(Device device) { |
| if (SwtDrawingStyle.HOVER.getStrokeColor() != null) { |
| mHoverStrokeColor = new Color(device, SwtDrawingStyle.HOVER.getStrokeColor()); |
| } |
| if (SwtDrawingStyle.HOVER.getFillColor() != null) { |
| mHoverFillColor = new Color(device, SwtDrawingStyle.HOVER.getFillColor()); |
| } |
| |
| if (SwtDrawingStyle.HOVER_SELECTION.getStrokeColor() != null) { |
| mHoverSelectStrokeColor = new Color(device, |
| SwtDrawingStyle.HOVER_SELECTION.getStrokeColor()); |
| } |
| if (SwtDrawingStyle.HOVER_SELECTION.getFillColor() != null) { |
| mHoverSelectFillColor = new Color(device, |
| SwtDrawingStyle.HOVER_SELECTION.getFillColor()); |
| } |
| } |
| |
| @Override |
| public void dispose() { |
| if (mHoverStrokeColor != null) { |
| mHoverStrokeColor.dispose(); |
| mHoverStrokeColor = null; |
| } |
| |
| if (mHoverFillColor != null) { |
| mHoverFillColor.dispose(); |
| mHoverFillColor = null; |
| } |
| |
| if (mHoverSelectStrokeColor != null) { |
| mHoverSelectStrokeColor.dispose(); |
| mHoverSelectStrokeColor = null; |
| } |
| |
| if (mHoverSelectFillColor != null) { |
| mHoverSelectFillColor.dispose(); |
| mHoverSelectFillColor = null; |
| } |
| } |
| |
| /** |
| * Sets the hover rectangle. The coordinates of the rectangle are in layout |
| * coordinates. The recipient is will own this rectangle. |
| * <p/> |
| * TODO: Consider switching input arguments to two {@link LayoutPoint}s so |
| * we don't have ambiguity about the coordinate system of these input |
| * parameters. |
| * <p/> |
| * |
| * @param x The top left x coordinate, in layout coordinates, of the hover. |
| * @param y The top left y coordinate, in layout coordinates, of the hover. |
| * @param w The width of the hover (in layout coordinates). |
| * @param h The height of the hover (in layout coordinates). |
| */ |
| public void setHover(int x, int y, int w, int h) { |
| mHoverRect = new Rectangle(x, y, w, h); |
| } |
| |
| /** |
| * Removes the hover for the next paint. |
| */ |
| public void clearHover() { |
| mHoverRect = null; |
| } |
| |
| @Override |
| public void paint(GC gc) { |
| if (mHoverRect != null) { |
| // Translate the hover rectangle (in canvas coordinates) to control |
| // coordinates |
| int x = mHScale.translate(mHoverRect.x); |
| int y = mVScale.translate(mHoverRect.y); |
| int w = mHScale.scale(mHoverRect.width); |
| int h = mVScale.scale(mHoverRect.height); |
| |
| |
| boolean hoverIsSelected = false; |
| List<SelectionItem> selections = mCanvas.getSelectionManager().getSelections(); |
| for (SelectionItem item : selections) { |
| if (mHoverRect.equals(item.getViewInfo().getSelectionRect())) { |
| hoverIsSelected = true; |
| break; |
| } |
| } |
| |
| Color stroke = hoverIsSelected ? mHoverSelectStrokeColor : mHoverStrokeColor; |
| Color fill = hoverIsSelected ? mHoverSelectFillColor : mHoverFillColor; |
| |
| if (stroke != null) { |
| int oldAlpha = gc.getAlpha(); |
| gc.setForeground(stroke); |
| gc.setLineStyle(hoverIsSelected ? |
| HOVER_SELECTION.getLineStyle() : HOVER.getLineStyle()); |
| gc.setAlpha(hoverIsSelected ? |
| HOVER_SELECTION.getStrokeAlpha() : HOVER.getStrokeAlpha()); |
| gc.drawRectangle(x, y, w, h); |
| gc.setAlpha(oldAlpha); |
| } |
| |
| if (fill != null) { |
| int oldAlpha = gc.getAlpha(); |
| gc.setAlpha(hoverIsSelected ? |
| HOVER_SELECTION.getFillAlpha() : HOVER.getFillAlpha()); |
| gc.setBackground(fill); |
| gc.fillRectangle(x, y, w, h); |
| gc.setAlpha(oldAlpha); |
| } |
| } |
| } |
| } |