Опубликован: 13.07.2012 | Доступ: свободный | Студентов: 460 / 8 | Оценка: 5.00 / 5.00 | Длительность: 18:06:00
Специальности: Программист
Лекция 9:

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

< Лекция 8 || Лекция 9: 12345 || Лекция 10 >

Класс ListBoxModel

Рассмотрим более сложный пример, в котором будет реализовано большинство методов подкласса ListBoxModel. Наша будущая программа, помимо отображения списка строк будет способна уже совершать над ним некоторые действия (добавлять и удалять строки — рис. 9.2).

Работа программы, включающей список с разделением данных и их представления

Рис. 9.2. Работа программы, включающей список с разделением данных и их представления

Вначале создадим собственный класс TListBoxModel, унаследовав его от ListBoxModel ( пример 9.3).

#ifndef _TListBoxModel_h_
#define _TListBoxModel_h_
//--------------------------------------------------------
#include "../JuceLibraryCode/JuceHeader.h"
//--------------------------------------------------------
class TListBoxModel  : public ListBoxModel
{
public:
  TListBoxModel();
  ~TListBoxModel();
  
  // Задаём число элементов списка
  int getNumRows();
  // Отрисовка элемента списка
  void paintListBoxItem(int, Graphics&, int, int, bool);
  // Обработка щелчка и двойного щелчка мышью по элементу
  void listBoxItemClicked(int, const MouseEvent&);
  void listBoxItemDoubleClicked(int, const MouseEvent&);
  // Обработка щелчка мышью по свободному пространству списка
  void backgroundClicked();
  
  // Собственные функции добавления и удаления элемента списка
  void AddItem(String);
  void DeleteItem(int);
  
private:
  // Массив для хранения строк списка
  Array<String> sItems;

  // Предотвращает создание копии конструктора и оператора =
  TListBoxModel(const TListBoxModel&);
  const TListBoxModel& operator= (const TListBoxModel&);
};
//---------------------------------------------------------
#endif
Листинг 9.3. Объявление класса TListBoxModel (файл TListBoxModel.h)

Как видно из объявления класса, в данном примере мы рассмотрим использование ряда виртуальных методов, унаследованных от ListBoxModel:

  • virtual void ListBoxModel::listBoxItemClicked(int row, const MouseEvent& e) — обрабатывает щелчок мышью пользователя по элементу (строке) списка, где row — элемент, по которому был произведён щелчок;
  • virtual void ListBoxModel::listBoxItemDoubleClicked(int row, const MouseEvent& e) — то же, но обрабатывается двойной щелчок;
  • virtual void ListBoxModel::backgroundClicked() — обрабатывает событие двойного щелчка мышью по области списка, где нет строк;

В данном примере мы не используем функции virtual void ListBoxModel::deleteKeyPressed(int lastRowSelected) и virtual void ListBoxModel::returnKeyPressed(int lastRowSelected), отвечающие за обработку событий нажатия на клавиши <DELETE> и <ENTER>, соответственно, поскольку события клавиатуры удобнее обрабатывать в соответствующем методе компонента содержимого, в который будет включён наш список.

Перейдём к реализации модели списка (TListBoxModel пример 9.4).

#include "TListBoxModel.h"
//--------------------------------------------------------
#define tr(s) String::fromUTF8(s)
//-------------------------------------------------------
TListBoxModel::TListBoxModel()
{
}
//-------------------------------------------------------
TListBoxModel::~TListBoxModel()
{
  // Перед завершением работы удаляем хранимые строки списка
  sItems.clear();
}
//-------------------------------------------------------
int TListBoxModel::getNumRows()
{
  // Число элементов списка - число хранимых строк
  return sItems.size();
}
//-----------------------------------------------------
void TListBoxModel::paintListBoxItem(int iRowNumber, Graphics& Painter, int iWidth, int iHeight, bool bIsRowSelected)
{
  // Если строка выбрана, закрашиваем её голубым цветом
  if(bIsRowSelected)
  {
    Painter.fillAll(Colours::lightblue);
  }

  // Цвет надписи - чёрный
  Painter.setColour(Colours::black);
  // Размер шрифта - 75% от высоты строки
  Painter.setFont(iHeight * 0.7f);

  // Рисуем текст строки с заданными параметрами, исходя из её номера
    Painter.drawText(sItems[iRowNumber], 
            5, 0, iWidth, iHeight, 
            Justification::centredLeft, true);
}
//------------------------------------------------------
void TListBoxModel::listBoxItemClicked(int iRowNumber, 
             const MouseEvent& Event)
{
}
//------------------------------------------------------
void TListBoxModel::listBoxItemDoubleClicked(int iRowNumber, 
            const MouseEvent& Event)
{
  // Если пользователь дважды щёлкнул по элементу списка
  // выводим текст соответствующей строки
  String sMessage = tr("Выбран элемент \"");
  sMessage += sItems[iRowNumber];
  sMessage += "\"";
  AlertWindow::showMessageBox(AlertWindow::InfoIcon, 
            tr("Информация"), sMessage,
            tr("Да"), 0);
}
//------------------------------------------------------
void TListBoxModel::backgroundClicked()
{
}
//-----------------------------------------------------
void TListBoxModel::AddItem(String sText)
{
  // Добавляем новый элемент в массив строк
  sItems.add(sText);
}
//-------------------------------------------------------
void TListBoxModel::DeleteItem(int iItem)
{
  // Удаляем элемент из массива строк
  sItems.remove(iItem);
}
//-------------------------------------------------------
Листинг 9.4. Реализация класса TListBoxModel (файл TListBoxModel.cpp)
< Лекция 8 || Лекция 9: 12345 || Лекция 10 >