diff options
Diffstat (limited to 'org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/AsynchronousModel.java')
-rw-r--r-- | org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/AsynchronousModel.java | 641 |
1 files changed, 0 insertions, 641 deletions
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/AsynchronousModel.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/AsynchronousModel.java deleted file mode 100644 index b1225caa7..000000000 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/AsynchronousModel.java +++ /dev/null @@ -1,641 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2006, 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.debug.internal.ui.viewers; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IAdaptable; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Platform; -import org.eclipse.core.runtime.Status; -import org.eclipse.core.runtime.jobs.Job; -import org.eclipse.debug.internal.ui.DebugUIPlugin; -import org.eclipse.debug.internal.ui.elements.adapters.AsynchronousDebugLabelAdapter; -import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxy; -import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxyFactory; -import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext; -import org.eclipse.debug.internal.ui.viewers.model.provisional.IStatusMonitor; -import org.eclipse.debug.internal.ui.viewers.provisional.AsynchronousContentAdapter; -import org.eclipse.debug.internal.ui.viewers.provisional.IAsynchronousContentAdapter; -import org.eclipse.debug.internal.ui.viewers.provisional.IAsynchronousLabelAdapter; -import org.eclipse.debug.internal.ui.viewers.provisional.IChildrenRequestMonitor; -import org.eclipse.debug.internal.ui.viewers.provisional.ILabelRequestMonitor; -import org.eclipse.jface.viewers.ViewerFilter; -import org.eclipse.jface.viewers.ViewerSorter; - -/** - * Model for an asynchronous viewer - * - * @since 3.2 - */ -public abstract class AsynchronousModel { - - private ModelNode fRoot; // root node - private Map fElementToNodes = new HashMap(); // map of element to corresponding tree nodes (list) - private Map fModelProxies = new HashMap(); // map of installed model proxies, by element - private AsynchronousViewer fViewer; // viewer this model works for - private boolean fDisposed = false; // whether disposed - - // debug flags - public static boolean DEBUG_MODEL = false; - - static { - DEBUG_MODEL = DebugUIPlugin.DEBUG && "true".equals( //$NON-NLS-1$ - Platform.getDebugOption("org.eclipse.debug.ui/debug/viewers/model")); //$NON-NLS-1$ - } - - class EmptyContentAdapter extends AsynchronousContentAdapter { - - /* (non-Javadoc) - * @see org.eclipse.debug.internal.ui.viewers.provisional.AsynchronousContentAdapter#getChildren(java.lang.Object, org.eclipse.debug.internal.ui.viewers.provisional.IPresentationContext) - */ - protected Object[] getChildren(Object parent, IPresentationContext context) throws CoreException { - return EMPTY; - } - - /* (non-Javadoc) - * @see org.eclipse.debug.internal.ui.viewers.provisional.AsynchronousContentAdapter#hasChildren(java.lang.Object, org.eclipse.debug.internal.ui.viewers.provisional.IPresentationContext) - */ - protected boolean hasChildren(Object element, IPresentationContext context) throws CoreException { - return false; - } - - /* (non-Javadoc) - * @see org.eclipse.debug.internal.ui.viewers.provisional.AsynchronousContentAdapter#supportsPartId(java.lang.String) - */ - protected boolean supportsPartId(String id) { - return true; - } - } - - protected IAsynchronousContentAdapter fEmptyContentAdapter = new EmptyContentAdapter(); - - /** - * List of requests currently being performed. - */ - private List fPendingUpdates = new ArrayList(); - - /** - * List of pending viewer udpates - */ - private List fViewerUpdates = new ArrayList(); - - /** - * Constructs a new empty tree model - * - * @param viewer associated viewer - */ - public AsynchronousModel(AsynchronousViewer viewer) { - fViewer = viewer; - if (DEBUG_MODEL) { - StringBuffer buffer = new StringBuffer(); - buffer.append("MODEL CREATED for: "); //$NON-NLS-1$ - buffer.append(fViewer); - buffer.append(" ("); //$NON-NLS-1$ - buffer.append(this); - buffer.append(")"); //$NON-NLS-1$ - DebugUIPlugin.debug(buffer.toString()); - } - } - - /** - * Initializes this model. Called once after creation. - * - * @param root root element or <code>null</code> - * @param widget root widget/control - */ - public void init(Object root) { - if (root != null) { - fRoot = new ModelNode(null, root); - mapElement(root, fRoot); - } - } - - protected AsynchronousViewer getViewer() { - return fViewer; - } - - /** - * Disposes this model - */ - public synchronized void dispose() { - if (DEBUG_MODEL) { - StringBuffer buffer = new StringBuffer(); - buffer.append("MODEL DISPOSED for: "); //$NON-NLS-1$ - buffer.append(fViewer); - buffer.append(" ("); //$NON-NLS-1$ - buffer.append(this); - buffer.append(")"); //$NON-NLS-1$ - DebugUIPlugin.debug(buffer.toString()); - } - fDisposed = true; - cancelPendingUpdates(); - disposeAllModelProxies(); - ModelNode rootNode = getRootNode(); - if (rootNode != null) { - rootNode.dispose(); - } - fElementToNodes.clear(); - } - - /** - * Returns whether this model has been disposed - */ - public synchronized boolean isDisposed() { - return fDisposed; - } - - /** - * Cancels all pending update requests. - */ - protected synchronized void cancelPendingUpdates() { - Iterator updates = fPendingUpdates.iterator(); - while (updates.hasNext()) { - IStatusMonitor update = (IStatusMonitor) updates.next(); - updates.remove(); - update.setCanceled(true); - } - fPendingUpdates.clear(); - } - - /** - * Installs the model proxy for the given element into this viewer - * if not already installed. - * - * @param element element to install an update policy for - */ - public synchronized void installModelProxy(Object element) { - if (!fModelProxies.containsKey(element)) { - IModelProxyFactory modelProxyFactory = getModelProxyFactoryAdapter(element); - if (modelProxyFactory != null) { - final IModelProxy proxy = modelProxyFactory.createModelProxy(element, getPresentationContext()); - if (proxy != null) { - fModelProxies.put(element, proxy); - Job job = new Job("Model Proxy installed notification job") {//$NON-NLS-1$ - protected IStatus run(IProgressMonitor monitor) { - if (!monitor.isCanceled()) { - proxy.init(getPresentationContext()); - getViewer().modelProxyAdded(proxy); - proxy.installed(getViewer()); - } - return Status.OK_STATUS; - } - }; - job.setSystem(true); - job.schedule(); - } - } - } - } - - /** - * Uninstalls the model proxy installed for the given element, if any. - * - * @param element - */ - protected synchronized void disposeModelProxy(Object element) { - IModelProxy proxy = (IModelProxy) fModelProxies.remove(element); - if (proxy != null) { - getViewer().modelProxyRemoved(proxy); - proxy.dispose(); - } - } - - /** - * Unintalls all model proxies installed for this model - */ - private void disposeAllModelProxies() { - synchronized(fModelProxies) { - Iterator updatePolicies = fModelProxies.values().iterator(); - while (updatePolicies.hasNext()) { - IModelProxy proxy = (IModelProxy)updatePolicies.next(); - getViewer().modelProxyRemoved(proxy); - proxy.dispose(); - } - - fModelProxies.clear(); - } - } - - /** - * Returns the presentation this model is installed in - * - * @return - */ - protected IPresentationContext getPresentationContext() { - return fViewer.getPresentationContext(); - } - - /** - * Returns the model proxy factory for the given element of <code>null</code> if none. - * - * @param element element to retrieve adapters for - * @return model proxy factory adapter or <code>null</code> - */ - protected IModelProxyFactory getModelProxyFactoryAdapter(Object element) { - IModelProxyFactory adapter = null; - if (element instanceof IModelProxyFactory) { - adapter = (IModelProxyFactory) element; - } else if (element instanceof IAdaptable) { - IAdaptable adaptable = (IAdaptable) element; - adapter = (IModelProxyFactory) adaptable.getAdapter(IModelProxyFactory.class); - } - return adapter; - } - - /** - * Maps the given element to the given node. - * - * @param element - * @param node - */ - protected synchronized void mapElement(Object element, ModelNode node) { - ModelNode[] nodes = getNodes(element); - node.remap(element); - if (nodes == null) { - fElementToNodes.put(element, new ModelNode[] { node}); - } else { - for (int i = 0; i < nodes.length; i++) { - if (nodes[i] == node) { - return; - } - } - ModelNode[] old = nodes; - ModelNode[] newNodes = new ModelNode[old.length + 1]; - System.arraycopy(old, 0, newNodes, 0, old.length); - newNodes[old.length] = node; - fElementToNodes.put(element, newNodes); - } - installModelProxy(element); - } - - /** - * Unmaps the given node from its element and widget. - * - * @param node - */ - protected synchronized void unmapNode(ModelNode node) { - Object element = node.getElement(); - ModelNode[] nodes = (ModelNode[]) fElementToNodes.get(element); - if (nodes == null) { - return; - } - if (nodes.length == 1) { - fElementToNodes.remove(element); - disposeModelProxy(element); - } else { - for (int i = 0; i < nodes.length; i++) { - ModelNode node2 = nodes[i]; - if (node2 == node) { - ModelNode[] newNodes= new ModelNode[nodes.length - 1]; - System.arraycopy(nodes, 0, newNodes, 0, i); - if (i < newNodes.length) { - System.arraycopy(nodes, i + 1, newNodes, i, newNodes.length - i); - } - fElementToNodes.put(element, newNodes); - } - } - } - } - - /** - * Returns the nodes in this model for the given element or - * <code>null</code> if none. - * - * @param element model element - * @return associated nodes or <code>null</code> - */ - public synchronized ModelNode[] getNodes(Object element) { - return (ModelNode[]) fElementToNodes.get(element); - } - - /** - * Returns the root node or <code>null</code> - * - * @return the root node or <code>null</code> - */ - public ModelNode getRootNode() { - return fRoot; - } - - /** - * Cancels any conflicting updates for children of the given item, and - * schedules the new update. - * - * @param update the update to schedule - */ - protected void requestScheduled(IStatusMonitor update) { - AsynchronousRequestMonitor absUpdate = (AsynchronousRequestMonitor) update; - synchronized (fPendingUpdates) { - Iterator updates = fPendingUpdates.listIterator(); - while (updates.hasNext()) { - AsynchronousRequestMonitor pendingUpdate = (AsynchronousRequestMonitor) updates.next(); - if (absUpdate.contains(pendingUpdate)) { - updates.remove(); - pendingUpdate.setCanceled(true); - } - } - fPendingUpdates.add(update); - } - } - - /** - * Removes the update from the pending updates list. - * - * @param update - */ - protected void requestComplete(IStatusMonitor update) { - synchronized (fPendingUpdates) { - fPendingUpdates.remove(update); - } - } - - /** - * An viewer update has been scheduled due to the following update request. - * - * @param update - */ - protected void viewerUpdateScheduled(IStatusMonitor update) { - // synch viewer updates and pending updates on same lock - fPendingUpdates - synchronized (fPendingUpdates) { - fViewerUpdates.add(update); - } - } - - /** - * Returns the result of running the given elements through the - * viewers filters. - * - * @param parent parent element - * @param elements the elements to filter - * @return only the elements which all filters accept - */ - protected Object[] filter(Object parent, Object[] elements) { - ViewerFilter[] filters = getViewer().getFilters(); - if (filters != null) { - ArrayList filtered = new ArrayList(elements.length); - for (int i = 0; i < elements.length; i++) { - boolean add = true; - for (int j = 0; j < filters.length; j++) { - add = filters[j].select(getViewer(), parent, elements[i]); - if (!add) - break; - } - if (add) - filtered.add(elements[i]); - } - return filtered.toArray(); - } - return elements; - } - - /** - * Refreshes the given node. - * - * @param node - */ - protected void updateLabel(ModelNode node) { - Object element = node.getElement(); - IAsynchronousLabelAdapter adapter = getLabelAdapter(element); - if (adapter != null) { - ILabelRequestMonitor labelUpdate = new LabelRequestMonitor(node, this); - requestScheduled(labelUpdate); - adapter.retrieveLabel(element, getPresentationContext(), labelUpdate); - } - } - - /** - * Returns the label adapter for the given element or <code>null</code> if none. - * - * @param element element to retrieve adapter for - * @return presentation adapter or <code>null</code> - */ - protected IAsynchronousLabelAdapter getLabelAdapter(Object element) { - IAsynchronousLabelAdapter adapter = null; - if (element instanceof IAsynchronousLabelAdapter) { - adapter = (IAsynchronousLabelAdapter) element; - } else if (element instanceof IAdaptable) { - IAdaptable adaptable = (IAdaptable) element; - adapter = (IAsynchronousLabelAdapter) adaptable.getAdapter(IAsynchronousLabelAdapter.class); - } - // if no adapter, use default (i.e. model presentation) - if (adapter == null) { - return new AsynchronousDebugLabelAdapter(); - } - return adapter; - } - - /** - * Returns the tree element adapter for the given element or - * <code>null</code> if none. - * - * @param element - * element to retrieve adapter for - * @return presentation adapter or <code>null</code> - */ - protected IAsynchronousContentAdapter getContentAdapter(Object element) { - IAsynchronousContentAdapter adapter = null; - if (element instanceof IAsynchronousContentAdapter) { - adapter = (IAsynchronousContentAdapter) element; - } else if (element instanceof IAdaptable) { - IAdaptable adaptable = (IAdaptable) element; - adapter = (IAsynchronousContentAdapter) adaptable.getAdapter(IAsynchronousContentAdapter.class); - } - return adapter; - } - - /** - * Updates the children of the given node. - * - * @param parent - * node of which to update children - */ - public void updateChildren(ModelNode parent) { - Object element = parent.getElement(); - IAsynchronousContentAdapter adapter = getContentAdapter(element); - if (adapter == null) { - adapter = fEmptyContentAdapter; - } - if (adapter != null) { - IChildrenRequestMonitor update = new ChildrenRequestMonitor(parent, this); - requestScheduled(update); - adapter.retrieveChildren(element, getPresentationContext(), update); - } - } - - /** - * Update this model's viewer preserving its selection. - * - * @param update - */ - protected void preservingSelection(Runnable update) { - getViewer().preservingSelection(update); - } - - /** - * The viewer updated associated with a request is compelte. - * - * @param monitor - */ - protected void viewerUpdateComplete(IStatusMonitor monitor) { - // synch viewer updates and pending updates on same lock - fPendingUpdates - synchronized (fPendingUpdates) { - fViewerUpdates.remove(monitor); - } - getViewer().updateComplete(monitor); - } - - /** - * An update request was cancelled - * - * @param monitor - */ - protected void requestCanceled(AsynchronousRequestMonitor monitor) { - synchronized (fPendingUpdates) { - fPendingUpdates.remove(monitor); - } - } - - /** - * Whether any updates are still in progress in the model or against the viewer. - * - * @return - */ - protected boolean hasPendingUpdates() { - synchronized (fViewerUpdates) { - return !fPendingUpdates.isEmpty() || !fViewerUpdates.isEmpty(); - } - } - - /** - * Asynchronous update for add/set children request. - * - * @param parent - * @param element - */ - protected abstract void add(ModelNode parent, Object element); - - /** - * Notification from children request monitor - * - * @param parentNode parent node - * @param kids list of model elements - */ - protected void setChildren(final ModelNode parentNode, List kids) { - - final Object[] children = filter(parentNode.getElement(), kids.toArray()); - final AsynchronousViewer viewer = getViewer(); - ViewerSorter sorter = viewer.getSorter(); - if (sorter != null) { - sorter.sort(viewer, children); - } - - ModelNode[] prevKids = null; - ModelNode[] newChildren = null; - ModelNode[] unmap = null; - - synchronized (this) { - if (isDisposed()) { - return; - } - prevKids = parentNode.getChildrenNodes(); - if (prevKids == null) { - newChildren = new ModelNode[children.length]; - for (int i = 0; i < children.length; i++) { - ModelNode node = new ModelNode(parentNode, children[i]); - mapElement(children[i], node); - newChildren[i] = node; - } - parentNode.setChildren(newChildren); - } else { - newChildren = new ModelNode[children.length]; - unmap = new ModelNode[prevKids.length]; - for (int i = 0; i < prevKids.length; i++) { - unmap[i] = prevKids[i]; - } - for (int i = 0; i < children.length; i++) { - Object child = children[i]; - boolean found = false; - for (int j = 0; j < prevKids.length; j++) { - ModelNode prevKid = prevKids[j]; - if (prevKid != null && child.equals(prevKid.getElement())) { - newChildren[i] = prevKid; - prevKids[j] = null; - found = true; - break; - } - } - if (!found) { - newChildren[i] = new ModelNode(parentNode, child); - mapElement(child, newChildren[i]); - } - } - for (int i = 0; i < prevKids.length; i++) { - ModelNode kid = prevKids[i]; - if (kid != null) { - kid.dispose(); - unmapNode(kid); - } - } - parentNode.setChildren(newChildren); - } - if (DEBUG_MODEL) { - DebugUIPlugin.debug("CHILDREN CHANGED: " + parentNode); //$NON-NLS-1$ - DebugUIPlugin.debug(toString()); - } - } - - //update viewer outside the lock - final ModelNode[] finalUnmap = unmap; - preservingSelection(new Runnable() { - public void run() { - if (finalUnmap != null) { - for (int i = 0; i < finalUnmap.length; i++) { - viewer.unmapNode(finalUnmap[i]); - } - } - viewer.nodeChildrenChanged(parentNode); - } - }); - - } - - public String toString() { - StringBuffer buf = new StringBuffer(); - if (fRoot != null) { - buf.append("ROOT: "); //$NON-NLS-1$ - append(buf, fRoot, 0); - } else { - buf.append("ROOT: null"); //$NON-NLS-1$ - } - return buf.toString(); - } - - private void append(StringBuffer buf, ModelNode node, int level) { - for (int i = 0; i < level; i++) { - buf.append('\t'); - } - buf.append(node); - buf.append('\n'); - ModelNode[] childrenNodes = node.getChildrenNodes(); - if (childrenNodes != null) { - for (int i = 0; i < childrenNodes.length; i++) { - append(buf, childrenNodes[i], level + 1); - } - } - } -} |