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; } }
本文来自博客园,作者:margo,转载请注明原文链接:https://www.cnblogs.com/ZMargo/articles/13231312.html