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
126 EVT_LIST_ITEM_SELECTED( XRCID("ListView"), MainFrame::OnListItemSelect)
\r
127 EVT_LIST_ITEM_DESELECTED(XRCID("ListView"), MainFrame::OnListItemSelect)
\r
128 EVT_LIST_ITEM_ACTIVATED( XRCID("ListView"), MainFrame::OnListItemDClick)
\r
129 EVT_LIST_BEGIN_DRAG( XRCID("ListView"), MainFrame::OnListBeginDrag)
\r
131 EVT_TEXT(XRCID("tcFilter"), MainFrame::OnFilter)
\r
134 //******************************************************************************
\r
136 //******************************************************************************
\r
138 void MainFrame::OnInit(wxInitDialogEvent&)
\r
141 this->menubar = this->GetMenuBar();
\r
142 this->toolbar = this->GetToolBar();
\r
143 this->statusbar = XRCCTRL(* this, "statusbar", wxStatusBar);
\r
144 this->tree_ctrl = XRCCTRL(* this, "TreeView", wxTreeCtrl);
\r
145 this->list_ctrl = XRCCTRL(* this, "ListView", myListCtrl);
\r
146 this->window_splitter = XRCCTRL(* this, "window_splitter", wxSplitterWindow);
\r
147 this->tcFilter = XRCCTRL(* this->toolbar, "tcFilter", wxTextCtrl);
\r
150 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
151 wxTheMimeTypesManager->Initialize(wxMAILCAP_ALL);
\r
156 icon.CopyFromBitmap(wxBitmap(L_DIR_S_ICO wxT("app.png"), wxBITMAP_TYPE_ANY));
\r
157 this->SetIcon(icon);
\r
160 this->OnArcClose(e);
\r
161 this->SetDropTarget(new myFileDropTarget(this));
\r
164 this->window_splitter->SetSashPosition(this->conf.ReadId(CONF_WINDOW_SPLITTER_POS, 200l));
\r
167 int nIconMode = this->conf.ReadId(CONF_LISTVIEW_SHOWMODE, 0l);
\r
168 e.SetId(nIconMode == 1 ? XRCID("Exe_View_Icons") : (nIconMode == 2 ? XRCID("Exe_View_List") : XRCID("Exe_View_Details")));
\r
169 this->OnViewMode(e);
\r
170 // wxGTKでは直接wxLC_VIRTUALを指定しないと反映されない。
\r
171 this->list_ctrl->SetSingleStyle(wxLC_VIRTUAL);
\r
172 this->list_ctrl->InsertColumn(0, _("Filename"), wxLIST_FORMAT_LEFT, this->conf.ReadId(CONF_LISTVIEW_C_FILENAME, 140l));
\r
173 this->list_ctrl->InsertColumn(1, _("Unpacked"), wxLIST_FORMAT_RIGHT, this->conf.ReadId(CONF_LISTVIEW_C_UNPACKED, 80l));
\r
174 this->list_ctrl->InsertColumn(2, _("Packed"), wxLIST_FORMAT_RIGHT, this->conf.ReadId(CONF_LISTVIEW_C_PACKED, 80l));
\r
175 this->list_ctrl->InsertColumn(3, _("Ratio"), wxLIST_FORMAT_RIGHT, this->conf.ReadId(CONF_LISTVIEW_C_RATIO, 50l));
\r
176 this->list_ctrl->InsertColumn(4, _("Method"), wxLIST_FORMAT_LEFT, this->conf.ReadId(CONF_LISTVIEW_C_METHOD, 60l));
\r
177 this->list_ctrl->InsertColumn(5, _("Attr"), wxLIST_FORMAT_LEFT, this->conf.ReadId(CONF_LISTVIEW_C_ATTR, 50l));
\r
178 this->list_ctrl->InsertColumn(6, _("Last modified"), wxLIST_FORMAT_RIGHT, this->conf.ReadId(CONF_LISTVIEW_C_LASTMOD, 150l));
\r
179 this->list_ctrl->InsertColumn(7, _("Path"), wxLIST_FORMAT_LEFT, this->conf.ReadId(CONF_LISTVIEW_C_PATH, 100l));
\r
180 this->list_ctrl->InsertColumn(8, _("Type"), wxLIST_FORMAT_LEFT, this->conf.ReadId(CONF_LISTVIEW_C_TYPE, 100l));
\r
181 this->list_ctrl->InsertColumn(9, _("No."), wxLIST_FORMAT_RIGHT, this->conf.ReadId(CONF_LISTVIEW_C_NO, 35l));
\r
182 this->list_ctrl->InsertColumn(10,_("Comment"), wxLIST_FORMAT_LEFT, this->conf.ReadId(CONF_LISTVIEW_C_COMMENT, 35l));
\r
183 g_nSortColumn = this->conf.ReadId(CONF_LISTVIEW_S_COLUMN, 9l);
\r
184 g_fSortAscend = this->conf.ReadId(CONF_LISTVIEW_S_ASCEND, true);
\r
186 // ツールバー/ステータスバー設定。
\r
187 int nStatusBarParts[] = {70, 70, 180, 50, -1};
\r
188 this->statusbar->SetFieldsCount(5, nStatusBarParts);
\r
189 this->SetStatusBarPane(-1);
\r
190 bool fShow = this->conf.ReadId(CONF_WINDOW_STATUSBAR, true);
\r
191 this->menubar->Check(XRCID("Exe_View_StatusBar"), fShow);
\r
192 this->statusbar->Show(fShow);
\r
193 fShow = this->conf.ReadId(CONF_WINDOW_TOOLBAR, true);
\r
194 this->menubar->Check(XRCID("Exe_View_ToolBar"), fShow);
\r
195 this->toolbar->Show(fShow);
\r
200 void MainFrame::OnExit(wxCommandEvent&)
\r
205 void MainFrame::OnArcCreate(wxCommandEvent& e)
\r
207 TPI_SWITCHES swInfo;
\r
208 swInfo.pCustomSwitches = NULL;
\r
212 ::wxXmlResource::Get()->Load(L_DIR_S_XRC wxT("dlg_make.xrc"));
\r
213 ::wxXmlResource::Get()->LoadDialog(& mkDlg, this, wxT("dlg_make"));
\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.Show(true);
\r
286 TPI_PROCESSINFO piInfo;
\r
287 piInfo.eMessage = TPI_MESSAGE_STATUS;
\r
288 piInfo.eStatus = 0x1000;
\r
289 piInfo.fiInfo.fnFileName = this->fnArchive;
\r
290 piInfo.fiInfo.nUnpackedSize = mkDlg.files.GetCount();
\r
291 procDlg.CallbackProc(TPI_NOTIFY_COMMON, & piInfo);
\r
293 tpi.Command(TPI_COMMAND_CREATE, & swInfo, this->fnArchive.GetFullPath(), mkDlg.files);
\r
294 this->ErrorCheck(tpi.nErrorCode);
\r
295 procDlg.Show(false);
\r
299 if (mkDlg.cbOpenAfter->IsChecked())
\r
302 ::wxExecute(DIR_APP + QuoteString(swInfo.fnDestinationDirectory.GetFullPath()));
\r
305 if (mkDlg.cbExitAfter->IsChecked())
\r
312 this->OnArcOpen(e);
\r
315 void MainFrame::OnArcOpen(wxCommandEvent& e)
\r
318 if (e.GetId() == XRCID("Arc_Open"))
\r
320 wxFileDialog fd(this, _("Choose an archive"), this->conf.ReadHistory(CONF_HISTORY_PATH, 0), wxEmptyString, wxFileSelectorDefaultWildcardStr, wxFD_OPEN | wxFD_FILE_MUST_EXIST);
\r
321 if (fd.ShowModal() == wxID_CANCEL)
\r
325 this->conf.WriteHistory(CONF_HISTORY_PATH, fd.GetDirectory());
\r
326 this->fnArchive = wxFileName(fd.GetPath());
\r
330 ProcessDialog procDlg;
\r
331 procDlg.Show(true);
\r
333 // DnD以外で書庫を開く場合、TPIを読み込み。
\r
334 TPI_PROCESSINFO piInfo;
\r
335 piInfo.fiInfo.nUnpackedSize = e.GetExtraLong();
\r
336 if (e.GetInt() != 1 && ! this->LoadTPI(this->fnArchive.GetFullPath(), & piInfo.fiInfo.nUnpackedSize))
\r
338 procDlg.Show(false);
\r
340 if (this->IsShown())
\r
343 this->statusbar->SetStatusText(_("No plug-in supporting this archive was found!"), 4);
\r
347 wxLogError(_("No plug-in supporting this archive was found!"));
\r
354 piInfo.eMessage = TPI_MESSAGE_STATUS;
\r
355 piInfo.eStatus = 0x1000;
\r
356 piInfo.nProcessedSize = 0;
\r
357 piInfo.fiInfo.fnFileName = this->fnArchive;
\r
358 procDlg.CallbackProc(TPI_NOTIFY_COMMON, & piInfo);
\r
361 this->fileinfo.Alloc(piInfo.fiInfo.nUnpackedSize);
\r
364 this->conf.WriteHistory(CONF_HISTORY_PATH, this->fnArchive.GetPath());
\r
365 this->conf.WriteHistory(CONF_HISTORY_NAME, this->fnArchive.GetFullName());
\r
366 this->conf.WriteHistory(CONF_HISTORY_FULL, this->fnArchive.GetFullPath());
\r
368 // 書庫のアイコンを取得し、書庫ルートを作成。
\r
369 g_hIconT.Add(wxBitmap(L_DIR_S_ICO wxT("folder_closed.png"), wxBITMAP_TYPE_ANY));
\r
370 g_hIconT.Add(wxBitmap(L_DIR_S_ICO wxT("folder_open.png"), wxBITMAP_TYPE_ANY));
\r
371 this->tree_ctrl->SetImageList(& g_hIconT);
\r
373 idRoot = this->tree_ctrl->AddRoot(wxEmptyString),
\r
375 idArchive = this->tree_ctrl->AppendItem(idRoot, piInfo.fiInfo.fnFileName.GetFullName(), g_hIconT.Add(GetFileTypeIcon(piInfo.fiInfo.fnFileName))),
\r
377 idArchive = this->tree_ctrl->AppendItem(idRoot, piInfo.fiInfo.fnFileName.GetFullName(), g_hIconT.Add(GetFileTypeIcon(piInfo.fiInfo.fnFileName).ConvertToImage().Rescale(16, 16))),
\r
379 idArcRoot = this->tree_ctrl->AppendItem(idRoot, wxT("-----"), 0, 1);
\r
382 if (tpi.GetFileInformation(& piInfo.fiInfo, true))
\r
384 piInfo.eStatus = 0x1001;
\r
387 piInfo.nProcessedSize++;
\r
388 if (this->ErrorCheck(procDlg.CallbackProc(TPI_NOTIFY_COMMON, & piInfo)) == TPI_CALLBACK_CANCEL)
\r
390 procDlg.Show(false);
\r
391 tpi.CloseArchive();
\r
393 this->OnArcClose(e);
\r
398 wxString szPath = piInfo.fiInfo.fnFileName.GetPathWithSep(wxPATH_UNIX);
\r
399 if (szPath.StartsWith(wxT("/")))
\r
401 piInfo.fiInfo.fnFileName = wxFileName(szPath.AfterFirst(wxT('/')), piInfo.fiInfo.fnFileName.GetFullName(), wxPATH_DOS);
\r
405 bool fDir = piInfo.fiInfo.dwAttribute & TPI_ATTRIBUTE_DIRECTORY ? true : false;
\r
406 TreeView_CheckNewerItem(this->tree_ctrl, idArcRoot, fDir ? piInfo.fiInfo.fnFileName.GetFullPath() : piInfo.fiInfo.fnFileName.GetPath(), true);
\r
410 if (piInfo.fiInfo.fnFileName.GetPathWithSep(wxPATH_UNIX).Find(wxT("../")) != wxNOT_FOUND)
\r
412 piInfo.fiInfo.eDanger = TRUE;
\r
413 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
415 // 空白の連続による拡張子偽装を検査。
\r
416 if (piInfo.fiInfo.fnFileName.GetFullName().Find(wxT(" ")) != wxNOT_FOUND)
\r
418 piInfo.fiInfo.eDanger = TRUE;
\r
419 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
422 for (wxChar c = 0x200c; c <= 0x206f; c++)
\r
424 if (piInfo.fiInfo.fnFileName.GetFullName().Find(c) != wxNOT_FOUND)
\r
426 piInfo.fiInfo.eDanger = TRUE;
\r
427 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
431 case 0x200f: c = 0x2027; break;
\r
432 case 0x202e: c = 0x2060; break;
\r
436 // ディレクトリ属性を含むものについては情報を保存しない。
\r
443 this->fileinfo.Add(piInfo.fiInfo);
\r
445 while (tpi.GetFileInformation(& piInfo.fiInfo));
\r
448 // GetFileInformationがエラー終了した場合。
\r
449 this->ErrorCheck(tpi.nErrorCode, wxT("GetFileInformation"));
\r
452 tpi.GetArchiveInformation(& this->aiArchive);
\r
453 this->ErrorCheck(tpi.nErrorCode, wxT("GetArchiveInformation"));
\r
456 tpi.CloseArchive();
\r
457 this->ErrorCheck(tpi.nErrorCode, wxT("CloseArchive"));
\r
460 this->fileinfo.Shrink();
\r
461 this->tree_ctrl->ExpandAll();
\r
462 this->tree_ctrl->ScrollTo(idArchive);
\r
463 this->tree_ctrl->SelectItem(idArchive);
\r
464 this->list_ctrl->atDangerItem.SetTextColour(* wxRED);
\r
465 this->list_ctrl->atEncryptedItem.SetTextColour(wxColour(wxT("forest green")));
\r
468 this->statusbar->SetStatusText(this->aiArchive.fiInfo.szTypeName, 0);
\r
469 this->statusbar->SetStatusText(wxString::Format(_("%u file(s)"), this->fileinfo.GetCount()), 1);
\r
470 this->statusbar->SetStatusText(wxString::Format(wxString("%" wxLongLongFmtSpec "uB -> %" wxLongLongFmtSpec "uB"), this->aiArchive.nUnpackedSize, this->aiArchive.nPackedSize), 2);
\r
471 this->statusbar->SetStatusText(wxString::Format(wxT("%3.1f%%"), this->aiArchive.wCompressRatio / 10.0), 3);
\r
472 this->statusbar->SetStatusText(this->fnArchive.GetFullPath(), 4);
\r
474 // ツールバー・メニューバー設定。ファイル選択時しか動作しない削除などは別に設定。
\r
475 SetMenuToolState("Arc_Close", true);
\r
476 SetMenuToolState("Arc_Add", (this->aiArchive.fiInfo.eSupportedCommand & TPI_COMMAND_ADD) == TPI_COMMAND_ADD && this->aiArchive.fiInfo.fArchive);
\r
477 SetMenuToolState("Arc_SFX", (this->aiArchive.fiInfo.eSupportedCommand & TPI_COMMAND_SFX) == TPI_COMMAND_SFX && ! this->aiArchive.fSFX);
\r
478 SetMenuToolState("Arc_UnSFX", (this->aiArchive.fiInfo.eSupportedCommand & TPI_COMMAND_UNSFX) == TPI_COMMAND_UNSFX && this->aiArchive.fSFX);
\r
479 SetMenuToolState("Arc_Extract", (this->aiArchive.fiInfo.eSupportedCommand & TPI_COMMAND_EXTRACT)== TPI_COMMAND_EXTRACT);
\r
480 SetMenuToolState("Arc_Test", (this->aiArchive.fiInfo.eSupportedCommand & TPI_COMMAND_TEST) == TPI_COMMAND_TEST);
\r
481 SetMenuToolState("Arc_Repair", (this->aiArchive.fiInfo.eSupportedCommand & TPI_COMMAND_REPAIR) == TPI_COMMAND_REPAIR);
\r
482 this->menubar->Enable(XRCID("Arc_Clone"), true);
\r
484 procDlg.Show(false);
\r
488 void MainFrame::OnArcClose(wxCommandEvent& e)
\r
490 // ツリービュー・リストビュー設定。
\r
491 this->tree_ctrl->DeleteAllItems();
\r
492 this->list_ctrl->DeleteAllItems();
\r
493 this->list_ctrl->apShowFile.Clear();
\r
496 SetMenuToolState("Arc_Close", false);
\r
497 SetMenuToolState("Arc_Add", false);
\r
498 SetMenuToolState("Arc_SFX", false);
\r
499 SetMenuToolState("Arc_UnSFX", false);
\r
500 SetMenuToolState("Arc_Extract", false);
\r
501 SetMenuToolState("Arc_Delete", false);
\r
502 SetMenuToolState("Arc_Test", false);
\r
503 SetMenuToolState("Arc_Repair", false);
\r
504 this->menubar->Enable(XRCID("Arc_Clone"), false);
\r
506 for (int i = 0; i < this->statusbar->GetFieldsCount(); i++)
\r
508 this->statusbar->SetStatusText(wxEmptyString, i);
\r
510 this->fileinfo.Clear();
\r
511 this->aiArchive.szComment.Empty();
\r
512 this->aiArchive.fnArchive.Clear();
\r
513 this->aiArchive.fiInfo.szTypeName.Empty();
\r
514 this->aiArchive.fiInfo.szSuffix.Empty();
\r
515 this->aiArchive.fiInfo.szEngineName.Empty();
\r
516 this->aiArchive.fiInfo.szTPIName.Empty();
\r
518 g_hIconT.RemoveAll();
\r
519 g_hIconLL.RemoveAll();
\r
520 g_hIconLS.RemoveAll();
\r
522 // DnDで書庫を開くときは既に読み込まれているTPIを用いるので、解放してはいけない。
\r
523 if (e.GetExtraLong() == 0)
\r
529 void MainFrame::OnArcClone(wxCommandEvent&)
\r
532 wxFileDialog fd(this, _("Clone archive"), this->fnArchive.GetPath(), this->fnArchive.GetFullName(), wxFileSelectorDefaultWildcardStr, wxFD_SAVE | wxFD_OVERWRITE_PROMPT);
\r
533 if (fd.ShowModal() == wxID_CANCEL)
\r
537 this->conf.WriteHistory(CONF_HISTORY_PATH, fd.GetDirectory());
\r
540 ::wxCopyFile(this->fnArchive.GetFullPath(), fd.GetPath());
\r
541 wxFileName fn(fd.GetPath());
\r
542 wxDateTime dtAccess, dtModify, dtCreate;
\r
543 this->fnArchive.GetTimes(& dtAccess, & dtModify, & dtCreate);
\r
544 fn.SetTimes(& dtAccess, & dtModify, & dtCreate);
\r
547 void MainFrame::OnArcAdd(wxCommandEvent& e)
\r
551 ::wxXmlResource::Get()->Load(L_DIR_S_XRC wxT("dlg_make.xrc"));
\r
552 ::wxXmlResource::Get()->LoadDialog(& mkDlg, this, wxT("dlg_make"));
\r
553 mkDlg.uCommand = TPI_COMMAND_ADD;
\r
556 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
557 if (fd.ShowModal() == wxID_CANCEL)
\r
561 fd.GetFilenames(mkDlg.files);
\r
562 this->conf.WriteHistory(CONF_HISTORY_PATH, fd.GetDirectory());
\r
565 if (mkDlg.ShowModal() == wxID_CANCEL)
\r
571 TPI_SWITCHES swInfo;
\r
572 swInfo.pCustomSwitches = NULL;
\r
573 swInfo.fMakeSFX = false;
\r
574 swInfo.fnDestinationDirectory= wxFileName::DirName(fd.GetDirectory());
\r
575 swInfo.fStoreDirectoryPathes = ! mkDlg.cbIgnorePath->IsChecked();
\r
576 swInfo.fSolid = mkDlg.cbSolid->IsChecked();
\r
577 swInfo.fMMOptimize = mkDlg.cbMMOptimize->IsChecked();
\r
578 swInfo.fEncryptHeader = mkDlg.cbEncryptHeader->IsChecked();
\r
579 swInfo.nCompressLevel = mkDlg.scLevel->GetValue();
\r
580 swInfo.nRecoveryRecord = mkDlg.scRR->GetValue();
\r
581 swInfo.szPassword = mkDlg.tcPassword->GetValue();
\r
582 swInfo.szKeyFile = mkDlg.tcKeyfile->GetValue();
\r
583 swInfo.szComment = mkDlg.tcComment->GetValue();
\r
587 ProcessDialog procDlg;
\r
588 procDlg.Show(true);
\r
591 TPI_PROCESSINFO piInfo;
\r
592 piInfo.eMessage = TPI_MESSAGE_STATUS;
\r
593 piInfo.eStatus = 0x1000;
\r
594 piInfo.fiInfo.fnFileName = this->fnArchive;
\r
595 piInfo.fiInfo.nUnpackedSize = mkDlg.files.GetCount();
\r
596 procDlg.CallbackProc(TPI_NOTIFY_COMMON, & piInfo);
\r
598 tpi.Command(TPI_COMMAND_ADD, & swInfo, this->fnArchive.GetFullPath(), mkDlg.files);
\r
599 this->ErrorCheck(tpi.nErrorCode);
\r
600 procDlg.Show(false);
\r
603 if (mkDlg.cbOpenAfter->IsChecked())
\r
606 ::wxExecute(DIR_APP + QuoteString(swInfo.fnDestinationDirectory.GetFullPath()));
\r
609 if (mkDlg.cbExitAfter->IsChecked())
\r
615 // 終了しない場合は書庫を再読み込み。
\r
616 this->OnArcOpen(e);
\r
619 void MainFrame::OnArcConvert(wxCommandEvent& e)
\r
621 TPI_SWITCHES swInfo;
\r
622 swInfo.fMakeSFX = e.GetId() == XRCID("Arc_SFX");
\r
625 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
626 if (fd.ShowModal() == wxID_CANCEL)
\r
630 swInfo.fnDestinationDirectory = wxFileName::DirName(fd.GetDirectory());
\r
631 this->conf.WriteHistory(CONF_HISTORY_PATH, fd.GetDirectory());
\r
633 wxArrayString files;
\r
634 files.Add(fd.GetPath());
\r
636 ProcessDialog procDlg;
\r
637 procDlg.Show(true);
\r
638 tpi.Command(swInfo.fMakeSFX ? TPI_COMMAND_SFX : TPI_COMMAND_UNSFX, & swInfo, this->fnArchive.GetFullPath(), files);
\r
639 this->ErrorCheck(tpi.nErrorCode);
\r
640 procDlg.Show(false);
\r
643 void MainFrame::OnArcExtract(wxCommandEvent& e)
\r
645 TPI_SWITCHES swInfo;
\r
646 swInfo.pCustomSwitches = NULL;
\r
648 // モード取得。通常は0, 実行なら1, ファイルDnDなら2、ディレクトリDnDなら3、クリップボードなら4。
\r
649 int nMode = e.GetInt();
\r
651 wxFileType * ftFile = NULL;
\r
653 // 展開ダイアログを作成。DnDまたは実行時は表示しない。
\r
655 ::wxXmlResource::Get()->Load(L_DIR_S_XRC wxT("dlg_make.xrc"));
\r
656 ::wxXmlResource::Get()->LoadDialog(& mkDlg, this, wxT("dlg_make"));
\r
657 mkDlg.uCommand = TPI_COMMAND_EXTRACT;
\r
658 mkDlg.files = MakeTargetFileList(this, nMode == 1);
\r
665 ftFile = wxTheMimeTypesManager->GetFileTypeFromExtension(wxFileName(mkDlg.files[0], wxPATH_DOS).GetExt());
\r
666 if (! ftFile || ftFile->GetOpenCommand(wxEmptyString).IsEmpty())
\r
668 // 種類が取得できないときはテキストとみなす。
\r
669 ftFile = wxTheMimeTypesManager->GetFileTypeFromExtension(this->conf.ReadId(CONF_DEFAULT_EXT, (wxString) wxT("txt")));
\r
672 wxLogError(_("Unable to get the file type!"));
\r
679 swInfo.fStoreDirectoryPathes = false;
\r
680 wxString szDestDirBase = nMode == 3 ? this->tree_ctrl->GetItemText(this->tree_ctrl->GetSelection()) : wxT("tpi_tmp");
\r
682 if (szDestDirBase == wxT("-----"))
\r
684 // 書庫ルートのときは書庫名にしておく。
\r
685 szDestDirBase = this->fnArchive.GetName();
\r
687 swInfo.fnDestinationDirectory = MakeDirPath(wxFileName::DirName(p.GetTempDir()), szDestDirBase, true);
\r
688 if (! swInfo.fnDestinationDirectory.IsOk())
\r
690 wxLogError(_("Unable to make the temporary directory!"));
\r
696 if (mkDlg.ShowModal() == wxID_CANCEL)
\r
702 swInfo.fStoreDirectoryPathes = ! mkDlg.cbIgnorePath->IsChecked();
\r
703 swInfo.fnDestinationDirectory = wxFileName::DirName(mkDlg.cbDir->GetValue());
\r
704 swInfo.szPassword = mkDlg.tcPassword->GetValue();
\r
705 swInfo.szKeyFile = mkDlg.tcKeyfile->GetValue();
\r
707 // 必要なら書庫名でディレクトリを作成する。
\r
708 if (WillMakeDirByArcName(this, & mkDlg))
\r
710 swInfo.fnDestinationDirectory = MakeDirPath(swInfo.fnDestinationDirectory, this->fnArchive.GetName(), true);
\r
711 if (! swInfo.fnDestinationDirectory.IsOk())
\r
713 wxLogError(_("Unable to make the destination directory!"));
\r
721 ProcessDialog procDlg;
\r
722 procDlg.Show(true);
\r
725 TPI_PROCESSINFO piInfo;
\r
726 piInfo.eMessage = TPI_MESSAGE_STATUS;
\r
727 piInfo.eStatus = 0x1000;
\r
728 piInfo.fiInfo.fnFileName = this->fnArchive;
\r
729 piInfo.fiInfo.nUnpackedSize = mkDlg.files.GetCount();
\r
730 procDlg.CallbackProc(TPI_NOTIFY_COMMON, & piInfo);
\r
732 tpi.Command(TPI_COMMAND_EXTRACT, & swInfo, this->fnArchive.GetFullPath(), mkDlg.files);
\r
733 this->ErrorCheck(tpi.nErrorCode);
\r
734 procDlg.Show(false);
\r
739 if (mkDlg.cbOpenAfter->IsChecked())
\r
742 ::wxExecute(DIR_APP + QuoteString(swInfo.fnDestinationDirectory.GetFullPath()));
\r
745 if (mkDlg.cbExitAfter->IsChecked())
\r
756 wxString szTempFile = swInfo.fnDestinationDirectory.GetPathWithSep() + wxFileName(mkDlg.files[0], wxPATH_DOS).GetFullName();
\r
757 bool fSuccess = tpi.nErrorCode == TPI_ERROR_SUCCESS;
\r
758 myProcess * pCallback = new myProcess(szTempFile, swInfo.fnDestinationDirectory.GetPath());
\r
762 // Linuxでは引用符で囲む必要がある。
\r
763 fSuccess = ::wxExecute(ftFile->GetOpenCommand(QuoteString(szTempFile)), wxEXEC_ASYNC, pCallback) > 0;
\r
765 fSuccess = ::wxExecute(ftFile->GetOpenCommand(szTempFile), wxEXEC_ASYNC, pCallback) > 0;
\r
770 pCallback->OnTerminate(0, 0);
\r
776 wxArrayString asFiles;
\r
777 myFileDataObject * objFile = new myFileDataObject();
\r
778 objFile->szTempDir = nMode == 3 ? swInfo.fnDestinationDirectory.GetPath() : swInfo.fnDestinationDirectory.GetFullPath();
\r
779 for (size_t i = 0; i < mkDlg.files.GetCount(); i++)
\r
781 wxString szFileName = swInfo.fnDestinationDirectory.GetPathWithSep() + wxFileName(mkDlg.files[i], wxPATH_DOS).GetFullName();
\r
784 asFiles.Add(szFileName);
\r
789 objFile->AddFile(szFileName);
\r
794 objFile->AddFile(objFile->szTempDir);
\r
799 wxTheClipboard->SetData(objFile);
\r
803 // 自身にドロップされると煩雑なので、一時的にドロップを受け付けないようにしておく。
\r
804 this->SetDropTarget(NULL);
\r
807 wxDropSource dropSource(* objFile, this);
\r
808 wxDragResult drResult = dropSource.DoDragDrop();
\r
809 if (drResult != wxDragCancel && drResult != wxDragNone && drResult != wxDragMove)
\r
812 // Linuxではまだ処理が終わっていない(コンテキストメニューが表示されている)ので、とりあえず3秒だけ待つ。
\r
816 this->SetDropTarget(new myFileDropTarget(this));
\r
818 // ディレクトリDnDのときは、先にディレクトリの中のファイルを消しておく。
\r
821 for (size_t i = 0; i < asFiles.GetCount(); i++)
\r
823 ::wxRemoveFile(asFiles[i]);
\r
833 void MainFrame::OnArcDelete(wxCommandEvent& e)
\r
835 // 全ファイル削除は危険ではないかと。
\r
836 if (this->list_ctrl->GetSelectedItemCount() == 0)
\r
838 // wxのバグで自動では無効化できないので、実行しようとしたときに無効化する。
\r
839 SetMenuToolState("Arc_Delete", false);
\r
843 if (::AskDlg(_("Are you sure to delete selected files?"), this) == wxNO)
\r
850 TPI_SWITCHES swInfo;
\r
851 ProcessDialog procDlg;
\r
852 procDlg.Show(true);
\r
853 wxArrayString asFiles = MakeTargetFileList(this, false);
\r
856 TPI_PROCESSINFO piInfo;
\r
857 piInfo.eMessage = TPI_MESSAGE_STATUS;
\r
858 piInfo.eStatus = 0x1000;
\r
859 piInfo.fiInfo.fnFileName = this->fnArchive;
\r
860 piInfo.fiInfo.nUnpackedSize = asFiles.GetCount();
\r
861 procDlg.CallbackProc(TPI_NOTIFY_COMMON, & piInfo);
\r
863 tpi.Command(TPI_COMMAND_DELETE, & swInfo, this->fnArchive.GetFullPath(), asFiles);
\r
864 this->ErrorCheck(tpi.nErrorCode);
\r
865 procDlg.Show(false);
\r
869 this->OnArcOpen(e);
\r
872 void MainFrame::OnArcTest(wxCommandEvent&)
\r
875 ProcessDialog procDlg;
\r
876 procDlg.Show(true);
\r
877 wxArrayString asFiles = MakeTargetFileList(this, false);
\r
880 TPI_PROCESSINFO piInfo;
\r
881 piInfo.eMessage = TPI_MESSAGE_STATUS;
\r
882 piInfo.eStatus = 0x1000;
\r
883 piInfo.fiInfo.fnFileName = this->fnArchive;
\r
884 piInfo.fiInfo.nUnpackedSize = asFiles.GetCount();
\r
885 procDlg.CallbackProc(TPI_NOTIFY_COMMON, & piInfo);
\r
887 TPI_SWITCHES swInfo;
\r
888 bool bIsCorrect = tpi.Command(TPI_COMMAND_TEST, & swInfo, this->fnArchive.GetFullPath(), asFiles);
\r
889 procDlg.Show(false);
\r
893 wxLogMessage(_("This is a correct archive."));
\r
897 this->ErrorCheck(tpi.nErrorCode);
\r
901 void MainFrame::OnArcRepair(wxCommandEvent&)
\r
904 ProcessDialog procDlg;
\r
905 procDlg.Show(true);
\r
906 wxArrayString asFiles = MakeTargetFileList(this, false);
\r
909 TPI_PROCESSINFO piInfo;
\r
910 piInfo.eMessage = TPI_MESSAGE_STATUS;
\r
911 piInfo.eStatus = 0x1000;
\r
912 piInfo.fiInfo.fnFileName = this->fnArchive;
\r
913 piInfo.fiInfo.nUnpackedSize = asFiles.GetCount();
\r
914 procDlg.CallbackProc(TPI_NOTIFY_COMMON, & piInfo);
\r
916 TPI_SWITCHES swInfo;
\r
917 tpi.Command(TPI_COMMAND_REPAIR, & swInfo, this->fnArchive.GetFullPath(), asFiles);
\r
918 this->ErrorCheck(tpi.nErrorCode);
\r
919 procDlg.Show(false);
\r
922 void MainFrame::OnExeCopy(wxCommandEvent & e)
\r
924 if (this->list_ctrl->GetSelectedItemCount() == 0)
\r
926 // wxのバグで自動では無効化できないので、実行しようとしたときに無効化する。
\r
927 this->menubar->Enable(XRCID("Exe_Copy"), false);
\r
931 if (! wxTheClipboard->Open())
\r
937 this->OnArcExtract(e);
\r
938 wxTheClipboard->Close();
\r
941 void MainFrame::OnViewMode(wxCommandEvent & e)
\r
944 this->menubar->Check(n, true);
\r
945 this->list_ctrl->SetSingleStyle(wxLC_REPORT, n == XRCID("Exe_View_Details"));
\r
946 this->list_ctrl->SetSingleStyle(wxLC_ICON, n == XRCID("Exe_View_Icons"));
\r
947 this->list_ctrl->SetSingleStyle(wxLC_LIST, n == XRCID("Exe_View_List"));
\r
950 void MainFrame::OnShowToolBar(wxCommandEvent & e)
\r
952 this->toolbar->Show(e.IsChecked());
\r
955 void MainFrame::OnShowStatusBar(wxCommandEvent & e)
\r
957 this->statusbar->Show(e.IsChecked());
\r
960 void MainFrame::OnSelectAll(wxCommandEvent &)
\r
962 for (int i = 0; i < this->list_ctrl->GetItemCount(); i++)
\r
964 this->list_ctrl->Select(i, true);
\r
970 void MainFrame::OnTreeChanged(wxTreeEvent& e)
\r
973 wxString szNodePath = TreeView_GetItemPath(this->tree_ctrl, e.GetItem());
\r
975 this->list_ctrl->apShowFile.Clear();
\r
976 this->list_ctrl->DeleteAllItems();
\r
977 g_hIconLL.RemoveAll();
\r
978 g_hIconLS.RemoveAll();
\r
980 // 現在のアイテムの選択状態を無効にしておく。
\r
981 long nSelected = this->list_ctrl->GetFirstSelected();
\r
982 while (nSelected != -1)
\r
984 this->list_ctrl->Select(nSelected, false);
\r
985 nSelected = this->list_ctrl->GetNextSelected(nSelected);
\r
989 this->list_ctrl->SetImageList(& g_hIconLL, wxIMAGE_LIST_NORMAL);
\r
990 this->list_ctrl->SetImageList(& g_hIconLS, wxIMAGE_LIST_SMALL);
\r
992 // 配列と比較し、パスが一致しなければ消す。
\r
993 for (size_t i = 0; i < this->fileinfo.GetCount(); i++)
\r
996 if (szNodePath == wxT("*") || szNodePath == this->fileinfo[i].fnFileName.GetPath())
\r
999 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
1004 // フィルタにかからなければ無視。
\r
1005 if (this->fileinfo[i].fnFileName.GetFullName().MakeLower().Find(this->tcFilter->GetValue().MakeLower()) == wxNOT_FOUND)
\r
1010 this->list_ctrl->apShowFile.Add(& this->fileinfo[i]);
\r
1015 this->list_ctrl->apShowFile.Sort(& ListCtrlCompareProc);
\r
1016 this->list_ctrl->SetItemCount(this->list_ctrl->apShowFile.GetCount());
\r
1019 void MainFrame::OnTreeBeginDrag(wxTreeEvent& e)
\r
1021 // TODO : アイテムが子階層を持っていても展開できない。
\r
1022 this->tree_ctrl->SelectItem(e.GetItem());
\r
1024 wxCommandEvent e1;
\r
1026 this->OnArcExtract(e1);
\r
1031 void MainFrame::OnListItemSelect(wxListEvent&)
\r
1033 // ファイルに対する動作の設定。但し、選択解除時はwxのバグで呼び出されない。
\r
1034 bool fEnable = this->list_ctrl->GetSelectedItemCount() > 0;
\r
1035 SetMenuToolState("Arc_Delete", fEnable && (this->aiArchive.fiInfo.eSupportedCommand & TPI_COMMAND_DELETE) == TPI_COMMAND_DELETE && this->aiArchive.fiInfo.fArchive);
\r
1036 this->menubar->Enable(XRCID("Exe_Copy"), fEnable);
\r
1039 void MainFrame::OnListItemDClick(wxListEvent&)
\r
1043 this->OnArcExtract(e);
\r
1046 void MainFrame::OnListBeginDrag(wxListEvent&)
\r
1048 if (this->list_ctrl->GetSelectedItemCount() == 0)
\r
1050 // アイテムを選択せずドラッグしようとした場合。
\r
1056 this->OnArcExtract(e);
\r
1061 void MainFrame::OnFilter(wxCommandEvent&)
\r
1064 e.SetItem(this->tree_ctrl->GetSelection());
\r
1065 this->OnTreeChanged(e);
\r
1070 bool MainFrame::LoadTPI(const wxString & szFileName, wxULongLong_t * llFileCount)
\r
1072 // 書庫を開いていれば閉じておく。
\r
1074 this->OnArcClose(e);
\r
1077 wxDir fs(L_DIR_B_LIB);
\r
1078 wxString szTPIName;
\r
1079 if (fs.GetFirst(& szTPIName, wxT("*" TPI_EXT)))
\r
1084 if (! tpi.InitLibrary(L_DIR_B_LIB + szTPIName, szFileName))
\r
1086 tpi.FreeLibrary();
\r
1091 tpi.SetCallbackProc(TPICallbackProc);
\r
1094 if (! tpi.OpenArchive(szFileName, llFileCount))
\r
1096 tpi.FreeLibrary();
\r
1097 * llFileCount = 0;
\r
1102 while (fs.GetNext(& szTPIName));
\r
1107 int MainFrame::ErrorCheck(int nErrorCode, const wxString & szAPIName)
\r
1109 switch (nErrorCode)
\r
1111 case TPI_ERROR_SUCCESS:
\r
1112 case TPI_ERROR_S_ENDOFDATA:
\r
1113 case TPI_CALLBACK_CONTINUE:
\r
1115 case TPI_ERROR_D_UNSUPPORTED:
\r
1116 wxLogError(_("Sorry, this function is not supported yet."));
\r
1118 case TPI_ERROR_D_SKIPPED:
\r
1119 case TPI_CALLBACK_CANCEL:
\r
1120 wxLogError(_("This operation is canceled by the user."));
\r
1123 wxLogError(_("Error: %s()!\nError code: %d"), szAPIName.c_str(), nErrorCode);
\r
1125 return nErrorCode;
\r