void cIncEnsembleCamera::OptLineaireOnDirL2 ( std::list<cIncSetLiaison *> * aListSL, const std::vector<cFonctrPond> & aFoncAux // bool CalcMatr ) { mListSl = aListSL; mFoncsAux = aFoncAux; SetOpt(); /* if (CalcMatr) { ResetEquation(); ScoreCurGen(true,true); } */ Im1D_REAL8 anIm = mSys->GSSR_Solve((bool *)0); SetImState0(); SetCurDir(anIm.data()); cIEC_OptimCurDir anOpti(*this); REAL aLambda = anOpti.Optim(0,1); SetLambda(aLambda); }
void on_exit() { if (curdir[0] != 0) /* Originally at root? */ SetCurDir(curdir); /* Change to original dir. */ } /* end on_exit. */
/*************************************** FileEnum ***************************************/ BOOL MYRTLEXP FILE_ENUM::OpenDir( CONSTSTR path ) { if ( !path ) path = ""; oldDir = GetCurDir(); if ( !SetCurDir(path) ) { SetCurDir( oldDir.Text() ); return FALSE; } Path = GetCurDir(); SetCurDir( oldDir.Text() ); #if defined(__GNUC__) || defined(__QNX__) dir = opendir( Path.Text() ); if ( dir == NULL || (ent=readdir(dir)) == NULL ) return FALSE; FPath = Path; FPath.Add( ent->d_name ); #else #if defined(__REALDOS__) || defined(__HWIN16__) MemSet( &f,0,sizeof(f) ); if ( findfirst( MakePathName(path,ALL_FILES).Text(),&f,FIO_ALLFILES ) != 0 ) return FALSE; FPath = Path+f.ff_name; #else #if defined(__PROTDOS__) MemSet( &f,0,sizeof(f) ); FIND *res; if ( (res=findfirst( MakePathName(path,ALL_FILES).Text(),FIO_ALLFILES )) == NULL ) return FALSE; f = *res; FPath = Path+f.name; #else #if defined(__HWIN__) fHandle = FindFirstFile( MakePathName(path,ALL_FILES).Text(),&f ); if ( fHandle == INVALID_HANDLE_VALUE ) return FALSE; FPath = Path; FPath.Add( f.cFileName ); #else #error ERR_PLATFORM #endif #endif #endif #endif return TRUE; }
MyString MYRTLEXP MakeFullPathName( const MyString& fname, const MyString& base ) { MyString oldP,s; if ( fname.Chr(SLASH_CHAR) == -1 ) { s.Set( base ); s.Add( SLASH_CHAR ); s.Add( fname ); return s; } oldP = GetCurDir(); //Go base path SetCurDir( base.Text() ); //Go fname path in case it relative SetCurDir( FPath(fname.Text()) ); //Get result path + name s.Set( GetCurDir() ); s.Add( FName(fname.Text()) ); SetCurDir( oldP.Text() ); return s; }
void FileList::ProcessPluginCommand() { _ALGO(CleverSysLog clv(L"FileList::ProcessPluginCommand")); _ALGO(SysLog(L"PanelMode=%s",(PanelMode==PLUGIN_PANEL?"PLUGIN_PANEL":"NORMAL_PANEL"))); int Command=PluginCommand; PluginCommand=-1; if (PanelMode==PLUGIN_PANEL) switch (Command) { case FCTL_CLOSEPANEL: _ALGO(SysLog(L"Command=FCTL_CLOSEPANEL")); SetCurDir(strPluginParam,TRUE); if (strPluginParam.IsEmpty()) Update(UPDATE_KEEP_SELECTION); Redraw(); break; } }
bool FileSelectorLoad(HWND hwnd, char *filename, FileType type, char* title) { char *filter=GetFilter(type); static OPENFILENAME dia; dia.lStructSize = sizeof(OPENFILENAME); dia.hwndOwner = hwnd; dia.lpstrFile = g_chosen_filename[type]; dia.nMaxFile = _MAX_DIR; dia.lpstrFileTitle = g_chosen_file[type]; dia.nMaxFileTitle = _MAX_FNAME; dia.lpstrInitialDir = GetCurDir(type); dia.lpstrFilter = filter; dia.lpstrDefExt = fsel_defext; dia.lpstrTitle = title; dia.Flags = OFN_EXPLORER | OFN_PATHMUSTEXIST; if(!GetOpenFileName(&dia)) return false; strcpy(filename, g_chosen_filename[type]); SetCurDir(type, g_chosen_filename[type]); return true; }
bool FileSelectorSave(HWND hwnd, char *filename, int type) { char *filter=GetFilter(type); static OPENFILENAME dia; dia.lStructSize = sizeof(OPENFILENAME); dia.hwndOwner = hwnd; dia.lpstrFile = chosen_filename[type]; dia.nMaxFile = _MAX_DIR; dia.lpstrFileTitle = chosen_file[type]; dia.nMaxFileTitle = _MAX_FNAME; dia.lpstrInitialDir = GetCurDir(type); dia.lpstrFilter = filter; dia.lpstrDefExt = fsel_defext; dia.lpstrTitle = "Save As"; dia.Flags = OFN_EXPLORER | OFN_OVERWRITEPROMPT; if(!GetSaveFileName(&dia)) return false; strcpy(filename, chosen_filename[type]); SetCurDir(type, chosen_filename[type]); return true; }
bool FileSelector(char *filename, FileType type, const char *title, GtkFileChooserAction action) { GtkWidget *pFileSelection; gtk_init(0, NULL); pFileSelection = gtk_file_chooser_dialog_new( title, NULL, action, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_OK, NULL ); gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (pFileSelection), g_chosen_filename[type]); bool ret; gchar *path; switch(gtk_dialog_run(GTK_DIALOG(pFileSelection))) { case GTK_RESPONSE_OK: path = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(pFileSelection)); strcpy(filename, path); strcpy(g_chosen_filename[type], filename); SetCurDir(type, filename, true); g_free(path); ret = true; break; default: ret = false; break; } gtk_widget_destroy(pFileSelection); // The following loop is needed for the destroy event to be processed while (gtk_events_pending ()) gtk_main_iteration (); return ret; }
int main(int argc, char *argv[]) { char ans[2]; char *fileargs[64]; char *optargs[64]; int n_options; int index; int help_flag = 0; #ifdef __TURBOC__ setvect(0x23, ctrlc_hndlr); #else _dos_setvect(0x23, ctrlc_hndlr); #endif atexit(on_exit); n_options = classify_args(argc, argv, fileargs, optargs); for (index=0;index<n_options;index++) { if (optargs[index][0] == '?') help_flag=1; else { myprintf("Invalid parameter - /",0); myprintf(optargs[index],0); /* removed strupr */ myprintf("\r\n",0); exit(1); } /* end else. */ } /* end for. */ if (help_flag) { myprintf("\r\nLABEL Version " VERSION "\r\n", 0); myprintf("Creates, changes or deletes the volume label of a disk.\r\n",0); myprintf("\r\n",0); myprintf("Syntax: LABEL [drive:][label] [/?]\r\n",0); myprintf(" [drive:] Specifies which drive you want to label\r\n",0); myprintf(" [label] Specifies the new label you want to label the drive\r\n",0); myprintf(" /? Displays this help message\r\n",0); return 0; } /* end if. */ do_cmdline(argc, argv); if (*Drive == '?') /* If no drive specified, use current. */ GetDrive(); /* Save current directory and move to root. */ GetCurDir(curdir); if (curdir[0] != 0) { *rootdir = *Drive; SetCurDir(rootdir); } /* end if. */ /* If no label was specified, show current one first and then get new one. */ if (*Label == '\0') { disp_label(); get_label(); } /* end if. */ /* If they entered an empty label, then ask them if they want to */ /* delete the existing volume label. */ if ((*Label == '\0') && (!NoLabel)) { do { myprintf("\nDelete current volume label (Y/N)? ",0); mygets(ans,2); /* WHY not use getch? ??? */ } /* end do. */ while (((*ans=(char)toupper(*ans)) != 'Y') && (*ans != 'N')); if (toupper(*ans) == 'N') exit(1); } /* end if. */ /* Delete the old volume label. */ del_label(); /* Create the new one, if there is one to create. */ if (*Label != '\0') { if (make_label()) { exit(1); } /* end if. */ } /* end if. */ exit(0); return 0; } /* end main. */
void Panel::ChangeDirToCurrent() { SetCurDir(os::fs::GetCurrentDirectory(), true); }
int Panel::SetPluginCommand(int Command,int Param1,void* Param2) { _ALGO(CleverSysLog clv(L"Panel::SetPluginCommand")); _ALGO(SysLog(L"(Command=%s, Param1=[%d/0x%08X], Param2=[%d/0x%08X])",_FCTL_ToName(Command),(int)Param1,Param1,(int)Param2,Param2)); int Result=FALSE; ProcessingPluginCommand++; switch (Command) { case FCTL_SETVIEWMODE: Result = Parent()->ChangePanelViewMode(shared_from_this(), Param1, Parent()->IsTopWindow()); break; case FCTL_SETSORTMODE: { int Mode=Param1; if ((Mode>SM_DEFAULT) && (Mode < SM_COUNT)) { SetSortMode(panel_sort(Mode - 1)); // Уменьшим на 1 из-за SM_DEFAULT Result=TRUE; } break; } case FCTL_SETSORTORDER: { ChangeSortOrder(Param1 != 0); Result=TRUE; break; } case FCTL_SETDIRECTORIESFIRST: { ChangeDirectoriesFirst(Param1 != 0); Result=TRUE; break; } case FCTL_CLOSEPANEL: if (m_PanelMode == panel_mode::PLUGIN_PANEL) { string folder=NullToEmpty((const wchar_t *)Param2); SetCurDir(folder,true); if (folder.empty()) Update(UPDATE_KEEP_SELECTION); Redraw(); } Result=TRUE; break; case FCTL_GETPANELINFO: { PanelInfo *Info=(PanelInfo *)Param2; if(!CheckStructSize(Info)) break; *Info = {}; Info->StructSize = sizeof(PanelInfo); UpdateIfRequired(); Info->OwnerGuid=FarGuid; Info->PluginHandle=nullptr; switch (GetType()) { case panel_type::FILE_PANEL: Info->PanelType=PTYPE_FILEPANEL; break; case panel_type::TREE_PANEL: Info->PanelType=PTYPE_TREEPANEL; break; case panel_type::QVIEW_PANEL: Info->PanelType=PTYPE_QVIEWPANEL; break; case panel_type::INFO_PANEL: Info->PanelType=PTYPE_INFOPANEL; break; } int X1,Y1,X2,Y2; GetPosition(X1,Y1,X2,Y2); Info->PanelRect.left=X1; Info->PanelRect.top=Y1; Info->PanelRect.right=X2; Info->PanelRect.bottom=Y2; Info->ViewMode=GetViewMode(); Info->SortMode = static_cast<OPENPANELINFO_SORTMODES>((GetSortMode() < panel_sort::COUNT? SM_UNSORTED - static_cast<int>(panel_sort::UNSORTED) : 0) + static_cast<int>(GetSortMode())); Info->Flags |= Global->Opt->ShowHidden? PFLAGS_SHOWHIDDEN : 0; Info->Flags |= Global->Opt->Highlight? PFLAGS_HIGHLIGHT : 0; Info->Flags |= GetSortOrder()? PFLAGS_REVERSESORTORDER : 0; Info->Flags |= GetSortGroups()? PFLAGS_USESORTGROUPS : 0; Info->Flags |= GetSelectedFirstMode()? PFLAGS_SELECTEDFIRST : 0; Info->Flags |= GetDirectoriesFirst()? PFLAGS_DIRECTORIESFIRST : 0; Info->Flags |= (GetMode() == panel_mode::PLUGIN_PANEL)? PFLAGS_PLUGIN : 0; Info->Flags |= IsVisible()? PFLAGS_VISIBLE : 0; Info->Flags |= IsFocused()? PFLAGS_FOCUS : 0; Info->Flags |= Parent()->IsLeft(this)? PFLAGS_PANELLEFT : 0; if (GetType() == panel_type::FILE_PANEL) { FileList *DestFilePanel=(FileList *)this; if (Info->Flags&PFLAGS_PLUGIN) { Info->OwnerGuid = DestFilePanel->GetPluginHandle()->plugin()->Id(); Info->PluginHandle = DestFilePanel->GetPluginHandle()->panel(); static int Reenter=0; if (!Reenter) { Reenter++; OpenPanelInfo PInfo; DestFilePanel->GetOpenPanelInfo(&PInfo); if (PInfo.Flags & OPIF_REALNAMES) Info->Flags |= PFLAGS_REALNAMES; if (PInfo.Flags & OPIF_DISABLEHIGHLIGHTING) Info->Flags &= ~PFLAGS_HIGHLIGHT; if (PInfo.Flags & OPIF_USECRC32) Info->Flags |= PFLAGS_USECRC32; if (PInfo.Flags & OPIF_SHORTCUT) Info->Flags |= PFLAGS_SHORTCUT; Reenter--; } } DestFilePanel->PluginGetPanelInfo(*Info); } if (!(Info->Flags&PFLAGS_PLUGIN)) // $ 12.12.2001 DJ - на неплагиновой панели - всегда реальные имена Info->Flags |= PFLAGS_REALNAMES; Result=TRUE; break; } case FCTL_GETPANELPREFIX: { string strTemp; if (GetType() == panel_type::FILE_PANEL && GetMode() == panel_mode::PLUGIN_PANEL) { PluginInfo PInfo = {sizeof(PInfo)}; FileList *DestPanel = ((FileList*)this); if (DestPanel->GetPluginInfo(&PInfo)) strTemp = NullToEmpty(PInfo.CommandPrefix); } if (Param1&&Param2) xwcsncpy((wchar_t*)Param2, strTemp.c_str(), Param1); Result=(int)strTemp.size()+1; break; } case FCTL_GETPANELHOSTFILE: case FCTL_GETPANELFORMAT: { string strTemp; if (GetType() == panel_type::FILE_PANEL) { FileList *DestFilePanel=(FileList *)this; static int Reenter=0; if (!Reenter && GetMode() == panel_mode::PLUGIN_PANEL) { Reenter++; OpenPanelInfo PInfo; DestFilePanel->GetOpenPanelInfo(&PInfo); switch (Command) { case FCTL_GETPANELHOSTFILE: strTemp=NullToEmpty(PInfo.HostFile); break; case FCTL_GETPANELFORMAT: strTemp=NullToEmpty(PInfo.Format); break; } Reenter--; } } if (Param1&&Param2) xwcsncpy((wchar_t*)Param2, strTemp.c_str(), Param1); Result=(int)strTemp.size()+1; break; } case FCTL_GETPANELDIRECTORY: { static int Reenter=0; if(!Reenter) { Reenter++; ShortcutInfo Info; GetShortcutInfo(Info); Result = static_cast<int>(aligned_sizeof<FarPanelDirectory>()); const auto folderOffset = Result; Result+=static_cast<int>(sizeof(wchar_t)*(Info.ShortcutFolder.size()+1)); const auto pluginFileOffset = Result; Result+=static_cast<int>(sizeof(wchar_t)*(Info.PluginFile.size()+1)); const auto pluginDataOffset = Result; Result+=static_cast<int>(sizeof(wchar_t)*(Info.PluginData.size()+1)); const auto dirInfo = static_cast<FarPanelDirectory*>(Param2); if(Param1>=Result && CheckStructSize(dirInfo)) { dirInfo->StructSize=sizeof(FarPanelDirectory); dirInfo->PluginId=Info.PluginGuid; dirInfo->Name = static_cast<wchar_t*>(static_cast<void*>(static_cast<char*>(Param2) + folderOffset)); dirInfo->Param = static_cast<wchar_t*>(static_cast<void*>(static_cast<char*>(Param2) + pluginDataOffset)); dirInfo->File = static_cast<wchar_t*>(static_cast<void*>(static_cast<char*>(Param2) + pluginFileOffset)); *std::copy(ALL_CONST_RANGE(Info.ShortcutFolder), const_cast<wchar_t*>(dirInfo->Name)) = L'\0'; *std::copy(ALL_CONST_RANGE(Info.PluginData), const_cast<wchar_t*>(dirInfo->Param)) = L'\0'; *std::copy(ALL_CONST_RANGE(Info.PluginFile), const_cast<wchar_t*>(dirInfo->File)) = L'\0'; } Reenter--; } break; } case FCTL_GETCOLUMNTYPES: case FCTL_GETCOLUMNWIDTHS: if (GetType() == panel_type::FILE_PANEL) { string strColumnTypes,strColumnWidths; ((FileList *)this)->PluginGetColumnTypesAndWidths(strColumnTypes,strColumnWidths); if (Command==FCTL_GETCOLUMNTYPES) { if (Param1&&Param2) xwcsncpy((wchar_t*)Param2,strColumnTypes.c_str(),Param1); Result=(int)strColumnTypes.size()+1; } else { if (Param1&&Param2) xwcsncpy((wchar_t*)Param2,strColumnWidths.c_str(),Param1); Result=(int)strColumnWidths.size()+1; } } break; case FCTL_GETPANELITEM: { if (GetType() == panel_type::FILE_PANEL && CheckNullOrStructSize(static_cast<FarGetPluginPanelItem*>(Param2))) Result = static_cast<int>(static_cast<FileList*>(this)->PluginGetPanelItem(Param1, static_cast<FarGetPluginPanelItem*>(Param2))); break; } case FCTL_GETSELECTEDPANELITEM: { if (GetType() == panel_type::FILE_PANEL && CheckNullOrStructSize(static_cast<FarGetPluginPanelItem*>(Param2))) Result = static_cast<int>(static_cast<FileList*>(this)->PluginGetSelectedPanelItem(Param1, static_cast<FarGetPluginPanelItem*>(Param2))); break; } case FCTL_GETCURRENTPANELITEM: { if (GetType() == panel_type::FILE_PANEL && CheckNullOrStructSize(static_cast<FarGetPluginPanelItem*>(Param2))) { PanelInfo Info; const auto DestPanel = static_cast<FileList*>(this); DestPanel->PluginGetPanelInfo(Info); Result = static_cast<int>(DestPanel->PluginGetPanelItem(static_cast<int>(Info.CurrentItem), static_cast<FarGetPluginPanelItem*>(Param2))); } break; } case FCTL_BEGINSELECTION: { if (GetType() == panel_type::FILE_PANEL) { ((FileList *)this)->PluginBeginSelection(); Result=TRUE; } break; } case FCTL_SETSELECTION: { if (GetType() == panel_type::FILE_PANEL) { ((FileList *)this)->PluginSetSelection(Param1, Param2 != nullptr); Result=TRUE; } break; } case FCTL_CLEARSELECTION: { if (GetType() == panel_type::FILE_PANEL) { static_cast<FileList*>(this)->PluginClearSelection(Param1); Result=TRUE; } break; } case FCTL_ENDSELECTION: { if (GetType() == panel_type::FILE_PANEL) { ((FileList *)this)->PluginEndSelection(); Result=TRUE; } break; } case FCTL_UPDATEPANEL: Update(Param1?UPDATE_KEEP_SELECTION:0); if (GetType() == panel_type::QVIEW_PANEL) UpdateViewPanel(); Result=TRUE; break; case FCTL_REDRAWPANEL: { PanelRedrawInfo *Info=(PanelRedrawInfo *)Param2; if (CheckStructSize(Info)) { m_CurFile=static_cast<int>(Info->CurrentItem); m_CurTopFile=static_cast<int>(Info->TopPanelItem); } // $ 12.05.2001 DJ перерисовываемся только в том случае, если мы - текущее окно if (Parent()->IsTopWindow()) Redraw(); Result=TRUE; break; } case FCTL_SETPANELDIRECTORY: { const auto dirInfo = static_cast<const FarPanelDirectory*>(Param2); if (CheckStructSize(dirInfo)) { Result = ExecShortcutFolder(NullToEmpty(dirInfo->Name), dirInfo->PluginId, NullToEmpty(dirInfo->File), NullToEmpty(dirInfo->Param), false, false, true); // restore current directory to active panel path if (!IsFocused()) { Parent()->ActivePanel()->SetCurPath(); } } break; } case FCTL_SETACTIVEPANEL: { if (IsVisible()) { Parent()->SetActivePanel(this); Result=TRUE; } break; } } ProcessingPluginCommand--; return Result; }
/* $ 14.01.2002 IS ! Убрал установку переменных окружения, потому что она производится в FarChDir, которая теперь используется у нас для установления текущего каталога. */ bool Panel::SetCurPath() { if (GetMode() == panel_mode::PLUGIN_PANEL) return true; const auto AnotherPanel = Parent()->GetAnotherPanel(this); if (AnotherPanel->GetMode() != panel_mode::PLUGIN_PANEL) { if (AnotherPanel->m_CurDir.size() > 1 && AnotherPanel->m_CurDir[1]==L':' && (m_CurDir.empty() || upper(AnotherPanel->m_CurDir[0])!=upper(m_CurDir[0]))) { // сначала установим переменные окружения для пассивной панели // (без реальной смены пути, чтобы лишний раз пассивный каталог // не перечитывать) FarChDir(AnotherPanel->m_CurDir, false); } } if (!FarChDir(m_CurDir)) { while (!FarChDir(m_CurDir)) { const auto strRoot = GetPathRoot(m_CurDir); if (FAR_GetDriveType(strRoot) != DRIVE_REMOVABLE || os::fs::IsDiskInDrive(strRoot)) { if (!os::fs::is_directory(m_CurDir)) { if (CheckShortcutFolder(m_CurDir, true, true) && FarChDir(m_CurDir)) { SetCurDir(m_CurDir,true); return true; } } else break; } if (Global->WindowManager->ManagerStarted()) // сначала проверим - а запущен ли менеджер { SetCurDir(Global->g_strFarPath,true); // если запущен - выставим путь который мы точно знаем что существует ChangeDisk(shared_from_this()); // и вызовем меню выбора дисков } else // оппа... { string strTemp(m_CurDir); CutToParent(m_CurDir); // подымаемся вверх, для очередной порции ChDir if (strTemp.size()==m_CurDir.size()) // здесь проблема - видимо диск недоступен { SetCurDir(Global->g_strFarPath,true); // тогда просто сваливаем в каталог, откуда стартанул FAR. break; } else { if (FarChDir(m_CurDir)) { SetCurDir(m_CurDir,true); break; } } } } return false; } return true; }
bool Panel::ExecShortcutFolder(string strShortcutFolder, const GUID& PluginGuid, const string& strPluginFile, const string& strPluginData, bool CheckType, bool TryClosest, bool Silent) { auto SrcPanel = shared_from_this(); const auto AnotherPanel = Parent()->GetAnotherPanel(this); if(CheckType) { switch (GetType()) { case panel_type::FILE_PANEL: break; case panel_type::TREE_PANEL: case panel_type::QVIEW_PANEL: case panel_type::INFO_PANEL: if (AnotherPanel->GetType() == panel_type::FILE_PANEL) SrcPanel=AnotherPanel; break; } } bool CheckFullScreen=SrcPanel->IsFullScreen(); if (PluginGuid != FarGuid) { bool Result = false; ShortcutInfo Info; GetShortcutInfo(Info); if (Info.PluginGuid == PluginGuid && Info.PluginFile == strPluginFile && Info.PluginData == strPluginData) { Result = SetPluginDirectory(strShortcutFolder, Silent); } else { if (ProcessPluginEvent(FE_CLOSE, nullptr)) { return false; } if (const auto pPlugin = Global->CtrlObject->Plugins->FindPlugin(PluginGuid)) { if (pPlugin->has(iOpen)) { if (!strPluginFile.empty()) { auto strRealDir = strPluginFile; if (CutToSlash(strRealDir)) { SrcPanel->SetCurDir(strRealDir,true); SrcPanel->GoToFile(PointToName(strPluginFile)); SrcPanel->ClearAllItem(); } } const auto IsActive = SrcPanel->IsFocused(); OpenShortcutInfo info= { sizeof(OpenShortcutInfo), strPluginFile.empty()? nullptr : strPluginFile.c_str(), strPluginData.empty()? nullptr : strPluginData.c_str(), IsActive? FOSF_ACTIVE : FOSF_NONE }; if (auto hNewPlugin = Global->CtrlObject->Plugins->Open(pPlugin, OPEN_SHORTCUT, FarGuid, reinterpret_cast<intptr_t>(&info))) { const auto NewPanel = Parent()->ChangePanel(SrcPanel, panel_type::FILE_PANEL, TRUE, TRUE); NewPanel->SetPluginMode(std::move(hNewPlugin), {}, IsActive || !Parent()->GetAnotherPanel(NewPanel)->IsVisible()); Result = NewPanel->SetPluginDirectory(strShortcutFolder, Silent); } } } } return Result; } strShortcutFolder = os::env::expand(strShortcutFolder); if (!CheckShortcutFolder(strShortcutFolder, TryClosest, Silent) || ProcessPluginEvent(FE_CLOSE, nullptr)) { return false; } SrcPanel->SetCurDir(strShortcutFolder,true); if (CheckFullScreen!=SrcPanel->IsFullScreen()) Parent()->GetAnotherPanel(SrcPanel)->Show(); SrcPanel->Refresh(); return true; }
bool CommandLine::ProcessKey(const Manager::Key& Key) { auto LocalKey = Key; if ((LocalKey()==KEY_CTRLEND || LocalKey()==KEY_RCTRLEND || LocalKey()==KEY_CTRLNUMPAD1 || LocalKey()==KEY_RCTRLNUMPAD1) && (CmdStr.GetCurPos()==CmdStr.GetLength())) { if (LastCmdPartLength==-1) strLastCmdStr = CmdStr.GetString(); auto strStr = strLastCmdStr; const auto CurCmdPartLength = strStr.size(); Global->CtrlObject->CmdHistory->GetSimilar(strStr,LastCmdPartLength); if (LastCmdPartLength==-1) { strLastCmdStr = CmdStr.GetString(); LastCmdPartLength = static_cast<int>(CurCmdPartLength); } { SCOPED_ACTION(SetAutocomplete)(&CmdStr); CmdStr.SetString(strStr); CmdStr.Select(LastCmdPartLength,static_cast<int>(strStr.size())); } Show(); return true; } if (LocalKey() == KEY_UP || LocalKey() == KEY_NUMPAD8) { if (Global->CtrlObject->Cp()->LeftPanel()->IsVisible() || Global->CtrlObject->Cp()->RightPanel()->IsVisible()) return false; LocalKey=KEY_CTRLE; } else if (LocalKey() == KEY_DOWN || LocalKey() == KEY_NUMPAD2) { if (Global->CtrlObject->Cp()->LeftPanel()->IsVisible() || Global->CtrlObject->Cp()->RightPanel()->IsVisible()) return false; LocalKey=KEY_CTRLX; } // $ 25.03.2002 VVM + При погашенных панелях колесом крутим историю if (!Global->CtrlObject->Cp()->LeftPanel()->IsVisible() && !Global->CtrlObject->Cp()->RightPanel()->IsVisible()) { switch (LocalKey()) { case KEY_MSWHEEL_UP: LocalKey = KEY_CTRLE; break; case KEY_MSWHEEL_DOWN: LocalKey = KEY_CTRLX; break; case KEY_MSWHEEL_LEFT: LocalKey = KEY_CTRLS; break; case KEY_MSWHEEL_RIGHT: LocalKey = KEY_CTRLD; break; } } switch (LocalKey()) { case KEY_CTRLE: case KEY_RCTRLE: case KEY_CTRLX: case KEY_RCTRLX: { if (Global->CtrlObject->CmdHistory->IsOnTop()) { m_CurCmdStr = CmdStr.GetString(); } SCOPED_ACTION(SetAutocomplete)(&CmdStr); const auto strStr = LocalKey() == KEY_CTRLE || LocalKey() == KEY_RCTRLE? Global->CtrlObject->CmdHistory->GetPrev() : Global->CtrlObject->CmdHistory->GetNext(); SetString(Global->CtrlObject->CmdHistory->IsOnTop()? m_CurCmdStr : strStr, true); } return true; case KEY_ESC: { // $ 24.09.2000 SVS - Если задано поведение по "Несохранению при Esc", то позицию в хистори не меняем и ставим в первое положение. if (Global->Opt->CmdHistoryRule) Global->CtrlObject->CmdHistory->ResetPosition(); SetString(L"", true); return true; } case KEY_F2: { UserMenu(false); return true; } case KEY_ALTF8: case KEY_RALTF8: { history_record_type Type; string strStr; const auto SelectType = Global->CtrlObject->CmdHistory->Select(msg(lng::MHistoryTitle), L"History"sv, strStr, Type); if (SelectType == HRT_ENTER || SelectType == HRT_SHIFTETNER || SelectType == HRT_CTRLENTER || SelectType == HRT_CTRLALTENTER) { std::unique_ptr<SetAutocomplete> disable; if(SelectType != HRT_CTRLENTER) { disable = std::make_unique<SetAutocomplete>(&CmdStr); } SetString(strStr, true); if (SelectType != HRT_CTRLENTER) { ProcessKey(SelectType == HRT_CTRLALTENTER? Manager::Key(KEY_CTRLALTENTER) : (SelectType == HRT_ENTER? Manager::Key(KEY_ENTER) : Manager::Key(KEY_SHIFTENTER))); } } } return true; case KEY_ALTF10: case KEY_RALTF10: if (!Global->Opt->Tree.TurnOffCompletely) { string strStr; const auto ActivePanel = Global->CtrlObject->Cp()->ActivePanel(); { // TODO: здесь можно добавить проверку, что мы в корне диска и отсутствие файла Tree.Far... FolderTree::create(strStr, MODALTREE_ACTIVE, TRUE, false); } Global->CtrlObject->Cp()->RedrawKeyBar(); if (!strStr.empty()) { ActivePanel->SetCurDir(strStr,true); ActivePanel->Show(); if (ActivePanel->GetType() == panel_type::TREE_PANEL) ActivePanel->ProcessKey(Manager::Key(KEY_ENTER)); } else { // TODO: ... а здесь проверить факт изменения/появления файла Tree.Far и мы опять же в корне (чтобы лишний раз не апдейтить панель) ActivePanel->Update(UPDATE_KEEP_SELECTION); ActivePanel->Redraw(); const auto AnotherPanel = Global->CtrlObject->Cp()->PassivePanel(); if (AnotherPanel->NeedUpdatePanel(ActivePanel.get())) { AnotherPanel->Update(UPDATE_KEEP_SELECTION);//|UPDATE_SECONDARY); AnotherPanel->Redraw(); } } } return true; case KEY_ALTF11: case KEY_RALTF11: ShowViewEditHistory(); Global->CtrlObject->Cp()->Redraw(); return true; case KEY_ALTF12: case KEY_RALTF12: { history_record_type Type; GUID Guid; string strFile, strData, strStr; const auto SelectType = Global->CtrlObject->FolderHistory->Select(msg(lng::MFolderHistoryTitle), L"HistoryFolders"sv, strStr, Type, &Guid, &strFile, &strData); switch(SelectType) { case HRT_ENTER: case HRT_SHIFTETNER: case HRT_CTRLSHIFTENTER: { if (SelectType == HRT_SHIFTETNER) Global->CtrlObject->FolderHistory->SetAddMode(false,2,true); // пусть плагин сам прыгает... ;-) auto Panel = Global->CtrlObject->Cp()->ActivePanel(); if (SelectType == HRT_CTRLSHIFTENTER) Panel = Global->CtrlObject->Cp()->PassivePanel(); //Type==1 - плагиновый путь //Type==0 - обычный путь Panel->ExecShortcutFolder(std::move(strStr), Guid, strFile, strData, true); // Panel may be changed if(SelectType == HRT_CTRLSHIFTENTER) { Panel = Global->CtrlObject->Cp()->ActivePanel(); Panel->SetCurPath(); Panel = Global->CtrlObject->Cp()->PassivePanel(); } else { Panel = Global->CtrlObject->Cp()->ActivePanel(); } Panel->Redraw(); Global->CtrlObject->FolderHistory->SetAddMode(true,2,true); } break; case HRT_CTRLENTER: SetString(strStr, true); break; default: break; } } return true; case KEY_NUMENTER: case KEY_SHIFTNUMENTER: case KEY_ENTER: case KEY_SHIFTENTER: case KEY_CTRLALTENTER: case KEY_RCTRLRALTENTER: case KEY_CTRLRALTENTER: case KEY_RCTRLALTENTER: case KEY_CTRLALTNUMENTER: case KEY_RCTRLRALTNUMENTER: case KEY_CTRLRALTNUMENTER: case KEY_RCTRLALTNUMENTER: { const auto ActivePanel = Global->CtrlObject->Cp()->ActivePanel(); CmdStr.RemoveSelection(); Refresh(); const auto& strStr = CmdStr.GetString(); bool TryExecute = true; if (!strStr.empty()) { ActivePanel->SetCurPath(); if (!(Global->Opt->ExcludeCmdHistory&EXCLUDECMDHISTORY_NOTCMDLINE)) Global->CtrlObject->CmdHistory->AddToHistory(strStr, HR_DEFAULT, nullptr, {}, m_CurDir); TryExecute = !ActivePanel->ProcessPluginEvent(FE_COMMAND, UNSAFE_CSTR(strStr)); } if (TryExecute) { const auto KeyCode = LocalKey(); const auto IsNewWindow = (KeyCode & KEY_SHIFT) != 0; const auto IsRunAs = (KeyCode & KEY_CTRL || KeyCode & KEY_RCTRL) && (KeyCode & KEY_ALT || KeyCode & KEY_RALT); execute_info Info; Info.Command = strStr; Info.NewWindow = IsNewWindow; Info.RunAs = IsRunAs; SetString(L"", false); ExecString(Info); } } return true; case KEY_CTRLU: case KEY_RCTRLU: CmdStr.RemoveSelection(); Refresh(); return true; case KEY_OP_XLAT: { // 13.12.2000 SVS - ! Для CmdLine - если нет выделения, преобразуем всю строку (XLat) CmdStr.Xlat((Global->Opt->XLat.Flags&XLAT_CONVERTALLCMDLINE) != 0); // иначе неправильно работает ctrl-end strLastCmdStr = CmdStr.GetString(); LastCmdPartLength = static_cast<int>(strLastCmdStr.size()); return true; } /* дополнительные клавиши для выделения в ком строке. ВНИМАНИЕ! Для сокращения кода этот кусок должен стоять перед "default" */ case KEY_ALTSHIFTLEFT: case KEY_ALTSHIFTNUMPAD4: case KEY_RALTSHIFTLEFT: case KEY_RALTSHIFTNUMPAD4: case KEY_ALTSHIFTRIGHT: case KEY_ALTSHIFTNUMPAD6: case KEY_RALTSHIFTRIGHT: case KEY_RALTSHIFTNUMPAD6: case KEY_ALTSHIFTEND: case KEY_ALTSHIFTNUMPAD1: case KEY_RALTSHIFTEND: case KEY_RALTSHIFTNUMPAD1: case KEY_ALTSHIFTHOME: case KEY_ALTSHIFTNUMPAD7: case KEY_RALTSHIFTHOME: case KEY_RALTSHIFTNUMPAD7: LocalKey&=~(KEY_ALT|KEY_RALT); [[fallthrough]]; default: // Сбрасываем выделение на некоторых клавишах if (!Global->Opt->CmdLine.EditBlock) { static const unsigned int UnmarkKeys[]= { KEY_LEFT, KEY_NUMPAD4, KEY_CTRLS, KEY_RCTRLS, KEY_RIGHT, KEY_NUMPAD6, KEY_CTRLD, KEY_RCTRLD, KEY_CTRLLEFT, KEY_CTRLNUMPAD4, KEY_RCTRLLEFT, KEY_RCTRLNUMPAD4, KEY_CTRLRIGHT, KEY_CTRLNUMPAD6, KEY_RCTRLRIGHT, KEY_RCTRLNUMPAD6, KEY_CTRLHOME, KEY_CTRLNUMPAD7, KEY_RCTRLHOME, KEY_RCTRLNUMPAD7, KEY_CTRLEND, KEY_CTRLNUMPAD1, KEY_RCTRLEND, KEY_RCTRLNUMPAD1, KEY_HOME, KEY_NUMPAD7, KEY_END, KEY_NUMPAD1 }; if (contains(UnmarkKeys, LocalKey())) { CmdStr.RemoveSelection(); } } if (LocalKey() == KEY_CTRLD || LocalKey() == KEY_RCTRLD) LocalKey=KEY_RIGHT; if(LocalKey() == KEY_CTRLSPACE || LocalKey() == KEY_RCTRLSPACE) { SCOPED_ACTION(SetAutocomplete)(&CmdStr, true); CmdStr.AutoComplete(true,false); return true; } if (!CmdStr.ProcessKey(LocalKey)) return Global->WindowManager->Desktop()->ProcessKey(Key); LastCmdPartLength=-1; return true; } }