Index: src/ch/FilterDlg.cpp
===================================================================
diff -u -N -r31be0106a2d78fd0ddcb735f5351658abe56dc48 -r9250a0229add10f4315e76848c755f337a16ae95
--- src/ch/FilterDlg.cpp	(.../FilterDlg.cpp)	(revision 31be0106a2d78fd0ddcb735f5351658abe56dc48)
+++ src/ch/FilterDlg.cpp	(.../FilterDlg.cpp)	(revision 9250a0229add10f4315e76848c755f337a16ae95)
@@ -190,21 +190,8 @@
 	m_iHidden=m_ffFilter.GetHidden();
 	m_iSystem=m_ffFilter.GetSystem();
 	m_iDirectory=m_ffFilter.GetDirectory();
-	
-	HMENU hMenu = GetResManager().LoadMenu(MAKEINTRESOURCE(IDR_FILTER_TYPE_MENU));
-	m_menuFilterType.Attach(hMenu);
 
-	CMenu* pPopup = m_menuFilterType.GetSubMenu(0);
-	for(int iIndex = 0; iIndex < pPopup->GetMenuItemCount(); ++iIndex)
-	{
-		int iCmd = pPopup->GetMenuItemID(iIndex);
-		if(iCmd > 0)
-		{
-			CString strText;
-			pPopup->GetMenuString(iIndex, strText, MF_BYPOSITION);
-			m_mapFilterEntries.insert({ iCmd, (PCTSTR)strText });
-		}
-	}
+	m_filterTypesWrapper.Init();
 
 	UpdateData(FALSE);
 
@@ -408,27 +395,8 @@
 	{
 		if(LOWORD(wParam) >= ID_POPUP_FILTER_FILE_WILDCARD && LOWORD(wParam) <= ID_POPUP_FILTER_SEPARATOR_CHAR)
 		{
-			CComboBox& rCombo = m_bTracksIncludeButton ? m_ctlIncludeMask : m_ctlExcludeMask;
-
-			auto iterFnd = m_mapFilterEntries.find(LOWORD(wParam));
-			if(iterFnd != m_mapFilterEntries.end())
-			{
-				string::TString strEntry = iterFnd->second.c_str();
-				string::TStringArray arrStrings;
-				strEntry.Split(L"\t", arrStrings);
-
-				if(arrStrings.GetCount() > 1)
-				{
-					CString strText;
-					rCombo.GetWindowText(strText);
-
-					CString strParsed = arrStrings.GetAt(0).c_str();
-					if(!strText.IsEmpty() && strText.Right(1) != L";" && strParsed != L";")
-						strText += L";";
-
-					rCombo.SetWindowText(strText + strParsed);
-				}
-			}
+			CComboBox& rCombo = m_filterTypesWrapper.IsTrackingIncludeMask() ? m_ctlIncludeMask : m_ctlExcludeMask;
+			m_filterTypesWrapper.OnCommand(LOWORD(wParam), rCombo);
 		}
 	}
 	return ictranslate::CLanguageDialog::OnCommand(wParam, lParam);
@@ -487,24 +455,12 @@
 
 void CFilterDlg::OnIncludeMaskButton()
 {
-	m_bTracksIncludeButton = true;
-
-	// set point in which to set menu
-	CRect rect;
-	GetDlgItem(IDC_INCLUDE_MASK_BUTTON)->GetWindowRect(&rect);
-
-	m_menuFilterType.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, rect.right + 1, rect.top, this);
+	m_filterTypesWrapper.StartTracking(true, *this, IDC_INCLUDE_MASK_BUTTON);
 }
 
 void CFilterDlg::OnExcludeMaskButton()
 {
-	m_bTracksIncludeButton = false;
-
-	// set point in which to set menu
-	CRect rect;
-	GetDlgItem(IDC_EXCLUDE_MASK_BUTTON)->GetWindowRect(&rect);
-
-	m_menuFilterType.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, rect.right + 1, rect.top, this);
+	m_filterTypesWrapper.StartTracking(false, *this, IDC_EXCLUDE_MASK_BUTTON);
 }
 
 void CFilterDlg::OnDatetimechangeTime1Datetimepicker(NMHDR* /*pNMHDR*/, LRESULT* pResult)