cdt/cdt_6_0_x/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/ui/AbstractDsfDebugTextHover.java
changeset 111 c2563c416525
equal deleted inserted replaced
110:9262ca4bdfff 111:c2563c416525
       
     1 /**
       
     2 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of the License "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description: 
       
    15 *
       
    16 */
       
    17 
       
    18 package org.eclipse.cdt.dsf.debug.ui;
       
    19 
       
    20 import org.eclipse.cdt.debug.ui.editors.AbstractDebugTextHover;
       
    21 import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
       
    22 import org.eclipse.cdt.dsf.concurrent.Query;
       
    23 import org.eclipse.cdt.dsf.debug.service.IExpressions;
       
    24 import org.eclipse.cdt.dsf.debug.service.IFormattedValues;
       
    25 import org.eclipse.cdt.dsf.debug.service.IExpressions.IExpressionDMContext;
       
    26 import org.eclipse.cdt.dsf.debug.service.IFormattedValues.FormattedValueDMContext;
       
    27 import org.eclipse.cdt.dsf.debug.service.IFormattedValues.FormattedValueDMData;
       
    28 import org.eclipse.cdt.dsf.debug.service.IStack.IFrameDMContext;
       
    29 import org.eclipse.cdt.dsf.internal.ui.DsfUIPlugin;
       
    30 import org.eclipse.cdt.dsf.service.DsfServicesTracker;
       
    31 import org.eclipse.cdt.dsf.service.DsfSession;
       
    32 import org.eclipse.core.runtime.IAdaptable;
       
    33 import org.eclipse.debug.core.model.IDebugModelProvider;
       
    34 
       
    35 /**
       
    36  * An implementation of AbstractDebugTextHover using DSF services.
       
    37  * 
       
    38  * @since 2.1
       
    39  */
       
    40 abstract public class AbstractDsfDebugTextHover extends AbstractDebugTextHover {
       
    41 
       
    42     /**
       
    43      * Returns the debug model ID of that this debug text hover is to be used for.
       
    44      */
       
    45     abstract protected String getModelId();
       
    46     
       
    47 	private static class GetExpressionValueQuery extends Query<FormattedValueDMData> {
       
    48     	private final IFrameDMContext frame;
       
    49     	private final String expression;
       
    50 		private DsfServicesTracker dsfServicesTracker;
       
    51 
       
    52         public GetExpressionValueQuery(IFrameDMContext frame, String expression, DsfServicesTracker dsfServicesTracker) {
       
    53             this.frame = frame;
       
    54 			this.expression = expression;
       
    55 			this.dsfServicesTracker = dsfServicesTracker;
       
    56         }
       
    57 
       
    58         @Override
       
    59         protected void execute(final DataRequestMonitor<FormattedValueDMData> rm) {
       
    60             DsfSession session = DsfSession.getSession(frame.getSessionId());
       
    61 			IExpressions expressions = dsfServicesTracker.getService(IExpressions.class);
       
    62     		IExpressionDMContext expressionDMC = expressions.createExpression(frame, expression);
       
    63     		FormattedValueDMContext formattedValueContext = expressions.getFormattedValueContext(expressionDMC, IFormattedValues.NATURAL_FORMAT);
       
    64         	expressions.getFormattedExpressionValue(formattedValueContext,
       
    65         			new DataRequestMonitor<FormattedValueDMData>(session.getExecutor(), rm) {
       
    66                 @Override
       
    67                 protected void handleSuccess() {
       
    68                     rm.setData(getData());
       
    69                     rm.done();
       
    70                 }
       
    71                 
       
    72                 @Override
       
    73         		protected void handleFailure() {
       
    74         			rm.done();
       
    75         		}
       
    76             });
       
    77         }
       
    78     }
       
    79 
       
    80 	protected IFrameDMContext getFrame() {
       
    81 	    IAdaptable adaptable = getSelectionAdaptable();
       
    82 	    if (adaptable != null) {
       
    83 	        return (IFrameDMContext) adaptable.getAdapter(IFrameDMContext.class);
       
    84 		}
       
    85 		return null;
       
    86 	}
       
    87 
       
    88 	@Override
       
    89 	protected boolean canEvaluate() {
       
    90 	    if (getFrame() == null) {
       
    91 	        return false;
       
    92 	    }
       
    93 	    
       
    94 		IAdaptable adaptable = getSelectionAdaptable();
       
    95 		if (adaptable != null) {
       
    96 		    IDebugModelProvider modelProvider = (IDebugModelProvider)adaptable.getAdapter(IDebugModelProvider.class);
       
    97 		    if (modelProvider != null) {
       
    98 		        String[] models = modelProvider.getModelIdentifiers();
       
    99 		        String myModel = getModelId();
       
   100 		        for (int i = 0; i < models.length; i++) {
       
   101 		            if (models[i].equals(myModel)) {
       
   102 		                return true;
       
   103 		            }
       
   104 		        }
       
   105 		    }
       
   106 		}
       
   107 		return false;
       
   108 	}
       
   109 
       
   110 	@Override
       
   111 	protected String evaluateExpression(String expression) {
       
   112 		IFrameDMContext frame = getFrame();
       
   113 		String sessionId = frame.getSessionId();
       
   114 		DsfServicesTracker dsfServicesTracker = new DsfServicesTracker(DsfUIPlugin.getBundleContext(), sessionId);
       
   115 		try {
       
   116 			GetExpressionValueQuery query = new GetExpressionValueQuery(frame, expression, dsfServicesTracker);
       
   117 			DsfSession session = DsfSession.getSession(sessionId);
       
   118 	        session.getExecutor().execute(query);
       
   119 	        try {
       
   120 	        	FormattedValueDMData data = query.get();
       
   121 	        	if (data != null)
       
   122 	        		return data.getFormattedValue();
       
   123 	        } catch (Exception e) {
       
   124 	        }
       
   125 		} finally {
       
   126 			dsfServicesTracker.dispose();
       
   127 		}
       
   128         return null;
       
   129 	}
       
   130 
       
   131 }