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