Россия |
Компоненты ввода и отображения текстовой, цифровой и иерархической информации. Компоненты отображения иерархических данных
В конструкторе класса мы сохраняем имя элемента, полученное в качестве параметра, в переменной 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)