OSDN Git Service

SouceLinkLabelのTabStopを常にFalseに
[opentween/open-tween.git] / Tween / Tween.vb
index e9a6e8a..53ee4cc 100644 (file)
@@ -132,7 +132,7 @@ Public Class TweenMain
     Private _anchorPost As PostClass
     Private _anchorFlag As Boolean        'True:関連発言移動中(関連移動以外のオペレーションをするとFalseへ。Trueだとリスト背景色をアンカー発言選択中として描画)
 
-    Private _history As New List(Of String)   '発言履歴
+    Private _history As New List(Of PostingStatus)   '発言履歴
     Private _hisIdx As Integer                  '発言履歴カレントインデックス
 
     '発言投稿時のAPI引数(発言編集時に設定。手書きreplyでは設定されない)
@@ -161,10 +161,11 @@ Public Class TweenMain
     Private _brsBackColorAtTo As SolidBrush
     Private _brsBackColorNone As SolidBrush
     Private _brsDeactiveSelection As New SolidBrush(Color.FromKnownColor(KnownColor.ButtonFace)) 'Listにフォーカスないときの選択行の背景色
-    Private sf As New StringFormat()
+    'Private sf As New StringFormat()
     Private sfTab As New StringFormat()
 
     '''''''''''''''''''''''''''''''''''''''''''''''''''''
+    Private _apiGauge As New ToolStripAPIGauge()
     Private _statuses As TabInformations
     Private _itemCache() As ListViewItem
     Private _itemCacheIndex As Integer
@@ -188,12 +189,12 @@ Public Class TweenMain
     Private SecurityManager As InternetSecurityManager
     Private Thumbnail As Thumbnail
 
-    Private _homeCounter As Integer = 0
-    Private _homeCounterAdjuster As Integer = 0
-    Private _mentionCounter As Integer = 0
-    Private _dmCounter As Integer = 0
-    Private _pubSearchCounter As Integer = 0
-    Private _listsCounter As Integer = 0
+    'Private _homeCounter As Integer = 0
+    'Private _homeCounterAdjuster As Integer = 0
+    'Private _mentionCounter As Integer = 0
+    'Private _dmCounter As Integer = 0
+    'Private _pubSearchCounter As Integer = 0
+    'Private _listsCounter As Integer = 0
 
     Private UnreadCounter As Integer = -1
     Private UnreadAtCounter As Integer = -1
@@ -205,6 +206,8 @@ Public Class TweenMain
     'Private _FirstRefreshFlags As Boolean = False
     'Private _FirstListsRefreshFlags As Boolean = False
 
+    Private _DoFavRetweetFlags As Boolean = False
+
     '''''''''''''''''''''''''''''''''''''''''''''''''''''
     Private _postBrowserStatusText As String = ""
 
@@ -274,6 +277,14 @@ Public Class TweenMain
         Public inReplyToName As String = ""
         Public imageService As String = ""      '画像投稿サービス名
         Public imagePath As String = ""
+        Public Sub New()
+
+        End Sub
+        Public Sub New(ByVal status As String, ByVal replyToId As Long, ByVal replyToName As String)
+            Me.status = status
+            Me.inReplyToId = replyToId
+            Me.inReplyToName = replyToName
+        End Sub
     End Class
 
     Private Class SpaceKeyCanceler
@@ -318,11 +329,6 @@ Public Class TweenMain
         fDialog.Dispose()
         UrlDialog.Dispose()
         _spaceKeyCanceler.Dispose()
-        If TIconDic IsNot Nothing AndAlso TIconDic.Keys.Count > 0 Then
-            For Each value As Image In TIconDic.Values
-                value.Dispose()
-            Next
-        End If
         If NIconAt IsNot Nothing Then NIconAt.Dispose()
         If NIconAtRed IsNot Nothing Then NIconAtRed.Dispose()
         If NIconAtSmoke IsNot Nothing Then NIconAtSmoke.Dispose()
@@ -350,7 +356,7 @@ Public Class TweenMain
         If _brsBackColorNone IsNot Nothing Then _brsBackColorNone.Dispose()
         If _brsDeactiveSelection IsNot Nothing Then _brsDeactiveSelection.Dispose()
         shield.Dispose()
-        sf.Dispose()
+        'sf.Dispose()
         sfTab.Dispose()
         For Each bw As BackgroundWorker In _bw
             If bw IsNot Nothing Then
@@ -360,6 +366,8 @@ Public Class TweenMain
         If _bwFollower IsNot Nothing Then
             _bwFollower.Dispose()
         End If
+        Me._apiGauge.Dispose()
+        If TIconDic IsNot Nothing Then DirectCast(TIconDic, IDisposable).Dispose()
     End Sub
 
     Private Sub LoadIcon(ByRef IconInstance As Icon, ByVal FileName As String)
@@ -519,7 +527,7 @@ Public Class TweenMain
         TabDialog.Owner = Me
         UrlDialog.Owner = Me
 
-        _history.Add("")
+        _history.Add(New PostingStatus)
         _hisIdx = 0
         _reply_to_id = 0
         _reply_to_name = ""
@@ -572,9 +580,9 @@ Public Class TweenMain
         _brsBackColorNone = New SolidBrush(_clListBackcolor)
 
         ' StringFormatオブジェクトへの事前設定
-        sf.Alignment = StringAlignment.Near
-        sf.LineAlignment = StringAlignment.Near
-        sf.FormatFlags = StringFormatFlags.LineLimit
+        'sf.Alignment = StringAlignment.Near             ' Textを近くへ配置(左から右の場合は左寄せ)
+        'sf.LineAlignment = StringAlignment.Near         ' Textを近くへ配置(上寄せ)
+        'sf.FormatFlags = StringFormatFlags.LineLimit    ' 
         sfTab.Alignment = StringAlignment.Center
         sfTab.LineAlignment = StringAlignment.Center
 
@@ -647,7 +655,7 @@ Public Class TweenMain
 
         SettingDialog.NameBalloon = _cfgCommon.NameBalloon
         SettingDialog.PostCtrlEnter = _cfgCommon.PostCtrlEnter
-
+        SettingDialog.PostShiftEnter = _cfgCommon.PostShiftEnter
 
         SettingDialog.CountApi = _cfgCommon.CountApi
         SettingDialog.CountApiReply = _cfgCommon.CountApiReply
@@ -683,7 +691,8 @@ Public Class TweenMain
 
         SettingDialog.UseUnreadStyle = _cfgCommon.UseUnreadStyle
         SettingDialog.DefaultTimeOut = _cfgCommon.DefaultTimeOut
-        SettingDialog.ProtectNotInclude = _cfgCommon.ProtectNotInclude
+        'SettingDialog.ProtectNotInclude = _cfgCommon.ProtectNotInclude
+        SettingDialog.RetweetNoConfirm = _cfgCommon.RetweetNoConfirm
         SettingDialog.PlaySound = _cfgCommon.PlaySound
         SettingDialog.DateTimeFormat = _cfgCommon.DateTimeFormat
         SettingDialog.LimitBalloon = _cfgCommon.LimitBalloon
@@ -753,10 +762,13 @@ Public Class TweenMain
         SettingDialog.MoreCountApi = _cfgCommon.MoreCountApi
         SettingDialog.FirstCountApi = _cfgCommon.FirstCountApi
         SettingDialog.SearchCountApi = _cfgCommon.SearchCountApi
+        SettingDialog.FavoritesCountApi = _cfgCommon.FavoritesCountApi
         'If _cfgCommon.UseAdditionalCount Then
         '    _FirstRefreshFlags = True
         '    _FirstListsRefreshFlags = True
         'End If
+        SettingDialog.UserstreamStartup = _cfgCommon.UserstreamStartup
+        SettingDialog.UserstreamPeriodInt = _cfgCommon.UserstreamPeriod
 
         'ハッシュタグ関連
         HashSupl = New AtIdSupplement(_cfgCommon.HashTags, "#")
@@ -875,6 +887,10 @@ Public Class TweenMain
         ShortUrl.BitlyKey = SettingDialog.BitlyPwd
         HttpTwitter.TwitterUrl = _cfgCommon.TwitterUrl
         HttpTwitter.TwitterSearchUrl = _cfgCommon.TwitterSearchUrl
+        tw.TrackWord = _cfgCommon.TrackWord
+        TrackToolStripMenuItem.Checked = Not String.IsNullOrEmpty(tw.TrackWord)
+        tw.AllAtReply = _cfgCommon.AllAtReply
+        AllrepliesToolStripMenuItem.Checked = tw.AllAtReply
 
         Outputz.Key = SettingDialog.OutputzKey
         Outputz.Enabled = SettingDialog.OutputzEnabled
@@ -1001,7 +1017,7 @@ Public Class TweenMain
         End If
 
         'アイコンリスト作成
-        TIconDic = New Dictionary(Of String, Image)
+        TIconDic = New ImageDictionary(5000)
 
         tw.DetailIcon = TIconDic
 
@@ -1009,6 +1025,7 @@ Public Class TweenMain
         StatusLabelUrl.Text = ""            '画面左下のリンク先URL表示部を初期化
         NameLabel.Text = ""                 '発言詳細部名前ラベル初期化
         DateTimeLabel.Text = ""             '発言詳細部日時ラベル初期化
+        SourceLinkLabel.Text = ""           'Source部分初期化
 
         '<<<<<<<<タブ関連>>>>>>>
         'デフォルトタブの存在チェック、ない場合には追加
@@ -1050,6 +1067,7 @@ Public Class TweenMain
         Me.JumpReadOpMenuItem.ShortcutKeyDisplayString = "Space"
         CopySTOTMenuItem.ShortcutKeyDisplayString = "Ctrl+C"
         CopyURLMenuItem.ShortcutKeyDisplayString = "Ctrl+Shift+C"
+        CopyUserIdStripMenuItem.ShortcutKeyDisplayString = "Shift+Alt+C"
 
         If SettingDialog.MinimizeToTray = False OrElse Me.WindowState <> FormWindowState.Minimized Then
             Me.Visible = True
@@ -1171,45 +1189,59 @@ Public Class TweenMain
 #If DEBUG Then
         Dim sw As Stopwatch = Stopwatch.StartNew()
 #End If
-        If _homeCounter > 0 Then Interlocked.Decrement(_homeCounter)
-        If _mentionCounter > 0 Then Interlocked.Decrement(_mentionCounter)
-        If _dmCounter > 0 Then Interlocked.Decrement(_dmCounter)
-        If _pubSearchCounter > 0 Then Interlocked.Decrement(_pubSearchCounter)
-        If _listsCounter > 0 Then Interlocked.Decrement(_listsCounter)
+        Static homeCounter As Integer = 0
+        Static mentionCounter As Integer = 0
+        Static dmCounter As Integer = 0
+        Static pubSearchCounter As Integer = 0
+        Static listsCounter As Integer = 0
+        Static usCounter As Integer = 0
+
+        If homeCounter > 0 Then Interlocked.Decrement(homeCounter)
+        If mentionCounter > 0 Then Interlocked.Decrement(mentionCounter)
+        If dmCounter > 0 Then Interlocked.Decrement(dmCounter)
+        If pubSearchCounter > 0 Then Interlocked.Decrement(pubSearchCounter)
+        If listsCounter > 0 Then Interlocked.Decrement(listsCounter)
+        If usCounter > 0 Then Interlocked.Decrement(usCounter)
 
         ''タイマー初期化
-        If _homeCounter <= 0 AndAlso SettingDialog.TimelinePeriodInt > 0 Then
-            Dim period As Integer
-            Interlocked.Exchange(period, 0)
-            Interlocked.Add(period, SettingDialog.TimelinePeriodInt)
-            Interlocked.Add(period, -_homeCounterAdjuster)
-            Interlocked.Exchange(_homeCounter, period)
+        If homeCounter <= 0 AndAlso SettingDialog.TimelinePeriodInt > 0 Then
+            'Dim period As Integer
+            'Interlocked.Exchange(period, 0)
+            'Interlocked.Add(period, SettingDialog.TimelinePeriodInt)
+            'Interlocked.Add(period, -_homeCounterAdjuster)
+            'Interlocked.Exchange(_homeCounter, period)
+            Interlocked.Exchange(homeCounter, SettingDialog.TimelinePeriodInt)
             GetTimeline(WORKERTYPE.Timeline, 1, 0, "")
         End If
-        If _mentionCounter <= 0 AndAlso SettingDialog.ReplyPeriodInt > 0 Then
-            Interlocked.Exchange(_mentionCounter, SettingDialog.ReplyPeriodInt)
+        If mentionCounter <= 0 AndAlso SettingDialog.ReplyPeriodInt > 0 Then
+            Interlocked.Exchange(mentionCounter, SettingDialog.ReplyPeriodInt)
             GetTimeline(WORKERTYPE.Reply, 1, 0, "")
         End If
-        If _dmCounter <= 0 AndAlso SettingDialog.DMPeriodInt > 0 Then
-            Interlocked.Exchange(_dmCounter, SettingDialog.DMPeriodInt)
+        If dmCounter <= 0 AndAlso SettingDialog.DMPeriodInt > 0 Then
+            Interlocked.Exchange(dmCounter, SettingDialog.DMPeriodInt)
             GetTimeline(WORKERTYPE.DirectMessegeRcv, 1, 0, "")
         End If
-        If _pubSearchCounter <= 0 AndAlso SettingDialog.PubSearchPeriodInt > 0 Then
-            Interlocked.Exchange(_pubSearchCounter, SettingDialog.PubSearchPeriodInt)
+        If pubSearchCounter <= 0 AndAlso SettingDialog.PubSearchPeriodInt > 0 Then
+            Interlocked.Exchange(pubSearchCounter, SettingDialog.PubSearchPeriodInt)
             GetTimeline(WORKERTYPE.PublicSearch, 1, 0, "")
         End If
-        If _listsCounter <= 0 AndAlso SettingDialog.ListsPeriodInt > 0 Then
-            Interlocked.Exchange(_listsCounter, SettingDialog.ListsPeriodInt)
+        If listsCounter <= 0 AndAlso SettingDialog.ListsPeriodInt > 0 Then
+            Interlocked.Exchange(listsCounter, SettingDialog.ListsPeriodInt)
             GetTimeline(WORKERTYPE.List, 1, 0, "")
         End If
+        If usCounter <= 0 AndAlso SettingDialog.UserstreamPeriodInt > 0 Then
+            Interlocked.Exchange(usCounter, SettingDialog.UserstreamPeriodInt)
+            RefreshTimeline(True)
+        End If
+
 #If DEBUG Then
         sw.Stop()
-        Console.WriteLine("Counter: Home {0} Reply {1} Dm {2} Search {3} Lists {4}", _homeCounter, _mentionCounter, _dmCounter, _pubSearchCounter, _listsCounter)
+        Console.WriteLine("Counter: Home {0} Reply {1} Dm {2} Search {3} Lists {4}", homeCounter, mentionCounter, dmCounter, pubSearchCounter, listsCounter)
         Console.WriteLine(sw.Elapsed)
 #End If
     End Sub
 
-    Private Sub RefreshTimeline()
+    Private Sub RefreshTimeline(ByVal isUserStream As Boolean)
         'スクロール制御準備
         Dim smode As Integer = -1    '-1:制御しない,-2:最新へ,その他:topitem使用
         Dim topId As Long = GetScrollPos(smode)
@@ -1228,7 +1260,7 @@ Public Class TweenMain
         Dim soundFile As String = ""
         Dim addCount As Integer = 0
         Dim isMention As Boolean = False
-        addCount = _statuses.SubmitUpdate(soundFile, notifyPosts, isMention)
+        addCount = _statuses.SubmitUpdate(soundFile, notifyPosts, isMention, isUserStream)
 
         If _endingFlag Then Exit Sub
 
@@ -1600,8 +1632,8 @@ Public Class TweenMain
         If StatusText.Text.Trim.Length = 0 Then
             If Not ImageSelectionPanel.Enabled Then
                 DoRefresh()
+                Exit Sub
             End If
-            Exit Sub
         End If
 
         If _curPost IsNot Nothing AndAlso StatusText.Text.Trim() = String.Format("RT @{0}: {1}", _curPost.Name, _curPost.Data) Then
@@ -1611,7 +1643,7 @@ Public Class TweenMain
                                                            MessageBoxIcon.Question)
             Select Case rtResult
                 Case Windows.Forms.DialogResult.Yes
-                    doReTweetOriginal(False)
+                    doReTweetOfficial(False)
                     StatusText.Text = ""
                     Exit Sub
                 Case Windows.Forms.DialogResult.Cancel
@@ -1619,7 +1651,7 @@ Public Class TweenMain
             End Select
         End If
 
-        _history(_history.Count - 1) = StatusText.Text.Trim
+        _history(_history.Count - 1) = New PostingStatus(StatusText.Text.Trim, _reply_to_id, _reply_to_name)
 
         If SettingDialog.UrlConvertAuto Then
             StatusText.SelectionStart = StatusText.Text.Length
@@ -1657,6 +1689,9 @@ Public Class TweenMain
             '複数行でEnter投稿の場合、Ctrlも押されていたらフッタ付加しない
             isRemoveFooter = My.Computer.Keyboard.CtrlKeyDown
         End If
+        If SettingDialog.PostShiftEnter Then
+            isRemoveFooter = My.Computer.Keyboard.CtrlKeyDown
+        End If
         If Not isRemoveFooter AndAlso (StatusText.Text.Contains("RT @") OrElse StatusText.Text.Contains("QT @")) Then
             isRemoveFooter = True
         End If
@@ -1781,7 +1816,7 @@ Public Class TweenMain
         _reply_to_id = 0
         _reply_to_name = ""
         StatusText.Text = ""
-        _history.Add("")
+        _history.Add(New PostingStatus)
         _hisIdx = _history.Count - 1
         If Not ToolStripFocusLockMenuItem.Checked Then
             DirectCast(ListTab.SelectedTab.Tag, Control).Focus()
@@ -1862,6 +1897,7 @@ Public Class TweenMain
         If args.type <> WORKERTYPE.OpenUri Then bw.ReportProgress(0, "") 'Notifyアイコンアニメーション開始
         Select Case args.type
             Case WORKERTYPE.Timeline, WORKERTYPE.Reply
+                bw.ReportProgress(50, MakeStatusMessage(args, False))
                 ret = tw.GetTimelineApi(read, args.type, args.page = -1, _initial)
                 '新着時未読クリア
                 If ret = "" AndAlso args.type = WORKERTYPE.Timeline AndAlso SettingDialog.ReadOldPosts Then
@@ -1966,13 +2002,16 @@ Public Class TweenMain
                     Next
                 Else
                     Dim picSvc As New PictureService(tw)
+                    If String.IsNullOrEmpty(args.status.status) Then args.status.status = ""
                     ret = picSvc.Upload(args.status.imagePath, args.status.status, args.status.imageService)
                 End If
                 bw.ReportProgress(300)
                 rslt.status = args.status
             Case WORKERTYPE.Retweet
                 bw.ReportProgress(200)
-                ret = tw.PostRetweet(args.ids(0), read)
+                For i As Integer = 0 To args.ids.Count - 1
+                    ret = tw.PostRetweet(args.ids(i), read)
+                Next
                 bw.ReportProgress(300)
             Case WORKERTYPE.Follower
                 bw.ReportProgress(50, My.Resources.UpdateFollowersMenuItem1_ClickText1)
@@ -2037,6 +2076,11 @@ Public Class TweenMain
                 End If
                 '振り分け
                 rslt.addCount = _statuses.DistributePosts()
+            Case WORKERTYPE.Related
+                bw.ReportProgress(50, MakeStatusMessage(args, False))
+                Dim tb As TabClass = _statuses.GetTabByName(args.tName)
+                ret = tw.GetRelatedResultsApi(read, tb)
+                rslt.addCount = _statuses.DistributePosts()
         End Select
         'キャンセル要求
         If bw.CancellationPending Then
@@ -2093,7 +2137,6 @@ Public Class TweenMain
         End If
 
         e.Result = rslt
-
     End Sub
 
     Private Function MakeStatusMessage(ByVal AsyncArg As GetWorkerArg, ByVal Finish As Boolean) As String
@@ -2119,6 +2162,8 @@ Public Class TweenMain
                     smsg = "Search refreshing..."
                 Case WORKERTYPE.List
                     smsg = "List refreshing..."
+                Case WORKERTYPE.Related
+                    smsg = "Related refreshing..."
             End Select
         Else
             '完了メッセージ
@@ -2143,6 +2188,8 @@ Public Class TweenMain
                     smsg = "Search refreshed"
                 Case WORKERTYPE.List
                     smsg = "List refreshed"
+                Case WORKERTYPE.Related
+                    smsg = "Related refreshed"
             End Select
         End If
         Return smsg
@@ -2195,6 +2242,17 @@ Public Class TweenMain
         If rslt.type = WORKERTYPE.FavRemove Then
             DispSelectedPost()          ' 詳細画面書き直し
             Dim favTabName As String = _statuses.GetTabByType(TabUsageType.Favorites).TabName
+            Dim fidx As Integer
+            If _curTab.Text.Equals(favTabName) Then
+                If _curList.FocusedItem IsNot Nothing Then
+                    fidx = _curList.FocusedItem.Index
+                ElseIf _curList.TopItem IsNot Nothing Then
+                    fidx = _curList.TopItem.Index
+                Else
+                    fidx = 0
+                End If
+            End If
+
             For Each i As Long In rslt.sIds
                 _statuses.RemoveFavPost(i)
             Next
@@ -2202,7 +2260,7 @@ Public Class TweenMain
                 _itemCache = Nothing    'キャッシュ破棄
                 _postCache = Nothing
                 _curPost = Nothing
-                _curItemIndex = -1
+                '_curItemIndex = -1
             End If
             For Each tp As TabPage In ListTab.TabPages
                 If tp.Text = favTabName Then
@@ -2210,6 +2268,20 @@ Public Class TweenMain
                     Exit For
                 End If
             Next
+            If _curTab.Text.Equals(favTabName) Then
+                _curList.SelectedIndices.Clear()
+                If _statuses.Tabs(favTabName).AllCount > 0 Then
+                    If _statuses.Tabs(favTabName).AllCount - 1 > fidx AndAlso fidx > -1 Then
+                        _curList.SelectedIndices.Add(fidx)
+                    Else
+                        _curList.SelectedIndices.Add(_statuses.Tabs(favTabName).AllCount - 1)
+                    End If
+                    If _curList.SelectedIndices.Count > 0 Then
+                        _curList.EnsureVisible(_curList.SelectedIndices(0))
+                        _curList.FocusedItem = _curList.Items(_curList.SelectedIndices(0))
+                    End If
+                End If
+            End If
         End If
 
         'リストに反映
@@ -2230,8 +2302,9 @@ Public Class TweenMain
            rslt.type = WORKERTYPE.Favorites OrElse _
            rslt.type = WORKERTYPE.Follower OrElse _
            rslt.type = WORKERTYPE.FavAdd OrElse _
-           rslt.type = WORKERTYPE.FavRemove Then
-            RefreshTimeline() 'リスト反映
+           rslt.type = WORKERTYPE.FavRemove OrElse _
+           rslt.type = WORKERTYPE.Related Then
+            RefreshTimeline(False) 'リスト反映
         End If
 
         Select Case rslt.type
@@ -2305,6 +2378,11 @@ Public Class TweenMain
                         args.type = WORKERTYPE.PostMessage
                         args.status = rslt.status
                         RunAsync(args)
+                    Else
+                        If ToolStripFocusLockMenuItem.Checked Then
+                            '連投モードのときだけEnterイベントが起きないので強制的に背景色を戻す
+                            StatusText_Enter(StatusText, New EventArgs)
+                        End If
                     End If
                 End If
                 If rslt.retMsg.Length = 0 AndAlso SettingDialog.PostAndGet Then GetTimeline(WORKERTYPE.Timeline, 1, 0, "")
@@ -2388,18 +2466,31 @@ Public Class TweenMain
         FavoriteChange(False)
     End Sub
 
-    Private Sub FavoriteChange(ByVal FavAdd As Boolean)
+
+    Private Sub FavoriteRetweetMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FavoriteRetweetMenuItem.Click, FavoriteRetweetContextMenu.Click
+        FavoritesRetweetOriginal()
+    End Sub
+
+    Private Sub FavoriteRetweetUnofficialMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FavoriteRetweetUnofficialMenuItem.Click, FavoriteRetweetUnofficialContextMenu.Click
+        FavoritesRetweetUnofficial()
+    End Sub
+
+    Private Sub FavoriteChange(ByVal FavAdd As Boolean, Optional ByVal multiFavoriteChangeDialogEnable As Boolean = True)
         'TrueでFavAdd,FalseでFavRemove
         If _statuses.Tabs(_curTab.Text).TabType = TabUsageType.DirectMessage OrElse _curList.SelectedIndices.Count = 0 Then Exit Sub
 
         '複数fav確認msg
         If _curList.SelectedIndices.Count > 250 AndAlso FavAdd Then
-            MessageBox.Show("一度にふぁぼ追加が実行できるのは250件までです")
+            MessageBox.Show(My.Resources.FavoriteLimitCountText)
+            _DoFavRetweetFlags = False
             Exit Sub
-        ElseIf _curList.SelectedIndices.Count > 1 Then
+        ElseIf multiFavoriteChangeDialogEnable AndAlso _curList.SelectedIndices.Count > 1 Then
             If FavAdd Then
-                If MessageBox.Show(My.Resources.FavAddToolStripMenuItem_ClickText1, My.Resources.FavAddToolStripMenuItem_ClickText2, _
+                Dim QuestionText As String = My.Resources.FavAddToolStripMenuItem_ClickText1
+                If _DoFavRetweetFlags Then QuestionText = My.Resources.FavoriteRetweetQuestionText3
+                If MessageBox.Show(QuestionText, My.Resources.FavAddToolStripMenuItem_ClickText2, _
                                    MessageBoxButtons.OKCancel, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Cancel Then
+                    _DoFavRetweetFlags = False
                     Exit Sub
                 End If
             Else
@@ -2534,19 +2625,16 @@ Public Class TweenMain
         If ListTab.SelectedTab Is Nothing Then Exit Sub
         If _statuses Is Nothing OrElse _statuses.Tabs Is Nothing OrElse Not _statuses.Tabs.ContainsKey(ListTab.SelectedTab.Text) Then Exit Sub
         If _curPost Is Nothing Then
-            ShowProfileMenuItem.Enabled = False
-            ListManageUserContextToolStripMenuItem2.Enabled = False
             ReplyStripMenuItem.Enabled = False
             ReplyAllStripMenuItem.Enabled = False
             DMStripMenuItem.Enabled = False
+            ShowProfileMenuItem.Enabled = False
+            ListManageUserContextToolStripMenuItem2.Enabled = False
             MoveToFavToolStripMenuItem.Enabled = False
-            StatusOpenMenuItem.Enabled = False
-            FavorareMenuItem.Enabled = False
             TabMenuItem.Enabled = False
             IDRuleMenuItem.Enabled = False
             ReadedStripMenuItem.Enabled = False
             UnreadStripMenuItem.Enabled = False
-            DeleteStripMenuItem.Enabled = False
         Else
             ShowProfileMenuItem.Enabled = True
             ListManageUserContextToolStripMenuItem2.Enabled = True
@@ -2554,42 +2642,51 @@ Public Class TweenMain
             ReplyAllStripMenuItem.Enabled = True
             DMStripMenuItem.Enabled = True
             MoveToFavToolStripMenuItem.Enabled = True
-            StatusOpenMenuItem.Enabled = True
-            FavorareMenuItem.Enabled = True
             TabMenuItem.Enabled = True
             IDRuleMenuItem.Enabled = True
             ReadedStripMenuItem.Enabled = True
             UnreadStripMenuItem.Enabled = True
-            DeleteStripMenuItem.Enabled = True
         End If
-        If _statuses.Tabs(ListTab.SelectedTab.Text).TabType = TabUsageType.DirectMessage OrElse _curPost Is Nothing Then
+        If _statuses.Tabs(ListTab.SelectedTab.Text).TabType = TabUsageType.DirectMessage OrElse _curPost Is Nothing OrElse _curPost.IsDm Then
             FavAddToolStripMenuItem.Enabled = False
             FavRemoveToolStripMenuItem.Enabled = False
             StatusOpenMenuItem.Enabled = False
             FavorareMenuItem.Enabled = False
-        Else
-            If IsNetworkAvailable() Then
-                FavAddToolStripMenuItem.Enabled = True
-                FavRemoveToolStripMenuItem.Enabled = True
-                StatusOpenMenuItem.Enabled = True
-                FavorareMenuItem.Enabled = True
-            End If
-        End If
-        If _curPost Is Nothing OrElse _curPost.IsDm Then
+            ShowRelatedStatusesMenuItem.Enabled = False
+
             ReTweetStripMenuItem.Enabled = False
             ReTweetOriginalStripMenuItem.Enabled = False
             QuoteStripMenuItem.Enabled = False
+            FavoriteRetweetContextMenu.Enabled = False
+            FavoriteRetweetUnofficialContextMenu.Enabled = False
             If _curPost IsNot Nothing AndAlso _curPost.IsDm Then DeleteStripMenuItem.Enabled = True
         Else
+            FavAddToolStripMenuItem.Enabled = True
+            FavRemoveToolStripMenuItem.Enabled = True
+            StatusOpenMenuItem.Enabled = True
+            FavorareMenuItem.Enabled = True
+            ShowRelatedStatusesMenuItem.Enabled = True  'PublicSearchの時問題出るかも
+
             If _curPost.IsMe Then
                 ReTweetOriginalStripMenuItem.Enabled = False
+                FavoriteRetweetContextMenu.Enabled = False
                 DeleteStripMenuItem.Enabled = True
             Else
-                ReTweetOriginalStripMenuItem.Enabled = True
                 DeleteStripMenuItem.Enabled = False
+                If _curPost.IsProtect Then
+                    ReTweetOriginalStripMenuItem.Enabled = False
+                    ReTweetStripMenuItem.Enabled = False
+                    QuoteStripMenuItem.Enabled = False
+                    FavoriteRetweetContextMenu.Enabled = False
+                    FavoriteRetweetUnofficialContextMenu.Enabled = False
+                Else
+                    ReTweetOriginalStripMenuItem.Enabled = True
+                    ReTweetStripMenuItem.Enabled = True
+                    QuoteStripMenuItem.Enabled = True
+                    FavoriteRetweetContextMenu.Enabled = True
+                    FavoriteRetweetUnofficialContextMenu.Enabled = True
+                End If
             End If
-            ReTweetStripMenuItem.Enabled = True
-            QuoteStripMenuItem.Enabled = True
         End If
         If _statuses.Tabs(ListTab.SelectedTab.Text).TabType <> TabUsageType.Favorites Then
             RefreshMoreStripMenuItem.Enabled = True
@@ -2835,15 +2932,15 @@ Public Class TweenMain
 
         If result = Windows.Forms.DialogResult.OK Then
             SyncLock _syncObject
-                Try
-                    If SettingDialog.TimelinePeriodInt > 0 Then
-                        _homeCounterAdjuster = 0
-                    End If
-                Catch ex As Exception
-                    ex.Data("Instance") = "Set Timers"
-                    ex.Data("IsTerminatePermission") = False
-                    Throw
-                End Try
+                'Try
+                '    If SettingDialog.TimelinePeriodInt > 0 Then
+                '        _homeCounterAdjuster = 0
+                '    End If
+                'Catch ex As Exception
+                '    ex.Data("Instance") = "Set Timers"
+                '    ex.Data("IsTerminatePermission") = False
+                '    Throw
+                'End Try
                 'tw.CountApi = SettingDialog.CountApi
                 'tw.CountApiReply = SettingDialog.CountApiReply
                 tw.TinyUrlResolve = SettingDialog.TinyUrlResolve
@@ -3134,7 +3231,8 @@ Public Class TweenMain
             If tabType = TabUsageType.DirectMessage OrElse _
                tabType = TabUsageType.Favorites OrElse _
                tabType = TabUsageType.Home OrElse _
-               tabType = TabUsageType.Mentions Then
+               tabType = TabUsageType.Mentions OrElse _
+               tabType = TabUsageType.Related Then
                 If _statuses.GetTabByType(tabType) IsNot Nothing Then Return False
             End If
         End If
@@ -3295,6 +3393,7 @@ Public Class TweenMain
         AddHandler _listCustom.CacheVirtualItems, AddressOf MyList_CacheVirtualItems
         AddHandler _listCustom.RetrieveVirtualItem, AddressOf MyList_RetrieveVirtualItem
         AddHandler _listCustom.DrawSubItem, AddressOf MyList_DrawSubItem
+        AddHandler _listCustom.HScrolled, AddressOf MyList_HScrolled
 
         InitColumnText()
         _colHd1.Text = ColumnText(0)
@@ -3315,7 +3414,7 @@ Public Class TweenMain
         _colHd8.Width = 50
 
         If (_statuses.Tabs.ContainsKey(tabName) AndAlso _statuses.Tabs(tabName).TabType = TabUsageType.Mentions) _
-           OrElse (Not _statuses.IsDefaultTab(tabName) AndAlso tabType <> TabUsageType.PublicSearch AndAlso tabType <> TabUsageType.Lists) Then
+           OrElse (Not _statuses.IsDefaultTab(tabName) AndAlso tabType <> TabUsageType.PublicSearch AndAlso tabType <> TabUsageType.Lists AndAlso tabType <> TabUsageType.Related) Then
             TabDialog.AddTab(tabName)
         End If
 
@@ -3457,6 +3556,7 @@ Public Class TweenMain
         RemoveHandler _listCustom.CacheVirtualItems, AddressOf MyList_CacheVirtualItems
         RemoveHandler _listCustom.RetrieveVirtualItem, AddressOf MyList_RetrieveVirtualItem
         RemoveHandler _listCustom.DrawSubItem, AddressOf MyList_DrawSubItem
+        RemoveHandler _listCustom.HScrolled, AddressOf MyList_HScrolled
 
         TabDialog.RemoveTab(TabName)
 
@@ -3612,7 +3712,11 @@ Public Class TweenMain
 
     Public Overloads Sub ShowSuplDialog(ByVal owner As TextBox, ByVal dialog As AtIdSupplement, ByVal offset As Integer, ByVal startswith As String)
         dialog.StartsWith = startswith
-        dialog.ShowDialog()
+        If dialog.Visible Then
+            dialog.Focus()
+        Else
+            dialog.ShowDialog()
+        End If
         Me.TopMost = SettingDialog.AlwaysTop
         Dim selStart As Integer = owner.SelectionStart
         Dim fHalf As String = ""
@@ -3684,7 +3788,8 @@ Public Class TweenMain
     Private Function GetRestStatusCount(ByVal isAuto As Boolean, ByVal isAddFooter As Boolean) As Integer
         '文字数カウント
         Dim pLen As Integer = 140 - StatusText.Text.Length
-        If (isAuto AndAlso Not My.Computer.Keyboard.ShiftKeyDown) OrElse _
+        If (isAuto AndAlso Not My.Computer.Keyboard.CtrlKeyDown AndAlso SettingDialog.PostShiftEnter) OrElse _
+           (isAuto AndAlso Not My.Computer.Keyboard.ShiftKeyDown AndAlso Not SettingDialog.PostShiftEnter) OrElse _
            (Not isAuto AndAlso isAddFooter) Then
             If SettingDialog.UseRecommendStatus Then
                 pLen -= SettingDialog.RecommendStatusText.Length
@@ -3726,7 +3831,7 @@ Public Class TweenMain
             Catch ex As Exception
                 '不正な要求に対する間に合わせの応答
                 Dim sitem() As String = {"", "", "", "", "", "", "", ""}
-                e.Item = New ListViewItem(sitem, "")
+                e.Item = New ImageListViewItem(sitem, "")
             End Try
         End If
     End Sub
@@ -3757,13 +3862,13 @@ Public Class TweenMain
         If Post.IsMark Then mk += "♪"
         If Post.IsProtect Then mk += "Ю"
         If Post.InReplyToId > 0 Then mk += "⇒"
-        Dim itm As ListViewItem
+        Dim itm As ImageListViewItem
         If Post.RetweetedId = 0 Then
             Dim sitem() As String = {"", Post.Nickname, Post.Data, Post.PDate.ToString(SettingDialog.DateTimeFormat), Post.Name, "", mk, Post.Source}
-            itm = New ListViewItem(sitem, Post.ImageUrl)
+            itm = New ImageListViewItem(sitem, DirectCast(Me.TIconDic, ImageDictionary), Post.ImageUrl)
         Else
-            Dim sitem() As String = {"", Post.Nickname, Post.Data, Post.PDate.ToString(SettingDialog.DateTimeFormat), Post.Name + "(RT:" + Post.RetweetedBy + ")", "", mk, Post.Source}
-            itm = New ListViewItem(sitem, Post.ImageUrl)
+            Dim sitem() As String = {"", Post.Nickname, Post.Data, Post.PDate.ToString(SettingDialog.DateTimeFormat), Post.Name + Environment.NewLine + "(RT:" + Post.RetweetedBy + ")", "", mk, Post.Source}
+            itm = New ImageListViewItem(sitem, DirectCast(Me.TIconDic, ImageDictionary), Post.ImageUrl)
         End If
 
         Dim read As Boolean = Post.IsRead
@@ -3779,6 +3884,11 @@ Public Class TweenMain
         e.DrawDefault = True
     End Sub
 
+    Private Sub MyList_HScrolled(ByVal sender As Object, ByVal e As EventArgs)
+        Dim listView As DetailsListView = DirectCast(sender, DetailsListView)
+        listView.Refresh()
+    End Sub
+
     Private Sub MyList_DrawItem(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DrawListViewItemEventArgs)
         If e.State = 0 Then Exit Sub
         e.DrawDefault = False
@@ -3815,34 +3925,45 @@ Public Class TweenMain
     Private Sub MyList_DrawSubItem(ByVal sender As Object, ByVal e As DrawListViewSubItemEventArgs)
         If e.ItemState = 0 Then Exit Sub
 
-        If e.ColumnIndex = 0 OrElse Math.Abs(e.Header.DisplayIndex - e.Item.ListView.Columns(0).DisplayIndex) = 1 Then
+        If e.ColumnIndex = 0 Then
             Me.DrawListViewItemIcon(e)
-        End If
-
-        If e.ColumnIndex > 0 Then
+        Else
             'アイコン以外の列
             Dim rct As RectangleF = e.Bounds
             Dim rctB As RectangleF = e.Bounds
             rct.Width = e.Header.Width
             rctB.Width = e.Header.Width
-            If _iconCol Then rctB.Height = e.Item.Font.Height
+            If _iconCol Then
+                rct.Y += e.Item.Font.Height
+                rct.Height -= e.Item.Font.Height
+                rctB.Height = e.Item.Font.Height
+            End If
+
 
             Dim heightDiff As Integer
             Dim drawLineCount As Integer = Math.Max(1, Math.DivRem(CType(rct.Height, Integer), e.Item.Font.Height, heightDiff))
 
-            If heightDiff > e.Item.Font.Height * 0.7 Then
-                rct.Height += e.Item.Font.Height
-                drawLineCount += 1
-            End If
+            'If heightDiff > e.Item.Font.Height * 0.7 Then
+            '    rct.Height += e.Item.Font.Height
+            '    drawLineCount += 1
+            'End If
 
             'フォントの高さの半分を足してるのは保険。無くてもいいかも。
             If Not _iconCol AndAlso drawLineCount <= 1 Then
-                rct.Inflate(0, CType(heightDiff / -2, Integer))
-                rct.Height += CType(e.Item.Font.Height / 2, Integer)
+                'rct.Inflate(0, CType(heightDiff / -2, Integer))
+                'rct.Height += CType(e.Item.Font.Height / 2, Integer)
+            ElseIf heightDiff < e.Item.Font.Height * 0.7 Then
+                '最終行が70%以上欠けていたら、最終行は表示しない
+                'rct.Height = CType((e.Item.Font.Height * drawLineCount) + (e.Item.Font.Height / 2), Single)
+                rct.Height = CType((e.Item.Font.Height * drawLineCount), Single) - 1
             Else
-                rct.Height = CType((e.Item.Font.Height * drawLineCount) + (e.Item.Font.Height / 2), Single)
+                drawLineCount += 1
             End If
 
+            'If Not _iconCol AndAlso drawLineCount > 1 Then
+            '    rct.Y += CType(e.Item.Font.Height * 0.2, Single)
+            '    If heightDiff >= e.Item.Font.Height * 0.8 Then rct.Height -= CType(e.Item.Font.Height * 0.2, Single)
+            'End If
             If Not e.Item.Selected Then     'e.ItemStateでうまく判定できない???
                 '選択されていない行
                 '文字色
@@ -3866,13 +3987,49 @@ Public Class TweenMain
                 If rct.Width > 0 Then
                     If _iconCol Then
                         Dim fnt As New Font(e.Item.Font, FontStyle.Bold)
-                        e.Graphics.DrawString(System.Environment.NewLine + e.Item.SubItems(2).Text, e.Item.Font, brs, rct, sf)
-                        e.Graphics.DrawString(e.Item.SubItems(4).Text + " / " + e.Item.SubItems(1).Text + " (" + e.Item.SubItems(3).Text + ") " + e.Item.SubItems(5).Text + e.Item.SubItems(6).Text + " [" + e.Item.SubItems(7).Text + "]", fnt, brs, rctB, sf)
+                        'e.Graphics.DrawString(System.Environment.NewLine + e.Item.SubItems(2).Text, e.Item.Font, brs, rct, sf)
+                        'e.Graphics.DrawString(e.Item.SubItems(4).Text + " / " + e.Item.SubItems(1).Text + " (" + e.Item.SubItems(3).Text + ") " + e.Item.SubItems(5).Text + e.Item.SubItems(6).Text + " [" + e.Item.SubItems(7).Text + "]", fnt, brs, rctB, sf)
+                        TextRenderer.DrawText(e.Graphics,
+                                              e.Item.SubItems(2).Text,
+                                              e.Item.Font,
+                                              Rectangle.Round(rct),
+                                              brs.Color,
+                                              TextFormatFlags.WordBreak Or
+                                              TextFormatFlags.EndEllipsis Or
+                                              TextFormatFlags.GlyphOverhangPadding Or
+                                              TextFormatFlags.NoPrefix)
+                        TextRenderer.DrawText(e.Graphics,
+                                              e.Item.SubItems(4).Text + " / " + e.Item.SubItems(1).Text + " (" + e.Item.SubItems(3).Text + ") " + e.Item.SubItems(5).Text + e.Item.SubItems(6).Text + " [" + e.Item.SubItems(7).Text + "]",
+                                              fnt,
+                                              Rectangle.Round(rctB),
+                                              brs.Color,
+                                              TextFormatFlags.SingleLine Or
+                                              TextFormatFlags.EndEllipsis Or
+                                              TextFormatFlags.GlyphOverhangPadding Or
+                                              TextFormatFlags.NoPrefix)
                         fnt.Dispose()
-                    ElseIf e.Bounds.Height < e.Item.Font.Height * 2 Then
-                        TextRenderer.DrawText(e.Graphics, e.SubItem.Text, e.Item.Font, Rectangle.Round(rct), brs.Color, TextFormatFlags.SingleLine Or TextFormatFlags.EndEllipsis Or TextFormatFlags.LeftAndRightPadding Or TextFormatFlags.NoPrefix)
+                    ElseIf drawLineCount = 1 Then
+                        TextRenderer.DrawText(e.Graphics,
+                                              e.SubItem.Text,
+                                              e.Item.Font,
+                                              Rectangle.Round(rct),
+                                              brs.Color,
+                                              TextFormatFlags.SingleLine Or
+                                              TextFormatFlags.EndEllipsis Or
+                                              TextFormatFlags.GlyphOverhangPadding Or
+                                              TextFormatFlags.NoPrefix Or
+                                              TextFormatFlags.VerticalCenter)
                     Else
-                        e.Graphics.DrawString(e.SubItem.Text, e.Item.Font, brs, rct, sf)
+                        'e.Graphics.DrawString(e.SubItem.Text, e.Item.Font, brs, rct, sf)
+                        TextRenderer.DrawText(e.Graphics,
+                                              e.SubItem.Text,
+                                              e.Item.Font,
+                                              Rectangle.Round(rct),
+                                              brs.Color,
+                                              TextFormatFlags.WordBreak Or
+                                              TextFormatFlags.EndEllipsis Or
+                                              TextFormatFlags.GlyphOverhangPadding Or
+                                              TextFormatFlags.NoPrefix)
                     End If
                 End If
                 If flg Then brs.Dispose()
@@ -3882,21 +4039,93 @@ Public Class TweenMain
                     Dim fnt As New Font(e.Item.Font, FontStyle.Bold)
                     If DirectCast(sender, Windows.Forms.Control).Focused Then
                         If _iconCol Then
-                            e.Graphics.DrawString(System.Environment.NewLine + e.Item.SubItems(2).Text, e.Item.Font, _brsHighLightText, rct, sf)
-                            e.Graphics.DrawString(e.Item.SubItems(4).Text + " / " + e.Item.SubItems(1).Text + " (" + e.Item.SubItems(3).Text + ") " + e.Item.SubItems(5).Text + e.Item.SubItems(6).Text + " [" + e.Item.SubItems(7).Text + "]", fnt, _brsHighLightText, rctB, sf)
-                        ElseIf e.Bounds.Height < e.Item.Font.Height * 2 Then
-                            TextRenderer.DrawText(e.Graphics, e.SubItem.Text, e.Item.Font, Rectangle.Round(rct), _brsHighLightText.Color, TextFormatFlags.SingleLine Or TextFormatFlags.EndEllipsis Or TextFormatFlags.LeftAndRightPadding Or TextFormatFlags.NoPrefix)
+                            'e.Graphics.DrawString(System.Environment.NewLine + e.Item.SubItems(2).Text, e.Item.Font, _brsHighLightText, rct, sf)
+                            'e.Graphics.DrawString(e.Item.SubItems(4).Text + " / " + e.Item.SubItems(1).Text + " (" + e.Item.SubItems(3).Text + ") " + e.Item.SubItems(5).Text + e.Item.SubItems(6).Text + " [" + e.Item.SubItems(7).Text + "]", fnt, _brsHighLightText, rctB, sf)
+                            TextRenderer.DrawText(e.Graphics,
+                                                  e.Item.SubItems(2).Text,
+                                                  e.Item.Font,
+                                                  Rectangle.Round(rct),
+                                                  _brsHighLightText.Color,
+                                                  TextFormatFlags.WordBreak Or
+                                                  TextFormatFlags.EndEllipsis Or
+                                                  TextFormatFlags.GlyphOverhangPadding Or
+                                                  TextFormatFlags.NoPrefix)
+                            TextRenderer.DrawText(e.Graphics,
+                                                  e.Item.SubItems(4).Text + " / " + e.Item.SubItems(1).Text + " (" + e.Item.SubItems(3).Text + ") " + e.Item.SubItems(5).Text + e.Item.SubItems(6).Text + " [" + e.Item.SubItems(7).Text + "]",
+                                                  fnt,
+                                                  Rectangle.Round(rctB),
+                                                  _brsHighLightText.Color,
+                                                  TextFormatFlags.SingleLine Or
+                                                  TextFormatFlags.EndEllipsis Or
+                                                  TextFormatFlags.GlyphOverhangPadding Or
+                                                  TextFormatFlags.NoPrefix)
+                        ElseIf drawLineCount = 1 Then
+                            TextRenderer.DrawText(e.Graphics,
+                                                  e.SubItem.Text,
+                                                  e.Item.Font,
+                                                  Rectangle.Round(rct),
+                                                  _brsHighLightText.Color,
+                                                  TextFormatFlags.SingleLine Or
+                                                  TextFormatFlags.EndEllipsis Or
+                                                  TextFormatFlags.GlyphOverhangPadding Or
+                                                  TextFormatFlags.NoPrefix Or
+                                                  TextFormatFlags.VerticalCenter)
                         Else
-                            e.Graphics.DrawString(e.SubItem.Text, e.Item.Font, _brsHighLightText, rct, sf)
+                            'e.Graphics.DrawString(e.SubItem.Text, e.Item.Font, _brsHighLightText, rct, sf)
+                            TextRenderer.DrawText(e.Graphics,
+                                                  e.SubItem.Text,
+                                                  e.Item.Font,
+                                                  Rectangle.Round(rct),
+                                                  _brsHighLightText.Color,
+                                                  TextFormatFlags.WordBreak Or
+                                                  TextFormatFlags.EndEllipsis Or
+                                                  TextFormatFlags.GlyphOverhangPadding Or
+                                                  TextFormatFlags.NoPrefix)
                         End If
                     Else
                         If _iconCol Then
-                            e.Graphics.DrawString(System.Environment.NewLine + e.Item.SubItems(2).Text, e.Item.Font, _brsForeColorUnread, rct, sf)
-                            e.Graphics.DrawString(e.Item.SubItems(4).Text + " / " + e.Item.SubItems(1).Text + " (" + e.Item.SubItems(3).Text + ") " + e.Item.SubItems(5).Text + e.Item.SubItems(6).Text + " [" + e.Item.SubItems(7).Text + "]", fnt, _brsForeColorUnread, rctB, sf)
-                        ElseIf e.Bounds.Height < e.Item.Font.Height * 2 Then
-                            TextRenderer.DrawText(e.Graphics, e.SubItem.Text, e.Item.Font, Rectangle.Round(rct), _brsForeColorUnread.Color, TextFormatFlags.SingleLine Or TextFormatFlags.EndEllipsis Or TextFormatFlags.LeftAndRightPadding Or TextFormatFlags.NoPrefix)
+                            'e.Graphics.DrawString(System.Environment.NewLine + e.Item.SubItems(2).Text, e.Item.Font, _brsForeColorUnread, rct, sf)
+                            'e.Graphics.DrawString(e.Item.SubItems(4).Text + " / " + e.Item.SubItems(1).Text + " (" + e.Item.SubItems(3).Text + ") " + e.Item.SubItems(5).Text + e.Item.SubItems(6).Text + " [" + e.Item.SubItems(7).Text + "]", fnt, _brsForeColorUnread, rctB, sf)
+                            TextRenderer.DrawText(e.Graphics,
+                                                  e.Item.SubItems(2).Text,
+                                                  e.Item.Font,
+                                                  Rectangle.Round(rct),
+                                                  _brsForeColorUnread.Color,
+                                                  TextFormatFlags.WordBreak Or
+                                                  TextFormatFlags.EndEllipsis Or
+                                                  TextFormatFlags.GlyphOverhangPadding Or
+                                                  TextFormatFlags.NoPrefix)
+                            TextRenderer.DrawText(e.Graphics,
+                                                  e.Item.SubItems(4).Text + " / " + e.Item.SubItems(1).Text + " (" + e.Item.SubItems(3).Text + ") " + e.Item.SubItems(5).Text + e.Item.SubItems(6).Text + " [" + e.Item.SubItems(7).Text + "]",
+                                                  fnt,
+                                                  Rectangle.Round(rctB),
+                                                  _brsForeColorUnread.Color,
+                                                  TextFormatFlags.SingleLine Or
+                                                  TextFormatFlags.EndEllipsis Or
+                                                  TextFormatFlags.GlyphOverhangPadding Or
+                                                  TextFormatFlags.NoPrefix)
+                        ElseIf drawLineCount = 1 Then
+                            TextRenderer.DrawText(e.Graphics,
+                                                  e.SubItem.Text,
+                                                  e.Item.Font,
+                                                  Rectangle.Round(rct),
+                                                  _brsForeColorUnread.Color,
+                                                  TextFormatFlags.SingleLine Or
+                                                  TextFormatFlags.EndEllipsis Or
+                                                  TextFormatFlags.GlyphOverhangPadding Or
+                                                  TextFormatFlags.NoPrefix Or
+                                                  TextFormatFlags.VerticalCenter)
                         Else
-                            e.Graphics.DrawString(e.SubItem.Text, e.Item.Font, _brsForeColorUnread, rct, sf)
+                            'e.Graphics.DrawString(e.SubItem.Text, e.Item.Font, _brsForeColorUnread, rct, sf)
+                            TextRenderer.DrawText(e.Graphics,
+                                                  e.SubItem.Text,
+                                                  e.Item.Font,
+                                                  Rectangle.Round(rct),
+                                                  _brsForeColorUnread.Color,
+                                                  TextFormatFlags.WordBreak Or
+                                                  TextFormatFlags.EndEllipsis Or
+                                                  TextFormatFlags.GlyphOverhangPadding Or
+                                                  TextFormatFlags.NoPrefix)
                         End If
                     End If
                     fnt.Dispose()
@@ -3906,9 +4135,10 @@ Public Class TweenMain
     End Sub
 
     Private Sub DrawListViewItemIcon(ByVal e As DrawListViewSubItemEventArgs)
-        If Not String.IsNullOrEmpty(e.Item.ImageKey) AndAlso Me.TIconDic.ContainsKey(e.Item.ImageKey) Then
+        Dim item As ImageListViewItem = DirectCast(e.Item, ImageListViewItem)
+        If item.Image IsNot Nothing Then
             'e.Bounds.Leftが常に0を指すから自前で計算
-            Dim itemRect As Rectangle = e.Item.Bounds
+            Dim itemRect As Rectangle = item.Bounds
             itemRect.Width = e.Item.ListView.Columns(0).Width
 
             For Each clm As ColumnHeader In e.Item.ListView.Columns
@@ -3918,10 +4148,12 @@ Public Class TweenMain
             Next
 
             Dim iconRect As Rectangle = Rectangle.Intersect(New Rectangle(e.Item.GetBounds(ItemBoundsPortion.Icon).Location, New Size(_iconSz, _iconSz)), itemRect)
+            iconRect.Offset(0, CType(Math.Max(0, (itemRect.Height - _iconSz) / 2), Integer))
+
             If iconRect.Width > 0 Then
                 e.Graphics.FillRectangle(Brushes.White, iconRect)
                 e.Graphics.InterpolationMode = Drawing2D.InterpolationMode.High
-                e.Graphics.DrawImage(Me.TIconDic(e.Item.ImageKey), iconRect)
+                e.Graphics.DrawImage(item.Image, iconRect)
             End If
         End If
     End Sub
@@ -4281,6 +4513,33 @@ RETRY:
         If _curList.SelectedIndices.Count = 0 OrElse _curPost Is Nothing Then Exit Sub
 
         Dim dTxt As String = createDetailHtml(_curPost.OriginalData)
+        If _curPost.IsDm Then
+            SourceLinkLabel.Tag = Nothing
+            SourceLinkLabel.Text = ""
+            'SourceLinkLabel.Visible = False
+        Else
+            Dim mc As Match = Regex.Match(_curPost.SourceHtml, "<a href=""(?<sourceurl>.+?)""")
+            If mc.Success Then
+                Dim src As String = mc.Groups("sourceurl").Value
+                SourceLinkLabel.Tag = mc.Groups("sourceurl").Value
+                mc = Regex.Match(src, "^https?://")
+                If Not mc.Success Then
+                    src = src.Insert(0, "http://twitter.com")
+                End If
+                SourceLinkLabel.Tag = src
+            Else
+                SourceLinkLabel.Tag = Nothing
+            End If
+            If String.IsNullOrEmpty(_curPost.Source) Then
+                SourceLinkLabel.Text = ""
+                'SourceLinkLabel.Visible = False
+            Else
+                SourceLinkLabel.Text = "via " + _curPost.Source
+                'SourceLinkLabel.Visible = True
+            End If
+        End If
+        SourceLinkLabel.TabStop = False
+
         If _statuses.Tabs(_curTab.Text).TabType = TabUsageType.DirectMessage AndAlso Not _curPost.IsOwl Then
             NameLabel.Text = "DM TO -> "
         ElseIf _statuses.Tabs(_curTab.Text).TabType = TabUsageType.DirectMessage Then
@@ -4293,8 +4552,18 @@ RETRY:
         If Not String.IsNullOrEmpty(_curPost.RetweetedBy) Then
             NameLabel.Text += " (RT:" + _curPost.RetweetedBy + ")"
         End If
+        If UserPicture.Image IsNot Nothing Then UserPicture.Image.Dispose()
         If Not String.IsNullOrEmpty(_curPost.ImageUrl) AndAlso TIconDic.ContainsKey(_curPost.ImageUrl) Then
             UserPicture.Image = TIconDic(_curPost.ImageUrl)
+
+            'Dim dummy As Image = DirectCast(TIconDic, ImageDictionary)(_curPost.ImageUrl, Sub(getImg)
+            '                                                                                  If img IsNot Nothing Then img.Dispose()
+            '                                                                                  If getImg Is Nothing Then Exit Sub
+            '                                                                                  img = DirectCast(getImg.Clone(), Image)
+            '                                                                                  Me.Invoke(Sub()
+            '                                                                                                Me.UserPicture.Image = img
+            '                                                                                            End Sub)
+            '                                                                              End Sub)
         Else
             UserPicture.Image = Nothing
         End If
@@ -4463,6 +4732,11 @@ RETRY:
                 e.SuppressKeyPress = True
                 SendKeys.Send("{TAB}")
             End If
+            If e.KeyCode = Keys.G Then
+                e.Handled = True
+                e.SuppressKeyPress = True
+                ShowRelatedStatusesMenuItem_Click(Nothing, Nothing)
+            End If
             ' ] in_reply_to参照元へ戻る
             If e.KeyCode = Keys.Oem4 Then
                 e.Handled = True
@@ -4619,7 +4893,7 @@ RETRY:
             ElseIf e.KeyCode = Keys.R Then
                 e.Handled = True
                 e.SuppressKeyPress = True
-                doReTweetOriginal(True)
+                doReTweetOfficial(True)
             ElseIf e.KeyCode = Keys.P AndAlso _curPost IsNot Nothing Then
                 e.Handled = True
                 e.SuppressKeyPress = True
@@ -4749,6 +5023,10 @@ RETRY:
                 e.Handled = True
                 e.SuppressKeyPress = True
                 doReTweetUnofficial()
+            ElseIf e.KeyCode = Keys.C Then
+                e.Handled = True
+                e.SuppressKeyPress = True
+                CopyUserId()
             ElseIf e.KeyCode = Keys.Up Then
                 Thumbnail.ScrollThumbnail(False)
             ElseIf e.KeyCode = Keys.Down Then
@@ -4763,6 +5041,19 @@ RETRY:
             End If
         End If
 
+        If e.Alt AndAlso e.Control Then
+            ' CTRL+ALTキーが押されている場合
+            If e.KeyCode = Keys.S Then
+                e.Handled = True
+                e.SuppressKeyPress = True
+                FavoritesRetweetOriginal()
+            ElseIf e.KeyCode = Keys.R Then
+                e.Handled = True
+                e.SuppressKeyPress = True
+                FavoritesRetweetUnofficial()
+            End If
+        End If
+
     End Sub
 
     Private Sub ScrollDownPostBrowser(ByVal forward As Boolean)
@@ -4808,7 +5099,7 @@ RETRY:
         Dim IsProtected As Boolean = False
         For Each idx As Integer In _curList.SelectedIndices
             Dim post As PostClass = _statuses.Item(_curTab.Text, idx)
-            If post.IsProtect AndAlso SettingDialog.ProtectNotInclude Then
+            If post.IsProtect Then
                 IsProtected = True
                 Continue For
             End If
@@ -5238,7 +5529,9 @@ RETRY:
             If e.KeyCode = Keys.A Then
                 StatusText.SelectAll()
             ElseIf e.KeyCode = Keys.Up OrElse e.KeyCode = Keys.Down Then
-                If StatusText.Text.Trim() <> "" Then _history(_hisIdx) = StatusText.Text
+                If StatusText.Text.Trim() <> "" Then
+                    _history(_hisIdx) = New PostingStatus(StatusText.Text, _reply_to_id, _reply_to_name)
+                End If
                 If e.KeyCode = Keys.Up Then
                     _hisIdx -= 1
                     If _hisIdx < 0 Then _hisIdx = 0
@@ -5246,7 +5539,9 @@ RETRY:
                     _hisIdx += 1
                     If _hisIdx > _history.Count - 1 Then _hisIdx = _history.Count - 1
                 End If
-                StatusText.Text = _history(_hisIdx)
+                StatusText.Text = _history(_hisIdx).status
+                _reply_to_id = _history(_hisIdx).inReplyToId
+                _reply_to_name = _history(_hisIdx).inReplyToName
                 StatusText.SelectionStart = StatusText.Text.Length
                 e.Handled = True
                 e.SuppressKeyPress = True
@@ -5304,6 +5599,10 @@ RETRY:
                 e.Handled = True
                 e.SuppressKeyPress = True
                 MultiLineMenuItem_Click(Nothing, Nothing)
+            ElseIf e.KeyCode = Keys.F Then
+                e.Handled = True
+                e.SuppressKeyPress = True
+                MenuItemSubSearch_Click(Nothing, Nothing)
             End If
 
             Select Case e.KeyCode
@@ -5350,7 +5649,7 @@ RETRY:
             If e.KeyCode = Keys.R Then
                 e.Handled = True
                 e.SuppressKeyPress = True
-                doReTweetOriginal(True)
+                doReTweetOfficial(True)
             ElseIf e.KeyCode = Keys.P AndAlso _curPost IsNot Nothing Then
                 e.Handled = True
                 e.SuppressKeyPress = True
@@ -5446,6 +5745,17 @@ RETRY:
                 e.Handled = True
                 e.SuppressKeyPress = True
                 FavorareMenuItem_Click(Nothing, Nothing)
+            ElseIf e.KeyCode = Keys.P Then
+                e.Handled = True
+                e.SuppressKeyPress = True
+                ImageSelectMenuItem_Click(Nothing, Nothing)
+            ElseIf e.KeyCode = Keys.F Then
+                e.Handled = True
+                e.SuppressKeyPress = True
+                If ListTab.SelectedTab IsNot Nothing Then
+                    If _statuses.Tabs(ListTab.SelectedTab.Text).TabType <> TabUsageType.PublicSearch Then Exit Sub
+                    ListTab.SelectedTab.Controls("panelSearch").Controls("comboSearch").Focus()
+                End If
             End If
         End If
 
@@ -5455,12 +5765,30 @@ RETRY:
                 e.Handled = True
                 e.SuppressKeyPress = True
                 doReTweetUnofficial()
+            ElseIf e.KeyCode = Keys.C Then
+                e.Handled = True
+                e.SuppressKeyPress = True
+                CopyUserId()
             ElseIf e.KeyCode = Keys.Up Then
                 Thumbnail.ScrollThumbnail(False)
             ElseIf e.KeyCode = Keys.Down Then
                 Thumbnail.ScrollThumbnail(True)
             End If
         End If
+
+        ' Alt + Control キー
+        If e.Alt AndAlso e.Control Then
+            If e.KeyCode = Keys.S Then
+                e.Handled = True
+                e.SuppressKeyPress = True
+                FavoritesRetweetOriginal()
+            ElseIf e.KeyCode = Keys.R Then
+                e.Handled = True
+                e.SuppressKeyPress = True
+                FavoritesRetweetUnofficial()
+            End If
+        End If
+
         Me.StatusText_TextChanged(Nothing, Nothing)
     End Sub
 
@@ -5491,6 +5819,8 @@ RETRY:
             _cfgCommon.IsOAuth = SettingDialog.IsOAuth
             _cfgCommon.Token = tw.AccessToken
             _cfgCommon.TokenSecret = tw.AccessTokenSecret
+            _cfgCommon.UserstreamStartup = SettingDialog.UserstreamStartup
+            _cfgCommon.UserstreamPeriod = SettingDialog.UserstreamPeriodInt
             _cfgCommon.TimelinePeriod = SettingDialog.TimelinePeriodInt
             _cfgCommon.ReplyPeriod = SettingDialog.ReplyPeriodInt
             _cfgCommon.DMPeriod = SettingDialog.DMPeriodInt
@@ -5504,6 +5834,7 @@ RETRY:
 
             _cfgCommon.NameBalloon = SettingDialog.NameBalloon
             _cfgCommon.PostCtrlEnter = SettingDialog.PostCtrlEnter
+            _cfgCommon.PostShiftEnter = SettingDialog.PostShiftEnter
             _cfgCommon.CountApi = SettingDialog.CountApi
             _cfgCommon.CountApiReply = SettingDialog.CountApiReply
             '_cfgCommon.CheckReply = SettingDialog.CheckReply
@@ -5526,7 +5857,8 @@ RETRY:
             _cfgCommon.UseUnreadStyle = SettingDialog.UseUnreadStyle
             _cfgCommon.DateTimeFormat = SettingDialog.DateTimeFormat
             _cfgCommon.DefaultTimeOut = SettingDialog.DefaultTimeOut
-            _cfgCommon.ProtectNotInclude = SettingDialog.ProtectNotInclude
+            '_cfgCommon.ProtectNotInclude = SettingDialog.ProtectNotInclude
+            _cfgCommon.RetweetNoConfirm = SettingDialog.RetweetNoConfirm
             _cfgCommon.LimitBalloon = SettingDialog.LimitBalloon
             _cfgCommon.AutoShortUrlFirst = SettingDialog.AutoShortUrlFirst
             _cfgCommon.TabIconDisp = SettingDialog.TabIconDisp
@@ -5586,6 +5918,9 @@ RETRY:
             _cfgCommon.MoreCountApi = SettingDialog.MoreCountApi
             _cfgCommon.FirstCountApi = SettingDialog.FirstCountApi
             _cfgCommon.SearchCountApi = SettingDialog.SearchCountApi
+            _cfgCommon.FavoritesCountApi = SettingDialog.FavoritesCountApi
+            _cfgCommon.TrackWord = tw.TrackWord
+            _cfgCommon.AllAtReply = tw.AllAtReply
 
             _cfgCommon.Save()
         End SyncLock
@@ -5640,7 +5975,7 @@ RETRY:
     Private Sub SaveConfigsTabs()
         Dim tabSetting As New SettingTabs
         For i As Integer = 0 To ListTab.TabPages.Count - 1
-            tabSetting.Tabs.Add(_statuses.Tabs(ListTab.TabPages(i).Text))
+            If _statuses.Tabs(ListTab.TabPages(i).Text).TabType <> TabUsageType.Related Then tabSetting.Tabs.Add(_statuses.Tabs(ListTab.TabPages(i).Text))
         Next
         tabSetting.Save()
     End Sub
@@ -5706,6 +6041,9 @@ RETRY:
                      Keys.ProcessKey
                     e.IsInputKey = True
                     JumpUnreadMenuItem_Click(Nothing, Nothing)
+                Case Keys.G
+                    e.IsInputKey = True
+                    ShowRelatedStatusesMenuItem_Click(Nothing, Nothing)
                 Case Keys.F1
                     e.IsInputKey = True
                     OpenUriAsync("http://sourceforge.jp/projects/tween/wiki/FrontPage")
@@ -5771,7 +6109,7 @@ RETRY:
                     MakeReplyOrDirectStatus(False, False)
                 Case Keys.R
                     e.IsInputKey = True
-                    doReTweetOriginal(True)
+                    doReTweetOfficial(True)
                 Case Keys.Q
                     e.IsInputKey = True
                     doQuote()
@@ -5816,7 +6154,7 @@ RETRY:
         If e.Modifiers = Keys.Alt Then
             If e.KeyCode = Keys.R Then
                 e.IsInputKey = True
-                doReTweetOriginal(True)
+                doReTweetOfficial(True)
             ElseIf e.KeyCode = Keys.P AndAlso _curPost IsNot Nothing Then
                 e.IsInputKey = True
                 doShowUserStatus(_curPost.Name, False)
@@ -5864,10 +6202,25 @@ RETRY:
                 Case Keys.R
                     e.IsInputKey = False
                     doReTweetUnofficial()
+                Case Keys.C
+                    e.IsInputKey = False
+                    CopyUserId()
             End Select
 
         End If
 
+        'CtrlKey + AltKey + 何か
+        If e.Modifiers = (Keys.Control Or Keys.Alt) Then
+            Select Case e.KeyCode
+                Case Keys.R
+                    e.IsInputKey = True
+                    FavoritesRetweetUnofficial()
+                Case Keys.S
+                    e.IsInputKey = True
+                    FavoritesRetweetOriginal()
+            End Select
+        End If
+
     End Sub
     Public Function TabRename(ByRef tabName As String) As Boolean
         'タブ名変更
@@ -5892,7 +6245,7 @@ RETRY:
             'タブ名のリスト作り直し(デフォルトタブ以外は再作成)
             For i As Integer = 0 To ListTab.TabCount - 1
                 If _statuses.Tabs(ListTab.TabPages(i).Text).TabType = TabUsageType.Mentions OrElse _
-                   (Not _statuses.IsDefaultTab(ListTab.TabPages(i).Text) AndAlso _statuses.Tabs(ListTab.TabPages(i).Text).TabType <> TabUsageType.PublicSearch AndAlso _statuses.Tabs(ListTab.TabPages(i).Text).TabType <> TabUsageType.Lists) Then
+                   (Not _statuses.IsDefaultTab(ListTab.TabPages(i).Text) AndAlso _statuses.Tabs(ListTab.TabPages(i).Text).TabType <> TabUsageType.PublicSearch AndAlso _statuses.Tabs(ListTab.TabPages(i).Text).TabType <> TabUsageType.Lists AndAlso _statuses.Tabs(ListTab.TabPages(i).Text).TabType <> TabUsageType.Related) Then
                     TabDialog.RemoveTab(ListTab.TabPages(i).Text)
                 End If
                 If ListTab.TabPages(i).Text = tabName Then
@@ -5903,7 +6256,7 @@ RETRY:
 
             For i As Integer = 0 To ListTab.TabCount - 1
                 If _statuses.Tabs(ListTab.TabPages(i).Text).TabType = TabUsageType.Mentions OrElse _
-                   (Not _statuses.IsDefaultTab(ListTab.TabPages(i).Text) AndAlso _statuses.Tabs(ListTab.TabPages(i).Text).TabType <> TabUsageType.PublicSearch AndAlso _statuses.Tabs(ListTab.TabPages(i).Text).TabType <> TabUsageType.Lists) Then
+                   (Not _statuses.IsDefaultTab(ListTab.TabPages(i).Text) AndAlso _statuses.Tabs(ListTab.TabPages(i).Text).TabType <> TabUsageType.PublicSearch AndAlso _statuses.Tabs(ListTab.TabPages(i).Text).TabType <> TabUsageType.Lists AndAlso _statuses.Tabs(ListTab.TabPages(i).Text).TabType <> TabUsageType.Related) Then
                     If ListTab.TabPages(i).Text = tabName Then
                         ListTab.TabPages(i).Text = newTabText
                     End If
@@ -6258,15 +6611,34 @@ RETRY:
     End Sub
 
     Private Sub TimerRefreshIcon_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TimerRefreshIcon.Tick
+        '200ms
         If _colorize Then Colorize()
         If Not TimerRefreshIcon.Enabled Then Exit Sub
         Static iconCnt As Integer = 0
         Static blinkCnt As Integer = 0
         Static blink As Boolean = False
         Static idle As Boolean = False
+        'Static usCheckCnt As Integer = 0
+
+        Static iconDlListTopItem As ListViewItem = Nothing
+        If DirectCast(ListTab.SelectedTab.Tag, ListView).TopItem Is iconDlListTopItem Then
+            DirectCast(Me.TIconDic, ImageDictionary).PauseGetImage = False
+        Else
+            DirectCast(Me.TIconDic, ImageDictionary).PauseGetImage = True
+        End If
+        iconDlListTopItem = DirectCast(ListTab.SelectedTab.Tag, ListView).TopItem
 
         iconCnt += 1
         blinkCnt += 1
+        'usCheckCnt += 1
+
+        'If usCheckCnt > 300 Then    '1min
+        '    usCheckCnt = 0
+        '    If Not Me.IsReceivedUserStream Then
+        '        TraceOut("ReconnectUserStream")
+        '        tw.ReconnectUserStream()
+        '    End If
+        'End If
 
         Dim busy As Boolean = False
         For Each bw As BackgroundWorker In Me._bw
@@ -6527,7 +6899,7 @@ RETRY:
         For Each idx As Integer In _curList.SelectedIndices
             Dim tabName As String = ""
             'タブ選択(or追加)
-            If Not SelectTab(tabName) Then Exit For
+            If Not SelectTab(tabName) Then Exit Sub
 
             fDialog.SetCurrent(tabName)
             If _statuses.Item(_curTab.Text, idx).RetweetedId = 0 Then
@@ -6563,6 +6935,10 @@ RETRY:
             Me.Cursor = Cursors.Default
         End Try
         SaveConfigsTabs()
+        If Me.ListTab.SelectedTab IsNot Nothing AndAlso
+            DirectCast(Me.ListTab.SelectedTab.Tag, DetailsListView).SelectedIndices.Count > 0 Then
+            _curPost = _statuses.Item(Me.ListTab.SelectedTab.Text, DirectCast(Me.ListTab.SelectedTab.Tag, DetailsListView).SelectedIndices(0))
+        End If
     End Sub
 
     Protected Overrides Function ProcessDialogKey( _
@@ -6572,8 +6948,10 @@ RETRY:
             If StatusText.Focused Then
                 '改行
                 If StatusText.Multiline AndAlso _
-                   (keyData And Keys.Shift) = Keys.Shift AndAlso _
-                   (keyData And Keys.Control) <> Keys.Control Then
+                   (Not SettingDialog.PostShiftEnter AndAlso (keyData And Keys.Shift) = Keys.Shift AndAlso _
+                   (keyData And Keys.Control) <> Keys.Control) OrElse _
+                   (SettingDialog.PostShiftEnter AndAlso (keyData And Keys.Control) = Keys.Control AndAlso _
+                   (keyData And Keys.Shift) <> Keys.Shift) Then
                     Dim pos1 As Integer = StatusText.SelectionStart
                     If StatusText.SelectionLength > 0 Then
                         StatusText.Text = StatusText.Text.Remove(pos1, StatusText.SelectionLength)  '選択状態文字列削除
@@ -6585,12 +6963,15 @@ RETRY:
                 '投稿
                 If (Not StatusText.Multiline AndAlso _
                         ((keyData And Keys.Control) = Keys.Control AndAlso SettingDialog.PostCtrlEnter) OrElse _
-                        ((keyData And Keys.Control) <> Keys.Control AndAlso Not SettingDialog.PostCtrlEnter)) OrElse _
+                        ((keyData And Keys.Shift) = Keys.Shift AndAlso SettingDialog.PostShiftEnter) OrElse _
+                        (((keyData And Keys.Control) <> Keys.Control AndAlso Not SettingDialog.PostCtrlEnter) AndAlso _
+                         ((keyData And Keys.Shift) <> Keys.Shift AndAlso Not SettingDialog.PostShiftEnter))) OrElse _
                    (StatusText.Multiline AndAlso _
-                        (Not SettingDialog.PostCtrlEnter AndAlso _
+                        (Not SettingDialog.PostCtrlEnter AndAlso Not SettingDialog.PostShiftEnter AndAlso _
                             ((keyData And Keys.Control) <> Keys.Control AndAlso (keyData And Keys.Shift) <> Keys.Shift) OrElse _
                             ((keyData And Keys.Control) = Keys.Control AndAlso (keyData And Keys.Shift) = Keys.Shift)) OrElse _
-                        (SettingDialog.PostCtrlEnter AndAlso (keyData And Keys.Control) = Keys.Control)) Then
+                        (SettingDialog.PostCtrlEnter AndAlso (keyData And Keys.Control) = Keys.Control) OrElse _
+                        (SettingDialog.PostShiftEnter AndAlso (keyData And Keys.Shift) = Keys.Shift)) Then
                     PostButton_Click(Nothing, Nothing)
                     Return True
                 End If
@@ -6849,13 +7230,19 @@ RETRY:
 
     Private Sub ClearTabMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ClearTabMenuItem.Click, ClearTbMenuItem.Click
         If String.IsNullOrEmpty(_rclickTabName) Then Exit Sub
-        Dim tmp As String = String.Format(My.Resources.ClearTabMenuItem_ClickText1, Environment.NewLine)
-        If MessageBox.Show(tmp, _rclickTabName + " " + My.Resources.ClearTabMenuItem_ClickText2, MessageBoxButtons.OKCancel, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Cancel Then
-            Exit Sub
+        ClearTab(_rclickTabName, True)
+    End Sub
+
+    Private Sub ClearTab(ByVal tabName As String, ByVal showWarning As Boolean)
+        If showWarning Then
+            Dim tmp As String = String.Format(My.Resources.ClearTabMenuItem_ClickText1, Environment.NewLine)
+            If MessageBox.Show(tmp, tabName + " " + My.Resources.ClearTabMenuItem_ClickText2, MessageBoxButtons.OKCancel, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Cancel Then
+                Exit Sub
+            End If
         End If
 
-        _statuses.ClearTabIds(_rclickTabName)
-        If ListTab.SelectedTab.Text = _rclickTabName Then
+        _statuses.ClearTabIds(tabName)
+        If ListTab.SelectedTab.Text = tabName Then
             _anchorPost = Nothing
             _anchorFlag = False
             _itemCache = Nothing
@@ -6865,7 +7252,7 @@ RETRY:
             _curPost = Nothing
         End If
         For Each tb As TabPage In ListTab.TabPages
-            If tb.Text = _rclickTabName Then
+            If tb.Text = tabName Then
                 tb.ImageIndex = -1
                 DirectCast(tb.Tag, DetailsListView).VirtualListSize = 0
                 Exit For
@@ -6901,7 +7288,7 @@ RETRY:
                 ttl.Append("Ver:").Append(myVer)
             Case DispTitleEnum.Post
                 If _history IsNot Nothing AndAlso _history.Count > 1 Then
-                    ttl.Append(_history(_history.Count - 2).Replace(vbCrLf, ""))
+                    ttl.Append(_history(_history.Count - 2).status.Replace(vbCrLf, ""))
                 End If
             Case DispTitleEnum.UnreadRepCount
                 ttl.AppendFormat(My.Resources.SetMainWindowTitleText1, _statuses.GetTabByType(TabUsageType.Mentions).UnreadCount + _statuses.GetTabByType(TabUsageType.DirectMessage).UnreadCount)
@@ -6956,7 +7343,7 @@ RETRY:
         If SettingDialog.TimelinePeriodInt = 0 Then
             slbl.Append(My.Resources.SetStatusLabelText2)
         Else
-            slbl.Append((SettingDialog.TimelinePeriodInt - _homeCounterAdjuster).ToString() + My.Resources.SetStatusLabelText3)
+            slbl.Append(SettingDialog.TimelinePeriodInt.ToString() + My.Resources.SetStatusLabelText3)
         End If
         Return slbl.ToString()
     End Function
@@ -6972,28 +7359,9 @@ RETRY:
     End Sub
 
     Private Sub SetStatusLabelApi()
-        Dim slbl As New StringBuilder(256)
-
-        If TwitterApiInfo.RemainCount > -1 AndAlso TwitterApiInfo.MaxCount > -1 Then
-            ' 正常
-            slbl.Append("API " + TwitterApiInfo.RemainCount.ToString + "/" + TwitterApiInfo.MaxCount.ToString)
-        ElseIf TwitterApiInfo.RemainCount > -1 Then
-            ' uppercount不正
-            slbl.Append("API " + TwitterApiInfo.RemainCount.ToString + "/???")
-        ElseIf TwitterApiInfo.MaxCount > -1 Then
-            ' remaincount不正
-            slbl.Append("API ???/" + TwitterApiInfo.MaxCount.ToString)
-        Else
-            '両方とも不正
-            slbl.Append("API ???/???")
-        End If
-
-        StatusLabelApi.Text = slbl.ToString()
-        If TwitterApiInfo.ResetTime >= DateTime.Now Then
-            StatusLabelApi.ToolTipText = "ResetTime " + TwitterApiInfo.ResetTime.ToString
-        Else
-            StatusLabelApi.ToolTipText = "ResetTime ???"
-        End If
+        Me._apiGauge.RemainCount = TwitterApiInfo.RemainCount
+        Me._apiGauge.MaxCount = TwitterApiInfo.MaxCount
+        Me._apiGauge.ResetTime = TwitterApiInfo.ResetTime
     End Sub
 
     Private Sub SetStatusLabelUrl()
@@ -7204,14 +7572,14 @@ RETRY:
                 UnFollowToolStripMenuItem.Enabled = False
                 ShowFriendShipToolStripMenuItem.Enabled = False
                 ShowUserStatusToolStripMenuItem.Enabled = True
-                SearchPostsDetailNameToolStripMenuItem.Enabled = False
+                SearchAtPostsDetailNameToolStripMenuItem.Enabled = False
                 ListManageUserContextToolStripMenuItem3.Enabled = True
             Else
                 FollowToolStripMenuItem.Enabled = True
                 UnFollowToolStripMenuItem.Enabled = True
                 ShowFriendShipToolStripMenuItem.Enabled = True
                 ShowUserStatusToolStripMenuItem.Enabled = True
-                SearchPostsDetailNameToolStripMenuItem.Enabled = True
+                SearchAtPostsDetailNameToolStripMenuItem.Enabled = True
                 ListManageUserContextToolStripMenuItem3.Enabled = True
             End If
         Else
@@ -7219,7 +7587,7 @@ RETRY:
             UnFollowToolStripMenuItem.Enabled = False
             ShowFriendShipToolStripMenuItem.Enabled = False
             ShowUserStatusToolStripMenuItem.Enabled = False
-            SearchPostsDetailNameToolStripMenuItem.Enabled = False
+            SearchAtPostsDetailNameToolStripMenuItem.Enabled = False
             ListManageUserContextToolStripMenuItem3.Enabled = False
         End If
     End Sub
@@ -7294,12 +7662,16 @@ RETRY:
 
     Private Function UrlConvert(ByVal Converter_Type As UrlConverter) As Boolean
         'Converter_Type=Nicomsの場合は、nicovideoのみ短縮する
+        '参考資料 RFC3986 Uniform Resource Identifier (URI): Generic Syntax
+        'Appendix A.  Collected ABNF for URI
+        'http://www.ietf.org/rfc/rfc3986.txt
+
         Dim result As String = ""
         Const url As String = "(?<before>(?:[^\""':!=]|^|\:))" + _
                                    "(?<url>(?<protocol>https?://)" + _
                                    "(?<domain>(?:[\.-]|[^\p{P}\s])+\.[a-z]{2,}(?::[0-9]+)?)" + _
-                                   "(?<path>/[a-z0-9!*'();:&=+$/%#\[\]\-_.,~@^]*[a-z0-9)=#/]?)?" + _
-                                   "(?<query>\?[a-z0-9!*'();:&=+$/%#\[\]\-_.,~]*[a-z0-9_&=#/])?)"
+                                   "(?<path>/[a-z0-9!*'();:&=+$/%#\-_.,~@]*[a-z0-9)=#/]?)?" + _
+                                   "(?<query>\?[a-z0-9!*'();:&=+$/%#\-_.,~@?]*[a-z0-9_&=#/])?)"
 
         Const nico As String = "^https?://[a-z]+\.(nicovideo|niconicommons|nicolive)\.jp/[a-z]+/[a-z0-9]+$"
 
@@ -7641,9 +8013,9 @@ RETRY:
         ' URLコピーの項目の表示/非表示
         If PostBrowser.StatusText.StartsWith("http") Then
             Me._postBrowserStatusText = PostBrowser.StatusText
-            Dim m As Match = Regex.Match(Me._postBrowserStatusText, "^https?://twitter.com/(?<name>[a-zA-Z0-9_]+)$")
+            Dim name As String = GetUserId()
             UrlCopyContextMenuItem.Enabled = True
-            If m.Success AndAlso IsTwitterId(m.Result("${name}")) Then
+            If name IsNot Nothing Then
                 FollowContextMenuItem.Enabled = True
                 RemoveContextMenuItem.Enabled = True
                 FriendshipContextMenuItem.Enabled = True
@@ -7688,7 +8060,7 @@ RETRY:
             SelectionCopyContextMenuItem.Enabled = True
         End If
         '発言内に自分以外のユーザーが含まれてればフォロー状態全表示を有効に
-        Dim ma As MatchCollection = Regex.Matches(Me.PostBrowser.DocumentText, "href=""https?://twitter.com/(?<name>[a-zA-Z0-9_]+)""")
+        Dim ma As MatchCollection = Regex.Matches(Me.PostBrowser.DocumentText, "href=""https?://twitter.com/(#!/)?(?<name>[a-zA-Z0-9_]+)""")
         Dim fAllFlag As Boolean = False
         For Each mu As Match In ma
             If mu.Result("${name}").ToLower <> tw.Username.ToLower Then
@@ -7957,6 +8329,19 @@ RETRY:
             End If
         End If
         _initial = False
+        AddHandler tw.NewPostFromStream, AddressOf tw_NewPostFromStream
+        AddHandler tw.UserStreamStarted, AddressOf tw_UserStreamStarted
+        AddHandler tw.UserStreamStopped, AddressOf tw_UserStreamStopped
+        AddHandler tw.UserStreamPaused, AddressOf tw_UserStreamPaused
+        AddHandler tw.PostDeleted, AddressOf tw_PostDeleted
+
+        MenuItemUserStream.Text = "&UserStream ■"
+        MenuItemUserStream.Enabled = True
+        PauseToolStripMenuItem.Text = "&Pause"
+        PauseToolStripMenuItem.Enabled = False
+        StopToolStripMenuItem.Text = "&Start"
+        StopToolStripMenuItem.Enabled = True
+        If SettingDialog.UserstreamStartup Then tw.StartUserStream()
         TimerTimeline.Enabled = True
     End Sub
 
@@ -7975,7 +8360,7 @@ RETRY:
             If _curPost.IsDm OrElse _
                Not StatusText.Enabled Then Exit Sub
 
-            If SettingDialog.ProtectNotInclude AndAlso _curPost.IsProtect Then
+            If _curPost.IsProtect Then
                 MessageBox.Show("Protected.")
                 Exit Sub
             End If
@@ -7993,29 +8378,76 @@ RETRY:
         doReTweetUnofficial()
     End Sub
 
-    Private Sub doReTweetOriginal(ByVal isConfirm As Boolean)
+    Private Sub doReTweetOfficial(ByVal isConfirm As Boolean)
         '公式RT
-        If _curPost IsNot Nothing AndAlso Not _curPost.IsDm AndAlso Not _curPost.IsMe Then
-            If SettingDialog.ProtectNotInclude AndAlso _curPost.IsProtect Then
+        If _curPost IsNot Nothing Then
+            If _curPost.IsProtect Then
                 MessageBox.Show("Protected.")
+                _DoFavRetweetFlags = False
                 Exit Sub
             End If
-            If isConfirm AndAlso MessageBox.Show(My.Resources.RetweetQuestion1, "Retweet", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Cancel Then
+            If _curList.SelectedIndices.Count > 15 Then
+                MessageBox.Show(My.Resources.RetweetLimitText)
+                _DoFavRetweetFlags = False
                 Exit Sub
+            ElseIf _curList.SelectedIndices.Count > 1 Then
+                Dim QuestionText As String = My.Resources.RetweetQuestion2
+                If _DoFavRetweetFlags Then QuestionText = My.Resources.FavoriteRetweetQuestionText1
+                Select Case MessageBox.Show(QuestionText, "Retweet", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question)
+                    Case Windows.Forms.DialogResult.Cancel, Windows.Forms.DialogResult.No
+                        _DoFavRetweetFlags = False
+                        Exit Sub
+                End Select
+            Else
+                If _curPost.IsDm OrElse _curPost.IsMe Then
+                    _DoFavRetweetFlags = False
+                    Exit Sub
+                End If
+                If Not SettingDialog.RetweetNoConfirm Then
+                    Dim Questiontext As String = My.Resources.RetweetQuestion1
+                    If _DoFavRetweetFlags Then Questiontext = My.Resources.FavoritesRetweetQuestionText2
+                    If isConfirm AndAlso MessageBox.Show(Questiontext, "Retweet", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Cancel Then
+                        _DoFavRetweetFlags = False
+                        Exit Sub
+                    End If
+                End If
             End If
             Dim args As New GetWorkerArg
             args.ids = New List(Of Long)
             args.sIds = New List(Of Long)
             args.tName = _curTab.Text
             args.type = WORKERTYPE.Retweet
-            args.ids.Add(_curPost.Id)
-
+            For Each idx As Integer In _curList.SelectedIndices
+                Dim post As PostClass = GetCurTabPost(idx)
+                If Not post.IsMe AndAlso Not post.IsProtect AndAlso Not post.IsDm Then args.ids.Add(post.Id)
+            Next
             RunAsync(args)
         End If
     End Sub
 
     Private Sub ReTweetOriginalStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ReTweetOriginalStripMenuItem.Click, RtOpMenuItem.Click
-        doReTweetOriginal(True)
+        doReTweetOfficial(True)
+    End Sub
+
+    Private Sub FavoritesRetweetOriginal()
+        If _curPost Is Nothing Then Exit Sub
+        _DoFavRetweetFlags = True
+        doReTweetOfficial(True)
+        If _DoFavRetweetFlags Then
+            _DoFavRetweetFlags = False
+            FavoriteChange(True, False)
+        End If
+    End Sub
+
+    Private Sub FavoritesRetweetUnofficial()
+        If _curPost IsNot Nothing AndAlso Not _curPost.IsDm Then
+            _DoFavRetweetFlags = True
+            FavoriteChange(True)
+            If Not _curPost.IsProtect AndAlso _DoFavRetweetFlags Then
+                _DoFavRetweetFlags = False
+                doReTweetUnofficial()
+            End If
+        End If
     End Sub
 
     Private Function CreateRetweetUnofficial(ByVal status As String) As String
@@ -8038,7 +8470,7 @@ RETRY:
         End If
 
         'その他のリンク(@IDなど)を置き換える
-        status = Regex.Replace(status, "@<a target=""_self"" href=""https?://twitter.com/(?<url>[^""]+)""[^>]*>(?<link>[^<]+)</a>", "${url}")
+        status = Regex.Replace(status, "@<a target=""_self"" href=""https?://twitter.com/(#!/)?(?<url>[^""]+)""[^>]*>(?<link>[^<]+)</a>", "@${url}")
         'ハッシュタグ
         status = Regex.Replace(status, "<a target=""_self"" href=""(?<url>[^""]+)""[^>]*>(?<link>[^<]+)</a>", "${link}")
         '<br>タグ除去
@@ -8114,7 +8546,7 @@ RETRY:
         e.Result = tw.GetInfoApi(args.info)
     End Sub
 
-    Private Sub ApiInfoMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ApiInfoMenuItem.Click, StatusLabelApi.DoubleClick
+    Private Sub ApiInfoMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ApiInfoMenuItem.Click
         Dim info As New ApiInfo
         Dim tmp As String
         Dim args As New GetApiInfoArgs With {.tw = tw, .info = info}
@@ -8326,7 +8758,7 @@ RETRY:
                 result += fInfo.id + My.Resources.GetFriendshipInfo5 + System.Environment.NewLine + ff
                 If fInfo.isFollowing Then
                     If MessageBox.Show( _
-                        "フォロー解除しますか?" + System.Environment.NewLine + result, "フォロー解除確認", _
+                        My.Resources.GetFriendshipInfo7 + System.Environment.NewLine + result, My.Resources.GetFriendshipInfo8, _
                         MessageBoxButtons.YesNo, _
                         MessageBoxIcon.Question, _
                         MessageBoxDefaultButton.Button2) = Windows.Forms.DialogResult.Yes Then
@@ -8357,29 +8789,36 @@ RETRY:
         Return Not Regex.Match(name, "^(about|jobs|tos|privacy)$").Success
     End Function
 
-    Private Sub FollowContextMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FollowContextMenuItem.Click
-        Dim m As Match = Regex.Match(Me._postBrowserStatusText, "^https?://twitter.com/(?<name>[a-zA-Z0-9_]+)$")
+    Private Function GetUserId() As String
+        Dim m As Match = Regex.Match(Me._postBrowserStatusText, "^https?://twitter.com/(#!/)?(?<name>[a-zA-Z0-9_]+)$")
         If m.Success AndAlso IsTwitterId(m.Result("${name}")) Then
-            FollowCommand(m.Result("${name}"))
+            Return m.Result("${name}")
+        Else
+            Dim ma As Match = Regex.Match(Me._postBrowserStatusText, "^https?://twitter.com/(#!/)?(?<name>[a-zA-Z0-9_]+)(/(status|statuses)/[0-9]+)$")
+            If ma.Success AndAlso IsTwitterId(ma.Result("${name}")) Then
+                Return ma.Result("${name}")
+            End If
+            Return Nothing
         End If
+    End Function
+
+    Private Sub FollowContextMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FollowContextMenuItem.Click
+        Dim name As String = GetUserId()
+        If name IsNot Nothing Then FollowCommand(name)
     End Sub
 
     Private Sub RemoveContextMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RemoveContextMenuItem.Click
-        Dim m As Match = Regex.Match(Me._postBrowserStatusText, "^https?://twitter.com/(?<name>[a-zA-Z0-9_]+)$")
-        If m.Success AndAlso IsTwitterId(m.Result("${name}")) Then
-            RemoveCommand(m.Result("${name}"), False)
-        End If
+        Dim name As String = GetUserId()
+        If name IsNot Nothing Then RemoveCommand(name, False)
     End Sub
 
     Private Sub FriendshipContextMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FriendshipContextMenuItem.Click
-        Dim m As Match = Regex.Match(Me._postBrowserStatusText, "^https?://twitter.com/(?<name>[a-zA-Z0-9_]+)$")
-        If m.Success AndAlso IsTwitterId(m.Result("${name}")) Then
-            ShowFriendship(m.Result("${name}"))
-        End If
+        Dim name As String = GetUserId()
+        If name IsNot Nothing Then ShowFriendship(name)
     End Sub
 
     Private Sub FriendshipAllMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FriendshipAllMenuItem.Click
-        Dim ma As MatchCollection = Regex.Matches(Me.PostBrowser.DocumentText, "href=""https?://twitter.com/(?<name>[a-zA-Z0-9_]+)""")
+        Dim ma As MatchCollection = Regex.Matches(Me.PostBrowser.DocumentText, "href=""https?://twitter.com/(#!/)?(?<name>[a-zA-Z0-9_]+)""")
         Dim ids As New List(Of String)
         For Each mu As Match In ma
             If mu.Result("${name}").ToLower <> tw.Username.ToLower Then
@@ -8390,17 +8829,13 @@ RETRY:
     End Sub
 
     Private Sub ShowUserStatusContextMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ShowUserStatusContextMenuItem.Click
-        Dim m As Match = Regex.Match(Me._postBrowserStatusText, "^https?://twitter.com/(?<name>[a-zA-Z0-9_]+)$")
-        If m.Success AndAlso IsTwitterId(m.Result("${name}")) Then
-            ShowUserStatus(m.Result("${name}"))
-        End If
+        Dim name As String = GetUserId()
+        If name IsNot Nothing Then ShowUserStatus(name)
     End Sub
 
     Private Sub SearchPostsDetailToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SearchPostsDetailToolStripMenuItem.Click
-        Dim m As Match = Regex.Match(Me._postBrowserStatusText, "^https?://twitter.com/(?<name>[a-zA-Z0-9_]+)$")
-        If m.Success AndAlso IsTwitterId(m.Result("${name}")) Then
-            AddNewTabForSearch("from:" + m.Result("${name}"))
-        End If
+        Dim name As String = GetUserId()
+        If name IsNot Nothing Then AddNewTabForSearch("from:" + name)
     End Sub
 
     Private Sub IdeographicSpaceToSpaceToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles IdeographicSpaceToSpaceToolStripMenuItem.Click
@@ -8418,7 +8853,7 @@ RETRY:
             If _curPost.IsDm OrElse _
                Not StatusText.Enabled Then Exit Sub
 
-            If SettingDialog.ProtectNotInclude AndAlso _curPost.IsProtect Then
+            If _curPost.IsProtect Then
                 MessageBox.Show("Protected.")
                 Exit Sub
             End If
@@ -8536,8 +8971,8 @@ RETRY:
     End Sub
 
     Private Sub IdFilterAddMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles IdFilterAddMenuItem.Click
-        Dim m As Match = Regex.Match(Me._postBrowserStatusText, "^https?://twitter.com/(?<name>[a-zA-Z0-9_]+)$")
-        If m.Success AndAlso IsTwitterId(m.Result("${name}")) Then
+        Dim name As String = GetUserId()
+        If name IsNot Nothing Then
             Dim tabName As String = ""
 
             '未選択なら処理終了
@@ -8551,7 +8986,7 @@ RETRY:
             MoveOrCopy(mv, mk)
 
             Dim fc As New FiltersClass
-            fc.NameFilter = m.Result("${name}")
+            fc.NameFilter = name
             fc.SearchBoth = True
             fc.MoveFrom = mv
             fc.SetMark = mk
@@ -8586,18 +9021,14 @@ RETRY:
         End If
     End Sub
 
-    Private Sub ListManageUserContextToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListManageUserContextToolStripMenuItem.Click, ToolStripMenuItem9.Click, ListManageUserContextToolStripMenuItem2.Click, ListManageUserContextToolStripMenuItem3.Click
+    Private Sub ListManageUserContextToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListManageUserContextToolStripMenuItem.Click, ListManageMenuItem.Click, ListManageUserContextToolStripMenuItem2.Click, ListManageUserContextToolStripMenuItem3.Click
         Dim user As String
 
         Dim menuItem As ToolStripMenuItem = DirectCast(sender, ToolStripMenuItem)
 
         If menuItem.Owner Is Me.ContextMenuPostBrowser Then
-            Dim m As Match = Regex.Match(Me._postBrowserStatusText, "^https?://twitter.com/(?<name>[a-zA-Z0-9_]+)$")
-            If m.Success AndAlso IsTwitterId(m.Result("${name}")) Then
-                user = m.Result("${name}")
-            Else
-                Return
-            End If
+            user = GetUserId()
+            If user Is Nothing Then Return
         ElseIf Me._curPost IsNot Nothing Then
             user = Me._curPost.Name
         Else
@@ -8714,38 +9145,68 @@ RETRY:
     Private Sub MenuItemOperate_DropDownOpening(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItemOperate.DropDownOpening
         If ListTab.SelectedTab Is Nothing Then Exit Sub
         If _statuses Is Nothing OrElse _statuses.Tabs Is Nothing OrElse Not _statuses.Tabs.ContainsKey(ListTab.SelectedTab.Text) Then Exit Sub
-        If _statuses.Tabs(ListTab.SelectedTab.Text).TabType = TabUsageType.DirectMessage Then
+        If _curPost Is Nothing Then
+            Me.ReplyOpMenuItem.Enabled = False
+            Me.ReplyAllOpMenuItem.Enabled = False
+            Me.DmOpMenuItem.Enabled = False
+            Me.ShowProfMenuItem.Enabled = False
+            Me.ListManageMenuItem.Enabled = False
+            Me.OpenFavOpMenuItem.Enabled = False
+            Me.CreateTabRuleOpMenuItem.Enabled = False
+            Me.CreateIdRuleOpMenuItem.Enabled = False
+            Me.ReadOpMenuItem.Enabled = False
+            Me.UnreadOpMenuItem.Enabled = False
+        Else
+            Me.ReplyOpMenuItem.Enabled = True
+            Me.ReplyAllOpMenuItem.Enabled = True
+            Me.DmOpMenuItem.Enabled = True
+            Me.ShowProfMenuItem.Enabled = True
+            Me.ListManageMenuItem.Enabled = True
+            Me.OpenFavOpMenuItem.Enabled = True
+            Me.CreateTabRuleOpMenuItem.Enabled = True
+            Me.CreateIdRuleOpMenuItem.Enabled = True
+            Me.ReadOpMenuItem.Enabled = True
+            Me.UnreadOpMenuItem.Enabled = True
+        End If
+
+        If _statuses.Tabs(ListTab.SelectedTab.Text).TabType = TabUsageType.DirectMessage OrElse _curPost Is Nothing OrElse _curPost.IsDm Then
             Me.FavOpMenuItem.Enabled = False
             Me.UnFavOpMenuItem.Enabled = False
             Me.OpenStatusOpMenuItem.Enabled = False
             Me.OpenFavotterOpMenuItem.Enabled = False
-        Else
-            Me.FavOpMenuItem.Enabled = True
-            Me.UnFavOpMenuItem.Enabled = True
-            Me.OpenStatusOpMenuItem.Enabled = True
-            Me.OpenFavotterOpMenuItem.Enabled = True
-        End If
-        If _curPost Is Nothing OrElse _curPost.IsDm Then
+            Me.ShowRelatedStatusesMenuItem2.Enabled = False
             Me.RtOpMenuItem.Enabled = False
             Me.RtUnOpMenuItem.Enabled = False
             Me.QtOpMenuItem.Enabled = False
+            Me.FavoriteRetweetMenuItem.Enabled = False
+            Me.FavoriteRetweetUnofficialMenuItem.Enabled = False
             If _curPost IsNot Nothing AndAlso _curPost.IsDm Then Me.DelOpMenuItem.Enabled = True
         Else
-            If _curPost.IsProtect = True AndAlso SettingDialog.ProtectNotInclude Then
-                Me.RtOpMenuItem.Enabled = False
-                Me.RtUnOpMenuItem.Enabled = False
-                Me.QtOpMenuItem.Enabled = False
-            Else
-                Me.RtOpMenuItem.Enabled = True
-                Me.RtUnOpMenuItem.Enabled = True
-                Me.QtOpMenuItem.Enabled = True
-            End If
+            Me.FavOpMenuItem.Enabled = True
+            Me.UnFavOpMenuItem.Enabled = True
+            Me.OpenStatusOpMenuItem.Enabled = True
+            Me.OpenFavotterOpMenuItem.Enabled = True
+            Me.ShowRelatedStatusesMenuItem2.Enabled = True  'PublicSearchの時問題出るかも
+
             If _curPost.IsMe Then
                 Me.RtOpMenuItem.Enabled = False
+                Me.FavoriteRetweetMenuItem.Enabled = False
                 Me.DelOpMenuItem.Enabled = True
             Else
-                Me.RtOpMenuItem.Enabled = True
                 Me.DelOpMenuItem.Enabled = False
+                If _curPost.IsProtect Then
+                    Me.RtOpMenuItem.Enabled = False
+                    Me.RtUnOpMenuItem.Enabled = False
+                    Me.QtOpMenuItem.Enabled = False
+                    Me.FavoriteRetweetMenuItem.Enabled = False
+                    Me.FavoriteRetweetUnofficialMenuItem.Enabled = False
+                Else
+                    Me.RtOpMenuItem.Enabled = True
+                    Me.RtUnOpMenuItem.Enabled = True
+                    Me.QtOpMenuItem.Enabled = True
+                    Me.FavoriteRetweetMenuItem.Enabled = True
+                    Me.FavoriteRetweetUnofficialMenuItem.Enabled = True
+                End If
             End If
         End If
 
@@ -8755,8 +9216,8 @@ RETRY:
             Me.RefreshPrevOpMenuItem.Enabled = False
         End If
         If _statuses.Tabs(ListTab.SelectedTab.Text).TabType = TabUsageType.PublicSearch _
-            OrElse _curPost Is Nothing _
-            OrElse Not _curPost.InReplyToId > 0 Then
+                            OrElse _curPost Is Nothing _
+                            OrElse Not _curPost.InReplyToId > 0 Then
             OpenRepSourceOpMenuItem.Enabled = False
         Else
             OpenRepSourceOpMenuItem.Enabled = True
@@ -8766,39 +9227,6 @@ RETRY:
         Else
             OpenRterHomeMenuItem.Enabled = True
         End If
-        If _curPost Is Nothing Then
-            Me.ReplyOpMenuItem.Enabled = False
-            Me.ReplyAllOpMenuItem.Enabled = False
-            Me.DmOpMenuItem.Enabled = False
-            Me.FavOpMenuItem.Enabled = False
-            Me.UnFavOpMenuItem.Enabled = False
-            Me.OpenFavOpMenuItem.Enabled = False
-            Me.OpenStatusOpMenuItem.Enabled = False
-            Me.OpenFavotterOpMenuItem.Enabled = False
-            Me.CreateTabRuleOpMenuItem.Enabled = False
-            Me.CreateIdRuleOpMenuItem.Enabled = False
-            Me.ReadOpMenuItem.Enabled = False
-            Me.UnreadOpMenuItem.Enabled = False
-            Me.ShowProfMenuItem.Enabled = False
-            Me.ToolStripMenuItem9.Enabled = False
-            Me.DelOpMenuItem.Enabled = False
-        Else
-            Me.ReplyOpMenuItem.Enabled = True
-            Me.ReplyAllOpMenuItem.Enabled = True
-            Me.DmOpMenuItem.Enabled = True
-            Me.FavOpMenuItem.Enabled = True
-            Me.UnFavOpMenuItem.Enabled = True
-            Me.OpenFavOpMenuItem.Enabled = True
-            Me.OpenStatusOpMenuItem.Enabled = True
-            Me.OpenFavotterOpMenuItem.Enabled = True
-            Me.CreateTabRuleOpMenuItem.Enabled = True
-            Me.CreateIdRuleOpMenuItem.Enabled = True
-            Me.ReadOpMenuItem.Enabled = True
-            Me.UnreadOpMenuItem.Enabled = True
-            Me.ShowProfMenuItem.Enabled = True
-            Me.ToolStripMenuItem9.Enabled = True
-            Me.DelOpMenuItem.Enabled = True
-        End If
     End Sub
 
     Private Sub MenuItemTab_DropDownOpening(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItemTab.DropDownOpening
@@ -8837,9 +9265,12 @@ RETRY:
         If _curPost Is Nothing Then
             Me.CopySTOTMenuItem.Enabled = False
             Me.CopyURLMenuItem.Enabled = False
+            Me.CopyUserIdStripMenuItem.Enabled = False
         Else
             Me.CopySTOTMenuItem.Enabled = True
             Me.CopyURLMenuItem.Enabled = True
+            Me.CopyUserIdStripMenuItem.Enabled = True
+            If _curPost.IsProtect Then Me.CopySTOTMenuItem.Enabled = False
         End If
     End Sub
 
@@ -8970,6 +9401,13 @@ RETRY:
         End If
     End Sub
 
+    Private Sub SearchAtPostsDetailNameToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SearchAtPostsDetailNameToolStripMenuItem.Click, SearchAtPostsDetailToolStripMenuItem.Click
+        If NameLabel.Tag IsNot Nothing Then
+            Dim id As String = DirectCast(NameLabel.Tag, String)
+            AddNewTabForSearch("@" + id)
+        End If
+    End Sub
+
     Private Sub ShowProfileMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ShowProfileMenuItem.Click, ShowProfMenuItem.Click
         If _curPost IsNot Nothing Then
             ShowUserStatus(_curPost.Name, False)
@@ -9017,6 +9455,11 @@ RETRY:
 
         ' InitializeComponent() 呼び出しの後で初期化を追加します。
 
+        Me._apiGauge.Control.Size = New Size(70, 22)
+        Me._apiGauge.Control.Margin = New Padding(0, 3, 0, 2)
+        Me._apiGauge.GaugeHeight = 8
+        AddHandler Me._apiGauge.Control.DoubleClick, AddressOf Me.ApiInfoMenuItem_Click
+        Me.StatusStrip1.Items.Insert(2, Me._apiGauge)
     End Sub
 
     Private Sub _hookGlobalHotkey_HotkeyPressed(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles _hookGlobalHotkey.HotkeyPressed
@@ -9218,6 +9661,7 @@ RETRY:
         If SettingDialog.IsOAuth Then
             ImageServiceCombo.Items.Add("TwitPic")
             ImageServiceCombo.Items.Add("img.ly")
+            ImageServiceCombo.Items.Add("yfrog")
         End If
         ImageServiceCombo.Items.Add("TwitVideo")
         If svc = "" Then
@@ -9289,4 +9733,245 @@ RETRY:
             _modifySettingAtId = value
         End Set
     End Property
+
+    Private Sub SourceLinkLabel_LinkClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.LinkLabelLinkClickedEventArgs) Handles SourceLinkLabel.LinkClicked
+        Dim link As String = CType(SourceLinkLabel.Tag, String)
+        If Not String.IsNullOrEmpty(link) Then
+            OpenUriAsync(link)
+        End If
+    End Sub
+
+    Private Sub SourceLinkLabel_MouseEnter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SourceLinkLabel.MouseEnter
+        Dim link As String = CType(SourceLinkLabel.Tag, String)
+        If Not String.IsNullOrEmpty(link) Then
+            StatusLabelUrl.Text = link
+        End If
+    End Sub
+
+    Private Sub SourceLinkLabel_MouseLeave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SourceLinkLabel.MouseLeave
+        SetStatusLabelUrl()
+    End Sub
+
+    Private Sub MenuItemCommand_DropDownOpening(ByVal sender As Object, ByVal e As System.EventArgs) Handles MenuItemCommand.DropDownOpening
+        If _curPost IsNot Nothing AndAlso Not _curPost.IsDm Then
+            RtCountMenuItem.Enabled = True
+        Else
+            RtCountMenuItem.Enabled = False
+        End If
+    End Sub
+
+    Private Sub CopyUserIdStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CopyUserIdStripMenuItem.Click
+        CopyUserId()
+    End Sub
+    Private Sub CopyUserId()
+        If _curPost Is Nothing Then Exit Sub
+        Dim clstr As String = _curPost.Name
+        Try
+            Clipboard.SetDataObject(clstr, False, 5, 100)
+        Catch ex As Exception
+            MessageBox.Show(ex.Message)
+        End Try
+    End Sub
+
+    Private Sub ShowRelatedStatusesMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ShowRelatedStatusesMenuItem.Click, ShowRelatedStatusesMenuItem2.Click
+        If _curPost IsNot Nothing AndAlso Not _curPost.IsDm Then
+            'PublicSearchも除外した方がよい?
+            If _statuses.GetTabByType(TabUsageType.Related) Is Nothing Then
+                Const TabName As String = "Related Tweets"
+                Dim tName As String = TabName
+                If Not Me.AddNewTab(tName, False, TabUsageType.Related) Then
+                    For i As Integer = 2 To 100
+                        tName = TabName + i.ToString()
+                        If Me.AddNewTab(tName, False, TabUsageType.Related) Then
+                            _statuses.AddTab(tName, TabUsageType.Related, Nothing)
+                            Exit For
+                        End If
+                    Next
+                Else
+                    _statuses.AddTab(tName, TabUsageType.Related, Nothing)
+                End If
+            End If
+
+            Dim tb As TabClass = _statuses.GetTabByType(TabUsageType.Related)
+            tb.RelationTargetPost = _curPost
+            Me.ClearTab(tb.TabName, False)
+            For i As Integer = 0 To ListTab.TabPages.Count - 1
+                If tb.TabName = ListTab.TabPages(i).Text Then
+                    ListTab.SelectedIndex = i
+                    ListTabSelect(ListTab.TabPages(i))
+                    Exit For
+                End If
+            Next
+
+            GetTimeline(WORKERTYPE.Related, 1, 1, tb.TabName)
+        End If
+    End Sub
+
+    Private Sub CacheInfoMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CacheInfoMenuItem.Click
+        Dim buf As New StringBuilder
+        buf.AppendFormat("キャッシュメモリ容量         : {0}bytes({1}MB)" + vbCrLf, DirectCast(TIconDic, ImageDictionary).CacheMemoryLimit, DirectCast(TIconDic, ImageDictionary).CacheMemoryLimit / 1048576)
+        buf.AppendFormat("物理メモリ使用割合           : {0}%" + vbCrLf, DirectCast(TIconDic, ImageDictionary).PhysicalMemoryLimit)
+        buf.AppendFormat("キャッシュエントリ保持数     : {0}" + vbCrLf, DirectCast(TIconDic, ImageDictionary).CacheCount)
+        buf.AppendFormat("キャッシュエントリ破棄数     : {0}" + vbCrLf, DirectCast(TIconDic, ImageDictionary).CacheRemoveCount)
+        MessageBox.Show(buf.ToString, "アイコンキャッシュ使用状況")
+    End Sub
+
+    Private Sub tw_PostDeleted(ByVal id As Long)
+        _statuses.RemovePostReserve(id)
+    End Sub
+
+    Private Sub tw_NewPostFromStream()
+        If SettingDialog.ReadOldPosts Then
+            _statuses.SetRead() '新着時未読クリア
+        End If
+
+        Dim rsltAddCount As Integer = _statuses.DistributePosts()
+        SyncLock _syncObject
+            Dim tm As Date = Now
+            If _tlTimestamps.ContainsKey(tm) Then
+                _tlTimestamps(tm) += rsltAddCount
+            Else
+                _tlTimestamps.Add(Now, rsltAddCount)
+            End If
+            Dim oneHour As Date = Now.Subtract(New TimeSpan(1, 0, 0))
+            Dim keys As New List(Of Date)
+            _tlCount = 0
+            For Each key As Date In _tlTimestamps.Keys
+                If key.CompareTo(oneHour) < 0 Then
+                    keys.Add(key)
+                Else
+                    _tlCount += _tlTimestamps(key)
+                End If
+            Next
+            For Each key As Date In keys
+                _tlTimestamps.Remove(key)
+            Next
+            keys.Clear()
+
+            'Static before As DateTime = Now
+            'If before.Subtract(Now).Seconds > -5 Then Exit Sub
+            'before = Now
+        End SyncLock
+
+        If SettingDialog.UserstreamPeriodInt > 0 Then Exit Sub
+
+        Try
+            If InvokeRequired AndAlso Not IsDisposed Then
+                Invoke(New Action(Of Boolean)(AddressOf RefreshTimeline), True)
+                Exit Sub
+            End If
+        Catch ex As ObjectDisposedException
+            Exit Sub
+        End Try
+    End Sub
+    Private Sub tw_UserStreamStarted()
+        If InvokeRequired Then
+            Invoke(New MethodInvoker(AddressOf tw_UserStreamStarted))
+            Exit Sub
+        End If
+
+        MenuItemUserStream.Text = "&UserStream ▶"
+        MenuItemUserStream.Enabled = True
+        PauseToolStripMenuItem.Text = "&Pause"
+        PauseToolStripMenuItem.Enabled = True
+        StopToolStripMenuItem.Text = "&Stop"
+        StopToolStripMenuItem.Enabled = True
+
+        StatusLabel.Text = "UserStream Started."
+    End Sub
+
+    Private Sub tw_UserStreamStopped()
+        If InvokeRequired Then
+            Invoke(New MethodInvoker(AddressOf tw_UserStreamStopped))
+            Exit Sub
+        End If
+
+        MenuItemUserStream.Text = "&UserStream ■"
+        MenuItemUserStream.Enabled = True
+        PauseToolStripMenuItem.Text = "&Pause"
+        PauseToolStripMenuItem.Enabled = False
+        StopToolStripMenuItem.Text = "&Start"
+        StopToolStripMenuItem.Enabled = True
+
+        StatusLabel.Text = "UserStream Stopped."
+    End Sub
+
+    Private Sub tw_UserStreamPaused()
+        If InvokeRequired Then
+            Invoke(New MethodInvoker(AddressOf tw_UserStreamPaused))
+            Exit Sub
+        End If
+
+        MenuItemUserStream.Text = "&UserStream ||"
+        MenuItemUserStream.Enabled = True
+        PauseToolStripMenuItem.Text = "&Resume"
+        PauseToolStripMenuItem.Enabled = True
+        StopToolStripMenuItem.Text = "&Stop"
+        StopToolStripMenuItem.Enabled = True
+
+        StatusLabel.Text = "UserStream Paused."
+    End Sub
+
+    'Private ReadOnly Property IsReceivedUserStream As Boolean
+    '    Get
+    '        Static lastTime As DateTime
+    '        Dim changed As Boolean = (lastTime.CompareTo(tw.LastReceivedUserStream) < 0)
+    '        lastTime = tw.LastReceivedUserStream
+    '        Return changed
+    '    End Get
+    'End Property
+
+    Private Sub PauseToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PauseToolStripMenuItem.Click
+        MenuItemUserStream.Enabled = False
+        tw.PauseUserStream()
+    End Sub
+
+    Private Sub StopToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles StopToolStripMenuItem.Click
+        MenuItemUserStream.Enabled = False
+        tw.StartUserStream()
+    End Sub
+
+    Private Sub TrackToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TrackToolStripMenuItem.Click
+        Static inputTrack As String = ""
+        If TrackToolStripMenuItem.Checked Then
+            Using inputForm As New InputTabName
+                inputForm.TabName = inputTrack
+                inputForm.FormTitle = "Input track word"
+                inputForm.FormDescription = "Track word"
+                If inputForm.ShowDialog() <> Windows.Forms.DialogResult.OK Then
+                    TrackToolStripMenuItem.Checked = False
+                    Exit Sub
+                End If
+                inputTrack = inputForm.TabName.Trim()
+            End Using
+            If Not inputTrack.Equals(tw.TrackWord) Then
+                tw.TrackWord = inputTrack
+                Me._modifySettingCommon = True
+                TrackToolStripMenuItem.Checked = Not String.IsNullOrEmpty(inputTrack)
+                tw.ReconnectUserStream()
+            End If
+        Else
+            tw.TrackWord = ""
+            tw.ReconnectUserStream()
+        End If
+    End Sub
+
+    Private Sub AllrepliesToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AllrepliesToolStripMenuItem.Click
+        tw.AllAtReply = AllrepliesToolStripMenuItem.Checked
+        Me._modifySettingCommon = True
+        tw.ReconnectUserStream()
+    End Sub
+
+    Private Sub TweenRestartMenuItem_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles TweenRestartMenuItem.Click
+        _endingFlag = True
+        Application.Restart()
+    End Sub
+
+    Private Sub OpenOwnFavedMenuItem_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles OpenOwnFavedMenuItem.Click
+        If Not tw.Username = "" Then OpenUriAsync(My.Resources.FavstarUrl + "users/" + tw.Username + "/recent")
+    End Sub
+
+    Private Sub OpenOwnHomeMenuItem_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles OpenOwnHomeMenuItem.Click
+        OpenUriAsync("http://twitter.com/" + tw.Username)
+    End Sub
 End Class