/******************************************************************************* * Copyright (c) 2000, 2003 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Common Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/cpl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.debug.internal.ui; import java.util.HashMap; import java.util.Iterator; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.debug.core.model.IStackFrame; import org.eclipse.debug.core.model.IThread; import org.eclipse.debug.core.model.IValue; import org.eclipse.debug.ui.IDebugEditorPresentation; import org.eclipse.debug.ui.IDebugModelPresentation; import org.eclipse.debug.ui.IValueDetailListener; import org.eclipse.jface.text.source.SourceViewerConfiguration; import org.eclipse.jface.util.ListenerList; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.swt.graphics.Image; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; /** * A proxy to an IDebugModelPresentation extension. Instantiates the extension * when it is needed. */ public class LazyModelPresentation implements IDebugModelPresentation, IDebugEditorPresentation { /** * A temporary mapping of attribute ids to their values * @see IDebugModelPresentation#setAttribute */ protected HashMap fAttributes= new HashMap(3); /** * The config element that defines the extension */ protected IConfigurationElement fConfig = null; /** * The actual presentation instance - null until called upon */ protected IDebugModelPresentation fPresentation = null; /** * Temp holding for listeners - we do not add to presentation until * it needs to be instantiated. */ protected ListenerList fListeners= new ListenerList(5); /* (non-Javadoc) * @see org.eclipse.debug.ui.IDebugEditorPresentation#removeDecorations(org.eclipse.ui.IEditorPart, org.eclipse.debug.core.model.IThread) */ public void removeDecorations(IEditorPart editorPart, IThread thread) { IDebugModelPresentation presentation = getPresentation(); if (presentation instanceof IDebugEditorPresentation) { ((IDebugEditorPresentation)presentation).removeDecorations(editorPart, thread); } } /* (non-Javadoc) * @see org.eclipse.debug.ui.IDebugEditorPresentation#decorateEditor(org.eclipse.ui.IEditorPart, org.eclipse.debug.core.model.IStackFrame) */ public void decorateEditor(IEditorPart editorPart, IStackFrame frame) { IDebugModelPresentation presentation = getPresentation(); if (presentation instanceof IDebugEditorPresentation) { ((IDebugEditorPresentation)presentation).decorateEditor(editorPart, frame); } } /* (non-Javadoc) * @see org.eclipse.debug.ui.IDebugEditorPresentation#selectAndReveal(org.eclipse.ui.IEditorPart, org.eclipse.debug.core.model.IStackFrame) */ public boolean selectAndReveal(IEditorPart editorPart, IStackFrame frame) { IDebugModelPresentation presentation = getPresentation(); if (presentation instanceof IDebugEditorPresentation) { return ((IDebugEditorPresentation)presentation).selectAndReveal(editorPart, frame); } return false; } /* (non-Javadoc) * @see org.eclipse.debug.ui.IDebugEditorPresentation#getInstructionPointerImage(org.eclipse.debug.core.model.IStackFrame) */ public Image getInstructionPointerImage(IStackFrame frame) { IDebugModelPresentation presentation = getPresentation(); if (presentation instanceof IDebugEditorPresentation) { return ((IDebugEditorPresentation)presentation).getInstructionPointerImage(frame); } return null; } /** * Constructs a lazy presentation from the config element. */ public LazyModelPresentation(IConfigurationElement configElement) { fConfig = configElement; } /** * @see IDebugModelPresentation#getImage(Object) */ public Image getImage(Object element) { return getPresentation().getImage(element); } /** * @see IDebugModelPresentation#getText(Object) */ public String getText(Object element) { return getPresentation().getText(element); } /** * @see IDebugModelPresentation#computeDetail(IValue, IValueDetailListener) */ public void computeDetail(IValue value, IValueDetailListener listener) { getPresentation().computeDetail(value, listener); } /** * @see ISourcePresentation#getEditorInput(Object) */ public IEditorInput getEditorInput(Object element) { return getPresentation().getEditorInput(element); } /** * @see ISourcePresentation#getEditorId(IEditorInput, Object) */ public String getEditorId(IEditorInput input, Object inputObject) { return getPresentation().getEditorId(input, inputObject); } /** * @see IBaseLabelProvider#addListener(ILabelProviderListener) */ public void addListener(ILabelProviderListener listener) { if (fPresentation != null) { getPresentation().addListener(listener); } fListeners.add(listener); } /** * @see IBaseLabelProvider#dispose() */ public void dispose() { if (fPresentation != null) { getPresentation().dispose(); } fListeners = null; } /** * @see IBaseLabelProvider#isLabelProperty(Object, String) */ public boolean isLabelProperty(Object element, String property) { if (fPresentation != null) { return getPresentation().isLabelProperty(element, property); } return false; } /** * @see IBaseLabelProvider#removeListener(ILabelProviderListener) */ public void removeListener(ILabelProviderListener listener) { if (fPresentation != null) { getPresentation().removeListener(listener); } fListeners.remove(listener); } /** * Returns the real presentation, instantiating if required. */ protected IDebugModelPresentation getPresentation() { if (fPresentation == null) { try { fPresentation= (IDebugModelPresentation) DebugUIPlugin.createExtension(fConfig, "class"); //$NON-NLS-1$ // configure it if (fListeners != null) { Object[] list = fListeners.getListeners(); for (int i= 0; i < list.length; i++) { fPresentation.addListener((ILabelProviderListener)list[i]); } } Iterator keys= fAttributes.keySet().iterator(); while (keys.hasNext()) { String key= (String)keys.next(); fPresentation.setAttribute(key, fAttributes.get(key)); } } catch (CoreException e) { DebugUIPlugin.log(e); } } return fPresentation; } /** * @see IDebugModelPresentation#setAttribute(String, Object) */ public void setAttribute(String id, Object value) { if (value == null) { return; } if (fPresentation != null) { getPresentation().setAttribute(id, value); } fAttributes.put(id, value); } /** * Returns the identifier of the debug model this * presentation is registered for. */ public String getDebugModelIdentifier() { return fConfig.getAttribute("id"); //$NON-NLS-1$ } /** * Returns a new source viewer configuration for the details * area of the variables view, or null if * unspecified. * * @return source viewer configuration or null * @exception CoreException if unable to create the specified * source viewer configuration */ public SourceViewerConfiguration newDetailsViewerConfiguration() throws CoreException { String attr = fConfig.getAttribute("detailsViewerConfiguration"); //$NON-NLS-1$ if (attr != null) { return (SourceViewerConfiguration)fConfig.createExecutableExtension("detailsViewerConfiguration"); //$NON-NLS-1$ } return null; } }