содержание   назад

21. Класс textEd -- простой редактор текстов

В многих даже простых программах полезно иметь редактор текстов как элемент общения с пользователем. Редакторы текстов могут быть разные от самых примитивных, до очень навороченных. В данном классе представлен промежуточный вариант, то есть редактор не очень сложный, но и простым его тоже не назовешь, так как в него все же заложены кое какие возможности. Вот об этом и поговорим. Данная глава является продолжением 19-й главы. В ней было сказано, как получить текст класса textEd, который обсуждается в данной главе. В отличие от 12-й главы данный редактор сделан в виде самостоятельного окна наследником класса JDialog. Этот класс все же не имеет самостоятельной иконки в статусной строке операционной системы, поэтому его надо приклеивать в такому окну, который ее имеет, как это было сделано в классе inpForm, описанном в 15-й главе. Однако все по порядку. В начале класса описаны общие переменные. Здесь вам многое знакомо по 12-й главе, но есть новое. Во-первых, объявлен объект класса Frame с именем parent и тут же определен, как результат работы процедуры MyPro.parent(). Во вторых, объявлен объект нового класса UndoManager. Далее идут массивы для перекодировки неправильно набранных символов и начинается конструктор. У него только один аргумент -- это текст титульной строки. Все остальные данные передаются через общие переменные класса MyPro, как я уже объяснял в 19-й главе.

Вы уже знаете, что указать окно, к которому приклеен данный диалог можно только через конструктор класса, который данный класс расширяет. Это делается с помощью команды super(), аргументом которой должен быть объект класса внешнего окна, причем эта команда должна стоять первой. Передать объект класса можно либо через аргумент, либо через функцию. Здесь сделано второе. Затем идет код, уже знакомый вам по 12-й главе. Новыми являются строки начиная с номера 44. В 44-й строке устанавливается размер полей между рамками окна и текстом в окне редактора. Установка разумных полей иногда делает текст более наглядным. В строках 45-52 задаются режимы Undo и Redo. Эти режимы позволяют отменить несколько последних операций и вернуть назад сделанные отмены. Класс JTextArea, который используется для редактора, автоматически реализует операции копирования текста в буфер и обратно, то есть Copy и Paste по клавишам Ctrl+C и Ctrl+V. Так же стандартно работают клавиши Ctrl+X (уничтожить текст с одновременным копированием в буфер) и Ctrl+A (высветить весь текст). Но операции Undo по клавишам Ctrl+Z и Redo по клавишам Ctrl+Y автоматически не делаются. Их надо кодировать. Именно это и делается в строках 45-52.

Я конечно могу рассказать как это делается, но это не имеет большого смысла. Ясно, что используются методы класса UndoManager. При этом записан довольно сложный код, в котором используются интерфейсы и сразу тут же они описываются как аргументы. Такой стиль уже встречался нам ранее в 13-й главе. Важно, что этот код работает, и клавиши Ctrl+Z и Ctrl+Y реализуют указанные выше очень удобные и полезные операции. Я сам этот код нашел в интернете и скопировал так, как он был. Того же и вам желаю. Этот код можно использовать как черный ящик, про который известно что он делает и неинтересно -- как. Он работает и это главное. Далее идет кусок известного кода, а в строках 56-62 снова новое. Это встроенный модификатор клавиатуры, который проверяет каждый набитый символ, и если введен символ из указанного диапазона и включен переключатель, то введенный символ не используется а вместо него в текстовый редактор вводится другой символ. Такой код позволяет в данном редакторе набивать русский текст даже в том случае, когда на компьютере режим перехода клавиатуры с английской на русскую вообще не установлен. В России трудно найти такой компьютер, но на Западе их очень много. Иногда приходится на Западе работать за чужим компьютером и тогда данный редактор может выручить. А в обычном случае появляется альтернативная возможность использовать свой переключатель клавиатуры вместо стандартного. Можно также вывести и индикатор состояния клавиатуры, но в данной программе это не сделано.

После записи конструктора надо записать методы класса, первым является метод, задающий меню окна редактора. Как задается меню было объяснено в 5-й главе. Здесь новое пожалуй только то, что к каждой горячей клавише задается своя специальная клавиша из набора Alt, Ctrl, Shift, ничего. Эти специальные клавиши кодируются по простому, то есть числами. Так как их не так много, то проблем с чтением не возникает. Так ничего -- это 0, Shift -- это 1, Ctrl -- это 2, Meta -- это 4 и Alt -- это 8. На самом деле это просто биты одного байта. Ничего и Shift можно использовать только с дополнительными клавишами, которые не соответствуют символам языков. Клавишу Meta я не использую, а вот Ctrl и Alt можно использовать широко. Если в меню много разделов и к каждому разделу хочется добавить горячую клавишу, то расширение диапазона дополнительных клавиш полезно. Кроме того, иногда необходимо давать определенным разделам меню стандартные для них клавиши. У нас в меню есть разделы, регулирующие условия работы с текстом. Это первый поиск, последующие поиски, информация о тексте, изменение шрифта, режим вписывания длинных строк, а также режимы исправления текста, набитого в неправильной кодировке, с неправильным указателем клавиши Caps Lock и встроенный переключатель клавиатуры. Ну и еще небольшая помощь на двух языках.

Каждый раздел меню генерирует событие и все эти события обрабатываются таким образом, что вызывается тот или иной метод, только в строке 113 сразу меняется переменная и все. Далее перечислением записаны все процедуры, которые запускаются при выборе разделов меню. В частности первая процедура findop имеет аргументом целое число. Если оно равно 0, то на экран выводится окно ввода текста который надо искать. Этот текст запоминается в переменной tefi. Если текст не задан, то ничего не делается. А если задан, то из редактора забирается весь текст в виде строки и положение курсора. После этого из текста выделается часть от позиции курсора до конца и определяется первый символ в тексте, для которого поиск оказался удачным. Если результат положительный или 0, то курсор ставится в начало этого текста. Если нет, то выдается сообщение, что текст закончился. Эта же процедура, но с аргументом 1 делает то же самое, но не запрашивает текст для поиска. Это необходимо при повторном поиске той же самой комбинации символов.

Редактор не показывает номера строк, так как не предназначался для записи кода программ. Но следующая процедура infoop по запросу может выдать информацию о тексте, позиции курсора, как абсолютной, так и в виде строка-столбец, а также состояние переключателя клавиатуры и режим вписывания длинных строк в пределы окна. Следующая за ней процедура fontop позволяет поменять шрифт текста в редакторе. Пользователю предлагается в окне ввода выбрать номер логического шрифта и размер текста двумя числами. Далее полученная информация обрабатывается, как это делается написано в предыдущих главах. Затем по номеру шрифта задается реальное имя фонта перечислением и затем методом setFont делается операция.

Процедура wrapop использует метод setLineWrap с аргументом true или false. Если установлен режим true, то дополнительно надо указать как делать перенос слов. Метод setWrapStyleWord(true) устанавливает режим переноса целыми словами. Следующая процедура conrop реализует исправление кодировки текста. Из редактора запрашивается позиция курсора, начало и конец выделенного текста, весь текст. Текст преобразуется в массив символов и в цикле по номерам массива в пределах выделенного текста производится замена символов. После этого весь текст снова формируется из символьного массива и вводится в редактор вместе с позицией курсора. Процедура coneop делает то же самое, но в обратную сторону, то есть меняются местами имена массивов c1[ ] и c2[ ]. Две следующие за ними процедуры conlop и conuop делают аналогичную работу, но тут таблицы не требуются. Просто к юникоду символа либо добавляется 32, либо вычитается 32.

Процедура saveFile запускается по кнопке [Exit], то есть при выходе из редактора. При этом в общие переменные MyPro.txt, MyPro.nc, MyPro.ok записываются полный текст редактора, позиция курсора и значение true, указывающее, что выход из редактора был сделан правильно. Исходно в эту переменную записывается значение false. После этого окно редактора делается невидимым. Но тест из редактора теперь доступен другим классам и их методам. И две последние процедуры helpRuss и helpEngl выдают на экран подсказки о том как пользоваться редактором на двух языках. Вот и все.

Данный редактор минимально достаточный для многих целей, но его код также показывает, как можно расширить его функционал, если потребуется. Просто надо добавить кнопок в меню и организовать новые методы обработки текста, а также настройки. Есть возможность менять цвет текста, фона и курсора, цвет выделенного текста, даже делать проверку орфографии через словарь и еще очень много других функций. Большой редактор, написанный мной, представляет собой самостоятельную программу. Она имеет свой сайт notepad-vk.

содержание   назад


.