blob: daa3e0eae635a011ad2006d35c0b367c0279afdc [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 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();
mViewHierarchy = viewHierarchy;
mHScale = hScale;
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);
}
}