/******************************************************************************* * Copyright (c) 2007, 2013 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 * Wind River - Pawel Piech - NPE when closing the Variables view (Bug 213719) *******************************************************************************/ package org.eclipse.debug.internal.ui.viewers.model.provisional; import org.eclipse.debug.internal.ui.viewers.model.ViewerAdapterService; import org.eclipse.debug.internal.ui.viewers.model.ViewerInputUpdate; /** * Service to compute a viewer input from a source object * for a given presentation context. * <p> * This class may be instantiated, but it not intended to be sub-classed. * </p> * @since 3.4 * @noextend This class is not intended to be subclassed by clients. */ public class ViewerInputService { /** * An input object which will yield a null input element. * * @since 3.6 */ public final static Object NULL_INPUT = new IViewerInputProvider() { @Override public void update(IViewerInputUpdate update) { update.setInputElement(null); update.done(); } }; // previous update request, cancelled when a new request comes in private IViewerInputUpdate fPendingUpdate = null; private IViewerInputRequestor fRequestor = null; private ITreeModelViewer fViewer; private IViewerInputRequestor fProxyRequest = new IViewerInputRequestor() { @Override public void viewerInputComplete(final IViewerInputUpdate update) { synchronized (ViewerInputService.this) { if (fPendingUpdate == update) { fPendingUpdate = null; } } fRequestor.viewerInputComplete(update); } }; /** * Constructs a viewer input service for the given requester and presentation context. * * @param viewer for which inputs are required * @param requestor client requesting viewer inputs */ public ViewerInputService(ITreeModelViewer viewer, IViewerInputRequestor requestor) { fRequestor = requestor; fViewer = viewer; } /** * Resolves a viewer input derived from the given source object. * Reports the result to the given this service's requester. A requester may be called back * in the same or thread, or asynchronously in a different thread. Cancels any previous * incomplete request from this service's requester. * * @param source source from which to derive a viewer input */ public void resolveViewerInput(Object source) { IViewerInputProvider provdier = ViewerAdapterService.getInputProvider(source); synchronized (this) { // cancel any pending update if (fPendingUpdate != null) { fPendingUpdate.cancel(); } fPendingUpdate = new ViewerInputUpdate(fViewer.getPresentationContext(), fViewer.getInput(), fProxyRequest, source); } if (provdier == null) { fPendingUpdate.setInputElement(source); fPendingUpdate.done(); } else { provdier.update(fPendingUpdate); } } /** * Disposes this viewer input service, canceling any pending jobs. */ public synchronized void dispose() { if (fPendingUpdate != null) { fPendingUpdate.cancel(); fPendingUpdate = null; } } }