OSDN Git Service

各種の処理の際に進捗ダイアログを初期状態で表示せず、メインウインドウの進捗バーで通知するよう変更。
authorsirakaba <sirakaba@9df91469-1e22-0410-86e7-ea8537beb833>
Mon, 3 Oct 2011 13:20:53 +0000 (13:20 +0000)
committersirakaba <sirakaba@9df91469-1e22-0410-86e7-ea8537beb833>
Mon, 3 Oct 2011 13:20:53 +0000 (13:20 +0000)
git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/tpi/tpi@572 9df91469-1e22-0410-86e7-ea8537beb833

doc/history.html
src/lychee/dlg_process.cpp
src/lychee/dlg_process.h
src/lychee/frm_main.cpp
src/lychee/frm_main.h
src/lychee/lychee.cpp

index f9d5d12..92fd22a 100644 (file)
@@ -39,6 +39,7 @@
      <li class="chg">書庫を開く以外のコマンドライン動作を削除。</li>\r
      <li class="chg">終了時の処理を改善。</li>\r
      <li class="chg">展開操作に対してショートカットキーCtrl+Xを割り当てた。</li>\r
+     <li class="chg">各種の処理の際に進捗ダイアログを初期状態で表示せず、メインウインドウの進捗バーで通知するよう変更。</li>\r
      <li class="fix">コマンドラインから書庫を開く際、エラーとなった場合にLycheeのウインドウが一瞬表示されてしまっていたのを修正。</li>\r
      <li class="fix">書庫を作成する際、作成に失敗していても処理後に書庫を開こうとしていたバグを修正。</li>\r
      <li class="fix">作成できる書庫形式が一つもない場合に、書庫を作成しようとすると不正終了していたバグを再修正。</li>\r
index 568db33..eae8d1e 100644 (file)
@@ -37,23 +37,35 @@ ProcessDialog::ProcessDialog(wxWindow * parent, wxULongLong_t n, wxString szPass
        ::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
@@ -89,8 +101,18 @@ void ProcessDialog::OnInit(wxInitDialogEvent &)
        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
@@ -144,16 +166,24 @@ int ProcessDialog::CallbackProc(unsigned int _uMsg, void * _pStructure)
                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
@@ -169,24 +199,34 @@ int ProcessDialog::CallbackProc(unsigned int _uMsg, void * _pStructure)
                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
index a936556..8ba113b 100644 (file)
@@ -40,7 +40,7 @@ public:
        DECLARE_EVENT_TABLE()\r
 \r
 private:\r
-       bool fCancel;\r
+       bool fCancel, fOpen;\r
        int nOverwriteMode;\r
        wxFileName fnFormer;\r
        wxTextCtrl* ebTarget;\r
@@ -54,6 +54,8 @@ private:
 #endif\r
 };\r
 \r
+extern ProcessDialog * g_procDlg;\r
+\r
 class OverwriteDialog: public wxDialog {\r
 public:\r
     void OnInit(wxInitDialogEvent &);\r
index cbdcffc..f50232c 100644 (file)
@@ -45,7 +45,7 @@ bool g_fSortAscend;
 // MainFrame\r
 //******************************************************************************\r
 \r
-MainFrame::MainFrame(): wxFrame()\r
+MainFrame::MainFrame(): wxFrame(), gFrame(NULL)\r
 {\r
 }\r
 \r
@@ -88,6 +88,7 @@ MainFrame::~MainFrame()
        }\r
 \r
        wxCommandEvent e;\r
+       delete this->gFrame;\r
        this->Show(false);\r
        this->OnArcClose(e);\r
 }\r
@@ -97,7 +98,9 @@ MainFrame::~MainFrame()
 //******************************************************************************\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
@@ -194,6 +197,43 @@ void MainFrame::OnInit(wxInitDialogEvent&)
        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
@@ -275,8 +315,6 @@ void MainFrame::OnArcCreate(wxCommandEvent& e)
        // 処理を行う。\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
@@ -308,7 +346,7 @@ void MainFrame::OnArcCreate(wxCommandEvent& e)
 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
@@ -322,16 +360,12 @@ void MainFrame::OnArcOpen(wxCommandEvent& e)
                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
@@ -350,14 +384,20 @@ void MainFrame::OnArcOpen(wxCommandEvent& e)
                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
@@ -393,8 +433,8 @@ void MainFrame::OnArcOpen(wxCommandEvent& e)
                        {\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
@@ -496,7 +536,6 @@ void MainFrame::OnArcOpen(wxCommandEvent& e)
 \r
        // 以下、UI処理。\r
        this->fileinfo.Shrink();\r
-       this->tree_ctrl->Freeze();\r
        if (this->fileinfo.Count() < 10000)\r
        {\r
                this->tree_ctrl->ExpandAll();\r
@@ -511,7 +550,6 @@ void MainFrame::OnArcOpen(wxCommandEvent& e)
        // ツリービューの位置合わせ。\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
@@ -535,9 +573,9 @@ void MainFrame::OnArcOpen(wxCommandEvent& e)
 \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
@@ -677,8 +715,6 @@ void MainFrame::OnArcAdd(wxCommandEvent& e)
        // 処理を行う。\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
@@ -718,7 +754,6 @@ void MainFrame::OnArcConvert(wxCommandEvent& e)
        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
@@ -790,8 +825,6 @@ void MainFrame::OnArcExtract(wxCommandEvent& e)
        // 処理を行う。\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
@@ -929,8 +962,6 @@ void MainFrame::OnArcDelete(wxCommandEvent& e)
        {\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
@@ -947,8 +978,6 @@ void MainFrame::OnArcTest(wxCommandEvent&)
        // 処理を行う。\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
@@ -961,8 +990,6 @@ void MainFrame::OnArcRepair(wxCommandEvent&)
        // 処理を行う。\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
index 1974bdb..1696332 100644 (file)
@@ -31,9 +31,13 @@ WX_DECLARE_OBJARRAY(TPI_FILEINFO, ArrayTPI_FILEINFO);
 \r
 class MainFrame: public wxFrame {\r
 public:\r
-    wxTreeCtrl * tree_ctrl;\r
+    wxMenuBar * menubar;\r
+    wxToolBar * toolbar;\r
+\r
+       wxTreeCtrl * tree_ctrl;\r
     myListCtrl * list_ctrl;\r
     wxSplitterWindow * window_splitter;\r
+       wxGauge* gFrame;\r
        myConfig conf;\r
 \r
        TPIHandle tpi;\r
@@ -44,6 +48,8 @@ public:
 \r
     // Event handler.\r
     void OnInit(    wxInitDialogEvent&);\r
+    void OnClose(        wxCloseEvent&);\r
+    void OnSize(          wxSizeEvent&);\r
 \r
        void OnExit(       wxCommandEvent&);\r
     void OnArcCreate(  wxCommandEvent&);\r
@@ -84,8 +90,6 @@ public:
        ~MainFrame();\r
 \r
 protected:\r
-    wxMenuBar * menubar;\r
-    wxToolBar * toolbar;\r
     wxStatusBar * statusbar;\r
     wxTextCtrl * tcFilter;\r
 \r
index 0830b78..e5c3eec 100644 (file)
@@ -65,17 +65,15 @@ bool Lychee::OnInit()
        }\r
 \r
        // 書庫を開く。\r
-       wxCommandEvent e;\r
+       wxCommandEvent * e = new wxCommandEvent(wxEVT_COMMAND_MENU_SELECTED, XRCID("Arc_Open"));\r
+       e->SetInt(1);\r
        frm_main->fnArchive = wxFileName(wxString(this->argv[1]));\r
        frm_main->fnArchive.Normalize(wxPATH_NORM_DOTS | wxPATH_NORM_ABSOLUTE | wxPATH_NORM_LONG, szCwd);\r
-       frm_main->OnArcOpen(e);\r
-       // 開けなかった場合はウインドウを表示せず終了。\r
-       if (frm_main->tree_ctrl->GetCount() == 0)\r
-       {\r
-               return false;\r
-       }\r
-       frm_main->Show();\r
-       // スプリッター設定(OnInitでは効かないことがあるため)。\r
-       frm_main->window_splitter->SetSashPosition(frm_main->conf.ReadId(CONF_WINDOW_SPLITTER_POS, 200l));\r
+#if wxCHECK_VERSION(2, 9, 0)\r
+       frm_main->GetEventHandler()->QueueEvent(e);\r
+#else\r
+       frm_main->OnArcOpen(* e);\r
+       delete e;\r
+#endif\r
        return true;\r
 }\r