blob: 0de804be85ce7bbee6b0ad6009cc3cff2f290b60 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2005 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.jdt.text.tests.performance;
import org.eclipse.core.resources.IFile;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.test.performance.Performance;
import org.eclipse.test.performance.PerformanceMeter;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.PartInitException;
public abstract class MouseScrollEditorTest extends TextPerformanceTestCase {
public static abstract class Poster {
public abstract void initializeFromForeground(StyledText text);
public abstract void initializeFromBackground();
public abstract void driveFromBackground();
}
public static class ThumbScrollPoster extends Poster {
private Display fDisplay;
private Point fThumb;
public void initializeFromForeground(StyledText text) {
fDisplay= text.getDisplay();
Rectangle textBounds= fDisplay.map(text.getParent(), null, text.getBounds());
int thumbX= textBounds.width - (text.getVerticalBar().getSize().x >> 1);
int thumbY= text.computeTrim(0, 0, 0, 0).height + 2;
fThumb= fDisplay.map(text, null, thumbX, thumbY);
}
public void initializeFromBackground() {
SWTEventHelper.mouseMoveEvent(fDisplay, fThumb.x, fThumb.y++, false);
SWTEventHelper.mouseDownEvent(fDisplay, 1, false);
}
public void driveFromBackground() {
SWTEventHelper.mouseMoveEvent(fDisplay, fThumb.x, fThumb.y++, false);
}
}
public static class AutoScrollPoster extends Poster {
private Display fDisplay;
private Rectangle fTextBounds;
public void initializeFromForeground(StyledText text) {
fDisplay= text.getDisplay();
fTextBounds= fDisplay.map(text.getParent(), null, text.getBounds());
}
public void initializeFromBackground() {
SWTEventHelper.mouseMoveEvent(fDisplay, fTextBounds.x + 1, fTextBounds.y + 1, false);
SWTEventHelper.mouseDownEvent(fDisplay, 1, false);
SWTEventHelper.mouseMoveEvent(fDisplay, fTextBounds.x + 1, fTextBounds.y + fTextBounds.height + 1, false);
SWTEventHelper.mouseMoveEvent(fDisplay, fTextBounds.x + 2, fTextBounds.y + fTextBounds.height + 1, false); // needed for GTK
}
public void driveFromBackground() {
}
}
private PerformanceMeter fPerformanceMeter;
private volatile boolean fDone;
private Display fDisplay;
private StyledText fText;
private int fMaxTopPixel;
private Poster fPoster;
private Error fBackgroundError;
private Runnable fThreadRunnable= new Runnable() {
private volatile int fTopPixel;
private int fOldTopPixel;
private Runnable fRunnable= new Runnable() {
public void run() {
fTopPixel= fText.getTopPixel();
}
};
private Condition fCondition= new Condition() {
public boolean isTrue() {
fDisplay.syncExec(fRunnable);
return fOldTopPixel != fTopPixel;
}
};
public void run() {
try {
fTopPixel= 0;
fPoster.initializeFromBackground();
while (fTopPixel < fMaxTopPixel) {
fPoster.driveFromBackground();
fOldTopPixel= fTopPixel;
assertTrue(fCondition.busyWaitFor(1000));
}
} catch (Error e) {
fBackgroundError= e;
throw e;
} finally {
SWTEventHelper.mouseUpEvent(fDisplay, 1, false);
fDone= true;
fDisplay.wake();
}
}
};
protected void setUp() throws Exception {
super.setUp();
Performance performance= Performance.getDefault();
fPerformanceMeter= performance.createPerformanceMeter(performance.getDefaultScenarioId(this));
EditorTestHelper.bringToTop();
}
protected void tearDown() throws Exception {
super.tearDown();
fPerformanceMeter.dispose();
}
protected void measureScrolling(Poster poster, IFile file) throws PartInitException {
try {
IEditorPart editor= EditorTestHelper.openInEditor(file, true);
EditorTestHelper.joinJobs(5000, 10000, 100);
fText= (StyledText) editor.getAdapter(Control.class);
fDisplay= fText.getDisplay();
fText.setTopPixel(Integer.MAX_VALUE);
fMaxTopPixel= fText.getTopPixel();
fText.setTopPixel(0);
EditorTestHelper.joinJobs(100, 1000, 100);
fPoster= poster;
int warmUpRuns= getWarmUpRuns();
int measuredRuns= getMeasuredRuns();
for (int i= 0; i < warmUpRuns + measuredRuns; i++) {
fPoster.initializeFromForeground(fText);
fDone= false;
new Thread(fThreadRunnable).start();
if (i >= warmUpRuns)
fPerformanceMeter.start();
while (!fDone)
if (!fDisplay.readAndDispatch())
fDisplay.sleep();
if (fBackgroundError != null)
throw fBackgroundError;
if (i >= warmUpRuns)
fPerformanceMeter.stop();
assertEquals(fMaxTopPixel, fText.getTopPixel());
EditorTestHelper.joinJobs(100, 1000, 100);
fText.setTopPixel(0);
EditorTestHelper.joinJobs(100, 1000, 100);
}
fPerformanceMeter.commit();
assertPerformance(fPerformanceMeter);
} finally {
EditorTestHelper.closeAllEditors();
}
}
}