OSDN Git Service

AppliStation-GUI,UserPrefForm.csへのコメント追加
[applistation/AppliStation.git] / AppliStation / AppliStation.Util / ExecutionProgressViewer.cs
index ea596d6..fa6e0ea 100644 (file)
@@ -1,4 +1,4 @@
-using System;\r
+using System;\r
 using System.Drawing;\r
 using System.Windows.Forms;\r
 using System.Threading;\r
@@ -14,12 +14,10 @@ namespace AppliStation.Util
        {\r
                private NaGetTaskSet taskSet;\r
                \r
-               private Downloader downloader;\r
-               \r
                private Thread tasksetRunningThread = null;\r
                \r
                /// <summary>\r
-               /// \8fI\97¹\8e\9e\82É\89½\82ð\8ds\82¤\82©\82Ì\83t\83\89\83O\r
+               /// 終了時に何を行うかのフラグ\r
                /// </summary>\r
                public enum ActionOnDoneFlags {\r
                        None = 0,\r
@@ -28,14 +26,10 @@ namespace AppliStation.Util
                }\r
                \r
                /// <summary>\r
-               /// \8fI\97¹\8e\9e\82É\89½\82ð\8ds\82¤\82©\r
+               /// 終了時に何を行うか\r
                /// </summary>\r
                public ActionOnDoneFlags ActionOnDone = ActionOnDoneFlags.FlashWindow;\r
-               \r
-               public Downloader Downloader {\r
-                       get { return downloader; }\r
-               }\r
-               \r
+                               \r
                public ExecutionProgressViewer()\r
                {\r
                        //\r
@@ -43,18 +37,19 @@ namespace AppliStation.Util
                        //\r
                        InitializeComponent();\r
                        \r
-                       downloader = new Downloader();\r
-                       downloader.DownloadEventRaised += delegate(object sender, DownloadEventArgs e) {\r
-                               if (InvokeRequired) {\r
-                                       Invoke(new EventHandler<DownloadEventArgs>(onDownloadEvent), sender, e);\r
-                               } else {\r
-                                       onDownloadEvent(sender, e);\r
-                               }\r
-                       };\r
+                       this.Icon = Icon.ExtractAssociatedIcon(Application.ExecutablePath);\r
+                       toolTip.SetToolTip(autoCloseCheckBox,\r
+                                          string.Format("エラーがなく正常に終了した場合、{0}秒後に自動的にこのダイアログを閉じます", autoCloseTimer.Interval/1000));\r
                }\r
-               \r
+                               \r
                private void onDownloadEvent(object sender, DownloadEventArgs a)\r
                {\r
+                       if (InvokeRequired) {\r
+                               Invoke(new EventHandler<DownloadEventArgs>(onDownloadEvent), sender, a);\r
+                               return;\r
+                       }\r
+                       \r
+                       \r
                        if (a.TaskProgressPercent >= 0) {\r
                                progressBarSub.Value = (int) a.TaskProgressPercent;\r
                                progressBarSub.Style = ProgressBarStyle.Continuous;\r
@@ -82,13 +77,13 @@ namespace AppliStation.Util
                                        progressSubLabel.Visible = false;\r
                                        \r
                                        logBox.SelectionColor = System.Drawing.Color.Red;\r
-                                       logBox.AppendText("   [\83G\83\89\81[] " + a.TaskMessage + System.Environment.NewLine);\r
+                                       logBox.AppendText("   [エラー] " + a.TaskMessage + System.Environment.NewLine);\r
                                        logBox.SelectionColor = logBox.ForeColor;\r
                                        break;\r
                        }\r
                }\r
                \r
-               #region NaGetTaskSet\8aÖ\98A\r
+               #region NaGetTaskSet関連\r
                \r
                private void onTaskSetRaised(object sender, NaGetTaskSetEventArgs e)\r
                {\r
@@ -100,29 +95,31 @@ namespace AppliStation.Util
                        } else {\r
                                progressBar.Style = ProgressBarStyle.Marquee;\r
                        }\r
-                       progressLabel.Text = e.TaskMessage ?? string.Empty;\r
                        \r
                        cancelButton.Enabled = taskSet.Running && taskSet.Cancelable;\r
                        \r
                        switch (e.Type) {\r
                                case NaGetTaskSetEventType.COMPLETED:\r
-                                       logBox.AppendText("\8a®\97¹." + System.Environment.NewLine);\r
+                                       logBox.AppendText("完了." + System.Environment.NewLine);\r
                                        if (taskSet.Done) {\r
                                                okButton.Enabled = true;\r
                                                cancelButton.Enabled = false;\r
+                                               \r
+                                               // タスクが完了したらしばらく待って閉じるために、自動クローズタイマーを起動する\r
+                                               autoCloseTimer.Start();\r
                                        }\r
                                        break;\r
                                case NaGetTaskSetEventType.STARTED_TASKSET:\r
-                                       subtitleLabel.Text = taskSet.TaskSetNames[taskSet.CurrentTaskSetIndex];\r
+                                       progressLabel.Text = taskSet.TaskSetNames[taskSet.CurrentTaskSetIndex];\r
                                        logBox.AppendText("  " + e.TaskMessage + System.Environment.NewLine);\r
                                        break;\r
                                case NaGetTaskSetEventType.COMPLETED_TASKSET:\r
                                        if (progressBarSub.Visible) progressBarSub.Hide();\r
                                        if (progressSubLabel.Visible) progressSubLabel.Hide();\r
                                        \r
-                                       NativeMethods.ProgressBar_SetState(progressBar, 1); // VistaProgress\90F\81F\83m\81[\83}\83\8b\r
+                                       NativeMethods.ProgressBar_SetState(progressBar, 1); // VistaProgress色:ノーマル\r
                                        \r
-                                       logBox.AppendText(string.Format(" ... \8a®\97¹. [{0}%]", (int) e.TaskProgressPercent));\r
+                                       logBox.AppendText(string.Format(" ... 完了. [{0}%]", (int) e.TaskProgressPercent));\r
                                        logBox.AppendText(System.Environment.NewLine);\r
                                        break;\r
                                case NaGetTaskSetEventType.INFO:\r
@@ -130,11 +127,12 @@ namespace AppliStation.Util
                                        break;\r
                                case NaGetTaskSetEventType.ERROR:\r
                                        logBox.SelectionColor = System.Drawing.Color.Red;\r
-                                       logBox.AppendText("  [\83G\83\89\81[] " + e.TaskMessage + System.Environment.NewLine);\r
+                                       logBox.AppendText("  [エラー] " + e.TaskMessage + System.Environment.NewLine);\r
                                        logBox.SelectionColor = logBox.ForeColor;\r
                                        \r
-                                       NativeMethods.ProgressBar_SetState(progressBar, 2); // VistaProgress\90F\81F\83G\83\89\81[\r
+                                       NativeMethods.ProgressBar_SetState(progressBar, 2); // VistaProgress色:エラー\r
                                        \r
+                                       autoCloseCheckBox.Enabled = false;\r
                                        okButton.Enabled = true;\r
                                        cancelButton.Enabled = false;\r
                                        break;\r
@@ -143,16 +141,21 @@ namespace AppliStation.Util
                                        logBox.AppendText(e.TaskMessage + System.Environment.NewLine);\r
                                        logBox.SelectionColor = logBox.ForeColor;\r
                                        \r
-                                       NativeMethods.ProgressBar_SetState(progressBar, 1); // VistaProgress\90F\81F\92\86\92f\r
+                                       NativeMethods.ProgressBar_SetState(progressBar, 1); // VistaProgress色:中断\r
+                                       NativeMethods.ProgressBar_SetState(progressBarSub, 1); // VistaProgress色:中断\r
                                        \r
+                                       autoCloseCheckBox.Enabled = false;\r
                                        okButton.Enabled = true;\r
                                        cancelButton.Enabled = false;\r
                                        break;\r
                                case NaGetTaskSetEventType.WARNING:\r
                                        logBox.SelectionColor = System.Drawing.Color.Red;\r
-                                       logBox.AppendText("  [\83G\83\89\81[] " + e.TaskMessage + System.Environment.NewLine);\r
+                                       logBox.AppendText("  [エラー] " + e.TaskMessage + System.Environment.NewLine);\r
                                        logBox.SelectionColor = logBox.ForeColor;\r
                                        \r
+                                       NativeMethods.ProgressBar_SetState(progressBar, 2); // VistaProgress色:エラー\r
+                                       \r
+                                       autoCloseCheckBox.Enabled = false;\r
                                        break;\r
                        }\r
                        \r
@@ -170,6 +173,33 @@ namespace AppliStation.Util
                        }\r
                }\r
                \r
+               private NaGetTaskQueryResult onTaskQueryRaised(object sender, NaGetTaskQueryArgs e)\r
+               {\r
+                       MessageBoxButtons buttons = MessageBoxButtons.OKCancel;\r
+                       if (e.SelectionFlag == (NaGetTaskQueryResult.CONTINUE | NaGetTaskQueryResult.RETRY | NaGetTaskQueryResult.CANCEL)) {\r
+                               buttons = MessageBoxButtons.AbortRetryIgnore;\r
+                       } else if (e.SelectionFlag == (NaGetTaskQueryResult.RETRY | NaGetTaskQueryResult.CANCEL)) {\r
+                               buttons = MessageBoxButtons.RetryCancel;\r
+                       } else if (e.SelectionFlag == NaGetTaskQueryResult.CONTINUE) {\r
+                               buttons = MessageBoxButtons.OK;\r
+                       }\r
+                       \r
+                       DialogResult result = MessageBox.Show(e.Message, this.Text, buttons);\r
+                       \r
+                       switch (result) {\r
+                               case DialogResult.OK:\r
+                               case DialogResult.Ignore:\r
+                                       return NaGetTaskQueryResult.CONTINUE;\r
+                               case DialogResult.Cancel:\r
+                               case DialogResult.Abort:\r
+                                       return NaGetTaskQueryResult.CANCEL;\r
+                               case DialogResult.Retry:\r
+                                       return NaGetTaskQueryResult.RETRY;\r
+                               default:\r
+                                       return NaGetTaskQueryResult.CANCELED_AUTOMATICALLY;\r
+                       }\r
+               }\r
+               \r
                public void SetTaskSet(NaGetTaskSet taskSet)\r
                {\r
                        this.taskSet = taskSet;\r
@@ -181,11 +211,20 @@ namespace AppliStation.Util
                                        onTaskSetRaised(taskSet, e);\r
                                }\r
                        };\r
+                       \r
+                       System.Reflection.PropertyInfo fDownloader = taskSet.GetType().GetProperty("Downloader");\r
+                       if (fDownloader != null && (fDownloader.PropertyType == typeof(Downloader))) {\r
+                               ((Downloader) fDownloader.GetValue(taskSet, null)).DownloadEventRaised += onDownloadEvent;\r
+                       }\r
+                       \r
+                       taskSet.TaskQueryRaised += onTaskQueryRaised;\r
                }\r
 \r
                public void StartTaskSet()\r
                {\r
                        tasksetRunningThread = new Thread(taskSet.Run);\r
+                       // スレッドをSTAにしないとCOMアクセスできず、ウイルススキャンができない。\r
+                       tasksetRunningThread.SetApartmentState(ApartmentState.STA);\r
                        tasksetRunningThread.Start();\r
                }\r
                \r
@@ -210,10 +249,11 @@ namespace AppliStation.Util
                \r
                void CancelButtonClickConcrete(object sender, EventArgs e)\r
                {\r
+                       autoCloseCheckBox.Enabled = false;\r
                        if (taskSet != null && taskSet.Running && taskSet.Cancelable) {\r
                                cancelButton.Enabled = false;\r
                                \r
-                               NativeMethods.ProgressBar_SetState(progressBar, 3); // VistaProgress\90F\81F\92\86\92f\r
+                               NativeMethods.ProgressBar_SetState(progressBar, 3); // VistaProgress色:中断\r
                                \r
                                taskSet.Cancel();\r
                        }\r
@@ -223,5 +263,32 @@ namespace AppliStation.Util
                {\r
                        this.BringToFront();\r
                }\r
+               \r
+               void ExecutionProgressViewerFormClosed(object sender, FormClosedEventArgs e)\r
+               {\r
+                       autoCloseTimer.Enabled = false;\r
+               }\r
+               \r
+               void AutoCloseTimerTick(object sender, EventArgs e)\r
+               {\r
+                       autoCloseTimer.Stop();\r
+                       \r
+                       if (InvokeRequired) {\r
+                               Invoke(new EventHandler(AutoCloseTimerTickConcrete), sender, e);\r
+                       } else {\r
+                               AutoCloseTimerTickConcrete(sender,e);\r
+                       }\r
+               }\r
+               \r
+               void AutoCloseTimerTickConcrete(object sender, EventArgs e)\r
+               {\r
+                       // autoCloseCheckBoxが有効(正常終了)かつチェックのときに限り、OKボタンを自動的にクリック\r
+                       if (autoCloseCheckBox.Enabled && autoCloseCheckBox.Checked && okButton.Enabled) {\r
+                               OkButtonClick(sender, e);\r
+                       } else if (! autoCloseCheckBox.Enabled) {\r
+                               // タイマーの時間がすぎて、そのとき自動で閉じないようにしていしてあるならば、手動で閉じるように\r
+                               autoCloseCheckBox.Enabled = false;\r
+                       }\r
+               }\r
        }\r
 }\r