RCP 4切换工具栏中的按钮

时间:2014-11-24 18:18:56

标签: java rcp e4

我正在尝试执行以下操作:

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

    我试过四处寻找,但找不到任何清楚显示如何操作的例子。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:4)

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

在项目的处理程序中,您可以注入“MToolItem”,以便您可以测试已检查的状态:

@Execute
public void execute(final MToolItem item)
{
  if (item.isSelected())
    ... button pressed in
  else
    ... button not pressed
}

答案 1 :(得分:1)

而不是' Bold Button'对于文本编辑器,我实现了“白色空间角色画家”的切换按钮。即一个切换按钮,用于将不可打印的字符显示为空格,制表符或返回。 以下内容可用于多页文本编辑器。切换按钮仅在之前选择的部件/编辑器中激活,以显示不可打印的字符。

At'处理程序工具项目'到Application.e4xmi中的工具栏指定按钮' Type'作为'检查'并且,给任何ID =“zzzz.handledtoolitem.whitespacespainter.button”  在处理程序类中注入MtoolItem和EventBroker,因此代理将按钮的状态发送到应用程序的其余部分:

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);
     }
} 
}