View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0000182 | Wishes | Plugins API.Editor | public | 2006-05-15 04:40 | 2013-02-03 00:33 |
Reporter | vskirdin | Assigned To | |||
Priority | normal | Severity | feature | Reproducibility | always |
Status | new | Resolution | open | ||
Summary | 0000182: Флаги для Info.Editor | ||||
Description | Предлагаю вернуться к давнишней теме. Для Info.Editor ввести новые флаги (аля open()) - было это где-то в районе 1165-го патча :-) >Флаги Т.е. чтобы был вот такой набор (может быть комбинацией следующих значений): * EF_NONMODAL - Создать немодальное окно редактора. Если этот флаг присутствует, пользователь сможет переключаться между редактором и другими окнами FAR Manager. * EF_DELETEONCLOSE - Поручает FAR'у удалить редактируемый файл после закрытия редактора. Если в директории, содержащей редактируемый файл, нет других файлов, она также будет удалена. Файл не удаляется: если было произведено переключение по F6 и если существуют другие открытые вьюеры/редакторы с этим же файлом. если файл был сохранен из редактора. * EF_CREATENEW - Создать новый файл на диске. Вызов редактора с этим флагом аналогичен вызову редактора по Shift+F4 в панелях. * EF_ENABLE_F6 - Разрешает переключение по F6 из редактора во вьюер. * EF_DISABLEHISTORY - Запретить добавление имени файла в историю редактирования (Alt-F11). По умолчанию имя в историю добавляется. * EF_BREAKIFOPEN - Если файл FileName уже открыт, то Editor вернет EEC_ALREADY_EXISTS. * EF_USEEXISTING - Если файл FileName уже открыт, то Editor переключится на редактируемый файл и вернет код возврата EEC_OPENED_EXISTING. * EF_NEWIFOPEN - Файл FileName будет открыт для редактирования в новой копии редактора. В этом случае будьте внимательны: содержимое файла на диске будет соответствовать тому, в какой из копий редактора последний раз сохраняли этот файл. > Возвращаемое значение * EEC_OPEN_ERROR - Ошибка открытия файла. * EEC_MODIFIED - Успешное завершение. Файл был изменен. Editor так же возвращает этот код возврата при использовании флага EF_NONMODAL. * EEC_NOT_MODIFIED - Успешное завершение. Файл не был изменен. * EEC_LOADING_INTERRUPTED - Загрузка файла прервана пользователем. * EEC_OPENED_EXISTING - Произошло переключение в ранее открытый редактор (при указанном флаге EF_USEEXISTING). * EEC_ALREADY_EXISTS - Ошибка открытия файла. Файл FileName уже открыт (при указанном флаге EF_BREAKIFOPEN). * EEC_OPEN_NEWINSTANCE - Открыта новая копия редактора (для случая немодального вызова редактора или если пользователь нажал кнопку "New instance" в диалоге-предупреждении). * EEC_RELOAD - Редактируемый файл открыт заново (для случая немодального вызова редактора или если пользователь нажал кнопку "Reload" в диалоге-предупреждении). | ||||
Additional Information | Тестовый плагин #include "plugin.hpp" struct PluginStartupInfo Info; HANDLE WINAPI _export OpenPlugin(int OpenFrom, int Item) { struct PanelInfo PI; if(Info.Control(INVALID_HANDLE_VALUE,FCTL_GETPANELINFO,&PI) && PI.PanelType == PTYPE_FILEPANEL && !PI.Plugin && !(PI.PanelItems[PI.CurrentItem].FindData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)) { struct FarMenuItem MenuItems[13]; memset(MenuItems,0,sizeof(MenuItems)); strcpy(MenuItems[0].Text,"EF_ENABLE_F6|EF_NONMODAL"); MenuItems[1].Separator=1; strcpy(MenuItems[2].Text,"EF_ENABLE_F6|EF_NONMODAL|EF_USEEXISTING"); strcpy(MenuItems[3].Text,"EF_ENABLE_F6|EF_NONMODAL| EF_BREAKIFOPEN"); strcpy(MenuItems[4].Text,"EF_ENABLE_F6|EF_NONMODAL| EF_NEWIFOPEN"); MenuItems[5].Separator=1; strcpy(MenuItems[6].Text,"EF_ENABLE_F6| EF_USEEXISTING"); strcpy(MenuItems[7].Text,"EF_ENABLE_F6| EF_BREAKIFOPEN"); strcpy(MenuItems[8].Text,"EF_ENABLE_F6| EF_NEWIFOPEN"); MenuItems[9].Separator=1; strcpy(MenuItems[10].Text," EF_NONMODAL|EF_USEEXISTING"); strcpy(MenuItems[11].Text," EF_NONMODAL| EF_BREAKIFOPEN"); strcpy(MenuItems[12].Text," EF_NONMODAL| EF_NEWIFOPEN"); MenuItems[0].Selected=TRUE; int MenuCode=Info.Menu(Info.ModuleNumber,-1,- 1,0,FMENU_AUTOHIGHLIGHT|FMENU_WRAPMODE, "Editor",NULL, NULL,NULL,NULL, MenuItems, sizeof(MenuItems)/sizeof(MenuItems[0])); if (MenuCode<0) return(INVALID_HANDLE_VALUE); DWORD Flags=EF_DISABLEHISTORY; switch(MenuCode) { case 0: Flags|=EF_ENABLE_F6|EF_NONMODAL; break; case 2: Flags|=EF_ENABLE_F6|EF_NONMODAL|EF_USEEXISTING; break; case 3: Flags|=EF_ENABLE_F6|EF_NONMODAL|EF_BREAKIFOPEN; break; case 4: Flags|=EF_ENABLE_F6|EF_NONMODAL|EF_NEWIFOPEN; break; case 6: Flags|=EF_ENABLE_F6|EF_USEEXISTING; break; case 7: Flags|=EF_ENABLE_F6|EF_BREAKIFOPEN; break; case 8: Flags|=EF_ENABLE_F6|EF_NEWIFOPEN; break; case 10:Flags|=EF_NONMODAL|EF_USEEXISTING; break; case 11:Flags|=EF_NONMODAL|EF_BREAKIFOPEN; break; case 12:Flags|=EF_NONMODAL|EF_NEWIFOPEN; break; } int rc=Info.Editor(PI.PanelItems[PI.CurrentItem].FindData.cFileName, PI.PanelItems[PI.CurrentItem].FindData.cFileName, 0,0,-1,-1,Flags,-1,-1); char *Msg; char BBB[NM]=""; switch(rc) { case EEC_OPEN_ERROR: Msg="EEC_OPEN_ERROR"; break; case EEC_MODIFIED: Msg="EEC_MODIFIED"; break; case EEC_NOT_MODIFIED: Msg="EEC_NOT_MODIFIED"; break; case EEC_LOADING_INTERRUPTED: Msg="EEC_LOADING_INTERRUPTED"; break; case EEC_OPENED_EXISTING: Msg="EEC_OPENED_EXISTING"; break; case EEC_ALREADY_EXISTS: Msg="EEC_ALREADY_EXISTS"; break; case EEC_OPEN_NEWINSTANCE:Msg="EEC_OPEN_NEWINSTANCE"; break; case EEC_RELOAD:Msg="EEC_RELOAD"; break; default: wsprintf(BBB,"ExitCode=%d (0x%08X)",rc,rc); Msg=BBB; break; } const char *Msgs[4]; Msgs[0]=""; // заголовок сообщения Msgs[1]=PI.PanelItems[PI.CurrentItem].FindData.cFileName; // тело сообщения Msgs[2]=Msg; Msgs[3]="Ok"; // последние ButtonsNumber (2) строк - кнопки Info.Message(Info.ModuleNumber,0,NULL,Msgs,sizeof(Msg)/sizeof(Msg[0]),1); } return INVALID_HANDLE_VALUE; } void WINAPI _export GetPluginInfo(struct PluginInfo *Info) { Info->StructSize = sizeof(Info); static char *PluginMenuStrings[1] = {"Test Editor and Viewer"}; Info->PluginMenuStrings = PluginMenuStrings; Info->PluginMenuStringsNumber = sizeof(PluginMenuStrings) / sizeof(PluginMenuStrings[0]); } void WINAPI _export SetStartupInfo(const struct PluginStartupInfo *pInfo) { Info = *pInfo; } | ||||
Tags | No tags attached. | ||||
Build | |||||
|
Прошу учесть следующие предложения ( http://forum.farmanager.com/viewtopic.php?p=15092#15092 ): Skirda писал(а): EF_DELETEONCLOSE [...] Файл не удаляется: если было произведено переключение по F6 и если существуют другие открытые вьюеры/ редакторы с этим же файлом. если файл был сохранен из редактора. Предлагаю такие уточнения: 1. При отсутствии других просмотрщиков/ редакторов с этим же файлом: по F6 значение флага EF_DELETEONCLOSE должно переходить к новоявленному редактору/ просмотрщику. Т.е. чтобы последовательности F3 F6 Esc и F4 F6 Esc из, скажем, архива не приводили к отложению на диске временного файла. 2. При наличии других просмотрщиков/ редакторов с этим же файлом: будет ли файл удалён, должно определяться значением флага EF_DELETEONCLOSE у последнего из них по времени закрытия. Повторные просмотрщики/ редакторы должны получать значение этого флага как AND от его значений во всех уже открытых для этого файла просмотрщиков/ редакторов. Т.е. чтобы последовательность: открыли немодальный редактор из плагина | открыли его же во втором редакторе | закрыли первый редактор | закрыли второй редактор — не приводила к отложению на диске временного файла; а последовательность: открыли немодальный редактор из плагина | сохранили его по тому же (временному) пути | открыли его же ещё в 2 редакторах | закрыли все редакторы в порядке открытия — не приводила к удалению файла. 3. При сохранении файла под другим именем (по ShiftF2) всё должно происходить так, как будто редактор с временным файлом закрывается, а на его месте открывается новый со всеми теми же настройками (кроме EF_DELETEONCLOSE). Т.е. чтобы такая последовательность: открыли файл из архива | сохранили его под другим именем | вышли из редактора — не приводила к отложению на диске временного файла. Skirda писал(а): Возвращаемое значение Хорошо бы чётче сгруппировать успешные и ошибочные коды возврата. |
|
Предлагаю к списку флагов добавить EF_LOCKED - запретить модификацию редактируемого текста. |
|
тут как? |
|
да ХЗ, никто особо не проникся, так чта... |
Date Modified | Username | Field | Change |
---|---|---|---|
2006-05-15 04:40 | vskirdin | New Issue | |
2006-12-14 04:25 | vskirdin | Project | @13@ => Wishes |
2006-12-14 12:08 | HaRT | Note Added: 0000360 | |
2006-12-14 12:11 | HaRT | Note Edited: 0000360 | |
2007-02-13 10:21 | Nikolay | Note Added: 0000422 | |
2011-09-10 07:53 | samlyukov | Note Added: 0007644 | |
2011-09-12 05:45 | vskirdin | Note Added: 0007652 | |
2013-02-03 00:33 | alexy | Severity | minor => feature |