/*******************************************************************************
* Copyright (c) 2009 Red Hat, Inc.
* 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:
* Red Hat - initial API and implementation
*******************************************************************************/
package org.eclipse.linuxtools.internal.callgraph.graphlisteners;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.linuxtools.internal.callgraph.StapGraph;
import org.eclipse.swt.widgets.Display;
/**
* A Projectionist is the gguy that operates a movie camera.
* @author chwang
*
*/
public class Projectionist extends Job {
private StapGraph graph;
private int frameTime = 2000;
private boolean pause;
private boolean busy;
/**
* @param name
* @param listener -- the keyListener instantiating this class
* @param time -- Amount of time between frames
*/
public Projectionist(String name, StapGraph graph, int time) {
super(name);
this.graph = graph;
this.frameTime = time;
pause = false;
busy = false;
}
@Override
public IStatus run(IProgressMonitor monitor) {
long snapshot = System.currentTimeMillis();
while (true) {
if (busy) {
try {
Thread.sleep(300);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
continue;
}
if (pause) {
return Status.OK_STATUS;
}
if (System.currentTimeMillis() - snapshot >= frameTime) {
snapshot = System.currentTimeMillis();
busy = true;
Display.getDefault().asyncExec(() -> {
graph.drawNextNode();
busy = false;
});
} else {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (monitor.isCanceled()) {
break;
}
}
return Status.CANCEL_STATUS;
}
/**
* Projectionist will pause -- reschedule job to continue
*/
public void pause() {
pause = true;
}
}