1 /*******************************************************************************
\r
2 TPI - flexible but useless plug-in framework.
\r
3 Copyright (C) 2002-2009 Silky
\r
5 This library is free software; you can redistribute it and/or modify it under
\r
6 the terms of the GNU Lesser General Public License as published by the Free
\r
7 Software Foundation; either version 2.1 of the License, or (at your option)
\r
10 This library is distributed in the hope that it will be useful, but WITHOUT
\r
11 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
\r
12 FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
\r
15 You should have received a copy of the GNU Lesser General Public License along
\r
16 with this library; if not, write to the Free Software Foundation, Inc.,
\r
17 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
\r
20 *******************************************************************************/
\r
24 #include "frm_main.h"
\r
25 #include "cls_filedroptarget.h"
\r
26 #include "dlg_make.h"
\r
27 #include "dlg_process.h"
\r
28 #include "functions.h"
\r
30 #include <wx/arrimpl.cpp>
\r
32 WX_DEFINE_OBJARRAY(ArrayTPI_FILEINFO);
\r
34 #define SetMenuToolState(id, state) this->toolbar->EnableTool(XRCID(id), state); this->menubar->Enable(XRCID(id), state)
\r
36 //******************************************************************************
\r
38 //******************************************************************************
\r
40 wxImageList g_hIconT(16, 16), g_hIconLL(32, 32), g_hIconLS(16, 16);
\r
44 //******************************************************************************
\r
46 //******************************************************************************
\r
48 MainFrame::MainFrame(): wxFrame()
\r
52 MainFrame::~MainFrame()
\r
55 this->OnArcClose(e);
\r
58 if (! this->IsIconized() && ! this->IsMaximized())
\r
61 this->GetSize(& a, & b);
\r
62 this->conf.WriteId(CONF_WINDOW_WIDTH, a);
\r
63 this->conf.WriteId(CONF_WINDOW_HEIGHT, b);
\r
64 this->GetPosition(& a, & b);
\r
65 this->conf.WriteId(CONF_WINDOW_X, a);
\r
66 this->conf.WriteId(CONF_WINDOW_Y, b);
\r
68 this->conf.WriteId(CONF_WINDOW_SPLITTER_POS, this->window_splitter->GetSashPosition());
\r
71 this->conf.WriteId(CONF_WINDOW_STATUSBAR, this->statusbar->IsShown());
\r
72 this->conf.WriteId(CONF_WINDOW_TOOLBAR, this->toolbar->IsShown());
\r
75 this->conf.WriteId(CONF_LISTVIEW_SHOWMODE, this->menubar->IsChecked(XRCID("Exe_View_Icons")) ? 1 : this->menubar->IsChecked(XRCID("Exe_View_List")) ? 2 : 0);
\r
76 if (this->menubar->IsChecked(XRCID("Exe_View_Details")))
\r
78 this->conf.WriteId(CONF_LISTVIEW_C_FILENAME, this->list_ctrl->GetColumnWidth(0));
\r
79 this->conf.WriteId(CONF_LISTVIEW_C_UNPACKED, this->list_ctrl->GetColumnWidth(1));
\r
80 this->conf.WriteId(CONF_LISTVIEW_C_PACKED, this->list_ctrl->GetColumnWidth(2));
\r
81 this->conf.WriteId(CONF_LISTVIEW_C_RATIO, this->list_ctrl->GetColumnWidth(3));
\r
82 this->conf.WriteId(CONF_LISTVIEW_C_METHOD, this->list_ctrl->GetColumnWidth(4));
\r
83 this->conf.WriteId(CONF_LISTVIEW_C_ATTR, this->list_ctrl->GetColumnWidth(5));
\r
84 this->conf.WriteId(CONF_LISTVIEW_C_LASTMOD, this->list_ctrl->GetColumnWidth(6));
\r
85 this->conf.WriteId(CONF_LISTVIEW_C_PATH, this->list_ctrl->GetColumnWidth(7));
\r
86 this->conf.WriteId(CONF_LISTVIEW_C_TYPE, this->list_ctrl->GetColumnWidth(8));
\r
87 this->conf.WriteId(CONF_LISTVIEW_C_NO, this->list_ctrl->GetColumnWidth(9));
\r
88 this->conf.WriteId(CONF_LISTVIEW_C_COMMENT, this->list_ctrl->GetColumnWidth(10));
\r
89 this->conf.WriteId(CONF_LISTVIEW_S_COLUMN, g_nSortColumn);
\r
90 this->conf.WriteId(CONF_LISTVIEW_S_ASCEND, g_fSortAscend);
\r
96 //******************************************************************************
\r
98 //******************************************************************************
\r
100 BEGIN_EVENT_TABLE(MainFrame, wxFrame)
\r
101 EVT_INIT_DIALOG( MainFrame::OnInit)
\r
103 EVT_MENU(XRCID("Arc_Create"), MainFrame::OnArcCreate)
\r
104 EVT_MENU(XRCID("Arc_Open"), MainFrame::OnArcOpen)
\r
105 EVT_MENU(XRCID("Arc_Close"), MainFrame::OnArcClose)
\r
106 EVT_MENU(XRCID("Arc_Clone"), MainFrame::OnArcClone)
\r
107 EVT_MENU(XRCID("Arc_Add"), MainFrame::OnArcAdd)
\r
108 EVT_MENU(XRCID("Arc_SFX"), MainFrame::OnArcConvert)
\r
109 EVT_MENU(XRCID("Arc_UnSFX"), MainFrame::OnArcConvert)
\r
110 EVT_MENU(XRCID("Exe_Exit"), MainFrame::OnExit)
\r
111 EVT_MENU(XRCID("Arc_Extract"), MainFrame::OnArcExtract)
\r
112 EVT_MENU(XRCID("Arc_Delete"), MainFrame::OnArcDelete)
\r
113 EVT_MENU(XRCID("Arc_Test"), MainFrame::OnArcTest)
\r
114 EVT_MENU(XRCID("Arc_Repair"), MainFrame::OnArcRepair)
\r
115 EVT_MENU(XRCID("Exe_Copy"), MainFrame::OnExeCopy)
\r
116 EVT_MENU(XRCID("Exe_View_Icons"), MainFrame::OnViewMode)
\r
117 EVT_MENU(XRCID("Exe_View_Details"),MainFrame::OnViewMode)
\r
118 EVT_MENU(XRCID("Exe_View_List"), MainFrame::OnViewMode)
\r
119 EVT_MENU(XRCID("Exe_View_ToolBar"),MainFrame::OnShowToolBar)
\r
120 EVT_MENU(XRCID("Exe_View_StatusBar"),MainFrame::OnShowStatusBar)
\r
121 EVT_MENU(XRCID("Exe_View_SelectAll"),MainFrame::OnSelectAll)
\r
123 EVT_TREE_SEL_CHANGED(XRCID("TreeView"), MainFrame::OnTreeChanged)
\r
124 EVT_TREE_BEGIN_DRAG( XRCID("TreeView"), MainFrame::OnTreeBeginDrag)
\r
125 EVT_COMMAND_CONTEXT_MENU(XRCID("TreeView"), MainFrame::OnContextMenu)
\r
127 EVT_LIST_ITEM_SELECTED( XRCID("ListView"), MainFrame::OnListItemSelect)
\r
128 EVT_LIST_ITEM_DESELECTED(XRCID("ListView"), MainFrame::OnListItemSelect)
\r
129 EVT_LIST_ITEM_ACTIVATED( XRCID("ListView"), MainFrame::OnListItemDClick)
\r
130 EVT_LIST_BEGIN_DRAG( XRCID("ListView"), MainFrame::OnListBeginDrag)
\r
131 EVT_COMMAND_CONTEXT_MENU(XRCID("ListView"), MainFrame::OnContextMenu)
\r
133 EVT_TEXT(XRCID("tcFilter"), MainFrame::OnFilter)
\r
136 //******************************************************************************
\r
138 //******************************************************************************
\r
140 void MainFrame::OnInit(wxInitDialogEvent&)
\r
143 this->menubar = this->GetMenuBar();
\r
144 this->toolbar = this->GetToolBar();
\r
145 this->statusbar = XRCCTRL(* this, "statusbar", wxStatusBar);
\r
146 this->tree_ctrl = XRCCTRL(* this, "TreeView", wxTreeCtrl);
\r
147 this->list_ctrl = XRCCTRL(* this, "ListView", myListCtrl);
\r
148 this->window_splitter = XRCCTRL(* this, "window_splitter", wxSplitterWindow);
\r
149 this->tcFilter = XRCCTRL(* this->toolbar, "tcFilter", wxTextCtrl);
\r
152 this->SetSize(this->conf.ReadId(CONF_WINDOW_X, 0l), this->conf.ReadId(CONF_WINDOW_Y, 0l), this->conf.ReadId(CONF_WINDOW_WIDTH, 800l), this->conf.ReadId(CONF_WINDOW_HEIGHT, 400l), wxSIZE_ALLOW_MINUS_ONE);
\r
153 wxTheMimeTypesManager->Initialize(wxMAILCAP_ALL);
\r
158 icon.CopyFromBitmap(wxBitmap(L_DIR_S_ICO wxT("app.png"), wxBITMAP_TYPE_ANY));
\r
159 this->SetIcon(icon);
\r
162 this->OnArcClose(e);
\r
163 this->SetDropTarget(new myFileDropTarget(this));
\r
166 this->window_splitter->SetSashPosition(this->conf.ReadId(CONF_WINDOW_SPLITTER_POS, 200l));
\r
169 int nIconMode = this->conf.ReadId(CONF_LISTVIEW_SHOWMODE, 0l);
\r
170 e.SetId(nIconMode == 1 ? XRCID("Exe_View_Icons") : (nIconMode == 2 ? XRCID("Exe_View_List") : XRCID("Exe_View_Details")));
\r
171 this->OnViewMode(e);
\r
172 // wxGTKでは直接wxLC_VIRTUALを指定しないと反映されない。
\r
173 this->list_ctrl->SetSingleStyle(wxLC_VIRTUAL);
\r
174 this->list_ctrl->InsertColumn(0, _("Filename"), wxLIST_FORMAT_LEFT, this->conf.ReadId(CONF_LISTVIEW_C_FILENAME, 140l));
\r
175 this->list_ctrl->InsertColumn(1, _("Unpacked"), wxLIST_FORMAT_RIGHT, this->conf.ReadId(CONF_LISTVIEW_C_UNPACKED, 80l));
\r
176 this->list_ctrl->InsertColumn(2, _("Packed"), wxLIST_FORMAT_RIGHT, this->conf.ReadId(CONF_LISTVIEW_C_PACKED, 80l));
\r
177 this->list_ctrl->InsertColumn(3, _("Ratio"), wxLIST_FORMAT_RIGHT, this->conf.ReadId(CONF_LISTVIEW_C_RATIO, 50l));
\r
178 this->list_ctrl->InsertColumn(4, _("Method"), wxLIST_FORMAT_LEFT, this->conf.ReadId(CONF_LISTVIEW_C_METHOD, 60l));
\r
179 this->list_ctrl->InsertColumn(5, _("Attr"), wxLIST_FORMAT_LEFT, this->conf.ReadId(CONF_LISTVIEW_C_ATTR, 50l));
\r
180 this->list_ctrl->InsertColumn(6, _("Last modified"), wxLIST_FORMAT_RIGHT, this->conf.ReadId(CONF_LISTVIEW_C_LASTMOD, 150l));
\r
181 this->list_ctrl->InsertColumn(7, _("Path"), wxLIST_FORMAT_LEFT, this->conf.ReadId(CONF_LISTVIEW_C_PATH, 100l));
\r
182 this->list_ctrl->InsertColumn(8, _("Type"), wxLIST_FORMAT_LEFT, this->conf.ReadId(CONF_LISTVIEW_C_TYPE, 100l));
\r
183 this->list_ctrl->InsertColumn(9, _("No."), wxLIST_FORMAT_RIGHT, this->conf.ReadId(CONF_LISTVIEW_C_NO, 35l));
\r
184 this->list_ctrl->InsertColumn(10,_("Comment"), wxLIST_FORMAT_LEFT, this->conf.ReadId(CONF_LISTVIEW_C_COMMENT, 35l));
\r
185 g_nSortColumn = this->conf.ReadId(CONF_LISTVIEW_S_COLUMN, 9l);
\r
186 g_fSortAscend = this->conf.ReadId(CONF_LISTVIEW_S_ASCEND, true);
\r
188 // ツールバー/ステータスバー設定。
\r
189 int nStatusBarParts[] = {70, 70, 180, 50, -1};
\r
190 this->statusbar->SetFieldsCount(5, nStatusBarParts);
\r
191 this->SetStatusBarPane(-1);
\r
192 bool fShow = this->conf.ReadId(CONF_WINDOW_STATUSBAR, true);
\r
193 this->menubar->Check(XRCID("Exe_View_StatusBar"), fShow);
\r
194 this->statusbar->Show(fShow);
\r
195 fShow = this->conf.ReadId(CONF_WINDOW_TOOLBAR, true);
\r
196 this->menubar->Check(XRCID("Exe_View_ToolBar"), fShow);
\r
197 this->toolbar->Show(fShow);
\r
202 void MainFrame::OnExit(wxCommandEvent&)
\r
207 void MainFrame::OnArcCreate(wxCommandEvent& e)
\r
209 TPI_SWITCHES swInfo;
\r
210 swInfo.pCustomSwitches = NULL;
\r
214 mkDlg.SetParent(this);
\r
215 if (e.GetClientData() == NULL)
\r
218 wxFileDialog fd(this, _("Choose files to compress"), this->conf.ReadHistory(CONF_HISTORY_PATH, 0), wxEmptyString, wxFileSelectorDefaultWildcardStr, wxFD_OPEN | wxFD_FILE_MUST_EXIST | wxFD_MULTIPLE);
\r
219 if (fd.ShowModal() == wxID_CANCEL)
\r
223 swInfo.fnDestinationDirectory = wxFileName::DirName(fd.GetDirectory());
\r
224 this->conf.WriteHistory(CONF_HISTORY_PATH, fd.GetDirectory());
\r
225 fd.GetFilenames(mkDlg.files);
\r
229 mkDlg.files = * (wxArrayString *) e.GetClientData();
\r
230 swInfo.fnDestinationDirectory = wxFileName::DirName(wxFileName(mkDlg.files[0]).GetPath());
\r
232 for (size_t n = 0; n < mkDlg.files.GetCount(); n++)
\r
234 wxFileName fn(mkDlg.files[n]);
\r
235 fn.MakeRelativeTo(swInfo.fnDestinationDirectory.GetPath());
\r
236 mkDlg.files[n] = fn.GetFullPath();
\r
240 this->OnArcClose(e);
\r
241 // 書庫名はファイル名の拡張子より前、もしくはディレクトリ名。
\r
242 this->fnArchive = wxFileName(mkDlg.files[0]);
\r
243 this->fnArchive.SetName(mkDlg.files.GetCount() == 1 ? (this->fnArchive.GetName().IsEmpty() ? this->fnArchive.GetDirs().Last() : this->fnArchive.GetName()) : swInfo.fnDestinationDirectory.GetDirs().Last());
\r
244 this->fnArchive.SetEmptyExt();
\r
245 this->fnArchive.SetPath(swInfo.fnDestinationDirectory.GetPath());
\r
248 if (mkDlg.ShowModal() == wxID_CANCEL)
\r
254 swInfo.fStoreDirectoryPathes= ! mkDlg.cbIgnorePath->IsChecked();
\r
255 swInfo.fMakeSFX = mkDlg.cbMakeSFX->IsChecked();
\r
256 swInfo.fSolid = mkDlg.cbSolid->IsChecked();
\r
257 swInfo.fMMOptimize = mkDlg.cbMMOptimize->IsChecked();
\r
258 swInfo.fEncryptHeader = mkDlg.cbEncryptHeader->IsChecked();
\r
259 swInfo.fCompressHeader = mkDlg.cbCompressHeader->IsChecked();
\r
260 swInfo.nCompressLevel = mkDlg.scLevel->GetValue();
\r
261 swInfo.nRecoveryRecord = mkDlg.scRR->GetValue();
\r
262 swInfo.szPassword = mkDlg.tcPassword->GetValue();
\r
263 swInfo.szKeyFile = mkDlg.tcKeyfile->GetValue();
\r
264 swInfo.szComment = mkDlg.tcComment->GetValue();
\r
265 mkDlg.cbSplitSize->GetValue().ToULongLong(& swInfo.nSplitSize);
\r
268 int nSelected = mkDlg.chType->GetSelection();
\r
269 this->fnArchive = wxFileName(mkDlg.cbDir->GetValue(), mkDlg.cbFileName->GetValue());
\r
270 if (! tpi.InitLibrary(mkDlg.afInfo[nSelected].szTPIName, this->fnArchive.GetFullPath(), mkDlg.afInfo[nSelected].nTypeId))
\r
272 this->ErrorCheck(tpi.nErrorCode, wxT("InitLibrary"));
\r
277 tpi.SetCallbackProc(TPICallbackProc);
\r
278 this->ErrorCheck(tpi.nErrorCode, wxT("SetCallbackProc"));
\r
282 ProcessDialog procDlg;
\r
283 procDlg.fnArchive = & this->fnArchive;
\r
284 procDlg.nFileCount = mkDlg.files.GetCount();
\r
285 procDlg.Show(true);
\r
287 tpi.Command(TPI_COMMAND_CREATE, & swInfo, this->fnArchive.GetFullPath(), mkDlg.files);
\r
288 this->ErrorCheck(tpi.nErrorCode);
\r
289 procDlg.Show(false);
\r
293 if (mkDlg.cbOpenAfter->IsChecked())
\r
296 ::wxExecute(DIR_APP + QuoteString(swInfo.fnDestinationDirectory.GetFullPath()));
\r
299 if (mkDlg.cbExitAfter->IsChecked())
\r
306 this->OnArcOpen(e);
\r
309 void MainFrame::OnArcOpen(wxCommandEvent& e)
\r
311 // モード取得。通常は0, それ以外で開く場合は1, ファイルDnDなら2。
\r
312 int nMode = e.GetInt() == 2 ? 2 : e.GetId() == XRCID("Arc_Open") ? 0 : 1;
\r
317 wxFileDialog fd(this, _("Choose an archive"), this->conf.ReadHistory(CONF_HISTORY_PATH, 0), wxEmptyString, wxFileSelectorDefaultWildcardStr, wxFD_OPEN | wxFD_FILE_MUST_EXIST);
\r
318 if (fd.ShowModal() == wxID_CANCEL)
\r
322 this->conf.WriteHistory(CONF_HISTORY_PATH, fd.GetDirectory());
\r
323 this->fnArchive = wxFileName(fd.GetPath());
\r
327 ProcessDialog procDlg;
\r
328 procDlg.fnArchive = & this->fnArchive;
\r
329 procDlg.Show(true);
\r
331 // DnD以外で書庫を開く場合、TPIを読み込み。
\r
332 TPI_PROCESSINFO piInfo;
\r
333 if (! this->LoadTPI(this->fnArchive.GetFullPath(), & piInfo.fiInfo.nUnpackedSize))
\r
335 procDlg.Show(false);
\r
339 this->OnArcCreate(e);
\r
341 else if (this->IsShown())
\r
344 this->statusbar->SetStatusText(_("No plug-in supporting this archive was found!"), 4);
\r
348 wxLogError(_("No plug-in supporting this archive was found!"));
\r
354 piInfo.eMessage = TPI_MESSAGE_STATUS;
\r
355 piInfo.eStatus = 0x1001;
\r
356 if (this->ErrorCheck(procDlg.CallbackProc(TPI_NOTIFY_COMMON, & piInfo), wxT("Callback")) == TPI_CALLBACK_CANCEL)
\r
358 procDlg.Show(false);
\r
359 tpi.CloseArchive();
\r
361 this->OnArcClose(e);
\r
366 this->fileinfo.Alloc(piInfo.fiInfo.nUnpackedSize);
\r
369 this->conf.WriteHistory(CONF_HISTORY_PATH, this->fnArchive.GetPath());
\r
370 this->conf.WriteHistory(CONF_HISTORY_NAME, this->fnArchive.GetFullName());
\r
371 this->conf.WriteHistory(CONF_HISTORY_FULL, this->fnArchive.GetFullPath());
\r
373 // 書庫のアイコンを取得し、書庫ルートを作成。
\r
374 g_hIconT.Add(wxBitmap(L_DIR_S_ICO wxT("folder_closed.png"), wxBITMAP_TYPE_ANY));
\r
375 g_hIconT.Add(wxBitmap(L_DIR_S_ICO wxT("folder_open.png"), wxBITMAP_TYPE_ANY));
\r
376 this->tree_ctrl->SetImageList(& g_hIconT);
\r
378 idRoot = this->tree_ctrl->AddRoot(wxEmptyString),
\r
380 idArchive = this->tree_ctrl->AppendItem(idRoot, this->fnArchive.GetFullName(), g_hIconT.Add(GetFileTypeIcon(piInfo.fiInfo.fnFileName))),
\r
382 idArchive = this->tree_ctrl->AppendItem(idRoot, this->fnArchive.GetFullName(), g_hIconT.Add(GetFileTypeIcon(piInfo.fiInfo.fnFileName).ConvertToImage().Rescale(16, 16))),
\r
384 idArcRoot = this->tree_ctrl->AppendItem(idRoot, wxT("-----"), 0, 1);
\r
387 if (tpi.GetFileInformation(& piInfo.fiInfo, true))
\r
389 piInfo.eStatus = 0x1002;
\r
390 piInfo.nProcessedSize = 0;
\r
393 piInfo.nProcessedSize++;
\r
394 if (this->ErrorCheck(procDlg.CallbackProc(TPI_NOTIFY_COMMON, & piInfo), wxT("Callback")) == TPI_CALLBACK_CANCEL)
\r
396 procDlg.Show(false);
\r
397 tpi.CloseArchive();
\r
399 this->OnArcClose(e);
\r
404 if (piInfo.fiInfo.szStoredName.IsEmpty())
\r
406 piInfo.fiInfo.szStoredName = this->fnArchive.GetName();
\r
407 if (piInfo.fiInfo.fnFileName.HasExt())
\r
409 piInfo.fiInfo.szStoredName += wxT('.') + piInfo.fiInfo.fnFileName.GetExt();
\r
411 piInfo.fiInfo.fnFileName = wxFileName(piInfo.fiInfo.szStoredName);
\r
416 wxString szPath = piInfo.fiInfo.fnFileName.GetPathWithSep(wxPATH_UNIX);
\r
417 if (szPath.StartsWith(wxT("/")) || szPath.StartsWith(wxT("./")))
\r
419 piInfo.fiInfo.fnFileName = wxFileName(szPath.AfterFirst(wxT('/')), piInfo.fiInfo.fnFileName.GetFullName(), wxPATH_DOS);
\r
422 if (piInfo.fiInfo.fnFileName.GetFullPath().IsEmpty() || piInfo.fiInfo.fnFileName.GetFullPath() == wxT("."))
\r
428 if (piInfo.fiInfo.szStoredName.Find(wxT('\r')) != wxNOT_FOUND
\r
429 || piInfo.fiInfo.szStoredName.Find(wxT('\n')) != wxNOT_FOUND
\r
430 || piInfo.fiInfo.szStoredName.Find(wxT('\t')) != wxNOT_FOUND)
\r
432 wxString sz = piInfo.fiInfo.fnFileName.GetFullPath();
\r
433 sz.Replace(wxT("\r"), wxT(" "));
\r
434 sz.Replace(wxT("\n"), wxT(" "));
\r
435 sz.Replace(wxT("\t"), wxT(" "));
\r
436 piInfo.fiInfo.eDanger = TRUE;
\r
437 piInfo.fiInfo.fnFileName = wxFileName(sz);
\r
438 wxLogWarning(_("This archive may contain files whose name contains some special characters like CR(\\r), LF(\\n), Tab(\\t) and some problem would be happen if you extract these files. Don\'t extract these files carelessly.\nDanger file is:\n%s"), piInfo.fiInfo.fnFileName.GetFullPath().c_str());
\r
442 if (piInfo.fiInfo.fnFileName.GetPathWithSep(wxPATH_UNIX).Find(wxT("../")) != wxNOT_FOUND)
\r
444 piInfo.fiInfo.eDanger = TRUE;
\r
445 wxLogWarning(_("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%s"), piInfo.fiInfo.fnFileName.GetFullPath().c_str());
\r
447 // 空白の連続による拡張子偽装を検査。
\r
448 if (piInfo.fiInfo.fnFileName.GetFullName().Find(wxT(" ")) != wxNOT_FOUND)
\r
450 piInfo.fiInfo.eDanger = TRUE;
\r
451 wxLogWarning(_("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%s"), piInfo.fiInfo.fnFileName.GetFullPath().c_str());
\r
454 for (wxChar c = 0x200c; c <= 0x206f; c++)
\r
456 if (piInfo.fiInfo.fnFileName.GetFullName().Find(c) != wxNOT_FOUND)
\r
458 piInfo.fiInfo.eDanger = TRUE;
\r
459 wxLogWarning(_("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%s"), piInfo.fiInfo.fnFileName.GetFullPath().c_str());
\r
463 case 0x200f: c = 0x2027; break;
\r
464 case 0x202e: c = 0x2060; break;
\r
469 bool fDir = piInfo.fiInfo.dwAttribute & TPI_ATTRIBUTE_DIRECTORY ? true : false;
\r
470 TreeView_CheckNewerItem(this->tree_ctrl, idArcRoot, fDir ? piInfo.fiInfo.fnFileName.GetFullPath() : piInfo.fiInfo.fnFileName.GetPath(), true);
\r
472 // ディレクトリ属性を含むものについては情報を保存しない。
\r
479 this->fileinfo.Add(piInfo.fiInfo);
\r
481 while (tpi.GetFileInformation(& piInfo.fiInfo));
\r
484 // GetFileInformationがエラー終了した場合。
\r
485 this->ErrorCheck(tpi.nErrorCode, wxT("GetFileInformation"));
\r
488 tpi.GetArchiveInformation(& this->aiArchive);
\r
489 this->ErrorCheck(tpi.nErrorCode, wxT("GetArchiveInformation"));
\r
492 tpi.CloseArchive();
\r
493 this->ErrorCheck(tpi.nErrorCode, wxT("CloseArchive"));
\r
496 this->fileinfo.Shrink();
\r
497 this->tree_ctrl->ExpandAll();
\r
498 this->tree_ctrl->ScrollTo(idArchive);
\r
499 this->tree_ctrl->SelectItem(idArchive);
\r
500 this->tree_ctrl->SetScrollPos(wxHORIZONTAL, 0);
\r
501 this->list_ctrl->atDangerItem.SetTextColour(* wxRED);
\r
502 this->list_ctrl->atEncryptedItem.SetTextColour(wxColour(wxT("forest green")));
\r
505 this->statusbar->SetStatusText(this->aiArchive.fiInfo.szTypeName, 0);
\r
506 this->statusbar->SetStatusText(wxString::Format(_("%u file(s)"), this->fileinfo.GetCount()), 1);
\r
507 this->statusbar->SetStatusText(wxString::Format(wxString("%" wxLongLongFmtSpec "uB -> %" wxLongLongFmtSpec "uB"), this->aiArchive.nUnpackedSize, this->aiArchive.nPackedSize), 2);
\r
508 this->statusbar->SetStatusText(wxString::Format(wxT("%3.1f%%"), this->aiArchive.wCompressRatio / 10.0), 3);
\r
509 this->statusbar->SetStatusText(this->fnArchive.GetFullPath(), 4);
\r
511 // ツールバー・メニューバー設定。ファイル選択時しか動作しない削除などは別に設定。
\r
512 SetMenuToolState("Arc_Close", true);
\r
513 SetMenuToolState("Arc_Add", (this->aiArchive.fiInfo.eSupportedCommand & TPI_COMMAND_ADD) == TPI_COMMAND_ADD && this->aiArchive.fiInfo.fArchive);
\r
514 SetMenuToolState("Arc_SFX", (this->aiArchive.fiInfo.eSupportedCommand & TPI_COMMAND_SFX) == TPI_COMMAND_SFX && ! this->aiArchive.fSFX);
\r
515 SetMenuToolState("Arc_UnSFX", (this->aiArchive.fiInfo.eSupportedCommand & TPI_COMMAND_UNSFX) == TPI_COMMAND_UNSFX && this->aiArchive.fSFX);
\r
516 SetMenuToolState("Arc_Extract", (this->aiArchive.fiInfo.eSupportedCommand & TPI_COMMAND_EXTRACT)== TPI_COMMAND_EXTRACT);
\r
517 SetMenuToolState("Arc_Test", (this->aiArchive.fiInfo.eSupportedCommand & TPI_COMMAND_TEST) == TPI_COMMAND_TEST);
\r
518 SetMenuToolState("Arc_Repair", (this->aiArchive.fiInfo.eSupportedCommand & TPI_COMMAND_REPAIR) == TPI_COMMAND_REPAIR);
\r
519 this->menubar->Enable(XRCID("Arc_Clone"), true);
\r
521 procDlg.Show(false);
\r
525 void MainFrame::OnArcClose(wxCommandEvent& e)
\r
527 // ツリービュー・リストビュー設定。
\r
528 this->tree_ctrl->DeleteAllItems();
\r
529 this->list_ctrl->DeleteAllItems();
\r
530 this->list_ctrl->apShowFile.Clear();
\r
533 SetMenuToolState("Arc_Close", false);
\r
534 SetMenuToolState("Arc_Add", false);
\r
535 SetMenuToolState("Arc_SFX", false);
\r
536 SetMenuToolState("Arc_UnSFX", false);
\r
537 SetMenuToolState("Arc_Extract", false);
\r
538 SetMenuToolState("Arc_Delete", false);
\r
539 SetMenuToolState("Arc_Test", false);
\r
540 SetMenuToolState("Arc_Repair", false);
\r
541 this->menubar->Enable(XRCID("Arc_Clone"), false);
\r
543 for (int i = 0; i < this->statusbar->GetFieldsCount(); i++)
\r
545 this->statusbar->SetStatusText(wxEmptyString, i);
\r
547 this->fileinfo.Clear();
\r
548 this->aiArchive.szComment.Empty();
\r
549 this->aiArchive.fnArchive.Clear();
\r
550 this->aiArchive.fiInfo.szTypeName.Empty();
\r
551 this->aiArchive.fiInfo.szSuffix.Empty();
\r
552 this->aiArchive.fiInfo.szEngineName.Empty();
\r
553 this->aiArchive.fiInfo.szTPIName.Empty();
\r
555 g_hIconT.RemoveAll();
\r
556 g_hIconLL.RemoveAll();
\r
557 g_hIconLS.RemoveAll();
\r
559 // DnDで書庫を開くときは既に読み込まれているTPIを用いるので、解放してはいけない。
\r
560 if (e.GetExtraLong() == 0)
\r
566 void MainFrame::OnArcClone(wxCommandEvent&)
\r
569 wxFileDialog fd(this, _("Clone archive"), this->fnArchive.GetPath(), this->fnArchive.GetFullName(), wxFileSelectorDefaultWildcardStr, wxFD_SAVE | wxFD_OVERWRITE_PROMPT);
\r
570 if (fd.ShowModal() == wxID_CANCEL)
\r
574 this->conf.WriteHistory(CONF_HISTORY_PATH, fd.GetDirectory());
\r
577 ::wxCopyFile(this->fnArchive.GetFullPath(), fd.GetPath());
\r
578 wxFileName fn(fd.GetPath());
\r
579 wxDateTime dtAccess, dtModify, dtCreate;
\r
580 this->fnArchive.GetTimes(& dtAccess, & dtModify, & dtCreate);
\r
581 fn.SetTimes(& dtAccess, & dtModify, & dtCreate);
\r
584 void MainFrame::OnArcAdd(wxCommandEvent& e)
\r
588 mkDlg.SetParent(this);
\r
589 mkDlg.uCommand = TPI_COMMAND_ADD;
\r
592 wxFileDialog fd(this, _("Choose files to add"), this->conf.ReadHistory(CONF_HISTORY_PATH, 0), wxEmptyString, wxFileSelectorDefaultWildcardStr, wxFD_OPEN | wxFD_FILE_MUST_EXIST | wxFD_MULTIPLE);
\r
593 if (fd.ShowModal() == wxID_CANCEL)
\r
597 fd.GetFilenames(mkDlg.files);
\r
598 this->conf.WriteHistory(CONF_HISTORY_PATH, fd.GetDirectory());
\r
601 if (mkDlg.ShowModal() == wxID_CANCEL)
\r
607 TPI_SWITCHES swInfo;
\r
608 swInfo.pCustomSwitches = NULL;
\r
609 swInfo.fMakeSFX = false;
\r
610 swInfo.fnDestinationDirectory= wxFileName::DirName(fd.GetDirectory());
\r
611 swInfo.fStoreDirectoryPathes = ! mkDlg.cbIgnorePath->IsChecked();
\r
612 swInfo.fSolid = mkDlg.cbSolid->IsChecked();
\r
613 swInfo.fMMOptimize = mkDlg.cbMMOptimize->IsChecked();
\r
614 swInfo.fEncryptHeader = mkDlg.cbEncryptHeader->IsChecked();
\r
615 swInfo.nCompressLevel = mkDlg.scLevel->GetValue();
\r
616 swInfo.nRecoveryRecord = mkDlg.scRR->GetValue();
\r
617 swInfo.szPassword = mkDlg.tcPassword->GetValue();
\r
618 swInfo.szKeyFile = mkDlg.tcKeyfile->GetValue();
\r
619 swInfo.szComment = mkDlg.tcComment->GetValue();
\r
623 ProcessDialog procDlg;
\r
624 procDlg.fnArchive = & this->fnArchive;
\r
625 procDlg.nFileCount = mkDlg.files.GetCount();
\r
626 procDlg.Show(true);
\r
628 tpi.Command(TPI_COMMAND_ADD, & swInfo, this->fnArchive.GetFullPath(), mkDlg.files);
\r
629 this->ErrorCheck(tpi.nErrorCode);
\r
630 procDlg.Show(false);
\r
633 if (mkDlg.cbOpenAfter->IsChecked())
\r
636 ::wxExecute(DIR_APP + QuoteString(swInfo.fnDestinationDirectory.GetFullPath()));
\r
639 if (mkDlg.cbExitAfter->IsChecked())
\r
645 // 終了しない場合は書庫を再読み込み。
\r
646 this->OnArcOpen(e);
\r
649 void MainFrame::OnArcConvert(wxCommandEvent& e)
\r
651 TPI_SWITCHES swInfo;
\r
652 swInfo.fMakeSFX = e.GetId() == XRCID("Arc_SFX");
\r
655 wxFileDialog fd(this, swInfo.fMakeSFX ? _("Save as SFX") : _("Save as normal archive"), this->fnArchive.GetPath(), this->fnArchive.GetName() + (swInfo.fMakeSFX ? EXE_EXT : (wxString) wxEmptyString), wxFileSelectorDefaultWildcardStr, wxFD_SAVE | wxFD_OVERWRITE_PROMPT);
\r
656 if (fd.ShowModal() == wxID_CANCEL)
\r
660 swInfo.fnDestinationDirectory = wxFileName::DirName(fd.GetDirectory());
\r
661 this->conf.WriteHistory(CONF_HISTORY_PATH, fd.GetDirectory());
\r
663 wxArrayString files;
\r
664 files.Add(fd.GetPath());
\r
666 ProcessDialog procDlg;
\r
667 procDlg.Show(true);
\r
668 tpi.Command(swInfo.fMakeSFX ? TPI_COMMAND_SFX : TPI_COMMAND_UNSFX, & swInfo, this->fnArchive.GetFullPath(), files);
\r
669 this->ErrorCheck(tpi.nErrorCode);
\r
670 procDlg.Show(false);
\r
673 void MainFrame::OnArcExtract(wxCommandEvent& e)
\r
675 TPI_SWITCHES swInfo;
\r
676 swInfo.pCustomSwitches = NULL;
\r
678 // モード取得。通常は0, 実行なら1, ファイルDnDなら2、ディレクトリDnDなら3、クリップボードなら4、コンテキストメニューからなら8。
\r
679 int nMode = e.GetInt();
\r
680 if (e.GetInt() == 8)
\r
685 wxFileType * ftFile = NULL;
\r
687 // 展開ダイアログを作成。DnDまたは実行時は表示しない。
\r
689 mkDlg.SetParent(this);
\r
690 mkDlg.uCommand = TPI_COMMAND_EXTRACT;
\r
691 mkDlg.files = MakeTargetFileList(this, nMode == 1);
\r
696 swInfo.fStoreDirectoryPathes = false;
\r
697 wxString szDestDirBase = nMode == 3 ? this->tree_ctrl->GetItemText(this->tree_ctrl->GetSelection()) : wxT("tpi_tmp");
\r
699 if (szDestDirBase == wxT("-----"))
\r
701 // 書庫ルートのときは書庫名にしておく。
\r
702 szDestDirBase = this->fnArchive.GetName();
\r
704 swInfo.fnDestinationDirectory = MakeDirPath(wxFileName::DirName(p.GetTempDir()), szDestDirBase, true);
\r
705 if (! swInfo.fnDestinationDirectory.IsOk())
\r
707 wxLogError(_("Unable to make the temporary directory!"));
\r
713 if (mkDlg.ShowModal() == wxID_CANCEL)
\r
719 swInfo.fStoreDirectoryPathes = ! mkDlg.cbIgnorePath->IsChecked();
\r
720 swInfo.fnDestinationDirectory = wxFileName::DirName(mkDlg.cbDir->GetValue());
\r
721 swInfo.szPassword = mkDlg.tcPassword->GetValue();
\r
722 swInfo.szKeyFile = mkDlg.tcKeyfile->GetValue();
\r
724 // 必要なら書庫名でディレクトリを作成する。
\r
725 if (WillMakeDirByArcName(this, & mkDlg))
\r
727 swInfo.fnDestinationDirectory = MakeDirPath(swInfo.fnDestinationDirectory, this->fnArchive.GetName(), true);
\r
728 if (! swInfo.fnDestinationDirectory.IsOk())
\r
730 wxLogError(_("Unable to make the destination directory!"));
\r
738 ProcessDialog procDlg;
\r
739 procDlg.fnArchive = & this->fnArchive;
\r
740 procDlg.nFileCount = mkDlg.files.GetCount();
\r
741 procDlg.Show(true);
\r
743 tpi.Command(TPI_COMMAND_EXTRACT, & swInfo, this->fnArchive.GetFullPath(), mkDlg.files);
\r
744 this->ErrorCheck(tpi.nErrorCode);
\r
745 procDlg.Show(false);
\r
750 if (mkDlg.cbOpenAfter->IsChecked())
\r
753 ::wxExecute(DIR_APP + QuoteString(swInfo.fnDestinationDirectory.GetFullPath()));
\r
756 if (mkDlg.cbExitAfter->IsChecked())
\r
767 ftFile = wxTheMimeTypesManager->GetFileTypeFromExtension(wxFileName(mkDlg.files[0], wxPATH_DOS).GetExt());
\r
768 if (! ftFile || ftFile->GetOpenCommand(wxEmptyString).IsEmpty())
\r
770 // 種類が取得できないときはテキストとみなす。
\r
771 ftFile = wxTheMimeTypesManager->GetFileTypeFromExtension(this->conf.ReadId(CONF_DEFAULT_EXT, (wxString) wxT("txt")));
\r
775 wxString szTempFile = swInfo.fnDestinationDirectory.GetPathWithSep() + wxFileName(mkDlg.files[0], wxPATH_DOS).GetFullName();
\r
776 bool fSuccess = tpi.nErrorCode == TPI_ERROR_SUCCESS && ftFile != NULL;
\r
777 myProcess * pCallback = new myProcess(szTempFile, swInfo.fnDestinationDirectory.GetPath());
\r
781 // Linuxでは引用符で囲む必要がある。
\r
782 fSuccess = ::wxExecute(ftFile->GetOpenCommand(QuoteString(szTempFile)), wxEXEC_ASYNC, pCallback) > 0;
\r
784 fSuccess = ::wxExecute(ftFile->GetOpenCommand(szTempFile), wxEXEC_ASYNC, pCallback) > 0;
\r
789 pCallback->OnTerminate(0, 0);
\r
795 wxArrayString asFiles;
\r
796 myFileDataObject * objFile = new myFileDataObject();
\r
797 objFile->szTempDir = nMode == 3 ? swInfo.fnDestinationDirectory.GetPath() : swInfo.fnDestinationDirectory.GetFullPath();
\r
798 for (size_t i = 0; i < mkDlg.files.GetCount(); i++)
\r
800 wxString szFileName = swInfo.fnDestinationDirectory.GetPathWithSep() + wxFileName(mkDlg.files[i], wxPATH_DOS).GetFullName();
\r
803 asFiles.Add(szFileName);
\r
808 objFile->AddFile(szFileName);
\r
813 objFile->AddFile(objFile->szTempDir);
\r
818 wxTheClipboard->SetData(objFile);
\r
822 // 自身にドロップされると煩雑なので、一時的にドロップを受け付けないようにしておく。
\r
823 this->SetDropTarget(NULL);
\r
826 wxDropSource dropSource(* objFile, this);
\r
827 wxDragResult drResult = dropSource.DoDragDrop();
\r
828 if (drResult != wxDragCancel && drResult != wxDragNone && drResult != wxDragMove)
\r
831 // Linuxではまだ処理が終わっていない(コンテキストメニューが表示されている)ので、とりあえず3秒だけ待つ。
\r
835 this->SetDropTarget(new myFileDropTarget(this));
\r
837 // ディレクトリDnDのときは、先にディレクトリの中のファイルを消しておく。
\r
840 for (size_t i = 0; i < asFiles.GetCount(); i++)
\r
842 chmod(asFiles[i].ToUTF8(), 0600);
\r
843 ::wxRemoveFile(asFiles[i]);
\r
853 void MainFrame::OnArcDelete(wxCommandEvent& e)
\r
855 // 全ファイル削除は危険ではないかと。
\r
856 if (this->list_ctrl->GetSelectedItemCount() == 0)
\r
858 // wxのバグで自動では無効化できないので、実行しようとしたときに無効化する。
\r
859 SetMenuToolState("Arc_Delete", false);
\r
863 if (::AskDlg(_("Are you sure to delete selected files?"), this) == wxNO)
\r
870 wxArrayString asFiles = MakeTargetFileList(this, false);
\r
871 ProcessDialog procDlg;
\r
872 procDlg.fnArchive = & this->fnArchive;
\r
873 procDlg.nFileCount = asFiles.GetCount();
\r
874 procDlg.Show(true);
\r
876 TPI_SWITCHES swInfo;
\r
877 tpi.Command(TPI_COMMAND_DELETE, & swInfo, this->fnArchive.GetFullPath(), asFiles);
\r
878 this->ErrorCheck(tpi.nErrorCode);
\r
879 procDlg.Show(false);
\r
883 this->OnArcOpen(e);
\r
886 void MainFrame::OnArcTest(wxCommandEvent&)
\r
889 wxArrayString asFiles = MakeTargetFileList(this, false);
\r
890 ProcessDialog procDlg;
\r
891 procDlg.fnArchive = & this->fnArchive;
\r
892 procDlg.nFileCount = asFiles.GetCount();
\r
893 procDlg.Show(true);
\r
895 TPI_SWITCHES swInfo;
\r
896 bool bIsCorrect = tpi.Command(TPI_COMMAND_TEST, & swInfo, this->fnArchive.GetFullPath(), asFiles);
\r
897 procDlg.Show(false);
\r
901 wxLogMessage(_("This is a correct archive."));
\r
905 this->ErrorCheck(tpi.nErrorCode);
\r
909 void MainFrame::OnArcRepair(wxCommandEvent&)
\r
912 wxArrayString asFiles = MakeTargetFileList(this, false);
\r
913 ProcessDialog procDlg;
\r
914 procDlg.fnArchive = & this->fnArchive;
\r
915 procDlg.nFileCount = asFiles.GetCount();
\r
916 procDlg.Show(true);
\r
918 TPI_SWITCHES swInfo;
\r
919 tpi.Command(TPI_COMMAND_REPAIR, & swInfo, this->fnArchive.GetFullPath(), asFiles);
\r
920 this->ErrorCheck(tpi.nErrorCode);
\r
921 procDlg.Show(false);
\r
924 void MainFrame::OnExeCopy(wxCommandEvent & e)
\r
926 if (this->list_ctrl->GetSelectedItemCount() == 0)
\r
928 // wxのバグで自動では無効化できないので、実行しようとしたときに無効化する。
\r
929 this->menubar->Enable(XRCID("Exe_Copy"), false);
\r
933 if (! wxTheClipboard->Open())
\r
939 this->OnArcExtract(e);
\r
940 wxTheClipboard->Close();
\r
943 void MainFrame::OnViewMode(wxCommandEvent & e)
\r
946 this->menubar->Check(n, true);
\r
947 this->list_ctrl->SetSingleStyle(wxLC_REPORT, n == XRCID("Exe_View_Details"));
\r
948 this->list_ctrl->SetSingleStyle(wxLC_ICON, n == XRCID("Exe_View_Icons"));
\r
949 this->list_ctrl->SetSingleStyle(wxLC_LIST, n == XRCID("Exe_View_List"));
\r
952 void MainFrame::OnShowToolBar(wxCommandEvent & e)
\r
954 this->toolbar->Show(e.IsChecked());
\r
957 void MainFrame::OnShowStatusBar(wxCommandEvent & e)
\r
959 this->statusbar->Show(e.IsChecked());
\r
962 void MainFrame::OnSelectAll(wxCommandEvent &)
\r
964 for (int i = 0; i < this->list_ctrl->GetItemCount(); i++)
\r
966 this->list_ctrl->Select(i, true);
\r
972 void MainFrame::OnTreeChanged(wxTreeEvent& e)
\r
975 wxString szNodePath = TreeView_GetItemPath(this->tree_ctrl, e.GetItem());
\r
977 this->list_ctrl->apShowFile.Clear();
\r
978 this->list_ctrl->DeleteAllItems();
\r
979 g_hIconLL.RemoveAll();
\r
980 g_hIconLS.RemoveAll();
\r
982 // 現在のアイテムの選択状態を無効にしておく。
\r
983 long nSelected = this->list_ctrl->GetFirstSelected();
\r
984 while (nSelected != -1)
\r
986 this->list_ctrl->Select(nSelected, false);
\r
987 nSelected = this->list_ctrl->GetNextSelected(nSelected);
\r
991 this->list_ctrl->SetImageList(& g_hIconLL, wxIMAGE_LIST_NORMAL);
\r
992 this->list_ctrl->SetImageList(& g_hIconLS, wxIMAGE_LIST_SMALL);
\r
994 // 配列と比較し、パスが一致しなければ消す。
\r
995 for (size_t i = 0; i < this->fileinfo.GetCount(); i++)
\r
998 if (szNodePath == wxT("*") || szNodePath == this->fileinfo[i].fnFileName.GetPath())
\r
1000 // 項目がフォルダであるなら無視。
\r
1001 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))
\r
1006 // フィルタにかからなければ無視。
\r
1007 if (this->fileinfo[i].fnFileName.GetFullName().MakeLower().Find(this->tcFilter->GetValue().MakeLower()) == wxNOT_FOUND)
\r
1012 this->list_ctrl->apShowFile.Add(& this->fileinfo[i]);
\r
1017 this->list_ctrl->apShowFile.Sort(& ListCtrlCompareProc);
\r
1018 this->list_ctrl->SetItemCount(this->list_ctrl->apShowFile.GetCount());
\r
1021 void MainFrame::OnTreeBeginDrag(wxTreeEvent& e)
\r
1023 // TODO : アイテムが子階層を持っていても展開できない。
\r
1024 this->tree_ctrl->SelectItem(e.GetItem());
\r
1026 wxCommandEvent e1;
\r
1028 this->OnArcExtract(e1);
\r
1031 void MainFrame::OnContextMenu(wxContextMenuEvent& e)
\r
1033 wxPoint p = e.GetPosition();
\r
1034 this->list_ctrl->PopupMenu(this->menubar->GetMenu(1), p == wxDefaultPosition ? this->list_ctrl->GetPosition() : this->list_ctrl->ScreenToClient(p));
\r
1039 void MainFrame::OnListItemSelect(wxListEvent&)
\r
1041 // ファイルに対する動作の設定。但し、選択解除時はwxのバグで呼び出されない。
\r
1042 bool fEnable = this->list_ctrl->GetSelectedItemCount() > 0;
\r
1043 SetMenuToolState("Arc_Delete", fEnable && (this->aiArchive.fiInfo.eSupportedCommand & TPI_COMMAND_DELETE) == TPI_COMMAND_DELETE && this->aiArchive.fiInfo.fArchive);
\r
1044 this->menubar->Enable(XRCID("Exe_Copy"), fEnable);
\r
1047 void MainFrame::OnListItemDClick(wxListEvent&)
\r
1051 this->OnArcExtract(e);
\r
1054 void MainFrame::OnListBeginDrag(wxListEvent&)
\r
1056 if (this->list_ctrl->GetSelectedItemCount() == 0)
\r
1058 // アイテムを選択せずドラッグしようとした場合。
\r
1064 this->OnArcExtract(e);
\r
1069 void MainFrame::OnFilter(wxCommandEvent&)
\r
1072 e.SetItem(this->tree_ctrl->GetSelection());
\r
1073 this->OnTreeChanged(e);
\r
1078 bool MainFrame::LoadTPI(const wxString & szFileName, wxULongLong_t * llFileCount)
\r
1080 // 書庫を開いていれば閉じておく。
\r
1082 this->OnArcClose(e);
\r
1085 wxDir fs(L_DIR_B_LIB);
\r
1086 wxString szTPIName;
\r
1087 if (fs.GetFirst(& szTPIName, wxT("*" TPI_EXT)))
\r
1092 if (! tpi.InitLibrary(L_DIR_B_LIB + szTPIName, szFileName))
\r
1094 tpi.FreeLibrary();
\r
1099 tpi.SetCallbackProc(TPICallbackProc);
\r
1102 if (! tpi.OpenArchive(szFileName, llFileCount))
\r
1104 tpi.FreeLibrary();
\r
1105 * llFileCount = 0;
\r
1110 while (fs.GetNext(& szTPIName));
\r
1115 int MainFrame::ErrorCheck(int nErrorCode, const wxString & szAPIName)
\r
1117 switch (nErrorCode)
\r
1119 case TPI_ERROR_SUCCESS:
\r
1120 case TPI_ERROR_S_ENDOFDATA:
\r
1121 case TPI_CALLBACK_CONTINUE:
\r
1123 case TPI_ERROR_D_UNSUPPORTED:
\r
1124 wxLogError(_("Sorry, this function is not supported yet."));
\r
1126 case TPI_ERROR_D_SKIPPED:
\r
1127 case TPI_CALLBACK_CANCEL:
\r
1128 wxLogError(_("This operation is canceled by the user."));
\r
1131 wxLogError(_("Error: %s()!\nError code: %d"), szAPIName.c_str(), nErrorCode);
\r
1133 return nErrorCode;
\r