xref: /MusicPlayer2/MusicPlayer2/FileRelateDlg.cpp (revision a87de17200448923cd61634f894b94d41827fa4c)
1 // FileRelateDlg.cpp: 实现文件
2 //
3 
4 #include "stdafx.h"
5 #include "MusicPlayer2.h"
6 #include "FileRelateDlg.h"
7 #include "AudioCommon.h"
8 #include "RegFileRelate.h"
9 #include "Playlist.h"
10 
11 
12 // CFileRelateDlg 对话框
13 
IMPLEMENT_DYNAMIC(CFileRelateDlg,CBaseDialog)14 IMPLEMENT_DYNAMIC(CFileRelateDlg, CBaseDialog)
15 
16 CFileRelateDlg::CFileRelateDlg(CWnd* pParent /*=nullptr*/)
17 	: CBaseDialog(IDD_FILE_RELATE_DIALOG, pParent)
18 {
19 
20 }
21 
~CFileRelateDlg()22 CFileRelateDlg::~CFileRelateDlg()
23 {
24 }
25 
GetDialogName() const26 CString CFileRelateDlg::GetDialogName() const
27 {
28     return _T("FileRelateDlg");
29 }
30 
InitializeControls()31 bool CFileRelateDlg::InitializeControls()
32 {
33     wstring temp;
34     temp = theApp.m_str_table.LoadText(L"TITLE_FILE_RELATE");
35     SetWindowTextW(temp.c_str());
36     temp = theApp.m_str_table.LoadText(L"TXT_FILE_RELATE_SEL_DEFAULT");
37     SetDlgItemTextW(IDC_DEFAULT_BUTTON, temp.c_str());
38     temp = theApp.m_str_table.LoadText(L"TXT_FILE_RELATE_SEL_ALL");
39     SetDlgItemTextW(IDC_SELECT_ALL_CHECK, temp.c_str());
40 
41     RepositionTextBasedControls({
42         { CtrlTextInfo::L2, IDC_DEFAULT_BUTTON, CtrlTextInfo::W32 },
43         { CtrlTextInfo::L1, IDC_SELECT_ALL_CHECK, CtrlTextInfo::W16 },
44         { CtrlTextInfo::R1, IDOK, CtrlTextInfo::W32 },
45         { CtrlTextInfo::R2, IDCANCEL, CtrlTextInfo::W32 }
46         });
47     return true;
48 }
49 
DoDataExchange(CDataExchange * pDX)50 void CFileRelateDlg::DoDataExchange(CDataExchange* pDX)
51 {
52     CBaseDialog::DoDataExchange(pDX);
53     DDX_Control(pDX, IDC_LIST1, m_list_ctrl);
54 }
55 
56 
RefreshList()57 void CFileRelateDlg::RefreshList()
58 {
59     m_list_ctrl.DeleteAllItems();
60     int index = 0;
61     bool checked{ false }, unchecked{ false };
62     CRegFileRelate reg_file;
63     std::set<wstring> extensions;
64     for (const auto& item : CAudioCommon::m_all_surpported_extensions)
65         extensions.insert(item);
66     std::vector<wstring> related_extensions;
67     reg_file.GetAllRelatedExtensions(related_extensions);
68     for (auto item : related_extensions)
69     {
70         if (!item.empty() && item[0] == L'.')
71             item = item.substr(1);
72         extensions.insert(item);
73     }
74     for (auto item : CPlaylistFile::m_surpported_playlist)
75     {
76         if (!item.empty() && item[0] == L'.')
77             item = item.substr(1);
78         extensions.insert(item);
79     }
80 
81     for (const auto& item : extensions)
82     {
83         //if(item == L"cue")
84         //    continue;
85         m_list_ctrl.InsertItem(index, item.c_str());
86         wstring description = CAudioCommon::GetAudioDescriptionByExtension(item);
87         m_list_ctrl.SetItemText(index, 1, description.c_str());
88         bool related = reg_file.IsFileTypeRelated(item.c_str());
89         m_list_ctrl.SetCheck(index, related);
90         if (related)
91             checked = true;
92         else
93             unchecked = true;
94 
95         index++;
96     }
97 
98     CButton* pBtn = (CButton*)GetDlgItem(IDC_SELECT_ALL_CHECK);
99     if (pBtn != nullptr)
100     {
101         if (checked && !unchecked)
102             pBtn->SetCheck(BST_CHECKED);
103         else if (checked && unchecked)
104             pBtn->SetCheck(BST_INDETERMINATE);
105         else
106             pBtn->SetCheck(BST_UNCHECKED);
107     }
108 }
109 
BEGIN_MESSAGE_MAP(CFileRelateDlg,CBaseDialog)110 BEGIN_MESSAGE_MAP(CFileRelateDlg, CBaseDialog)
111     ON_BN_CLICKED(IDC_SELECT_ALL_CHECK, &CFileRelateDlg::OnBnClickedSelectAllCheck)
112     ON_BN_CLICKED(IDC_DEFAULT_BUTTON, &CFileRelateDlg::OnBnClickedDefaultButton)
113 END_MESSAGE_MAP()
114 
115 
116 // CFileRelateDlg 消息处理程序
117 
118 
119 BOOL CFileRelateDlg::OnInitDialog()
120 {
121     CBaseDialog::OnInitDialog();
122 
123     // TODO:  在此添加额外的初始化
124     SetIcon(IconMgr::IconType::IT_File_Relate, FALSE);
125 
126     CRect rect;
127     m_list_ctrl.GetWindowRect(rect);
128 
129     m_list_ctrl.SetExtendedStyle(m_list_ctrl.GetExtendedStyle() | LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES);
130     int width0 = theApp.DPI(120);
131     int width1 = rect.Width() - width0 - theApp.DPI(20) - 1;
132     m_list_ctrl.InsertColumn(0, theApp.m_str_table.LoadText(L"TXT_FILE_RELATE_FORMAT").c_str(), LVCFMT_LEFT, width0);
133     m_list_ctrl.InsertColumn(1, theApp.m_str_table.LoadText(L"TXT_FILE_RELATE_DESCRIPTION").c_str(), LVCFMT_LEFT, width1);
134 
135     RefreshList();
136 
137     m_list_ctrl.SetRowHeight(theApp.DPI(22));
138     m_list_ctrl.FillLeftSpaceAfterPaint(false);
139 
140     return TRUE;  // return TRUE unless you set the focus to a control
141                   // 异常: OCX 属性页应返回 FALSE
142 }
143 
144 
OnOK()145 void CFileRelateDlg::OnOK()
146 {
147     // TODO: 在此添加专用代码和/或调用基类
148     int list_count = m_list_ctrl.GetItemCount();
149     for (int i = 0; i < list_count; i++)
150     {
151         bool checked = m_list_ctrl.GetCheck(i) != FALSE;
152         CRegFileRelate reg_file;
153         if (checked)
154         {
155             CString file_ext = m_list_ctrl.GetItemText(i, 0);
156             wstring description = CAudioCommon::GetAudioDescriptionByExtension(wstring(file_ext));
157 
158             if (CPlaylistFile::IsPlaylistExt(wstring(file_ext)) || CAudioCommon::GetAudioTypeByFileExtension(wstring(file_ext)) == AU_CUE)
159                 reg_file.AddFileTypeRelate(file_ext, 66, false, description.c_str());
160             else
161                 reg_file.AddFileTypeRelate(file_ext, 46, false, description.c_str());
162         }
163         else
164         {
165             reg_file.DeleteFileTypeRelate(m_list_ctrl.GetItemText(i, 0));
166         }
167     }
168 
169     CBaseDialog::OnOK();
170 }
171 
172 
OnBnClickedSelectAllCheck()173 void CFileRelateDlg::OnBnClickedSelectAllCheck()
174 {
175     // TODO: 在此添加控件通知处理程序代码
176     CButton* pBtn = (CButton*)GetDlgItem(IDC_SELECT_ALL_CHECK);
177     if (pBtn == nullptr)
178         return;
179     BOOL checked{ pBtn->GetCheck() };
180     int list_count{ m_list_ctrl.GetItemCount() };
181     for (int i = 0; i < list_count; i++)
182         m_list_ctrl.SetCheck(i, checked);
183 }
184 
185 
OnBnClickedDefaultButton()186 void CFileRelateDlg::OnBnClickedDefaultButton()
187 {
188     //默认选中常见音频格式
189     std::set<wstring> default_selected{ L"aac", L"ac3", L"aif", L"aiff", L"amr", L"ape", L"asf", L"cda", L"cue", L"fla", L"flac", L"m4a", L"mac", L"mp+", L"mp3", L"mpc", L"mpp", L"oga", L"ogg", L"opus", L"spx", L"tta", L"wav", L"wma", L"wv"};
190     int list_count{ m_list_ctrl.GetItemCount() };
191     for (int i = 0; i < list_count; i++)
192     {
193         wstring item_str = m_list_ctrl.GetItemText(i, 0).GetString();
194         auto iter = default_selected.find(item_str);
195         if (iter != default_selected.end())
196             m_list_ctrl.SetCheck(i, TRUE);
197         else
198             m_list_ctrl.SetCheck(i, FALSE);
199     }
200 }
201