RCP 4 Переключить кнопку на панели инструментов

Я пытаюсь сделать следующее:

  1. Создайте кнопку на панели инструментов (уже сделано как «обрабатываемый элемент инструмента»)
  2. Нажмите на кнопку, и она будет выглядеть так, как будто она нажата (я читал что-то об использовании IAction.AS_CHECK_BOX, но я не могу найти четких примеров RCP 4 о том, как это сделать). Когда кнопка нажата, может быть выполнено определенное действие (для примера назовем его «Действие А»)
  3. Нажмите на кнопку еще раз, и она будет выглядеть так, как будто она больше не нажата. Когда кнопка больше не нажата, может быть выполнено другое действие («Ради этого примера назовем его «Действие Б»)

Более конкретным примером может быть программа текстового редактора. Допустим, на панели инструментов есть кнопка «Жирный шрифт». Пользователь нажимает кнопку «Жирный», и значок кнопки теперь выглядит так, как будто он был нажат. На этом этапе все, что пользователь вводит в текстовую область, будет выделено жирным шрифтом. Затем пользователь снова нажимает кнопку «Жирный шрифт», и кнопка больше не выглядит так, как будто она нажата. В этот момент все, что пользователь вводит в текстовую область, отображается обычным шрифтом.

Я пробовал искать, но не могу найти примеры, которые ясно показывают, как это сделать. Любая помощь будет оценена по достоинству!


person user2992188    schedule 24.11.2014    source источник


Ответы (2)


Когда вы добавляете «Элемент инструмента обработчика» на панель инструментов в Application.e4xmi, вы можете указать «Тип» как «Проверить», чтобы получить поведение нажатия / не нажатия.

В вашем обработчике элемента вы можете ввести «MToolItem», чтобы вы могли проверить проверенное состояние:

@Execute
public void execute(final MToolItem item)
{
  if (item.isSelected())
    ... button pressed in
  else
    ... button not pressed
}
person greg-449    schedule 24.11.2014

Вместо «Жирной кнопки» для текстового редактора я реализовал кнопку-переключатель для «рисунка пробельных символов». то есть кнопка переключения для отображения непечатаемых символов в виде пробела, табуляции или возврата. Следующее может использоваться для многостраничных текстовых редакторов. Кнопка-переключатель активируется только в частях/редакторах, которые ранее были выбраны для отображения непечатаемых символов.

В «Элементе инструмента обработчика» на панели инструментов в Application.e4xmi укажите кнопку «Тип» как «Проверить» и укажите любой идентификатор = «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);
     }
} 
}
person J Robes    schedule 23.02.2016