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では設定されない)
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
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
'Private _FirstRefreshFlags As Boolean = False
'Private _FirstListsRefreshFlags As Boolean = False
+ Private _DoFavRetweetFlags As Boolean = False
+
'''''''''''''''''''''''''''''''''''''''''''''''''''''
Private _postBrowserStatusText As String = ""
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
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()
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
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)
TabDialog.Owner = Me
UrlDialog.Owner = Me
- _history.Add("")
+ _history.Add(New PostingStatus)
_hisIdx = 0
_reply_to_id = 0
_reply_to_name = ""
_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
SettingDialog.NameBalloon = _cfgCommon.NameBalloon
SettingDialog.PostCtrlEnter = _cfgCommon.PostCtrlEnter
-
+ SettingDialog.PostShiftEnter = _cfgCommon.PostShiftEnter
SettingDialog.CountApi = _cfgCommon.CountApi
SettingDialog.CountApiReply = _cfgCommon.CountApiReply
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
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, "#")
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
End If
'アイコンリスト作成
- TIconDic = New Dictionary(Of String, Image)
+ TIconDic = New ImageDictionary(5000)
tw.DetailIcon = TIconDic
StatusLabelUrl.Text = "" '画面左下のリンク先URL表示部を初期化
NameLabel.Text = "" '発言詳細部名前ラベル初期化
DateTimeLabel.Text = "" '発言詳細部日時ラベル初期化
+ SourceLinkLabel.Text = "" 'Source部分初期化
'<<<<<<<<タブ関連>>>>>>>
'デフォルトタブの存在チェック、ない場合には追加
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
#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)
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
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
MessageBoxIcon.Question)
Select Case rtResult
Case Windows.Forms.DialogResult.Yes
- doReTweetOriginal(False)
+ doReTweetOfficial(False)
StatusText.Text = ""
Exit Sub
Case Windows.Forms.DialogResult.Cancel
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
'複数行で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
_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()
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
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)
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
End If
e.Result = rslt
-
End Sub
Private Function MakeStatusMessage(ByVal AsyncArg As GetWorkerArg, ByVal Finish As Boolean) As String
smsg = "Search refreshing..."
Case WORKERTYPE.List
smsg = "List refreshing..."
+ Case WORKERTYPE.Related
+ smsg = "Related refreshing..."
End Select
Else
'完了メッセージ
smsg = "Search refreshed"
Case WORKERTYPE.List
smsg = "List refreshed"
+ Case WORKERTYPE.Related
+ smsg = "Related refreshed"
End Select
End If
Return smsg
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
_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
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
'リストに反映
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
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, "")
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
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
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
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
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
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)
_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
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)
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 = ""
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
Catch ex As Exception
'不正な要求に対する間に合わせの応答
Dim sitem() As String = {"", "", "", "", "", "", "", ""}
- e.Item = New ListViewItem(sitem, "")
+ e.Item = New ImageListViewItem(sitem, "")
End Try
End If
End Sub
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
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
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でうまく判定できない???
'選択されていない行
'文字色
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()
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()
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
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
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
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
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
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
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
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)
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
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
_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
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
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
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
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
_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
_cfgCommon.NameBalloon = SettingDialog.NameBalloon
_cfgCommon.PostCtrlEnter = SettingDialog.PostCtrlEnter
+ _cfgCommon.PostShiftEnter = SettingDialog.PostShiftEnter
_cfgCommon.CountApi = SettingDialog.CountApi
_cfgCommon.CountApiReply = SettingDialog.CountApiReply
'_cfgCommon.CheckReply = SettingDialog.CheckReply
_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
_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
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
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")
MakeReplyOrDirectStatus(False, False)
Case Keys.R
e.IsInputKey = True
- doReTweetOriginal(True)
+ doReTweetOfficial(True)
Case Keys.Q
e.IsInputKey = True
doQuote()
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)
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
'タブ名変更
'タブ名のリスト作り直し(デフォルトタブ以外は再作成)
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
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
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
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
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( _
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) '選択状態文字列削除
'投稿
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
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
_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
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)
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
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()
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
UnFollowToolStripMenuItem.Enabled = False
ShowFriendShipToolStripMenuItem.Enabled = False
ShowUserStatusToolStripMenuItem.Enabled = False
- SearchPostsDetailNameToolStripMenuItem.Enabled = False
+ SearchAtPostsDetailNameToolStripMenuItem.Enabled = False
ListManageUserContextToolStripMenuItem3.Enabled = False
End If
End Sub
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]+$"
' 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
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
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
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
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
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>タグ除去
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}
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
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
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
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
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 = ""
'未選択なら処理終了
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
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
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
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
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
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
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)
' 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
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
_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