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