View Issue Details

IDProjectCategoryView StatusLast Update
0000182WishesPlugins API.Editorpublic2013-02-03 00:33
Reportervskirdin Assigned To 
PrioritynormalSeverityfeatureReproducibilityalways
Status newResolutionopen 
Summary0000182: Флаги для 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;
}
TagsNo tags attached.
Build

Activities

HaRT

2006-12-14 12:08

reporter   bugnote:0000360

Last edited: 2006-12-14 12:11

Прошу учесть следующие предложения ( 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 писал(а):
 Возвращаемое значение

Хорошо бы чётче сгруппировать успешные и ошибочные коды возврата.

Nikolay

2007-02-13 10:21

reporter   bugnote:0000422

Предлагаю к списку флагов добавить EF_LOCKED - запретить модификацию редактируемого текста.

samlyukov

2011-09-10 08:53

reporter   bugnote:0007644

тут как?

vskirdin

2011-09-12 06:45

administrator   bugnote:0007652

да ХЗ, никто особо не проникся, так чта...

Issue History

Date Modified Username Field Change
2006-05-15 05: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 08:53 samlyukov Note Added: 0007644
2011-09-12 06:45 vskirdin Note Added: 0007652
2013-02-03 00:33 alexy Severity minor => feature