Re[5]: Кто может написать контрол - крутой хинт?
От: capgoat  
Дата: 11.10.09 19:24
Оценка: 138 (1)
Надеюсь все еще актуально
Тут новая версия.
Основные изменения коснулись парсера.
Доступные тэги:
1. <b>,<u>,<i> — стили
2. <pre> — сохранение форматирования
3. <lb/> — перенос строки
4. <code> — блок текста со шрифтом Courier New
4. <span hint=""> — блок текста с опциональным подхинтом
5. <keyword> — блок текста синего цвета
6. <ref hint="" handler=""> — ссылка

Также реализована фича с автолейаутом параметров методов.
Re[10]: Кто может написать контрол - крутой хинт?
От: capgoat  
Дата: 12.10.09 14:29
Оценка: 46 (1)
Здравствуйте, VladD2, Вы писали:

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


C>>Действительно, тестовый проект старый.

C>>Вот подправил.

VD>На первый взгляд очень хорошо!


VD>Что нужно сделать чтобы добавить отступы (мерджинг) по краям (чтобы текст не "прилипал" к краям)?

VD>И как изменить размер шрифта используемый по умолчанию, а так же в режиме code/pre? А то шрифт несколько размытый получается и мелковатый.

Отступ можно наглядно контроллировать свойством Padding в Border элементе xaml файла.
Добавил тэг <font size, face, color>. Нужные блоки соответственно оборачиваем этим тэгом.
Файл
Re[14]: Кто может написать контрол - крутой хинт?
От: Lloyd Россия  
Дата: 23.08.09 14:35
Оценка: 2 (1)
Здравствуйте, jenyavb, Вы писали:

J>Ещё раз повторяю:

J>
J><p>test1 <bold>test2</bold> test3</p>
J>

J>В таком коде подстроки "test1 " и " test3" не являются xml-элементами, поэтому через XElement.Elements() они не вытащатся, а просто пропустятся.

А если так:
XContainer.Nodes().OfType<XText>()
Re[2]: AdvancedHints Beta
От: yumi  
Дата: 25.08.09 02:04
Оценка: 2 (1)
Здравствуйте, jenyavb, Вы писали:

J>Багрепорты — только с Exception'ами и вылетами. Логика ещё не доделана, я и сам всё знаю.


При старте:

System.ComponentModel.Win32Exception was unhandled
Message="Невозможно установить нелокальный обработчик без дескриптора модуля"
Source="AdvancedHints"
ErrorCode=-2147467259
NativeErrorCode=1428
StackTrace:
at AdvancedHints.HookManager.EnsureSubscribedToGlobalMouseEvents() in D:\Projects\AdvancedHints\Hooks\HookManager.Callbacks.cs:line 211
at AdvancedHints.HookManager.add_MouseMove(MouseEventHandler value) in D:\Projects\AdvancedHints\Hooks\HookManager.cs:line 25
at AdvancedHints.AdvancedHint..ctor(Action`1 linkClickedNotifyer, Func`2 subHintGetter, IDictionary`2 styles) in D:\Projects\AdvancedHints\AdvancedHint.cs:line 44
at AdvancedHints.TestForm..ctor() in D:\Projects\AdvancedHints\TestForm.cs:line 17
at AdvancedHints.Program.Main() in D:\Projects\AdvancedHints\Program.cs:line 13
at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException:

Lisp is not dead. It’s just the URL that has changed:
http://clojure.org
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>>
Кто может написать контрол - крутой хинт?
От: 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 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.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Кто может написать контрол - крутой хинт?
От: gloomy rocker Россия  
Дата: 21.08.09 17:33
Оценка:
Здравствуйте, VladD2, Вы писали:

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

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

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

VD>Нам нужна реакция на события (переход по ссылке). Но ее лучше делать во внешнем коде.
В WPF вроде как можно декларативно делать привязку к командам, правда я сам этого не делал, т.к. пишу под SilverLight (урезанный WPF).
То есть реализовать команду можно в коде, а привязку к ней сделать в XAML. Только вот не думаю, что удобно будет эти привязки во входном XAML задавать.
Реально XAML — разметка графа объектов. Так вот можно определить свою иерархию объектов, которые описывают хинт, а конкретный хинт описывать не XML-ем, а XAML-ом, т.к. есть стандартный способ преобразовать XAML в реальный граф объектов. Сам XAML наверно можно будет генерить StringTemplate-ом.
Например если имеется XAML
<hint>
   <method name="method1" descr="descr1">
      <arg name="arg1" descr="adasd"/>
      <arg name="arg2" descr="dfgf"/>
      <arg name="arg3" descr="sdfsdf"/>
   </method>
</hint>


Можно будет легким движением руки превратить его в объект hint для method с коллекцией arg.

При этом подписку на события можно делать в реализации hint, method и arg
Скука — двигатель прогресса.
Re[9]: Кто может написать контрол - крутой хинт?
От: jenyavb  
Дата: 21.08.09 17:34
Оценка:
Здравствуйте, VladD2, Вы писали:

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


Только сейчас понял, что код вида
<p>test <bold>test</bold> test</p>

не корректен для XML и спроецировать его через LINQ2XLM не получится...
Видимо придется писать свой мини-парсер?

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

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

Думаю окно владелец в WPF не понадобится...

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

VD>Вовсе нет! Нам нужно окно-владелец для окна в котором бубет хоститься WPF-контрол.
VD>Так что это могут быть обычные окна Windows.

Это не контрол, а окно, так что хостить его не надо.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Re[6]: Кто может написать контрол - крутой хинт?
От: gloomy rocker Россия  
Дата: 21.08.09 17:35
Оценка:
Здравствуйте, jenyavb, Вы писали:

J>Здравствуйте, gloomy rocker, Вы писали:


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


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


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


J>XAML — это ИМХО больше чем нужно... Тогда можно будет любую разметку туда загнать... А нужно наоборот ограничить.

Согласен, но вариант с XML и HTML — это еще больше, чем нужно.
Скука — двигатель прогресса.
Re[7]: Кто может написать контрол - крутой хинт?
От: jenyavb  
Дата: 21.08.09 17:46
Оценка:
Здравствуйте, gloomy rocker, Вы писали:

J>>XAML — это ИМХО больше чем нужно... Тогда можно будет любую разметку туда загнать... А нужно наоборот ограничить.

GR>Согласен, но вариант с XML и HTML — это еще больше, чем нужно.

Если есть способ ограничить XAML лишь своими элементами, то можно и попробовать... Потому как с XML есть проблема
Автор: jenyavb
Дата: 21.08.09
. Так-же нужно подумать, как обрабатывать нажатия на ссылки.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Re[8]: Кто может написать контрол - крутой хинт?
От: gloomy rocker Россия  
Дата: 21.08.09 19:18
Оценка:
Здравствуйте, jenyavb, Вы писали:

J>Здравствуйте, gloomy rocker, Вы писали:


J>>>XAML — это ИМХО больше чем нужно... Тогда можно будет любую разметку туда загнать... А нужно наоборот ограничить.

GR>>Согласен, но вариант с XML и HTML — это еще больше, чем нужно.

J>Если есть способ ограничить XAML лишь своими элементами, то можно и попробовать... Потому как с XML есть проблема
Автор: jenyavb
Дата: 21.08.09
. Так-же нужно подумать, как обрабатывать нажатия на ссылки.


Если ограничения в рантайме будет достаточно, то этого вполне можно добиться, определив свою иерархию объектов. По сути XAML — это средство определения графа объектов, что собственно и нужно. А из каких объектов будет состоять этот граф — нам решать.
То есть если есть метод:
public static NemerleHint ParseXaml(string xaml)
{
   ...
}

То ошибка будет либо при загрузке XAML в случае, если будет передан кривой XAML, либо при приведении object к NemerleHint, если передан правильный XAML, но описывающий не NemerleHint.

Если же нужна проверка в компайлтайме, то XML/HTML/XAML — вообще тупиковый вариант.
Скука — двигатель прогресса.
Re[9]: Кто может написать контрол - крутой хинт?
От: jenyavb  
Дата: 21.08.09 20:18
Оценка:
Здравствуйте, gloomy rocker, Вы писали:

GR>Если ограничения в рантайме будет достаточно, то этого вполне можно добиться, определив свою иерархию объектов. По сути XAML — это средство определения графа объектов, что собственно и нужно. А из каких объектов будет состоять этот граф — нам решать.


Так, а как собственно парсить Xaml? То-есть какие классы/методы для этого использовать?

GR>Если же нужна проверка в компайлтайме, то XML/HTML/XAML — вообще тупиковый вариант.


Достаточно и в рантайме....
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Re[10]: Кто может написать контрол - крутой хинт?
От: VladD2 Российская Империя www.nemerle.org
Дата: 21.08.09 21:22
Оценка:
Здравствуйте, jenyavb, Вы писали:

J>Только сейчас понял, что код вида

J>
J><p>test <bold>test</bold> test</p>
J>

J>не корректен для XML и спроецировать его через LINQ2XLM не получится...
J>Видимо придется писать свой мини-парсер?

С чего ты это сзвзял? Это совершенно корректный XML.
Кстати, тег болд должен быть определяемый, а не фиксированный.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: Кто может написать контрол - крутой хинт?
От: gloomy rocker Россия  
Дата: 21.08.09 21:23
Оценка:
Здравствуйте, jenyavb, Вы писали:

J>Так, а как собственно парсить Xaml? То-есть какие классы/методы для этого использовать?

Для этого есть класс XamlReader
Т.е. для парсинга XAML нужно сделать что-то типа такого:

public class NemerleHint
{
   public static NemerleHint Parse(string hintXaml)
   {
       using(var sr = new StringReader(hintXaml))
       using(var xr = new XmlTextReader(sr))
          return (NemerleHint)XamlReader.Load(xr);
   }
}

Еще есть перегруженный метод Load, который принимает аргумент типа ParserContext. Возможно, придется с ним поколдовать...

GR>>Если же нужна проверка в компайлтайме, то XML/HTML/XAML — вообще тупиковый вариант.

J>Достаточно и в рантайме....
Ок. Тогда либо XamlReader.Load ругнется, к стати вполне культурно и понятно, либо приведение типа object к NemerleHint.
Скука — двигатель прогресса.
Re[11]: Кто может написать контрол - крутой хинт?
От: jenyavb  
Дата: 22.08.09 08:46
Оценка:
Здравствуйте, VladD2, Вы писали:

J>>Только сейчас понял, что код вида

J>>
J>><p>test <bold>test</bold> test</p>
J>>

J>>не корректен для XML и спроецировать его через LINQ2XLM не получится...
J>>Видимо придется писать свой мини-парсер?
VD>С чего ты это сзвзял? Это совершенно корректный XML.

Хм... Может я чего-то не знаю, но как же вытаскивать линком выделенные жирным подстроки? Заворочивать их в ещё один вид тегов?

VD>Кстати, тег болд должен быть определяемый, а не фиксированный.


Я понимаю. Там все теги, кроме p, ref и hint — получается определяемые.
Re[12]: Кто может написать контрол - крутой хинт?
От: VladD2 Российская Империя www.nemerle.org
Дата: 23.08.09 10:39
Оценка:
Здравствуйте, jenyavb, Вы писали:

J>Хм... Может я чего-то не знаю, но как же вытаскивать линком выделенные жирным подстроки? Заворочивать их в ещё один вид тегов?


А что там делать то?
Грузишь XML через XElement и разбираешь if-ами что получилось.
Для этой задачи XSLT за глаза хватило бы.
Задача ведь на трансформивание.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[13]: Кто может написать контрол - крутой хинт?
От: jenyavb  
Дата: 23.08.09 11:26
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>А что там делать то?

VD>Грузишь XML через XElement и разбираешь if-ами что получилось.
VD>Для этой задачи XSLT за глаза хватило бы.
VD>Задача ведь на трансформивание.

Ещё раз повторяю:
<p>test1 <bold>test2</bold> test3</p>

В таком коде подстроки "test1 " и " test3" не являются xml-элементами, поэтому через XElement.Elements() они не вытащатся, а просто пропустятся.

Ещё хотел спросить, нужно ли реализовывать задержку перед показом тултипа или это будет делаться из вне?
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Re[15]: Кто может написать контрол - крутой хинт?
От: jenyavb  
Дата: 23.08.09 17:39
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>А если так:

L>
L>XContainer.Nodes().OfType<XText>()
L>


Да, так можно... Хотя извращения ИМХО это всё...
Re[14]: Кто может написать контрол - крутой хинт?
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.08.09 12:54
Оценка:
Здравствуйте, jenyavb, Вы писали:

J>Ещё раз повторяю:

J>
J><p>test1 <bold>test2</bold> test3</p>
J>

J>В таком коде подстроки "test1 " и " test3" не являются xml-элементами, поэтому через XElement.Elements() они не вытащатся, а просто пропустятся.

Ты лучше бы не теоретизировал, а попробовал бы:
using System;
using System.Xml.Linq;

class Program
{
  static void Main()
  {
    var str = "<p>test1 <bold>test2</bold> test3</p>";
    var xml = XElement.Parse(str);

    Console.WriteLine("Parsed XML: " + xml);

    foreach (var node in xml.DescendantNodes())
      Console.WriteLine("Node type: {0,7} Value: '{1}'", node.NodeType, node);
  }
}


Elements() возвращает только XElement-ы, т.е. теги. Но кроме XElement-ов есть еще и текстовые ветки (и куча других).

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


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

J>Хм... Может я чего-то не знаю, но как же вытаскивать линком выделенные жирным подстроки? Заворочивать их в ещё один вид тегов?


http://rsdn.ru/forum/nemerle/3513688.1.aspx
Автор: VladD2
Дата: 24.08.09


VD>>Кстати, тег болд должен быть определяемый, а не фиксированный.


J>Я понимаю. Там все теги, кроме p, ref и hint — получается определяемые.


+1

Еще нужен тег <code> или <pre> который бы выводил текст моноширинным шрифтом.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[13]: Кто может написать контрол - крутой хинт?
От: jenyavb  
Дата: 24.08.09 13:53
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Еще нужен тег <code> или <pre> который бы выводил текст моноширинным шрифтом.


А почему для него отдельный тег? Его ведь тоже стилем можно сделать.
Re[15]: Кто может написать контрол - крутой хинт?
От: jenyavb  
Дата: 24.08.09 13:56
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Ты лучше бы не теоретизировал, а попробовал бы:

VD>Elements() возвращает только XElement-ы, т.е. теги. Но кроме XElement-ов есть еще и текстовые ветки (и куча других).

Не знал я. Тут
Автор: Lloyd
Дата: 23.08.09
уже подсказали.

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

VD>Задержек никаких не надо. Надо сосредоточиться на автоматическом закрытии по таймеру и на выравнивании размеров под текст и доступный объем места на экране.

Уже поздно — сделал.
Re[14]: Кто может написать контрол - крутой хинт?
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.08.09 15:55
Оценка:
Здравствуйте, jenyavb, Вы писали:

VD>>Еще нужен тег <code> или <pre> который бы выводил текст моноширинным шрифтом.


J>А почему для него отдельный тег? Его ведь тоже стилем можно сделать.


Можно, если стили будут поддерживать дополнение. Тег <code> должен задавать только шнифт.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[16]: Кто может написать контрол - крутой хинт?
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.08.09 16:56
Оценка:
Здравствуйте, jenyavb, Вы писали:

J>Уже поздно — сделал.


В общем, мне нужен класс с приблизительно следующим описанием:

enum ThreeState
{
| NoDefined
| Set
| Unset
}

class Hint
{
  AddStileTag(tagName : string, colore : SomeColor, bold : ThreeState, italic : ThreeState, underline : ThreeState);
  Show(activeArea : System.Drawing.Rectangle, showAt : System.Drawing.Point, text : string, action : Action[string]);
  Hide();
}


AddStileTag() — позволяет задать теги стилей.
Show() — позволяет показать хинт на экране.
activeArea — это область экрана при выходе из которой нужно автоматически скрывать хинт. Естесвтенно, что если курсор вошел в хинт, то хинт скрывать не надо.
showAt — это координата где нужно отображать хинт. X задает смешение от верха экрана где должна находиться верхняя граница хинта. Y задает горизонтальную точку относительно которой нужно выравнивать хинт. Если хинт влезает в окно, то он должен начинаться н с координаты Y. Если он выходит за пределы окна, то хинт может сдвигаться влево, вплоть до левого края окна.
text — текст хинта размеченый тегами.
action — делегат который должен вызываться в случае если пользователь нажал на активную область. В единственный строковый параметр делегата должна передоваться строка заданная в теге ref (чтобы можно было понять что за ссылка нажата.

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

Кстати, логично было бы предусмотреть маленькую кнопку (в углу хинта) навигации назад (так чтобы она была видна если задан некий флаг).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[17]: Кто может написать контрол - крутой хинт?
От: jenyavb  
Дата: 24.08.09 17:24
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>В общем, мне нужен класс с приблизительно следующим описанием:


VD>enum ThreeState

VD>{
VD> | NoDefined
VD> | Set
VD> | Unset
VD>}

VD>
VD>class Hint
VD>{
VD>  AddStileTag(tagName : string, colore : SomeColor, bold : ThreeState, italic : ThreeState, underline : ThreeState);
VD>  Show(activeArea : System.Drawing.Rectangle, showAt : System.Drawing.Point, text : string, action : Action[string]);
VD>  Hide();
VD>}
VD>


У меня так получилось:
class AdvancedHint
{
    public AdvancedHint(
        Action<string> linkClickedNotifyer,
        Func<string, string> subHintGetter,
        IDictionary<string, Func<Span>> styles)

    public void Show(Rectangle targetRect, string hintText)

    public void Hide()
}


linkClickedNotifyer — делегат, для оповещения о клике на ссылку
subHintGetter — делегат, получающий содержимое вложенного хинта. есть еще простые хинты с указанием текста по месту, но без форматирования.
styles — словарь, с делегатами-фабриками Span'ов — текстовых элементов WPF (это и есть кастом-теги)

showAt у меня нет, ибо позиция курсора и так известна.

VD>Если Show вызван в то время когда открыт хинт, то хинт не мерцая должен изменить свое содержание. Это нужно, чтобы можно было организовать нечто вроде гипертекстовой навигации. Скажем нажал я в хинте описывающем метод на нектороый тип и в хинте должено отобразиться описание этого типа.

VD>Кстати, логично было бы предусмотреть маленькую кнопку (в углу хинта) навигации назад (так чтобы она была видна если задан некий флаг).

Сделаю...
Re[18]: Кто может написать контрол - крутой хинт?
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.08.09 18:19
Оценка:
Здравствуйте, jenyavb, Вы писали:

Вот это:
J>
J>    public AdvancedHint(
J>        Action<string> linkClickedNotifyer,
J>        Func<string, string> subHintGetter,
J>        IDictionary<string, Func<Span>> styles)
J>


как-то слишком сложно для восприятия.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[17]: Кто может написать контрол - крутой хинт?
От: jenyavb  
Дата: 24.08.09 18:21
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Кстати, логично было бы предусмотреть маленькую кнопку (в углу хинта) навигации назад (так чтобы она была видна если задан некий флаг).


А при ёё нажатии что, делегат вызывать?
Re[18]: Кто может написать контрол - крутой хинт?
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.08.09 18:22
Оценка:
Здравствуйте, jenyavb, Вы писали:

J>subHintGetter — делегат, получающий содержимое вложенного хинта. есть еще простые хинты с указанием текста по месту, но без форматирования.


Какое-то переусложнение. Это же еще и использовать придется .

J>showAt у меня нет, ибо позиция курсора и так известна.


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

J>А при ёё нажатии что, делегат вызывать?


Одно из двух. Или просто вызваться некое событие. Или должен открываться предыдущий хинт (если мы не закрывая один хинт открыли еще один на событие нажатия мыши).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[19]: Кто может написать контрол - крутой хинт?
От: jenyavb  
Дата: 24.08.09 18:32
Оценка:
Здравствуйте, VladD2, Вы писали:

J>>subHintGetter — делегат, получающий содержимое вложенного хинта. есть еще простые хинты с указанием текста по месту, но без форматирования.

VD>Какое-то переусложнение. Это же еще и использовать придется .

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

J>>showAt у меня нет, ибо позиция курсора и так известна.

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

А, вот оно зачем. Ну у меня просто хинт показывается внизу целевого прямоугольника.
Re[19]: Кто может написать контрол - крутой хинт?
От: jenyavb  
Дата: 24.08.09 18:40
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Вот это:

J>>
J>>    public AdvancedHint(
J>>        Action<string> linkClickedNotifyer,
J>>        Func<string, string> subHintGetter,
J>>        IDictionary<string, Func<Span>> styles)
J>>

VD>как-то слишком сложно для восприятия.

Что сложного то? Кстати каждый параметр может быть null. Примерно так юзается:
var hint = new AdvancedHint(
    linkId => Console.WriteLine(linkId),
    hintId => GenerateHint(hintId),
    new Dictionary
    {
        { "bold", ()=> new Bold() },
        { "pre", ()=> new Run { FontFamily = "Courier New" } }
    ));

hint.Show(boundRect, "bla-bla-bla");
Re[19]: Кто может написать контрол - крутой хинт?
От: jenyavb  
Дата: 24.08.09 19:02
Оценка:
Здравствуйте, VladD2, Вы писали:

Параметр с текстом хинта из метода Show пришлось убрать, поскольку Show нужно вызывать при движении по нужной области, чтобы когда мышь остановится он сработал, а постоянный парсинг — дело не дешевое.
Re[20]: Кто может написать контрол - крутой хинт?
От: jenyavb  
Дата: 24.08.09 19:08
Оценка:
J>Параметр с текстом хинта из метода Show пришлось убрать, поскольку Show нужно вызывать при движении по нужной области, чтобы когда мышь остановится он сработал, а постоянный парсинг — дело не дешевое.

Хотя нет, это не верно. Ведь если пользователь сделал клик в целевой обласи, то хинт не должен больше появляться снова, пока курсор не выйдет из обласи и зайдет туда вновь, значит эту логику нужно убрать в хинт, сигнатура Show останется как есть, но вызывать его нужно только при входе курсора в целевую область.
Re: AdvancedHints Beta
От: jenyavb  
Дата: 24.08.09 19:28
Оценка:
Решил выложить посмотреть то, что уже сделано.
Это ещё не окончательный вариант, некоторых фич ещё нет. Окончательный сделаю через 1-3 дня...

AdvancedHints.zip

Багрепорты — только с Exception'ами и вылетами. Логика ещё не доделана, я и сам всё знаю.
Re[3]: AdvancedHints Beta
От: jenyavb  
Дата: 25.08.09 04:47
Оценка:
Здравствуйте, yumi, Вы писали:

Y>При старте:

Y>

Y>System.ComponentModel.Win32Exception was unhandled
Y> Message="Невозможно установить нелокальный обработчик без дескриптора модуля"
Y> Source="AdvancedHints"
Y> ErrorCode=-2147467259
Y> NativeErrorCode=1428
Y> StackTrace:
Y> at AdvancedHints.HookManager.EnsureSubscribedToGlobalMouseEvents() in D:\Projects\AdvancedHints\Hooks\HookManager.Callbacks.cs:line 211
Y> at AdvancedHints.HookManager.add_MouseMove(MouseEventHandler value) in D:\Projects\AdvancedHints\Hooks\HookManager.cs:line 25
Y> at AdvancedHints.AdvancedHint..ctor(Action`1 linkClickedNotifyer, Func`2 subHintGetter, IDictionary`2 styles) in D:\Projects\AdvancedHints\AdvancedHint.cs:line 44
Y> at AdvancedHints.TestForm..ctor() in D:\Projects\AdvancedHints\TestForm.cs:line 17
Y> at AdvancedHints.Program.Main() in D:\Projects\AdvancedHints\Program.cs:line 13
Y> at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
Y> at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
Y> at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
Y> at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
Y> at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
Y> at System.Threading.ThreadHelper.ThreadStart()
Y> InnerException:


Да, тут проблема есть. Для WinAPI функции SetWindowHook нужно указать хэндл текущего модуля. Где его взять — я так и не разобрался. Ещё не помешало бы указать туда ID потока. Сейчас туда просто передатся IntPtr.Zero и 0, соответственно. Кто разбирается в WinAPI — помогите, плиз.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Re[4]: AdvancedHints Beta
От: yumi  
Дата: 25.08.09 04:54
Оценка:
Здравствуйте, jenyavb, Вы писали:

J>Да, тут проблема есть. Для WinAPI функции SetWindowHook нужно указать хэндл текущего модуля. Где его взять — я так и не разобрался. Ещё не помешало бы указать туда ID потока. Сейчас туда просто передатся IntPtr.Zero и 0, соответственно. Кто разбирается в WinAPI — помогите, плиз.


Так-с, поглядел код, а зачем ты вообще WinAPI используешь, неужели в .NET нет аналогов поставить хуки на MouseClick, MouseDown итд? То же самое кстати с клавиатурой.
Lisp is not dead. It’s just the URL that has changed:
http://clojure.org
Re[5]: AdvancedHints Beta
От: jenyavb  
Дата: 25.08.09 05:01
Оценка:
Здравствуйте, yumi, Вы писали:

J>>Да, тут проблема есть. Для WinAPI функции SetWindowHook нужно указать хэндл текущего модуля. Где его взять — я так и не разобрался. Ещё не помешало бы указать туда ID потока. Сейчас туда просто передатся IntPtr.Zero и 0, соответственно. Кто разбирается в WinAPI — помогите, плиз.

Y>Так-с, поглядел код, а зачем ты вообще WinAPI используешь, неужели в .NET нет аналогов поставить хуки на MouseClick, MouseDown итд? То же самое кстати с клавиатурой.

Да вроде нет.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Re[5]: AdvancedHints Beta
От: yumi  
Дата: 25.08.09 05:05
Оценка:
Здравствуйте, yumi, Вы писали:

Y>Так-с, поглядел код, а зачем ты вообще WinAPI используешь, неужели в .NET нет аналогов поставить хуки на MouseClick, MouseDown итд? То же самое кстати с клавиатурой.


Да, я кажется понял тебя, я вижу 2 пути, первое — принимать указатель на основную форму и подписаться на его события MouseXXX в своем AdvancedHint. Второй путь:
interface IAdvancedHint
{
  void MouseClick(...);
  void MouseMove(...);
  // etc ...
}

И пусть пользователи твоей компоненты сами дергают твои методы MouseXXX при определенных событиях.
Lisp is not dead. It’s just the URL that has changed:
http://clojure.org
Re[6]: AdvancedHints Beta
От: yumi  
Дата: 25.08.09 06:45
Оценка:
Здравствуйте, jenyavb, Вы писали:

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


J>>>Да, тут проблема есть. Для WinAPI функции SetWindowHook нужно указать хэндл текущего модуля. Где его взять — я так и не разобрался. Ещё не помешало бы указать туда ID потока. Сейчас туда просто передатся IntPtr.Zero и 0, соответственно. Кто разбирается в WinAPI — помогите, плиз.

Y>>Так-с, поглядел код, а зачем ты вообще WinAPI используешь, неужели в .NET нет аналогов поставить хуки на MouseClick, MouseDown итд? То же самое кстати с клавиатурой.

J>Да вроде нет.


Посмотри http://support.microsoft.com/kb/318804, может поможет. Кстати, увидел случайно, KeyboardHookStruct лучше назвать KeyboardLLHookStruct, т.к. по структуре оно вроде low level.

И да, я тут чуть поэкспериментировал. Если убрать _LL и передать Id треда, перестает падать, но в этом случае, нужно в обработчике MouseHookProc, нужно обрабатывать структуру MouseHookStruct, вместо MouseLLHookStruct. Только я не знаю, подойдет ли тебе обычный обработчик, а не low level.
// ...
s_MouseHookHandle = SetWindowsHookEx(
    WH_MOUSE, s_MouseDelegate, IntPtr.Zero, AppDomain.GetCurrentThreadId());
// ...


То же самое с клавиатурным обработчиком.
Lisp is not dead. It’s just the URL that has changed:
http://clojure.org
Re[7]: AdvancedHints Beta
От: yumi  
Дата: 25.08.09 07:01
Оценка:
А нет, все, нашел выход.

То есть должно получится как-то так:
                using (System.Diagnostics.Process process = System.Diagnostics.Process.GetCurrentProcess())
                using (System.Diagnostics.ProcessModule module = process.MainModule)
                {
                    IntPtr hModule = GetModuleHandle(module.ModuleName);

                    s_MouseHookHandle = SetWindowsHookEx(
                        WH_MOUSE_LL, s_MouseDelegate, hModule, 0);
                }


Самому проверять уже времени нет Там надо импортировать GetModuleHandle. Но я уверен, должно сработать.
Lisp is not dead. It’s just the URL that has changed:
http://clojure.org
Re[7]: AdvancedHints Beta
От: jenyavb  
Дата: 25.08.09 07:55
Оценка:
Здравствуйте, yumi, Вы писали:

Y>Посмотри http://support.microsoft.com/kb/318804, может поможет. Кстати, увидел случайно, KeyboardHookStruct лучше назвать KeyboardLLHookStruct, т.к. по структуре оно вроде low level.


Её вообще нужно назвать, как она в WinAPI называется.

Y>И да, я тут чуть поэкспериментировал. Если убрать _LL и передать Id треда, перестает падать, но в этом случае, нужно в обработчике MouseHookProc, нужно обрабатывать структуру MouseHookStruct, вместо MouseLLHookStruct. Только я не знаю, подойдет ли тебе обычный обработчик, а не low level.


Судя по вот этому — Keyboard/MouseHookStruct передается только при low lewel хуке, а HookStruct не делятся на обычные и LL. Вобщем я —
Re[7]: AdvancedHints Beta
От: jenyavb  
Дата: 25.08.09 08:04
Оценка:
Здравствуйте, yumi, Вы писали:

Y>
Y>// ...
Y>s_MouseHookHandle = SetWindowsHookEx(
Y>    WH_MOUSE, s_MouseDelegate, IntPtr.Zero, AppDomain.GetCurrentThreadId());
Y>// ...
Y>


AppDomain.GetCurrentThreadId() — метод помечен как Obsolete.
Да и при указании треда нужно указать хэндл модуля, иначе ошибка.
Re[20]: Кто может написать контрол - крутой хинт?
От: VladD2 Российская Империя www.nemerle.org
Дата: 26.08.09 13:48
Оценка:
Здравствуйте, jenyavb, Вы писали:

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


У нас есть два типа вложенных хинтов:
1. Полноценая ссылка на другое определение.
2. Простий текстовый хинт.
Примером второго типа являютсэ хинты для типов параметров.
Их будет очень неудобно оформлять полноценными хинтами.
Мне нужно чтобы я мог задать весь текст хинта (с простыми подхинтами) за один прием.

J>А, вот оно зачем. Ну у меня просто хинт показывается внизу целевого прямоугольника.


Область может быть довольно большой, так что хинт будет висеть где-то внизу экрана.
Это одна из проблем текущей риализации. Сейчас я пытаюсьобойти еепутем задавания в качестве области одного токена.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: AdvancedHints Beta
От: VladD2 Российская Империя www.nemerle.org
Дата: 26.08.09 13:52
Оценка:
Здравствуйте, jenyavb, Вы писали:

J>Решил выложить посмотреть то, что уже сделано.

J>Это ещё не окончательный вариант, некоторых фич ещё нет. Окончательный сделаю через 1-3 дня...

J>AdvancedHints.zip


J>Багрепорты — только с Exception'ами и вылетами. Логика ещё не доделана, я и сам всё знаю.


Я до еонца недели (в лучшем случае до пятницы) на GPRS-е, так что качать ничего не могу.
Так что доводи до ума и тогда посмотрим.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[21]: Кто может написать контрол - крутой хинт?
От: jenyavb  
Дата: 26.08.09 15:04
Оценка:
Здравствуйте, VladD2, Вы писали:

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

VD>У нас есть два типа вложенных хинтов:
VD>1. Полноценая ссылка на другое определение.

Это всмысле подхинт? То-есть при наведении на какой-то текст в хинте появляется ещё один хинт. Для таких хинтов текст запрашивается через делегат из вне.

VD>2. Простий текстовый хинт.

VD>Примером второго типа являютсэ хинты для типов параметров.
VD>Их будет очень неудобно оформлять полноценными хинтами.
VD>Мне нужно чтобы я мог задать весь текст хинта (с простыми подхинтами) за один прием.

Такая функциональность предусмотрена тоже. Но в таком хинте может быть только плоский текст.

J>>А, вот оно зачем. Ну у меня просто хинт показывается внизу целевого прямоугольника.

VD>Область может быть довольно большой, так что хинт будет висеть где-то внизу экрана.
VD>Это одна из проблем текущей риализации. Сейчас я пытаюсь обойти ее путем задавания в качестве области одного токена.

Хм... Ну видимо тогда придется дать возможность задать точку показа хинта.
Re[3]: AdvancedHints Beta
От: jenyavb  
Дата: 26.08.09 15:13
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Я до еонца недели (в лучшем случае до пятницы) на GPRS-е, так что качать ничего не могу.

VD>Так что доводи до ума и тогда посмотрим.

Оно уже устарело .

Я уже почти доделал, осталось:
1. Узнать, как получить целевой прямоугольник для показа вложенных хинтов, вопрос есть в dotnet.gui
Автор: jenyavb
Дата: 25.08.09
.
2. Сделать кнопку "Назад".

Ещё осталась проблема: когда владелец хинта теряет фокус — хинт надо прятать, но в текущей реализации владельца нет, думаю это редкая ситуация — можно забить.

Ну и когда студия будет на WPF и появится WPF-контролл-владелец-хинта — можно будет выкинуть кучу интеропа и костылей.
Re[8]: AdvancedHints Beta
От: jenyavb  
Дата: 26.08.09 15:43
Оценка:
Здравствуйте, yumi, Вы писали:

Y>Самому проверять уже времени нет Там надо импортировать GetModuleHandle. Но я уверен, должно сработать.


Вроде работает. У меня этот глюк не воспроизводится, так что держи новую версию: AdvancedHints2.zip и протестируй.
Re[4]: AdvancedHints Beta
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.08.09 00:52
Оценка:
Здравствуйте, jenyavb, Вы писали:

J>1. Узнать, как получить целевой прямоугольник для показа вложенных хинтов, вопрос есть в dotnet.gui
Автор: jenyavb
Дата: 25.08.09
.


не понял сути вопроса.

J>Ещё осталась проблема: когда владелец хинта теряет фокус — хинт надо прятать, но в текущей реализации владельца нет, думаю это редкая ситуация — можно забить.


Эта проблема так же легко решается с помощю таймера.
Надо запросить окно владельца и по таймеру проверять в фокусе ли оно.

J>Ну и когда студия будет на WPF и появится WPF-контролл-владелец-хинта — можно будет выкинуть кучу интеропа и костылей.


Возможн... а возможно гимору прибавится.
В прочем, возможно они просто сделают стандартные хинты тоже WPF-ыми.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: AdvancedHints Beta
От: jenyavb  
Дата: 27.08.09 09:56
Оценка:
Здравствуйте, VladD2, Вы писали:

J>>1. Узнать, как получить целевой прямоугольник для показа вложенных хинтов, вопрос есть в dotnet.gui
Автор: jenyavb
Дата: 25.08.09
.

VD>не понял сути вопроса.

Ну в WPF есть специальные классы для представления текста и документов вообще. С помощью них и визуализируется текст подсказки. Но для того чтобы показывать вложенные хинты при наведении на определенные Span'ы нужно как-то узнавать их местоположение на экране, но так как эти элементы рисованием себя не занимаются, то никаких средств для узнавания их размера/положения в них соответственно нет. Вот собственно проблема в том, что я не знаю как получить размер и местоположение Span'а, представляющего область с хинтом, чтобы узнать целевой прямоугольник для хинта.

J>>Ещё осталась проблема: когда владелец хинта теряет фокус — хинт надо прятать, но в текущей реализации владельца нет, думаю это редкая ситуация — можно забить.

VD>Эта проблема так же легко решается с помощю таймера.
VD>Надо запросить окно владельца и по таймеру проверять в фокусе ли оно.

Нет уже желания этим заниматься.

VD>В прочем, возможно они просто сделают стандартные хинты тоже WPF-ыми.


На стандартные хинты мышь не наведешь.
Re[9]: AdvancedHints Beta
От: Andir Россия
Дата: 27.08.09 10:38
Оценка:
Здравствуйте, jenyavb, Вы писали:

J>Вроде работает. У меня этот глюк не воспроизводится, так что держи новую версию: AdvancedHints2.zip и протестируй.


Тоже скачал, посмотрел.
У меня на увеличенном DPI hint показывается гораздо ниже окна.

С Уважением, Andir!
Re[10]: AdvancedHints Beta
От: jenyavb  
Дата: 27.08.09 12:59
Оценка:
Здравствуйте, Andir, Вы писали:

A>Тоже скачал, посмотрел.

A>У меня на увеличенном DPI hint показывается гораздо ниже окна.

Тоже известный баг, там у меня device-пиксели и wpf-пиксели не конвертируются друг в друга, а просто присваиваются без конвертации. Нужно разбираться, как осуществлять конвертирование.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Re[6]: AdvancedHints Beta
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.08.09 17:58
Оценка:
Здравствуйте, jenyavb, Вы писали:

J>...Span'ы нужно как-то узнавать их местоположение на экране, но так как эти элементы рисованием себя не занимаются, то никаких средств для узнавания их размера/положения в них соответственно нет. Вот собственно проблема в том, что я не знаю как получить размер и местоположение Span'а, представляющего область с хинтом, чтобы узнать целевой прямоугольник для хинта.


В WPF я не спец. Могу только предположить, что возможно нужно сложить в них (или их) другой элемент, у которого можно узнать размеры и местоположение.

VD>>Надо запросить окно владельца и по таймеру проверять в фокусе ли оно.


J>Нет уже желания этим заниматься.


Так дела не делаются.
И вообще, на мой взгляд, внашей профессии самое интересное — преодолевать трудности. Точнее, удовольствие возникающее после преодоления, этих самых, трудностей.

VD>>В прочем, возможно они просто сделают стандартные хинты тоже WPF-ыми.


J>На стандартные хинты мышь не наведешь.


Дык, они свои напишут. Вреламе 2010-й студии я уже видел нечто подобное.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: AdvancedHints Beta
От: jenyavb  
Дата: 28.08.09 06:44
Оценка:
Здравствуйте, VladD2, Вы писали:

J>>...Span'ы нужно как-то узнавать их местоположение на экране, но так как эти элементы рисованием себя не занимаются, то никаких средств для узнавания их размера/положения в них соответственно нет. Вот собственно проблема в том, что я не знаю как получить размер и местоположение Span'а, представляющего область с хинтом, чтобы узнать целевой прямоугольник для хинта.

VD>В WPF я не спец. Могу только предположить, что возможно нужно сложить в них (или их) другой элемент, у которого можно узнать размеры и местоположение.

Ну в крайнем случае придется использовать такой вариант...

VD>>>Надо запросить окно владельца и по таймеру проверять в фокусе ли оно.

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

У меня оно возникает, только когда решение получлось красивым, а не лишь-бы работало.

VD>>>В прочем, возможно они просто сделают стандартные хинты тоже WPF-ыми.

J>>На стандартные хинты мышь не наведешь.
VD>Дык, они свои напишут. Вреламе 2010-й студии я уже видел нечто подобное.

Ясно.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Re: Готово
От: jenyavb  
Дата: 29.08.09 14:15
Оценка:
Ну, вроде всё готово.
Вот результат.
Re[10]: AdvancedHints Beta
От: jenyavb  
Дата: 29.08.09 14:17
Оценка:
Здравствуйте, Andir, Вы писали:

A>У меня на увеличенном DPI hint показывается гораздо ниже окна.


Вот, здесь
Автор: jenyavb
Дата: 29.08.09
вроде пофиксил, проверь.
Re[11]: AdvancedHints Beta
От: Andir Россия
Дата: 29.08.09 14:36
Оценка:
Здравствуйте, jenyavb, Вы писали:

A>>У меня на увеличенном DPI hint показывается гораздо ниже окна.

J>Вот, здесь
Автор: jenyavb
Дата: 29.08.09
вроде пофиксил, проверь.


Ага, теперь показывается как надо.
Теперь ещё:
Windows 7 — в таскбаре видно два окна (ну может это так и надо?),
Получилось какими-то манипуляциями добиться того, что Hint перестал исчезать.

С Уважением, Andir!
Re[12]: AdvancedHints Beta
От: jenyavb  
Дата: 29.08.09 15:50
Оценка:
Здравствуйте, Andir, Вы писали:

A>Windows 7 — в таскбаре видно два окна (ну может это так и надо?),


Забыл поставить ShowInTaskbar = false для окна-костыльчика. Дело в том, что для того чтобы конвертировать девайс-пиксели в wpf-писекли и обратно нежен Visual, который отображается на экране, вот это окошко для этих целей и существует.

A>Получилось какими-то манипуляциями добиться того, что Hint перестал исчезать.


Надо-бы четкую последовательность действий.
Re[2]: Небольшой фикс
От: jenyavb  
Дата: 29.08.09 15:55
Оценка:
Поправил баг, вот последняя версия.
Re[3]: Небольшой фикс
От: Аноним  
Дата: 29.08.09 20:26
Оценка:
Здравствуйте, jenyavb, Вы писали:

J>Поправил баг, вот последняя версия.


А почему он, собственно, не исчезает?

А ещё, если хинт переместить (наводим мышь на слона, перемещаем форму, опять наводим), то субхинт на месте остаётся. По мне, так лучше, чтоб субхинт вообще исчезал.
Re[3]: Небольшой фикс
От: Аноним  
Дата: 29.08.09 20:34
Оценка:
Здравствуйте, jenyavb, Вы писали:

J>Поправил баг, вот последняя версия.


Насколько я понял, простого способа вывести на экран символы "<" та ">" нету (а они могут и понадобиться).
Re[3]: Небольшой фикс
От: Аноним  
Дата: 29.08.09 20:41
Оценка:
Здравствуйте, jenyavb, Вы писали:

J>Поправил баг, вот последняя версия.


Но в целом приятный контрол. А нельзя как-то уголки скруглить на один пиксел, как в Шарпдевелопе?
Re[4]: Небольшой фикс
От: jenyavb  
Дата: 30.08.09 07:14
Оценка:
Здравствуйте, Аноним, Вы писали:

А>А почему он, собственно, не исчезает?


Должен исчезать. Видимо это баг. У меня не воспроизводится.

А>А ещё, если хинт переместить (наводим мышь на слона, перемещаем форму, опять наводим), то субхинт на месте остаётся. По мне, так лучше, чтоб субхинт вообще исчезал.


А как удается перемещать форму, так чтобы хинт не скрывался?
Re[4]: Небольшой фикс
От: jenyavb  
Дата: 30.08.09 07:19
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Насколько я понял, простого способа вывести на экран символы "<" та ">" нету (а они могут и понадобиться).


Хм... По идее должны работать &lt; и &gt;, но почему-то не работают.
Re[4]: Небольшой фикс
От: jenyavb  
Дата: 30.08.09 07:22
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Но в целом приятный контрол. А нельзя как-то уголки скруглить на один пиксел, как в Шарпдевелопе?


Попробую, если с Popup'ом проблем не будет, то можно конечно. Хотя незнаю нужно-ли, в студии то все квадратное.
Re[5]: Небольшой фикс
От: Аноним  
Дата: 30.08.09 12:18
Оценка:
Здравствуйте, jenyavb, Вы писали:

J>Должен исчезать. Видимо это баг. У меня не воспроизводится.


Хм, сегодня и я воспроизвести не могу. Видимо, положение Юпитера сказывается

J>А как удается перемещать форму, так чтобы хинт не скрывался?


Ну, когда хинт не скрывался, так сделать было возможно.
Re[5]: Небольшой фикс
От: jenyavb  
Дата: 30.08.09 15:16
Оценка:
А>>Но в целом приятный контрол. А нельзя как-то уголки скруглить на один пиксел, как в Шарпдевелопе?
J>Попробую, если с Popup'ом проблем не будет, то можно конечно. Хотя незнаю нужно-ли, в студии то все квадратное.

Попробовал. Как я и думал — уродский попап не дает этого сделать. Фон у него черный, по этому по углам в случае скругления Border'а с подсказкой остается чернота. А свойства для визуальной настройки Popup'а просто ничего не делают.
Re: Кто может написать контрол - крутой хинт?
От: Аноним  
Дата: 30.08.09 20:13
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Есть задачка...


VD>Может кто-нибудь возьмется за эту задачу?


Ну я тоже решил попробовать написать этот хинт.
Вот что из этого получилось, авось кому-нибудь пригодится.
Re[2]: Кто может написать контрол - крутой хинт?
От: jenyavb  
Дата: 31.08.09 09:42
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Ну я тоже решил попробовать написать этот хинт.

А>Вот что из этого получилось, авось кому-нибудь пригодится.

Твоя реализация вроде хорошая. Но почему не сказал, что делаешь? Зачем одну и ту же работу два раза делать?
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Re[2]: Кто может написать контрол - крутой хинт?
От: Andir Россия
Дата: 31.08.09 10:13
Оценка:
Здравствуйте, Аноним, Вы писали:

VD>>Может кто-нибудь возьмется за эту задачу?

А>Ну я тоже решил попробовать написать этот хинт.
А>Вот что из этого получилось, авось кому-нибудь пригодится.

Класс!
Однако тут тоже присутствует проблема с увеличенным DPI — хинт появляется гораздо ниже кнопки (и вложенный хинт тоже).

С Уважением, Andir!
Re[3]: Кто может написать контрол - крутой хинт?
От: jenyavb  
Дата: 31.08.09 10:16
Оценка:
Здравствуйте, Andir, Вы писали:

A>Класс!

A>Однако тут тоже присутствует проблема с увеличенным DPI — хинт появляется гораздо ниже кнопки (и вложенный хинт тоже).

Да и после клика на кнопку хинт уже не должен появляться.
Re[3]: Небольшой фикс
От: VladD2 Российская Империя www.nemerle.org
Дата: 31.08.09 14:57
Оценка:
Здравствуйте, jenyavb, Вы писали:

J>Поправил баг, вот последняя версия.


Где самая свежая версия?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Кто может написать контрол - крутой хинт?
От: VladD2 Российская Империя www.nemerle.org
Дата: 31.08.09 15:33
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Ну я тоже решил попробовать написать этот хинт.

А>Вот что из этого получилось, авось кому-нибудь пригодится.

Интересно. Но сразу столкнулся с проблемой. Попытался обернуть описание метода тегом <pre> и получил исключение:
<hint>
<pre><keyword>internal</keyword> <ref handler='GoToDef'> RunErrorOccured</ref>(
  loc : <ref handler='GoToTypeDef1' hint='Nemerle.Compiler.Location'>Location</ref>,
  msg : <text hint='System.String'>string</text>) : <keyword>void</keyword>,
</pre>
<b> 
 bold  </b>,
<b> bold <i> and italic</i></b>,
<pre><b>monospace</b> test</pre>,
<text><u><pre>inner hint test</pre></u>
<hint>
  <keyword>public class</keyword> 
  <ref handler='GoToDef2'> TestClass
{ .. }<hint> Hello form sub sub hint !!!</hint></ref>
</hint>
</text>
</hint>


ЗЫ

Лучше класть файлы на наш сервер. Это можно сделать в профайле или в ветке "Мой RSDN\Файлы".
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Небольшой фикс
От: jenyavb  
Дата: 31.08.09 15:59
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Где самая свежая версия?

Здесь.

Кстати, тут
Автор:
Дата: 31.08.09
ещё одна реализация появилась. Как теперь быть, что будешь выбирать?
Re[3]: Кто может написать контрол - крутой хинт?
От: Аноним  
Дата: 31.08.09 17:22
Оценка:
J>Твоя реализация вроде хорошая. Но почему не сказал, что делаешь? Зачем одну и ту же работу два раза делать?

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


VD>Интересно. Но сразу столкнулся с проблемой. Попытался обернуть описание метода тегом <pre> и получил исключение:

VD> ...

VD>ЗЫ


VD>Лучше класть файлы на наш сервер. Это можно сделать в профайле или в ветке "Мой RSDN\Файлы".


А такое не поддерживается, стили задаются только внутри основных тэгов text, keуword, ref.
Если есть интерес, могу дорабатывать контрол под требования.
Только не помешало бы более подробное ТЗ, несколько типичных примеров использования, более точное описание формата входного текста.
В частности, есть непонятки с переносом текста, нужен ли для него отдельный тэг?
Re[4]: Кто может написать контрол - крутой хинт?
От: VladD2 Российская Империя www.nemerle.org
Дата: 31.08.09 20:15
Оценка:
Здравствуйте, Аноним, Вы писали:

А>А такое не поддерживается, стили задаются только внутри основных тэгов text, keуword, ref.

А>Если есть интерес, могу дорабатывать контрол под требования.

Вопрос к анониму (кстати, неплохо было бы материализоваться ) и к jenyavb...

Не могли бы вы (каждый) произвести ревизию кода "конкурирующей фирмы" (с) Ося Бендер и выявить более интересные решения?
Как итог, было бы оптимально, получить один проект, но более гибкий, устойчивый и простой в реализации.

А>Только не помешало бы более подробное ТЗ, несколько типичных примеров использования, более точное описание формата входного текста.


Собственно использование планируется в интеграции Nemerle с VS (это, думаю, очевидно).
Отсюда и использование:
1. Вывод подсказок к членам классов и сслкам на них (методам, свойствам, полям и событиям).
2. Вывод подсказок к типам и ссылкам на них.
3. Вывод подсказок к различным участкам кода.
4. Вывод сообщений компилятора. В них так же встречаются описания (сигнатуры) методов и других элементов языка.

Загляни в редактор кода. Вот что-то подобное хотелось бы видеть в хинте. Наша задача — это в наиболее удобной форме дать информацию о коде. Скажем если у нас есть вызов функции:
func(x, y)

и пользователь подвел мышь к "func", то нам нужно вывести хинт описывающий:
1. Сигнатуру метода. В этой сигнатуре типы должны представляться односложными идентификаторами (без точек внутри), и каждый тип должен быть под-хинтом/ссылко показывающим полное имя типа (с указанием пространства имен и всех внешних типов), а ссылка долна позволять перейти к определению этого типа (или открыть некий более развернутый хинт.
2. Описание взятое из XML-документации (т.е. просто текст описывающий функцию, ее параметры и ее возвращаемое значение).
3. Список сообщений об ошибках, если таковые есть). Сообщения об ошибках могут быть иерархическими и так же могут содержать сингатуры методов (и т.п.) которые так же имеет смысл представлять в сжатом виде и встроенными под-подсказками.

А>В частности, есть непонятки с переносом текста, нужен ли для него отдельный тэг?


Мне кажется было бы удобнее использовать обычный конец строки (т.е. сочетание символов "\r\n", или отдельно "\n" или "\r"). А вот тег для выравнивания возможно был бы уместен. В прочем, для того чтобы ответить на этот вопрос нужно по-использовать ихнт на практике.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Небольшой фикс
От: VladD2 Российская Империя www.nemerle.org
Дата: 31.08.09 20:24
Оценка:
Здравствуйте, jenyavb, Вы писали:

J>Кстати, тут
Автор:
Дата: 31.08.09
ещё одна реализация появилась. Как теперь быть, что будешь выбирать?


Я видел.

Пока детально ни твой, ни его хинт не смотрел.

Вообще, хорошо было бы, если бы вы произвели код-ревью проектов друг-друга и подумали как создать один общий проект использующий хорошие идеи из обоих.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Кто может написать контрол - крутой хинт?
От: VladD2 Российская Империя www.nemerle.org
Дата: 31.08.09 20:45
Оценка:
Здравствуйте, Аноним, Вы писали:

А>В частности, есть непонятки с переносом текста, нужен ли для него отдельный тэг?


Подумал по-лучше...

Пожалуй, что нужно, но не просто тег говорящий, что вот тут нужно начать новый абзац, а нечто более сложное.

Смотри... У нас могут быть простые методы вроде:
SomeMethod(arg1 : string) : int

Если такой метод изображать перенесенным:
public SomeMethod(
  arg1 : string
) : int

то восприятие только ухудшится.
С другой стороны у нас могут быть вот такие методы:
public Nemerle.Compiler.Utils.Utils.MakeTextHintForTExprMethodRef(
  expr       : Nemerle.Compiler.Typedtree.TExpr,
  obj        : Nemerle.Compiler.Typedtree.TExpr,
  method     : Nemerle.Compiler.IMethod,
  typeArgs   : list[Nemerle.Compiler.TyVar],
  notvirtual : bool,
  ) : string

их как раз очень плохо отображать в одну строку:
public Nemerle.Compiler.Utils.Utils.MakeTextHintForTExprMethodRef(expr : Nemerle.Compiler.Typedtree.TExpr, obj : Nemerle.Compiler.Typedtree.TExpr, method : Nemerle.Compiler.IMethod, typeArgs : list[Nemerle.Compiler.TyVar],   notvirtual : bool) : string

Даже если сократить все тип:
public Utils.MakeTextHintForTExprMethodRef(expr : TExpr, obj : TExpr, method : IMethod, typeArgs : list[TyVar],   notvirtual : bool) : string

представление получается длинноватым.

Хорошо бы реализовать следующую фичу...

В некоторых тегах (например, в теге code), некоторые символы должны интерпретироваться как "мягкие" концы строк и как символы "табличного выравнивания". В примере выше символом мягкого конца
строки должна служить запятая, а символом табличного выравнивания двоеточие.
Реализация хинта должна попытаться втиснуть содержимое такого тега в область хинта. Если это удается, то никаких дополнительных действий производить не надо. Если — нет, то нужно добавить концы строк полсе каждой запятой и по табуляции перед каждым двоеточием.
В итоге код в хинте должен выглядить следующим образом:
public Utils.MakeTextHintForTExprMethodRef(
  expr       : TExpr,
  obj        : TExpr,
  method     : IMethod,
  typeArgs   : list[TyVar],
  notvirtual : bool,
  ) : string

естественно, что каждый тип должен быть под-хинтом, слова "public" и встроенные типы (bool и string в данном примере) подсвечены синим.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Кто может написать контрол - крутой хинт?
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.10.09 06:37
Оценка:
Здравствуйте, capgoat, Вы писали:

C>Надеюсь все еще актуально


Да, очень.

Открыл, попробовал...

1. Путь к проекту в солюшене и ссылке (в тестовом проекте) прописан не верно.
2. При прпытке открыть хинт вылетает исключение — NotSupportedException("text"), короче в хинте есть теги "text", но их парсинг не реализован.

C>Тут новая версия.

C>Основные изменения коснулись парсера.

C>Также реализована фича с автолейаутом параметров методов.


Можно подробнее?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: Кто может написать контрол - крутой хинт?
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.10.09 06:40
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>1. Путь к проекту в солюшене и ссылке (в тестовом проекте) прописан не верно.

VD>2. При прпытке открыть хинт вылетает исключение — NotSupportedException("text"), короче в хинте есть теги "text", но их парсинг не реализован.

Судя по всему ты прислал не ту версию тестового проекта. Кроме тега "text", еще происходит вылет на теге "hint".
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Кто может написать контрол - крутой хинт?
От: capgoat  
Дата: 12.10.09 07:59
Оценка:
Здравствуйте, VladD2, Вы писали:

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


VD>>1. Путь к проекту в солюшене и ссылке (в тестовом проекте) прописан не верно.

VD>>2. При прпытке открыть хинт вылетает исключение — NotSupportedException("text"), короче в хинте есть теги "text", но их парсинг не реализован.

VD>Судя по всему ты прислал не ту версию тестового проекта. Кроме тега "text", еще происходит вылет на теге "hint".


Действительно, тестовый проект старый.
Вот подправил.
А автолейаут, вкратце, работает так: задаем спец. ширину контрола (WrapWidth), если при построении контрола ширина превысит WrapWidth,
происходит новое пересторение, при к-м параметры методов располагаются вертикально.
Re[9]: Кто может написать контрол - крутой хинт?
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.10.09 11:40
Оценка:
Здравствуйте, capgoat, Вы писали:

C>Вот подправил.

C>А автолейаут, вкратце, работает так: задаем спец. ширину контрола (WrapWidth), если при построении контрола ширина превысит WrapWidth,
C>происходит новое пересторение, при к-м параметры методов располагаются вертикально.

Хорошо бы примерчик.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[9]: Кто может написать контрол - крутой хинт?
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.10.09 12:00
Оценка:
Здравствуйте, capgoat, Вы писали:

C>Действительно, тестовый проект старый.

C>Вот подправил.

На первый взгляд очень хорошо!

Что нужно сделать чтобы добавить отступы (мерджинг) по краям (чтобы текст не "прилипал" к краям)?
И как изменить размер шрифта используемый по умолчанию, а так же в режиме code/pre? А то шрифт несколько размытый получается и мелковатый.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[11]: Кто может написать контрол - крутой хинт?
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.10.09 16:47
Оценка:
Здравствуйте, capgoat, Вы писали:

C>Отступ можно наглядно контроллировать свойством Padding в Border элементе xaml файла.

C>Добавил тэг <font size, face, color>. Нужные блоки соответственно оборачиваем этим тэгом.
C>Файл

Здорово, но нужно именно дефолтный шрифт менять.

А то во вложенных хинтах шрифт слишком млекий. Не задавать же и для них шрифты явно каждый раз?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[9]: Кто может написать контрол - крутой хинт?
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.10.09 16:55
Оценка:
Здравствуйте, capgoat, Вы писали:


C>происходит новое пересторение, при к-м параметры методов располагаются вертикально.


Здорово!

Но есть вопросы...

1. Как распознаются параметры?
2. Заменил шрифт на боле большой (чтобы все перенеслось):
<code><pre><font size="20" face="Consolas"><keyword>internal </keyword><ref handler='GoToDef'>RunErrorOccured</ref>(loc : <ref handler='GoToTypeDef1' hint='Nemerle.Compiler.Location'>Location</ref>, msg : <span hint='System.String'>string</span>) : <keyword>void</keyword>,
</font>

парметры вроде бы как выравнялись по ":", но имена их стоят неровно. Получается примерно так:
internal RunErrorOccured(
  loc  : Location,
   msg : string
) : void,
...

т.е. loc и msg не выравнены.
Хоршо чтобы имена параметров тоже были бы выравнены по левому краю:
internal RunErrorOccured(
  loc : Location,
  msg : string
) : void,
...
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[12]: Кто может написать контрол - крутой хинт?
От: capgoat  
Дата: 12.10.09 18:19
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здорово, но нужно именно дефолтный шрифт менять.


VD>А то во вложенных хинтах шрифт слишком млекий. Не задавать же и для них шрифты явно каждый раз?


Ok, добавлю свойства FontFamily, FontSize, еще какие пожелания?

VD>1. Как распознаются параметры?


По шаблону регексом (см. ParamParser). Или нужно более подробное описание?

VD>2. Заменил шрифт на боле большой (чтобы все перенеслось):

VD>
VD><code><pre><font size="20" face="Consolas"><keyword>internal </keyword><ref handler='GoToDef'>RunErrorOccured</ref>(loc : <ref handler='GoToTypeDef1' hint='Nemerle.Compiler.Location'>Location</ref>, msg : <span hint='System.String'>string</span>) : <keyword>void</keyword>,
VD></font>
VD>

VD>парметры вроде бы как выравнялись по ":", но имена их стоят неровно. Получается примерно так:
VD>
VD>internal RunErrorOccured(
VD>  loc  : Location,
VD>   msg : string
VD>) : void,
VD>...
VD>

VD>т.е. loc и msg не выравнены.
VD>Хоршо чтобы имена параметров тоже были бы выравнены по левому краю:
VD>
VD>internal RunErrorOccured(
VD>  loc : Location,
VD>  msg : string
VD>) : void,
VD>...
VD>


Тут пробел перед msg сохранился, подумаю как это поправить.
Re[13]: Кто может написать контрол - крутой хинт?
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.10.09 19:29
Оценка:
Здравствуйте, capgoat, Вы писали:

VD>>А то во вложенных хинтах шрифт слишком млекий. Не задавать же и для них шрифты явно каждый раз?


C>Ok, добавлю свойства FontFamily, FontSize, еще какие пожелания?


Сделвай два набора свойств:
ProportionalFontFamily
ProportionalFontSize
и:
FixedFontFamily
FixedFontSize

Первое для обычных тегов, второе для code и pre.

VD>>1. Как распознаются параметры?


C>По шаблону регексом (см. ParamParser). Или нужно более подробное описание?


Можно задавать его тегами. Это не сложно.
Все равно остальне теги придется генерировать.
Что-то вроде:
<param attrs="[NotNull]" name="loc" typeShortName="Location" typeFullName="Nemerle.Compiler.Location">необязательное описание</param>


C>Тут пробел перед msg сохранился, подумаю как это поправить.


Лучше просто задавать параметры отдельными тегами. Одни плюс будут. И тебе проще, и формат стандартный, и если что изменить отображение не сложно, и регекспы не нужны (меньше ошибок, выше скорость).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[13]: Кто может написать контрол - крутой хинт?
От: VladD2 Российская Империя www.nemerle.org
Дата: 29.10.09 17:26
Оценка:
Здравствуйте, capgoat, Вы писали:

Ну, как там новой версии не появилось?

А то я хочу как раз приступить к переделке хинтов и соответственно залить твой проект в SVN.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[13]: Кто может написать контрол - крутой хинт?
От: VladD2 Российская Империя www.nemerle.org
Дата: 29.10.09 19:28
Оценка:
Здравствуйте, capgoat, Вы писали:

Посмотрел код парсинга...

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

Можно описать логику происходящего при парсинге? Что пытаешся получить? Как? Зачем?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[13]: Кто может написать контрол - крутой хинт?
От: VladD2 Российская Империя www.nemerle.org
Дата: 30.10.09 18:17
Оценка:
Здравствуйте, capgoat, Вы писали:

Добавил твой хинт в репозиторий немерла:
http://www.rsdn.ru/forum/prj.nemerle/3587213.1.aspx
Автор: VladD2
Дата: 30.10.09


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