|
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 } |