blob: 4d3ba08ca0b8466c610b0eaf461ddd9cc7a18a14 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2010 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.draw2d.test;
import java.util.Map;
import junit.framework.AssertionFailedError;
import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.Figure;
import org.eclipse.draw2d.FigureCanvas;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.MarginBorder;
import org.eclipse.draw2d.RectangleFigure;
import org.eclipse.draw2d.UpdateListener;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class PaintDamageEraseTest extends AbstractFixtureTestCase implements
UpdateListener {
private FigureCanvas fc;
protected IFigure contents;
protected Shell shell;
protected IFigure insideBox;
protected Rectangle lastDamaged;
protected Display d;
protected IFigure container;
private String errMsg;
public void testPaintDamageErase() {
doRelativeBoundsMixedMove2();
doRelativeBoundsMixedMove();
doRelativeBoundsPositiveMove();
doRelativeBoundsNegativeMove();
doAbsoluteBoundsMixedMove2();
doAbsoluteBoundsMixedMove();
doAbsoluteBoundsPositiveMove();
doAbsoluteBoundsNegativeMove();
}
/**
* Tests a mixed move (x pos,y neg) with relative bounds.
*
*/
public void doRelativeBoundsMixedMove2() {
doIndividualSetup(true);
doTestEraseBoxAfterMove(15, -15, "RelativeMixed2");
doIndividualTearDown();
}
/**
* Tests a mixed move (x pos,y neg) with absolute bounds.
*
*/
public void doAbsoluteBoundsMixedMove2() {
doIndividualSetup(false);
doTestEraseBoxAfterMove(15, -15, "AbsoluteMixed2");
doIndividualTearDown();
}
/**
* Tests a mixed move (x neg,x pos) with relative bounds.
*
*/
public void doRelativeBoundsMixedMove() {
doIndividualSetup(true);
doTestEraseBoxAfterMove(-15, 15, "RelativeMixed");
doIndividualTearDown();
}
/**
* Tests a mixed move (x neg, y pos) with absolute bounds.
*
*/
public void doAbsoluteBoundsMixedMove() {
doIndividualSetup(false);
doTestEraseBoxAfterMove(-15, 15, "AbsoluteMixed");
doIndividualTearDown();
}
/**
* Tests a positive move with relative bounds.
*
*/
public void doRelativeBoundsPositiveMove() {
doIndividualSetup(true);
doTestEraseBoxAfterMove(15, 15, "RelativePositive");
doIndividualTearDown();
}
/**
* Tests a negative move with relative bounds.
*
*/
public void doRelativeBoundsNegativeMove() {
doIndividualSetup(true);
doTestEraseBoxAfterMove(-15, -15, "RelativeNegative");
doIndividualTearDown();
}
/**
* Tests a positive move with absolute bounds.
*
*/
public void doAbsoluteBoundsPositiveMove() {
doIndividualSetup(false);
doTestEraseBoxAfterMove(15, 15, "AbsolutePositive");
doIndividualTearDown();
}
/**
* Tests a negative move with absolute bounds.
*
*/
public void doAbsoluteBoundsNegativeMove() {
doIndividualSetup(false);
doTestEraseBoxAfterMove(-15, -15, "AbsoluteNegative");
doIndividualTearDown();
}
/**
* This method tests to see if the old box has been properly erased by
* moving the box by the given offsets and asserting that the damaged region
* is correct.
*
*
*/
public void doTestEraseBoxAfterMove(int xOffset, int yOffset, String msg) {
insideBox.setBounds(insideBox.getBounds().getTranslated(xOffset,
yOffset));
container.getUpdateManager().performUpdate();
assertNotNull(lastDamaged);
int x, y, h, w;
if (xOffset >= 0) {
x = 25;
w = xOffset + 25;
} else {
x = 25 + xOffset;
w = Math.abs(xOffset) + 25;
}
if (yOffset >= 0) {
y = 25;
h = yOffset + 25;
} else {
y = 25 + yOffset;
h = Math.abs(yOffset) + 25;
}
if (lastDamaged == null || x != lastDamaged.x || y != lastDamaged.y
|| h != lastDamaged.height || w != lastDamaged.width) {
errMsg += " " + msg;
}
}
protected void doIndividualSetup(boolean useRelativeCoordinates) {
if (useRelativeCoordinates) {
container = new FigureWithRelativeCoords();
} else {
container = new RectangleFigure();
}
container.setBackgroundColor(ColorConstants.red());
container.setBorder(new MarginBorder(15));
insideBox = new RectangleFigure();
container.add(insideBox);
insideBox.setBackgroundColor(ColorConstants.green());
if (useRelativeCoordinates) {
insideBox.setBounds(new Rectangle(10, 10, 25, 25));
} else {
insideBox.setBounds(new Rectangle(25, 25, 25, 25));
}
fc.setContents(container);
container.getUpdateManager().performUpdate();
while (shell.getDisplay().readAndDispatch()) {
}
container.getUpdateManager().addUpdateListener(this);
}
protected void doIndividualTearDown() {
container.getUpdateManager().removeUpdateListener(this);
fc.setContents(new Figure());
insideBox = null;
lastDamaged = null;
container = null;
}
/*
* @see TestCase#setUp()
*/
protected void setUp() throws Exception {
super.setUp();
errMsg = new String();
shell = new Shell(display);
String appName = getClass().getName();
appName = appName.substring(appName.lastIndexOf('.') + 1);
shell.setText(appName);
shell.setLayout(new FillLayout());
fc = new FigureCanvas(shell);
fc.setSize(200, 200);
shell.open();
}
/*
* @see TestCase#tearDown()
*/
protected void tearDown() throws Exception {
shell.dispose();
if (!errMsg.equals("")) {
throw new AssertionFailedError(errMsg);
}
super.tearDown();
}
/**
* Constructor for PaintDamageEraseTest.
*
* @param name
*/
public PaintDamageEraseTest(String name) {
super(name);
}
public void notifyPainting(Rectangle damage, Map dirtyRegions) {
lastDamaged = damage;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.draw2d.UpdateListener#notifyValidating()
*/
public void notifyValidating() {
// nothing
}
}
class FigureWithRelativeCoords extends RectangleFigure {
protected boolean useLocalCoordinates() {
return true;
}
}