简体   繁体   English

如何有条件地阻止用户导航到 eclipse E4 RCP 应用程序中的不同视图/部件?

[英]How can i conditionally prevent a user from navigating to a different view/part in eclipse E4 RCP application?

I am trying to prevent a user from going to a different view/part in a perspective of eclipse E4 application.When i am trying to navigate to the same perspective and view,I am facing a stackOverflow exception due to recursively calling the showPart method by the framework.我试图阻止用户从 eclipse E4 应用程序的角度转到不同的视图/部件。当我试图导航到相同的视角和视图时,由于递归调用 showPart 方法,我面临一个 stackOverflow 异常框架。

NavigationHelper.showPerspective(CommonConstants.PERSPECTIVE1, getEclipseContext());
NavigationHelper.showPart(CommonConstants.VIEW1, getEclipseContext());
NavigationHelper.showPart(CommonConstants.VIEW2, getEclipseContext());

My showPart method lokks like this,我的showPart方法是这样的,

public static boolean showPart(String partId, IEclipseContext eclipseContext) {

        logger.debug("showPart::STARTED::" + partId);
        
        if (null == eclipseContext) {
            eclipseContext = getEclipseContext();
        }

        if (Model.getInstance().hasDataChanged()) {
            if (partId.equalsIgnoreCase(CommonConstants.VIEW1)
                    || partId.equalsIgnoreCase(CommonConstants.VIEW2)) {
                isNavigationSuccessful = true;
            } else {
                isNavigationSuccessful = false;
                Navigation.showWarning();
            }
        }

        if (isNavigationSuccessful) {                       
            findPartAndActivate(partId, eclipseContext, true);
        }
        logger.debug("isNavigationSuccessful = " + isNavigationSuccessful);
        logger.debug("showPart::END::" + partId);

        return isNavigationSuccessful;

    }

The findPartAndActivate looks like this findPartAndActivate 看起来像这样

private static boolean findPartAndActivate(String partId, IEclipseContext eclipseContext, boolean giveFocus) {
        MTrimmedWindow applicationWindow = ((MTrimmedWindow) ((MApplication) eclipseContext.get(MApplication.class))
                .getChildren().get(0));
        IEclipseContext currentContext = applicationWindow.getContext();
        EPartService partService = currentContext.get(EPartService.class);
        EModelService modelService = currentContext.get(EModelService.class);
        MPart part = (MPart) modelService.find(partId, eclipseContext.get(MApplication.class).getChildren().get(0));        
        partService.activate(part, giveFocus);
        return true;
    }
    

The partDeactivated is invoked,once a user leaves from a part/View partDeactivated 被调用,一旦用户离开一个部分/视图

 public void partDeactivated(@Active MPart part) {

            if (partInstance.getElementId() != part.getElementId()) {
                return;
            }                        
            
            if (transactionButton != null && !transactionButton.isDisposed() && transactionButton.isEnabled()
                    && isTransactionCompleted && NavigationHelper.getEditableViewInstance() != null && !partDeactivateFlag) {
                doTransaction();
                partDeactivateFlag = true;
            }

            if (Navigation.isPerspective()) {
                if (EModel.getInstance().hasDataChanged()/*&& !Model.getInstance().isSwitchFlag()*/) {
                    System.out.println("Changes");
                    //Model.getInstance().setSwitchFlag(true);
                    //partDeactivateFlag = true;
                    NavigationHelper.showPerspective(CommonConstants.PERSPECTIVE1, getEclipseContext());
                    NavigationHelper.showPart(CommonConstants.VIEW1, getEclipseContext());

                    NavigationHelper.showPart(CommonConstants.VIEW2, getEclipseContext());
                    
                    

                    
                }
            }
            viewDeactivated();  
        }        

    };

java.lang.StackOverflowError: null org.eclipse.e4.ui.workbench.modeling.ElementMatcher.select(ElementMatcher.java:71) org.eclipse.e4.ui.internal.workbench.ModelServiceImpl.findElementsRecursive(ModelServiceImpl.java:182) org.eclipse.e4.ui.internal.workbench.ModelServiceImpl.findElementsRecursive(ModelServiceImpl.java:317) org.eclipse.e4.ui.internal.workbench.ModelServiceImpl.findElementsRecursive(ModelServiceImpl.java:271) org.eclipse.e4.ui.internal.workbench.ModelServiceImpl.findElementsRecursive(ModelServiceImpl.java:271) org.eclipse.e4.ui.internal.workbench.ModelServiceImpl.findElementsRecursive(ModelServiceImpl.Z93F7 java.lang.StackOverflowError: null org.eclipse.e4.ui.workbench.modeling.ElementMatcher.select(ElementMatcher.java:71) org.eclipse.e4.ui.internal.workbench.ModelServiceImpl.findElementsRecursive(ModelServiceImpl.java:182 ) org.eclipse.e4.ui.internal.workbench.ModelServiceImpl.findElementsRecursive(ModelServiceImpl.java:317) org.eclipse.e4.ui.internal.workbench.ModelServiceImpl.findElementsRecursive(ModelServiceImpl.java:271) org.eclipse.e4 .ui.internal.workbench.ModelServiceImpl.findElementsRecursive(ModelServiceImpl.java:271) org.eclipse.e4.ui.internal.workbench.ModelServiceImpl.findElementsF7.Z9 25A07423FE1C889F448B33D21F46Z:271) org.eclipse.e4.ui.internal.workbench.ModelServiceImpl.findElementsRecursive(ModelServiceImpl.java:251) org.eclipse.e4.ui.internal.workbench.ModelServiceImpl.findElementsRecursive(ModelServiceImpl.java:271) org.eclipse.e4.ui.internal.workbench.ModelServiceImpl.findElements(ModelServiceImpl.java:428) org.eclipse.e4.ui.internal.workbench.ModelServiceImpl.findElements(ModelServiceImpl.java:409) org.eclipse.e4.ui.internal.workbench.ModelServiceImpl.findElements(ModelServiceImpl.java:414) org.eclipse.e4.ui.internal.workbench.ModelServiceImpl.find(ModelServiceImpl.java:448) 25A07423FE1C889F448B33D21F46Z:271) org.eclipse.e4.ui.internal.workbench.ModelServiceImpl.findElementsRecursive(ModelServiceImpl.java:251) org.eclipse.e4.ui.internal.workbench.ModelServiceImpl.findElementsRecursive(ModelServiceImpl.java:271) org. eclipse.e4.ui.internal.workbench.ModelServiceImpl.findElements(ModelServiceImpl.java:428) org.eclipse.e4.ui.internal.workbench.ModelServiceImpl.findElements(ModelServiceImpl.java:409) org.eclipse.e4.ui. internal.workbench.ModelServiceImpl.findElements(ModelServiceImpl.java:414) org.eclipse.e4.ui.internal.workbench.ModelServiceImpl.find(ModelServiceImpl.java:448)

This is the StackOverflow trace..这是 StackOverflow 跟踪..

How can I solve this..?我该如何解决这个..?

Well the stack trace shows this is an error in your code.好吧,堆栈跟踪显示这是您的代码中的错误。 You are running NavigationHelper.showPart in a part deactivated listener, but your code is causing another part deactivate event which calls the deactivate listener again which calls showPart again and so on.您在部分停用的侦听器中运行NavigationHelper.showPart ,但您的代码导致另一个部分停用事件再次调用停用侦听器,该事件再次调用 showPart,依此类推。

You can't try to show a different part in the the part deactivate listener directly.您不能尝试直接在 part deactivate listener 中显示不同的部分。

One possibility is to use Display.asyncExec in the part deactivate listener to run the showPart after the deactivate event has completed.一种可能性是在部件停用侦听器中使用Display.asyncExec在停用事件完成后运行 showPart。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM