Компоненты ввода и отображения текстовой, цифровой и иерархической информации. Компоненты отображения иерархических данных
В конструкторе класса мы сохраняем имя элемента, полученное в качестве параметра, в переменной sItemName. После этого задаём режим отображения узла как "открытый" (будут показаны его дочерние элементы) с помощью метода void TreeViewItem::setOpen(bool shouldBeOpen), где shouldBeOpen — флаг, показывающий должен ли быть узел списка открыт или закрыт.
Заметим, что этот метод работает лишь в том случае, если функция virtual bool TreeViewItem::mightContainSubItems() возвращает true, как в нашем примере ( пример 10.2).
Для отображения элемента в древовидном списке достаточно написать реализацию функции virtual const String TreeViewItem::getUniqueName() const. В нашем примере она возвращает переменную sItemName, в которой мы сохранили имя элемента — отображаемый текст.
Зададим размеры нашего элемента как 150 на 25 и, посредством возвращаемого значения метода canBeSelected, укажем, что элемент может выбираться пользователем.
Работа метода отрисовки элемента понятна из комментариев ( пример 10.2).
Наш собственный метод SetNewName принимает в качестве аргумента строку и сохраняет её в переменной sItemName в качестве нового имени элемента.
Теперь можно приступить к написанию класса компонента содержимого нашего приложения. Выглядеть оно будет следующим образом ( рис. 10.1).

Рис. 10.1. Работа программы, демонстрирующей использование виджета древовидного списка с возможностью редактирования свойств элементов
В нашей программе мы будем отслеживать нажатие пользователем кнопки мыши, кнопок, входящих в состав интерфейса программы, а также клавиш клавиатуры. Поэтому унаследуем класс компонента содержимого TCentralComponent от ButtonListener и KeyListener (слушатель мыши наследуется от класса Component).
Компонент содержимого нашей программы будет включать в себя: древовидный список TreeView* pGenreTreeView; три кнопки, TextButton* pNewItemButton, TextButton* pNewSubItemButton и TextButton* pDeleteItemButton, для добавления нового элемента, для добавления нового дочернего элемента и для удаления элемента, соответственно; ярлык с поясняющей надписью Label* pTextLabel; поле ввода для добавления нового имени элемента TextEditor* pTextEdit; флажок включения / выключения редактирования свойств элемента ToggleButton* pEditPropertiesCheckBox, а также кнопка применения внесённых изменений TextButton* pApplyButton. Все эти виджеты организованы двумя группирующими рамками GroupComponent* pItemsGroup и GroupComponent* pPropertiesGroup ( рис. 10.1, пример 10.3).
#ifndef _TCentralComponent_h_
#define _TCentralComponent_h_
//----------------------------------------------------
#include "../JuceLibraryCode/JuceHeader.h"
//----------------------------------------------------
class TTreeViewItem;
//----------------------------------------------------
// Класс компонента содержимого.
// Наследует класс слушателя кнопок.
class TCentralComponent : public Component,
public ButtonListener,
public KeyListener
{
public:
TCentralComponent();
~TCentralComponent();
void paint(Graphics&);
void resized();
// Функция, отслеживающая щелчки по кнопке
void buttonClicked(Button*);
// Функция, отслеживающая нажатие кнопки мыши
void mouseDown(const MouseEvent&);
// Функция, отслеживающая нажатие клавиш клавиатуры
bool keyPressed(const KeyPress&, Component*);
private:
GroupComponent* pItemsGroup;
TreeView* pGenreTreeView;
TextButton* pNewItemButton;
TextButton* pNewSubItemButton;
TextButton* pDeleteItemButton;
GroupComponent* pPropertiesGroup;
Label* pTextLabel;
TextEditor* pTextEdit;
ToggleButton* pEditPropertiesCheckBox;
TextButton* pApplyButton;
// Добавляет новый элемент в список
void AddNewItem();
// Предотвращает создание копии конструктора и оператора =
TCentralComponent(const TCentralComponent&);
const TCentralComponent& operator= (const TCentralComponent&);
};
//--------------------------------------------------
#endif
Листинг
10.3.
Объявление класса компонента содержимого (файл TCentralComponent.h)