Компоненты ввода и отображения текстовой, цифровой и иерархической информации. Компоненты отображения иерархических данных
Объявим в качестве члена нашего класса функцию, добавляющую новый элемент в список — void TCentralComponent::AddNewItem() ( пример 10.3).
Для удобства сделаем размеры программы неизменяемыми, что позволит задать размеры входящих в состав компонента содержимого виджетов в абсолютных цифрах ( пример 10.4).
Древовидный список при первом запуске программы будет содержать только один элемент — корневой узел с заданным текстом "Жанры" ( пример 10.3). Корневой узел мы добавляем с помощью метода void TreeView::setRootItem(TreeViewItem* newRootItem).
Древовидный список может иметь один и только один корень, содержащий любое количество дочерних элементов. В случае, если вы хотите включить в состав программы дерево с несколькими корневыми элементами, то имитировать это можно, добавив дочерние элементы в корневой узел, а затем скрыв его вызовом метода void TreeView::setRootItemVisible(bool shouldBeVisible); при этом параметр должен принимать значение false.
Найти корневой элемент древовидного списка позволяет функция TreeViewItem* TreeView::getRootItem() const. Воспользуемся им для того, чтобы выделить корень дерева вызовом метода void TreeViewItem::setSelected(bool shouldBeSelected, bool deselectOtherItemsFirst), где первый параметр показывает, должен ли быть элемент выбран, а второй — должно ли быть снято выделение ранее выбранного узла ( пример 10.4).
Перед завершением работы программы в деструкторе класса TCentralComponent мы очищаем древовидный список, удаляя корневой узел и все его дочерние элементы вызовом метода void TreeView::deleteRootItem().
#include "TCentralComponent.h" #include "TTreeViewItem.h" //------------------------------------------------------- #define tr(s) String::fromUTF8(s) //------------------------------------------------------- TCentralComponent::TCentralComponent() : Component ("Central Component"), pItemsGroup(0), pGenreTreeView(0), pNewItemButton(0), pNewSubItemButton(0), pDeleteItemButton(0), pPropertiesGroup(0), pTextLabel(0), pTextEdit(0), pEditPropertiesCheckBox(0), pApplyButton(0) { pItemsGroup = new GroupComponent("ItemsGroup", tr("Элементы")); addAndMakeVisible(pItemsGroup); pGenreTreeView = new TreeView("GenreTreeView"); pGenreTreeView->addMouseListener(this, true); // Устанавливаем корневой элемент (узел) списка... pGenreTreeView->setRootItem(new TTreeViewItem(tr("Жанры"))); // и выделяем его pGenreTreeView->getRootItem()->setSelected(true, false); addAndMakeVisible(pGenreTreeView); pNewItemButton = new TextButton("NewItemButton"); pNewItemButton->setButtonText(tr("Новый элемент")); pNewItemButton->addListener(this); addAndMakeVisible(pNewItemButton); pNewSubItemButton = new TextButton("NewSubItem"); pNewSubItemButton->setButtonText(tr("Новый субэлемент")); pNewSubItemButton->addListener(this); addAndMakeVisible(pNewSubItemButton); pDeleteItemButton = new TextButton("pDeleteItem"); pDeleteItemButton->setButtonText(tr("Удалить элемент")); pDeleteItemButton->addListener(this); addAndMakeVisible(pDeleteItemButton); pPropertiesGroup = new GroupComponent("pPropertiesGroup", tr("Свойства элемента")); addAndMakeVisible(pPropertiesGroup); pTextLabel = new Label("pTextLabel", tr("Жанр:")); pTextLabel->setFont(Font(15.0000f, Font::plain)); pTextLabel->setJustificationType(Justification::centredLeft); pTextLabel->setEditable(false, false, false); pTextLabel->setColour(Label::textColourId, Colours::black); pTextLabel->setColour(Label::backgroundColourId, Colours::azure); addAndMakeVisible(pTextLabel); pTextEdit = new TextEditor("TextEdit"); pTextEdit->setMultiLine(false); pTextEdit->setReturnKeyStartsNewLine(false); pTextEdit->addKeyListener(this); pTextEdit->setReadOnly(false); pTextEdit->setScrollbarsShown(true); pTextEdit->setCaretVisible(true); pTextEdit->setPopupMenuEnabled(true); pTextEdit->setTextToShowWhenEmpty(tr("Введите название"), Colours::grey); addAndMakeVisible(pTextEdit); pEditPropertiesCheckBox = new ToggleButton(tr("Редактировать свойства")); pEditPropertiesCheckBox->addListener(this); addAndMakeVisible(pEditPropertiesCheckBox); pApplyButton = new TextButton("ApplyButton"); pApplyButton->setButtonText(tr("Применить")); pApplyButton->setEnabled(false); pApplyButton->addListener(this); addAndMakeVisible(pApplyButton); setSize(710, 430); } //--------------------------------------------------------- TCentralComponent::~TCentralComponent() { // Удаляем корневой узел и все дочерние элементы pGenreTreeView->deleteRootItem(); // Удаляем дочерние виджеты // и обнуляем их указатели deleteAllChildren(); } //------------------------------------------------------- void TCentralComponent::resized() { pItemsGroup->setBounds(10, 10, 350, 400); pGenreTreeView->setBounds(25, 35, 200, 355); pNewItemButton->setBounds(240, 35, 100, 25); pNewSubItemButton->setBounds(240, 75, 100, 25); pDeleteItemButton->setBounds(240, 115, 100, 25); pPropertiesGroup->setBounds(370, 10, 330, 400); pTextLabel->setBounds(385, 35, 70, 25); pTextEdit->setBounds(465, 35, 222, 25); pEditPropertiesCheckBox->setBounds(385, 65, 150, 25); pApplyButton->setBounds(585, 65, 100, 25); } //-------------------------------------------------------Листинг 10.4. Реализация конструктора класса TCentralComponent и метода resized (файл TCentralComponent.cpp)