blob: 633475122834426d8cb2f7ecbc472ae8670c0a92 [file] [log] [blame]
/*
* Copyright (C) 2008 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.parts;
import com.android.ide.eclipse.adt.internal.editors.layout.parts.UiLayoutEditPart.HighlightInfo;
import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.Figure;
import org.eclipse.draw2d.Graphics;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.swt.SWT;
/**
* The figure used to draw the feedback on a layout.
* <p/>
* By default the figure is transparent and empty.
* The base {@link ElementFigure} knows how to draw the selection border.
* This figure knows how to draw the drop feedback.
*
* @since GLE1
*/
class LayoutFigure extends ElementFigure {
private HighlightInfo mHighlightInfo;
public LayoutFigure() {
super();
}
public void setHighlighInfo(HighlightInfo highlightInfo) {
mHighlightInfo = highlightInfo;
repaint();
}
/**
* Paints the "border" for this figure.
* <p/>
* The parent {@link Figure#paint(Graphics)} calls {@link #paintFigure(Graphics)} then
* {@link #paintClientArea(Graphics)} then {@link #paintBorder(Graphics)}. Here we thus
* draw the actual highlight border but also the highlight anchor lines and points so that
* we can make sure they are all drawn on top of the border.
* <p/>
* Note: This method doesn't really need to restore its graphic state. The parent
* Figure will do it for us.
* <p/>
*
* @param graphics The Graphics object used for painting
*/
@Override
protected void paintBorder(Graphics graphics) {
super.paintBorder(graphics);
if (mHighlightInfo == null) {
return;
}
// Draw the border. We want other highlighting to be drawn on top of the border.
if (mHighlightInfo.drawDropBorder) {
graphics.setLineWidth(3);
graphics.setLineStyle(SWT.LINE_SOLID);
graphics.setForegroundColor(ColorConstants.green);
graphics.drawRectangle(getInnerBounds().getCopy().shrink(1, 1));
}
Rectangle bounds = getBounds();
int bx = bounds.x;
int by = bounds.y;
int w = bounds.width;
int h = bounds.height;
// Draw frames of target child parts, if any
if (mHighlightInfo.childParts != null) {
graphics.setLineWidth(2);
graphics.setLineStyle(SWT.LINE_DOT);
graphics.setForegroundColor(ColorConstants.lightBlue);
for (UiElementEditPart part : mHighlightInfo.childParts) {
if (part != null) {
graphics.drawRectangle(part.getBounds().getCopy().translate(bx, by));
}
}
}
// Draw the target line, if any
if (mHighlightInfo.linePoints != null) {
int x1 = mHighlightInfo.linePoints[0].x;
int y1 = mHighlightInfo.linePoints[0].y;
int x2 = mHighlightInfo.linePoints[1].x;
int y2 = mHighlightInfo.linePoints[1].y;
// if the line is right to the edge, draw it one pixel more inside so that the
// full 2-pixel width be visible.
if (x1 <= 0) x1++;
if (x2 <= 0) x2++;
if (y1 <= 0) y1++;
if (y2 <= 0) y2++;
if (x1 >= w - 1) x1--;
if (x2 >= w - 1) x2--;
if (y1 >= h - 1) y1--;
if (y2 >= h - 1) y2--;
x1 += bx;
x2 += bx;
y1 += by;
y2 += by;
graphics.setLineWidth(2);
graphics.setLineStyle(SWT.LINE_DASH);
graphics.setLineCap(SWT.CAP_ROUND);
graphics.setForegroundColor(ColorConstants.orange);
graphics.drawLine(x1, y1, x2, y2);
}
// Draw the anchor point, if any
if (mHighlightInfo.anchorPoint != null) {
int x = mHighlightInfo.anchorPoint.x;
int y = mHighlightInfo.anchorPoint.y;
// If the point is right on the edge, draw it one pixel inside so that it
// matches the highlight line. It makes it slightly more visible that way.
if (x <= 0) x++;
if (y <= 0) y++;
if (x >= w - 1) x--;
if (y >= h - 1) y--;
x += bx;
y += by;
graphics.setLineWidth(2);
graphics.setLineStyle(SWT.LINE_SOLID);
graphics.setLineCap(SWT.CAP_ROUND);
graphics.setForegroundColor(ColorConstants.orange);
graphics.drawLine(x-5, y-5, x+5, y+5);
graphics.drawLine(x-5, y+5, x+5, y-5);
// 7 * cos(45) == 5 so we use 8 for the circle radius (it looks slightly better than 7)
graphics.setLineWidth(1);
graphics.drawOval(x-8, y-8, 16, 16);
}
}
}