blob: e63fff7ab4ec280d8a606f0054261936ca9c751c [file] [log] [blame]
/*
* 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);
}
}
}