2014-11-24 57 views
2

我試圖做一個按鈕,如下:RCP 4切換工具欄

  1. 工具欄(已經完成的「處理工具項目」)
  2. 點擊按鈕創建一個按鈕,有按鈕看起來像它被按下(我讀了一些關於使用IAction.AS_CHECK_BOX,但我找不到任何清晰的RCP 4例如如何做到這一點)。當按下按鈕時可以執行某個動作(爲了這個例子我們稱之爲「動作A」)
  3. 再次點擊按鈕,讓按鈕看起來不再被按下。當按鈕不再按下可以執行的不同動作(「爲了舉例說明,我們稱之爲」動作B「)

更具體的例子是文本編輯器程序,假設工具欄有一個'Bold'按鈕,用戶按下'Bold'按鈕,現在看起來按鈕圖標已經被按下。此時,用戶輸入到文本區域的所有內容都將以粗體顯示,然後用戶按'Bold '按鈕,並且按鈕不再看起來像被按下。此時,所有用戶到文本區域的類型是常規字體。

我嘗試過四處搜尋,但找不到任何清楚顯示如何操作的示例。任何幫助,將不勝感激!

回答

4

將'Handler Tool Item'添加到Application.e4xmi中的工具欄時,您可以將'Type'指定爲'Check'以獲取按下/未按下的行爲。

在你的處理器的,你可以注入「MToolItem」,讓您可以測試的選中狀態的項目:

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

工作就像一個魅力,謝謝! – user2992188 2014-11-24 20:01:09

1

而是一個文本編輯器「加粗按鈕」的,我實現了一個切換按鈕爲「空白字符畫家」。即一個切換按鈕,以將不可打印的字符顯示爲空格,製表符或返回。 以下內容可用於多頁文本編輯器。切換按鈕僅在先前選擇的部件/編輯器中激活,以顯示不可打印的字符。

在「處理程序工具項目」的工具欄在Application.e4xmi指定按鈕「類型」爲「查詢」,並給出任何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); 
    } 
} 
}