blob: b2cf8e76a6c16b1f5de50d1863e5e28cb6672bcc [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2003, 2007 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.internal.navigator.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.internal.navigator.CommonNavigatorMessages;
import org.eclipse.ui.internal.navigator.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)}.
*
*
*
* @since 3.2
*/
public class StructuredViewerManager {
private Viewer viewer;
private Object cachedOldInput;
private Object cachedNewInput;
private UIJob refreshJob = new UIJob(
CommonNavigatorMessages.StructuredViewerManager_0) {
public IStatus runInUIThread(IProgressMonitor monitor) {
if(viewer != null) {
try {
if (viewer.getControl().isDisposed()) {
return Status.OK_STATUS;
}
Display display = viewer.getControl().getDisplay();
if (!display.isDisposed() && viewer != null) {
try {
viewer.getControl().setRedraw(false);
viewer.refresh();
} finally {
viewer.getControl().setRedraw(true);
}
}
} catch (RuntimeException e) {
NavigatorPlugin.logError(0, e.toString(), e);
}
}
return Status.OK_STATUS;
}
};
/**
*
* @param aViewer
*/
public StructuredViewerManager(Viewer aViewer) {
super();
viewer = aViewer;
refreshJob.setSystem(true);
}
/**
*
* @return The real viewer.
*/
public Viewer getViewer() {
return viewer;
}
/**
*
* @param anOldInput
* @param aNewInput
*/
public void inputChanged(Object anOldInput, Object aNewInput) {
cachedOldInput = anOldInput;
cachedNewInput = aNewInput;
}
/**
*
* @param aViewer
* @param anOldInput
* @param aNewInput
*/
public void inputChanged(Viewer aViewer, Object anOldInput, Object aNewInput) {
viewer = aViewer;
cachedOldInput = anOldInput;
cachedNewInput = aNewInput;
}
/**
*
* @param aContentProvider
* @return True if all is well.
*/
public boolean initialize(IStructuredContentProvider aContentProvider) {
boolean result = true;
try {
if (aContentProvider != null) {
aContentProvider.inputChanged(viewer, cachedOldInput,
cachedNewInput);
}
} catch (RuntimeException e) {
NavigatorPlugin.logError(0, e.toString(), e);
result = false;
}
return result;
}
/**
*
*/
public void safeRefresh() {
refreshJob.schedule(10);
}
}