Panel* FilePanels::ChangePanel(Panel *Current,int NewType,int CreateNew,int Force) { Panel *NewPanel; SaveScreen *SaveScr=nullptr; // OldType не инициализировался... int OldType=Current->GetType(),X1,Y1,X2,Y2; int OldPanelMode=Current->GetMode(); if (!Force && NewType==OldType && OldPanelMode==NORMAL_PANEL) return(Current); int UseLastPanel=0; int OldViewMode=Current->GetPrevViewMode(); bool OldFullScreen=Current->IsFullScreen(); int OldSortMode=Current->GetPrevSortMode(); int OldSortOrder=Current->GetPrevSortOrder(); int OldNumericSort=Current->GetPrevNumericSort(); int OldCaseSensitiveSort=Current->GetPrevCaseSensitiveSort(); int OldSortGroups=Current->GetSortGroups(); int OldShowShortNames=Current->GetShowShortNamesMode(); int OldFocus=Current->GetFocus(); int OldSelectedFirst=Current->GetSelectedFirstMode(); int OldDirectoriesFirst=Current->GetPrevDirectoriesFirst(); int LeftPosition=(Current==LeftPanel); Panel *(&LastFilePanel)=LeftPosition ? LastLeftFilePanel:LastRightFilePanel; Current->GetPosition(X1,Y1,X2,Y2); int ChangePosition=((OldType==FILE_PANEL && NewType!=FILE_PANEL && OldFullScreen) || (NewType==FILE_PANEL && ((OldFullScreen && !FileList::IsModeFullScreen(OldViewMode)) || (!OldFullScreen && FileList::IsModeFullScreen(OldViewMode))))); if (!ChangePosition) { SaveScr=Current->SaveScr; Current->SaveScr=nullptr; } if (OldType==FILE_PANEL && NewType!=FILE_PANEL) { delete Current->SaveScr; Current->SaveScr=nullptr; if (LastFilePanel!=Current) { DeletePanel(LastFilePanel); LastFilePanel=Current; } LastFilePanel->Hide(); if (LastFilePanel->SaveScr) { LastFilePanel->SaveScr->Discard(); delete LastFilePanel->SaveScr; LastFilePanel->SaveScr=nullptr; } } else { Current->Hide(); DeletePanel(Current); if (OldType==FILE_PANEL && NewType==FILE_PANEL) { DeletePanel(LastFilePanel); LastFilePanel=nullptr; } } if (!CreateNew && NewType==FILE_PANEL && LastFilePanel) { int LastX1,LastY1,LastX2,LastY2; LastFilePanel->GetPosition(LastX1,LastY1,LastX2,LastY2); if (LastFilePanel->IsFullScreen()) LastFilePanel->SetPosition(LastX1,Y1,LastX2,Y2); else LastFilePanel->SetPosition(X1,Y1,X2,Y2); NewPanel=LastFilePanel; if (!ChangePosition) { if ((NewPanel->IsFullScreen() && !OldFullScreen) || (!NewPanel->IsFullScreen() && OldFullScreen)) { Panel *AnotherPanel=GetAnotherPanel(Current); if (SaveScr && AnotherPanel->IsVisible() && AnotherPanel->GetType()==FILE_PANEL && AnotherPanel->IsFullScreen()) SaveScr->Discard(); delete SaveScr; } else NewPanel->SaveScr=SaveScr; } if (!OldFocus && NewPanel->GetFocus()) NewPanel->KillFocus(); UseLastPanel=TRUE; } else NewPanel=CreatePanel(NewType); if (Current==ActivePanel) ActivePanel=NewPanel; if (LeftPosition) { LeftPanel=NewPanel; LastLeftType=OldType; } else { RightPanel=NewPanel; LastRightType=OldType; } if (!UseLastPanel) { if (ChangePosition) { if (LeftPosition) { NewPanel->SetPosition(0,Y1,ScrX/2-Opt.WidthDecrement,Y2); RightPanel->Redraw(); } else { NewPanel->SetPosition(ScrX/2+1-Opt.WidthDecrement,Y1,ScrX,Y2); LeftPanel->Redraw(); } } else { NewPanel->SaveScr=SaveScr; NewPanel->SetPosition(X1,Y1,X2,Y2); } NewPanel->SetSortMode(OldSortMode); NewPanel->SetSortOrder(OldSortOrder); NewPanel->SetNumericSort(OldNumericSort); NewPanel->SetCaseSensitiveSort(OldCaseSensitiveSort); NewPanel->SetSortGroups(OldSortGroups); NewPanel->SetShowShortNamesMode(OldShowShortNames); NewPanel->SetPrevViewMode(OldViewMode); NewPanel->SetViewMode(OldViewMode); NewPanel->SetSelectedFirstMode(OldSelectedFirst); NewPanel->SetDirectoriesFirst(OldDirectoriesFirst); } return(NewPanel); }