/*
* 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.objects;
import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.util.Iterator;
import java.util.Vector;
import net.rim.ejde.internal.core.ContextManager;
import net.rim.ejde.internal.core.IConstants;
import net.rim.ejde.internal.core.RimIDEUtil;
import net.rim.ejde.internal.ui.dialogs.ObjectViewFilterDialog;
import net.rim.ejde.internal.ui.dialogs.ObjectViewPathToDialog;
import net.rim.ejde.internal.ui.preferences.PreferenceConstants;
import net.rim.ejde.internal.ui.views.AbstractTreeOwnerDrawLabelProvider;
import net.rim.ejde.internal.ui.views.BasicDebugView;
import net.rim.ejde.internal.ui.views.MenuAction;
import net.rim.ejde.internal.util.Messages;
import net.rim.ejde.internal.util.StatusFactory;
import net.rim.ide.RIA;
import net.rim.ide.core.IDEError;
import net.rim.ide.core.ObjectsContentsHelper;
import net.rim.ide.core.ObjectsContentsHelper.Callback;
import net.rim.ide.core.ObjectsContentsHelper.LoadProgressCallback;
import net.rim.ide.core.VarContentsHelper.Line;
import net.rim.ide.core.VarContentsHelper.MenuItem;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.eclipse.core.filesystem.EFS;
import org.eclipse.core.filesystem.IFileStore;
import org.eclipse.core.filesystem.IFileSystem;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.model.IDebugElement;
import org.eclipse.debug.ui.DebugUITools;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.viewers.ILazyContentProvider;
import org.eclipse.jface.viewers.OwnerDrawLabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.window.Window;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.PlatformUI;
/**
* View to display information of objects created in the memory.
*/
public class ObjectsView extends BasicDebugView implements Callback {
public static final String OBJECTS_VIEW_ID = "net.rim.ejde.ui.viewers.ObjectsView";
private static final Logger log = Logger.getLogger( ObjectsView.class );
final static int NUMBER_OF_OBJECTS_MESSAGE = 0;
final static int SIZE_OF_MEMORY_MESSAGE = 1;
final static int NUMBER_OF_ADDED_OBJECTS_MESSAGE = 2;
final static int NUMBER_OF_DELETED_OBJECTS_MESSAGE = 3;
private String[] _messages = new String[ 4 ];
private TableViewer _tableViewer;
private TableColumn[] _tableColumns;
private int _selectedColumns = -1;
private int _selectedRow = -1;
private MyLabelProvider _labelProvider;
private int _moveCursorTo;
private IProgressMonitor _progressMonitor;
// filter options
private int _snapshotFilter = 0;
private String _type;
private String _process;
private int _location;
private boolean _showGroupMember;
private boolean _showRecursiveSize;
private boolean _includeAllInstance;
static private ObjectsContentsHelper getObjectsContentsHelper() {
RIA ria = RIA.getCurrentDebugger();
if( null != ria ) {
return ria.getObjectsContentsHelper();
}
return null;
}
/**
* Constructs an instance of ObjectsView.
*/
public ObjectsView() {
super( REFRESH_BUTTON | GARBAGE_COLLECTION_BUTTON | FILTER_BUTTON | SAVE_BUTTON | CLEAR_BUTTON | SNAPSHOT_BUTTON
| FORWARD_BUTTON | BACKWARD_BUTTON | RETURN_TO_START_BUTTON | RETURN_TO_END_BUTTON );
// get RIA instance
// create column array
_tableColumns = new TableColumn[ ObjectsContentsHelper.NUM_COLUMNS ];
initializeOptions();
if( log.isDebugEnabled() ) {
log.debug( String.format( "Instance [%s] created.", hashCode() ) ); //$NON-NLS-1$
}
}
synchronized void setProgressMonitor( IProgressMonitor monitor ) {
_progressMonitor = monitor;
}
synchronized IProgressMonitor getProgressMonitor() {
return _progressMonitor;
}
/***************************************************************************
* @link java.lang.Object#finalize()
*/
@Override
protected void finalize() {
if( log.isDebugEnabled() ) {
log.debug( String.format( "Instance [%s] finalized.", hashCode() ) ); //$NON-NLS-1$
}
}
private void initializeOptions() {
IPreferenceStore ps = ContextManager.PLUGIN.getPreferenceStore();
_showGroupMember = ps.getBoolean( PreferenceConstants.NET_RIM_EJDE_UI_VIEWS_SHOW_GROUP_MEMBER );
_showRecursiveSize = ps.getBoolean( PreferenceConstants.NET_RIM_EJDE_UI_VIEWS_SHOW_RECURSIVE_SIZE );
}
public void createTableViewPart( Composite parent ){
parent.setLayout( new GridLayout( 1, false ) );
// create table viewer
_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.getTable().addMouseListener( new MyMouseAdapter() );
_tableViewer.getTable().addSelectionListener( new MyTableRowSelectionListener() );
_tableViewer.setUseHashlookup( true );
// create columns
for( int i = 0; i < _tableColumns.length; i++ ) {
createColumn( i );
}
_labelProvider = new MyLabelProvider( _tableViewer );
_tableViewer.setLabelProvider( _labelProvider );
OwnerDrawLabelProvider.setUpOwnerDraw( _tableViewer );
_tableViewer.setContentProvider( new MyContentProvider( _tableViewer ) );
// create context menu(pop-up menu)
createContextMenu();
}
private void createContextMenu() {
MenuManager menuManager = new MenuManager( "PopupMenu" ); //$NON-NLS-1$
menuManager.setRemoveAllWhenShown( true );
menuManager.addMenuListener( new IMenuListener() {
public void menuAboutToShow( IMenuManager m ) {
fillContextMenu( m );
}
} );
Menu menu = menuManager.createContextMenu( _tableViewer.getControl() );
_tableViewer.getControl().setMenu( menu );
getSite().registerContextMenu( menuManager, _tableViewer );
}
void fillContextMenu( IMenuManager menuMgr ) {
Vector< MenuItem > menuVector = null;
try {
menuVector = ObjectsView.getObjectsContentsHelper().getMenu();
} catch( IDEError e ) {
log.error( e.getMessage(), e );
}
if( menuVector == null ) {
return;
}
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 ) );
}
}
menuMgr.add( new Separator( IWorkbenchActionConstants.MB_ADDITIONS ) );
}
void setMessageLabel( String string, int index ) {
_messages[ index ] = string;
displayMessage();
}
private void displayMessage() {
StringBuffer buf = new StringBuffer();
for( String message : _messages ) {
if( ( message == null ) || message.trim().equals( IConstants.EMPTY_STRING ) ) {
continue;
}
buf.append( message + IConstants.SEMICOLON_MARK );
}
setMessage( buf.toString(), false );
}
private void clearMessage() {
cleanMessage();
}
/**
* Creates columns of the tree view.
*
* @param index
* index of column
*/
private void createColumn( int index ) {
int width;
switch( index ) {
case 0:
width = 200;
break;
case 1:
width = 350;
break;
case 2:
width = 150;
break;
case 3:
width = 100;
break;
default:
width = 0;
}
_tableColumns[ index ] = new TableColumn( _tableViewer.getTable(), SWT.LEFT );
_tableColumns[ index ].setText( ObjectsContentsHelper.getColumnName( index ) );
_tableColumns[ index ].setWidth( width );
_tableColumns[ index ].setResizable( true );
_tableColumns[ index ].addSelectionListener( new MyTableColumnSelectionListener() );
}
/**
* Gets the index of <code>column</code>.
*
* @param column
* @return index of <code>column</code> or <em>-1</em> if <code>column</code> is not in the table
*/
private int getColumnIndex( TableColumn column ) {
Table table = _tableViewer.getTable();
for( int i = 0; i < table.getColumnCount(); i++ ) {
if( table.getColumn( i ).equals( column ) ) {
return i;
}
}
return -1;
}
/**
* Gets the <em>int</em> or <em>long</em> number from the given <code>string</code>. The method supposes that there is only
* one number in the <code>string</code>.
*
* @param string
* A string which contains a <code>int</code> or <code>long</code> number (is not supposed to be <code>null</code>
* ).
* @return String of the number in the <code>string</code>, or <code>null</code> if there is no number found in
* <code>string</code>
*/
static private String getNumberFromString( String string ) {
StringBuffer buf = new StringBuffer( IConstants.EMPTY_STRING );
boolean findNumber = false;
char mychar;
for( int i = 0; i < string.length(); i++ ) {
mychar = string.charAt( i );
if( ( mychar >= '0' ) && ( mychar <= '9' ) ) {
buf.append( String.valueOf( mychar ) );
findNumber = true;
} else if( findNumber ) {
break;
}
}
return buf.toString();
}
/**
* Display the objects information.
*/
void displayData() {
// clear all items from the table
Table table = _tableViewer.getTable();
table.removeAll();
ObjectsContentsHelper objectsContentsHelper = ObjectsView.getObjectsContentsHelper();
if( null == objectsContentsHelper ) {
return;
}
// update contents (set data to lines)
try {
objectsContentsHelper.updateContents();
} catch( IDEError e ) {
log.error( e.getMessage(), e );
return;
}
//
table.setRedraw( false );
_tableViewer.setInput( objectsContentsHelper );
table.setItemCount( objectsContentsHelper.getRowCount() );
table.setRedraw( true );
if( _moveCursorTo >= 0 ) {
table.setSelection( _moveCursorTo );
table.showSelection();
}
}
int getIndexOf( Object element ) {
return 0;
}
// ------ Methods in interface IBasicActions ------
/**
* (no java doc)
*
* @see IBasicActions#clear()
*/
@Override
public void clear() {
_tableViewer.getTable().removeAll();
clearMessage();
setHasData( false );
updateToolbar();
}
/**
* (no java doc)
*
* @see IBasicActions#gc()
*/
@Override
public void gc() {
ObjectsContentsHelper objectsContentsHelper = ObjectsView.getObjectsContentsHelper();
if( null == objectsContentsHelper ) {
return;
}
try {
objectsContentsHelper.gc();
} catch( IDEError e ) {
log.error( e.getMessage(), e );
}
}
/**
* Gets new objects information, erases the current objects information, and displays the new information.
*
* @see IBasicActions#refresh().
*
*/
@Override
public void refresh() {
RefreshObjectsViewJob job = new RefreshObjectsViewJob( this );
try {
PlatformUI.getWorkbench().getProgressService().run( true, true, job );
} catch( InvocationTargetException e ) {
log.error( e );
} catch( InterruptedException e ) {
log.error( e );
}
}
/**
* (no java doc)
*
* @see IBasicActions#save()
*/
@Override
public void save() {
if( null == ObjectsView.getObjectsContentsHelper() ) {
return;
}
// save profile data to the file
RimIDEUtil.saveTableToFile( RimIDEUtil.openCSVFileForSave( getSite().getShell() ), _tableViewer.getTable(),
ObjectsView.getObjectsContentsHelper() );
}
/**
* (no java doc)
*
* @see IBasicActions#filter()
*/
@Override
public void filter() {
// create the filters and options setting dialog
ObjectViewFilterDialog dialog = new ObjectViewFilterDialog( getSite().getShell(), this );
// display the dialog
dialog.open();
if( dialog.isOkButtonClicked() ) {
// if options are changed, reload objects information
if( ( _showGroupMember != dialog.getShowGroupMember() ) || ( _showRecursiveSize != dialog.getShowRecursiveSize() ) ) {
_showGroupMember = dialog.getShowGroupMember();
_showRecursiveSize = dialog.getShowRecursiveSize();
refresh();
}
// fire a job to update the objects view
FilterJob job = new FilterJob();
try {
PlatformUI.getWorkbench().getProgressService().run( true, true, job );
} catch( InvocationTargetException e ) {
log.error( e );
} catch( InterruptedException e ) {
log.error( e );
}
}
}
/**
* (no java doc)
*
* @see IBasicActions#snapshot()
*/
@Override
public void snapshot() {
SnapshotJob job = new SnapshotJob();
try {
PlatformUI.getWorkbench().getProgressService().run( true, true, job );
} catch( InvocationTargetException e ) {
log.error( e );
} catch( InterruptedException e ) {
log.error( e );
}
}
/**
* Forwards to the next step.
*/
@Override
public void forward() {
try {
ObjectsView.getObjectsContentsHelper().forwardHistory();
} catch( IDEError ie ) {
log.error( ie.getMessage(), ie );
}
}
/**
* Backwards to the last step.
*/
@Override
public void backward() {
try {
ObjectsView.getObjectsContentsHelper().backHistory();
} catch( IDEError ie ) {
log.error( ie.getMessage(), ie );
}
}
/**
* Returns to the start.
*/
@Override
public void returnToStart() {
try {
ObjectsView.getObjectsContentsHelper().startOfHistory();
} catch( IDEError ie ) {
log.error( ie.getMessage(), ie );
}
}
/**
* Goes to the end
*/
@Override
public void returnToEnd() {
try {
ObjectsView.getObjectsContentsHelper().endOfHistory();
} catch( IDEError ie ) {
log.error( ie.getMessage(), ie );
}
}
/**
* Finds the currently selected context in the UI.
*/
protected IDebugElement getContext() {
IAdaptable object = DebugUITools.getDebugContext();
IDebugElement context = null;
if( object instanceof IDebugElement ) {
context = (IDebugElement) object;
} else if( object instanceof ILaunch ) {
context = ( (ILaunch) object ).getDebugTarget();
}
return context;
}
public boolean getShowGroupMember() {
return _showGroupMember;
}
public void setShowGroupMember( boolean showGroupMember ) {
_showGroupMember = showGroupMember;
}
public boolean getShowRecursiveSize() {
return _showRecursiveSize;
}
public void setShowRecursiveSize( boolean showRecursiveSize ) {
_showRecursiveSize = showRecursiveSize;
}
// ------ Methods in interface CallBack ------
public int askForPathFrom( String title ) {
ObjectViewPathToDialog dialog = new ObjectViewPathToDialog( getSite().getShell(), title );
if( dialog.open() == Window.OK ) {
return dialog.getPath();
}
return 0;
}
public int getLocationFilterIndex() {
return _location;
}
public String getProcessFilterText() {
return _process == null ? IConstants.EMPTY_STRING : _process;
}
public int getSnapshotFilterIndex() {
return _snapshotFilter;
}
public String getTypeFilterText() {
// TODO Auto-generated method stub
return _type == null ? IConstants.EMPTY_STRING : _type;
}
public void setAddedText( String text ) {
if( ( text == null ) || text.trim().equals( IConstants.EMPTY_STRING ) ) {
setMessageLabel( null, NUMBER_OF_ADDED_OBJECTS_MESSAGE );
} else {
String number = ObjectsView.getNumberFromString( text );
setMessageLabel( NLS.bind( Messages.ObjectsView_NUMBER_OF_ADDED_OBJECTS_MESSAGE, number ),
NUMBER_OF_ADDED_OBJECTS_MESSAGE );
}
}
public void setBackButtonEnabled( boolean enabled ) {
enableActions( BasicDebugView.BACKWARD_BUTTON, enabled );
}
public void setDeletedText( String text ) {
if( ( text == null ) || text.trim().equals( IConstants.EMPTY_STRING ) ) {
setMessageLabel( null, NUMBER_OF_DELETED_OBJECTS_MESSAGE );
} else {
String number = ObjectsView.getNumberFromString( text );
setMessageLabel( NLS.bind( Messages.ObjectsView_NUMBER_OF_DELETED_OBJECTS_MESSAGE, number ),
NUMBER_OF_DELETED_OBJECTS_MESSAGE );
}
}
public void setEndButtonEnabled( boolean enabled ) {
enableActions( BasicDebugView.RETURN_TO_END_BUTTON, enabled );
}
public void setForwardButtonEnabled( boolean enabled ) {
enableActions( BasicDebugView.FORWARD_BUTTON, enabled );
}
public void setLocationFilterIndex( int x ) {
_location = x;
}
public void setProcessFilterText( String s ) {
_process = s;
}
public void setSizeText( String text ) {
if( ( text == null ) || text.trim().equals( IConstants.EMPTY_STRING ) ) {
setMessageLabel( null, SIZE_OF_MEMORY_MESSAGE );
} else {
String number = ObjectsView.getNumberFromString( text );
setMessageLabel( NLS.bind( Messages.ObjectsView_SIZE_OF_USED_MEMORY_MESSAGE, number ), SIZE_OF_MEMORY_MESSAGE );
}
}
public void setSnapshotFilterIndex( int x ) {
_snapshotFilter = x;
}
public void setStartButtonEnabled( boolean enabled ) {
enableActions( BasicDebugView.RETURN_TO_START_BUTTON, enabled );
}
public void setStatusText( String text ) {
if( ( text == null ) || text.trim().equals( IConstants.EMPTY_STRING ) ) {
setMessageLabel( null, NUMBER_OF_OBJECTS_MESSAGE );
} else {
String number = ObjectsView.getNumberFromString( text );
setMessageLabel( NLS.bind( Messages.ObjectsView_NUMBER_OF_OBJECTS_MESSAGE, number ), NUMBER_OF_OBJECTS_MESSAGE );
}
}
public void setTypeFilterText( String s ) {
_type = s;
}
public void addWatchExpression( String expr ) throws IDEError {
// create a watch expression
// IWatchExpression watchExpression=
// DebugPlugin.getDefault().getExpressionManager().newWatchExpression(expr
// );
// //$NON-NLS-1$
// DebugPlugin.getDefault().getExpressionManager().addExpression(
// watchExpression);
// watchExpression.setExpressionContext(getContext());
}
public void beep() {
// TODO Auto-generated method stub
}
public void columnHeadersChanged() {
// TODO Auto-generated method stub
}
public void displayLineAttribute( String toStringValue ) {
MessageDialog.openInformation( getSite().getShell(), Messages.ObjectsView_LINE_ATTRIBUTE_DIALOG_TITLE, toStringValue );
}
public int getSelectedColumn() {
return _selectedColumns;
}
public int getSelectedRow() {
return _selectedRow;
}
public void moveCursorTo( int row, int column ) {
_moveCursorTo = row;
}
public File promptAndCreateFile( String wildCard, String title ) {
return RimIDEUtil.openFileForSave( getSite().getShell(), wildCard, new String[] {} );
}
public void reload() {
_moveCursorTo = -1;
ReloadObjectsTask job = new ReloadObjectsTask( this, getProgressMonitor() );
job.doJob();
}
class MyRunnable implements Runnable {
ObjectsView _view;
public MyRunnable( ObjectsView view ) {
_view = view;
}
public void run() {
_view.setHasData( true );
_view.updateToolbar();
_view.displayData();
}
}
public void updateAllDebugWindows() {
// TODO Auto-generated method stub
}
public void showSource( String fileName, int line ) {
IFileSystem fileSystem = EFS.getLocalFileSystem();
IFileStore fileStore = fileSystem.getStore( new Path( fileName ) );
RimIDEUtil.openSourceFile( fileStore, line );
}
public boolean getIncludeAllInstances() {
return _includeAllInstance;
}
public void setIncludeAllInstances( boolean b ) {
_includeAllInstance = b;
}
// ------ Inner Classes ------
/**
* Content provider of objects tree view.
*/
class MyContentProvider implements ILazyContentProvider {
private TableViewer _myViewer;
private Object[] _models;
public MyContentProvider( TableViewer viewer ) {
_myViewer = viewer;
}
public void updateElement( int index ) {
_myViewer.replace( _models[ index ], index );
}
public void dispose() {
// TODO Auto-generated method stub
}
public void inputChanged( Viewer viewer, Object oldInput, Object newInput ) {
if( ( newInput == null ) || !( newInput instanceof ObjectsContentsHelper ) ) {
_models = new Object[ 0 ];
} else {
ObjectsContentsHelper helper = (ObjectsContentsHelper) newInput;
int rowCount = helper.getRowCount();
_models = new Object[ rowCount ];
for( int i = 0; i < rowCount; i++ ) {
_models[ i ] = helper.getLine( i );
}
}
}
}
/**
* Label provider of objects tree view.
*/
class MyLabelProvider extends AbstractTreeOwnerDrawLabelProvider {
public MyLabelProvider( TableViewer viewer ) {
super( viewer );
}
@Override
public boolean findRowAtSameIndent( Object obj, int indent ) {
int row = getIndex( obj ) + 1;
ObjectsContentsHelper objectsContentsHelper = ObjectsView.getObjectsContentsHelper();
if( null == objectsContentsHelper ) {
return false;
}
for( int i = row; i < objectsContentsHelper.getRowCount(); i++ ) {
Line line = objectsContentsHelper.getLine( i );
if( line == null ) {
return false;
}
int indentOfChild = getIndent( line );
if( indentOfChild < indent ) {
return false;
}
if( indentOfChild == indent ) {
return true;
}
}
return false;
}
@Override
public int getIndent( Object obj ) {
Line line = (Line) obj;
return line.getIndent();
}
@Override
public int getIndex( Object obj ) {
return _tableViewer.getTable().indexOf( (TableItem) obj );
}
@Override
public boolean hasChildren( Object obj ) {
Line line = (Line) obj;
return line.getIcon() != Line.ICON_NONE;
}
@Override
public boolean isExpanded( Object obj ) {
Line line = (Line) obj;
return line.getIcon() == Line.ICON_MINUS;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.OwnerDrawLabelProvider#measure(Event, Object)
*/
@Override
protected void measure( Event event, Object element ) {
event.width = _tableViewer.getTable().getColumn( event.index ).getWidth();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.OwnerDrawLabelProvider#paint(org.eclipse .swt.widgets.Event, java.lang.Object)
*/
@Override
protected void paint( Event event, Object element ) {
// call super method to initiate variables
super.paint( event, element );
String text;
ObjectsContentsHelper objectsContentsHelper = ObjectsView.getObjectsContentsHelper();
Line line = (Line) element;
if( objectsContentsHelper != null ) {
text = ( objectsContentsHelper.getValue( line, event.index ) ).toString();
} else {
text = StringUtils.EMPTY;
}
if( event.index == 0 ) {
drawFirstColumn( event, element, text, line.getHilight() );
} else {
drawText( event, text, event.x, event.y, line.getHilight() );
}
}
@Override
public int calculateDisplayLevel( Object obj ) {
// nothing to do
return 0;
}
}
class MyMouseAdapter extends MouseAdapter {
@Override
public void mouseDown( MouseEvent e ) {
TableItem selectedItem = _tableViewer.getTable().getItem( _tableViewer.getTable().getSelectionIndex() );
if( selectedItem == null ) {
return;
}
// If user clicked on the [+] or [-], expand or collapse the item
Line line = (Line) selectedItem.getData();
Rectangle rect = _labelProvider.getImageBounds( line, selectedItem.getBounds( 0 ) );
if( rect.contains( e.x, e.y ) ) {
switch( line.getIcon() ) {
case Line.ICON_PLUS:
case Line.ICON_MINUS: {
_moveCursorTo = -1;
ObjectsView.getObjectsContentsHelper().toggleExpansion( line );
displayData();
break;
}
}
}
}
}
class MyTableColumnSelectionListener implements SelectionListener {
public void widgetDefaultSelected( SelectionEvent e ) {
// nothing to do
}
/**
* Sort the content when a column is selected.
*/
public void widgetSelected( SelectionEvent e ) {
TableColumn column = (TableColumn) e.widget;
_selectedColumns = getColumnIndex( column );
// System.out
// .println("_moveCursorTO is set as -1 in widgetSelected()"); //$NON-NLS-1$
_moveCursorTo = -1;
try {
ObjectsView.getObjectsContentsHelper().sortRows( _selectedColumns );
} catch( IDEError e1 ) {
log.error( e1.getStackTrace(), e1 );
return;
}
}
}
class MyTableRowSelectionListener implements SelectionListener {
public void widgetDefaultSelected( SelectionEvent e ) {
// nothing to do
}
/**
* Sort the content when a column is selected.
*/
public void widgetSelected( SelectionEvent e ) {
_selectedRow = _tableViewer.getTable().getSelectionIndex();
}
}
class FilterJob implements IRunnableWithProgress {
public void run( IProgressMonitor monitor ) throws InvocationTargetException, InterruptedException {
ObjectsContentsHelper objectsContentsHelper = ObjectsView.getObjectsContentsHelper();
if( null == objectsContentsHelper ) {
return;
}
setProgressMonitor( monitor );
// set filters
_moveCursorTo = -1;
try {
objectsContentsHelper.filterChanged();
} catch( IDEError e ) {
log.error( e.getMessage(), e );
}
updateToolbar();
}
}
class SnapshotJob implements IRunnableWithProgress {
public void run( IProgressMonitor monitor ) throws InvocationTargetException, InterruptedException {
ObjectsContentsHelper objectsContentsHelper = ObjectsView.getObjectsContentsHelper();
if( null == objectsContentsHelper ) {
return;
}
try {
setProgressMonitor( monitor );
objectsContentsHelper.setSnapshot();
setHasSnapshot( true );
updateToolbar();
} catch( IDEError e ) {
log.error( e.getMessage(), e );
}
}
}
class RefreshObjectsViewJob implements IRunnableWithProgress {
ObjectsView _objectsView;
public RefreshObjectsViewJob( ObjectsView callback ) {
_objectsView = callback;
}
public void run( IProgressMonitor monitor ) throws InvocationTargetException, InterruptedException {
// get object helper instance
ObjectsContentsHelper objectsContentsHelper = ObjectsView.getObjectsContentsHelper();
try {
if( null != objectsContentsHelper ) {
setProgressMonitor( monitor );
objectsContentsHelper.setShowGroupMembers( _showGroupMember );
objectsContentsHelper.setShowRecursiveSizes( _showRecursiveSize );
objectsContentsHelper.setCallBack( _objectsView );
objectsContentsHelper.refresh();
setHasData( true );
} else {
setHasData( false );
}
updateToolbar();
} catch( IDEError e ) {
log.error( e.getMessage(), e );
}
}
}
class ReloadObjectsTask implements LoadProgressCallback {
IProgressMonitor _reloadProgressMonitor;
ObjectsView _objectsView;
boolean _isBeginTaskCalledl;
public ReloadObjectsTask( ObjectsView view, IProgressMonitor progressmonitor ) {
_reloadProgressMonitor = progressmonitor;
_objectsView = view;
}
public void setProgress( int n, int total ) {
if( _reloadProgressMonitor == null ) {
return;
}
if( !_isBeginTaskCalledl ) {
_reloadProgressMonitor.beginTask( Messages.ObjectsView_RELOADING_MSG, total );
_isBeginTaskCalledl = true;
}
_reloadProgressMonitor.worked( 1 );
}
public boolean stopRequested() {
if( _reloadProgressMonitor == null ) {
return false;
}
return _reloadProgressMonitor.isCanceled();
}
public void stopped() {
// nothing to do
}
public IStatus doJob() {
try {
_isBeginTaskCalledl = false;
// reload data
ObjectsView.getObjectsContentsHelper().reload( this );
} catch( IDEError e ) {
return StatusFactory.createStatus( IStatus.ERROR, e.getMessage() == null ? Messages.ObjectsView_REFRESH_ERROR_MSG
: e.getMessage() );
} finally {
_reloadProgressMonitor.done();
}
// display data
_objectsView.getSite().getShell().getDisplay().asyncExec( new Runnable() {
public void run() {
_objectsView.setHasData( true );
_objectsView.updateToolbar();
_objectsView.displayData();
}
} );
return StatusFactory.createStatus( IStatus.OK, Messages.ObjectsView_RELOADING_FINISH_MSG );
}
}
}