Опубликован: 13.07.2012 | Уровень: специалист | Доступ: платный
Лекция 10:

Компоненты ввода и отображения текстовой, цифровой и иерархической информации. Компоненты отображения иерархических данных

< Лекция 9 || Лекция 10: 1234 || Лекция 11 >
Аннотация: В этой лекции мы познакомимся с использованием древовидных списков (классы TreeView и TreeViewItem)

Цель лекции: Научиться создавать и использовать редактируемые древовидные списки

К компонентам отображения иерархических данных относится древовидный список (TreeView). Кроме того, в библиотеке Juce имеется специальный компонент для отображения файлов в заданной директории в виде древовидного списка — FileTreeComponent (его класс унаследован от TreeView).

Эти компоненты служат для отображения каких-либо иерархических данных (например, структура предприятия, файлов и директорий в корневом каталоге, оглавления документов и т.п.) в виде дерева, в котором пользователь может выбрать нужный ему узел или узлы. С каждым узлом могут быть связаны какие-либо данные. Узел представляет собой элемент древовидного списка с включёнными в него дочерними элементами (субэлементами), которые могут быть видны, если узел открыт, либо скрыты. При удалении узла удаляется как родительский, так и все дочерние элементы. Тем самым, компонент с TreeView служит для управления множеством элементов.

Для создания элемента древовидного списка служит класс TreeViewItem. Это абстрактный класс, содержащий ряд виртуальных функций. Рассмотрим пример класса, наследующего TreeViewItem, — TTreeViewItem (листинги пример 10.1 и пример 10.2).

#ifndef _TTreeViewItem_h_
#define _TTreeViewItem_h_
//-------------------------------------------------------
#include "../JuceLibraryCode/JuceHeader.h"
//-------------------------------------------------------
// Класс элемента древовидного списка
class TTreeViewItem : public TreeViewItem
{
public:
  TTreeViewItem(String sItemText = String::empty);
  ~TTreeViewItem();

  // Может содержать дочерние элементы
  bool mightContainSubItems();
  // Функция возвращает имя элемента - отображаемый текст
  

const String getUniqueName() const;
  // Ширина элемента
  int getItemWidth() const;
  // Высота элемента
  int getItemHeight() const;
  // Моэжет ли элемент быть выбран пользователем
  bool canBeSelected() const;
  // Функция, рисующая элемент
  void paintItem(Graphics&, int, int);
  
  // Присваивает новое имя элементу
  void SetNewName(String);
  
private:
  // Переменная для хранения имени элемента
  String sItemName;
};
//------------------------------------------------
#endif
Листинг 10.1. Объявление класса TTreeViewItem (файл TTreeViewItem.h)

В качестве членов нашего класса мы объявили ряд виртуальных функций, унаследованных от TreeViewItem:

  • virtual bool TreeViewItem::mightContainSubItems() — чистая виртуальная функция, показывающая возможность включения в узел дочерних элементов;
  • virtual const String TreeViewItem::getUniqueName() const — функция, возвращающая строку — уникальное имя элемента, отображаемое в древовидном списке;
  • virtual int TreeViewItem::getItemWidth() const — возвращает ширину элемента;
  • virtual int TreeViewItem::getItemHeight() const — возвращает высоту элемента;
  • virtual bool TreeViewItem::canBeSelected() const — функция должна возвращать true, если элемент может быть выбран пользователем;
  • virtual void TreeViewItem::paintItem(Graphics& g, int width, int height) — рисует элемент. Параметрами функции являются, соответственно, контекст, ширина и высота области рисования.

Поскольку мы хотим иметь возможность менять имя элемента, а следовательно, отображаемый текст в иерархическом списке, то объявим соответствующую функцию void TTreeViewItem::SetNewName(String). Кроме того, объявим закрытую переменную String sItemName для хранения текущего имени элемента ( пример 10.1).

Рассмотрим реализацию нашего класса ( пример 10.2).

#include "TTreeViewItem.h"
//----------------------------------------------------------
TTreeViewItem::TTreeViewItem(String sItemText) : TreeViewItem()
{
  // Сохраняем имя элемента
  sItemName = sItemText;
  // Отображаем узел (элемент) открытым
  setOpen(true);
}
//-----------------------------------------------------------
TTreeViewItem::~TTreeViewItem()
{
}
//---------------------------------------------------------
bool TTreeViewItem::mightContainSubItems()
{
    // Может содержать дочерние элементы
  return true;
}
//----------------------------------------------------------
const String TTreeViewItem::getUniqueName() const
{
  return sItemName;
}
//---------------------------------------------------------
int TTreeViewItem::getItemWidth() const
{
  return 150;
}
//---------------------------------------------------------
int TTreeViewItem::getItemHeight() const
{
  return 25;
}
//--------------------------------------------------------
bool TTreeViewItem::canBeSelected() const
{
  // Может быть выбран пользователем
  return true;
}
//-------------------------------------------------------
void TTreeViewItem::paintItem(Graphics& Painter, int iWidth, int iHeight)
{
  // Если элемент выбран...
  if(isSelected())
  {
    // закрашиваем его фон синим цветом
    Painter.fillAll(Colours::blue.withAlpha(0.3f));
  }
  
  Painter.setColour(Colours::black);
  Painter.setFont(iHeight * 0.7f);

  // Рисуем текст (имя) элемента
  Painter.drawText(sItemName, 4, 0, iWidth - 4, 
          iHeight, Justification::centredLeft, true);
}
//--------------------------------------------------------
void TTreeViewItem::SetNewName(String sNewName)
{
  // Сохраняем новое имя элемента
  sItemName = sNewName;
}
//--------------------------------------------------------
Листинг 10.2. Реализация класса TTreeViewItem (файл TTreeViewItem.cpp)
< Лекция 9 || Лекция 10: 1234 || Лекция 11 >
Иван Иванов
Иван Иванов
Россия
Александр Тырин
Александр Тырин
Россия