::wxXmlResource::Get()->LoadDialog(this, this->GetParent(), wxT("dlg_process"));\r
g_procDlg = this;\r
this->hParent = parent;\r
-#ifdef __WINDOWS__\r
- this->hTBWnd = parent->IsShown() ? parent->GetHandle() : this->GetHandle();\r
- ((MainFrame *) this->hParent)->list_ctrl->Freeze();\r
-#endif\r
+ this->InitDialog();\r
}\r
\r
ProcessDialog::~ProcessDialog()\r
{\r
-#ifdef __WINDOWS__\r
- ((MainFrame *) this->hParent)->list_ctrl->Thaw();\r
+ // ウインドウの機能を有効化。\r
+ MainFrame * frm_main = (MainFrame *) this->hParent;\r
+ frm_main->tree_ctrl->Thaw();\r
+ frm_main->list_ctrl->Thaw();\r
+ frm_main->menubar->EnableTop(0, true);\r
+ frm_main->menubar->EnableTop(1, true);\r
+ frm_main->menubar->EnableTop(2, true);\r
+ frm_main->toolbar->Enable();\r
+\r
+ // 書庫を開く途中に中断した場合、書庫を閉じる処理を行う。\r
+ if (this->fOpen && this->fCancel)\r
+ {\r
+ wxCommandEvent e;\r
+ frm_main->OnArcClose(e);\r
+ }\r
\r
+#ifdef __WINDOWS__\r
if (this->tlTaskbar != NULL)\r
{\r
this->tlTaskbar->SetProgressState(this->hTBWnd, TBPF_NOPROGRESS);\r
this->tlTaskbar->Release();\r
}\r
#endif\r
+ ((MainFrame *) this->hParent)->gFrame->Show(false);\r
g_procDlg = NULL;\r
}\r
\r
piInfo.fiInfo.nUnpackedSize = this->nFileCount;\r
this->CallbackProc(TPI_NOTIFY_COMMON, & piInfo);\r
\r
+ // ウインドウの機能を無効化。\r
+ MainFrame * frm_main = (MainFrame *) this->hParent;\r
+ frm_main->tree_ctrl->Freeze();\r
+ frm_main->list_ctrl->Freeze();\r
+ frm_main->menubar->EnableTop(0, false);\r
+ frm_main->menubar->EnableTop(1, false);\r
+ frm_main->menubar->EnableTop(2, false);\r
+ frm_main->toolbar->Enable(false);\r
#ifdef __WINDOWS__\r
// タスクバー。\r
+ this->hTBWnd = this->hParent->GetHandle();\r
+\r
::CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER, IID_ITaskbarList3, (void **) & this->tlTaskbar);\r
if (this->tlTaskbar != NULL)\r
{\r
case TPI_STATUS_INPROCESS:\r
if (sw.Time() > 500)\r
{\r
- sw.Start();\r
- this->ebSource->ChangeValue(piInfo->fiInfo.fnFileName.GetFullPath());\r
- this->ebTarget->ChangeValue(piInfo->fnDestination.GetFullPath());\r
- if (piInfo->fiInfo.nUnpackedSize > 10000)\r
+ if (this->IsShownOnScreen())\r
+ {\r
+ sw.Start();\r
+ this->ebSource->ChangeValue(piInfo->fiInfo.fnFileName.GetFullPath());\r
+ this->ebTarget->ChangeValue(piInfo->fnDestination.GetFullPath());\r
+ if (piInfo->fiInfo.nUnpackedSize > 10000)\r
+ {\r
+ this->gFile->SetValue(piInfo->nProcessedSize);\r
+ }\r
+ this->gArchive->SetValue(s_nProcess);\r
+ this->Update();\r
+ ::wxSafeYield(this, true);\r
+ }\r
+ else\r
{\r
- this->gFile->SetValue(piInfo->nProcessedSize);\r
+ ::wxSafeYield(this->hParent, true);\r
}\r
- this->gArchive->SetValue(s_nProcess);\r
- this->Update();\r
- ::wxSafeYield(this, true);\r
+ ((MainFrame *) this->hParent)->gFrame->SetValue(s_nProcess);\r
}\r
#ifdef __WINDOWS__\r
if (this->tlTaskbar != NULL)\r
case 0x1000: // 初期設定。\r
this->ebSource->ChangeValue(piInfo->fiInfo.fnFileName.GetFullPath());\r
this->Update();\r
+ ((MainFrame *) this->hParent)->gFrame->Show();\r
case 0x1001: // 閲覧時は最初にファイル数が分からないので、ここで設定。\r
this->gArchive->SetRange(piInfo->fiInfo.nUnpackedSize);\r
- this->gArchive->SetValue(0);\r
+ ((MainFrame *) this->hParent)->gFrame->SetRange(piInfo->fiInfo.nUnpackedSize);\r
s_nProcess = 0;\r
#ifdef __WINDOWS__\r
s_nFileCount = piInfo->fiInfo.nUnpackedSize;\r
#endif\r
sw.Start();\r
+ if (piInfo->eStatus == 0x1001)\r
+ {\r
+ this->fOpen = true;\r
+ }\r
break;\r
case 0x1002: // 各ファイルの処理を開始。\r
if (sw.Time() > 500)\r
{\r
- sw.Start();\r
- this->ebTarget->ChangeValue(piInfo->fiInfo.fnFileName.GetFullPath());\r
- this->gArchive->SetValue(piInfo->nProcessedSize);\r
- this->Update();\r
- ::wxSafeYield(this, true);\r
+ if (this->IsShownOnScreen())\r
+ {\r
+ sw.Start();\r
+ this->ebTarget->ChangeValue(piInfo->fiInfo.fnFileName.GetFullPath());\r
+ this->gArchive->SetValue(piInfo->nProcessedSize);\r
+ this->Update();\r
+ ::wxSafeYield(this, true);\r
+ }\r
+ ::wxSafeYield(this->hParent, true);\r
}\r
+ ((MainFrame *) this->hParent)->gFrame->SetValue(piInfo->nProcessedSize);\r
#ifdef __WINDOWS__\r
if (this->tlTaskbar != NULL)\r
{\r
// MainFrame\r
//******************************************************************************\r
\r
-MainFrame::MainFrame(): wxFrame()\r
+MainFrame::MainFrame(): wxFrame(), gFrame(NULL)\r
{\r
}\r
\r
}\r
\r
wxCommandEvent e;\r
+ delete this->gFrame;\r
this->Show(false);\r
this->OnArcClose(e);\r
}\r
//******************************************************************************\r
\r
BEGIN_EVENT_TABLE(MainFrame, wxFrame)\r
- EVT_INIT_DIALOG( MainFrame::OnInit)\r
+ EVT_INIT_DIALOG(MainFrame::OnInit)\r
+ EVT_SIZE( MainFrame::OnSize)\r
+ EVT_CLOSE( MainFrame::OnClose)\r
// Menu\r
EVT_MENU(XRCID("Arc_Create"), MainFrame::OnArcCreate)\r
EVT_MENU(XRCID("Arc_Open"), MainFrame::OnArcOpen)\r
fShow = this->conf.ReadId(CONF_WINDOW_TOOLBAR, true);\r
this->menubar->Check(XRCID("Exe_View_ToolBar"), fShow);\r
this->toolbar->Show(fShow);\r
+\r
+ // ステータスバー上にプログレスバーを作成。\r
+ this->gFrame = new wxGauge(this, -1, 0, wxPoint(0, 0), wxSize(200, 10));\r
+ this->gFrame->Show(false);\r
+}\r
+\r
+void MainFrame::OnClose(wxCloseEvent& e)\r
+{\r
+ if (e.CanVeto() && g_procDlg != NULL)\r
+ {\r
+ g_procDlg->OnClose(e);\r
+ e.Veto();\r
+ }\r
+ else\r
+ {\r
+ this->Destroy();\r
+ }\r
+}\r
+\r
+void MainFrame::OnSize(wxSizeEvent& e)\r
+{\r
+ // ウインドウの内容の位置を変更。\r
+ if (this->window_splitter != NULL)\r
+ {\r
+ this->window_splitter->SetSize(this->GetClientSize());\r
+ }\r
+\r
+ // プログレスバーの位置を変更。\r
+ if (this->gFrame != NULL)\r
+ {\r
+ wxPoint p = this->statusbar->GetPosition();\r
+ wxSize s = this->GetSize();\r
+ p.x += s.GetWidth() - 230;\r
+ p.y += 10;\r
+ this->gFrame->SetPosition(p);\r
+ }\r
+ e.Skip();\r
}\r
\r
// MenuBar\r
// 処理を行う。\r
{\r
ProcessDialog procDlg(this, mkDlg.files.GetCount());\r
- procDlg.Show(true);\r
-\r
tpi.Command(TPI_COMMAND_CREATE, & swInfo, this->fnArchive.GetFullPath(), mkDlg.files);\r
procDlg.Show(false);\r
if (this->ErrorCheck(tpi.nErrorCode) != TPI_ERROR_SUCCESS)\r
void MainFrame::OnArcOpen(wxCommandEvent& e)\r
{\r
// モード取得。通常は0, それ以外で開く場合は1, ファイルDnDなら2。\r
- int nMode = e.GetInt() == 2 ? 2 : e.GetId() == XRCID("Arc_Open") ? 0 : 1;\r
+ int nMode = e.GetInt();\r
\r
// 書庫を選択。\r
if (nMode == 0)\r
this->fnArchive = wxFileName(fd.GetPath());\r
}\r
\r
- // 進捗ダイアログ表示。\r
+ // TPIを読み込み。\r
ProcessDialog procDlg(this);\r
- procDlg.Show(true);\r
-\r
- // DnD以外で書庫を開く場合、TPIを読み込み。\r
TPI_PROCESSINFO piInfo;\r
piInfo.fiInfo.nUnpackedSize = 0;\r
if (! this->LoadTPI(this->fnArchive.GetFullPath(), & piInfo.fiInfo.nUnpackedSize))\r
{\r
- procDlg.Show(false);\r
if (nMode == 2)\r
{\r
// DnDの場合は書庫を作成する。\r
return;\r
}\r
\r
+ // コマンドラインから書庫を開く場合にはウインドウが表示されていないので表示。\r
+ if (! this->IsShown())\r
+ {\r
+ this->Show();\r
+ }\r
+\r
piInfo.eMessage = TPI_MESSAGE_STATUS;\r
piInfo.eStatus = 0x1001;\r
if (this->ErrorCheck(procDlg.CallbackProc(TPI_NOTIFY_COMMON, & piInfo), wxT("Callback")) == TPI_CALLBACK_CANCEL)\r
{\r
procDlg.Show(false);\r
tpi.CloseArchive();\r
- wxCommandEvent e;\r
- this->OnArcClose(e);\r
+ // OnArcClose処理はProcessDialogのデストラクタで行う。\r
+ // this->OnArcClose(e);\r
return;\r
}\r
\r
{\r
procDlg.Show(false);\r
tpi.CloseArchive();\r
- wxCommandEvent e;\r
- this->OnArcClose(e);\r
+ // OnArcClose処理はProcessDialogのデストラクタで行う。\r
+ // this->OnArcClose(e);\r
return;\r
}\r
\r
\r
// 以下、UI処理。\r
this->fileinfo.Shrink();\r
- this->tree_ctrl->Freeze();\r
if (this->fileinfo.Count() < 10000)\r
{\r
this->tree_ctrl->ExpandAll();\r
// ツリービューの位置合わせ。\r
this->tree_ctrl->ScrollTo(idArchive);\r
this->tree_ctrl->SetScrollPos(wxHORIZONTAL, 0);\r
- this->tree_ctrl->Thaw();\r
this->list_ctrl->atDangerItem.SetTextColour(* wxRED);\r
this->list_ctrl->atEncryptedItem.SetTextColour(wxColour(wxT("forest green")));\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_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_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_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
// 処理を行う。\r
{\r
ProcessDialog procDlg(this, mkDlg.files.GetCount(), this->szPassword);\r
- procDlg.Show(true);\r
-\r
tpi.Command(TPI_COMMAND_ADD, & swInfo, this->fnArchive.GetFullPath(), mkDlg.files);\r
this->ErrorCheck(tpi.nErrorCode);\r
procDlg.Show(false);\r
files.Add(fd.GetPath());\r
\r
ProcessDialog procDlg(this);\r
- procDlg.Show(true);\r
tpi.Command(swInfo.fMakeSFX ? TPI_COMMAND_SFX : TPI_COMMAND_UNSFX, & swInfo, this->fnArchive.GetFullPath(), files);\r
this->ErrorCheck(tpi.nErrorCode);\r
procDlg.Show(false);\r
// 処理を行う。\r
{\r
ProcessDialog procDlg(this, mkDlg.files.GetCount(), this->szPassword);\r
- procDlg.Show(true);\r
-\r
tpi.Command(TPI_COMMAND_EXTRACT, & swInfo, this->fnArchive.GetFullPath(), mkDlg.files);\r
this->ErrorCheck(tpi.nErrorCode);\r
procDlg.Show(false);\r
{\r
wxArrayString asFiles = MakeTargetFileList(this);\r
ProcessDialog procDlg(this, asFiles.GetCount(), this->szPassword);\r
- procDlg.Show(true);\r
-\r
TPI_SWITCHES swInfo;\r
swInfo.szPassword = this->szPassword;\r
tpi.Command(TPI_COMMAND_DELETE, & swInfo, this->fnArchive.GetFullPath(), asFiles);\r
// 処理を行う。\r
wxArrayString asFiles = MakeTargetFileList(this);\r
ProcessDialog procDlg(this, asFiles.GetCount(), this->szPassword);\r
- procDlg.Show(true);\r
-\r
TPI_SWITCHES swInfo;\r
swInfo.szPassword = this->szPassword;\r
tpi.Command(TPI_COMMAND_TEST, & swInfo, this->fnArchive.GetFullPath(), asFiles);\r
// 処理を行う。\r
wxArrayString asFiles = MakeTargetFileList(this);\r
ProcessDialog procDlg(this, asFiles.GetCount(), this->szPassword);\r
- procDlg.Show(true);\r
-\r
TPI_SWITCHES swInfo;\r
swInfo.szPassword = this->szPassword;\r
tpi.Command(TPI_COMMAND_REPAIR, & swInfo, this->fnArchive.GetFullPath(), asFiles);\r