SEXP ConvertValue(bson_iter_t* iter){ if(BSON_ITER_HOLDS_INT32(iter)){ return ScalarInteger(bson_iter_int32(iter)); } else if(BSON_ITER_HOLDS_NULL(iter)){ return R_NilValue; } else if(BSON_ITER_HOLDS_BOOL(iter)){ return ScalarLogical(bson_iter_bool(iter)); } else if(BSON_ITER_HOLDS_DOUBLE(iter)){ return ScalarReal(bson_iter_double(iter)); } else if(BSON_ITER_HOLDS_INT64(iter)){ return ScalarReal((double) bson_iter_int64(iter)); } else if(BSON_ITER_HOLDS_UTF8(iter)){ return mkStringUTF8(bson_iter_utf8(iter, NULL)); } else if(BSON_ITER_HOLDS_CODE(iter)){ return mkStringUTF8(bson_iter_code(iter, NULL)); } else if(BSON_ITER_HOLDS_BINARY(iter)){ return ConvertBinary(iter); } else if(BSON_ITER_HOLDS_DATE_TIME(iter)){ return ConvertDate(iter); } else if(BSON_ITER_HOLDS_OID(iter)){ const bson_oid_t *val = bson_iter_oid(iter); char str[25]; bson_oid_to_string(val, str); return mkString(str); } else if(BSON_ITER_HOLDS_ARRAY(iter)){ bson_iter_t child1; bson_iter_t child2; bson_iter_recurse (iter, &child1); bson_iter_recurse (iter, &child2); return ConvertArray(&child1, &child2); } else if(BSON_ITER_HOLDS_DOCUMENT(iter)){ bson_iter_t child1; bson_iter_t child2; bson_iter_recurse (iter, &child1); bson_iter_recurse (iter, &child2); return ConvertObject(&child1, &child2); } else { stop("Unimplemented BSON type %d\n", bson_iter_type(iter)); } }
SEXP ConvertValue(bson_iter_t* iter){ if(BSON_ITER_HOLDS_INT32(iter)){ return ScalarInteger(bson_iter_int32(iter)); } else if(BSON_ITER_HOLDS_NULL(iter)){ return R_NilValue; } else if(BSON_ITER_HOLDS_BOOL(iter)){ return ScalarLogical(bson_iter_bool(iter)); } else if(BSON_ITER_HOLDS_DOUBLE(iter)){ return ScalarReal(bson_iter_double(iter)); } else if(BSON_ITER_HOLDS_INT64(iter)){ return ScalarReal((double) bson_iter_int64(iter)); } else if(BSON_ITER_HOLDS_UTF8(iter)){ return mkStringUTF8(bson_iter_utf8(iter, NULL)); } else if(BSON_ITER_HOLDS_CODE(iter)){ return mkStringUTF8(bson_iter_code(iter, NULL)); } else if(BSON_ITER_HOLDS_BINARY(iter)){ return ConvertBinary(iter); } else if(BSON_ITER_HOLDS_DATE_TIME(iter)){ return ConvertDate(iter); } else if(BSON_ITER_HOLDS_OID(iter)){ //not sure if this casting works return mkRaw((unsigned char *) bson_iter_oid(iter), 12); } else if(BSON_ITER_HOLDS_ARRAY(iter)){ bson_iter_t child1; bson_iter_t child2; bson_iter_recurse (iter, &child1); bson_iter_recurse (iter, &child2); return ConvertArray(&child1, &child2); } else if(BSON_ITER_HOLDS_DOCUMENT(iter)){ bson_iter_t child1; bson_iter_t child2; bson_iter_recurse (iter, &child1); bson_iter_recurse (iter, &child2); return ConvertObject(&child1, &child2); } else { stop("Unimplemented BSON type %d\n", bson_iter_type(iter)); } }
history_return_type History::ProcessMenu(string &strStr, GUID* Guid, string *pstrFile, string *pstrData, const wchar_t *Title, VMenu2 &HistoryMenu, int Height, history_record_type &Type, Dialog *Dlg) { unsigned __int64 SelectedRecord = 0; string strSelectedRecordName,strSelectedRecordGuid,strSelectedRecordFile,strSelectedRecordData; history_record_type SelectedRecordType = HR_DEFAULT; FarListPos Pos={sizeof(FarListPos)}; int MenuExitCode=-1; history_return_type RetCode = HRT_ENTER; bool Done=false; bool SetUpMenuPos=false; if (m_TypeHistory == HISTORYTYPE_DIALOG && !HistoryCfgRef()->Count(m_TypeHistory,m_HistoryName)) return HRT_CANCEL; while (!Done) { bool IsUpdate=false; HistoryMenu.DeleteItems(); { bool bSelected=false; DWORD index=0; string strHName,strHGuid,strHFile,strHData; history_record_type HType; bool HLock; unsigned __int64 id; unsigned __int64 Time; SYSTEMTIME st; GetLocalTime(&st); int LastDay=0, LastMonth = 0, LastYear = 0; const auto GetTitle = [](history_record_type Type) -> const wchar_t* { switch (Type) { case HR_VIEWER: return MSG(MHistoryView); case HR_EDITOR: case HR_EDITOR_RO: return MSG(MHistoryEdit); case HR_EXTERNAL: case HR_EXTERNAL_WAIT: return MSG(MHistoryExt); } return L""; }; while (HistoryCfgRef()->Enum(index++,m_TypeHistory,m_HistoryName,&id,strHName,&HType,&HLock,&Time,strHGuid,strHFile,strHData,m_TypeHistory==HISTORYTYPE_DIALOG)) { string strRecord; if (m_TypeHistory == HISTORYTYPE_VIEW) strRecord = GetTitle(HType) + string(L":") + (HType == HR_EDITOR_RO ? L"-" : L" "); else if (m_TypeHistory == HISTORYTYPE_FOLDER) { GUID HGuid; if(StrToGuid(strHGuid,HGuid) && HGuid != FarGuid) { Plugin *pPlugin = Global->CtrlObject->Plugins->FindPlugin(HGuid); strRecord = (pPlugin ? pPlugin->GetTitle() : L"{" + strHGuid + L"}") + L":"; if(!strHFile.empty()) strRecord += strHFile + L":"; } } auto FTTime = UI64ToFileTime(Time); SYSTEMTIME SavedTime; Utc2Local(FTTime, SavedTime); if(LastDay != SavedTime.wDay || LastMonth != SavedTime.wMonth || LastYear != SavedTime.wYear) { LastDay = SavedTime.wDay; LastMonth = SavedTime.wMonth; LastYear = SavedTime.wYear; MenuItemEx Separator; Separator.Flags = LIF_SEPARATOR; string strTime; ConvertDate(FTTime, Separator.strName, strTime, 5, FALSE, FALSE, TRUE); HistoryMenu.AddItem(Separator); } strRecord += strHName; if (m_TypeHistory != HISTORYTYPE_DIALOG) ReplaceStrings(strRecord, L"&", L"&&"); MenuItemEx MenuItem(strRecord); MenuItem.SetCheck(HLock?1:0); if (!SetUpMenuPos && m_CurrentItem==id) { MenuItem.SetSelect(TRUE); bSelected=true; } HistoryMenu.SetUserData(&id,sizeof(id),HistoryMenu.AddItem(MenuItem)); } if (!SetUpMenuPos && !bSelected && m_TypeHistory!=HISTORYTYPE_DIALOG) { FarListPos p={sizeof(FarListPos)}; p.SelectPos = HistoryMenu.GetItemCount()-1; p.TopPos = 0; HistoryMenu.SetSelectPos(&p); } } if (m_TypeHistory == HISTORYTYPE_DIALOG) { int X1,Y1,X2,Y2; Dlg->CalcComboBoxPos(nullptr, HistoryMenu.GetItemCount(), X1, Y1, X2, Y2); HistoryMenu.SetPosition(X1, Y1, X2, Y2); } else HistoryMenu.SetPosition(-1,-1,0,0); if (SetUpMenuPos) { Pos.SelectPos=Pos.SelectPos < HistoryMenu.GetItemCount() ? Pos.SelectPos : HistoryMenu.GetItemCount()-1; Pos.TopPos=std::min(Pos.TopPos,HistoryMenu.GetItemCount()-Height); HistoryMenu.SetSelectPos(&Pos); SetUpMenuPos=false; } if(m_TypeHistory == HISTORYTYPE_DIALOG && !HistoryMenu.GetItemCount()) return HRT_CANCEL; MenuExitCode=HistoryMenu.Run([&](const Manager::Key& RawKey)->int { const auto Key=RawKey.FarKey(); if (m_TypeHistory == HISTORYTYPE_DIALOG && Key==KEY_TAB) // Tab в списке хистори диалогов - аналог Enter { HistoryMenu.Close(); return 1; } HistoryMenu.GetSelectPos(&Pos); void* Data = HistoryMenu.GetUserData(nullptr, 0,Pos.SelectPos); unsigned __int64 CurrentRecord = Data? *static_cast<unsigned __int64*>(Data) : 0; int KeyProcessed = 1; switch (Key) { case KEY_CTRLR: // обновить с удалением недоступных case KEY_RCTRLR: { if (m_TypeHistory == HISTORYTYPE_FOLDER || m_TypeHistory == HISTORYTYPE_VIEW) { bool ModifiedHistory=false; SCOPED_ACTION(auto) = HistoryCfgRef()->ScopedTransaction(); DWORD index=0; string strHName,strHGuid,strHFile,strHData; history_record_type HType; bool HLock; unsigned __int64 id; unsigned __int64 Time; while (HistoryCfgRef()->Enum(index++,m_TypeHistory,m_HistoryName,&id,strHName,&HType,&HLock,&Time,strHGuid,strHFile,strHData)) { if (HLock) // залоченные не трогаем continue; // убить запись из истории bool kill=false; GUID HGuid; if(StrToGuid(strHGuid,HGuid) && HGuid != FarGuid) { if (!Global->CtrlObject->Plugins->FindPlugin(HGuid)) kill=true; else if (!strHFile.empty() && !os::fs::exists(strHFile)) kill=true; } else if (!os::fs::exists(strHName)) kill=true; if(kill) { HistoryCfgRef()->Delete(id); ModifiedHistory=true; } } if (ModifiedHistory) // избавляемся от лишних телодвижений { IsUpdate=true; HistoryMenu.Close(Pos.SelectPos); } ResetPosition(); } break; } case KEY_CTRLSHIFTNUMENTER: case KEY_RCTRLSHIFTNUMENTER: case KEY_CTRLNUMENTER: case KEY_RCTRLNUMENTER: case KEY_SHIFTNUMENTER: case KEY_CTRLSHIFTENTER: case KEY_RCTRLSHIFTENTER: case KEY_CTRLENTER: case KEY_RCTRLENTER: 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: { if (m_TypeHistory == HISTORYTYPE_DIALOG) break; HistoryMenu.Close(Pos.SelectPos); Done=true; RetCode = (Key==KEY_CTRLALTENTER||Key==KEY_RCTRLRALTENTER||Key==KEY_CTRLRALTENTER||Key==KEY_RCTRLALTENTER|| Key==KEY_CTRLALTNUMENTER||Key==KEY_RCTRLRALTNUMENTER||Key==KEY_CTRLRALTNUMENTER||Key==KEY_RCTRLALTNUMENTER)? HRT_CTRLALTENTER :((Key==KEY_CTRLSHIFTENTER||Key==KEY_RCTRLSHIFTENTER||Key==KEY_CTRLSHIFTNUMENTER||Key==KEY_RCTRLSHIFTNUMENTER)? HRT_CTRLSHIFTENTER :((Key==KEY_SHIFTENTER||Key==KEY_SHIFTNUMENTER)? HRT_SHIFTETNER :HRT_CTRLENTER)); break; } case KEY_F3: case KEY_F4: case KEY_NUMPAD5: case KEY_SHIFTNUMPAD5: { if (m_TypeHistory != HISTORYTYPE_VIEW) break; HistoryMenu.Close(Pos.SelectPos); Done=true; RetCode=(Key==KEY_F4? HRT_F4 : HRT_F3); break; } // $ 09.04.2001 SVS - Фича - копирование из истории строки в Clipboard case KEY_CTRLC: case KEY_RCTRLC: case KEY_CTRLINS: case KEY_CTRLNUMPAD0: case KEY_RCTRLINS: case KEY_RCTRLNUMPAD0: { if (CurrentRecord) { string strName; if (HistoryCfgRef()->Get(CurrentRecord, strName)) SetClipboard(strName); } break; } // Lock/Unlock case KEY_INS: case KEY_NUMPAD0: { if (CurrentRecord) { HistoryCfgRef()->FlipLock(CurrentRecord); ResetPosition(); HistoryMenu.Close(Pos.SelectPos); IsUpdate=true; SetUpMenuPos=true; } break; } case KEY_SHIFTNUMDEL: case KEY_SHIFTDEL: { if (CurrentRecord && !HistoryCfgRef()->IsLocked(CurrentRecord)) { HistoryCfgRef()->Delete(CurrentRecord); ResetPosition(); HistoryMenu.Close(Pos.SelectPos); IsUpdate=true; SetUpMenuPos=true; } break; } case KEY_NUMDEL: case KEY_DEL: { if (HistoryMenu.GetItemCount() && (!Global->Opt->Confirm.HistoryClear || (Global->Opt->Confirm.HistoryClear && !Message(MSG_WARNING,2, MSG((m_TypeHistory==HISTORYTYPE_CMD || m_TypeHistory==HISTORYTYPE_DIALOG?MHistoryTitle: (m_TypeHistory==HISTORYTYPE_FOLDER?MFolderHistoryTitle:MViewHistoryTitle))), MSG(MHistoryClear), MSG(MClear),MSG(MCancel))))) { HistoryCfgRef()->DeleteAllUnlocked(m_TypeHistory,m_HistoryName); ResetPosition(); HistoryMenu.Close(Pos.SelectPos); IsUpdate=true; } break; } default: KeyProcessed = 0; } return KeyProcessed; }); if (IsUpdate) continue; Done=true; if (MenuExitCode >= 0) { SelectedRecord = *static_cast<unsigned __int64*>(HistoryMenu.GetUserData(nullptr, 0, MenuExitCode)); if (!SelectedRecord) return HRT_CANCEL; if (!HistoryCfgRef()->Get(SelectedRecord, strSelectedRecordName, &SelectedRecordType, strSelectedRecordGuid, strSelectedRecordFile, strSelectedRecordData)) return HRT_CANCEL; #if 1 //Maximus: для сетевых ресурсов - танцы с бубном if (Global->Opt->RemoteAutoLogin && SelectedRecordType != HR_EXTERNAL && SelectedRecordType != HR_EXTERNAL_WAIT // ignore external && RetCode != HRT_CTRLENTER && ((m_TypeHistory == HISTORYTYPE_FOLDER && strSelectedRecordGuid.empty()) || m_TypeHistory == HISTORYTYPE_VIEW)) { size_t DirOffset = 0; PATH_TYPE Type = ParsePath(strSelectedRecordName, &DirOffset); string strCopy = DirOffset ? strSelectedRecordName.substr(0, DirOffset) : strSelectedRecordName.data(); if (Type == PATH_REMOTE /*|| Type == PATH_REMOTEUNC*/) { auto DE = std::make_unique<elevation::suppress>(); if (os::GetFileAttributes(strSelectedRecordName) == INVALID_FILE_ATTRIBUTES) { FarMacroValue vParams[2]={L"connect",strCopy.data()}; OpenMacroInfo info={sizeof(OpenMacroInfo),2,vParams}; void* CallResult = nullptr; //we must pass (&CallResult) to avoid memory leak Global->CtrlObject->Plugins->CallPlugin(Global->Opt->KnownIDs.Network.Id, OPEN_FROMMACRO, &info, &CallResult); //CallResult==1 on succeess? } } } //Maximus: поплясали - теперь как обычно if (SelectedRecordType != HR_EXTERNAL && SelectedRecordType != HR_EXTERNAL_WAIT && RetCode != HRT_CTRLENTER && ((m_TypeHistory == HISTORYTYPE_FOLDER && strSelectedRecordGuid.empty()) || m_TypeHistory == HISTORYTYPE_VIEW) && !os::fs::exists(strSelectedRecordName)) #else if (SelectedRecordType != HR_EXTERNAL && SelectedRecordType != HR_EXTERNAL_WAIT && RetCode != HRT_CTRLENTER && ((m_TypeHistory == HISTORYTYPE_FOLDER && strSelectedRecordGuid.empty()) || m_TypeHistory == HISTORYTYPE_VIEW) && !os::fs::exists(strSelectedRecordName)) #endif { SetLastError(ERROR_FILE_NOT_FOUND); Global->CatchError(); if (SelectedRecordType == HR_EDITOR && m_TypeHistory == HISTORYTYPE_VIEW) // Edit? тогда спросим и если надо создадим { if (!Message(MSG_WARNING|MSG_ERRORTYPE,2,Title,strSelectedRecordName.data(),MSG(MViewHistoryIsCreate),MSG(MHYes),MSG(MHNo))) break; } else { Message(MSG_WARNING|MSG_ERRORTYPE,1,Title,strSelectedRecordName.data(),MSG(MOk)); } Done=false; SetUpMenuPos=true; continue; } } } if (MenuExitCode < 0 || !SelectedRecord) return HRT_CANCEL; if (m_KeepSelectedPos) { m_CurrentItem = SelectedRecord; } strStr = strSelectedRecordName; if(Guid) { if(!StrToGuid(strSelectedRecordGuid,*Guid)) *Guid = FarGuid; } if(pstrFile) *pstrFile = strSelectedRecordFile; if(pstrData) *pstrData = strSelectedRecordData; switch(RetCode) { case HRT_CANCEL: break; case HRT_ENTER: case HRT_SHIFTETNER: case HRT_CTRLENTER: case HRT_CTRLSHIFTENTER: case HRT_CTRLALTENTER: Type = SelectedRecordType; break; case HRT_F3: Type = HR_VIEWER; RetCode = HRT_ENTER; break; case HRT_F4: Type = HR_EDITOR; if (SelectedRecordType == HR_EDITOR_RO) Type = HR_EDITOR_RO; RetCode = HRT_ENTER; break; } return RetCode; }
bool FileFilterConfig(FileFilterParams *FF, bool ColorConfig) { const wchar_t VerticalLine[] = {BoxSymbols[BS_T_H1V1],BoxSymbols[BS_V1],BoxSymbols[BS_V1],BoxSymbols[BS_V1],BoxSymbols[BS_B_H1V1],0}; // Временная маска. CFileMask FileMask; // История для маски файлов const wchar_t FilterMasksHistoryName[] = L"FilterMasks"; // История для имени фильтра const wchar_t FilterNameHistoryName[] = L"FilterName"; // Маски для диалога настройки // Маска для ввода дней для относительной даты const wchar_t DaysMask[] = L"9999"; string strDateMask, strTimeMask; // Определение параметров даты и времени в системе. wchar_t DateSeparator=GetDateSeparator(); wchar_t TimeSeparator=GetTimeSeparator(); wchar_t DecimalSeparator=GetDecimalSeparator(); int DateFormat=GetDateFormat(); switch (DateFormat) { case 0: // Маска даты для форматов DD.MM.YYYYY и MM.DD.YYYYY strDateMask = FormatString() << L"99" << DateSeparator << "99" << DateSeparator << "9999N"; break; case 1: // Маска даты для форматов DD.MM.YYYYY и MM.DD.YYYYY strDateMask = FormatString() << L"99" << DateSeparator << "99" << DateSeparator << "9999N"; break; default: // Маска даты для формата YYYYY.MM.DD strDateMask = FormatString() << L"N9999" << DateSeparator << "c99" << DateSeparator << "c99"; break; } // Маска времени strTimeMask = FormatString() << L"99" << TimeSeparator << "99" << TimeSeparator << "99" << DecimalSeparator << "999"; FarDialogItem FilterDlgData[]= { {DI_DOUBLEBOX,3,1,76,20,0,nullptr,nullptr,DIF_SHOWAMPERSAND,MSG(MFileFilterTitle)}, {DI_TEXT,5,2,0,2,0,nullptr,nullptr,DIF_FOCUS,MSG(MFileFilterName)}, {DI_EDIT,5,2,74,2,0,FilterNameHistoryName,nullptr,DIF_HISTORY,L""}, {DI_TEXT,0,3,0,3,0,nullptr,nullptr,DIF_SEPARATOR,L""}, {DI_CHECKBOX,5,4,0,4,0,nullptr,nullptr,DIF_AUTOMATION,MSG(MFileFilterMatchMask)}, {DI_EDIT,5,4,74,4,0,FilterMasksHistoryName,nullptr,DIF_HISTORY,L""}, {DI_TEXT,0,5,0,5,0,nullptr,nullptr,DIF_SEPARATOR,L""}, {DI_CHECKBOX,5,6,0,6,0,nullptr,nullptr,DIF_AUTOMATION,MSG(MFileFilterSize)}, {DI_TEXT,7,7,8,7,0,nullptr,nullptr,0,MSG(MFileFilterSizeFromSign)}, {DI_EDIT,10,7,20,7,0,nullptr,nullptr,0,L""}, {DI_TEXT,7,8,8,8,0,nullptr,nullptr,0,MSG(MFileFilterSizeToSign)}, {DI_EDIT,10,8,20,8,0,nullptr,nullptr,0,L""}, {DI_CHECKBOX,24,6,0,6,0,nullptr,nullptr,DIF_AUTOMATION,MSG(MFileFilterDate)}, {DI_COMBOBOX,26,7,41,7,0,nullptr,nullptr,DIF_DROPDOWNLIST|DIF_LISTNOAMPERSAND,L""}, {DI_CHECKBOX,26,8,0,8,0,nullptr,nullptr,0,MSG(MFileFilterDateRelative)}, {DI_TEXT,48,7,50,7,0,nullptr,nullptr,0,MSG(MFileFilterDateBeforeSign)}, {DI_FIXEDIT,51,7,61,7,0,nullptr,strDateMask.CPtr(),DIF_MASKEDIT,L""}, {DI_FIXEDIT,51,7,61,7,0,nullptr,DaysMask,DIF_MASKEDIT,L""}, {DI_FIXEDIT,63,7,74,7,0,nullptr,strTimeMask.CPtr(),DIF_MASKEDIT,L""}, {DI_TEXT,48,8,50,8,0,nullptr,nullptr,0,MSG(MFileFilterDateAfterSign)}, {DI_FIXEDIT,51,8,61,8,0,nullptr,strDateMask.CPtr(),DIF_MASKEDIT,L""}, {DI_FIXEDIT,51,8,61,8,0,nullptr,DaysMask,DIF_MASKEDIT,L""}, {DI_FIXEDIT,63,8,74,8,0,nullptr,strTimeMask.CPtr(),DIF_MASKEDIT,L""}, {DI_BUTTON,0,6,0,6,0,nullptr,nullptr,DIF_BTNNOCLOSE,MSG(MFileFilterCurrent)}, {DI_BUTTON,0,6,74,6,0,nullptr,nullptr,DIF_BTNNOCLOSE,MSG(MFileFilterBlank)}, {DI_TEXT,0,9,0,9,0,nullptr,nullptr,DIF_SEPARATOR,L""}, {DI_VTEXT,22,5,22,9,0,nullptr,nullptr,DIF_BOXCOLOR,VerticalLine}, {DI_CHECKBOX, 5,10,0,10,0,nullptr,nullptr,DIF_AUTOMATION,MSG(MFileFilterAttr)}, {DI_CHECKBOX, 7,11,0,11,0,nullptr,nullptr,DIF_3STATE,MSG(MFileFilterAttrR)}, {DI_CHECKBOX, 7,12,0,12,0,nullptr,nullptr,DIF_3STATE,MSG(MFileFilterAttrA)}, {DI_CHECKBOX, 7,13,0,13,0,nullptr,nullptr,DIF_3STATE,MSG(MFileFilterAttrH)}, {DI_CHECKBOX, 7,14,0,14,0,nullptr,nullptr,DIF_3STATE,MSG(MFileFilterAttrS)}, {DI_CHECKBOX,29,11,0,11,0,nullptr,nullptr,DIF_3STATE,MSG(MFileFilterAttrD)}, {DI_CHECKBOX,29,12,0,12,0,nullptr,nullptr,DIF_3STATE,MSG(MFileFilterAttrC)}, {DI_CHECKBOX,29,13,0,13,0,nullptr,nullptr,DIF_3STATE,MSG(MFileFilterAttrE)}, {DI_CHECKBOX,29,14,0,14,0,nullptr,nullptr,DIF_3STATE,MSG(MFileFilterAttrNI)}, {DI_CHECKBOX,29,15,0,15,0,nullptr,nullptr,DIF_3STATE,MSG(MFileFilterAttrReparse)}, {DI_CHECKBOX,51,11,0,11,0,nullptr,nullptr,DIF_3STATE,MSG(MFileFilterAttrSparse)}, {DI_CHECKBOX,51,12,0,12,0,nullptr,nullptr,DIF_3STATE,MSG(MFileFilterAttrT)}, {DI_CHECKBOX,51,13,0,13,0,nullptr,nullptr,DIF_3STATE,MSG(MFileFilterAttrOffline)}, {DI_CHECKBOX,51,14,0,14,0,nullptr,nullptr,DIF_3STATE,MSG(MFileFilterAttrVirtual)}, {DI_TEXT,-1,14,0,14,0,nullptr,nullptr,DIF_SEPARATOR,MSG(MHighlightColors)}, {DI_TEXT,7,15,0,15,0,nullptr,nullptr,0,MSG(MHighlightMarkChar)}, {DI_FIXEDIT,5,15,5,15,0,nullptr,nullptr,0,L""}, {DI_CHECKBOX,0,15,0,15,0,nullptr,nullptr,0,MSG(MHighlightTransparentMarkChar)}, {DI_BUTTON,5,16,0,16,0,nullptr,nullptr,DIF_BTNNOCLOSE|DIF_NOBRACKETS,MSG(MHighlightFileName1)}, {DI_BUTTON,0,16,0,16,0,nullptr,nullptr,DIF_BTNNOCLOSE|DIF_NOBRACKETS,MSG(MHighlightMarking1)}, {DI_BUTTON,5,17,0,17,0,nullptr,nullptr,DIF_BTNNOCLOSE|DIF_NOBRACKETS,MSG(MHighlightFileName2)}, {DI_BUTTON,0,17,0,17,0,nullptr,nullptr,DIF_BTNNOCLOSE|DIF_NOBRACKETS,MSG(MHighlightMarking2)}, {DI_BUTTON,5,18,0,18,0,nullptr,nullptr,DIF_BTNNOCLOSE|DIF_NOBRACKETS,MSG(MHighlightFileName3)}, {DI_BUTTON,0,18,0,18,0,nullptr,nullptr,DIF_BTNNOCLOSE|DIF_NOBRACKETS,MSG(MHighlightMarking3)}, {DI_BUTTON,5,19,0,19,0,nullptr,nullptr,DIF_BTNNOCLOSE|DIF_NOBRACKETS,MSG(MHighlightFileName4)}, {DI_BUTTON,0,19,0,19,0,nullptr,nullptr,DIF_BTNNOCLOSE|DIF_NOBRACKETS,MSG(MHighlightMarking4)}, {DI_USERCONTROL,73-15-1,16,73-2,19,0,nullptr,nullptr,DIF_NOFOCUS,L""}, {DI_CHECKBOX,5,20,0,20,0,nullptr,nullptr,0,MSG(MHighlightContinueProcessing)}, {DI_TEXT,0,16,0,16,0,nullptr,nullptr,DIF_SEPARATOR,L""}, {DI_CHECKBOX,5,17,0,17,0,nullptr,nullptr,0,MSG(MFileHardLinksCount)},//добавляем новый чекбокс в панель {DI_TEXT,0,18,0,18,0,nullptr,nullptr,DIF_SEPARATOR,L""},// и разделитель {DI_BUTTON,0,19,0,19,0,nullptr,nullptr,DIF_DEFAULTBUTTON|DIF_CENTERGROUP,MSG(MOk)}, {DI_BUTTON,0,19,0,19,0,nullptr,nullptr,DIF_CENTERGROUP|DIF_BTNNOCLOSE,MSG(MFileFilterReset)}, {DI_BUTTON,0,19,0,19,0,nullptr,nullptr,DIF_CENTERGROUP,MSG(MFileFilterCancel)}, {DI_BUTTON,0,19,0,19,0,nullptr,nullptr,DIF_CENTERGROUP|DIF_BTNNOCLOSE,MSG(MFileFilterMakeTransparent)}, }; FilterDlgData[0].Data=MSG(ColorConfig?MFileHilightTitle:MFileFilterTitle); MakeDialogItemsEx(FilterDlgData,FilterDlg); if (ColorConfig) { FilterDlg[ID_FF_TITLE].Y2+=5; for (int i=ID_FF_NAME; i<=ID_FF_SEPARATOR1; i++) FilterDlg[i].Flags|=DIF_HIDDEN; for (int i=ID_FF_MATCHMASK; i<=ID_FF_VIRTUAL; i++) { FilterDlg[i].Y1-=2; FilterDlg[i].Y2-=2; } for (int i=ID_FF_SEPARATOR5; i<=ID_FF_MAKETRANSPARENT; i++) { FilterDlg[i].Y1+=5; FilterDlg[i].Y2+=5; } } else { for (int i=ID_HER_SEPARATOR1; i<=ID_HER_CONTINUEPROCESSING; i++) FilterDlg[i].Flags|=DIF_HIDDEN; FilterDlg[ID_FF_MAKETRANSPARENT].Flags=DIF_HIDDEN; } FilterDlg[ID_FF_NAMEEDIT].X1=FilterDlg[ID_FF_NAME].X1+(int)FilterDlg[ID_FF_NAME].strData.GetLength()-(FilterDlg[ID_FF_NAME].strData.Contains(L'&')?1:0)+1; FilterDlg[ID_FF_MASKEDIT].X1=FilterDlg[ID_FF_MATCHMASK].X1+(int)FilterDlg[ID_FF_MATCHMASK].strData.GetLength()-(FilterDlg[ID_FF_MATCHMASK].strData.Contains(L'&')?1:0)+5; FilterDlg[ID_FF_BLANK].X1=FilterDlg[ID_FF_BLANK].X2-(int)FilterDlg[ID_FF_BLANK].strData.GetLength()+(FilterDlg[ID_FF_BLANK].strData.Contains(L'&')?1:0)-3; FilterDlg[ID_FF_CURRENT].X2=FilterDlg[ID_FF_BLANK].X1-2; FilterDlg[ID_FF_CURRENT].X1=FilterDlg[ID_FF_CURRENT].X2-(int)FilterDlg[ID_FF_CURRENT].strData.GetLength()+(FilterDlg[ID_FF_CURRENT].strData.Contains(L'&')?1:0)-3; FilterDlg[ID_HER_MARKTRANSPARENT].X1=FilterDlg[ID_HER_MARK_TITLE].X1+(int)FilterDlg[ID_HER_MARK_TITLE].strData.GetLength()-(FilterDlg[ID_HER_MARK_TITLE].strData.Contains(L'&')?1:0)+1; for (int i=ID_HER_NORMALMARKING; i<=ID_HER_SELECTEDCURSORMARKING; i+=2) FilterDlg[i].X1=FilterDlg[ID_HER_NORMALFILE].X1+(int)FilterDlg[ID_HER_NORMALFILE].strData.GetLength()-(FilterDlg[ID_HER_NORMALFILE].strData.Contains(L'&')?1:0)+1; FAR_CHAR_INFO VBufColorExample[15*4]= {}; HighlightDataColor Colors; FF->GetColors(&Colors); HighlightDlgUpdateUserControl(VBufColorExample,Colors); FilterDlg[ID_HER_COLOREXAMPLE].VBuf=VBufColorExample; wchar_t MarkChar[] = {static_cast<wchar_t>(Colors.MarkChar), 0}; FilterDlg[ID_HER_MARKEDIT].strData=MarkChar; FilterDlg[ID_HER_MARKTRANSPARENT].Selected=(Colors.MarkChar&0xFF0000?1:0); FilterDlg[ID_HER_CONTINUEPROCESSING].Selected=(FF->GetContinueProcessing()?1:0); FilterDlg[ID_FF_NAMEEDIT].strData = FF->GetTitle(); const wchar_t *FMask; FilterDlg[ID_FF_MATCHMASK].Selected=FF->GetMask(&FMask)?1:0; FilterDlg[ID_FF_MASKEDIT].strData=FMask; if (!FilterDlg[ID_FF_MATCHMASK].Selected) FilterDlg[ID_FF_MASKEDIT].Flags|=DIF_DISABLE; const wchar_t *SizeAbove, *SizeBelow; FilterDlg[ID_FF_MATCHSIZE].Selected=FF->GetSize(&SizeAbove,&SizeBelow)?1:0; FilterDlg[ID_FF_SIZEFROMEDIT].strData=SizeAbove; FilterDlg[ID_FF_SIZETOEDIT].strData=SizeBelow; FilterDlg[ID_FF_HARDLINKS].Selected=FF->GetHardLinks(nullptr,nullptr)?1:0; //пока что мы проверям только флаг использования данного условия if (!FilterDlg[ID_FF_MATCHSIZE].Selected) for (int i=ID_FF_SIZEFROMSIGN; i <= ID_FF_SIZETOEDIT; i++) FilterDlg[i].Flags|=DIF_DISABLE; // Лист для комбобокса времени файла FarList DateList= {sizeof(FarList)}; FarListItem TableItemDate[FDATE_COUNT]= {}; // Настройка списка типов дат файла DateList.Items=TableItemDate; DateList.ItemsNumber=FDATE_COUNT; for (int i=0; i < FDATE_COUNT; ++i) TableItemDate[i].Text=MSG(MFileFilterWrited+i); DWORD DateType; FILETIME DateAfter, DateBefore; bool bRelative; FilterDlg[ID_FF_MATCHDATE].Selected=FF->GetDate(&DateType,&DateAfter,&DateBefore,&bRelative)?1:0; FilterDlg[ID_FF_DATERELATIVE].Selected=bRelative?1:0; FilterDlg[ID_FF_DATETYPE].ListItems=&DateList; TableItemDate[DateType].Flags=LIF_SELECTED; if (bRelative) { ConvertRelativeDate(DateAfter, FilterDlg[ID_FF_DAYSAFTEREDIT].strData, FilterDlg[ID_FF_TIMEAFTEREDIT].strData); ConvertRelativeDate(DateBefore, FilterDlg[ID_FF_DAYSBEFOREEDIT].strData, FilterDlg[ID_FF_TIMEBEFOREEDIT].strData); } else { ConvertDate(DateAfter,FilterDlg[ID_FF_DATEAFTEREDIT].strData,FilterDlg[ID_FF_TIMEAFTEREDIT].strData,12,FALSE,FALSE,2); ConvertDate(DateBefore,FilterDlg[ID_FF_DATEBEFOREEDIT].strData,FilterDlg[ID_FF_TIMEBEFOREEDIT].strData,12,FALSE,FALSE,2); } if (!FilterDlg[ID_FF_MATCHDATE].Selected) for (int i=ID_FF_DATETYPE; i <= ID_FF_BLANK; i++) FilterDlg[i].Flags|=DIF_DISABLE; DWORD AttrSet, AttrClear; FilterDlg[ID_FF_MATCHATTRIBUTES].Selected=FF->GetAttr(&AttrSet,&AttrClear)?1:0; FilterDlg[ID_FF_READONLY].Selected=(AttrSet & FILE_ATTRIBUTE_READONLY?1:AttrClear & FILE_ATTRIBUTE_READONLY?0:2); FilterDlg[ID_FF_ARCHIVE].Selected=(AttrSet & FILE_ATTRIBUTE_ARCHIVE?1:AttrClear & FILE_ATTRIBUTE_ARCHIVE?0:2); FilterDlg[ID_FF_HIDDEN].Selected=(AttrSet & FILE_ATTRIBUTE_HIDDEN?1:AttrClear & FILE_ATTRIBUTE_HIDDEN?0:2); FilterDlg[ID_FF_SYSTEM].Selected=(AttrSet & FILE_ATTRIBUTE_SYSTEM?1:AttrClear & FILE_ATTRIBUTE_SYSTEM?0:2); FilterDlg[ID_FF_COMPRESSED].Selected=(AttrSet & FILE_ATTRIBUTE_COMPRESSED?1:AttrClear & FILE_ATTRIBUTE_COMPRESSED?0:2); FilterDlg[ID_FF_ENCRYPTED].Selected=(AttrSet & FILE_ATTRIBUTE_ENCRYPTED?1:AttrClear & FILE_ATTRIBUTE_ENCRYPTED?0:2); FilterDlg[ID_FF_DIRECTORY].Selected=(AttrSet & FILE_ATTRIBUTE_DIRECTORY?1:AttrClear & FILE_ATTRIBUTE_DIRECTORY?0:2); FilterDlg[ID_FF_NOTINDEXED].Selected=(AttrSet & FILE_ATTRIBUTE_NOT_CONTENT_INDEXED?1:AttrClear & FILE_ATTRIBUTE_NOT_CONTENT_INDEXED?0:2); FilterDlg[ID_FF_SPARSE].Selected=(AttrSet & FILE_ATTRIBUTE_SPARSE_FILE?1:AttrClear & FILE_ATTRIBUTE_SPARSE_FILE?0:2); FilterDlg[ID_FF_TEMP].Selected=(AttrSet & FILE_ATTRIBUTE_TEMPORARY?1:AttrClear & FILE_ATTRIBUTE_TEMPORARY?0:2); FilterDlg[ID_FF_REPARSEPOINT].Selected=(AttrSet & FILE_ATTRIBUTE_REPARSE_POINT?1:AttrClear & FILE_ATTRIBUTE_REPARSE_POINT?0:2); FilterDlg[ID_FF_OFFLINE].Selected=(AttrSet & FILE_ATTRIBUTE_OFFLINE?1:AttrClear & FILE_ATTRIBUTE_OFFLINE?0:2); FilterDlg[ID_FF_VIRTUAL].Selected=(AttrSet & FILE_ATTRIBUTE_VIRTUAL?1:AttrClear & FILE_ATTRIBUTE_VIRTUAL?0:2); if (!FilterDlg[ID_FF_MATCHATTRIBUTES].Selected) { for (int i=ID_FF_READONLY; i <= ID_FF_VIRTUAL; i++) FilterDlg[i].Flags|=DIF_DISABLE; } Dialog Dlg(FilterDlg,ARRAYSIZE(FilterDlg),FileFilterConfigDlgProc,ColorConfig?&Colors:nullptr); Dlg.SetHelp(ColorConfig?L"HighlightEdit":L"Filter"); Dlg.SetPosition(-1,-1,FilterDlg[ID_FF_TITLE].X2+4,FilterDlg[ID_FF_TITLE].Y2+2); Dlg.SetAutomation(ID_FF_MATCHMASK,ID_FF_MASKEDIT,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHSIZE,ID_FF_SIZEFROMSIGN,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHSIZE,ID_FF_SIZEFROMEDIT,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHSIZE,ID_FF_SIZETOSIGN,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHSIZE,ID_FF_SIZETOEDIT,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHDATE,ID_FF_DATETYPE,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHDATE,ID_FF_DATERELATIVE,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHDATE,ID_FF_DATEAFTERSIGN,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHDATE,ID_FF_DATEAFTEREDIT,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHDATE,ID_FF_DAYSAFTEREDIT,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHDATE,ID_FF_TIMEAFTEREDIT,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHDATE,ID_FF_DATEBEFORESIGN,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHDATE,ID_FF_DATEBEFOREEDIT,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHDATE,ID_FF_DAYSBEFOREEDIT,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHDATE,ID_FF_TIMEBEFOREEDIT,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHDATE,ID_FF_CURRENT,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHDATE,ID_FF_BLANK,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHATTRIBUTES,ID_FF_READONLY,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHATTRIBUTES,ID_FF_ARCHIVE,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHATTRIBUTES,ID_FF_HIDDEN,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHATTRIBUTES,ID_FF_SYSTEM,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHATTRIBUTES,ID_FF_COMPRESSED,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHATTRIBUTES,ID_FF_ENCRYPTED,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHATTRIBUTES,ID_FF_NOTINDEXED,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHATTRIBUTES,ID_FF_SPARSE,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHATTRIBUTES,ID_FF_TEMP,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHATTRIBUTES,ID_FF_REPARSEPOINT,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHATTRIBUTES,ID_FF_OFFLINE,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHATTRIBUTES,ID_FF_VIRTUAL,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHATTRIBUTES,ID_FF_DIRECTORY,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); for (;;) { Dlg.ClearDone(); Dlg.Process(); int ExitCode=Dlg.GetExitCode(); if (ExitCode==ID_FF_OK) // Ok { // Если введённая пользователем маска не корректна, тогда вернёмся в диалог if (FilterDlg[ID_FF_MATCHMASK].Selected && !FileMask.Set(FilterDlg[ID_FF_MASKEDIT].strData,0)) continue; if (FilterDlg[ID_HER_MARKTRANSPARENT].Selected) Colors.MarkChar|=0x00FF0000; else Colors.MarkChar&=0x0000FFFF; FF->SetColors(&Colors); FF->SetContinueProcessing(FilterDlg[ID_HER_CONTINUEPROCESSING].Selected!=0); FF->SetTitle(FilterDlg[ID_FF_NAMEEDIT].strData); FF->SetMask(FilterDlg[ID_FF_MATCHMASK].Selected!=0, FilterDlg[ID_FF_MASKEDIT].strData); FF->SetSize(FilterDlg[ID_FF_MATCHSIZE].Selected!=0, FilterDlg[ID_FF_SIZEFROMEDIT].strData, FilterDlg[ID_FF_SIZETOEDIT].strData); FF->SetHardLinks(FilterDlg[ID_FF_HARDLINKS].Selected!=0,0,0); //пока устанавливаем только флаг использования признака bRelative = FilterDlg[ID_FF_DATERELATIVE].Selected!=0; LPWSTR TimeBefore = FilterDlg[ID_FF_TIMEBEFOREEDIT].strData.GetBuffer(); TimeBefore[8] = TimeSeparator; FilterDlg[ID_FF_TIMEBEFOREEDIT].strData.ReleaseBuffer(FilterDlg[ID_FF_TIMEBEFOREEDIT].strData.GetLength()); LPWSTR TimeAfter = FilterDlg[ID_FF_TIMEAFTEREDIT].strData.GetBuffer(); TimeAfter[8] = TimeSeparator; FilterDlg[ID_FF_TIMEAFTEREDIT].strData.ReleaseBuffer(FilterDlg[ID_FF_TIMEAFTEREDIT].strData.GetLength()); StrToDateTime(FilterDlg[bRelative?ID_FF_DAYSAFTEREDIT:ID_FF_DATEAFTEREDIT].strData,FilterDlg[ID_FF_TIMEAFTEREDIT].strData,DateAfter,DateFormat,DateSeparator,TimeSeparator,bRelative); StrToDateTime(FilterDlg[bRelative?ID_FF_DAYSBEFOREEDIT:ID_FF_DATEBEFOREEDIT].strData,FilterDlg[ID_FF_TIMEBEFOREEDIT].strData,DateBefore,DateFormat,DateSeparator,TimeSeparator,bRelative); FF->SetDate(FilterDlg[ID_FF_MATCHDATE].Selected!=0, FilterDlg[ID_FF_DATETYPE].ListPos, DateAfter, DateBefore, bRelative); AttrSet=0; AttrClear=0; AttrSet|=(FilterDlg[ID_FF_READONLY].Selected==1?FILE_ATTRIBUTE_READONLY:0); AttrSet|=(FilterDlg[ID_FF_ARCHIVE].Selected==1?FILE_ATTRIBUTE_ARCHIVE:0); AttrSet|=(FilterDlg[ID_FF_HIDDEN].Selected==1?FILE_ATTRIBUTE_HIDDEN:0); AttrSet|=(FilterDlg[ID_FF_SYSTEM].Selected==1?FILE_ATTRIBUTE_SYSTEM:0); AttrSet|=(FilterDlg[ID_FF_COMPRESSED].Selected==1?FILE_ATTRIBUTE_COMPRESSED:0); AttrSet|=(FilterDlg[ID_FF_ENCRYPTED].Selected==1?FILE_ATTRIBUTE_ENCRYPTED:0); AttrSet|=(FilterDlg[ID_FF_DIRECTORY].Selected==1?FILE_ATTRIBUTE_DIRECTORY:0); AttrSet|=(FilterDlg[ID_FF_NOTINDEXED].Selected==1?FILE_ATTRIBUTE_NOT_CONTENT_INDEXED:0); AttrSet|=(FilterDlg[ID_FF_SPARSE].Selected==1?FILE_ATTRIBUTE_SPARSE_FILE:0); AttrSet|=(FilterDlg[ID_FF_TEMP].Selected==1?FILE_ATTRIBUTE_TEMPORARY:0); AttrSet|=(FilterDlg[ID_FF_REPARSEPOINT].Selected==1?FILE_ATTRIBUTE_REPARSE_POINT:0); AttrSet|=(FilterDlg[ID_FF_OFFLINE].Selected==1?FILE_ATTRIBUTE_OFFLINE:0); AttrSet|=(FilterDlg[ID_FF_VIRTUAL].Selected==1?FILE_ATTRIBUTE_VIRTUAL:0); AttrClear|=(FilterDlg[ID_FF_READONLY].Selected==0?FILE_ATTRIBUTE_READONLY:0); AttrClear|=(FilterDlg[ID_FF_ARCHIVE].Selected==0?FILE_ATTRIBUTE_ARCHIVE:0); AttrClear|=(FilterDlg[ID_FF_HIDDEN].Selected==0?FILE_ATTRIBUTE_HIDDEN:0); AttrClear|=(FilterDlg[ID_FF_SYSTEM].Selected==0?FILE_ATTRIBUTE_SYSTEM:0); AttrClear|=(FilterDlg[ID_FF_COMPRESSED].Selected==0?FILE_ATTRIBUTE_COMPRESSED:0); AttrClear|=(FilterDlg[ID_FF_ENCRYPTED].Selected==0?FILE_ATTRIBUTE_ENCRYPTED:0); AttrClear|=(FilterDlg[ID_FF_DIRECTORY].Selected==0?FILE_ATTRIBUTE_DIRECTORY:0); AttrClear|=(FilterDlg[ID_FF_NOTINDEXED].Selected==0?FILE_ATTRIBUTE_NOT_CONTENT_INDEXED:0); AttrClear|=(FilterDlg[ID_FF_SPARSE].Selected==0?FILE_ATTRIBUTE_SPARSE_FILE:0); AttrClear|=(FilterDlg[ID_FF_TEMP].Selected==0?FILE_ATTRIBUTE_TEMPORARY:0); AttrClear|=(FilterDlg[ID_FF_REPARSEPOINT].Selected==0?FILE_ATTRIBUTE_REPARSE_POINT:0); AttrClear|=(FilterDlg[ID_FF_OFFLINE].Selected==0?FILE_ATTRIBUTE_OFFLINE:0); AttrClear|=(FilterDlg[ID_FF_VIRTUAL].Selected==0?FILE_ATTRIBUTE_VIRTUAL:0); FF->SetAttr(FilterDlg[ID_FF_MATCHATTRIBUTES].Selected!=0, AttrSet, AttrClear); return true; } else break; } return false; }
intptr_t WINAPI FileFilterConfigDlgProc(HANDLE hDlg,intptr_t Msg,intptr_t Param1,void* Param2) { switch (Msg) { case DN_INITDIALOG: { FilterDlgRelativeDateItemsUpdate(hDlg, false); return TRUE; } case DN_BTNCLICK: { if (Param1==ID_FF_CURRENT || Param1==ID_FF_BLANK) //Current и Blank { FILETIME ft; string strDate, strTime; if (Param1==ID_FF_CURRENT) { GetSystemTimeAsFileTime(&ft); ConvertDate(ft,strDate,strTime,12,FALSE,FALSE,2); } else { strDate.Clear(); strTime.Clear(); } SendDlgMessage(hDlg,DM_ENABLEREDRAW,FALSE,0); int relative = (int)SendDlgMessage(hDlg,DM_GETCHECK,ID_FF_DATERELATIVE,0); int db = relative ? ID_FF_DAYSBEFOREEDIT : ID_FF_DATEBEFOREEDIT; int da = relative ? ID_FF_DAYSAFTEREDIT : ID_FF_DATEAFTEREDIT; SendDlgMessage(hDlg,DM_SETTEXTPTR,da,const_cast<wchar_t*>(strDate.CPtr())); SendDlgMessage(hDlg,DM_SETTEXTPTR,ID_FF_TIMEAFTEREDIT,const_cast<wchar_t*>(strTime.CPtr())); SendDlgMessage(hDlg,DM_SETTEXTPTR,db,const_cast<wchar_t*>(strDate.CPtr())); SendDlgMessage(hDlg,DM_SETTEXTPTR,ID_FF_TIMEBEFOREEDIT,const_cast<wchar_t*>(strTime.CPtr())); SendDlgMessage(hDlg,DM_SETFOCUS,da,0); COORD r; r.X=r.Y=0; SendDlgMessage(hDlg,DM_SETCURSORPOS,da,&r); SendDlgMessage(hDlg,DM_ENABLEREDRAW,TRUE,0); break; } else if (Param1==ID_FF_RESET) // Reset { SendDlgMessage(hDlg,DM_ENABLEREDRAW,FALSE,0); intptr_t ColorConfig = SendDlgMessage(hDlg, DM_GETDLGDATA, 0, 0); SendDlgMessage(hDlg,DM_SETTEXTPTR,ID_FF_MASKEDIT,const_cast<wchar_t*>(L"*")); SendDlgMessage(hDlg,DM_SETTEXTPTR,ID_FF_SIZEFROMEDIT,nullptr); SendDlgMessage(hDlg,DM_SETTEXTPTR,ID_FF_SIZETOEDIT,nullptr); for (int I=ID_FF_READONLY; I <= ID_FF_VIRTUAL; ++I) { SendDlgMessage(hDlg,DM_SETCHECK,I,ToPtr(BSTATE_3STATE)); } if (!ColorConfig) SendDlgMessage(hDlg,DM_SETCHECK,ID_FF_DIRECTORY,ToPtr(BSTATE_UNCHECKED)); FarListPos LPos= {sizeof(FarListPos)}; SendDlgMessage(hDlg,DM_LISTSETCURPOS,ID_FF_DATETYPE,&LPos); SendDlgMessage(hDlg,DM_SETCHECK,ID_FF_MATCHMASK,ToPtr(BSTATE_CHECKED)); SendDlgMessage(hDlg,DM_SETCHECK,ID_FF_MATCHSIZE,ToPtr(BSTATE_UNCHECKED)); SendDlgMessage(hDlg,DM_SETCHECK,ID_FF_HARDLINKS,ToPtr(BSTATE_UNCHECKED)); SendDlgMessage(hDlg,DM_SETCHECK,ID_FF_MATCHDATE,ToPtr(BSTATE_UNCHECKED)); SendDlgMessage(hDlg,DM_SETCHECK,ID_FF_DATERELATIVE,ToPtr(BSTATE_UNCHECKED)); FilterDlgRelativeDateItemsUpdate(hDlg, true); SendDlgMessage(hDlg,DM_SETCHECK,ID_FF_MATCHATTRIBUTES,ToPtr(ColorConfig?BSTATE_UNCHECKED:BSTATE_CHECKED)); SendDlgMessage(hDlg,DM_ENABLEREDRAW,TRUE,0); break; } else if (Param1==ID_FF_MAKETRANSPARENT) { HighlightDataColor *Colors = (HighlightDataColor *) SendDlgMessage(hDlg, DM_GETDLGDATA, 0, 0); for (int i=0; i<2; i++) for (int j=0; j<4; j++) { MAKE_TRANSPARENT(Colors->Color[i][j].ForegroundColor); MAKE_TRANSPARENT(Colors->Color[i][j].BackgroundColor); } SendDlgMessage(hDlg,DM_SETCHECK,ID_HER_MARKTRANSPARENT,ToPtr(BSTATE_CHECKED)); break; } else if (Param1==ID_FF_DATERELATIVE) { FilterDlgRelativeDateItemsUpdate(hDlg, true); break; } } case DN_CONTROLINPUT: if ((Msg==DN_BTNCLICK && Param1 >= ID_HER_NORMALFILE && Param1 <= ID_HER_SELECTEDCURSORMARKING) || (Msg==DN_CONTROLINPUT && Param1==ID_HER_COLOREXAMPLE && ((INPUT_RECORD *)Param2)->EventType == MOUSE_EVENT && ((INPUT_RECORD *)Param2)->Event.MouseEvent.dwButtonState==FROM_LEFT_1ST_BUTTON_PRESSED)) { HighlightDataColor *EditData = (HighlightDataColor *) SendDlgMessage(hDlg, DM_GETDLGDATA, 0, 0); if (Msg==DN_CONTROLINPUT) { Param1 = ID_HER_NORMALFILE + ((INPUT_RECORD *)Param2)->Event.MouseEvent.dwMousePosition.Y*2; if (((INPUT_RECORD *)Param2)->Event.MouseEvent.dwMousePosition.X==1 && (EditData->MarkChar&0x0000FFFF)) Param1 = ID_HER_NORMALMARKING + ((INPUT_RECORD *)Param2)->Event.MouseEvent.dwMousePosition.Y*2; } //Color[0=file, 1=mark][0=normal,1=selected,2=undercursor,3=selectedundercursor] FarColor Color=EditData->Color[(Param1-ID_HER_NORMALFILE)&1][(Param1-ID_HER_NORMALFILE)/2]; Global->Console->GetColorDialog(Color,true,true); EditData->Color[(Param1-ID_HER_NORMALFILE)&1][(Param1-ID_HER_NORMALFILE)/2]=Color; size_t Size = SendDlgMessage(hDlg,DM_GETDLGITEM,ID_HER_COLOREXAMPLE,0); FarGetDialogItem gdi = {sizeof(FarGetDialogItem), Size, static_cast<FarDialogItem*>(xf_malloc(Size))}; SendDlgMessage(hDlg,DM_GETDLGITEM,ID_HER_COLOREXAMPLE,&gdi); //MarkChar это FIXEDIT размером в 1 символ wchar_t MarkChar[2]; FarDialogItemData item= {sizeof(FarDialogItemData),1,MarkChar}; SendDlgMessage(hDlg,DM_GETTEXT,ID_HER_MARKEDIT,&item); EditData->MarkChar=*MarkChar; HighlightDlgUpdateUserControl(gdi.Item->VBuf,*EditData); SendDlgMessage(hDlg,DM_SETDLGITEM,ID_HER_COLOREXAMPLE,gdi.Item); xf_free(gdi.Item); return TRUE; } break; case DN_EDITCHANGE: if (Param1 == ID_HER_MARKEDIT) { HighlightDataColor *EditData = (HighlightDataColor *) SendDlgMessage(hDlg, DM_GETDLGDATA, 0, 0); size_t Size = SendDlgMessage(hDlg,DM_GETDLGITEM,ID_HER_COLOREXAMPLE,0); FarGetDialogItem gdi = {sizeof(FarGetDialogItem), Size, static_cast<FarDialogItem*>(xf_malloc(Size))}; SendDlgMessage(hDlg,DM_GETDLGITEM,ID_HER_COLOREXAMPLE,&gdi); //MarkChar это FIXEDIT размером в 1 символ wchar_t MarkChar[2]; FarDialogItemData item= {sizeof(FarDialogItemData),1,MarkChar}; SendDlgMessage(hDlg,DM_GETTEXT,ID_HER_MARKEDIT,&item); EditData->MarkChar=*MarkChar; HighlightDlgUpdateUserControl(gdi.Item->VBuf,*EditData); SendDlgMessage(hDlg,DM_SETDLGITEM,ID_HER_COLOREXAMPLE,gdi.Item); xf_free(gdi.Item); return TRUE; } break; case DN_CLOSE: if (Param1 == ID_FF_OK && SendDlgMessage(hDlg,DM_GETCHECK,ID_FF_MATCHSIZE,0)) { string strTemp; FarDialogItemData item = {sizeof(FarDialogItemData)}; item.PtrLength = SendDlgMessage(hDlg,DM_GETTEXT,ID_FF_SIZEFROMEDIT,0); item.PtrData = strTemp.GetBuffer(item.PtrLength+1); SendDlgMessage(hDlg,DM_GETTEXT,ID_FF_SIZEFROMEDIT,&item); bool bTemp = !*item.PtrData || CheckFileSizeStringFormat(item.PtrData); item.PtrLength = SendDlgMessage(hDlg,DM_GETTEXT,ID_FF_SIZETOEDIT,0); item.PtrData = strTemp.GetBuffer(item.PtrLength+1); SendDlgMessage(hDlg,DM_GETTEXT,ID_FF_SIZETOEDIT,&item); bTemp = bTemp && (!*item.PtrData || CheckFileSizeStringFormat(item.PtrData)); if (!bTemp) { intptr_t ColorConfig = SendDlgMessage(hDlg, DM_GETDLGDATA, 0, 0); Message(MSG_WARNING,1,ColorConfig?MSG(MFileHilightTitle):MSG(MFileFilterTitle),MSG(MBadFileSizeFormat),MSG(MOk)); return FALSE; } } break; default: break; } return DefDlgProc(hDlg,Msg,Param1,Param2); }
const string FormatStr_DateTime(const FILETIME *FileTime,int ColumnType,unsigned __int64 Flags,int Width) { FormatString strResult; if (Width < 0) { if (ColumnType == DATE_COLUMN) Width=0; else return strResult; } int ColumnWidth=Width; bool Brief = (Flags & COLUMN_BRIEF) != 0; bool TextMonth = (Flags & COLUMN_MONTH) != 0; bool FullYear = false; switch(ColumnType) { case DATE_COLUMN: case TIME_COLUMN: { Brief = false; TextMonth = false; if (ColumnType == DATE_COLUMN) FullYear=ColumnWidth>9; break; } case WDATE_COLUMN: case CDATE_COLUMN: case ADATE_COLUMN: case CHDATE_COLUMN: { if (!Brief) { int CmpWidth=ColumnWidth-(TextMonth? 1: 0); if (CmpWidth==15 || CmpWidth==16 || CmpWidth==18 || CmpWidth==19 || CmpWidth>21) FullYear = true; } ColumnWidth-=9; break; } } string strDateStr,strTimeStr; ConvertDate(*FileTime,strDateStr,strTimeStr,ColumnWidth,Brief,TextMonth,FullYear); string strOutStr; switch(ColumnType) { case DATE_COLUMN: strOutStr=strDateStr; break; case TIME_COLUMN: strOutStr=strTimeStr; break; default: strOutStr=strDateStr+L" "+strTimeStr; break; } strResult<<fmt::ExactWidth(Width)<<strOutStr; return strResult; }