intptr_t WINAPI ProcessEditorInputW(const ProcessEditorInputInfo *InputInfo) { BOOL Result=FALSE; if (Opt.ProcessEditorInput) { if (InputInfo->Rec.EventType==KEY_EVENT && InputInfo->Rec.Event.KeyEvent.bKeyDown && inputrecord_compare(InputInfo->Rec,Opt.RecKey)) { Info.EditorControl(-1,ECTL_GETINFO,0,&ei); wchar_t *FileName=GetEditorFileName(); if (IsHlf() || (Opt.CheckMaskFile && CheckExtension(FileName))) { if (ShowCurrentHelpTopic()) Result=TRUE; } if (FileName) delete[] FileName; } } return Result; }
HANDLE WINAPI OpenW(const struct OpenInfo *OInfo) { if (OInfo->OpenFrom==OPEN_COMMANDLINE) { const wchar_t* cmd=((OpenCommandLineInfo*)OInfo->Data)->CommandLine; if (lstrlen(cmd)) { static wchar_t cmdbuf[1024], FileName[MAX_PATH], *ptrTopic, *ptrName; lstrcpyn(cmdbuf,cmd,ARRAYSIZE(cmdbuf)); FSF.Trim(cmdbuf); ptrName=ptrTopic=cmdbuf; if (*cmdbuf==L'\"') { ptrName++; ptrTopic++; while (*ptrTopic!=L'\"' && *ptrTopic) ptrTopic++; } else { while (*ptrTopic!=L' ' && *ptrTopic) ptrTopic++; } int hasTopic = (*ptrTopic == L' '); *ptrTopic=0; wchar_t *ptrCurDir=NULL; if (FSF.PointToName(ptrName) == ptrName) { size_t Size=FSF.GetCurrentDirectory(0,NULL); if (Size) { ptrCurDir=new WCHAR[Size+lstrlen(ptrName)+8]; FSF.GetCurrentDirectory(Size,ptrCurDir); lstrcat(ptrCurDir,L"\\"); lstrcat(ptrCurDir,ptrName); ptrName=(wchar_t *)ptrCurDir; } } GetFullPathName(ptrName,MAX_PATH,FileName,&ptrName); if (ptrCurDir) delete[] ptrCurDir; if (hasTopic) { ptrTopic++; if (lstrlen(ptrTopic)) FSF.Trim(ptrTopic); else ptrTopic=NULL; } else { ptrTopic = NULL; } ShowHelp(FileName,ptrTopic,true); } else { Info.ShowHelp(Info.ModuleName,L"cmd",FHELP_SELFHELP); } } else if (OInfo->OpenFrom == OPEN_EDITOR) { if (IsHlf()) { ShowCurrentHelpTopic(); } else { const wchar_t *Items[] = { GetMsg(MTitle), GetMsg(MNotAnHLF), GetMsg(MOk) }; Info.Message(&MainGuid, nullptr, 0, NULL, Items, ARRAYSIZE(Items), 1); } } return nullptr; }
HANDLE WINAPI OpenW(const struct OpenInfo *OInfo) { if (OInfo->OpenFrom == OPEN_EDITOR || OInfo->OpenFrom==OPEN_FROMMACRO) { HANDLE MacroResult=nullptr; // в редакторе проверяем файл на принадлежность к системе помощи Far Manager if (IsHlf()) { if (ShowCurrentHelpTopic()) MacroResult=INVALID_HANDLE_VALUE; } else if (OInfo->OpenFrom!=OPEN_FROMMACRO) { const wchar_t *Items[] = { GetMsg(MTitle), GetMsg(MNotAnHLF), GetMsg(MOk) }; Info.Message(&MainGuid, nullptr, 0, NULL, Items, ARRAYSIZE(Items), 1); } return (OInfo->OpenFrom==OPEN_FROMMACRO)?MacroResult:nullptr; } if (OInfo->OpenFrom==OPEN_COMMANDLINE) { static wchar_t cmdbuf[1024], FileName[MAX_PATH], *ptrTopic, *ptrName; // разбор "параметров ком.строки" lstrcpyn(cmdbuf,((OpenCommandLineInfo*)OInfo->Data)->CommandLine,ARRAYSIZE(cmdbuf)); if (cmdbuf[0]) { FSF.Trim(cmdbuf); ptrName=ptrTopic=cmdbuf; if (*cmdbuf==L'\"') { ptrName++; ptrTopic++; while (*ptrTopic!=L'\"' && *ptrTopic) ptrTopic++; } else { while (*ptrTopic!=L' ' && *ptrTopic) ptrTopic++; } int hasTopic = (*ptrTopic == L' '); *ptrTopic=0; if (hasTopic) { ptrTopic++; if (*ptrTopic == L'@') ptrTopic++; if (lstrlen(ptrTopic)) FSF.Trim(ptrTopic); else ptrTopic=NULL; } else { if (*ptrName == L'@') { ptrTopic=ptrName+1; FSF.Trim(ptrTopic); ptrName=NULL; } else ptrTopic = NULL; } wchar_t *ptrCurDir=NULL; // Здесь: ptrName - тмя файла/GUID, ptrTopic - имя темы // показ темы помощи по GUID`у GUID FindGuid; bool guidMode=StrToGuid(ptrName,&FindGuid); if (!guidMode && *ptrName == L'{') { ptrName++; wchar_t *ptrNameEnd=ptrName+lstrlen(ptrName)-1; if (*ptrNameEnd == L'}') *ptrNameEnd=0; guidMode=StrToGuid(ptrName,&FindGuid); } if (guidMode) Info.ShowHelp((const wchar_t*)&FindGuid,ptrTopic,FHELP_GUID); // по GUID`у не найдено, пробуем имя файла if (!guidMode) { wchar_t TempFileName[MAX_PATH*2]; wchar_t ExpFileName[MAX_PATH*2]; lstrcpyn(TempFileName,ptrName,ARRAYSIZE(TempFileName)); // Если имя файла без пути... if (FSF.PointToName(ptrName) == ptrName) { // ...смотрим в текущем каталоге size_t Size=FSF.GetCurrentDirectory(0,NULL); if (Size) { ptrCurDir=new WCHAR[Size+lstrlen(ptrName)+8]; FSF.GetCurrentDirectory(Size,ptrCurDir); lstrcat(ptrCurDir,L"\\"); lstrcat(ptrCurDir,ptrName); if (FileExists(ptrCurDir)) ptrName=(wchar_t *)ptrCurDir; } // ...в текущем нет... if (FSF.PointToName(ptrName) == ptrName) { // ...смотрим в %FARHOME% ExpandEnvironmentStrings(L"%FARHOME%",ExpFileName,ARRAYSIZE(ExpFileName)); FSF.AddEndSlash(ExpFileName); lstrcat(ExpFileName,ptrName); if (!FileExists(ExpFileName)) { // ...в %FARHOME% нет, поищем по путям плагинов. if (FindPluginHelp(ptrName,ExpFileName)) ptrName=ExpFileName; } else ptrName=ExpFileName; } } else { // ptrName указан с путём. ExpandEnvironmentStrings(ptrName,ExpFileName,ARRAYSIZE(ExpFileName)); ptrName=ExpFileName; } GetFullPathName(ptrName,MAX_PATH,FileName,&ptrName); if (ptrCurDir) delete[] ptrCurDir; if (!ShowHelp(FileName,ptrTopic,true,(!ptrTopic || !*ptrTopic?false:true))) { // синтаксис hlf:topic_из_ФАР_хелпа ==> TempFileName Info.ShowHelp(nullptr,TempFileName,FHELP_FARHELP); } } } else { // параметры не указаны, выводим подсказку по использованию плагина. Info.ShowHelp(Info.ModuleName,L"cmd",FHELP_SELFHELP); } } return nullptr; }