2 using System.Drawing;
\r
3 using System.Windows.Forms;
\r
4 using System.Threading;
\r
5 using NaGet.SubCommands;
\r
8 namespace AppliStation.Util
\r
11 /// Description of ExecutionProgressViewer.
\r
13 public partial class ExecutionProgressViewer : Form
\r
15 private NaGetTaskSet taskSet;
\r
17 private Thread tasksetRunningThread = null;
\r
22 private enum ActionOnDoneFlags {
\r
25 AutoCloseOnSuccess = 2,
\r
31 private ActionOnDoneFlags ActionOnDone = ActionOnDoneFlags.FlashWindow;
\r
33 public ExecutionProgressViewer()
\r
36 // The InitializeComponent() call is required for Windows Forms designer support.
\r
38 InitializeComponent();
\r
40 this.Icon = Icon.ExtractAssociatedIcon(Application.ExecutablePath);
\r
41 toolTip.SetToolTip(autoCloseCheckBox,
\r
42 string.Format("エラーがなく正常に終了した場合、{0}秒後に自動的にこのダイアログを閉じます", autoCloseTimer.Interval/1000));
\r
45 private void onDownloadEvent(object sender, DownloadEventArgs a)
\r
47 if (InvokeRequired) {
\r
48 Invoke(new EventHandler<DownloadEventArgs>(onDownloadEvent), sender, a);
\r
53 case DownloadEventType.INITED:
\r
54 case DownloadEventType.CONNECTED:
\r
55 progressSubLabel.Text = a.TaskMessage;
\r
57 progressBarSub.Visible = true;
\r
58 progressSubLabel.Visible = true;
\r
60 case DownloadEventType.DOWNLOADING:
\r
61 progressSubLabel.Text = a.TaskMessage;
\r
63 case DownloadEventType.COMPLETED:
\r
64 progressBarSub.Visible = false;
\r
65 progressSubLabel.Visible = false;
\r
67 case DownloadEventType.ERROR:
\r
68 progressBarSub.Visible = false;
\r
69 progressSubLabel.Visible = false;
\r
71 logBox.SelectionColor = System.Drawing.Color.Red;
\r
72 logBox.AppendText(" [エラー] " + a.TaskMessage + System.Environment.NewLine);
\r
73 logBox.SelectionColor = logBox.ForeColor;
\r
78 if (a.TaskProgressPercent >= 0) {
\r
79 progressBarSub.Value = (int) a.TaskProgressPercent;
\r
80 progressBarSub.Style = ProgressBarStyle.Continuous;
\r
82 progressBarSub.Style = ProgressBarStyle.Marquee;
\r
86 #region NaGetTaskSet関連
\r
88 private void onTaskSetRaised(object sender, NaGetTaskSetEventArgs e)
\r
90 NaGetTaskSet taskSet = (NaGetTaskSet) sender;
\r
91 NativeMethods.ProgressBarState progressState = NativeMethods.ProgressBarState.Normal;
\r
93 cancelButton.Enabled = taskSet.Running && taskSet.Cancelable;
\r
96 case NaGetTaskSetEventType.COMPLETED:
\r
97 logBox.AppendText("完了." + System.Environment.NewLine);
\r
99 okButton.Enabled = true;
\r
100 cancelButton.Enabled = false;
\r
102 // タスクが完了したらしばらく待って閉じるために、自動クローズタイマーを起動する
\r
103 autoCloseTimer.Start();
\r
106 case NaGetTaskSetEventType.STARTED_TASKSET:
\r
107 progressLabel.Text = taskSet.TaskSetNames[taskSet.CurrentTaskSetIndex];
\r
108 logBox.AppendText(" " + e.TaskMessage + System.Environment.NewLine);
\r
110 case NaGetTaskSetEventType.COMPLETED_TASKSET:
\r
111 if (progressBarSub.Visible) progressBarSub.Hide();
\r
112 if (progressSubLabel.Visible) progressSubLabel.Hide();
\r
114 progressState = NativeMethods.ProgressBarState.Normal;
\r
116 logBox.AppendText(string.Format(" ... 完了. [{0}%]", (int) e.TaskProgressPercent));
\r
117 logBox.AppendText(System.Environment.NewLine);
\r
119 case NaGetTaskSetEventType.INFO:
\r
120 logBox.AppendText(" " + e.TaskMessage + System.Environment.NewLine);
\r
122 case NaGetTaskSetEventType.ERROR:
\r
123 logBox.SelectionColor = System.Drawing.Color.Red;
\r
124 logBox.AppendText(" [エラー] " + e.TaskMessage + System.Environment.NewLine);
\r
125 logBox.SelectionColor = logBox.ForeColor;
\r
127 progressState = NativeMethods.ProgressBarState.Error;
\r
129 autoCloseCheckBox.Enabled = false;
\r
130 okButton.Enabled = true;
\r
131 cancelButton.Enabled = false;
\r
133 case NaGetTaskSetEventType.CANCELED:
\r
134 logBox.SelectionColor = System.Drawing.Color.Red;
\r
135 logBox.AppendText(e.TaskMessage + System.Environment.NewLine);
\r
136 logBox.SelectionColor = logBox.ForeColor;
\r
138 progressState = NativeMethods.ProgressBarState.Error;
\r
140 autoCloseCheckBox.Enabled = false;
\r
141 okButton.Enabled = true;
\r
142 cancelButton.Enabled = false;
\r
144 case NaGetTaskSetEventType.WARNING:
\r
145 logBox.SelectionColor = System.Drawing.Color.Red;
\r
146 logBox.AppendText(" [エラー] " + e.TaskMessage + System.Environment.NewLine);
\r
147 logBox.SelectionColor = logBox.ForeColor;
\r
149 progressState = NativeMethods.ProgressBarState.Error;
\r
151 autoCloseCheckBox.Enabled = false;
\r
155 // タスクセット全体の進捗をプログレスバーに表示する
\r
156 if (e.TaskProgressPercent >= 0) {
\r
157 progressBar.Value = (int) e.TaskProgressPercent;
\r
158 progressBar.Style = ProgressBarStyle.Continuous;
\r
160 progressBar.Style = ProgressBarStyle.Marquee;
\r
162 NativeMethods.ProgressBar_SetState(progressBar, progressState);
\r
163 NativeMethods.ProgressBar_SetState(progressBarSub, progressState);
\r
164 // タスクセット全体の進捗をタスクバーに表示する(Windows 7以降のみ)
\r
165 if (e.TaskProgressPercent >= 0 && e.TaskProgressPercent < 100) {
\r
166 NativeMethods.Form_SetTaskbarProgressParams(this, progressBar.Style, progressState, (ulong) e.TaskProgressPercent, 100);
\r
168 NativeMethods.Form_SetTaskbarProgressParams(this, progressBar.Style, progressState, 0, 0);
\r
171 logBox.ScrollToCaret();
\r
173 if (taskSet.Done) {
\r
174 if ((ActionOnDone & ActionOnDoneFlags.FlashWindow) != 0) {
\r
175 NativeMethods.Form_FlashWindow(this,
\r
176 NativeMethods.FlashFlag.All | NativeMethods.FlashFlag.TimerNoFG,
\r
179 if (okButton.Enabled && (ActionOnDone & ActionOnDoneFlags.AutoCloseOnSuccess) != 0) {
\r
180 this.DialogResult = DialogResult.OK;
\r
187 private NaGetTaskQueryResult onTaskQueryRaised(object sender, NaGetTaskQueryArgs e)
\r
189 MessageBoxButtons buttons = MessageBoxButtons.OKCancel;
\r
190 if (e.SelectionFlag == (NaGetTaskQueryResult.CONTINUE | NaGetTaskQueryResult.RETRY | NaGetTaskQueryResult.CANCEL)) {
\r
191 buttons = MessageBoxButtons.AbortRetryIgnore;
\r
192 } else if (e.SelectionFlag == (NaGetTaskQueryResult.RETRY | NaGetTaskQueryResult.CANCEL)) {
\r
193 buttons = MessageBoxButtons.RetryCancel;
\r
194 } else if (e.SelectionFlag == NaGetTaskQueryResult.CONTINUE) {
\r
195 buttons = MessageBoxButtons.OK;
\r
198 DialogResult result = MessageBox.Show(e.Message, this.Text, buttons);
\r
201 case DialogResult.OK:
\r
202 case DialogResult.Ignore:
\r
203 return NaGetTaskQueryResult.CONTINUE;
\r
204 case DialogResult.Cancel:
\r
205 case DialogResult.Abort:
\r
206 return NaGetTaskQueryResult.CANCEL;
\r
207 case DialogResult.Retry:
\r
208 return NaGetTaskQueryResult.RETRY;
\r
210 return NaGetTaskQueryResult.CANCELED_AUTOMATICALLY;
\r
214 public void SetTaskSet(NaGetTaskSet taskSet)
\r
216 this.taskSet = taskSet;
\r
218 taskSet.TaskSetRaised += delegate(object sender, NaGetTaskSetEventArgs e) {
\r
219 if (InvokeRequired) {
\r
220 Invoke(new EventHandler<NaGetTaskSetEventArgs>(onTaskSetRaised), taskSet, e);
\r
222 onTaskSetRaised(taskSet, e);
\r
226 System.Reflection.PropertyInfo fDownloader = taskSet.GetType().GetProperty("Downloader");
\r
227 if (fDownloader != null && (fDownloader.PropertyType == typeof(Downloader))) {
\r
228 ((Downloader) fDownloader.GetValue(taskSet, null)).DownloadEventRaised += onDownloadEvent;
\r
231 taskSet.TaskQueryRaised += onTaskQueryRaised;
\r
234 public void StartTaskSet()
\r
236 tasksetRunningThread = new Thread(taskSet.Run);
\r
237 // スレッドをSTAにしないとCOMアクセスできず、ウイルススキャンができない。
\r
238 tasksetRunningThread.SetApartmentState(ApartmentState.STA);
\r
239 tasksetRunningThread.Start();
\r
244 void OkButtonClick(object sender, EventArgs e)
\r
246 if (taskSet == null || taskSet.Done) {
\r
252 void CancelButtonClick(object sender, EventArgs e)
\r
254 if (InvokeRequired) {
\r
255 Invoke(new EventHandler(CancelButtonClickConcrete), sender, e);
\r
257 CancelButtonClickConcrete(sender,e);
\r
261 void CancelButtonClickConcrete(object sender, EventArgs e)
\r
263 autoCloseCheckBox.Enabled = false;
\r
264 if (taskSet != null && taskSet.Running && taskSet.Cancelable) {
\r
265 cancelButton.Enabled = false;
\r
267 NativeMethods.ProgressBar_SetState(progressBar, NativeMethods.ProgressBarState.Paused);
\r
273 void ExecutionProgressViewerShown(object sender, EventArgs e)
\r
275 this.BringToFront();
\r
278 void ExecutionProgressViewerFormClosed(object sender, FormClosedEventArgs e)
\r
280 autoCloseTimer.Enabled = false;
\r
283 void AutoCloseTimerTick(object sender, EventArgs e)
\r
285 autoCloseTimer.Stop();
\r
287 if (InvokeRequired) {
\r
288 Invoke(new EventHandler(AutoCloseTimerTickConcrete), sender, e);
\r
290 AutoCloseTimerTickConcrete(sender,e);
\r
294 void AutoCloseTimerTickConcrete(object sender, EventArgs e)
\r
296 // autoCloseCheckBoxが有効(正常終了)かつチェックのときに限り、OKボタンを自動的にクリック
\r
297 if (autoCloseCheckBox.Enabled && autoCloseCheckBox.Checked && okButton.Enabled) {
\r
298 OkButtonClick(sender, e);
\r
299 } else if (! autoCloseCheckBox.Enabled) {
\r
300 // タイマーの時間がすぎて、そのとき自動で閉じないようにしていしてあるならば、手動で閉じるように
\r
301 autoCloseCheckBox.Enabled = false;
\r