blob: 860b76176ae50229f0ef5a28ef663181790a7630 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2003, 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.ui.navigator.internal.extensions;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.navigator.internal.CommonNavigatorMessages;
import org.eclipse.ui.navigator.internal.NavigatorPlugin;
import org.eclipse.ui.progress.UIJob;
/**
* <p>
* Provides a consistent mechanism to interact with StructuredViewers over time. The Common
* Navigator framework attempts to defer the loading of extensions, which also means defering the
* loading of Content Providers. To follow the contracts already in place by
* {@link org.eclipse.jface.viewers.ITreeContentProvider}, the Viewer, Old Input, and New Input
* parameters for
* {@link org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)}
* are cached for content providers that have not been loaded yet.
* </p>
* <p>
* <b>WARNING: </b> The following class is not inherently thread-safe. Appropriate measures should
* be taken to ensure that {@link #inputChanged(Object, Object)}and
* {@link #inputChanged(Viewer, Object, Object)}are not called concurrently with
* {@link #initialize(IStructuredContentProvider)}.
*
*
* <p>
* <strong>EXPERIMENTAL</strong>. This class or interface has been added as part of a work in
* progress. There is a guarantee neither that this API will work nor that it will remain the same.
* Please do not use this API without consulting with the Platform/UI team.
* </p>
*
* @since 3.2
*/
public class StructuredViewerManager {
private Viewer viewer;
private Object cachedOldInput;
private Object cachedNewInput;
/**
*
*/
public StructuredViewerManager(Viewer aViewer) {
super();
viewer= aViewer;
}
public Viewer getViewer() {
return viewer;
}
public void inputChanged(Object anOldInput, Object aNewInput) {
cachedOldInput= anOldInput;
cachedNewInput= aNewInput;
}
public void inputChanged(Viewer aViewer, Object anOldInput, Object aNewInput) {
viewer= aViewer;
cachedOldInput= anOldInput;
cachedNewInput= aNewInput;
}
public boolean initialize(IStructuredContentProvider aContentProvider) {
boolean result= true;
try {
if (aContentProvider != null)
aContentProvider.inputChanged(viewer, cachedOldInput, cachedNewInput);
} catch (RuntimeException e) {
NavigatorPlugin.log(e.toString(), new Status(IStatus.ERROR, NavigatorPlugin.PLUGIN_ID, 0, e.toString(), e));
result= false;
}
return result;
}
/**
*
*/
public void safeRefresh() {
UIJob refreshJob= new UIJob(CommonNavigatorMessages.StructuredViewerManager_0) {
public IStatus runInUIThread(IProgressMonitor monitor) {
try {
if(viewer.getControl().isDisposed())
return Status.OK_STATUS;
Display display = viewer.getControl().getDisplay();
if (!display.isDisposed() && viewer != null)
viewer.refresh();
} catch (RuntimeException e) {
NavigatorPlugin.log(e.toString(), new Status(IStatus.ERROR, NavigatorPlugin.PLUGIN_ID, 0, e.toString(), e));
}
return Status.OK_STATUS;
}
};
refreshJob.schedule();
}
}