Динамическое заполнение выпадающего списка добавлено на панель инструментов Eclipse в плагине Eclipse

#eclipse #plugins #swt

#eclipse #Плагины #swt

Вопрос:

Тема темы кажется достаточно простой в других областях разработки плагинов Eclipse, таких как собственные панели инструментов в диалоговых окнах. В этом случае я добавил выпадающий список на главную панель инструментов с моей точки зрения, с помощью plugin.xml следующим образом

 <menuContribution
        locationURI="toolbar:org.eclipse.ui.main.toolbar">
    <toolbar
            id="com.company.ui.toolbar2">
            // other items removed for clarity

        // following is a drop-down
        <command
                commandId="com.company.ui.mydropdown"
                label="%config.label.default"
                icon="icons/myIcon.png"
                style="pulldown">
            <visibleWhen checkEnabled="false">
                <reference definitionId="com.company.ui.visibilityTester"/>
            </visibleWhen>
        </command>
    </toolbar>
</menuContribution>
 

У меня есть команда, определенная в другом месте, и обработчик в plugin.xml файл, который в данный момент работает так же, как и для кнопки.

Однако выпадающий список не заполнен. Мне нужен способ динамического заполнения по следующим причинам:

  1. Содержимое выпадающего списка поступает из API
  2. Один из элементов списка (или нажатие на список в виде кнопки) запускает диалоговое окно, которое может редактировать список
  3. Закрытие диалогового окна означает, что список необходимо обновить (перестроить) и повторно оценить выбранный / активный элемент

Мне также нужно иметь возможность подключать пользователя, выбирающего другой элемент списка и вызывающего мой API.

Я заметил, что другие примеры в Интернете пытаются создать выпадающий список по-другому, но у меня есть пробелы в знаниях о том, как они подключаются. Например, там, где используется вклад, не всегда ясно, как это связано с конкретным определением в plugin.xml досье. Я не видел примера, который ясно показывает это.

Мне нужно поддерживать Eclipse 4.4.2 и более поздние версии, поэтому современные примеры Eclipse 4 могут не подходить.

Любая помощь приветствуется.

Ответ №1:

Ответ заключается в добавлении элемента управления в раздел панели инструментов меню вкладов, таких как:

 <menuContribution locationURI="toolbar:org.eclipse.ui.main.toolbar">
    <toolbar id="com.company.ui.customToolbar">
        <control
            class="com.company.ui.MyDropDownContribution"
            icon="icons/yourIconHere.png"
            label="%config.label.default">
            id="theDropdown">
            <visibleWhen checkEnabled="false">
                <reference definitionId="com.company.ui.isMyTestCaseSatisfied"/>
            </visibleWhen>
        </control>
    </toolbar>
</menuContribution>
 

А затем для реализации класса вклада, расширяющего WorkbenchWindowControlContribution. Мой упрощенный код, который включает в себя средства для запуска EXE-файла из одного из элементов списка (и может быть повторно использован для выполнения чего-то другого), по сути,:

 public class MyDropDownContribution extends
        WorkbenchWindowControlContribution {

    private Combo dropdownlist;

    private boolean listenerAdded = false;
    private String currentlySelected = "Item 1";
    private String[] listOfItems = new String[]{ "Item 1", "Item 2", "Item 3", "Launch my EXE" };

    private final SelectionAdapter selectionListener = new SelectionAdapter() {
        @Override
        public void widgetSelected(SelectionEvent e) {
            if(e.widget instanceof Combo) {
                // if the selection is currentlySelected, do nothing
                if(dropdownlist.getText().equals(currentlySelected)) {
                    return;
                }

                //if the selection is to launch 'something', do that
                if(dropdownlist.getText().equals("Launch my EXE")) {
                    launchExecutable();
                } else {
                    // otherwise, a new item has been selected, do what you need to
                }
            }
        }
    };


    private void launchExecutable() {
        // place your code to launch your EXE here - you could do some other special case, not just launch EXE
    }


    @Override
    protected Control createControl(Composite parent) {
        Composite container = new Composite(parent, SWT.NONE);
        GridLayout glContainer = new GridLayout(1, false);
        glContainer.marginTop = 0;
        glContainer.marginHeight = 0;
        glContainer.marginWidth = 0;
        container.setLayout(glContainer);
        GridData glReader = new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1);
        glReader.widthHint = 150;
        dropdownlist = new Combo(container, SWT.BORDER | SWT.READ_ONLY
                | SWT.DROP_DOWN);
        dropdownlist.setLayoutData(glReader);
        populateDropdown();
        toggleComboListener();
        return container;
    }

    private void toggleComboListener() {
        if(listenerAdded) {
            dropdownlist.removeSelectionListener(selectionListener);
        } else {
            dropdownlist.addSelectionListener(selectionListener);
        }
        listenerAdded = !listenerAdded;
    }

    public void populateDropdown() {
        PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
            @Override
            public void run() {
                dropdownlist.setItems(new String[]{});
                for(String itemName : listOfItems) {
                    dropdownlist.add(itemName);
                }
                dropdownlist.setText(currentlySelected);
            }
        });
    }
}