void FileList::ShowTotalSize(OpenPanelInfo &Info) { if (!Opt.ShowPanelTotals && PanelMode==PLUGIN_PANEL && !(Info.Flags & OPIF_REALNAMES)) return; string strFormSize, strFreeSize, strTotalStr; int Length; InsertCommas(TotalFileSize,strFormSize); if (Opt.ShowPanelFree && (PanelMode!=PLUGIN_PANEL || (Info.Flags & OPIF_REALNAMES))) InsertCommas(FreeDiskSize,strFreeSize); if (Opt.ShowPanelTotals) { if (!Opt.ShowPanelFree || strFreeSize.IsEmpty()) { strTotalStr = LangString(__FormatEndSelectedPhrase(TotalFileCount)) << strFormSize << TotalFileCount; } else { wchar_t DHLine[4]={BoxSymbols[BS_H2],BoxSymbols[BS_H2],BoxSymbols[BS_H2],0}; FormatString str; str << L" " << strFormSize << L" (" << TotalFileCount << L") " << DHLine << L" " << strFreeSize << L" "; if ((int)str.GetLength() > X2-X1-1) { InsertCommas(FreeDiskSize>>20,strFreeSize); InsertCommas(TotalFileSize>>20,strFormSize); str.Clear(); str << L" " << strFormSize << L" " << MSG(MListMb) << L" (" << TotalFileCount << L") " << DHLine << L" " << strFreeSize << L" " << MSG(MListMb) << L" "; } strTotalStr = str; } }
Shortcuts::Shortcuts() { HKEY hNewKey = OpenRegKey(FolderShortcutsKeyTest); if (hNewKey == NULL) { for(size_t i = 0; i < KeyCount; i++) { FormatString ValueName; ValueName << RecTypeName[PSCR_RT_SHORTCUT] << i; string strValue; if(!GetRegKey(OldFolderShortcutsKey, ValueName, strValue, L"")) continue; ValueName.Clear(); ShortcutItem* Item = Items[i].Push(); Item->strFolder = strValue; ValueName << RecTypeName[PSCR_RT_PLUGINMODULE] << i; GetRegKey(OldFolderShortcutsKey, ValueName, Item->strPluginModule, L""); ValueName.Clear(); ValueName << RecTypeName[PSCR_RT_PLUGINFILE] << i; GetRegKey(OldFolderShortcutsKey, ValueName, Item->strPluginFile, L""); ValueName.Clear(); ValueName << RecTypeName[PSCR_RT_PLUGINDATA] << i; GetRegKey(OldFolderShortcutsKey, ValueName, Item->strPluginData, L""); ValueName.Clear(); } return; } for(size_t i = 0; i < KeyCount; i++) { FormatString strFolderShortcuts; strFolderShortcuts << FolderShortcutsKey << i; if (!CheckRegKey(strFolderShortcuts)) continue; for(size_t j=0; ; j++) { FormatString ValueName; ValueName << RecTypeName[PSCR_RT_SHORTCUT] << j; string strValue; if(!GetRegKey(strFolderShortcuts, ValueName, strValue, L"")) break; ValueName.Clear(); ShortcutItem* Item = Items[i].Push(); Item->strFolder = strValue; ValueName << RecTypeName[PSCR_RT_PLUGINMODULE] << j; GetRegKey(strFolderShortcuts, ValueName, Item->strPluginModule, L""); ValueName.Clear(); ValueName << RecTypeName[PSCR_RT_PLUGINFILE] << j; GetRegKey(strFolderShortcuts, ValueName, Item->strPluginFile, L""); ValueName.Clear(); ValueName << RecTypeName[PSCR_RT_PLUGINDATA] << j; GetRegKey(strFolderShortcuts, ValueName, Item->strPluginData, L""); ValueName.Clear(); } } }
Shortcuts::~Shortcuts() { for(size_t i = 0; i < KeyCount; i++) { FormatString strFolderShortcuts; strFolderShortcuts << FolderShortcutsKey << i; int index = 0; DeleteKeyTree(strFolderShortcuts); for(ShortcutItem* j = Items[i].First(); j; j = Items[i].Next(j), index++) { FormatString ValueName; ValueName << RecTypeName[PSCR_RT_SHORTCUT] << index; SetRegKey(strFolderShortcuts, ValueName, j->strFolder); ValueName.Clear(); if(!j->strPluginModule.IsEmpty()) { ValueName << RecTypeName[PSCR_RT_PLUGINMODULE] << index; SetRegKey(strFolderShortcuts, ValueName, j->strPluginModule); ValueName.Clear(); } if(!j->strPluginFile.IsEmpty()) { ValueName << RecTypeName[PSCR_RT_PLUGINFILE] << index; SetRegKey(strFolderShortcuts, ValueName, j->strPluginFile); ValueName.Clear(); } if(!j->strPluginData.IsEmpty()) { ValueName << RecTypeName[PSCR_RT_PLUGINDATA] << index; SetRegKey(strFolderShortcuts, ValueName, j->strPluginData); ValueName.Clear(); } } } }
// Каллбак для диалога редактирования имени кодовой страницы intptr_t WINAPI EditDialogProc(HANDLE hDlg, intptr_t Msg, intptr_t Param1, void* Param2) { if (Msg==DN_CLOSE) { if (Param1==EDITCP_OK || Param1==EDITCP_RESET) { string strCodePageName; uintptr_t CodePage = GetMenuItemCodePage(); FormatString strCodePage; strCodePage<<CodePage; if (Param1==EDITCP_OK) { FarDialogItemData item = {sizeof(FarDialogItemData)}; item.PtrLength = SendDlgMessage(hDlg, DM_GETTEXT, EDITCP_EDIT, 0); item.PtrData = strCodePageName.GetBuffer(item.PtrLength+1); SendDlgMessage(hDlg, DM_GETTEXT, EDITCP_EDIT, &item); strCodePageName.ReleaseBuffer(); } // Если имя кодовой страницы пустое, то считаем, что имя не задано if (!strCodePageName.GetLength()) GeneralCfg->DeleteValue(NamesOfCodePagesKey, strCodePage); else GeneralCfg->SetValue(NamesOfCodePagesKey, strCodePage, strCodePageName); // Получаем информацию о кодовой странице CPINFOEX cpiex; if (GetCodePageInfo(CodePage, cpiex)) { // Формируем имя таблиц символов bool IsCodePageNameCustom = false; wchar_t *CodePageName = FormatCodePageName(CodePage, cpiex.CodePageName, sizeof(cpiex.CodePageName)/sizeof(wchar_t), IsCodePageNameCustom); // Формируем строку представления strCodePage.Clear(); FormatCodePageString(CodePage, CodePageName, strCodePage, IsCodePageNameCustom); // Обновляем имя кодовой страницы int Position = CodePages->GetSelectPos(); CodePages->DeleteItem(Position); MenuItemEx NewItem; NewItem.Clear(); NewItem.strName = strCodePage; NewItem.UserData = &CodePage; NewItem.UserDataSize = sizeof(CodePage); CodePages->AddItem(&NewItem, Position); CodePages->SetSelectPos(Position, 1); } } } return DefDlgProc(hDlg, Msg, Param1, Param2); }
// Каллбак для диалога редактирования имени кодовой страницы LONG_PTR WINAPI EditDialogProc(HANDLE hDlg, int Msg, int Param1, LONG_PTR Param2) { if (Msg==DN_CLOSE) { if (Param1==EDITCP_OK || Param1==EDITCP_RESET) { FARString strCodePageName; UINT CodePage = GetMenuItemCodePage(); FormatString strCodePage; strCodePage<<CodePage; if (Param1==EDITCP_OK) { wchar_t *CodePageName = strCodePageName.GetBuffer(SendDlgMessage(hDlg, DM_GETTEXTPTR, EDITCP_EDIT, 0)+1); SendDlgMessage(hDlg, DM_GETTEXTPTR, EDITCP_EDIT, (LONG_PTR)CodePageName); strCodePageName.ReleaseBuffer(); } // Если имя кодовой страницы пустое, то считаем, что имя не задано if (!strCodePageName.GetLength()) DeleteRegValue(NamesOfCodePagesKey, strCodePage); else SetRegKey(NamesOfCodePagesKey, strCodePage, strCodePageName); // Получаем информацию о кодовой странице CPINFOEX cpiex; if (GetCodePageInfo(CodePage, cpiex)) { // Формируем имя таблиц символов bool IsCodePageNameCustom = false; wchar_t *CodePageName = FormatCodePageName(CodePage, cpiex.CodePageName, sizeof(cpiex.CodePageName)/sizeof(wchar_t), IsCodePageNameCustom); // Формируем строку представления strCodePage.Clear(); FormatCodePageString(CodePage, CodePageName, strCodePage, IsCodePageNameCustom); // Обновляем имя кодовой страницы int Position = CodePages->GetSelectPos(); CodePages->DeleteItem(Position); MenuItemEx NewItem; NewItem.Clear(); NewItem.strName = strCodePage; NewItem.UserData = (char *)(UINT_PTR)CodePage; NewItem.UserDataSize = sizeof(UINT); CodePages->AddItem(&NewItem, Position); CodePages->SetSelectPos(Position, 1); } } } return DefDlgProc(hDlg, Msg, Param1, Param2); }
string & FileSizeToStr(string &strDestStr, unsigned __int64 Size, int Width, unsigned __int64 ViewFlags) { FormatString strStr; unsigned __int64 Divider; size_t IndexDiv, IndexB; // подготовительные мероприятия if (!UnitStr[0][0][0]) { PrepareUnitStr(); } bool Commas=(ViewFlags & COLUMN_COMMAS)!=0; bool FloatSize=(ViewFlags & COLUMN_FLOATSIZE)!=0; bool Economic=(ViewFlags & COLUMN_ECONOMIC)!=0; bool UseMinSizeIndex=(ViewFlags & COLUMN_MINSIZEINDEX)!=0; size_t MinSizeIndex=(ViewFlags & COLUMN_MINSIZEINDEX_MASK)+1; bool ShowBytesIndex=(ViewFlags & COLUMN_SHOWBYTESINDEX)!=0; if (ViewFlags & COLUMN_THOUSAND) { Divider=1000; IndexDiv=0; } else { Divider=1024; IndexDiv=1; } unsigned __int64 Sz = Size, Divider2 = Divider/2, Divider64 = Divider, OldSize; if (FloatSize) { unsigned __int64 Divider64F = 1, Divider64F_mul = 1000, Divider64F2 = 1, Divider64F2_mul = Divider; //выравнивание идёт по 1000 но само деление происходит на Divider //например 999 bytes покажутся как 999 а вот 1000 bytes уже покажутся как 0.97 K for (IndexB=0; IndexB<UNIT_COUNT-1; IndexB++) { if (Sz < Divider64F*Divider64F_mul) break; Divider64F = Divider64F*Divider64F_mul; Divider64F2 = Divider64F2*Divider64F2_mul; } if (!IndexB) { strStr << Sz; } else { Sz = (OldSize=Sz) / Divider64F2; OldSize = (OldSize % Divider64F2) / (Divider64F2 / Divider64F2_mul); DWORD Decimal = (DWORD)(0.5+(double)(DWORD)OldSize/(double)Divider*100.0); if (Decimal >= 100) { Decimal -= 100; Sz++; } strStr << Sz << L"." << fmt::MinWidth(2) << fmt::FillChar(L'0') << Decimal; FormatNumber(strStr,strStr,2); } if (IndexB>0 || ShowBytesIndex) { Width-=(Economic?1:2); if (Width<0) Width=0; if (Economic) strDestStr.Format(L"%*.*s%1.1s",Width,Width,strStr.CPtr(),UnitStr[IndexB][IndexDiv]); else strDestStr.Format(L"%*.*s %1.1s",Width,Width,strStr.CPtr(),UnitStr[IndexB][IndexDiv]); } else strDestStr.Format(L"%*.*s",Width,Width,strStr.CPtr()); return strDestStr; } if (Commas) InsertCommas(Sz,strStr); else strStr << Sz; if ((!UseMinSizeIndex && strStr.GetLength()<=static_cast<size_t>(Width)) || Width<5) { if (ShowBytesIndex) { Width-=(Economic?1:2); if (Width<0) Width=0; if (Economic) strDestStr.Format(L"%*.*s%1.1s",Width,Width,strStr.CPtr(),UnitStr[0][IndexDiv]); else strDestStr.Format(L"%*.*s %1.1s",Width,Width,strStr.CPtr(),UnitStr[0][IndexDiv]); } else strDestStr.Format(L"%*.*s",Width,Width,strStr.CPtr()); } else { Width-=(Economic?1:2); IndexB=0; do { //Sz=(Sz+Divider2)/Divider64; Sz = (OldSize=Sz) / Divider64; if ((OldSize % Divider64) > Divider2) ++Sz; IndexB++; if (Commas) { InsertCommas(Sz,strStr); } else { strStr.Clear(); strStr << Sz; } } while ((UseMinSizeIndex && IndexB<MinSizeIndex) || strStr.GetLength() > static_cast<size_t>(Width)); if (Economic) strDestStr.Format(L"%*.*s%1.1s",Width,Width,strStr.CPtr(),UnitStr[IndexB][IndexDiv]); else strDestStr.Format(L"%*.*s %1.1s",Width,Width,strStr.CPtr(),UnitStr[IndexB][IndexDiv]); } return strDestStr; }
void QuickView::DisplayObject() { if (Flags.Check(FSCROBJ_ISREDRAWING)) return; Flags.Set(FSCROBJ_ISREDRAWING); FARString strTitle; if (!QView && !ProcessingPluginCommand) CtrlObject->Cp()->GetAnotherPanel(this)->UpdateViewPanel(); if (QView) QView->SetPosition(X1+1,Y1+1,X2-1,Y2-3); Box(X1,Y1,X2,Y2,COL_PANELBOX,DOUBLE_BOX); SetScreen(X1+1,Y1+1,X2-1,Y2-1,L' ',COL_PANELTEXT); SetColor(Focus ? COL_PANELSELECTEDTITLE:COL_PANELTITLE); GetTitle(strTitle); if (!strTitle.IsEmpty()) { GotoXY(X1+(X2-X1+1-(int)strTitle.GetLength())/2,Y1); Text(strTitle); } DrawSeparator(Y2-2); SetColor(COL_PANELTEXT); GotoXY(X1+1,Y2-1); FS<<fmt::LeftAlign()<<fmt::Width(X2-X1-1)<<fmt::Precision(X2-X1-1)<<PointToName(strCurFileName); if (!strCurFileType.IsEmpty()) { FARString strTypeText=L" "; strTypeText+=strCurFileType; strTypeText+=L" "; TruncStr(strTypeText,X2-X1-1); SetColor(COL_PANELSELECTEDINFO); GotoXY(X1+(X2-X1+1-(int)strTypeText.GetLength())/2,Y2-2); Text(strTypeText); } if (Directory) { FormatString FString; FString<<MSG(MQuickViewFolder)<<L" \""<<strCurFileName<<L"\""; SetColor(COL_PANELTEXT); GotoXY(X1+2,Y1+2); PrintText(FString); /*if ((apiGetFileAttributes(strCurFileName)&FILE_ATTRIBUTE_REPARSE_POINT) == FILE_ATTRIBUTE_REPARSE_POINT) { FARString strJuncName; DWORD ReparseTag=0; if (GetReparsePointInfo(strCurFileName, strJuncName,&ReparseTag)) { int ID_Msg=MQuickViewJunction; if (ReparseTag==IO_REPARSE_TAG_MOUNT_POINT) { if (IsLocalVolumeRootPath(strJuncName)) { ID_Msg=MQuickViewVolMount; } } else if (ReparseTag==IO_REPARSE_TAG_SYMLINK) { ID_Msg=MQuickViewSymlink; } //"\??\D:\Junc\Src\" NormalizeSymlinkName(strJuncName); TruncPathStr(strJuncName,X2-X1-1-StrLength(MSG(ID_Msg))); FString.Clear(); FString<<MSG(ID_Msg)<<L" \""<<strJuncName<<L"\""; SetColor(COL_PANELTEXT); GotoXY(X1+2,Y1+3); PrintText(FString); } }*/ if (Directory==1 || Directory==4) { GotoXY(X1+2,Y1+4); PrintText(MSG(MQuickViewContains)); GotoXY(X1+2,Y1+6); PrintText(MSG(MQuickViewFolders)); SetColor(COL_PANELINFOTEXT); FString.Clear(); FString<<DirCount; PrintText(FString); SetColor(COL_PANELTEXT); GotoXY(X1+2,Y1+7); PrintText(MSG(MQuickViewFiles)); SetColor(COL_PANELINFOTEXT); FString.Clear(); FString<<FileCount; PrintText(FString); SetColor(COL_PANELTEXT); GotoXY(X1+2,Y1+8); PrintText(MSG(MQuickViewBytes)); SetColor(COL_PANELINFOTEXT); FARString strSize; InsertCommas(FileSize,strSize); PrintText(strSize); SetColor(COL_PANELTEXT); GotoXY(X1+2,Y1+9); PrintText(MSG(MQuickViewCompressed)); SetColor(COL_PANELINFOTEXT); InsertCommas(CompressedFileSize,strSize); PrintText(strSize); SetColor(COL_PANELTEXT); GotoXY(X1+2,Y1+10); PrintText(MSG(MQuickViewRatio)); SetColor(COL_PANELINFOTEXT); FString.Clear(); FString<<ToPercent64(CompressedFileSize,FileSize)<<L"%"; PrintText(FString); if (Directory!=4 && RealFileSize>=CompressedFileSize) { SetColor(COL_PANELTEXT); GotoXY(X1+2,Y1+12); PrintText(MSG(MQuickViewCluster)); SetColor(COL_PANELINFOTEXT); FARString strSize; InsertCommas(ClusterSize,strSize); PrintText(strSize); SetColor(COL_PANELTEXT); GotoXY(X1+2,Y1+13); PrintText(MSG(MQuickViewRealSize)); SetColor(COL_PANELINFOTEXT); InsertCommas(RealFileSize,strSize); PrintText(strSize); SetColor(COL_PANELTEXT); GotoXY(X1+2,Y1+14); PrintText(MSG(MQuickViewSlack)); SetColor(COL_PANELINFOTEXT); InsertCommas(RealFileSize-CompressedFileSize,strSize); uint64_t Size1=RealFileSize-CompressedFileSize; uint64_t Size2=RealFileSize; while ((Size2 >> 32) ) { Size1=Size1>>1; Size2=Size2>>1; } FString.Clear(); FString<<strSize<<L" ("<<ToPercent((DWORD)Size1, (DWORD)Size2)<<L"%)"; PrintText(FString); } }