Ввод и отображение текстовой информации
Практически все методы класса TextEditor, использованные в примере, были рассмотрены нами ранее. Незнакома только функция void TextEditor::setTextToShowWhenEmpty(const String& text, const Colour& colourToUse), которая отображает текст text (в нашем случае это надпись "Text Editor") цветом colourToUse в том случае, если компонент пуст, т.е. не содержит другого текста.
При запуске демонстрационной программы текст в виджете pTextEditor отображается шрифтом Sans-Serif, установленным в системе по умолчанию. Пользователь может выбирать в выпадающем списке гарнитуру шрифта, которым будет отображаться текст в поле pTextEditor ( пример 8.4).
void TCentralComponent::comboBoxChanged(ComboBox* pComboBox) { // Изменён выпадающий список гарнитуры шрифта if(pComboBox == pFontSelectionBox) { // Устанавливаем в качестве шрифта текста поля ввода // шрифт, выбранный пользователем из списка Font CurrentFont; CurrentFont.setTypefaceName(pFontSelectionBox->getText()); CurrentFont.setHeight(20); // Задаём шрифт для отображения текста pTextEditor->applyFontToAllText(CurrentFont); } }Листинг 8.4. Реализация метода comboBoxChanged класса TCentralComponent (файл TCentralComponent.cpp
В примере для задания свойств текста мы использовали метод void TextEditor::applyFontToAllText(const Font& newFont), который применяет характеристики шрифта newFont ко всему содержимому поля ввода.
Однако на практике гораздо чаще требуется, чтобы различные части текста отображались разными шрифтами. В этом случае можно воспользоваться методом void TextEditor::setFont(const Font& newFont), который применяет свойства шрифта newFont только к вновь добавляемому тексту (как вводимому пользователем, так и добавляемому программно).
Реализация обработчика событий щелчка по кнопке компонента содержимого представлена в листинге 8.5 ; она понятна без каких-либо дополнительных комментариев.
void TCentralComponent::buttonClicked(Button* pButton) { // Если нажата кнопка "Очистить"... if(pButton == pClearButton) { // Очистить поле ввода pTextEditor->clear(); } // Если нажата кнопка "Добавить текст"... else if(pButton == pAppendTextButton) { // Вставить текст за курсором pTextEditor->insertTextAtCaret(pAppendTextEdit->getText()); pTextEditor->insertTextAtCaret("\n"); } // Если нажата кнопка "Заменить текст"... else if(pButton == pSetTextButton) { // Сделать замену pTextEditor->setText(pAppendTextEdit->getText()); pTextEditor->insertTextAtCaret("\n"); } // ... }Листинг 8.5. Часть реализации метода buttonClicked класса TCentralComponent (файл TCentralComponent.cpp)
Вторая секция нашей программы демонстрирует работу с режимами редактирования ярлыка Label* pLabel: только чтение, изменение текста по одинарному и двойному щелчкам мыши. Переход к тому или иному режиму редактирования будет осуществляться тремя переключателями (радиокнопками): ToggleButton* pReadOnlyButton, ToggleButton* pEditByOneClickButton и ToggleButton* pEditByDoubleClickButton, соответственно. Радиокнопки графически организованы в группу посредством рамки GroupComponent* pLabelGroup ( рис. 8.1). Подчеркнём, что объединение радиокнопок в одну группу произошло лишь графически, т.е. они рисуются на поверхности компонента pLabelGroup, однако действуют независимо друг от друга. Для того, чтобы они начали действовать согласованно, т.е. в каждый момент могла быть включена только одна из трёх радиокнопок, их необходимо отнести в одну группу посредством наследуемого метода void Button::setRadioGroupId(int newGroupId), где newGroupId — идентификатор группы, целое число, отличное от нуля. Переключатели с одинаковыми идентификаторами действуют как единая группа радиокнопок ( пример 8.6).
// Ярлык с возможностью ввода текста pLabel = new Label("Label", "Label"); pLabel->setFont(Font(15.0000f, Font::bold)); pLabel->setJustificationType(Justification::centred); // Запрет на редактирование pLabel->setEditable(false, false, false); // Цвет текста надписи pLabel->setColour(Label::textColourId, Colour(0xff0f1465)); // Цвет рамки pLabel->setColour(Label::outlineColourId, Colour(0xf6615e5e)); pLabel->setColour(Label::backgroundColourId, Colour(0x0)); addAndMakeVisible(pLabel); pLabelGroup = new GroupComponent(); pLabelGroup->setText(tr("Редактирование")); addAndMakeVisible(pLabelGroup); // Радиокнопка - запрет на редактирование ярлыка pReadOnlyButton = new ToggleButton("ReadOnlyButton"); pReadOnlyButton->setButtonText(tr("Только чтение")); // Устанавливаем в качестве слушателя кнопки // сам компонент-контейнер pReadOnlyButton->addListener(this); // Радиокнопка отмечена pReadOnlyButton->setToggleState(true, false); pReadOnlyButton->setRadioGroupId(1234); addAndMakeVisible(pReadOnlyButton); // Радиокнопка - редактирование ярлыка по щелчку pEditByOneClickButton = new ToggleButton("EditByOneClickButton"); pEditByOneClickButton->setButtonText(tr("Одним щелчком")); pEditByOneClickButton->addListener(this); // Радиокнопка не отмечена pEditByOneClickButton->setToggleState(false, false); pEditByOneClickButton->setRadioGroupId(1234); addAndMakeVisible(pEditByOneClickButton); // Радиокнопка - редактирование ярлыка по двойному щелчку pEditByDoubleClickButton = new ToggleButton("EditByDoubleClickButton"); pEditByDoubleClickButton->setButtonText(tr("Двойным щелчком")); pEditByDoubleClickButton->addListener(this); pEditByDoubleClickButton->setToggleState(false, false); pEditByDoubleClickButton->setRadioGroupId(1234); addAndMakeVisible(pEditByDoubleClickButton);Листинг 8.6. Часть реализации конструктора класса TCentralComponent (2-я секция демонстрационной программы ввода и отображения текстовой информации, файл TCentralComponent.cpp)