View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0001882 | Far Manager | Plugins API | public | 2011-09-15 12:09 | 2011-12-23 11:10 |
Reporter | max rusov | Assigned To | vskirdin | ||
Priority | normal | Severity | minor | Reproducibility | have not tried |
Status | closed | Resolution | fixed | ||
Fixed in Version | 3.0 | ||||
Summary | 0001882: Разрешить "перехват" макрофункций Dlg.GetValue и ItemCount/CurPos в диалогах. | ||||
Description | По мотивам топика http://forum.farmanager.com/viewtopic.php?f=8&t=6633 Исходная задача: Во многих плагинах используется элемент диалога типа UserControl, который представляет собой суть список или таблицу разной степени навороченности. Делается это, отчасти, по причине бедности возможностей стандартного LISTBOX, но сейчас - не о том. Такой элемент, внешне выглядя как обычный список, никак не поддается автоматизации с помощью макросов, потому что в нем не работают макрофункции ItemCount/CurPos. Предлагаю устранить этот недостаток Предлагаю: 1. В макрофункцию Dlg.GetValue добавить Type=11, при котором для контролов ListBox / ComboBox будет возвращаться количество элементов списка. 2. Добавить код нотификации DN_GETVALUE, который макродвижек будет посылать диалогу, при вызове макрофункций Dlg.GetValue и ItemCount, CurPos (в контексте диалога). При этом: Param1 - содержит ID контрола Param2 - содержит указатель на структуру, приблизительно такую: TFarGetValue = record GetType :Integer; // Что запрашивается, соответствует параметру Type марофункции dlg.getvalue ResType :Integer; // Тип результата Result :Pointer; // Результат end; 3. Стандартный обработчик диалога заполняет эту структуру, в соответствии с правилами, описанными в документации на dlg.getvalue: http://api.farmanager.com/ru2/macro/macrocmd/prop_func/dialog.html, а у разработчика плагинов появляется возможность перекрыть нотификацию и возвращать что-то свое. В первую очередь - это позволит CustomControl'у "притворяться" обычным списком. Кроме того, появляется возможность запрашивать у диалога/контролов дополнительные данные, предусмотренные автором плагина. Для этого предлагается разрешить передавать в dlg.getvalue произвольное значение Type, выделив для "прикладных" запросов диапазон адресов, например > 100. | ||||
Tags | No tags attached. | ||||
Build | 2220 | ||||
|
Может имеет смысл DN_GETVALUE посылать только для UserControl? Зачем менять инфу у стандартных элементов? |
|
наверное структуру лучше такую: struct TFarGetValue { int GetType; FarMacroValue Val; }; enum FARMACROVARTYPE { FMVT_UNKNOWN = -1, FMVT_INTEGER = 0, FMVT_STRING = 1, FMVT_DOUBLE = 2, }; struct FarMacroValue { FARMACROVARTYPE type; union { __int64 i; double d; const wchar_t *s; } #ifndef __cplusplus Value #endif ; }; |
|
>Может имеет смысл DN_GETVALUE посылать только для UserControl? >Зачем менять инфу у стандартных элементов? Я бы слал всегда, для общности. Хуже/сложнее от этого не будет, а дополнительная гибкость появляется. Например, можно запрашивать доп. инф-ю у всего диалога, при Pos=0... > наверное структуру лучше такую: Ну, раз теперь есть FarMacroValue, то, конечно, лучше. |
|
Если в getvalue понятно, то что делать с ItemCount, CurPos в части: GetType :Integer; // Что запрашивается, соответствует параметру Type |
|
пробуй (только в части гетвалюе) http://skirda-file.googlecode.com/files/m0001882.zip Здесь msg = DN_GETVALUE (=4118) Param1 = номер элемента диалога Param2 = TFarGetValue* - заполненные Return: 0 - макродвиг игнорирует 1 - в Param2 модифицированные данные - макродвиг берет эти данные |
|
> Если в getvalue понятно, то что делать с ItemCount, CurPos в части: Предлагалось: > 1. В макрофункцию Dlg.GetValue добавить Type=11, при котором для контролов ListBox / ComboBox будет возвращаться количество элементов списка. Тогда: CurPos шлет DN_GETVALUE c Type = 7 ItemCount - Type = 11 Не очень красиво, возможно, но ничего лучше не придумалось. |
|
понял. кстати, Type = 11 есть в тестовом билде |
|
build 2199 |
|
Пробую 2199 на UserControl. Макрос: msgbox("message",dlg.getvalue(1,11)) Почему-то Param1 передаётся в DN_GETVALUE как 0. Ноль ведь зарезервирован для самого диалога, а элементы должны указываться, начиная с единицы, не так? |
|
поправки, должно быть переделано в контексте всего фар-апи: struct TFarGetValue -> FarGetValue FARMACROVARTYPE type -> Type union { __int64 i; -> I double d; -> D const wchar_t *s; -> S } |
|
0 для диалога - это в макросах. не путай внутреннюю кухню, которая с нуля начинается и внешнюю, для юзеров, где нумерация с 1 начинается. |
|
А тогда DN_GETVALUE для диалога будет как? -1? Или вообще не посылается? |
|
не посылается, а что ты хочешь видеть от "диалога" для type == 11? |
|
> появляется возможность запрашивать у диалога/контролов дополнительные данные, > предусмотренные автором плагина. Для этого предлагается разрешить передавать в > dlg.getvalue произвольное значение Type, выделив для "прикладных" запросов > диапазон адресов, например > 100. Я не настаиваю, просто мне кажется это может оказаться полезным. Хотя конкретных usecase'ов у меня сейчас нет... |
|
Протестировал, вроде все работает, спасибо. Поддержал пока только в бете MacroLib'а. |
|
Вот так прет: Если Index > DlgItemCount (DlgItemCount получаем через dlggetvalueFunc(0,0) и прибавляем 1 и дальше), тогда dlggetvalueFunc просто делает send диалогу и возвращает в макрос то, что вернул плагин. ы? |
|
добавка. Если Index==-1 - то это про диалог, тогда если TypeInf >=0 && TypeInf <= 6 то в диалоговую процедуру передается ровно то, что заявленов доке, иначе {FMVT_UNKNOWN, 0}. Если (текущая область не диалог) или (Index < DlgItemCount и произошла внутренняя ошибка), то плагин не получит DN_GETVALUE. |
|
build 2220 условия описаны в changelog |
Date Modified | Username | Field | Change |
---|---|---|---|
2011-09-15 12:09 | max rusov | New Issue | |
2011-09-16 12:11 | vskirdin | Note Added: 0007704 | |
2011-09-16 12:24 | vskirdin | Note Added: 0007705 | |
2011-09-16 12:35 | max rusov | Note Added: 0007706 | |
2011-09-16 12:39 | max rusov | Note Edited: 0007706 | |
2011-09-16 13:01 | vskirdin | Note Added: 0007707 | |
2011-09-16 13:17 | vskirdin | Note Added: 0007708 | |
2011-09-16 13:30 | max rusov | Note Added: 0007709 | |
2011-09-16 17:05 | vskirdin | Note Added: 0007711 | |
2011-09-19 07:12 | vskirdin | Note Added: 0007713 | |
2011-09-19 07:12 | vskirdin | Assigned To | => vskirdin |
2011-09-19 07:12 | vskirdin | Status | new => feedback |
2011-09-20 08:28 | shmuel | Note Added: 0007715 | |
2011-09-20 09:46 | shmuel | Note Edited: 0007715 | |
2011-09-20 14:59 | samlyukov | Note Added: 0007716 | |
2011-09-21 08:25 | vskirdin | Note Added: 0007717 | |
2011-09-21 08:27 | max rusov | Note Added: 0007718 | |
2011-09-21 08:27 | max rusov | Status | feedback => assigned |
2011-09-21 09:05 | vskirdin | Note Added: 0007719 | |
2011-09-21 09:13 | max rusov | Note Added: 0007720 | |
2011-09-26 23:03 | max rusov | Note Added: 0007750 | |
2011-10-13 14:30 | vskirdin | Note Added: 0007875 | |
2011-10-13 14:43 | vskirdin | Note Added: 0007876 | |
2011-10-13 15:08 | vskirdin | Note Added: 0007879 | |
2011-10-13 15:08 | vskirdin | Status | assigned => feedback |
2011-12-23 11:10 | alexy | Build | => 2220 |
2011-12-23 11:10 | alexy | Status | feedback => closed |
2011-12-23 11:10 | alexy | Resolution | open => fixed |
2011-12-23 11:10 | alexy | Fixed in Version | => 3.0 |