/* * 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 org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Device; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Rectangle; /** * The {@link EmptyViewsOverlay} paints bounding rectangles for any of the empty and * invisible container views in the scene. */ public class EmptyViewsOverlay extends Overlay { /** The {@link ViewHierarchy} containing visible view information. */ private final ViewHierarchy mViewHierarchy; /** Border color to paint the bounding boxes with. */ private Color mBorderColor; /** Vertical scaling & scrollbar information. */ private CanvasTransform mVScale; /** Horizontal scaling & scrollbar information. */ private CanvasTransform mHScale; /** * Constructs a new {@link EmptyViewsOverlay} linked to the given view hierarchy. * * @param viewHierarchy The {@link ViewHierarchy} to render. * @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 EmptyViewsOverlay( ViewHierarchy viewHierarchy, CanvasTransform hScale, CanvasTransform vScale) { super(); this.mViewHierarchy = viewHierarchy; this.mHScale = hScale; this.mVScale = vScale; } @Override public void create(Device device) { mBorderColor = new Color(device, SwtDrawingStyle.EMPTY.getStrokeColor()); } @Override public void dispose() { if (mBorderColor != null) { mBorderColor.dispose(); mBorderColor = null; } } @Override public void paint(GC gc) { gc.setForeground(mBorderColor); gc.setLineDash(null); gc.setLineStyle(SwtDrawingStyle.EMPTY.getLineStyle()); int oldAlpha = gc.getAlpha(); gc.setAlpha(SwtDrawingStyle.EMPTY.getStrokeAlpha()); gc.setLineWidth(SwtDrawingStyle.EMPTY.getLineWidth()); for (CanvasViewInfo info : mViewHierarchy.getInvisibleViews()) { Rectangle r = info.getAbsRect(); int x = mHScale.translate(r.x); int y = mVScale.translate(r.y); int w = mHScale.scale(r.width); int h = mVScale.scale(r.height); // +1: See explanation in equivalent code in {@link OutlineOverlay#paint} gc.drawRectangle(x, y, w + 1, h + 1); } gc.setAlpha(oldAlpha); } }