DnD: не приходит DROP event
От: DemonS77  
Дата: 23.11.10 15:49
Оценка:
Добрый день!
Задача у меня стоит такая. Есть select, при перетаскивании в него options, value этого option нужно записать в std::set.
ПРоблема в том, что событие (DROP | SINKING) приходит и отлавливается, а событие DROP не приходит. А судя по описанию здесь именно его мне и надо ловить.
Что я делаю не так? Может, по-другому нужно?
Вот html:

<html>
<head>
<style>
select.source,
select.source2 
{
     width:*; height:10em;
}

select.source > option 
{
  draggable:only-copy;
} 

select.source2 > option 
{
  draggable:only-move;
} 

select > option:moving 
{
  opacity:.5;
  background:orange;
}

select > option:copying 
{
  opacity:.5;
  background:lime;
}

select.drop
{
  accept-drop: selector(select.source > option);
  outline-color: orange;
  border-color :orange;
}

select.drop.insert
{
  drop:insert;
}

 .trash
{
  accept-drop: selector(select.source2 > option); /* accept drop of items only from carts */ 
  drop: recycle; /* delete element on drop */
}

.drop:drag-over,
.trash:drag-over /* dragging operation is in effect and this element is the active target and dragged element is over this one */  
{
    border:solid 1px blue;
}
</style>
</head>
<body>
            <table border="0" cellspacing="0" cellpadding="0" width="100%">
                <tr>
                    <td><b>Общий список:</b></td><td><b>Выбранные опции:</b></td><td>Удалять здесь:</td>
                </tr>
                <tr>
                    <td>
                        <select id="IL_select" size=10 .source >
                            <option>Item 1</option>
                            <option>Item 2</option>
                        </select>
                       </td>
                    <td>
                        <select id="IL_nicks" size=10 .source2 .drop .insert >
                        </select>
                    </td>
                    <td width="50px" valign="top">
                        <img id="IL_trash" .trash src="recycle.png" />
                       </td>
                </tr>
            </table>
</body>
</html>


Реализация event_handler:
    struct IgnorListT : public htmlayout::event_handler
    {
        IgnorListT() : htmlayout::event_handler(HANDLE_MOUSE) 
        {
            htmlayout::dom::element     root = htmlayout::dom::root_element(hMainWnd);
            if (!root.is_valid())
                return;
            htmlayout::dom::element     nicks = root.get_element_by_id(L"IL_nicks");
            htmlayout::dom::element     trash = root.get_element_by_id(L"IL_trash");
            if (!nicks.is_valid() || !trash.is_valid())
                return;
            nicks.attach(this);
            trash.attach(this);
        };
        virtual int handle_mouse(HELEMENT he, MOUSE_PARAMS& params )
        {
            while (params.cmd == DROP)
            {
                htmlayout::dom::element     mHtmlRoot = htmlayout::dom::root_element(hMainWnd);
                htmlayout::dom::element     nicks = mHtmlRoot.get_element_by_id(L"IL_nicks");
                htmlayout::dom::element     trash = mHtmlRoot.get_element_by_id(L"IL_trash");
                htmlayout::dom::element    dropped = params.dragging;
                if (!nicks.is_valid() || !trash.is_valid() || !dropped.is_valid())
                    break;
                // получим имя элемента
                json::value        val = dropped.get_value();
                SexyString nick = aux::w2a(val.to_string().c_str()).operator const char*(); 
                htmlayout::dom::element    target = params.target;
                // если дропнуто в nicks - добавим имя в список
                if (target == nicks)
                {
                    mILNiks.insert(nick);
                }
                else
                    if (target == trash)
                    { // если дропнуто в корзину - удалим из списка
                        StringSetT::iterator it;
                        it = mILNiks.find(nick); // поищем значение
                        if (it != mILNiks.end())
                            mILNiks.erase(it); // найдено - удаляем
                    }
                    break;
            }
            return FALSE;
        }
        StringSetT    mILNiks; // тут список ников для игнора
    } IgnorList;
drag drop обработать
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.