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

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

< Лекция 9 || Лекция 10: 1234 || Лекция 11 >

В конструкторе класса мы сохраняем имя элемента, полученное в качестве параметра, в переменной 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)
< Лекция 9 || Лекция 10: 1234 || Лекция 11 >
Иван Иванов
Иван Иванов
Россия
Александр Тырин
Александр Тырин
Россия