Eclipse插件 - 从DebugView

时间:2016-05-05 06:43:31

标签: eclipse eclipse-plugin eclipse-rcp eclipse-cdt

所以,这就是我被困了几个星期的问题。 我正在开发一个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案例实施吗?

0 个答案:

没有答案