OberonCore https://forum.oberoncore.ru/ |
|
Поправка SetNativeProp https://forum.oberoncore.ru/viewtopic.php?f=23&t=6517 |
Страница 1 из 1 |
Автор: | adimetrius [ Вторник, 17 Декабрь, 2019 15:30 ] | ||
Заголовок сообщения: | Поправка SetNativeProp | ||
Коллеги, предлагаю поправку в TextControllers.StdCtrl.SetNativeProp. Поправка позволяет применять атрибуты текста к слову (а не только к выделению). Т.о. нажатие ^B делает текущее слово полужирным. Прежняя функциональность сохраняется: если есть выделение, то атрибуты применяются к нему. Код: PROCEDURE (c: StdCtrl) SetNativeProp (selection: BOOLEAN; old, p: Properties.Property); VAR t: TextModels.Model; beg, end: INTEGER; (*▶*)toWord: BOOLEAN;(*◀*) BEGIN t := c.text; IF selection THEN beg := c.selBeg; end := c.selEnd; (*▶*)IF beg = none THEN toWord := TRUE; c.view.ThisSetter().GetWord(c.carPos, beg, end); ASSERT(end <= t.Length()) ELSE toWord := FALSE END(*◀*) ELSE beg := 0; end := t.Length() END; IF beg < end THEN t.Modify(beg, end, old, p); IF selection (*▶*)& ~toWord(*◀*) THEN c.SetSelection(beg, end) END ELSIF selection THEN c.insAttr := TextModels.ModifiedAttr(InsertionAttr(c), p) END END SetNativeProp; Эта поправка выявила небольшой дефект в TextSetters: Код: PROCEDURE (s: StdSetter) GetWord (pos: INTEGER; OUT beg, end: INTEGER); ЕСЛИ (pos = s.text.Length()) & (s.text[последний символ] = 0DX) ТО GetWord возвращает end = s.text.Length() + 1. Т.е. если в конце текста пустая строка, то GetWord возвращает конец слова ЗА концом текста. Поэтому я, не разбираясь в тонкостях организации StdSetter, предлагаю поправку-заплатку в GetWord: Код: UNTIL ~part OR (s.rd.string[0] = 0X) OR (end - beg > wordCutoff); (*▶*)end := MIN(end, s.text.Length()); ASSERT((0 <= beg) & (beg <= end) & (end <= s.text.Length()), 60)(*◀*) END GetWord; Можно еще в документации GetWord явно указать Код: Post end <= s.text.Length() Но можно и не указывать - это вроде как само собой подразумевается и вытекает из логики работы с текстами: слово не може выходить за границы текста. В приложении - поправки и модуль, позволяющий выявить указанный дефект, а после внесения поправки - не выявить дефекта.
|
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |