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)]
}
/// <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;
}
{
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;
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),
};
}
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)
// 非表示時または複数のファイル指定は新規選択として扱う
SetImagePageCombo();
- if (this.BeginSelecting != null)
- this.BeginSelecting(this, EventArgs.Empty);
+ this.BeginSelecting?.Invoke(this, EventArgs.Empty);
this.Visible = true;
}
if (count == 1)
{
ImagefilePathText.Text = items[0].Path;
+ AlternativeTextBox.Text = items[0].AltText;
ImageFromSelectedFile(items[0], false);
}
else
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);
}
}
{
if (!this.Visible)
{
- if (this.BeginSelecting != null)
- this.BeginSelecting(this, EventArgs.Empty);
+ this.BeginSelecting?.Invoke(this, EventArgs.Empty);
this.Visible = true;
this.Enabled = true;
{
ImagefilePathText.CausesValidation = false;
- if (this.EndSelecting != null)
- this.EndSelecting(this, EventArgs.Empty);
+ this.EndSelecting?.Invoke(this, EventArgs.Empty);
this.Visible = false;
this.Enabled = false;
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;
}
}
}
- 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;
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
{
}
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)
return;
}
- ValidateNewFileMediaItem(ImagefilePathText.Text.Trim(), false);
+ ValidateNewFileMediaItem(ImagefilePathText.Text.Trim(), AlternativeTextBox.Text.Trim(), false);
}
private void ImageFromSelectedFile(IMediaItem item, bool noMsgBox)
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)
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);
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);
return;
}
- if (item is MemoryImageMediaItem)
+ if (item.IsImage)
{
if (isSelectedPage)
ImageSelectedPicture.Image = item.CreateImage();
}
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; //正常終了
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();
}
{
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();
}
if (item != null)
{
var ext = item.Extension;
- var imageService = this.pictureService[serviceName];
if (imageService.CheckFileExtension(ext) &&
imageService.CheckFileSize(ext, item.Size))
{
}
}
- if (this.SelectedServiceChanged != null)
- this.SelectedServiceChanged(this, EventArgs.Empty);
+ this.SelectedServiceChanged?.Invoke(this, EventArgs.Empty);
}
private void SetImagePageCombo(SelectedMedia media = null)
ImagePageCombo.Items.Add(media);
ImagefilePathText.Text = media.Path;
+ AlternativeTextBox.Text = media.AltText;
ImagePageCombo.SelectedIndex = 0;
}
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;
media.Item = null;
media.Type = MyCommon.UploadFileType.Invalid;
- if (index == selectedIndex) ImagefilePathText.Text = "";
+ if (index == selectedIndex)
+ {
+ ImagefilePathText.Text = "";
+ AlternativeTextBox.Text = "";
+ }
}
private void ValidateSelectedImagePage()
var media = (SelectedMedia)ImagePageCombo.Items[idx];
ImageServiceCombo.Enabled = (idx == 0); // idx == 0 以外では投稿先サービスを選べないようにする
ImagefilePathText.Text = media.Path;
+ AlternativeTextBox.Text = media.AltText;
ImageFromSelectedFile(media.Item, true);
}
{
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);
+ }
}
}