OSDN Git Service

画像投稿先のサービスから「img.ly」を削除
[opentween/open-tween.git] / OpenTween / MediaSelector.cs
index 0c5ab16..400d742 100644 (file)
@@ -29,20 +29,20 @@ using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 using System.Windows.Forms;
-using OpenTween.Api;
+using OpenTween.Api.DataModel;
 using OpenTween.Connection;
 
 namespace OpenTween
 {
     public partial class MediaSelector : UserControl
     {
-        public event EventHandler BeginSelecting;
-        public event EventHandler EndSelecting;
+        public event EventHandler<EventArgs> BeginSelecting;
+        public event EventHandler<EventArgs> EndSelecting;
 
-        public event EventHandler FilePickDialogOpening;
-        public event EventHandler FilePickDialogClosed;
+        public event EventHandler<EventArgs> FilePickDialogOpening;
+        public event EventHandler<EventArgs> FilePickDialogClosed;
 
-        public event EventHandler SelectedServiceChanged;
+        public event EventHandler<EventArgs> SelectedServiceChanged;
 
         [Browsable(false)]
         [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
@@ -69,12 +69,29 @@ namespace OpenTween
         }
 
         /// <summary>
+        /// 選択されている投稿先の IMediaUploadService を取得する。
+        /// </summary>
+        [Browsable(false)]
+        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
+        public IMediaUploadService SelectedService
+        {
+            get
+            {
+                var serviceName = this.ServiceName;
+                if (string.IsNullOrEmpty(serviceName))
+                    return null;
+
+                return this.pictureService.TryGetValue(serviceName, out var service)
+                    ? service : null;
+            }
+        }
+
+        /// <summary>
         /// 指定された投稿先名から、作成済みの IMediaUploadService インスタンスを取得する。
         /// </summary>
         public IMediaUploadService GetService(string serviceName)
         {
-            IMediaUploadService service;
-            this.pictureService.TryGetValue(serviceName, out service);
+            this.pictureService.TryGetValue(serviceName, out var service);
             return service;
         }
 
@@ -116,10 +133,12 @@ namespace OpenTween
             {
                 get
                 {
-                    return (this.Item != null) ? this.Item.Path : "";
+                    return this.Item?.Path ?? "";
                 }
             }
 
+            public string AltText => this.Item?.AltText ?? "";
+
             public override string ToString()
             {
                 return this.Text;
@@ -130,16 +149,13 @@ namespace OpenTween
 
         private void CreateServices(Twitter tw, TwitterConfiguration twitterConfig)
         {
-            if (this.pictureService != null) this.pictureService.Clear();
+            this.pictureService?.Clear();
             this.pictureService = null;
 
             this.pictureService = new Dictionary<string, IMediaUploadService> {
-                {"Twitter", new TwitterPhoto(tw, twitterConfig)},
-                {"img.ly", new imgly(tw, twitterConfig)},
-                {"yfrog", new yfrog(tw, twitterConfig)},
-                {"ついっぷるフォト", new TwipplePhoto(tw, twitterConfig)},
-                {"Imgur", new Imgur(tw, twitterConfig)},
-                {"Mobypicture", new Mobypicture(tw, twitterConfig)},
+                ["Twitter"] = new TwitterPhoto(tw, twitterConfig),
+                ["Imgur"] = new Imgur(tw, twitterConfig),
+                ["Mobypicture"] = new Mobypicture(tw, twitterConfig),
             };
         }
 
@@ -226,9 +242,8 @@ namespace OpenTween
                 return;
             }
 
-            var serviceName = this.ServiceName;
-            if (string.IsNullOrEmpty(serviceName)) return;
-            var service = this.pictureService[serviceName];
+            var service = this.SelectedService;
+            if (service == null) return;
 
             var count = Math.Min(items.Length, service.MaxMediaCount);
             if (!this.Visible || count > 1)
@@ -236,8 +251,7 @@ namespace OpenTween
                 // 非表示時または複数のファイル指定は新規選択として扱う
                 SetImagePageCombo();
 
-                if (this.BeginSelecting != null)
-                    this.BeginSelecting(this, EventArgs.Empty);
+                this.BeginSelecting?.Invoke(this, EventArgs.Empty);
 
                 this.Visible = true;
             }
@@ -246,6 +260,7 @@ namespace OpenTween
             if (count == 1)
             {
                 ImagefilePathText.Text = items[0].Path;
+                AlternativeTextBox.Text = items[0].AltText;
                 ImageFromSelectedFile(items[0], false);
             }
             else
@@ -253,7 +268,11 @@ namespace OpenTween
                 for (int i = 0; i < count; i++)
                 {
                     var index = ImagePageCombo.Items.Count - 1;
-                    if (index == 0) ImagefilePathText.Text = items[i].Path;
+                    if (index == 0)
+                    {
+                        ImagefilePathText.Text = items[i].Path;
+                        AlternativeTextBox.Text = items[i].AltText;
+                    }
                     ImageFromSelectedFile(index, items[i], false);
                 }
             }
@@ -296,8 +315,7 @@ namespace OpenTween
         {
             if (!this.Visible)
             {
-                if (this.BeginSelecting != null)
-                    this.BeginSelecting(this, EventArgs.Empty);
+                this.BeginSelecting?.Invoke(this, EventArgs.Empty);
 
                 this.Visible = true;
                 this.Enabled = true;
@@ -317,8 +335,7 @@ namespace OpenTween
             {
                 ImagefilePathText.CausesValidation = false;
 
-                if (this.EndSelecting != null)
-                    this.EndSelecting(this, EventArgs.Empty);
+                this.EndSelecting?.Invoke(this, EventArgs.Empty);
 
                 this.Visible = false;
                 this.Enabled = false;
@@ -371,16 +388,22 @@ namespace OpenTween
             return false;
         }
 
-        private IMediaItem CreateMemoryImageMediaItem(Image image, bool noMsgBox)
+        private MemoryImageMediaItem CreateMemoryImageMediaItem(Image image, bool noMsgBox)
         {
             if (image == null) return null;
 
+            MemoryImage memoryImage = null;
             try
             {
-                return new MemoryImageMediaItem(image);
+                // image から png 形式の MemoryImage を生成
+                memoryImage = MemoryImage.CopyFromImage(image);
+
+                return new MemoryImageMediaItem(memoryImage);
             }
             catch
             {
+                memoryImage?.Dispose();
+
                 if (!noMsgBox) MessageBox.Show("Unable to create MemoryImage.");
                 return null;
             }
@@ -401,7 +424,7 @@ namespace OpenTween
             }
         }
 
-        private void ValidateNewFileMediaItem(string path, bool noMsgBox)
+        private void ValidateNewFileMediaItem(string path, string altText, bool noMsgBox)
         {
             var media = (SelectedMedia)ImagePageCombo.SelectedItem;
             var item = media.Item;
@@ -414,28 +437,30 @@ namespace OpenTween
                 item = CreateFileMediaItem(path, noMsgBox);
             }
 
+            if (item != null)
+                item.AltText = altText;
+
             ImagefilePathText.Text = path;
+            AlternativeTextBox.Text = altText;
             ImageFromSelectedFile(item, noMsgBox);
         }
 
         private void DisposeMediaItem(IMediaItem item)
         {
-            if (item != null)
-            {
-                var disposableItem = item as IDisposable;
-                if (disposableItem != null) disposableItem.Dispose();
-            }
+            var disposableItem = item as IDisposable;
+            disposableItem?.Dispose();
         }
 
         private void FilePickButton_Click(object sender, EventArgs e)
         {
-            if (FilePickDialog == null || string.IsNullOrEmpty(this.ServiceName)) return;
-            FilePickDialog.Filter = this.pictureService[this.ServiceName].SupportedFormatsStrForDialog;
+            var service = this.SelectedService;
+
+            if (FilePickDialog == null || service == null) return;
+            FilePickDialog.Filter = service.SupportedFormatsStrForDialog;
             FilePickDialog.Title = Properties.Resources.PickPictureDialog1;
             FilePickDialog.FileName = "";
 
-            if (this.FilePickDialogOpening != null)
-                this.FilePickDialogOpening(this, EventArgs.Empty);
+            this.FilePickDialogOpening?.Invoke(this, EventArgs.Empty);
 
             try
             {
@@ -443,11 +468,10 @@ namespace OpenTween
             }
             finally
             {
-                if (this.FilePickDialogClosed != null)
-                    this.FilePickDialogClosed(this, EventArgs.Empty);
+                this.FilePickDialogClosed?.Invoke(this, EventArgs.Empty);
             }
 
-            ValidateNewFileMediaItem(FilePickDialog.FileName, false);
+            ValidateNewFileMediaItem(FilePickDialog.FileName, AlternativeTextBox.Text.Trim(), false);
         }
 
         private void ImagefilePathText_Validating(object sender, CancelEventArgs e)
@@ -458,7 +482,7 @@ namespace OpenTween
                 return;
             }
 
-            ValidateNewFileMediaItem(ImagefilePathText.Text.Trim(), false);
+            ValidateNewFileMediaItem(ImagefilePathText.Text.Trim(), AlternativeTextBox.Text.Trim(), false);
         }
 
         private void ImageFromSelectedFile(IMediaItem item, bool noMsgBox)
@@ -472,16 +496,15 @@ namespace OpenTween
 
             try
             {
-                var serviceName = this.ServiceName;
-                if (string.IsNullOrEmpty(serviceName)) return;
+                var imageService = this.SelectedService;
+                if (imageService == null) return;
 
                 var selectedIndex = ImagePageCombo.SelectedIndex;
                 if (index < 0) index = selectedIndex;
 
                 if (index >= ImagePageCombo.Items.Count)
-                    throw new ArgumentOutOfRangeException("index");
+                    throw new ArgumentOutOfRangeException(nameof(index));
 
-                var imageService = this.pictureService[serviceName];
                 var isSelectedPage = (index == selectedIndex);
 
                 if (isSelectedPage)
@@ -500,7 +523,7 @@ namespace OpenTween
                         if (!noMsgBox)
                         {
                             MessageBox.Show(
-                                string.Format(Properties.Resources.PostPictureWarn3, serviceName, MakeAvailableServiceText(ext, size), ext, item.Name),
+                                string.Format(Properties.Resources.PostPictureWarn3, this.ServiceName, MakeAvailableServiceText(ext, size), ext, item.Name),
                                 Properties.Resources.PostPictureWarn4,
                                 MessageBoxButtons.OK,
                                 MessageBoxIcon.Warning);
@@ -514,7 +537,7 @@ namespace OpenTween
                         if (!noMsgBox)
                         {
                             MessageBox.Show(
-                                string.Format(Properties.Resources.PostPictureWarn5, serviceName, MakeAvailableServiceText(ext, size), item.Name),
+                                string.Format(Properties.Resources.PostPictureWarn5, this.ServiceName, MakeAvailableServiceText(ext, size), item.Name),
                                 Properties.Resources.PostPictureWarn4,
                                 MessageBoxButtons.OK,
                                 MessageBoxIcon.Warning);
@@ -522,7 +545,7 @@ namespace OpenTween
                         return;
                     }
 
-                    if (item is MemoryImageMediaItem)
+                    if (item.IsImage)
                     {
                         if (isSelectedPage)
                             ImageSelectedPicture.Image = item.CreateImage();
@@ -530,19 +553,7 @@ namespace OpenTween
                     }
                     else
                     {
-                        try
-                        {
-                            var image = item.CreateImage();
-                            if (isSelectedPage)
-                                ImageSelectedPicture.Image = image;
-                            else
-                                image.Dispose();  //画像チェック後は使わないので破棄する
-                            SetImagePage(index, item, MyCommon.UploadFileType.Picture);
-                        }
-                        catch (InvalidImageException)
-                        {
-                            SetImagePage(index, item, MyCommon.UploadFileType.MultiMedia);
-                        }
+                        SetImagePage(index, item, MyCommon.UploadFileType.MultiMedia);
                     }
 
                     valid = true;  //正常終了
@@ -584,11 +595,8 @@ namespace OpenTween
         private void ClearImageSelectedPicture()
         {
             var oldImage = this.ImageSelectedPicture.Image;
-            if (oldImage != null)
-            {
-                this.ImageSelectedPicture.Image = null;
-                oldImage.Dispose();
-            }
+            this.ImageSelectedPicture.Image = null;
+            oldImage?.Dispose();
 
             this.ImageSelectedPicture.ShowInitialImage();
         }
@@ -662,20 +670,27 @@ namespace OpenTween
             {
                 ImageServiceCombo.SelectedIndex = 0;
             }
+
+            this.UpdateAltTextPanelVisible();
         }
 
+        private void UpdateAltTextPanelVisible()
+            => this.AlternativeTextPanel.Visible = this.SelectedService.CanUseAltText;
+
         private void ImageServiceCombo_SelectedIndexChanged(object sender, EventArgs e)
         {
             if (this.Visible)
             {
-                var serviceName = this.ServiceName;
-                if (!string.IsNullOrEmpty(serviceName))
+                var imageService = this.SelectedService;
+                if (imageService != null)
                 {
+                    this.UpdateAltTextPanelVisible();
+
                     if (ImagePageCombo.Items.Count > 0)
                     {
                         // 画像が選択された投稿先に対応しているかをチェックする
                         // TODO: 複数の選択済み画像があるなら、できれば全てを再チェックしたほうがいい
-                        if (serviceName.Equals("Twitter"))
+                        if (this.ServiceName == "Twitter")
                         {
                             ValidateSelectedImagePage();
                         }
@@ -697,7 +712,6 @@ namespace OpenTween
                                     if (item != null)
                                     {
                                         var ext = item.Extension;
-                                        var imageService = this.pictureService[serviceName];
                                         if (imageService.CheckFileExtension(ext) &&
                                             imageService.CheckFileSize(ext, item.Size))
                                         {
@@ -722,8 +736,7 @@ namespace OpenTween
                 }
             }
 
-            if (this.SelectedServiceChanged != null)
-                this.SelectedServiceChanged(this, EventArgs.Empty);
+            this.SelectedServiceChanged?.Invoke(this, EventArgs.Empty);
         }
 
         private void SetImagePageCombo(SelectedMedia media = null)
@@ -744,6 +757,7 @@ namespace OpenTween
 
                 ImagePageCombo.Items.Add(media);
                 ImagefilePathText.Text = media.Path;
+                AlternativeTextBox.Text = media.AltText;
 
                 ImagePageCombo.SelectedIndex = 0;
             }
@@ -751,10 +765,10 @@ namespace OpenTween
 
         private void AddNewImagePage(int selectedIndex)
         {
-            var serviceName = this.ServiceName;
-            if (string.IsNullOrEmpty(serviceName)) return;
+            var service = this.SelectedService;
+            if (service == null) return;
 
-            if (selectedIndex < this.pictureService[serviceName].MaxMediaCount - 1)
+            if (selectedIndex < service.MaxMediaCount - 1)
             {
                 // 投稿先の投稿可能枚数まで選択できるようにする
                 var count = ImagePageCombo.Items.Count;
@@ -803,7 +817,11 @@ namespace OpenTween
             media.Item = null;
             media.Type = MyCommon.UploadFileType.Invalid;
 
-            if (index == selectedIndex) ImagefilePathText.Text = "";
+            if (index == selectedIndex)
+            {
+                ImagefilePathText.Text = "";
+                AlternativeTextBox.Text = "";
+            }
         }
 
         private void ValidateSelectedImagePage()
@@ -812,6 +830,7 @@ namespace OpenTween
             var media = (SelectedMedia)ImagePageCombo.Items[idx];
             ImageServiceCombo.Enabled = (idx == 0);  // idx == 0 以外では投稿先サービスを選べないようにする
             ImagefilePathText.Text = media.Path;
+            AlternativeTextBox.Text = media.AltText;
             ImageFromSelectedFile(media.Item, true);
         }
 
@@ -819,5 +838,12 @@ namespace OpenTween
         {
             ValidateSelectedImagePage();
         }
+
+        private void AlternativeTextBox_Validating(object sender, CancelEventArgs e)
+        {
+            var imageFilePath = this.ImagefilePathText.Text.Trim();
+            var altText = this.AlternativeTextBox.Text.Trim();
+            this.ValidateNewFileMediaItem(imageFilePath, altText, noMsgBox: false);
+        }
     }
 }