OSDN Git Service

AppliStation-GUI,進捗ダイアログでログ表示のテキストボックスが自動でスクロールするように
[applistation/AppliStation.git] / AppliStation / AppliStation.Util / ExecutionProgressViewer.cs
index de87382..b0ef4fb 100644 (file)
@@ -36,6 +36,10 @@ namespace AppliStation.Util
                        // The InitializeComponent() call is required for Windows Forms designer support.\r
                        //\r
                        InitializeComponent();\r
+                       \r
+                       this.Icon = Icon.ExtractAssociatedIcon(Application.ExecutablePath);\r
+                       toolTip.SetToolTip(autoCloseCheckBox,\r
+                                          string.Format("エラーがなく正常に終了した場合、{0}秒後に自動的にこのダイアログを閉じます", autoCloseTimer.Interval/1000));\r
                }\r
                                \r
                private void onDownloadEvent(object sender, DownloadEventArgs a)\r
@@ -85,13 +89,14 @@ namespace AppliStation.Util
                {\r
                        NaGetTaskSet taskSet = (NaGetTaskSet) sender;\r
                        \r
+                       bool isCursorPositionLast = logBox.SelectionStart >= logBox.TextLength-1;\r
+                       \r
                        if (e.TaskProgressPercent >= 0) {\r
                                progressBar.Value = (int) e.TaskProgressPercent;\r
                                progressBar.Style = ProgressBarStyle.Continuous;\r
                        } else {\r
                                progressBar.Style = ProgressBarStyle.Marquee;\r
                        }\r
-                       progressLabel.Text = e.TaskMessage ?? string.Empty;\r
                        \r
                        cancelButton.Enabled = taskSet.Running && taskSet.Cancelable;\r
                        \r
@@ -101,10 +106,13 @@ namespace AppliStation.Util
                                        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
@@ -126,6 +134,7 @@ namespace AppliStation.Util
                                        \r
                                        NativeMethods.ProgressBar_SetState(progressBar, 2); // VistaProgress色:エラー\r
                                        \r
+                                       autoCloseCheckBox.Enabled = false;\r
                                        okButton.Enabled = true;\r
                                        cancelButton.Enabled = false;\r
                                        break;\r
@@ -135,7 +144,9 @@ namespace AppliStation.Util
                                        logBox.SelectionColor = logBox.ForeColor;\r
                                        \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
@@ -144,9 +155,16 @@ namespace AppliStation.Util
                                        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
+                       if (isCursorPositionLast && logBox.TextLength > 0) {\r
+                               logBox.Select(logBox.TextLength-1, 0);\r
+                       }\r
+                       \r
                        if (taskSet.Done) {\r
                                if ((ActionOnDone & ActionOnDoneFlags.FlashWindow) != 0) {\r
                                        NativeMethods.Form_FlashWindow(this,\r
@@ -211,6 +229,8 @@ namespace AppliStation.Util
                public void StartTaskSet()\r
                {\r
                        tasksetRunningThread = new Thread(taskSet.Run);\r
+                       // スレッドをSTAにしないとCOMアクセスできず、ウイルススキャンができない。\r
+                       tasksetRunningThread.SetApartmentState(ApartmentState.STA);\r
                        tasksetRunningThread.Start();\r
                }\r
                \r
@@ -235,6 +255,7 @@ 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
@@ -248,5 +269,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