2014-09-29 2 views
2

Я создаю пользовательскую панель инструментов для моего приложения RCP.Eclipse RCP приложение пользовательская панель инструментов

enter image description here

  1. Как показано на рисунке, я хочу иметь выпадающий с тремя другими текстовыми полями. Это в основном поле ввода и взаимозависимы. Сейчас каждый из этих ящиков находится в отдельных классах. Я хочу объединить их в один класс, чтобы легче создавать слушателей друг для друга.

    protected void fillCoolBar(ICoolBarManager coolBar) { 
    
    IToolBarManager toolbar = new ToolBarManager(coolBar.getStyle()); 
    coolBar.add(toolbar);  
    
    Toolbar extraToolBar = new Toolbar("Toolbar"); 
    toolbar.add(extraToolBar); 
    toolbar.add(new Separator()); 
    
    toolbar.add(new MyCombo("Demo Combo box")); 
    toolbar.add(new Separator()); 
    
    toolbar.add(new IPaddress("Ip")); 
    toolbar.add(new Separator()); 
    
    toolbar.add(new Mask("Mask")); 
    toolbar.add(new Separator()); 
    
    toolbar.add(new Count("Count")); 
    
    } 
    
    public class IPaddress extends ControlContribution { 
    
    Text textBox; 
    
    
    public IPaddress(String id) { 
        super(id); 
        // TODO Auto-generated constructor stub 
    } 
    
    @Override 
    protected Control createControl(Composite parent) { 
    textBox = new Text(parent, SWT.MULTI | SWT.BORDER | SWT.WRAP); 
    textBox.setLayoutData(new GridData(GridData.FILL_BOTH)); 
    textBox.addModifyListener(new ModifyListener(){ 
        public void modifyText(ModifyEvent event) { 
         Text text = (Text) event.widget; 
         System.out.println(text.getText()); 
        } 
    }); 
    return textBox; 
    } 
    
    } 
    
  2. Таким образом, я хочу, чтобы создать новую пользовательскую панель инструментов будет все функции, которые я хочу, а затем придерживаться его к оригиналу. Но как-то он показывает только пустую панель слева.

    protected Control createControl(Composite parent) { 
    toolBar = new ToolBar(parent, SWT.FLAT |SWT.BORDER); 
    
    Device dev = toolBar.getDisplay(); 
    
    try { 
        newi = new Image(dev, "C:\\Users\\RahmanAs\\ChipcoachWorkspace\\ChipCoach\\icons\\FileClose.png"); 
        opei = new Image(dev, "C:\\Users\\RahmanAs\\ChipcoachWorkspace\\ChipCoach\\icons\\FileOpen.png"); 
    
    
    } catch (Exception e) { 
        System.out.println("Cannot load images"); 
        System.out.println(e.getMessage()); 
        System.exit(1); 
    } 
    
    
    ToolItem item0 = new ToolItem (toolBar, SWT.PUSH); 
    item0.setImage(newi); 
    item0.setText("Hello"); 
    
    ToolItem item1 = new ToolItem(toolBar, SWT.PUSH); 
    item1.setText("Push"); 
    
    ToolItem item2 = new ToolItem(toolBar, SWT.PUSH); 
    item2.setText("Pull"); 
    
    
    return toolBar; 
    
    
    } 
    
  3. Я также запустить кнопки, которые я создал в плагин с помощью учебника Vogella в. Но я не могу запрограммировать их места размещения таким образом. (Например, если я хочу их в начале.) Есть ли способ создать их программно?

ответ

2

Я думаю, причина, по которой ваш самый левый ToolBar пуст, является вопросом размещения. В моем коде ниже у меня была аналогичная «пустая» проблема ToolBar, когда у меня не было кнопок, расположенных за пределами пользовательскихToolBar, но все еще в ToolBar. Добавление в кнопки «foo» и «bar» фиксировало проблему макета, но я не смог определить правильные вызовы layout() или pack(), чтобы исправить это. Я думаю, это может быть связано с the bug here.

Я сделал поворот при создании аналогичного ToolBar и построен вокруг плагинового проекта «RCP Mail Template», который вы можете создать из мастера «Новый подключаемый проект».

Для решения ваших первых двух проблем, я создал 3 пакета в примере RCP расслоении (я назвал свой проект "com.bar.foo"):

  1. com.bar.foo.actions - Содержит классы, которые расширяют ContributionControl и обертывают Combo и Text виджетов. Они не имеют ничего общего с моделью данных и просто беспокоятся о создании виджетов.
  2. com.bar.foo.model - Содержит модель данных. Я просто составил простую модель здесь с IP, маской, шлюзом и одним или двумя полезными методами.
  3. com.bar.foo.toolBar - Эти классы подключаются к основному пользовательскому интерфейсу ToolBar через точку расширения org.eclipse.ui.menus. Они связывают модель данных с ContributionControls в первом пакете. Самый важный класс - ToolBarContribution, который эффективно централизует всех ваших слушателей. Это упрощает связь между слушателями для виджетов с одной и той же моделью.

Вот источник для ToolBarContribution (обратите внимание, что в нем рассматриваются ваши первые две проблемы, потому что он подключает слушателей к модели и предоставляет свой собственный ToolBar к UI):

package com.bar.foo.toolBar; 

import org.eclipse.jface.action.Action; 
import org.eclipse.jface.action.ToolBarManager; 
import org.eclipse.swt.SWT; 
import org.eclipse.swt.events.SelectionAdapter; 
import org.eclipse.swt.events.SelectionEvent; 
import org.eclipse.swt.events.SelectionListener; 
import org.eclipse.swt.widgets.Combo; 
import org.eclipse.swt.widgets.Composite; 
import org.eclipse.swt.widgets.Control; 
import org.eclipse.swt.widgets.ToolBar; 
import org.eclipse.ui.menus.WorkbenchWindowControlContribution; 

import com.bar.foo.actions.ComboContributionItem; 
import com.bar.foo.actions.TextContributionItem; 
import com.bar.foo.model.NetworkConfig; 

public class ToolBarContribution extends WorkbenchWindowControlContribution { 

    // Our data model. 
    private NetworkConfig configuration = new NetworkConfig(); 

    // Each of these corresponds to a widget in the ToolBar. 
    private Action scanAction; 
    private ComboContributionItem sourceCombo; 
    private TextContributionItem ipText; 
    private TextContributionItem maskText; 
    private TextContributionItem gatewayText; 

    @Override 
    protected Control createControl(Composite parent) { 

     setupContributionItems(); 

     // Let's not get our hands messy with SWT... add IActions or 
     // IContributionItems to a ToolBarManager and let the ToolBarManager 
     // create the SWT ToolBar. 
     ToolBarManager manager = new ToolBarManager(); 
     manager.add(scanAction); 
     manager.add(sourceCombo); 
     manager.add(ipText); 
     manager.add(maskText); 
     manager.add(gatewayText); 

     ToolBar toolBar = manager.createControl(parent); 

     // Highlight the ToolBar in red. 
     toolBar.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_RED)); 

     return toolBar; 
    } 

    private void setupContributionItems() { 
     scanAction = new Action("Scan Host") { 
      @Override 
      public void run() { 
       System.out.println("Scanning..."); 
       String host = sourceCombo.getComboControl().getText(); 
       configuration.scanHost(host); 
       System.out.println("Scanned!"); 
       refreshTexts(); 
      } 
     }; 
     scanAction.setToolTipText("Scans the host for a configuration."); 

     final SelectionListener comboListener = new SelectionAdapter() { 
      @Override 
      public void widgetSelected(SelectionEvent e) { 
       ipText.getTextControl().setText(""); 
       maskText.getTextControl().setText(""); 
       gatewayText.getTextControl().setText(""); 
      } 
     }; 
     sourceCombo = new ComboContributionItem("sourceCombo") { 
      @Override 
      public Control createControl(Composite parent) { 
       // Let ComboContributionItem create the initial control. 
       Control control = super.createControl(parent); 
       // Now customize the Combo widget. 
       Combo combo = getComboControl(); 
       combo.setItems(configuration.getAvailableHosts()); 
       combo.addSelectionListener(comboListener); 
       // Return the default control. 
       return control; 
      } 
     }; 

     ipText = new TextContributionItem("ipText", SWT.BORDER | SWT.SINGLE 
       | SWT.READ_ONLY); 
     maskText = new TextContributionItem("maskText"); 
     gatewayText = new TextContributionItem("gatewayText"); 
    } 

    private void refreshTexts() { 
     ipText.getTextControl().setText(configuration.getIP()); 
     maskText.getTextControl().setText(configuration.getMask()); 
     gatewayText.getTextControl().setText(configuration.getGateway()); 
    } 
} 

В В дополнение к этому ToolBar, у меня есть две отдельные кнопки в главном пользовательском интерфейсе ToolBar, один до, и один после изготовленный под заказToolBar. Их источники находятся в пакете com.bar.foo.toolBar. Вот первая команда:

package com.bar.foo.toolBar; 

import org.eclipse.core.commands.AbstractHandler; 
import org.eclipse.core.commands.ExecutionEvent; 
import org.eclipse.core.commands.ExecutionException; 

public class FooHandler extends AbstractHandler { 
    @Override 
    public Object execute(ExecutionEvent event) throws ExecutionException { 
     System.out.println("foo"); 
     return null; 
    } 
} 

А вот второй один:

package com.bar.foo.toolBar; 

import org.eclipse.core.commands.AbstractHandler; 
import org.eclipse.core.commands.ExecutionEvent; 
import org.eclipse.core.commands.ExecutionException; 

public class BarHandler extends AbstractHandler { 
    @Override 
    public Object execute(ExecutionEvent event) throws ExecutionException { 
     System.out.println("bar"); 
     return null; 
    } 
} 

Поскольку я не знаю слишком много о ваших данных, я должен был создать свою собственную модель. Модель в пакете com.bar.foo.model только один класс:

package com.bar.foo.model; 

public class NetworkConfig { 

    private String ip = ""; 
    private String mask = ""; 
    private String gateway = ""; 

    public String[] getAvailableHosts() { 
     return new String[] { "fooHost" }; 
    } 

    public void scanHost(String host) { 
     if ("fooHost".equals(host)) { 
      ip = "192.168.1.2"; 
      mask = "255.255.255.0"; 
      gateway = "192.168.1.1";  
     } else { 
      ip = ""; 
      mask = ""; 
      gateway = ""; 
     } 
    } 

    public String getIP() { 
     return ip; 
    } 
    public String getMask() { 
     return mask; 
    } 
    public String getGateway() { 
     return gateway; 
    } 
} 

Теперь для пакета com.bar.foo.actions, который содержит ControlContributions, которые идут в обычае ToolBar. Обратите внимание, что ни один из этих двух классов не имеет ничего общего с моделью, и их можно повторно использовать в другом месте вашего продукта.

Первый класс просто обертывает виджет Combo. Виджет может быть первоначально настроен путем переопределения метода controlCreated(Combo). Я использую это в классе ToolBarContribution, чтобы добавить SelectionListener и установить Combo. Вот класс:

package com.bar.foo.actions; 

import org.eclipse.jface.action.ControlContribution; 
import org.eclipse.swt.SWT; 
import org.eclipse.swt.widgets.Combo; 
import org.eclipse.swt.widgets.Composite; 
import org.eclipse.swt.widgets.Control; 

public class ComboContributionItem extends ControlContribution { 

    private Combo combo; 

    public ComboContributionItem(String id) { 
     super(id); 
    } 

    @Override 
    protected Control createControl(Composite parent) { 
     combo = new Combo(parent, SWT.READ_ONLY | SWT.V_SCROLL | SWT.H_SCROLL); 
     return combo; 
    } 

    @Override 
    public int computeWidth(Control control) { 
     // The widget is now 100 pixels. You can new GC gc = new GC(control) and 
     // use the gc.stringExtent(String) method to help compute a more dynamic 
     // width. 
     return 100; 
    } 

    public Combo getComboControl() { 
     return combo; 
    } 
} 

Другой класс в этом пакете обертывания Text виджета:

package com.bar.foo.actions; 

import org.eclipse.jface.action.ControlContribution; 
import org.eclipse.swt.SWT; 
import org.eclipse.swt.widgets.Composite; 
import org.eclipse.swt.widgets.Control; 
import org.eclipse.swt.widgets.Text; 

public class TextContributionItem extends ControlContribution { 

    private final int style; 
    private Text text; 

    public TextContributionItem(String id) { 
     this(id, SWT.BORDER | SWT.SINGLE); 
    } 

    public TextContributionItem(String id, int style) { 
     super(id); 
     this.style = style; 
    } 

    @Override 
    protected Control createControl(Composite parent) { 
     text = new Text(parent, style); 
     return text; 
    } 

    @Override 
    public int computeWidth(Control control) { 
     return 100; 
    } 

    public Text getTextControl() { 
     return text; 
    } 
} 

Я не делал этого, но если вам необходимо дополнительно настроить Text виджет для вашего ToolBar, вы можете переопределить метод createControl(Composite), как и при инициализации ComboContributionItem.

Теперь последнее: я использовал расширения для настройки ToolBar. Однако одна и та же логика, используемая ToolBarContribution, применима к вашему методу fillCoolBar(ICoolBarManager) или к вашему методу createControl(Composite), в зависимости от того, какой ToolBar вы в конечном счете хотите изменить.

В моем случае, вот что я добавил в конец плагина plugin.xml:

<extension 
     point="org.eclipse.ui.menus"> 
    <menuContribution 
     locationURI="toolbar:org.eclipse.ui.main.toolbar"> 
     <toolbar 
      id="com.bar.foo.toolbar"> 
     <command 
       commandId="com.bar.foo.commands.foo" 
       label="Foo" 
       style="push"> 
     </command> 
     <control 
       class="com.bar.foo.toolBar.ToolBarContribution"> 
     </control> 
     <command 
       commandId="com.bar.foo.commands.bar" 
       label="Bar" 
       style="push"> 
     </command> 
     </toolbar> 
    </menuContribution> 
</extension> 
<extension 
     point="org.eclipse.ui.commands"> 
    <command 
     id="com.bar.foo.commands.foo" 
     name="Foo"> 
    </command> 
    <command 
     id="com.bar.foo.commands.bar" 
     name="Bar"> 
    </command> 
</extension> 
<extension 
     point="org.eclipse.ui.handlers"> 
    <handler 
     class="com.bar.foo.toolBar.FooHandler" 
     commandId="com.bar.foo.commands.foo"> 
    </handler> 
    <handler 
     class="com.bar.foo.toolBar.BarHandler" 
     commandId="com.bar.foo.commands.bar"> 
    </handler> 
</extension> 

Команду зацепила так, что есть кнопка для FooHandler до пользовательскихToolBar и кнопки для BarHandler после изготовленный под заказToolBar. Порядок, в котором эти команды указаны в xml, будет отражен в приложении. Аналогичным образом, порядок, в котором элементы добавляются к обычнымToolBar, будет отражен в вашем продукте.

Другое примечание о размещении: вы можете сделать menuContributions в разных местах, установив место размещения в запросе locationURI, например, toolbar:org.eclipse.ui.main.toolbar?after=additions. «before» - это другое ключевое слово размещения, например «after». Дополнительные примеры этого можно найти in this Eclipse help doc.

+1

Добро пожаловать в SO! Если вам нужно какое-то разъяснение перед ответом, пожалуйста, оставьте комментарий (ну в следующий раз, когда у вас будет достаточно «репутации»). Почему бы вам просто не показать, как вы это сделаете, и добавить пример кода? – GameDroids

Смежные вопросы