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 ::wxXmlResource::Get()->Load(L_DIR_S_XRC wxT("dlg_make.xrc"));
\r
215 ::wxXmlResource::Get()->LoadDialog(& mkDlg, this, wxT("dlg_make"));
\r
217 if (e.GetClientData() == NULL)
\r
220 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
221 if (fd.ShowModal() == wxID_CANCEL)
\r
225 swInfo.fnDestinationDirectory = wxFileName::DirName(fd.GetDirectory());
\r
226 this->conf.WriteHistory(CONF_HISTORY_PATH, fd.GetDirectory());
\r
227 fd.GetFilenames(mkDlg.files);
\r
231 mkDlg.files = * (wxArrayString *) e.GetClientData();
\r
232 swInfo.fnDestinationDirectory = wxFileName::DirName(wxFileName(mkDlg.files[0]).GetPath());
\r
234 for (size_t n = 0; n < mkDlg.files.GetCount(); n++)
\r
236 wxFileName fn(mkDlg.files[n]);
\r
237 fn.MakeRelativeTo(swInfo.fnDestinationDirectory.GetPath());
\r
238 mkDlg.files[n] = fn.GetFullPath();
\r
242 this->OnArcClose(e);
\r
243 // 書庫名はファイル名の拡張子より前、もしくはディレクトリ名。
\r
244 this->fnArchive = wxFileName(mkDlg.files[0]);
\r
245 this->fnArchive.SetName(mkDlg.files.GetCount() == 1 ? (this->fnArchive.GetName().IsEmpty() ? this->fnArchive.GetDirs().Last() : this->fnArchive.GetName()) : swInfo.fnDestinationDirectory.GetDirs().Last());
\r
246 this->fnArchive.SetEmptyExt();
\r
247 this->fnArchive.SetPath(swInfo.fnDestinationDirectory.GetPath());
\r
250 if (mkDlg.ShowModal() == wxID_CANCEL)
\r
256 swInfo.fStoreDirectoryPathes= ! mkDlg.cbIgnorePath->IsChecked();
\r
257 swInfo.fMakeSFX = mkDlg.cbMakeSFX->IsChecked();
\r
258 swInfo.fSolid = mkDlg.cbSolid->IsChecked();
\r
259 swInfo.fMMOptimize = mkDlg.cbMMOptimize->IsChecked();
\r
260 swInfo.fEncryptHeader = mkDlg.cbEncryptHeader->IsChecked();
\r
261 swInfo.fCompressHeader = mkDlg.cbCompressHeader->IsChecked();
\r
262 swInfo.nCompressLevel = mkDlg.scLevel->GetValue();
\r
263 swInfo.nRecoveryRecord = mkDlg.scRR->GetValue();
\r
264 swInfo.szPassword = mkDlg.tcPassword->GetValue();
\r
265 swInfo.szKeyFile = mkDlg.tcKeyfile->GetValue();
\r
266 swInfo.szComment = mkDlg.tcComment->GetValue();
\r
267 mkDlg.cbSplitSize->GetValue().ToULongLong(& swInfo.nSplitSize);
\r
270 int nSelected = mkDlg.chType->GetSelection();
\r
271 this->fnArchive = wxFileName(mkDlg.cbDir->GetValue(), mkDlg.cbFileName->GetValue());
\r
272 if (! tpi.InitLibrary(mkDlg.afInfo[nSelected].szTPIName, this->fnArchive.GetFullPath(), mkDlg.afInfo[nSelected].nTypeId))
\r
274 this->ErrorCheck(tpi.nErrorCode, wxT("InitLibrary"));
\r
279 tpi.SetCallbackProc(TPICallbackProc);
\r
280 this->ErrorCheck(tpi.nErrorCode, wxT("SetCallbackProc"));
\r
284 ProcessDialog procDlg;
\r
285 procDlg.fnArchive = & this->fnArchive;
\r
286 procDlg.nFileCount = mkDlg.files.GetCount();
\r
287 procDlg.Show(true);
\r
289 tpi.Command(TPI_COMMAND_CREATE, & swInfo, this->fnArchive.GetFullPath(), mkDlg.files);
\r
290 this->ErrorCheck(tpi.nErrorCode);
\r
291 procDlg.Show(false);
\r
295 if (mkDlg.cbOpenAfter->IsChecked())
\r
298 ::wxExecute(DIR_APP + QuoteString(swInfo.fnDestinationDirectory.GetFullPath()));
\r
301 if (mkDlg.cbExitAfter->IsChecked())
\r
308 this->OnArcOpen(e);
\r
311 void MainFrame::OnArcOpen(wxCommandEvent& e)
\r
313 // モード取得。通常は0, それ以外で開く場合は1, ファイルDnDなら2。
\r
314 int nMode = e.GetInt() == 2 ? 2 : e.GetId() == XRCID("Arc_Open") ? 0 : 1;
\r
319 wxFileDialog fd(this, _("Choose an archive"), this->conf.ReadHistory(CONF_HISTORY_PATH, 0), wxEmptyString, wxFileSelectorDefaultWildcardStr, wxFD_OPEN | wxFD_FILE_MUST_EXIST);
\r
320 if (fd.ShowModal() == wxID_CANCEL)
\r
324 this->conf.WriteHistory(CONF_HISTORY_PATH, fd.GetDirectory());
\r
325 this->fnArchive = wxFileName(fd.GetPath());
\r
329 ProcessDialog procDlg;
\r
330 procDlg.fnArchive = & this->fnArchive;
\r
332 // DnD以外で書庫を開く場合、TPIを読み込み。
\r
333 TPI_PROCESSINFO piInfo;
\r
334 if (! this->LoadTPI(this->fnArchive.GetFullPath(), & piInfo.fiInfo.nUnpackedSize))
\r
340 this->OnArcCreate(e);
\r
342 else if (this->IsShown())
\r
345 this->statusbar->SetStatusText(_("No plug-in supporting this archive was found!"), 4);
\r
349 wxLogError(_("No plug-in supporting this archive was found!"));
\r
355 procDlg.nFileCount = piInfo.fiInfo.nUnpackedSize;
\r
356 procDlg.Show(true);
\r
359 this->fileinfo.Alloc(piInfo.fiInfo.nUnpackedSize);
\r
362 this->conf.WriteHistory(CONF_HISTORY_PATH, this->fnArchive.GetPath());
\r
363 this->conf.WriteHistory(CONF_HISTORY_NAME, this->fnArchive.GetFullName());
\r
364 this->conf.WriteHistory(CONF_HISTORY_FULL, this->fnArchive.GetFullPath());
\r
366 // 書庫のアイコンを取得し、書庫ルートを作成。
\r
367 g_hIconT.Add(wxBitmap(L_DIR_S_ICO wxT("folder_closed.png"), wxBITMAP_TYPE_ANY));
\r
368 g_hIconT.Add(wxBitmap(L_DIR_S_ICO wxT("folder_open.png"), wxBITMAP_TYPE_ANY));
\r
369 this->tree_ctrl->SetImageList(& g_hIconT);
\r
371 idRoot = this->tree_ctrl->AddRoot(wxEmptyString),
\r
373 idArchive = this->tree_ctrl->AppendItem(idRoot, this->fnArchive.GetFullName(), g_hIconT.Add(GetFileTypeIcon(piInfo.fiInfo.fnFileName))),
\r
375 idArchive = this->tree_ctrl->AppendItem(idRoot, this->fnArchive.GetFullName(), g_hIconT.Add(GetFileTypeIcon(piInfo.fiInfo.fnFileName).ConvertToImage().Rescale(16, 16))),
\r
377 idArcRoot = this->tree_ctrl->AppendItem(idRoot, wxT("-----"), 0, 1);
\r
380 if (tpi.GetFileInformation(& piInfo.fiInfo, true))
\r
382 piInfo.eMessage = TPI_MESSAGE_STATUS;
\r
383 piInfo.eStatus = 0x1001;
\r
384 piInfo.nProcessedSize = 0;
\r
387 piInfo.nProcessedSize++;
\r
388 if (this->ErrorCheck(procDlg.CallbackProc(TPI_NOTIFY_COMMON, & piInfo), wxT("Callback")) == TPI_CALLBACK_CANCEL)
\r
390 procDlg.Show(false);
\r
391 tpi.CloseArchive();
\r
393 this->OnArcClose(e);
\r
398 if (piInfo.fiInfo.szStoredName.IsEmpty())
\r
400 piInfo.fiInfo.szStoredName = this->fnArchive.GetName();
\r
401 if (piInfo.fiInfo.fnFileName.HasExt())
\r
403 piInfo.fiInfo.szStoredName += wxT('.') + piInfo.fiInfo.fnFileName.GetExt();
\r
405 piInfo.fiInfo.fnFileName = wxFileName(piInfo.fiInfo.szStoredName);
\r
410 wxString szPath = piInfo.fiInfo.fnFileName.GetPathWithSep(wxPATH_UNIX);
\r
411 if (szPath.StartsWith(wxT("/")) || szPath.StartsWith(wxT("./")))
\r
413 piInfo.fiInfo.fnFileName = wxFileName(szPath.AfterFirst(wxT('/')), piInfo.fiInfo.fnFileName.GetFullName(), wxPATH_DOS);
\r
416 if (piInfo.fiInfo.fnFileName.GetFullPath().IsEmpty() || piInfo.fiInfo.fnFileName.GetFullPath() == wxT("."))
\r
422 if (piInfo.fiInfo.szStoredName.Find(wxT('\r')) != wxNOT_FOUND
\r
423 || piInfo.fiInfo.szStoredName.Find(wxT('\n')) != wxNOT_FOUND
\r
424 || piInfo.fiInfo.szStoredName.Find(wxT('\t')) != wxNOT_FOUND)
\r
426 wxString sz = piInfo.fiInfo.fnFileName.GetFullPath();
\r
427 sz.Replace(wxT("\r"), wxT(" "));
\r
428 sz.Replace(wxT("\n"), wxT(" "));
\r
429 sz.Replace(wxT("\t"), wxT(" "));
\r
430 piInfo.fiInfo.eDanger = TRUE;
\r
431 piInfo.fiInfo.fnFileName = wxFileName(sz);
\r
432 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
436 if (piInfo.fiInfo.fnFileName.GetPathWithSep(wxPATH_UNIX).Find(wxT("../")) != wxNOT_FOUND)
\r
438 piInfo.fiInfo.eDanger = TRUE;
\r
439 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
441 // 空白の連続による拡張子偽装を検査。
\r
442 if (piInfo.fiInfo.fnFileName.GetFullName().Find(wxT(" ")) != wxNOT_FOUND)
\r
444 piInfo.fiInfo.eDanger = TRUE;
\r
445 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
448 for (wxChar c = 0x200c; c <= 0x206f; c++)
\r
450 if (piInfo.fiInfo.fnFileName.GetFullName().Find(c) != wxNOT_FOUND)
\r
452 piInfo.fiInfo.eDanger = TRUE;
\r
453 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
457 case 0x200f: c = 0x2027; break;
\r
458 case 0x202e: c = 0x2060; break;
\r
463 bool fDir = piInfo.fiInfo.dwAttribute & TPI_ATTRIBUTE_DIRECTORY ? true : false;
\r
464 TreeView_CheckNewerItem(this->tree_ctrl, idArcRoot, fDir ? piInfo.fiInfo.fnFileName.GetFullPath() : piInfo.fiInfo.fnFileName.GetPath(), true);
\r
466 // ディレクトリ属性を含むものについては情報を保存しない。
\r
473 this->fileinfo.Add(piInfo.fiInfo);
\r
475 while (tpi.GetFileInformation(& piInfo.fiInfo));
\r
478 // GetFileInformationがエラー終了した場合。
\r
479 this->ErrorCheck(tpi.nErrorCode, wxT("GetFileInformation"));
\r
482 tpi.GetArchiveInformation(& this->aiArchive);
\r
483 this->ErrorCheck(tpi.nErrorCode, wxT("GetArchiveInformation"));
\r
486 tpi.CloseArchive();
\r
487 this->ErrorCheck(tpi.nErrorCode, wxT("CloseArchive"));
\r
490 this->fileinfo.Shrink();
\r
491 this->tree_ctrl->ExpandAll();
\r
492 this->tree_ctrl->ScrollTo(idArchive);
\r
493 this->tree_ctrl->SelectItem(idArchive);
\r
494 this->tree_ctrl->SetScrollPos(wxHORIZONTAL, 0);
\r
495 this->list_ctrl->atDangerItem.SetTextColour(* wxRED);
\r
496 this->list_ctrl->atEncryptedItem.SetTextColour(wxColour(wxT("forest green")));
\r
499 this->statusbar->SetStatusText(this->aiArchive.fiInfo.szTypeName, 0);
\r
500 this->statusbar->SetStatusText(wxString::Format(_("%u file(s)"), this->fileinfo.GetCount()), 1);
\r
501 this->statusbar->SetStatusText(wxString::Format(wxString("%" wxLongLongFmtSpec "uB -> %" wxLongLongFmtSpec "uB"), this->aiArchive.nUnpackedSize, this->aiArchive.nPackedSize), 2);
\r
502 this->statusbar->SetStatusText(wxString::Format(wxT("%3.1f%%"), this->aiArchive.wCompressRatio / 10.0), 3);
\r
503 this->statusbar->SetStatusText(this->fnArchive.GetFullPath(), 4);
\r
505 // ツールバー・メニューバー設定。ファイル選択時しか動作しない削除などは別に設定。
\r
506 SetMenuToolState("Arc_Close", true);
\r
507 SetMenuToolState("Arc_Add", (this->aiArchive.fiInfo.eSupportedCommand & TPI_COMMAND_ADD) == TPI_COMMAND_ADD && this->aiArchive.fiInfo.fArchive);
\r
508 SetMenuToolState("Arc_SFX", (this->aiArchive.fiInfo.eSupportedCommand & TPI_COMMAND_SFX) == TPI_COMMAND_SFX && ! this->aiArchive.fSFX);
\r
509 SetMenuToolState("Arc_UnSFX", (this->aiArchive.fiInfo.eSupportedCommand & TPI_COMMAND_UNSFX) == TPI_COMMAND_UNSFX && this->aiArchive.fSFX);
\r
510 SetMenuToolState("Arc_Extract", (this->aiArchive.fiInfo.eSupportedCommand & TPI_COMMAND_EXTRACT)== TPI_COMMAND_EXTRACT);
\r
511 SetMenuToolState("Arc_Test", (this->aiArchive.fiInfo.eSupportedCommand & TPI_COMMAND_TEST) == TPI_COMMAND_TEST);
\r
512 SetMenuToolState("Arc_Repair", (this->aiArchive.fiInfo.eSupportedCommand & TPI_COMMAND_REPAIR) == TPI_COMMAND_REPAIR);
\r
513 this->menubar->Enable(XRCID("Arc_Clone"), true);
\r
515 procDlg.Show(false);
\r
519 void MainFrame::OnArcClose(wxCommandEvent& e)
\r
521 // ツリービュー・リストビュー設定。
\r
522 this->tree_ctrl->DeleteAllItems();
\r
523 this->list_ctrl->DeleteAllItems();
\r
524 this->list_ctrl->apShowFile.Clear();
\r
527 SetMenuToolState("Arc_Close", false);
\r
528 SetMenuToolState("Arc_Add", false);
\r
529 SetMenuToolState("Arc_SFX", false);
\r
530 SetMenuToolState("Arc_UnSFX", false);
\r
531 SetMenuToolState("Arc_Extract", false);
\r
532 SetMenuToolState("Arc_Delete", false);
\r
533 SetMenuToolState("Arc_Test", false);
\r
534 SetMenuToolState("Arc_Repair", false);
\r
535 this->menubar->Enable(XRCID("Arc_Clone"), false);
\r
537 for (int i = 0; i < this->statusbar->GetFieldsCount(); i++)
\r
539 this->statusbar->SetStatusText(wxEmptyString, i);
\r
541 this->fileinfo.Clear();
\r
542 this->aiArchive.szComment.Empty();
\r
543 this->aiArchive.fnArchive.Clear();
\r
544 this->aiArchive.fiInfo.szTypeName.Empty();
\r
545 this->aiArchive.fiInfo.szSuffix.Empty();
\r
546 this->aiArchive.fiInfo.szEngineName.Empty();
\r
547 this->aiArchive.fiInfo.szTPIName.Empty();
\r
549 g_hIconT.RemoveAll();
\r
550 g_hIconLL.RemoveAll();
\r
551 g_hIconLS.RemoveAll();
\r
553 // DnDで書庫を開くときは既に読み込まれているTPIを用いるので、解放してはいけない。
\r
554 if (e.GetExtraLong() == 0)
\r
560 void MainFrame::OnArcClone(wxCommandEvent&)
\r
563 wxFileDialog fd(this, _("Clone archive"), this->fnArchive.GetPath(), this->fnArchive.GetFullName(), wxFileSelectorDefaultWildcardStr, wxFD_SAVE | wxFD_OVERWRITE_PROMPT);
\r
564 if (fd.ShowModal() == wxID_CANCEL)
\r
568 this->conf.WriteHistory(CONF_HISTORY_PATH, fd.GetDirectory());
\r
571 ::wxCopyFile(this->fnArchive.GetFullPath(), fd.GetPath());
\r
572 wxFileName fn(fd.GetPath());
\r
573 wxDateTime dtAccess, dtModify, dtCreate;
\r
574 this->fnArchive.GetTimes(& dtAccess, & dtModify, & dtCreate);
\r
575 fn.SetTimes(& dtAccess, & dtModify, & dtCreate);
\r
578 void MainFrame::OnArcAdd(wxCommandEvent& e)
\r
582 ::wxXmlResource::Get()->Load(L_DIR_S_XRC wxT("dlg_make.xrc"));
\r
583 ::wxXmlResource::Get()->LoadDialog(& mkDlg, this, wxT("dlg_make"));
\r
584 mkDlg.uCommand = TPI_COMMAND_ADD;
\r
587 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
588 if (fd.ShowModal() == wxID_CANCEL)
\r
592 fd.GetFilenames(mkDlg.files);
\r
593 this->conf.WriteHistory(CONF_HISTORY_PATH, fd.GetDirectory());
\r
596 if (mkDlg.ShowModal() == wxID_CANCEL)
\r
602 TPI_SWITCHES swInfo;
\r
603 swInfo.pCustomSwitches = NULL;
\r
604 swInfo.fMakeSFX = false;
\r
605 swInfo.fnDestinationDirectory= wxFileName::DirName(fd.GetDirectory());
\r
606 swInfo.fStoreDirectoryPathes = ! mkDlg.cbIgnorePath->IsChecked();
\r
607 swInfo.fSolid = mkDlg.cbSolid->IsChecked();
\r
608 swInfo.fMMOptimize = mkDlg.cbMMOptimize->IsChecked();
\r
609 swInfo.fEncryptHeader = mkDlg.cbEncryptHeader->IsChecked();
\r
610 swInfo.nCompressLevel = mkDlg.scLevel->GetValue();
\r
611 swInfo.nRecoveryRecord = mkDlg.scRR->GetValue();
\r
612 swInfo.szPassword = mkDlg.tcPassword->GetValue();
\r
613 swInfo.szKeyFile = mkDlg.tcKeyfile->GetValue();
\r
614 swInfo.szComment = mkDlg.tcComment->GetValue();
\r
618 ProcessDialog procDlg;
\r
619 procDlg.fnArchive = & this->fnArchive;
\r
620 procDlg.nFileCount = mkDlg.files.GetCount();
\r
621 procDlg.Show(true);
\r
623 tpi.Command(TPI_COMMAND_ADD, & swInfo, this->fnArchive.GetFullPath(), mkDlg.files);
\r
624 this->ErrorCheck(tpi.nErrorCode);
\r
625 procDlg.Show(false);
\r
628 if (mkDlg.cbOpenAfter->IsChecked())
\r
631 ::wxExecute(DIR_APP + QuoteString(swInfo.fnDestinationDirectory.GetFullPath()));
\r
634 if (mkDlg.cbExitAfter->IsChecked())
\r
640 // 終了しない場合は書庫を再読み込み。
\r
641 this->OnArcOpen(e);
\r
644 void MainFrame::OnArcConvert(wxCommandEvent& e)
\r
646 TPI_SWITCHES swInfo;
\r
647 swInfo.fMakeSFX = e.GetId() == XRCID("Arc_SFX");
\r
650 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
651 if (fd.ShowModal() == wxID_CANCEL)
\r
655 swInfo.fnDestinationDirectory = wxFileName::DirName(fd.GetDirectory());
\r
656 this->conf.WriteHistory(CONF_HISTORY_PATH, fd.GetDirectory());
\r
658 wxArrayString files;
\r
659 files.Add(fd.GetPath());
\r
661 ProcessDialog procDlg;
\r
662 procDlg.Show(true);
\r
663 tpi.Command(swInfo.fMakeSFX ? TPI_COMMAND_SFX : TPI_COMMAND_UNSFX, & swInfo, this->fnArchive.GetFullPath(), files);
\r
664 this->ErrorCheck(tpi.nErrorCode);
\r
665 procDlg.Show(false);
\r
668 void MainFrame::OnArcExtract(wxCommandEvent& e)
\r
670 TPI_SWITCHES swInfo;
\r
671 swInfo.pCustomSwitches = NULL;
\r
673 // モード取得。通常は0, 実行なら1, ファイルDnDなら2、ディレクトリDnDなら3、クリップボードなら4、コンテキストメニューからなら8。
\r
674 int nMode = e.GetInt();
\r
675 if (e.GetInt() == 8)
\r
680 wxFileType * ftFile = NULL;
\r
682 // 展開ダイアログを作成。DnDまたは実行時は表示しない。
\r
684 ::wxXmlResource::Get()->Load(L_DIR_S_XRC wxT("dlg_make.xrc"));
\r
685 ::wxXmlResource::Get()->LoadDialog(& mkDlg, this, wxT("dlg_make"));
\r
686 mkDlg.uCommand = TPI_COMMAND_EXTRACT;
\r
687 mkDlg.files = MakeTargetFileList(this, nMode == 1);
\r
692 swInfo.fStoreDirectoryPathes = false;
\r
693 wxString szDestDirBase = nMode == 3 ? this->tree_ctrl->GetItemText(this->tree_ctrl->GetSelection()) : wxT("tpi_tmp");
\r
695 if (szDestDirBase == wxT("-----"))
\r
697 // 書庫ルートのときは書庫名にしておく。
\r
698 szDestDirBase = this->fnArchive.GetName();
\r
700 swInfo.fnDestinationDirectory = MakeDirPath(wxFileName::DirName(p.GetTempDir()), szDestDirBase, true);
\r
701 if (! swInfo.fnDestinationDirectory.IsOk())
\r
703 wxLogError(_("Unable to make the temporary directory!"));
\r
709 if (mkDlg.ShowModal() == wxID_CANCEL)
\r
715 swInfo.fStoreDirectoryPathes = ! mkDlg.cbIgnorePath->IsChecked();
\r
716 swInfo.fnDestinationDirectory = wxFileName::DirName(mkDlg.cbDir->GetValue());
\r
717 swInfo.szPassword = mkDlg.tcPassword->GetValue();
\r
718 swInfo.szKeyFile = mkDlg.tcKeyfile->GetValue();
\r
720 // 必要なら書庫名でディレクトリを作成する。
\r
721 if (WillMakeDirByArcName(this, & mkDlg))
\r
723 swInfo.fnDestinationDirectory = MakeDirPath(swInfo.fnDestinationDirectory, this->fnArchive.GetName(), true);
\r
724 if (! swInfo.fnDestinationDirectory.IsOk())
\r
726 wxLogError(_("Unable to make the destination directory!"));
\r
734 ProcessDialog procDlg;
\r
735 procDlg.fnArchive = & this->fnArchive;
\r
736 procDlg.nFileCount = mkDlg.files.GetCount();
\r
737 procDlg.Show(true);
\r
739 tpi.Command(TPI_COMMAND_EXTRACT, & swInfo, this->fnArchive.GetFullPath(), mkDlg.files);
\r
740 this->ErrorCheck(tpi.nErrorCode);
\r
741 procDlg.Show(false);
\r
746 if (mkDlg.cbOpenAfter->IsChecked())
\r
749 ::wxExecute(DIR_APP + QuoteString(swInfo.fnDestinationDirectory.GetFullPath()));
\r
752 if (mkDlg.cbExitAfter->IsChecked())
\r
763 ftFile = wxTheMimeTypesManager->GetFileTypeFromExtension(wxFileName(mkDlg.files[0], wxPATH_DOS).GetExt());
\r
764 if (! ftFile || ftFile->GetOpenCommand(wxEmptyString).IsEmpty())
\r
766 // 種類が取得できないときはテキストとみなす。
\r
767 ftFile = wxTheMimeTypesManager->GetFileTypeFromExtension(this->conf.ReadId(CONF_DEFAULT_EXT, (wxString) wxT("txt")));
\r
771 wxString szTempFile = swInfo.fnDestinationDirectory.GetPathWithSep() + wxFileName(mkDlg.files[0], wxPATH_DOS).GetFullName();
\r
772 bool fSuccess = tpi.nErrorCode == TPI_ERROR_SUCCESS && ftFile != NULL;
\r
773 myProcess * pCallback = new myProcess(szTempFile, swInfo.fnDestinationDirectory.GetPath());
\r
777 // Linuxでは引用符で囲む必要がある。
\r
778 fSuccess = ::wxExecute(ftFile->GetOpenCommand(QuoteString(szTempFile)), wxEXEC_ASYNC, pCallback) > 0;
\r
780 fSuccess = ::wxExecute(ftFile->GetOpenCommand(szTempFile), wxEXEC_ASYNC, pCallback) > 0;
\r
785 pCallback->OnTerminate(0, 0);
\r
791 wxArrayString asFiles;
\r
792 myFileDataObject * objFile = new myFileDataObject();
\r
793 objFile->szTempDir = nMode == 3 ? swInfo.fnDestinationDirectory.GetPath() : swInfo.fnDestinationDirectory.GetFullPath();
\r
794 for (size_t i = 0; i < mkDlg.files.GetCount(); i++)
\r
796 wxString szFileName = swInfo.fnDestinationDirectory.GetPathWithSep() + wxFileName(mkDlg.files[i], wxPATH_DOS).GetFullName();
\r
799 asFiles.Add(szFileName);
\r
804 objFile->AddFile(szFileName);
\r
809 objFile->AddFile(objFile->szTempDir);
\r
814 wxTheClipboard->SetData(objFile);
\r
818 // 自身にドロップされると煩雑なので、一時的にドロップを受け付けないようにしておく。
\r
819 this->SetDropTarget(NULL);
\r
822 wxDropSource dropSource(* objFile, this);
\r
823 wxDragResult drResult = dropSource.DoDragDrop();
\r
824 if (drResult != wxDragCancel && drResult != wxDragNone && drResult != wxDragMove)
\r
827 // Linuxではまだ処理が終わっていない(コンテキストメニューが表示されている)ので、とりあえず3秒だけ待つ。
\r
831 this->SetDropTarget(new myFileDropTarget(this));
\r
833 // ディレクトリDnDのときは、先にディレクトリの中のファイルを消しておく。
\r
836 for (size_t i = 0; i < asFiles.GetCount(); i++)
\r
838 chmod(asFiles[i].ToUTF8(), 0600);
\r
839 ::wxRemoveFile(asFiles[i]);
\r
849 void MainFrame::OnArcDelete(wxCommandEvent& e)
\r
851 // 全ファイル削除は危険ではないかと。
\r
852 if (this->list_ctrl->GetSelectedItemCount() == 0)
\r
854 // wxのバグで自動では無効化できないので、実行しようとしたときに無効化する。
\r
855 SetMenuToolState("Arc_Delete", false);
\r
859 if (::AskDlg(_("Are you sure to delete selected files?"), this) == wxNO)
\r
866 wxArrayString asFiles = MakeTargetFileList(this, false);
\r
867 ProcessDialog procDlg;
\r
868 procDlg.fnArchive = & this->fnArchive;
\r
869 procDlg.nFileCount = asFiles.GetCount();
\r
870 procDlg.Show(true);
\r
872 TPI_SWITCHES swInfo;
\r
873 tpi.Command(TPI_COMMAND_DELETE, & swInfo, this->fnArchive.GetFullPath(), asFiles);
\r
874 this->ErrorCheck(tpi.nErrorCode);
\r
875 procDlg.Show(false);
\r
879 this->OnArcOpen(e);
\r
882 void MainFrame::OnArcTest(wxCommandEvent&)
\r
885 wxArrayString asFiles = MakeTargetFileList(this, false);
\r
886 ProcessDialog procDlg;
\r
887 procDlg.fnArchive = & this->fnArchive;
\r
888 procDlg.nFileCount = asFiles.GetCount();
\r
889 procDlg.Show(true);
\r
891 TPI_SWITCHES swInfo;
\r
892 bool bIsCorrect = tpi.Command(TPI_COMMAND_TEST, & swInfo, this->fnArchive.GetFullPath(), asFiles);
\r
893 procDlg.Show(false);
\r
897 wxLogMessage(_("This is a correct archive."));
\r
901 this->ErrorCheck(tpi.nErrorCode);
\r
905 void MainFrame::OnArcRepair(wxCommandEvent&)
\r
908 wxArrayString asFiles = MakeTargetFileList(this, false);
\r
909 ProcessDialog procDlg;
\r
910 procDlg.fnArchive = & this->fnArchive;
\r
911 procDlg.nFileCount = asFiles.GetCount();
\r
912 procDlg.Show(true);
\r
914 TPI_SWITCHES swInfo;
\r
915 tpi.Command(TPI_COMMAND_REPAIR, & swInfo, this->fnArchive.GetFullPath(), asFiles);
\r
916 this->ErrorCheck(tpi.nErrorCode);
\r
917 procDlg.Show(false);
\r
920 void MainFrame::OnExeCopy(wxCommandEvent & e)
\r
922 if (this->list_ctrl->GetSelectedItemCount() == 0)
\r
924 // wxのバグで自動では無効化できないので、実行しようとしたときに無効化する。
\r
925 this->menubar->Enable(XRCID("Exe_Copy"), false);
\r
929 if (! wxTheClipboard->Open())
\r
935 this->OnArcExtract(e);
\r
936 wxTheClipboard->Close();
\r
939 void MainFrame::OnViewMode(wxCommandEvent & e)
\r
942 this->menubar->Check(n, true);
\r
943 this->list_ctrl->SetSingleStyle(wxLC_REPORT, n == XRCID("Exe_View_Details"));
\r
944 this->list_ctrl->SetSingleStyle(wxLC_ICON, n == XRCID("Exe_View_Icons"));
\r
945 this->list_ctrl->SetSingleStyle(wxLC_LIST, n == XRCID("Exe_View_List"));
\r
948 void MainFrame::OnShowToolBar(wxCommandEvent & e)
\r
950 this->toolbar->Show(e.IsChecked());
\r
953 void MainFrame::OnShowStatusBar(wxCommandEvent & e)
\r
955 this->statusbar->Show(e.IsChecked());
\r
958 void MainFrame::OnSelectAll(wxCommandEvent &)
\r
960 for (int i = 0; i < this->list_ctrl->GetItemCount(); i++)
\r
962 this->list_ctrl->Select(i, true);
\r
968 void MainFrame::OnTreeChanged(wxTreeEvent& e)
\r
971 wxString szNodePath = TreeView_GetItemPath(this->tree_ctrl, e.GetItem());
\r
973 this->list_ctrl->apShowFile.Clear();
\r
974 this->list_ctrl->DeleteAllItems();
\r
975 g_hIconLL.RemoveAll();
\r
976 g_hIconLS.RemoveAll();
\r
978 // 現在のアイテムの選択状態を無効にしておく。
\r
979 long nSelected = this->list_ctrl->GetFirstSelected();
\r
980 while (nSelected != -1)
\r
982 this->list_ctrl->Select(nSelected, false);
\r
983 nSelected = this->list_ctrl->GetNextSelected(nSelected);
\r
987 this->list_ctrl->SetImageList(& g_hIconLL, wxIMAGE_LIST_NORMAL);
\r
988 this->list_ctrl->SetImageList(& g_hIconLS, wxIMAGE_LIST_SMALL);
\r
990 // 配列と比較し、パスが一致しなければ消す。
\r
991 for (size_t i = 0; i < this->fileinfo.GetCount(); i++)
\r
994 if (szNodePath == wxT("*") || szNodePath == this->fileinfo[i].fnFileName.GetPath())
\r
997 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
1002 // フィルタにかからなければ無視。
\r
1003 if (this->fileinfo[i].fnFileName.GetFullName().MakeLower().Find(this->tcFilter->GetValue().MakeLower()) == wxNOT_FOUND)
\r
1008 this->list_ctrl->apShowFile.Add(& this->fileinfo[i]);
\r
1013 this->list_ctrl->apShowFile.Sort(& ListCtrlCompareProc);
\r
1014 this->list_ctrl->SetItemCount(this->list_ctrl->apShowFile.GetCount());
\r
1017 void MainFrame::OnTreeBeginDrag(wxTreeEvent& e)
\r
1019 // TODO : アイテムが子階層を持っていても展開できない。
\r
1020 this->tree_ctrl->SelectItem(e.GetItem());
\r
1022 wxCommandEvent e1;
\r
1024 this->OnArcExtract(e1);
\r
1027 void MainFrame::OnContextMenu(wxContextMenuEvent& e)
\r
1029 wxPoint p = e.GetPosition();
\r
1030 this->list_ctrl->PopupMenu(this->menubar->GetMenu(1), p == wxDefaultPosition ? this->list_ctrl->GetPosition() : this->list_ctrl->ScreenToClient(p));
\r
1035 void MainFrame::OnListItemSelect(wxListEvent&)
\r
1037 // ファイルに対する動作の設定。但し、選択解除時はwxのバグで呼び出されない。
\r
1038 bool fEnable = this->list_ctrl->GetSelectedItemCount() > 0;
\r
1039 SetMenuToolState("Arc_Delete", fEnable && (this->aiArchive.fiInfo.eSupportedCommand & TPI_COMMAND_DELETE) == TPI_COMMAND_DELETE && this->aiArchive.fiInfo.fArchive);
\r
1040 this->menubar->Enable(XRCID("Exe_Copy"), fEnable);
\r
1043 void MainFrame::OnListItemDClick(wxListEvent&)
\r
1047 this->OnArcExtract(e);
\r
1050 void MainFrame::OnListBeginDrag(wxListEvent&)
\r
1052 if (this->list_ctrl->GetSelectedItemCount() == 0)
\r
1054 // アイテムを選択せずドラッグしようとした場合。
\r
1060 this->OnArcExtract(e);
\r
1065 void MainFrame::OnFilter(wxCommandEvent&)
\r
1068 e.SetItem(this->tree_ctrl->GetSelection());
\r
1069 this->OnTreeChanged(e);
\r
1074 bool MainFrame::LoadTPI(const wxString & szFileName, wxULongLong_t * llFileCount)
\r
1076 // 書庫を開いていれば閉じておく。
\r
1078 this->OnArcClose(e);
\r
1081 wxDir fs(L_DIR_B_LIB);
\r
1082 wxString szTPIName;
\r
1083 if (fs.GetFirst(& szTPIName, wxT("*" TPI_EXT)))
\r
1088 if (! tpi.InitLibrary(L_DIR_B_LIB + szTPIName, szFileName))
\r
1090 tpi.FreeLibrary();
\r
1095 tpi.SetCallbackProc(TPICallbackProc);
\r
1098 if (! tpi.OpenArchive(szFileName, llFileCount))
\r
1100 tpi.FreeLibrary();
\r
1101 * llFileCount = 0;
\r
1106 while (fs.GetNext(& szTPIName));
\r
1111 int MainFrame::ErrorCheck(int nErrorCode, const wxString & szAPIName)
\r
1113 switch (nErrorCode)
\r
1115 case TPI_ERROR_SUCCESS:
\r
1116 case TPI_ERROR_S_ENDOFDATA:
\r
1117 case TPI_CALLBACK_CONTINUE:
\r
1119 case TPI_ERROR_D_UNSUPPORTED:
\r
1120 wxLogError(_("Sorry, this function is not supported yet."));
\r
1122 case TPI_ERROR_D_SKIPPED:
\r
1123 case TPI_CALLBACK_CANCEL:
\r
1124 wxLogError(_("This operation is canceled by the user."));
\r
1127 wxLogError(_("Error: %s()!\nError code: %d"), szAPIName.c_str(), nErrorCode);
\r
1129 return nErrorCode;
\r