Кто может написать контрол - крутой хинт?
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.08.09 18:59
Оценка:
Есть задачка...

Для более красивого отображения хинтов в VS-интеграции нужен контрол который бы позволял бы вывести хинт с подсветкой участков текста и активными участками текста.

Это должно быть что-то вроде HTML-я (но сильно упрощенного) в котором можно было бы декоративно задать:
1. Штифтовое оформление (цвет, жарность, италик).
2. Задать подхинты (т.е. некоторые области текста, например, те что описывают типы) должны при наведении так же отображать хинты.
3. Задать активные области. При нажатии на такую область должно вызваться событие на которое, например, можно перейти к описанию метода.
4. Хитн должен вести себя похоже на другие хинты: масштабировать размеры под экран и точку в которой отображается хинт; скрываться если курсор ушел из области текста для которой хинт задан и т.п.

Нужно это для того, чтобы сделать хинты в редакторе более понятными и удобными.

Мне кажется, что лучше всего было бы реализовать это дело на базе WPF, так как броузер для таких задач может оказаться громоздким и тормозным. Хотя... надо пробовать.

Может кто-нибудь возьмется за эту задачу?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Кто может написать контрол - крутой хинт?
От: jenyavb  
Дата: 18.08.09 20:02
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Мне кажется, что лучше всего было бы реализовать это дело на базе WPF, так как броузер для таких задач может оказаться громоздким и тормозным. Хотя... надо пробовать.


На WPF можно реализовать довольно просто. Там даже есть базовый примитив Popup. Вывод содержимого — можно сделать через документы или обычные контроллы.
Связываться с браузером не советую — корявый он жутко...
Re[2]: Кто может написать контрол - крутой хинт?
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.08.09 20:51
Оценка:
Здравствуйте, jenyavb, Вы писали:

J>На WPF можно реализовать довольно просто. Там даже есть базовый примитив Popup. Вывод содержимого — можно сделать через документы или обычные контроллы.

J>Связываться с браузером не советую — корявый он жутко...

Мне хотелось бы не тратить времени на это "просто". Я с WPF не знаком и времени у меня очень мало. Задача интересная и не сложная, так что возможно найдутся те кто ею захотят заняться.

Мне же нужен метод в который я задам размеченый текст и координаты области в которой нужно отобразить хинт, а чтобы все остальное делал этот контрол.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Кто может написать контрол - крутой хинт?
От: jenyavb  
Дата: 19.08.09 09:03
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Мне хотелось бы не тратить времени на это "просто". Я с WPF не знаком и времени у меня очень мало. Задача интересная и не сложная, так что возможно найдутся те кто ею захотят заняться.


Ну, я бы мог попробовать...

VD>Мне же нужен метод в который я задам размеченый текст и координаты области в которой нужно отобразить хинт, а чтобы все остальное делал этот контрол.


"что-то вроде HTML-я (но сильно упрощенного)" — не думаю, что это хороший способ задания текста, нужен будет парсер этого синтаксиса, да и генерировать текст из кода будет сложнее. Проще создавать какое-либо дерево с форматированным текстом.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Re[4]: Кто может написать контрол - крутой хинт?
От: Denom Украина  
Дата: 19.08.09 15:10
Оценка:
Здравствуйте, jenyavb, Вы писали:

J>"что-то вроде HTML-я (но сильно упрощенного)" — не думаю, что это хороший способ задания текста, нужен будет парсер этого синтаксиса, да и генерировать текст из кода будет сложнее. Проще создавать какое-либо дерево с форматированным текстом.


Если знаешь паскаль в jvcl есть конторол ThtLabel кажись там используеться разметка как Влад описал.
Я тоже попробую сделать, взяв за основу реализацию из jvcl.
... << RSDN@Home 1.2.0 alpha 4 rev. 1181>>
Re[4]: Кто может написать контрол - крутой хинт?
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.08.09 15:58
Оценка:
Здравствуйте, jenyavb, Вы писали:

J>Ну, я бы мог попробовать...


Давай.

J>"что-то вроде HTML-я (но сильно упрощенного)" — не думаю, что это хороший способ задания текста, нужен будет парсер этого синтаксиса, да и генерировать текст из кода будет сложнее. Проще создавать какое-либо дерево с форматированным текстом.


Самое важно — это удобство использования контрола другими. Так что тут упрощать не надо. Можно взять самый примитивный синтаксис, но он должен быть. За основу можно взять ХМЛ. Тогда разбирать ничего не прийдется. Достаточно будет скормить его тому же XElement из linq2xml и получить ту самую объектную модель. Желательно, чтобы формат выглядело примерно так:
<code>
<keyword>internal</keyword> <ref handler='GoToDef'>RunErrorOccured</ref>(
  loc : <ref handler='GoToTypeDef1' hint='Nemerle.Compiler.Location'>Location</ref>,
  msg : <hint text='System.String'>string</hint>) : <keyword>void</keyword>

Описание метода <bold>RunErrorOccured</bold>.
</code>
Где:
<code> — определяет, что данная часть хинта должна выводиться моноширинным шрифтом (например, Courier).
<ref> — предопределенный тег который приводит к отображению ссылки с всплывающей подсказкой.
<hint> — предопределенный тег который приводит к отображению всплывающей подсказкой.
<keyword> — стиль который можно заранее настроить (добавить). В нем нужно иметь возможность задавать bold, italic и цвет. В данном случае синий цвет.
<bold> — стиль который можно заранее настроить. В данном случае он должен делать выделенный им текст жирным.
В результате на экране должен появиться примерно следующий текст:

internal RunErrorOccured(
  loc : Location,
  msg : string) : void

Описание метода RunErrorOccured.


Где Location является ссылкой отображающей хинт, RunErrorOccured ссылкой без хинта, а для string отображается только хинт.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Кто может написать контрол - крутой хинт?
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.08.09 16:16
Оценка:
Здравствуйте, Denom, Вы писали:

D>Если знаешь паскаль в jvcl есть конторол ThtLabel кажись там используеться разметка как Влад описал.

D>Я тоже попробую сделать, взяв за основу реализацию из jvcl.

Думаю, что написать такой хинт с использованием WPF будет намного проще и при этом результата будет иметь более привлекательный вид.
Еще проще (наверно) сделать это дело на базе WebBrouserControl. При этом вообще можно обойтись трасформацией ХМЛ-я в ХТМЛ. Но при этом не уверен, что будет хороший отклик. Все же форматирование ХТМЛ-я занимает время, а хинт нужно показать максимально быстро после появления информации. В прочем, возможно это и не критично.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Кто может написать контрол - крутой хинт?
От: jenyavb  
Дата: 19.08.09 16:42
Оценка:
Здравствуйте, VladD2, Вы писали:

J>>Ну, я бы мог попробовать...

VD>Давай.

А на каком языке? Гуй вы вроде на шарпе пишете?
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Re[6]: Кто может написать контрол - крутой хинт?
От: jenyavb  
Дата: 19.08.09 16:46
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Думаю, что написать такой хинт с использованием WPF будет намного проще и при этом результата будет иметь более привлекательный вид.

VD>Еще проще (наверно) сделать это дело на базе WebBrouserControl. При этом вообще можно обойтись трасформацией ХМЛ-я в ХТМЛ. Но при этом не уверен, что будет хороший отклик. Все же форматирование ХТМЛ-я занимает время, а хинт нужно показать максимально быстро после появления информации. В прочем, возможно это и не критично.

Браузер — вешь убогая. Я даже сомневаюсь что там удастся прехватить наведение/клик на активные области...
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Re[6]: Кто может написать контрол - крутой хинт?
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.08.09 18:14
Оценка:
Здравствуйте, jenyavb, Вы писали:

J>А на каком языке? Гуй вы вроде на шарпе пишете?


На шарпе или немерле. Главное, чтобы никаких лишних зависимостей не было.
Если делать на WPF, то конечно шарп предпочтительнее, так как для него есть WPF-дизайнеры.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: Кто может написать контрол - крутой хинт?
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.08.09 18:17
Оценка:
Здравствуйте, jenyavb, Вы писали:

J>Браузер — вешь убогая. Я даже сомневаюсь что там удастся прехватить наведение/клик на активные области...


Ошибаешься. Перехватить там можно все что угодно. Только скорее всего прийдется связываться со скриптами, что усложнит задачу.

Я бы предпочел WPF-решение, как самое расширяемое. К тому же следующая студия будет на 90% на WPF написана. Так что как раз в тему.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Кто может написать контрол - крутой хинт?
От: gloomy rocker Россия  
Дата: 20.08.09 12:40
Оценка:
Здравствуйте, jenyavb, Вы писали:

J>"что-то вроде HTML-я (но сильно упрощенного)" — не думаю, что это хороший способ задания текста, нужен будет парсер этого синтаксиса, да и генерировать текст из кода будет сложнее. Проще создавать какое-либо дерево с форматированным текстом.


А может передавать в этот хинт XAML-разметку? Это почти как HTML только для WPF-движка. Кодбихайнд там скорее всего не нужен будет, а создать UIElement из XAML — очень просто.
Скука — двигатель прогресса.
Re[5]: Кто может написать контрол - крутой хинт?
От: jenyavb  
Дата: 20.08.09 12:48
Оценка: +1
Здравствуйте, gloomy rocker, Вы писали:

GR>Здравствуйте, jenyavb, Вы писали:


J>>"что-то вроде HTML-я (но сильно упрощенного)" — не думаю, что это хороший способ задания текста, нужен будет парсер этого синтаксиса, да и генерировать текст из кода будет сложнее. Проще создавать какое-либо дерево с форматированным текстом.


GR>А может передавать в этот хинт XAML-разметку? Это почти как HTML только для WPF-движка. Кодбихайнд там скорее всего не нужен будет, а создать UIElement из XAML — очень просто.


XAML — это ИМХО больше чем нужно... Тогда можно будет любую разметку туда загнать... А нужно наоборот ограничить.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Re[5]: Кто может написать контрол - крутой хинт?
От: jenyavb  
Дата: 20.08.09 13:52
Оценка:
Здравствуйте, VladD2, Вы писали:

J>>"что-то вроде HTML-я (но сильно упрощенного)" — не думаю, что это хороший способ задания текста, нужен будет парсер этого синтаксиса, да и генерировать текст из кода будет сложнее. Проще создавать какое-либо дерево с форматированным текстом.


VD>Самое важно — это удобство использования контрола другими. Так что тут упрощать не надо. Можно взять самый примитивный синтаксис, но он должен быть. За основу можно взять ХМЛ. Тогда разбирать ничего не прийдется. Достаточно будет скормить его тому же XElement из linq2xml и получить ту самую объектную модель.


Не так все просто с XML. Нужно как-то проверять корректность, этого XLM. Нужно вводить тег "абзац", потому как в XLM переносы строки не учитываются, да и через линк их не получишь. Необходим так-же элемент-корень. Так-что ИМХО нафиг такие сложности... Да и идеологии WPF это не соответствует.

Еще проблема есть в автоматическом скрытии хинта. Для этого нужно иметь элемент-родитель, которому принадлежит хинт, которого в случае со студией нет. А без родителя позицию курсора в WPF вроде как и не получишь.

Ещё нужно подумать, удобен ли будет этот хинт пользователю. Ведь если уводить курсор вниз, в область хинта, хинт исчезать не будет, как это обычно происходит.
Re[6]: Кто может написать контрол - крутой хинт?
От: VladD2 Российская Империя www.nemerle.org
Дата: 20.08.09 15:50
Оценка:
Здравствуйте, jenyavb, Вы писали:

J>Не так все просто с XML. Нужно как-то проверять корректность, этого XLM.


Дык его то как раз проверить элементарно. На то есть и схемы и API. Читаешь себе теги... понял, что за тег — ОК, не понял — исключение.

J>Нужно вводить тег "абзац", потому как в XLM переносы строки не учитываются, да и через линк их не получишь.


Естественно. Но в этом нет никаких проблем. Сделать аналог тега P в ХТМЛ-е не проблема.

J>Необходим так-же элемент-корень.


Это что, проблема? Кореть можно или добавлять по ходу дела, или требовать изначально.

J>Так-что ИМХО нафиг такие сложности... Да и идеологии WPF это не соответствует.


WPF не соответствует? В WPF как раз основной формат преставления именно ХМЛ.

J>Еще проблема есть в автоматическом скрытии хинта.


Это не проблема, а часть функционала который нужно реализовать.

Как раз родитель не нужен. Ну, или надо брать родителя как у всплывающего окна комбобокса. Иначе будет много проблем.
Хинту фокус вообще не нужен.

Скрывать же его очень просто. Надо при открытии хинта запускать таймер и на каждое срабатывание хинта проверять где курсор мыши. Если он в области переданной при открытии хинта или внутри хинта, то ничего не делать, иначе закрывать хинт. Плюс хинт нужно закрывать при нажатии любой клавиши или при переключении фокуса. Вот с этим нужно немного повозиться. Там возможно прийдется сабкласить окна. Это не сложно, но надо иметь некоторый опыт.

J> Для этого нужно иметь элемент-родитель, которому принадлежит хинт, которого в случае со студией нет. А без родителя позицию курсора в WPF вроде как и не получишь.


Это не родитель, а владелец. Окно к которому принадлежит хинт есть. Это окно редактора.

J>Ещё нужно подумать, удобен ли будет этот хинт пользователю. Ведь если уводить курсор вниз, в область хинта, хинт исчезать не будет, как это обычно происходит.


Ну, дык если бы всего этого не надо было, то я бы и сам за 10 минут на коленке все слабал. Птому я и предложил кому-то взяться за эту задачу. Задача не сложная и полностью автономная. Все проблемы которые возникнут можно решить здесь или в дотнетном форуме. А опыт очень даже полезный. Да и контрол полезен многим будет.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Кто может написать контрол - крутой хинт?
От: VladD2 Российская Империя www.nemerle.org
Дата: 20.08.09 19:36
Оценка:
Здравствуйте, gloomy rocker, Вы писали:

GR>А может передавать в этот хинт XAML-разметку? Это почти как HTML только для WPF-движка.


Вопрос только насколько быстро? Не будет тормозить при этом вывод хинта?

GR>Кодбихайнд там скорее всего не нужен будет, а создать UIElement из XAML — очень просто.


Нам нужна реакция на события (переход по ссылке). Но ее лучше делать во внешнем коде.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Кто может написать контрол - крутой хинт?
От: dotneter  
Дата: 21.08.09 06:40
Оценка:
FlowDocument?
Talk is cheap. Show me the code.
Re[7]: Кто может написать контрол - крутой хинт?
От: jenyavb  
Дата: 21.08.09 09:41
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>WPF не соответствует? В WPF как раз основной формат преставления именно ХМЛ.


XAML — всего-лишь язык разметки. Формат представления — дерево UI. Идея в том, что контрол выполняет лишь определенную функцию, а его представление можно менять как угодно и в него загонять любой возможный контент. Но это можно решить, вынеся xml-разметку в статический хелпер.

J>>Еще проблема есть в автоматическом скрытии хинта.

VD>Это не проблема, а часть функционала который нужно реализовать.

Одно другому не мешает .

VD>Как раз родитель не нужен. Ну, или надо брать родителя как у всплывающего окна комбобокса. Иначе будет много проблем.


Не понял, это ты про Win32? Я на WPF вроде делаю...

VD>Хинту фокус вообще не нужен.


Ясень пень. В WPF есть примитив Popup, который такую функциональность дает.

VD>Скрывать же его очень просто. Надо при открытии хинта запускать таймер и на каждое срабатывание хинта проверять где курсор мыши. Если он в области переданной при открытии хинта или внутри хинта, то ничего не делать, иначе закрывать хинт. Плюс хинт нужно закрывать при нажатии любой клавиши или при переключении фокуса. Вот с этим нужно немного повозиться. Там возможно прийдется сабкласить окна. Это не сложно, но надо иметь некоторый опыт.


Опять ты про Win32? В WPF я не знаю, как получить абсолютное положение курсора на экране, может кто подскажет?

J>> Для этого нужно иметь элемент-родитель, которому принадлежит хинт, которого в случае со студией нет. А без родителя позицию курсора в WPF вроде как и не получишь.

VD>Это не родитель, а владелец. Окно к которому принадлежит хинт есть. Это окно редактора.

Нужно, чтобы это был WFP'шный UIElement.
Re[8]: Кто может написать контрол - крутой хинт?
От: jenyavb  
Дата: 21.08.09 14:21
Оценка:
Здравствуйте, jenyavb, Вы писали:

J>Но это можно решить, вынеся xml-разметку в статический хелпер.


Хотя нет, так не получится — потому что при клике на линках нужно дергать событие. Так что не буду парится .
Re[8]: Кто может написать контрол - крутой хинт?
От: VladD2 Российская Империя www.nemerle.org
Дата: 21.08.09 16:38
Оценка:
Здравствуйте, jenyavb, Вы писали:

J>XAML — всего-лишь язык разметки. Формат представления — дерево UI. Идея в том, что контрол выполняет лишь определенную функцию, а его представление можно менять как угодно и в него загонять любой возможный контент. Но это можно решить, вынеся xml-разметку в статический хелпер.


Не понимаю в чем сложност. Задача фактически вылевается в трансформацию хмл.

J>Не понял, это ты про Win32? Я на WPF вроде делаю...


WPF не в вакууме живет. В итоге он будет хоститься в некотором окне Windows.

J>Опять ты про Win32? В WPF я не знаю, как получить абсолютное положение курсора на экране, может кто подскажет?


Этот вопрос лучше задать в форуме .Net GUI.
Но я уверен, что можно просто пользоваться API WinForms, который является надстройкой над Win API.

J>Нужно, чтобы это был WFP'шный UIElement.


Вовсе нет! Нам нужно окно-владелец для окна в котором бубет хоститься WPF-контрол.
Так что это могут быть обычные окна Windows.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.