static int MainProcess( const wchar_t *lpwszEditName, const wchar_t *lpwszViewName, const wchar_t *lpwszDestName1, const wchar_t *lpwszDestName2, int StartLine, int StartChar ) { { ChangePriority ChPriority(ChangePriority::NORMAL); ControlObject CtrlObj; WORD InitAttributes=0; Console.GetTextAttributes(InitAttributes); SetRealColor(COL_COMMANDLINEUSERSCREEN); if (*lpwszEditName || *lpwszViewName) { Opt.OnlyEditorViewerUsed=1; Panel *DummyPanel=new Panel; _tran(SysLog(L"create dummy panels")); CtrlObj.CreateFilePanels(); CtrlObj.Cp()->LeftPanel=CtrlObj.Cp()->RightPanel=CtrlObj.Cp()->ActivePanel=DummyPanel; CtrlObj.Plugins.LoadPlugins(); CtrlObj.Macro.LoadMacros(TRUE,FALSE); if (*lpwszEditName) { FileEditor *ShellEditor=new FileEditor(lpwszEditName,CP_AUTODETECT,FFILEEDIT_CANNEWFILE|FFILEEDIT_ENABLEF6,StartLine,StartChar); _tran(SysLog(L"make shelleditor %p",ShellEditor)); if (!ShellEditor->GetExitCode()) // ???????????? { FrameManager->ExitMainLoop(0); } } // TODO: Этот else убрать только после разборок с возможностью задавать несколько /e и /v в ком.строке else if (*lpwszViewName) { FileViewer *ShellViewer=new FileViewer(lpwszViewName,FALSE); if (!ShellViewer->GetExitCode()) { FrameManager->ExitMainLoop(0); } _tran(SysLog(L"make shellviewer, %p",ShellViewer)); } FrameManager->EnterMainLoop(); CtrlObj.Cp()->LeftPanel=CtrlObj.Cp()->RightPanel=CtrlObj.Cp()->ActivePanel=nullptr; delete DummyPanel; _tran(SysLog(L"editor/viewer closed, delete dummy panels")); } else { Opt.OnlyEditorViewerUsed=0; Opt.SetupArgv=0; FARString strPath; // воспользуемся тем, что ControlObject::Init() создает панели // юзая Opt.* if (*lpwszDestName1) // актиная панель { Opt.SetupArgv++; strPath = lpwszDestName1; CutToNameUNC(strPath); DeleteEndSlash(strPath); //BUGBUG!! если конечный слешь не убрать - получаем забавный эффект - отсутствует ".." // if ((strPath.At(1)==L':' && !strPath.At(2)) || (HasPathPrefix(strPath) && strPath.At(5)==L':' && !strPath.At(6))) // AddEndSlash(strPath); // Та панель, которая имеет фокус - активна (начнем по традиции с Левой Панели ;-) if (Opt.LeftPanel.Focus) { Opt.LeftPanel.Type=FILE_PANEL; // сменим моду панели Opt.LeftPanel.Visible=TRUE; // и включим ее Opt.strLeftFolder = strPath; } else { Opt.RightPanel.Type=FILE_PANEL; Opt.RightPanel.Visible=TRUE; Opt.strRightFolder = strPath; } if (*lpwszDestName2) // пассивная панель { Opt.SetupArgv++; strPath = lpwszDestName2; CutToNameUNC(strPath); DeleteEndSlash(strPath); //BUGBUG!! если конечный слешь не убрать - получаем забавный эффект - отсутствует ".." // if ((strPath.At(1)==L':' && !strPath.At(2)) || (HasPathPrefix(strPath) && strPath.At(5)==L':' && !strPath.At(6))) // AddEndSlash(strPath); // а здесь с точнотью наоборот - обрабатываем пассивную панель if (Opt.LeftPanel.Focus) { Opt.RightPanel.Type=FILE_PANEL; // сменим моду панели Opt.RightPanel.Visible=TRUE; // и включим ее Opt.strRightFolder = strPath; } else { Opt.LeftPanel.Type=FILE_PANEL; Opt.LeftPanel.Visible=TRUE; Opt.strLeftFolder = strPath; } } } // теперь все готово - создаем панели! CtrlObj.Init(); // а теперь "провалимся" в каталог или хост-файл (если получится ;-) if (*lpwszDestName1) // актиная панель { FARString strCurDir; Panel *ActivePanel=CtrlObject->Cp()->ActivePanel; Panel *AnotherPanel=CtrlObject->Cp()->GetAnotherPanel(ActivePanel); if (*lpwszDestName2) // пассивная панель { AnotherPanel->GetCurDir(strCurDir); FarChDir(strCurDir); if (IsPluginPrefixPath(lpwszDestName2)) { AnotherPanel->SetFocus(); CtrlObject->CmdLine->ExecString(lpwszDestName2,0); ActivePanel->SetFocus(); } else { strPath = PointToNameUNC(lpwszDestName2); if (!strPath.IsEmpty()) { if (AnotherPanel->GoToFile(strPath)) AnotherPanel->ProcessKey(KEY_CTRLPGDN); } } } ActivePanel->GetCurDir(strCurDir); FarChDir(strCurDir); if (IsPluginPrefixPath(lpwszDestName1)) { CtrlObject->CmdLine->ExecString(lpwszDestName1,0); } else { strPath = PointToNameUNC(lpwszDestName1); if (!strPath.IsEmpty()) { if (ActivePanel->GoToFile(strPath)) ActivePanel->ProcessKey(KEY_CTRLPGDN); } } // !!! ВНИМАНИЕ !!! // Сначала редравим пассивную панель, а потом активную! AnotherPanel->Redraw(); ActivePanel->Redraw(); } FrameManager->EnterMainLoop(); } // очистим за собой! SetScreen(0,0,ScrX,ScrY,L' ',COL_COMMANDLINEUSERSCREEN); Console.SetTextAttributes(InitAttributes); ScrBuf.ResetShadow(); ScrBuf.Flush(); MoveRealCursor(0,0); } CloseConsole(); return 0; }
static int MainProcess( const string& EditName, const string& ViewName, const string& DestName1, const string& DestName2, int StartLine, int StartChar ) { SCOPED_ACTION(ChangePriority)(THREAD_PRIORITY_NORMAL); FarColor InitAttributes={}; console.GetTextAttributes(InitAttributes); SetRealColor(colors::PaletteColorToFarColor(COL_COMMANDLINEUSERSCREEN)); string ename(EditName),vname(ViewName), apanel(DestName1),ppanel(DestName2); if (ConfigProvider().ShowProblems()) { ename.clear(); vname.clear(); StartLine = StartChar = -1; apanel = Global->Opt->ProfilePath; ppanel = Global->Opt->LocalProfilePath; } if (!ename.empty() || !vname.empty()) { Global->OnlyEditorViewerUsed = true; _tran(SysLog(L"create dummy panels")); Global->CtrlObject->CreateDummyFilePanels(); Global->WindowManager->PluginCommit(); Global->CtrlObject->Plugins->LoadPlugins(); Global->CtrlObject->Macro.LoadMacros(true, true); if (!ename.empty()) { const auto ShellEditor = FileEditor::create(ename, CP_DEFAULT, FFILEEDIT_CANNEWFILE | FFILEEDIT_ENABLEF6, StartLine, StartChar); _tran(SysLog(L"make shelleditor %p",ShellEditor)); if (!ShellEditor->GetExitCode()) // ???????????? { Global->WindowManager->ExitMainLoop(0); } } // TODO: Этот else убрать только после разборок с возможностью задавать несколько /e и /v в ком.строке else if (!vname.empty()) { const auto ShellViewer = FileViewer::create(vname, true); if (!ShellViewer->GetExitCode()) { Global->WindowManager->ExitMainLoop(0); } _tran(SysLog(L"make shellviewer, %p",ShellViewer)); } Global->WindowManager->EnterMainLoop(); } else { int DirCount=0; // воспользуемся тем, что ControlObject::Init() создает панели // юзая Global->Opt->* const auto& SetupPanel = [&](bool active) { ++DirCount; string strPath = active? apanel : ppanel; if (os::fs::is_file(strPath)) { CutToParent(strPath); } bool Root = false; const auto Type = ParsePath(strPath, nullptr, &Root); if(Root && (Type == root_type::drive_letter || Type == root_type::unc_drive_letter || Type == root_type::volume)) { AddEndSlash(strPath); } auto& CurrentPanelOptions = (Global->Opt->LeftFocus == active)? Global->Opt->LeftPanel : Global->Opt->RightPanel; CurrentPanelOptions.m_Type = static_cast<int>(panel_type::FILE_PANEL); // сменим моду панели CurrentPanelOptions.Visible = true; // и включим ее CurrentPanelOptions.Folder = strPath; }; if (!apanel.empty()) { SetupPanel(true); if (!ppanel.empty()) { SetupPanel(false); } } // теперь все готово - создаем панели! Global->CtrlObject->Init(DirCount); // а теперь "провалимся" в каталог или хост-файл (если получится ;-) if (!apanel.empty()) // активная панель { const auto ActivePanel = Global->CtrlObject->Cp()->ActivePanel(); const auto AnotherPanel = Global->CtrlObject->Cp()->PassivePanel(); if (!ppanel.empty()) // пассивная панель { FarChDir(AnotherPanel->GetCurDir()); if (IsPluginPrefixPath(ppanel)) { AnotherPanel->Parent()->SetActivePanel(AnotherPanel); execute_info Info; Info.Command = ppanel; Global->CtrlObject->CmdLine()->ExecString(Info); ActivePanel->Parent()->SetActivePanel(ActivePanel); } else { const auto strPath = PointToName(ppanel); if (!strPath.empty()) { if (AnotherPanel->GoToFile(strPath)) AnotherPanel->ProcessKey(Manager::Key(KEY_CTRLPGDN)); } } } FarChDir(ActivePanel->GetCurDir()); if (IsPluginPrefixPath(apanel)) { execute_info Info; Info.Command = apanel; Global->CtrlObject->CmdLine()->ExecString(Info); } else { const auto strPath = PointToName(apanel); if (!strPath.empty()) { if (ActivePanel->GoToFile(strPath)) ActivePanel->ProcessKey(Manager::Key(KEY_CTRLPGDN)); } } // !!! ВНИМАНИЕ !!! // Сначала редравим пассивную панель, а потом активную! AnotherPanel->Redraw(); ActivePanel->Redraw(); } Global->WindowManager->EnterMainLoop(); } TreeList::FlushCache(); // очистим за собой! SetScreen(0,0,ScrX,ScrY,L' ',colors::PaletteColorToFarColor(COL_COMMANDLINEUSERSCREEN)); console.SetTextAttributes(InitAttributes); Global->ScrBuf->ResetLockCount(); Global->ScrBuf->Flush(); return 0; }