diff options
Diffstat (limited to 'eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/OutlineOverlay.java')
-rw-r--r-- | eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/OutlineOverlay.java | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/OutlineOverlay.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/OutlineOverlay.java new file mode 100644 index 000000000..e63fff7ab --- /dev/null +++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/OutlineOverlay.java @@ -0,0 +1,107 @@ +/* + * 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); + } + } + +} |