OSDN Git Service

TPIHandleの各関数の返し値をboolにし、エラーコードをnErrorCodeに記録するよう変更。
[tpi/lychee.git] / src / frontend / frm_main.cpp
1 /*******************************************************************************
2   TPI - flexible but useless plug-in framework.
3   Copyright (C) 2002-2009 Silky
4
5   This library is free software; you can redistribute it and/or modify it under
6   the terms of the GNU Lesser General Public License as published by the Free
7   Software Foundation; either version 2.1 of the License, or (at your option)
8   any later version.
9
10   This library is distributed in the hope that it will be useful, but WITHOUT
11   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 
12   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
13   for more details.
14
15   You should have received a copy of the GNU Lesser General Public License along
16   with this library; if not, write to the Free Software Foundation, Inc.,
17   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
18
19   $Id: frm_main.cpp,v 1.42 2009/09/05 03:24:58 sirakaba Exp $
20 *******************************************************************************/
21
22 #include "frontend.h"
23
24 #include "frm_main.h"
25 #include "cls_filedroptarget.h"
26 #include "dlg_make.h"
27 #include "dlg_process.h"
28 #include "functions.h"
29
30 #include <wx/arrimpl.cpp>
31
32 WX_DEFINE_OBJARRAY(ArrayTPI_FILEINFO);
33
34 #define SetMenuToolState(id, state) this->toolbar->EnableTool(XRCID(id), state); this->menubar->Enable(XRCID(id), state)
35
36 //******************************************************************************
37 //    \83O\83\8d\81[\83o\83\8b\95Ï\90\94
38 //******************************************************************************
39
40 wxImageList g_hIconT(16, 16), g_hIconLL(32, 32), g_hIconLS(16, 16);
41 int g_nSortColumn;
42 bool g_fSortAscend;
43
44 //******************************************************************************
45 // MainFrame
46 //******************************************************************************
47
48 MainFrame::MainFrame(): wxFrame(), conf(wxEmptyString, wxEmptyString, FE_DIR_BIN wxT("frontend.conf"), wxEmptyString, wxCONFIG_USE_LOCAL_FILE | wxCONFIG_USE_RELATIVE_PATH)
49 {
50 }
51
52 MainFrame::~MainFrame()
53 {
54         wxCommandEvent e;
55         this->OnArcClose(e);
56
57         // \90Ý\92è\82ð\8bL\98^\81B
58         if (! this->IsIconized() && ! this->IsMaximized())
59         {
60                 int a, b;
61                 this->GetSize(& a, & b);
62                 this->conf.Write(wxT("Window-Width"), a);
63                 this->conf.Write(wxT("Window-Height"), b);
64                 this->GetPosition(& a, & b);
65                 this->conf.Write(wxT("Window-X"), a);
66                 this->conf.Write(wxT("Window-Y"), b);
67         }
68         this->conf.Write(wxT("Splitter-Pos"), this->window_splitter->GetSashPosition());
69
70         // \83c\81[\83\8b\83o\81[/\83X\83e\81[\83^\83X\83o\81[\8aÖ\98A\81B
71         this->conf.Write(wxT("StatusBar-Show"), this->statusbar->IsShown());
72         this->conf.Write(wxT("ToolBar-Show"),   this->toolbar->IsShown());
73
74         // ListView\8aÖ\98A\81B
75         this->conf.Write(wxT("ListView-IconMode"), this->menubar->IsChecked(XRCID("Exe_View_Icons")) ? 1 : this->menubar->IsChecked(XRCID("Exe_View_List")) ? 2 : 0);
76         if (this->menubar->IsChecked(XRCID("Exe_View_Details")))
77         {
78                 this->conf.Write(wxT("ListView-C-Filename"), this->list_ctrl->GetColumnWidth(0));
79                 this->conf.Write(wxT("ListView-C-Unpacked"), this->list_ctrl->GetColumnWidth(1));
80                 this->conf.Write(wxT("ListView-C-Packed"), this->list_ctrl->GetColumnWidth(2));
81                 this->conf.Write(wxT("ListView-C-Ratio"), this->list_ctrl->GetColumnWidth(3));
82                 this->conf.Write(wxT("ListView-C-Method"), this->list_ctrl->GetColumnWidth(4));
83                 this->conf.Write(wxT("ListView-C-Attr"), this->list_ctrl->GetColumnWidth(5));
84                 this->conf.Write(wxT("ListView-C-Lastmodified"), this->list_ctrl->GetColumnWidth(6));
85                 this->conf.Write(wxT("ListView-C-Path"), this->list_ctrl->GetColumnWidth(7));
86                 this->conf.Write(wxT("ListView-C-Type"), this->list_ctrl->GetColumnWidth(8));
87                 this->conf.Write(wxT("ListView-C-No"), this->list_ctrl->GetColumnWidth(9));
88                 this->conf.Write(wxT("ListView-SortColumn"), g_nSortColumn);
89                 this->conf.Write(wxT("ListView-SortAscend"), g_fSortAscend);
90         }
91
92         this->Close(true);
93 }
94
95 //******************************************************************************
96 // Event Table.
97 //******************************************************************************
98
99 BEGIN_EVENT_TABLE(MainFrame, wxFrame)
100         EVT_INIT_DIALOG(      MainFrame::OnInit)
101         // Menu
102         EVT_MENU(XRCID("Arc_Create"),  MainFrame::OnArcCreate)
103         EVT_MENU(XRCID("Arc_Open"),    MainFrame::OnArcOpen)
104         EVT_MENU(XRCID("Arc_Close"),   MainFrame::OnArcClose)
105         EVT_MENU(XRCID("Arc_Add"),     MainFrame::OnArcAdd)
106         EVT_MENU(XRCID("Arc_SFX"),     MainFrame::OnArcConvert)
107         EVT_MENU(XRCID("Arc_UnSFX"),   MainFrame::OnArcConvert)
108         EVT_MENU(XRCID("Exe_Exit"),    MainFrame::OnExit)
109         EVT_MENU(XRCID("Arc_Extract"), MainFrame::OnArcExtract)
110         EVT_MENU(XRCID("Arc_Delete"),  MainFrame::OnArcDelete)
111         EVT_MENU(XRCID("Arc_Test"),    MainFrame::OnArcTest)
112         EVT_MENU(XRCID("Arc_Repair"),  MainFrame::OnArcRepair)
113         EVT_MENU(XRCID("Exe_View_Icons"),  MainFrame::OnViewMode)
114         EVT_MENU(XRCID("Exe_View_Details"),MainFrame::OnViewMode)
115         EVT_MENU(XRCID("Exe_View_List"),   MainFrame::OnViewMode)
116         EVT_MENU(XRCID("Exe_View_ToolBar"),MainFrame::OnShowToolBar)
117         EVT_MENU(XRCID("Exe_View_StatusBar"),MainFrame::OnShowStatusBar)
118         EVT_MENU(XRCID("Exe_View_SelectAll"),MainFrame::OnSelectAll)
119         // TreeView
120         EVT_TREE_SEL_CHANGED(XRCID("TreeView"), MainFrame::OnTreeChanged)
121         EVT_TREE_BEGIN_DRAG( XRCID("TreeView"), MainFrame::OnTreeBeginDrag)
122         // ListView
123         EVT_LIST_ITEM_ACTIVATED(XRCID("ListView"), MainFrame::OnListItemDClick)
124         EVT_LIST_BEGIN_DRAG(    XRCID("ListView"), MainFrame::OnListBeginDrag)
125         // Filter
126         EVT_TEXT(XRCID("tcFilter"), MainFrame::OnFilter)
127 END_EVENT_TABLE()
128
129 //******************************************************************************
130 // Event handler.
131 //******************************************************************************
132
133 void MainFrame::OnInit(wxInitDialogEvent&)
134 {
135         // XRC\82Æ\8c\8b\82Ñ\82Â\82¯\81B
136         this->menubar    = this->GetMenuBar();
137         this->toolbar    = this->GetToolBar();
138         this->statusbar = XRCCTRL(* this, "statusbar", wxStatusBar);
139         this->tree_ctrl = XRCCTRL(* this, "TreeView", wxTreeCtrl);
140         this->list_ctrl = XRCCTRL(* this, "ListView", myListCtrl);
141         this->window_splitter = XRCCTRL(* this, "window_splitter", wxSplitterWindow);
142         this->tcFilter  = XRCCTRL(* this->toolbar, "tcFilter", wxTextCtrl);
143
144         // \90Ý\92è\82ð\93Ç\82Ý\8d\9e\82Ý\81B
145         this->SetSize(this->conf.Read(wxT("Window-X"), 0l), this->conf.Read(wxT("Window-Y"), 0l), this->conf.Read(wxT("Window-Width"), 800), this->conf.Read(wxT("Window-Height"), 400));
146         wxTheMimeTypesManager->Initialize(wxMAILCAP_ALL);
147
148         // \8f\89\8aú\92l\90Ý\92è\81B
149         {
150                 wxIcon icon;
151                 icon.CopyFromBitmap(wxBitmap(FE_DIR_S_ICO wxT("app.png"), wxBITMAP_TYPE_ANY));
152                 this->SetIcon(icon);
153         }
154         wxCommandEvent e;
155         this->OnArcClose(e);
156
157         // \83X\83v\83\8a\83b\83^\81[\90Ý\92è\81B
158         this->window_splitter->SetSashPosition(this->conf.Read(wxT("Splitter-Pos"), 200));
159
160         // \83\8a\83X\83g\83r\83\85\81[\90Ý\92è\81B
161         int nIconMode = this->conf.Read(wxT("ListView-IconMode"), 0l);
162         e.SetId(nIconMode == 1 ? XRCID("Exe_View_Icons") : (nIconMode == 2 ? XRCID("Exe_View_List") : XRCID("Exe_View_Details")));
163         this->OnViewMode(e);
164         // wxGTK\82Å\82Í\92¼\90ÚwxLC_VIRTUAL\82ð\8ew\92è\82µ\82È\82¢\82Æ\94½\89f\82³\82ê\82È\82¢\81B
165         this->list_ctrl->SetSingleStyle(wxLC_VIRTUAL);
166         this->list_ctrl->InsertColumn(0, wxT("Filename"),      wxLIST_FORMAT_LEFT,   this->conf.Read(wxT("ListView-C-Filename"), 140));
167         this->list_ctrl->InsertColumn(1, wxT("Unpacked"),      wxLIST_FORMAT_RIGHT,  this->conf.Read(wxT("ListView-C-Unpacked"), 80));
168         this->list_ctrl->InsertColumn(2, wxT("Packed"),        wxLIST_FORMAT_RIGHT,  this->conf.Read(wxT("ListView-C-Packed"), 80));
169         this->list_ctrl->InsertColumn(3, wxT("Ratio"),         wxLIST_FORMAT_RIGHT,  this->conf.Read(wxT("ListView-C-Ratio"), 50));
170         this->list_ctrl->InsertColumn(4, wxT("Method"),        wxLIST_FORMAT_LEFT,   this->conf.Read(wxT("ListView-C-Method"), 60));
171         this->list_ctrl->InsertColumn(5, wxT("Attr"),          wxLIST_FORMAT_LEFT,   this->conf.Read(wxT("ListView-C-Attr"), 50));
172         this->list_ctrl->InsertColumn(6, wxT("Last modified"), wxLIST_FORMAT_RIGHT,  this->conf.Read(wxT("ListView-C-Lastmodified"), 150));
173         this->list_ctrl->InsertColumn(7, wxT("Path"),          wxLIST_FORMAT_LEFT,   this->conf.Read(wxT("ListView-C-Path"), 100));
174         this->list_ctrl->InsertColumn(8, wxT("Type"),          wxLIST_FORMAT_LEFT,   this->conf.Read(wxT("ListView-C-Type"), 100));
175         this->list_ctrl->InsertColumn(9, wxT("No."),           wxLIST_FORMAT_RIGHT,  this->conf.Read(wxT("ListView-C-No"), 35));
176         g_nSortColumn = this->conf.Read(wxT("ListView-SortColumn"), 9);
177         g_fSortAscend = this->conf.Read(wxT("ListView-SortAscend"), 1) == 1;
178         this->list_ctrl->SetDropTarget(new myFileDropTarget(this));
179
180         // \83c\81[\83\8b\83o\81[/\83X\83e\81[\83^\83X\83o\81[\90Ý\92è\81B
181         int nStatusBarParts[] = {70, 70, 180, 50, -1};
182         this->statusbar->SetFieldsCount(5, nStatusBarParts);
183         this->SetStatusBarPane(-1);
184         bool fShow = this->conf.Read(wxT("StatusBar-Show"), 1) == 1;
185         this->menubar->Check(XRCID("Exe_View_StatusBar"), fShow);
186         this->statusbar->Show(fShow);
187         fShow = this->conf.Read(wxT("ToolBar-Show"), 1) == 1;
188         this->menubar->Check(XRCID("Exe_View_ToolBar"), fShow);
189         this->toolbar->Show(fShow);
190
191         // \83R\83}\83\93\83h\83\89\83C\83\93\93Ç\82Ý\8d\9e\82Ý\81B
192         this->cmdLine.SetSwitchChars(wxT("-"));
193         this->cmdLine.AddSwitch(wxT("x"), wxEmptyString, wxT("(command) Extract filenames in archive."));
194         this->cmdLine.AddSwitch(wxT("l"), wxEmptyString, wxT("(command) List archive(default)."));
195         this->cmdLine.AddParam(wxT("archive"),   wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL);
196         this->cmdLine.AddParam(wxT("filenames"), wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL | wxCMD_LINE_PARAM_MULTIPLE);
197         if (this->cmdLine.Parse() == 0)
198         {
199                 if (this->cmdLine.GetParamCount() == 0)
200                 {
201                         return;
202                 }
203
204                 // \8f\91\8cÉ\82ð\8aJ\82­\81B
205                 this->fnArchive = wxFileName(this->cmdLine.GetParam(0));
206                 this->fnArchive.Normalize(wxPATH_NORM_ALL, this->szCurrentPath);
207                 this->OnArcOpen(e);
208                 if (this->cmdLine.Found(wxT("x")))
209                 {
210                         // \8f\91\8cÉ\82ð\93W\8aJ\81B
211                         this->OnArcExtract(e);
212                         this->Close(true);
213                 }
214         }
215 }
216
217 // MenuBar
218
219 void MainFrame::OnExit(wxCommandEvent&)
220 {
221         this->Close(true);
222 }
223
224 void MainFrame::OnArcCreate(wxCommandEvent& e)
225 {
226         TPI_SWITCHES swInfo;
227         swInfo.pCustomSwitches = NULL;
228
229         // \8dì\90¬\83_\83C\83A\83\8d\83O\82ð\90Ý\92è\81B
230         MakeDialog mkDlg;
231         ::wxXmlResource::Get()->Load(FE_DIR_S_XRC wxT("dlg_make.xrc"));
232         ::wxXmlResource::Get()->LoadDialog(& mkDlg, this, wxT("dlg_make"));
233
234         if (e.GetClientData() == NULL)
235         {
236                 // \8f\88\97\9d\91Î\8fÛ\82Ì\83t\83@\83C\83\8b\82ð\91I\91ð\81B
237                 wxFileDialog fd(this, wxT("Choose files to compress"), this->conf.Read(wxT("LastOpenPath"), ::wxGetCwd()));
238                 fd.SetWindowStyleFlag(wxFD_OPEN | wxFD_FILE_MUST_EXIST | wxFD_MULTIPLE);
239                 if (fd.ShowModal() == wxID_CANCEL)
240                 {
241                         return;
242                 }
243                 swInfo.fnDestinationDirectory = wxFileName::DirName(fd.GetDirectory());
244                 this->conf.Write(wxT("LastOpenPath"), fd.GetDirectory());
245                 this->statusbar->SetStatusText(swInfo.fnDestinationDirectory.GetFullPath(), 4);
246
247                 fd.GetFilenames(mkDlg.files);
248         }
249         else
250         {
251                 mkDlg.files = * (wxArrayString *) e.GetClientData();
252                 swInfo.fnDestinationDirectory = wxFileName::DirName(wxFileName(mkDlg.files[0]).GetPath());
253                 // \91\8a\91Î\83p\83X\82É\95Ï\8a·\81B
254                 for (size_t n = 0; n < mkDlg.files.GetCount(); n++)
255                 {
256                         wxFileName fn(mkDlg.files[n]);
257                         bool fIsDir = fn.DirExists() && ! fn.FileExists();
258                         fn.MakeRelativeTo(swInfo.fnDestinationDirectory.GetPath());
259                         mkDlg.files[n] = fn.GetFullPath();
260                         if (fIsDir)
261                         {
262                                 mkDlg.files[n] += fn.GetPathSeparator();
263                         }
264                 }
265         }
266
267         this->OnArcClose(e);
268         mkDlg.InitDialog();
269         mkDlg.cbDir->SetValue(swInfo.fnDestinationDirectory.GetPath());
270         // \8f\91\8cÉ\96¼\82Í\83t\83@\83C\83\8b\96¼\82Ì\8ag\92£\8eq\82æ\82è\91O\81A\82à\82µ\82­\82Í\83f\83B\83\8c\83N\83g\83\8a\96¼\81B
271         this->fnArchive = wxFileName(mkDlg.files[0]);
272         this->fnArchive.SetName(mkDlg.files.GetCount() == 1 ? (this->fnArchive.GetName().IsEmpty() ? this->fnArchive.GetDirs().Last() : this->fnArchive.GetName()) : swInfo.fnDestinationDirectory.GetDirs().Last());
273         this->fnArchive.SetPath(swInfo.fnDestinationDirectory.GetPath());
274         mkDlg.cbFileName->SetValue(this->fnArchive.GetName());
275
276         // \83_\83C\83A\83\8d\83O\82ð\95\\8e¦\81B
277         if (mkDlg.ShowModal() == wxID_CANCEL)
278         {
279                 this->statusbar->SetStatusText(wxEmptyString, 4);
280                 return;
281         }
282         this->statusbar->SetStatusText(wxEmptyString, 4);
283
284         // \8ae\8eí\90Ý\92è\81B
285         swInfo.fStoreDirectoryPathes= ! mkDlg.cbIgnorePath->IsChecked();
286         swInfo.fMakeSFX                     = mkDlg.cbMakeSFX->IsChecked();
287         swInfo.fSolid               = mkDlg.cbSolid->IsChecked();
288         swInfo.fMMOptimize          = mkDlg.cbMMOptimize->IsChecked();
289         swInfo.fEncryptHeader       = mkDlg.cbEncryptHeader->IsChecked();
290         swInfo.sCompressLevel       = mkDlg.scLevel->GetValue();
291         swInfo.sRecoveryRecord      = mkDlg.scRR->GetValue();
292         swInfo.szPassword           = mkDlg.tcPassword->GetValue();
293         swInfo.szKeyFile            = mkDlg.tcKeyfile->GetValue();
294         swInfo.szComment            = mkDlg.tcComment->GetValue();
295         {
296                 wxULongLong_t ll;
297                 mkDlg.cbSplitSize->GetValue().ToULongLong(& ll);
298                 swInfo.llSplitSize      = ll;
299         }
300
301         // TPI\82ð\93Ç\82Ý\8d\9e\82Ý\81B
302         int nSelected = mkDlg.chType->GetSelection();
303         this->fnArchive = wxFileName(mkDlg.cbDir->GetValue(), mkDlg.cbFileName->GetValue(), swInfo.fMakeSFX ? EXE_EXT : mkDlg.afInfo[nSelected].szSuffix.BeforeFirst(wxT(';')));
304         if (! tpi.InitLibrary(mkDlg.afInfo[nSelected].szTPIName, this->fnArchive.GetFullPath(), mkDlg.afInfo[nSelected].llTypeId))
305         {
306                 ::ErrDlg(wxT("InitLibrary()!"), this);
307                 return;
308         }
309
310         // \83R\81[\83\8b\83o\83b\83N\8aÖ\90\94\82ð\90Ý\92è\81B
311         if (! tpi.SetCallbackProc(TPICallbackProc))
312         {
313                 ::ErrDlg(wxT("SetCallbackProc()!"), this);
314         }
315
316         // \8f\88\97\9d\82ð\8ds\82¤\81B
317         ProcessDialog procDlg;
318         procDlg.InitDialog();
319         procDlg.Show(true);
320         if (! tpi.Command(TPI_COMMAND_ADD, & swInfo, this->fnArchive.GetFullPath(), mkDlg.files))
321         {
322                 this->ErrorCheck(tpi.nErrorCode);
323                 return;
324         }
325         procDlg.Show(false);
326         tpi.FreeLibrary();
327
328         if (mkDlg.cbOpenAfter->IsChecked())
329         {
330                 // \8dì\90¬\90æ\82ð\8aJ\82­\81B
331 #ifdef __WINDOWS__
332                 ::wxExecute(wxT("explorer ") + swInfo.fnDestinationDirectory.GetFullPath());
333 #endif
334         }
335
336         if (mkDlg.cbExitAfter->IsChecked())
337         {
338                 // \8fI\97¹\81B
339                 this->Close(true);
340         }
341
342         // \8fI\97¹\82µ\82È\82¢\8fê\8d\87\82Í\8f\91\8cÉ\82ð\8aJ\82­\81B
343         this->OnArcOpen(e);
344 }
345
346 void MainFrame::OnArcOpen(wxCommandEvent& e)
347 {
348         // \8f\91\8cÉ\82ð\91I\91ð\81B
349         if (e.GetId() == XRCID("Arc_Open"))
350         {
351                 wxFileDialog fd(this);
352                 fd.SetDirectory(this->conf.Read(wxT("LastOpenPath"), ::wxGetCwd()));
353                 fd.SetWindowStyleFlag(wxFD_OPEN | wxFD_FILE_MUST_EXIST);
354                 if (fd.ShowModal() == wxID_CANCEL)
355                 {
356                         return;
357                 }
358                 this->conf.Write(wxT("LastOpenPath"), fd.GetDirectory());
359                 this->fnArchive = wxFileName(fd.GetPath());
360         }
361         this->OnArcClose(e);
362
363         // \90i\92»\83_\83C\83A\83\8d\83O\95\\8e¦\81B
364         ProcessDialog procDlg;
365         procDlg.InitDialog();
366         procDlg.Show(true);
367
368         // TPI\82ð\93Ç\82Ý\8d\9e\82Ý\81A\8dÅ\8f\89\82Ì\83R\81[\83\8b\83o\83b\83N\82ð\91\97\90M\81B
369         TPI_PROCESSINFO piInfo;
370         piInfo.uMessage = TPI_MESSAGE_STATUS;
371         piInfo.uStatus = 0x1000;
372         piInfo.llProcessedSize = 0;
373         piInfo.fiInfo.fnFileName = this->fnArchive;
374         piInfo.fiInfo.llUnpackedSize = this->LoadTPI(this->fnArchive.GetFullPath());
375         if ((signed) piInfo.fiInfo.llUnpackedSize.ToULong() == -1)
376         {
377                 procDlg.Show(false);
378                 tpi.FreeLibrary();
379                 ::ErrDlg(wxT("No plug-in supporting this archive was found!"), this);
380                 return;
381         }
382         TPICallbackProc(TPI_NOTIFY_COMMON, & piInfo);
383
384         // \83R\81[\83\8b\83o\83b\83N\8aÖ\90\94\82ð\90Ý\92è\81B
385         if (! tpi.SetCallbackProc(TPICallbackProc))
386         {
387                 ::ErrDlg(wxT("SetCallbackProc()!"), this);
388         }
389
390         // \94z\97ñ\82Ì\83T\83C\83Y\82ð\8am\95Û\81B
391         this->fileinfo.Alloc(piInfo.fiInfo.llUnpackedSize.ToULong());
392
393         // \8f\91\8cÉ\82ð\8aJ\82­\81B
394         if (! tpi.OpenArchive(this->fnArchive.GetFullPath()))
395         {
396                 procDlg.Show(false);
397                 tpi.FreeLibrary();
398                 ::ErrDlg(wxT("OpenArchive()!"), this);
399                 return;
400         }
401
402         // \8f\91\8cÉ\82Ì\83A\83C\83R\83\93\82ð\8eæ\93¾\82µ\81A\8f\91\8cÉ\83\8b\81[\83g\82ð\8dì\90¬\81B
403         g_hIconT.Add(wxBitmap(FE_DIR_S_ICO wxT("folder_closed.png"), wxBITMAP_TYPE_ANY));
404         g_hIconT.Add(wxBitmap(FE_DIR_S_ICO wxT("folder_open.png"), wxBITMAP_TYPE_ANY));
405         this->tree_ctrl->SetImageList(& g_hIconT);
406         wxTreeItemId
407                 idRoot = this->tree_ctrl->AddRoot(wxEmptyString),
408 #ifdef __WINDOWS__
409                 idArchive = this->tree_ctrl->AppendItem(idRoot, piInfo.fiInfo.fnFileName.GetFullName(), g_hIconT.Add(GetFileTypeIcon(piInfo.fiInfo.fnFileName))),
410 #else
411                 idArchive = this->tree_ctrl->AppendItem(idRoot, piInfo.fiInfo.fnFileName.GetFullName(), g_hIconT.Add(GetFileTypeIcon(piInfo.fiInfo.fnFileName).ConvertToImage().Rescale(16, 16))),
412 #endif
413                 idArcRoot = this->tree_ctrl->AppendItem(idRoot, wxT("-----"), 0, 1);
414
415         // \83t\83@\83C\83\8b\8fî\95ñ\82ð\83\8d\81[\83h\81B
416         if (tpi.GetFileInformation(& piInfo.fiInfo, true))
417         {
418                 piInfo.uStatus = 0x1001;
419                 do
420                 {
421                         piInfo.llProcessedSize++;
422                         if (this->ErrorCheck(TPICallbackProc(TPI_NOTIFY_COMMON, & piInfo)) == TPI_CALLBACK_CANCEL)
423                         {
424                                 procDlg.Show(false);
425                                 tpi.CloseArchive();
426                                 wxCommandEvent e;
427                                 this->OnArcClose(e);
428                                 return;
429                         }
430
431                         // \83c\83\8a\81[\83r\83\85\81[\82É\94½\89f\81B
432                         TreeView_CheckNewerItem(this->tree_ctrl, idArcRoot, piInfo.fiInfo.fnFileName.GetPath(), true);
433
434                         // \83f\83B\83\8c\83N\83g\83\8a\91®\90«\82ð\8aÜ\82Þ\82à\82Ì\82É\82Â\82¢\82Ä\82Í\8f\9c\8b\8e\81B
435                         if (piInfo.fiInfo.dwAttribute & TPI_ATTRIBUTE_DIRECTORY)
436                         {
437                                 continue;
438                         }
439
440                         // \83Z\83L\83\85\83\8a\83e\83B\83`\83F\83b\83N\81B
441                         // DTV\8c\9f\8d¸\81B
442                         if (piInfo.fiInfo.fnFileName.GetPathWithSep().Find(wxT("..")) != wxNOT_FOUND)
443                         {
444                                 piInfo.fiInfo.uDanger = TRUE;
445                                 ::WrnDlg(wxT("This archive may have Directory Traversal Vulnerability(DTV) problem, and some danger files may be extracted to the unexpected system directory! You should use the \"Ignore file pathes\" option when extracting this archive.\nDanger file is:\n") + piInfo.fiInfo.szStoredName, this);
446                         }
447                         // \8bó\94\92\82Ì\98A\91±\82É\82æ\82é\8ag\92£\8eq\8bU\91\95\82ð\8c\9f\8d¸\81B
448                         if (piInfo.fiInfo.fnFileName.GetFullName().Find(wxT("        ")) != wxNOT_FOUND)
449                         {
450                                 piInfo.fiInfo.uDanger = TRUE;
451                                 ::WrnDlg(wxT("This archive may contain extension-disguised files whose real extension is hidden by using many blank charactor and you may mistake that it is a \"safe\" file. Don\'t execute these files carelessly.\nDanger file is:\n") + piInfo.fiInfo.szStoredName, this);
452                         }
453                         // Unicode\90§\8cä\95\8e\9a\82ð\8c\9f\8d¸\81B
454                         for (wxChar c = 0x200c; c <= 0x206f; c++)
455                         {
456                                 if (piInfo.fiInfo.fnFileName.GetFullName().Find(c) != wxNOT_FOUND)
457                                 {
458                                         piInfo.fiInfo.uDanger = TRUE;
459                                         ::WrnDlg(wxT("This archive may contain extension-disguised files whose real extension is hidden by using Unicode control character and you may mistake that it is a \"safe\" file. Don\'t execute these files carelessly.\nDanger file is:\n") + piInfo.fiInfo.szStoredName, this);
460                                 }
461                                 switch (c)
462                                 {
463                                 case 0x200f: c = 0x2027; break;
464                                 case 0x202e: c = 0x2060; break;
465                                 }
466                         }
467
468                         // \8fî\95ñ\82ð\95Û\91\82µ\82Ä\83J\83E\83\93\83g\83A\83b\83v\81B
469                         this->fileinfo.Add(piInfo.fiInfo);
470                 }
471                 while (tpi.GetFileInformation(& piInfo.fiInfo, false));
472         }
473
474         // \8f\91\8cÉ\82Ì\8fî\95ñ\82ð\8eæ\93¾\81B
475         TPI_ARCHIVEINFO aiInfo;
476         if (! tpi.GetArchiveInformation(& aiInfo))
477         {
478                 procDlg.Show(false);
479                 tpi.FreeLibrary();
480                 ::ErrDlg(wxT("GetArchiveInformation()!"), this);
481                 return;
482         }
483
484         // \8f\91\8cÉ\82ð\95Â\82\82é\81B
485         if (! tpi.CloseArchive())
486         {
487                 ::ErrDlg(wxT("CloseArchive()!"), this);
488         }
489
490         // \88È\89º\81AUI\8f\88\97\9d\81B
491         this->fileinfo.Shrink();
492         this->tree_ctrl->ExpandAll();
493         this->tree_ctrl->ScrollTo(idArchive);
494         this->tree_ctrl->SelectItem(idArchive);
495         this->list_ctrl->atDangerItem.SetTextColour(* wxRED);
496
497         // \83X\83e\81[\83^\83X\83o\81[\90Ý\92è\81B
498         this->statusbar->SetStatusText(aiInfo.fiInfo.szTypeName, 0);
499         this->statusbar->SetStatusText(wxString::Format(wxT("%d file(s)"), this->fileinfo.GetCount()), 1);
500         this->statusbar->SetStatusText(aiInfo.llUnpackedSize.ToString() + wxT(" B -> ") + aiInfo.llPackedSize.ToString() + wxT(" B"), 2);
501         this->statusbar->SetStatusText(wxString::Format(wxT("%3.1f%%"), aiInfo.wCompressRatio / 10.0), 3);
502         this->statusbar->SetStatusText(this->fnArchive.GetFullPath(), 4);
503
504         // \83c\81[\83\8b\83o\81[\81E\83\81\83j\83\85\81[\83o\81[\90Ý\92è\81B
505         SetMenuToolState("Arc_Close",   true);
506         SetMenuToolState("Arc_Add",     (aiInfo.fiInfo.llSupportedCommand & TPI_COMMAND_ADD)    == TPI_COMMAND_ADD);
507         SetMenuToolState("Arc_SFX",     (aiInfo.fiInfo.llSupportedCommand & TPI_COMMAND_SFX)    == TPI_COMMAND_SFX   && aiInfo.nSFXType == 0);
508         SetMenuToolState("Arc_UnSFX",   (aiInfo.fiInfo.llSupportedCommand & TPI_COMMAND_UNSFX)  == TPI_COMMAND_UNSFX && aiInfo.nSFXType != 0);
509         SetMenuToolState("Arc_Extract", (aiInfo.fiInfo.llSupportedCommand & TPI_COMMAND_EXTRACT)== TPI_COMMAND_EXTRACT);
510         SetMenuToolState("Arc_Delete",  (aiInfo.fiInfo.llSupportedCommand & TPI_COMMAND_DELETE) == TPI_COMMAND_DELETE);
511         SetMenuToolState("Arc_Test",    (aiInfo.fiInfo.llSupportedCommand & TPI_COMMAND_TEST)   == TPI_COMMAND_TEST);
512         SetMenuToolState("Arc_Repair",  (aiInfo.fiInfo.llSupportedCommand & TPI_COMMAND_REPAIR) == TPI_COMMAND_REPAIR);
513
514         procDlg.Show(false);
515 }
516
517 void MainFrame::OnArcClose(wxCommandEvent&)
518 {
519         // \83c\83\8a\81[\83r\83\85\81[\81E\83\8a\83X\83g\83r\83\85\81[\90Ý\92è\81B
520         this->tree_ctrl->DeleteAllItems();
521         this->list_ctrl->DeleteAllItems();
522         this->list_ctrl->showFileInfo.Clear();
523
524         // \83c\81[\83\8b\83o\81[\81E\83\81\83j\83\85\81[\83o\81[\90Ý\92è\81B
525         SetMenuToolState("Arc_Close",   false);
526         SetMenuToolState("Arc_Add",     false);
527         SetMenuToolState("Arc_SFX",     false);
528         SetMenuToolState("Arc_UnSFX",   false);
529         SetMenuToolState("Arc_Extract", false);
530         SetMenuToolState("Arc_Delete",  false);
531         SetMenuToolState("Arc_Test",    false);
532         SetMenuToolState("Arc_Repair",  false);
533
534         for (int i = 0; i < this->statusbar->GetFieldsCount(); i++)
535         {
536                 this->statusbar->SetStatusText(wxEmptyString, i);
537         }
538         this->fileinfo.Clear();
539
540         g_hIconT.RemoveAll();
541         g_hIconLL.RemoveAll();
542         g_hIconLS.RemoveAll();
543         this->tpi.FreeLibrary();
544 }
545
546 void MainFrame::OnArcAdd(wxCommandEvent& e)
547 {
548         // \8f\88\97\9d\91Î\8fÛ\82Ì\83t\83@\83C\83\8b\82ð\91I\91ð\81B
549         wxArrayString files;
550         wxFileDialog fd(this, wxT("Choose files to add"), this->conf.Read(wxT("LastOpenPath"), ::wxGetCwd()));
551         fd.SetWindowStyleFlag(wxFD_OPEN | wxFD_FILE_MUST_EXIST | wxFD_MULTIPLE);
552         if (fd.ShowModal() == wxID_CANCEL)
553         {
554                 return;
555         }
556         fd.GetFilenames(files);
557         this->conf.Write(wxT("LastOpenPath"), fd.GetDirectory());
558
559         // \8ae\8eí\90Ý\92è\81B
560         TPI_SWITCHES swInfo;
561         swInfo.fnDestinationDirectory = wxFileName::DirName(fd.GetDirectory());
562         swInfo.fMakeSFX = false;
563         swInfo.pCustomSwitches = NULL;
564
565         ProcessDialog procDlg;
566         procDlg.InitDialog();
567         procDlg.Show(true);
568         if (! this->tpi.Command(TPI_COMMAND_ADD, & swInfo, this->fnArchive.GetFullPath(), files))
569         {
570                 this->ErrorCheck(tpi.nErrorCode);
571         }
572         procDlg.Show(false);
573
574         // \8f\91\8cÉ\82ð\8dÄ\93Ç\82Ý\8d\9e\82Ý\81B
575         this->OnArcOpen(e);
576 }
577
578 void MainFrame::OnArcConvert(wxCommandEvent& e)
579 {
580         TPI_SWITCHES swInfo;
581         swInfo.fMakeSFX = e.GetId() == XRCID("Arc_SFX");
582
583         // \95Û\91\90æ\82ð\90q\82Ë\82é\81B
584         wxFileDialog fd(this, swInfo.fMakeSFX ? wxT("Save as SFX") : wxT("Save as normal archive"), this->fnArchive.GetPath(), this->fnArchive.GetName() + (swInfo.fMakeSFX ? EXE_EXT : (wxString) wxEmptyString));
585         fd.SetWindowStyleFlag(wxFD_SAVE | wxFD_OVERWRITE_PROMPT);
586         if (fd.ShowModal() == wxID_CANCEL)
587         {
588                 return;
589         }
590         swInfo.fnDestinationDirectory = wxFileName::DirName(fd.GetDirectory());
591         this->conf.Write(wxT("LastOpenPath"), fd.GetDirectory());
592
593         wxArrayString files;
594         files.Add(fd.GetPath());
595
596         ProcessDialog procDlg;
597         procDlg.InitDialog();
598         procDlg.Show(true);
599         if (! this->tpi.Command(swInfo.fMakeSFX ? TPI_COMMAND_SFX : TPI_COMMAND_UNSFX, & swInfo, this->fnArchive.GetFullPath(), files))
600         {
601                 this->ErrorCheck(tpi.nErrorCode);
602         }
603         procDlg.Show(false);
604 }
605
606 void MainFrame::OnArcExtract(wxCommandEvent& e)
607 {
608         TPI_SWITCHES swInfo;
609         swInfo.pCustomSwitches = NULL;
610
611         // \83\82\81[\83h\8eæ\93¾\81B\92Ê\8fí\82Í0, \8eÀ\8ds\82È\82ç1, \83t\83@\83C\83\8bDnD\82È\82ç2\81A\83f\83B\83\8c\83N\83g\83\8aDnD\82È\82ç3\81B
612         int nMode = e.GetInt();
613         // \8eÀ\8ds\8e\9e\82Ì\82Ý\8eg\97p\81B
614         wxFileType * ftFile = NULL;
615
616         // \93W\8aJ\83_\83C\83A\83\8d\83O\82ð\8dì\90¬\81BDnD\82Ü\82½\82Í\8eÀ\8ds\8e\9e\82Í\95\\8e¦\82µ\82È\82¢\81B
617         MakeDialog mkDlg;
618         ::wxXmlResource::Get()->Load(FE_DIR_S_XRC wxT("dlg_make.xrc"));
619         ::wxXmlResource::Get()->LoadDialog(& mkDlg, this, wxT("dlg_make"));
620         mkDlg.bIsMake = false;
621         mkDlg.files   = MakeTargetFileList(this, nMode == 1);
622
623         if (nMode != 0)
624         {
625                 if (nMode == 1)
626                 {
627                         // \83R\83}\83\93\83h\82ð\8eæ\93¾\81B
628                         ftFile = wxTheMimeTypesManager->GetFileTypeFromExtension(wxFileName(mkDlg.files[0]).GetExt());
629                         if (! ftFile)
630                         {
631                                 // \8eí\97Þ\82ª\8eæ\93¾\82Å\82«\82È\82¢\82Æ\82«\82Í\90Ý\92è\82ð\93Ç\82Ý\8d\9e\82Þ\81B\8f\89\8aú\90Ý\92è\82Å\82Í\83e\83L\83X\83g\82Æ\82Ý\82È\82·\81B
632                                 ftFile = wxTheMimeTypesManager->GetFileTypeFromExtension(this->conf.Read(wxT("DefaultExt"), wxT("txt")));
633                                 if (! ftFile)
634                                 {
635                                         ::ErrDlg(wxT("Unable to get the file type!"), this);
636                                         return;
637                                 }
638                         }
639                 }
640
641                 // \8dì\8bÆ\83f\83B\83\8c\83N\83g\83\8a\8dì\90¬\81B
642                 swInfo.fStoreDirectoryPathes = false;
643                 wxString szDestDirBase = nMode == 3 ? this->tree_ctrl->GetItemText(this->tree_ctrl->GetSelection()) : wxT("tpi_tmp");
644                 if (szDestDirBase == wxT("-----"))
645                 {
646                         // \8f\91\8cÉ\83\8b\81[\83g\82Ì\82Æ\82«\82Í\8f\91\8cÉ\96¼\82É\82µ\82Ä\82¨\82­\81B
647                         szDestDirBase = this->fnArchive.GetName();
648                 }
649                 swInfo.fnDestinationDirectory = MakeDirPath(wxFileName::DirName(::wxGetCwd()), szDestDirBase, true);
650                 if (! swInfo.fnDestinationDirectory.IsOk())
651                 {
652                         ::ErrDlg(wxT("Unable to make the temporary directory!"), this);
653                         return;
654                 }
655         }
656         else
657         {
658                 mkDlg.InitDialog();
659                 if (mkDlg.ShowModal() == wxID_CANCEL)
660                 {
661                         return;
662                 }
663
664                 // \8ae\8eí\90Ý\92è\81B
665                 swInfo.fStoreDirectoryPathes = ! mkDlg.cbIgnorePath->IsChecked();
666                 swInfo.fnDestinationDirectory = wxFileName::DirName(mkDlg.cbDir->GetValue());
667                 swInfo.szPassword = mkDlg.tcPassword->GetValue();
668                 swInfo.szKeyFile  = mkDlg.tcKeyfile->GetValue();
669
670                 // \95K\97v\82È\82ç\8f\91\8cÉ\96¼\82Å\83f\83B\83\8c\83N\83g\83\8a\82ð\8dì\90¬\82·\82é\81B
671                 if (WillMakeDirByArcName(this, & mkDlg))
672                 {
673                         swInfo.fnDestinationDirectory = MakeDirPath(swInfo.fnDestinationDirectory, this->fnArchive.GetName(), true);
674                         if (! swInfo.fnDestinationDirectory.IsOk())
675                         {
676                                 ::ErrDlg(wxT("Unable to make the destination directory!"), this);
677                                 return;
678                         }
679                 }
680         }
681
682         ProcessDialog procDlg;
683         procDlg.InitDialog();
684         procDlg.Show(true);
685         if(! this->tpi.Command(TPI_COMMAND_EXTRACT, & swInfo, this->fnArchive.GetFullPath(), mkDlg.files));
686         {
687                 this->ErrorCheck(tpi.nErrorCode);
688         }
689         procDlg.Show(false);
690
691         if (nMode == 0)
692         {
693                 if (mkDlg.cbOpenAfter->IsChecked())
694                 {
695                         // \93W\8aJ\90æ\82ð\8aJ\82­\81B
696 #ifdef __WINDOWS__
697                         ::wxExecute(wxT("explorer ") + swInfo.fnDestinationDirectory.GetFullPath());
698 #endif
699                 }
700
701                 if (mkDlg.cbExitAfter->IsChecked())
702                 {
703                         // \8fI\97¹\81B
704                         this->Close(true);
705                 }
706         }
707         else
708         {
709                 wxArrayString asFiles;
710                 if (nMode == 1)
711                 {
712                         // \83R\83}\83\93\83h\82ð\8eÀ\8ds\81B
713                         asFiles.Add(swInfo.fnDestinationDirectory.GetPathWithSep() + wxFileName(mkDlg.files[0]).GetFullName());
714                         if (tpi.nErrorCode == TPI_ERROR_SUCCESS)
715                         {
716                                 ::wxExecute(ftFile->GetOpenCommand(wxT('"') + asFiles[0] + wxT('"')), wxEXEC_SYNC);
717                         }
718                 }
719                 else
720                 {
721                         // \93W\8aJ\91Î\8fÛ\82ð\8c\88\92è\81B
722                         wxFileDataObject objFile;
723                         for (size_t i = 0; i < mkDlg.files.GetCount(); i++)
724                         {
725                                 wxString szFileName = swInfo.fnDestinationDirectory.GetPathWithSep() + wxFileName(mkDlg.files[i]).GetFullName();
726                                 if (nMode == 2)
727                                 {
728                                         // \83\8a\83X\83g\82É\92Ç\89Á\81B
729                                         objFile.AddFile(szFileName);
730                                 }
731                                 asFiles.Add(szFileName);
732                         }
733                         if (nMode == 3)
734                         {
735                                 objFile.AddFile(swInfo.fnDestinationDirectory.GetPath());
736                         }
737
738                         // DnD\8aJ\8en\81B
739                         wxDropSource dropSource(objFile, this);
740                         if (dropSource.DoDragDrop() != wxDragMove)
741                         {
742 #ifdef __LINUX__
743                                 // Linux\82Å\82Í\82Ü\82¾\8f\88\97\9d\82ª\8fI\82í\82Á\82Ä\82¢\82È\82¢(\83R\83\93\83e\83L\83X\83g\83\81\83j\83\85\81[\82ª\95\\8e¦\82³\82ê\82Ä\82¢\82é)\82Ì\82Å\81A\82Æ\82è\82 \82¦\82¸3\95b\82¾\82¯\91Ò\82Â\81B
744                                 sleep(3);
745 #endif
746                         }
747                 }
748
749                 // \83t\83@\83C\83\8b\82Æ\88ê\8e\9e\83f\83B\83\8c\83N\83g\83\8a\82ð\8dí\8f\9c\81B
750                 for (size_t i = 0; i < asFiles.GetCount(); i++)
751                 {
752                         ::wxRemoveFile(asFiles[i]);
753                 }
754                 ::wxRmdir(swInfo.fnDestinationDirectory.GetFullPath());
755         }
756 }
757
758 void MainFrame::OnArcDelete(wxCommandEvent& e)
759 {
760         // \91S\83t\83@\83C\83\8b\8dí\8f\9c\82Í\8aë\8c¯\82Å\82Í\82È\82¢\82©\82Æ\81B
761         if (this->list_ctrl->GetSelectedItemCount() == 0)
762         {
763                 return;
764         }
765
766         if (::AskDlg(wxT("Are you sure to delete selected files?"), this) == wxNO)
767         {
768                 return;
769         }
770
771         // \8ae\8eí\90Ý\92è\81B
772         TPI_SWITCHES swInfo;
773         ProcessDialog procDlg;
774         procDlg.InitDialog();
775         procDlg.Show(true);
776         if (! this->tpi.Command(TPI_COMMAND_DELETE, & swInfo, this->fnArchive.GetFullPath(), MakeTargetFileList(this, false)))
777         {
778                 this->ErrorCheck(tpi.nErrorCode);
779         }
780         procDlg.Show(false);    
781
782         // \8f\91\8cÉ\82ð\8dÄ\93Ç\82Ý\8d\9e\82Ý\82·\82é\81B
783         this->OnArcOpen(e);
784 }
785
786 void MainFrame::OnArcTest(wxCommandEvent&)
787 {
788         TPI_SWITCHES swInfo;
789         ProcessDialog procDlg;
790         procDlg.InitDialog();
791         procDlg.Show(true);
792         if (this->tpi.Command(TPI_COMMAND_TEST, & swInfo, this->fnArchive.GetFullPath(), MakeTargetFileList(this, false)))
793         {
794                 ::MsgDlg(wxT("This is a correct archive."), & procDlg, wxICON_INFORMATION);
795         }
796         else
797         {
798                 this->ErrorCheck(tpi.nErrorCode);
799         }
800         procDlg.Show(false);
801 }
802
803 void MainFrame::OnArcRepair(wxCommandEvent&)
804 {
805         TPI_SWITCHES swInfo;
806         ProcessDialog procDlg;
807         procDlg.InitDialog();
808         procDlg.Show(true);
809         if (! this->tpi.Command(TPI_COMMAND_REPAIR, & swInfo, this->fnArchive.GetFullPath(), MakeTargetFileList(this, false)))
810         {
811                 this->ErrorCheck(tpi.nErrorCode);
812         }
813         procDlg.Show(false);    
814 }
815
816 void MainFrame::OnViewMode(wxCommandEvent & e)
817 {
818         int n = e.GetId();
819         this->menubar->Check(n, true);
820         this->list_ctrl->SetSingleStyle(wxLC_REPORT, n == XRCID("Exe_View_Details"));
821         this->list_ctrl->SetSingleStyle(wxLC_ICON,   n == XRCID("Exe_View_Icons"));
822         this->list_ctrl->SetSingleStyle(wxLC_LIST,   n == XRCID("Exe_View_List"));
823 }
824
825 void MainFrame::OnShowToolBar(wxCommandEvent & e)
826 {
827         this->toolbar->Show(e.IsChecked());
828 }
829
830 void MainFrame::OnShowStatusBar(wxCommandEvent & e)
831 {
832         this->statusbar->Show(e.IsChecked());
833 }
834
835 void MainFrame::OnSelectAll(wxCommandEvent &)
836 {
837         for (int i = 0; i < this->list_ctrl->GetItemCount(); i++)
838         {
839                 this->list_ctrl->Select(i, true);
840         }
841 }
842
843 // TreeView
844
845 void MainFrame::OnTreeChanged(wxTreeEvent& e)
846 {
847         // \83c\83\8a\81[\83r\83\85\81[\82©\82ç\83p\83X\82ð\8eæ\93¾\81B
848         wxString szNodePath = TreeView_GetItemPath(this->tree_ctrl, e.GetItem());
849         // \83\8a\83X\83g\83r\83\85\81[\82ð\8f\89\8aú\89»\81B
850         this->list_ctrl->showFileInfo.Clear();
851         g_hIconLL.RemoveAll();
852         g_hIconLS.RemoveAll();
853
854         // \8c»\8dÝ\82Ì\83A\83C\83e\83\80\82Ì\91I\91ð\8fó\91Ô\82ð\96³\8cø\82É\82µ\82Ä\82¨\82­\81B
855         long nSelected = this->list_ctrl->GetFirstSelected();
856         while (nSelected != -1)
857         {
858                 this->list_ctrl->Select(nSelected, false);
859                 nSelected = this->list_ctrl->GetNextSelected(nSelected);
860         }
861
862         // \83A\83C\83R\83\93\90Ý\92è\81B
863         this->list_ctrl->SetImageList(& g_hIconLL, wxIMAGE_LIST_NORMAL);
864         this->list_ctrl->SetImageList(& g_hIconLS, wxIMAGE_LIST_SMALL);
865
866         // \94z\97ñ\82Æ\94ä\8ar\82µ\81A\83p\83X\82ª\88ê\92v\82µ\82È\82¯\82ê\82Î\8fÁ\82·\81B
867         for (size_t i = 0; i < this->fileinfo.GetCount(); i++)
868         {
869                 // \83p\83X\82ð\94ä\8ar\81B
870                 if (szNodePath == wxT("*") || szNodePath == this->fileinfo[i].fnFileName.GetPath())
871                 {
872                         // \8d\80\96Ú\82ª\83t\83H\83\8b\83_\82Å\82 \82é\82È\82ç\96³\8e\8b\81B
873                         if (this->fileinfo[i].fnFileName.IsDir() || ! TreeView_CheckNewerItem(this->tree_ctrl, this->tree_ctrl->GetLastChild(this->tree_ctrl->GetRootItem()), this->fileinfo[i].fnFileName.GetFullPath(), false))
874                         {
875                                 continue;
876                         }
877
878                         // \83t\83B\83\8b\83^\82É\82©\82©\82ç\82È\82¯\82ê\82Î\96³\8e\8b\81B
879                         if (this->fileinfo[i].fnFileName.GetFullName().MakeLower().Find(this->tcFilter->GetValue().MakeLower()) == wxNOT_FOUND)
880                         {
881                                 continue;
882                         }
883
884                         this->list_ctrl->showFileInfo.Add(this->fileinfo[i]);
885                 }
886         }
887
888         // \83\\81[\83g\82µ\82Ä\95\\8e¦\81B
889         this->list_ctrl->showFileInfo.Sort(& ListCtrlCompareProc);
890         this->list_ctrl->SetItemCount(this->list_ctrl->showFileInfo.GetCount());
891 }
892
893 void MainFrame::OnTreeBeginDrag(wxTreeEvent& e)
894 {
895         // TODO : \83A\83C\83e\83\80\82ª\8eq\8aK\91w\82ð\8e\9d\82Á\82Ä\82¢\82Ä\82à\93W\8aJ\82Å\82«\82È\82¢\81B
896         this->tree_ctrl->SelectItem(e.GetItem());
897
898         wxCommandEvent e1;
899         e1.SetInt(3);
900         this->OnArcExtract(e1);
901 }
902
903 // ListView
904
905 void MainFrame::OnListItemDClick(wxListEvent&)
906 {
907         wxCommandEvent e;
908         e.SetInt(1);
909         this->OnArcExtract(e);
910 }
911
912 void MainFrame::OnListBeginDrag(wxListEvent&)
913 {
914         if (this->list_ctrl->GetSelectedItemCount() == 0)
915         {
916                 // \83A\83C\83e\83\80\82ð\91I\91ð\82¹\82¸\83h\83\89\83b\83O\82µ\82æ\82¤\82Æ\82µ\82½\8fê\8d\87\81B
917                 return;
918         }
919
920         wxCommandEvent e;
921         e.SetInt(2);
922         this->OnArcExtract(e);
923 }
924
925 // Filter
926
927 void MainFrame::OnFilter(wxCommandEvent&)
928 {
929         wxTreeEvent e;
930         e.SetItem(this->tree_ctrl->GetSelection());
931         this->OnTreeChanged(e);
932 }
933
934 // \83C\83x\83\93\83g\83n\83\93\83h\83\89\88È\8aO\81B
935
936 int MainFrame::LoadTPI(wxString szFileName)
937 {
938         // TPI\82ð\93Ç\82Ý\8d\9e\82Ý\81B
939         wxFileSystem fs;
940         fs.ChangePathTo(FE_DIR_B_LIB, true);
941         wxString szTPIName = fs.FindFirst(wxT("*" TPI_EXT), wxFILE);
942         int nFileCount = -1;
943         while (! szTPIName.IsEmpty())
944         {
945                 // \91Î\89\9e\8am\94F\81B
946                 if (! tpi.InitLibrary(szTPIName, szFileName, 0) || ! tpi.CheckArchive(szFileName, & nFileCount) || nFileCount < 0)
947                 {
948                         tpi.FreeLibrary();
949                         szTPIName = fs.FindNext();
950                         continue;
951                 }
952                 break;
953         }
954         return nFileCount;
955 }
956
957 int MainFrame::ErrorCheck(int nErrorCode)
958 {
959         switch (nErrorCode)
960         {
961         case TPI_ERROR_SUCCESS:
962         case TPI_CALLBACK_CONTINUE:
963                 break;
964         case TPI_ERROR_D_UNSUPPORTED:
965                 ::ErrDlg(wxT("Sorry, this function is not supported yet."), this);
966                 break;
967         case TPI_ERROR_D_SKIPPED:
968         case TPI_CALLBACK_CANCEL:
969                 ::ErrDlg(wxT("This operation is canceled by the user."), this);
970                 break;
971         default:
972                 ::ErrDlg(wxT("Error code is ") + wxString::Format(wxT("%d."), nErrorCode), this);
973         }
974         return nErrorCode;
975 }