Введение
Часто, навигация по документам в приложениях для заметок сделана в виде ссылок (Link), которые пользователь создает вручную в каждом документе. А что если сделать навигацию по ключевым словам, без применения уникальных ссылок в документе?
Задача, что я себе поставил при совершенствовании функционала программы FAQ.Net, состояла в создании удобного механизма навигации по RTF-документам в приложении FAQ.Net.
В итоге, FAQ.Net версии 2.7 обзавелась функцией всплывающих подсказок (ToolTip) при помощи пользовательского добавления ключевых слов и их определения.
В чем их достоинства и польза в программе заметок и как ими пользоваться я кратко расскажу в рамках этой статьи.
Способы создания навигации в RTF-документах, используя стандартный компонент RichTextBox
- Использование закладок (bookmarks).
В стандарте RTF, есть встроенный механизм закладок, но стандартный компонент RichTextBox не поддерживает работу элементов bkmkstart и bkmkend. - Отключить свойство DetectUrls и создавать свои ссылки.
Этот способ описан в статье Links with arbitrary text in a RichTextBox. В этом случае необходимо дописывать код по определению URL-адресов и восстановлению всех ссылок при открытии RTF-документа. Посчитал, что это трудозатратно и немного снизит скорость работы приложения. - Всплывающие подсказки.
После двух, описанных выше, способов прочитал статью о всплывающих подсказках в компоненте RichTextBox [WinForms] RichTextBox ToolTip like Visual-Studio's. Этот вариант был взят за основу.
Всплывающие подсказки. Список задач
В идее со всплывающими подсказками я увидел потенциал для нужного результата и стал ее реализовывать. Все, что нужно было — это расширить компонент всплывающих подсказок и добавить в него ссылки с переходами. Готового решения в просторах необъятного интернета не лежало, поэтому разрабатывал код своими руками.
Список задач, которые нужно выполнить:
- организовать хранение ключевых слов (подсказок) со ссылками
- реализовать функцию определения слова при наведении на него курсора
- создать интерфейс для создания и редактирования «словаря подсказок» (описание см.ниже)
- создать возможность быстрого создания ключевых слов в RTF-документе, используя «словарь подсказок»
- функционал всплывающих подсказок должен быть расширяемым
Подробности по пунктам
- Ключевые слова хранятся внутри БД 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) )
- функция определения слова при наведении на него курсора выполнена с помощью стандартных функций компонента RichTextBox: GetPositionFromCharIndex и GetCharIndexFromPosition.
Символы по которым определяется начало или конец слова:
',',';',':','!','?','%','+','=','*','$','\'','\"','<','>','^','(',')','[',']','{','}','°','&','|',' ','\n','"','\t'
- «словарь подсказок» — так я назвал панель, в которой отображаются и редактируются все слова, созданные пользователем, на которые нужно отображать подсказки при наведении курсора внутри RTF-документа. Панель «Словарь подсказок» состоит из:
— кнопок управления: создать, редактировать, копировать и удалить.
— панели поиска
— панели слов в виде дерева (TreeView)
— панели редактирования
- Создание слов в «словаре подсказок» выполняется по нажатию клавиш Ctrl+Space. Если установить курсор на середину слова, то при вызове Ctrl+Space будет автоматически выставлен фильтр слов в словаре подсказок по началу слова до курсора, а при выборе слова (клавишей Enter или двойным щелчком мыши) все слово заменяется на выбранное. По мере нажатия букв на клавиатуре, пользователю отображается слово-фильтр вверху компонента выбора слова. Для удобства работы со словарем при наведении мыши на слово внутри отфильтрованного списка отображается подсказка.
- расширение функционала всплывающих подсказок заложено в поле tooltip_type INTEGER NOT NULL. Типы всплывающих подсказок:
- со ссылкой на заметку (внутренний RTF-документ). Указывается только ID заметки (вопроса). При наведении на слово, в качестве подсказки отображается наименование заметки.
- со ссылкой на интернет-ресурс. Указывается URL-адрес и текст подсказки.
- статическая подсказка. Указывается только текст подсказки.
Достоинства
- хранение и изменение ключевых слов со ссылками в структурированном виде (таблице)
- навигация по RTF-документам, без изменения самих документов
- возможность автодополнения слов (IntelliSense) из словаря, определенного самим пользователем
- быстрое создание и изменение ссылок во всех документах, где есть ключевое слово
Недостатки
- Проблема с RTF-таблицами. К сожалению, у стандартного компонента RichTextBox есть недостаток с отображаением таблиц. Чтобы устранить этот недостаток используется библиотека Msftedit.dll, которая вносит баги в функции GetPositionFromCharIndex и GetCharIndexFromPosition. С этой проблемой пока не знаю как бороться, но надеюсь, что решение будет найдено. В связи с этим, в версии FAQ.Net 2.7 не рекомендую использовать всплывающие подсказки внутри и после RTF-таблиц.
- Не учитывается морфология слов, т.е. каждое слово нужно дублировать новой подсказкой.
Что дальше улучшится в приложении FAQ.Net?
- Добавится функция импорта/экспорта словаря подсказок
- Появится возможность добавления тегов к заметкам. Кроме этого, добавится возможность ввести свой словарь подсказок на теги.
Например: создать тег C#, создать ключевые слова нужного цвета. После этого создать функцию подсветки синтаксиса выделенного фрагмента. Это позволит пользователю вводить свои слова и определять свою подсветку слов.
Вывод
В целом, мне функционал очень нравится. Считаю, что цель по навигации среди RTF-документов внутри приложения FAQ.Net достигнута.
В личном пользовании я держу всплывающие подсказки как переводчик, что помогает мне в изучении и запоминании новых иностранных слов.
В словаре можно легко хранить и отображать подсказки для аббревиатур.
В словаре удобно хранить ссылки на статьи из интернета и сопровождать кратким комментарием.
Прилагаемые ссылки к статье
Видео презентация всплывающих подсказок в FAQ.Net
Подробное описание приложения FAQ.Net
Группа ВКонтакте
Скачать Windows приложение FAQ.Net (бесплатно):
(x64) yadi.sk/d/sq3g4NOD3Zt7ZY
(x86) yadi.sk/d/NKXeyUWH3Zt8PQ
Diaskhan
Если честно интерфейс немного убог.
1.Что насчёт рибона?
2.segoui ?
4.лучше все таки перейти на md. Так как потом проще будет заливать на гит буукс или гитхаб.
shmelev-1987 Автор
Планов на развитие приложения очень много, в том числе улучшить дизайн.
Согласен, что синхронизации данных не хватает. Сделать через md, неплохо. Есть какие-то готовые библиотеки по работе с md в WinForms?
Темы добавлю, это недолго.
Сейчас провожу опрос в группе VK на тему "Какой функционал в приложении для заметок FAQ Net хочу больше всего?", все желающие могут принять участие.