| /* |
| * 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 OutlineOverlay} paints an optional outline on top of the layout, |
| * showing the structure of the individual Android View elements. |
| */ |
| public class OutlineOverlay extends Overlay { |
| /** The {@link ViewHierarchy} this outline visualizes */ |
| private final ViewHierarchy mViewHierarchy; |
| |
| /** Outline color. Must be disposed, it's NOT a system color. */ |
| private Color mOutlineColor; |
| |
| /** Vertical scaling & scrollbar information. */ |
| private CanvasTransform mVScale; |
| |
| /** Horizontal scaling & scrollbar information. */ |
| private CanvasTransform mHScale; |
| |
| /** |
| * Constructs a new {@link OutlineOverlay} 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 OutlineOverlay( |
| ViewHierarchy viewHierarchy, |
| CanvasTransform hScale, |
| CanvasTransform vScale) { |
| super(); |
| mViewHierarchy = viewHierarchy; |
| mHScale = hScale; |
| mVScale = vScale; |
| } |
| |
| @Override |
| public void create(Device device) { |
| mOutlineColor = new Color(device, SwtDrawingStyle.OUTLINE.getStrokeColor()); |
| } |
| |
| @Override |
| public void dispose() { |
| if (mOutlineColor != null) { |
| mOutlineColor.dispose(); |
| mOutlineColor = null; |
| } |
| } |
| |
| @Override |
| public void paint(GC gc) { |
| CanvasViewInfo lastRoot = mViewHierarchy.getRoot(); |
| if (lastRoot != null) { |
| gc.setForeground(mOutlineColor); |
| gc.setLineStyle(SwtDrawingStyle.OUTLINE.getLineStyle()); |
| int oldAlpha = gc.getAlpha(); |
| gc.setAlpha(SwtDrawingStyle.OUTLINE.getStrokeAlpha()); |
| drawOutline(gc, lastRoot); |
| gc.setAlpha(oldAlpha); |
| } |
| } |
| |
| private void drawOutline(GC gc, CanvasViewInfo info) { |
| 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); |
| |
| // Add +1 to the width and +1 to the height such that when you have a |
| // series of boxes (in say a LinearLayout), instead of the bottom of one |
| // box and the top of the next box being -adjacent-, they -overlap-. |
| // This makes the outline nicer visually since you don't get |
| // "double thickness" lines for all adjacent boxes. |
| gc.drawRectangle(x, y, w + 1, h + 1); |
| |
| for (CanvasViewInfo vi : info.getChildren()) { |
| drawOutline(gc, vi); |
| } |
| } |
| |
| } |