Java tutorial
/******************************************************************************* * Copyright (c) 2009 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 * Zend Technologies *******************************************************************************/ package org.eclipse.php.internal.debug.ui.views; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.debug.core.DebugException; import org.eclipse.debug.core.model.IDebugElement; import org.eclipse.debug.core.model.IDebugTarget; import org.eclipse.debug.core.model.IThread; import org.eclipse.debug.ui.AbstractDebugView; import org.eclipse.debug.ui.DebugUITools; import org.eclipse.debug.ui.IDebugUIConstants; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.php.internal.debug.core.IPHPDebugConstants; import org.eclipse.php.internal.debug.core.zend.debugger.Expression; import org.eclipse.php.internal.debug.core.zend.debugger.ExpressionValue; import org.eclipse.php.internal.debug.core.zend.debugger.ExpressionsManager; import org.eclipse.php.internal.debug.core.zend.model.PHPDebugTarget; import org.eclipse.php.internal.debug.core.zend.model.PHPStackFrame; import org.eclipse.php.internal.debug.core.zend.model.PHPThread; import org.eclipse.php.internal.debug.ui.Logger; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.ISelectionListener; import org.eclipse.ui.IWorkbenchActionConstants; import org.eclipse.ui.IWorkbenchPart; /** * View of the PHP parameter stack */ public class PHPStackView extends AbstractDebugView implements ISelectionListener { private PHPDebugTarget fTarget; private boolean isVisible; class StackViewContentProvider implements ITreeContentProvider { /* * (non-Javadoc) * * @see * org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang * .Object) */ public Object[] getChildren(Object element) { try { if (element instanceof PHPDebugTarget) { IThread[] threads = ((PHPDebugTarget) element).getThreads(); if (threads != null) { if (threads[0] != null) { return ((PHPThread) threads[0]).getStackVariables(); } } } else if (element instanceof PHPThread) { return ((PHPThread) element).getStackVariables(); } else if (element instanceof PHPStackFrame) { return ((PHPStackFrame) element).getStackVariables(); } else if (element instanceof Expression) { Expression eExp = (Expression) element; ExpressionValue value = eExp.getValue(); Expression[] eChildren = value.getChildren(); if (eChildren == null) return new Expression[0]; if (eChildren.length == 0) { ExpressionsManager expressionManager = fTarget.getExpressionManager(); expressionManager.update(eExp, 1); value = eExp.getValue(); eChildren = value.getChildren(); if (eChildren == null) eChildren = new Expression[0]; } return eChildren; } } catch (DebugException e) { Logger.logException("StackViewContentProvider unexpected error", e); //$NON-NLS-1$ } return new Object[0]; } /* * (non-Javadoc) * * @see * org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang * .Object) */ public Object getParent(Object element) { if (element instanceof IDebugTarget) { return null; } else if (element instanceof IDebugElement) { return ((IDebugElement) element).getDebugTarget(); } return null; } /* * (non-Javadoc) * * @see * org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang * .Object) */ public boolean hasChildren(Object element) { if (element instanceof IDebugElement) { return getChildren(element).length > 0; } else if (element instanceof Expression) { Expression eExp = (Expression) element; ExpressionValue value = eExp.getValue(); Expression[] eChildren = value.getChildren(); if (eChildren == null) return false; return true; } return false; } /* * (non-Javadoc) * * @see * org.eclipse.jface.viewers.IStructuredContentProvider#getElements( * java.lang.Object) */ public Object[] getElements(Object inputElement) { return getChildren(inputElement); } /* * (non-Javadoc) * * @see org.eclipse.jface.viewers.IContentProvider#dispose() */ public void dispose() { } /* * (non-Javadoc) * * @see * org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse * .jface.viewers.Viewer, java.lang.Object, java.lang.Object) */ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } } public PHPStackView() { super(); } /* * (non-Javadoc) * * @see * org.eclipse.debug.ui.AbstractDebugView#createViewer(org.eclipse.swt.widgets * .Composite) */ protected Viewer createViewer(Composite parent) { TreeViewer viewer = new TreeViewer(parent); viewer.setLabelProvider(new PHPStackLabelProvider()); viewer.setContentProvider(new StackViewContentProvider()); getSite().getWorkbenchWindow().getSelectionService().addSelectionListener(IDebugUIConstants.ID_DEBUG_VIEW, this); getSite().setSelectionProvider(viewer); return viewer; } /* * (non-Javadoc) * * @see org.eclipse.debug.ui.AbstractDebugView#getHelpContextId() */ protected String getHelpContextId() { return null; } /* * (non-Javadoc) * * @see * org.eclipse.debug.ui.AbstractDebugView#configureToolBar(org.eclipse.jface * .action.IToolBarManager) */ protected void configureToolBar(IToolBarManager tbm) { } /* * (non-Javadoc) * * @see org.eclipse.ui.IWorkbenchPart#dispose() */ public void dispose() { getSite().getWorkbenchWindow().getSelectionService() .removeSelectionListener(IDebugUIConstants.ID_DEBUG_VIEW, this); fTarget = null; super.dispose(); } /* * (non-Javadoc) * * @seeorg.eclipse.ui.ISelectionListener#selectionChanged(org.eclipse.ui. * IWorkbenchPart, org.eclipse.jface.viewers.ISelection) */ public void selectionChanged(IWorkbenchPart part, ISelection selection) { update(); } protected void becomesHidden() { isVisible = false; super.becomesHidden(); } protected void becomesVisible() { isVisible = true; update(); super.becomesVisible(); } /** * Updates the view for the selected target (if suspended) */ private synchronized void update() { if (!isVisible) { return; } IAdaptable adaptable = DebugUITools.getDebugContext(); fTarget = null; IDebugElement element = null; if (adaptable != null) { element = (IDebugElement) adaptable.getAdapter(IDebugElement.class); if (element != null) { if (element.getModelIdentifier().equals(IPHPDebugConstants.ID_PHP_DEBUG_CORE)) { fTarget = (PHPDebugTarget) element.getDebugTarget(); } } } Object input = null; if (fTarget != null && fTarget.isSuspended()) { input = element; } getViewer().setInput(input); getViewer().refresh(); } /* * (non-Javadoc) * * @see org.eclipse.debug.ui.AbstractDebugView#createActions() */ protected void createActions() { } /* * (non-Javadoc) * * @see * org.eclipse.debug.ui.AbstractDebugView#fillContextMenu(org.eclipse.jface * .action.IMenuManager) */ protected void fillContextMenu(IMenuManager menu) { menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); } public void updateObjects() { super.updateObjects(); update(); } }