net.rim.ejde.internal.ui.views.process.ProcessView.java Source code

Java tutorial

Introduction

Here is the source code for net.rim.ejde.internal.ui.views.process.ProcessView.java

Source

/*
* Copyright (c) 2010-2012 Research In Motion Limited. All rights reserved.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Public License, Version 1.0,
* which accompanies this distribution and is available at
*
* http://www.eclipse.org/legal/epl-v10.html
*
*/
package net.rim.ejde.internal.ui.views.process;

import java.util.Iterator;
import java.util.Vector;

import net.rim.ejde.internal.core.IConstants;
import net.rim.ejde.internal.ui.views.MenuAction;
import net.rim.ejde.internal.ui.views.VarContentDebugView;
import net.rim.ejde.internal.util.DebugUtils;
import net.rim.ejde.internal.util.Messages;
import net.rim.ide.RIA;
import net.rim.ide.core.IDEError;
import net.rim.ide.core.ProcessesContentsHelper;
import net.rim.ide.core.VarContentsHelper;
import net.rim.ide.core.VarContentsHelper.MenuItem;

import org.apache.log4j.Logger;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.DebugEvent;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.TableColumn;

/**
 * View to display ProcessView information.
 */
public class ProcessView extends VarContentDebugView implements IConstants {
    public static final String PROCESS_VIEW_ID = "net.rim.ejde.ui.viewers.ProcessView";

    static final Logger _log = Logger.getLogger(ProcessView.class);
    private ProcessesContentsHelper _processesContentsHelper;
    boolean _isInitialized = false;

    /**
     * Constructs a new MemoryStatsView.
     */
    public ProcessView() {
        super(REFRESH_BUTTON | OPTIONS_BUTTON);
    }

    public void createTableViewPart(Composite parent) {
        TableViewer tableViewer = new TableViewer(parent,
                SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER | SWT.VIRTUAL | SWT.SINGLE | SWT.FULL_SELECTION);
        tableViewer.getTable().setLayoutData(new GridData(GridData.FILL_BOTH));
        tableViewer.getTable().setHeaderVisible(true);
        tableViewer.getTable().setLinesVisible(true);
        tableViewer.setContentProvider(new VarContentProvider(tableViewer));
        VarLabelProvider labelProvider = new VarLabelProvider(tableViewer);
        setLabelProvider(labelProvider);
        tableViewer.setLabelProvider(labelProvider);
        tableViewer.getTable().addMouseListener(new VarMouseAdapter());
        tableViewer.getTable().addSelectionListener(new VarTableRowSelectionListener());
        setTableView(tableViewer);
        // create table columns
        createColumns();
        // create context menu(pop-up menu)
        createContextMenu();
        // start live update
        startLiveupdate();
    }

    public void refresh() throws CoreException {
        super.refresh();
    }

    protected void handleRIMDebugEvent(DebugEvent event) {
        if (event.getKind() == DebugEvent.CREATE && !_isInitialized) {
            Display.getDefault().syncExec(new Runnable() {

                @Override
                public void run() {
                    createColumns();
                }

            });
        }
    }

    private void createColumns() {
        if (getContentsHelper() == null) {
            setMessage(Messages.ProcessView_NO_BB_DEBUG_SESSION_MSG, true);
            return;
        }
        cleanMessage();
        if (getTableView().getTable().getColumnCount() == 0) {
            // create columns
            for (int i = 0; i < ProcessesContentsHelper.NUM_COLUMNS; i++) {
                createColumn(i);
            }
        }
        _isInitialized = true;
    }

    protected void fillExtraContextMenu(IMenuManager menuMgr) {
        RIA ria = RIA.getCurrentDebugger();
        if (ria == null || !ria.isDebuggerSuspended()) {
            return;
        }
        Vector<MenuItem> menuVector = null;
        VarContentsHelper helper = getContentsHelper();
        if (helper == null) {
            return;
        }
        menuVector = getProcessMenus();
        MenuItem menuItem;
        for (Iterator<MenuItem> iterator = menuVector.iterator(); iterator.hasNext();) {
            menuItem = iterator.next();

            if (menuItem.isSeparator) {
                menuMgr.add(new Separator());
            } else {
                menuMgr.add(new MenuAction(this, menuItem));
            }
        }
    }

    private Vector<MenuItem> getProcessMenus() {
        Vector<MenuItem> menuVector = new Vector<MenuItem>();
        VarContentsHelper helper = getContentsHelper();
        if (helper == null) {
            return menuVector;
        }
        final RIA ria = RIA.getCurrentDebugger();
        if (ria == null) {
            return menuVector;
        }
        // add a menu separator
        MenuItem menuItem = helper.new MenuItem();
        menuItem.isSeparator = true;
        menuItem.text = "---------";
        menuItem.action = helper.new MenuAction() {
            public void invoked() throws IDEError {
            }
        };
        menuVector.add(menuItem);
        // add Clear Heap Highwater menu
        menuItem = helper.new MenuItem();
        menuItem.text = "Clear Heap Highwater";
        try {
            menuItem.enabled = ria.canDoProcessOperations();
        } catch (IDEError e) {
            _log.error(e);
            menuItem.enabled = false;
        }
        menuItem.action = helper.new MenuAction() {
            public void invoked() throws IDEError {
                ria.processClearHeapHighWater();
                try {
                    refresh();
                } catch (CoreException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        };
        menuVector.add(menuItem);
        // add Clear Total Allocations menu
        menuItem = helper.new MenuItem();
        menuItem.text = "Clear Total Allocations";
        try {
            menuItem.enabled = ria.canDoProcessOperations();
        } catch (IDEError e) {
            _log.error(e);
            menuItem.enabled = false;
        }
        menuItem.action = helper.new MenuAction() {
            public void invoked() throws IDEError {
                ria.processClearTotalAllocations();
                try {
                    refresh();
                } catch (CoreException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        };
        menuVector.add(menuItem);
        // add Clear Total CPU menu
        menuItem = helper.new MenuItem();
        menuItem.text = "Clear Total CPU";
        try {
            menuItem.enabled = ria.canDoProcessOperations();
        } catch (IDEError e) {
            _log.error(e);
            menuItem.enabled = false;
        }
        menuItem.action = helper.new MenuAction() {
            public void invoked() throws IDEError {
                ria.processClearTotalCPU();
                try {
                    refresh();
                } catch (CoreException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        };
        menuVector.add(menuItem);
        return menuVector;

    }

    /**
     * Creates columns of the tree view.
     *
     * @param index
     *            index of column
     *
     */
    private void createColumn(int index) {
        int width;
        switch (index) {
        case 0:
        case 2:
            width = 250;
            break;
        default:
            width = 100;
        }
        TableViewer tableviewer = getTableView();
        if (tableviewer == null) {
            return;
        }
        TableColumn tableColumn = new TableColumn(tableviewer.getTable(), SWT.LEFT);
        tableColumn.setText(ProcessesContentsHelper.getColumnName(index));
        tableColumn.setWidth(width);
        tableColumn.setResizable(true);
        tableColumn.addSelectionListener(new VarTableColumnSelectionListener());
    }

    @Override
    public void setOptions() {
        ProcessViewOptionsDialog dialog = new ProcessViewOptionsDialog(this.getSite().getShell(),
                Messages.ProcessOptionsDialog_TITLE, null, "", MessageDialog.NONE, new String[] { "OK", "Cancel" },
                0);
        if (dialog.open() == 0) {
            startLiveupdate();
        }
    }

    @Override
    protected VarContentsHelper getContentsHelper() {
        if (DebugUtils.isRIMDebuggerRunning()) {
            if (_processesContentsHelper == null) {
                RIA ria = RIA.getCurrentDebugger();
                _processesContentsHelper = new ProcessesContentsHelper(ria, ria.getBaseDebugAPI());
                _processesContentsHelper.setCallBack(new MyCallback());
            }
            return _processesContentsHelper;
        }
        return null;
    }

    public void RIMDebugTerminated(ILaunch[] launchs) {
        _processesContentsHelper = null;
        _isInitialized = false;
        Display.getDefault().syncExec(new Runnable() {
            @Override
            public void run() {
                // dispose table columns
                TableColumn[] columns = getTableView().getTable().getColumns();
                for (int i = 0; i < columns.length; i++) {
                    columns[i].dispose();
                }
                setMessage(Messages.ProcessView_NO_BB_DEBUG_SESSION_MSG, true);
            }
        });
    }

    public boolean optionsEnabled() {
        // for the process view, the options is always enabled
        return true;
    }

    class MyCallback extends VarCallbackAdaptor {
        @Override
        public void reload() {
            setMoveCursorToIndex(-1);
            try {
                refresh();
            } catch (CoreException e) {
                _log.error(e);
            }
        }
    }
}