org.eclipse.php.internal.debug.ui.views.PHPStackView.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.php.internal.debug.ui.views.PHPStackView.java

Source

/*******************************************************************************
 * 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();

    }
}