/*******************************************************************************
* Copyright (c) 2014 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.systemtap.ui.ide.views;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
import org.eclipse.core.runtime.jobs.JobChangeAdapter;
import org.eclipse.linuxtools.internal.systemtap.ui.ide.Localization;
import org.eclipse.linuxtools.internal.systemtap.ui.ide.structures.TapsetLibrary;
import org.eclipse.linuxtools.internal.systemtap.ui.ide.structures.tparsers.TapsetParser;
import org.eclipse.linuxtools.internal.systemtap.ui.ide.structures.tparsers.TreeTapsetParser;
import org.eclipse.swt.widgets.Composite;
/**
* A base class for a {@link BrowserView} for displaying tapset information, which
* relies on the results of an externally-run {@link TapsetParser}. Contents are
* kept up-to-date with the status of the parser.
*/
public abstract class TapsetBrowserView extends BrowserView {
/**
* The parser that the contents of this view rely on.
*/
private final TreeTapsetParser parser;
private final Object lock = new Object();
protected JobChangeAdapter viewUpdater = new JobChangeAdapter() {
@Override
public void aboutToRun(IJobChangeEvent event) {
synchronized (lock) {
displayLoadingMessage();
}
}
@Override
public void done(IJobChangeEvent event) {
synchronized (lock) {
if (event.getResult().isOK()) {
displayContents();
} else {
displayCancelContents();
}
}
}
};
/**
* Creates a new {@link BrowserView} for displaying tapset contents, which will
* be provided by an externally-run {@link TreeTapsetParser}.
* @param job The parser used to obtain the tapset contents this view will display.
*/
public TapsetBrowserView(TreeTapsetParser parser) {
Assert.isNotNull(parser);
this.parser = parser;
}
@Override
public void createPartControl(Composite parent) {
super.createPartControl(parent);
makeActions();
// Add listener and display initial contents based on the state of the last parser job.
synchronized (lock) {
IStatus result = parser.safelyAddJobChangeListener(viewUpdater);
if (result != null) {
if (result.isOK()) {
displayContents();
} else {
displayCancelContents();
}
} else {
displayLoadingMessage();
}
}
}
/**
* Displays a loading message in the view and sets the view as refreshable.
* Automatically called whenever a parse job restarts; should not be called by clients.
*/
@Override
protected void displayLoadingMessage() {
super.displayLoadingMessage();
setRefreshable(false);
}
/**
* Populates the view with its contents obtained by the most recent run of {@link #parser}.
* Automatically called whenever a parse job succeeds; should not be called by clients.
*/
abstract protected void displayContents();
/**
* Clears the view and sets it as refreshable when the {@link parser} job fails or is canceled.
* Automatically called whenever a parse job fails; should not be called by clients.
*/
protected void displayCancelContents() {
displayMessage(Localization.getString("BrowserView.TryRefresh")); //$NON-NLS-1$
setRefreshable(true);
}
/**
* Reruns the tapset parser to refresh the list of both probes and functions.
*/
@Override
protected void refresh() {
TapsetLibrary.runStapParser();
}
@Override
public void dispose() {
super.dispose();
parser.removeJobChangeListener(viewUpdater);
}
}