Skip to content

Kirill71/TextEditorCore

Repository files navigation

Разработайте класс TextEditorCore, представляющий собой ядро простейшего plain-text редактора. В обязанности ядра такого редактора входит: хранение введенных строк текста; сохранение и загрузка текста при помощи потоков; хранение информации о текущем положении курсора; хранение информации о текущем выделении текста; реакция на пользовательский ввод или удаление текста.

Предполагается, что в полноценной системе, логика работы редактора, реализуемая ядром, полностью изолируется от особенностей визуализации состояния текста для пользователя и от способов ввода текста. Ядро редактора создается для каждого редактируемого документа отдельно. В полноценной системе может использоваться одновременно несколько окон редактирования для различных файлов, в том числе, работающих в различных потоках, соответственно, ядро должно избегать использования каких-либо статических или глобальных данных, кроме констант.

Объявление класса следует разместить в файле texteditorcore.hpp, а реализацию - в файле texteditorcore.cpp. При необходимости, можно вводить любые вспомогательные классы, если это каким-либо образом упрощает выполнение программистом задачи.

Реализация предполагает интенсивное использование всех доступных средств STL - контейнеров, алгоритмов, итераторов, и любых других, необходимых для реализации задачи.

Должны поддерживаться следующие операции:

  • Конструирование:
    • Конструктор по умолчанию (новый пустой документ).
    • Конструктор из указанного входного потока (считать ранее сохраненный документ).
    • Копирование и присвоение таких объектов должно быть запрещено.
    • Деструктор (если он необходим).
  • Работа с курсором:
    • Метод для определения текущего положения курсора (номер строки, номер столбца)
    • Методы для перемещения на 1 позицию в любом из 4 возможных направлений.
    • Метод для перемещения курсора в произвольную точку (клик мышкой) - точка должна существовать. Примечание: курсор должен автоматически перемещаться при наборе текста.
  • Редактирование конкретной строки:
    • Методы для вставки и удаления одиночного символа. Особый случай - вставка или удаление элемента, соответствующего символу новой строки.
    • Метод для вставки фрагмента текста за одно действие (например, пользовательский интерфейс может вставить скопированный из буфера обмена фрагмент текста).
    • Метод для удаления выделенного фрагмента текста. Примечание: строки должны грамотно вставляться либо удаляться в зависимости от ситуации.
    • Методы для перехода на начало/конец строки/документа (понадобится для реакции на клавиши Home/End и Ctrl+Home/End).
    • Метод для сохранения содержимого текста в указанный выходной поток.
  • Работа с выделением текста:
    • Метод начала выделения переключает редактор в особый режим, запоминая место начала выделения.В методах, реагирующих на перемещение курсора, в режиме выделения должно также учитываться изменение границ выделения.
    • Метод завершения выделения переключает редактор в обычный режим. Однако выделение может быть восстановлено и продолжено, если курсор не перемещался.
    • Метод сброса выделения.
    • Метод, возвращающий текущий выделенный текст. Примечание: можно ограничиться горизонтальным выделением текста.
  • Методы для поиска и замены:
    • Метод, реализующий первый поиск в файле по фрагменту (Find).
    • Метод, продолжающий поиск по фрагменту с предыдущей найденной позиции (Find Next).
    • Метод, осуществляющий замену первого встречаемого образца текста на другой. (Replace)
    • Метод, осуществляющий замену всех встречаемых образцов текста на другой.(Replace All)

Если какие-либо действия приводят к ошибкам, должны генерироваться исключения std::logic_error с произвольным текстом. Рекомендуется вынести тексты сообщений в отдельный файл messages.hpp, как в заготовках базовых вариантов, и использовать их как при генерации исключений, так и в тестах для сравнения фактических текстов с ожидаемыми образцами.

Следует самостоятельно написать тестовую программу.

About

Simple prototype of text editor core.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages