OSDN Git Service

SouceLinkLabelのTabStopを常にFalseに
[opentween/open-tween.git] / Tween / Tween.vb
index 5eaaf5c..53ee4cc 100644 (file)
@@ -189,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
@@ -767,6 +767,8 @@ Public Class TweenMain
         '    _FirstRefreshFlags = True
         '    _FirstListsRefreshFlags = True
         'End If
+        SettingDialog.UserstreamStartup = _cfgCommon.UserstreamStartup
+        SettingDialog.UserstreamPeriodInt = _cfgCommon.UserstreamPeriod
 
         'ハッシュタグ関連
         HashSupl = New AtIdSupplement(_cfgCommon.HashTags, "#")
@@ -1187,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)
@@ -1244,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
 
@@ -2288,7 +2304,7 @@ Public Class TweenMain
            rslt.type = WORKERTYPE.FavAdd OrElse _
            rslt.type = WORKERTYPE.FavRemove OrElse _
            rslt.type = WORKERTYPE.Related Then
-            RefreshTimeline() 'リスト反映
+            RefreshTimeline(False) 'リスト反映
         End If
 
         Select Case rslt.type
@@ -2916,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
@@ -3696,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 = ""
@@ -4496,7 +4516,7 @@ RETRY:
         If _curPost.IsDm Then
             SourceLinkLabel.Tag = Nothing
             SourceLinkLabel.Text = ""
-            SourceLinkLabel.Visible = False
+            'SourceLinkLabel.Visible = False
         Else
             Dim mc As Match = Regex.Match(_curPost.SourceHtml, "<a href=""(?<sourceurl>.+?)""")
             If mc.Success Then
@@ -4510,9 +4530,15 @@ RETRY:
             Else
                 SourceLinkLabel.Tag = Nothing
             End If
-            SourceLinkLabel.Text = "via " + _curPost.Source
-            SourceLinkLabel.Visible = True
+            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 -> "
@@ -5793,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
@@ -6590,7 +6618,7 @@ RETRY:
         Static blinkCnt As Integer = 0
         Static blink As Boolean = False
         Static idle As Boolean = False
-        Static usCheckCnt As Integer = 0
+        'Static usCheckCnt As Integer = 0
 
         Static iconDlListTopItem As ListViewItem = Nothing
         If DirectCast(ListTab.SelectedTab.Tag, ListView).TopItem Is iconDlListTopItem Then
@@ -6602,15 +6630,15 @@ RETRY:
 
         iconCnt += 1
         blinkCnt += 1
-        usCheckCnt += 1
+        'usCheckCnt += 1
 
-        If usCheckCnt > 300 Then    '1min
-            usCheckCnt = 0
-            If Not Me.IsReceivedUserStream Then
-                TraceOut("ReconnectUserStream")
-                tw.ReconnectUserStream()
-            End If
-        End If
+        '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
@@ -7315,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
@@ -7544,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
@@ -7559,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
@@ -8306,11 +8334,14 @@ RETRY:
         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
-        tw.StartUserStream()
+        If SettingDialog.UserstreamStartup Then tw.StartUserStream()
         TimerTimeline.Enabled = True
     End Sub
 
@@ -8727,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
@@ -8763,6 +8794,10 @@ RETRY:
         If m.Success AndAlso IsTwitterId(m.Result("${name}")) Then
             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
@@ -9366,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)
@@ -9710,10 +9752,6 @@ RETRY:
         SetStatusLabelUrl()
     End Sub
 
-    Private Sub SourceLinkLabel_Enter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SourceLinkLabel.Enter
-        StatusText.Focus()
-    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
@@ -9755,7 +9793,7 @@ RETRY:
             End If
 
             Dim tb As TabClass = _statuses.GetTabByType(TabUsageType.Related)
-            tb.RelationTargetId = _curPost.Id
+            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
@@ -9779,18 +9817,7 @@ RETRY:
     End Sub
 
     Private Sub tw_PostDeleted(ByVal id As Long)
-        Try
-            If InvokeRequired Then
-                Invoke(New Action(Of Long)(AddressOf tw_PostDeleted), id)
-                Exit Sub
-            End If
-        Catch ex As ObjectDisposedException
-            Exit Sub
-        End Try
-
-        _statuses.RemovePost(id)
-
-        Me.RefreshTimeline()
+        _statuses.RemovePostReserve(id)
     End Sub
 
     Private Sub tw_NewPostFromStream()
@@ -9826,9 +9853,11 @@ RETRY:
             'before = Now
         End SyncLock
 
+        If SettingDialog.UserstreamPeriodInt > 0 Then Exit Sub
+
         Try
             If InvokeRequired AndAlso Not IsDisposed Then
-                Invoke(New MethodInvoker(AddressOf RefreshTimeline))
+                Invoke(New Action(Of Boolean)(AddressOf RefreshTimeline), True)
                 Exit Sub
             End If
         Catch ex As ObjectDisposedException
@@ -9883,14 +9912,14 @@ RETRY:
         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 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
@@ -9932,4 +9961,17 @@ RETRY:
         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