所以,这就是我被困了几个星期的问题。
我正在开发一个Eclipse插件,它根据Debug视图中的特定StackFrame选项填充具有自定义值的View。
特别是,我想听取所选的堆栈框架,并希望得到基础的IStackFrame
对象。
然而,我已经尝试了十多件事,而且所有事情都失败了。所以我尝试添加DebugContextListener
来获取DebugContextEvent
,最后选择。但是,主要问题是ISelection
不返回基础IStackFrame
对象。它改为返回类型为AbstractDMVMNode.DMVMContext
的对象。我尝试了一个适配器,但这也没有用。我也回来发了这个问题:
Eclipse Plugin Dev- Extracting IStackFrame object from selection in Debug View
从那时起,我尝试了许多不同的方法。我尝试添加IDebugEventSetListener
(但由于无法在调试视图中识别堆栈帧选择,因此失败了)。
我尝试添加一个对象贡献操作,但这也没有意义,因为它最终返回了ISelection
,这是无用的,因为它只返回一个类AbstractDMVMNode.DMVMContext
而不是IStackframe
的对象。
此外,我在org.eclipse.debug.ui插件中检查了VariablesView
源代码本身的实现。它看起来像几个版本(版本3.2中的VariablesView源代码),底层逻辑是使用ISelection
并获得IStackFrame
。互联网上的所有其他资源也提倡相同的。但是,现在,此方案不再有效,因为ISelection
不会返回IStackFrame
。另外,最新的eclipse Debug插件(不使用这个方案)的源代码对我来说不是很直观。
有人能告诉我该怎么办吗?是否只为VariablesView攻击最新的Eclipse源代码?这看起来不是一个好的设计实践,我相信应该有一个更优雅的方式来做到这一点。
PS:我已经尝试了所有技术,所有技术都返回ISelection
。所以,如果你的方法也返回同样的东西,那么它很可能是不正确的。
修改(尝试调整ISelection
的代码段):
// Following is the listener implemnetation
IDebugContextListener flistener = new IDebugContextListener() {
@Override
public void debugContextChanged(DebugContextEvent event) {
if ((event.getFlags() & DebugContextEvent.ACTIVATED) > 0) {
contextActivated(event.getContext());
}
};
};
// Few things I tried in the contextActivated Method
//Attempt 1 (Getting the Adapter):
private void contextActivated(ISelection context) {
if (context instanceof StructuredSelection) {
Object data = ((StructuredSelection) context).getFirstElement();
if( data instanceof IAdaptable){
System.out.println("check1");
IStackFrame model = (IStackFrame)((IAdaptable)data).getAdapter(IStackFrame.class);
if(model != null){
System.out.println("success" + model.getName());
}
}
}
}
// Attemp2 (Directly getting it from ISelection):
private void contextActivated(ISelection context) {
if (context instanceof StructuredSelection) {
System.out.println("a");
Object data = ((StructuredSelection) context).getFirstElement();
if (data instanceof IStackFrame) {
System.out.println("yes");
} else {
System.out.println("no" + data.getClass().getName());
}
}
// This always execute the else and it prints: org.eclipse.cdt.dsf.ui.viewmodel.datamodel.AbstractDMVMNode.DMVMContext
}
// Attemp3 (Trying to obtain it from the viewer (similiar to object action binding in some ways):
private void contextActivated(ISelection context) {
VariablesView variablesView = (VariablesView) PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().findView(IDebugUIConstants.ID_VARIABLE_VIEW);
if (variablesView != null) {
Object input = ((TreeViewer) variablesView.getViewer()).getInput();
if(input != null) System.out.println(input.getClass().getName());
if (input instanceof IStackFrame) {
System.out.println("success");
} else if (input instanceof IThread) {
System.out.println("success");
try {
IStackFrame[] stackFrames = ((IThread) input).getStackFrames();
for (IStackFrame iStackFrame : stackFrames) {
printVariables(iStackFrame);
}
} catch (DebugException e) {
e.printStackTrace();
}
}
}
}
我正在构建此视图以使用JDT和amp; CDT,我正在C项目上测试它。因此,这可能是我总是将返回的对象类型作为AbstractDMVMNode.DMVMContext
的原因。我的实施是否应该不同以处理这两种情况?我相信我应该建立一个通用视图。另外,如果AbstractDMVMNode.DMVMContext
特定于CDT,我应该为CDT案例实施吗?