[心缘地方]同学录
首页 | 功能说明 | 站长通知 | 最近更新 | 编码查看转换 | 代码下载 | 常见问题及讨论 | 《深入解析ASP核心技术》 | 王小鸭自动发工资条VBA版
登录系统:用户名: 密码: 如果要讨论问题,请先注册。

[整理]SWT开发,如何禁用快捷键,及菜单中的项目~~~

上一篇:[整理]SWT开发,TextCellEditor无法使用Ctrl+C、Ctrl+V等快捷键的解决方法~~
下一篇:[备忘]Vbscript的Function和Sub不支持可选参数( optional arguments)

添加日期:2011/10/26 12:08:11 快速返回   返回列表 阅读4066次
如何给Action设置快捷键,可参考这里:
http://www.mytju.com/classcode/news_readNews.asp?newsID=318

给Action绑定快捷键的时候,是用的activateHandler方法。
解除关系的话,用deactivateHandler方法就行了。

以前是上来就给绑定上了,这样处理是不正确的。
以粘贴的快捷键为例,应该在有东西可粘贴的时候,来active它,没东西粘贴的时候,就马上调用deactivate。
可以在SelectionChanged等一些事件处理中做这些事情。

整理的代码如下,仅供参考:



/** 处理者Map. */
private Map<String, IHandlerActivation> handlerMap = new HashMap<String, IHandlerActivation>();

/**
 * 激活动作处理者.
 * 
 * @param commandId
 *            命令ID
 * @param handler
 *            动作处理者
 */
public void activateHandler(String commandId, ActionHandler handler) {

    if (handlerMap.containsKey(commandId)) {
        return;
    }

    // 取得Handler服务
    IHandlerService handlerService = (IHandlerService) editor.getSite()
            .getService(IHandlerService.class);

    // 激活handler
    IHandlerActivation activation = handlerService.activateHandler(
            commandId, handler);

    // 保存到Map,以便之后使用
    handlerMap.put(commandId, activation);
}

/**
 * 停用动作处理者.
 * 
 * @param commandId
 *            命令ID
 */
public void deactivateHandler(String commandId) {

    if (!handlerMap.containsKey(commandId)) {
        return;
    }

    // 取得Handler服务
    IHandlerService handlerService = (IHandlerService) editor.getSite()
            .getService(IHandlerService.class);

    // 停用handler
    IHandlerActivation activation = handlerMap.get(commandId);
    handlerService.deactivateHandler(activation);

    // 从Map中移除
    handlerMap.remove(commandId);
}

/**
 * 设置“剪切”快捷键是否可用.
 * 
 * @param enabled
 *            是否可用
 */
public void setCutEnabled(boolean enabled) {
    if (enabled) {
        activateHandler(IWorkbenchCommandConstants.EDIT_CUT,
                new ActionHandler(cutAction));
    } else {
        deactivateHandler(IWorkbenchCommandConstants.EDIT_CUT);
    }
}

/**
 * 设置“复制”快捷键是否可用.
 * 
 * @param enabled
 *            是否可用
 */
public void setCopyEnabled(boolean enabled) {
    if (enabled) {
        activateHandler(IWorkbenchCommandConstants.EDIT_COPY,
                new ActionHandler(copyAction));
    } else {
        deactivateHandler(IWorkbenchCommandConstants.EDIT_COPY);
    }
}

/**
 * 设置“粘贴”快捷键是否可用.
 * 
 * @param enabled
 *            是否可用
 */
public void setPasteEnabled(boolean enabled) {
    if (enabled) {
        activateHandler(IWorkbenchCommandConstants.EDIT_PASTE,
                new ActionHandler(pasteAction));
    } else {
        deactivateHandler(IWorkbenchCommandConstants.EDIT_PASTE);
    }
}

/**
 * 设置“删除”快捷键是否可用.
 * 
 * @param enabled
 *            是否可用
 */
public void setDeleteEnabled(boolean enabled) {
    if (enabled) {
        activateHandler(IWorkbenchCommandConstants.EDIT_DELETE,
                new ActionHandler(deleteAction));
    } else {
        deactivateHandler(IWorkbenchCommandConstants.EDIT_DELETE);
    }
}

/**
 * 设置“全选”快捷键是否可用.
 * 
 * @param enabled
 *            是否可用
 */
public void setSelectAllEnabled(boolean enabled) {
    if (enabled) {
        activateHandler(IWorkbenchCommandConstants.EDIT_SELECT_ALL,
                new ActionHandler(selectAllAction));
    } else {
        deactivateHandler(IWorkbenchCommandConstants.EDIT_SELECT_ALL);
    }
}


里面的cutAction,copyAction之类的,是我自己写的处理类。

只要在适当的时机,调用setCutEnabled()、setCopyEnabled这些方法就OK了。
快捷键直接就不可用了,Edit菜单的Cut、Copy等项目也自动灰掉了。
当然,你界面中的一些按钮、右键菜单之类的状态还得设置一下。
 

评论 COMMENTS
没有评论 No Comments.

添加评论 Add new comment.
昵称 Name:
评论内容 Comment:
验证码(不区分大小写)
Validation Code:
(not case sensitive)
看不清?点这里换一张!(Change it here!)
 
评论由管理员查看后才能显示。the comment will be showed after it is checked by admin.
CopyRight © 心缘地方 2005-2999. All Rights Reserved