blob: a67408a25dece47d454bb3806c97203434b43bb0 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2015 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
* Jacek Pospychala <jacek.pospychala@pl.ibm.com> - bug 211127
* Arnaud Mergey <a_mergey@yahoo.fr>
*******************************************************************************/
package org.eclipse.pde.internal.runtime.registry;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.runtime.*;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.action.*;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.*;
import org.eclipse.osgi.util.NLS;
import org.eclipse.pde.internal.runtime.*;
import org.eclipse.pde.internal.runtime.registry.model.*;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.BusyIndicator;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.*;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.dialogs.FilteredTree;
import org.eclipse.ui.dialogs.PatternFilter;
import org.eclipse.ui.part.DrillDownAdapter;
import org.eclipse.ui.part.ViewPart;
import org.osgi.framework.BundleException;
public class RegistryBrowser extends ViewPart {
private class GroupByAction extends Action {
private int actionGroupBy;
public GroupByAction( String name, int groupBy ) {
super( name, AS_RADIO_BUTTON );
this.actionGroupBy = groupBy;
}
@Override
public void run() {
if( isChecked() ) {
fMemento.putInteger( GROUP_BY, actionGroupBy );
// refreshAction takes into account checked state of fShowExtensionsOnlyAction
// (via updateItems(true)
fRefreshAction.run();
}
}
}
public static final String SHOW_RUNNING_PLUGINS = "RegistryView.showRunning.label"; //$NON-NLS-1$
public static final String SHOW_ADVANCED_MODE = "RegistryView.showAdvancedMode.label"; //$NON-NLS-1$
public static final String GROUP_BY = "RegistryView.groupBy"; //$NON-NLS-1$
public static final String SHOW_DISABLED_MODE = "RegistryView.showDisabledMode.label"; //$NON-NLS-1$
public static final int BUNDLES = 0;
public static final int EXTENSION_REGISTRY = 1;
public static final int SERVICES = 2;
private FilteredTree fFilteredTree;
private TreeViewer fTreeViewer;
private IMemento fMemento;
private RegistryModel model;
private ModelChangeListener listener;
private Job initializeModelJob;
private RegistryBrowserContentProvider fContentProvider;
private RegistryBrowserLabelProvider fLabelProvider;
private static final int REFRESH_DELAY = 50;
private long lastRefresh = 0;
private Thread refreshThread;
// menus and action items
private Action fRefreshAction;
private Action fShowPluginsAction;
private Action fCollapseAllAction;
private Action fShowAdvancedOperationsAction;
private Action fGroupByBundlesAction;
private Action fGroupByExtensionPointsAction;
private Action fGroupByServicesAction;
private Action fShowDisabledAction;
private Action fCopyAction;
// advanced actions
private Action fStartAction;
private Action fStopAction;
private Action fEnableAction;
private Action fDisableAction;
private Action fDiagnoseAction;
// private Clipboard fClipboard;
private DrillDownAdapter fDrillDownAdapter;
private ViewerFilter fActiveFilter = new ViewerFilter() {
@Override
public boolean select( Viewer viewer, Object parentElement, Object element ) {
if( element instanceof ExtensionPoint )
element = Platform.getBundle( ( ( ExtensionPoint )element ).getNamespaceIdentifier() );
else if( element instanceof Extension )
element = Platform.getBundle( ( ( Extension )element ).getNamespaceIdentifier() );
if( element instanceof Bundle )
return ( ( Bundle )element ).getState() == Bundle.ACTIVE;
return true;
}
};
private ViewerFilter fDisabledFilter = new ViewerFilter() {
@Override
public boolean select( Viewer viewer, Object parentElement, Object element ) {
if( element instanceof Bundle ) {
return !( ( Bundle )element ).isEnabled();
}
return false;
}
};
/*
* customized DrillDownAdapter which modifies enabled state of showing active/inactive plug-ins
* action - see Bug 58467
*/
class RegistryDrillDownAdapter extends DrillDownAdapter {
public RegistryDrillDownAdapter( TreeViewer tree ) {
super( tree );
}
@Override
public void goInto() {
super.goInto();
fShowPluginsAction.setEnabled( !canGoHome() );
fShowDisabledAction.setEnabled( !canGoHome() );
}
@Override
public void goBack() {
super.goBack();
fShowPluginsAction.setEnabled( !canGoHome() );
fShowDisabledAction.setEnabled( !canGoHome() );
}
@Override
public void goHome() {
super.goHome();
fShowPluginsAction.setEnabled( !canGoHome() );
fShowDisabledAction.setEnabled( !canGoHome() );
}
@Override
public void goInto( Object newInput ) {
super.goInto( newInput );
fShowPluginsAction.setEnabled( !canGoHome() );
fShowDisabledAction.setEnabled( !canGoHome() );
}
}
private void initializeModel() {
model = RegistryModelFactory.getRegistryModel( "local" ); //$NON-NLS-1$
fTreeViewer.setInput( model );
listener = new RegistryBrowserModelChangeListener( RegistryBrowser.this );
model.addModelChangeListener( listener );
initializeModelJob = new Job( PDERuntimeMessages.get().RegistryBrowser_InitializingView) {
@Override
public IStatus run( IProgressMonitor monitor ) {
model.connect( monitor, true );
initializeModelJob = null;
return monitor.isCanceled( )
? Status.CANCEL_STATUS
: Status.OK_STATUS;
}
};
initializeModelJob.schedule();
}
@Override
public void init( IViewSite site, IMemento memento ) throws PartInitException {
super.init( site, memento );
if( memento == null )
this.fMemento = XMLMemento.createWriteRoot( "REGISTRYVIEW" ); //$NON-NLS-1$
else
this.fMemento = memento;
initializeMemento();
}
private void initializeMemento() {
// show all bundles by default (i.e. not just activated ones)
if( fMemento.getString( SHOW_RUNNING_PLUGINS ) == null )
fMemento.putString( SHOW_RUNNING_PLUGINS, "false" ); //$NON-NLS-1$
if( fMemento.getInteger( GROUP_BY ) == null )
fMemento.putInteger( GROUP_BY, BUNDLES );
if( fMemento.getString( SHOW_DISABLED_MODE ) == null )
fMemento.putString( SHOW_DISABLED_MODE, "false" ); //$NON-NLS-1$
// default to not showing advanced options to users
if( fMemento.getString( SHOW_ADVANCED_MODE ) == null )
fMemento.putString( SHOW_ADVANCED_MODE, "false" ); //$NON-NLS-1$
}
@Override
public void dispose() {
if( initializeModelJob != null ) {
initializeModelJob.cancel();
}
model.disconnect();
model.removeModelChangeListener( listener );
// if( fClipboard != null ) {
// fClipboard.dispose();
// }
super.dispose();
}
@Override
public void createPartControl( Composite parent ) {
// create the sash form that will contain the tree viewer & text viewer
Composite composite = new Composite( parent, SWT.NONE );
GridLayout layout = new GridLayout();
layout.marginHeight = layout.marginWidth = 0;
composite.setLayout( layout );
composite.setLayoutData( new GridData( GridData.FILL_BOTH ) );
makeActions();
createTreeViewer( composite );
hookDoubleClickAction();
// fClipboard = new Clipboard( fTreeViewer.getTree().getDisplay() );
fillToolBar();
}
private void createTreeViewer( Composite parent ) {
Composite composite = new Composite( parent, SWT.NONE );
GridLayout layout = new GridLayout();
layout.marginHeight = layout.marginWidth = 0;
composite.setLayout( layout );
composite.setLayoutData( new GridData( GridData.FILL_BOTH ) );
fFilteredTree = new RegistryFilteredTree( this, composite, SWT.MULTI, new PatternFilter() );
fFilteredTree.setBackground( parent.getDisplay().getSystemColor( SWT.COLOR_LIST_BACKGROUND ) );
Tree tree = fFilteredTree.getViewer().getTree();
GridData gd = new GridData( GridData.FILL_BOTH );
fFilteredTree.setLayoutData( gd );
fTreeViewer = fFilteredTree.getViewer();
fContentProvider = new RegistryBrowserContentProvider( this );
fTreeViewer.setContentProvider( fContentProvider );
fLabelProvider = new RegistryBrowserLabelProvider( this );
fTreeViewer.setLabelProvider( fLabelProvider );
fTreeViewer.setUseHashlookup( true );
fTreeViewer.setComparator( new ViewerComparator() {
@Override
public int compare( Viewer viewer, Object e1, Object e2 ) {
// let Comparables compare themselves
if( e1 instanceof Comparable
&& e2 instanceof Comparable
&& e1.getClass().equals( e2.getClass() ) )
{
Comparable c1 = ( Comparable )e1;
Comparable c2 = ( Comparable )e2;
return c1.compareTo( c2 );
}
if( e1 instanceof Folder && e2 instanceof Folder )
return ( ( Folder )e1 ).getId() - ( ( Folder )e2 ).getId();
if( e1 instanceof Bundle && e2 instanceof Bundle ) {
e1 = ( ( Bundle )e1 ).getSymbolicName();
e2 = ( ( Bundle )e2 ).getSymbolicName();
}
return super.compare( viewer, e1, e2 );
}
} );
if( fShowPluginsAction.isChecked() )
fTreeViewer.addFilter( fActiveFilter );
if( fShowDisabledAction.isChecked() )
fTreeViewer.addFilter( fDisabledFilter );
initializeModel();
PlatformUI.getWorkbench().getHelpSystem().setHelp( fTreeViewer.getControl(),
IHelpContextIds.REGISTRY_VIEW );
getViewSite().setSelectionProvider( fTreeViewer );
MenuManager popupMenuManager = new MenuManager();
IMenuListener listener = new IMenuListener() {
@Override
public void menuAboutToShow( IMenuManager mng ) {
fillContextMenu( mng );
}
};
popupMenuManager.setRemoveAllWhenShown( true );
popupMenuManager.addMenuListener( listener );
Menu menu = popupMenuManager.createContextMenu( tree );
tree.setMenu( menu );
}
private void hookDoubleClickAction() {
fTreeViewer.addDoubleClickListener( new IDoubleClickListener() {
@Override
public void doubleClick( DoubleClickEvent event ) {
// IStructuredSelection selection = ( IStructuredSelection )fTreeViewer.getSelection();
// if( selection.size() == 1 ) {
// Object obj = selection.getFirstElement();
// if( obj instanceof Bundle )
// ManifestEditor.openPluginEditor( ( ( Bundle )obj ).getSymbolicName() );
// }
}
} );
}
private void fillToolBar() {
fDrillDownAdapter = new RegistryDrillDownAdapter( fTreeViewer );
IActionBars bars = getViewSite().getActionBars();
bars.setGlobalActionHandler( ActionFactory.COPY.getId(), fCopyAction );
IToolBarManager mng = bars.getToolBarManager();
fDrillDownAdapter.addNavigationActions( mng );
mng.add( fRefreshAction );
mng.add( new Separator() );
mng.add( fCollapseAllAction );
IMenuManager mgr = bars.getMenuManager();
IMenuManager manager = new MenuManager( PDERuntimeMessages.get().RegistryBrowser_GroupBy );
manager.add( fGroupByBundlesAction );
manager.add( fGroupByExtensionPointsAction );
manager.add( fGroupByServicesAction );
mgr.add( manager );
mgr.add( new Separator() );
mgr.add( fShowPluginsAction );
mgr.add( fShowDisabledAction );
mgr.add( new Separator() );
mgr.add( fShowAdvancedOperationsAction );
}
private void fillContextMenu( IMenuManager manager ) {
manager.add( fRefreshAction );
manager.add( new Separator() );
manager.add( fCopyAction );
manager.add( new Separator() );
fDrillDownAdapter.addNavigationActions( manager );
manager.add( new Separator() );
// check if we should enable advanced actions
if( fShowAdvancedOperationsAction.isChecked() && isBundleSelected() ) {
// control bundle state actions
if( selectedBundlesStopped() )
manager.add( fStartAction );
if( selectedBundlesStarted() )
manager.add( fStopAction );
if( getSelectedBundles().size() == 1 )
manager.add( fDiagnoseAction );
// security related actions
if( selectedBundlesDisabled() )
manager.add( fEnableAction );
if( selectedBundlesEnabled() )
manager.add( fDisableAction );
}
manager.add( new Separator() );
manager.add( fShowPluginsAction );
manager.add( fShowDisabledAction );
manager.add( new Separator() );
manager.add( fShowAdvancedOperationsAction );
}
@Override
public void saveState( IMemento memento ) {
if( memento == null || fMemento == null || fTreeViewer == null )
return;
fMemento.putString( SHOW_RUNNING_PLUGINS, Boolean.toString( fShowPluginsAction.isChecked() ) );
fMemento.putString( SHOW_DISABLED_MODE, Boolean.toString( fShowDisabledAction.isChecked() ) );
fMemento.putBoolean( SHOW_ADVANCED_MODE, fShowAdvancedOperationsAction.isChecked() );
memento.putMemento( fMemento );
}
@Override
public void setFocus() {
Text filterText = fFilteredTree.getFilterControl();
if( filterText != null ) {
filterText.setFocus();
}
}
/*
* toolbar and context menu actions
*/
private void makeActions() {
fRefreshAction = new Action( "refresh") { //$NON-NLS-1$
@Override
public void run() {
BusyIndicator.showWhile( fTreeViewer.getTree().getDisplay(), new Runnable() {
@Override
public void run() {
refresh( fTreeViewer.getInput() );
}
} );
}
};
fRefreshAction.setText( PDERuntimeMessages.get().RegistryView_refresh_label );
fRefreshAction.setToolTipText( PDERuntimeMessages.get().RegistryView_refresh_tooltip );
fRefreshAction.setImageDescriptor( PDERuntimePluginImages.DESC_REFRESH );
fRefreshAction.setDisabledImageDescriptor( PDERuntimePluginImages.DESC_REFRESH_DISABLED );
fShowPluginsAction = new Action( PDERuntimeMessages.get().RegistryView_showRunning_label) {
@Override
public void run() {
if( fShowPluginsAction.isChecked() ) {
fTreeViewer.addFilter( fActiveFilter );
} else {
fTreeViewer.removeFilter( fActiveFilter );
}
updateTitle( );
}
};
fShowPluginsAction.setChecked( fMemento.getString( SHOW_RUNNING_PLUGINS ).equals( "true" ) ); //$NON-NLS-1$
fShowDisabledAction = new Action( PDERuntimeMessages.get().RegistryView_showDisabled_label) {
@Override
public void run() {
if( fShowDisabledAction.isChecked() ) {
fTreeViewer.addFilter( fDisabledFilter );
} else {
fTreeViewer.removeFilter( fDisabledFilter );
}
updateTitle( );
}
};
fShowDisabledAction.setChecked( fMemento.getString( SHOW_DISABLED_MODE ).equals( "true" ) ); //$NON-NLS-1$
fCopyAction = new Action( PDERuntimeMessages.get().RegistryBrowser_copy_label) {
@Override
public void run() {
ITreeSelection selection = ( ITreeSelection )fFilteredTree.getViewer().getSelection();
if( selection.isEmpty() ) {
return;
}
// String textVersion = ( ( ILabelProvider )fTreeViewer.getLabelProvider() )
// .getText( selection.getFirstElement() );
// if( ( textVersion != null ) && ( textVersion.trim().length() > 0 ) ) {
// // set the clipboard contents
// fClipboard.setContents( new Object[] {
// textVersion
// }, new Transfer[] {
// TextTransfer.getInstance()
// } );
// }
}
};
fCopyAction.setImageDescriptor( PDERuntimePluginImages.COPY_QNAME );
fGroupByBundlesAction = new GroupByAction( PDERuntimeMessages.get().RegistryBrowser_Bundle,
BUNDLES );
int groupBy = getGroupBy();
fGroupByBundlesAction.setChecked( groupBy == BUNDLES );
fGroupByExtensionPointsAction = new GroupByAction( PDERuntimeMessages
.get().RegistryBrowser_ExtensionPoint, EXTENSION_REGISTRY );
fGroupByExtensionPointsAction.setChecked( groupBy == EXTENSION_REGISTRY );
fGroupByServicesAction = new GroupByAction( PDERuntimeMessages.get().RegistryBrowser_Service,
SERVICES );
fGroupByServicesAction.setChecked( groupBy == SERVICES );
fShowAdvancedOperationsAction = new Action( PDERuntimeMessages
.get().RegistryView_showAdvanced_label)
{
@Override
public void run( ) { // do nothing
}
};
fShowAdvancedOperationsAction
.setChecked( fMemento.getString( SHOW_ADVANCED_MODE ).equals( "true" ) ); //$NON-NLS-1$
fStartAction = new Action( PDERuntimeMessages.get().RegistryView_startAction_label) {
@Override
public void run() {
try {
List bundles = getSelectedBundles();
for( Iterator it = bundles.iterator(); it.hasNext(); ) {
Bundle bundle = ( Bundle )it.next();
bundle.start();
}
} catch( BundleException e ) {
PDERuntimePlugin.log( e );
}
}
};
fStopAction = new Action( PDERuntimeMessages.get().RegistryView_stopAction_label) {
@Override
public void run() {
try {
List bundles = getSelectedBundles();
for( Iterator it = bundles.iterator(); it.hasNext(); ) {
Bundle bundle = ( Bundle )it.next();
bundle.stop();
}
} catch( BundleException e ) {
PDERuntimePlugin.log( e );
}
}
};
fEnableAction = new Action( PDERuntimeMessages.get().RegistryView_enableAction_label) {
@Override
public void run() {
List bundles = getSelectedBundles();
for( Iterator it = bundles.iterator(); it.hasNext(); ) {
Bundle bundle = ( Bundle )it.next();
bundle.enable( );
}
}
};
fDisableAction = new Action( PDERuntimeMessages.get().RegistryView_disableAction_label) {
@Override
public void run() {
List bundles = getSelectedBundles();
for( Iterator it = bundles.iterator(); it.hasNext(); ) {
Bundle bundle = ( Bundle )it.next();
bundle.disable( );
}
}
};
fDiagnoseAction = new Action( PDERuntimeMessages.get().RegistryView_diagnoseAction_label) {
@Override
public void run() {
List bundles = getSelectedBundles();
for( Iterator it = bundles.iterator(); it.hasNext(); ) {
Bundle bundle = ( Bundle )it.next();
MultiStatus problems = bundle.diagnose();
Dialog dialog;
if( ( problems != null ) && ( problems.getChildren().length > 0 ) ) {
dialog = new DiagnosticsDialog( getSite().getShell(),
PDERuntimeMessages.get().RegistryView_diag_dialog_title,
null,
problems,
IStatus.WARNING );
dialog.open();
} else {
MessageDialog
.openInformation( getSite().getShell(),
PDERuntimeMessages.get().RegistryView_diag_dialog_title,
PDERuntimeMessages.get().RegistryView_no_unresolved_constraints );
}
}
}
};
fCollapseAllAction = new Action( "collapseAll") { //$NON-NLS-1$
@Override
public void run() {
fTreeViewer.collapseAll( );
}
};
fCollapseAllAction.setText( PDERuntimeMessages.get().RegistryView_collapseAll_label );
fCollapseAllAction.setImageDescriptor( PDERuntimePluginImages.DESC_COLLAPSE_ALL );
fCollapseAllAction.setToolTipText( PDERuntimeMessages.get().RegistryView_collapseAll_tooltip );
}
public int getGroupBy() {
return fMemento.getInteger( GROUP_BY ).intValue();
}
public void updateTitle() {
setContentDescription( getTitleSummary() );
}
protected Tree getUndisposedTree() {
if( fTreeViewer == null || fTreeViewer.getTree() == null || fTreeViewer.getTree().isDisposed() )
return null;
return fTreeViewer.getTree();
}
public String getTitleSummary() {
Tree tree = getUndisposedTree();
String type;
int total = 0;
switch( getGroupBy() ) {
default:
case BUNDLES:
type = PDERuntimeMessages.get().RegistryBrowser_plugins;
total = model.getBundles().length;
break;
case EXTENSION_REGISTRY:
type = PDERuntimeMessages.get().RegistryBrowser_extensionPoints;
total = model.getExtensionPoints().length;
break;
case SERVICES:
type = PDERuntimeMessages.get().RegistryBrowser_Services;
total = model.getServiceNames().length;
break;
}
if( tree == null )
return NLS.bind( PDERuntimeMessages.get().RegistryView_titleSummary, ( new String[] {
"0", //$NON-NLS-1$
"0", //$NON-NLS-1$
type
} ) );
return NLS.bind( PDERuntimeMessages.get().RegistryView_titleSummary, ( new String[] {
Integer.toString( tree.getItemCount() ),
Integer.toString( total ),
type
} ) );
}
private boolean isBundleSelected() {
IStructuredSelection selection = ( IStructuredSelection )fTreeViewer.getSelection();
if( selection != null ) {
Object[] elements = selection.toArray();
for( int i = 0; i < elements.length; i++ ) {
if( !( elements[ i ] instanceof Bundle ) ) {
return false;
}
}
}
return true;
}
private List getSelectedBundles() {
List bundles = new ArrayList();
IStructuredSelection selection = ( IStructuredSelection )fTreeViewer.getSelection();
if( selection != null ) {
Object[] elements = selection.toArray();
for( int i = 0; i < elements.length; i++ ) {
if( elements[ i ] instanceof Bundle ) {
bundles.add( elements[ i ] );
}
}
}
return bundles;
}
/**
* @return true if none is stopped, false if at least one is stopped
*/
private boolean selectedBundlesStarted() {
List bundles = getSelectedBundles();
for( Iterator it = bundles.iterator(); it.hasNext(); ) {
Bundle bundle = ( Bundle )it.next();
if( bundle.getState() != Bundle.ACTIVE )
return false;
}
return true;
}
/**
* @return true if none is active, false if at least one is active
*/
private boolean selectedBundlesStopped() {
List bundles = getSelectedBundles();
for( Iterator it = bundles.iterator(); it.hasNext(); ) {
Bundle bundle = ( Bundle )it.next();
if( bundle.getState() == Bundle.ACTIVE )
return false;
}
return true;
}
/**
* @return true if none is enabled, false if at least one is enabled
*/
private boolean selectedBundlesDisabled() {
List bundles = getSelectedBundles();
for( Iterator it = bundles.iterator(); it.hasNext(); ) {
Bundle bundle = ( Bundle )it.next();
if( bundle.isEnabled() )
return false;
}
return true;
}
/**
* @return true if none is disabled, false if at least one is disabled
*/
private boolean selectedBundlesEnabled() {
List bundles = getSelectedBundles();
for( Iterator it = bundles.iterator(); it.hasNext(); ) {
Bundle bundle = ( Bundle )it.next();
if( !bundle.isEnabled() )
return false;
}
return true;
}
public void add( Object object ) {
Object parent = fContentProvider.getParent( object );
if( parent == null ) {
add( fTreeViewer.getInput(), object );
} else {
refresh( parent );
}
}
protected void add( Object parent, Object object ) {
if( fTreeViewer.getTree().isDisposed() )
return;
if( fDrillDownAdapter.canGoHome() )
return;
fTreeViewer.add( parent, object );
updateTitle();
}
public void remove( Object object ) {
if( fTreeViewer.getTree().isDisposed() )
return;
if( fDrillDownAdapter.canGoHome() )
return;
fTreeViewer.remove( object );
updateTitle();
}
private boolean filtersEnabled() {
return fTreeViewer.getFilters().length > 0;
}
private void deferredRefresh() {
if( refreshThread != null )
return;
long now = System.currentTimeMillis();
if( now - lastRefresh > REFRESH_DELAY ) {
fTreeViewer.refresh();
updateTitle();
lastRefresh = now;
} else {
Runnable runnable = new Runnable() {
@Override
public void run() {
try {
Thread.sleep( REFRESH_DELAY );
} catch( InterruptedException e ) {
return;
}
refreshThread = null;
if( fTreeViewer.getTree().isDisposed() )
return;
fTreeViewer.getTree().getDisplay().asyncExec( new Runnable() {
@Override
public void run() {
if( !fTreeViewer.getTree().isDisposed() ) {
fTreeViewer.refresh();
updateTitle();
}
}
} );
}
};
refreshThread = new Thread( runnable );
refreshThread.start();
}
}
void refresh( Object[] objects ) {
if( fTreeViewer.getTree().isDisposed() )
return;
if( filtersEnabled() ) {
deferredRefresh();
} else {
for( int i = 0; i < objects.length; i++ ) {
fTreeViewer.refresh( objects[ i ] );
}
}
updateTitle();
}
void refresh( Object object ) {
if( fTreeViewer.getTree().isDisposed() )
return;
if( filtersEnabled() ) {
deferredRefresh();
} else {
fTreeViewer.refresh( object );
updateTitle();
}
}
@Override
public Object getAdapter( Class clazz ) {
if( ILabelProvider.class.equals( clazz ) ) {
return fLabelProvider;
}
if( IContentProvider.class.equals( clazz ) ) {
return fContentProvider;
}
return super.getAdapter( clazz );
}
/**
* Internal api to set group_by value
*
* @param newGroupBy returns the old group_by value.
*/
public int showGroupBy( int newGroupBy ) {
int previousGroupBy = getGroupBy();
if( fTreeViewer != null && !fTreeViewer.getControl().isDisposed() ) {
fMemento.putInteger( GROUP_BY, newGroupBy );
fRefreshAction.run();
}
return previousGroupBy;
}
}