eclipse rcp command 定义 enabledWhen

实现效果如下图:

 

 在还未登录时,右上角注销按钮不可点

一旦登录成功,右上角注销可点

 

 右上角注销是一个command,plugin.xml 定义如下:

<extension point="org.eclipse.ui.commands">
  <command
              description="%command.org.jkiss.dbeaver.core.sqlinspection.logout.description"
              id="org.jkiss.dbeaver.core.sqlinspection.logout"
              name="%command.org.jkiss.dbeaver.core.sqlinspection.logout.name">
        </command>
</extension>
<extension point="org.eclipse.ui.handlers">
<handler
              class="org.jkiss.dbeaver.ui.views.sqlinspection.LogoutSqlInspectionUserHandler"
              commandId="org.jkiss.dbeaver.core.sqlinspection.logout">
            <enabledWhen>
                <with variable="activePart">
                    <!-- namespace.property -->
                    <test property="org.jkiss.dbeaver.core.global.hasLoginSqlInspection"/>
                </with>
            </enabledWhen>
        </handler>

</extension>

在handlers 扩展点中,定义的  test 节点的 property属性  

org.jkiss.dbeaver.core.global.hasLoginSqlInspection

是由 namespace.property 组成,定义是在 propertyTesters 扩展点中
<extension point="org.eclipse.core.expressions.propertyTesters">
        <propertyTester
            class="org.jkiss.dbeaver.ui.actions.GlobalPropertyTester"
            id="org.jkiss.dbeaver.ui.actions.GlobalPropertyTester"
            namespace="org.jkiss.dbeaver.core.global"
            properties="standalone,hasActiveProject,hasMultipleProjects,hasLoginSqlInspection"
            type="java.lang.Object"/>
</extension>

下面来看 

org.jkiss.dbeaver.ui.actions.GlobalPropertyTester
这个类定义
/*
 * DBeaver - Universal Database Manager
 * Copyright (C) 2010-2020 DBeaver Corp and others
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.jkiss.dbeaver.ui.actions;

import org.eclipse.core.expressions.PropertyTester;
import org.eclipse.core.resources.*;
import org.jkiss.dbeaver.model.preferences.DBPPreferenceStore;
import org.jkiss.dbeaver.runtime.DBWorkbench;
import org.jkiss.dbeaver.runtime.IPluginService;
import org.jkiss.dbeaver.ui.ActionUtils;

/**
 * GlobalPropertyTester
 */
public class GlobalPropertyTester extends PropertyTester {
    //static final Log log = LogFactory.get vLog(ObjectPropertyTester.class);

    private DBPPreferenceStore preferenceStore = DBWorkbench.getPlatform().getPreferenceStore();
    
    public static final String NAMESPACE = "org.jkiss.dbeaver.core.global";
    public static final String PROP_STANDALONE = "standalone";
    public static final String PROP_HAS_ACTIVE_PROJECT = "hasActiveProject";
    public static final String PROP_HAS_MULTI_PROJECTS = "hasMultipleProjects";
    public static final String SQL_INSPECTION_HAS_LOGIN = "hasLoginSqlInspection";

    @Override
    public boolean test(Object receiver, String property, Object[] args, Object expectedValue) {
        switch (property) {
            case PROP_HAS_MULTI_PROJECTS:
                return DBWorkbench.getPlatform().getWorkspace().getProjects().size() > 1;
            case PROP_HAS_ACTIVE_PROJECT:
                return DBWorkbench.getPlatform().getWorkspace().getActiveProject() != null;
            case PROP_STANDALONE:
                return DBWorkbench.getPlatform().getApplication().isStandalone();
            case SQL_INSPECTION_HAS_LOGIN:
                String string = preferenceStore.getString("userId");
                return string != null && !"".equals(string);
        }
        return false;
    }

    public static void firePropertyChange(String propName)
    {
        ActionUtils.evaluatePropertyState(NAMESPACE + "." + propName);
    }

    public static class ResourceListener implements IPluginService, IResourceChangeListener {

        @Override
        public void activateService() {
            ResourcesPlugin.getWorkspace().addResourceChangeListener(this);
        }

        @Override
        public void deactivateService() {
            ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
        }

        @Override
        public void resourceChanged(IResourceChangeEvent event) {
            if (event.getType() == IResourceChangeEvent.POST_CHANGE) {
                for (IResourceDelta childDelta : event.getDelta().getAffectedChildren()) {
                    if (childDelta.getResource() instanceof IProject) {
                        if (childDelta.getKind() == IResourceDelta.ADDED || childDelta.getKind() == IResourceDelta.REMOVED) {
                            firePropertyChange(GlobalPropertyTester.PROP_HAS_MULTI_PROJECTS);
                        }
                    }
                }
            }
        }
    }
}

需要注意的是,一旦对 

hasLoginSqlInspection
这个属性值做了修改,一定需要调用
firePropertyChange 这个方法,如:

 

 

import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.preferences.DBPPreferenceStore;
import org.jkiss.dbeaver.runtime.DBWorkbench;
import org.jkiss.dbeaver.ui.actions.GlobalPropertyTester;

public class LogoutSqlInspectionUserHandler extends AbstractHandler {

    private static final Log log = Log.getLog(LogoutSqlInspectionUserHandler.class);
    private DBPPreferenceStore preferenceStore = DBWorkbench.getPlatform().getPreferenceStore();
    
    @Override
    public Object execute(ExecutionEvent event) throws ExecutionException {
        log.info("click logout...");
        preferenceStore.setToDefault(SqlInspectionView.USER_ID);
        GlobalPropertyTester.firePropertyChange(GlobalPropertyTester.SQL_INSPECTION_HAS_LOGIN);
        
        return null;
    }

}

 



posted @ 2020-07-03 16:49  margo  阅读(417)  评论(0编辑  收藏  举报