void FileList::ShowFileList(int Fast) { if (Locked()) { CorrectPosition(); return; } string strTitle; string strInfoCurDir; int Length; OpenPanelInfo Info; if (PanelMode==PLUGIN_PANEL) { if (ProcessPluginEvent(FE_REDRAW,nullptr)) return; CtrlObject->Plugins->GetOpenPanelInfo(hPlugin,&Info); strInfoCurDir=Info.CurDir; } bool CurFullScreen=IsFullScreen(); PrepareViewSettings(ViewMode,&Info); CorrectPosition(); if (CurFullScreen!=IsFullScreen()) { CtrlObject->Cp()->SetScreenPosition(); CtrlObject->Cp()->GetAnotherPanel(this)->Update(UPDATE_KEEP_SELECTION|UPDATE_SECONDARY); } SetScreen(X1+1,Y1+1,X2-1,Y2-1,L' ',ColorIndexToColor(COL_PANELTEXT)); Box(X1,Y1,X2,Y2,ColorIndexToColor(COL_PANELBOX),DOUBLE_BOX); if (Opt.ShowColumnTitles) { // SetScreen(X1+1,Y1+1,X2-1,Y1+1,' ',COL_PANELTEXT); SetColor(COL_PANELTEXT); //??? //GotoXY(X1+1,Y1+1); //FS<<fmt::Width(X2-X1-1)<<L""; } for (int I=0,ColumnPos=X1+1; I<ViewSettings.ColumnCount; I++) { if (ViewSettings.ColumnWidth[I]<0) continue; if (Opt.ShowColumnTitles) { LNGID IDMessage=MColumnUnknown; switch (ViewSettings.ColumnType[I] & 0xff) { case NAME_COLUMN: IDMessage=MColumnName; break; case EXTENSION_COLUMN: IDMessage=MColumnExtension; break; case SIZE_COLUMN: IDMessage=MColumnSize; break; case PACKED_COLUMN: IDMessage=MColumnAlocatedSize; break; case DATE_COLUMN: IDMessage=MColumnDate; break; case TIME_COLUMN: IDMessage=MColumnTime; break; case WDATE_COLUMN: IDMessage=MColumnWrited; break; case CDATE_COLUMN: IDMessage=MColumnCreated; break; case ADATE_COLUMN: IDMessage=MColumnAccessed; break; case CHDATE_COLUMN: IDMessage=MColumnChanged; break; case ATTR_COLUMN: IDMessage=MColumnAttr; break; case DIZ_COLUMN: IDMessage=MColumnDescription; break; case OWNER_COLUMN: IDMessage=MColumnOwner; break; case NUMLINK_COLUMN: IDMessage=MColumnMumLinks; break; case NUMSTREAMS_COLUMN: IDMessage=MColumnNumStreams; break; case STREAMSSIZE_COLUMN: IDMessage=MColumnStreamsSize; break; } strTitle=MSG(IDMessage); if (PanelMode==PLUGIN_PANEL && Info.PanelModesArray && ViewMode<static_cast<int>(Info.PanelModesNumber) && Info.PanelModesArray[ViewMode].ColumnTitles) { const wchar_t *NewTitle=Info.PanelModesArray[ViewMode].ColumnTitles[I]; if (NewTitle) strTitle=NewTitle; } string strTitleMsg; CenterStr(strTitle,strTitleMsg,ViewSettings.ColumnWidth[I]); SetColor(COL_PANELCOLUMNTITLE); GotoXY(ColumnPos,Y1+1); FS<<fmt::Precision(ViewSettings.ColumnWidth[I])<<strTitleMsg; } if (I>=ViewSettings.ColumnCount-1) break; if (ViewSettings.ColumnWidth[I+1]<0) continue; SetColor(COL_PANELBOX); ColumnPos+=ViewSettings.ColumnWidth[I]; GotoXY(ColumnPos,Y1); bool DoubleLine = Opt.DoubleGlobalColumnSeparator && (!((I+1)%ColumnsInGlobal)); BoxText(BoxSymbols[DoubleLine?BS_T_H2V2:BS_T_H2V1]); if (Opt.ShowColumnTitles) { GotoXY(ColumnPos,Y1+1); BoxText(BoxSymbols[DoubleLine?BS_V2:BS_V1]); } if (!Opt.ShowPanelStatus) { GotoXY(ColumnPos,Y2); BoxText(BoxSymbols[DoubleLine?BS_B_H2V2:BS_B_H2V1]); } ColumnPos++; } int NextX1=X1+1; if (Opt.ShowSortMode) { static int SortModes[]={UNSORTED,BY_NAME,BY_EXT,BY_MTIME,BY_CTIME, BY_ATIME,BY_CHTIME,BY_SIZE,BY_DIZ,BY_OWNER, BY_COMPRESSEDSIZE,BY_NUMLINKS, BY_NUMSTREAMS,BY_STREAMSSIZE, BY_FULLNAME,BY_CUSTOMDATA }; static LNGID SortStrings[]={MMenuUnsorted,MMenuSortByName, MMenuSortByExt,MMenuSortByWrite,MMenuSortByCreation, MMenuSortByAccess,MMenuSortByChange,MMenuSortBySize,MMenuSortByDiz,MMenuSortByOwner, MMenuSortByAllocatedSize,MMenuSortByNumLinks,MMenuSortByNumStreams,MMenuSortByStreamsSize, MMenuSortByFullName,MMenuSortByCustomData }; for (size_t I=0; I<ARRAYSIZE(SortModes); I++) { if (SortModes[I]==SortMode) { const wchar_t *SortStr=MSG(SortStrings[I]); const wchar_t *Ch=wcschr(SortStr,L'&'); if (Ch) { if (Opt.ShowColumnTitles) GotoXY(NextX1,Y1+1); else GotoXY(NextX1,Y1); SetColor(COL_PANELCOLUMNTITLE); OutCharacter[0]=SortOrder==1 ? Lower(Ch[1]):Upper(Ch[1]); Text(OutCharacter); NextX1++; if (Filter && Filter->IsEnabledOnPanel()) { OutCharacter[0]=L'*'; Text(OutCharacter); NextX1++; } } break; } } } /* <режимы сортировки> */ if (/*GetNumericSort() || GetCaseSensitiveSort() || GetSortGroups() || */GetSelectedFirstMode()) { if (Opt.ShowColumnTitles) GotoXY(NextX1,Y1+1); else GotoXY(NextX1,Y1); SetColor(COL_PANELCOLUMNTITLE); wchar_t *PtrOutCharacter=OutCharacter; *PtrOutCharacter=0; //if (GetSelectedFirstMode()) *PtrOutCharacter++=L'^'; /* if(GetNumericSort()) *PtrOutCharacter++=L'#'; if(GetSortGroups()) *PtrOutCharacter++=L'@'; */ /* if(GetCaseSensitiveSort()) { } */ *PtrOutCharacter=0; Text(OutCharacter); PtrOutCharacter[1]=0; } /* </режимы сортировки> */ if (!Fast && GetFocus()) { if (PanelMode==PLUGIN_PANEL) CtrlObject->CmdLine->SetCurDir(Info.CurDir); else CtrlObject->CmdLine->SetCurDir(strCurDir); CtrlObject->CmdLine->Show(); } int TitleX2=Opt.Clock && !Opt.ShowMenuBar ? Min(ScrX-4,X2):X2; int TruncSize=TitleX2-X1-3; if (!Opt.ShowColumnTitles && Opt.ShowSortMode && Filter && Filter->IsEnabledOnPanel()) TruncSize-=2; GetTitle(strTitle,TruncSize,2);//,(PanelMode==PLUGIN_PANEL?0:2)); Length=(int)strTitle.GetLength(); int ClockCorrection=FALSE; if ((Opt.Clock && !Opt.ShowMenuBar) && TitleX2==ScrX-4) { ClockCorrection=TRUE; TitleX2+=4; } int TitleX=X1+(TitleX2-X1+1-Length)/2; if (ClockCorrection) { int Overlap=TitleX+Length-TitleX2+5; if (Overlap > 0) TitleX-=Overlap; } if (TitleX <= X1) TitleX = X1+1; SetColor(Focus ? COL_PANELSELECTEDTITLE:COL_PANELTITLE); GotoXY(TitleX,Y1); Text(strTitle); if (!FileCount) { SetScreen(X1+1,Y2-1,X2-1,Y2-1,L' ',ColorIndexToColor(COL_PANELTEXT)); SetColor(COL_PANELTEXT); //??? //GotoXY(X1+1,Y2-1); //FS<<fmt::Width(X2-X1-1)<<L""; } if (PanelMode==PLUGIN_PANEL && FileCount>0 && (Info.Flags & OPIF_REALNAMES)) { if (!strInfoCurDir.IsEmpty()) { strCurDir = strInfoCurDir; } else { if (!TestParentFolderName(ListData[CurFile]->strName)) { strCurDir=ListData[CurFile]->strName; size_t pos; if (FindLastSlash(pos,strCurDir)) { if (pos) { if (strCurDir.At(pos-1)!=L':') strCurDir.SetLength(pos); else strCurDir.SetLength(pos+1); } } } else { strCurDir = strOriginalCurDir; } } if (GetFocus()) { CtrlObject->CmdLine->SetCurDir(strCurDir); CtrlObject->CmdLine->Show(); } } if ((Opt.ShowPanelTotals || Opt.ShowPanelFree) && (Opt.ShowPanelStatus || !SelFileCount)) { ShowTotalSize(Info); } ShowList(FALSE,0); ShowSelectedSize(); if (Opt.ShowPanelScrollbar) { SetColor(COL_PANELSCROLLBAR); ScrollBarEx(X2,Y1+1+Opt.ShowColumnTitles,Height,Round(CurTopFile,Columns),Round(FileCount,Columns)); } ShowScreensCount(); if (!ProcessingPluginCommand && LastCurFile!=CurFile) { LastCurFile=CurFile; UpdateViewPanel(); } if (PanelMode==PLUGIN_PANEL) CtrlObject->Cp()->RedrawKeyBar(); }
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; }