Введение


Часто, навигация по документам в приложениях для заметок сделана в виде ссылок (Link), которые пользователь создает вручную в каждом документе. А что если сделать навигацию по ключевым словам, без применения уникальных ссылок в документе?

Задача, что я себе поставил при совершенствовании функционала программы FAQ.Net, состояла в создании удобного механизма навигации по RTF-документам в приложении FAQ.Net.

В итоге, FAQ.Net версии 2.7 обзавелась функцией всплывающих подсказок (ToolTip) при помощи пользовательского добавления ключевых слов и их определения.

В чем их достоинства и польза в программе заметок и как ими пользоваться я кратко расскажу в рамках этой статьи.



Способы создания навигации в RTF-документах, используя стандартный компонент RichTextBox


  1. Использование закладок (bookmarks).
    В стандарте RTF, есть встроенный механизм закладок, но стандартный компонент RichTextBox не поддерживает работу элементов bkmkstart и bkmkend.
  2. Отключить свойство DetectUrls и создавать свои ссылки.
    Этот способ описан в статье Links with arbitrary text in a RichTextBox. В этом случае необходимо дописывать код по определению URL-адресов и восстановлению всех ссылок при открытии RTF-документа. Посчитал, что это трудозатратно и немного снизит скорость работы приложения.
  3. Всплывающие подсказки.
    После двух, описанных выше, способов прочитал статью о всплывающих подсказках в компоненте RichTextBox [WinForms] RichTextBox ToolTip like Visual-Studio's. Этот вариант был взят за основу.

Всплывающие подсказки. Список задач


В идее со всплывающими подсказками я увидел потенциал для нужного результата и стал ее реализовывать. Все, что нужно было — это расширить компонент всплывающих подсказок и добавить в него ссылки с переходами. Готового решения в просторах необъятного интернета не лежало, поэтому разрабатывал код своими руками.

Список задач, которые нужно выполнить:

  1. организовать хранение ключевых слов (подсказок) со ссылками
  2. реализовать функцию определения слова при наведении на него курсора
  3. создать интерфейс для создания и редактирования «словаря подсказок» (описание см.ниже)
  4. создать возможность быстрого создания ключевых слов в RTF-документе, используя «словарь подсказок»
  5. функционал всплывающих подсказок должен быть расширяемым

Подробности по пунктам


  1. Ключевые слова хранятся внутри БД SQLite. Скрипт создания таблицы:

    CREATE TABLE word_tooltip (
      id_content INTEGER NOT NULL,   /* Если id_content=0, то это общая всплывающая подсказка */
      word VARCHAR NOT NULL,         /* Слово, на которое выводится подсказка */
      tooltip_type INTEGER NOT NULL, /* Тип всплывающей подсказки: 0 - со ссылкой на внутренний документ, 1 - со ссылкой на интернет-ресурс, 2 - статическая подсказка */
      comment VARCHAR NOT NULL,      /* Текст подсказки */
      url_adr VARCHAR NULL,          /* URL-адрес */
      group_name VARCHAR NULL,       /* Имя группы в котором хранится слово */
      fore_color VARCHAR NULL,       /* Цвет шрифта */
      create_date DATETIME DEFAULT (CURRENT_TIMESTAMP),
      modif_date DATETIME,
      PRIMARY KEY (id_content, word)
      )
  2. функция определения слова при наведении на него курсора выполнена с помощью стандартных функций компонента RichTextBox: GetPositionFromCharIndex и GetCharIndexFromPosition.

    Символы по которым определяется начало или конец слова:

    ',',';',':','!','?','%','+','=','*','$','\'','\"','<','>','^','(',')','[',']','{','}','°','&','|',' ','\n','"','\t'
  3. «словарь подсказок» — так я назвал панель, в которой отображаются и редактируются все слова, созданные пользователем, на которые нужно отображать подсказки при наведении курсора внутри RTF-документа. Панель «Словарь подсказок» состоит из:
    — кнопок управления: создать, редактировать, копировать и удалить.
    — панели поиска
    — панели слов в виде дерева (TreeView)
    — панели редактирования
  4. Создание слов в «словаре подсказок» выполняется по нажатию клавиш Ctrl+Space. Если установить курсор на середину слова, то при вызове Ctrl+Space будет автоматически выставлен фильтр слов в словаре подсказок по началу слова до курсора, а при выборе слова (клавишей Enter или двойным щелчком мыши) все слово заменяется на выбранное. По мере нажатия букв на клавиатуре, пользователю отображается слово-фильтр вверху компонента выбора слова. Для удобства работы со словарем при наведении мыши на слово внутри отфильтрованного списка отображается подсказка.






  5. расширение функционала всплывающих подсказок заложено в поле tooltip_type INTEGER NOT NULL. Типы всплывающих подсказок:

    • со ссылкой на заметку (внутренний RTF-документ). Указывается только ID заметки (вопроса). При наведении на слово, в качестве подсказки отображается наименование заметки.
    • со ссылкой на интернет-ресурс. Указывается URL-адрес и текст подсказки.
    • статическая подсказка. Указывается только текст подсказки.


Достоинства


  1. хранение и изменение ключевых слов со ссылками в структурированном виде (таблице)
  2. навигация по RTF-документам, без изменения самих документов
  3. возможность автодополнения слов (IntelliSense) из словаря, определенного самим пользователем
  4. быстрое создание и изменение ссылок во всех документах, где есть ключевое слово

Недостатки


  1. Проблема с RTF-таблицами. К сожалению, у стандартного компонента RichTextBox есть недостаток с отображаением таблиц. Чтобы устранить этот недостаток используется библиотека Msftedit.dll, которая вносит баги в функции GetPositionFromCharIndex и GetCharIndexFromPosition. С этой проблемой пока не знаю как бороться, но надеюсь, что решение будет найдено. В связи с этим, в версии FAQ.Net 2.7 не рекомендую использовать всплывающие подсказки внутри и после RTF-таблиц.
  2. Не учитывается морфология слов, т.е. каждое слово нужно дублировать новой подсказкой.

Что дальше улучшится в приложении FAQ.Net?


  1. Добавится функция импорта/экспорта словаря подсказок
  2. Появится возможность добавления тегов к заметкам. Кроме этого, добавится возможность ввести свой словарь подсказок на теги.
    Например: создать тег C#, создать ключевые слова нужного цвета. После этого создать функцию подсветки синтаксиса выделенного фрагмента. Это позволит пользователю вводить свои слова и определять свою подсветку слов.

Вывод


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

Прилагаемые ссылки к статье


Видео презентация всплывающих подсказок в FAQ.Net
Подробное описание приложения FAQ.Net
Группа ВКонтакте

Скачать Windows приложение FAQ.Net (бесплатно):
(x64) yadi.sk/d/sq3g4NOD3Zt7ZY
(x86) yadi.sk/d/NKXeyUWH3Zt8PQ

Комментарии (2)


  1. Diaskhan
    13.12.2019 02:54

    Если честно интерфейс немного убог.
    1.Что насчёт рибона?
    2.segoui ?


    1. Интерфейс перегружен.
      4.лучше все таки перейти на md. Так как потом проще будет заливать на гит буукс или гитхаб.
    2. Сделайте тему как в последнем vs2109.


    1. shmelev-1987 Автор
      13.12.2019 09:07

      Планов на развитие приложения очень много, в том числе улучшить дизайн.
      Согласен, что синхронизации данных не хватает. Сделать через md, неплохо. Есть какие-то готовые библиотеки по работе с md в WinForms?
      Темы добавлю, это недолго.
      Сейчас провожу опрос в группе VK на тему "Какой функционал в приложении для заметок FAQ Net хочу больше всего?", все желающие могут принять участие.