OSDN Git Service

na-get,NaGetInstall(Update)のDownloderを外部から書き込みできないように(これに伴うAppliStation-GUI,all-getの変...
[applistation/AppliStation.git] / AppliStation / AppliStation.Util / ExecutionProgressViewer.cs
1 using System;\r
2 using System.Drawing;\r
3 using System.Windows.Forms;\r
4 using System.Threading;\r
5 using NaGet.SubCommands;\r
6 using NaGet.Net;\r
7 \r
8 namespace AppliStation.Util\r
9 {\r
10         /// <summary>\r
11         /// Description of ExecutionProgressViewer.\r
12         /// </summary>\r
13         public partial class ExecutionProgressViewer : Form\r
14         {\r
15                 private NaGetTaskSet taskSet;\r
16                 \r
17                 private Thread tasksetRunningThread = null;\r
18                 \r
19                 /// <summary>\r
20                 /// 終了時に何を行うかのフラグ\r
21                 /// </summary>\r
22                 public enum ActionOnDoneFlags {\r
23                         None = 0,\r
24                         FlashWindow = 1,\r
25                         AutoCloseOnSuccess = 2,\r
26                 }\r
27                 \r
28                 /// <summary>\r
29                 /// 終了時に何を行うか\r
30                 /// </summary>\r
31                 public ActionOnDoneFlags ActionOnDone = ActionOnDoneFlags.FlashWindow;\r
32                                 \r
33                 public ExecutionProgressViewer()\r
34                 {\r
35                         //\r
36                         // The InitializeComponent() call is required for Windows Forms designer support.\r
37                         //\r
38                         InitializeComponent();\r
39                 }\r
40                                 \r
41                 private void onDownloadEvent(object sender, DownloadEventArgs a)\r
42                 {\r
43                         if (InvokeRequired) {\r
44                                 Invoke(new EventHandler<DownloadEventArgs>(onDownloadEvent), sender, a);\r
45                                 return;\r
46                         }\r
47                         \r
48                         \r
49                         if (a.TaskProgressPercent >= 0) {\r
50                                 progressBarSub.Value = (int) a.TaskProgressPercent;\r
51                                 progressBarSub.Style = ProgressBarStyle.Continuous;\r
52                         } else {\r
53                                 progressBarSub.Style = ProgressBarStyle.Marquee;\r
54                         }\r
55                         \r
56                         switch (a.Type) {\r
57                                 case DownloadEventType.INITED:\r
58                                 case DownloadEventType.CONNECTED:\r
59                                         progressSubLabel.Text = a.TaskMessage;\r
60                                         \r
61                                         progressBarSub.Visible = true;\r
62                                         progressSubLabel.Visible = true;\r
63                                         break;\r
64                                 case DownloadEventType.DOWNLOADING:\r
65                                         progressSubLabel.Text = a.TaskMessage;\r
66                                         break;\r
67                                 case DownloadEventType.COMPLETED:\r
68                                         progressBarSub.Visible = false;\r
69                                         progressSubLabel.Visible = false;\r
70                                         break;\r
71                                 case DownloadEventType.ERROR:\r
72                                         progressBarSub.Visible = false;\r
73                                         progressSubLabel.Visible = false;\r
74                                         \r
75                                         logBox.SelectionColor = System.Drawing.Color.Red;\r
76                                         logBox.AppendText("   [エラー] " + a.TaskMessage + System.Environment.NewLine);\r
77                                         logBox.SelectionColor = logBox.ForeColor;\r
78                                         break;\r
79                         }\r
80                 }\r
81                 \r
82                 #region NaGetTaskSet関連\r
83                 \r
84                 private void onTaskSetRaised(object sender, NaGetTaskSetEventArgs e)\r
85                 {\r
86                         NaGetTaskSet taskSet = (NaGetTaskSet) sender;\r
87                         \r
88                         if (e.TaskProgressPercent >= 0) {\r
89                                 progressBar.Value = (int) e.TaskProgressPercent;\r
90                                 progressBar.Style = ProgressBarStyle.Continuous;\r
91                         } else {\r
92                                 progressBar.Style = ProgressBarStyle.Marquee;\r
93                         }\r
94                         progressLabel.Text = e.TaskMessage ?? string.Empty;\r
95                         \r
96                         cancelButton.Enabled = taskSet.Running && taskSet.Cancelable;\r
97                         \r
98                         switch (e.Type) {\r
99                                 case NaGetTaskSetEventType.COMPLETED:\r
100                                         logBox.AppendText("完了." + System.Environment.NewLine);\r
101                                         if (taskSet.Done) {\r
102                                                 okButton.Enabled = true;\r
103                                                 cancelButton.Enabled = false;\r
104                                         }\r
105                                         break;\r
106                                 case NaGetTaskSetEventType.STARTED_TASKSET:\r
107                                         subtitleLabel.Text = taskSet.TaskSetNames[taskSet.CurrentTaskSetIndex];\r
108                                         logBox.AppendText("  " + e.TaskMessage + System.Environment.NewLine);\r
109                                         break;\r
110                                 case NaGetTaskSetEventType.COMPLETED_TASKSET:\r
111                                         if (progressBarSub.Visible) progressBarSub.Hide();\r
112                                         if (progressSubLabel.Visible) progressSubLabel.Hide();\r
113                                         \r
114                                         NativeMethods.ProgressBar_SetState(progressBar, 1); // VistaProgress色:ノーマル\r
115                                         \r
116                                         logBox.AppendText(string.Format(" ... 完了. [{0}%]", (int) e.TaskProgressPercent));\r
117                                         logBox.AppendText(System.Environment.NewLine);\r
118                                         break;\r
119                                 case NaGetTaskSetEventType.INFO:\r
120                                         logBox.AppendText("  " + e.TaskMessage + System.Environment.NewLine);\r
121                                         break;\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
126                                         \r
127                                         NativeMethods.ProgressBar_SetState(progressBar, 2); // VistaProgress色:エラー\r
128                                         \r
129                                         okButton.Enabled = true;\r
130                                         cancelButton.Enabled = false;\r
131                                         break;\r
132                                 case NaGetTaskSetEventType.CANCELED:\r
133                                         logBox.SelectionColor = System.Drawing.Color.Red;\r
134                                         logBox.AppendText(e.TaskMessage + System.Environment.NewLine);\r
135                                         logBox.SelectionColor = logBox.ForeColor;\r
136                                         \r
137                                         NativeMethods.ProgressBar_SetState(progressBar, 1); // VistaProgress色:中断\r
138                                         \r
139                                         okButton.Enabled = true;\r
140                                         cancelButton.Enabled = false;\r
141                                         break;\r
142                                 case NaGetTaskSetEventType.WARNING:\r
143                                         logBox.SelectionColor = System.Drawing.Color.Red;\r
144                                         logBox.AppendText("  [エラー] " + e.TaskMessage + System.Environment.NewLine);\r
145                                         logBox.SelectionColor = logBox.ForeColor;\r
146                                         \r
147                                         break;\r
148                         }\r
149                         \r
150                         if (taskSet.Done) {\r
151                                 if ((ActionOnDone & ActionOnDoneFlags.FlashWindow) != 0) {\r
152                                         NativeMethods.Form_FlashWindow(this,\r
153                                                                NativeMethods.FlashFlag.All | NativeMethods.FlashFlag.TimerNoFG,\r
154                                                                uint.MaxValue, 0);\r
155                                 }\r
156                                 if (okButton.Enabled && (ActionOnDone & ActionOnDoneFlags.AutoCloseOnSuccess) != 0) {\r
157                                         this.DialogResult = DialogResult.OK;\r
158                                         Close();\r
159                                         Dispose();\r
160                                 }\r
161                         }\r
162                 }\r
163                 \r
164                 private NaGetTaskQueryResult onTaskQueryRaised(object sender, NaGetTaskQueryArgs e)\r
165                 {\r
166                         MessageBoxButtons buttons = MessageBoxButtons.OKCancel;\r
167                         if (e.SelectionFlag == (NaGetTaskQueryResult.CONTINUE | NaGetTaskQueryResult.RETRY | NaGetTaskQueryResult.CANCEL)) {\r
168                                 buttons = MessageBoxButtons.AbortRetryIgnore;\r
169                         } else if (e.SelectionFlag == (NaGetTaskQueryResult.RETRY | NaGetTaskQueryResult.CANCEL)) {\r
170                                 buttons = MessageBoxButtons.RetryCancel;\r
171                         } else if (e.SelectionFlag == NaGetTaskQueryResult.CONTINUE) {\r
172                                 buttons = MessageBoxButtons.OK;\r
173                         }\r
174                         \r
175                         DialogResult result = MessageBox.Show(e.Message, this.Text, buttons);\r
176                         \r
177                         switch (result) {\r
178                                 case DialogResult.OK:\r
179                                 case DialogResult.Ignore:\r
180                                         return NaGetTaskQueryResult.CONTINUE;\r
181                                 case DialogResult.Cancel:\r
182                                 case DialogResult.Abort:\r
183                                         return NaGetTaskQueryResult.CANCEL;\r
184                                 case DialogResult.Retry:\r
185                                         return NaGetTaskQueryResult.RETRY;\r
186                                 default:\r
187                                         return NaGetTaskQueryResult.CANCELED_AUTOMATICALLY;\r
188                         }\r
189                 }\r
190                 \r
191                 public void SetTaskSet(NaGetTaskSet taskSet)\r
192                 {\r
193                         this.taskSet = taskSet;\r
194                         \r
195                         taskSet.TaskSetRaised += delegate(object sender, NaGetTaskSetEventArgs e) {\r
196                                 if (InvokeRequired) {\r
197                                         Invoke(new EventHandler<NaGetTaskSetEventArgs>(onTaskSetRaised), taskSet, e);\r
198                                 } else {\r
199                                         onTaskSetRaised(taskSet, e);\r
200                                 }\r
201                         };\r
202                         \r
203                         System.Reflection.PropertyInfo fDownloader = taskSet.GetType().GetProperty("Downloader");\r
204                         if (fDownloader != null && (fDownloader.PropertyType == typeof(Downloader))) {\r
205                                 ((Downloader) fDownloader.GetValue(taskSet, null)).DownloadEventRaised += onDownloadEvent;\r
206                         }\r
207                         \r
208                         taskSet.TaskQueryRaised += onTaskQueryRaised;\r
209                 }\r
210 \r
211                 public void StartTaskSet()\r
212                 {\r
213                         tasksetRunningThread = new Thread(taskSet.Run);\r
214                         tasksetRunningThread.Start();\r
215                 }\r
216                 \r
217                 #endregion\r
218                 \r
219                 void OkButtonClick(object sender, EventArgs e)\r
220                 {\r
221                         if (taskSet == null || taskSet.Done) {\r
222                                 this.Close();\r
223                                 this.Dispose();\r
224                         }\r
225                 }\r
226                 \r
227                 void CancelButtonClick(object sender, EventArgs e)\r
228                 {\r
229                         if (InvokeRequired) {\r
230                                 Invoke(new EventHandler(CancelButtonClickConcrete), sender, e);\r
231                         } else {\r
232                                 CancelButtonClickConcrete(sender,e);\r
233                         }\r
234                 }\r
235                 \r
236                 void CancelButtonClickConcrete(object sender, EventArgs e)\r
237                 {\r
238                         if (taskSet != null && taskSet.Running && taskSet.Cancelable) {\r
239                                 cancelButton.Enabled = false;\r
240                                 \r
241                                 NativeMethods.ProgressBar_SetState(progressBar, 3); // VistaProgress色:中断\r
242                                 \r
243                                 taskSet.Cancel();\r
244                         }\r
245                 }\r
246                 \r
247                 void ExecutionProgressViewerShown(object sender, EventArgs e)\r
248                 {\r
249                         this.BringToFront();\r
250                 }\r
251         }\r
252 }\r