Toolbar, ToolItem, IconCache

Панель инструментов ToolBar библиотеки SWT в интерфейсе приложения представляет набор кнопок, расположенных между рабочей областью и основным меню. ToolBar позволяет подключить вызов часто используемых функций к нажатию на кнопку.

Интерфейс кнопки панели инструментов может иметь текст, значок или текст со значком. К кнопке можно подключить строку подсказки. Библиотека SWT включает класс панели инструментов ToolBar и кнопки панели инструментов ToolItem пакета org.eclipse.swt.widgets.

Конструктор ToolBar

public ToolBar(Composite сomposite, int style);

Конструктор ToolBar создает панель инструментов и размещает её в сomposite. Для определения размеров панели инструментов следует использовать метод setSize(int width, int height). Для локализации местоположения используется метод setLocation(int x, int y).

При создании ToolBar можно использовать следующие стили style :

  • SWT.FLAT - панель инструментов с плоским представлением кнопок;
  • SWT.HORIZONTAL - панель инструментов с горизонтальным расположением кнопок;
  • SWT.VERTICAL - панель инструментов с вертикальным расположением вдоль одной из сторон окна.
  • SWT.WRAP - текст кнопок панели инструментов будет разделен на несколько строк;
  • SWT.RIGHT - текст в кнопках панели инструментов будет выравниваться по правому краю;

Некоторые стили, например RIGHT и WRAP, можно использовать совместно. По умолчанию панель инструментов создается с горизонтальным расположением кнопок.

Кнопки панели инструментов ToolItem

Конструктор класса ToolItem в качестве параметров принимает значение ToolBar и стиль создаваемой кнопки.

public ToolItem(ToolBar toolBar, int style);

Имеется 5 стилей, которые можно использовать для создания ToolItem.

  • SWT.PUSH - нажимаемая кнопка
  • SWT.CHECK - фиксируемая кнопка; может находится в нажатом или отжатом положении;
  • SWT.RADIO - кнопка, являющаяся частью группого набора кнопок, в котором может выделена одна из кнопок;
  • SWT.SEPARATOR - разделитель между кнопками панели инструментов;
  • SWT.DROP_DOWN - компонент панели инструментов, к которому можно подключить развертываемое меню.

Чтобы создать в панели инструментов компонент в виде текстового поля следует использовать следующий код :

final ToolItem textItem = new ToolItem(bar, SWT.PUSH);
textItem.setText("Open Child");

Для размещения в панели инструментов компонента в виде раскрывающегося меню в качестве примера приводится следующий код :

Display display = new Display();
Shell   shell   = new Shell (display);
		
final ToolBar toolBar = new ToolBar(shell, style);

final ToolItem itemEdit = new ToolItem(toolbar, SWT.PUSH);
itemEdit.setImage("edit.gif");
itemEdit.setToolTipText("Редактирование");

// Создание раскрывающегося меню
final Menu menu = new Menu(shell, SWT.POP_UP);
new MenuItem(menu, SWT.PUSH).setText("Копировать");
new MenuItem(menu, SWT.PUSH).setText("Вставить");
new MenuItem(menu, SWT.SEPARATOR);
new MenuItem(menu, SWT.PUSH).setText("Вырезать");
	    
itemEdit.addListener(SWT.Selection, new Listener() {
    public void handleEvent(Event event) {
        Rectangle bounds = itemEdit.getBounds();
        Point point = toolBar.toDisplay(bounds.x, bounds.y + bounds.height);
        menu.setLocation(point);
        menu.setVisible(true);
    }
});

В примере для кнопки itemEdit используется стиль SWT.PUSH вместо SWT.DROP_DOWN. Положение окна раскрывающегося меню "локализуется" на этапе нажатия на кнопку.

Необходимо отметить, что интерфейс кнопки панели инструментов можно "условно" разделить на 2 части : область изображения в верхней части и область текста в нижней. Если текст отсутствует во всех кнопках панели инструментов, то размер кнопок будет определяться максимальным размером используемых изображений. Если для одной из кнопок дополнительно включить текст, то высота всех кнопок автоматически увеличивается на размер текста, также изменится и ширина кнопок.

Пример создания панели инструментов ToolBar

Разработать программный модуль на все случаи жизни практически невозможно, но стремится к этому следует. Как правило это относится к классам и методам, не связанными, или частично связанным с интерфейсом приложения. На странице будет представлено два программных модуля, которые можно с небольшими доработками использовать в своих программах. Один из модулей связан с созданием панели инструментов ToolBarCreater на основании массива данных. Второй модуль представляет собой кэш изображений IconCache, способный хранить набор различных иконок.

Пример использования панели инструментов ToolBar библиотеки SWT включает следующие модули :

  • IconCache.java - модуль хранения и управления изображениями приложения
  • IToolBar.java - интерфейс, используемый для вызова метода обработки нажатия клавиши
  • ToolBarCreater.java - модуль создания панели инструментов;
  • ToolbarTest.java - приложение тестирования модулей.

Интерфейс примера создания панели инструментов с раскрытым меню представлен на следующем скриншоте.

Листинг модуля IconCache

/**
 * Модуль хранения и управления изображениями приложения
 * @author E.Koklin
 * @version 1.0.0
 */

import java.io.*;
import java.util.*;

import org.eclipse.swt.program.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.graphics.*;

public class IconCache
{
                    // хранилище изображений
    private  static ArrayList<Image> images = null;
                    // хранилище связанных с программами иконок
    private  static Hashtable<Program, Image> programs = null;
                    // хранилище изображений курсоров
    private  static Cursor сursors[]  = null;
    private  static String IMAGES_DIR = null;

    private  final  String ERROR_RESOURCE = "Could not load resources";
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /**
     * Конструктор класса
     */
    public IconCache() 
    {
        if (images == null)
            images = new ArrayList<Image>();
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /**
     * Процедура определения директории изображений
     * @param images_dir
     */
    public void setImagesDir(final String images_dir)
    {
        IMAGES_DIR = images_dir; 
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /**
     * Процедура загрузки изображений
     * @param display дисплей
     * @param list список изображений
     */
    public void loadImages(final Display display, final String[] list)
    {
        for (int i = 0; i < list.length; ++i) {
            Image image = extractImage(list[i]);
            if (image == null) {
                freeResources();
                throw new IllegalStateException(ERROR_RESOURCE);
            }
            images.add(image);
        }
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /**
     * Процедура чтения системных курсоров
     * @param display дисплей
     * @param list список курсоров
     */
    public void loadCursors(final Display display, final int[] list)
    {
        сursors = new Cursor[list.length];
        for (int i = 0; i < list.length; ++i) {
            сursors[i] = display.getSystemCursor(list[i]);
        }
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /**
     * Функция чтения изображения
     * @param idx идентификатор
     * @return изображение
     */
    public Image getImage (final int idx)
    {
        Image image = images.get(idx);
        return image;
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /**
     * Функция освобождения ресурсов
     */
    public void freeResources()
    {
        if (images.size() > 0) {
            for (int i = (images.size() - 1); i >= 0; i--) {
                final Image image = images.get(i);
                if (image != null) 
                    image.dispose();
            }
            images = null;
        }
        images = null;
        if (programs != null) {
            for (Enumeration<Image> it = programs.elements(); 
                         it.hasMoreElements(); ) {
                Image image = (Image) it.nextElement();
                image.dispose();
            }
        }
               сursors = null;
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /**
     * Функция создания/чтения изображения
     * @param display дисплей
     * @param path относительный путь к иконке
     */
    private Image extractImage(final Display display, String path)
    {
        InputStream stream    = IconCache.class.
                                  getResourceAsStream (IMAGES_DIR + path);
        ImageData   imageData = new ImageData (stream);
        ImageData   mask      = imageData.getTransparencyMask ();
        Image       result    = new Image (display, imageData, mask);
        try {
            stream.close ();
        } catch (IOException e) {
            e.printStackTrace ();
        }
        return result;
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /**
     * Функция получения изображения, связанного с программой
     * @param program программа
     */
    public Image getProgramImage(Program program)
    {
        if (programs == null)
            programs = new Hashtable<Program, Image>();
        Image image = (Image) programs.get(program);
        if (image == null) {
            ImageData imageData = program.getImageData();
            if (imageData != null) {
                image = new Image(null, imageData, 
                                        imageData.getTransparencyMask());
                programs.put(program, image);
            }
        }
        return image;
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /**
     * Функция получения изображения по ключу 
     * @param key ключ
     */
    public Image getProgramImage(final String key)
    {
        Image image = (Image) programs.get(key);
        return image;
    }
}

Модуль IconCache включает три хранилища изображений : общее хранилише images, хранилище иконок программ programs, хранилище иконок курсоров сursors. Первое хранилище создается конструктором, остальные два по мере необходимости.

Для загрузки в хранилище изображений необходимо использовать метод loadImages(final Display display, final String[] list), которому в качестве параметра передается массив наименований изображений list. Метод loadImages в цикле прокручивает список и вызывает функцию extractImage(final Display display, String path), создающую изображение. Следует обратить внимание, что директория изображений должна располагаться вместе с классами приложения и при создании исполняемого модуля jar располагается внутри архива. В противном случае, если изображения будут располагаться во внешней директории необходимо будет внести изменения в функцию extractImage, касающиеся чтения изображения. Поле IMAGES_DIR определяет директорию изображений.

Для загрузки изображений курсоров используется метод loadCursors (final Display display, final int[] list). Параметр list содержит список курсоров библиотеки SWT. Связанные с программой изображения загружаются в хранилище в функции getProgramImage(Program program). При первом обращении к функции создается хранилище programs.

Перед завершением работы приложения необходимо освободить ресурсы вызовом метода freeResources().

Пример использования модуля управления изображениями IconCache.

private final String[] IMAGES  = {"cut.gif", "copy.gif"};
private final int[]    CURSORS = {SWT.CURSOR_WAIT, SWT.CURSOR_HAND,
                                  SWT.CURSOR_ARROW, SWT.CURSOR_HELP};
. . .

Display display = new Display();

. . .

// Создание IconCache
IconCache iconCache = new IconCache();
iconCache.setImagesDir("/images/");
// Загрузка изображений в IconCache
iconCache.loadIcons  (display, IMAGES );
iconCache.loadCursors(display, CURSORS);
// Загрузка и чтение изображения Excel
Program program = Program.findProgram(".xls");
Image imageXLS  = iconCache.getProgramImage(program);

Интерфейс IToolBar.java

import org.eclipse.swt.widgets.ToolBar;

public interface IToolBar
{
    public void selectToolbarItem (final ToolBar toolbar, final int idx);
}

Метод selectToolbarItem интерфейса IToolBar будет вызываться в модуле ToolBarCreater. Основное приложение, в котором используется модуль ToolBarCreater должно реализовывать интерфейс IToolBar.

Модуль создания панели инструментов ToolBarCreater.java

/**
 * Модуль создания панели инструментов
 * @author E.Koklin
 * @version 1.0.0
 */

import java.util.ResourceBundle;
import java.util.MissingResourceException;

import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;

public class ToolBarCreater 
{
    private  Shell    shell ;
    private  IToolBar parent;
    private  ToolBar  toolbar;
                                   // Стили кнопок
    private  static  final  String STYLE_PUSH      = "PUSH"     ;
    private  static  final  String STYLE_CHECK     = "CHECK"    ;
    private  static  final  String STYLE_RADIO     = "RADIO"    ;
    public   static  final  String STYLE_DROP_DOWN = "DROP_DOWN";
                                // Идентификаторы массива описания кнопок
    private  final   int    TB_IDX     = 0;  // идентификатор рисунка
    private  final   int    TB_IMAGE   = 1;  // наименование кнопки
    private  final   int    TB_TOOLTIP = 2;  // ресурсный текст подсказки
    private  final   int    TB_TEXT    = 3;  // текст кнопки
    private  final   int    TB_STYLE   = 4;  // стиль кнопки
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /**
     * Конструктор
     * @param shell окно
     */
    public  ToolBarCreater (final Shell shell)
    {
        this.shell = shell;
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /**
     * Конструктор
     * @param shell окно
     * @param parent родитель
     */
    public  ToolBarCreater (final Shell shell, final IToolBar parent)
    {
        this(shell);
        this.parent = parent;
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /**
     * Процедура определения родителя
     * @param parent родитель
     */
    public void setParent(final IToolBar parent) 
    {
        this.parent = parent;
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /**
     * Процедура создания панели инструментов. 
     * Перебор массива в цикле и формирование панели инструментов
     * @param resource ресурсный файл
     * @param list массив описания кнопок. 
     *        Формат : идентификатор, изображение, подсказка
     * @param style стиль панели инструментов 
     * @return панель инструментов
     */
    public ToolBar getToolBar(final ResourceBundle resource,
                              final String[][] list, final int style)
    {
        // Определение кэша изображений
        IconCache iconCache = new IconCache();
        // Панель инструментов
        toolbar = new ToolBar(shell, style);
        // Цикл создания кнопок панели инструментов
        for (int i = 0; i < list.length; i++) {
            if (list[i][TB_IDX] == null) {
                // Создание сепаратора/разделителя
                new ToolItem(toolbar, SWT.SEPARATOR);
            } else {
              ToolItem item = null;
              if ((list[i][TB_STYLE] != null) &&
                  (list[i][TB_STYLE].length() > 0) &&
                  (list[i][TB_IDX].length() > 0)) { 
                  // Создание кнопки
                  if (STYLE_PUSH.equalsIgnoreCase(list[i][TB_STYLE]))
                     item = new ToolItem(toolbar, SWT.PUSH);
                  else if (STYLE_CHECK.equalsIgnoreCase(list[i][TB_STYLE]))
                     item = new ToolItem(toolbar, SWT.CHECK);
                  else if (STYLE_RADIO.equalsIgnoreCase(list[i][TB_STYLE]))
                     item = new ToolItem(toolbar, SWT.RADIO);
                  else if (STYLE_DROP_DOWN.equalsIgnoreCase(list[i][TB_STYLE]))
                     item = new ToolItem(toolbar, SWT.DROP_DOWN);
                  // Определение изображения
                  if ((list[i][TB_IDX] != null) &&
                      (list[i][TB_IDX].length() > 0))
                      item.setImage(iconCache.getImage(
                                       Integer.valueOf(list[i][TB_IDX])));
                    // Определение подсказки
                    if ((list[i][TB_TOOLTIP] != null) &&
                        (list[i][TB_TOOLTIP].length() > 0))
                        item.setToolTipText(getResourceString(resource, 
                                                    list[i][TB_TOOLTIP]));
                    // Определение текста
                    if ((list[i][TB_TEXT] != null) &&
                        (list[i][TB_TEXT].length() > 0))
                        item.setText(list[i][TB_TEXT]);
                    // Определение идентификатора
                    item.setData(i);
                    // Определение слушателя
                    item.addSelectionListener(listener);
                }
            }
        }
        return toolbar;
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /**
     * Процедура создания панели инструментов. 
     * Перебор массива в цикле и формирование панели инструментов
     * @param resource ресурсный файл
     * @param list массив описания кнопок. 
     *        Формат : идентификатор, изображение, подсказка
     * @return панель инструментов
     */
    public ToolBar getToolBar(final ResourceBundle resource,
                              final String[][] list)
    {
        return getToolBar(resource, list, SWT.NONE);
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /**
     * Функция чтения ресурсов
     * @param resource ресурсный файл
     * @param key ключ
     * @return строка ресурсов
     */
    private String getResourceString(ResourceBundle resource, String key)
    {
        try {
            return resource.getString(key);
        } catch (MissingResourceException e) {
            return null;
        } catch (NullPointerException e) {
            return null;
        }
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /**
     * Процедура добавления в панель инструментов кнопки
     * @param toolbar панель инструментов
     * @param image изображение
     * @param tooltip подсказка
     * @param style стиль [PUSH, CHECK]
     */
    public void addToolItem (ToolBar toolbar, final Image image, 
                             final String tooltip, final int style)
    {
        if (image == null)
            // сепаратор
            new ToolItem(toolbar, SWT.SEPARATOR);
        else {
            // Создание кнопки
            ToolItem item = new ToolItem(toolbar, style);  
            // Определение изображения
            item.setImage(image);
            // Определение подсказки
            item.setToolTipText(tooltip);
            // Определение идентификатора кнопки
            item.setData(toolbar.getItemCount() - 1);
            // Определение слушателя
            item.addSelectionListener(listener);
        }
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /**
     * Процедура добавления в панель инструментов кнопки
     * @param toolbar панель инструментов
     * @param image изображение
     * @param tooltip подсказка
     */
    public void addToolItem (ToolBar toolbar, final Image image, 
                             final String tooltip)
    {
        addToolItem (toolbar, image, tooltip, SWT.PUSH); 
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /**
     * Слушатель нажатия на кнопку панели инструментв
     */
    SelectionListener listener = new SelectionListener()
    {
        @Override
        public void widgetDefaultSelected(SelectionEvent e) {}
        
        @Override
        public void widgetSelected(SelectionEvent e) 
        {
            // Если определен родитель, то передать ему обработку события
            if (parent != null) {
                // Кнопка панели инструментов
                ToolItem item = (ToolItem) e.getSource();
                parent.selectToolbarItem(toolbar, (int)item.getData());
            }
        }
    };
}

В функцию создания панели инструментов getToolBar() в качестве параметров необходимо передать ресурсы resource для строки подсказки, массив кнопок list и стиль панели инструментов style. Функция getToolBar() создает панель инструментов и в цикле для каждого элемента массива формирует кнопку и помещает ее в ToolBar. При создании кнопки выполняется проверка наличия в описании иконки, подсказки и текста. Для каждой кнопки определяется идентификатор, размещаемый в свойстве Data (метод setData(idx)). Функция getToolBar() "перегружена", и может быть вызвана без параметра style.

К каждой кнопке подключается слушатель нажатия listener, который вызывает метод selectToolbarItem интерфейса IToolBar родительского окна с передачей ему компонента Toolbar и идентификатора кнопки. Обработка события нажатия кнопки выполняется в родительском модуле.

Перегруженный метод addToolItem позволяет динамически добавлять кнопки в панель инструментов после ее создания.

Листинг приложения тестирования модулей ToolbarTest.java

В программе ToolbarTest определяем массив изображений IMAGES, многомерный массив описания кнопок панели инструментов TOOLBAR, массив курсоров CURSORS и полный путь ресурсного файла resources.

private  final   String[]   IMAGES = {"cut.gif"    , "copy.gif"  ,
                                      "delete.gif" , "parent.gif",
                                      "paste.gif"  , "print.gif" ,
                                      "refresh.gif", "search.gif",
                                      "shell.gif"  , "file.gif" };
    // FORMAT массив TOOLBAR - image.idx, image, resources, text, style
private static String[][] TOOLBAR  = {
     {"", "shell.gif" , null      , "", ToolBarCreater.STYLE_DROP_DOWN},
     {null},
     {"", "cut.gif"    , "cut"    , "", ToolBarCreater.STYLE_PUSH},
     {"", "copy.gif"   , "copy"   , "", ToolBarCreater.STYLE_PUSH}, 
     {"", "paste.gif"  , "paste"  , "", ToolBarCreater.STYLE_PUSH}, 
     {null},
     {"", "refresh.gif", "refresh", "", ToolBarCreater.STYLE_PUSH},
     {"", "search.gif" , null     , "", ToolBarCreater.STYLE_PUSH}}; 
private  final   int[]   CURSORS = {SWT.CURSOR_WAIT, SWT.CURSOR_HAND,
                                    SWT.CURSOR_ARROW, SWT.CURSOR_HELP};
private  ResourceBundle  resource = 
                         ResourceBundle.getBundle("resources/toolbar");

Описание кнопок панели инструментов соответствует формату, который определен в модуле ToolbarCreater. Кнопки-сепараторы представлены в массиве нулевыми (null) значениями.

Листинг конструктора ToolbarTest

Для создания панели инструментов в листинге конструктора ToolbarTest последовательно выполняются следующие действия :

  • создается кэш изображений iconCache, в который загружаются изображения;
  • определяются идентификаторы изображений кнопок панели инструментов;
  • создается панель инструментов;
  • вызывается метод addDropdownMenu создания раскрывающегося меню в панели инструментов.
  • вызывается метод addProgramItem динамического добавления кнопок с изображениями программ Word, Excel.
public ToolbarTest(final Shell shell)
{
    // Кэш изображений
    iconCache = new IconCache();
    iconCache.setImagesDir("/images/");
    // Загрузка изображений
    iconCache.loadImages (shell.getDisplay(), IMAGES);
    iconCache.loadCursors(shell.getDisplay(), CURSORS);
    // Установка иконки приложения
    shell.setImage(iconCache.getImage(ICON_SHELL));
    // Определение идентификаторов кнопок панели инструментов
    for (int i = 0; i < TOOLBAR.length; i++) {
        if ((TOOLBAR[i][0] != null) && (TOOLBAR[i][1].length() > 0)) {
            for (int j = 0; j < IMAGES.length; j++) {
                if (IMAGES[j].equalsIgnoreCase(TOOLBAR[i][1])) {
                    TOOLBAR[i][0] = String.valueOf(j);
                    break;
                }
            }
        }
    }
    // Создание панели инструментов
    ToolBarCreater tbCreater = new ToolBarCreater(shell, this);
    // SWT.FLAT | SWT.HORIZONTAL  SWT.VERTICAL
    toolBar = tbCreater.getToolBar(resource, TOOLBAR, SWT.FLAT); 

    addDropdownMenu(shell);
    // Добавление в панель инструментов кнопок для Word и Excel
    tbCreater.addToolItem (toolBar, null, null);
    addProgramItem (shell, "test.doc");
    addProgramItem (shell, "test.xls");
}

Листинг метода addDropdownMenu

В этом методе создается раскрывающееся меню, которое подключается к определенной кнопке панели инструментов.

private void addDropdownMenu(final Shell shell)
{
    // Создание раскрывающегося меню
    menu = new Menu(shell, SWT.POP_UP);
    new MenuItem(menu, SWT.PUSH).setText("Открыть проект");
    new MenuItem(menu, SWT.PUSH).setText("Закрыть проект");
    new MenuItem(menu, SWT.SEPARATOR);
    new MenuItem(menu, SWT.PUSH).setText("Выйти");

    final ToolItem itemDropDown = toolBar.getItem(MENU_DROPDOWN);
    // Удаление слушателя
    Listener listener = itemDropDown.getListeners(SWT.Selection)[0];
    itemDropDown.removeListener(SWT.Selection, listener);
    itemDropDown.addListener(SWT.Selection, new Listener() {
        public void handleEvent(Event event) {
            Rectangle bounds = itemDropDown.getBounds();
            Point point = toolBar.toDisplay(bounds.x, bounds.y + 
                                                      bounds.height);
            menu.setLocation(point);
            menu.setVisible(true);
        }
    });
}

Листинг метода addProgramItem

В этом методе создается кнопка панели инструментов, связанная с программой.

private void addProgramItem (final Shell shell, final String fname)
{
    String   typeString = null;
    Image    iconImage  = null;
    Program  program    = null;
    int dot = fname.lastIndexOf('.');
    if (dot != -1) {
        // Выделение расширения имени файла
        String extension = fname.substring(dot);
        // Определение программы
        program = Program.findProgram(extension);
        if (program != null) {
            typeString = program.getName();
            iconImage = iconCache.getProgramImage(program);
        }
    }
    // Создание элемента панели инструментов
    ToolBarCreater tbCreater = new ToolBarCreater(shell, this);
    tbCreater.addToolItem (toolBar, iconImage, typeString, SWT.CHECK);
}

Листинг метода selectToolbarItem

Программа ToolbarTest реализует интерфейс IToolBar, включающий метод selectToolbarItem. Данный метод вызывается по нажатию на кнопки панели инструментов. В методе анализируется идентификатор кнопки, в зависимости от значения которого вызывается соответствующий метод. Кнопка с идентификатором 0 связана с раскрывающимся меню, нажатие которого обрабатывается в отдельном методе, представленном в методе addDropdownMenu.

/**
  * Реализация интерфейса IToolBar
  * @param toolbar - панель инструментов
  * @param idx - идентификатор кнопки
  * @see IToolBar
  */
@Override
public void selectToolbarItem(final ToolBar toolbar, final int idx)
{
    switch(idx) {
      case 0 : break;
      case 1 : tbCut() ; break;
      case 2 : tbCopy(); break;
      case 3 : tbPaste(); break;
      default : System.out.println ("idx = " + idx);
    }
}

private void tbCut  () {}
private void tbCopy () {}
private void tbPaste() {}

Скачать пример SWT Toolbar

Исходный код рассмотренного примера SWT ToolbarTest в виде проекта Eclipse можно скачать здесь (4.73 Мб). Библиотека labir.utils.jar, используемая в примере, включает класс IconCache, полное описание которого (поля, методы) приведено на этой странице.

  Рейтинг@Mail.ru