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[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[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>Кстати, логично было бы предусмотреть маленькую кнопку (в углу хинта) навигации назад (так чтобы она была видна если задан некий флаг).

Сделаю...
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.