OSDN Git Service

7e04839336fba5f1a42db4591a8d3f49e72d855a
[winmerge-jp/winmerge-jp.git] / Src / SelectUnpackerDlg.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 //    WinMerge:  an interactive diff/merge utility
3 //    Copyright (C) 1997-2000  Thingamahoochie Software
4 //    Author: Dean Grimm
5 //    SPDX-License-Identifier: GPL-2.0-or-later
6 /////////////////////////////////////////////////////////////////////////////
7 /**
8  * @file  SelectUnpackerDlg.cpp
9  *
10  * @brief Unpacker plugin selection dialog implementation.
11  */
12
13 #include "stdafx.h"
14 #include "SelectUnpackerDlg.h"
15 #include "Plugins.h"
16 #include "FileTransform.h"
17 #include "OptionsMgr.h"
18 #include "OptionsDef.h"
19
20 #ifdef _DEBUG
21 #define new DEBUG_NEW
22 #endif
23
24
25
26 /////////////////////////////////////////////////////////////////////////////
27 // CSelectUnpackerDlg dialog
28
29 void CSelectUnpackerDlg::Initialize()
30 {
31         //{{AFX_DATA_INIT(CSelectUnpackerDlg)
32         m_bNoExtensionCheck = false;
33         m_strDescription = _T("");
34         m_strExtensions = _T("");
35         //}}AFX_DATA_INIT
36
37         // texts for the default unpackers
38         noPlugin.reset(new PluginInfo);
39         noPlugin->m_lpDispatch = nullptr;
40         noPlugin->m_name = _("<None>");
41         automaticPlugin.reset(new PluginInfo);
42         automaticPlugin->m_lpDispatch = nullptr;
43         automaticPlugin->m_name = _("<Automatic>");
44         automaticPlugin->m_description = _("The adapted unpacker is applied to both files (one file only needs the extension).");
45
46         m_pPlugin = noPlugin.get();
47
48         PluginArray * piFileScriptArray = 
49                 CAllThreadsScripts::GetActiveSet()->GetAvailableScripts(L"FILE_PACK_UNPACK");
50         PluginArray * piBufferScriptArray = 
51                 CAllThreadsScripts::GetActiveSet()->GetAvailableScripts(L"BUFFER_PACK_UNPACK");
52         PluginArray * piFileFolderScriptArray = 
53                 CAllThreadsScripts::GetActiveSet()->GetAvailableScripts(L"FILE_FOLDER_PACK_UNPACK");
54
55         // add the default unpackers to the unpackers list
56         m_UnpackerPlugins.Add(noPlugin.get());
57         m_UnpackerPlugins.Add(automaticPlugin.get());
58         // add the real unpackers to the unpackers list
59         size_t i;
60         for (i = 0 ; i < piFileScriptArray->size() ; i++)
61         {
62                 // during the dialog, we use a pointer to the scriptsOfThreads array
63                 const PluginInfoPtr& plugin = piFileScriptArray->at(i);
64                 if (!plugin->m_disabled)
65                 {
66                         m_UnpackerPlugins.Add(plugin.get());
67                 }
68         }
69         for (i = 0 ; i < piBufferScriptArray->size() ; i++)
70         {
71                 // during the dialog, we use a pointer to the scriptsOfThreads array
72                 const PluginInfoPtr& plugin = piBufferScriptArray->at(i);
73                 if (!plugin->m_disabled)
74                 {
75                         m_UnpackerPlugins.Add(plugin.get());
76                 }
77         }
78         for (i = 0 ; i < piFileFolderScriptArray->size() ; i++)
79         {
80                 // during the dialog, we use a pointer to the scriptsOfThreads array
81                 const PluginInfoPtr& plugin = piFileFolderScriptArray->at(i);
82                 if (!plugin->m_disabled)
83                 {
84                         m_UnpackerPlugins.Add(plugin.get());
85                 }
86         }
87 }
88
89
90 CSelectUnpackerDlg::CSelectUnpackerDlg(const String& filename, CWnd* pParent /*= nullptr*/)
91         : CTrDialog(CSelectUnpackerDlg::IDD, pParent), m_filteredFilenames(filename)
92 {
93         Initialize();
94 }
95
96 CSelectUnpackerDlg::CSelectUnpackerDlg(const String& filename1, const String& filename2, CWnd* pParent /*= nullptr*/)
97         : CTrDialog(CSelectUnpackerDlg::IDD, pParent), m_filteredFilenames(filename1 + _T("|") + filename2)
98 {
99         Initialize();
100 }
101
102
103 CSelectUnpackerDlg::~CSelectUnpackerDlg()
104 {
105 }
106
107
108 void CSelectUnpackerDlg::SetInitialInfoHandler(PackingInfo * infoHandler)
109 {
110         // default value
111         m_pPlugin = noPlugin.get();
112
113         if (infoHandler != nullptr && infoHandler->m_PluginOrPredifferMode != PLUGIN_MODE::PLUGIN_MANUAL)
114                 // automatic unpacker
115                 m_pPlugin = automaticPlugin.get();
116         else if (infoHandler)
117         {
118                 // find the initial unpacker
119                 int i;
120                 for (i = 0 ; i < m_UnpackerPlugins.GetSize() ; i++)
121                 {
122                         PluginInfo * pPlugin = static_cast<PluginInfo*> (m_UnpackerPlugins.GetAt(i));
123                         if (pPlugin->m_name == infoHandler->m_PluginName)
124                                 m_pPlugin = pPlugin;
125                 }
126         }
127 }
128
129 const PackingInfo CSelectUnpackerDlg::GetInfoHandler()
130 {
131         if (m_pPlugin == noPlugin.get())
132                 return PackingInfo(PLUGIN_MODE::PLUGIN_MANUAL);
133         else if (m_pPlugin == automaticPlugin.get())
134                 return PackingInfo(PLUGIN_MODE::PLUGIN_AUTO);
135         else
136         {
137                 // build a real plugin unpacker
138                 PackingInfo infoHandler;
139                 infoHandler.m_PluginOrPredifferMode = PLUGIN_MODE::PLUGIN_MANUAL;
140                 infoHandler.m_PluginName = m_strPluginName;
141                 int i;
142                 for (i = 0 ; i < m_UnpackerPlugins.GetSize() ; i++)
143                 {
144                         PluginInfo * pPlugin = static_cast<PluginInfo*> (m_UnpackerPlugins.GetAt(i));
145                         if (m_pPlugin == pPlugin)
146                                 break;
147                 }
148                 return infoHandler;
149         }
150 }
151
152
153
154 void CSelectUnpackerDlg::DoDataExchange(CDataExchange* pDX)
155 {
156         CTrDialog::DoDataExchange(pDX);
157         //{{AFX_DATA_MAP(CSelectUnpackerDlg)
158         DDX_Control(pDX, IDC_UNPACKER_NAME, m_cboUnpackerName);
159         DDX_Check(pDX, IDC_UNPACKER_ALLOW_ALL, m_bNoExtensionCheck);
160         DDX_Text(pDX, IDC_UNPACKER_DESCRIPTION, m_strDescription);
161         DDX_Text(pDX, IDC_UNPACKER_SUPPORTED_EXTENSIONS, m_strExtensions);
162         //}}AFX_DATA_MAP
163 }
164
165
166 BEGIN_MESSAGE_MAP(CSelectUnpackerDlg, CTrDialog)
167         //{{AFX_MSG_MAP(CSelectUnpackerDlg)
168         ON_BN_CLICKED(IDC_UNPACKER_ALLOW_ALL, OnUnpackerAllowAll)
169         ON_CBN_SELCHANGE(IDC_UNPACKER_NAME, OnSelchangeUnpackerName)
170         ON_CBN_SELENDOK(IDC_UNPACKER_NAME, OnSelchangeUnpackerName)
171         //}}AFX_MSG_MAP
172 END_MESSAGE_MAP()
173
174 /////////////////////////////////////////////////////////////////////////////
175 // CSelectUnpackerDlg message handlers
176
177 void CSelectUnpackerDlg::OnOK() 
178 {
179         GetOptionsMgr()->SaveOption(OPT_PLUGINS_UNPACK_DONT_CHECK_EXTENSION, m_bNoExtensionCheck);
180
181         CTrDialog::OnOK();
182 }
183
184 BOOL CSelectUnpackerDlg::OnInitDialog() 
185 {
186         CTrDialog::OnInitDialog();
187
188         m_bNoExtensionCheck = GetOptionsMgr()->GetBool(OPT_PLUGINS_UNPACK_DONT_CHECK_EXTENSION);
189
190         prepareListbox();
191
192         return TRUE;  // return TRUE unless you set the focus to a control
193                       // EXCEPTION: OCX Property Pages should return FALSE
194 }
195
196 void CSelectUnpackerDlg::prepareListbox() 
197 {
198         int sel = -1;
199         int i;
200         for (i = 0 ; i < m_UnpackerPlugins.GetSize() ; i++)
201         {
202                 PluginInfo * pPlugin = static_cast<PluginInfo*> (m_UnpackerPlugins.GetAt(i));
203                 if (pPlugin == noPlugin.get() || pPlugin == automaticPlugin.get() 
204                                 || m_bNoExtensionCheck 
205                           || pPlugin->TestAgainstRegList(m_filteredFilenames))
206                 {
207                         m_cboUnpackerName.AddString(pPlugin->m_name.c_str());
208                         if (pPlugin == m_pPlugin)
209                                 sel = m_cboUnpackerName.GetCount()-1;
210                 }
211         }
212
213         if (sel == -1)
214                 m_cboUnpackerName.SelectString(-1, noPlugin->m_name.c_str());
215         else
216                 m_cboUnpackerName.SetCurSel(sel);
217
218         OnSelchangeUnpackerName();
219 }
220
221 void CSelectUnpackerDlg::OnUnpackerAllowAll() 
222 {
223         UpdateData ();
224
225         m_cboUnpackerName.ResetContent();
226
227         prepareListbox();
228
229         UpdateData (FALSE);
230 }
231
232 void CSelectUnpackerDlg::OnSelchangeUnpackerName() 
233 {
234         int i = m_cboUnpackerName.GetCurSel();
235         if (i == -1)
236         {
237                 m_pPlugin = noPlugin.get();
238         }
239         else
240         {
241                 // initialize with the default unpacker
242                 m_pPlugin = static_cast<PluginInfo*> (m_UnpackerPlugins.GetAt(0));
243                 PluginInfo * pPlugin;
244                 CString cstrPluginName;
245                 m_cboUnpackerName.GetWindowText(cstrPluginName);
246                 m_strPluginName = cstrPluginName;
247                 for (int j = 0 ; j < m_UnpackerPlugins.GetSize() ; j++)
248                 {
249                         pPlugin = static_cast<PluginInfo*> (m_UnpackerPlugins.GetAt(j));
250                         if (m_strPluginName == pPlugin->m_name)
251                         {
252                                 m_pPlugin = pPlugin;
253                                 break;
254                         }
255                 }
256         }
257
258         m_strPluginName = m_pPlugin->m_name;
259         m_strDescription = m_pPlugin->m_description;
260         m_strExtensions = m_pPlugin->m_filtersText;
261
262         UpdateData (FALSE);
263 }