如何显示最新的Eclipse错误日志条目

如何显示最新的Eclipse错误日志条目,eclipse,Eclipse,在Eclipse错误日志中创建一个新条目之后,我希望用户能够看到它,即使他们之前在日志视图中向下滚动过 org.osgi.framework.Bundle bundle = ...; ILog log = myPlatform.getLog(bundle); log.log(status); 然后我想让UI视图滚动到那个新项目,这样用户就可以看到它了。我该怎么做呢 所以似乎没有任何合适的API来实现这一点。我必须在日志中注册一个监听器,并使用反射使顶部的项目滚动到视图中 /* (non-Jav

在Eclipse错误日志中创建一个新条目之后,我希望用户能够看到它,即使他们之前在日志视图中向下滚动过

org.osgi.framework.Bundle bundle = ...;
ILog log = myPlatform.getLog(bundle);
log.log(status);

然后我想让UI视图滚动到那个新项目,这样用户就可以看到它了。我该怎么做呢

所以似乎没有任何合适的API来实现这一点。我必须在日志中注册一个监听器,并使用反射使顶部的项目滚动到视图中

/* (non-Javadoc)
 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
 */
@Override
public void start(BundleContext context) throws Exception {
    super.start(context);
    // other stuff here
    Platform.addLogListener(new ScrollToLatestLogListener());
}

public class ScrollToLatestLogListener implements ILogListener {

    @Override
    public void logging(IStatus status, String plugin) {
        Display.getDefault().asyncExec(new Runnable() {
            @Override
            public void run() {
                IViewPart part = getWorkbench().getActiveWorkbenchWindow().getActivePage().findView("org.eclipse.pde.runtime.LogView");
                if (part != null) {
                    ErrorLogAction action = new ErrorLogAction();
                    action.setActivePart(null, part);
                    action.run(null);
                }
            }
        });
    }
}
幸运的是,一位同事已经实现了这一点,来做真正的工作:

public class ErrorLogAction implements IObjectActionDelegate, IViewActionDelegate {

    IWorkbenchPart part;

    public void setActivePart(IAction action, IWorkbenchPart targetPart) {
        part = targetPart;
    }

    public void run(IAction action) {
        try {
            Field treeField = part.getClass().getDeclaredField("fTree");
            treeField.setAccessible(true);
            Tree treeWidget = (Tree)(treeField.get(part));
            if(!treeWidget.isDisposed()) {
                TreeItem[] treeItems = treeWidget.getItems();
                if((treeItems != null) && (treeItems.length > 0)) {
                    treeWidget.setTopItem(treeItems[0]);
                }
            }
        } catch(Exception e) {
            e.printStackTrace();
        }
        part.getSite().getSelectionProvider().setSelection(null);
    }

    public void selectionChanged(IAction action, ISelection selection) {
    }

    public void init(IViewPart view) {
        part = view;
    }

}

只是一个提示,但不是简单地调用
showView(errorLogViewId)
会自动执行吗?@rlegendi实际上不会。如果错误视图关闭,它会显示错误视图,但不会滚动到顶部。它看起来像是滚动到以前选择的日志项。我想确保最上面的日志条目在视图中。啊,好的,很高兴听到mate:-)