blob: 6b4e715e5bad64ec95b3b29dfb64c05dda9adf5f [file] [log] [blame]
package org.eclipse.jdt.internal.debug.ui.monitors;
/**********************************************************************
Copyright (c) 2000, 2002 IBM Corp. All rights reserved.
This file is made available under the terms of the Common Public License v1.0
which accompanies this distribution, and is available at
http://www.eclipse.org/legal/cpl-v10.html
**********************************************************************/
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import org.eclipse.debug.internal.ui.DebugUIPlugin;
import org.eclipse.debug.internal.ui.preferences.IDebugPreferenceConstants;
import org.eclipse.debug.internal.ui.views.AbstractDebugEventHandlerView;
import org.eclipse.debug.ui.IDebugUIConstants;
import org.eclipse.jdt.debug.core.IJavaDebugTarget;
import org.eclipse.jdt.internal.debug.core.model.JDIDebugElement;
import org.eclipse.jdt.internal.debug.ui.IJavaDebugHelpContextIds;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Item;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.part.Page;
/**
* Handles the different viewers: Thread, Monitor and Deadlock
*/
public class MonitorsView extends AbstractDebugEventHandlerView implements ISelectionListener {
public static final int VIEW_ID_THREAD = 1;
public static final int VIEW_ID_MONITOR = 2;
public static final int VIEW_ID_DEADLOCK = 3;
private int fViewId;
private Viewer fDeadLocksViewer;
private Viewer fMonitorsViewer;
private boolean fMonitorInformationAvailable= true;
private boolean fValidSelection= false;
private IJavaDebugTarget fLastSelectedTarget;
/**
* A page in this view's page book that contains this
* view's viewer.
*/
class MonitorsViewerPage extends Page {
/**
* @see IPage#createControl(Composite)
*/
public void createControl(Composite parent) {
Viewer viewer = createMonitorsViewer(parent);
setMonitorsViewer(viewer);
}
/**
* @see IPage#getControl()
*/
public Control getControl() {
return getMonitorsViewer().getControl();
}
/**
* @see IPage#setFocus()
*/
public void setFocus() {
Viewer viewer= getMonitorsViewer();
if (viewer != null) {
Control c = viewer.getControl();
if (!c.isFocusControl()) {
c.setFocus();
}
}
}
}
/**
* A page in this view's page book that contains this
* view's viewer.
*/
class DeadLocksViewerPage extends Page {
/**
* @see IPage#createControl(Composite)
*/
public void createControl(Composite parent) {
Viewer viewer = createDeadLocksViewer(parent);
setDeadLocksViewer(viewer);
}
/**
* @see IPage#getControl()
*/
public Control getControl() {
return getDeadLocksViewer().getControl();
}
/**
* @see IPage#setFocus()
*/
public void setFocus() {
Viewer viewer= getDeadLocksViewer();
if (viewer != null) {
Control c = viewer.getControl();
if (!c.isFocusControl()) {
c.setFocus();
}
}
}
}
public MonitorsView(){
setEventHandler(new MonitorsDebugEventHandler(this));
}
/**
* Sets the current view.
* Must be called after creation of the viewpart.
*/
public void setViewId(int viewerIndex) {
fViewId = viewerIndex;
refreshCurrentViewer(fMonitorInformationAvailable, true);
}
/**
* Returns the current view id.
*/
public int getViewId() {
return fViewId;
}
/**
* @see org.eclipse.debug.ui.AbstractDebugView#createViewer(Composite)
*/
protected Viewer createViewer(Composite parent) {
StructuredViewer threadViewer = new TreeViewer(parent, SWT.MULTI);
threadViewer.setContentProvider(new ThreadsViewContentProvider());
threadViewer.setLabelProvider(new MonitorModelPresentation());
threadViewer.setInput(MonitorManager.getDefault());
return threadViewer;
}
protected Viewer createMonitorsViewer(Composite parent) {
StructuredViewer monitorsViewer = new TreeViewer(parent, SWT.MULTI);
monitorsViewer.setContentProvider(new MonitorsViewContentProvider());
monitorsViewer.setLabelProvider(new MonitorModelPresentation());
monitorsViewer.setInput(MonitorManager.getDefault());
return monitorsViewer;
}
protected Viewer createDeadLocksViewer(Composite parent) {
StructuredViewer deadLocksViewer = new TreeViewer(parent, SWT.MULTI) {
//when refreshing, sets the color of the threads caught in a deadlock to red
public void refresh() {
getControl().setRedraw(false);
super.refresh();
Item[] children = getChildren(getControl());
if (children != null) {
//to be changed
Color c= DebugUIPlugin.getPreferenceColor(IDebugPreferenceConstants.CHANGED_VARIABLE_RGB);
for (int i = 0; i < children.length; i++) {
updateColor((TreeItem)children[i], c, 0);
}
}
getControl().setRedraw(true);
}
//goes down the tree, but only changes the color of the items caught in a deadlock
public void updateColor(TreeItem item, Color c, int count) {
Object data= item.getData();
if (data instanceof DeadLocksViewContentProvider.ContentThreadWrapper) {
if(((DeadLocksViewContentProvider.ContentThreadWrapper)data).caughtInADeadLock) {
item.setForeground(c);
}
}
TreeItem[] children = item.getItems();
for (int i = 0; i < children.length; i++) {
updateColor(children[i], c, (count+1));
}
}
};
deadLocksViewer.setContentProvider(new DeadLocksViewContentProvider());
deadLocksViewer.setLabelProvider(new MonitorModelPresentation());
deadLocksViewer.setInput(MonitorManager.getDefault());
return deadLocksViewer;
}
/**
* @see org.eclipse.ui.IWorkbenchPart#createPartControl(Composite)
*/
public void createPartControl(Composite parent) {
super.createPartControl(parent);
// create the message page
DeadLocksViewerPage deadLocksPage = new DeadLocksViewerPage();
deadLocksPage.createControl(getPageBook());
initPage(deadLocksPage);
MonitorsViewerPage monitorsViewerPage = new MonitorsViewerPage();
monitorsViewerPage.createControl(getPageBook());
initPage(monitorsViewerPage);
createContextMenu(getDeadLocksViewer().getControl());
createContextMenu(getMonitorsViewer().getControl());
setViewId(VIEW_ID_MONITOR);
// listen to selection in debug view
getSite().getPage().addSelectionListener(IDebugUIConstants.ID_DEBUG_VIEW, this);
}
/**
* @see org.eclipse.debug.ui.AbstractDebugView#createActions()
*/
protected void createActions() {
}
/**
* @see org.eclipse.debug.ui.AbstractDebugView#getHelpContextId()
*/
protected String getHelpContextId() {
return IJavaDebugHelpContextIds.MONITORS_VIEW;
}
/**
* @see org.eclipse.debug.ui.AbstractDebugView#fillContextMenu(IMenuManager)
*/
protected void fillContextMenu(IMenuManager menu) {
menu.add(new Separator("vmGroup")); //$NON-NLS-1$
menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
}
/**
* @see org.eclipse.debug.ui.AbstractDebugView#configureToolBar(IToolBarManager)
*/
protected void configureToolBar(IToolBarManager tbm) {
tbm.add(new Separator("vmGroup")); //$NON-NLS-1$
updateObjects();
}
/**
* Returns the deadLocksViewer.
* @return DeadLocksViewer
*/
public Viewer getDeadLocksViewer() {
return fDeadLocksViewer;
}
/**
* Returns the monitorsViewer.
* @return MonitorsViewer
*/
public Viewer getMonitorsViewer() {
return fMonitorsViewer;
}
/**
* Sets the deadLocksViewer.
* @param deadLocksViewer The deadLocksViewer to set
*/
public void setDeadLocksViewer(Viewer deadLocksViewer) {
fDeadLocksViewer = deadLocksViewer;
}
/**
* Sets the monitorsViewer.
* @param monitorsViewer The monitorsViewer to set
*/
public void setMonitorsViewer(Viewer monitorsViewer) {
fMonitorsViewer = monitorsViewer;
}
protected void refreshCurrentViewer(boolean monitorInformationAvailable, boolean showPage) {
if (getPageBook().isDisposed()) {
return;
}
if (!fValidSelection) {
showMessage(MonitorMessages.getString("MonitorsView.select_one_java_debug_target")); //$NON-NLS-1$
return;
}
boolean changeFromShowMessagePage= monitorInformationAvailable && !fMonitorInformationAvailable;
fMonitorInformationAvailable= monitorInformationAvailable;
if (!monitorInformationAvailable) {
showMessage(MonitorMessages.getString("MonitorsView.The_current_VM_does_not_support_the_retrieval_of_monitor_information_1")); //$NON-NLS-1$
updateObjects();
return;
}
Control page= null;
switch (fViewId) {
case VIEW_ID_THREAD:
page= getViewer().getControl();
page.setRedraw(false);
getViewer().refresh();
((TreeViewer)getViewer()).expandAll();
page.setRedraw(true);
break;
case VIEW_ID_DEADLOCK:
if(MonitorManager.getDefault().getNumberOfDeadlocks() == 0 && MonitorManager.getDefault().getThreads().length > 0) {
showMessage(MonitorMessages.getString("MonitorsView.No_deadlock_detected_3")); //$NON-NLS-1$
showPage= false;
break;
} else {
changeFromShowMessagePage= true;
}
page= getDeadLocksViewer().getControl();
page.setRedraw(false);
getDeadLocksViewer().refresh();
((TreeViewer)getDeadLocksViewer()).expandAll();
page.setRedraw(true);
break;
case VIEW_ID_MONITOR:
page= getMonitorsViewer().getControl();
page.setRedraw(false);
getMonitorsViewer().refresh();
((TreeViewer)getMonitorsViewer()).expandAll();
page.setRedraw(true);
break;
}
if (showPage | changeFromShowMessagePage) {
getPageBook().showPage(page);
}
updateObjects();
}
/**
* @see org.eclipse.ui.ISelectionListener#selectionChanged(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
*/
public void selectionChanged(IWorkbenchPart part, ISelection selection) {
if (selection instanceof IStructuredSelection) {
IStructuredSelection structuredSelection= (IStructuredSelection)selection;
Set targets= new HashSet();
for (Iterator iter= structuredSelection.iterator(); iter.hasNext();) {
Object element= iter.next();
if (element instanceof JDIDebugElement) {
targets.add(((JDIDebugElement)element).getDebugTarget());
}
}
if (targets.size() == 1) {
IJavaDebugTarget debugTarget= (IJavaDebugTarget)targets.toArray()[0];
if (debugTarget != fLastSelectedTarget || !fValidSelection) {
boolean monitorInformationAvailable= debugTarget.supportsMonitorInformation();
if (monitorInformationAvailable) {
MonitorManager.getDefault().updatePartial(debugTarget);
}
fValidSelection= true;
refreshCurrentViewer(monitorInformationAvailable, true);
fLastSelectedTarget= debugTarget;
}
return;
}
}
if (fValidSelection) {
fValidSelection= false;
refreshCurrentViewer(false, true);
}
}
}