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