root/lang/csharp/MTFileUploader/MTFileUploader/MainForm.cs @ 13652

Revision 13652, 13.0 kB (checked in by mayuki, 5 years ago)

アイテムを右クリックとDelキーで削除できるようにしてみた。

  • Property svn:keywords set to Id
Line 
1using System;
2using System.Collections.Generic;
3using System.ComponentModel;
4using System.Data;
5using System.Drawing;
6using System.IO;
7using System.Linq;
8using System.Net;
9using System.Text;
10using System.Threading;
11using System.Windows.Forms;
12
13using CookComputing.XmlRpc;
14using MTFileUploader.Properties;
15
16namespace MTFileUploader
17{
18    public partial class MainForm : Form
19    {
20        private Settings _settings = new Settings();
21        private Boolean _isUploading = false;
22
23        public MainForm()
24        {
25            InitializeComponent();
26
27            comboSites.DataSource = _settings.Sites;
28            UpdateSites();
29        }
30
31        #region イベントハンドラ
32
33        private void comboSites_SelectedIndexChanged(object sender, EventArgs e)
34        {
35            if (comboSites.SelectedItem != null)
36                txtUploadPath.Text = (comboSites.SelectedItem as SiteSetting).DefaultSitePath;
37        }
38
39        private void lvUploadFiles_DragEnter(object sender, DragEventArgs e)
40        {
41            if (!_isUploading && e.Data.GetDataPresent("FileDrop"))
42            {
43                e.Effect = DragDropEffects.Copy;
44            }
45        }
46
47        private void lvUploadFiles_DragDrop(object sender, DragEventArgs e)
48        {
49            if (!_isUploading && e.Data.GetDataPresent("FileDrop"))
50            {
51                lvUploadFiles.Items.Clear();
52                foreach (var fileName in (e.Data.GetData("FileDrop") as String[]))
53                {
54                    String fileNameOnly = Path.GetFileName(fileName);
55                    String dirName = Path.GetDirectoryName(fileName);
56                    if (Directory.Exists(fileName))
57                    {
58                        // ディレクトリ
59                        FindUploadFiles(dirName, fileName);
60                    }
61                    else
62                    {
63                        // ファイル
64                        ListViewItem item = new ListViewItem(fileNameOnly);
65                        item.Tag = fileNameOnly;
66                        item.ImageKey = "Image_File";
67                        item.SubItems.Add(fileNameOnly);
68                        item.SubItems.Add(fileName);
69                        lvUploadFiles.Items.Add(item);
70                    }
71                }
72                UpdateServerPath();
73            }
74        }
75
76        private void btnUpload_Click(object sender, EventArgs e)
77        {
78            if (_isUploading)
79            {
80                backgroundWorker.CancelAsync();
81                return;
82            }
83
84            SiteSetting settings = comboSites.SelectedItem as SiteSetting;
85            if (settings == null)
86            {
87                MessageBox.Show(this, "接続先が選択されていません。", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
88                return;
89            }
90
91            _isUploading = true;
92            txtUploadPath.Enabled = false;
93            comboSites.Enabled = false;
94            btnUpload.Text = "キャンセル(&C)";
95
96            foreach (ListViewItem item in lvUploadFiles.Items)
97                item.ImageKey = "Image_File";
98
99            backgroundWorker.RunWorkerAsync();
100        }
101
102        private void btnSettings_Click(object sender, EventArgs e)
103        {
104            using (SettingsForm settingsForm = new SettingsForm())
105            {
106                settingsForm.ShowDialog();
107                _settings.Reload();
108                UpdateSites();
109            }
110        }
111
112        private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
113        {
114            ExecuteUpload(e);
115        }
116
117        private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
118        {
119            if (e.Cancelled)
120                toolStripStatusLabel.Text = "ファイルのアップロードはキャンセルされました";
121            else if (e.Result == null)
122                toolStripStatusLabel.Text = "ファイルのアップロードが完了しました";
123            else
124                toolStripStatusLabel.Text = e.Result.ToString();
125
126            _isUploading = false;
127
128            btnUpload.Text = "アップロード(&U)";
129            txtUploadPath.Enabled = true;
130            comboSites.Enabled = true;
131        }
132
133        private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
134        {
135            StatusState state = e.UserState as StatusState;
136            if (state.Status != Status.Error)
137            {
138                toolStripStatusLabel.Text = state.Text;
139            }
140            else
141            {
142                toolStripStatusLabel.Text = "アップロード中にエラーが発生しました";
143                MessageBox.Show(this, state.Text, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
144            }
145
146            if (state.Item != null)
147            {
148                state.Item.ImageKey = (
149                   state.Status == Status.Done      ? "Done" :
150                   state.Status == Status.Uploading ? "Publish" :
151                   state.Status == Status.Error     ? "Error" :
152                                                      "Image_File");
153            }
154        }
155
156        private void txtUploadPath_TextChanged(object sender, EventArgs e)
157        {
158            UpdateServerPath();
159        }
160
161        private void lvUploadFiles_KeyUp(object sender, KeyEventArgs e)
162        {
163            if (e.KeyCode == Keys.Delete && lvUploadFiles.SelectedItems.Count > 0)
164            {
165                var itemsTemp = new List<ListViewItem>(lvUploadFiles.SelectedItems.OfType<ListViewItem>());
166                foreach (var item in itemsTemp)
167                    lvUploadFiles.Items.Remove(item);
168            }
169        }
170
171        private void deleteToolStripMenuItem_Click(object sender, EventArgs e)
172        {
173            if (lvUploadFiles.SelectedItems.Count > 0)
174            {
175                var itemsTemp = new List<ListViewItem>(lvUploadFiles.SelectedItems.OfType<ListViewItem>());
176                foreach (var item in itemsTemp)
177                    lvUploadFiles.Items.Remove(item);
178            }
179        }
180
181        private void lvUploadFiles_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
182        {
183            lvUploadFiles.ContextMenuStrip = ((lvUploadFiles.SelectedItems.Count > 0) ? contextMenuStrip : null);
184        }
185        #endregion
186
187        private void UpdateServerPath()
188        {
189            var baseDir = txtUploadPath.Text.Trim('/');
190            foreach (ListViewItem item in lvUploadFiles.Items)
191            {
192                var fileRelPath = item.Tag as String;
193                item.SubItems[1].Text = (baseDir.Length == 0 ? fileRelPath : String.Format("{0}/{1}", baseDir, fileRelPath));
194            }
195        }
196
197        private void ExecuteUpload(DoWorkEventArgs e)
198        {
199            SiteSetting settings = Invoke((Func<Object>)(() => comboSites.SelectedItem)) as SiteSetting;
200            IMetaWeblog metaWeblog = CookComputing.XmlRpc.XmlRpcProxyGen.Create<IMetaWeblog>();
201            metaWeblog.Url = settings.EndPointUrl;
202
203            // Basic 認証
204            if (!String.IsNullOrEmpty(settings.HttpUserName))
205            {
206                CredentialCache credCache = new CredentialCache();
207                credCache.Add(new Uri(metaWeblog.Url), "Basic", new NetworkCredential(settings.HttpUserName, settings.HttpPassword));
208                metaWeblog.Credentials = credCache;
209                metaWeblog.PreAuthenticate = true;
210            }
211
212            var userName = settings.UserName;
213            var password = settings.Password;
214            var blogId = settings.BlogId;
215
216            // ログインチェック
217            try
218            {
219                backgroundWorker.ReportProgress(0, new StatusState() { Text = "ログイン認証を確認しています..." });
220                metaWeblog.GetUsersBlogs(1, userName, password);
221            }
222            catch (XmlRpcFaultException ex)
223            {
224                String errorMessage = String.Format("ログイン時にエラーが発生しました。{0}\r\n\r\n詳細なメッセージ: \r\n{1}", ex.FaultString, ex.Message);
225                backgroundWorker.ReportProgress(0, new StatusState() { Text = errorMessage, Status = Status.Error });
226                e.Result = "アップロード中にエラーが発生しました。";
227                return;
228            }
229            catch (XmlRpcServerException ex)
230            {
231                String errorMessage = String.Format("サーバへ接続時にエラーが発生しました。\r\n\r\n詳細なメッセージ: \r\n{0}", ex.Message);
232                backgroundWorker.ReportProgress(0, new StatusState() { Text = errorMessage, Status = Status.Error });
233                e.Result = "アップロード中にエラーが発生しました。";
234                return;
235            }
236
237            var baseDir = txtUploadPath.Text.Trim('/');
238            // アップロード
239            foreach (var i in Enumerable.Range(0, lvUploadFiles.Items.Count))
240            {
241                // キャンセル
242                if (backgroundWorker.CancellationPending)
243                {
244                    e.Cancel = true;
245                    return;
246                }
247
248                var item = Invoke((Func<ListViewItem>)(() => lvUploadFiles.Items[i])) as ListViewItem;
249                var fileRelPath = item.SubItems[1].Text;
250                var statusText = String.Format("ファイル {0} をアップロードしています(残り{1}個のファイル)...", fileRelPath, lvUploadFiles.Items.Count - i);
251                Int32 progressPct = (i / lvUploadFiles.Items.Count) * 100;
252                backgroundWorker.ReportProgress(progressPct, new StatusState() { Text = statusText, Item = item, Status = Status.Uploading });
253
254                var mediaObject = new CookComputing.XmlRpc.XmlRpcStruct();
255                mediaObject.Add("name", fileRelPath);
256                mediaObject.Add("bits", File.ReadAllBytes(item.SubItems[2].Text));
257                try
258                {
259                    metaWeblog.NewMediaObject(blogId, userName, password, mediaObject);
260                    backgroundWorker.ReportProgress(progressPct, new StatusState() { Text = statusText, Item = item, Status = Status.Done });
261                }
262                catch (XmlRpcFaultException ex)
263                {
264                    String errorMessage = String.Format("エラーが発生しました。{0}\r\n\r\n詳細なメッセージ: \r\n{1}", ex.FaultString, ex.Message);
265                    backgroundWorker.ReportProgress(progressPct, new StatusState() { Text = errorMessage, Item = item, Status = Status.Error });
266                    e.Result = "アップロード中にエラー発生しました";
267                    return;
268                }
269                catch (XmlRpcServerException ex)
270                {
271                    String errorMessage = String.Format("サーバへ接続時にエラーが発生しました。\r\n\r\n詳細なメッセージ: \r\n{0}", ex.Message);
272                    backgroundWorker.ReportProgress(progressPct, new StatusState() { Text = errorMessage, Item = item, Status = Status.Error });
273                    e.Result = "アップロード中にエラー発生しました";
274                    return;
275                }
276            }
277        }
278
279        private void FindUploadFiles(String baseDir, String searchDir)
280        {
281            foreach (var dirName in Directory.GetDirectories(searchDir))
282            {
283                FindUploadFiles(baseDir, dirName);
284            }
285            foreach (var fileName in Directory.GetFiles(searchDir))
286            {
287                // ファイル
288                String fileNameOnly = Path.GetFileName(fileName);
289                String dirName = Path.GetDirectoryName(fileName);
290                String fileRelativePath = fileName.Remove(0, baseDir.Length + 1);
291
292                ListViewItem item = new ListViewItem(fileNameOnly, "Image_File");
293                item.Tag = fileRelativePath.Replace('\\', '/');
294                item.SubItems.Add(fileRelativePath.Replace('\\', '/')); // Server path
295                item.SubItems.Add(fileName); // File path
296                lvUploadFiles.Items.Add(item);
297            }
298        }
299
300        private void UpdateSites()
301        {
302            comboSites.DataSource = _settings.Sites;
303            comboSites.BindingContext[_settings.Sites].SuspendBinding();
304            comboSites.BindingContext[_settings.Sites].ResumeBinding();
305            comboSites.SelectedItem = null;
306        }
307
308        private enum Status
309        {
310            Ready = 1 << 0,
311            Uploading = 1 << 2,
312            Done = 1 << 3,
313            Error = 255
314        }
315
316        private class StatusState
317        {
318            public String Text { get; set; }
319            public Status Status { get; set; }
320            public ListViewItem Item { get; set; }
321        }
322    }
323}
Note: See TracBrowser for help on using the browser.