EVT_MENU(XRCID("Arc_Create"), MainFrame::OnArcCreate)\r
EVT_MENU(XRCID("Arc_Open"), MainFrame::OnArcOpen)\r
EVT_MENU(XRCID("Arc_Close"), MainFrame::OnArcClose)\r
+ EVT_MENU(XRCID("Arc_Clone"), MainFrame::OnArcClone)\r
EVT_MENU(XRCID("Arc_Add"), MainFrame::OnArcAdd)\r
EVT_MENU(XRCID("Arc_SFX"), MainFrame::OnArcConvert)\r
EVT_MENU(XRCID("Arc_UnSFX"), MainFrame::OnArcConvert)\r
EVT_TREE_SEL_CHANGED(XRCID("TreeView"), MainFrame::OnTreeChanged)\r
EVT_TREE_BEGIN_DRAG( XRCID("TreeView"), MainFrame::OnTreeBeginDrag)\r
// ListView\r
- EVT_LIST_ITEM_ACTIVATED(XRCID("ListView"), MainFrame::OnListItemDClick)\r
- EVT_LIST_BEGIN_DRAG( XRCID("ListView"), MainFrame::OnListBeginDrag)\r
+ EVT_LIST_ITEM_SELECTED( XRCID("ListView"), MainFrame::OnListItemSelect)\r
+ EVT_LIST_ITEM_DESELECTED(XRCID("ListView"), MainFrame::OnListItemSelect)\r
+ EVT_LIST_ITEM_ACTIVATED( XRCID("ListView"), MainFrame::OnListItemDClick)\r
+ EVT_LIST_BEGIN_DRAG( XRCID("ListView"), MainFrame::OnListBeginDrag)\r
// Filter\r
EVT_TEXT(XRCID("tcFilter"), MainFrame::OnFilter)\r
END_EVENT_TABLE()\r
if (e.GetClientData() == NULL)\r
{\r
// 処理対象のファイルを選択。\r
- wxFileDialog fd(this, _("Choose files to compress"), this->conf.ReadHistory(CONF_HISTORY_PATH, 0));\r
- fd.SetWindowStyleFlag(wxFD_OPEN | wxFD_FILE_MUST_EXIST | wxFD_MULTIPLE);\r
+ 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
if (fd.ShowModal() == wxID_CANCEL)\r
{\r
return;\r
// 書庫を選択。\r
if (e.GetId() == XRCID("Arc_Open"))\r
{\r
- wxFileDialog fd(this);\r
- fd.SetDirectory(this->conf.ReadHistory(CONF_HISTORY_PATH, 0));\r
- fd.SetWindowStyleFlag(wxFD_OPEN | wxFD_FILE_MUST_EXIST);\r
+ wxFileDialog fd(this, _("Choose an archive"), this->conf.ReadHistory(CONF_HISTORY_PATH, 0), wxEmptyString, wxFileSelectorDefaultWildcardStr, wxFD_OPEN | wxFD_FILE_MUST_EXIST);\r
if (fd.ShowModal() == wxID_CANCEL)\r
{\r
return;\r
return;\r
}\r
\r
- // ツリービューに反映。\r
- TreeView_CheckNewerItem(this->tree_ctrl, idArcRoot, piInfo.fiInfo.fnFileName.GetPath(), true);\r
-\r
- // ディレクトリ属性を含むものについては除去。\r
- if (piInfo.fiInfo.dwAttribute & TPI_ATTRIBUTE_DIRECTORY)\r
+ // ルート記号を削除。\r
+ wxString szPath = piInfo.fiInfo.fnFileName.GetPathWithSep(wxPATH_UNIX);\r
+ if (szPath.StartsWith(wxT("/")))\r
{\r
- continue;\r
+ piInfo.fiInfo.fnFileName = wxFileName(szPath.AfterFirst(wxT('/')), piInfo.fiInfo.fnFileName.GetFullName(), wxPATH_DOS);\r
}\r
\r
+ // ツリービューに反映。\r
+ bool fDir = piInfo.fiInfo.dwAttribute & TPI_ATTRIBUTE_DIRECTORY ? true : false;\r
+ TreeView_CheckNewerItem(this->tree_ctrl, idArcRoot, fDir ? piInfo.fiInfo.fnFileName.GetFullPath() : piInfo.fiInfo.fnFileName.GetPath(), true);\r
+\r
// セキュリティチェック。\r
// DTV検査。\r
if (piInfo.fiInfo.fnFileName.GetPathWithSep(wxPATH_UNIX).Find(wxT("../")) != wxNOT_FOUND)\r
}\r
}\r
\r
+ // ディレクトリ属性を含むものについては情報を保存しない。\r
+ if (fDir)\r
+ {\r
+ continue;\r
+ }\r
+\r
// 情報を保存してカウントアップ。\r
this->fileinfo.Add(piInfo.fiInfo);\r
}\r
this->statusbar->SetStatusText(wxString::Format(wxT("%3.1f%%"), this->aiArchive.wCompressRatio / 10.0), 3);\r
this->statusbar->SetStatusText(this->fnArchive.GetFullPath(), 4);\r
\r
- // ツールバー・メニューバー設定。\r
+ // ツールバー・メニューバー設定。ファイル選択時しか動作しない削除などは別に設定。\r
SetMenuToolState("Arc_Close", true);\r
SetMenuToolState("Arc_Add", (this->aiArchive.fiInfo.eSupportedCommand & TPI_COMMAND_ADD) == TPI_COMMAND_ADD && this->aiArchive.fiInfo.fArchive);\r
SetMenuToolState("Arc_SFX", (this->aiArchive.fiInfo.eSupportedCommand & TPI_COMMAND_SFX) == TPI_COMMAND_SFX && ! this->aiArchive.fSFX);\r
SetMenuToolState("Arc_UnSFX", (this->aiArchive.fiInfo.eSupportedCommand & TPI_COMMAND_UNSFX) == TPI_COMMAND_UNSFX && this->aiArchive.fSFX);\r
SetMenuToolState("Arc_Extract", (this->aiArchive.fiInfo.eSupportedCommand & TPI_COMMAND_EXTRACT)== TPI_COMMAND_EXTRACT);\r
- SetMenuToolState("Arc_Delete", (this->aiArchive.fiInfo.eSupportedCommand & TPI_COMMAND_DELETE) == TPI_COMMAND_DELETE && this->aiArchive.fiInfo.fArchive);\r
SetMenuToolState("Arc_Test", (this->aiArchive.fiInfo.eSupportedCommand & TPI_COMMAND_TEST) == TPI_COMMAND_TEST);\r
SetMenuToolState("Arc_Repair", (this->aiArchive.fiInfo.eSupportedCommand & TPI_COMMAND_REPAIR) == TPI_COMMAND_REPAIR);\r
+ this->menubar->Enable(XRCID("Arc_Clone"), true);\r
\r
procDlg.Show(false);\r
this->Raise();\r
SetMenuToolState("Arc_Delete", false);\r
SetMenuToolState("Arc_Test", false);\r
SetMenuToolState("Arc_Repair", false);\r
+ this->menubar->Enable(XRCID("Arc_Clone"), false);\r
\r
for (int i = 0; i < this->statusbar->GetFieldsCount(); i++)\r
{\r
}\r
}\r
\r
+void MainFrame::OnArcClone(wxCommandEvent&)\r
+{\r
+ // 保存先を尋ねる。\r
+ wxFileDialog fd(this, _("Clone archive"), this->fnArchive.GetPath(), this->fnArchive.GetFullName(), wxFileSelectorDefaultWildcardStr, wxFD_SAVE | wxFD_OVERWRITE_PROMPT);\r
+ if (fd.ShowModal() == wxID_CANCEL)\r
+ {\r
+ return;\r
+ }\r
+ this->conf.WriteHistory(CONF_HISTORY_PATH, fd.GetDirectory());\r
+\r
+ // コピー。\r
+ ::wxCopyFile(this->fnArchive.GetFullPath(), fd.GetPath());\r
+ wxFileName fn(fd.GetPath());\r
+ wxDateTime dtAccess, dtModify, dtCreate;\r
+ this->fnArchive.GetTimes(& dtAccess, & dtModify, & dtCreate);\r
+ fn.SetTimes(& dtAccess, & dtModify, & dtCreate);\r
+}\r
+\r
void MainFrame::OnArcAdd(wxCommandEvent& e)\r
{\r
// 作成ダイアログを設定。\r
mkDlg.uCommand = TPI_COMMAND_ADD;\r
\r
// 処理対象のファイルを選択。\r
- wxFileDialog fd(this, _("Choose files to add"), this->conf.ReadHistory(CONF_HISTORY_PATH, 0));\r
- fd.SetWindowStyleFlag(wxFD_OPEN | wxFD_FILE_MUST_EXIST | wxFD_MULTIPLE);\r
+ 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
if (fd.ShowModal() == wxID_CANCEL)\r
{\r
return;\r
swInfo.fMakeSFX = e.GetId() == XRCID("Arc_SFX");\r
\r
// 保存先を尋ねる。\r
- wxFileDialog fd(this, swInfo.fMakeSFX ? _("Save as SFX") : _("Save as normal archive"), this->fnArchive.GetPath(), this->fnArchive.GetName() + (swInfo.fMakeSFX ? EXE_EXT : (wxString) wxEmptyString));\r
- fd.SetWindowStyleFlag(wxFD_SAVE | wxFD_OVERWRITE_PROMPT);\r
+ 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
if (fd.ShowModal() == wxID_CANCEL)\r
{\r
return;\r
{\r
// コマンドを取得。\r
ftFile = wxTheMimeTypesManager->GetFileTypeFromExtension(wxFileName(mkDlg.files[0], wxPATH_DOS).GetExt());\r
- if (! ftFile)\r
+ if (! ftFile || ftFile->GetOpenCommand(wxEmptyString).IsEmpty())\r
{\r
- // 種類が取得できないときは設定を読み込む。初期設定ではテキストとみなす。\r
+ // 種類が取得できないときはテキストとみなす。\r
ftFile = wxTheMimeTypesManager->GetFileTypeFromExtension(this->conf.ReadId(CONF_DEFAULT_EXT, (wxString) wxT("txt")));\r
if (! ftFile)\r
{\r
}\r
else\r
{\r
- wxArrayString asFiles;\r
if (nMode == 1)\r
{\r
// コマンドを実行。\r
- asFiles.Add(swInfo.fnDestinationDirectory.GetPathWithSep() + wxFileName(mkDlg.files[0], wxPATH_DOS).GetFullName());\r
- if (tpi.nErrorCode == TPI_ERROR_SUCCESS)\r
+ wxString szTempFile = swInfo.fnDestinationDirectory.GetPathWithSep() + wxFileName(mkDlg.files[0], wxPATH_DOS).GetFullName();\r
+ bool fSuccess = tpi.nErrorCode == TPI_ERROR_SUCCESS;\r
+ myProcess * pCallback = new myProcess(szTempFile, swInfo.fnDestinationDirectory.GetPath());\r
+ if (fSuccess)\r
{\r
#ifdef __LINUX__\r
// Linuxでは引用符で囲む必要がある。\r
- ::wxExecute(ftFile->GetOpenCommand(QuoteString(asFiles[0])), wxEXEC_SYNC);\r
+ fSuccess = ::wxExecute(ftFile->GetOpenCommand(QuoteString(szTempFile)), wxEXEC_ASYNC, pCallback) > 0;\r
#else\r
- ::wxExecute(ftFile->GetOpenCommand(asFiles[0]), wxEXEC_SYNC);\r
+ fSuccess = ::wxExecute(ftFile->GetOpenCommand(szTempFile), wxEXEC_ASYNC, pCallback) > 0;\r
#endif\r
}\r
+ if (! fSuccess)\r
+ {\r
+ pCallback->OnTerminate(0, 0);\r
+ }\r
}\r
else\r
{\r
// 展開対象を決定。\r
+ wxArrayString asFiles;\r
myFileDataObject * objFile = new myFileDataObject();\r
- objFile->szTempDir = swInfo.fnDestinationDirectory.GetFullPath();\r
+ objFile->szTempDir = nMode == 3 ? swInfo.fnDestinationDirectory.GetPath() : swInfo.fnDestinationDirectory.GetFullPath();\r
for (size_t i = 0; i < mkDlg.files.GetCount(); i++)\r
{\r
wxString szFileName = swInfo.fnDestinationDirectory.GetPathWithSep() + wxFileName(mkDlg.files[i], wxPATH_DOS).GetFullName();\r
- if (nMode != 3)\r
+ if (nMode == 3)\r
+ {\r
+ asFiles.Add(szFileName);\r
+ }\r
+ else\r
{\r
// リストに追加。\r
objFile->AddFile(szFileName);\r
}\r
- asFiles.Add(szFileName);\r
}\r
if (nMode == 3)\r
{\r
- objFile->AddFile(swInfo.fnDestinationDirectory.GetPath());\r
+ objFile->AddFile(objFile->szTempDir);\r
}\r
\r
if (nMode == 4)\r
\r
// DnD開始。\r
wxDropSource dropSource(* objFile, this);\r
- wxDragResult drResult = dropSource.DoDragDrop(wxDrag_DefaultMove);\r
+ wxDragResult drResult = dropSource.DoDragDrop();\r
if (drResult != wxDragCancel && drResult != wxDragNone && drResult != wxDragMove)\r
{\r
#ifdef __LINUX__\r
#endif\r
}\r
this->SetDropTarget(new myFileDropTarget(this));\r
+\r
+ // ディレクトリDnDのときは、先にディレクトリの中のファイルを消しておく。\r
+ if (nMode == 3)\r
+ {\r
+ for (size_t i = 0; i < asFiles.GetCount(); i++)\r
+ {\r
+ ::wxRemoveFile(asFiles[i]);\r
+ }\r
+ }\r
+\r
delete objFile;\r
}\r
}\r
// 全ファイル削除は危険ではないかと。\r
if (this->list_ctrl->GetSelectedItemCount() == 0)\r
{\r
+ // wxのバグで自動では無効化できないので、実行しようとしたときに無効化する。\r
+ SetMenuToolState("Arc_Delete", false);\r
return;\r
}\r
\r
{\r
if (this->list_ctrl->GetSelectedItemCount() == 0)\r
{\r
+ // wxのバグで自動では無効化できないので、実行しようとしたときに無効化する。\r
+ this->menubar->Enable(XRCID("Exe_Copy"), false);\r
return;\r
}\r
\r
\r
// ListView\r
\r
+void MainFrame::OnListItemSelect(wxListEvent&)\r
+{\r
+ // ファイルに対する動作の設定。但し、選択解除時はwxのバグで呼び出されない。\r
+ bool fEnable = this->list_ctrl->GetSelectedItemCount() > 0;\r
+ SetMenuToolState("Arc_Delete", fEnable && (this->aiArchive.fiInfo.eSupportedCommand & TPI_COMMAND_DELETE) == TPI_COMMAND_DELETE && this->aiArchive.fiInfo.fArchive);\r
+ this->menubar->Enable(XRCID("Exe_Copy"), fEnable);\r
+}\r
+\r
void MainFrame::OnListItemDClick(wxListEvent&)\r
{\r
wxCommandEvent e;\r