Java RCP 4切换工具栏中的按钮

Java RCP 4切换工具栏中的按钮,java,rcp,e4,Java,Rcp,E4,我正在努力做到以下几点: 在工具栏中创建按钮(已作为“已处理的工具项”完成) 单击按钮,使按钮看起来像是按下了一样(我读了一些关于使用IAction.AS_复选框的内容,但我找不到任何关于如何执行此操作的清晰RCP 4示例)。当按下按钮时,可以执行某个动作(为了本例,我们称之为“动作a”) 再次单击按钮,使按钮看起来不再按下。当按钮不再按下时,可以执行不同的操作(“为了本例,我们称之为“操作B”) 一个更具体的例子是一个文本编辑器程序。假设工具栏上有一个“粗体”按钮。用户按下“粗体”按钮,按钮图

我正在努力做到以下几点:

  • 在工具栏中创建按钮(已作为“已处理的工具项”完成)
  • 单击按钮,使按钮看起来像是按下了一样(我读了一些关于使用IAction.AS_复选框的内容,但我找不到任何关于如何执行此操作的清晰RCP 4示例)。当按下按钮时,可以执行某个动作(为了本例,我们称之为“动作a”)
  • 再次单击按钮,使按钮看起来不再按下。当按钮不再按下时,可以执行不同的操作(“为了本例,我们称之为“操作B”)
  • 一个更具体的例子是一个文本编辑器程序。假设工具栏上有一个“粗体”按钮。用户按下“粗体”按钮,按钮图标现在看起来像是被按下了。此时,用户在文本区域中键入的所有内容都将以粗体显示。然后用户再次按下“粗体”按钮,按钮不再显示此时,用户在文本区域中键入的所有内容都是常规字体


    我已经尝试过四处搜索,但找不到任何能清楚显示如何操作的示例。如果有任何帮助,我将不胜感激!

    当您将“处理程序工具项”添加到应用程序的工具栏中。e4xmi您可以将“类型”指定为“检查”,以获得按下/未按下的行为

    在项目的处理程序中,可以插入“MToolItem”,以便测试选中状态:

    @Execute
    公共作废执行(最终MToolItem)
    {
    if(item.isSelected())
    …按下按钮
    其他的
    …按钮未按下
    }
    
    我实现了“空白字符画师”的切换按钮,而不是文本编辑器的“粗体按钮”。即,切换按钮将不可打印的字符显示为空格、制表符或返回。 以下内容可用于多页文本编辑器。切换按钮仅在先前选择用于显示不可打印字符的部件/编辑器处激活

    在Application.e4xmi中工具栏的“Handler Tool Item”处,将按钮“Type”指定为“Check”,并给出任意ID=“zzzz.handledtoolitem.WhiteSpaceInter.button” 在处理程序类中,注入MtoolItem和EventBroker,以便broker将按钮的状态发送给应用程序的其余部分:

    public class WhiteSpacePainterHandler {
    boolean buttonStatus;
    @Execute
    public void execute(final MToolItem item, IEventBroker broker) {
        if (item.isSelected()){
            buttonStatus = true;
        }
        else{
            buttonStatus = false;
        }
        broker.post("BUTTON_STATUS", buttonStatus); 
    }
    }
    
    在文本编辑器部分

    public class SampleEditorPart {
    private boolean buttonStatus = false;
    public StyledText st = null;
    public TextViewer tv = null;
    @Inject MPart parte;
    @Inject EModelService modelService;
    @Inject MApplication app;
    public WhitespaceCharacterPainter whitespaceCharacterPainter;
    //More code here...
    
    @PostConstruct
    public void postConstruct(Composite parent){
        //...
        tv = new TextViewer(parent,SWT.MULTI | SWT.V_SCROLL );
        st = tv.getTextWidget();
        whitespaceCharacterPainter = new  WhitespaceCharacterPainter(tv);
        //...
    }
    @Inject
    @Optional
    public void updatePartByButton(@UIEventTopic("BUTTON_STATUS") boolean newButtonStatus) {
        final MElementContainer<MUIElement>container = parte.getParent();
        if (parte.equals((MPart)container.getSelectedElement())){
            if(buttonStatus != newButtonStatus)
            {
            buttonStatus = newButtonStatus;
            MToolItem item = (MToolItem) modelService.find("zzzz.handledtoolitem.boton",app);
            item.setSelected(buttonStatus);
            if(buttonStatus){
                sv.addPainter(whitespaceCharacterPainter);
            }
            else{
                sv.removePainter(whitespaceCharacterPainter);
            }
        }
    }
    @Inject
    @Optional
    public void updateButtonByPart(@Named(IServiceConstants.ACTIVE_PART) MPart activePart) {
        if (parte.equals(activePart)) {
            MToolItem item = (MToolItem) modelService.find("zzzz.handledtoolitem.boton",app);
            item.setSelected(buttonStatus);
         }
    } 
    }
    
    公共类SampleEditorPart{
    私有布尔buttonStatus=false;
    public StyledText st=null;
    公共TextViewer tv=null;
    @注射MPart-part;
    @注入EModelService模型服务;
    @注入MApplication应用程序;
    公共空白字符画家空白字符画家;
    //更多代码在这里。。。
    @施工后
    构造后的公共void(复合父级){
    //...
    tv=新文本查看器(父级,SWT.MULTI | SWT.V|u滚动);
    st=tv.getTextWidget();
    whitespaceCharacterPainter=新的whitespaceCharacterPainter(电视);
    //...
    }
    @注入
    @可选的
    public void updatePartByButton(@UIEventTopic(“按钮状态”)布尔newButtonStatus){
    final MElementContainercontainer=parte.getParent();
    if(parte.equals((MPart)container.getSelectedElement()){
    如果(按钮状态!=新按钮状态)
    {
    按钮状态=新按钮状态;
    MToolItem=(MToolItem)modelService.find(“zzzz.handledtoolitem.boton”,app);
    项。选择的设置(按钮状态);
    如果(按钮状态){
    sv.addPainter(空白字符画家);
    }
    否则{
    sv.removePainter(空白字符画家);
    }
    }
    }
    @注入
    @可选的
    public void updateButtonByPart(@Named(IServiceConstants.ACTIVE_PART)MPart-activePart){
    如果(部分等于(活动部分)){
    MToolItem=(MToolItem)modelService.find(“zzzz.handledtoolitem.boton”,app);
    项。选择的设置(按钮状态);
    }
    } 
    }