private async void OpenURLMenuItem_Click(object sender, EventArgs e)
{
var linkElements = this.tweetDetailsView.GetLinkElements();
if (linkElements.Length > 0)
{
UrlDialog.ClearUrl();
string openUrlStr = "";
if (linkElements.Length == 1)
{
// ツイートに含まれる URL が 1 つのみの場合
// => OpenURL ダイアログを表示せずにリンクを開く
string urlStr = "";
try
{
urlStr = MyCommon.IDNEncode(linkElements[0].GetAttribute("href"));
}
catch (ArgumentException)
{
//変なHTML?
return;
}
catch (Exception)
{
return;
}
if (string.IsNullOrEmpty(urlStr)) return;
openUrlStr = MyCommon.urlEncodeMultibyteChar(urlStr);
// Ctrl+E で呼ばれた場合を考慮し isReverseSettings の判定を行わない
await this.OpenUriAsync(new Uri(openUrlStr));
}
else
{
// ツイートに含まれる URL が複数ある場合
// => OpenURL を表示しユーザーが選択したリンクを開く
foreach (var linkElm in linkElements)
{
string urlStr = "";
string linkText = "";
string href = "";
try
{
urlStr = linkElm.GetAttribute("title");
href = MyCommon.IDNEncode(linkElm.GetAttribute("href"));
if (string.IsNullOrEmpty(urlStr)) urlStr = href;
linkText = linkElm.InnerText;
}
catch (ArgumentException)
{
//変なHTML?
return;
}
catch (Exception)
{
return;
}
if (string.IsNullOrEmpty(urlStr)) continue;
UrlDialog.AddUrl(new OpenUrlItem(linkText, MyCommon.urlEncodeMultibyteChar(urlStr), href));
}
try
{
if (UrlDialog.ShowDialog() == DialogResult.OK)
{
openUrlStr = UrlDialog.SelectedUrl;
// Ctrlを押しながらリンクを開いた場合は、設定と逆の動作をするフラグを true としておく
await this.OpenUriAsync(new Uri(openUrlStr), MyCommon.IsKeyDown(Keys.Control));
}
}
catch (Exception)
{
return;
}
this.TopMost = this._cfgCommon.AlwaysTop;
}
}
}