From c9db949d2beda30ed4fb634afe9f6d73081ae05d Mon Sep 17 00:00:00 2001
From: Mikhail Khodjaiants
Date: Mon, 20 Sep 2004 20:17:26 +0000
Subject: [PATCH] Evaluate expressions on stack frame instead of target to
provide evaluation context. Evaluate the hovering expression for the selected
context only.
---
debug/org.eclipse.cdt.debug.ui/ChangeLog | 5 +
.../internal/ui/editors/DebugTextHover.java | 253 ++++++++++--------
2 files changed, 147 insertions(+), 111 deletions(-)
diff --git a/debug/org.eclipse.cdt.debug.ui/ChangeLog b/debug/org.eclipse.cdt.debug.ui/ChangeLog
index 038c5732279..b7c7393c4b0 100644
--- a/debug/org.eclipse.cdt.debug.ui/ChangeLog
+++ b/debug/org.eclipse.cdt.debug.ui/ChangeLog
@@ -1,3 +1,8 @@
+2004-09-20 Mikhail Khodjaiants
+ Evaluate expressions on stack frame instead of target to provide evaluation context.
+ Evaluate the hovering expression for the selected context only.
+ * DebugTextHover.java
+
2004-09-17 Alain Magloire
Support for 64 bits application
PR 74056. Pathc from Artyom Kuanbekov
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/editors/DebugTextHover.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/editors/DebugTextHover.java
index 7bd9c3f2785..566ad25fd18 100644
--- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/editors/DebugTextHover.java
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/editors/DebugTextHover.java
@@ -8,174 +8,211 @@
* Contributors:
* QNX Software Systems - Initial API and implementation
*******************************************************************************/
-
package org.eclipse.cdt.debug.internal.ui.editors;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.cdt.debug.core.model.ICExpressionEvaluator;
+import org.eclipse.cdt.debug.core.model.ICStackFrame;
import org.eclipse.cdt.debug.internal.ui.CDebugUIUtils;
import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
import org.eclipse.cdt.ui.text.c.hover.ICEditorTextHover;
+import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.debug.core.model.IDebugTarget;
+import org.eclipse.debug.ui.IDebugUIConstants;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IInformationControlCreator;
import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextHoverExtension;
import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IPartListener;
+import org.eclipse.ui.ISelectionListener;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
/**
- *
* The text hovering support for C/C++ debugger.
- *
- * @since: Sep 12, 2002
*/
-public class DebugTextHover implements ICEditorTextHover
-{
+public class DebugTextHover implements ICEditorTextHover, ITextHoverExtension, ISelectionListener, IPartListener {
+
static final private int MAX_HOVER_INFO_SIZE = 100;
+ protected ISelection fSelection = null;
+
+ protected IEditorPart fEditor;
+
/**
* Constructor for DebugTextHover.
*/
- public DebugTextHover()
- {
+ public DebugTextHover() {
super();
}
- /**
- * @see org.eclipse.jface.text.ITextHover#getHoverInfo(ITextViewer, IRegion)
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.text.ITextHover#getHoverInfo(org.eclipse.jface.text.ITextViewer, org.eclipse.jface.text.IRegion)
*/
- public String getHoverInfo( ITextViewer textViewer, IRegion hoverRegion )
- {
- DebugPlugin debugPlugin = DebugPlugin.getDefault();
- if ( debugPlugin == null )
- {
- return null;
- }
- ILaunchManager launchManager = debugPlugin.getLaunchManager();
- if ( launchManager == null )
- {
- return null;
- }
-
- IDebugTarget[] targets = launchManager.getDebugTargets();
- if ( targets != null && targets.length > 0 )
- {
- try
- {
+ public String getHoverInfo( ITextViewer textViewer, IRegion hoverRegion ) {
+ ICStackFrame frame = getFrame();
+ if ( frame != null && frame.canEvaluate() ) {
+ try {
IDocument document = textViewer.getDocument();
if ( document == null )
return null;
-
String expression = document.get( hoverRegion.getOffset(), hoverRegion.getLength() );
if ( expression == null )
return null;
expression = expression.trim();
if ( expression.length() == 0 )
- return null;
- List targetList = new ArrayList( targets.length );
- for ( int i = 0; i < targets.length; i++ )
- {
- ICExpressionEvaluator ee = (ICExpressionEvaluator)targets[i].getAdapter( ICExpressionEvaluator.class );
- if ( ee != null )
- {
- targetList.add(targets[i] );
- }
+ return null;
+ StringBuffer buffer= new StringBuffer();
+ String result = evaluateExpression( frame, expression );
+ if ( result == null )
+ return null;
+ try {
+ if ( result != null )
+ appendVariable( buffer, makeHTMLSafe( expression ), makeHTMLSafe( result.trim() ) );
}
- StringBuffer buffer = new StringBuffer();
- boolean showDebugTarget = targetList.size() > 1;
- Iterator iterator = targetList.iterator();
- while ( iterator.hasNext() )
- {
- IDebugTarget target = (IDebugTarget)iterator.next();
- ICExpressionEvaluator ee = (ICExpressionEvaluator)target.getAdapter( ICExpressionEvaluator.class );
- if ( ee.canEvaluate() )
- {
- String result = evaluateExpression( ee, expression );
- try
- {
- if ( result != null )
- appendVariable( buffer, expression, result.trim(), showDebugTarget ? target.getName() : null );
- }
- catch( DebugException x )
- {
- CDebugUIPlugin.log( x );
- }
- }
+ catch( DebugException x ) {
+ CDebugUIPlugin.log( x );
}
- if ( buffer.length() > 0 )
- {
+ if ( buffer.length() > 0 ) {
return buffer.toString();
}
}
- catch ( BadLocationException x )
- {
+ catch( BadLocationException x ) {
CDebugUIPlugin.log( x );
}
}
return null;
}
- /**
- * @see org.eclipse.jface.text.ITextHover#getHoverRegion(ITextViewer, int)
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.text.ITextHover#getHoverRegion(org.eclipse.jface.text.ITextViewer, int)
*/
- public IRegion getHoverRegion( ITextViewer viewer, int offset )
- {
-/*
- Point selectedRange = viewer.getSelectedRange();
- if ( selectedRange.x >= 0 &&
- selectedRange.y > 0 &&
- offset >= selectedRange.x &&
- offset <= selectedRange.x + selectedRange.y )
- return new Region( selectedRange.x, selectedRange.y );
-*/
+ public IRegion getHoverRegion( ITextViewer viewer, int offset ) {
+ /*
+ * Point selectedRange = viewer.getSelectedRange(); if ( selectedRange.x >= 0 && selectedRange.y > 0 && offset >= selectedRange.x && offset <=
+ * selectedRange.x + selectedRange.y ) return new Region( selectedRange.x, selectedRange.y );
+ */
if ( viewer != null )
return CDebugUIUtils.findWord( viewer.getDocument(), offset );
return null;
}
- private String evaluateExpression( ICExpressionEvaluator ee, String expression )
- {
+ private String evaluateExpression( ICStackFrame frame, String expression ) {
String result = null;
- try
- {
- result = ee.evaluateExpressionToString( expression );
+ try {
+ result = frame.evaluateExpressionToString( expression );
}
- catch( DebugException e )
- {
+ catch( DebugException e ) {
// ignore
}
return result;
}
/**
- * A variable gets one line for each debug target it appears in.
+ * Append HTML for the given variable to the given buffer
*/
- private static void appendVariable( StringBuffer buffer,
- String expression,
- String value,
- String debugTargetName ) throws DebugException
- {
+ private static void appendVariable( StringBuffer buffer, String expression, String value ) throws DebugException {
if ( value.length() > MAX_HOVER_INFO_SIZE )
value = value.substring( 0, MAX_HOVER_INFO_SIZE ) + " ..."; //$NON-NLS-1$
buffer.append( "" ); //$NON-NLS-1$
- if ( debugTargetName != null )
- {
- buffer.append( '[' + debugTargetName + "] " ); //$NON-NLS-1$
- }
- buffer.append( makeHTMLSafe( expression ) );
- buffer.append( " = " ); //$NON-NLS-1$
-
- String safeValue = "" + makeHTMLSafe( value ) + ""; //$NON-NLS-1$ //$NON-NLS-2$
- buffer.append( safeValue );
+ buffer.append( "
" ).append( expression ).append( "
" ); //$NON-NLS-1$ //$NON-NLS-2$
+ buffer.append( " =" ); //$NON-NLS-1$
+ buffer.append( "" ).append( value ).append( "
" ); //$NON-NLS-1$ //$NON-NLS-2$
buffer.append( "
" ); //$NON-NLS-1$
}
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.ui.text.c.hover.ICEditorTextHover#setEditor(org.eclipse.ui.IEditorPart)
+ */
+ public void setEditor( IEditorPart editor ) {
+ if ( editor != null ) {
+ fEditor = editor;
+ final IWorkbenchPage page = editor.getSite().getPage();
+ page.addSelectionListener( IDebugUIConstants.ID_DEBUG_VIEW, this );
+ page.addPartListener( this );
+ // initialize selection
+ Runnable r = new Runnable() {
+
+ public void run() {
+ fSelection = page.getSelection( IDebugUIConstants.ID_DEBUG_VIEW );
+ }
+ };
+ CDebugUIPlugin.getStandardDisplay().asyncExec( r );
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.ISelectionListener#selectionChanged(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
+ */
+ public void selectionChanged( IWorkbenchPart part, ISelection selection ) {
+ fSelection = selection;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IPartListener#partActivated(org.eclipse.ui.IWorkbenchPart)
+ */
+ public void partActivated( IWorkbenchPart part ) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IPartListener#partBroughtToTop(org.eclipse.ui.IWorkbenchPart)
+ */
+ public void partBroughtToTop( IWorkbenchPart part ) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IPartListener#partClosed(org.eclipse.ui.IWorkbenchPart)
+ */
+ public void partClosed( IWorkbenchPart part ) {
+ if ( part.equals( fEditor ) ) {
+ IWorkbenchPage page = fEditor.getSite().getPage();
+ page.removeSelectionListener( IDebugUIConstants.ID_DEBUG_VIEW, this );
+ page.removePartListener( this );
+ fSelection = null;
+ fEditor = null;
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IPartListener#partDeactivated(org.eclipse.ui.IWorkbenchPart)
+ */
+ public void partDeactivated( IWorkbenchPart part ) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IPartListener#partOpened(org.eclipse.ui.IWorkbenchPart)
+ */
+ public void partOpened( IWorkbenchPart part ) {
+ }
+
+ /**
+ * Returns the evaluation stack frame, or null
if none.
+ *
+ * @return the evaluation stack frame, or null
if none
+ */
+ protected ICStackFrame getFrame() {
+ if ( fSelection instanceof IStructuredSelection ) {
+ IStructuredSelection selection = (IStructuredSelection)fSelection;
+ if ( selection.size() == 1 ) {
+ Object el = selection.getFirstElement();
+ if ( el instanceof IAdaptable ) {
+ return (ICStackFrame)((IAdaptable)el).getAdapter( ICStackFrame.class );
+ }
+ }
+ }
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.text.ITextHoverExtension#getHoverControlCreator()
+ */
+ public IInformationControlCreator getHoverControlCreator() {
+ return null;
+ }
+
/**
* Replace any characters in the given String that would confuse an HTML
* parser with their escape sequences.
@@ -209,10 +246,4 @@ public class DebugTextHover implements ICEditorTextHover
}
return buffer.toString();
}
-
- /* (non-Javadoc)
- * @see org.eclipse.cdt.ui.text.c.hover.ICEditorTextHover#setEditor(org.eclipse.ui.IEditorPart)
- */
- public void setEditor(IEditorPart editor) {
- }
-}
+}
\ No newline at end of file